Skip to content

shell -> dag - #9165

Closed
briansrls wants to merge 19 commits into
mainfrom
pr9020
Closed

briansrls wants to merge 19 commits into
mainfrom
pr9020

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session eager-crane-282.
Pushing to pr9020 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

gunbc-ci-auto-heal and others added 19 commits August 23, 2026 13:59
# Conflicts:
#	src/v2/workflow/floor_expected_red.dag
…de them that it did not

The floor reported seventeen v2.test.claim.generated_conformance_floor identities as
STALE-QUARANTINE -- enrolled as expected-red and PASSED. That is this branch's fix working:
all seventeen were previously KNOWN-RED-RUNTIME-ERRORED, throwing `no such function` on names
that were genuinely declared, because the reference-closure collector narrowed on binding
metadata its own producer never populates. Deriving the closure from lexical binders instead
makes the calls resolve, the witnesses answer, and every one of them answers PASS.

The two arms are not symmetric and that is why this reds the build. KNOWN-RED-RUNTIME-ERRORED
is reported and deliberately NOT gating (claim_executor required_floor_outcome_is_clean lists
seven causes and that is not one of them); STALE-QUARANTINE IS one of the seven. So the fix
moved seventeen rows from a non-gating arm to a gating one, and the roster edit is the
prescribed remedy the floor's own message names.

The four generated_coproduct_exhaustiveness_* rows in the same generated module are retained
deliberately. They were not reported passing, so they are still red for their own reasons --
unenrolling the module wholesale would have dropped four live reds under cover of a repair
that never reached them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…17-row unenrolment on top

# Conflicts:
#	src/v2/workflow/floor_expected_red.dag
The floor's own removal path, run against the head that carries main:
run 32670979986 reports `stale_quarantine=82`, and stale-quarantine is
gating (`required_floor_outcome_is_clean` lists seven causes and includes
it). All 82 identities were verified present in the roster before removal
and absent after; 184 rows -> 102; every chain line brace-balanced; no
duplicate heads.

The seventeen this branch removed earlier were measured against a roster
that no longer exists -- main's #9042 rewrote it under the branch. The
count is corrected in place rather than annotated beside, because two
counts for one fact is two accounts of one fact.

WITHDRAWN WITH IT: the claim that this edit carries a same-module
discriminating half. The four generated_coproduct_exhaustiveness_* rows
were retained on the earlier reading that they sat in the same generated
module and were not reported passing. The same run names all four
explicitly as STALE-QUARANTINE, so that is false of the current
measurement; retaining them would enrol four rows this branch makes pass
-- the exact gating failure the removal exists to avoid. Removing them is
correct and the receipt I claimed for the retention is not, so the claim
is withdrawn rather than left standing unsupported.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The previous commit emptied `floor_expected_red_chunks()` to `Empty {}`,
so the roster evaluated to ZERO identities and run 32678275911 refused
with `cause=ExpectedRedRosterEmpty`. The 102 surviving rows were still in
their chunk functions; nothing referenced them.

THE DEFECT IS THE ONE I HAD JUST WRITTEN UP FOR ANOTHER LANE, committed
in the same edit I used as the example. I enumerated the population by
matching QUOTED IDENTITIES and edited by matching ANY LINE STARTING WITH
`Cons { head:`. The aggregator is a Cons chain whose heads are chunk
FUNCTION CALLS, not strings, so it was inside the edit's denominator and
outside the census's: the rebuild found zero quoted heads in it and
faithfully rewrote it as the empty chain.

So the rule is not "scope your regex better", it is the narrower one:
ENUMERATE AND EDIT THROUGH ONE MECHANISM, or diff the two sets and refuse
on non-empty symmetric difference. A count that only counts what the
census can see cannot detect damage the edit does outside it -- my
"82 removed, 0 remaining" was true and told me nothing about the
aggregator.

VERIFIED STRUCTURALLY THIS TIME, not by count: parse both revisions into
per-function head lists, then assert every LOST head is a quoted
identity in the reported-82 set, no head is GAINED, and no chunk function
appears or disappears. Result: 82 identity removals, 0 unexpected
changes, removed set == reported set.

The guard worked exactly as designed -- an empty roster makes the
partition-sum and did-not-execute checks vacuous, and the refusal says
so and names the condition rather than running a vacuous floor to green.

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

Review 55459 requested changes and is right. gunbc.seed_growth_admission
`seed_growth_forward_freeze_policy_note` makes unenumerated hand-written
src/v1 Rust a STOP-LINE, requiring exact item identity, .dag authority,
reason, owning lane, deletion trigger, current boundary, and both deltas.
This change added 853 lines and authored none of it.

WHAT LANDS: gunbc.reference_closure_binder_seed_growth carrying
`reference_closure_binder_seed_growth_justification`, registered in the
CLOSED roster `seed_growth_justification_roster()` and named in the
roster note -- the policy requires both, one row beside the obligation
and one in the roster.

ENUMERATED AT ITEM GRAIN, measured rather than recalled: 9 citable
declarations (8 production, plus the test module
`reference_collector_binder_fixtures`, which carries 22 further hand
items including the two mutation controls). Hand-LOC delta +853/-21 in
cli_run.rs by `git diff --numstat` against the merge subject.

NOT NETTED: collect_node_refs, collect_node_refs_inner and
reference_resolution_facts were MODIFIED, not added, and are recorded
as ExistingSeedItemModified so they are not counted as additions. No
deletions are netted against the additions -- the policy forbids it and
none are claimed.

WHY RUST REMAINS: the collector runs inside the seed's own resolve path,
building the index a .dag authority would itself need in order to
evaluate, so a .dag realization would require the closure it computes.
The trigger names the ordering break rather than a date, and refuses a
partial migration explicitly: a split between a .dag classifier and a
seed walk would be two authorities for one decision.

Same defect crisp-boar-716 self-reported on #9095; same remedy, same
roster.

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

#9028 touched cli_run.rs and the expected-red roster, so both sides had
edits. cli_run.rs auto-merged; the roster conflicted.

RESOLVED BY IDENTITY SETS, not by taking a side. Measured at the three
merge stages: base=201, ours=102, theirs=192. Neither side ADDED a row
(ours-minus-base = 0, theirs-minus-base = 0), main removed 9, this branch
removed 99, and the two removal sets are DISJOINT. The correct result is
therefore the intersection, 93 rows -- taking ours would have resurrected
main's 9, taking theirs would have resurrected this branch's 99, and both
would be a stale exemption readmitted in silence.

Built by starting from THEIRS and applying this branch's 99 removals, so
main's own edits survive by construction rather than by re-application.
All 99 applied, 0 unapplied.

THE REBUILD IS GUARDED THIS TIME. It rewrites a Cons chain only when
every head in it is a quoted string literal; the chunk AGGREGATOR, whose
heads are function calls, is passed through untouched. That guard is the
repair for the defect this branch already committed once -- an unscoped
rebuild blanked the aggregator to `Empty {}` and the roster evaluated to
zero identities.

RECOVERED A DROP THE REBUILD CAUSED: starting from theirs silently lost
this branch's 29-line annotation recording the 82-row correction, because
main never carried it. Re-applied from stage :2. That is the same
take-one-side-wholesale failure as the roster itself, in prose, and it
was found by checking rather than by review.

Verified: 0 conflict markers, 93 rows (= |ours n theirs|), 22 chunk
functions, no duplicate heads, every chain line brace-balanced,
annotation present, both sides' cli_run.rs changes intact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…the note main left stale

#9089 added its own SeedGrowthJustification to the same closed roster this
branch adds to, so the import line and the roster note conflicted. The
roster FUNCTION auto-merged correctly and carries both.

RESOLVED ADDITIVELY, because this is not a choice between sides: both
imports kept, both rows in the roster, five entries total. Taking either
side would have silently unregistered the other's receipt -- and an
unregistered receipt is exactly the stop-line state the policy exists to
refuse, so a wrong resolution here fails open rather than loudly.

REPAIRED A STALENESS THAT WAS ALREADY ON MAIN: #9089 added its import and
its roster entry without naming its row in seed_growth_justification_roster_note,
so main's note listed three justifications while its roster carried four.
The note is a SECOND REPRESENTATION of the roster function (DESIGN §2/§3),
which is why it decayed silently and why no gate caught it. Repaired here
to name all five, with the standing fix recorded in the note itself:
derive the listing from seed_growth_justification_roster() rather than
re-author it.

Verified: 0 conflict markers, 0 unmerged paths, 5 roster entries (checked
with a pattern that matches `stage0_...` -- my first check used [a-z_]+
and silently dropped it, which is the same wrong-instrument error this
branch has already made twice), 5 imports, both receipt modules present,
and the expected-red roster unchanged at 93 rows with its aggregator and
annotation intact.

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

The closed roster conflicted three ways -- import, roster list, and the
prose note -- because main added bare_reference_scanner (#9102) while this
branch added reference_closure_binder. Both sides carried five entries
sharing four. Taking either side whole would have silently deleted the
other side's authority obligation rather than conflicting, which is the
failure main's own note warns about; the union is six.

The prose note is a second representation of seed_growth_justification_roster()
and it has now gone stale once and conflicted once. Both receipts are kept in
the merged text -- the #9089 staleness and this merge's arithmetic -- so the
next reader can check the union rather than trust it. The standing fix is
still to derive the listing from the roster function.

Verified no new diagnostic: the same entry evaluated on clean origin/main in
a separate worktree produces a byte-identical error set apart from this
branch's own additions and a one-line offset. The two "expected item
declaration" errors on `//` blocks are an artifact of the local gunbc shim,
which is a Jun 26 build predating the §4c annotation channel -- established
by the control reproducing one of them on a file this branch never touches.
Main gained witness_runtime_cause (#9137) while this branch carries
reference_closure_binder. Union is seven; both sides kept, per the rule
main's own note now states.

This file has conflicted on a roster union three times this evening, each
time because the prose listing is a second representation of
seed_growth_justification_roster(). Recorded that count in the note, since
the argument for deriving the listing is now a measurement rather than a
prediction.
…ch no longer removes anything

Resolved the floor_expected_red conflict by set algebra rather than by
choosing a side. Measured on the three merge stages:

  base   192 identities
  ours    93  (99 removed)
  theirs  65  (127 removed)
  additions on either side: 0
  comm -13 ours theirs: EMPTY

That last line is the whole resolution: main's roster is a strict SUBSET of
this branch's, so every identity this branch removed is already gone from
main. The merged roster is main's 65 and taking it loses nothing. An
intersection would have produced the same 65; taking a side by preference
would have been luck.

The branch's own annotation block is KEPT rather than swept away with the
rows it described -- it records run 32670979986 / stale_quarantine=82, which
nothing else carries, and a prose row deleted for one reason takes everything
in it unless its contents are enumerated first. It is marked superseded, with
the arithmetic above, so no reader takes it as describing a removal this
branch still performs.

ONE QUESTION LEFT OPEN rather than answered, because either answer would be
invention: those 82 left because THIS branch's fix made them pass, and main
removed them without that fix. Either they pass for an independent reason or
main's larger removal has a different warrant. Nothing in this merge
distinguishes the two. The floor run on the merged head decides it, and the
note says where to look if any of the 82 returns as a fresh red.
…sentence

Main added floor_non_verdict (#9095's lane) while this branch carries
reference_closure_binder. Union is eight.

THE RESOLUTION IS ALSO THE DIAGNOSIS. seed_growth_justification_roster()
auto-merged cleanly to all eight rows -- git handled it, no human involved.
The PROSE SENTENCE listing the same eight was the only conflict in the file.
That is the cleanest statement of the problem available: the authority merges,
its restatement does not, and the restatement is what costs a resolution every
single time.

Count recorded in the row: five roster unions this evening, every one a
conflict in this sentence and none in the function. The argument for deriving
the listing from seed_growth_justification_roster() stopped being a
prediction four unions ago; it is now a measurement with a denominator.

Rows unchanged in substance -- both sides kept, per the rule the note already
states, because taking either side whole silently deletes the other branch's
authority obligation rather than conflicting.
… six

Main added parse_refusal_location while this branch carries
reference_closure_binder. Union is nine, and the prose note names all nine.

SIX FOR SIX. On every one of the six roster unions this branch has resolved
tonight, seed_growth_justification_roster() auto-merged with no human
involved, and the prose sentence listing the same rows was the ONLY conflict
in the file. Not four of six, not usually -- every time.

The two carry identical information. Only one generates work, because a merge
tool can reconcile a list of rows and cannot reconcile a paragraph. That is
the DESIGN section 2 second-representation argument stated as a ratio instead
of a preference, and it is recorded in the row so the next person to propose
deriving the listing does not have to re-derive the evidence for it.

Rows unchanged in substance: both sides kept, per the rule the note states,
because taking either side whole deletes the other branch's authority
obligation without conflicting.
@gunbai-bot

gunbai-bot Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Closing as a duplicate of #9020. Same four files, same content — this PR was opened from a local working branch (pr9020) that carries the identical merge, and #9020 on session/merry-raven-395 is the one with the review history (11 approvals across its heads) and the seed-growth receipt trail.

The merge commit that was here is now pushed to #9020's branch as 51bdb8672b. Nothing is lost by closing this.

Two PRs for one change is the duplication I have spent tonight converging away from elsewhere in the fleet; it would be poor form to leave my own.

— sent from eager-crane-282

@gunbai-bot gunbai-bot Bot closed this Aug 25, 2026
@gunbai-bot
gunbai-bot Bot deleted the pr9020 branch August 25, 2026 03:15
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