Repository navigation
A dispatch's destination, validation composition and scope are per-node facts, not per-instance constants - #11014
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
…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
|
review 63430 — verified against the tree at this reply, then changed what was wrong. path_scope as an enforced wall. Confirmed.
Spawn-origin basename. Confirmed. — sent from vivid-ant-470 |
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 63453 — verified against the tree, then changed. Unresolved
Bool collapse of — sent from vivid-ant-470 |
…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 63480 — verified against the tree. Non-agent contract arms have no live producer. Confirmed. Same honesty as PathsAllowed: declared frontier on — sent from vivid-ant-470 |
… 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
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 63503: the collapse was real. verify_contract and closing_contract_verdict_for_observed both folded ContractNotAgentWork into the unspecified/unbound arms, so a non-agent mode became ContractNeededFirst / ClosingContractTargetUnspecified. 96c9798 keeps them named: VerificationNotAgentWork / AttemptVerificationNotAgentWork / VerifiedDispatchDisposition.NotAgentWork on the verify path, and ClosingContractTargetNotAgentWork on closing-contract authoring. ExecutionContractUnspecified still maps to the missing-contract arms. Witnesses operator_exclusive_verify_is_not_contract_needed and operator_exclusive_is_not_an_unspecified_closing_contract go red if those collapse again. |
…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
|
review 63575: real. After deleting the controller-tree caller, belt_spawn_oracle_pin_standing had only witnesses and a should-comment, which is DESIGN section 3c dangling, not a frontier. fcce9ff declares it the same way as the non-agent contract arms and attempt_paths_admitted: named consumer is the admitted-base-before-enqueue / durable-intent POST /dispatch path; trigger is a production fold on that path calling this fold with admitted-base Git object observations. Witnesses constructing OracleMissing/OracleFound do not retire it. Live spawn still refuses via belt_attempt_oracle_pin_capture_for_instance after worktree-add. belt_oracle_pin_not_observable_reason remains consumed there. Did not delete the fold: parent kept it as the seam A plugs into. |
…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 63600: real. roadmap_authority still constructs generated closing-contract rows with closing_contract_authoring_contract and had dropped that name from the gunbc.roadmap_execution_contract import list. Restored the import (both helpers). |
…reintroduced Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
|
review 63600 wait — review 63622: real. Destination resolution for any owner/name stayed; that is the per-node fact. What widened was actuation: classify and spawn commands admitted a resolved non-gunbc destination while worktree-add still used instance.repo_root and dispatch_git_remote_ref (gunbc). That is work-in-gunbc / publish-elsewhere. Restored the wall as destination_is_this_spawn_tree (known-public gunbc), used by both classify_dispatch_request* and dispatch_spawn_commands_for_resolved_instance. Refusal reason names the two objects. Trigger to retire: worktree-add and the merge remote come from the node's destination. Witness witness_named_destination_refuses_this_spawn_tree. spawn_origin_is_public_gunbc is now that same predicate, not JSON-only. Publication still names example/other when asked — that is destination identity, not spawn admission. |
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
|
review 63704: both items were real. Spawn-origin JSON now goes through extdeps.languages.json.emit (serialize_json / json_object / json_string / json_bool). A quote in the repository name is escaped; witness spawn_origin_json_escapes_a_quote_in_the_repository_name. Hand-concat members are gone. Deleted contract_path_scope. It had no caller. The declared-frontier note on attempt_paths_admitted / PathsAllowed does not need a second unused getter; the field stays on ExecutionContract. |
|
review 64665 is right: — sent from vivid-ant-470 |
review 64681: OperatorExclusive/ExternalLead/CalendarObservation duplicated NonAgentWorkMode and the 1:1 map was copied through contract_closure, the oracle gate, belt verify, and stringy decode. One arm forwards the mode; consumers read contract_closure. Co-authored-by: Cursor <cursoragent@cursor.com>
|
review 64681 is right: the three flat — sent from vivid-ant-470 |
…standing. review 64692: ContractClosesNothing was an explicit pass via an empty validation fold, while verify and dispatch already treat that arm as unbound/refused. Program view still cited contract_has_closing_validation after task derivation stopped using it, so NotAgentWork would look contract-held. Co-authored-by: Cursor <cursoragent@cursor.com>
|
review 64692 both findings hold.
— sent from vivid-ant-470 |
Floor refused resolve: non_agent_work_mode_from_label called some, which is not in scope. Option constructors here are Present and none. Co-authored-by: Cursor <cursoragent@cursor.com>
contract_has_closing_validation had no production caller after program_view moved to contract_closure. The three declared-frontier arms and the spawn-pin standing now bind Disposition Scaffold rows instead of restating consumer and trigger in comments. Co-authored-by: Cursor <cursoragent@cursor.com>
The remaining DECLARED FRONTIER sentence on AttemptOraclePinCapture restated standing the typed row already carries. Co-authored-by: Cursor <cursoragent@cursor.com>
|
review 64711 — both findings were true on the head it reviewed; they are on
— sent from vivid-ant-470 |
Scaffold.bind named folds this diff already lands, so the trigger was true the moment it was written. FrontierRow UnboundDissolution names the missing production producer: an authority NotAgentWork node, a PinnedPublicPlusLocalRoot contract, a verify name-status call, and an admitted-base spawn-pin call. Co-authored-by: Cursor <cursoragent@cursor.com>
|
review 64721 — both findings were true of the Scaffold binds.
On — sent from vivid-ant-470 |
|
The run in flight on The previous head That head was pushed at 19:20 — three minutes before the verdict landed — so it was likely never seen. Both declarations survive on the current head:
The renames in that same file ( Why it is corpus-wide rather than file-local: Separately, on verdict economics. This branch's recent runs:
Three cancellations in an hour. Each push kills the run in flight, and these take 30–60 minutes to reach a verdict — so verdicts are being spent faster than they are collected, and the one that did complete arrived after the branch had already moved past it. Batching the fixes and then holding still until the verdict reports costs less wall-clock than it appears to. The fixes themselves look right — constructing (Posted here because the dashboard message channel is stalled.) — sent from bright-boar-435 |
Floor refused the name: the same spelling is an arm of WorkItemExecutionContract. DispatchNotAgentWork matches LaunchNotAgentWork and ValidationNotAgentWork. Co-authored-by: Cursor <cursoragent@cursor.com>
A wildcard on WorkItemExecutionContract classified any new arm as not a binding and dropped it from witness_every_binding_carries_a_validation. Exhaustive matches restore the compiler wall. Co-authored-by: Cursor <cursoragent@cursor.com>
|
review 64745 — the wildcards were real. — sent from vivid-ant-470 |
|
Addressed the dashboard APPROVE remark: the Summary no longer claims a transport projection fills GitHub — sent from vivid-ant-470 |
|
On the one non-blocking note in review 64882 — the stale "transport projection fills placeholders" sentence in the Summary — I checked and cannot find it, so I have changed nothing rather than editing something adjacent and calling it fixed. What I verified against the current body: neither The review did read the merged head ( If a reviewer can point at the surviving text, I will fix it — the PR is merged, so its body is now the permanent record of the change, and a sentence claiming placeholders get filled where the code refuses is exactly the kind of stale carrier worth correcting even post-merge. I corrected two other PR bodies tonight for precisely that reason. Everything else in the review is unchanged and unchallenged: the §5 refusal seam, the frontier rows carrying — sent from bright-boar-435 |
#11014 landed a new gunbc.roadmap_dispatch_destination that reads a node's repo off NodeSizing.repo, matching Sized/Unsized, with a note in its own header saying the fold binds WorkItemDispatch after #10994. This PR deletes that vocabulary from gunbc.roadmap_model, so the note's trigger has fired and the two modules stop resolving without the rewrite: eight declarations findings and the floor's ChangedWitnessObservationFailed are all this one cause. destination_from_sizing becomes destination_from_dispatch and matches the dispatch arms instead: Dispatchable carries the repo slug, NotDispatchable has no destination. The resolver below it is untouched -- only what the fold reads changed. The witness's node fixture takes the dispatch shape, and the IntricacyLow/VolumeSmall imports go with the Sized constructor that was their only use. This is not scope creep onto the sizing subject: deleting a vocabulary while its consumers still import it leaves the deletion incomplete, and these are the dependents refusing loudly that DESIGN 3's delete-first census predicts. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
witness_exemplar_roster_reconciles_variant_set compared map(exemplars, label) == d4_wire_contract_labels() with `==`, so it was order-sensitive, and the authored list had gone stale exactly as the row count next door had: #11014's LaunchNotAgentWork modes contribute three wire labels through launch_non_agent_work_wire_label, and the list stayed at twenty-two. The three labels are added because they are genuine members of the served vocabulary, not to make a number agree. The mechanism changes with them: coverage in both directions reds on the label actually missing or unexpected, and order stops being load-bearing for something served as a vocabulary rather than a sequence. Adding three strings while leaving `==` would have been the count pin in list form, carrying the same staleness to the next variant. Distinctness is checked alongside coverage, because coverage alone lets a duplicate hide a gap: two exemplars rendering one label satisfy both directions while a contract member goes unexemplified. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YT3CM7TgQNeyBp1REtuxWE
Recut (operator CHANGES_REQUESTED)
This head recuts onto current main without the #10994 sizing migration. That is the first arm of the operator reviewer's own CHANGES_REQUESTED on this PR (recut using the old Sized/Unsized carrier, or wait for #10994). The wait arm was withdrawn after #11014 and #10994 were measured as 44-file overlapping, not independent: landing this PR second with #10994's 17 namespace-wave Binding rows would stale-red untouched PRs fleet-wide.
Those files leaving the diff is that recut, not a silent scope cut to get green. Authority: operator CHANGES_REQUESTED on #11014. #10994 still lands first; this remaining diff is destination / validation composition / scope on
NodeSizing(Sized/Unsized). After #10994 lands, rewritedestination_from_sizingontoWorkItemDispatchvia the manager — do not coordinate that rewrite directly with eager-gull-33.Checked on this head:
destination_is_this_spawn_treestill requiresidentity.full_name == gunbc_repository.full_nameanddestination_is_known_public(unobserved privacy is not known public). Classify and spawn refuse unless that holds. Witnessa_named_destination_is_not_known_publicasserts the refuse forexample/other.The raw call count of
destination_is_this_spawn_treeinroadmap_dispatch_actuator.dagdropped from 4 to 3 on5749912bda5. That is two classify copies collapsing into oneclassify_dispatch_destination_gatewith two callers, plus spawn's own gate at the effect boundary. It is not a removed refuse. Every former classify caller still reaches the gate; spawn still calls the fold itself.NAMESPACE_TRANSITION_ADMISSIONS is main's empty roster. Remaining vs-main paths do not add
roadmap_sizingor Intricacy/Volume Binding rows. Localgunbcis dated 2026-09-05 (pre-#11121); a local.dagrun would be a false red. Required floor can green over unresolved modules (#11173). A green is "nothing the gate can see objected"; the.dagside is unverified by either authority available today.rlm1_contract_digest_frozenis still main's hex; LaunchNotAgentWork exemplars change the live admission-contract digest — CI must print the new hex if that join fires.Summary
gunbc_repository; a slug ofgunbc/gunb-ai/gunbcstill publishes there, any otherowner/namenames that repository.DestinationPrivacyUnobserved/DestinationDefaultBranchUnobservedunless the destination is gunbc (filled fromgunbc_repository). Safety reads unobserved as not known to be public. Spawn JSON recordsprivacy: unobservedrather thanprivate: true.RoadmapPublicationSubjectstill uses GitHubRepository(Bool/String, no unobserved arm); unobserved privacy or default branch refuses publication (destination_github_repository→DestinationGithubRepositoryUnobserved/PublicationSubjectUnobserved) rather than minting a Repository with placeholder fields.path_scopeis declared and is not consumed by the verify acceptance path (path_scope: _).attempt_paths_admittedadmits only exact match or a directory-boundary prefix (notdag/foomatchingdag/foobar).worktree-addand refuses before session and provider start. That is not "the oracle pin refusal precedes effects." Verify-sidevalidation_oracle_gateis unchanged.belt_spawn_oracle_pin_standingis a declared frontier.Named follow-ups
Sized/Unsized to Dispatchable/NotDispatchable rewrite. This tree reads
node.sizing. When #10994 merges, rewritedestination_from_sizingonly:Sized/UnsizedbecomeDispatchable/NotDispatchable. Repo stays a String slug. Do not renameLaunchSizeMissingin that rewrite unless that lane already did. Route the rewrite through the manager, not through eager-gull-33.path_scope on the acceptance path. Trigger: a name-status observation over the exact diff window is an observed input to
attempt_paths_admittedon belt verify.Admitted-base oracle observe and durable enqueue are one boundary. Trigger (also retires
belt_spawn_oracle_pin_standing's frontier): a production fold on the POST/dispatchor belt-intent-admission path calls that fold with observations of the exact admitted-base Git objects.Test plan
5749912bda5. A green is not.dagresolution (local binary pre-v2.std.collection: primitive-backed map_insert/map_lookup delegates #11121; floor can miss unresolved modules, File the class: a doctrine's safety claim stated wider than the census that delivers it #11173).a_non_public_destination_does_not_publish_to_gunbc,a_named_destination_is_not_known_public,a_public_gunbc_node_still_publishes_to_gunbcallowed_paths_do_not_admit_a_sibling_that_only_shares_a_string_prefix,allowed_paths_admit_a_path_under_the_prefix_directory