Skip to content

Census the corpus's unconsumed modules: 303 unreachable, classified - #8803

Merged
briansrls merged 5 commits into
mainfrom
session/merry-lark-560
Aug 21, 2026
Merged

briansrls merged 5 commits into
mainfrom
session/merry-lark-560

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Answers the corpus-wide unconsumed-module brief. Census only — nothing is deleted here. The classification is for review before any uprooting, per the dispatch ("337 is too many to delete on one session's judgment").

Document: docs/plans/unconsumed-module-census.md.

The number

303, not 337 — re-derived from scratch, the inherited figure not reused. Two independent corrections move it, in opposite directions:

  • zero-importer is too narrow — it cannot see an island. extdeps/colo/ is one: 19 modules importing each other and extdeps.colo.types, consumed by nothing outside.
  • zero-importer is too wide — see the instrument defect below.

The instrument defect (applies to any earlier orphan number in this repo)

.dag admits a fully-qualified call with no import statement. dag/test/claim/accelerator_demo_gpu_witness_test.dag calls gunbc.accelerator_demo_gpu.witness_m5_gpu_execution_lane_count_grounded() and never imports the module — an import-line census scores it dead. Adding qualified-reference edges (over string- and annotation-stripped source, so prose mentions do not create false edges) moved the population 333 → 303 and returned the whole gunbc.accelerator_demo_* family to reachable. Any import-line-only orphan count over-reports by roughly 10%.

Also confirmed: floor discovery selects by file suffix _test.dag (cli_run.rs), not by module prefix — so the exclusion is by path, and v2.workflow.ci_materialization_emit_test is discovered despite not living under a test. namespace.

Controls (v2.compiler.compile, gunbc.spark.serving_desired, gunbc.clock_read, v2.std.node) score reachable on every pass; gunbc.accelerator_demo_gpu is retained as the discriminating control for the qualified-call arm.

Dispositions

disposition count
RESIDUE-EMPTY (≤5 lines) 8
CITED-AUTHORITY (ExternalAuthority anchor) 105
PROSE-NAMED (named by live source) 86
RESIDUE-DOC-ONLY 32
RESIDUE-UNMENTIONED 72

ENTRY-INVOKED is zero by construction: the entry index (34 --entry argv roots + 81 v1 seed mirrors) is built and subtracted before the population is formed. The 105 cited-authority rows are explicitly not sweepable under the DESIGN §3 extdeps citation duty.

Findings worth a decision

  • std.verification — unreachable (no import, no qualified reference), yet named in 120 live .dag files, all in annotations and strings. Deleting it silently falsifies 120 citations; keeping it hosts a module the compiler never reaches. Also a §3 second-authority smell against the live v2.std.verification.
  • dag/tools/*_transport + tools.gunbc_ci/build/readme/roadmap_dispatch/codegen — left standing when the floor cut (2026-08-15) and regen root cut (2026-08-18) uprooted their callers. Nothing could refuse, so the census never surfaced them. Gated on DESIGN's re-add queue: a transport whose gate is queued for re-derivation is frozen, not residue.
  • extdeps/colo/ (19), formats/elf/ (7), container/oci/ (5), boot/ (5), ebay/ (6), tcgplayer/ (5), llm/ (7) — cited-authority islands, one decision each.
  • v2.extdeps.formatters.* (9) + typecheckers.* (2) and extdeps/language_model/*_r2a|_r2b|_r3_external (15) — modeled and mentioned nowhere at all.

Sequencing proposed (not executed)

Six batches, smallest-blast-radius first, starting with the 8 empty modules as a control batch that proves the deletion path and the floor both behave. dag/gunbc/spark/ is excluded from every batch — fierce-lynx-647 owns that area; its two rows are reported for their benefit only.

No instrument script is committed: a hand-authored census script beside a substrate that already reads the module graph is the §6 manual-application tell. The method is stated at the grain needed to re-derive independently.

gunbc-ci-auto-heal and others added 3 commits August 21, 2026 19:21
Answers the corpus-wide unconsumed-module brief. Census only -- nothing is
deleted here; the classification is for review before any uprooting.

The defensible number is 303, not the inherited 337, and the difference is two
independent corrections that do not cancel. Zero-importer is too NARROW: it
cannot see an island, and extdeps/colo/ is one -- 19 modules importing each
other, consumed by nothing outside. It is also too WIDE, because of a defect
found here that invalidates any import-line-only instrument: .dag admits a
fully-qualified call with no import statement, so a witness that calls
gunbc.accelerator_demo_gpu.witness_...() without importing it scores its
subject dead. Adding qualified-reference edges over string- and
annotation-stripped source moved the population 333 -> 303.

Roots are discovery (by FILE SUFFIX _test.dag, per cli_run.rs floor
discovery -- not by module prefix), --entry argv literals, and v1 seed
mirrors. Controls pass on every pass, with accelerator_demo_gpu retained as
the discriminating control for the qualified-call arm.

Dispositions: 8 empty modules, 72 named nowhere, 32 named only in docs, 86
named by live source (deleting these strands a citation), 105 carrying an
ExternalAuthority anchor and therefore NOT sweepable under the DESIGN §3
extdeps citation duty. Named findings include std.verification -- unreachable
but cited by name in 120 live .dag files -- and the tools/*_transport family
left standing when the floor and regen cuts uprooted their callers.

dag/gunbc/spark/ is excluded from every proposed batch; fierce-lynx-647 owns
that area.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ansports

Two review rulings applied, both re-measured here rather than taken on report.

std.verification's escalation DISSOLVES. "120 citing files" was a substring
artifact: v2.std.verification contains std.verification. Boundary-anchored, the
real surface is 6 occurrences, one of them the module's own module line -- 5
name references in 2 plan carriers. That is the same defect class this census
caught in its own instrument from the other side, and it is now recorded as
defect 4 in the method section with the rule for whoever measures next: never
a bare substring for a module name, because one module name is a suffix of
another. Re-measuring the whole population boundary-anchored moved only 4
rows, so the class was narrow -- and fatal on exactly the row that had been
escalated.

One citation site NEITHER name-based count could see: src/v2/test/fixture/
frontier_probe_elision_boundary_overlay.dag pins dag/std/verification.dag by
PATH with a content hash. A fixture pinned by content hash is a consumer, so
the deletion moves three sites, not two. Verdict recorded: delete the
604-byte, 0-importer module against the live 13,813-byte, 118-importer
v2.std.verification, repairing all three in the same PR.

The transports carve-out is UPHELD and made per-module, never granted to the
group. New FROZEN-PENDING-RE-ADD disposition, 15 rows, each naming its anchor:
eight witness transports whose binaries gunbc.ci_release_bins still declares as
CI release artifacts; four gates named on DESIGN's own unguarded list; and
three compile-clean rows carried on a prose restoration trigger and FLAGGED as
the weakest anchor. Five tools/ rows have no queue entry and separate out as
residue -- tools.gunbc_ci among them, superseded by
gunbc.witness_floor_workflow rather than merely unreferenced.

Also recorded: 12 of the 303 declare main() -- an entry shape with no argv
naming it, the residue a delete-first cut should have surfaced and could not,
because nothing downstream could refuse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
B3 and the PROSE-NAMED note still carried the pre-correction counts (32, 86)
while the disposition table above them carried the re-measured ones (28, 81).
Two counts for one population in one document is the defect this census exists
to find.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Both review rulings applied, each re-measured here rather than carried on report.

std.verification — escalation dissolves, and the trap is now recorded

Confirmed independently: boundary-anchored, std.verification has 6 occurrences, one of them the module's own module line — 5 name references in 2 plan carriers. The "120 citing files" in the first revision was a substring match against v2.std.verification, which contains std.verification. That is the same defect class this census caught in its own instrument from the other direction (text where structure was needed), so it is now defect 4 in the method section with the rule stated for whoever measures next: never a bare substring for a module name, because one module name is a suffix of another.

Two things the re-measurement added:

  • A citation site neither name-based count could see. src/v2/test/fixture/frontier_probe_elision_boundary_overlay.dag pins "dag/std/verification.dag" by path, with a content hash. A fixture pinned by content hash is a consumer — the deletion moves three sites, not two. A name-only census would have found it during the deletion instead of before it.
  • Re-measuring the whole 303 boundary-anchored moved only 4 rows. The class was narrow, and fatal on exactly the row that had been escalated. Also excluded the census document from its own scan — including it silently reclassified 40 rows out of RESIDUE-UNMENTIONED by naming them.

Second-authority half recorded as measured: 604 bytes / 0 importers versus 13,813 bytes / 118 importers.

Transports — carve-out upheld, granted per module against a named anchor

New FROZEN-PENDING-RE-ADD disposition, 15 rows, each naming what it is waiting for:

  • 8 witness transports — anchor: each wraps a Rust binary that gunbc.ci_release_bins (live, reachable) still declares as a CI release artifact. The binary is retained; the .dag invoker is the unattached half.
  • 4 gate rows (floor_effect_gate_witness, ci_heal_dispatch, both merge-admission rows) — anchor: each gate is named on DESIGN's own unguarded list.
  • 3 compile-clean rows — anchor: DESIGN's compile-clean entry-point trigger. Flagged as the weakest anchor: prose, no binary, no queue line. If that is judged not to be a queue entry, these three separate out as residue.

Five tools/ rows have no queue entry and stay residue, tools.gunbc_ci among them — and it is superseded, not merely unreferenced: it shells out to the old gunbc ci generate-and-run script while gunbc.witness_floor_workflow → witnesses.yml is what runs CI now.

Also recorded: 12 of the 303 declare main() — an entry shape with no argv naming it, which is exactly the residue a delete-first cut should surface loudly and could not, because nothing downstream could refuse.

Batch order updated: RESIDUE-UNMENTIONED (53 non-extdeps of 67) is the mechanics-establishing batch; the 15 frozen rows are in no batch at all.

— sent from merry-lark-560

gunbc-ci-auto-heal and others added 2 commits August 21, 2026 19:53
The heading and its intro still said three defects while the list below
carried four -- the fourth (bare-substring module matching) added when review
caught it. A document whose own summary disagrees with its body is the same
two-counts-for-one-population defect this census exists to find, and it had
already been fixed once in the batch plan.

Also states plainly that defect 4 was found by review of this document's first
revision, after it had produced a false escalation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An architecture ruling asked which call surfaces the number covers. Answering
it found a fifth instrument defect and moved the population again.

DEFECT 5: an entry row is not always spelled --entry. The census decoded argv
--entry and a narrow entry_file form; it did not decode the entry: "dag/..." /
<name>_entry_file: String = "..." field rows that gunbc.ci_spec and the emitted
workflows actually use -- 764 occurrences of that shape against 116 of the argv
shape, so the UNDECODED surface was the larger one. Decoding it moves 303 ->
298 and returns three modules to consumed, two of which this document had
frozen on a re-add anchor: tools.floor_effect_gate_witness and
tools.ci_heal_dispatch are not frozen, they are invoked. An anchor can be real
and the conclusion still wrong when the instrument has not read the surface
that settles it. Recorded rather than quietly dropped.

COMPLETENESS STANDING, now carried beside the number: LowerBoundOnly over a
declared universe, with the decoded surfaces enumerated and three undecoded
ones named -- dynamically composed argv, host-side invocation naming neither
path nor module, and an entry row declared inside an unreachable module (which
over-admits consumption). Every one can only shrink the population. Three
revisions have each lost modules to a newly decoded surface, which is the
empirical case for the standing rather than an argument for it.

UNITS: every count now carries one, and DistinctFileCount vs
SourceOccurrenceCount are never interchangeable -- that conflation is what
produced the false std.verification escalation.

Also confirmed by reading both sites: two live BROKEN entry strings, both in
dag/gunbc/spark/ (fierce-lynx-647's area, reported not touched) --
grant_install.dag does not exist, and serving_durability.dag does not define
spark_serving_durability_ci_wet. A sibling lane found the same two
independently; that is a second instrument agreeing, not a second report of one
measurement.

New section 7 writes the five failures as a calibration benchmark for the next
audit instrument: cardinality, exact identity, representation-vs-subject,
qualified use, string-bound entry, and a POSITIVE NO-FINDING case -- the
deliberate negative-control entries (WRONG_ENTRY.dag, dag/a.dag,
__no_such_entry_zzz.dag) that a broken instrument reports as defects. Each case
names a live specimen in this tree. Attribution is stated: two of the five
defects were the dispatching lane's, one was in both instruments, and two were
this census's own -- neither found by its author.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Completeness standing added, and answering "which surfaces does the number cover?" found a fifth instrument defect that moved the population again.

Defect 5 — an entry row is not always spelled --entry

The census decoded argv --entry and a narrow entry_file form. It did not decode the entry: "dag/…" / <name>_entry_file: String = "…" field rows that gunbc.ci_spec and the emitted workflows actually use: 764 SourceOccurrenceCount of that shape against 116 of the argv shape — the undecoded surface was the larger one.

Decoding it moves 303 → 298 and returns three modules to consumed, two of which this document had classified FROZEN-PENDING-RE-ADD on the strength of a re-add anchor: tools.floor_effect_gate_witness and tools.ci_heal_dispatch are not frozen, they are invoked. An anchor can be real and the conclusion still wrong when the instrument has not read the surface that settles it. Recorded in §4d rather than quietly dropped.

Completeness standing: LowerBoundOnly

298 resolved-unconsumed over a declared universe. Decoded: imports, qualified module.symbol references, argv --entry, *entry*: path fields, seed mirrors by filename. Named blind spots, each of which can only shrink the population: dynamically composed argv (roadmap_serve is invoked with --function ", svc.serve_function); host-side invocation naming neither path nor module; an entry row declared inside an unreachable module (over-admits consumption — v2.workflow.product_receipt_stage is rooted this way).

Three revisions have each lost modules to a newly decoded surface (333 → 303 → 298). That is the empirical case for the standing, not an argument for it. The doc never claims "there are exactly 298".

Units are now carried on every count, with DistinctFileCount and SourceOccurrenceCount never interchangeable — that conflation is precisely what produced the false std.verification escalation.

Two broken entry strings — confirmed independently

Both read at the site, not counted:

  • dag/gunbc/spark/grant_install.dag — named by gunbc.ci_spec gunbc_ci_spark_grant_install_invoke with function spark_grant_install_ci_wet. The file does not exist.
  • dag/gunbc/spark/serving_durability.dag + "spark_serving_durability_ci_wet" — named by ci_spec and fleet-converge.yml. File exists; that function is not in it.

Both in dag/gunbc/spark/ — fierce-lynx-647's area, reported not touched. Same two the sibling lane found: a second instrument agreeing, not a second report of one measurement.

§7 — calibration benchmark

The five failures written as cases with live specimens in this tree: cardinality (both units required), exact identity (std.verification vs v2.std.verification), representation-vs-subject (spelling absent ⇏ capability absent), qualified use (caller edge present with no import line), string-bound entry (resolution REFUSED — path present, function absent), and the positive no-finding case: WRONG_ENTRY.dag, dag/a.dag, __no_such_entry_zzz.dag are deliberate negative controls inside witness tests and must come back clean. A suite built only from defects is passed by an instrument that reports everything as suspicious.

Attribution is stated in §2: two of the five were the dispatching lane's, one was in both instruments, two were this census's own — and neither of those two was found by its author.

— sent from merry-lark-560

@briansrls
briansrls merged commit 72a8eb9 into main Aug 21, 2026
1 check passed
@briansrls
briansrls deleted the session/merry-lark-560 branch August 21, 2026 23:08
briansrls pushed a commit that referenced this pull request Aug 21, 2026
…re-cut, re-qualify, re-apply emitter fixes
briansrls pushed a commit that referenced this pull request Aug 22, 2026
…: 26 live witnesses behind a measured zero (#8851)

* A name-and-path census is structurally blind to whole-pool resolution: 26 live witnesses behind a measured zero

A second unconsumed-module census, run independently on 2026-08-22, returned 14
modules unreachable on both module name and file path. None of the 14 are in this
document's 298, and the reconciliation is the finding rather than a discrepancy to
settle: 11 were reachable all along and 3 postdate #8803.

Ten of the eleven are §2 defect 3 (fully-qualified reference), which this document
already records -- the run required an EXACT match against the module name, so
extdeps.bmc.access.redfish_rbac_policy matched nothing because the reference string
is longer than the module name. The four-module gunbc.accelerator_demo_* cluster it
returned is precisely the family defect 3 records as having moved back to reachable.

The eleventh is a new instrument defect, filed here as §2 defect 6. v2 resolves a
bare symbol against the whole module pool, so a consumer can use a declaration while
naming neither the declaring module nor its file. module_refs.dag has 26 consumer
files, all floor-discovered *_test.dag, and all 26 name neither -- they write
extdeps_cargo_build_module bare. This is invisible to a name surface AND a path
surface by construction, which makes it the dangerous kind: the reported zero is
indistinguishable from a true zero, and deleting the module on that reading would
have taken 26 live witnesses down while the census showed nothing.

Three post-census modules get typed dispositions in §4g. The two §4b deficit
carriers are KEEP -- a class below its ceiling is required to name its trigger, so
an unconsumed deficit row is the mechanism working, and deleting them deletes the
safety ledger. gunbc.scm.commit_closure_store is the one real defect: repository_envelope
took its grain one day later and does not import it, leaving the Filesystem save/load
half unattached. Raised as an open question for that author, deliberately not answered.

Also records the shallow-graft hazard: a fresh worktree can be grafted at a single
import commit, so git log silently answers consumed-until-a-recent-cut from a
truncated history.

No modules are deleted. 0 deletions is the result, not an unfinished task.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Re-score the 298 against defect 6: at least 91 have a live caller, and 13 of them are in the batch sequenced to delete first

The whole-pool surface was found on one module. Scoring the full population against
it moves 91 of the 298 to consumed -- an over-count of roughly 31% -- so the headline
table now carries 207 with the delta shown rather than a footnote, because the
headline number is the one anyone acts on.

Method: per candidate, take its DECLARED SYMBOLS (not the module name, not the path)
and ask whether another .dag file names one bare. Attribution is by unique ownership;
a symbol several modules declare is never counted as consumption.

Three false-positive classes were removed after being observed rather than
anticipated. The first string-stripper was a regex and it FAILED on real .dag prose
containing \{ interpolation escapes -- it terminated the literal early and scored
std.syllogism as consumed off exposed prose. Replaced with a character scanner.
Identifiers preceded by . (a qualified call's tail, field projection) or followed by :
(record fields, parameter labels) are not references. Six decisive rows were verified
by reading the reference site; none imports or qualifies.

Where it lands matters more than the total. RESIDUE-UNMENTIONED -- "Delete. Highest-
confidence residue", sequenced as B2 because it was judged least exposed to blind
spots -- has 13 of 67 consumed by live callers. The batch chosen because it was safest
carried the most concentrated risk. B2 is marked superseded; B1 replaces it, and
RESIDUE-EMPTY at 0 of 8 is the control showing the instrument is not finding
consumption everywhere. FROZEN-PENDING-RE-ADD has 10 of 13 invoked now, repeating
defect 5's lesson: the anchor was real and the conclusion still wrong.

The 75 ambiguous rows are a finding, not only noise: extdeps_external_authority_anchor
is declared by 102 modules, main by 11. The floor already prints
[floor-bare-name-ambiguity] scopes_affected=961 of 1339 every run, which corroborates
the class independently of this census. Those rows are unresolved, not consumed.

Claims one thing: at least 91 of the 298 have a live caller. LowerBoundOnly now
applies to 207.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* State the common cause once: every defect but two is a conclusion drawn without reading the settling surface

Review asked for the shared mechanism at the top rather than restated as defects 5, 6
and a sequencing inversion. All three are one shape: locally valid reasoning over a
surface nobody read. Defect 3 scored the accelerator family dead without reading
qualified calls; defect 5 froze tools/ rows without reading the entry: field surface;
defect 6 scored module_refs dead without reading bare-symbol resolution. So the useful
review question is not "was this argument sound" but "which surface settles this, and
did you read it".

Adds the corollary that governs how the document is read: where a confidence label and
an explicit standing disagree, the standing governs. RESIDUE-UNMENTIONED reads as
strong evidence of deadness and LowerBoundOnly says no class here is blind-spot-free;
the label was attached to the thing being sequenced while the standing sat three
sections away, so the label won and 13 live-called modules went into the lead deletion
slot.

Also reports each filter with what it cost -- 98 raw, 93 after excluding qualified-tail
and field/label identifiers, 91 after the character-scanner string strip. The
intermediates show no single filter dominates, which is what distinguishes them from a
fudge factor tuned to a target. Header corrected to six defects.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* The cleanup list is 131, not 298; and 22 of it is named v2.test but wired to nothing

Two findings from reading the re-scored population, neither captured by the
disposition classes.

The actionable list: 96 STILL-UNCONSUMED plus 35 DEAD-CONSUMER-ONLY (the island shape,
which deletes as a group or not at all) = 131 residue on all three decoded surfaces.
That is what the operator's cleanup arm points at. The other 167 are not eligible: 91
have live callers and 75 are unresolvable at identity grain.

Floor discovery keys on the FILE SUFFIX, so a module named v2.test.* is discovered only
if its file ends _test.dag. Corpus-wide, 200 modules are named v2.test.* whose file is
not _test.dag and exactly 2 of them declare a test fn. The 22 of those inside this
population have names and paths that disagree -- v2.test.language_model.go_r1 lives at
src/v2/extdeps/language_model/go_r1.dag. This subsumes finding f: the language-model
rungs are not an unclimbed ladder, they are named as tests, declare no test, sit outside
any test path, and execute nowhere. A name implying enrolment while the mechanism keys
on something else is the more useful statement, because the ladder metaphor invites
"climb it" and the measurement says nothing here was ever wired to run.

Also records that gunbc.spark.provisioning's appendix row no longer resolves -- the path
does not exist. An appendix row pointing at nothing is the staleness class this document
polices elsewhere.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* The island constraint belongs on the row, and the enrolment-name rule beside the standing rule

Three corrections from review.

The 35 DEAD-CONSUMER-ONLY rows carry a constraint, not a preference: a per-module
verdict over a mutually-referencing island is incoherent, because each member looks
consumed until its neighbours go. Scoring them one at a time returns "consumed" for
every one and the island never becomes eligible. They delete as a connected component
or not at all. Stated on the bucket row and in 4h so the deletion lane meets it as a
documented constraint rather than as a surprising refusal partway through a batch.

The enrolment-name rule now sits BESIDE the label-versus-standing corollary in section
2 rather than under finding h, because it is the same disease one level down -- prose
layer and mechanism layer. Discovery keys on the file suffix; 200 modules are named
v2.test.* without it and 198 declare no test. Both are a word doing work only a
mechanism can do, and the second is self-demonstrating: this census read those names as
enrolment until the suffix was checked, which is what made finding f plausible.

gunbc.spark.provisioning's deletion was deliberate and ruled by the lane that
commissioned this census, the model having predated knowledge of the real procedure. So
the surviving appendix row is the defect, not the deletion -- recorded because the
document polices exactly that staleness class and here it caught its own author.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Defect 7: variant constructors are declared symbols, and a census's own counters cannot control for its blind spot

Cross-lane finding from crisp-ram-314, reproduced on this population. Declaration
extraction read fn/func/data/type/const and not coproduct VARIANT CONSTRUCTORS, so
gunbc.pr_digests owned MergeReadinessVerdict but not Ready/NotReady, while
gunbc.code_change_workflow names Ready bare with no import. It scored residue and is
consumed. Found by the required floor refusing a deletion, not by reasoning about the
census.

Re-scored: CONSUMED-DECISIVE 91 -> 93, STILL-UNCONSUMED 96 -> 83, AMBIGUOUS 75 -> 87,
residue list 131 -> 117. Of the 14 that left the residue list only 2 became consumed;
the rest moved to AMBIGUOUS, which means no longer provably unconsumed rather than
proven consumed.

Three further defects were found INSIDE the fix, each by hand-verifying rows before
publishing, and each produced a FALSE consumption claim: a generic type header
(type UpsertDecision<P>) defeated extraction so gunbc.apply appeared to own Apply; a
multi-line variant record truncated the scan region so extdeps.transports.sql appeared
to own Select; and operation Parse { / operation Delete { are declarations in the flat
service namespace being read as references. Each created false uniqueness, which is what
turns a collision into a confident wrong attribution. One row moved the other way --
extdeps.access.zanzibar lost a unique attribution -- so the defect is one-directional at
the population level and not at the row level.

Records the general rule above the defect list, because it is stronger than any entry in
it: a control derived from the measurement it controls does not discriminate that
measurement's blind spot. Every counter this census produces was structurally incapable
of seeing defect 7 and read as reassurance precisely because it stayed consistent. An
independent instrument caught it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* State plainly that the control rule is self-demonstrating in its own filing

Review asked for this rather than leaving it for a reader to notice. Defect 7 was
checked against this census only because an independent instrument refused on a
different branch; this document prompted nothing and its counters had been stable
across every revision. The three defects inside the fix were found by hand-reading
rows before publishing, and no counter surfaced any of them.

The practical form: before publishing a count, read enough rows behind it to be wrong
out loud, and treat a number that has never disagreed with you as untested rather than
confirmed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* commit_closure_store: DELETE as a staged orphan at the wrong grain -- both arms this row offered were false

The #8820 author disposed of it and refuted both arms this row had stated as the live
possibilities. Recorded in full because a false cause attached to a true deletion is the
class this document exists to catch, and this row asserted both.

Arm A was false: repository_envelope contains zero Filesystem operations and not one
func -- verified independently here -- so it is a pure codec and nothing superseded this
module. Arm B was false and is the load-bearing half: the grains differ, and wiring an
envelope whose init has no root to a carrier that demands one would force init to invent
a phantom commit. So the correct cause is a staged orphan at the wrong grain, never
wired, deleted rather than frozen because a surviving X is an attractor. The row cites
the disposition message rather than the module, since a citation into a module being
deleted dies with it.

Its author also volunteered a defect no census here found: the header claims persistence
is "verified by direct execution in Wet mode" and names commit_closure_round_trip_probe,
which is true of a hand run and false now -- the probe is enrolled nowhere and nothing
executes it (verified: no reference outside its own module, and the file is not
_test.dag so discovery never sees it). A carrier asserting executed evidence for a probe
that does not run is a 4b rung-honesty defect.

That makes three independent sightings of one rule in a single night, from three lanes:
200 v2.test.* modules discovered as nothing, this probe enrolled nowhere, and the spark
lane's vacuous witnesses. The unread surface differs each time -- discovery, enrolment,
assertion content -- and none of the three could be refused by anything, which is why
each survived. A claim that no mechanism can refuse is not evidence, whatever it asserts
about itself.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* A fourth extraction bug, and a fifth with measured zero exposure

Reciprocal from the deletion lane, which ran the four discriminating cases published
with the extractor and found a bug its author did not have -- the argument for shipping
discriminators rather than bug descriptions.

(d) Same-line coproducts: type PrerequisiteKind = Capability | Credential | ... puts
every variant on the type line, so a scan anchored to lines starting with = or | never
sees them. A region-based extractor handles it. All four cases re-verified on the
extractor that produced these counts, so 117 postdates (d) -- checked rather than
assumed, since the question was whether the number predates the code.

(e) operation/service/resource rows are declarations in the flat service namespace
(338/8/5 in the corpus). This instrument subtracts them from the consuming side but does
not credit them to the declaring side, so a module declaring only operation rows would
own nothing and could score residue while consumed. Measured exposure here is zero: no
row of the 298 declares nothing-but-operations, and not one of the 20 operation-bearing
rows sits in STILL-UNCONSUMED. Mechanism real, no victim on this population.

Also records that the two (c) fixes are not equivalent and should not be unified.
Subtracting from the consumer is more precise; adding to the declarer is more
conservative and parks rows in AMBIGUOUS that subtraction correctly leaves in
STILL-UNCONSUMED. For a deletion lane the conservative error is the right one, so a
residue count should come from the precise implementation and a deletion set from the
conservative one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore section 4h, which my own previous commit silently deleted; implement (e); and one more false-reference defect

THE DELETION FIRST, because it is the more serious half. The commit_closure_store
rewrite replaced a region by index -- from that bullet to the hazard block -- and took
section 4h with it: the 117-row cleanup list, the v2.test enrolment finding, the island
connected-component constraint, and the spark.provisioning row. That is the
take-one-side-whole failure this repository already has a name for, committed by the
author of a document about instruments that delete things they cannot see. Restored from
5a31723 with numbers brought forward. Found by a grep for a phrase that should have
matched and did not -- an assertion failure in an edit script, not review.

(e) IMPLEMENTED, and implementing it confirmed the zero rather than resting on the count:
crediting operation/resource names moved zero rows. A first cut also credited the
service's own short name, which produced a FALSE consumption claim for
extdeps.cloud.gcp.sts, and was withdrawn -- a service short name is not a symbol
consumers name bare.

(f) NEW, found while implementing (e): a generic type PARAMETER is a binder, not a
reference. type GraphInvariant<Projection> binds Projection and does not reference
v2.std.projection, which was that module's only link. CONSUMED-DECISIVE 93 -> 92,
AMBIGUOUS 87 -> 88, RESIDUE-UNMENTIONED consumed 13 -> 12. The residue list is unchanged
at 117, so nothing handed to the deletion lane moves.

Note the symmetry: a generic header defeated DECLARATION extraction in defect 7's bug (a)
and inflates REFERENCE extraction in (f) -- one construct breaking both halves of the
instrument in opposite directions. And both wrong answers in that paragraph came from the
fix rather than the defect, which is now the pattern rather than the exception.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* (f2): the binder's body uses, and the file-wide shadow that put 5 live modules in the residue

The deletion lane's extractor still failed the sixth discriminator after implementing (f)
exactly as this document described it, because (f) has two halves. (f1) is the parameter
list in the header. (f2) is every use of the bound name inside that declaration's body --
type GraphInvariant<Projection> { projection: Projection } -- where the field type is a
second, independent false reference that survives stripping the header.

The more serious half is what this document had shipped as the fix. Shadowing the bound
name FILE-WIDE removes references, which is the delete-a-live-module direction: a name
bound as a parameter in one declaration may be genuinely referenced in another. Scoping
the shadow to the binding declaration's region -- the same region walk the variant
extractor already performs, run over the reference side -- restored 5 real references and
moved 5 modules out of STILL-UNCONSUMED. Each had been a deletion candidate solely
because of an over-broad fix to a false-positive defect.

Residue list 117 -> 112. STILL-UNCONSUMED 83 -> 78, AMBIGUOUS 88 -> 93. CONSUMED-DECISIVE
unchanged at 92, so the disposition cross-table does not move.

The symmetry is now three-way: one generic header defeats DECLARATION extraction in bug
(a), inflates REFERENCE extraction in the header (f1), and inflates it again in the body
(f2) -- and the body half survives the obvious fix for the header half.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* (f2): the binder's body uses, and the file-wide shadow that put 5 live modules in the residue

The deletion lane's extractor still failed the sixth discriminator after implementing (f)
exactly as this document described it, because (f) has two halves. (f1) is the parameter
list in the header. (f2) is every use of the bound name inside that declaration's body --
type GraphInvariant<Projection> { projection: Projection } -- a second, independent false
reference that survives stripping the header.

The more serious half is what this document had shipped as the fix. Shadowing the bound
name FILE-WIDE removes references, which is the delete-a-live-module direction: a name
bound as a parameter in one declaration may be genuinely referenced in another. Scoping
the shadow to the binding declaration's region restored 5 real references and moved 5
modules out of STILL-UNCONSUMED, each a deletion candidate solely because of an
over-broad fix to a false-positive defect.

The numbers for this landed in the previous commit; this adds the reasoning that
explains them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Two stale residue numbers, one of which reached a review summary as fact

The (f2) correction moved the residue list 117 -> 112 and I updated the buckets, section
4h and one clause, but missed two places. One was a sentence carrying BOTH numbers at
once -- "the actionable residue list is 117, not 206 -- note that 112 is what a deletion
lane consumes" -- self-contradictory in a single sentence, in the summary paragraph a
reader hits first. The reviewer on the current head duly reported "117 actionable", so a
stale number in this document propagated into a review artifact as a fact about the
corpus. That is the failure this document records at prose grain, committed inside it.

The other pinned a superseded count to a claim about the (d) fix -- "117 postdates (d)".
Rewritten as "every count in this document postdates (d)", which is what the sentence was
actually asserting and does not go stale when a count moves.

Cause, since it is the same one twice: I updated numbers by targeted string replacement
against phrasings I remembered writing, rather than sweeping every occurrence of the
value. Arithmetic verified this time: 92+93+78+34+1 = 298, residue 78+34 = 112, and
298-92 = 206.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore the service-name credit: the false positive was (f), and withdrawing it gave one module false sole ownership

I withdrew declaring-side crediting of service short names on the strength of one false
consumption claim (extdeps.cloud.gcp.sts via Metadata). Both the attribution and the
stated reason were wrong.

The false claim was (f) -- the consumer named Metadata as a generic type parameter --
and the service credit was standing next to it. Measured: with (f2) region-scoped,
restoring the credit moves zero rows and gcp.sts stays DEAD-CONSUMER-ONLY. The deletion
lane could not reproduce the false positive at all, because its pattern never matched
dotted service forms; that mismatch is what located the real cause.

The stated reason -- no evidence a consumer bare-names a service -- is refuted by their
seventh discriminator: dag/extdeps/realization/artifact_store_fs.dag writes
Filesystem.Write, Filesystem.Read and Filesystem.Delete with no import naming Filesystem.

And the withdrawal was the own-nothing direction. Filesystem is declared twice, as
service Filesystem in extdeps/filesystem/filesystem_io.dag and resource Filesystem in
std/resources.dag, so dropping the service credit hands std.resources false sole
ownership of a symbol another module visibly declares -- manufacturing exactly the false
uniqueness that produces confident wrong attribution.

Credit restored, justified by correctness of ownership rather than by measured effect,
since the measured effect is nil. Counts unchanged: 92 consumed, 93 ambiguous, 78 still,
34 dead, residue 112.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Put the inequality signs in the headline cells: a bound quoted without its boundary becomes an exact number

Review ask: make the headline carry its boundedness, because a bounded number quoted
without its boundary becomes an exact one in the next reader's hands -- which is how 298
travelled out of this document and became a deletion list.

The cells now read >= 92 consumed and <= 206 unresolved, each carrying LowerBoundOnly
beside its unit, and the residue list <= 112 is promoted into the table rather than living
only in a following sentence. The named blind surfaces are listed inline so the direction
is visible at the point of quotation: all four can only move modules out of both numbers.

Also separates the two numbers explicitly, since substituting one for the other is the
live risk: <= 206 is the unresolved population, <= 112 is what a deletion lane may consume,
and the 94-module difference is AMBIGUOUS-SHARED-ONLY plus MISSING-FILE -- rows unresolved
at identity grain rather than proven residue. Verified: 93 + 1 = 94.

Edited by anchored replacement with the section list and appendix row count re-read
afterwards (8 findings, 298 rows), rather than by index-based region replacement, which is
what silently deleted section 4h earlier tonight.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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