Record the pass where the verdict splits

A stranger can now rerun both targets from the committed container and the
README, which was the batch's point and holds. The rules are another matter.
The scenario holds its callers after the wait whose duration is the rule, so
a hard-coded two seconds walks through the whole matrix while the committed
entry only ever died because one constant was smaller than another.

The gap recorded as unreachable is reachable in fifteen lines against a closed
port, and the mutant crashes a plain optimised build on contact. Second gap
falsified today. The next batch fixes the cause once instead of adding another
entry at another constant.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-17 01:19:02 +02:00
commit fa6c000e7f

View file

@ -321,8 +321,77 @@ the fix is weaker than the fix:
a handle closed under a live call. Both were previously reported killed on
the sanitizer target only, and neither has a definition left. The third fix
batch is told to give each a real entry or to say plainly that the rule is
undefended, because an honest gap beats a fabricated kill. **Third fix batch
in Hands.**
undefended, because an honest gap beats a fabricated kill.
**The third fix batch landed** at `62e53df` (the development seam and a
hold-then-close scenario), `e4e09a0` (four entries, the bounded wait at 50 ms,
an exit status on skips, the child's stderr on a red control, re-execution
with randomisation disabled), `12c8bfc` (the header's self-contradiction) and
`4407098` (the committed container, the Ninja generator, the README recipe
with the seccomp requirement).
**Soul's fourth pass, 2026-09-17** (Fable, banked mid-pass when that model ran
out, resumed on Opus from the bank; the handoff paid for itself by carrying a
live harness process, a dirty tree and two leads the successor opened with).
**The verdict splits, so it is given twice.**
*The infrastructure question is now yes.* The committed container built with no
cache, then the literal README run line, gives eight killed, none surviving,
none skipped, exit zero on Linux; Windows gives six killed, two honestly
skipped, and a real exit code. A stranger can rerun both targets today. The
seccomp requirement is genuinely load-bearing and the randomisation
re-execution genuinely runs. The development seam is absent from a release
build: thirteen production symbols, no debug symbols, no assertion strings,
and every executable section byte-identical between pre- and post-change
release builds. The predecessor's harness had already exited, restoring the
tree byte-exactly, so the restore path holds.
*The rules question is still no.* Three of the four rules in the native table
are pinned. The fourth is not, and the cause is structural rather than a bad
constant:
- **F1, confirmed, high: the hold sits after the wait whose duration is the
rule**, so every timeout mutant lands in a blind spot by construction.
A hard-coded 100 ms survives Windows and Linux with assertions, and dies
under the thread sanitizer only because its slowdown trips an unrelated
condition. **A hard-coded 2000 ms survives the entire matrix on both
targets.** A host asking for five seconds silently gets two and every
consumer's poll loop spins at two and a half times the rate it asked for,
forever. The committed one-millisecond entry dies only because one is less
than the scenario's fifty-millisecond settle: constant pinning constant.
- **F2, confirmed, high: the pop-before-copy gap was wrong about itself.**
A client opening to a closed loopback port reaches that path in about a
millisecond with no listener, credential or connection, because the failure
path always publishes a non-empty reason; fifteen lines. Moving the pop
before the copy then crashes an ordinary optimised build twice out of two,
while both committed scenarios stay green on that same binary.
- **F3, confirmed, medium: the refusal during a close has no entry** and
survives being neutered, though the header promises it. A call entering
behind the closer increments the in-flight count behind the wait, which can
then never reach zero.
- F4, low: the seam misdescribes itself, claiming the held call touches
nothing afterwards when its scope destructor takes the gate, decrements and
notifies. The safety comes from the assertion, not the hold.
- F5, low: the bounded wait at 600 ms survives, the same shape as F1 and
honestly labelled as a limit by Hands.
- Also: "the close wakes every blocked poll" **is** defended by committed code
but has no entry, so the table understates coverage in one place while
overstating it in another.
**Two scars from the pass itself.** An export made with `git archive` carried
1,459 inserted carriage returns, poisoning any byte comparison built on it;
raw blobs verified against the worktree hash are the only safe source. And the
51 bytes that differ between pre- and post-change release builds are accounted
for: 48 are four copies of the reproducibility content hash, and the last
three sit in exception metadata outside every executable section and **could
not be fully accounted for**, which Soul said rather than rounding away. The
same source rebuilt at the same path twice differs by zero bytes; built
elsewhere it differs by 69, so the figure is only meaningful at a shared path.
**One undocumented step remains** in an otherwise clean path: the README
hardcodes the container mount, so a newcomer on another checkout must edit the
line. **Fourth fix batch in Hands**, told to fix the structural cause once
rather than add another entry at another constant.
**Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative
greps, all twelve mutations rerun and killed, the control catching a