Repository navigation
v1 reachability census: measured lower-bound production dependencies and the pre-deletion worklist - #10939
Conversation
…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.
|
Both findings in review 63158 hold, and both are the repo's own law rather than style. Fixed at 2fdb949.
Re-verified after the edit, not assumed: 19/19 witnesses pass and — sent from deep-bee-532 |
…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.
|
Review 63173 — the finding holds, and it is the trap DESIGN names hardest. Fixed at You were exactly right about the gap: the per-PR witness exercised the light half homed in the census —
3/3 pass, measured 405s for the three witnesses. Why the long home and not the per-PR floor: the fold walks every declaration Second finding, on Also merged — 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.
|
Review 63185 — both findings hold. Fixed at Fabricated pins. You are right and the diagnosis is exact: 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:
The gate had no call site, and the producer 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 — 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
|
CI at The four long-home witnesses I added for review 63173 came back
A fabricated 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 — 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
|
Review 63212 — the finding holds. Fixed at
Worth recording alongside it, since it is the substantive change since the last review and it is now measured: CI is green on — sent from deep-bee-532 |
…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
5f11035 to
e1c50e7
Compare
|
Review 63229 — both findings confirmed by execution, and the second one is the serious one. Fixed at
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 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:
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
|
Review 63245 — both findings hold. Fixed at The invented The predicate is dissolved into a real elimination. 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 |
|
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. |
…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>
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:
gunbc run --source-root dag --source-root src/v2 --entry dag/gunbc/v1/v1_consumer_census.dag --function v1_blocking_consumer_countv1_consumer_member_count,v1_undecided_row_countv1_deletion_worklist(a permutation of the roster; it executes nothing).dagrelations on this treev1_discovery_gate— refuses, naming themA number written here would rot the moment the tree moved, and this lane has now measured twice that its own count was low.
PopulationMeasuredLowerBoundstands;PopulationMeasuredCompleteis not hand-authored anywhere.The joined producer —
tools.v1_consumer_discovery, and exactly what it cannot seeThe 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_factsanswers fordag+src/v2; the consumer half is projected from the fact's ownqualified_name/rel_path; the authority half is the signature table, homed in the census beside theDeclarationRefs it resolves to; the key isv1_row_key, called rather than re-spelled. Every discovered row isUndecidedby construction — discovery says a relation exists, judging it is the census's authored fact.The blind spot is declared, measured, and enrolled. For a
Stringdata row whose initializer is the literal (data devboot_program_package: String = "v1-compiler"),decl_facts_atfinds the declaration andv2.std.fn_index atom_identities_in_nodeover 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 earlierExitSuccessfrom 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
V1UncitableConsumerrefuses.missing_basispartitions them into the three obligations they actually are (four are projections of.dagdeclarations and want a refusal besidegenerated_artifact_registry, not a scanner; Rust needs a producer over an existing projection; Cargo manifests are the one medium owed a new derivation, homed inrust_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_stage0was minted as a live authority for a binary that does not exist: no bin target insrc/v1/stage0/Cargo.toml, no file undersrc/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 asRetirewith the deletion as its reason.One revision later,
native_route_census_receiptwas 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 insiderun_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
.dagargv 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'sBuildGunbcBinariesroute 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 makesProductsV1Freea genuinely separate finish line —gunbc.live_deployinstalling the gunbc tree onto a served host and reading it back.cargo build -p v1-compiler --binsstep 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.emitted_closure_compile_host probe_manifestmintsv1-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.Corrections to the brief
witnessesjob executes no v1 binary — its one step is shell over the two lane results. Three jobs, not four; recorded in the population's own basis rather than left as an absence.v1_interpreter::run_in_context_with_args, and the harness is aclaim_executorsubcommand.New derivations
v1_worklist_partitioneliminatesConsumerDispositiononce — every arm lands in exactly one of unjudged / retained-open / discharged by construction, so the classes cannot drift — andv1_deletion_worklistconcatenates 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_verdictby the floor's cost budget. What runs per PR is the mechanism; the corpus-wide claim runs on demand atv1_discovery_gate.🤖 Generated with Claude Code