Skip to content

v1 reachability census: measured lower-bound production dependencies and the pre-deletion worklist - #10939

Merged
briansrls merged 14 commits into
mainfrom
session/deep-bee-532
Sep 11, 2026
Merged

briansrls merged 14 commits into
mainfrom
session/deep-bee-532

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

What this is

The pre-deletion inventory of every production dependency on the v1 interpreter and compiler — built by extending gunbc.v1_consumer_census, which already owned this question, rather than starting a second census. No new subject, medium, disposition or completeness vocabulary is minted.

The population is a measured lower bound, and this PR deliberately quotes no number as "the" count. Ask the producers instead — they re-derive on the tree you are standing on:

what you want ask
relations whose replacement does not exist today gunbc run --source-root dag --source-root src/v2 --entry dag/gunbc/v1/v1_consumer_census.dag --function v1_blocking_consumer_count
rostered relations, and relations nobody has judged v1_consumer_member_count, v1_undecided_row_count
the ordered worklist v1_deletion_worklist (a permutation of the roster; it executes nothing)
undisposed .dag relations on this tree v1_discovery_gate — refuses, naming them

A number written here would rot the moment the tree moved, and this lane has now measured twice that its own count was low. PopulationMeasuredLowerBound stands; PopulationMeasuredComplete is not hand-authored anywhere.

The joined producer — tools.v1_consumer_discovery, and exactly what it cannot see

The census's next-rung trigger asks for one joined producer over its eight media. This lands it for the medium where the join is derivable: the universe is every declaration v2.std.decl_index decl_facts answers for dag + src/v2; the consumer half is projected from the fact's own qualified_name/rel_path; the authority half is the signature table, homed in the census beside the DeclarationRefs it resolves to; the key is v1_row_key, called rather than re-spelled. Every discovered row is Undecided by construction — discovery says a relation exists, judging it is the census's authored fact.

The blind spot is declared, measured, and enrolled. For a String data row whose initializer is the literal (data devboot_program_package: String = "v1-compiler"), decl_facts_at finds the declaration and v2.std.fn_index atom_identities_in_node over its node does not contain the lexeme — while the same reader over a list-literal initializer does. So the producer sees list and call positions and is blind to the bare-String-initializer position, and an earlier ExitSuccess from the gate was a false negative, not a completeness claim. The repair belongs in the declaration-fact projection for data items, not here — reaching past it means a second literal reader beside the corpus's own, the §3 fork. So the boundary is asserted by a witness written to go RED when the blind spot closes, with the list position as its positive control: the day the projection carries the lexeme, that witness fails and whoever fixes it widens the producer's claim and re-runs the gate.

Why the other seven media are scope, not a hidden gap: they have no declaration namespace a file-grain hit can be attributed to, so a hit cannot become a keyed row without inventing the consumer half — the fabrication V1UncitableConsumer refuses. missing_basis partitions them into the three obligations they actually are (four are projections of .dag declarations and want a refusal beside generated_artifact_registry, not a scanner; Rust needs a producer over an existing projection; Cargo manifests are the one medium owed a new derivation, homed in rust_crate_partition).

Method: two retracted mints, and the keying rule that explains both

This census exists to refuse invented references, and it produced two of its own before review caught them — recorded here because the second is the more instructive.

v1_compiler.bin.regen_stage0 was minted as a live authority for a binary that does not exist: no bin target in src/v1/stage0/Cargo.toml, no file under src/v1/stage0/src/bin/, surviving only as a prose mention in a Cargo.toml comment. Reading a literal and assuming a target is exactly how a census fabricates. Deleted; the one corpus declaration still naming it is rostered as Retire with the deletion as its reason.

One revision later, native_route_census_receipt was minted to justify splitting the native-lane relation in two — universe derivation and receipt adjudication read as separately migratable, and paying for that reading meant citing a consumer that does not exist. Both calls are inside run_required_v2_native. The census keys on consumer × authority, so one function reaching one authority is one relation however many roles it plays. The split is withdrawn rather than repaired; the surviving row carries both roles and both closing conditions. If those halves ever become separately migratable it will be because a real second symbol exists to cite.

Rows added

  • The .dag argv population, most produced by the joined producer and seven hand-authored and labelled as such — the seven review found because the producer could not see them: the fabric's BuildGunbcBinaries route and its default bin set, devboot's offered programs and its cargo package, three bin-name/release-path carriers, the namespace step-0 canary chain, and — the one that makes ProductsV1Free a genuinely separate finish line — gunbc.live_deploy installing the gunbc tree onto a served host and reading it back.
  • Six required-lane step relations the rosters never named: the cargo build -p v1-compiler --bins step both required lanes start with, the seven stage0 partition crates, the clippy gate, and the two measurement steps — v1 seals an unreached receipt and v1 adjudicates the published one, so the floor's own verdict is computed inside the thing being replaced.
  • The self-host link: emitted_closure_compile_host probe_manifest mints v1-compiler = { path = src/v1/stage0 } into every emitted closure. The emitted compiler is not seed-free even when every source of it is self-emitted, and a fixed point measured on emitted bytes says nothing about this edge.
  • The native-lane relations, promoted out of the uncitable frontier now that Model the required-v2-native lane authority: route receipt, exclusion taxonomy, admission, enrolment gate #10882 merged — a declared frontier dissolving into the population, which is what it was for. Landing that lane added v1 relations and removed none.

Corrections to the brief

New derivations

v1_worklist_partition eliminates ConsumerDisposition once — every arm lands in exactly one of unjudged / retained-open / discharged by construction, so the classes cannot drift — and v1_deletion_worklist concatenates those buckets. It executes nothing.

Testing

22/22 witnesses green by execution, each new one a pair with its own control: the fold run against a real declaration node fetched by decl_facts_at (39ms, with a red control on a declaration naming no v1 binary); the blind-spot boundary with the list position as positive control; the self-observation control; the unknown arm counted apart from the uncovered one against a population differing in one disposition; the worklist ordering read off the produced list; the native-lane promotion.

The whole-corpus join is not enrolled and says so: as long-home witnesses it was interrupted_before_verdict by the floor's cost budget. What runs per PR is the mechanism; the corpus-wide claim runs on demand at v1_discovery_gate.

🤖 Generated with Claude Code

@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 10, 2026 15:45
…umed key projection

Both findings hold and both are the repo's own law, not style.

The executed-receipt row was an ordinary String carrying a run's transcribed
output -- DESIGN 4c's misplaced commentary and 6's 'name the instrument, never
transcribe its output' in one declaration. The reviewer's decisive evidence was
that it was not a convention this file was following: exactly one file in the
tree carried that shape, the one this change added. The rationale half survives
as a module-scope annotation on the gate; the re-derivation command was already
on v1cd_producer, which is where a reader should reach it.

required_lane_aggregate_v1_free_basis was the same defect over a measured
NEGATIVE result. It is folded into missing_basis, a field of the typed
PopulationMeasuredLowerBound the admission gate actually reads, so the fact that
the aggregating job reaches no v1 subject now travels with the population arm
rather than sitting beside it.

v1_discovery_all_keys had no call site, no producer command and no witness --
dangling under 3c. Deleted; v1_discovery_report and v1_discovery_gate are the
consumed entries. v1_pending_head_pr was the same shape and goes with it.

Re-verified after the edit: 19/19 witnesses pass, v1_discovery_gate exits 0.
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Both findings in review 63158 hold, and both are the repo's own law rather than style. Fixed at 2fdb949.

v1_discovery_gate_executed_receipt: String — deleted. It was a run's transcribed output in an ordinary String: §4c's misplaced commentary and §6's "name the instrument, never transcribe its output" in one declaration. The evidence that settled it was the part I could not argue with — git grep -c "_executed_receipt: String" returning exactly one file, the one this PR adds, so it was not a convention I was following. The rationale half (why the gate's RED is authorable at all, per §4b) survives as a module-scope annotation on v1_discovery_gate; the re-derivation command was already on v1cd_producer, which is where a reader should reach it, and the executing evidence is the witness rather than a sentence.

required_lane_aggregate_v1_free_basis: String — same defect over a measured negative result, and you were right to name it alongside. Folded into missing_basis, a field of the typed PopulationMeasuredLowerBound that v1_bankruptcy_transaction_admitted actually reads, so "the aggregating witnesses job reaches no v1 subject" now travels with the population arm instead of sitting beside it.

v1_discovery_all_keys — deleted. No call site, no producer command:, no witness; dangling under §3c with no frontier declared. v1_discovery_report and v1_discovery_gate are the consumed entries. Sweeping for the same shape found one more of mine, v1_pending_head_pr: String, which goes with it.

Re-verified after the edit, not assumed: 19/19 witnesses pass and v1_discovery_gate exits 0.

— sent from deep-bee-532

gunbc-ci-auto-heal added 3 commits September 10, 2026 16:36
…starts from the carrier

The seven unjoined media are three obligations, not one, and the distinction
decides whether anyone should build a scanner at all: four of them are
projections of .dag declarations the joined producer already keys, so scanning
them would discover the same relation twice under a second key. Writing that
into the population's own basis field keeps it reachable from the census rather
than from a message thread.
The finding holds and it is the trap DESIGN names hardest. The per-PR witness
exercised the light half homed in the census -- the signature table and the
module-path projection -- while v1cd_rows_in_fact, the joined producer itself,
had no executed arm anywhere in the tree. My own hand run is a receipt about one
afternoon, not a consumer, and the annotation telling a reader to run the command
is a human instruction: section 6's inert-lens tier exactly.

v2.test.long.v1_consumer_discovery now runs the fold over both source roots and
asserts three things: a real argv relation is found and a fabricated one of the
same shape is not; the producer does not count its own signature table, asserted
alongside the table being non-empty so it cannot pass by the table emptying; and
the join reports nothing undisposed, which is the gate condition the headline
rests on.

It is in the LONG home for the same reason v2.test.long.decl_index_enumeration
is -- the fold walks every declaration in the corpus, 405s measured, which is
that home's declared cost class. Enrolment is by module prefix, so no roster
changes. missing_basis now names the executing witness instead of stating the
join as a property.

Executed: 3/3 pass.
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Review 63173 — the finding holds, and it is the trap DESIGN names hardest. Fixed at 4a3e9cf (in the branch as of c0119c8).

You were exactly right about the gap: the per-PR witness exercised the light half homed in the census — v1cd_module_path_from and v1cd_lexeme_is_a_signature — while v1cd_rows_in_fact, the joined producer that is the headline, had no executed arm anywhere in the tree. My own hand run is a receipt about one afternoon, not a consumer, and the annotation telling a reader to run the command is a human instruction. §6's inert-lens tier, named correctly.

src/v2/test/claim/long/v1_consumer_discovery_test.dag now runs the fold over both source roots and asserts three things, each with its control:

  • a real argv relation is found (gunbc.devboot.program.offered_programs -> v1_compiler.bin.claim_batch.main, which the corpus really spells) and a fabricated one of the same shape is not — a fold that returned everything, or the same rows for every fact, passes the first and fails the second;
  • the producer does not count its own signature table, asserted alongside the table being non-empty, so it cannot pass by the table having quietly emptied (that self-observation defect was real: the first run reported the census as a five-fold consumer of its own subjects);
  • v1_discovery_undisposed_at is empty — the gate condition the headline rests on, executed rather than described.

3/3 pass, measured 405s for the three witnesses.

Why the long home and not the per-PR floor: the fold walks every declaration decl_facts answers for both roots — the same cost class v2.test.long.decl_index_enumeration sits in, and enrolment there is by module prefix so no roster changes. Your docs_projection_gate comparison is the right convention and this follows it; it just lands on the cadence the cost allows. Neither witness alone would be honest: the per-PR pair exercises the projection and the table, the long pair exercises the fold.

Second finding, on missing_basis stating the join as a live property — same root, and it now names the executing witness and the split rather than asserting the property.

Also merged origin/main (through #10945); the floor red on the previous heads was IMPORT-MEMBER-ABSENT in gunbc.cloudflare.r2_token_mint_run, present identically on main's own runs and not introduced here.

— sent from deep-bee-532

… refusing gate a call site

Two findings, both correct, and the first is the one that matters.

FABRICATED PINS. source_tree_hex was fed a COMMIT sha for the two new
producers -- a commit is never its own tree, and the pre-existing rows in this
file prove the point by being honest (0bdb8dc's tree really is 168f313) -- and
for the unmerged-head producer, a prose phrase where a hex digest is declared.
Both type-checked. Both were fabricated plausible output, which section 5 forbids
outright, and 'fix the string' would only have made the fabrication harder to
spot. The repair is the modelling the pin was missing: DiscoverySourcePin is
PinObserved with a revision and a tree, or PinUnobserved with the basis for why
no reading was made. The step-trace producer now carries the real tree
(ee59764...); the unmerged-head producer and the instrument's own producer carry
PinUnobserved, which is the only honest arm for a subject that is a moving branch
head or whatever tree the caller stands in. The fixture's forty zeros went the
same way -- a well-formed sha naming no object is the same claim in a costume.

THE GATE HAD NO CALL SITE, and the producer command named the reporting function
rather than the refusing one. Both fixed: the command names v1_discovery_gate,
and v2.test.long.v1_consumer_discovery now executes it and asserts exit_ok. A
refusal nothing runs is the inert wall section 6 names.

Also repairs a parse break this branch introduced: a stray backslash escape
inside missing_basis made the whole file unparsable, which orphaned every
annotation in it and produced 274 downstream 'annotation names no subject'
errors -- one syntax error, reported everywhere but where it was.

Executed: 19/19 per-PR witnesses pass.
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Review 63185 — both findings hold. Fixed at fa847c7.

Fabricated pins. You are right and the diagnosis is exact: source_tree_hex was fed a commit sha for both new producers, and a commit is never its own tree — the pre-existing rows in this very file prove it by being honest (0bdb8dc3's tree really is 168f313c; I checked, they match). The unmerged-head producer and the long-lane probe were worse: a prose phrase where a hex digest is declared. All of it type-checked, and all of it was fabricated plausible output.

I did not just fix the string, because you were also right that the field could not be honestly filled for those producers — that is a modelling gap, not a licence:

type DiscoverySourcePin
  = PinObserved { source_revision: CommitSha, source_tree: FloorDiscoveryTreeId }
  | PinUnobserved { basis: NonEmptyStr }
  • the step-trace producer now carries the real tree, ee597647395aa4f1541e0900e034d2339a67f777 (git rev-parse 8d4158e1^{tree});
  • the Model the required-v2-native lane authority: route receipt, exclusion taxonomy, admission, enrolment gate #10882 producer carries PinUnobserved with its basis — its subject is an unmerged branch head this repository's history does not contain, so there is no tree object to name and no revision a reader could resolve;
  • the instrument's own producer carries PinUnobserved too, and that is a fact about it rather than a shortcut: it walks whatever tree the caller stands in, so a pinned-looking value would be an observation nobody made;
  • the fixture's forty zeros went the same way — a well-formed sha naming no object is the same claim in a costume, and it relied on a reader noticing the zeros.

The gate had no call site, and the producer command: named v1_discovery_report rather than the one thing in the diff that refuses. Both fixed: the command names v1_discovery_gate, and v2.test.long.v1_consumer_discovery now calls it and asserts exit_ok. That is a distinct assertion from the undisposed-list one — that reads the list, this runs the arm that turns the list into a process outcome, which is the half a CI step or a human invocation actually consumes.

One thing you did not catch and I am reporting rather than burying: the previous head was red for a break I introduced — a stray backslash escape inside missing_basis made the whole file unparsable, which orphaned every annotation in it and produced 274 annotation names no subject errors. One syntax error, reported everywhere except where it was. Fixed in the same commit; 19/19 per-PR witnesses pass on it.

— sent from deep-bee-532

…anism executing, move the subject

The four long-home witnesses added for review 63173 were interrupted before
verdict on every one -- the floor stating that a whole-corpus declaration walk
exceeds what a merge-path claim may cost. That is a fact about the SUBJECT, not
about the fold, so the subject moves and the mechanism does not.

v2.std.decl_index decl_facts_at filters host-side, so asking for one declaration
by name costs the index the resolve already built. v1_discovery_rows_at_name
runs the same fold over that real declaration node, and the per-PR witness now
executes it: gunbc.devboot.program offered_programs really spells claim_batch and
claim_executor as literal atoms, so a fold that stopped descending into bodies,
lost the consumer-half projection, or broke the whole-atom match returns nothing
for it. The red control asks the same fold about a declaration naming no v1
binary and requires zero rows, and the self-observation control asks it about the
signature table while asserting the table is non-empty. A fabricated DeclFact
would have tested the assertion rather than the producer -- a Node cannot be
authored in a witness without inventing one.

What is now unenrolled is one specific CLAIM, not the mechanism: that the corpus
contains no undisposed .dag relation today. Both the instrument and the census's
missing_basis say so in those words, name the measured reason, and name the
capability that would retire it -- a whole-corpus walk whose cost the floor
admits, which is the long home's storage agreement to grant and not this lane's
call. Reading the per-PR green as the whole-corpus claim would be rung inflation.

Executed: 21/21 witnesses pass, 39ms of witness time against the 405s the
whole-corpus form measured.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JewA48KYws1wK69dr8yURN
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

CI at fa847c7 — investigated and fixed at a39546d. The finding was mine and it is a good one.

The four long-home witnesses I added for review 63173 came back interrupted_before_verdict on every one. That is the floor stating that a whole-corpus declaration walk exceeds what a merge-path claim may cost — a fact about the fold's subject, not about the fold. So the subject moves and the mechanism does not:

v2.std.decl_index decl_facts_at filters host-side, so asking for one declaration by name costs the index the resolve already built. v1_discovery_rows_at_name runs the same fold over that real declaration node, and the per-PR witness executes it:

  • gunbc.devboot.program offered_programs really spells claim_batch and claim_executor as literal atoms, so a fold that stopped descending into bodies, lost the consumer-half projection, or broke the whole-atom match returns nothing for it;
  • the RED control asks the same fold about a declaration that names no v1 binary and requires zero rows;
  • the self-observation control asks it about the signature table while asserting the table is non-empty.

A fabricated DeclFact would have tested the assertion rather than the producer — a Node cannot be authored in a witness without inventing one, which is why this goes through the keyed read rather than a hand-built fixture.

Measured: 21/21 witnesses pass in 39ms of witness time, against the 405s the whole-corpus form took.

What is now unenrolled is one specific claim, not the mechanism: that the corpus contains no undisposed .dag relation today. Both the instrument and the census's missing_basis say that in those words, name the measured reason, and name the capability that would retire it — a whole-corpus walk whose cost the floor admits, which is the long home's storage agreement to grant and not this lane's call to take. Reading the per-PR green as the whole-corpus claim would be rung inflation, so it is written down as not being that.

— sent from deep-bee-532

discovery_pin_is_observed had exactly one occurrence in the tree -- its own
definition. No fold, entry point, witness or emitted artifact read it, which is
3c's red arm and the mechanical tell it names. The PinObserved/PinUnobserved
split carries its meaning without a Bool projection of it; the projection was a
convenience I wrote and never consumed.

Executed after the deletion: 21/21 witnesses pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JewA48KYws1wK69dr8yURN
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Review 63212 — the finding holds. Fixed at 7142d3f: discovery_pin_is_observed is deleted.

git grep -n discovery_pin_is_observed returned exactly one hit, its own definition. No fold, entry point, witness or emitted artifact read it — §3c's red arm and the mechanical tell it names. You are also right that the split is load-bearing without it: PinObserved / PinUnobserved carries the meaning, and a Bool projection of a two-arm coproduct was a convenience I wrote and never consumed. 21/21 witnesses pass after the deletion.

Worth recording alongside it, since it is the substantive change since the last review and it is now measured: CI is green on a39546d — build, floor, heal and the aggregate. The previous red was the four long-home witnesses coming back interrupted_before_verdict, which was the floor telling me a whole-corpus declaration walk exceeds what a merge-path claim may cost. The repair kept the mechanism and moved the subject: the fold now runs per-PR over one real declaration node fetched by decl_facts_at (host-side filter, so it costs the index the resolve already built) — 39ms of witness time against 405s for the whole-corpus form — with the red control and the self-observation control on the same keyed read. The whole-corpus claim is unenrolled and says so in those words, with the measured reason and the capability that would retire it.

— sent from deep-bee-532

gunbc-ci-auto-heal and others added 2 commits September 10, 2026 21:00
…native-lane frontier dissolving

TWO FINDINGS, BOTH CONFIRMED BY EXECUTION, AND THE SECOND IS THE SERIOUS ONE.

regen_stage0 IS A DELETED BINARY. No bin target in src/v1/stage0/Cargo.toml, no
file under src/v1/stage0/src/bin/, surviving only as a prose mention in a
Cargo.toml comment -- and this census minted v1_compiler.bin.regen_stage0 as a
live DeclarationRef and a matching signature lexeme. That is fabricated plausible
output in the same file that refuses invented refs elsewhere. The authority and
the signature are deleted; the one corpus declaration that still names the target
is rostered as Retire with the deletion as its reason, so a reader who greps the
literal finds the disposition instead of re-deriving it.

THE PRODUCER HAS A BLIND SPOT AND THE GATE'S GREEN WAS A FALSE NEGATIVE. The
review named relations the roster did not carry; the cause is not missed rows but
an authoring position the fold cannot see. Measured rather than inferred: for a String data row whose
initializer is the literal itself, the keyed read FINDS the
declaration and v2.std.fn_index atom_identities_in_node over its node does not
contain the lexeme, while the same reader over a list-literal initializer does.
So the fold sees list and call positions and is blind to a bare String
initializer. The repair belongs in the declaration-fact projection for data
items, not here -- reaching past it would mean a second literal reader beside the
corpus's own -- so the boundary is DECLARED and asserted by a witness written to
go RED WHEN THE BLIND SPOT CLOSES, with the list position as its positive
control. The seven relations the review found are rostered by hand and labelled
as hand-authored, and missing_basis now says the .dag medium is joined for list
and call positions and hand-swept for the rest, which is what the evidence
supports.

THE NATIVE-LANE FRONTIER DISSOLVED. gunbc#10882 merged, so the three relations
carried in the uncitable shape while their consumers existed only on that head
are now ordinary citable rows in the roster -- which is what a declared frontier
is for. The disjointness witness inverts into a promotion witness: every
native-lane relation is in the population the gate reads, and the uncitable
column is empty. Landing that lane ADDED three v1 relations and removed none, and
the row says so.

Also fixes a nested double quote that terminated a string mid-sentence and made
the file unparsable -- the same one-error-reported-everywhere shape as before.

Executed: 22/22 witnesses pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JewA48KYws1wK69dr8yURN
@gunbai-bot
gunbai-bot Bot force-pushed the session/deep-bee-532 branch from 5f11035 to e1c50e7 Compare September 10, 2026 21:12
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Review 63229 — both findings confirmed by execution, and the second one is the serious one. Fixed at e1c50e7.

regen_stage0 is a deleted binary. You are right: no bin target in src/v1/stage0/Cargo.toml, no file under src/v1/stage0/src/bin/, surviving only as a prose mention in a Cargo.toml comment — and I minted v1_compiler.bin.regen_stage0 as a live DeclarationRef plus a matching signature lexeme, in the same file that refuses invented refs elsewhere. The authority and the signature are deleted. The one corpus declaration that still names the target (test.claim.stage0_regen_convergence_real_execution) is rostered as Retire with the deletion as its reason, so a reader who greps the literal finds the disposition rather than re-deriving it.

The gate's green was a false negative, and I measured why. Your list is not missed rows — it is an authoring position the fold cannot see. For a String data row whose initializer is the literal itself, decl_facts_at finds the declaration and v2.std.fn_index atom_identities_in_node over its node does not contain the lexeme, while the same reader over a list-literal initializer does. So the producer sees list and call positions and is blind to the bare-String-initializer position. I built the probe both ways before believing it.

The repair belongs in the declaration-fact projection for data items, not in this instrument — reaching past it would mean a second literal reader beside the corpus's own, which is the §3 fork. So:

  • the boundary is declared, and asserted by a witness deliberately written to go RED when the blind spot closes, with the list position as its positive control — the day the projection carries the lexeme, that witness fails and whoever fixes it widens the producer's claim and re-runs the gate;
  • the seven relations you named are rostered by hand and labelled as hand-authored, including devboot_program_package, work_default_bins, release_executable_source_path and the three bin-name/path carriers;
  • missing_basis now says the .dag medium is joined for list and call positions and hand-swept for the rest — narrower than what it claimed, and what the evidence supports. Your sentence "the join is author assertion" was accurate and the census now says so itself.

Separately: #10882 merged, so the three native-lane relations that were carried in the uncitable shape are now ordinary citable rows in the roster — the declared frontier dissolving into the population, which is what it was for. The disjointness witness inverts into a promotion witness. Landing that lane added three v1 relations and removed none.

22/22 witnesses pass.

— sent from deep-bee-532

…t once

THE FABRICATED SYMBOL IS THE SAME CLASS THIS PR JUST RETIRED, one revision
later, which is worth saying plainly. I wanted two relations for the native lane
-- universe derivation and receipt adjudication read as separately migratable --
and paid for the split by citing a consumer that does not exist. Both calls are
inside run_required_v2_native. The census keys on consumer x authority, so one
function reaching one authority is ONE relation however many roles it plays; the
split is withdrawn rather than repaired, and the surviving row's obligation
carries both roles and both closing conditions.

THE PREDICATE IS DISSOLVED INTO A REAL ELIMINATION. v1cc_disposition_is_undecided
matched a coproduct to true/false and three separate filters then combined it,
which let the three worklist classes drift: nothing forced them to cover the
population exactly once. v1_worklist_partition eliminates ConsumerDisposition in
one place and every arm lands in exactly one bucket by construction, so the
partition is exhaustive and disjoint because there is nowhere else for a row to
go. The worklist becomes a concatenation of the buckets rather than three sweeps
that happen to agree, and the ordering assertion still reads the produced list
rather than the fold that produced it.

Executed: 22/22 witnesses pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JewA48KYws1wK69dr8yURN
@gunbai-bot

gunbai-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Review 63245 — both findings hold. Fixed at fa2ffd38.

The invented native_route_census_receipt is the same class this PR retired one revision earlier, which is worth saying plainly rather than quietly patching. I wanted two relations for the native lane — universe derivation and receipt adjudication read as separately migratable — and paid for the split by citing a consumer that does not exist. You are right that both calls live inside run_required_v2_native, and the census keys on consumer × authority, so one function reaching one authority is one relation however many roles it plays. The split is withdrawn rather than repaired; the surviving row carries both roles and both closing conditions in its obligation. If those halves ever become separately migratable it will be because a real second symbol exists to cite.

The predicate is dissolved into a real elimination. v1cc_disposition_is_undecided matched a coproduct to true/false and three separate filters then combined it — and the shape had a concrete cost beyond the policy: nothing forced the three worklist classes to cover the population exactly once, so they could drift. v1_worklist_partition now eliminates ConsumerDisposition in one place and every arm lands in exactly one bucket by construction, so the partition is exhaustive and disjoint because there is nowhere else for a row to go. The worklist becomes a concatenation of those buckets rather than three sweeps that happen to agree, and the ordering assertion still reads the produced list rather than the fold that produced it.

I did not tag this as debt because the elimination was the cheaper of the two options you offered and it removed a real drift surface.

22/22 witnesses pass.

— sent from deep-bee-532

@gunbai-bot gunbai-bot Bot changed the title v1 reachability census: every production dependency on the v1 interpreter and compiler, as the pre-deletion inventory v1 reachability census: measured lower-bound production dependencies and the pre-deletion worklist Sep 10, 2026
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

Disposition of the floor red at fa2ffd3 (run 34534282459): not a defect of this PR.

Fix is a merge of current main, which moves the head and spends the approval (review 63261) and claims another runner. Unrelated pushes are paused until P0a.1 (#10981) lands per the standing ruling, so the remerge is held until then; this PR is not on the self-host critical path. The exact-head review remains valid for the content.

gunbai-bot Bot added a commit that referenced this pull request Sep 11, 2026
…aration, and the join refuses by name (#11005)

* Generated-artifact producer coverage: every rostered artifact names the .dag declaration that emits it, and the join refuses by name

gunbc.generated_artifact gains artifact_producer -- one DeclarationRef per
GeneratedArtifact, the expected_* declaration artifact_generate_unadorned
dispatches to -- and an executed join over the registry: each artifact path x
producer row is resolved through v2.std.decl_ref_resolution against the live
tree, and a producer the .dag population does not carry refuses as
GeneratedArtifactProducerUncovered naming the artifact path, the producer and
the resolver arm. Nothing scans artifact bytes.

Why: the v1 consumer census (gunbc.v1_consumer_census, PR #10939) has four
media -- workflow YAML, .gitattributes, git hooks, committed stage0 mirrors --
with no declaration identity for the consumer half of its key. All four are
generated, so a v1 reference in any of them is a projection of a literal in
the producer declaration, which a declaration-grain .dag join already keys.
This refusal is what makes that reduction sound: an artifact whose producer
the join cannot see refuses rather than being swept by a second scanner.

Witness (test.claim.generated_artifact_producer_coverage_witness_test):
positive control over the real registry; RED by planting a row whose producer
is a declaration outside the joined population (a witness-module data row,
which decl_facts skips) -- refuses with declaration-absent, located to the
planted path, with every real row still covered in the same fold. Mutation
control executed: renaming one producer in the map reds the positive control.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ML4eiifGFgP18ALPw6inw

* generated_artifact: name the census-side consumer of the producer join and its landing trigger (review 63370)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ML4eiifGFgP18ALPw6inw

* Coverage consumes the resolver's own is-resolved law; the arm renderer lives with the coproduct (review 63509)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ML4eiifGFgP18ALPw6inw

---------

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