mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 08:14:42 +00:00
The mesh rehearsal could not exercise the write-error stop at all, and that is not a gap in the rehearsal. Removing the sink file leaves the writer's descriptor valid, so writes keep succeeding into the unlinked inode and the capture runs on; mounting a tiny filesystem inside the test container is refused outright. So the terminal state added for a failing sink had no coverage from either direction. Split one flush cycle out of the writer loop as a function returning what it decided, so the loop owns the waiting and the state transition while the decision is testable on its own. A sink that fails every write now drives the error outcome directly, and a working sink is asserted to continue so the first test cannot pass for a writer that always stops. The residual gap is recorded at the test: what is covered is that an error from the sink produces the error outcome rather than the cap outcome, not that a real full disk reaches that branch. The rehearsal itself was otherwise clean on a live three-node mesh. The header carries node, build, platform, tick period and the reading caveats; every step reports every interval; stopping returns in 53 ms rather than waiting out the flush interval; an idle status reports no path and no bytes; arming twice is refused naming the active file; an unwritable directory fails the command; and the node kept serving throughout. On an idle node the entry gap sits at one tick period and arm starvation reads about 1.4 ms, which is small but not zero, so the measurement is live rather than degenerate.