Repository navigation
Census the corpus's unconsumed modules: 303 unreachable, classified - #8803
Conversation
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>
|
Both review rulings applied, each re-measured here rather than carried on report. std.verification — escalation dissolves, and the trap is now recordedConfirmed independently: boundary-anchored, Two things the re-measurement added:
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 anchorNew FROZEN-PENDING-RE-ADD disposition, 15 rows, each naming what it is waiting for:
Five Also recorded: 12 of the 303 declare 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 |
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>
|
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
|
…re-cut, re-qualify, re-apply emitter fixes
…: 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>
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:
extdeps/colo/is one: 19 modules importing each other andextdeps.colo.types, consumed by nothing outside.The instrument defect (applies to any earlier orphan number in this repo)
.dagadmits a fully-qualified call with no import statement.dag/test/claim/accelerator_demo_gpu_witness_test.dagcallsgunbc.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 wholegunbc.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, andv2.workflow.ci_materialization_emit_testis discovered despite not living under atest.namespace.Controls (
v2.compiler.compile,gunbc.spark.serving_desired,gunbc.clock_read,v2.std.node) score reachable on every pass;gunbc.accelerator_demo_gpuis retained as the discriminating control for the qualified-call arm.Dispositions
ExternalAuthorityanchor)ENTRY-INVOKED is zero by construction: the entry index (34
--entryargv 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.dagfiles, 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 livev2.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) andextdeps/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-647owns 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.