Skip to content

Belt A (interim): roadmap-UI launch button + Node /dispatch route → belt_dispatch_node_cli - #6942

Merged
briansrls merged 14 commits into
mainfrom
session/royal-carp-451
Jul 20, 2026
Merged

briansrls merged 14 commits into
mainfrom
session/royal-carp-451

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

The clickable button (roadmap belt A, the fast interim; belt B in child cool-wolf-720 / PR #6940 supersedes the Node server with an in-process gunbc serve). Builds on merged #6910/#6914.

What this adds

1. Launch button + client script (roadmap_page.dag) — a dispatch button on every not-signoff-done node (open OR review — DONE = the operator's signoff, never a merged PR), carrying data-node=<node id>. A small client script POSTs to /dispatch/<node> and shows the result. The button is transport-agnostic: both A (this Node exec route) and B (gunbc serve, in-process) answer the same path, so B swaps under the button with zero page change. The JS is authored escape-free (no < > &) so it survives std.markup text escaping intact — same as roadmap_css() inside <style>; no raw-text-element modeling needed.

2. Interim dynamic POST /dispatch route (node_http_server_emit.dag) — the emitted static Node server gains ONE dynamic route (optional BeltDispatchRouteConfig on the spec; only the roadmap dashboard carries it, gunbhub stays Absent). On POST /dispatch/<node> it execs the srv1 gunbc binary running belt_dispatch_node_cli with the node id in GUNBC_BELT_NODE_ID (cwd = the repo, since gunbc run derives workspace_root from cwd), returning the JSON receipt. The dispatch authority stays belt_dispatch_node in .dag — this route only shells the CLI (a declared interim smuggled-exec that B dissolves to an in-process call).

Proven by execution

  • The emitted dispatch route JS is correct (execs /opt/gunbc/bin/gunbc … belt_dispatch_node_cli, env channel, JSON receipt); gunbhub emits no route.
  • The client <script> serializes with the JS intact (braces present, no HTML-escape damage).
  • Backend proven live on srv1: provisioned /opt/gunbc/{gunbc,bin/gunbc,dispatch-worktrees} (owned by briansrls, the only user with claude auth), then belt_dispatch_node_cli on a real open node with a fake claude → real git worktree add + tmux new-session … --session-id <deterministic-v4-uuid> → DispatchSpawned, session live; re-dispatch → already_live, no second spawn (idempotent). Unknown node → node_not_found; unset env → fail-closed refusal.

Interim / supersession

This is the declared throwaway half. Its dissolution trigger: belt B (gunbc serve, in-process dispatch, PR #6940) live on srv1 retires this Node route and the whole node_http_server_emit server. The srv1 host-path provisioning I did manually is formalized by B's deploy membership (same paths).

🤖 Generated with Claude Code

briansrls and others added 10 commits July 20, 2026 18:15
Extract belt_dispatch_path_prefix (roadmap_page.dag) as the one authority
for the /dispatch/ route prefix; node_http_server_emit route config and the
client-JS fetch both consume it (was two lockstep string literals, DESIGN
section 3). Emit verified valid JS with all 4 derived occurrences.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1. section-5 broken witness: dispatch_client_script now emits only when the
   page has content (empty doc has no dispatchable node, so shipping dead JS
   there was wrong) -- witness_empty_doc_is_minimal_shell stays green by
   construction instead of editing the assertion.
2. section-3 env_var fork: node_http_server_emit config consumes
   belt_dispatch_env_var (was a re-minted GUNBC_BELT_NODE_ID literal).
3. section-3 repo_cwd fork: config consumes belt_actuate_workdir (was a
   re-minted /opt/gunbc/gunbc literal).
4. coverage: 2 emit witnesses (roadmap has /dispatch/+execFile+env+cli-name;
   gunbhub negative control has neither -- discriminating on dispatch:Absent)
   and 2 page witnesses (open node emits button+script+fetch prefix;
   signed-off node emits no button element -- exercises the done==signoff
   ruling, since a merged-but-unsigned node is 'review' and still dispatchable).

Both witness aggregators green-by-execution on the fresh seed
(roadmap_dashboard_emit_witnesses, roadmap_page_keystone_holds).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the cursor REQUEST_CHANGES (4 findings) + the earlier claude section-3 prefix note. New HEAD pushed.

  1. section-5 broken witness (witness_empty_doc_is_minimal_shell): the dispatch client script now emits ONLY when the page has content. An empty doc has no dispatchable node, so shipping dead dispatch JS there was wrong anyway -- this keeps the existing witness green by construction rather than editing its assertion.
  2. section-3 env_var fork: the route config now consumes belt_dispatch_env_var from roadmap_belt_actuate (was a re-minted GUNBC_BELT_NODE_ID literal).
  3. section-3 repo_cwd fork: the config now consumes belt_actuate_workdir (was a re-minted /opt/gunbc/gunbc literal).
  4. section-3 route prefix (claude's note) + coverage (cursor finding 4): one belt_dispatch_path_prefix authority feeds both the server route and the client-JS fetch; and 4 new witnesses now exercise the dispatch surface --
    • roadmap_dashboard_emit_witnesses: emitted server has /dispatch/ + execFile + GUNBC_BELT_NODE_ID + belt_dispatch_node_cli, with a discriminating negative control that gunbhub (dispatch:Absent) has NEITHER execFile NOR /dispatch/.
    • roadmap_page_keystone_holds: an open node emits the button element + script + fetch prefix; a signed-off node emits no button element (exercises the done==signoff ruling -- a merged-but-unsigned node is 'review' and correctly still dispatchable).

Both aggregators pass green-by-execution on a freshly-rebuilt seed (my local binary was stale pre-#6848; the namespace-wave-1 name-derived loader resolves these no-import witnesses). Also verified the full HTTP round-trip live on srv1 on a scratch port (8099, live 8080 untouched): GET / serves the button, POST /dispatch/no-such-node execs belt_dispatch_node_cli and returns the fail-closed node_not_found receipt.

-- sent from royal-carp-451

@gunbai-bot

gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

Thanks -- approval noted (review 40303). Verified both non-blocking observations; leaving both as-is by design, since this is the interim scaffold belt B (#6940) retires wholesale:

  1. maxBuffer 10485760 (node_http_server_emit.dag:242) -- confirmed it is a ts_lit_num in the EMITTED TypeScript (the execFile options object), not a BeltDispatchRouteConfig field. The config type (lines 56-63) carries no maxBuffer, so there is nothing to type as ByteSize and no unit hard-blocker tripped. If it were ever hoisted to a .dag field I would make it a ByteSize -- but hoisting it would be polishing code slated for deletion, so I am not doing that now (section 6 -- do not invest in an interim scaffold's elegance).

  2. dispatch_client_js() medium-as-string (roadmap_page.dag:139) -- confirmed; same shape as roadmap_css(), escape-safe, and the interim note already flags it. Good catch that belt B's dissolution must include this String-medium JS alongside the exec-route swap, not just the transport; I have logged that so B does not leave the button JS behind. B's roadmap_serve serves the page in-process and the button POSTs to the same /dispatch/ prefix, so the client JS goes away with node_http_server_emit.

No code change. -- sent from royal-carp-451

@gunbai-bot

gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

Correction to my previous reply on observation 2 (precision matters): the client JS lives in roadmap_page.dag (dispatch_client_script), which is SHARED, not in node_http_server_emit. So it does NOT go away when B retires node_http_server_emit -- B serves the same roadmap_page in-process and INHERITS the button + client JS unchanged (they POST to the same /dispatch/ prefix, which B's roadmap_serve handles in-process). What B retires is the server-side exec ROUTE, not the client JS. Grounding the JS-as-String medium (dispatch_client_js) is therefore a separate, smaller debt that survives B -- the same medium-as-string shape as roadmap_css(), to be grounded whenever the client-JS medium gets the no-smuggled-programs treatment, independent of belt B. -- sent from royal-carp-451

@gunbai-bot

gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

Fixed (review 40304). node_http_server_emit now imports witness_layer_roots from gunbc.ci_layer_roots and sets source_roots: witness_layer_roots -- the same single corpus-root authority ci_spec / falsifier_workflow / merge_admission_produce / the tools transports consume. The re-minted [dag, src/v2] literal is gone; emitted exec args unchanged (--source-root dag --source-root src/v2) and roadmap_dashboard_emit_witnesses stays green by execution. Also merged latest main (picks up the #6944 regen self-host fixed-point fix). Pushed as ebe4488. -- sent from royal-carp-451

@gunbai-bot

gunbai-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

Thanks -- approval noted (review 40343). Verified both non-blocking observations; replying rather than committing, because the head is already 2/2-approved and a new commit resets the approval + a full CI cycle for polish on interim code B largely dissolves (section 6 -- do not over-invest in a scaffold slated for dissolution). Both are tracked, not dropped:

  1. dispatch_client_js() medium-as-string (roadmap_page.dag:139-147). Valid, and you have the sharper version of the point I corrected earlier on this PR: the client JS lives in roadmap_page (shared), so it SURVIVES belt B -- B serves the same roadmap_page in-process and inherits the button + JS. So the JS needs its OWN dissolution trigger (to a modeled browser-emit / TsProgram lane), independent of node_http_server_emit's belt-B trigger. I am flagging this to cool-wolf-720 so belt B's lane either gives dispatch_client_js its own dissolve-on or a follow-up does; it should not ride the exec-route's trigger.

  2. Button rendered on every non-done node vs /dispatch handler only on the dashboard spec (roadmap_page.dag:188,233). Verified there is NO live 404 today: gunbhub serves its own pages (gunbhub_browse_page / gunbhub_readme_page via gunbhub_served_static_route_table), never roadmap_page; and both actual consumers of roadmap_page -- the roadmap dashboard (Node /dispatch route) and belt B's roadmap_serve (in-process /dispatch) -- carry the route, so button and route travel together in every live host. The footgun is only a hypothetical future routeless host of roadmap_page. A spec-carried renders_dispatch: Bool is the clean guard if that ever happens; logging it as the tracked fix rather than threading a flag through interim render code now.

No code change on this PR. -- sent from royal-carp-451

@briansrls
briansrls merged commit c5cd4df into main Jul 20, 2026
3 checks passed
@briansrls
briansrls deleted the session/royal-carp-451 branch July 20, 2026 22:05
briansrls added a commit that referenced this pull request Jul 20, 2026
…elt_dispatch_node_cli (#6942)

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A review #6942: single-authority dispatch route prefix

Extract belt_dispatch_path_prefix (roadmap_page.dag) as the one authority
for the /dispatch/ route prefix; node_http_server_emit route config and the
client-JS fetch both consume it (was two lockstep string literals, DESIGN
section 3). Emit verified valid JS with all 4 derived occurrences.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A #6942: address cursor REQUEST_CHANGES (4 findings)

1. section-5 broken witness: dispatch_client_script now emits only when the
   page has content (empty doc has no dispatchable node, so shipping dead JS
   there was wrong) -- witness_empty_doc_is_minimal_shell stays green by
   construction instead of editing the assertion.
2. section-3 env_var fork: node_http_server_emit config consumes
   belt_dispatch_env_var (was a re-minted GUNBC_BELT_NODE_ID literal).
3. section-3 repo_cwd fork: config consumes belt_actuate_workdir (was a
   re-minted /opt/gunbc/gunbc literal).
4. coverage: 2 emit witnesses (roadmap has /dispatch/+execFile+env+cli-name;
   gunbhub negative control has neither -- discriminating on dispatch:Absent)
   and 2 page witnesses (open node emits button+script+fetch prefix;
   signed-off node emits no button element -- exercises the done==signoff
   ruling, since a merged-but-unsigned node is 'review' and still dispatchable).

Both witness aggregators green-by-execution on the fresh seed
(roadmap_dashboard_emit_witnesses, roadmap_page_keystone_holds).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 20, 2026
…ct from merged carriers

Only conflict was .github/live-deploy-srv1-apply.sh, a generated
projection (embeds ROADMAP.md) that both this PR and #6942 had
regenerated. Resolution: take main's copy, then re-run
generated_artifact_gate main_wet on the merged tree so the artifact is
derived from the merged carriers, never hand-merged (ExitSuccess).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Jul 20, 2026
…rogress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 21, 2026
…ashboard (#6931)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-4: chain B DONE, chain A single gate = comprehensive import-closure root fix

Delta-first refresh of the v1-deletion plan authority against this session's landings:
- witness_family_fanout -> DONE (all 9 families green + trustworthy controls: #6912/#6917/#6918)
- new milestone emit_import_closure_root: the multi-layer emit-import peel root-caused into
  ONE transitive-closure derivation (operator ruling 2026-07-20); FreeMonoid was one layer, not the gate
- probe_flip_fanout + deep_module_lanes -> both GATED on emit_import_closure_root (flip wave is
  NOT orthogonal; it shares the import-closure root and fans out in parallel with deep lanes on cargo-green)
- unresolved_error_diagnosis -> diagnosis DONE, partial fix landed #6906 (mid-peel)
- ci_floor_cutover -> ledger overlap-started #6915 with a §3 hand-declared-disposition defect to root-cause
- rulings recorded: root-cause not face-by-face; cargo-green + witness-green always (no mid-peel merges)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadmap; artifact is its projection

Operator: "your job is to get us to a full and confident plan — we can antagonize
it — make this a roadmap and the artifact a projection of it." The plan authority
now models the three-gate v1-delete bar directly (§3 single authority; the
selfhost-dashboard.html artifact projects it, delta-first):

- PlanGate enum groups every milestone under Gate 1 (emitter fixed point),
  Gate 2 (honest frontier), Gate 3 (ledger green), or GateDeletion.
- BrickState (Placed|InFlight|Gated) per milestone.
- ConfidenceBasis{basis, risk, antagonize} per milestone — the attack surface
  that makes the plan antagonizable item by item (the confidence-probe lane
  fills in risk/antagonize).
- PlanGateSpec rows carry each gate's name + what it proves.
- 23 bricks (was 13): adds generic_t_rendering, the Gate-2 property bricks
  (typed_frontier/frontier_dispositioned/no_frontier_lies), the Gate-3 ledger
  bricks (ledger_modeled/ledger_projection + the 3 spine receipts), and
  emit_representation_mismatch — the E0308 layer (~4400/deep module) the
  confidence-probe just exposed once generic-T cleared (quiet-bee #6924
  residual histogram). Rewired the Gate-1 chain so E0308 sits between the two
  known roots and the deep-module lanes.

NOT "27/27 modules flipped" — the doc string states the bar is emitter fixed
point + honest frontier + ledger green; some modules stay SeedRetained by
necessity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix parse error in roadmap: in-string braces trigger string interpolation

The cycle-5 remodel put literal braces in prose strings (SeedRetained{reason,
migration_trigger}). In the seed grammar `{...}` inside a string is
interpolation (render.dag escapes them as \{ \}; the seed has ExprStringInterp),
so `{reason, migration_trigger}` parsed as an interpolation expression and blew
the top-level item parser: "expected item declaration". The known-good cycle-4
file had zero in-string braces.

Fix: replaced the 3 occurrences with parens — SeedRetained(reason,
migration_trigger). Verified by execution with a discriminating control:
v1_src_dag_parse reds the pre-fix version with the exact CI error and greens
the fix.

Also folds quiet-bee's E0308 type-pair sizing into emit_representation_mismatch:
206 pairs but TOP 5 = 82% (Symbol/String ~2100 = one std fork, FreeMonoid/String
~1038, Vector/FreeMonoid ~150, Optional/Option ~150) — the layer is TRACTABLE
(3-4 construction walls at the authority, not 206 one-offs), so Gate-1 depth is
now bounded. Risk downgraded from "could dominate Gate 1" accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40244)

cursor/composer-2.5 REQUEST_CHANGES caught a real §3 gap: the prose
(ci_floor_cutover lane_state + critical_path_note) says the cutover is gated on
the ledger receipts, but no PlanDependency wired ledger_projection / the 3 spine
receipts into ci_floor_cutover — they pointed only at v1_delete. So the modeled
DAG allowed CI cutover (and transitively quarantine) before Gate 3 completed.

Fix: retarget the 4 Gate-3 receipt edges from v1_delete to ci_floor_cutover, so
Gate 3 -> ci_floor_cutover -> v1_quarantine -> v1_delete. Now every Gate-3
receipt transitively gates BOTH quarantine and delete (verified by execution:
reachability holds for all 4), with no redundant edge (the old direct
receipt->v1_delete edges are subsumed by the chain). Updated v1_quarantine and
v1_delete lane_state prose to state the transitive gating explicitly, so a reader
of the dependency list cannot treat either as reachable without the ledger green.

DAG re-verified acyclic (Kahn over all 23 milestones); parse-checked by execution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap convergence: three-gate progress on the srv1 dashboard (authority pages only) + regen golden

Render the v1-delete three-gate progress (Gate 1 emitter fixed point ·
Gate 2 honest frontier · Gate 3 ledger green) driven from
gunbc.v1_deletion_plan on the live srv1 roadmap dashboard `/` and
`/roadmap` pages — a single authority, no data duplication.

Fixes two CI-red witnesses from the first cut:
- roadmap_page_keystone_holds: the three-gate section had been spliced
  into the GENERIC roadmap_page(doc, merged) renderer, so it injected
  into every doc incl. the empty test doc, breaking the
  "empty doc -> empty <main>" invariant. Three-gate progress is
  AUTHORITY content (renders v1_deletion_plan), so route it through
  the _for_authority variants via a private _impl + main_prefix param
  (authority output byte-identical). Add
  witness_authority_shows_three_gate_progress as the positive
  coverage assertion (authority page HAS it; empty page is the
  discriminating RED control).
- live_deploy_emit_holds / witness_apply_script_matches_committed_golden:
  regenerate .github/live-deploy-srv1-apply.sh so the embedded server.js
  dashboard pages carry the three-gate content.

Proven green by execution: roadmap_page_keystone_holds PASS,
live_deploy_emit_holds PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Resolve #6942 merge: combine dispatch launch-button with three-gate progress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Review 40401 finding 2: three-gate widget renders only the 3 proving gates

cursor/composer-2.5 (REQUEST_CHANGES) correctly flagged that
three_gate_progress_markup() mapped all of v1_deletion_gates including
GateDeletion, rendering 4 rows under the "three gates" heading.
GateDeletion is downstream cutover/delete ("proves nothing on its own"
per the authority), not one of the three proving gates.

Filter to the proving gates via tg_is_bar_gate (GateDeletion => false);
the heading is now literally true. Witness asserts Gate 1/Gate 3 render
and "Cutover and delete" (GateDeletion's name) does NOT. Regenerated the
apply-script golden (cutover_rows=0). roadmap_page_keystone_holds PASS.

Finding 1 (exclude the non-bar-brick probe_flip_fanout from Gate 2's
count) needs a typed discriminator on PlanMilestone in the plan
authority — landing separately pending authority-edit confirmation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review 40401 finding 1: typed bar-brick discriminator excludes seed-shrink from gate counts

cursor/composer-2.5 correctly flagged that the gate progress counted
probe_flip_fanout in Gate 2's denominator even though the authority
declares the flip wave "not itself a bar-brick" (seed-shrink beyond the
fixed-point minimum) — so Gate 2 could never read 100%.

Fix (operator-cleared to edit the authority in this PR): add a typed
BrickRole = BarBrick | SeedShrink discriminator on PlanMilestone
(v1_deletion_plan.dag); probe_flip_fanout is the one SeedShrink, the
other 22 are BarBrick. The projection's tg_gate_bricks now filters to
bar-bricks, so tg_gate_total / tg_gate_placed / the remaining list all
exclude seed-shrink. Gate 2 reads 3/4, not 3/5.

Witness asserts the seed-shrink brick's title ("std_dup-gated modules")
does NOT render in the three-gate section (discriminating: removing the
filter reds it). Regenerated golden (seedshrink_leak=0).
roadmap_page_keystone_holds PASS, live_deploy_emit_holds PASS by
execution. Merged main (#6922 plan authority now landed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix host_standup witness stale after #6947 nbd_proxy typed-effect migration

declared_gap_steps_carry_interim_realization_authority required every
DeclaredGap's interim_realization to cite `ctrl:` OR (`extdeps.` AND
`gunbc.`). #6947 (Wave C3, merged to main) correctly migrated the
os-install-actuated gap's nbd_proxy realization from the extdeps shell
transport (`extdeps.bmc.webui.nbd_proxy_serve ShellProgram`) to a gunbc
typed host-effect (`gunbc.host_effect_nbd_proxy_serve`), a more-grounded
authority that no longer routes through an extdeps dep. The now-purely-
gunbc realization made the `(extdeps. AND gunbc.)` conjunction fail, so
the fold returned Bool(false) — a main-inherited CI red (owner session
crisp-bat-221 archived; no fix in flight).

Relax the over-specific conjunction to the invariant's actual intent: a
DeclaredGap must cite >=1 grounded authority — `ctrl:` OR `extdeps.` OR
`gunbc.`. Fail-closed property preserved: a gap citing NONE still reds;
ModeledCompose arm unchanged. RED proven by CI execution on 3644226
(returned Bool(false)); this greens it.

Also restores dag/test/fixture/m4_universal_governed_corpus.dag to
origin/main (a phantom auto-WIP edit had crept in during local repro).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 21, 2026
…e sync, no chown, granted-set only (#7011)

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A review #6942: single-authority dispatch route prefix

Extract belt_dispatch_path_prefix (roadmap_page.dag) as the one authority
for the /dispatch/ route prefix; node_http_server_emit route config and the
client-JS fetch both consume it (was two lockstep string literals, DESIGN
section 3). Emit verified valid JS with all 4 derived occurrences.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A #6942: address cursor REQUEST_CHANGES (4 findings)

1. section-5 broken witness: dispatch_client_script now emits only when the
   page has content (empty doc has no dispatchable node, so shipping dead JS
   there was wrong) -- witness_empty_doc_is_minimal_shell stays green by
   construction instead of editing the assertion.
2. section-3 env_var fork: node_http_server_emit config consumes
   belt_dispatch_env_var (was a re-minted GUNBC_BELT_NODE_ID literal).
3. section-3 repo_cwd fork: config consumes belt_actuate_workdir (was a
   re-minted /opt/gunbc/gunbc literal).
4. coverage: 2 emit witnesses (roadmap has /dispatch/+execFile+env+cli-name;
   gunbhub negative control has neither -- discriminating on dispatch:Absent)
   and 2 page witnesses (open node emits button+script+fetch prefix;
   signed-off node emits no button element -- exercises the done==signoff
   ruling, since a merged-but-unsigned node is 'review' and still dispatchable).

Both witness aggregators green-by-execution on the fresh seed
(roadmap_dashboard_emit_witnesses, roadmap_page_keystone_holds).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* temp: srv1 runner diagnostic workflow (read-only; removed before PR)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* temp: extend srv1 diag with perms chain + grant reality-check

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* live-deploy: unprivileged ci-runner principal — tree sync as service user, no chown, granted-set only

The belt-B apply script's bare rsync/chown claimed 'Principal: ROOT (actions-runner
User=root)' from a hand ssh verification that contradicted the repo's own single
authority (gunbc.fleet_posix_accounts FleetAccountCiRunner: ghrunner, five NOPASSWD
grants — apt-get/install/systemctl/tailscale/rm). Reality sided with the authority:
deploy run 29822498755 (the first post-belt-B main push) died on rsync EACCES /
chgrp EPERM into the briansrls-owned tree, so the srv1 dashboard never flipped to
gunbc serve, and every subsequent main-push deploy fails the same way.

Fix stays entirely inside the already-provisioned grant set (no new sudoers row,
no host action needed):
- directories + binary install with -o/-g service-user via granted install —
  ownership at creation; every chown -R fixup deleted (the wrongly-owned
  intermediate state is now unwritable, not repaired)
- the tree sync runs AS the service user via gunbc-tree-sync.service (oneshot,
  User=briansrls, EnvironmentFile carries the per-slot runner checkout path),
  installed + started through granted install/systemctl; rsync flags -rlpt not -a
  (owner/group replication would chgrp-EPERM for a non-super receiver)
- teardown rm goes through granted rm; rmdir becomes rm -d (same empty-dir
  refusal wall for live dispatch worktrees)
- principal notes re-grounded on fleet_posix_accounts; the ROOT fork dissolved
  (spec + emit); goldens regenerated via main_wet

Witnesses: live_deploy_emit_holds green by execution with a new discriminating
witness_scripts_stay_within_ci_runner_grants (RED proven: -a perturbation fails
it); apply/intent/operations/readiness/service_ready + ci_deploy + host_standup
spine witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 22, 2026
…ion + full 21-module probe sweep (#7040)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-4: chain B DONE, chain A single gate = comprehensive import-closure root fix

Delta-first refresh of the v1-deletion plan authority against this session's landings:
- witness_family_fanout -> DONE (all 9 families green + trustworthy controls: #6912/#6917/#6918)
- new milestone emit_import_closure_root: the multi-layer emit-import peel root-caused into
  ONE transitive-closure derivation (operator ruling 2026-07-20); FreeMonoid was one layer, not the gate
- probe_flip_fanout + deep_module_lanes -> both GATED on emit_import_closure_root (flip wave is
  NOT orthogonal; it shares the import-closure root and fans out in parallel with deep lanes on cargo-green)
- unresolved_error_diagnosis -> diagnosis DONE, partial fix landed #6906 (mid-peel)
- ci_floor_cutover -> ledger overlap-started #6915 with a §3 hand-declared-disposition defect to root-cause
- rulings recorded: root-cause not face-by-face; cargo-green + witness-green always (no mid-peel merges)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadmap; artifact is its projection

Operator: "your job is to get us to a full and confident plan — we can antagonize
it — make this a roadmap and the artifact a projection of it." The plan authority
now models the three-gate v1-delete bar directly (§3 single authority; the
selfhost-dashboard.html artifact projects it, delta-first):

- PlanGate enum groups every milestone under Gate 1 (emitter fixed point),
  Gate 2 (honest frontier), Gate 3 (ledger green), or GateDeletion.
- BrickState (Placed|InFlight|Gated) per milestone.
- ConfidenceBasis{basis, risk, antagonize} per milestone — the attack surface
  that makes the plan antagonizable item by item (the confidence-probe lane
  fills in risk/antagonize).
- PlanGateSpec rows carry each gate's name + what it proves.
- 23 bricks (was 13): adds generic_t_rendering, the Gate-2 property bricks
  (typed_frontier/frontier_dispositioned/no_frontier_lies), the Gate-3 ledger
  bricks (ledger_modeled/ledger_projection + the 3 spine receipts), and
  emit_representation_mismatch — the E0308 layer (~4400/deep module) the
  confidence-probe just exposed once generic-T cleared (quiet-bee #6924
  residual histogram). Rewired the Gate-1 chain so E0308 sits between the two
  known roots and the deep-module lanes.

NOT "27/27 modules flipped" — the doc string states the bar is emitter fixed
point + honest frontier + ledger green; some modules stay SeedRetained by
necessity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix parse error in roadmap: in-string braces trigger string interpolation

The cycle-5 remodel put literal braces in prose strings (SeedRetained{reason,
migration_trigger}). In the seed grammar `{...}` inside a string is
interpolation (render.dag escapes them as \{ \}; the seed has ExprStringInterp),
so `{reason, migration_trigger}` parsed as an interpolation expression and blew
the top-level item parser: "expected item declaration". The known-good cycle-4
file had zero in-string braces.

Fix: replaced the 3 occurrences with parens — SeedRetained(reason,
migration_trigger). Verified by execution with a discriminating control:
v1_src_dag_parse reds the pre-fix version with the exact CI error and greens
the fix.

Also folds quiet-bee's E0308 type-pair sizing into emit_representation_mismatch:
206 pairs but TOP 5 = 82% (Symbol/String ~2100 = one std fork, FreeMonoid/String
~1038, Vector/FreeMonoid ~150, Optional/Option ~150) — the layer is TRACTABLE
(3-4 construction walls at the authority, not 206 one-offs), so Gate-1 depth is
now bounded. Risk downgraded from "could dominate Gate 1" accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40244)

cursor/composer-2.5 REQUEST_CHANGES caught a real §3 gap: the prose
(ci_floor_cutover lane_state + critical_path_note) says the cutover is gated on
the ledger receipts, but no PlanDependency wired ledger_projection / the 3 spine
receipts into ci_floor_cutover — they pointed only at v1_delete. So the modeled
DAG allowed CI cutover (and transitively quarantine) before Gate 3 completed.

Fix: retarget the 4 Gate-3 receipt edges from v1_delete to ci_floor_cutover, so
Gate 3 -> ci_floor_cutover -> v1_quarantine -> v1_delete. Now every Gate-3
receipt transitively gates BOTH quarantine and delete (verified by execution:
reachability holds for all 4), with no redundant edge (the old direct
receipt->v1_delete edges are subsumed by the chain). Updated v1_quarantine and
v1_delete lane_state prose to state the transitive gating explicitly, so a reader
of the dependency list cannot treat either as reachable without the ledger green.

DAG re-verified acyclic (Kahn over all 23 milestones); parse-checked by execution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap convergence: three-gate progress on the srv1 dashboard (authority pages only) + regen golden

Render the v1-delete three-gate progress (Gate 1 emitter fixed point ·
Gate 2 honest frontier · Gate 3 ledger green) driven from
gunbc.v1_deletion_plan on the live srv1 roadmap dashboard `/` and
`/roadmap` pages — a single authority, no data duplication.

Fixes two CI-red witnesses from the first cut:
- roadmap_page_keystone_holds: the three-gate section had been spliced
  into the GENERIC roadmap_page(doc, merged) renderer, so it injected
  into every doc incl. the empty test doc, breaking the
  "empty doc -> empty <main>" invariant. Three-gate progress is
  AUTHORITY content (renders v1_deletion_plan), so route it through
  the _for_authority variants via a private _impl + main_prefix param
  (authority output byte-identical). Add
  witness_authority_shows_three_gate_progress as the positive
  coverage assertion (authority page HAS it; empty page is the
  discriminating RED control).
- live_deploy_emit_holds / witness_apply_script_matches_committed_golden:
  regenerate .github/live-deploy-srv1-apply.sh so the embedded server.js
  dashboard pages carry the three-gate content.

Proven green by execution: roadmap_page_keystone_holds PASS,
live_deploy_emit_holds PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Resolve #6942 merge: combine dispatch launch-button with three-gate progress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Review 40401 finding 2: three-gate widget renders only the 3 proving gates

cursor/composer-2.5 (REQUEST_CHANGES) correctly flagged that
three_gate_progress_markup() mapped all of v1_deletion_gates including
GateDeletion, rendering 4 rows under the "three gates" heading.
GateDeletion is downstream cutover/delete ("proves nothing on its own"
per the authority), not one of the three proving gates.

Filter to the proving gates via tg_is_bar_gate (GateDeletion => false);
the heading is now literally true. Witness asserts Gate 1/Gate 3 render
and "Cutover and delete" (GateDeletion's name) does NOT. Regenerated the
apply-script golden (cutover_rows=0). roadmap_page_keystone_holds PASS.

Finding 1 (exclude the non-bar-brick probe_flip_fanout from Gate 2's
count) needs a typed discriminator on PlanMilestone in the plan
authority — landing separately pending authority-edit confirmation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review 40401 finding 1: typed bar-brick discriminator excludes seed-shrink from gate counts

cursor/composer-2.5 correctly flagged that the gate progress counted
probe_flip_fanout in Gate 2's denominator even though the authority
declares the flip wave "not itself a bar-brick" (seed-shrink beyond the
fixed-point minimum) — so Gate 2 could never read 100%.

Fix (operator-cleared to edit the authority in this PR): add a typed
BrickRole = BarBrick | SeedShrink discriminator on PlanMilestone
(v1_deletion_plan.dag); probe_flip_fanout is the one SeedShrink, the
other 22 are BarBrick. The projection's tg_gate_bricks now filters to
bar-bricks, so tg_gate_total / tg_gate_placed / the remaining list all
exclude seed-shrink. Gate 2 reads 3/4, not 3/5.

Witness asserts the seed-shrink brick's title ("std_dup-gated modules")
does NOT render in the three-gate section (discriminating: removing the
filter reds it). Regenerated golden (seedshrink_leak=0).
roadmap_page_keystone_holds PASS, live_deploy_emit_holds PASS by
execution. Merged main (#6922 plan authority now landed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix host_standup witness stale after #6947 nbd_proxy typed-effect migration

declared_gap_steps_carry_interim_realization_authority required every
DeclaredGap's interim_realization to cite `ctrl:` OR (`extdeps.` AND
`gunbc.`). #6947 (Wave C3, merged to main) correctly migrated the
os-install-actuated gap's nbd_proxy realization from the extdeps shell
transport (`extdeps.bmc.webui.nbd_proxy_serve ShellProgram`) to a gunbc
typed host-effect (`gunbc.host_effect_nbd_proxy_serve`), a more-grounded
authority that no longer routes through an extdeps dep. The now-purely-
gunbc realization made the `(extdeps. AND gunbc.)` conjunction fail, so
the fold returned Bool(false) — a main-inherited CI red (owner session
crisp-bat-221 archived; no fix in flight).

Relax the over-specific conjunction to the invariant's actual intent: a
DeclaredGap must cite >=1 grounded authority — `ctrl:` OR `extdeps.` OR
`gunbc.`. Fail-closed property preserved: a gap citing NONE still reds;
ModeledCompose arm unchanged. RED proven by CI execution on 3644226
(returned Bool(false)); this greens it.

Also restores dag/test/fixture/m4_universal_governed_corpus.dag to
origin/main (a phantom auto-WIP edit had crept in during local repro).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Honest frontier refresh 2026-07-22: namespace-terminal trigger refuted by execution; full 21-module probe sweep

Operator-directed disentangle: a blocker edge without a named MEASURED reason is removed.

- 03_resolve + 03_name_resolve re-declared knowledge_attributed -> execution_measured:
  03_resolve = generic-T render class (E0425 cannot find type T; new reason row
  curated_cargo_probe_generic_type_render), 03_name_resolve = cssl_assemble refuse
  (unroutable gunbc_plans_md_helpers closure reach). Both triggers ->
  migrate_when_closure_self_emits_cargo_green (the 04_infer pattern); the
  migrate_when_namespace_only_resolution_lands trigger no longer appears anywhere.
- Full-frontier sweep TSV (21/21 modules, deduped, provenance header): 4 generic-T
  (03_resolve, 04_infer, 05_eval, fold_lowering), 1 value-qualified
  (materialization_carriers), 2 render residues (02_parse dotted, 01_tokenize
  struct-literal-path), 13 HARNESS_REFUSE on ONE root (test_claim_materialization_ladder_witness
  pulled into compiler closures; + gunbc.plans on 03_name_resolve), 1 false-red
  (03_normalize, lane shim required).
- Verified by execution: frontier compile differential clean (135 pre-existing on
  entry, 0 added), frontier_classify_unlisted_reason_refuses_holds green, 10/10
  compiler_frontier_census witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 22, 2026
…loy refusal (stopped-line audit, no widened probe) (#7038)

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A review #6942: single-authority dispatch route prefix

Extract belt_dispatch_path_prefix (roadmap_page.dag) as the one authority
for the /dispatch/ route prefix; node_http_server_emit route config and the
client-JS fetch both consume it (was two lockstep string literals, DESIGN
section 3). Emit verified valid JS with all 4 derived occurrences.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A #6942: address cursor REQUEST_CHANGES (4 findings)

1. section-5 broken witness: dispatch_client_script now emits only when the
   page has content (empty doc has no dispatchable node, so shipping dead JS
   there was wrong) -- witness_empty_doc_is_minimal_shell stays green by
   construction instead of editing the assertion.
2. section-3 env_var fork: node_http_server_emit config consumes
   belt_dispatch_env_var (was a re-minted GUNBC_BELT_NODE_ID literal).
3. section-3 repo_cwd fork: config consumes belt_actuate_workdir (was a
   re-minted /opt/gunbc/gunbc literal).
4. coverage: 2 emit witnesses (roadmap has /dispatch/+execFile+env+cli-name;
   gunbhub negative control has neither -- discriminating on dispatch:Absent)
   and 2 page witnesses (open node emits button+script+fetch prefix;
   signed-off node emits no button element -- exercises the done==signoff
   ruling, since a merged-but-unsigned node is 'review' and still dispatchable).

Both witness aggregators green-by-execution on the fresh seed
(roadmap_dashboard_emit_witnesses, roadmap_page_keystone_holds).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* temp: srv1 runner diagnostic workflow (read-only; removed before PR)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* temp: extend srv1 diag with perms chain + grant reality-check

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* live-deploy: unprivileged ci-runner principal — tree sync as service user, no chown, granted-set only

The belt-B apply script's bare rsync/chown claimed 'Principal: ROOT (actions-runner
User=root)' from a hand ssh verification that contradicted the repo's own single
authority (gunbc.fleet_posix_accounts FleetAccountCiRunner: ghrunner, five NOPASSWD
grants — apt-get/install/systemctl/tailscale/rm). Reality sided with the authority:
deploy run 29822498755 (the first post-belt-B main push) died on rsync EACCES /
chgrp EPERM into the briansrls-owned tree, so the srv1 dashboard never flipped to
gunbc serve, and every subsequent main-push deploy fails the same way.

Fix stays entirely inside the already-provisioned grant set (no new sudoers row,
no host action needed):
- directories + binary install with -o/-g service-user via granted install —
  ownership at creation; every chown -R fixup deleted (the wrongly-owned
  intermediate state is now unwritable, not repaired)
- the tree sync runs AS the service user via gunbc-tree-sync.service (oneshot,
  User=briansrls, EnvironmentFile carries the per-slot runner checkout path),
  installed + started through granted install/systemctl; rsync flags -rlpt not -a
  (owner/group replication would chgrp-EPERM for a non-super receiver)
- teardown rm goes through granted rm; rmdir becomes rm -d (same empty-dir
  refusal wall for live dispatch worktrees)
- principal notes re-grounded on fleet_posix_accounts; the ROOT fork dissolved
  (spec + emit); goldens regenerated via main_wet

Witnesses: live_deploy_emit_holds green by execution with a new discriminating
witness_scripts_stay_within_ci_runner_grants (RED proven: -a perturbation fails
it); apply/intent/operations/readiness/service_ready + ci_deploy + host_standup
spine witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* UnitDiagnosis becomes a real coproduct; collapse the duplicate reason renderer

review 41182 / 41189 (REQUEST_CHANGES), both valid:

1. unit_diagnosis was a String whose absence was encoded as a reserved
   sentinel, disambiguated by string equality. That makes 'nothing was
   captured' and 'the unit emitted the sentinel text' the same
   representation -- an illegal state that is representable, and a
   cross-representation == straddle. It also contradicted the field's own
   note, which exists to argue against exactly this conflation.

   Now: type UnitDiagnosis = UnitDiagnosisUnavailable
                           | UnitDiagnosisCaptured { text: String }
   Absence is a variant. Rendering matches. No comparison against a magic
   value exists anywhere -- the sentinel data decl is deleted, the
   constructor parameter is retyped, and all witnesses construct variants.

2. The ' unit_diagnosis=' segment was composed in two places (the renderer
   and a deploy-entry helper) -- two authorities for one format. The entry
   now rebuilds the ServiceNotReady via service_not_ready_with_captured_
   diagnosis and re-renders through service_not_ready_reason, so exactly
   one site composes the segment. Verified: 1 occurrence in dag/gunbc.

   This needed the poller to hand the refusal RECORD up rather than a
   rendered string, hence ServiceReadyPollOutcome (PollSettled |
   PollRefusedAtBound). The recursive poller stays pure of the capture
   effect; live_deploy_poll_service_ready_after_attempts is now a thin
   renderer over the outcome, so the hermetic witness is unchanged.

Also corrected the placement note, which still described the deleted
sentinel -- same symmetry the poll-bound rationale fix was about.

Witnesses green: service_ready, readiness, apply, intent. Red control
still effect-free (zero shell effects).

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 22, 2026
* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A review #6942: single-authority dispatch route prefix

Extract belt_dispatch_path_prefix (roadmap_page.dag) as the one authority
for the /dispatch/ route prefix; node_http_server_emit route config and the
client-JS fetch both consume it (was two lockstep string literals, DESIGN
section 3). Emit verified valid JS with all 4 derived occurrences.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* Belt A #6942: address cursor REQUEST_CHANGES (4 findings)

1. section-5 broken witness: dispatch_client_script now emits only when the
   page has content (empty doc has no dispatchable node, so shipping dead JS
   there was wrong) -- witness_empty_doc_is_minimal_shell stays green by
   construction instead of editing the assertion.
2. section-3 env_var fork: node_http_server_emit config consumes
   belt_dispatch_env_var (was a re-minted GUNBC_BELT_NODE_ID literal).
3. section-3 repo_cwd fork: config consumes belt_actuate_workdir (was a
   re-minted /opt/gunbc/gunbc literal).
4. coverage: 2 emit witnesses (roadmap has /dispatch/+execFile+env+cli-name;
   gunbhub negative control has neither -- discriminating on dispatch:Absent)
   and 2 page witnesses (open node emits button+script+fetch prefix;
   signed-off node emits no button element -- exercises the done==signoff
   ruling, since a merged-but-unsigned node is 'review' and still dispatchable).

Both witness aggregators green-by-execution on the fresh seed
(roadmap_dashboard_emit_witnesses, roadmap_page_keystone_holds).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* temp: srv1 runner diagnostic workflow (read-only; removed before PR)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* temp: extend srv1 diag with perms chain + grant reality-check

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* live-deploy: unprivileged ci-runner principal — tree sync as service user, no chown, granted-set only

The belt-B apply script's bare rsync/chown claimed 'Principal: ROOT (actions-runner
User=root)' from a hand ssh verification that contradicted the repo's own single
authority (gunbc.fleet_posix_accounts FleetAccountCiRunner: ghrunner, five NOPASSWD
grants — apt-get/install/systemctl/tailscale/rm). Reality sided with the authority:
deploy run 29822498755 (the first post-belt-B main push) died on rsync EACCES /
chgrp EPERM into the briansrls-owned tree, so the srv1 dashboard never flipped to
gunbc serve, and every subsequent main-push deploy fails the same way.

Fix stays entirely inside the already-provisioned grant set (no new sudoers row,
no host action needed):
- directories + binary install with -o/-g service-user via granted install —
  ownership at creation; every chown -R fixup deleted (the wrongly-owned
  intermediate state is now unwritable, not repaired)
- the tree sync runs AS the service user via gunbc-tree-sync.service (oneshot,
  User=briansrls, EnvironmentFile carries the per-slot runner checkout path),
  installed + started through granted install/systemctl; rsync flags -rlpt not -a
  (owner/group replication would chgrp-EPERM for a non-super receiver)
- teardown rm goes through granted rm; rmdir becomes rm -d (same empty-dir
  refusal wall for live dispatch worktrees)
- principal notes re-grounded on fleet_posix_accounts; the ROOT fork dissolved
  (spec + emit); goldens regenerated via main_wet

Witnesses: live_deploy_emit_holds green by execution with a new discriminating
witness_scripts_stay_within_ci_runner_grants (RED proven: -a perturbation fails
it); apply/intent/operations/readiness/service_ready + ci_deploy + host_standup
spine witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* WIP: dag roadmap work

* UnitDiagnosis becomes a real coproduct; collapse the duplicate reason renderer

review 41182 / 41189 (REQUEST_CHANGES), both valid:

1. unit_diagnosis was a String whose absence was encoded as a reserved
   sentinel, disambiguated by string equality. That makes 'nothing was
   captured' and 'the unit emitted the sentinel text' the same
   representation -- an illegal state that is representable, and a
   cross-representation == straddle. It also contradicted the field's own
   note, which exists to argue against exactly this conflation.

   Now: type UnitDiagnosis = UnitDiagnosisUnavailable
                           | UnitDiagnosisCaptured { text: String }
   Absence is a variant. Rendering matches. No comparison against a magic
   value exists anywhere -- the sentinel data decl is deleted, the
   constructor parameter is retyped, and all witnesses construct variants.

2. The ' unit_diagnosis=' segment was composed in two places (the renderer
   and a deploy-entry helper) -- two authorities for one format. The entry
   now rebuilds the ServiceNotReady via service_not_ready_with_captured_
   diagnosis and re-renders through service_not_ready_reason, so exactly
   one site composes the segment. Verified: 1 occurrence in dag/gunbc.

   This needed the poller to hand the refusal RECORD up rather than a
   rendered string, hence ServiceReadyPollOutcome (PollSettled |
   PollRefusedAtBound). The recursive poller stays pure of the capture
   effect; live_deploy_poll_service_ready_after_attempts is now a thin
   renderer over the outcome, so the hermetic witness is unchanged.

Also corrected the placement note, which still described the deleted
sentinel -- same symmetry the poll-bound rationale fix was about.

Witnesses green: service_ready, readiness, apply, intent. Red control
still effect-free (zero shell effects).

* WIP: dag roadmap work

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 22, 2026
…missing named as successor class; 05_eval + 06_translate upgraded to execution_measured (#7058)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-4: chain B DONE, chain A single gate = comprehensive import-closure root fix

Delta-first refresh of the v1-deletion plan authority against this session's landings:
- witness_family_fanout -> DONE (all 9 families green + trustworthy controls: #6912/#6917/#6918)
- new milestone emit_import_closure_root: the multi-layer emit-import peel root-caused into
  ONE transitive-closure derivation (operator ruling 2026-07-20); FreeMonoid was one layer, not the gate
- probe_flip_fanout + deep_module_lanes -> both GATED on emit_import_closure_root (flip wave is
  NOT orthogonal; it shares the import-closure root and fans out in parallel with deep lanes on cargo-green)
- unresolved_error_diagnosis -> diagnosis DONE, partial fix landed #6906 (mid-peel)
- ci_floor_cutover -> ledger overlap-started #6915 with a §3 hand-declared-disposition defect to root-cause
- rulings recorded: root-cause not face-by-face; cargo-green + witness-green always (no mid-peel merges)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadmap; artifact is its projection

Operator: "your job is to get us to a full and confident plan — we can antagonize
it — make this a roadmap and the artifact a projection of it." The plan authority
now models the three-gate v1-delete bar directly (§3 single authority; the
selfhost-dashboard.html artifact projects it, delta-first):

- PlanGate enum groups every milestone under Gate 1 (emitter fixed point),
  Gate 2 (honest frontier), Gate 3 (ledger green), or GateDeletion.
- BrickState (Placed|InFlight|Gated) per milestone.
- ConfidenceBasis{basis, risk, antagonize} per milestone — the attack surface
  that makes the plan antagonizable item by item (the confidence-probe lane
  fills in risk/antagonize).
- PlanGateSpec rows carry each gate's name + what it proves.
- 23 bricks (was 13): adds generic_t_rendering, the Gate-2 property bricks
  (typed_frontier/frontier_dispositioned/no_frontier_lies), the Gate-3 ledger
  bricks (ledger_modeled/ledger_projection + the 3 spine receipts), and
  emit_representation_mismatch — the E0308 layer (~4400/deep module) the
  confidence-probe just exposed once generic-T cleared (quiet-bee #6924
  residual histogram). Rewired the Gate-1 chain so E0308 sits between the two
  known roots and the deep-module lanes.

NOT "27/27 modules flipped" — the doc string states the bar is emitter fixed
point + honest frontier + ledger green; some modules stay SeedRetained by
necessity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix parse error in roadmap: in-string braces trigger string interpolation

The cycle-5 remodel put literal braces in prose strings (SeedRetained{reason,
migration_trigger}). In the seed grammar `{...}` inside a string is
interpolation (render.dag escapes them as \{ \}; the seed has ExprStringInterp),
so `{reason, migration_trigger}` parsed as an interpolation expression and blew
the top-level item parser: "expected item declaration". The known-good cycle-4
file had zero in-string braces.

Fix: replaced the 3 occurrences with parens — SeedRetained(reason,
migration_trigger). Verified by execution with a discriminating control:
v1_src_dag_parse reds the pre-fix version with the exact CI error and greens
the fix.

Also folds quiet-bee's E0308 type-pair sizing into emit_representation_mismatch:
206 pairs but TOP 5 = 82% (Symbol/String ~2100 = one std fork, FreeMonoid/String
~1038, Vector/FreeMonoid ~150, Optional/Option ~150) — the layer is TRACTABLE
(3-4 construction walls at the authority, not 206 one-offs), so Gate-1 depth is
now bounded. Risk downgraded from "could dominate Gate 1" accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40244)

cursor/composer-2.5 REQUEST_CHANGES caught a real §3 gap: the prose
(ci_floor_cutover lane_state + critical_path_note) says the cutover is gated on
the ledger receipts, but no PlanDependency wired ledger_projection / the 3 spine
receipts into ci_floor_cutover — they pointed only at v1_delete. So the modeled
DAG allowed CI cutover (and transitively quarantine) before Gate 3 completed.

Fix: retarget the 4 Gate-3 receipt edges from v1_delete to ci_floor_cutover, so
Gate 3 -> ci_floor_cutover -> v1_quarantine -> v1_delete. Now every Gate-3
receipt transitively gates BOTH quarantine and delete (verified by execution:
reachability holds for all 4), with no redundant edge (the old direct
receipt->v1_delete edges are subsumed by the chain). Updated v1_quarantine and
v1_delete lane_state prose to state the transitive gating explicitly, so a reader
of the dependency list cannot treat either as reachable without the ledger green.

DAG re-verified acyclic (Kahn over all 23 milestones); parse-checked by execution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap convergence: three-gate progress on the srv1 dashboard (authority pages only) + regen golden

Render the v1-delete three-gate progress (Gate 1 emitter fixed point ·
Gate 2 honest frontier · Gate 3 ledger green) driven from
gunbc.v1_deletion_plan on the live srv1 roadmap dashboard `/` and
`/roadmap` pages — a single authority, no data duplication.

Fixes two CI-red witnesses from the first cut:
- roadmap_page_keystone_holds: the three-gate section had been spliced
  into the GENERIC roadmap_page(doc, merged) renderer, so it injected
  into every doc incl. the empty test doc, breaking the
  "empty doc -> empty <main>" invariant. Three-gate progress is
  AUTHORITY content (renders v1_deletion_plan), so route it through
  the _for_authority variants via a private _impl + main_prefix param
  (authority output byte-identical). Add
  witness_authority_shows_three_gate_progress as the positive
  coverage assertion (authority page HAS it; empty page is the
  discriminating RED control).
- live_deploy_emit_holds / witness_apply_script_matches_committed_golden:
  regenerate .github/live-deploy-srv1-apply.sh so the embedded server.js
  dashboard pages carry the three-gate content.

Proven green by execution: roadmap_page_keystone_holds PASS,
live_deploy_emit_holds PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Resolve #6942 merge: combine dispatch launch-button with three-gate progress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Review 40401 finding 2: three-gate widget renders only the 3 proving gates

cursor/composer-2.5 (REQUEST_CHANGES) correctly flagged that
three_gate_progress_markup() mapped all of v1_deletion_gates including
GateDeletion, rendering 4 rows under the "three gates" heading.
GateDeletion is downstream cutover/delete ("proves nothing on its own"
per the authority), not one of the three proving gates.

Filter to the proving gates via tg_is_bar_gate (GateDeletion => false);
the heading is now literally true. Witness asserts Gate 1/Gate 3 render
and "Cutover and delete" (GateDeletion's name) does NOT. Regenerated the
apply-script golden (cutover_rows=0). roadmap_page_keystone_holds PASS.

Finding 1 (exclude the non-bar-brick probe_flip_fanout from Gate 2's
count) needs a typed discriminator on PlanMilestone in the plan
authority — landing separately pending authority-edit confirmation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review 40401 finding 1: typed bar-brick discriminator excludes seed-shrink from gate counts

cursor/composer-2.5 correctly flagged that the gate progress counted
probe_flip_fanout in Gate 2's denominator even though the authority
declares the flip wave "not itself a bar-brick" (seed-shrink beyond the
fixed-point minimum) — so Gate 2 could never read 100%.

Fix (operator-cleared to edit the authority in this PR): add a typed
BrickRole = BarBrick | SeedShrink discriminator on PlanMilestone
(v1_deletion_plan.dag); probe_flip_fanout is the one SeedShrink, the
other 22 are BarBrick. The projection's tg_gate_bricks now filters to
bar-bricks, so tg_gate_total / tg_gate_placed / the remaining list all
exclude seed-shrink. Gate 2 reads 3/4, not 3/5.

Witness asserts the seed-shrink brick's title ("std_dup-gated modules")
does NOT render in the three-gate section (discriminating: removing the
filter reds it). Regenerated golden (seedshrink_leak=0).
roadmap_page_keystone_holds PASS, live_deploy_emit_holds PASS by
execution. Merged main (#6922 plan authority now landed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix host_standup witness stale after #6947 nbd_proxy typed-effect migration

declared_gap_steps_carry_interim_realization_authority required every
DeclaredGap's interim_realization to cite `ctrl:` OR (`extdeps.` AND
`gunbc.`). #6947 (Wave C3, merged to main) correctly migrated the
os-install-actuated gap's nbd_proxy realization from the extdeps shell
transport (`extdeps.bmc.webui.nbd_proxy_serve ShellProgram`) to a gunbc
typed host-effect (`gunbc.host_effect_nbd_proxy_serve`), a more-grounded
authority that no longer routes through an extdeps dep. The now-purely-
gunbc realization made the `(extdeps. AND gunbc.)` conjunction fail, so
the fold returned Bool(false) — a main-inherited CI red (owner session
crisp-bat-221 archived; no fix in flight).

Relax the over-specific conjunction to the invariant's actual intent: a
DeclaredGap must cite >=1 grounded authority — `ctrl:` OR `extdeps.` OR
`gunbc.`. Fail-closed property preserved: a gap citing NONE still reds;
ModeledCompose arm unchanged. RED proven by CI execution on 3644226
(returned Bool(false)); this greens it.

Also restores dag/test/fixture/m4_universal_governed_corpus.dag to
origin/main (a phantom auto-WIP edit had crept in during local repro).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Honest frontier refresh 2026-07-22: namespace-terminal trigger refuted by execution; full 21-module probe sweep

Operator-directed disentangle: a blocker edge without a named MEASURED reason is removed.

- 03_resolve + 03_name_resolve re-declared knowledge_attributed -> execution_measured:
  03_resolve = generic-T render class (E0425 cannot find type T; new reason row
  curated_cargo_probe_generic_type_render), 03_name_resolve = cssl_assemble refuse
  (unroutable gunbc_plans_md_helpers closure reach). Both triggers ->
  migrate_when_closure_self_emits_cargo_green (the 04_infer pattern); the
  migrate_when_namespace_only_resolution_lands trigger no longer appears anywhere.
- Full-frontier sweep TSV (21/21 modules, deduped, provenance header): 4 generic-T
  (03_resolve, 04_infer, 05_eval, fold_lowering), 1 value-qualified
  (materialization_carriers), 2 render residues (02_parse dotted, 01_tokenize
  struct-literal-path), 13 HARNESS_REFUSE on ONE root (test_claim_materialization_ladder_witness
  pulled into compiler closures; + gunbc.plans on 03_name_resolve), 1 false-red
  (03_normalize, lane shim required).
- Verified by execution: frontier compile differential clean (135 pre-existing on
  entry, 0 added), frontier_classify_unlisted_reason_refuses_holds green, 10/10
  compiler_frontier_census witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Post-merge honest frontier re-sweep (13 modules): generic-T class DEAD, type-ref-import-missing is the successor class on 5 modules (3 unique symbols); 05_eval + 06_translate knowledge_attributed -> execution_measured; emit-shape + struct-literal-body classes named; materialization_carriers advanced off import-closure. Receipts in TSV + honest_frontier_refresh_2026_07_22_post_merge_note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* review 41418: upgrade compiler_frontier_row_05_emit knowledge_attributed -> execution_measured (TSV row 05_emit E0433 UriScheme landed by the resumed background sweep after the 13-row read) — roster and receipt back to one authority

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Remove scratch rank probe swept in by auto-WIP commit (probe served its purpose: sweep-order ranks verified against frontier authority)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Jul 23, 2026
…ion receipts (#7092)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-4: chain B DONE, chain A single gate = comprehensive import-closure root fix

Delta-first refresh of the v1-deletion plan authority against this session's landings:
- witness_family_fanout -> DONE (all 9 families green + trustworthy controls: #6912/#6917/#6918)
- new milestone emit_import_closure_root: the multi-layer emit-import peel root-caused into
  ONE transitive-closure derivation (operator ruling 2026-07-20); FreeMonoid was one layer, not the gate
- probe_flip_fanout + deep_module_lanes -> both GATED on emit_import_closure_root (flip wave is
  NOT orthogonal; it shares the import-closure root and fans out in parallel with deep lanes on cargo-green)
- unresolved_error_diagnosis -> diagnosis DONE, partial fix landed #6906 (mid-peel)
- ci_floor_cutover -> ledger overlap-started #6915 with a §3 hand-declared-disposition defect to root-cause
- rulings recorded: root-cause not face-by-face; cargo-green + witness-green always (no mid-peel merges)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadmap; artifact is its projection

Operator: "your job is to get us to a full and confident plan — we can antagonize
it — make this a roadmap and the artifact a projection of it." The plan authority
now models the three-gate v1-delete bar directly (§3 single authority; the
selfhost-dashboard.html artifact projects it, delta-first):

- PlanGate enum groups every milestone under Gate 1 (emitter fixed point),
  Gate 2 (honest frontier), Gate 3 (ledger green), or GateDeletion.
- BrickState (Placed|InFlight|Gated) per milestone.
- ConfidenceBasis{basis, risk, antagonize} per milestone — the attack surface
  that makes the plan antagonizable item by item (the confidence-probe lane
  fills in risk/antagonize).
- PlanGateSpec rows carry each gate's name + what it proves.
- 23 bricks (was 13): adds generic_t_rendering, the Gate-2 property bricks
  (typed_frontier/frontier_dispositioned/no_frontier_lies), the Gate-3 ledger
  bricks (ledger_modeled/ledger_projection + the 3 spine receipts), and
  emit_representation_mismatch — the E0308 layer (~4400/deep module) the
  confidence-probe just exposed once generic-T cleared (quiet-bee #6924
  residual histogram). Rewired the Gate-1 chain so E0308 sits between the two
  known roots and the deep-module lanes.

NOT "27/27 modules flipped" — the doc string states the bar is emitter fixed
point + honest frontier + ledger green; some modules stay SeedRetained by
necessity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix parse error in roadmap: in-string braces trigger string interpolation

The cycle-5 remodel put literal braces in prose strings (SeedRetained{reason,
migration_trigger}). In the seed grammar `{...}` inside a string is
interpolation (render.dag escapes them as \{ \}; the seed has ExprStringInterp),
so `{reason, migration_trigger}` parsed as an interpolation expression and blew
the top-level item parser: "expected item declaration". The known-good cycle-4
file had zero in-string braces.

Fix: replaced the 3 occurrences with parens — SeedRetained(reason,
migration_trigger). Verified by execution with a discriminating control:
v1_src_dag_parse reds the pre-fix version with the exact CI error and greens
the fix.

Also folds quiet-bee's E0308 type-pair sizing into emit_representation_mismatch:
206 pairs but TOP 5 = 82% (Symbol/String ~2100 = one std fork, FreeMonoid/String
~1038, Vector/FreeMonoid ~150, Optional/Option ~150) — the layer is TRACTABLE
(3-4 construction walls at the authority, not 206 one-offs), so Gate-1 depth is
now bounded. Risk downgraded from "could dominate Gate 1" accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40244)

cursor/composer-2.5 REQUEST_CHANGES caught a real §3 gap: the prose
(ci_floor_cutover lane_state + critical_path_note) says the cutover is gated on
the ledger receipts, but no PlanDependency wired ledger_projection / the 3 spine
receipts into ci_floor_cutover — they pointed only at v1_delete. So the modeled
DAG allowed CI cutover (and transitively quarantine) before Gate 3 completed.

Fix: retarget the 4 Gate-3 receipt edges from v1_delete to ci_floor_cutover, so
Gate 3 -> ci_floor_cutover -> v1_quarantine -> v1_delete. Now every Gate-3
receipt transitively gates BOTH quarantine and delete (verified by execution:
reachability holds for all 4), with no redundant edge (the old direct
receipt->v1_delete edges are subsumed by the chain). Updated v1_quarantine and
v1_delete lane_state prose to state the transitive gating explicitly, so a reader
of the dependency list cannot treat either as reachable without the ledger green.

DAG re-verified acyclic (Kahn over all 23 milestones); parse-checked by execution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap convergence: three-gate progress on the srv1 dashboard (authority pages only) + regen golden

Render the v1-delete three-gate progress (Gate 1 emitter fixed point ·
Gate 2 honest frontier · Gate 3 ledger green) driven from
gunbc.v1_deletion_plan on the live srv1 roadmap dashboard `/` and
`/roadmap` pages — a single authority, no data duplication.

Fixes two CI-red witnesses from the first cut:
- roadmap_page_keystone_holds: the three-gate section had been spliced
  into the GENERIC roadmap_page(doc, merged) renderer, so it injected
  into every doc incl. the empty test doc, breaking the
  "empty doc -> empty <main>" invariant. Three-gate progress is
  AUTHORITY content (renders v1_deletion_plan), so route it through
  the _for_authority variants via a private _impl + main_prefix param
  (authority output byte-identical). Add
  witness_authority_shows_three_gate_progress as the positive
  coverage assertion (authority page HAS it; empty page is the
  discriminating RED control).
- live_deploy_emit_holds / witness_apply_script_matches_committed_golden:
  regenerate .github/live-deploy-srv1-apply.sh so the embedded server.js
  dashboard pages carry the three-gate content.

Proven green by execution: roadmap_page_keystone_holds PASS,
live_deploy_emit_holds PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Resolve #6942 merge: combine dispatch launch-button with three-gate progress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Review 40401 finding 2: three-gate widget renders only the 3 proving gates

cursor/composer-2.5 (REQUEST_CHANGES) correctly flagged that
three_gate_progress_markup() mapped all of v1_deletion_gates including
GateDeletion, rendering 4 rows under the "three gates" heading.
GateDeletion is downstream cutover/delete ("proves nothing on its own"
per the authority), not one of the three proving gates.

Filter to the proving gates via tg_is_bar_gate (GateDeletion => false);
the heading is now literally true. Witness asserts Gate 1/Gate 3 render
and "Cutover and delete" (GateDeletion's name) does NOT. Regenerated the
apply-script golden (cutover_rows=0). roadmap_page_keystone_holds PASS.

Finding 1 (exclude the non-bar-brick probe_flip_fanout from Gate 2's
count) needs a typed discriminator on PlanMilestone in the plan
authority — landing separately pending authority-edit confirmation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review 40401 finding 1: typed bar-brick discriminator excludes seed-shrink from gate counts

cursor/composer-2.5 correctly flagged that the gate progress counted
probe_flip_fanout in Gate 2's denominator even though the authority
declares the flip wave "not itself a bar-brick" (seed-shrink beyond the
fixed-point minimum) — so Gate 2 could never read 100%.

Fix (operator-cleared to edit the authority in this PR): add a typed
BrickRole = BarBrick | SeedShrink discriminator on PlanMilestone
(v1_deletion_plan.dag); probe_flip_fanout is the one SeedShrink, the
other 22 are BarBrick. The projection's tg_gate_bricks now filters to
bar-bricks, so tg_gate_total / tg_gate_placed / the remaining list all
exclude seed-shrink. Gate 2 reads 3/4, not 3/5.

Witness asserts the seed-shrink brick's title ("std_dup-gated modules")
does NOT render in the three-gate section (discriminating: removing the
filter reds it). Regenerated golden (seedshrink_leak=0).
roadmap_page_keystone_holds PASS, live_deploy_emit_holds PASS by
execution. Merged main (#6922 plan authority now landed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix host_standup witness stale after #6947 nbd_proxy typed-effect migration

declared_gap_steps_carry_interim_realization_authority required every
DeclaredGap's interim_realization to cite `ctrl:` OR (`extdeps.` AND
`gunbc.`). #6947 (Wave C3, merged to main) correctly migrated the
os-install-actuated gap's nbd_proxy realization from the extdeps shell
transport (`extdeps.bmc.webui.nbd_proxy_serve ShellProgram`) to a gunbc
typed host-effect (`gunbc.host_effect_nbd_proxy_serve`), a more-grounded
authority that no longer routes through an extdeps dep. The now-purely-
gunbc realization made the `(extdeps. AND gunbc.)` conjunction fail, so
the fold returned Bool(false) — a main-inherited CI red (owner session
crisp-bat-221 archived; no fix in flight).

Relax the over-specific conjunction to the invariant's actual intent: a
DeclaredGap must cite >=1 grounded authority — `ctrl:` OR `extdeps.` OR
`gunbc.`. Fail-closed property preserved: a gap citing NONE still reds;
ModeledCompose arm unchanged. RED proven by CI execution on 3644226
(returned Bool(false)); this greens it.

Also restores dag/test/fixture/m4_universal_governed_corpus.dag to
origin/main (a phantom auto-WIP edit had crept in during local repro).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Honest frontier refresh 2026-07-22: namespace-terminal trigger refuted by execution; full 21-module probe sweep

Operator-directed disentangle: a blocker edge without a named MEASURED reason is removed.

- 03_resolve + 03_name_resolve re-declared knowledge_attributed -> execution_measured:
  03_resolve = generic-T render class (E0425 cannot find type T; new reason row
  curated_cargo_probe_generic_type_render), 03_name_resolve = cssl_assemble refuse
  (unroutable gunbc_plans_md_helpers closure reach). Both triggers ->
  migrate_when_closure_self_emits_cargo_green (the 04_infer pattern); the
  migrate_when_namespace_only_resolution_lands trigger no longer appears anywhere.
- Full-frontier sweep TSV (21/21 modules, deduped, provenance header): 4 generic-T
  (03_resolve, 04_infer, 05_eval, fold_lowering), 1 value-qualified
  (materialization_carriers), 2 render residues (02_parse dotted, 01_tokenize
  struct-literal-path), 13 HARNESS_REFUSE on ONE root (test_claim_materialization_ladder_witness
  pulled into compiler closures; + gunbc.plans on 03_name_resolve), 1 false-red
  (03_normalize, lane shim required).
- Verified by execution: frontier compile differential clean (135 pre-existing on
  entry, 0 added), frontier_classify_unlisted_reason_refuses_holds green, 10/10
  compiler_frontier_census witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Post-merge honest frontier re-sweep (13 modules): generic-T class DEAD, type-ref-import-missing is the successor class on 5 modules (3 unique symbols); 05_eval + 06_translate knowledge_attributed -> execution_measured; emit-shape + struct-literal-body classes named; materialization_carriers advanced off import-closure. Receipts in TSV + honest_frontier_refresh_2026_07_22_post_merge_note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* review 41418: upgrade compiler_frontier_row_05_emit knowledge_attributed -> execution_measured (TSV row 05_emit E0433 UriScheme landed by the resumed background sweep after the 13-row read) — roster and receipt back to one authority

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Remove scratch rank probe swept in by auto-WIP commit (probe served its purpose: sweep-order ranks verified against frontier authority)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Fix dual-milestone drift: re-base six v1-deletion plan rows on 2026-07-22 execution receipts

The plan-milestone rows lagged the frontier/probe carriers (the staleness the
operator saw on the freshly deployed srv1 roadmap). Re-based on receipts, both
directions — two flips forward, one flip BACK:

- generic_t_rendering InFlight -> Placed: class extinct by execution (#7033 +
  21-module re-sweep, zero curated_cargo_probe_generic_type_render rows); Phase-2
  typed-REFUSE residue named as non-bar hardening.
- trigger_renegotiation InFlight -> Placed: the mechanical frontier-row update
  landed (#7040 trigger refutation + #7058 refresh); no namespace-gated trigger
  remains on the frontier.
- std_dup_assembly_fix Placed -> InFlight (honest-green rule): E0255 resurfaced
  post type-surface regen as first-error on the curated 4-module baseline —
  suspected different root (emitter-synthesized std use-lines, #7068 pub-use
  family). Now the single first-error blocker for the cargo-green fan-out.
- emit_import_closure_root: type-surface arm landed (#7057), E0422/E0433 class
  cleared by execution; representative cargo-green bar still unmet behind E0255.
- emit_representation_mismatch: the ~4400-sized layer measured GONE on 04_infer
  (e0308_all=0); gate premise re-pointed to std_dup + post-clear re-histogram.
- deep_module_lanes: gate premise re-based accordingly.

Verified by execution: plan closure compiles 0 diagnostics; roadmap_page,
roadmap_frontier, roadmap_register witnesses all true; generated_artifact_gate
main_wet ExitSuccess with zero drift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Jul 23, 2026
…eletion bricks (#7110)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-4: chain B DONE, chain A single gate = comprehensive import-closure root fix

Delta-first refresh of the v1-deletion plan authority against this session's landings:
- witness_family_fanout -> DONE (all 9 families green + trustworthy controls: #6912/#6917/#6918)
- new milestone emit_import_closure_root: the multi-layer emit-import peel root-caused into
  ONE transitive-closure derivation (operator ruling 2026-07-20); FreeMonoid was one layer, not the gate
- probe_flip_fanout + deep_module_lanes -> both GATED on emit_import_closure_root (flip wave is
  NOT orthogonal; it shares the import-closure root and fans out in parallel with deep lanes on cargo-green)
- unresolved_error_diagnosis -> diagnosis DONE, partial fix landed #6906 (mid-peel)
- ci_floor_cutover -> ledger overlap-started #6915 with a §3 hand-declared-disposition defect to root-cause
- rulings recorded: root-cause not face-by-face; cargo-green + witness-green always (no mid-peel merges)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadmap; artifact is its projection

Operator: "your job is to get us to a full and confident plan — we can antagonize
it — make this a roadmap and the artifact a projection of it." The plan authority
now models the three-gate v1-delete bar directly (§3 single authority; the
selfhost-dashboard.html artifact projects it, delta-first):

- PlanGate enum groups every milestone under Gate 1 (emitter fixed point),
  Gate 2 (honest frontier), Gate 3 (ledger green), or GateDeletion.
- BrickState (Placed|InFlight|Gated) per milestone.
- ConfidenceBasis{basis, risk, antagonize} per milestone — the attack surface
  that makes the plan antagonizable item by item (the confidence-probe lane
  fills in risk/antagonize).
- PlanGateSpec rows carry each gate's name + what it proves.
- 23 bricks (was 13): adds generic_t_rendering, the Gate-2 property bricks
  (typed_frontier/frontier_dispositioned/no_frontier_lies), the Gate-3 ledger
  bricks (ledger_modeled/ledger_projection + the 3 spine receipts), and
  emit_representation_mismatch — the E0308 layer (~4400/deep module) the
  confidence-probe just exposed once generic-T cleared (quiet-bee #6924
  residual histogram). Rewired the Gate-1 chain so E0308 sits between the two
  known roots and the deep-module lanes.

NOT "27/27 modules flipped" — the doc string states the bar is emitter fixed
point + honest frontier + ledger green; some modules stay SeedRetained by
necessity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix parse error in roadmap: in-string braces trigger string interpolation

The cycle-5 remodel put literal braces in prose strings (SeedRetained{reason,
migration_trigger}). In the seed grammar `{...}` inside a string is
interpolation (render.dag escapes them as \{ \}; the seed has ExprStringInterp),
so `{reason, migration_trigger}` parsed as an interpolation expression and blew
the top-level item parser: "expected item declaration". The known-good cycle-4
file had zero in-string braces.

Fix: replaced the 3 occurrences with parens — SeedRetained(reason,
migration_trigger). Verified by execution with a discriminating control:
v1_src_dag_parse reds the pre-fix version with the exact CI error and greens
the fix.

Also folds quiet-bee's E0308 type-pair sizing into emit_representation_mismatch:
206 pairs but TOP 5 = 82% (Symbol/String ~2100 = one std fork, FreeMonoid/String
~1038, Vector/FreeMonoid ~150, Optional/Option ~150) — the layer is TRACTABLE
(3-4 construction walls at the authority, not 206 one-offs), so Gate-1 depth is
now bounded. Risk downgraded from "could dominate Gate 1" accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40244)

cursor/composer-2.5 REQUEST_CHANGES caught a real §3 gap: the prose
(ci_floor_cutover lane_state + critical_path_note) says the cutover is gated on
the ledger receipts, but no PlanDependency wired ledger_projection / the 3 spine
receipts into ci_floor_cutover — they pointed only at v1_delete. So the modeled
DAG allowed CI cutover (and transitively quarantine) before Gate 3 completed.

Fix: retarget the 4 Gate-3 receipt edges from v1_delete to ci_floor_cutover, so
Gate 3 -> ci_floor_cutover -> v1_quarantine -> v1_delete. Now every Gate-3
receipt transitively gates BOTH quarantine and delete (verified by execution:
reachability holds for all 4), with no redundant edge (the old direct
receipt->v1_delete edges are subsumed by the chain). Updated v1_quarantine and
v1_delete lane_state prose to state the transitive gating explicitly, so a reader
of the dependency list cannot treat either as reachable without the ledger green.

DAG re-verified acyclic (Kahn over all 23 milestones); parse-checked by execution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Roadmap convergence: three-gate progress on the srv1 dashboard (authority pages only) + regen golden

Render the v1-delete three-gate progress (Gate 1 emitter fixed point ·
Gate 2 honest frontier · Gate 3 ledger green) driven from
gunbc.v1_deletion_plan on the live srv1 roadmap dashboard `/` and
`/roadmap` pages — a single authority, no data duplication.

Fixes two CI-red witnesses from the first cut:
- roadmap_page_keystone_holds: the three-gate section had been spliced
  into the GENERIC roadmap_page(doc, merged) renderer, so it injected
  into every doc incl. the empty test doc, breaking the
  "empty doc -> empty <main>" invariant. Three-gate progress is
  AUTHORITY content (renders v1_deletion_plan), so route it through
  the _for_authority variants via a private _impl + main_prefix param
  (authority output byte-identical). Add
  witness_authority_shows_three_gate_progress as the positive
  coverage assertion (authority page HAS it; empty page is the
  discriminating RED control).
- live_deploy_emit_holds / witness_apply_script_matches_committed_golden:
  regenerate .github/live-deploy-srv1-apply.sh so the embedded server.js
  dashboard pages carry the three-gate content.

Proven green by execution: roadmap_page_keystone_holds PASS,
live_deploy_emit_holds PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Resolve #6942 merge: combine dispatch launch-button with three-gate progress + regen golden

Belt A (#6942) landed the roadmap launch button + /dispatch client
script on the same three dashboard files this branch touches. Combined
both in roadmap_page.dag: the _impl/main_prefix three-gate feeds
#6942's conditional dispatch_client_script() body path (empty doc still
yields a bare <main> with no script). The witness file auto-merged into
one roadmap_page_keystone_holds carrying both feature families.
Regenerated .github/live-deploy-srv1-apply.sh from the merged sources so
it carries three-gate progress AND the dispatch button (the auto-WIP
checkpoint had committed the in-progress merge with conflict markers).

Proven green by execution on the merged tree: roadmap_page_keystone_holds
PASS (three-gate + dispatch + all prior conjuncts), live_deploy_emit_holds
PASS (golden matches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Review 40401 finding 2: three-gate widget renders only the 3 proving gates

cursor/composer-2.5 (REQUEST_CHANGES) correctly flagged that
three_gate_progress_markup() mapped all of v1_deletion_gates including
GateDeletion, rendering 4 rows under the "three gates" heading.
GateDeletion is downstream cutover/delete ("proves nothing on its own"
per the authority), not one of the three proving gates.

Filter to the proving gates via tg_is_bar_gate (GateDeletion => false);
the heading is now literally true. Witness asserts Gate 1/Gate 3 render
and "Cutover and delete" (GateDeletion's name) does NOT. Regenerated the
apply-script golden (cutover_rows=0). roadmap_page_keystone_holds PASS.

Finding 1 (exclude the non-bar-brick probe_flip_fanout from Gate 2's
count) needs a typed discriminator on PlanMilestone in the plan
authority — landing separately pending authority-edit confirmation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Review 40401 finding 1: typed bar-brick discriminator excludes seed-shrink from gate counts

cursor/composer-2.5 correctly flagged that the gate progress counted
probe_flip_fanout in Gate 2's denominator even though the authority
declares the flip wave "not itself a bar-brick" (seed-shrink beyond the
fixed-point minimum) — so Gate 2 could never read 100%.

Fix (operator-cleared to edit the authority in this PR): add a typed
BrickRole = BarBrick | SeedShrink discriminator on PlanMilestone
(v1_deletion_plan.dag); probe_flip_fanout is the one SeedShrink, the
other 22 are BarBrick. The projection's tg_gate_bricks now filters to
bar-bricks, so tg_gate_total / tg_gate_placed / the remaining list all
exclude seed-shrink. Gate 2 reads 3/4, not 3/5.

Witness asserts the seed-shrink brick's title ("std_dup-gated modules")
does NOT render in the three-gate section (discriminating: removing the
filter reds it). Regenerated golden (seedshrink_leak=0).
roadmap_page_keystone_holds PASS, live_deploy_emit_holds PASS by
execution. Merged main (#6922 plan authority now landed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)

* Fix host_standup witness stale after #6947 nbd_proxy typed-effect migration

declared_gap_steps_carry_interim_realization_authority required every
DeclaredGap's interim_realization to cite `ctrl:` OR (`extdeps.` AND
`gunbc.`). #6947 (Wave C3, merged to main) correctly migrated the
os-install-actuated gap's nbd_proxy realization from the extdeps shell
transport (`extdeps.bmc.webui.nbd_proxy_serve ShellProgram`) to a gunbc
typed host-effect (`gunbc.host_effect_nbd_proxy_serve`), a more-grounded
authority that no longer routes through an extdeps dep. The now-purely-
gunbc realization made the `(extdeps. AND gunbc.)` conjunction fail, so
the fold returned Bool(false) — a main-inherited CI red (owner session
crisp-bat-221 archived; no fix in flight).

Relax the over-specific conjunction to the invariant's actual intent: a
DeclaredGap must cite >=1 grounded authority — `ctrl:` OR `extdeps.` OR
`gunbc.`. Fail-closed property preserved: a gap citing NONE still reds;
ModeledCompose arm unchanged. RED proven by CI execution on 3644226
(returned Bool(false)); this greens it.

Also restores dag/test/fixture/m4_universal_governed_corpus.dag to
origin/main (a phantom auto-WIP edit had crept in during local repro).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Honest frontier refresh 2026-07-22: namespace-terminal trigger refuted by execution; full 21-module probe sweep

Operator-directed disentangle: a blocker edge without a named MEASURED reason is removed.

- 03_resolve + 03_name_resolve re-declared knowledge_attributed -> execution_measured:
  03_resolve = generic-T render class (E0425 cannot find type T; new reason row
  curated_cargo_probe_generic_type_render), 03_name_resolve = cssl_assemble refuse
  (unroutable gunbc_plans_md_helpers closure reach). Both triggers ->
  migrate_when_closure_self_emits_cargo_green (the 04_infer pattern); the
  migrate_when_namespace_only_resolution_lands trigger no longer appears anywhere.
- Full-frontier sweep TSV (21/21 modules, deduped, provenance header): 4 generic-T
  (03_resolve, 04_infer, 05_eval, fold_lowering), 1 value-qualified
  (materialization_carriers), 2 render residues (02_parse dotted, 01_tokenize
  struct-literal-path), 13 HARNESS_REFUSE on ONE root (test_claim_materialization_ladder_witness
  pulled into compiler closures; + gunbc.plans on 03_name_resolve), 1 false-red
  (03_normalize, lane shim required).
- Verified by execution: frontier compile differential clean (135 pre-existing on
  entry, 0 added), frontier_classify_unlisted_reason_refuses_holds green, 10/10
  compiler_frontier_census witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Post-merge honest frontier re-sweep (13 modules): generic-T class DEAD, type-ref-import-missing is the successor class on 5 modules (3 unique symbols); 05_eval + 06_translate knowledge_attributed -> execution_measured; emit-shape + struct-literal-body classes named; materialization_carriers advanced off import-closure. Receipts in TSV + honest_frontier_refresh_2026_07_22_post_merge_note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* review 41418: upgrade compiler_frontier_row_05_emit knowledge_attributed -> execution_measured (TSV row 05_emit E0433 UriScheme landed by the resumed background sweep after the 13-row read) — roster and receipt back to one authority

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Remove scratch rank probe swept in by auto-WIP commit (probe served its purpose: sweep-order ranks verified against frontier authority)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Fix dual-milestone drift: re-base six v1-deletion plan rows on 2026-07-22 execution receipts

The plan-milestone rows lagged the frontier/probe carriers (the staleness the
operator saw on the freshly deployed srv1 roadmap). Re-based on receipts, both
directions — two flips forward, one flip BACK:

- generic_t_rendering InFlight -> Placed: class extinct by execution (#7033 +
  21-module re-sweep, zero curated_cargo_probe_generic_type_render rows); Phase-2
  typed-REFUSE residue named as non-bar hardening.
- trigger_renegotiation InFlight -> Placed: the mechanical frontier-row update
  landed (#7040 trigger refutation + #7058 refresh); no namespace-gated trigger
  remains on the frontier.
- std_dup_assembly_fix Placed -> InFlight (honest-green rule): E0255 resurfaced
  post type-surface regen as first-error on the curated 4-module baseline —
  suspected different root (emitter-synthesized std use-lines, #7068 pub-use
  family). Now the single first-error blocker for the cargo-green fan-out.
- emit_import_closure_root: type-surface arm landed (#7057), E0422/E0433 class
  cleared by execution; representative cargo-green bar still unmet behind E0255.
- emit_representation_mismatch: the ~4400-sized layer measured GONE on 04_infer
  (e0308_all=0); gate premise re-pointed to std_dup + post-clear re-histogram.
- deep_module_lanes: gate premise re-based accordingly.

Verified by execution: plan closure compiles 0 diagnostics; roadmap_page,
roadmap_frontier, roadmap_register witnesses all true; generated_artifact_gate
main_wet ExitSuccess with zero drift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

* Prereq-drift ruling on 5-collapse-v1: restore HAND-queue drain, test-migration, seed-honesty as GateDeletion bricks

The superseded roadmap row 5-collapse-v1 required four prereqs; the
cycle-5 three-gate remodel carried forward only the fixed point. Ruling
(operator-delegated via the PR #7104 PREREQ-DRIFT flag): the three gates
are the interpreter-deletion bar and correctly omit them; the terminal
claims (v1_quarantine products-still-build, v1_delete) do require them.
hand_queue_drain lands before quarantine (the gunbc CLI is a HAND src/v1
file — products-still-build is unwritable undrained), test_migration and
seed_honesty_decision before delete. The seed-honesty witness fail-open
defect is flagged as owed regardless of the decision outcome.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: Weak Self Host -> Strong Self Host (Gates 1-3, i guess)

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: gunbai-bot[bot] <289086189+gunbai-bot[bot]@users.noreply.github.com>
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