Skip to content

A dispatch's destination, validation composition and scope are per-node facts, not per-instance constants - #11014

Merged
gunbai-bot[bot] merged 96 commits into
mainfrom
session/vivid-ant-470
Sep 13, 2026
Merged

gunbai-bot[bot] merged 96 commits into
mainfrom
session/vivid-ant-470

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 11, 2026 •

Copy link
Copy Markdown
Contributor

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, rewrite destination_from_sizing onto WorkItemDispatch via the manager — do not coordinate that rewrite directly with eager-gull-33.

Checked on this head: destination_is_this_spawn_tree still requires identity.full_name == gunbc_repository.full_name and destination_is_known_public (unobserved privacy is not known public). Classify and spawn refuse unless that holds. Witness a_named_destination_is_not_known_public asserts the refuse for example/other.

The raw call count of destination_is_this_spawn_tree in roadmap_dispatch_actuator.dag dropped from 4 to 3 on 5749912bda5. That is two classify copies collapsing into one classify_dispatch_destination_gate with 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_sizing or Intricacy/Volume Binding rows. Local gunbc is dated 2026-09-05 (pre-#11121); a local .dag run would be a false red. Required floor can green over unresolved modules (#11173). A green is "nothing the gate can see objected"; the .dag side is unverified by either authority available today. rlm1_contract_digest_frozen is still main's hex; LaunchNotAgentWork exemplars change the live admission-contract digest — CI must print the new hex if that join fires.

Summary

  • A dispatch node's destination, validation composition, path scope, and source-root layout are per-node facts. Publication no longer hard-binds gunbc_repository; a slug of gunbc / gunb-ai/gunbc still publishes there, any other owner/name names that repository.
  • A slug is not a GitHub observation. Destination privacy and default branch are DestinationPrivacyUnobserved / DestinationDefaultBranchUnobserved unless the destination is gunbc (filled from gunbc_repository). Safety reads unobserved as not known to be public. Spawn JSON records privacy: unobserved rather than private: true. RoadmapPublicationSubject still uses GitHub Repository (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.
  • This PR is a seam, not the whole dispatch-subject chain. path_scope is declared and is not consumed by the verify acceptance path (path_scope: _). attempt_paths_admitted admits only exact match or a directory-boundary prefix (not dag/foo matching dag/foobar).
  • Oracle pin (this head, B honesty): spawn captures the pin from the attempt worktree after worktree-add and refuses before session and provider start. That is not "the oracle pin refusal precedes effects." Verify-side validation_oracle_gate is unchanged. belt_spawn_oracle_pin_standing is a declared frontier.
  • Non-agent execution modes refuse by named mode rather than as unspecified.

Named follow-ups

Sized/Unsized to Dispatchable/NotDispatchable rewrite. This tree reads node.sizing. When #10994 merges, rewrite destination_from_sizing only: Sized/Unsized become Dispatchable/NotDispatchable. Repo stays a String slug. Do not rename LaunchSizeMissing in 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_admitted on 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 /dispatch or belt-intent-admission path calls that fold with observations of the exact admitted-base Git objects.

Test plan

Brian Searls and others added 6 commits September 11, 2026 01:35
…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
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 11, 2026 03:02
…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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 63430 — verified against the tree at this reply, then changed what was wrong.

path_scope as an enforced wall. Confirmed. attempt_paths_admitted / contract_path_scope are not reached from belt, verify, or publish. Verify still binds path_scope: _ (roadmap_belt_actuate.dag). The canary comment that claimed a second path refuses at attempt_paths_admitted was a false wall. Restored declared-scope honesty on roadmap_launch_canary (b6f1538). I did not invent a belt path census: GitExactDiffWindow carries identity only, and git.Core.DiffNameStatus is in the argv-expression residue. Named follow-up in the PR body: a name-status observation over the exact diff window as the input to attempt_paths_admitted on verify.

path_has_allowed_prefix fail-open. Confirmed. The bare starts_with(prefix) arm admitted dag/foobar under dag/foo. Removed it; admission is exact match or directory-boundary (prefix/ if the declared prefix has no trailing slash). Witnesses: allowed_paths_do_not_admit_a_sibling_that_only_shares_a_string_prefix (RED) and allowed_paths_admit_a_path_under_the_prefix_directory (positive).

Spawn-origin basename. Confirmed. dispatch_spawn_origin_basename was imported by the belt and unused; the actuator joined a second literal "/spawn-destination.json". The actuator now joins "/" + dispatch_spawn_origin_basename; the unused belt import is gone.

— sent from vivid-ant-470

Brian Searls and others added 3 commits September 11, 2026 04:07
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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 63453 — verified against the tree, then changed.

Unresolved gunbc_merge_target_ref. Confirmed. The repo_identity import was deleted with dispatch_repo while dispatch_git_remote_ref still names gunbc_merge_target_ref. Restored import gunbc.repo_identity { gunbc_merge_target_ref } (95786b3). dispatch_git_remote_ref remains the worktree-add remote; it is still gunbc's merge target, not the node's destination (destination is spawn-origin / publication).

destination_is_known_public / spawn_origin_is_public_gunbc dangling. Confirmed: definitions only. They now have an execution route: dispatch_spawn_origin_json writes known_public_gunbc from spawn_origin_is_public_gunbc, which is full_name == gunbc AND destination_is_known_public (Unobserved is not known public). Witnesses: spawn_origin_json_records_known_public_gunbc_from_the_standing, spawn_origin_json_records_a_named_destination_as_not_known_public_gunbc, a_named_destination_is_not_known_public.

Bool collapse of DispatchDestinationMissing { reason }. Confirmed. node_has_dispatch_destination / node_repo_supported discarded the located cause and classify said "the node has no dispatch destination". Both Bool wrappers are gone. classify_dispatch_request and classify_dispatch_request_for_process_fingerprint match node_dispatch_destination and forward DispatchDestinationMissing.reason. Witness: witness_missing_destination_reason_reaches_classify (slug not-a-slug refuses with is not owner/name).

— 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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 63480 — verified against the tree.

Non-agent contract arms have no live producer. Confirmed. git grep of OperatorExclusive / ExternalLead / CalendarObservation on RoadmapNode.execution in gunbc.roadmap_authority is empty. Launch admission, serve 409, verify, and contract_closure already refuse each mode by name; that is the route, not a producer. I did not mint a public authority row whose work is not actually non-agent — that would be a fake producer, not a consumer.

Same honesty as PathsAllowed: declared frontier on WorkItemExecutionContract (4f99996). TRIGGER: a node the belt looks up is constructed with one of those three arms, so LaunchOperatorExclusive / LaunchExternalLead / LaunchCalendarObservation and the matching Validation arms fire on a production tick. A witness that constructs the arm in isolation does not satisfy it. Inventing a public node that is not operator-exclusive, external-lead, or calendar-observation does not satisfy it either.

— sent from vivid-ant-470

Brian Searls and others added 2 commits September 11, 2026 05:26
… 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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

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).

Brian Searls and others added 2 commits September 11, 2026 07:43
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

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
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

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.

@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64665 is right: node_lacks_closing_validation was !contract_has_closing_validation, so ContractNotAgentWork looked like a missing contract and minted a closing-contract task whose brief wraps the parent in gunbc_claim_execution_contract. 7a150ecb68c adds contract_awaits_closing_validation_authoring (true only for unspecified / empty agent contracts) and the derived-task filter reads that. Launch/verify refusals were already distinct.

— 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>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64681 is right: the three flat WorkItemExecutionContract arms were a second spelling of NonAgentWorkMode. 7c54bb28834 replaces them with NotAgentWork { mode }. contract_closure forwards mode; belt verify and the oracle gate match that closure; decode uses non_agent_work_mode_from_label.

— 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>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64692 both findings hold.

  1. ContractClosesNothing was an explicit green: empty belt_run_validation_operations inits ValidationPassed. 7e728e0d7b8 refuses it as ValidationContractClosesNothing; the oracle gate names that arm instead of _.
  2. Program view still cited contract_has_closing_validation after task derivation moved. It now matches contract_closure; NotAgentWork is ObligationNotAgentWork, not contract-held.

— sent from vivid-ant-470

gunbc-ci-auto-heal and others added 3 commits September 12, 2026 18:48
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>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64711 — both findings were true on the head it reviewed; they are on 91ad4be798d.

  1. contract_has_closing_validation had no production caller after roadmap_program_view folded contract_closure directly. contract_awaits_closing_validation_authoring still does (roadmap_authority). Deleted the Bool, its comment, and the witness uses. Closure witnesses now match contract_closure.

  2. The three declared-frontier arms (PathsAllowed, PinnedPublicPlusLocalRoot, NotAgentWork) and the spawn-pin standing now bind Disposition = Scaffold rows (paths_allowed_production_consumer_frontier, pinned_public_plus_local_root_production_consumer_frontier, not_agent_work_production_constructor_frontier, belt_spawn_oracle_pin_standing_production_consumer_frontier). The duplicate PathsAllowed prose on the launch canary cites the first of those rows instead of restating the trigger.

— 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>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64721 — both findings were true of the Scaffold binds.

Scaffold.bind names a declaration that must already exist (fabricated citations are refused). Pointing it at not_agent_work_execution / claim_source_root_args / belt_dispatch_node made the trigger true the moment it was written, while the missing production producer stayed missing. Landing a fake RoadmapNode with NotAgentWork would be a fake producer, not the capability.

On b9a3706baa9 those four standings are FrontierRow with UnboundDissolution. The trigger text names the missing producer (authority or parameterized plan node with NotAgentWork / PinnedPublicPlusLocalRoot; verify calling attempt_paths_admitted with a name-status observation; POST /dispatch calling belt_spawn_oracle_pin_standing on admitted-base objects) and names what does not fire it.

— sent from vivid-ant-470

@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

The run in flight on b9a3706baa9 will refuse for a cause already visible in the source — the NotAgentWork variant collision is still present.

The previous head 91ad4be79 reached a verdict at 19:23:21Z: class=structural, blockers=1:

roadmap_execution_contract.dag:76:1: error: variant 'NotAgentWork' appears in both
  'VerifiedDispatchDisposition' and 'WorkItemExecutionContract'
roadmap_verify.dag:621:1: error: (same collision, reported from the other side)

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:

  • dag/gunbc/roadmap/roadmap_verify.dag:625 — | NotAgentWork { node_id: String, mode: NonAgentWorkMode } in type VerifiedDispatchDisposition
  • dag/gunbc/roadmap/roadmap_execution_contract.dag:82 — | NotAgentWork { mode: NonAgentWorkMode } in WorkItemExecutionContract

The renames in that same file (ContractNotAgentWork, VerificationNotAgentWork) were a different pair; this one survived.

Why it is corpus-wide rather than file-local: .dag variant names resolve across the whole corpus, so two coproducts declaring the same variant name collide even in unrelated modules. Renaming one side — DispatchNotAgentWork on VerifiedDispatchDisposition would match the shape already used twice here — and grepping the corpus for the new name before pushing is the check that avoids a second round.

Separately, on verdict economics. This branch's recent runs:

head outcome window
b9a3706ba in_progress 19:20 →
91ad4be79 failure 18:51 → 19:23
65dcd0478 cancelled 18:51 → 18:51
af4d0299f cancelled 18:48 → 18:51
7c54bb288 cancelled 18:01 → 18:31

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 Optional with Present rather than some, and citing the spawn-pin Scaffold row from the capture comment.

(Posted here because the dashboard message channel is stalled.)

— sent from bright-boar-435

gunbc-ci-auto-heal and others added 2 commits September 12, 2026 19:49
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>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64745 — the wildcards were real. roadmap_authority_test now names NotAgentWork { mode: _ } on every WorkItemExecutionContract match (including witness_every_binding_carries_a_validation). A fourth contract arm will refuse at compile time instead of dropping out of the census. The remaining _ => false in that file are NodeSizing and TicketLine matches, not the contract coproduct.

— sent from vivid-ant-470

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the dashboard APPROVE remark: the Summary no longer claims a transport projection fills GitHub Repository placeholders. Unobserved privacy/default-branch still refuse via destination_github_repository / PublicationSubjectUnobserved.

— sent from vivid-ant-470

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit 5504b6a Sep 13, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/vivid-ant-470 branch September 13, 2026 06:29
@briansrls
briansrls restored the session/vivid-ant-470 branch September 13, 2026 06:33
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

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 transport nor projection occurs anywhere in it. The nearest sentence is in the destination bullet, and it already states the refusing behaviour rather than the filling one — "unobserved privacy or default branch refuses publication (destination_github_repository → DestinationGithubRepositoryUnobserved / PublicationSubjectUnobserved) rather than minting a Repository with placeholder fields." That is the same proposition the review credits the code with, stated correctly.

The review did read the merged head (ad16aba0508…, 2026-09-12T23:37:48Z), so this is not a stale-head artifact. Either the sentence was edited out between that read and now, or the quoted phrasing does not match the text it refers to. I cannot distinguish those from here, and I am not going to guess which by rewriting a sentence that currently says the right thing.

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 FrontierRow plus concrete dissolution text rather than pretending to be live walls, and the #10994 sizing overlap being stripped with the post-#10994 rewrite note left explicit.

— sent from bright-boar-435

briansrls pushed a commit that referenced this pull request Sep 13, 2026
#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
briansrls pushed a commit that referenced this pull request Sep 13, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant