Skip to content

A restoration trigger must name the capability, not an artifact that would contribute to one - #9366

Merged
briansrls merged 1 commit into
mainfrom
design/restoration-trigger-doctrine
Aug 27, 2026
Merged

briansrls merged 1 commit into
mainfrom
design/restoration-trigger-doctrine

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

The finding

A declared rung drop is retired by its trigger and by nothing else. So the trigger is the whole check, and a trigger naming less than the capability it restores is the one direction §4b(3)'s machinery structurally cannot see:

A restoration trigger that names less than the capability it restores will be satisfied while the capability stays dead.

What makes this invisible is that no step is wrong. The instrument author builds exactly what the trigger asked. The trigger fires honestly. The row retires correctly. And the thing the row existed to protect is still gone. Nobody has to be careless for this to happen — which is why it needs a rule rather than diligence.

The specimen is this document's own row

Both halves sit five lines apart in the measurement-bankruptcy entry:

What is gone "the only executable route to a self-host emission board measurement"
Restoration trigger "a .dag entry point that emits, assembles and compiles one entry…"

A board is per-entry across many entries. The row correctly describes the loss, writes a trigger narrower than it, and then declares the trigger has fired.

Verified by code read, not by measurement: the instrument that fired it takes a fresh temporary directory per invocation and path-depends on the whole stage0 crate, so every invocation rebuilds the bootstrap compiler cold. The cost is entry-independent — a board of N entries costs N full compiler rebuilds. One entry is the only thing it can do, and the row that would have kept the loss visible is the row the trigger retires.

What is not claimed

Not rung inflation. The instrument is not broken and is not misdescribed — it does exactly what its trigger asks. The defect is in the trigger, which is a narrower and stronger claim, and it does not impugn the instrument's author.

Not unfixable. A shared warm target_dir measures 70s cold then 2–5s per entry on a different implementation of the same spine (deep-gull-307's host, measured this evening). That localises the defect precisely at the fresh-mktemp choice rather than in the approach.

The rule this adds

A restoration trigger states the capability, in the same words the drop used to describe the loss. Where a trigger names an artifact instead, the row must state what that artifact must be sufficient for, and the artifact retires the row only when that sufficiency is shown.

Review tell: a grain mismatch between the loss sentence and the trigger sentence — a plural loss with a singular trigger, a corpus loss with a per-module trigger, a route loss with a single-call trigger.

Provenance

Found by loyal-lark-254; verified against this document's text by smart-ram-730; specimen re-verified independently here before authoring.

It is downstream of a refusal to fabricate: their pricing run failed twice and they declined to report a number they could not stand behind. A run returning any plausible figure would have closed the question and left the trigger defect standing indefinitely. On a night where several measurements turned out not to be measurements, the finding that reached the design document came from declining to produce one.

This changes prose only — one clause in §4b(3). No mechanism, no carrier, no hand-Rust surface.

A declared rung drop is retired by its trigger and by nothing else, so the
trigger IS the whole check. A trigger naming less than the capability it
restores is therefore the one direction the drop machinery structurally cannot
see: it will be satisfied while the capability stays dead.

What makes it invisible is that no step is wrong. The instrument author builds
exactly what the trigger asked, the trigger fires honestly, the row retires
correctly, and the thing the row existed to protect is still gone. Nobody has to
be careless, which is why it needs a rule rather than diligence.

The receipt is this document's own row. The measurement-bankruptcy entry records
losing "the only executable route to a self-host emission BOARD measurement" and
then writes a trigger naming "a .dag entry point that emits, assembles and
compiles ONE ENTRY". A board is per-entry across many entries. The two halves sit
five lines apart in one row at different grains, and the row declares the trigger
fired. Measured by code read: the instrument that fired it takes a fresh
temporary directory per invocation and path-depends on the whole stage0 crate, so
every entry rebuilds the bootstrap compiler cold and the cost is
entry-INDEPENDENT. One entry is the only thing it can do.

The review tell is a grain mismatch between the loss sentence and the trigger
sentence: a plural loss with a singular trigger, a corpus loss with a per-module
trigger, a route loss with a single-call trigger.

Found by loyal-lark-254, verified against this document's text by smart-ram-730.
It is downstream of their refusal to report a number they could not stand behind
-- a pricing run that had returned any plausible figure would have closed the
question and left the trigger defect standing indefinitely.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@briansrls
briansrls merged commit 5cdfc87 into main Aug 27, 2026
5 of 6 checks passed
@briansrls
briansrls deleted the design/restoration-trigger-doctrine branch August 27, 2026 00:52
github-actions Bot pushed a commit that referenced this pull request Aug 27, 2026
#9366 hand-edited the generated DESIGN.md projection. The exact capability-not-artifact rule now lives in gunbc.design_document at the same §4b(3) position, so regeneration preserves rather than deletes it. DESIGN.md already carries the generated bytes and therefore needs no second edit.

Copy link
Copy Markdown
Contributor

Authority correction: #9366 changed the generated DESIGN.md projection without changing gunbc.design_document, so faithful regeneration could delete the rule it added. #9389 moves the exact §4b(3) capability-not-artifact clause into dag/gunbc/design_document.dag; DESIGN.md stays byte-unchanged because it already contains the intended generated output. Do not cite #9366 alone as establishing the rule's durable authority until #9389 lands.

gunbai-bot Bot pushed a commit that referenced this pull request Aug 27, 2026
…ones by their generators

Main moved three times while this PR sat at the approval floor and #9352 landed as a
SQUASH, so this branch carried its original commits against main's flattened one.

THE SPLIT IS TWO AUTHORED AND THREE GENERATED, not one and four. `claim_executor.rs`
LOOKS like a stage0 mirror by its path and is not: it has no `// Generated by v1
compiler` header and no `.gitattributes` entry, while a real mirror announces itself.
Nothing generates it, so waiting for a generator to resolve it would have waited
forever.

AUTHORED, resolved by hand:
- `seed_growth_admission.dag` -- both sides ADDED a roster entry, so it is a union
  rather than a choice: mine plus main's `target_invocation`, import list re-sorted.
- `claim_executor.rs` -- both sides DELETED different things in one region. Main
  deleted two test mods whose production symbol `witness_walk_flags` no longer exists;
  this branch deleted the duplicate `git_stdout`. Verified against main that neither
  mod survives and only `git_stdout` sat between the surrounding braces, so the region
  collapses to nothing.

GENERATED, resolved by regenerating -- the driver REFUSES these rather than picking a
side, and it was right to: the ours side carried this branch's `namespace_wave_admission`
row and had silently DROPPED main's `target_invocation_host`. Taking either side loses
the other's authority-derived content with no conflict to show for it.

`--required-regen` named exactly one drifted file, `gunbc_stage0_crate_layout_generated.rs`,
installed from the candidate tree; the confirming pass ran a binary REBUILT FROM THE
INSTALLED SEED and reported `first_generation_equal=true` (the single
`declared_divergent [main.rs]` is the standing declared divergence). One pass alone can
self-verify at divergence 0 for the wrong reason, which is why the rebuild is not
optional.

TWO MAIN-DRIFT FACTS SURFACED AND ARE DELIBERATELY NOT LANDED HERE. `DESIGN.md` is
registered `merge=generated-artifact`, but #9366 edited DESIGN.md alone with no `.dag`
authority change -- its new 4b(3) clause exists in no module under `dag/` or `src/v2/`
-- so a faithful regeneration REVERTS it. Separately the generator adds three
`.gitattributes` rows main lacks. Both files are restored to the merge result: #9366's
clause is preserved here, and repairing the underlying drift belongs to whoever owns it
rather than buried in a wall PR.

Verified: RUSTFLAGS="-D warnings" cargo check -p v1-compiler --bins clean, 14/14
fixture arms pass, fmt clean.

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