Skip to content

ci: say what the offender listing is, and how to find the new one - #893

Open
fujibee wants to merge 1 commit into
mainfrom
ci/say-what-the-listing-is
Open

ci: say what the offender listing is, and how to find the new one#893
fujibee wants to merge 1 commit into
mainfrom
ci/say-what-the-listing-is

Conversation

@fujibee

@fujibee fujibee commented Aug 19, 2026

Copy link
Copy Markdown
Owner

CI only. One file, .github/scripts/check-enforced-assertions.sh. No product change, and no change to what passes or fails.

Why

Four people read this checker's output on one red tonight, and each drew a different wrong conclusion:

  • the first file in the listing taken as the cause;
  • a hundred-line difference between two heads read as a hundred new offenders;
  • from that, a conclusion that the listing must be truncated;
  • and one reader who had the answer in a file list produced for another purpose and did not recognise it.

Everyone eventually arrived by the same route — run the checker at each commit and watch where the count changes — and nothing in the output suggests it.

What was measured

The listing is not truncated. With the baseline forced low:

reported   638 unenforceable assertions
printed    638 lines

It is complete, unordered by novelty, and unlabelled. On a +1 that is 639 lines with nothing marking the one that matters. The hundred-line diff was line numbers shifting below an insertion, not new entries.

The change

check-enforced-assertions: 639 unenforceable assertions, baseline is 637 (+2).

2 assertions pushed this over. The list below is EVERY unenforceable
assertion in the tree, not the new one(s) -- nothing here marks which.
To find them: run this checker at the previous commit and compare the
counts, bisecting until the count changes. Comparing the listings does
not work; a line added anywhere shifts every line number below it.

Deliberately no new state

Storing the previous offender set beside the count would let this name the new entries outright. It also introduces a second artifact to keep in sync with the first, and a listing that disagrees with its own count is the same confusion wearing different clothes — on a checker four people just misread. The count stays the only authority; what changes is that the output stops implying otherwise.

If the stored-set version is wanted later, #892 has the argument for it.

Verified

At +1, +2, +9, at the baseline, and below it. The pass and below-baseline paths are untouched and still read as before.

Four people read this checker's output on one red tonight and each drew a
different wrong conclusion: the first file in the list taken as the cause; a
hundred-line difference between two heads read as a hundred new offenders; and
from that, a guess that the listing must be truncated.

It is not truncated. Measured with the baseline forced low: 638 reported, 638
printed. The list is complete, unordered by novelty, and unlabelled -- so on a
`+1` it is 639 lines with nothing marking the one that matters. The hundred-line
diff was line numbers shifting below an insertion.

Now the header carries the delta, and four lines say what the list is and what
does work: bisect on the count. Comparing listings does not, and that is stated
rather than left to be rediscovered.

No state is added. Storing the previous offender set beside the count would let
this name the new entries outright, but it is a second thing to keep in sync
with the first, and a listing that disagrees with its count is the same
confusion in different clothes. The count stays the only authority; the output
stops implying otherwise.

Verified at +1, +2, +9, at the baseline, and below it.
@fujibee
fujibee force-pushed the ci/say-what-the-listing-is branch from e1a7513 to 86da88f Compare August 19, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant