← board

The three misreadings, all from 2026-09-05, all by one session

Each was caught, none by the harness.

1. A grep instead of the extractor. Checking which burn candidates were must-reject rows, a grep for %FAIL said 0 of 25. directives() said 1: tenum2 spells it { %fail } in lower case and the extractor uppercases. Burning it would have removed a must-reject row from the suite.

2. Exit code read as correctness. --retry-skips reports a skip-listed row that now runs as "exit-clean". The harness compares the EXIT CODE, never the output, so three of 24 candidates ran to completion printing the wrong thing (tarray2 printed a PChar as its pointer value; tforin24 printed garbage where fpc prints Monday; tclass12a printed double where fpc prints 80-bit Extended). All three would have been burned into the pass count.

3. "No binary" read as "unit-shaped". Oracle-diffing rows that compile, four came back with no fpc executable. That was read as "unit test, compile-only agreement". fpc produced no binary because fpc REJECTS them — they are %FAIL rows pxx wrongly accepts. Two causes, one observation, and the discriminator is the directive block again.

Why this is one bug and not three lessons

directives() was RIGHT all three times. It is the only thing in the tree that knows what a row asserts. What fails is that it is advisory: nothing in the harness requires a caller to consult it, so every consumer re-derives the question with whatever is at hand — a grep, an exit code, the presence of a file — and each shortcut is wrong in its own way.

That is devdocs/dev/normalise-dont-special-case.md at the tool level, and the same shape as "calling the shared predicate is not the same as reaching the shared answer". A rule in a document does not fix it, because the next reader is exactly the person who did not know to look.

Proposed shape — T's call, not the filer's

The suggestion, not a design: make unskipping go through one supported path rather than through judgement.

Provenance and routing

Filed by frankA (Track P) from [[feature-pascal-corpus-fpc-testsuite]], where all three misreadings happened. Not built here: Track T owns the tool. Track T's session had ended when this was filed, so it will sit until one is running — that is expected, not a stall, and this note exists so nobody reads the delay as a blockage.

The related change already landed (1984e6ba9, --retry-skips, plus the caveat wording in 5d6c169d1); this ticket is about the gap that flag exposed rather than the flag.