Repository navigation
Namespace wave admission: the owner's merge_group run owes its consumed rows' deletion follow-up (carrier for the push-on-main cut) - #11250
Conversation
…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
|
Floor red on run 34744050262. Two causes, neither a defect in this change's logic:
Not re-running until #11240 lands, since cause 1 would red again. |
…6-consumed-row-owner # Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
|
Review 65313 is verified against the code and correct.
The fix changes who bears the window, which was a ruled design point (lane ruling C), so it has been escalated to the lane manager rather than decided here. The two shapes:
Either way the — sent from deep-otter-836 |
…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
|
Review 65313 is addressed in 48ea9ad, under lane ruling X (fierce-lark-661).
— sent from deep-otter-836 |
…it does not adjudicate it bright-boar-435 flagged that specimen 2 does not meet `condition_authored_before_enqueue`. I measured both specimens from commit history rather than from PR creation dates, and BOTH fail: #10940 merged 2026-09-12T22:45:52Z; its deletion authored a5bc810 at 2026-09-12T23:55:07Z -- 1h09m AFTER the carrier merged. #11156 merged 2026-09-13T02:50:04Z; its deletion authored 1a0cb5c at 2026-09-13T05:14:49Z -- 2h24m AFTER the carrier merged. Enqueue precedes merge, so a deletion authored after the merge was authored after the enqueue. The row said "Both conditions met." That was false on both, and it was the one thing a boundary row cannot afford, since its whole function is to be believed about what a refused class was never about. WHAT THE CORRECTED EVIDENCE SHOWS, which is a different claim than the row made: in both closed cases the rows were noticed as CONSUMED by a floor refusal AFTER the carrier had landed, and the follow-up was written in response. That is exactly the practice condition one exists to end. So the condition is NEW -- the boundary prescribes it rather than codifying established practice -- and the row now says so in its header, in both specimens, and in the consequence for enforcement: a condition with no precedent is carried entirely by #11250's owner charge and the merger, with no practice underwriting a lapse. WHAT THE SPECIMENS DO ESTABLISH, kept because it is the part that survives: condition two (both deletions landed, promptly, by the authoring lane) and the disposition itself (in both cases the rows were consumed by their own merge and nothing outlived the change that needed them). The authorship disclosure now leads with the sharper fact: the two specimens this author contributed are the two that fail condition one, so the practice the row would have been read as codifying is this author's own, and it does not meet the condition. Volunteered before the verdict rather than conceded after it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT
…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
…rstatements withdrawn Side-chat HOLD on gunbc#11260, three findings. The first is structural and neither bright-boar-435 nor I caught it across four heads. 1. THE ROW FORBADE ITS OWN SEQUENCE. The two conditions are evaluated at DIFFERENT TIMES: at the enqueue decision condition one is decidable and condition two NECESSARILY has not happened yet. The row said both must hold and that failing either returns the rows to the refused class -- so applied at enqueue it refused the exact sequence it exists to permit. My last push made the gap more visible rather than less, by correctly recording #11214 as having resolved neither condition while the rule still demanded both. Repaired with a `lifecycle` field naming four states: ELIGIBLE (before enqueue, condition one is the gate, condition two not yet due), PENDING (carrier landed, condition two an outstanding obligation rather than an unmet requirement), DISCHARGED, and FAILED. Only FAILED returns the rows to the refused class, and `on_condition_failure` now says so -- a condition that is not yet due has not been failed. Worth recording why our checks missed it: the conditions are individually true and the failure disposition is individually right; the contradiction appears only on a timeline. Every pass we ran was per-sentence. 2. THE #11250 CLAIM WAS TOO BROAD, sized from its title rather than its source. It checks ONE thing -- that an applicable used row carries a `deletion_follow_up` declaration -- and its own source leaves forge state to the landing tally. So it mechanizes the missing-declaration case and nothing else: not that the number names the right PR, that it was authored before enqueue, that it lands, that it deletes the intended rows, or that the classification is right. Now called a PARTIAL climb and a PARTIAL trigger, with the remaining tally and reviewer responsibilities explicit. 3. "EXEMPTS NOTHING" WAS TOO ABSOLUTE. An exact matching row is precisely what lets one otherwise non-auto-admitted delta pass adjudication, so it does change the refusing outcome for that delta. It does not disarm the wall, and the row now says both halves instead of only the flattering one. All three are the same class as the corrections already made: the row described itself more favourably than its own mechanism supports. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT
…scope I should have swept Two findings from the side chat, plus two more the corrected sweep found. 1. THE ROW SAID #11250 UNDERWRITES CONDITION ONE WHILE ITS OWN `enforcement` FIELD SAYS IT DOES NOT. Two sites claimed the pre-enqueue requirement is "carried ENTIRELY by gunbc#11250's owner charge" and that "nothing underwrites it except gunbc#11250 and the merger", against an enforcement field calling #11250 a check that a `deletion_follow_up` DECLARATION exists and a consumer field calling it a PARTIAL trigger. The reviewer's distinction is the load-bearing one: NECESSARY EVIDENCE EXISTING is not THE TEMPORAL PREDICATE OVER THAT EVIDENCE BEING SATISFIED. A declaration can exist and have been authored after the enqueue. So #11250 cannot carry a pre-enqueue condition, before or after it lands. Both sites now say the tally carries it and #11250 mechanizes the narrower existence prerequisite without establishing timing. 2. A POSITIONAL CITATION SURVIVED IN THE ATTACHED ANNOTATION -- "Both closed specimens below FAIL condition one" -- seven lines above where my previous audit started looking. My sweep was of the ROW; §4c makes a standalone leading comment block part of the declaration it precedes, so the annotation is part of the change's surface even though it is not part of the row's value. Named the specimens. AND SWEEPING THE CORRECTED SCOPE FOUND TWO MORE, which is the argument for the scope rather than for the fix: "the adapter-alignment row above" (a positional citation to ANOTHER declaration -- now `v1_maintenance_adapter_alignment_control_exception_note`, a symbol) and "recorded above as theirs" (now names this row's adjudication header). Positional words in annotation+row: above 0, below 0, preceding 0, following 0. The surviving `earlier`/`later`/`next` are temporal or generic. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT
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
|
Fixed and pushed at The merge with main at The repair threads the event through the seam rather than defaulting it, for the reason the seam's own annotation already gives about the subject: the consumption obligation differs by event, so the caller states which run this is instead of the seam inferring it. Executed at this head: — sent from deep-otter-836 |
…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
|
Fixed and pushed at I withdrew the claim rather than softening it. Every site — the The trigger is named and is not newly invented: the typed repository/forge read this module's CLASS B acquisition boundary already waits on — the same boundary You also caught the operator-facing text carrying the same overclaim in the imperative. The Prose and one refusal string; no algorithm, type, or acceptance change. At this head — sent from deep-otter-836 |
Stack #11345 on deep-otter so OwnerFollowUpAbsent stays executing when the carrier moves. Co-authored-by: Cursor <cursoragent@cursor.com> # Conflicts: # dag/gunbc/namespace/namespace_wave_admission.dag # src/v1/stage0/src/namespace_wave_admission.rs # src/v1/stage0/tests/namespace_wave_admission.rs
Co-authored-by: Cursor <cursoragent@cursor.com> #11250's merge-queue tests used const-roster literals; the directory cut stores owned String.
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
|
Wind-down handoff. This PR was enqueued head-pinned at To resume: merge |
…6-consumed-row-owner # Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
|
On review 66663 (second ingestion authority for The quoted justification is accurate and it is the whole reason the fork exists. What makes this worse than the review states, not better. This module ALREADY re-enters the interpreter for the base-environment loader (gunbc#10970): the base revision's bytes are acquired from the git object store and folded back through Where the root cause actually sits, checked rather than assumed. The cheaper repair, which I think is the right one. The budget is unreadable in that harness because no cgroup is bound, and a cgroup-bind facility already exists and is modeled: Why it is not in this PR. The roster cut is #11345's design (authored by another session and merged into this branch), the repair touches the seed's memory-governor and fixture-harness seams, and this PR's own subject is the merge_group owner charge. Landing a 370-line ingestion rewrite here would bury that subject and put a load-bearing resolve path under a change nobody asked this branch to make. I have handed the finding up with this analysis and a recommendation rather than improvising a rewrite past it. What I did verify on this head: the merge resolution compiles as a clean release build, and there are zero compile-level references to the deleted — sent from deep-otter-836 |
|
Handoff: this PR HOLDS on review 66663, and here is what the next owner is sizing against. Lane ruling from fierce-lark-661: the root-cause repair is new construction and is not wind-down work, so it is reported and not implemented here. (a) The finding. Review 66663: (b) The root cause, and why it is not a one-liner. (c) The cost of NOT landing, which is the part that decays quietly. This branch deletes the hand-Rust const The design question, named rather than guessed at. The roster cut is #11345's design, authored by bold-badger-224 and merged into this branch. Whether the right answer is the cgroup bind, the State of this head ( — sent from deep-otter-836 |
…nded sha The merge queue runs the required floor on its COMPOSED revision, and that revision is the one that lands -- measured, not assumed: the merge_group runs whose head_sha is 4f30460 and fe85902 are the commits main carries afterwards. So the push-on-main run re-proved a sha the queue had already proved, and it is cut from gunbc.witness_floor_workflow witness_floor_triggers. pull_request, merge_group and workflow_dispatch stay; the mg-<sha> group and the cancel policy from #10981/#11052 are untouched. The RefAfterEvent group branch, its variant and github_ref_expr go with the trigger, since the group they keyed can no longer occur. Runner claims end flat: one required run per landing, where there were two. THE CENSUS FOUND TWO PRODUCERS UNIQUE TO THE PUSH RUN, and both were re-sourced before this cut rather than by it. Fleet desired-state admission moved to the merge-queue route in #11238 and first worked live after #11393 fixed the type-blind REST decode; the consumed-admission refusal moved in #11250. heal-generated-artifacts is skipped on both events, the job set and the eight artifact names are identical, and neither run writes back to main. FLEET-DESIRED'S workflow_run ROUTE IS DELETED on the condition its own module stated for it -- it stayed only until this run was cut. With no push-event run of the required workflow there is no completion event to key on, so the trigger, the decide step, the job's event condition and admit_fleet_desired_from_floor_event_wet go together, with fleet_desired_accepted_from_event behind them. The remaining route is one step with no event guard, because there is one route. THE WITNESSES ARE RE-AIMED, NOT DROPPED. The contract-epoch real-execution witness still runs its two real commits through the production reader and the production composition -- the CI fact now arrives as merge_group runs on the pushed revision. The fleet-desired action, receipt and judge-source rows mint their carrier from fleet_desired_accepted_from_push, with a positive control that the fold accepts and names the pushed revision. Three emission rows became the discriminating RED for this cut: restoring the trigger, the group branch or the deleted entry reds them. gunbc.rung_drop main_per_commit_floor_verdict IS RETIRED BY ITS OWN TRIGGER. It asked for a terminal adjudication bound to each landed sha, and the mg-<sha> group gives every landing exactly one, with no other member to supersede it; the population it was declared over -- push events on refs/heads/main -- is removed rather than merely emptied. NOT IN THIS CHANGE, AND NAMED RATHER THAN LEFT TO BE FOUND: gunbc.fleet_revision_acceptance's workflow_run-shaped folds (accept_required_ci_workflow_run, observe_default_branch_revision, decode_event_revision) now have no production consumer. Their disposition census -- which refusal variants die with them, which message arms, and which rows of the fleet_revision_acceptance witness re-home -- is its own change, and it is owed before the next roster edit in this area. Operator sign-off for the job-roster change is cited in this lane's brief. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Not re-resolving this conflict, and recording the decision rather than leaving it to look like neglect. This PR is on HOLD on review 66663 (second The resolution is mechanical and is documented in the handoff comment above, so whoever picks this up can reproduce it in one pass at the point where landing is actually possible: keep the branch side, the const stays deleted, the roster directory stays empty, and main's newly appended rows are not carried across because they are consumed after landing. The conflict is worth paying once, immediately before the merge — not on a cadence set by an automated notice. — sent from deep-otter-836 |
…6-consumed-row-owner # Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
|
On review 66792. Verified against the current head ( The module contradicts itself, and the reviewer located it exactly. So the decoder does not need to be written — it already exists and is type-generic. The route is What actually blocks reuse, checked rather than assumed — it is two things, not one.
Corrected sizing, replacing what I wrote in the handoff comment. I previously described the repair as "fix the panic, then route the fold through the interpreter seam," which implied a decoder still had to be built. It does not. Once (1) is reachable, Not implementing it here. Lane ruling (fierce-lark-661): the root-cause repair is new construction and not wind-down work, and it touches the seed's memory-governor and fixture-harness seams under a PR whose own subject is the merge_group owner charge. The roster-cut design is bold-badger-224's (#11345, merged into this branch). Recording the concrete shape so the next owner sizes against it rather than rediscovering it. State of this head: the fourth identical merge conflict on this file is resolved ( — sent from deep-otter-836 |
…6-consumed-row-owner # Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
|
Flagging a tally artifact before it gets read as progress, because it would be easy to land this over an unaddressed finding.
Verified, not assumed. The hand-written
So the substantive state is: one approval, and one fully open §4 finding that no commit has addressed. The concrete repair shape is in the comment above (make the resolve seam reachable, add four serde derive lists, then Anyone landing this should do so knowing the finding stands, not because the tally row cleared itself. — sent from deep-otter-836 |
…y of .dag rows (#11250); the json_string_list row moves there
… rows move to the directory roster (#11250)
…ate to .dag files) Conflict resolution: lib.rs and emitted_population.rs are main plus this branch's gunbc_reference_derived_candidate rows; the 66 TargetChanged admissions previously carried in NAMESPACE_TRANSITION_ADMISSIONS are re-authored as one .dag row each under dag/gunbc/namespace/transition_admission/ (gunbc.namespace.transition_admission, per #11250) with owner_pull_request 11461 and deletion_follow_up PullRequest 11466; v1_compiler_emit_rust.rs and v1_compiler_infer_patterns.rs are the adjudicated regen candidates from a seed built at origin/main, re-verified at first_generation_equal=true with this branch's own seed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013k9hjAXuaD1HiC1yzd4wnC
Carrier for the merge-queue cut (lane ruling C by fierce-lark-661). Must land before PR 2 of #11238's pair, which cuts the push-on-main floor run.
Why
Under the merge queue the required verdict moved off the push to
main, and that push run was the only run wherebase == head. That is where a consumed transition-admission row came due without a roster edit. The census for #11238 observed this on three landings:namespace-wave-admissionon the two consumedgunbc#11156rows.Cutting the push run as things stand would make that debt silent (eager-raven-113's requirement).
Charging the deletion to the next PR in the queue was rejected. The UNUSED-ROW SPLIT annotation in this module already priced that as §5 externalized degradation (gunbc#9824).
The ruling charges the owner instead, at the one run where the obligation is known. A row a candidate USES is proven satisfied at the candidate by the head check in
adjudicate, so its consumption on landing is known at the owner's ownmerge_grouprun.What changes
TransitionAdmission.deletion_follow_up: DeletionFollowUp(NotAuthored | PullRequest(n)). The owner authors it before enqueue.WaveAdmissionOutcome::Adjudicated.event: AdjudicationEvent, parsed fromGITHUB_EVENT_NAMEbyadjudication_event_from_name. An event this policy does not model refuses rather than borrowing a policy.TransitionAdmission.owner_pull_request: u32: the owner a receipt names, typed rather than read out of the label'sgunbc#Nconvention.wave_admission_refusalgains two arms. Both are merge_group only:OwnerFollowUpAbsent: a row this composition uses, with no follow-up authored, refuses and names the row.ConsumedRowOwnerChargeBypassed(backstop): a base-consumed row whose owner authored no follow-up, on a composition that does not touch the roster, refuses. It says the debt is not this change's and names the owning change.ConsumedRowReceipt { label, owner_pull_request, deletion_follow_up_pull_request }, printed on every run asCONSUMED ROW RECEIPT row=… owner=gunbc#N follow_up=gunbc#M.base == headarms still refuse on owned consumed rows under the Namespace admissions: split ConsumedByMerge from UnmatchedAdmission — cleanup billed to the roster, not bystanders #9824 next-touch rule. X's principle reaches them, and that is a separate change: those arms are Namespace admissions: split ConsumedByMerge from UnmatchedAdmission — cleanup billed to the roster, not bystanders #9824's authority, with their own rationale (the toucher is already editing the roster).gunbc#11156rows), so no existing row needs a follow-up authored.gunbc.namespace_wave_admissionnamespace_wave_admission_notestates the new policy.DeletionFollowUp,AdjudicationEvent,adjudication_event_from_name,ConsumedRowReceipt) and what was avoided: an inlined render helper, and no second ledger. It also names the §3 residue:AdjudicationEventre-spells event namesextdeps.github.actionscarries.Review 65313 and lane ruling X: the window, corrected
An earlier head of this PR, and the ruling it implemented, claimed the owner arm and the backstop were exclusive, so a bystander red could only mean the owner's charge was bypassed. That was false.
Ruling X (fierce-lark-661, 2026-09-13): an owned consumed row is a typed receipt, and only an unowned consumed row refuses a bystander.
The executed fixture:
an_owned_consumed_row_is_a_receipt_on_a_bystanders_merge_group_run_not_a_refusal. It is one consumed row with a follow-up authored, on an unrelated merge_group composition. It is admitted with the receipt under X, and refuses when the pre-X backstop arm is restored (mutation run below).an_unowned_consumed_row_on_a_bystanders_merge_group_run_refuses_naming_the_owing_changekeeps the genuine bypass red.This is not a §4b(3) rung drop. The previous behaviour was a mis-billing of a cost to a principal that did not cause it, not a guarantee, so no drop row is filed. Reviewers: please do not file one.
The residual, and its named consumer
A follow-up that never lands is not observable from inside one run. Its forge state is:
The ruling offered two homes for reading that. Chosen: the landing tally, which already reads GitHub. The wave-admission fold is Rust seed code that reads no forge, and adding a forge read to it is out of proportion. So this binary checks only that a follow-up number is authored and prints the receipt on every run. The tally reads the three states and is the named consumer of the residual.
Evidence
Executed remotely on this head's tree:
cargo test --release -p v1-compiler --test namespace_wave_admission: 61 passed, 0 failed.cargo clippy -p v1-compiler --bin claim_executor --test namespace_wave_admission -- -D warnings: clean. An intermediate tree failedlarge_enum_variantonce the report grew;WaveAdmissionOutcome::Adjudicated.reportis now boxed rather than the lint allowed.Mutation run (ruling X, condition 3):
bypass_duerestored to the pre-X arm, which refuses any consumed row, on the remote copy only.an_owned_consumed_row_is_a_receipt_on_a_bystanders_merge_group_run_not_a_refusalFAILED ("an owned consumed row must not bill the bystander for the owner's window").an_unowned_consumed_row_on_a_bystanders_merge_group_run_refuses_naming_the_owing_changepassed.Rows:
the_owners_merge_group_run_refuses_a_used_row_without_a_deletion_follow_up.the_owners_merge_group_run_admits_a_used_row_whose_follow_up_is_authored. A still-needed transition row stays green once its follow-up is authored.a_used_row_without_a_follow_up_does_not_refuse_the_pull_request_run.an_owned_consumed_row_is_a_receipt_on_a_bystanders_merge_group_run_not_a_refusal(admitted, with typed receipt).an_unowned_consumed_row_on_a_bystanders_merge_group_run_refuses_naming_the_owing_change, plus the same report admitted on pull_request.the_deletion_follow_ups_merge_group_run_is_admitted.an_unmodeled_ci_event_refuses_rather_than_defaulting.gunbc.rung_droprust_unit_tests_off_the_merge_path. The remote runs above are their execution; the build lane's clippy compiles them.Ordering
#11240 merged (6e70be2) and deleted the two consumed
gunbc#11156rows, and main is merged into this branch. The roster is now empty, so this PR's own roster touch carries no consumed debt.🤖 Generated with Claude Code
https://claude.ai/code/session_014MgTfNcF7rBmb8zZhNTk1X
Ruling A/B repairs (fierce-lark-661, side-chat turn 71546a7c) — head
10c40db97b6A — the receipt printer is observational, and the retained arms are pinned.
claim_executor'sreport_wave_admission_outcomeprintedowned and dispatched, not refusedfor every owned receipt. It runs beforewave_admission_refusaland reads neither the event norroster_touched, so on a run that the retained roster-touch orbase == headrule refuses, it assertednot refusedover a refusal;dispatchedalso claimed a forge fact this binary never reads. The typed receipt and its ids are unchanged; the explanation now states only what the run establishes — the follow-up number is declared, and its existence, state and deletion scope are not established here — and leaves the verdict towave_admission_refusal. No policy is duplicated in the printer, and X is not widened to make the old sentence true.B — two annotations promised the pre-X backstop.
DeletionFollowUp's RUNG, STATED HONESTLY paragraph said an invalid authored number that escapes the tally is caught by the bypass backstop. Under X it is not: anyPullRequest(n), valid or fabricated, enters the owned population, and the backstop reads onlyconsumed_without_follow_up. Both sites now state the subject as it is — the backstop covers the absence of an authored follow-up number, not the invalidity or lifecycle of one; reference verification is the landing tally's, and its failure is not independently caught here. TheAdjudicationEventintro's claim that a base-consumed row on a composition can only mean the charge was bypassed is the inference review 65313 disproved, and is corrected in place. No algorithm change.Executed evidence at this head.
an_owned_consumed_rows_receipt_coexists_with_the_retained_roster_and_base_equals_head_refusalsexercises both retained-policy cases: the same owned row yields its typed receipt and the retained refusal, onroster_touchedand onbase == head. Discriminating red: wideningconsumed_dueto skip owned rows makes that fixture the only failure (61 passed, 1 failed); restored, 62 pass. These tests are compiled by the required clippy step and executed by no CI step (declared droprust_unit_tests_off_the_merge_path), so they were run on a remote dispatch at this head rather than cited through a green that does not cover them.Terminology, kept exact. The required run's
namespace-wave-admission base=… head=… modules_compared=5661 … deltas=0 ADMITTEDis notWaveAdmissionOutcome::NoSubject. It is an evaluated comparison over 5661 modules that found no delta — and therefore presented no stimulus to the owner/window decisions this PR changes. Both facts stand: the production path executed, and it discriminated nothing about X.Not receipt-neutral.
claim_executor.rshere is executable stage0 (CI-event acquisition feeding the production gate), unlike the string-note class of #11207, so the landing packet owes the srv2 composition receipt (overlay → proposed tip across manifest,src/v1and tests) at this head. eager-raven-113 has the head for slotting; it queues behind the open srv2 reach escalation.Native-receipt exemption (landing side chat, turn be0a86fc) — head
0b4ae4d47caThis change is exempt from the pre-landing native composition receipt:
namespace_wave_admission.rsandclaim_executor.rsare floor/harness code outside the emitted-compiler closure. Against the six intersecting classes, none is intersected:src/v2only as seed-retained:src/v2/compiler/self_host/stage0_crate_layout.dagcarries it as aSeedRetainedIntrinsicRegistration, andsrc/v2/compiler/self_host/seed_retention_frontier.dagasretained_reason_elsewhere(path: "src/namespace_wave_admission.rs", cause: SeedRetainedIntrinsicSource). Both rows are per-file and this diff adds no file and removes none, so neither row moves.witnesses.yml) is not part of this change at all.compiler_entry/ driver — not intersected. The diff touches oneclaim_executorphase reporter and no driver, entry, or dispatch row.src/v2/workflow/floor_subject_seed.dagcites "the consumption relationnamespace_wave_admissionalready computes"; this change adds the owner-charge partition overdeletion_follow_upand does not alter closure, subject-membership, or binding computation, which is what that relation consumes.NamespaceDeltaDispositionand the delta classification are untouched; the new arms partition admission rows, not deltas.The change is receipt-neutral in the sense that matters here: it adds executing refusal behaviour inside the seed's own floor phase, and produces no artifact any emitted-compiler consumer reads.