Skip to content

Merge queue: census what the push-on-main required run produces that the merge_group run does not, then propose the cut so runner claims stay flat (operator-signed roster change) - #11465

Closed
gunbai-bot[bot] wants to merge 17 commits into
mainfrom
session/deep-otter-836-consumed-row-owner

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session deep-otter-836.
Pushing to session/deep-otter-836-consumed-row-owner 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 17 commits September 13, 2026 06:57
…er at the owner's merge_group run

A row a candidate uses is satisfied at the candidate, so its consumption on
landing is known at the owner's own merge-queue run. That run now refuses a used
row whose owner authored no deletion follow-up (OwnerFollowUpAbsent). A
base-consumed row on a bystander's composition refuses as
ConsumedRowOwnerChargeBypassed, naming the owing change and its follow-up.
Pull-request runs are unchanged. Lane ruling C (fierce-lark-661).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MgTfNcF7rBmb8zZhNTk1X
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
…ne refuses a bystander (ruling X, review 65313)

The owner's merge_group charge establishes that a deletion follow-up NUMBER is
authored, not that the deletion landed, so the owner arm and the bystander
backstop were never exclusive: between the owner's landing and its follow-up's
landing every composition saw the row consumed and was refused. A consumed row
with an authored follow-up is now a typed ConsumedRowReceipt (row, owner,
follow-up) printed on every run; only a consumed row with no follow-up refuses
as ConsumedRowOwnerChargeBypassed. TransitionAdmission gains a typed
owner_pull_request. The follow-up's forge state is the landing tally's to read.
Report boxed in Adjudicated (clippy large_enum_variant).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MgTfNcF7rBmb8zZhNTk1X
…ect stated where it was overpromised

Ruling A/B (fierce-lark-661, 2026-09-13) on #11250.

A. The CONSUMED ROW RECEIPT line printed "owned and dispatched, not
refused" for every owned receipt. That printer runs before
wave_admission_refusal and reads neither the event nor roster_touched,
so on a run the retained roster-touch or base == head rule refuses it
said "not refused" over a refusal; and "dispatched" claimed a forge
fact the binary never read. The typed receipt and its ids stay; the
explanation is now observational -- the follow-up number is declared,
its existence, state and deletion scope are not established by this
run, and the verdict is wave_admission_refusal's. No policy is
duplicated in the printer and X is not widened.

B. Two annotations still promised the pre-X backstop. The RUNG
paragraph said an invalid authored number that slips past the tally is
caught by the bypass backstop; under X it is not -- any PullRequest(n)
enters the owned population and the backstop reads only
consumed_without_follow_up, so the backstop covers the ABSENCE of a
number, not the invalidity or lifecycle of one, and reference
verification is the tally's alone. The AdjudicationEvent intro still
carried the inference review 65313 disproved, that a base-consumed row
on a composition can only mean the charge was bypassed. Both are
stated as they are. No algorithm change.

Evidence at this head: the two retained-policy cases are executed --
an owned row yields its typed receipt AND the retained refusal, on
roster_touched and on base == head. Discriminating red confirmed: with
consumed_due widened to skip owned rows, that fixture is the only
failure (61 passed, 1 failed); restored, 62 pass. These tests are
compiled by the required clippy step and run by no CI step (declared
drop rust_unit_tests_off_the_merge_path), so they were executed on a
remote dispatch at this head.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PZnG5NN44g5nnn61LLHmtx
One conflict, in gunbc.namespace_wave_admission's seed-growth row: both
sides appended a paragraph to `reason` after the shared gunbc#10856
bijection paragraph. Main's is the base-environment loader cohort
(gunbc#10970, twenty declarations, CLASS C); this branch's is the
merge-queue owner charge (DeletionFollowUp, AdjudicationEvent,
adjudication_event_from_name) plus ruling X's ConsumedRowReceipt.
Neither answers for the other's declarations, so both are kept, main's
first and this branch's after it; the shared paragraph stays single and
the field is otherwise unchanged. The two Rust files auto-merged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PZnG5NN44g5nnn61LLHmtx
…ge repair, review 65449)

The merge with main was a SEMANTIC conflict git resolved textually: main
split the production entry into run_wave_admission_between over an
explicit repository and revision pair, and this branch added `event` to
WaveAdmissionOutcome::Adjudicated. Both literals inside the new function
took the field; the new function's signature never took the binding, so
the gate's own module did not compile and every lane this PR touches was
dark. Review 65449 diagnosed it exactly.

The event travels with the subject, for the reason the seam already
states about the subject itself: the consumption obligation differs by
event, so the caller states which run this is rather than the seam
inferring it. run_required_wave_admission forwards the event it already
takes from GITHUB_EVENT_NAME. The two grammar-differs witnesses drive a
scratch repository rather than a queue composition, so they pass
AdjudicationEvent::PullRequest -- the policy whose obligations do not
depend on the queue, which is what those witnesses were adjudicating
before the event existed.

cargo clippy --all-targets -D warnings is clean at this head. The
namespace_wave_admission suite is 62/62. The three
wave_admission_grammar_differs witnesses refuse on the remote runner
with HostBudgetUnreadable -- no cgroup memory limit binds that process,
so the resolver refuses rather than admitting against the machine's
memory. That is main's own host-budget arm firing on the executor, not
a verdict about this change; CI's runner exposes the limit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PZnG5NN44g5nnn61LLHmtx
…stated as a boundary (review 65476)

Review 65476 is right and I verified it: `git grep LandingTally` and
`landing_tally` are empty, and nothing outside this module consumes
`deletion_follow_up`. Four sites plus the .dag authority named "the
landing tally" as the residual's consumer, which reads as an executing
route and is not one -- the pre-enqueue landing procedure is out-of-band
human review. Under DESIGN section 3c that is a consumer that does not
resolve, and under section 5 a present-tense "is caught there" with no
executing route is specification-without-execution.

So the claim is withdrawn rather than softened. Every site now states
that NO executing route in this repository reads the follow-up's forge
state: the wall establishes that a NUMBER is authored and nothing more,
a fabricated number is caught by nothing here, and forge validity is
OUTSIDE THE MODELED GUARANTEE (section 4b's adjacent column) rather than
a property this change checks. The trigger that brings it inside is
named and is not new: the typed repository/forge read this module's
CLASS B acquisition boundary already waits on -- when a fold can ask the
forge for a pull request's state, the receipt's three dispositions
become a wall.

The operator-facing OwnerFollowUpAbsent clause carried the same
overclaim in the imperative ("the open pull request that deletes it")
and now says what the wall actually checks: a number is authored, never
that it names an open or deleting pull request.

This is prose and one refusal string; no algorithm, type, or acceptance
changes. clippy --all-targets -D warnings clean and the
namespace_wave_admission suite is 62/62 at this head.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PZnG5NN44g5nnn61LLHmtx
Main lifted the base-side reconstruction out of run_wave_admission_between
into reconstruct_base_index -> BaselineReconstruction, so the required
floor's planning row can ask the same question over its own comparison
window. This branch had added the adjudication event to the same
function. Both hunks land: the resolution takes main's structure whole --
reconstruct_base_index, the BaselineReconstruction arms, and the NoSubject
arm that carries the landing's roster debt -- and re-applies the event on
top of it, as the parameter the caller states and the field both
Adjudicated literals carry. The receipt Box stays on the NoSubject arm's
literal too; the enum keeps it for clippy large_enum_variant.

This is the same shape as the previous merge and it is why I compiled
before pushing rather than after: git resolved the type and the
constructors on different sides last time and the gate's own module did
not build.

Executed on the resolved tree: cargo clippy --all-targets -D warnings
clean, namespace_wave_admission 62/62.

Head held otherwise -- this is the DIRTY/BEHIND resolution fierce-lark-661
and bold-badger-224 were told would be the one unprompted push.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TH7g6jyWKWr6GUzBN6xZ5L
…11345)

* Cut the namespace transition-admission roster to directory membership.

Delete the hand-Rust const so permission is one .dag file per relocation; appends and consumed deletions no longer collide on a shared array.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Type expected_candidates as DeclarationRef, not a string list.

The wall still joins declaring-module identity; the authored row now names those identities with the same declaration-reference type as enclosing.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Supersede the const-ness-as-safety claim in the roster carrier.

Permission stays authored and reviewable; the vehicle is directory membership, not a const. Missing directory is the empty roster and admits fewer rows, never more.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Home the empty-roster standing record on the membership module.

The const's prose about what remains used to rot beside the array. Empty-is-not-permissive and the #11306/#11316 inheritance live on gunbc.namespace.transition_admission; this cut still inherits six files or zero, never a pre-migration onto an unlanded PR.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop the leftover const census and refuse a phantom candidate leaf.

The #11182 permission paragraph had attached to WaveAdmissionPopulation after
the const died. Candidate DeclarationRef.decl_name must equal Binding.spelling.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Enumerate the directory-row parse helpers on the seed census.

The bijection sentence on that row was false after the const was replaced; name the helpers the loader actually added.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Do not re-home the consumed gunbc#11193 admission as a directory row.

Co-authored-by: Cursor <cursoragent@cursor.com>

#11356 owns that deletion (also carried on #11214). Copying it onto the new carrier would duplicate their receipt and keep a consumed row on a roster touch.

* Own the used_row fixture strings; Binding is no longer &'static.

Co-authored-by: Cursor <cursoragent@cursor.com>

#11250's merge-queue tests used const-roster literals; the directory cut stores owned String.

* Stop claiming the admission roster is a .rs file.

Row files are .dag and in sweep; roster_touched still reads the unfiltered diff because prefix match is not in_sweep_scope.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ve_admission.rs)

main's #11214 added fifteen rows to the const NAMESPACE_TRANSITION_ADMISSIONS; this branch deletes
that const in favour of authored .dag rows. The rows were not migrated: #11214 has landed, so they
are consumed by their own landing (base and head both carry the relocation) and are retired here
rather than re-authored.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Apo3eJwXeD9NxuinRp9zMN
…ule-item grain

main now refuses a // annotation inside a declaration body (parse phase, 3 errors at
transition_admission.dag:52-54). The note moves above AdmissionSubject, naming the field it
describes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Apo3eJwXeD9NxuinRp9zMN
…ve_admission.rs)

main's #11138 added 37 rows to the const NAMESPACE_TRANSITION_ADMISSIONS, which this branch deletes
in favour of authored .dag rows. #11138 has landed, so the rows are consumed by their own landing
and are retired here rather than re-authored as files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Apo3eJwXeD9NxuinRp9zMN
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
…6-consumed-row-owner

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
@gunbai-bot

gunbai-bot Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

Closing: this PR carries no work that is not already on main, and merging it would revert someone else's.

What happened. #11250 squash-merged at 2026-09-16T12:49:46Z from this same branch (session/deep-otter-836-consumed-row-owner). This PR was auto-created about five minutes later because the branch still exists; it is a duplicate of landed work, not new work. The three-dot diff looks substantial (1470 insertions / 1762 deletions) only because a squash merge leaves the branch head off main's ancestry, so the merge-base comparison is meaningless here.

Checked file by file rather than inferred. Of the six files this PR touches, five are byte-identical to origin/main:

SAME   dag/gunbc/namespace/namespace_wave_admission.dag
SAME   dag/gunbc/namespace/transition_admission.dag
SAME   src/v1/stage0/src/namespace_wave_admission.rs
SAME   src/v1/stage0/tests/namespace_wave_admission.rs
SAME   src/v1/stage0/tests/wave_admission_grammar_differs.rs
DIFFER src/v1/stage0/src/bin/claim_executor.rs

The one difference is main having more, not this branch: main carries a --self-host flag and its run_self_host dispatch that this branch predates. So the only effect of merging this PR would be deleting that flag — a silent revert of another lane's landed work, arriving under a title about the merge-queue census.

Not flipping it to ready. The dashboard notice suggested gh pr ready on the assumption this is unfinished work of mine; it is not, so opting it into auto-coverage would spend runner time proving a duplicate green and leave a revert sitting one click from merge. Closing is reversible — reopen it if someone intended this branch to carry follow-up work, and it should be rebuilt from current main first.

The open finding from #11250 is unaffected by this close. Reviews 66663 and 66792 (the hand-written .dag decoder — a second ingestion authority beside the interpreter, DESIGN §4) were never addressed; that code landed with #11250 and is on main now. The concrete repair shape is in the comments on #11250: make the resolve seam reachable, add serde derives to the four mirror types, then load_transition_admissions routes through the existing type-generic value_to_wire_json → from_value and eleven declarations delete. That belongs in its own change, against current main.

— sent from deep-otter-836

@gunbai-bot gunbai-bot Bot closed this Sep 16, 2026
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.

0 participants