Skip to content

Generated artifacts converge with their authority: the reorg moved two of them and the registry still named the old directory - #9644

Merged
briansrls merged 3 commits into
mainfrom
fix/generated-artifact-stage0-path
Aug 29, 2026
Merged

briansrls merged 3 commits into
mainfrom
fix/generated-artifact-stage0-path

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Generated artifacts converge with their authority: the reorg moved two of them and the registry still named the old directory

#9637 moved stage0_crate_layout_generated.dag and stage0_crate_partition_generated.dag into
dag/gunbc/stage0/ and did not update their ArtifactLocation rows, which still declared
directory: "dag/gunbc".

MEASURED, NOT INFERRED. Running the recipe the generated-artifact merge driver itself prints
(generated_artifact_gate main_wet) on current main WRITES A FLAT DUPLICATE beside each real file,
because the generator writes where the registry says. With the two rows corrected, the same
command writes to dag/gunbc/stage0/ and produces no duplicate - verified by execution on a clean
main worktree, both arms.

WHY THIS IS NOT COSMETIC. Following the printed recipe on current main also rewrites
.gitattributes down to the stale roster, deleting 43 rows including live merge=generated-artifact
registrations. Anyone resolving a generated-artifact conflict right now silently drops that
config. Three PRs are blocked behind exactly this.

THREE PRE-EXISTING DRIFTS CONVERGE IN THE SAME COMMIT, because the generated-artifact phase
adjudicates every rostered member and leaving any drifted keeps the lane red:

  • .gitattributes -41 rows. Every removed row names a file that DOES NOT EXIST, checked one by one:
    zero of 41 present. They are stale rows for authority-only plans whose markdown was deliberately
    deleted.
  • .gitignore +41 rows, the same 41 plans, ignored rather than expected on disk.
  • .githooks/pre-commit and .githooks/pre-push: the "GENERATED by" header now cites the post-reorg
    authority path.

No hand-edited generated bytes: every artifact here is the generator's own output.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

ALSO: rustfmt drift on main, confirmed PRE-EXISTING and not caused by this change (this PR touches
no .rs semantically). cargo fmt --all --check on a clean origin/main worktree fails at
cli_run.rs:818 and :828 - two line-length reflows caused by #9637 lengthening the roadmap authority
path strings. It is fixed here because the generated pre-push hook runs the fmt check and refuses,
so this blocks EVERY push from a hooks-configured clone, not just this one.

…o of them and the registry still named the old directory

#9637 moved stage0_crate_layout_generated.dag and stage0_crate_partition_generated.dag into
dag/gunbc/stage0/ and did not update their ArtifactLocation rows, which still declared
directory: "dag/gunbc".

MEASURED, NOT INFERRED. Running the recipe the generated-artifact merge driver itself prints
(generated_artifact_gate main_wet) on current main WRITES A FLAT DUPLICATE beside each real file,
because the generator writes where the registry says. With the two rows corrected, the same
command writes to dag/gunbc/stage0/ and produces no duplicate - verified by execution on a clean
main worktree, both arms.

WHY THIS IS NOT COSMETIC. Following the printed recipe on current main also rewrites
.gitattributes down to the stale roster, deleting 43 rows including live merge=generated-artifact
registrations. Anyone resolving a generated-artifact conflict right now silently drops that
config. Three PRs are blocked behind exactly this.

THREE PRE-EXISTING DRIFTS CONVERGE IN THE SAME COMMIT, because the generated-artifact phase
adjudicates every rostered member and leaving any drifted keeps the lane red:

- .gitattributes -41 rows. Every removed row names a file that DOES NOT EXIST, checked one by one:
  zero of 41 present. They are stale rows for authority-only plans whose markdown was deliberately
  deleted.
- .gitignore +41 rows, the same 41 plans, ignored rather than expected on disk.
- .githooks/pre-commit and .githooks/pre-push: the "GENERATED by" header now cites the post-reorg
  authority path.

No hand-edited generated bytes: every artifact here is the generator's own output.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

ALSO: rustfmt drift on main, confirmed PRE-EXISTING and not caused by this change (this PR touches
no .rs semantically). `cargo fmt --all --check` on a clean origin/main worktree fails at
cli_run.rs:818 and :828 - two line-length reflows caused by #9637 lengthening the roadmap authority
path strings. It is fixed here because the generated pre-push hook runs the fmt check and refuses,
so this blocks EVERY push from a hooks-configured clone, not just this one.
briansrls pushed a commit that referenced this pull request Aug 28, 2026
DESIGN.md conflicted because both sides changed it. It is a GENERATED projection of
gunbc.design_document, so it was not hand-merged: the merged authority was regenerated with
generated_artifact_gate main_wet and the result taken whole.

VERIFIED IN BOTH DIRECTIONS, because a regeneration that silently drops one side's authority
looks identical to a correct one:
  - 31 of 31 phrases unique to this branch (present in the branch's DESIGN.md, absent from main)
    are in the regenerated file.
  - every sampled phrase unique to main (present on main, absent from the merge base) is also
    present.
  - 162456 -> 165458 bytes, consistent with adding this branch's rows rather than replacing.

Regeneration churn OUTSIDE the conflicted path was deliberately NOT taken: .gitattributes,
.gitignore, .githooks and the stage0 generated .dag files are drifted on main for an unrelated
reason (#9637 moved two artifacts without updating their registry rows), and converging them
belongs to #9644, not to this PR.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Also carries the same two rustfmt reflows as #9644 (cli_run.rs, line-length only, caused by #9637
lengthening the roadmap authority paths). They are pre-existing on main, arrive here via the
merge, and the generated pre-commit hook refuses without them. Identical content to #9644, so the
two merge cleanly.
briansrls pushed a commit that referenced this pull request Aug 28, 2026
Two generated mirrors conflicted: v1_compiler_infer.rs and v1_compiler_infer_types.rs. The
generated-artifact merge driver refused them by design - it leaves the ours side in the worktree
with NO conflict markers and marks the path unmerged, because neither side's bytes are the
projection of the MERGED authorities and picking a side drops the other's authority-derived
content.

So they were NOT hand-resolved. They are the output of claim_executor --required-regen over the
merged .dag tree, installed from target/stage0-regen-candidate/src, and verified byte-identical to
that candidate.

CHECKED, because a regeneration that silently drops one side looks exactly like a correct one:
this branch's subject is occurrence identity, and the regenerated mirrors carry 148 and 31
references to NodeOccurrenceIdentity/occurrence_identity respectively. No .dag file conflicted, so
the authority merged cleanly and only its projection needed rebuilding.

Carries the same two rustfmt reflows as #9644 (cli_run.rs, line-length only, from #9637
lengthening the roadmap authority paths): pre-existing on main, arriving here via the merge, and
the generated pre-commit hook refuses without them.

NOT INCLUDED, deliberately: main also carries generated-surface drift in v1_rt.rs and four drifted
generated artifacts. Those are main's, not this branch's, and converging them here would hide them
inside an unrelated PR. #9644 covers the artifact drift; v1_rt.rs is separate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…le its mirror had been hand-edited

main's build lane had TWO failing phases. The first commit closed generated-artifact
(rostered=29 matches=29 drifted=0 absent=0, confirmed by CI on this PR). This closes the other:
`regen FAIL generated surface drift: v1_rt.rs`.

THE DRIFT WAS ONE DOC-COMMENT LINE, AND THE MECHANICAL FIX WOULD HAVE BEEN WRONG.

  committed mirror:  per `ci-floor-fractal-gantt (plan doc deleted 2026-08-28)`
  authority emits:   per `docs/plans/ci-floor-fractal-gantt.md`

docs/plans/ci-floor-fractal-gantt.md does NOT exist on main. So a generated mirror had been
hand-edited to record the deletion while src/v1/runtime_rust.dag kept emitting a citation to the
deleted file. Installing the regen candidate - the obvious move, and what the merge driver's
recipe leads you to - would have REVERTED that note and restored a citation to a file that is not
there. The drift was the symptom; the hand-edit was the defect.

So the repair is at the authority, and v1_rt.rs is NOT touched by this commit: once runtime_rust.dag
emits the committed text, the mirror is already correct.

TWO GENERATIONS, because runtime_rust.dag is itself mirrored: editing it drifts
v1_compiler_runtime_rust.rs (1 line), and v1_rt.rs is emitted BY that mirror once compiled. So the
first rebuild still emitted the old string. Installing the emitter mirror and re-running converges:
first_generation_equal=true, no drift.

VERIFIED: regen over the fixed tree reports first_generation_equal=true with no drift line, and the
only paths changed are the authority and its own mirror.

NOT DONE HERE, deliberately: DESIGN 3 would prefer citing the surviving plan carrier
(gunbc.plans.ci_floor_fractal_gantt) over embedding a date in source. That is the better citation
and it changes mirror bytes, so it is a separate judgment rather than part of a repair.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Aug 28, 2026
… all of them (#9652)

`cargo fmt --all --check` reports seven sites on pristine `a128026717`, so the
generated pre-push hook refuses every push in the fleet regardless of what the
pushing branch contains. A wall that everyone routinely bypasses with
`--no-verify` has stopped being a wall, which is the cost this repairs — not the
formatting itself.

Measured as a controlled comparison, not inferred: same command on a detached
worktree at `origin/main` with no local edits reproduces all seven, so the drift
is wholly inherited.

    src/v1/stage0/src/cli_run.rs:818, :828, :43312
    src/v1/stage0/src/bin/claim_executor.rs:1869
    src/v1/stage0/src/bin/cssl_assemble.rs:17
    src/v1/stage0/src/bin/effects_rest_transport_witness.rs:7, :13

Every change is a rustfmt line-wrap. No declaration is added, removed or
renamed, and no expression changes meaning, so this adds no v1 seed growth
surface.

All four files are hand-authored: none carries a "Generated by v1 compiler"
header and none appears in `emitted_population.rs`. That was checked first and
deliberately, because tonight's build-lane outage was caused by hand-editing a
generated projection — `v1_rt.rs` against `runtime_rust.dag` — and repairing a
formatting complaint the same way would have reproduced it at four more sites.

Scope covers all seven rather than the five with no owner. A partial sweep would
leave `cargo fmt --all --check` non-empty and the hook still refusing, which
unblocks nobody; the hook's predicate is the whole tree, not a site count. The
`:818` and `:828` reflows are therefore the same repair #9639 carries (and #9644
carries identically, blob `a7e1307b9e`) — a deliberate byte-identical overlap on
two of thirteen lines, not an independent judgement about them. `:43312` and the
other four have no open PR.

Found by snappy-dove-250, who hit the refusal pushing an unrelated two-file
`.dag` change and correctly declined to absorb it into a convergence repair.

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@briansrls
briansrls merged commit b902e7f into main Aug 29, 2026
0 of 2 checks passed
@briansrls
briansrls deleted the fix/generated-artifact-stage0-path branch August 29, 2026 00:51
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