The technique, which is the point; the number is only what it costs
test/check_ledger.tsv records, per check, when it was last observed red and under which mutation. We built that column to keep history. It is also a vacuity detector, and neither session was reading it that way until @OffgridwithJD said so while fixing #1235:
a never that no mutation can move is a question about the arm
The inference has three parts, and the third is the one that does the work:
- A check that has never been observed red may simply never have been attacked. Says nothing.
- A premise legitimately stays
never forever. Says nothing.
- A non-premise check that is
never in a part where some sibling IS dated is an arm that survived an attack aimed at its neighbours. That is a question.
Measured on 61de3b96:
total ledger rows 1589
never 1527
never AND non-premise 1139
never, non-premise, in a part with a DATED sibling 87
awk -F'\t' '$5!="never"{d[$1"\t"$2]=1} {r[NR]=$0}
END{for(i=1;i<=NR;i++){split(r[i],f,"\t");
if(f[5]=="never" && f[3] !~ /^premise:/ && ((f[1]"\t"f[2]) in d)) print r[i]}}' \
test/check_ledger.tsv
1139 is a haystack. 87 is a reading list. The narrowing is what the inference costs, not what it is.
Where it came from: an arm that could not fail, and the ledger knew
#1235's first version excluded the sweep from its own population by basename, and checked it like this:
producer: [ "$b" = "$PGC_CAP_SELF" ] && continue # skips that string
the arm: grep -c "^$PGC_CAP_SELF$" want 0 # greps the SAME variable
0 by construction, and blind to the case it existed for: reached under a symlink or a renamed copy the skip stops matching the real file, the sweep re-enters its own population, the recursion returns, and the arm still passes. Driven, same function, only the variable changed:
PGC_CAP_SELF=capability_sweep.sh population 2 arm 0 PASS literal arm 0 PASS
PGC_CAP_SELF=cap.sh population 3 arm 0 PASS literal arm 1 FAIL
(self is back in)
Its ledger row read never, and none of four mutations could move it. That signal was available for free, before anyone read the function.
The second finding: arms named for something they do not measure
Three of the 87 are in harness_selftest/570, written today by @jdatcmd:
a gitfile is a regular file, which a directory test cannot accept
and it is still a .git that a reader must not skip on
These assert stat -c %F on a file the part just created. No change to the product can ever redden them, because they do not measure the product. They are premises wearing non-premise names.
That is milder than a vacuous arm and it is still a defect, for a specific reason: a reader counting what a part proves counts them, and is wrong. The repair is cheap — rename to premise: — but it is a repair, not a relabelling, because the name is the claim.
So this list is not 87 vacuous arms. It is 87 places where either the arm is vacuous, or its name is lying about what it measures. The disjunction is the finding. Anyone working it has to decide which, per arm, by attacking it.
What must NOT happen next
No fixes in the change that files this. The 87 are not a list of defects; they are a list of arms nobody has understood yet. Fixing an item before understanding it converts an open question into a closed answer without passing through the measurement, and what the ledger is worth is precisely that it records what was measured.
Three of them being @jdatcmd's own makes that harder to hold to, not different.
Suggested shape for working it
- Take one PART at a time, not one arm.
- For each candidate, name the change that should redden it and make it. If no such change exists, the arm does not measure the product: rename it
premise: or replace it.
- Merge the resulting last-red dates from the RUN, never by hand.
- A part whose candidates all turn out to be fixture facts is a finding about the part, worth saying in its comment.
The largest blocks today are native_join_runtime_filter, index_am_support (the four build-and-answer pairs) and harness_selftest/190. None has been looked at; the list is where to look.
Filed from the #1235 review. The technique is @OffgridwithJD's, the tree-wide measurement and the fixture-facts caveat are @jdatcmd's.
🤖 Generated with Claude Code
https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n
The technique, which is the point; the number is only what it costs
test/check_ledger.tsvrecords, per check, when it was last observed red and under which mutation. We built that column to keep history. It is also a vacuity detector, and neither session was reading it that way until @OffgridwithJD said so while fixing #1235:The inference has three parts, and the third is the one that does the work:
neverforever. Says nothing.neverin a part where some sibling IS dated is an arm that survived an attack aimed at its neighbours. That is a question.Measured on
61de3b96:1139 is a haystack. 87 is a reading list. The narrowing is what the inference costs, not what it is.
Where it came from: an arm that could not fail, and the ledger knew
#1235's first version excluded the sweep from its own population by basename, and checked it like this:
0by construction, and blind to the case it existed for: reached under a symlink or a renamed copy the skip stops matching the real file, the sweep re-enters its own population, the recursion returns, and the arm still passes. Driven, same function, only the variable changed:Its ledger row read
never, and none of four mutations could move it. That signal was available for free, before anyone read the function.The second finding: arms named for something they do not measure
Three of the 87 are in
harness_selftest/570, written today by @jdatcmd:These assert
stat -c %Fon a file the part just created. No change to the product can ever redden them, because they do not measure the product. They are premises wearing non-premise names.That is milder than a vacuous arm and it is still a defect, for a specific reason: a reader counting what a part proves counts them, and is wrong. The repair is cheap — rename to
premise:— but it is a repair, not a relabelling, because the name is the claim.So this list is not 87 vacuous arms. It is 87 places where either the arm is vacuous, or its name is lying about what it measures. The disjunction is the finding. Anyone working it has to decide which, per arm, by attacking it.
What must NOT happen next
No fixes in the change that files this. The 87 are not a list of defects; they are a list of arms nobody has understood yet. Fixing an item before understanding it converts an open question into a closed answer without passing through the measurement, and what the ledger is worth is precisely that it records what was measured.
Three of them being @jdatcmd's own makes that harder to hold to, not different.
Suggested shape for working it
premise:or replace it.The largest blocks today are
native_join_runtime_filter,index_am_support(the four build-and-answer pairs) andharness_selftest/190. None has been looked at; the list is where to look.Filed from the #1235 review. The technique is @OffgridwithJD's, the tree-wide measurement and the fixture-facts caveat are @jdatcmd's.
🤖 Generated with Claude Code
https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n