Skip to content

Classify the repository envelope's own refusals, and repoint the three citations #9258 left dangling - #9318

Merged
briansrls merged 3 commits into
mainfrom
session/sharp-newt-374
Aug 26, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/sharp-newt-374

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

This PR was rewritten: the destination repair landed on main from a parallel lane

gunbc#9258 landed the same work item — supersession is generation-bound and compare-and-swap in gunbc.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 by observe_generation, so a caller cannot state which generation it examined (construction, not comparison); admit_callers narrows 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 LoadStanding found the classification side sound — closure_document_load_standing and object_table_load_standing both descend per cause, and the collision arm correctly stays out of LoadDocumentMalformed — and one gap:

gunbc.scm.repository_envelope had no classifier at all. 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, 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_standing closes 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 is RepositoryIdentityRuleUnrecognized → LoadUnsupportedProtocol, not LoadDocumentMalformed: 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_generation left three references to it on main:

carrier what it said
DESIGN.md the permission is "derived from the standing by one total function"
gunbc.recurring_failure_mode same sentence — DESIGN.md is its projection
coproduct_payload_soundness_witness_test two mentions, one of them the "separate contract deliberately not attempted here" boundary

All 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 LoadDocumentMalformed no 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's ls_permits harness so it carries the standing through to the destination rather than stopping at the classification).
  • Mutation receipt. Routing RepositoryIdentityRuleUnrecognized to LoadDocumentMalformed reds an_unimplemented_identity_rule_is_a_protocol_gap_not_damage and leaves only_an_unrecognized_format_is_a_protocol_gap green — the arms are disjoint and the new arm is load-bearing, not decoration. Restored, re-run green.
  • DESIGN.md verified as a regenerated projection by running generated_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 !merge to .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

…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>
@gunbai-bot
gunbai-bot Bot force-pushed the session/sharp-newt-374 branch from e952738 to bbcc13c Compare August 26, 2026 15:34
@gunbai-bot gunbai-bot Bot changed the title Supersession is a generation-bound compare-and-swap over unforgeable evidence, not a Bool Classify the repository envelope's own refusals, and repoint the three citations #9258 left dangling Aug 26, 2026
…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>
@gunbai-bot

gunbai-bot Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor Author

CI red here is inherited from main, not from this diff.

Failure: dag/gunbc/build_target.dag:177 and :378 — non-exhaustive match: missing variant(s) PanickedBeforeVerdict, NotAttemptedAfterAbort. The floor refuses at strict preparation, so no witness executes and the three roster uploads fail for want of input. The build lane passed.

Cause: pull_request builds the merge ref, so this branch compiles against current main. #9263 (a968415a00) added those two variants to ClaimDisposition in src/v2/workflow/floor_terminal_ledger.dag without updating the two matches in gunbc.build_target. This branch point predates that commit — the variants do not exist in my checkout — which is why the local entry compile was 0-blocking. This PR touches five files and build_target.dag is not among them.

Main is red for the same reason (run 32985041853 on 90bfcfad2), so it blocks every open PR.

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 gh run rerun left it wedged at run_attempt=1 in a state where the list reports queued, the run API reports it completed, and force-cancel returns 409 Cannot cancel a workflow re-run that has not yet queued. Because witnesses.yml groups concurrency on witness-floor-<pr number> and cancel-in-progress does not evict a queued run, it suppressed later pushes on this PR. A workflow_dispatch (which groups on run_id) sidesteps it.

— sent from sharp-newt-374

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