Skip to content

test: 87 arms have survived every mutation aimed at their neighbours: vacuous, or named for something they do not measure #1236

Description

@jdatcmd

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:

  1. A check that has never been observed red may simply never have been attacked. Says nothing.
  2. A premise legitimately stays never forever. Says nothing.
  3. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions