Repository navigation
Sizing becomes derived: unbundle NodeSizing, delete authored intricacy and volume, stub the deriver - #10994
Conversation
…s, stub the deriver
NodeSizing fused four facts under one discriminant: whether a roadmap row
is a dispatchable work item, the repository the work happens in, the
evidence its acceptance expects, and a hand-authored intricacy/volume
guess at how big it is. Only the last is a size, and an author's ordinal
guess is not a measurement — nothing observed it and nothing could
contradict it, yet the spawn request published it, the page badged it,
and the forecast keyed its cycle-time calibration on it.
The first three facts are now RoadmapNode.dispatch: WorkItemDispatch =
NotDispatchable | Dispatchable { repo, acceptance }. The fourth leaves
the authored surface entirely: gunbc.roadmap_sizing owns Intricacy,
Volume and NodeSizing, and derive_task_sizing answers for a SizingSubject
(title, description, exit criterion) rather than for a RoadmapNode, so a
plan item in another repository can be sized by the same authority. It is
a stub today and says so through a distinct SizingNotDerivable arm; there
is no default cell anywhere.
Sizing no longer reaches admission at all, by construction rather than by
policy (operator ruling 2026-09-10). LaunchSizeMissing is renamed
LaunchDispatchBindingMissing — it never checked a size, it checked the
repo+acceptance binding, which is a destination fact and stays.
gunbc.dispatch_selection, the consumer that legitimately wants a size,
receives a two-arm SizingProfileExpectation and records it on the
receipt; both arms resolve identically today and the carrier says so.
The forecast takes its sizings as a parameter instead of reading them off
the node, which keeps its positive controls authorable while the deriver
is a stub. Production passes derived_node_sizings, which is empty, so the
live graph REFUSES with NodeUnsized rather than rendering a schedule —
executed, not asserted. That loss is declared:
gunbc.rung_drop.roadmap_sizing_authored_to_derived, whose trigger names
the capability and explicitly refuses to be satisfied by any
constant-returning function.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
…ctation, retire the live calibration witnesses with their subject, and admit the wave-admission relocations Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
…invariance controls Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
…t the two recomputed folds Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
# Conflicts: # dag/gunbc/rung_drop/roster.dag # docs/design-rung-drops.md
…conversion flattened witness_unsized_node_refuses was handed a cell, making the NodeUnsized arm unreachable; unsized is now absence from the assignment list, so it passes an empty list. witness_empty_calibration_cell_refuses was handed the shared medium/medium cell, which the fixture observations calibrate, so its gap could not exist; it names high/small explicitly again. Both return true by execution. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Both findings in review 63398 verified and fixed in 6f4bdf4 — they were real, and they were mine: the mechanical conversion inserted
Both return Review 63379's two findings were fixed earlier in the branch: the stale — sent from eager-gull-33 |
…hority The merge driver's repair route leaves the base side's bytes in place and defers regeneration to heal; that is correct while the authority merge is in flight. The merge is committed, so the projection is derived here from the merged roster instead of left disagreeing with it. Verified by set difference against origin/main rather than by count: no row went dark, and the only delta is this PR's own drop. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
roadmap_node_identity_law in the same module names the slug a FORBIDDEN identity input, so keying a derivation to rn.node would join later sizing evidence to a name that can change under it. Operator merge-gate ruling on gunbc#10994. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
…t was retyped The sentence survived from the first design, which the 2026-09-10 ruling reversed: dispatch_selection keeps the passenger as the two-arm SizingProfileExpectation. The load-bearing claim is unchanged and was correct -- no dispatch path refused on a size before or after -- but a rung-drop row is where a future reader looks for what a change touched, so the false clause is repaired rather than left standing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Review 63447 is right and the fix is in ea90ae3. That sentence was a survivor of this PR's first design — the passenger was deleted outright in the first pass, and the 2026-09-10 operator ruling reversed it so that Also on this head: the merge-gate ruling's one required change is applied — — sent from eager-gull-33 |
…wo live witnesses that must fail witness_cited_acceptance_pr_history_joins_without_refusal asserted four observations and zero refusals from a join that now refuses every link, and witness_live_calibration_keeps_small_sample_intervals asserted exact intervals for three cells nothing sizes. The first is rewritten to assert the honest state -- EVERY cited link refuses as HistoryNodeUnsized, which measures the loss as total and loud and goes red when a link joins again. The second is retired by name into the drop population beside the three already there. The drop's population also cited a symbol that does not exist (cycle_time_history_for_link); it names observation_for_link now. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Review 63466: both findings verified and fixed in d254741.
Two consequences of the above, done in the same commit so nothing is left dangling: the imports the retired witness owned are pruned, and the five — sent from eager-gull-33 |
… reads sizing_profile_expectation_label had no call site outside a witness and rendered the byte-identical string sizing_derivation_detail already produced -- a dangling declaration and a second name for one concept. sizing_derivation_detail was the same shape one module over: its only reader was the same witness. Both are deleted rather than given a speculative consumer; the witness asserts through intricacy_label and volume_label, which the spawn request and the page badge do execute. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Review 63483 is right on both halves and the fix is a9a90b0: Following the finding one module over rather than stopping at the line it named: — sent from eager-gull-33 |
The launch-admission note named the NEW arm spelling as the old one -- my own blanket rename rewrote the sentence that records what the rename was. The roadmap_status note named gunbc.roadmap_sizing as the fold's caller, which contradicts that module's own rule that it imports nothing from the roadmap; the caller is gunbc.roadmap_model node_sizing_subject. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Review 63524: both verified and fixed in 391ad48. The reviewer is right that the bar is my own — this is the same class as the drop-row sentence earlier in the branch, and both instances have the same cause worth naming: a blanket rename pass rewrote the sentences that exist to record the rename, and a design note I wrote about one module named the wrong module as the caller.
No code change in this commit; annotations only. — sent from eager-gull-33 |
…ster The floor adjudicates enrolled debt identities against the declared tree and refuses when a roster names a claim that no longer exists, which is what it did: retiring the witnesses into the drop population left their identities standing in v2.workflow.floor_cost_debt. Delisted at identity grain, not by count. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
…po fact The pin still expected the fused badge span class="sizing">i:low v:small gunbc</span>, which production cannot emit now that the badge is split into a repo fact and a derived sizing fact the stub refuses. It expects class="repo">gunbc</span>, asserts no sizing span anywhere, and says in the note that a sizing span reappearing is the declared drop retiring. Green by execution on the real emit path. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
Review 63572 verified and fixed in 8a76f3d — a genuine miss. The pin now expects — sent from eager-gull-33 |
…reintroduced Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
witness_active_sizes_are_intentional_and_nonuniform asserted that the authored cells across the active rows were deliberate rather than one value copied down the file. Nothing carries a cell now, so the claim has no population and the mechanical conversion had already flattened its two any-clauses into the same vacuous check. Retired by name into the drop population rather than weakened into a green that asserts what the row shape witness already checks by identity. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
… subject, refuse two cells for one subject
The subject was keyed to the node's minted identity and then REATTRIBUTED
positionally: sizing_derived_cell erased the subject the deriver answered
under and derived_node_sizings rebound the cell to the caller's slug. So
derive_task_sizing(A) returning SizingDerived{subject: B} would have given
A B's cell. Dormant only because the stub refuses -- and this adapter is
written to start producing with no second edit, so it was a live defect
scheduled to arrive silently at the seam built to activate later.
NodeSizingAssignment now carries the SizingSubjectId the deriver answered
under, every lookup projects the node through the single
node_sizing_subject_id, and node_sizing_adaptation compares asked against
answered: a mismatch is SizingForAnotherSubject, never an assignment. The
derivation is a parameter there so the control is authorable.
assigned_sizing takes the first match, which is only correct if a subject
appears once; nothing in a List enforced that, so two cells for one
subject were adjudicated by list order. schedule_forecast now refuses with
SizingAssignedTwice before any fold reads the population.
The live-stub witness compared a non-empty NodeUnsized list, which a
forecast that dropped all but one node would also satisfy. It now joins
the refused population against the live active graph by identity in both
directions, so the sentence the PR body builds on it is the sentence it
proves.
Unchanged: the authored-size deletion, the dispatch/admission separation,
the named witness retirements, the declared rung drop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
Two conflicting paths, needing opposite treatments.
`docs/design-rung-drops.md` is `merge: generated-artifact`. Took main's side and
left it to the generated-artifact actuator rather than hand-resolving it. A hand
resolution of this exact file earlier in this PR silently un-retired a landed
row, which is the failure the "do not hand-edit" header exists to prevent.
`src/v1/stage0/src/namespace_wave_admission.rs` is `merge: unspecified` and was
NOT a content collision. main REPLACED THE MECHANISM: the hard-coded
`NAMESPACE_TRANSITION_ADMISSIONS` const is gone, and admissions are now loaded
from `dag/gunbc/namespace/transition_admission/` by `load_transition_admissions`,
one `.dag` file per row with DIRECTORY MEMBERSHIP AS THE LIST (a `roster.dag` is
refused by name). That directory is empty on main.
So this PR's seventeen rows are not merely conflicting -- they are authored in a
form that no longer exists. Keeping them resurrects a const nothing loads;
dropping them silently loses admissions that are still owed, because this branch
still produces those deltas. Took main's refactor, and preserved the seventeen
rows' data (labels, spellings, expected_candidates, dispositions) out of band so
the migration does not depend on git archaeology.
STILL OWED, STATED RATHER THAN IMPLIED: those seventeen admissions must be
re-expressed as roster files in the new location before this PR can land. They
are NOT authored here deliberately. The row format has fail-closed refusals --
the module path must equal `{prefix}{stem}`, a parse failure rejects the row,
`roster.dag` is refused by name -- and main carries no example to pattern-match.
Authoring seventeen files from a reading of the parser, unverified, is how you
get seventeen subtly wrong ones.
The `namespace-wave-admission` phase exists to name exactly which deltas are
unadjudicated. Landing this merge lets it produce that list, and the roster files
get written from the authoritative refusal rather than from my reading. This PR
is blocked on ci-control's floor-ceiling cost node regardless, so the sequencing
costs nothing.
Verified: cargo check -p v1-compiler clean.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ledger-Repair-Judged: docs/design-rung-drops.md Ledger-Rows-Repaired: docs/design-rung-drops.md roadmap_sizing_authored_to_derived
The seventeen owed transition admissions, enumerated from the refusal
The merge at Of the 38 deltas the phase reports, the split is clean — 19 Every one is a spelling whose reference survives while only its declarer moves — — sent from bright-eagle-728 |
…mbers Main cut the NAMESPACE_TRANSITION_ADMISSIONS const out from under this branch: admissions now load from dag/gunbc/namespace/transition_admission/, one .dag file per row, directory membership IS the list. The merge at baf6745 adopted that refactor and deliberately left the rows unauthored rather than guessing the format. These are the same seventeen TargetChanged deltas the const covered, restated as roster rows. Two relocations, both verbatim: the Intricacy*/Volume* arms from gunbc.roadmap_model to gunbc.roadmap_sizing, and node_title from gunbc.roadmap_spawner to gunbc.roadmap_status. Each is a spelling whose reference survives while only its declarer moves, so each expected_candidates set is a singleton by structure -- the spelling is declared in exactly one module on each side. Nothing is widened: a larger candidate set would mean something else changed, and should refuse. Verified by execution, not by reading: load_transition_admissions_from_dir over the real directory parses all seventeen and yields the intended TransitionAdmission values. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Wave admission ADMITTED — and the one gate that remains before enqueueingThe seventeen transition-admission rows are authored at All 17 Nothing was widened or deleted: two relocations carried verbatim ( The remaining gate:
|
# Conflicts: # docs/design-rung-drops.md # src/v2/workflow/floor_cost_debt.dag
Ledger-Repair-Judged: docs/design-rung-drops.md Ledger-Rows-Repaired: docs/design-rung-drops.md roadmap_sizing_authored_to_derived
# Conflicts: # docs/design-rung-drops.md
Ledger-Repair-Judged: docs/design-rung-drops.md Ledger-Rows-Repaired: docs/design-rung-drops.md roadmap_sizing_authored_to_derived
…ons to read DESIGN §3: a witness discriminates at ONE INTERFACE, and its inputs belong at that boundary as supplied values. Four claims were dominated by one call whose result shape was all they inspected. THE PAGE CLAIMS (three, ~168k eval steps each). Measured: roadmap_css() is 157,986 of that, against ~5,800 for the node row the claims actually assert on -- 96% of each budget spent building a stylesheet none of them reads. roadmap_page_impl now takes the stylesheet as a parameter; every production caller passes roadmap_css(), so the served page is unchanged. The three row claims render through roadmap_page_launch_with_stylesheet: ~168k -> ~10k. PAIRING OBLIGATION, DISCHARGED RATHER THAN ASSUMED. witness_ready_node_doc_emits_button_and_external_script still renders through roadmap_page_launch, which derives the stylesheet, and now ASSERTS THE ROUTE: the head must carry what gunbc.roadmap_style produces, cited by calling the producer rather than spelling its bytes. Control run: replacing the live roadmap_css() with "" reds that claim and correctly leaves the supplied claims green, so deleting the integration cannot pass. THE CLOSING-CONTRACT CLAIM (113,011 -> 136). It called the live startable_nodes_missing_closing_contract_for_accepted and then re-scanned declared_roadmap_nodes() to prove the population was non-trivial, deriving the whole projection twice to read one node's disposition. The selection rule is a fact about a node set, so it splits into startable_nodes_missing_closing_contract_over(nodes, edges, accepted, withheld) with the live wrapper retained; the claim supplies a two-node graph whose only difference is the dispatch binding. Control run: removing the node_dispatch_is_declared filter reds it. The live path stays executed by roadmap_authority_test witness_withheld_sized_subject_does_not_mint_closing_contract_task. node_is_startable_for_accepted also stops calling declared_roadmap_edges() in its own body -- it runs under a per-node fold, so the corpus edge list was rebuilt once per node (DESIGN §6, bare minimum cost). Measurement recorded honestly: hoisting it alone moved the witness by ~0, because the interpreter already memoizes the call; the parameter is kept because the _over seam requires a fixture to supply its own edges. A second predicted repair was FALSIFIED and reverted rather than kept: carrying the incumbent's contrast ratio through audition_ink_for's fold moved auditioner_root_css by 299 steps of 102,309, so the recomputation it targeted was already memoized. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…and stop the live forecast claim building a document it discards TWO THINGS THE FLOOR REFUSED ON, BOTH READ FROM ITS OWN LOG (run 35408358503). NAMESPACE-WAVE-ADMISSION. The refusing arm is not the one the brief named. The two deletion-follow-up arms were removed on 2026-09-16 (gunbc#11481) and are declared drops, so the seventeen rows this PR authors -- used, not consumed -- refuse on nothing; FOLLOW-UP ABSENT is a printed record. What refuses is `consumed_due = roster_due && !consumed_admissions.is_empty()`: this PR adds files under the roster directory, so `roster_touched` holds, and forty rows owned by gunbc#11587 that are ALREADY SATISFIED AT THE BASE come due. That is the bystander window the phase is designed to close at the roster's next touch, and the wall prints the remedy itself -- "delete these rows from dag/gunbc/namespace/transition_admission/". Deleted, joined at identity grain: forty consumed rows in the log, forty files carrying owner_pull_request 11587, and the seventeen 10994 rows left standing. Zero stale admissions. The phase is not weakened; its obligation is discharged. THE LIVE FORECAST CLAIM (613,121 -> 240,465 eval steps locally). gunbc.rung_drop roadmap_sizing_authored_to_derived names this claim as the one control that EXECUTES THE LIVE AUTHORITY AND REFUSES, so supplying its inputs would delete the drop's evidence -- deliberately not done. accepted and withheld still come from frontier_sets_from_live_history(), the same live acceptance history; what is no longer built is the RoadmapDocument, which roadmap_schedule_forecast_over discards at its own `doc: _` and no assertion reaches. Measured: the live frontier plus the active node set is 54,727 steps against 433,321 for the full projection. All fifteen claims in the module pass. This identity is still over the 72,300 budget and is raised with the operator rather than papered over: its remaining cost is the live acceptance history and the live graph, which is the property the drop relies on. No debt row added, no file relocated. A third predicted repair was FALSIFIED and reverted rather than kept: binding the cycle-time history lazily inside the non-refusing branch moved the claim by one step, because the substrate already evaluates `let` on demand. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…s measured over the wrong population The previous commit routed this claim through frontier_sets_from_live_history() and an empty document, on a claim_batch measurement of 613,121 -> 240,465 eval steps. That instrument does not have the floor's cross-claim share, and the floor is the authority here. v2.workflow.floor_pure_producer_share enrols gunbc.roadmap_authority.roadmap_authority_projection as a CarriedInputWarmRow over roadmap_acceptance_event_history_load, and its own row names gunbc#10994's forecast witness as a demanding claim. So on the floor the projection is SERVED, not derived -- which is exactly why required run 35408358503 measured this identity at 211,628 where claim_batch measures 613,121. frontier_sets_from_live_history is not enrolled, so the "cheaper" form would have paid a fold the floor was already giving this claim for free, and the change would likely have made the gated number WORSE while looking like a 2.5x win locally. The claim is restored verbatim; what is kept is the annotation recording why the obvious reduction is not one, so the next reader does not re-derive it from the same misleading local instrument. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…) drop, keeping the claim executing on every PR The one over-budget identity left. It is NOT weakened and NOT relocated; what is declared is the loss of ONE wall over it. WHY A DROP AND NOT A REWRITE. gunbc.rung_drop roadmap_sizing_authored_to_derived names this claim as the ONE control that executes the live authority and refuses, standing in for five controls that drop retired. While derive_task_sizing is a stub, derived_node_sizings mints a NodeUnsized refusal for EVERY active node and the claim joins that set to the active set in both directions -- so the per-node work IS what the claim establishes (that the loss is total), and reducing it would reduce the assertion. DESIGN §3's rule against buying reach with a debt row is not engaged: the live authority is this claim's SUBJECT, not reach. WHY NOT THE LONG HOME, which is the floor's other sanctioned remedy. There it would stop running on the change it exists to catch. The floor plans a changed witness from `edited_test_fns` -- the test fns the DIFF TOUCHED (required_floor_runner.rs changed_witness_identities_from_edited_test_fns), not the closure -- so a change to gunbc.roadmap_sizing would not plan it. Nothing else executes the long home: witnesses.yml has no schedule, falsifier.yml was deleted in the 2026-08-15 floor cut, and on run 35408358503 exactly three test.claim.long.* identities executed, all ones that run's own diff had edited, against declined_long=416. The move would have made this control a decoration. WHAT MEMBERSHIP COSTS AND WHAT IT DOES NOT. floor_eval_step_cost_drop is not cost-debt and not a third tier: members are planned, executed and measured on every run, eval_steps stay recorded, and a semantic red or wall-clock crossing still blocks. Only the eval-step overrun is reported instead of refusing, and the budget is not raised. SHAPE, per that module's own rules: a NEW list (floor_eval_step_cost_drop_live_forecast_rows) rather than growth of the roadmap four, which may only shrink; membership by whole qualified identity; no transcribed count -- measured_by names run 35408358503 and its required-floor-claim-cost artifact. Verified by fixture: the union is 7, no duplicates, and a sibling identity in the same module does NOT match (so this is identity-grain, not prefix). The seed runner reads the list live, so there is no mirror to drift. IRREDUCIBILITY IS TESTED, NOT ASSERTED -- a drop that merely claims it is the §4b(1) inflation. All three candidate reductions are recorded in the row with their measurements, including the two that failed by 1 and 16 eval steps and the third that was reverted for raising the gated figure while lowering the local one. Also: rung_drop/roster.dag registers the new row, roadmap_sizing_authored_to_derived now states WHERE its live control executes (every PR, not a cadence, not the long home) and that its cost gate is a separate bounded drop, and docs/design-rung-drops.md is regenerated from the authority. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…n an irreducibility argument Review 68130 (REQUEST_CHANGES) is right on all three counts. 1. gunbc.roadmap_forecast derived_node_sizings rebuilt BOTH halves of its accumulator per node -- concat(acc.assignments, one.assignments) and concat(acc.refusals, one.refusals) -- a copied accumulator, quadratic in the active node count, and new in this PR. It is now append-free: one map to the per-node adaptations, then one flat_map per independent list. THE PART THAT MATTERS MORE THAN THE REWRITE. I had already measured this repair (16 eval steps of 613,137), declined it on that basis, and then cited the measurement as part of the irreducibility case for a declared cost-gate drop. That is precisely the realized-n rebuttal DESIGN section 6 rules out by name -- "a proven cost-shape defect is ALWAYS fixed, regardless of the realized n; 'n is small here' is not a time-stable fact, because reuse changes n" -- and it was load-bearing, because the drop's whole claim is that the cost is irreducible. A defect I had measured was being used as evidence that nothing could be done. 2. The members union in floor_eval_step_cost_drop is the direct concat(concat(rows, apply_render), live_forecast) rather than a nested fold that rebuilds the list a row at a time. 3. The drop's evidence is RE-DERIVED, not edited around. The accumulator figure is removed from the irreducibility argument in both floor_eval_step_cost_drop and rung_drop roadmap_live_forecast_new_witness_eval_step_cost; the accumulator is now recorded as a defect that was FIXED, explicitly not as a rejected reduction. What remains as the irreducibility case is the lazy-history falsification, the reverted frontier rewrite, and the per-node sizing derivation that clause (i) of the restoration trigger names. measured_by cites the producing run and artifact; no figure is copied into either row. Re-measured after the fix: all 15 claims in the forecast module pass, and the identity moves 613,121 -> 610,358 under claim_batch -- a larger reduction than the half-measure I had rejected, though the floor's own cost receipt remains the instrument that decides. docs/design-rung-drops.md regenerated from the authority. Drop wiring re-verified by fixture: union of 7, no duplicates, identity-grain (a sibling identity in the same module does not match). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Review 68130 is right on all three counts; all fixed in a844a9c. 1. The copied accumulator in The part that matters more than the rewrite: I had already measured this repair (16 eval steps of 613,137), declined it on that basis, and then cited the measurement as part of the irreducibility case for a declared cost-gate drop. That is exactly the realized-n rebuttal DESIGN §6 rules out by name, and it was load-bearing, because the drop's whole claim is that the cost is irreducible — a defect I had measured was being used as evidence that nothing could be done. The review caught a real inversion, not a style point. 2. The members union is now the direct 3. The drop's evidence is re-derived, not edited around. The accumulator figure is removed from the irreducibility argument in both Re-measured: all 15 claims in the forecast module pass, and the identity moves 613,121 → 610,358 under |
The required floor refused test.claim.long.roadmap_page_witness.witness_ready_node_doc_ emits_button_and_external_script at 168,218 eval steps against the 72,300 new-witness budget. It is the page's one inhabitance claim -- the claim that renders through the REAL stylesheet derivation after the three supplied-stylesheet claims stopped paying for it -- so its cost is roadmap_css() itself, and it cannot be supplied away. Two folds in gunbc.roadmap_style rebuilt their accumulator per element with concat(acc, [...]): band_var_decls and audition_paints. DESIGN section 6 (bare minimum cost) fixes a copied accumulator at any n, and these sit on the path of every production page serve, not only this claim. Both are now flat_map. dispatch_rest_band_key was also a fold and is left alone: it selects one member's key and copies nothing. Verified by execution: the inhabitance claim, and every claim that reaches the rewritten folds -- roadmap_sandbox_witness witness_auditioner_blocks_emitted_with_derived_inks, witness_auditioner_missing_swatch_is_loud (the Absent arm, now [] rather than acc), witness_sandbox_carries_auditioner_control, and instrument_sandbox_keystone_holds -- return true. The floor re-measures the claim on this head; if it remains over budget it is declared as its own bounded drop, not added to another drop's list. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…its own 4b(3) drop It is the one claim running the real roadmap_css path, so it keeps executing; only the eval-step overrun is reported instead of refused. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Transition-admission migration for gunbc#11704. No action until the operator sequences #11704's landing. gunbc#11704 moves namespace transition admissions out of the tree. Once it lands, any file under To migrate (paste + delete), after #11704 is on main and merged into this branch: git rm \
dag/gunbc/namespace/transition_admission/gunbc_dispatch_selection_automatic_codex_behavior_preservation_holds_IntricacyHigh.dag \
dag/gunbc/namespace/transition_admission/gunbc_dispatch_selection_automatic_codex_behavior_preservation_holds_VolumeMedium.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_belt_actuate_belt_audit_spawn_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_belt_actuate_belt_review_plan_for_head_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_dispatch_actuator_dispatch_slot_fields_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_spawner_node_json_value_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_spawner_roadmap_dispatch_json_value_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_spawner_upcoming_array_json_node_title.dag \
dag/gunbc/namespace/transition_admission/gunbc_roadmap_spawner_upcoming_node_json_node_title.dag \
dag/gunbc/namespace/transition_admission/test_claim_dispatch_selection_witness_witness_intricacy_does_not_change_automatic_effort_IntricacyHigh.dag \
dag/gunbc/namespace/transition_admission/test_claim_dispatch_selection_witness_witness_intricacy_does_not_change_automatic_effort_IntricacyLow.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_dispatch_actuator_witness_dispatch_effort_ignores_intricacy_IntricacyHigh.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_dispatch_actuator_witness_dispatch_effort_ignores_intricacy_IntricacyLow.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_forecast_witness_fixture_cell_IntricacyMedium.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_forecast_witness_fixture_cell_VolumeMedium.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_forecast_witness_witness_empty_calibration_cell_refuses_IntricacyHigh.dag \
dag/gunbc/namespace/transition_admission/test_claim_roadmap_forecast_witness_witness_empty_calibration_cell_refuses_VolumeSmall.dag
git commit -F msg.txt # msg.txt = the text below, verbatim
msg.txt |
What this is
NodeSizingfused four facts under one discriminant: whether a roadmap row is a dispatchable work item at all, the repository the work happens in, the acceptance evidence a worker must return, and a hand-authored intricacy/volume guess at how big the work is. Only the last is a size, and an author's ordinal guess written before any of the work is done is an estimate wearing a fact's clothes — nothing observed it and nothing could contradict it. Consumers read it as though it were measured: the spawn request published it, the page badged it, and the forecast keyed its cycle-time calibration on it.This unbundles the four and makes size derived.
The census, measured rather than assumed
repoandacceptancehave live consumers (the spawn-request JSON, the brief's paths,classify_dispatch_destination_gatevianode_dispatch_destination, and vivid-ant-470's new destination resolver).intricacy/volumehad no control-flow consumer anywhere.gunbc.dispatch_selectionthreaded aNodeSizingthrough every resolve function and recorded it on the receipt, and no branch and no consumer of that receipt ever read it — its own carrier note said as much.gunbc.session_reservation_policyis not a consumer: its "sizing" isHostSessionReservationSizingper host, a different concept wearing the same word. The live authored population was 65 rows ingunbc.roadmap_authority, throughactive_sized/active_small/active_large, all three of which collapse into oneactiveconstructor now that size has left.The shape
RoadmapNode.dispatch: WorkItemDispatch = NotDispatchable | Dispatchable { repo: String, acceptance: Acceptance }— the three live facts, kept as a coproduct rather than two bare fields because "this row is not a work item" was itself the third fact, and two bare fields would have needed arepo: ""sentinel.repostays aStringslug of the same shape forgunbc.roadmap_dispatch_destination.gunbc.roadmap_sizingis the single authority for size. It imports nothing from the roadmap:derive_task_sizingtakes aSizingSubject { subject, title, description, exit_criterion: String? }, because a task worth sizing may be a plan item in another repository that is not aRoadmapNodeat all.gunbc.roadmap_modelprojects a node into one.NodeSizingDerivation = SizingDerived { … } | SizingNotDerivable { subject, detail }. The refusal is a distinct arm with a located reason; there is no default cell anywhere in the diff.Sizing leaves admission (operator ruling, 2026-09-10)
There is no size on
RoadmapNodeand no sizing argument on any admission path, so sizing cannot refuse a launch by construction rather than by policy.LaunchSizeMissing/ wire wordsize_missingbecomesLaunchDispatchBindingMissing/dispatch_binding_missing: it never checked a size — it checkednode_is_sized, which asked whether the row carries repo + acceptance. That gate stays, and is now honestly named: it is a destination fact, and a dispatch that cannot name its repository must not create a worktree. No row that was dispatchable before this change is refused after it.gunbc.dispatch_selection, the consumer that legitimately wants a size, receives a two-armSizingProfileExpectation = NoDerivedSizingExpectation | DerivedSizingExpectation { sizing }and records it on the receipt and on the refusal. Both arms resolve identically today because live selection isProfileAutomatic, and the carrier says that outright instead of implying it.The declared drop
gunbc.rung_drop.roadmap_sizing_authored_to_derived(rostered, projected intodocs/design-rung-drops.md). Subject isgunbc.roadmap_forecast schedule_forecast— scheduling and resource expectation, not admission. Its trigger names the capability: a derivation that reads aSizingSubjectand answers from it, with an executed control showing two materially different subjects receiving different cells, and the forecast calibrating from those cells end to end. It states explicitly that replacing the stub with any constant-returning function does not satisfy it.The forecast now takes its sizings as a parameter (
List<NodeSizingAssignment>) instead of reading them off the node, which keeps its positive controls authorable while the deriver is a stub — controls deleted to accommodate a change are evidence destroyed. FIVE witnesses whose subject was the authored cell population could not be kept without weakening what they assert; they are retired by name in the drop's population rather than quietly, and replaced by one control that is authorable. The five are four forecast witnesses —witness_live_graph_refuses_with_located_counted_calibration_gaps,witness_live_graph_gap_count_matches_refusal_rows,witness_live_graph_refusal_is_only_calibration,witness_live_calibration_keeps_small_sample_intervals— plustest.claim.roadmap_authority.witness_active_sizes_are_intentional_and_nonuniform, the authored-size-distribution witness retired with its subject. (This sentence previously said "three live-graph calibration witnesses", which counted only the identities carryinglive_graphin their name and understated the retired population; the drop's declaration was correct throughout.)Evidence, by execution
witness_stub_deriver_refuses_rather_than_fabricating_a_cell→trueon the real path.derive_task_sizingtemporarily returningSizingDerived { medium, medium },witness_spawn_request_omits_size_keys_while_no_size_is_derived→false.witness_live_graph_refuses_every_node_as_unsized_while_the_deriver_is_a_stubreturnedtrueagainst the real authority on an EARLIER implementation of this witness — the one whose completeness check was ananyover the refusal list. That is historical evidence for the implementation tested then, not an execution receipt for the complete-payload repair or its new discriminator. The current source gathers everyNodeUnsizedpayload throughreported_unsized_idsand applies count equality plus membership in both directions to that complete population, withwitness_an_extra_unsized_payload_is_not_hidden_by_a_correct_oneas its discriminator; whether those hold is answered by execution on the current head, reported separately, and is not claimed here. Current-source correctness and current-head execution evidence are deliberately kept apart in this bullet.witness_a_cell_answered_for_another_subject_refuses(a cell naming another node's subject producesSizingForAnotherSubject, never a rebind),witness_a_cell_answered_for_its_own_subject_is_admitted(the positive control), andwitness_two_cells_for_one_subject_refuse_rather_than_being_ordered(SizingAssignedTwice, so list order never arbitrates between conflicting cells) — alltrueby execution.build:phases_run=2 phases_failed=0locally. Required lanewitnesses:declarationsclean,namespace-wave-admissionclean once the relocation roster landed; the remaining local floor refusal is thelocal-repo wetlane failing to build Rust in this container (sccache: failed to execute compile), which reproduces on the unmodified tree.🤖 Generated with Claude Code
https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
Merge conflict resolution (2026-09-14)
Merged current main
e3f60ebbf5276bcdb5a216b37282d1e06580d963with a merge commit; no rebase or force-push.Admission adjudication against that exact base and the current
declaring_candidates→declarer_of,binding_disposition, anddisposition_auto_admittedmechanism:automatic_codex_behavior_preservation_holds(IntricacyHigh, VolumeMedium);fixture_cell(IntricacyMedium, VolumeMedium);witness_intricacy_does_not_change_automatic_effort(IntricacyHigh, IntricacyLow);witness_dispatch_effort_ignores_intricacy(IntricacyHigh, IntricacyLow);witness_empty_calibration_cell_refuses(IntricacyHigh, VolumeSmall). Each reference is present in its enclosing declaration at base and head. Base declares these variants only ingunbc.roadmap_model; head only ingunbc.roadmap_sizing. Each consumer explicitly imports the respective authority. Distinct nonempty singleton sets mean TargetChanged, which refuses without the exact row.belt_audit_spawn,belt_review_plan_for_head,dispatch_slot_fields,node_json_value,roadmap_dispatch_json_value,upcoming_array_json,upcoming_node_json. Each reference remains at both revisions. Base uniquely declares node_title ingunbc.roadmap_spawner; head uniquely declares it ingunbc.roadmap_status; consumers import the new authority (spawner's formerly local binding now imports status). The same singleton TargetChanged rule requires each row.InventoryLotEvidenceandadmit_ledger_evidenceinproduct.inventory. The old claim that inventory has no such declaration became false. This merge preserves main's deletion and corrects that leftover claim while retaining the dissolution rule: present-at-base transitions dissolve, independently of whether other rows remain. Other previously deleted cohorts are not resurrected.Both explanatory principles remain in the source: expected candidate sets derive from declaring identities, never copied from observed output; consumption depends on the transition being present at base.
Projection resolution used the authorized union fallback, not local regeneration: the documented regen command refused because this worktree has no built interpreter. Kept current main's complete projection and appended the sizing section. Verified section identities by set difference, with no current-main section missing. Main has since expanded the provider-jurisdiction section's heading and authority; its current section supersedes the old heading rather than duplicating the same row. Both
.dagauthorities and roster entries remain, including main's newly conflictinglong_home_enrolment_margin_observed_onlyentry. CI heal-generated-artifacts must regenerate/order the projection and validate the healed head.Validation: all 17 reference sites checked against main's blobs and the merged source; global declaration census and explicit import checks establish the singleton moves. Pre-commit cargo fmt passed. The remote Cargo negative control failed as expected on the stable compiler. No claim of an executed admission verdict on this new head yet; required CI must provide it. No cost-debt entry was added for the sizing tripwire.
Held behind #11310 and #11303. Do not merge or enqueue as part of this conflict repair.
CI healing receipt: run 34813261886 successfully regenerated the projection and pushed
ce634f84d5aa2667f6dd9113a127d9a8e27d5070, changing only the placement of the sizing section indocs/design-rung-drops.md(4 lines moved, content preserved). The heal job exits 1 asSupersededByHealedHead; the new head requires its own executed verdict. Run 34814897015 currently concludesaction_required, awaiting human approval of the bot-pushed head.Second integration receipt:
e70807ca453899ca200b1046cd726fe49d0d1d92merges main92bf058e54finto healed headce634f84d5a. The sole conflict was imports ingunbc.roadmap_dispatch_destination: retainWorkItemDispatch,Dispatchable,NotDispatchablefor dispatchability and main's added imports forAttemptAdmissionSubject; those are different facts. The projection was already healed and did not conflict. Rechecked all 17 reference identities against the new main's blobs; the sole base declarers remain roadmap_model for Intricacy/Volume and roadmap_spawner for node_title, with the corresponding unique relocated declarers at head. Main still carries InventoryLotEvidence and admit_ledger_evidence in product.inventory and an empty admission table. Thus all seventeen survive and none of the seven inventory rows returns.Executed evidence on the preceding source head
2af33d1edc6: run 34813261886 completed with required-witnesses-floor SUCCESS,lane=witnesses phases_run=3 phases_failed=0,FloorClean unexpected_failures=0, and namespaceADMITTED; each of the seventeen exact TargetChanged rows is individually ADMITTED-BY #10994. The mechanism's comparison names basee3f60ebbf527and GitHub test-merge headdde2d4dd515c. Overall run FAILURE came from the docs ordering drift, subsequently healed, plus the heal's superseded-head exit. This is evidence for that comparison, not an executed verdict on e70807c: run 34816538897 is currently in progress on the new head.Final exact-head CI receipt: run 34816538897 on
e70807ca453899ca200b1046cd726fe49d0d1d92completed FAILURE. Build and heal jobs both SUCCESS, confirming projection agreement. Namespace ADMITTED, comparing base92bf058e54fto GitHub test-merge headfe19dd1fe04e; all seventeen exact TargetChanged rows remain admitted.The sole floor blocker is
test.claim.roadmap_forecast_witness.witness_live_graph_refuses_every_node_as_unsized_while_the_deriver_is_a_stub: the witness passed, but measured 306ms CPU against the 302ms enrolment margin, yieldingenrolment_measured_over_margin. Floor executed 3880, with zero claim failures and zero unexpected failures;enrolment_margin_blocking=1. The explicit instruction forbids rostering this tripwire as cost debt because that withholds it from execution. No such entry, witness weakening, relocation, or threshold change was made. Reported to bright-boar-435; held behind the prerequisite work, not merge-ready.Third integration:
f7ee7ac7d39merges maina745dac28d5(#11310 and #11347). #11310 adds the withheld-frontier consequence: preserved it in closing-task eligibility, active nodes/edges, and the forecast witness's population read, alongside #10994's dispatch bindings and derived sizing. The witness still checks the complete authoritative active population; this is the new frontier API, not a cost workaround. The healed projection did not conflict. Formatting and diff checks passed.Admission re-adjudication at a745dac: all seventeen #10994 sites remain present in base and head; the base still uniquely declares Intricacy/Volume in roadmap_model and node_title in roadmap_spawner, while head uniquely relocates them to roadmap_sizing and roadmap_status. The seven inventory rows remain deleted. Main's new #11193-labelled anchor row (landed in #11347) is deleted as consumed: artifact_store_fs already imports only Filesystem from filesystem_io and declares its own extdeps_external_authority_anchor at base. Its exact candidate set is therefore {extdeps.realization.artifact_store_fs} on both sides, so the narrowing has no remaining delta to admit. Retained its explanatory history and appended the dissolution receipt.
The preceding e70807c enrolment-margin RED remains an observed receipt, not a verdict on this new merge head. No tripwire cost-debt entry, threshold change, or weakened assertion was introduced. New-head CI is required.
Fourth integration:
001a1580d51merges main9989db5538f, without rebase or force-push. Took main's namespace admission file as the base and restored this branch's seventeen rows and explanatory headers. Audited against both parents: retained main's correction that the #11182 rows no longer survive; changed only its empty-roster framing to describe main's prior state; preserved this branch's named #11193/#11347 anchor dissolution and identity check, which main's unnamed retirement would otherwise lose.Rechecked all seventeen binding identities against 9989db5's actual source: the ten sizing sites still move the unique Intricacy/Volume declarer from roadmap_model to roadmap_sizing; the seven node_title sites still move the unique declarer from roadmap_spawner to roadmap_status. Every site references its spelling at both base and head, so each remains a non-auto-admitted TargetChanged. Inventory and anchor transitions are already present at base and their rows stay deleted. The projection did not conflict. Bare
cargo fmt --all --checkexited 0; staged diff check passed.Hold unchanged: the f7ee7ac green sampled 279ms at 567373 eval steps, versus the prior 306ms at 548615 steps. Work did not shrink. Neither that green nor this conflict repair buys back the 302ms margin; prerequisite cost work is still required. No enqueue, rerun, cost-debt entry, or threshold change.
Landing work (stern-seal-484, 2026-09-19)
origin/mainmerged (merge commit, clean). The required floor refused on five over-budget witnesses and on the namespace-wave-admission phase. Four of the five are fixed; the fifth is a declared drop; the admission refusal had a different cause than expected.The four reduced witnesses
Each supplies its inputs at the interface it tests, and each was verified with a control that must fail.
roadmap_css()is 157,986 of each claim's ~163,000, and none of the three asserts anything about CSS — a claim dominated by one call whose result it does not inspect (DESIGN §3).roadmap_page_implnow takes the stylesheet as a parameter; every production caller passesroadmap_css(), so the served page is unchanged.witness_ready_node_doc_emits_button_and_external_scriptstill renders throughroadmap_page_launch, which derives the stylesheet, and now asserts the route: the head must carry whatgunbc.roadmap_styleproduces, cited by calling the producer rather than spelling its bytes (§3). Control: replacing the liveroadmap_css()with""reds that claim and correctly leaves the three supplied claims green.an_undispatchable_node_mints_no_closing_contract_task, 113,011 → 136. It called the live fold and then re-scanneddeclared_roadmap_nodes()to prove the population was non-trivial, deriving the projection twice to read one node. The selection rule is a fact about a node set, so it splits intostartable_nodes_missing_closing_contract_over(nodes, edges, accepted, withheld)with the live wrapper retained; the claim supplies a two-node graph whose only difference is the dispatch binding. Control: removing thenode_dispatch_is_declaredfilter reds it. The live path stays executed byroadmap_authority_test witness_withheld_sized_subject_does_not_mint_closing_contract_task.The fifth: the live control moved off the cost gate, not off the floor
witness_live_graph_refuses_every_node_as_unsized_while_the_deriver_is_a_stubis over the 72,300 new-witness budget and stays that way, under a new §4b(3) drop,gunbc.rung_drop.roadmap_live_forecast_new_witness_eval_step_cost.The cost is the assertion. While
derive_task_sizingis a stub,derived_node_sizingsmints aNodeUnsizedrefusal for every active node of the live graph, and the claim joins that refusal set to the active set in both directions. That per-node work is what the claim establishes — that the loss is total — so reducing it would reduce the assertion. §3's rule against buying reach with a debt row is not engaged: the live authority is this claim's subject, not reach it acquired.It keeps executing on every pull request.
floor_eval_step_cost_dropis not cost-debt and not a third tier: members are planned, executed and measured on every run,eval_stepsstay recorded, and a semantic red or a wall-clock crossing still blocks. Membership changes exactly one thing — an eval-step overrun is reported instead of refusing — and the budget is not raised.It was deliberately not moved to the long home, the floor's other sanctioned remedy, because there it would stop running on the change it exists to catch. The floor plans a changed witness from
edited_test_fns— thetest fns the diff touched, not the closure — so a change togunbc.roadmap_sizingwould not plan it;witnesses.ymlcarries no schedule andfalsifier.ymlwas deleted in the 2026-08-15 floor cut; and on run 35408358503 exactly threetest.claim.long.*identities executed, all of them ones that run's own diff had edited, againstdeclined_long=416. The relocation would have made this control a decoration.Irreducibility is tested, not asserted — a drop that merely claims it would be §4b(1) inflation. Three candidate reductions are recorded in the row with their measurements: binding the cycle-time history lazily moved the claim by 1 eval step (the substrate already evaluates
leton demand); fixing the copied accumulator inderived_node_sizingsmoved it by 16 of 613,137; and routing it throughfrontier_sets_from_live_historyshowed a 2.5x local win and was reverted, becausefloor_pure_producer_shareservesroadmap_authority_projectionand does not serve that spelling — the change would have raised the gated figure while lowering the local one.claim_batchhas no cross-claim share and is not the instrument that decides this.roadmap_sizing_authored_to_derivednow states where its live control executes (every PR, not a cadence, not the long home) and that its cost gate is a separate bounded drop.namespace-wave-admission: a different cause than briefed
The 17 rows this PR authors refuse on nothing. gunbc#11481 removed both deletion-follow-up refusal arms on 2026-09-16 and declared them as drops, so
FOLLOW-UP ABSENTis a printed record, not a verdict. What refuses isconsumed_due = roster_due && !consumed_admissions.is_empty(): this PR adds files under the roster directory, soroster_touchedholds, and 40 rows owned by gunbc#11587 that are already satisfied at the base come due. That is the bystander window the phase closes at the roster's next touch, and the wall prints the remedy itself — "delete these rows fromdag/gunbc/namespace/transition_admission/". Deleted, joined at identity grain: 40 consumed rows in the log, 40 files carryingowner_pull_request: 11587, zero stale, and the 17 gunbc#10994 rows left standing. No follow-up PR was required and the phase is not weakened.