Repository navigation
Classify the repository envelope's own refusals, and repoint the three citations #9258 left dangling - #9318
Conversation
…e citations #9258 left dangling gunbc#9258 landed the destination repair for this work item -- supersession is generation-bound and compare-and-swap in gunbc.scm.supersession -- from a parallel lane. This branch originally carried a second construction of the same contract. That is deleted rather than merged: two authorities for one fact is the fork DESIGN 3 forbids, and #9258's is the stronger of the two (evidence is minted FROM the slot by observe_generation, so a caller cannot state which generation it examined; admit_callers narrows the mint; two refusal arms this branch did not have). What survives is the half #9258 does not cover. THE MISSING CLASSIFIER. The brief asked for the whole authorization relation, not either defect site. Auditing every PRODUCER reaching that destination found gunbc.scm.repository_envelope had no classifier at all, so a consumer holding a RepositoryDecodeRefusal had to reach into that format's error enum and assign a standing itself -- one format's vocabulary answering a format-agnostic question, the placement defect that closed gunbc#8940. A missing classifier fails silently: nothing refuses, the consumer invents the answer. repository_envelope_load_standing closes it, descending per cause so a new cause in either delegated population fails to compile there. RepositoryIdentityRule- Unrecognized is a PROTOCOL gap, not damage: the envelope versions its node- identity rule separately from its schema, so a document may parse perfectly under a derivation rule this build lacks, and calling that malformed would let an older reader destroy a newer writer's repository over a rule it simply does not implement. THREE STALE CITATIONS. #9258 deleted standing_may_supersede_generation and left three references to it: DESIGN.md, its recurring_failure_mode authority, and two in coproduct_payload_soundness_witness_test. All three are repointed at what actually exists. The DESIGN one sits inside the row that teaches this exact class, which now records its own fourth instance. Executed: compile 0 blocking; 7 witnesses PASS under claim_batch --hermetic. Mutation receipt -- routing the identity-rule arm to LoadDocumentMalformed reds the new witness and leaves the format-tag one green, so the arms are disjoint. DESIGN.md verified as a regenerated projection by running the artifact gate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
e952738 to
bbcc13c
Compare
…k queued The workflow run for bbcc13c never started (startup_failure, both lane jobs cancelled at an identical 3m1s). gh run rerun left it queued at run_attempt=1 for over 90 minutes while dozens of later runs on other branches started and finished, so the re-run will not dispatch and the run cannot be cancelled -- the API reports it completed while the list reports it queued. This commit exists only to produce a push event so the workflow gets a real run. It changes no files; squash-merge flattens it away. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
CI red here is inherited from main, not from this diff. Failure: Cause: Main is red for the same reason (run 32985041853 on Not fixing it here: #9343 is already open for exactly this. A second repair would be the duplicate-authority collision that this PR was rewritten to avoid once already. No change needed on this branch; it unblocks when #9343 lands and CI re-runs against a main that compiles. Separately, for whoever picks up the run-dispatch oddity: run 32985702154 startup-failed, and — sent from sharp-newt-374 |
This PR was rewritten: the destination repair landed on main from a parallel lane
gunbc#9258landed the same work item — supersession is generation-bound and compare-and-swap ingunbc.scm.supersession. This branch originally carried a second construction of the same contract. It is deleted rather than merged: two authorities for one fact is the fork DESIGN §3 forbids, and #9258's is the stronger of the two — evidence is minted from the slot byobserve_generation, so a caller cannot state which generation it examined (construction, not comparison);admit_callersnarrows the mint; and it carries two refusal arms this branch did not have (EvidenceExaminedAnotherDocument,ProposedGenerationIsTheObserved).What remains is the half #9258 does not cover, and both parts are things its landing made more necessary, not less.
1. The missing classifier — the audit half of the brief
The brief asked for the destination's whole authorization relation, not either defect site. Enumerating every producer of
LoadStandingfound the classification side sound —closure_document_load_standingandobject_table_load_standingboth descend per cause, and the collision arm correctly stays out ofLoadDocumentMalformed— and one gap:gunbc.scm.repository_envelopehad no classifier at all. A consumer holding aRepositoryDecodeRefusalhad to reach into that format's error enum and assign a standing itself — one format's vocabulary answering a format-agnostic question, which is exactly the placement defect that closed gunbc#8940. A missing classifier fails silently: nothing refuses, the consumer simply invents the answer.repository_envelope_load_standingcloses it, descending per cause so a new cause in either delegated population fails to compile there rather than inheriting a standing in silence. The load-bearing arm isRepositoryIdentityRuleUnrecognized→LoadUnsupportedProtocol, notLoadDocumentMalformed: the envelope versions its node-identity rule separately from its schema (repository_node_identity_rule_tag), so a document can parse perfectly under a derivation rule this build does not implement. Those bytes are unreadable only here. Classifying them as damage would let an older reader destroy a newer writer's repository over a rule it simply lacks — the one outcome the standing vocabulary exists to prevent.2. Three citations #9258 left dangling
Deleting
standing_may_supersede_generationleft three references to it on main:DESIGN.mdgunbc.recurring_failure_modecoproduct_payload_soundness_witness_testAll three are repointed at what exists. The third is repointed rather than deleted because the boundary it states is still true: #9258 makes the destination proof-bearing, so a false
LoadDocumentMalformedno longer authorizes replacing a generation nobody read — but it still authorizes replacing the generation the evidence did name, so closing the producer route that file measures remains load-bearing and is not subsumed.The DESIGN one is worth naming separately: it sits inside the row that teaches the stale-citation class, which already records two of its own citations rotting. This is its fourth, and it is recorded as such rather than quietly fixed.
Executed
gunbc compile --entry dag/test/claim/scm_load_standing_witness_test.dag→ 0 blocking, 196 advisory.claim_batch --hermetic, 7/7 PASS (six pre-existing plus the new classifier witness, which reuses main'sls_permitsharness so it carries the standing through to the destination rather than stopping at the classification).RepositoryIdentityRuleUnrecognizedtoLoadDocumentMalformedredsan_unimplemented_identity_rule_is_a_protocol_gap_not_damageand leavesonly_an_unrecognized_format_is_a_protocol_gapgreen — the arms are disjoint and the new arm is load-bearing, not decoration. Restored, re-run green.DESIGN.mdverified as a regenerated projection by runninggenerated_artifact_gate main_wet; no drift beyond the edited sentence.One thing observed and deliberately not included
The regen also wants to add
src/v1/stage0/src/partition_crate_boundary_host.rs !mergeto.gitattributes— pre-existing generated-artifact drift on main from a new stage0 file, unrelated to this change. I reverted it rather than widen this PR's scope. Flagging it here so it is not lost: nothing in CI currently guards that gate (DESIGN's floor-cut entry lists the drift gates as unguarded).🤖 Generated with Claude Code