diff --git a/.github/live-deploy-srv1-apply.sh b/.github/live-deploy-srv1-apply.sh index 54be76194bb..d1f59d370d9 100644 --- a/.github/live-deploy-srv1-apply.sh +++ b/.github/live-deploy-srv1-apply.sh @@ -219,7 +219,20 @@ code { background: #f0f0f0; padding: 1px 4px; border-radius: 3px; font-size: 12p .frontier-bucket h2 { font-size: 14px; font-weight: 600; margin: 0 0 8px; text-transform: uppercase; letter-spacing: 0.04em } .frontier-ready h2 { color: #856404 } .frontier-upcoming h2 { color: #084298 } -.frontier-done h2 { color: #0a3622 }gunbc — daily workspace

gunbc — daily workspace

Ready

  • openregen-cutover cadence — absorb latent emitter fixes into the committed seed (#6099 merged with the machine_width emit test still ignored: two-generation regen means every emitter improvement is invisible until a cutover). Each cutover un-ignores its witnesses; a stale seed hides emitter regressions. RECEIPT (2026-07-05, local, #6253 — measured on a tree with the get sites resolvable; numbers independent of which #6241-gap fix lands, #6255 is the operator-chosen one): regen write-mode completes and materializes the latent backlog — 40 generated files / ~4.3k lines of drift since their last per-file writes — but the fresh crate is cargo-RED: 1667 rustc errors (E0282/E0308/E0425/E0614/E0631; dominant class = #6243's deref-boxing + alias-brand C8 tail). Cutover #1 is BLOCKED on emitter restoration to fresh-emit cargo-green; until it lands, regen --verify is red on that drift by construction and every emitter fix stays latent (the broken cutover was measured and NOT committed). UPDATE (2026-07-05 PM): root-caused and largely landed — 1482/1667 (E0308+E0614+E0631) trace to ONE field_access_field_is_boxed predicate bug (is_recursive_type_by_name fires for types already in shared_types, sending Node fields down the deref path), fixed in #6243 (merged), with #6266 as byte-identical template hygiene; the 139 E0425s are the alias-brand/use-line import class (one root, two labels), also carried by #6243. Cutover #1 now waits on: the post-#6243 fresh-emit re-measure receipt (an earlier 1482→0 receipt was measured under a since-retracted fix and must be re-earned) · #6270's 04_method.dag backfill ✓ merged (7 hand-only #6261 registry rows in the GENERATED seed would otherwise be silently wiped by the regen) · a defensive committed-vs-fresh sweep over the remaining GENERATED files for dark-week hand edits.i:med v:med gunbc
  • openemit-on-demand execution — prove the artifact path end-to-end (operator, 2026-07-07: build this and make sure it actually works, alongside self-hosting) — the execution model is emit → build → run with content-addressed reuse, never long-lived interpretation: emit a v2 closure to Rust via the seed, build it (sccache-warm), run native, Share the artifact by content-hash. First customer: the S1 parse census — 02_parse + closure emitted once, the census runs native (compiled parser measured LINEAR 1.1ms→13.9ms across 43→6173 words, 2026-07-07 forensics, vs interpreted class-broken pre-fix: 1956w DNF at 900s / 4.35GB RSS — root cause the length builtin's O(n) clone-to-count × per-attempt calls = O(n²), interpreter fix in the forensics lane). ACCEPT: (a) same-input interpreted==native agreement witness on the first customer; (b) content-hash reuse receipt — second run pays zero compile; (c) the interpreter's surviving roles named and bounded (bootstrap receipts · compile-time eval), each carrying dissolution trigger = the self-hosting cutover; a NEW long-running interpreted workload is a review reject — route it through emit-on-demand. Interpreter fixes stay scoped to keeping the bootstrap usable, never investment (no bytecode VM, no JIT — closed static substrate ⇒ the AOT artifact dominates; DESIGN §4).i:med v:med gunbc
  • opentest-migration lane — live debt per the v2.lens.test_migration_debt shrink-only ratchet: 73 v1 test modules / 731 #[test] fns / ~23k LOC with no exact-stem floor witness (baselines 77/912/28546 set 2026-07-02; pipeline.rs alone is 417 fns, the dominant unit); the delete-guard blocks removing a v1 test module without its floor witness (hard gate per module, bulk-delete forbidden). Scrutinize before migrating (operator, 2026-07-05): tests are not inherently valuable — triage each module first (migrate · delete-as-redundant · delete-as-low-value); the guard currently requires an exact-stem witness for ANY delete, so the lane's first deliverable is a typed retirement path through the guard, never a bypass. Parallelizable now; gates the terminal collapse per module. NOTE: migrated witnesses run on the local discovery path — CI enrollment is opt-in (#6232) until affected-set selection lands. UPDATE (2026-07-05): the typed retirement path LANDED (#6261 — RetirementDisposition model, guard union, import-bound covered_by), and the first drain tranche merged the same day (#6268/#6270/#6271/#6272: complexity-bounds, transport_emit, scrambled_name, self_gen8 clusters; baselines ratcheted 912→881 fns / 28546→28054 LOC, tightening further at each rebase). Triage finding so far: the delete mass concentrates in the pipeline.rs/parse.rs batteries (~64% of debt fns); the small-module tail mostly guards real v1 behavior whose dag/std concept exists but is UNWITNESSED — genuine migration work, not deadweight.i:med v:large gunbc
  • openroadmap dispatch actuator — dispatch + maintain Claude Code sessions from the srv1 roadmap (simple MVP) (operator directive, 2026-07-03 — un-shelves the actuator slice of §4 "roadmap-as-spawner") — a Dispatch button per READY item that spawns a real claude session on srv1 (git worktree + detached tmux + brief seeded from dispatch_brief_template), plus GET /sessions / Stop. Reuses roadmap_spawner frontier, session_lease gating, the emitted-Node-server lane (node_http_server_emit grows the dynamic-route/POST handler lane its dissolution trigger already names). Displaced cost: every dispatch today is the operator hand-writing a brief and hand-spawning a session. Accept (T4): press Dispatch on one real READY item → a live claude session in a worktree on srv1 working the item, visible in the panel, torn down by Stop; independent read-back = tmux ls + transcript file, never our own write; RED: dispatching a non-ready node or a node with a live lease is a typed refusal. Milestones M1–M4 in the plan.i:high v:med gunbcplan
  • openworkload-class admission model (operator directive, 2026-07-01: 1 core → 3 GiB + swap) — runners are capacity surfaces, not concurrency proof. Define CI workload classes (floor_light · rust_heavy · deploy · session) with measured RAM/swap/pids/CPU-token demand; admitted concurrency per host derives from HostSupply × WorkloadClassDemand, never from runner-slot count. Initial 128c/125GiB policy: ~42 build tokens per host (≈1 core : 3 GiB, the ubicloud-standard-16-arm shape generalized), with intentionally-stranded cores reserved for sessions and low-memory work — stranded is not wasted. Measured anchors: ci ~11GiB · rust_tests ~37GiB peaks vs the old 8G slot caps. Accept: admitted concurrency for srv1/srv2 derives by execution from HostSupply × WorkloadClassDemand (witnessed, not hand-set to match), and a proposed allocation whose Σ exceeds supply is REFUSED with a typed verdict — perturb: inflate one class's measured demand and admission shrinks.i:high v:med gunbc
  • openstateless frontend MVP on fabric (operator directive, 2026-07-01) — the first non-CI, product-shaped consumer of RunShape → Allocation → Receipt: point a domain at an IP and serve the process as minimally as possible. Model SiteArtifact (digest · media_root · build_recipe) + WebServiceShape (cpu/ram/port/stateless/health_path) + DomainRoute + ServiceAllocation. MVP is intentionally single-site/single-allocation: DNS may be manual (DnsExternalManual recorded, not actuated), storage is immutable/content-addressed, compute is a tiny stateless HTTP process, and the receipt proves /healthz plus served artifact digest — green only when an independent read proves domain → endpoint → process → digest. NO autoscale, NO dynamic user routing, NO DNS/cert automation. Two milestones: (A) StaticSite deploy receipt on the current srv1 path — can start now; (B) fabric SiteLease on the same allocation model as CI — waits for the control-plane read-back. Exists to prove storage+compute+route can be allocated, read back, and retracted through the same apply/receipt pipe as fleet config — a safer fabric consumer than oversubscribed CI (route/supervision/artifact risk, not memory/OOM risk).i:high v:med gunbc
  • opencompile-clean shard B — enroll shards in the floor plan — batch-1 becomes N shard nodes so spawn_width finally applies to the dominant cost; before/after batch-1 wall-clock receipt on a real run. Gated on shard A's compose proof. Accept (checklist): the floor plan CONSUMES the shards (shard A's exemplar is not sharding); every shard derives from the same source-root authority as the whole-tree gate; compose(shards) ≡ the whole-tree verdict on a green tree, a planted bad module fails the composed verdict, an empty roster is Unknown/fail-closed; receipt = before/after batch-1 wall-clock + shard count; RED: drop one shard from the roster → the coverage witness fails.i:high v:med gunbc
  • openresolver pathology B — fix one confirmed pathology — RED control on the pathological pair from the profile receipt, the fix, and a before/after resolve-count or wall-clock receipt.i:high v:med gunbc
  • openthree-way diff = the core fold with a lattice codomain — not a new differ (operator, 2026-07-01: "is there something inherent to fold/homomorphism that would get us this for free? I'm worried we are reinventing our core mechanism" — confirmed; this node is the construction steer) — diff is a keyed fold over aligned rows into an algebraic codomain with identity = Unchanged: unchanged rows contribute nothing by the monoid law, never by filtering — that is the "for free". Structural equality is the degenerate consumer of the same walk (v2.std.exact_structural_equality_zip_fold — canonicalize each side, one top-level ==: an equality verdict is a diff with the hunks discarded; note its internals are canonicalize-then-compare, not a lockstep zip, so the diff fold is a sibling reading, not a call into it); a hunk is the located, typed mismatch coercion already emits (find_witness Diagnostics, subject-level locus) collected as data instead of refusing on the first. Three-way is the same fold into a join-semilattice — the DescentEvidence/BoundedLattice precedent (dag/std/termination.dag) with its safety consciously INVERTED: bottom here is the BENIGN Unchanged, so the codomain must carry NO Unknown element (an Unknown at bottom would join-fold unreadable state to "no change" — a §5 fail-open; unreadable state is refused upstream at the typed-read wall, never folded) — and Conflict = the join of two incomparable changes, so "no mutation on conflict" is structural (a plan that reads Conflict has no apply arm), not a runtime guard. The inverse laws are the free RED controls (DESIGN §5): diff(A,A) = identity · apply(diff(A,B), A) = B · retract = the inverse patch — a groupoid, NOT a total Group: apply is partial (refuses off-base) and Conflict has no inverse; deriving a total apply from Group inhabitance would silently compose through drift. Alignment is free HERE because converge knobs are keyed (a keyed zip is total); general insert/delete tree alignment is a search, explicitly NOT this scope. §3: the change vocabulary EXISTS — v2.std.change (ChangeKind NodeChanged/NodeAdded/NodeRemoved + projection/artifact arms · ChangeSet, already feeding the affected-set lens); attach there or de-fork consciously, never mint a parallel Hunk/Patch — and the algebra anchor picks ONE std authority consciously (algebra is pillar-1's FIRST de-fork target, LIVE fail-open; standing ruling: coproduct = structural authority, grounded-realization wins). Layering: the generic keyed-delta/three-way fold is a std carrier; gunbc.host_converge supplies ONLY the leaf algebra — ConvergeTarget keying + per-target normalization/equality across all SIX variants (SliceProperty splits apply-value from expected-effective · PerSlotMemoryCap byte-normalizes · RunnerWidth · JobserverTokens · VerifyOnlyCap has no apply value at all · GunbcPinnedTree converges on pin-coherence, not value equality — one string-equality flattens ALL of that) + apply/retract semantics; live read/apply stays workflow-layer. Accept (T2 — wired; checklist): (a) law witnesses green with RED perturbs — identity · apply∘diff · inverse-retract · key-reorder invariance · incomparables join to Conflict; (b) on real srv2 ConvergeKnob fixture rows (base/observed/desired) the plan lists EXACTLY the changed knobs — unchanged knobs absent by the identity law, a drifted knob folds to Conflict and no apply arm is reachable from it; (c) host_converge computes a REAL converge patch through this carrier — proof by consumption, not grep: remove the carrier and the re-land witness fails to resolve. T4 arrives only via the converge re-land. NOT accepted by: the algebra existing, typechecking, or a hand-rolled compare that happens to agree.i:high v:small gunbc
  • openemit partition cleanup — shell/json/yaml as grammar rows, zero language knowledge in the wrong layer (operator directive, 2026-07-01) — one grammar per language, read in both directions (DESIGN §4); emission is rows in extdeps/languages/, never stage code. Four leftovers: (a) src/v2/compiler/05_emit_orchestration.dag still carries orchestration→bash lowering IN the compiler stage (the retry 2-level expansion, seq-join) — the #6106 registry dispatch is the exit mechanism; the former env-weld half is DISCHARGED (#5868 grew the bash AST EnvUnset + multi-binding EnvPrefixed; #6137 dissolved orch_emit_run_env_welded); the stage keeps ONE agnostic fold. (b) the bash grammar itself is FORKED across trees — dag/extdeps/languages/bash/ vs src/v2/extdeps/languages/bash.dag+bash_command_fold.dag — the same §3 class as the extdeps.shell fork (hotfixed #6112), one authority must win. (c) JSON has no grammar authority: N hand-rolled emitters (roadmap_spawner's json_escape/json_str is a marked scaffold dissolving to std.primitives.to_json; bmc_onboard and tailscale_acl_emit carry their own). (d) YAML: ci_yaml_emit/ci_yaml_validate/gha_yaml_fold_pilot sit in dag/gunbc/ (workflow layer) while the fold pilot is src/v2/extdeps/languages/gha_workflow_yaml_fold.dag — YAML-the-language rows belong in extdeps/languages/ with GHA-workflow as rows on top, retiring the yaml_check Rust scaffold once parse is grammar-owned. The construction wall that makes the splice class unwritable (a string literal is an ATOM, never a COMPOSITION — joins live in extdeps/languages rows, never workflow code): no-smuggled-programs wall dissolved with program.dag FULL DELETE — shell → intent design.@dispatched 2026-07-02 · adhoc-2040cdfe-46bi:high v:large gunbc
  • openStrictLease allocation model (Policy 0) — every provider exposes strict, non-oversubscribed RunShape offers first: one allocation consumes its declared RAM/swap/CPU budget, period. srv1/srv2 are modeled like ephemeral providers (N fixed slots, hard cgroup caps, read-back receipts before work); Ubicloud is a provider offer with EphemeralVm isolation. Burst/oversubscription explicitly out of scope. Four nouns, no scheduler: RunShape (arch/cpu_tokens/ram/swap/disk/duration/trust/workload_class) · ProviderOffer (provider/isolation/limits/oversubscription_policy/cost) · Allocation (shape×offer→target+lease) · Receipt (effective limits observed, peak usage, pressure/OOM events, release result). Accept (checklist): one real CI job runs under a StrictLease allocation on srv1/srv2 whose Receipt proves effective limits == the offer's declared limits (read back from the live cgroup, never asserted), and a second job requesting more than remaining capacity is refused a lease rather than co-scheduled.i:high v:med gunbc
  • openaffected-set lens (the operator's named example) — witness-level skip is LIVE on the floor (#6061); prove it: (a) soundness — construct a diff that MUST re-run a witness and assert it runs (a skipped-but-affected witness is the fail-open catastrophe); (b) effectiveness — receipts on real scoped diffs (skip counts + wall-clock delta, not claims); (c) fail-closed default — a provenance gap falls back to run-all, witnessed RED-on-perturb. The node-closure half (#6105) inherits the same receipt obligation before it may prune.i:high v:med gunbc
  • openartifact-freshness gate (operator ask: "we need a freshness gate, if we don't already have one") — we half-do: the per-PR drift gate proves committed==emitted for the PR's OWN tree, but drift still LANDED on main (.gitignore stale vs its authority since #6097; found and healed by #6110/#6111) because admission never re-validates against CURRENT main — green-on-branch is not green-on-main. The closing mechanism is the §2 merge-admission freshness block (HELD); this item is its receipt pair: (a) reproduce the landed-drift path as a RED witness, (b) confirm the freshness block refuses it once un-HELD.i:med v:small gunbc

Upcoming

  • openclosed-loop converge re-land — the signed design: base snapshot → edit → three-way diff → gated plan → apply → independent read-back → commit/retract; hostname self-selection (the committed script runs all three hosts' rows unconditionally); sound host admission (own node below); runner-width INCREASE provisioning (today an echo-to-stderr stub). The three-way-diff carrier does not exist yet in dag/gunbc/ — and it is a fold instance, not a bespoke differ (own node below carries the construction steer; this node's dispatch brief inherits it). First acceptance case (deliberately narrow, operator-set): change one srv2 runner-slot memory/swap value — read current → refuse if drifted → apply → read back → commit new base; re-apply is a noop; retract works. Full acceptance (T4 — operator, 2026-07-02; 12-step checklist): reconfigure srv1/srv2 to a NEW runner allocation from the model alone — edit desired (runner width + per-slot memory/swap caps, both hosts) → plan shows exactly the delta → apply per-host → independent read-back proves the new effective values (systemctl show, never our own write echoed back) → receipts commit as the new base; a subsequent hand-edit on either host reds the next converge; retract returns both hosts to the prior allocation; the values survive daemon-reload and a freshly spawned runner unit inherits them. That, not the narrow first case, is this node's done bar. No Ubicloud inside this PR: just make srv1/srv2 mutable safely. This is the real blocker — until it lands, every fabric model is paper.i:high v:large gunbc
  • openrunner allocation v0 — srv1/srv2 as StrictLease runner capacity, hand-config retired (the operational milestone this control plane exists for — operator, 2026-07-02) — desired allocation declared in the model per host (runner slots + labels · per-slot MemoryMax/MemoryHigh/MemorySwapMax/TasksMax · jobserver tokens), applied by converge, proven by read-back. Accept (T4, held alive by T5; checklist): every active runner unit on BOTH hosts matches desired effective values by independent read and a freshly started unit inherits the template drop-ins; admitted heavy concurrency derives from the admission model and GitHub cannot schedule past it (labels/slots ARE the backpressure — generic self-hosted labels cannot bypass heavy admission); receipt records host · unit count · labels · effective values · model hash; RED: a hand-edited srv2 cap reds the next converge/receipt · desired heavy concurrency above admission is rejected · wrong/missing label fails the dispatch witness · unprivileged apply refused before mutation; workload proof: one real CI run on the intended shape with no oom_kill increase and peak memory recorded as a measurement row. Not complete while ANY runner-allocation knob on srv1/srv2 requires a hand edit.i:high v:med gunbc
  • opentemporal-effect-spine-a — temporal realization spine (T1 vocabulary) (operator 2026-07-02; not a workflow engine) — std.temporal_effect: durable facts + plan_next_step_from_prior_receipt_and_lease (single prior+lease; list fold is consumer-side); 🟡 markers on stringly receipt labels + derived step id. RED: approval/lease/read-back gates. Non-goals: live mutation, DB, scheduler. Accept (T1): witness suite green.@dispatched 2026-07-02 · zesty-bat-588i:high v:small gunbc
  • openos-install-deduction-a — preflight + KVM diagnostic vocabulary (T1) (operator 2026-07-02; deduction half; NOT wired to srv3_os_install_diagnostic until reconcile-a) — gunbc.os_install_deduction: fold_nbd_proxy_os_install_preflight_verdict (NBD-proxy/on-ISO actuator scope — NoCloudNet incomplete for this path only), storage policy on payload, TargetDiskState, weak KVM verdicts (KvmFirmwareIdleObserved, KvmSuggestsOsBooted; OsInstalled reserved for router read-back). RED: remove storage flips ReadyToBoot; KVM login ≠ OsInstalled. Non-goals: live mutation, monitoring product, DB. Accept (T1): witness suite green.@dispatched 2026-07-02 · zesty-bat-588i:high v:small gunbc
  • opensrv3-install-reconcile-a — dry-run reconcile entrypoint (queued; gated on temporal-effect-spine-a + os-install-deduction-a) — InstallAttemptIntent + workflow steps as data; srv3_os_install_reconcile folds preflight + diagnostic + temporal spine; dry-run first. Accept (T3): dry-run receipt on srv1 actuator host.i:high v:med gunbc
  • openresource-namespace-upsert-a — vocabulary only (#6134 srv3 bringup follow-up; operator reshape 2026-07-03) — std.upsert_decision (ObservationVerdict + UpsertDecision<P>); domain modules gunbc.file_access, gunbc.session_lease, gunbc.install_media. RED: foreign process on 10809=Conflict not kill; outside-namespace chmod=Refuse; drifted seeded ISO plans Remaster not Converged. Non-goal: live srv3 mutation.i:high v:small gunbc
  • openinstall-media-generic-layer — extract Ubuntu flavor from process — split extdeps/os/install_media.dag generic shapes (fetch/remaster/serve verdicts) from ubuntu_* flavor rows; move .gunbc-content-hash sidecar + remaster policy to gunbc/install_media_*; mandatory before second OS/distro. Post-#6134.i:high v:med gunbc
  • opennbd-serve-held-session-lease — NbdProxyServeSession intent with port/pid/cmdline/ISO/token fingerprint; classification + plan INSTANTIATE std.upsert_decision (ObservationVerdict + UpsertDecision<P>; domain facts as the P payload — do NOT mint a parallel lease vocabulary, cf. the fork-census 2026-07-03). RED: foreign 10809 no kill; stale matching session drains only. Live consumer: srv3 actuator.i:high v:med gunbc
  • opensrv3-boot-action-diagnostic — Redfish vs ipmitool fallback state machine — separate transports for BmcBootAction; boot refused unless serve RunningExpected; NoRebootObserved → optional IpmiResetFallback with separate approval; OutOfBandHostActionReceipt until modeled.i:high v:small gunbc

Done

  • reviewfix the CD transport premise — a deploy needs a target-host proof — deploy_dashboard_srv1 is a srv1 effect, but job placement is not an srv1 proof: LocalShell with principal runner assumed the runner is ON srv1 (#6093), while [self-hosted, linux, arm64] can land on srv2 (and during the Ubicloud window it was a rented VM). A LocalShell deploy is valid ONLY when the runner identity proves it is already on srv1 — either pin the job to an srv1-specific trusted runner label, or make the effect SshShell-over-tailnet with an explicit srv1 target + typed credential (#6066 Phase 2). Until then every main push gambles the deploy host.@dispatched 2026-07-01 · adhoc-75790c4c-4e0i:high v:small gunbc
  • reviewcompile-clean shard A — partition boundary + ONE shard + compose proof — the direct attack on the serial wall (lever c above): identify the module partition boundary for dag_compile_clean_gate, run ONE module shard (manually or via minimal wrapper), and prove the shard verdict composes with the existing whole-tree gate (a shard-green ∧ … ∧ shard-green tree is whole-tree green, and a broken module reds its shard). Non-goals: NO floor-plan/scheduler integration, no width tuning. The partition receipt is the deliverable even if enrollment never follows.@dispatched 2026-07-01 · adhoc-3e95c046-279i:high v:small gunbc
  • doneresolver pathology A — profile receipt only — the 518s resolve: reproducible scripts/profile-cold-resolve.sh; top-N entry offenders; pair budget_roster_completeness_test vs fold_list_generic_instantiation (34.7× cold wall); hypothesis: typecheck_module in reconcile_with_typed_cache.@dispatched 2026-07-01 · adhoc-51b0b8e7-0bei:high v:small gunbc
  • reviewlive read, first slice: one runner unit's memory knobs — read MemoryMax/MemorySwapMax/MemoryHigh for ONE live actions-runner instance and ground the result into the ConvergeTarget semantics (no string flattening). Non-goals: no patch/apply engine, no runner-count reconciliation, no timer. RED: a fixture read that differs from base refuses convergence (NotConverged); green receipt: one real srv2 unit read grounded into the model. Stop-and-return if systemctl read output cannot be represented typed.@dispatched 2026-07-01 · adhoc-1e9d7c44-bcci:high v:small gunbc
  • reviewprivilege model for host mutation — converge writes /etc/systemd/system/*.d and runs systemctl set-property (root), but #6096's service ran as the operator user with || true swallowing EPERM; extend DeployAccess/host_effect so an unprivileged apply is a typed refusal BEFORE mutation, never a swallowed failure. RED: unprivileged mutation emits no shell / no host_effect_apply; green: the privileged modeled path applies in a fixture.@dispatched 2026-07-01 · adhoc-3b95241c-d5di:high v:small gunbc
  • donemechanism inventory with red-controls — census every wired gate/lens/cache (floor-plan roster + commit_workflow): what it claims · its discriminating RED witness · its last execution receipt. Anything without a red-control gets one or gets demoted/deleted. The inert-lens backstop (#5433) covers wiring; this covers claim-vs-behavior.@dispatched 2026-07-01 · adhoc-c67edbed-916i:med v:large gunbcplan
`, contentType: 'text/html; charset=utf-8', status: 200 }, { method: 'GET', pathRe: /^\/roadmap$/, body: `gunbc — daily workspace

gunbc — daily workspace

v1-delete bar: three gates

Gate 1 — the emitter re-emits itself3 / 8
  • in flightONE comprehensive emit import-closure derivation: the emitted module import set = the transitive closure of every type/module name any emitted construct references (params, body, inferred, nested-record struct literals AND their sibling-module field types, carrier types, referenced modules). Replaces the per-face gates (faithful-carrier, struct-field StructRepr-only, module-manifest). FreeMonoid was ONE layer of this, not the whole gate
  • in flightGeneric-type rendering fix: an unbound TypeVariable in an applied type must REFUSE, not render — root is the fold acc-type fallback path (emit_rust_fold_method_call -> lambda_acc_type_str/lambda_param_type_strs with fold_acc_uses_fallback) plus render_rust_type not refusing an unbound T inside an applied type. A DISTINCT class from import-closure (generic rendering, not a missing import); blocks 04_infer/06_translate/05_emit; same family as #6881 fn_generic_param_names threading
  • gatedEmit representation-mismatch layer: after import-closure + generic-T clear, each deep module still shows ~4400 E0308 type mismatches (04_infer E0308x4261; 06_translate + 05_emit E0308x4422) — the model-vs-realization fork surfacing in emit (modeled coproduct types where native Rust/Value types are expected, and vice versa)
  • gatedSelf-emit lanes for the Rc-heavy core: 04_infer, 06_translate, the 05_emit family — fan out in parallel with the flip wave once import-closure + generic-T + representation-mismatch reach cargo-green
  • gatedThe emitted emitter re-emits itself: behavioral 2-generation fixed point on the v2 side (not byte identity)
Gate 2 — honest typed frontier3 / 4
  • in flightDECISION: namespace-gated modules (03_resolve, 03_name_resolve) + body-producer tail — renegotiate migration triggers to emit under the current design (accept a later re-emit), or exclude from the 2-week scope
Gate 3 — verification ledger green by execution3 / 7
  • in flightThe ledger self-updates: project family dispositions from the ci_layer_roots.dag probe_red carrier instead of hand-declared literals (DESIGN section 3 single authority)
  • gatedSpine receipt: whole-corpus COLD v1-vs-v2 witness parity with zero unexplained divergence — a deliberate executed run, not a soak
  • gatedSpine receipt: compile-clean parity — the v2-emitted path compiles the corpus clean, matching v1
  • gatedSpine receipt: regen behavioral fixed point — regen_stage0 on the v2-emitted sources reproduces a behaviorally-equivalent emitter

Ready

  • openregen-cutover cadence — absorb latent emitter fixes into the committed seed (#6099 merged with the machine_width emit test still ignored: two-generation regen means every emitter improvement is invisible until a cutover). Each cutover un-ignores its witnesses; a stale seed hides emitter regressions. RECEIPT (2026-07-05, local, #6253 — measured on a tree with the get sites resolvable; numbers independent of which #6241-gap fix lands, #6255 is the operator-chosen one): regen write-mode completes and materializes the latent backlog — 40 generated files / ~4.3k lines of drift since their last per-file writes — but the fresh crate is cargo-RED: 1667 rustc errors (E0282/E0308/E0425/E0614/E0631; dominant class = #6243's deref-boxing + alias-brand C8 tail). Cutover #1 is BLOCKED on emitter restoration to fresh-emit cargo-green; until it lands, regen --verify is red on that drift by construction and every emitter fix stays latent (the broken cutover was measured and NOT committed). UPDATE (2026-07-05 PM): root-caused and largely landed — 1482/1667 (E0308+E0614+E0631) trace to ONE field_access_field_is_boxed predicate bug (is_recursive_type_by_name fires for types already in shared_types, sending Node fields down the deref path), fixed in #6243 (merged), with #6266 as byte-identical template hygiene; the 139 E0425s are the alias-brand/use-line import class (one root, two labels), also carried by #6243. Cutover #1 now waits on: the post-#6243 fresh-emit re-measure receipt (an earlier 1482→0 receipt was measured under a since-retracted fix and must be re-earned) · #6270's 04_method.dag backfill ✓ merged (7 hand-only #6261 registry rows in the GENERATED seed would otherwise be silently wiped by the regen) · a defensive committed-vs-fresh sweep over the remaining GENERATED files for dark-week hand edits.i:med v:med gunbc
  • openemit-on-demand execution — prove the artifact path end-to-end (operator, 2026-07-07: build this and make sure it actually works, alongside self-hosting) — the execution model is emit → build → run with content-addressed reuse, never long-lived interpretation: emit a v2 closure to Rust via the seed, build it (sccache-warm), run native, Share the artifact by content-hash. First customer: the S1 parse census — 02_parse + closure emitted once, the census runs native (compiled parser measured LINEAR 1.1ms→13.9ms across 43→6173 words, 2026-07-07 forensics, vs interpreted class-broken pre-fix: 1956w DNF at 900s / 4.35GB RSS — root cause the length builtin's O(n) clone-to-count × per-attempt calls = O(n²), interpreter fix in the forensics lane). ACCEPT: (a) same-input interpreted==native agreement witness on the first customer; (b) content-hash reuse receipt — second run pays zero compile; (c) the interpreter's surviving roles named and bounded (bootstrap receipts · compile-time eval), each carrying dissolution trigger = the self-hosting cutover; a NEW long-running interpreted workload is a review reject — route it through emit-on-demand. Interpreter fixes stay scoped to keeping the bootstrap usable, never investment (no bytecode VM, no JIT — closed static substrate ⇒ the AOT artifact dominates; DESIGN §4).i:med v:med gunbc
  • opentest-migration lane — live debt per the v2.lens.test_migration_debt shrink-only ratchet: 73 v1 test modules / 731 #[test] fns / ~23k LOC with no exact-stem floor witness (baselines 77/912/28546 set 2026-07-02; pipeline.rs alone is 417 fns, the dominant unit); the delete-guard blocks removing a v1 test module without its floor witness (hard gate per module, bulk-delete forbidden). Scrutinize before migrating (operator, 2026-07-05): tests are not inherently valuable — triage each module first (migrate · delete-as-redundant · delete-as-low-value); the guard currently requires an exact-stem witness for ANY delete, so the lane's first deliverable is a typed retirement path through the guard, never a bypass. Parallelizable now; gates the terminal collapse per module. NOTE: migrated witnesses run on the local discovery path — CI enrollment is opt-in (#6232) until affected-set selection lands. UPDATE (2026-07-05): the typed retirement path LANDED (#6261 — RetirementDisposition model, guard union, import-bound covered_by), and the first drain tranche merged the same day (#6268/#6270/#6271/#6272: complexity-bounds, transport_emit, scrambled_name, self_gen8 clusters; baselines ratcheted 912→881 fns / 28546→28054 LOC, tightening further at each rebase). Triage finding so far: the delete mass concentrates in the pipeline.rs/parse.rs batteries (~64% of debt fns); the small-module tail mostly guards real v1 behavior whose dag/std concept exists but is UNWITNESSED — genuine migration work, not deadweight.i:med v:large gunbc
  • openroadmap dispatch actuator — dispatch + maintain Claude Code sessions from the srv1 roadmap (simple MVP) (operator directive, 2026-07-03 — un-shelves the actuator slice of §4 "roadmap-as-spawner") — a Dispatch button per READY item that spawns a real claude session on srv1 (git worktree + detached tmux + brief seeded from dispatch_brief_template), plus GET /sessions / Stop. Reuses roadmap_spawner frontier, session_lease gating, the emitted-Node-server lane (node_http_server_emit grows the dynamic-route/POST handler lane its dissolution trigger already names). Displaced cost: every dispatch today is the operator hand-writing a brief and hand-spawning a session. Accept (T4): press Dispatch on one real READY item → a live claude session in a worktree on srv1 working the item, visible in the panel, torn down by Stop; independent read-back = tmux ls + transcript file, never our own write; RED: dispatching a non-ready node or a node with a live lease is a typed refusal. Milestones M1–M4 in the plan.i:high v:med gunbcplan
  • openworkload-class admission model (operator directive, 2026-07-01: 1 core → 3 GiB + swap) — runners are capacity surfaces, not concurrency proof. Define CI workload classes (floor_light · rust_heavy · deploy · session) with measured RAM/swap/pids/CPU-token demand; admitted concurrency per host derives from HostSupply × WorkloadClassDemand, never from runner-slot count. Initial 128c/125GiB policy: ~42 build tokens per host (≈1 core : 3 GiB, the ubicloud-standard-16-arm shape generalized), with intentionally-stranded cores reserved for sessions and low-memory work — stranded is not wasted. Measured anchors: ci ~11GiB · rust_tests ~37GiB peaks vs the old 8G slot caps. Accept: admitted concurrency for srv1/srv2 derives by execution from HostSupply × WorkloadClassDemand (witnessed, not hand-set to match), and a proposed allocation whose Σ exceeds supply is REFUSED with a typed verdict — perturb: inflate one class's measured demand and admission shrinks.i:high v:med gunbc
  • openstateless frontend MVP on fabric (operator directive, 2026-07-01) — the first non-CI, product-shaped consumer of RunShape → Allocation → Receipt: point a domain at an IP and serve the process as minimally as possible. Model SiteArtifact (digest · media_root · build_recipe) + WebServiceShape (cpu/ram/port/stateless/health_path) + DomainRoute + ServiceAllocation. MVP is intentionally single-site/single-allocation: DNS may be manual (DnsExternalManual recorded, not actuated), storage is immutable/content-addressed, compute is a tiny stateless HTTP process, and the receipt proves /healthz plus served artifact digest — green only when an independent read proves domain → endpoint → process → digest. NO autoscale, NO dynamic user routing, NO DNS/cert automation. Two milestones: (A) StaticSite deploy receipt on the current srv1 path — can start now; (B) fabric SiteLease on the same allocation model as CI — waits for the control-plane read-back. Exists to prove storage+compute+route can be allocated, read back, and retracted through the same apply/receipt pipe as fleet config — a safer fabric consumer than oversubscribed CI (route/supervision/artifact risk, not memory/OOM risk).i:high v:med gunbc
  • opencompile-clean shard B — enroll shards in the floor plan — batch-1 becomes N shard nodes so spawn_width finally applies to the dominant cost; before/after batch-1 wall-clock receipt on a real run. Gated on shard A's compose proof. Accept (checklist): the floor plan CONSUMES the shards (shard A's exemplar is not sharding); every shard derives from the same source-root authority as the whole-tree gate; compose(shards) ≡ the whole-tree verdict on a green tree, a planted bad module fails the composed verdict, an empty roster is Unknown/fail-closed; receipt = before/after batch-1 wall-clock + shard count; RED: drop one shard from the roster → the coverage witness fails.i:high v:med gunbc
  • openresolver pathology B — fix one confirmed pathology — RED control on the pathological pair from the profile receipt, the fix, and a before/after resolve-count or wall-clock receipt.i:high v:med gunbc
  • openthree-way diff = the core fold with a lattice codomain — not a new differ (operator, 2026-07-01: "is there something inherent to fold/homomorphism that would get us this for free? I'm worried we are reinventing our core mechanism" — confirmed; this node is the construction steer) — diff is a keyed fold over aligned rows into an algebraic codomain with identity = Unchanged: unchanged rows contribute nothing by the monoid law, never by filtering — that is the "for free". Structural equality is the degenerate consumer of the same walk (v2.std.exact_structural_equality_zip_fold — canonicalize each side, one top-level ==: an equality verdict is a diff with the hunks discarded; note its internals are canonicalize-then-compare, not a lockstep zip, so the diff fold is a sibling reading, not a call into it); a hunk is the located, typed mismatch coercion already emits (find_witness Diagnostics, subject-level locus) collected as data instead of refusing on the first. Three-way is the same fold into a join-semilattice — the DescentEvidence/BoundedLattice precedent (dag/std/termination.dag) with its safety consciously INVERTED: bottom here is the BENIGN Unchanged, so the codomain must carry NO Unknown element (an Unknown at bottom would join-fold unreadable state to "no change" — a §5 fail-open; unreadable state is refused upstream at the typed-read wall, never folded) — and Conflict = the join of two incomparable changes, so "no mutation on conflict" is structural (a plan that reads Conflict has no apply arm), not a runtime guard. The inverse laws are the free RED controls (DESIGN §5): diff(A,A) = identity · apply(diff(A,B), A) = B · retract = the inverse patch — a groupoid, NOT a total Group: apply is partial (refuses off-base) and Conflict has no inverse; deriving a total apply from Group inhabitance would silently compose through drift. Alignment is free HERE because converge knobs are keyed (a keyed zip is total); general insert/delete tree alignment is a search, explicitly NOT this scope. §3: the change vocabulary EXISTS — v2.std.change (ChangeKind NodeChanged/NodeAdded/NodeRemoved + projection/artifact arms · ChangeSet, already feeding the affected-set lens); attach there or de-fork consciously, never mint a parallel Hunk/Patch — and the algebra anchor picks ONE std authority consciously (algebra is pillar-1's FIRST de-fork target, LIVE fail-open; standing ruling: coproduct = structural authority, grounded-realization wins). Layering: the generic keyed-delta/three-way fold is a std carrier; gunbc.host_converge supplies ONLY the leaf algebra — ConvergeTarget keying + per-target normalization/equality across all SIX variants (SliceProperty splits apply-value from expected-effective · PerSlotMemoryCap byte-normalizes · RunnerWidth · JobserverTokens · VerifyOnlyCap has no apply value at all · GunbcPinnedTree converges on pin-coherence, not value equality — one string-equality flattens ALL of that) + apply/retract semantics; live read/apply stays workflow-layer. Accept (T2 — wired; checklist): (a) law witnesses green with RED perturbs — identity · apply∘diff · inverse-retract · key-reorder invariance · incomparables join to Conflict; (b) on real srv2 ConvergeKnob fixture rows (base/observed/desired) the plan lists EXACTLY the changed knobs — unchanged knobs absent by the identity law, a drifted knob folds to Conflict and no apply arm is reachable from it; (c) host_converge computes a REAL converge patch through this carrier — proof by consumption, not grep: remove the carrier and the re-land witness fails to resolve. T4 arrives only via the converge re-land. NOT accepted by: the algebra existing, typechecking, or a hand-rolled compare that happens to agree.i:high v:small gunbc
  • openemit partition cleanup — shell/json/yaml as grammar rows, zero language knowledge in the wrong layer (operator directive, 2026-07-01) — one grammar per language, read in both directions (DESIGN §4); emission is rows in extdeps/languages/, never stage code. Four leftovers: (a) src/v2/compiler/05_emit_orchestration.dag still carries orchestration→bash lowering IN the compiler stage (the retry 2-level expansion, seq-join) — the #6106 registry dispatch is the exit mechanism; the former env-weld half is DISCHARGED (#5868 grew the bash AST EnvUnset + multi-binding EnvPrefixed; #6137 dissolved orch_emit_run_env_welded); the stage keeps ONE agnostic fold. (b) the bash grammar itself is FORKED across trees — dag/extdeps/languages/bash/ vs src/v2/extdeps/languages/bash.dag+bash_command_fold.dag — the same §3 class as the extdeps.shell fork (hotfixed #6112), one authority must win. (c) JSON has no grammar authority: N hand-rolled emitters (roadmap_spawner's json_escape/json_str is a marked scaffold dissolving to std.primitives.to_json; bmc_onboard and tailscale_acl_emit carry their own). (d) YAML: ci_yaml_emit/ci_yaml_validate/gha_yaml_fold_pilot sit in dag/gunbc/ (workflow layer) while the fold pilot is src/v2/extdeps/languages/gha_workflow_yaml_fold.dag — YAML-the-language rows belong in extdeps/languages/ with GHA-workflow as rows on top, retiring the yaml_check Rust scaffold once parse is grammar-owned. The construction wall that makes the splice class unwritable (a string literal is an ATOM, never a COMPOSITION — joins live in extdeps/languages rows, never workflow code): no-smuggled-programs wall dissolved with program.dag FULL DELETE — shell → intent design.@dispatched 2026-07-02 · adhoc-2040cdfe-46bi:high v:large gunbc
  • openStrictLease allocation model (Policy 0) — every provider exposes strict, non-oversubscribed RunShape offers first: one allocation consumes its declared RAM/swap/CPU budget, period. srv1/srv2 are modeled like ephemeral providers (N fixed slots, hard cgroup caps, read-back receipts before work); Ubicloud is a provider offer with EphemeralVm isolation. Burst/oversubscription explicitly out of scope. Four nouns, no scheduler: RunShape (arch/cpu_tokens/ram/swap/disk/duration/trust/workload_class) · ProviderOffer (provider/isolation/limits/oversubscription_policy/cost) · Allocation (shape×offer→target+lease) · Receipt (effective limits observed, peak usage, pressure/OOM events, release result). Accept (checklist): one real CI job runs under a StrictLease allocation on srv1/srv2 whose Receipt proves effective limits == the offer's declared limits (read back from the live cgroup, never asserted), and a second job requesting more than remaining capacity is refused a lease rather than co-scheduled.i:high v:med gunbc
  • openaffected-set lens (the operator's named example) — witness-level skip is LIVE on the floor (#6061); prove it: (a) soundness — construct a diff that MUST re-run a witness and assert it runs (a skipped-but-affected witness is the fail-open catastrophe); (b) effectiveness — receipts on real scoped diffs (skip counts + wall-clock delta, not claims); (c) fail-closed default — a provenance gap falls back to run-all, witnessed RED-on-perturb. The node-closure half (#6105) inherits the same receipt obligation before it may prune.i:high v:med gunbc
  • openartifact-freshness gate (operator ask: "we need a freshness gate, if we don't already have one") — we half-do: the per-PR drift gate proves committed==emitted for the PR's OWN tree, but drift still LANDED on main (.gitignore stale vs its authority since #6097; found and healed by #6110/#6111) because admission never re-validates against CURRENT main — green-on-branch is not green-on-main. The closing mechanism is the §2 merge-admission freshness block (HELD); this item is its receipt pair: (a) reproduce the landed-drift path as a RED witness, (b) confirm the freshness block refuses it once un-HELD.i:med v:small gunbc

Upcoming

  • openclosed-loop converge re-land — the signed design: base snapshot → edit → three-way diff → gated plan → apply → independent read-back → commit/retract; hostname self-selection (the committed script runs all three hosts' rows unconditionally); sound host admission (own node below); runner-width INCREASE provisioning (today an echo-to-stderr stub). The three-way-diff carrier does not exist yet in dag/gunbc/ — and it is a fold instance, not a bespoke differ (own node below carries the construction steer; this node's dispatch brief inherits it). First acceptance case (deliberately narrow, operator-set): change one srv2 runner-slot memory/swap value — read current → refuse if drifted → apply → read back → commit new base; re-apply is a noop; retract works. Full acceptance (T4 — operator, 2026-07-02; 12-step checklist): reconfigure srv1/srv2 to a NEW runner allocation from the model alone — edit desired (runner width + per-slot memory/swap caps, both hosts) → plan shows exactly the delta → apply per-host → independent read-back proves the new effective values (systemctl show, never our own write echoed back) → receipts commit as the new base; a subsequent hand-edit on either host reds the next converge; retract returns both hosts to the prior allocation; the values survive daemon-reload and a freshly spawned runner unit inherits them. That, not the narrow first case, is this node's done bar. No Ubicloud inside this PR: just make srv1/srv2 mutable safely. This is the real blocker — until it lands, every fabric model is paper.i:high v:large gunbc
  • openrunner allocation v0 — srv1/srv2 as StrictLease runner capacity, hand-config retired (the operational milestone this control plane exists for — operator, 2026-07-02) — desired allocation declared in the model per host (runner slots + labels · per-slot MemoryMax/MemoryHigh/MemorySwapMax/TasksMax · jobserver tokens), applied by converge, proven by read-back. Accept (T4, held alive by T5; checklist): every active runner unit on BOTH hosts matches desired effective values by independent read and a freshly started unit inherits the template drop-ins; admitted heavy concurrency derives from the admission model and GitHub cannot schedule past it (labels/slots ARE the backpressure — generic self-hosted labels cannot bypass heavy admission); receipt records host · unit count · labels · effective values · model hash; RED: a hand-edited srv2 cap reds the next converge/receipt · desired heavy concurrency above admission is rejected · wrong/missing label fails the dispatch witness · unprivileged apply refused before mutation; workload proof: one real CI run on the intended shape with no oom_kill increase and peak memory recorded as a measurement row. Not complete while ANY runner-allocation knob on srv1/srv2 requires a hand edit.i:high v:med gunbc
  • opentemporal-effect-spine-a — temporal realization spine (T1 vocabulary) (operator 2026-07-02; not a workflow engine) — std.temporal_effect: durable facts + plan_next_step_from_prior_receipt_and_lease (single prior+lease; list fold is consumer-side); 🟡 markers on stringly receipt labels + derived step id. RED: approval/lease/read-back gates. Non-goals: live mutation, DB, scheduler. Accept (T1): witness suite green.@dispatched 2026-07-02 · zesty-bat-588i:high v:small gunbc
  • openos-install-deduction-a — preflight + KVM diagnostic vocabulary (T1) (operator 2026-07-02; deduction half; NOT wired to srv3_os_install_diagnostic until reconcile-a) — gunbc.os_install_deduction: fold_nbd_proxy_os_install_preflight_verdict (NBD-proxy/on-ISO actuator scope — NoCloudNet incomplete for this path only), storage policy on payload, TargetDiskState, weak KVM verdicts (KvmFirmwareIdleObserved, KvmSuggestsOsBooted; OsInstalled reserved for router read-back). RED: remove storage flips ReadyToBoot; KVM login ≠ OsInstalled. Non-goals: live mutation, monitoring product, DB. Accept (T1): witness suite green.@dispatched 2026-07-02 · zesty-bat-588i:high v:small gunbc
  • opensrv3-install-reconcile-a — dry-run reconcile entrypoint (queued; gated on temporal-effect-spine-a + os-install-deduction-a) — InstallAttemptIntent + workflow steps as data; srv3_os_install_reconcile folds preflight + diagnostic + temporal spine; dry-run first. Accept (T3): dry-run receipt on srv1 actuator host.i:high v:med gunbc
  • openresource-namespace-upsert-a — vocabulary only (#6134 srv3 bringup follow-up; operator reshape 2026-07-03) — std.upsert_decision (ObservationVerdict + UpsertDecision<P>); domain modules gunbc.file_access, gunbc.session_lease, gunbc.install_media. RED: foreign process on 10809=Conflict not kill; outside-namespace chmod=Refuse; drifted seeded ISO plans Remaster not Converged. Non-goal: live srv3 mutation.i:high v:small gunbc
  • openinstall-media-generic-layer — extract Ubuntu flavor from process — split extdeps/os/install_media.dag generic shapes (fetch/remaster/serve verdicts) from ubuntu_* flavor rows; move .gunbc-content-hash sidecar + remaster policy to gunbc/install_media_*; mandatory before second OS/distro. Post-#6134.i:high v:med gunbc
  • opennbd-serve-held-session-lease — NbdProxyServeSession intent with port/pid/cmdline/ISO/token fingerprint; classification + plan INSTANTIATE std.upsert_decision (ObservationVerdict + UpsertDecision<P>; domain facts as the P payload — do NOT mint a parallel lease vocabulary, cf. the fork-census 2026-07-03). RED: foreign 10809 no kill; stale matching session drains only. Live consumer: srv3 actuator.i:high v:med gunbc
  • opensrv3-boot-action-diagnostic — Redfish vs ipmitool fallback state machine — separate transports for BmcBootAction; boot refused unless serve RunningExpected; NoRebootObserved → optional IpmiResetFallback with separate approval; OutOfBandHostActionReceipt until modeled.i:high v:small gunbc

Done

  • reviewfix the CD transport premise — a deploy needs a target-host proof — deploy_dashboard_srv1 is a srv1 effect, but job placement is not an srv1 proof: LocalShell with principal runner assumed the runner is ON srv1 (#6093), while [self-hosted, linux, arm64] can land on srv2 (and during the Ubicloud window it was a rented VM). A LocalShell deploy is valid ONLY when the runner identity proves it is already on srv1 — either pin the job to an srv1-specific trusted runner label, or make the effect SshShell-over-tailnet with an explicit srv1 target + typed credential (#6066 Phase 2). Until then every main push gambles the deploy host.@dispatched 2026-07-01 · adhoc-75790c4c-4e0i:high v:small gunbc
  • reviewcompile-clean shard A — partition boundary + ONE shard + compose proof — the direct attack on the serial wall (lever c above): identify the module partition boundary for dag_compile_clean_gate, run ONE module shard (manually or via minimal wrapper), and prove the shard verdict composes with the existing whole-tree gate (a shard-green ∧ … ∧ shard-green tree is whole-tree green, and a broken module reds its shard). Non-goals: NO floor-plan/scheduler integration, no width tuning. The partition receipt is the deliverable even if enrollment never follows.@dispatched 2026-07-01 · adhoc-3e95c046-279i:high v:small gunbc
  • doneresolver pathology A — profile receipt only — the 518s resolve: reproducible scripts/profile-cold-resolve.sh; top-N entry offenders; pair budget_roster_completeness_test vs fold_list_generic_instantiation (34.7× cold wall); hypothesis: typecheck_module in reconcile_with_typed_cache.@dispatched 2026-07-01 · adhoc-51b0b8e7-0bei:high v:small gunbc
  • reviewlive read, first slice: one runner unit's memory knobs — read MemoryMax/MemorySwapMax/MemoryHigh for ONE live actions-runner instance and ground the result into the ConvergeTarget semantics (no string flattening). Non-goals: no patch/apply engine, no runner-count reconciliation, no timer. RED: a fixture read that differs from base refuses convergence (NotConverged); green receipt: one real srv2 unit read grounded into the model. Stop-and-return if systemctl read output cannot be represented typed.@dispatched 2026-07-01 · adhoc-1e9d7c44-bcci:high v:small gunbc
  • reviewprivilege model for host mutation — converge writes /etc/systemd/system/*.d and runs systemctl set-property (root), but #6096's service ran as the operator user with || true swallowing EPERM; extend DeployAccess/host_effect so an unprivileged apply is a typed refusal BEFORE mutation, never a swallowed failure. RED: unprivileged mutation emits no shell / no host_effect_apply; green: the privileged modeled path applies in a fixture.@dispatched 2026-07-01 · adhoc-3b95241c-d5di:high v:small gunbc
  • donemechanism inventory with red-controls — census every wired gate/lens/cache (floor-plan roster + commit_workflow): what it claims · its discriminating RED witness · its last execution receipt. Anything without a red-control gets one or gets demoted/deleted. The inert-lens backstop (#5433) covers wiring; this covers claim-vs-behavior.@dispatched 2026-07-01 · adhoc-c67edbed-916i:med v:large gunbcplan
`, contentType: 'text/html; charset=utf-8', status: 200 }, { method: 'GET', pathRe: /^\/roadmap$/, body: `gunbc — roadmap

gunbc — roadmap

0. Priorities — current execution order (rearranged 2026-07-06)

The two pillars — §1 get off v1, §2 own the compute fabric — stand as the strategic goal. This section is the current priority ordering over them and the walls that keep them honest, rearranged 2026-07-06 to frontload the compile wall and complexity enforcement: fix what blocks CI now, then make the regression classes unwritable before they recur (construction over after-the-fact catching, DESIGN §5). Each item points into the detailed lane; work dispatches from the lane, not from the pointer. Lanes marked un-shelved here are moved out of §4 by this ordering.

① Compile wall — the acute blocker. The .dag compile-clean floor runs 100+min (#6239), past the CI job kills, so every PR is red on the floor and the rust-gate timeout thrash (the 10-min-drift #6339 + witness #6342, 2026-07-06) is a downstream symptom of the wall outgrowing the step budgets. Levers, in leverage order: affected-set-scope the compile-clean to the changed node-closure (→ ③), cross-run resolve memoization, per-module shard so spawn_width finally applies to the dominant node. Detail: §2 kill the serial compile-clean wall.

② Complexity enforcement, whole codebase (frontloaded — un-shelved from §4). Make the regression classes unwritable, not caught-after: the repo-wide complexity budget, the enforcement-intent gate (StandingIntent ⇄ LensContract ⇄ CoverageReceipt, fail-closed — a mechanism claiming enforcement is complete only when the gate proves it from receipts), intent-linearity (model the axioms A1–A3 and enforce the syllogism — every claim a consequence-chain back to an axiom, no orphan and no cycle; draft), and the gap analysis — which regression classes cannot be caught yet (the expressibility frontier: wall vs lens vs review; frontier). Detail: §3 enforcement intent + model-quality walls; §4 complexity budget whole-codebase + fail-closed meta band (promoted here).

③ Affected set live in CI — per-PR selection that shrinks the floor to the changed node-closure and returns witness enrollment to affected-set-shrunk discovery (today enrollment is opt-in because selection is not live — itself a compile-wall multiplier). Obligations: soundness (a skipped-but-affected witness is the fail-open catastrophe), effectiveness receipts on real scoped diffs, fail-closed default on a provenance gap. Detail: §2 affected-set de-fork; §3 affected-set lens.

④ Realization — inhabit the content-addressed carrier so caching, memoization, and provisioning all derive from one content-hash instead of N hand-rolled caches (v2 still hand-rolls ParseTable; floor shared-compute memoization is a Realization arm; DESIGN §2). Includes the dag↔v2 de-fork grounding — the fixed point must be well-defined over ONE algebra. Includes execution-as-realization (operator-affirmed 2026-07-07): run ≜ realize ∘ materialize ∘ dependency_view (spine) — interpreted-vs-compiled is a per-node realization policy, not an architecture. The interpreter is the pay-every-run realizer; the emitted native artifact is the pay-once-per-content-hash one, so emit-on-demand (emit closure → build → run, artifact Shared by content-hash) is the canonical execution path for a closed static substrate — no bytecode VM, no JIT (nothing dynamic left to profile; DESIGN §4). The tree-walker's surviving roles (bootstrap S1 receipts · compile-time eval) are bounded scaffolds dissolving with §1 self-hosting. Materialization placement is derived, never hand-added (operator, 2026-07-09 — the state×decision ladder, std.materialization_ladder): demand is read off ONE nested DependencyView — scopes nest eval → plan → process → emitted shell → CI run, a 'run' at any layer being a frame one scope up, never a different kind of thing (every layer is emitted from the same substrate, so the qualifier reaches all of them: it injects a content-hash skip into emitted shell as readily as a Share inside the plan). The law: plurality of demand per identity per frame decides — 0×pure = dead code, 0×effect = the effect is the use, 1 = Recompute, ≥2 with shared-state LCA = authored duplication (ERROR, rewire), ≥2 across isolation = memo obligation at the LCA that MUST be discharged by a covering content-keyed provider with declared eviction (ScopeExit scoped / SpacePacked persistent — dropping pure facts is always sound); declared-emergent frames (retry replay, unbounded siblings: server loops, CI-runs-over-time) obligate UP FRONT — expected emergent redundancy unprepared-for is an error, unexpected emergence is typed acceptance that converts to a declared row next run; an ExistenceKeyed provider is refused (existence ≠ identity — the build-if-absent red, #6352); a redundant WorldRead without a declared staleness envelope is refused (a TTL is a confession: unmodeled dependency or undeclared staleness). Un-shelves §4 caching completion's 'one Materialization kernel'; subsumes ①'s 'cross-run resolve memoization' and §2's 'NOT cross-run caching' into per-node derived verdicts; §3-convergence: v1.compiler.ownership's binding_fan_out is the eval-frame instance (Threaded-excluded plurality; SoleOwner/SharedError), retiring with the seed. Displaced cost already paid: the 9 GB retain-forever resolve store · build-if-absent stale binary · the ~275s double-resolve · the 3× CI release build. Detail: duplicate-work. Detail: §1 de-fork grounding cluster + emit-on-demand execution; §2 shared-compute memoization.

⑤ Everything linear / efficient / minimal — dev UX (un-shelved from §4). The authoring experience is minimal and non-redundant: fold-ergonomics (inert-abstraction lens, non-fold-residue audit, ban source comments), namespace-only resolution (minimal naming, delete import, no ambiguity — operator-signed 2026-07-06, its two rules are the §2/§4 minimality + no-ambiguity walls; gated on the SymbolIndex substrate; design), and local iteration speed. Detail: §4 fold-ergonomics lane (promoted); the namespace-only lane.

1. Get off v1 — v2 self-hosts (TERMINAL: \`src/v1\` deleted)

Anchor (do not flip-flop): .dag = truth; v2 emits its own seed (no stage0 hand-edits); the trust chain is discharged by execution; then the hand-written seed is deleted. Terminal is hand-written compiler logic → 0, not zero bytes of Rust: a pinned v2-emitted bootstrap kernel (~8–15k LOC — claim_executor, evaluator host-physics, the regen oracle) survives as the content-addressed seed. → plan · de-fork audit · seed census

Ground truth (2026-07-05): src/v1 = ~174k hand-written .rs LOC (the ~154k figure in older docs is stale) + 44 .dag files of v1's own modeling; src/v2 = 874 .dag, zero .rs. HAND_MAINTAINED roster is down 24 → 7 files + module_path_index (~22.3k LOC: the three lens projections drained #6158/#6211/#6212; phase_profile.rs ADDED 2026-07-04 with its own dissolution trigger); patch_* is fully dead in-tree; the dag_collect pair briefly went HAND-only in #6262's regen unbreak, then RETURNED to GENERATED in #6239 (registry authority verified 2026-07-05: regen_stage0.rs GENERATED includes the pair, HAND count 7, witness pins 92). The regen gate proves byte-identity per the COMMITTED seed (two-generation): emitter improvements are latent until a cutover, and the cargo-green receipt is episodic (#[ignore], ~3–5min), not continuous — today's walls are byte-identity + the full 92-file byte fixed point (#6218) + well-typed emit. INTERIM (operator-accepted, 2026-07-05): the CI floor's compile-clean step cannot complete inside its 10-minute step budget (#6232; restructured #6273 so a breach fails the STEP loudly instead of cancelling the job silently, and rust_tests fits at 30min) while compile-clean runs ~40+min, so these walls are proven by LOCAL execution with documented receipts, not by CI, until the §2 compile-clean work lands.

◆ Milestones: front-end ✓ · emit-rust well-typed ✓ · cross-tree import ✓ (#5473) · emitted crate cargo-green, 0 rustc errors ✓ (#5777/#5873, re-verified #6099 — for the THEN-seed; fresh emit is red today, see NOW) · regen --verify in CI ✓ (#5873) · interim fixpoint gate, 2-of-92 roster ✓ (#6009) · full-roster 92-file byte-fold + host-grounded digest ✓ (#6218) · v1 self-resolution: #6235 arm fixed ✓ (#6250) · #6241 get-registry arm ✓ (#6255, operator-resolved collision) · #6242 comment/registry break ✓ (#6262 — third dark-regen break in four days) · emitter mass fix ✓ (#6243 merged 2026-07-05: the 1667-error fresh-emit red root-caused to ONE field_is_boxed predicate bug = 1482 of 1667, plus the 139-error alias-brand/use-line import class; #6266 = byte-identical template hygiene) → ▸ NOW: post-#6243 fresh-emit re-measure receipt → regen cutover #1 (pre-reqs: #6243 ✓ · #6270 registry backfill ✓ · defensive committed-vs-fresh sweep) · HAND queue drain · fixed-point residue (Node-level compare + placeholder hashes) → seed-honesty (DDC) → TERMINAL: src/v1 deleted

2. Compute fabric — own the infra (CI · deploy · control plane)

State (2026-07-01): required CI is back on the fleet after the Ubicloud detour (#6107, reverted #6111). The detour was the diagnostic and emergency valve, not a failure: it proved raw VM isolation alone does not solve a serial floor (same ~50min wall on both runner types), and it stays the break-glass/burst option, just not the active required path. So the active work is (1) reduce floor recompute, (2) make fleet admission/caps safe — the dominant wall-clock is inside the floor, not host placement alone. The fleet — srv1/srv2 (128c/125GiB Ampere) + srv3 (greenfield, OpenBMC) — carries agent sessions, the dashboard, and all runners, with live cgroup caps, runner registration, sudoers, and tailscale-ACL actuation still hand-managed; the fleet-era OOM/sccache exposure returned with the traffic (operator-accepted interim). #6096 (fleet converge control plane) was closed unmerged; its review gap-list is the re-land spec, and the findings apply to the committed .github/fleet-converge.sh too (mutate-then-read, || true swallowing, no hostname dispatch) — the re-land is an architecture change, not a rebase. → CI humming · host-effect orchestration · compute envelope · charter · host-converge inventory

The core design rule (operator-signed, 2026-07-01): provider-specific power is earned behind a ProviderOffer adapter; the core fabric only knows RunShape → Allocation → Receipt; default allocation is strict/ephemeral; oversubscription is an optimization proven by receipts, never assumed by placement. Not "Ubicloud vs fleet" — GitHub Actions asks for a RunShape, the fabric chooses a ProviderOffer (srv1/srv2 fixed-host slice, Ubicloud ephemeral VM, or later others). srv1/srv2 are modeled as little Ubiclouds first (N strict slots, hard caps, read-back receipts); their richer allocation opportunity (stranded cores, burst, co-residency) is Phase 2, earned by receipts.

◆ Milestones: OOM root-caused (hand-set caps vs measured peaks + budget double-count) ✓ · Ubicloud stabilization trialed ✓ (#6107) → reverted, operator call (#6111 — no wall-clock win; width=9 was live by construction and never touched the serial wall) · converge shell emitted ✓ (#5725/#5827) · apply() Phase A ✓ (#5756) · CD to srv1 ✓ (#6030/#6060/#6093) · witness-level affected-set pruning LIVE ✓ (#6061) → ▸ NOW: kill the serial compile-clean wall · floor <1min · CD wrong-host fix · stateless-frontend MVP (first non-CI fabric consumer) · converge re-land to the signed design → srv1/srv2 runner-allocation v0 (hand-config retired) → StrictLease + shape labels → dormant-Ubicloud provider row (design-break probe) → periodic actuation with receipts → srv3 OsInstalled · apply() Phases B–D → TERMINAL: required CI runs on the compute fabric — the model can choose any admitted ProviderOffer, the receipt proves the shape was honored, and install/manage/decom all ride apply() with fail-closed receipts

Acceptance rule (operator, 2026-07-02): an item is not complete because its algebra exists — it is complete only when a NAMED consumer uses it on the LIVE path and produces a receipt (DESIGN §5: a typecheck or a grep is not a consumer). Completion tiers: T0 modeled · T1 fixture/synthetic witness · T2 wired to the intended consumer (proof by consumption, never grep) · T3 live dry-run receipt · T4 live apply + independent read-back receipt · T5 a periodic/CI consumer keeps it alive. Every dispatchable node states Accept: — its required tier plus an operator-checkable end state on the real fleet (what is different on srv1/srv2 or in CI afterward) plus a discriminating RED; control-plane/fabric items close at T4/T5, and anything below the named tier is a subtask, never completion. A sized node without an explicit Accept is not ready to dispatch; algebra, carriers, and lenses are mechanisms and never their own acceptance. The bar for real progress: can srv1/srv2 runner allocation be changed through the model, read back, re-run safely, and retracted? Until yes, the work is scaffolding. Full per-node checklists: fleet acceptance criteria — the node's Accept line is the summary, the doc is the checklist, and edits to one land with the other.

Now — correctness of the current posture

Fabric-hostable rule (operator-signed): a service is fabric-hostable when it is expressible as immutable storage + stateless compute + explicit route + read-back receipt; anything requiring local mutable state is not fabric-portable until its state moves into a StorageBinding. "Connect the right users to the right resources" is the fabric's future value, not active work: RoutePolicy (nearest/cheapest/least-loaded/trust), multi-replica routes, cert/DNS automation land later, when they hurt — the first version connects ONE domain to ONE admitted allocation and proves it did.

Floor throughput — reduce work, then schedule it (26m → <1min on a typical PR)

Receipts + adjacent levers: fractal Gantt · memory chronicle · resolver pathology profile · representation minimization · shared-compute memoization (M1 ✓ #6008; M2 gated on determinism #5941) · OOM reclassification · post-engine deferred ledger + algorithm audit · CI-performance tanking evidence — 2026-07-10/11 main-red incident.

Control plane — the #6096 re-land, done right (G2/G3)

Fabric dispatch — RunShape → Allocation → Receipt (GitHub is the queue, not the scheduler)

Ordering (operator-signed): ① CD target-host proof → ② stateless-frontend MVP receipt (milestone A, on the existing deploy path) → ③ live read seam + privilege model → ④ one converge hunk closed-loop end-to-end (the narrow srv2 acceptance case) → ⑤ service allocation generalized from the frontend MVP → ⑥ StrictLease + shape labels; register srv1/srv2 slots by shape → ⑦ dormant Ubicloud row proves no design break → ⑧ CI jobs move to shape labels → ⑨ receipts (effective limits · peaks · OOM/swap pressure) → ⑩ BurstLease / dynamic routing / richer placement. ①–④ make infra changeable (everything else is paper until then); ⑤ proves the fabric is not just CI; ⑥ fixes backpressure with no scheduler; ⑦ validates the abstraction before we depend on it; ⑧–⑨ make CI consume the model; ⑩ recovers stranded cores.

Fleet hardening — make our metal safe for the load it carries

3. The floor — audit what we have (does it actually do what it claims?)

Both pillars ride the CI floor: tree-wide marker-driven witness discovery · compile-clean gate · generated-artifact drift gates (this document is one) · regen --verify (#5873) · doc-graph reachability · emit-determinism (#5941) · the interim self-host comparison (#6009). Those stand. The floor's expansion lanes (testgen, wiring-liveness, complexity gates, lens meta-walls) are shelved — a new wall must displace a measured cost on a pillar path to un-shelve (the enforcement-intent gate below is the first such un-shelve, 2026-07-02: displaced cost = the operator's repeated manual what-is-enforced-by-what-lens-over-what-corpus join, plus CI-killing quadratics and repeated dual-representation/anemia rediscovery).

Audit directive (operator, 2026-07-01): thoroughly audit what we have and what it actually does. For each load-bearing mechanism, prove by execution that it does what it claims, with a discriminating perturb that goes RED when the behavior is wrong — a typecheck or a grep is not a consumer (DESIGN §5), and a wired gate can still be vacuous. A mechanism claim without a red-control is unverified, whatever its docs say. The reset's own mapping found the pattern live: the committed converge shell is spec-without-execution (§2), the fixpoint gate self-declares interim (2-of-92 files), cargo-green is an ignored test. Highest-stakes mechanisms first:

Audit — green by execution, red by perturbation

Cost / risk / benefit — the floor's unmodeled optimization

Open floor holes

4. Shelved (parked 2026-07-01 — not deleted)

Every lane below was live roadmap before the reset. Shelved = plan docs and carriers stay in place, nothing dispatches from here, and the git-history ROADMAP.md holds the full pre-reset detail (structure, milestones, sign-off states). Un-shelve by PR into §1–§3, priced in displaced cost. (2026-07-06: the complexity budget whole-codebase, fail-closed meta band, and fold-ergonomics lanes are un-shelved into §0's priority order ② and ⑤ — this reshuffle is that PR; their nodes stay catalogued here until relocated into their §2/§3 lanes.)

`, contentType: 'text/html; charset=utf-8', status: 200 }]; +.frontier-done h2 { color: #0a3622 } +.three-gate-progress { display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px } +.three-gate-progress h2 { margin: 0 0 4px } +.gate-row { border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #fff } +.gate-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px } +.gate-name { font-weight: 600; font-size: 14px } +.gate-count { font-family: ui-monospace, monospace; font-size: 13px; color: #555; font-variant-numeric: tabular-nums } +.gate-bar { height: 10px; border-radius: 5px; background: #eef1f4; overflow: hidden; margin-bottom: 8px } +.bar-fill { height: 100%; background: #2da44e } +ul.bricks { list-style: none; padding-left: 0; display: flex; flex-direction: column; gap: 3px } +li.brick { font-size: 12px; padding: 1px 0; color: #444; display: flex; align-items: baseline } +.brick-state { display: inline-block; flex: 0 0 auto; width: 62px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; margin-right: 8px } +.brick-inflight .brick-state { color: #9a6700 } +.brick-gated .brick-state { color: #999 }gunbc — roadmap

gunbc — roadmap

v1-delete bar: three gates

Gate 1 — the emitter re-emits itself3 / 8
  • in flightONE comprehensive emit import-closure derivation: the emitted module import set = the transitive closure of every type/module name any emitted construct references (params, body, inferred, nested-record struct literals AND their sibling-module field types, carrier types, referenced modules). Replaces the per-face gates (faithful-carrier, struct-field StructRepr-only, module-manifest). FreeMonoid was ONE layer of this, not the whole gate
  • in flightGeneric-type rendering fix: an unbound TypeVariable in an applied type must REFUSE, not render — root is the fold acc-type fallback path (emit_rust_fold_method_call -> lambda_acc_type_str/lambda_param_type_strs with fold_acc_uses_fallback) plus render_rust_type not refusing an unbound T inside an applied type. A DISTINCT class from import-closure (generic rendering, not a missing import); blocks 04_infer/06_translate/05_emit; same family as #6881 fn_generic_param_names threading
  • gatedEmit representation-mismatch layer: after import-closure + generic-T clear, each deep module still shows ~4400 E0308 type mismatches (04_infer E0308x4261; 06_translate + 05_emit E0308x4422) — the model-vs-realization fork surfacing in emit (modeled coproduct types where native Rust/Value types are expected, and vice versa)
  • gatedSelf-emit lanes for the Rc-heavy core: 04_infer, 06_translate, the 05_emit family — fan out in parallel with the flip wave once import-closure + generic-T + representation-mismatch reach cargo-green
  • gatedThe emitted emitter re-emits itself: behavioral 2-generation fixed point on the v2 side (not byte identity)
Gate 2 — honest typed frontier3 / 4
  • in flightDECISION: namespace-gated modules (03_resolve, 03_name_resolve) + body-producer tail — renegotiate migration triggers to emit under the current design (accept a later re-emit), or exclude from the 2-week scope
Gate 3 — verification ledger green by execution3 / 7
  • in flightThe ledger self-updates: project family dispositions from the ci_layer_roots.dag probe_red carrier instead of hand-declared literals (DESIGN section 3 single authority)
  • gatedSpine receipt: whole-corpus COLD v1-vs-v2 witness parity with zero unexplained divergence — a deliberate executed run, not a soak
  • gatedSpine receipt: compile-clean parity — the v2-emitted path compiles the corpus clean, matching v1
  • gatedSpine receipt: regen behavioral fixed point — regen_stage0 on the v2-emitted sources reproduces a behaviorally-equivalent emitter

0. Priorities — current execution order (rearranged 2026-07-06)

The two pillars — §1 get off v1, §2 own the compute fabric — stand as the strategic goal. This section is the current priority ordering over them and the walls that keep them honest, rearranged 2026-07-06 to frontload the compile wall and complexity enforcement: fix what blocks CI now, then make the regression classes unwritable before they recur (construction over after-the-fact catching, DESIGN §5). Each item points into the detailed lane; work dispatches from the lane, not from the pointer. Lanes marked un-shelved here are moved out of §4 by this ordering.

① Compile wall — the acute blocker. The .dag compile-clean floor runs 100+min (#6239), past the CI job kills, so every PR is red on the floor and the rust-gate timeout thrash (the 10-min-drift #6339 + witness #6342, 2026-07-06) is a downstream symptom of the wall outgrowing the step budgets. Levers, in leverage order: affected-set-scope the compile-clean to the changed node-closure (→ ③), cross-run resolve memoization, per-module shard so spawn_width finally applies to the dominant node. Detail: §2 kill the serial compile-clean wall.

② Complexity enforcement, whole codebase (frontloaded — un-shelved from §4). Make the regression classes unwritable, not caught-after: the repo-wide complexity budget, the enforcement-intent gate (StandingIntent ⇄ LensContract ⇄ CoverageReceipt, fail-closed — a mechanism claiming enforcement is complete only when the gate proves it from receipts), intent-linearity (model the axioms A1–A3 and enforce the syllogism — every claim a consequence-chain back to an axiom, no orphan and no cycle; draft), and the gap analysis — which regression classes cannot be caught yet (the expressibility frontier: wall vs lens vs review; frontier). Detail: §3 enforcement intent + model-quality walls; §4 complexity budget whole-codebase + fail-closed meta band (promoted here).

③ Affected set live in CI — per-PR selection that shrinks the floor to the changed node-closure and returns witness enrollment to affected-set-shrunk discovery (today enrollment is opt-in because selection is not live — itself a compile-wall multiplier). Obligations: soundness (a skipped-but-affected witness is the fail-open catastrophe), effectiveness receipts on real scoped diffs, fail-closed default on a provenance gap. Detail: §2 affected-set de-fork; §3 affected-set lens.

④ Realization — inhabit the content-addressed carrier so caching, memoization, and provisioning all derive from one content-hash instead of N hand-rolled caches (v2 still hand-rolls ParseTable; floor shared-compute memoization is a Realization arm; DESIGN §2). Includes the dag↔v2 de-fork grounding — the fixed point must be well-defined over ONE algebra. Includes execution-as-realization (operator-affirmed 2026-07-07): run ≜ realize ∘ materialize ∘ dependency_view (spine) — interpreted-vs-compiled is a per-node realization policy, not an architecture. The interpreter is the pay-every-run realizer; the emitted native artifact is the pay-once-per-content-hash one, so emit-on-demand (emit closure → build → run, artifact Shared by content-hash) is the canonical execution path for a closed static substrate — no bytecode VM, no JIT (nothing dynamic left to profile; DESIGN §4). The tree-walker's surviving roles (bootstrap S1 receipts · compile-time eval) are bounded scaffolds dissolving with §1 self-hosting. Materialization placement is derived, never hand-added (operator, 2026-07-09 — the state×decision ladder, std.materialization_ladder): demand is read off ONE nested DependencyView — scopes nest eval → plan → process → emitted shell → CI run, a 'run' at any layer being a frame one scope up, never a different kind of thing (every layer is emitted from the same substrate, so the qualifier reaches all of them: it injects a content-hash skip into emitted shell as readily as a Share inside the plan). The law: plurality of demand per identity per frame decides — 0×pure = dead code, 0×effect = the effect is the use, 1 = Recompute, ≥2 with shared-state LCA = authored duplication (ERROR, rewire), ≥2 across isolation = memo obligation at the LCA that MUST be discharged by a covering content-keyed provider with declared eviction (ScopeExit scoped / SpacePacked persistent — dropping pure facts is always sound); declared-emergent frames (retry replay, unbounded siblings: server loops, CI-runs-over-time) obligate UP FRONT — expected emergent redundancy unprepared-for is an error, unexpected emergence is typed acceptance that converts to a declared row next run; an ExistenceKeyed provider is refused (existence ≠ identity — the build-if-absent red, #6352); a redundant WorldRead without a declared staleness envelope is refused (a TTL is a confession: unmodeled dependency or undeclared staleness). Un-shelves §4 caching completion's 'one Materialization kernel'; subsumes ①'s 'cross-run resolve memoization' and §2's 'NOT cross-run caching' into per-node derived verdicts; §3-convergence: v1.compiler.ownership's binding_fan_out is the eval-frame instance (Threaded-excluded plurality; SoleOwner/SharedError), retiring with the seed. Displaced cost already paid: the 9 GB retain-forever resolve store · build-if-absent stale binary · the ~275s double-resolve · the 3× CI release build. Detail: duplicate-work. Detail: §1 de-fork grounding cluster + emit-on-demand execution; §2 shared-compute memoization.

⑤ Everything linear / efficient / minimal — dev UX (un-shelved from §4). The authoring experience is minimal and non-redundant: fold-ergonomics (inert-abstraction lens, non-fold-residue audit, ban source comments), namespace-only resolution (minimal naming, delete import, no ambiguity — operator-signed 2026-07-06, its two rules are the §2/§4 minimality + no-ambiguity walls; gated on the SymbolIndex substrate; design), and local iteration speed. Detail: §4 fold-ergonomics lane (promoted); the namespace-only lane.

1. Get off v1 — v2 self-hosts (TERMINAL: \`src/v1\` deleted)

Anchor (do not flip-flop): .dag = truth; v2 emits its own seed (no stage0 hand-edits); the trust chain is discharged by execution; then the hand-written seed is deleted. Terminal is hand-written compiler logic → 0, not zero bytes of Rust: a pinned v2-emitted bootstrap kernel (~8–15k LOC — claim_executor, evaluator host-physics, the regen oracle) survives as the content-addressed seed. → plan · de-fork audit · seed census

Ground truth (2026-07-05): src/v1 = ~174k hand-written .rs LOC (the ~154k figure in older docs is stale) + 44 .dag files of v1's own modeling; src/v2 = 874 .dag, zero .rs. HAND_MAINTAINED roster is down 24 → 7 files + module_path_index (~22.3k LOC: the three lens projections drained #6158/#6211/#6212; phase_profile.rs ADDED 2026-07-04 with its own dissolution trigger); patch_* is fully dead in-tree; the dag_collect pair briefly went HAND-only in #6262's regen unbreak, then RETURNED to GENERATED in #6239 (registry authority verified 2026-07-05: regen_stage0.rs GENERATED includes the pair, HAND count 7, witness pins 92). The regen gate proves byte-identity per the COMMITTED seed (two-generation): emitter improvements are latent until a cutover, and the cargo-green receipt is episodic (#[ignore], ~3–5min), not continuous — today's walls are byte-identity + the full 92-file byte fixed point (#6218) + well-typed emit. INTERIM (operator-accepted, 2026-07-05): the CI floor's compile-clean step cannot complete inside its 10-minute step budget (#6232; restructured #6273 so a breach fails the STEP loudly instead of cancelling the job silently, and rust_tests fits at 30min) while compile-clean runs ~40+min, so these walls are proven by LOCAL execution with documented receipts, not by CI, until the §2 compile-clean work lands.

◆ Milestones: front-end ✓ · emit-rust well-typed ✓ · cross-tree import ✓ (#5473) · emitted crate cargo-green, 0 rustc errors ✓ (#5777/#5873, re-verified #6099 — for the THEN-seed; fresh emit is red today, see NOW) · regen --verify in CI ✓ (#5873) · interim fixpoint gate, 2-of-92 roster ✓ (#6009) · full-roster 92-file byte-fold + host-grounded digest ✓ (#6218) · v1 self-resolution: #6235 arm fixed ✓ (#6250) · #6241 get-registry arm ✓ (#6255, operator-resolved collision) · #6242 comment/registry break ✓ (#6262 — third dark-regen break in four days) · emitter mass fix ✓ (#6243 merged 2026-07-05: the 1667-error fresh-emit red root-caused to ONE field_is_boxed predicate bug = 1482 of 1667, plus the 139-error alias-brand/use-line import class; #6266 = byte-identical template hygiene) → ▸ NOW: post-#6243 fresh-emit re-measure receipt → regen cutover #1 (pre-reqs: #6243 ✓ · #6270 registry backfill ✓ · defensive committed-vs-fresh sweep) · HAND queue drain · fixed-point residue (Node-level compare + placeholder hashes) → seed-honesty (DDC) → TERMINAL: src/v1 deleted

2. Compute fabric — own the infra (CI · deploy · control plane)

State (2026-07-01): required CI is back on the fleet after the Ubicloud detour (#6107, reverted #6111). The detour was the diagnostic and emergency valve, not a failure: it proved raw VM isolation alone does not solve a serial floor (same ~50min wall on both runner types), and it stays the break-glass/burst option, just not the active required path. So the active work is (1) reduce floor recompute, (2) make fleet admission/caps safe — the dominant wall-clock is inside the floor, not host placement alone. The fleet — srv1/srv2 (128c/125GiB Ampere) + srv3 (greenfield, OpenBMC) — carries agent sessions, the dashboard, and all runners, with live cgroup caps, runner registration, sudoers, and tailscale-ACL actuation still hand-managed; the fleet-era OOM/sccache exposure returned with the traffic (operator-accepted interim). #6096 (fleet converge control plane) was closed unmerged; its review gap-list is the re-land spec, and the findings apply to the committed .github/fleet-converge.sh too (mutate-then-read, || true swallowing, no hostname dispatch) — the re-land is an architecture change, not a rebase. → CI humming · host-effect orchestration · compute envelope · charter · host-converge inventory

The core design rule (operator-signed, 2026-07-01): provider-specific power is earned behind a ProviderOffer adapter; the core fabric only knows RunShape → Allocation → Receipt; default allocation is strict/ephemeral; oversubscription is an optimization proven by receipts, never assumed by placement. Not "Ubicloud vs fleet" — GitHub Actions asks for a RunShape, the fabric chooses a ProviderOffer (srv1/srv2 fixed-host slice, Ubicloud ephemeral VM, or later others). srv1/srv2 are modeled as little Ubiclouds first (N strict slots, hard caps, read-back receipts); their richer allocation opportunity (stranded cores, burst, co-residency) is Phase 2, earned by receipts.

◆ Milestones: OOM root-caused (hand-set caps vs measured peaks + budget double-count) ✓ · Ubicloud stabilization trialed ✓ (#6107) → reverted, operator call (#6111 — no wall-clock win; width=9 was live by construction and never touched the serial wall) · converge shell emitted ✓ (#5725/#5827) · apply() Phase A ✓ (#5756) · CD to srv1 ✓ (#6030/#6060/#6093) · witness-level affected-set pruning LIVE ✓ (#6061) → ▸ NOW: kill the serial compile-clean wall · floor <1min · CD wrong-host fix · stateless-frontend MVP (first non-CI fabric consumer) · converge re-land to the signed design → srv1/srv2 runner-allocation v0 (hand-config retired) → StrictLease + shape labels → dormant-Ubicloud provider row (design-break probe) → periodic actuation with receipts → srv3 OsInstalled · apply() Phases B–D → TERMINAL: required CI runs on the compute fabric — the model can choose any admitted ProviderOffer, the receipt proves the shape was honored, and install/manage/decom all ride apply() with fail-closed receipts

Acceptance rule (operator, 2026-07-02): an item is not complete because its algebra exists — it is complete only when a NAMED consumer uses it on the LIVE path and produces a receipt (DESIGN §5: a typecheck or a grep is not a consumer). Completion tiers: T0 modeled · T1 fixture/synthetic witness · T2 wired to the intended consumer (proof by consumption, never grep) · T3 live dry-run receipt · T4 live apply + independent read-back receipt · T5 a periodic/CI consumer keeps it alive. Every dispatchable node states Accept: — its required tier plus an operator-checkable end state on the real fleet (what is different on srv1/srv2 or in CI afterward) plus a discriminating RED; control-plane/fabric items close at T4/T5, and anything below the named tier is a subtask, never completion. A sized node without an explicit Accept is not ready to dispatch; algebra, carriers, and lenses are mechanisms and never their own acceptance. The bar for real progress: can srv1/srv2 runner allocation be changed through the model, read back, re-run safely, and retracted? Until yes, the work is scaffolding. Full per-node checklists: fleet acceptance criteria — the node's Accept line is the summary, the doc is the checklist, and edits to one land with the other.

Now — correctness of the current posture

Fabric-hostable rule (operator-signed): a service is fabric-hostable when it is expressible as immutable storage + stateless compute + explicit route + read-back receipt; anything requiring local mutable state is not fabric-portable until its state moves into a StorageBinding. "Connect the right users to the right resources" is the fabric's future value, not active work: RoutePolicy (nearest/cheapest/least-loaded/trust), multi-replica routes, cert/DNS automation land later, when they hurt — the first version connects ONE domain to ONE admitted allocation and proves it did.

Floor throughput — reduce work, then schedule it (26m → <1min on a typical PR)

Receipts + adjacent levers: fractal Gantt · memory chronicle · resolver pathology profile · representation minimization · shared-compute memoization (M1 ✓ #6008; M2 gated on determinism #5941) · OOM reclassification · post-engine deferred ledger + algorithm audit · CI-performance tanking evidence — 2026-07-10/11 main-red incident.

Control plane — the #6096 re-land, done right (G2/G3)

Fabric dispatch — RunShape → Allocation → Receipt (GitHub is the queue, not the scheduler)

Ordering (operator-signed): ① CD target-host proof → ② stateless-frontend MVP receipt (milestone A, on the existing deploy path) → ③ live read seam + privilege model → ④ one converge hunk closed-loop end-to-end (the narrow srv2 acceptance case) → ⑤ service allocation generalized from the frontend MVP → ⑥ StrictLease + shape labels; register srv1/srv2 slots by shape → ⑦ dormant Ubicloud row proves no design break → ⑧ CI jobs move to shape labels → ⑨ receipts (effective limits · peaks · OOM/swap pressure) → ⑩ BurstLease / dynamic routing / richer placement. ①–④ make infra changeable (everything else is paper until then); ⑤ proves the fabric is not just CI; ⑥ fixes backpressure with no scheduler; ⑦ validates the abstraction before we depend on it; ⑧–⑨ make CI consume the model; ⑩ recovers stranded cores.

Fleet hardening — make our metal safe for the load it carries

3. The floor — audit what we have (does it actually do what it claims?)

Both pillars ride the CI floor: tree-wide marker-driven witness discovery · compile-clean gate · generated-artifact drift gates (this document is one) · regen --verify (#5873) · doc-graph reachability · emit-determinism (#5941) · the interim self-host comparison (#6009). Those stand. The floor's expansion lanes (testgen, wiring-liveness, complexity gates, lens meta-walls) are shelved — a new wall must displace a measured cost on a pillar path to un-shelve (the enforcement-intent gate below is the first such un-shelve, 2026-07-02: displaced cost = the operator's repeated manual what-is-enforced-by-what-lens-over-what-corpus join, plus CI-killing quadratics and repeated dual-representation/anemia rediscovery).

Audit directive (operator, 2026-07-01): thoroughly audit what we have and what it actually does. For each load-bearing mechanism, prove by execution that it does what it claims, with a discriminating perturb that goes RED when the behavior is wrong — a typecheck or a grep is not a consumer (DESIGN §5), and a wired gate can still be vacuous. A mechanism claim without a red-control is unverified, whatever its docs say. The reset's own mapping found the pattern live: the committed converge shell is spec-without-execution (§2), the fixpoint gate self-declares interim (2-of-92 files), cargo-green is an ignored test. Highest-stakes mechanisms first:

Audit — green by execution, red by perturbation

Cost / risk / benefit — the floor's unmodeled optimization

Open floor holes

4. Shelved (parked 2026-07-01 — not deleted)

Every lane below was live roadmap before the reset. Shelved = plan docs and carriers stay in place, nothing dispatches from here, and the git-history ROADMAP.md holds the full pre-reset detail (structure, milestones, sign-off states). Un-shelve by PR into §1–§3, priced in displaced cost. (2026-07-06: the complexity budget whole-codebase, fail-closed meta band, and fold-ergonomics lanes are un-shelved into §0's priority order ② and ⑤ — this reshuffle is that PR; their nodes stay catalogued here until relocated into their §2/§3 lanes.)

`, contentType: 'text/html; charset=utf-8', status: 200 }]; const server = require('http').createServer((req, res) => { const method = req.method || 'GET'; const rawUrl = req.url || '/'; const path = rawUrl.split('?')[0] || '/'; diff --git a/dag/gunbc/roadmap_page.dag b/dag/gunbc/roadmap_page.dag index 2f2fe53126a..2a7cd65bcf7 100644 --- a/dag/gunbc/roadmap_page.dag +++ b/dag/gunbc/roadmap_page.dag @@ -17,9 +17,136 @@ import gunbc.roadmap_status { RoadmapItem, DerivableLine, AuthoredLine, PlainLin import gunbc.roadmap_document { RoadmapDocument, RoadmapSection } import gunbc.roadmap_authority { roadmap_authority, authored_merged_prs } import gunbc.roadmap_spawner { spawn_frontier, SpawnFrontier } +import gunbc.v1_deletion_plan { + v1_deletion_gates, v1_deletion_milestones, PlanGateSpec, PlanMilestone, + PlanGate, GateEmitterFixedPoint, GateHonestFrontier, GateLedgerGreen, GateDeletion, + BrickState, Placed, InFlight, Gated, + BrickRole, BarBrick, SeedShrink, +} fn roadmap_page_max_depth() -> Int { 8 } +fn tg_gate_index(g: PlanGate) -> Int { + match g { + GateEmitterFixedPoint => 0 + GateHonestFrontier => 1 + GateLedgerGreen => 2 + GateDeletion => 3 + } +} + +fn tg_gate_eq(a: PlanGate, b: PlanGate) -> Bool { tg_gate_index(g: a) == tg_gate_index(g: b) } + +fn tg_brick_is_placed(bs: BrickState) -> Bool { + match bs { + Placed => true + InFlight => false + Gated => false + } +} + +fn tg_brick_is_remaining(bs: BrickState) -> Bool { + match bs { + Placed => false + InFlight => true + Gated => true + } +} + +fn tg_brick_state_class(bs: BrickState) -> String { + match bs { + Placed => "placed" + InFlight => "inflight" + Gated => "gated" + } +} + +fn tg_brick_state_label(bs: BrickState) -> String { + match bs { + Placed => "done" + InFlight => "in flight" + Gated => "gated" + } +} + +fn tg_is_bar_brick(m: PlanMilestone) -> Bool { + match m.role { + BarBrick => true + SeedShrink => false + } +} + +fn tg_gate_bricks(g: PlanGate) -> List { + filter(v1_deletion_milestones, m => tg_gate_eq(a: m.gate, b: g) && tg_is_bar_brick(m: m)) +} + +fn tg_gate_total(g: PlanGate) -> Int { count(tg_gate_bricks(g: g)) } + +fn tg_gate_placed(g: PlanGate) -> Int { + count(filter(tg_gate_bricks(g: g), m => tg_brick_is_placed(bs: m.brick_state))) +} + +fn tg_gate_percent(placed: Int, total: Int) -> Int { + if total == 0 { 0 } else { placed * 100 / total } +} + +fn tg_gate_count_label(placed: Int, total: Int) -> String { + concat(to_string(placed), concat(" / ", to_string(total))) +} + +fn tg_bar_fill(pct: Int) -> MarkupNode { + ElementNode { + tag: "div", + attrs: [ + MarkupAttr { name: "class", value: "bar-fill" }, + MarkupAttr { name: "style", value: concat("width: ", concat(to_string(pct), "%")) }, + ], + children: [], + } +} + +fn tg_brick_li(m: PlanMilestone) -> MarkupNode { + el_class("li", concat("brick brick-", tg_brick_state_class(bs: m.brick_state)), [ + el_class("span", "brick-state", [ txt(tg_brick_state_label(bs: m.brick_state)) ]), + el_class("span", "brick-title", [ txt(m.title) ]), + ]) +} + +fn tg_gate_remaining_ul(g: PlanGate) -> MarkupNode { + el_class("ul", "bricks", + map(filter(tg_gate_bricks(g: g), m => tg_brick_is_remaining(bs: m.brick_state)), m => tg_brick_li(m: m))) +} + +fn tg_gate_progress_row(spec: PlanGateSpec) -> MarkupNode { + let total = tg_gate_total(g: spec.gate) + let placed = tg_gate_placed(g: spec.gate) + el_class("section", "gate-row", [ + el_class("div", "gate-head", [ + el_class("span", "gate-name", [ txt(spec.name) ]), + el_class("span", "gate-count", [ txt(tg_gate_count_label(placed: placed, total: total)) ]), + ]), + el_class("div", "gate-bar", [ tg_bar_fill(pct: tg_gate_percent(placed: placed, total: total)) ]), + tg_gate_remaining_ul(g: spec.gate), + ]) +} + +fn tg_is_bar_gate(g: PlanGate) -> Bool { + match g { + GateEmitterFixedPoint => true + GateHonestFrontier => true + GateLedgerGreen => true + GateDeletion => false + } +} + +fn three_gate_progress_markup() -> MarkupNode { + el_class("section", "three-gate-progress", + concat( + [ el("h2", [ txt("v1-delete bar: three gates") ]) ], + map(filter(v1_deletion_gates, spec => tg_is_bar_gate(g: spec.gate)), + spec => tg_gate_progress_row(spec: spec)))) +} + fn txt(s: String) -> MarkupNode { TextNode { text: s } } fn el(tag: String, children: List) -> MarkupNode { @@ -255,7 +382,7 @@ fn roadmap_frontier_markup(frontier: SpawnFrontier, merged: List) -> Markup ]) } -fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List) -> MarkupNode { +fn roadmap_daily_workspace_page_impl(doc: RoadmapDocument, merged: List, main_prefix: List) -> MarkupNode { let frontier = spawn_frontier(doc: doc, merged: merged) ElementNode { tag: "html", @@ -268,19 +395,19 @@ fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List) -> Mark ]), el("body", [ el("header", [ el("h1", [ txt("gunbc — daily workspace") ]) ]), - el_class("main", "daily-workspace", [ + el_class("main", "daily-workspace", concat(main_prefix, [ roadmap_frontier_markup(frontier: frontier, merged: merged), - ]), + ])), dispatch_client_script(), ]), ], } } -fn roadmap_page(doc: RoadmapDocument, merged: List) -> MarkupNode { +fn roadmap_page_impl(doc: RoadmapDocument, merged: List, main_prefix: List) -> MarkupNode { let lead = map(doc.lead_lanes, s => section_markup(s: s, merged: merged)) let secs = map(doc.sections, s => section_markup(s: s, merged: merged)) - let main_children = concat(lead, secs) + let main_children = concat(main_prefix, concat(lead, secs)) let body_base = [ el("header", [ el("h1", [ txt("gunbc — roadmap") ]) ]), el_class("main", "roadmap", main_children), @@ -304,10 +431,18 @@ fn roadmap_page(doc: RoadmapDocument, merged: List) -> MarkupNode { } } +fn roadmap_page(doc: RoadmapDocument, merged: List) -> MarkupNode { + roadmap_page_impl(doc: doc, merged: merged, main_prefix: []) +} + fn roadmap_page_for_authority() -> MarkupNode { - roadmap_page(doc: roadmap_authority(), merged: authored_merged_prs()) + roadmap_page_impl(doc: roadmap_authority(), merged: authored_merged_prs(), main_prefix: [ three_gate_progress_markup() ]) +} + +fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List) -> MarkupNode { + roadmap_daily_workspace_page_impl(doc: doc, merged: merged, main_prefix: []) } fn roadmap_daily_workspace_page_for_authority() -> MarkupNode { - roadmap_daily_workspace_page(doc: roadmap_authority(), merged: authored_merged_prs()) + roadmap_daily_workspace_page_impl(doc: roadmap_authority(), merged: authored_merged_prs(), main_prefix: [ three_gate_progress_markup() ]) } diff --git a/dag/gunbc/roadmap_style.dag b/dag/gunbc/roadmap_style.dag index 9a590d11a2a..40e03df5ff7 100644 --- a/dag/gunbc/roadmap_style.dag +++ b/dag/gunbc/roadmap_style.dag @@ -47,5 +47,18 @@ fn roadmap_css() -> String { css_rule(selector: ".frontier-ready h2", props: "color: #856404"), css_rule(selector: ".frontier-upcoming h2", props: "color: #084298"), css_rule(selector: ".frontier-done h2", props: "color: #0a3622"), + css_rule(selector: ".three-gate-progress", props: "display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px"), + css_rule(selector: ".three-gate-progress h2", props: "margin: 0 0 4px"), + css_rule(selector: ".gate-row", props: "border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #fff"), + css_rule(selector: ".gate-head", props: "display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px"), + css_rule(selector: ".gate-name", props: "font-weight: 600; font-size: 14px"), + css_rule(selector: ".gate-count", props: "font-family: ui-monospace, monospace; font-size: 13px; color: #555; font-variant-numeric: tabular-nums"), + css_rule(selector: ".gate-bar", props: "height: 10px; border-radius: 5px; background: #eef1f4; overflow: hidden; margin-bottom: 8px"), + css_rule(selector: ".bar-fill", props: "height: 100%; background: #2da44e"), + css_rule(selector: "ul.bricks", props: "list-style: none; padding-left: 0; display: flex; flex-direction: column; gap: 3px"), + css_rule(selector: "li.brick", props: "font-size: 12px; padding: 1px 0; color: #444; display: flex; align-items: baseline"), + css_rule(selector: ".brick-state", props: "display: inline-block; flex: 0 0 auto; width: 62px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; margin-right: 8px"), + css_rule(selector: ".brick-inflight .brick-state", props: "color: #9a6700"), + css_rule(selector: ".brick-gated .brick-state", props: "color: #999"), ], "\n") } diff --git a/dag/gunbc/v1_deletion_plan.dag b/dag/gunbc/v1_deletion_plan.dag index e1f63ec7be3..a12d53a4f0a 100644 --- a/dag/gunbc/v1_deletion_plan.dag +++ b/dag/gunbc/v1_deletion_plan.dag @@ -11,6 +11,8 @@ type PlanGate = GateEmitterFixedPoint | GateHonestFrontier | GateLedgerGreen | G type BrickState = Placed | InFlight | Gated +type BrickRole = BarBrick | SeedShrink + type ConfidenceBasis { basis: String, risk: String, @@ -28,6 +30,7 @@ type PlanMilestone { title: String, gate: PlanGate, brick_state: BrickState, + role: BrickRole, parallelism: PlanParallelism, fan_width: Int, days_low: Int, @@ -49,29 +52,29 @@ data v1_deletion_gates: List = [ ] data v1_deletion_milestones: List = [ - PlanMilestone { id: ^wrap_decision_predicate, title: "ONE structural Rc wrap-decision predicate in the emitter (ownership-fact derived, never a name roster) — the gate on every Rc-heavy deep module", gate: GateEmitterFixedPoint, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 3, days_high: 7, lane_state: "LANDED #6776 (wrap_decision_gate, fail-closed Rc ownership wrapping) + UseSiteVerdict catalog #6877; verified by execution 2026-07-20 (valiant-dove-723: claim_batch wrap_decision_predicate_witness_holds 7 sub-witnesses + gate smoke green on main; 06_translate routes type_shell and value_expression through the gate, WrapGateInapplicable passes through unchanged — no silent Rc default)", confidence: ConfidenceBasis { basis: "By execution — 7 sub-witnesses green on main plus the gate smoke; the predicate is ownership-fact-derived so the bad Rc wrap is UNWRITABLE (construction), not flagged after the fact", risk: "A use-site whose ownership the derivation mis-classifies silently falls to a wrap default", antagonize: "wrap_decision_predicate_witness_holds runs over the corpus; a mis-wrap reds it — the RED control is the discriminating fixture" } }, - PlanMilestone { id: ^std_dup_assembly_fix, title: "One harness fix: cssl std-seed-link closure assembly collides dag/std with the seed std (E0255) — single root; post-discharge census 2026-07-19 puts ~13 modules on this fix (3 Gate-A + 10 tail); the 6 formerly-unresolved modules cleared emit via KeySource but stay on a separate cargo UNRESOLVED bucket", gate: GateEmitterFixedPoint, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 3, lane_state: "LANDED+CAPTURED 2026-07-19 (#6876)", confidence: ConfidenceBasis { basis: "Single root (cssl closure assembly collided dag/std with seed std, E0255); the post-discharge census placed ~13 modules on the one fix", risk: "A module the census missed carries a second assembly collision not on this root", antagonize: "the cssl closure-assembly probe over the flip candidate set surfaces a residual collision" } }, - PlanMilestone { id: ^emit_import_closure_root, title: "ONE comprehensive emit import-closure derivation: the emitted module import set = the transitive closure of every type/module name any emitted construct references (params, body, inferred, nested-record struct literals AND their sibling-module field types, carrier types, referenced modules). Replaces the per-face gates (faithful-carrier, struct-field StructRepr-only, module-manifest). FreeMonoid was ONE layer of this, not the whole gate", gate: GateEmitterFixedPoint, brick_state: InFlight, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 5, lane_state: "SINGLE CHAIN-A GATE (operator 2026-07-20: root-cause the closure into ONE derivation, do NOT peel face-by-face; cargo-green + witness-green at ALL times, no mid-peel merges). #6919 (neat-swift-795) pivoted to the comprehensive derivation; DRAFT until representative cargo-green (>=1 nested-struct module + materialization_carriers) AND witness-green (regen --verify divergence 0, witness families stay green). #6906 landed FreeMonoid + std_measure + partial nested-struct (mid-peel; main green, no module flipped)", confidence: ConfidenceBasis { basis: "The closure is a mechanical transitive walk over names the emitted constructs already reference; the representative bar is by-execution on real modules, not first_error", risk: "A residual reference class the walk misses — rustc masks downstream layers behind first_error, so a new layer can surface AFTER the representative bar (FreeMonoid was one layer, falsified as the whole gate)", antagonize: "neat-swift ships the FULL residual rustc histogram (every E-code + count on 02_parse + materialization_carriers) on each layer-clear push, not just first_error; the confidence-probe throwaway branch peels AHEAD past the closure to force-expose layer N+1 before we commit" } }, - PlanMilestone { id: ^generic_t_rendering, title: "Generic-type rendering fix: an unbound TypeVariable in an applied type must REFUSE, not render — root is the fold acc-type fallback path (emit_rust_fold_method_call -> lambda_acc_type_str/lambda_param_type_strs with fold_acc_uses_fallback) plus render_rust_type not refusing an unbound T inside an applied type. A DISTINCT class from import-closure (generic rendering, not a missing import); blocks 04_infer/06_translate/05_emit; same family as #6881 fn_generic_param_names threading", gate: GateEmitterFixedPoint, brick_state: InFlight, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 3, lane_state: "IN FLIGHT (quiet-bee-205, Pole A-2). E0425 unbound T in 04_infer. Scoped SEPARATELY from emit_import_closure_root (operator 2026-07-20: distinct root). Root located; fix = thread the generic param names into the fold acc-type + refuse an unbound TypeVariable in render_rust_type (construction, never a string-scan of the emitted text)", confidence: ConfidenceBasis { basis: "Root located to the fold acc-type fallback plus render_rust_type; the threading shape is the same as the already-landed #6881 fn_generic_param_names", risk: "Generic-T interleaves with import-closure on the same modules (a fix-order coupling), or is deeper than the 04_infer surface it first showed on", antagonize: "quiet-bee ships the full residual histogram on clear; the peel-ahead branch stacks generic-T ON TOP of the import closure to expose interaction before either commits" } }, - PlanMilestone { id: ^unresolved_error_diagnosis, title: "Diagnose-then-fix the 6 unresolved_compiler_error modules (00_compile, materialization_carriers, program_assembly, source_authority, 02_parse, 03_ingest) from the census probe output", gate: GateEmitterFixedPoint, brick_state: Placed, parallelism: FanOutWide, fan_width: 3, days_low: 0, days_high: 1, lane_state: "DIAGNOSIS COMPLETE + PARTIAL FIX LANDED 2026-07-20 (#6906): all 6 emit 0-diagnostics; FreeMonoid + std_measure module-manifest + partial nested-struct import closure merged (mid-peel). The remaining import-closure layers are absorbed into emit_import_closure_root — this milestone's DIAGNOSIS deliverable is done; the fix continues under that gate", confidence: ConfidenceBasis { basis: "All 6 modules emit 0-diagnostics; the diagnosis deliverable is complete and the residual work is folded into emit_import_closure_root", risk: "0-diagnostics emit is NOT evidence of correct call-shape — a runtime call-shape defect can hide behind a clean compile (compile-clean is arity-blind)", antagonize: "require an EXECUTING-consumer receipt on signature changes, never the 0-diagnostics count alone" } }, - PlanMilestone { id: ^emit_representation_mismatch, title: "Emit representation-mismatch layer: after import-closure + generic-T clear, each deep module still shows ~4400 E0308 type mismatches (04_infer E0308x4261; 06_translate + 05_emit E0308x4422) — the model-vs-realization fork surfacing in emit (modeled coproduct types where native Rust/Value types are expected, and vice versa)", gate: GateEmitterFixedPoint, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 5, lane_state: "EXPOSED then SIZED 2026-07-20 by the confidence-probe antagonizing (quiet-bee #6924). EXPOSED: E0308 dominates the residual (~4400/deep module, uniform across all three) and was MASKED behind rustc first_error until import-closure + generic-T peeled it open. SIZED (type-pair histogram, n=4261, 206 distinct pairs): TOP 5 pairs = 82 percent — Symbol/String ~2100 sites (ONE fork: v2.std.text String vs host String), FreeMonoid-rope/String ~1038, Vector/FreeMonoid ~150, Optional/Option ~150. TRACTABLE: 3-4 construction walls at the authority, NOT 206 one-offs. Owner TBD; couples to the numeric-tower grounding (#5428) generalized to the remaining primitives", confidence: ConfidenceBasis { basis: "SIZED by execution — 206 pairs but heavily skewed, TOP 5 = 82 percent, and the dominant Symbol/String (~2100 sites) is ONE known section-3 fork (v2.std.text vs host String); so it is a few construction walls times many sites, not many independent roots", risk: "Each wall (Symbol/String, Vector/FreeMonoid, Optional/Option grounding) touches a load-bearing std authority, so it is real grounding work not a one-liner; the ~740 tail sites (18 percent) may hide a few more roots", antagonize: "verified by the same residual histogram dropping toward 0 as each wall lands — Symbol/String first (the 82 percent lever); a stalled count reveals an unmodeled root" } }, - PlanMilestone { id: ^deep_module_lanes, title: "Self-emit lanes for the Rc-heavy core: 04_infer, 06_translate, the 05_emit family — fan out in parallel with the flip wave once import-closure + generic-T + representation-mismatch reach cargo-green", gate: GateEmitterFixedPoint, brick_state: Gated, parallelism: FanOutWide, fan_width: 4, days_low: 3, days_high: 6, lane_state: "GATED on emit_representation_mismatch (which is itself gated on emit_import_closure_root + generic_t_rendering) (wrap_decision #6776 + std_dup #6876 already cleared). Baseline TSVs #6916 (sharp-ferret-568): all 8 deep modules (04_infer, 06_translate, whole 05_emit family) emit clean + cargo-refuse on the SAME import-closure root as the flip wave. Fans out IN PARALLEL with probe_flip_fanout on root-fix cargo-green", confidence: ConfidenceBasis { basis: "All 8 deep modules already emit 0-diagnostics and refuse on the SAME root as the flip wave (TSVs #6916), so the root fix is expected to clear them wholesale, not one-by-one", risk: "A deep module (especially 04_infer, the generic-heavy one) hits a THIRD layer past import-closure + generic-T", antagonize: "the confidence-probe peel-ahead hacks past both known roots on a throwaway branch to surface layer 3 BEFORE the lanes commit" } }, - PlanMilestone { id: ^emitter_fixed_point, title: "The emitted emitter re-emits itself: behavioral 2-generation fixed point on the v2 side (not byte identity)", gate: GateEmitterFixedPoint, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on deep_module_lanes. Byte-fixpoint is an explicit NON-goal (it would force v2 to reproduce the seed's warts); the bar is behavioral equivalence on a discriminating corpus", confidence: ConfidenceBasis { basis: "Behavioral equivalence on a discriminating corpus is the operator-set bar; the emit machinery is already proven on the shallow modules that self-emit today", risk: "The emitted emitter diverges from the seed on a discriminating input the corpus does not cover", antagonize: "regen_stage0 --emit-fresh + --verify divergence 0 plus a discriminating RED that goes red when the re-emit is wrong" } }, - PlanMilestone { id: ^typed_frontier, title: "The self-host frontier is a typed row per module: SelfEmitted | SeedRetained(reason, migration_trigger) — no silent escape hatch (the DecodeFidelity/Lossless boundary)", gate: GateHonestFrontier, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED (src/v2/compiler/self_host/frontier.dag). Each compiler module is a FrontierQualifiedModuleBinding with a disposition; SeedRetained carries reason + migration_trigger, so a seed-retained module is countable and prioritizable, never a silent hole", confidence: ConfidenceBasis { basis: "frontier.dag exists and every module is a typed row with a disposition; the Lossless boundary is modeled", risk: "The disposition enum admits a state that reads honest but is not (SelfEmitted with a dead receipt, or a stale SeedRetained reason)", antagonize: "the no_frontier_lies wall plus the frontier audit (confidence-probe Phase 2) attack exactly that gap" } }, - PlanMilestone { id: ^frontier_dispositioned, title: "All 27 compiler modules dispositioned: 6 SelfEmitted (03_body_producer, 03_normalize, 07_target_carriers, discovery_enumeration, parse_engine_hooks, use_site_verdict) + 21 SeedRetained, each with a reason + trigger. The bar is NOT 27/27 SelfEmitted — some stay SeedRetained by necessity", gate: GateHonestFrontier, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED — 27/27 rows present in frontier.dag (count SelfEmitted vs SeedRetained there for the live number). The host-effect kernel, bootstrap, and self_host.dag itself stay SeedRetained by necessity; the flip wave (probe_flip_fanout) grows the SelfEmitted count but is seed-shrink beyond the minimum, not a bar-brick", confidence: ConfidenceBasis { basis: "27 rows counted in frontier.dag; the 6 SelfEmitted are verified by execution", risk: "A SeedRetained reason is stale (the module could self-emit now, so the frontier UNDERSTATES progress) or a SelfEmitted receipt is orphaned (OVERSTATES it)", antagonize: "the frontier audit samples SeedRetained rows for false-retention AND verifies every one of the 6 SelfEmitted receipts actually executes" } }, - PlanMilestone { id: ^no_frontier_lies, title: "No orphaned enrollment: every frontier receipt names an EXECUTING consumer; an enrolled-but-never-run receipt itself reds (the #6856 coverage-by-illusion class)", gate: GateHonestFrontier, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED — the admission invariant (module-identity-storage-binding Phase 0): SelfEmitted receipts run on the falsifier wet cadence; quarantined known-red rows run on a probe cadence EXPECTING red so greening is a counted un-quarantine event. 'Enrolled, zero executions' reds", confidence: ConfidenceBasis { basis: "The wall is executable and runs over the corpus, not a grep", risk: "The wall itself goes inert (coverage-by-illusion one level up — a lens that exists but nothing gates on)", antagonize: "the executable hygiene backstop keeps every lens wired-or-deleted; the frontier audit confirms the wall actually fires" } }, - PlanMilestone { id: ^trigger_renegotiation, title: "DECISION: namespace-gated modules (03_resolve, 03_name_resolve) + body-producer tail — renegotiate migration triggers to emit under the current design (accept a later re-emit), or exclude from the 2-week scope", gate: GateHonestFrontier, brick_state: InFlight, parallelism: DecisionGate, fan_width: 1, days_low: 0, days_high: 0, lane_state: "RESOLVED 2026-07-20 (operator): do NOT wait on the namespace terminal — it is dragging. Renegotiate 03_resolve/03_name_resolve + body-producer tail triggers to emit under the current design with a declared later re-emit; the frontier-row renegotiation rides the flip-wave refresh", confidence: ConfidenceBasis { basis: "Operator-decided; the decision is made, only the mechanical frontier-row update remains", risk: "The row update lags and leaves a stale trigger on the frontier", antagonize: "the flip-wave refresh updates the rows and the no_frontier_lies wall catches a stale trigger" } }, - PlanMilestone { id: ^probe_flip_fanout, title: "Probe + flip the std_dup-gated modules (~13 at cargo stage after the 2026-07-19 re-probe); each probe/flip is an independent lane once the import-closure root reaches cargo-green. Seed-shrink beyond the fixed-point minimum", gate: GateHonestFrontier, brick_state: Gated, parallelism: FanOutWide, fan_width: 13, days_low: 2, days_high: 5, lane_state: "GATED on emit_import_closure_root (+ generic_t_rendering for the generic-heavy candidates). The emitter fixed point (Gate 1) only needs the emitter modules to self-emit, so the flip wave GROWS the SelfEmitted count but is not itself a bar-brick. 2026-07-19 re-probe (TSVs #6891) read 18 of 19 candidates as import-closure-only. Fans out IN PARALLEL with deep_module_lanes on root-fix cargo-green. Flip PR #6881 HELD DRAFT; the flip set refreshes to the actual green set on root-fix merge", confidence: ConfidenceBasis { basis: "18 of 19 candidates read as import-closure-only after the re-probe; each flip is an independent lane once the root clears", risk: "The re-probe read only first_error, so a candidate may hide a second layer past import-closure", antagonize: "the full residual histogram per candidate on clear; each flip lands by-execution (cargo-green + witness-green), never on a probe prediction" } }, - PlanMilestone { id: ^witness_realization_kernel, title: "v2 execution path kernel: emit a witness to native code + run harness + scheduler (the piece that replaces the v1 interpreter for CI) — serial kernel, then families fan out", gate: GateLedgerGreen, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 3, days_high: 5, lane_state: "LANDED 2026-07-19 #6879 (da0e7c3d) at full bar; kernel handoff (partition, seams, traps) and the six-family diagnosis table durable as comments on the PR; stern-lark-430 closed out clean", confidence: ConfidenceBasis { basis: "Landed at full bar by execution; the kernel runs a family end-to-end", risk: "The kernel's partition/seams do not generalize to a family the diagnosis table did not cover", antagonize: "the 9 family lanes all exercised it and all went green — the generalization is proven, not assumed" } }, - PlanMilestone { id: ^witness_family_fanout, title: "Per-witness-family realization lanes (claim families, wet receipts, lens gates) once the kernel runs one family end-to-end", gate: GateLedgerGreen, brick_state: Placed, parallelism: FanOutWide, fan_width: 5, days_low: 4, days_high: 8, lane_state: "DONE 2026-07-20 — all 9 witness families GREEN with trustworthy controls. #6912 (eval-repair consolidation) + #6917 (fold closure-arg: structural RuntimeClosure at edge grain, both oracle legs real, un-quarantine receipt) + #6918 (field_access RED-control fail-open fix — the wrong-fixture control could not go red when behavior was wrong; section-5 coverage-by-illusion, now discriminating). Emitter was CLEAN across all 9; every fix was eval/harness-side (the side v1-deletion removes)", confidence: ConfidenceBasis { basis: "All 9 families green by execution WITH discriminating RED controls (the #6918 fix made the field_access control able to go red on a wrong fixture)", risk: "A family's green rests on a non-discriminating control (the exact #6918 class recurring elsewhere)", antagonize: "each control was checked to go red on a wrong fixture; ledger_projection (Pole B) re-derives the dispositions from the probe_red carrier so a silent regression reds" } }, - PlanMilestone { id: ^ledger_modeled, title: "The proactive verification ledger is modeled: 3 spine receipts (cold parity, compile-clean, regen fixed point) + 9 family receipts, typed dispositions, no fabricated green", gate: GateLedgerGreen, brick_state: Placed, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "LANDED #6915 (proactive_verification_ledger.dag). Typed dispositions; no soak — every receipt is a deliberate executed run, not an elapsed-time claim", confidence: ConfidenceBasis { basis: "proactive_verification_ledger.dag exists with typed receipt rows for the 3 spine + 9 family checks", risk: "A disposition is a hand-declared literal that goes stale — exactly the Pole B defect: 5 family dispositions were hand-literals, lying after the eval PRs greened them", antagonize: "ledger_projection (Pole B #6923) projects dispositions from the probe_red carrier so they self-update; until it lands, the hand-literals ARE the attack surface" } }, - PlanMilestone { id: ^ledger_projection, title: "The ledger self-updates: project family dispositions from the ci_layer_roots.dag probe_red carrier instead of hand-declared literals (DESIGN section 3 single authority)", gate: GateLedgerGreen, brick_state: InFlight, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "IN FLIGHT (gentle-bee, Pole B #6923). The genuinely-ORTHOGONAL Gate-3 lane runnable NOW (no Gate-1 dependency). Fixes the section-3 defect: 5 KnownRedPendingUnquarantine literals stale/lying after #6912/#6917/#6918 greened them", confidence: ConfidenceBasis { basis: "Root located — the probe_red carrier already holds the truth; the fix projects from it (single authority) rather than re-declaring the dispositions", risk: "The carrier does not cover every family, leaving a residue still hand-declared", antagonize: "gentle-bee executes the projection over all 9 families; a coverage gap reds it" } }, - PlanMilestone { id: ^cold_parity_receipt, title: "Spine receipt: whole-corpus COLD v1-vs-v2 witness parity with zero unexplained divergence — a deliberate executed run, not a soak", gate: GateLedgerGreen, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on emitter_fixed_point (no v2 emission = no cold parity to run). The falsifier cadence already carries the deterministic whole-tree cold control (GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL); this brick is the deliberate v1-vs-v2 comparison over it", confidence: ConfidenceBasis { basis: "The cold-control mechanism already exists in the falsifier cadence; this receipt is a comparison, not new machinery", risk: "Cannot execute until Gate 1 lands — the deepest cross-gate dependency, so a divergence would surface late", antagonize: "run it the moment the emitter fixed point lands, counted per-family, with no elapsed-time substitute permitted" } }, - PlanMilestone { id: ^compile_clean_parity_receipt, title: "Spine receipt: compile-clean parity — the v2-emitted path compiles the corpus clean, matching v1", gate: GateLedgerGreen, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "GATED on emitter_fixed_point. Compile-clean is already the CI gate for v1; the receipt runs it on the v2 path", confidence: ConfidenceBasis { basis: "Compile-clean is already the v1 CI gate; the receipt just runs it on the v2-emitted path", risk: "0-diagnostics compile is arity-blind — clean does not imply behaviorally equal", antagonize: "paired with cold_parity_receipt (the behavioral leg), never standing alone as the equality claim" } }, - PlanMilestone { id: ^regen_fixed_point_receipt, title: "Spine receipt: regen behavioral fixed point — regen_stage0 on the v2-emitted sources reproduces a behaviorally-equivalent emitter", gate: GateLedgerGreen, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "GATED on emitter_fixed_point. The self-host fixed-point step executed as a ledger receipt, scoped at its own closure (regen skip authority)", confidence: ConfidenceBasis { basis: "regen_stage0 --emit-fresh + --verify is the existing self-host proof harness", risk: "The fixed point holds for the emitter but a downstream module regresses", antagonize: "--verify divergence 0 over the FULL regen input set, never a sampled subset" } }, - PlanMilestone { id: ^ci_floor_cutover, title: "CI floor runs on v2-emitted execution; PROACTIVE falsifier parity against the v1 path — deliberately executed cold v1-vs-v2 runs with counted divergence (operator 2026-07-20: no passive soak; verify by execution, not elapsed time)", gate: GateDeletion, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on emitter_fixed_point + probe_flip_fanout (the v2-emitted-execution half) + the ledger receipts. witness_family_fanout DONE. This is the cutover ACTION: CI stops using the v1 interpreter and runs the v2-emitted path", confidence: ConfidenceBasis { basis: "The ledger bricks supply the parity evidence; the cutover is the switch once they are green", risk: "The cutover exposes a CI-only path the per-family receipts did not cover", antagonize: "cold_parity_receipt runs the FULL corpus cold, not just the enrolled families" } }, - PlanMilestone { id: ^v1_quarantine, title: "v1 off the build path: seed crates frozen as a bootstrap artifact, nothing in CI or products depends on them — the products-can-build milestone", gate: GateDeletion, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "blocked on emitter_fixed_point (Gate 1) + ci_floor_cutover (itself gated on Gate 3 — ledger_projection + the 3 spine receipts) + unresolved_error_diagnosis + trigger_renegotiation (Gate 2). So all three gates read done before quarantine, Gate 3 reached transitively through the cutover — the DAG has no path to quarantine that skips the ledger", confidence: ConfidenceBasis { basis: "Quarantine is a build-path change (freeze the seed crates, ensure nothing depends on them) once all three gates read done", risk: "A product or CI step still references a seed crate", antagonize: "the products-can-build check — verify nothing in CI or products depends on src/v1 before flipping" } }, - PlanMilestone { id: ^v1_delete, title: "Delete src/v1 + stage0 when the PROACTIVE VERIFICATION LEDGER is green by execution — no calendar soak (operator 2026-07-20: suspicious of soaking; test/verify proactively). Ledger = enumerated executed receipts, each a deliberate run, none an elapsed-time claim", gate: GateDeletion, brick_state: Gated, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 1, lane_state: "blocked on v1_quarantine, which transitively requires the executed verification ledger: Gate 3 (ledger_projection + cold parity + compile-clean + regen fixed point) gates the ci_floor_cutover that gates quarantine, so no DAG path reaches delete without the ledger green by execution (per-family receipts included). No calendar soak", confidence: ConfidenceBasis { basis: "A mechanical removal once quarantine holds and the ledger is green BY EXECUTION", risk: "Deleting too early on a soak-substituted green (the operator's explicit worry)", antagonize: "gate on the enumerated executed receipts, never elapsed time — the ledger is the wall" } } + PlanMilestone { id: ^wrap_decision_predicate, title: "ONE structural Rc wrap-decision predicate in the emitter (ownership-fact derived, never a name roster) — the gate on every Rc-heavy deep module", gate: GateEmitterFixedPoint, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 3, days_high: 7, lane_state: "LANDED #6776 (wrap_decision_gate, fail-closed Rc ownership wrapping) + UseSiteVerdict catalog #6877; verified by execution 2026-07-20 (valiant-dove-723: claim_batch wrap_decision_predicate_witness_holds 7 sub-witnesses + gate smoke green on main; 06_translate routes type_shell and value_expression through the gate, WrapGateInapplicable passes through unchanged — no silent Rc default)", confidence: ConfidenceBasis { basis: "By execution — 7 sub-witnesses green on main plus the gate smoke; the predicate is ownership-fact-derived so the bad Rc wrap is UNWRITABLE (construction), not flagged after the fact", risk: "A use-site whose ownership the derivation mis-classifies silently falls to a wrap default", antagonize: "wrap_decision_predicate_witness_holds runs over the corpus; a mis-wrap reds it — the RED control is the discriminating fixture" } }, + PlanMilestone { id: ^std_dup_assembly_fix, title: "One harness fix: cssl std-seed-link closure assembly collides dag/std with the seed std (E0255) — single root; post-discharge census 2026-07-19 puts ~13 modules on this fix (3 Gate-A + 10 tail); the 6 formerly-unresolved modules cleared emit via KeySource but stay on a separate cargo UNRESOLVED bucket", gate: GateEmitterFixedPoint, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 3, lane_state: "LANDED+CAPTURED 2026-07-19 (#6876)", confidence: ConfidenceBasis { basis: "Single root (cssl closure assembly collided dag/std with seed std, E0255); the post-discharge census placed ~13 modules on the one fix", risk: "A module the census missed carries a second assembly collision not on this root", antagonize: "the cssl closure-assembly probe over the flip candidate set surfaces a residual collision" } }, + PlanMilestone { id: ^emit_import_closure_root, title: "ONE comprehensive emit import-closure derivation: the emitted module import set = the transitive closure of every type/module name any emitted construct references (params, body, inferred, nested-record struct literals AND their sibling-module field types, carrier types, referenced modules). Replaces the per-face gates (faithful-carrier, struct-field StructRepr-only, module-manifest). FreeMonoid was ONE layer of this, not the whole gate", gate: GateEmitterFixedPoint, brick_state: InFlight, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 5, lane_state: "SINGLE CHAIN-A GATE (operator 2026-07-20: root-cause the closure into ONE derivation, do NOT peel face-by-face; cargo-green + witness-green at ALL times, no mid-peel merges). #6919 (neat-swift-795) pivoted to the comprehensive derivation; DRAFT until representative cargo-green (>=1 nested-struct module + materialization_carriers) AND witness-green (regen --verify divergence 0, witness families stay green). #6906 landed FreeMonoid + std_measure + partial nested-struct (mid-peel; main green, no module flipped)", confidence: ConfidenceBasis { basis: "The closure is a mechanical transitive walk over names the emitted constructs already reference; the representative bar is by-execution on real modules, not first_error", risk: "A residual reference class the walk misses — rustc masks downstream layers behind first_error, so a new layer can surface AFTER the representative bar (FreeMonoid was one layer, falsified as the whole gate)", antagonize: "neat-swift ships the FULL residual rustc histogram (every E-code + count on 02_parse + materialization_carriers) on each layer-clear push, not just first_error; the confidence-probe throwaway branch peels AHEAD past the closure to force-expose layer N+1 before we commit" } }, + PlanMilestone { id: ^generic_t_rendering, title: "Generic-type rendering fix: an unbound TypeVariable in an applied type must REFUSE, not render — root is the fold acc-type fallback path (emit_rust_fold_method_call -> lambda_acc_type_str/lambda_param_type_strs with fold_acc_uses_fallback) plus render_rust_type not refusing an unbound T inside an applied type. A DISTINCT class from import-closure (generic rendering, not a missing import); blocks 04_infer/06_translate/05_emit; same family as #6881 fn_generic_param_names threading", gate: GateEmitterFixedPoint, brick_state: InFlight, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 3, lane_state: "IN FLIGHT (quiet-bee-205, Pole A-2). E0425 unbound T in 04_infer. Scoped SEPARATELY from emit_import_closure_root (operator 2026-07-20: distinct root). Root located; fix = thread the generic param names into the fold acc-type + refuse an unbound TypeVariable in render_rust_type (construction, never a string-scan of the emitted text)", confidence: ConfidenceBasis { basis: "Root located to the fold acc-type fallback plus render_rust_type; the threading shape is the same as the already-landed #6881 fn_generic_param_names", risk: "Generic-T interleaves with import-closure on the same modules (a fix-order coupling), or is deeper than the 04_infer surface it first showed on", antagonize: "quiet-bee ships the full residual histogram on clear; the peel-ahead branch stacks generic-T ON TOP of the import closure to expose interaction before either commits" } }, + PlanMilestone { id: ^unresolved_error_diagnosis, title: "Diagnose-then-fix the 6 unresolved_compiler_error modules (00_compile, materialization_carriers, program_assembly, source_authority, 02_parse, 03_ingest) from the census probe output", gate: GateEmitterFixedPoint, brick_state: Placed, role: BarBrick, parallelism: FanOutWide, fan_width: 3, days_low: 0, days_high: 1, lane_state: "DIAGNOSIS COMPLETE + PARTIAL FIX LANDED 2026-07-20 (#6906): all 6 emit 0-diagnostics; FreeMonoid + std_measure module-manifest + partial nested-struct import closure merged (mid-peel). The remaining import-closure layers are absorbed into emit_import_closure_root — this milestone's DIAGNOSIS deliverable is done; the fix continues under that gate", confidence: ConfidenceBasis { basis: "All 6 modules emit 0-diagnostics; the diagnosis deliverable is complete and the residual work is folded into emit_import_closure_root", risk: "0-diagnostics emit is NOT evidence of correct call-shape — a runtime call-shape defect can hide behind a clean compile (compile-clean is arity-blind)", antagonize: "require an EXECUTING-consumer receipt on signature changes, never the 0-diagnostics count alone" } }, + PlanMilestone { id: ^emit_representation_mismatch, title: "Emit representation-mismatch layer: after import-closure + generic-T clear, each deep module still shows ~4400 E0308 type mismatches (04_infer E0308x4261; 06_translate + 05_emit E0308x4422) — the model-vs-realization fork surfacing in emit (modeled coproduct types where native Rust/Value types are expected, and vice versa)", gate: GateEmitterFixedPoint, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 5, lane_state: "EXPOSED then SIZED 2026-07-20 by the confidence-probe antagonizing (quiet-bee #6924). EXPOSED: E0308 dominates the residual (~4400/deep module, uniform across all three) and was MASKED behind rustc first_error until import-closure + generic-T peeled it open. SIZED (type-pair histogram, n=4261, 206 distinct pairs): TOP 5 pairs = 82 percent — Symbol/String ~2100 sites (ONE fork: v2.std.text String vs host String), FreeMonoid-rope/String ~1038, Vector/FreeMonoid ~150, Optional/Option ~150. TRACTABLE: 3-4 construction walls at the authority, NOT 206 one-offs. Owner TBD; couples to the numeric-tower grounding (#5428) generalized to the remaining primitives", confidence: ConfidenceBasis { basis: "SIZED by execution — 206 pairs but heavily skewed, TOP 5 = 82 percent, and the dominant Symbol/String (~2100 sites) is ONE known section-3 fork (v2.std.text vs host String); so it is a few construction walls times many sites, not many independent roots", risk: "Each wall (Symbol/String, Vector/FreeMonoid, Optional/Option grounding) touches a load-bearing std authority, so it is real grounding work not a one-liner; the ~740 tail sites (18 percent) may hide a few more roots", antagonize: "verified by the same residual histogram dropping toward 0 as each wall lands — Symbol/String first (the 82 percent lever); a stalled count reveals an unmodeled root" } }, + PlanMilestone { id: ^deep_module_lanes, title: "Self-emit lanes for the Rc-heavy core: 04_infer, 06_translate, the 05_emit family — fan out in parallel with the flip wave once import-closure + generic-T + representation-mismatch reach cargo-green", gate: GateEmitterFixedPoint, brick_state: Gated, role: BarBrick, parallelism: FanOutWide, fan_width: 4, days_low: 3, days_high: 6, lane_state: "GATED on emit_representation_mismatch (which is itself gated on emit_import_closure_root + generic_t_rendering) (wrap_decision #6776 + std_dup #6876 already cleared). Baseline TSVs #6916 (sharp-ferret-568): all 8 deep modules (04_infer, 06_translate, whole 05_emit family) emit clean + cargo-refuse on the SAME import-closure root as the flip wave. Fans out IN PARALLEL with probe_flip_fanout on root-fix cargo-green", confidence: ConfidenceBasis { basis: "All 8 deep modules already emit 0-diagnostics and refuse on the SAME root as the flip wave (TSVs #6916), so the root fix is expected to clear them wholesale, not one-by-one", risk: "A deep module (especially 04_infer, the generic-heavy one) hits a THIRD layer past import-closure + generic-T", antagonize: "the confidence-probe peel-ahead hacks past both known roots on a throwaway branch to surface layer 3 BEFORE the lanes commit" } }, + PlanMilestone { id: ^emitter_fixed_point, title: "The emitted emitter re-emits itself: behavioral 2-generation fixed point on the v2 side (not byte identity)", gate: GateEmitterFixedPoint, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on deep_module_lanes. Byte-fixpoint is an explicit NON-goal (it would force v2 to reproduce the seed's warts); the bar is behavioral equivalence on a discriminating corpus", confidence: ConfidenceBasis { basis: "Behavioral equivalence on a discriminating corpus is the operator-set bar; the emit machinery is already proven on the shallow modules that self-emit today", risk: "The emitted emitter diverges from the seed on a discriminating input the corpus does not cover", antagonize: "regen_stage0 --emit-fresh + --verify divergence 0 plus a discriminating RED that goes red when the re-emit is wrong" } }, + PlanMilestone { id: ^typed_frontier, title: "The self-host frontier is a typed row per module: SelfEmitted | SeedRetained(reason, migration_trigger) — no silent escape hatch (the DecodeFidelity/Lossless boundary)", gate: GateHonestFrontier, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED (src/v2/compiler/self_host/frontier.dag). Each compiler module is a FrontierQualifiedModuleBinding with a disposition; SeedRetained carries reason + migration_trigger, so a seed-retained module is countable and prioritizable, never a silent hole", confidence: ConfidenceBasis { basis: "frontier.dag exists and every module is a typed row with a disposition; the Lossless boundary is modeled", risk: "The disposition enum admits a state that reads honest but is not (SelfEmitted with a dead receipt, or a stale SeedRetained reason)", antagonize: "the no_frontier_lies wall plus the frontier audit (confidence-probe Phase 2) attack exactly that gap" } }, + PlanMilestone { id: ^frontier_dispositioned, title: "All 27 compiler modules dispositioned: 6 SelfEmitted (03_body_producer, 03_normalize, 07_target_carriers, discovery_enumeration, parse_engine_hooks, use_site_verdict) + 21 SeedRetained, each with a reason + trigger. The bar is NOT 27/27 SelfEmitted — some stay SeedRetained by necessity", gate: GateHonestFrontier, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED — 27/27 rows present in frontier.dag (count SelfEmitted vs SeedRetained there for the live number). The host-effect kernel, bootstrap, and self_host.dag itself stay SeedRetained by necessity; the flip wave (probe_flip_fanout) grows the SelfEmitted count but is seed-shrink beyond the minimum, not a bar-brick", confidence: ConfidenceBasis { basis: "27 rows counted in frontier.dag; the 6 SelfEmitted are verified by execution", risk: "A SeedRetained reason is stale (the module could self-emit now, so the frontier UNDERSTATES progress) or a SelfEmitted receipt is orphaned (OVERSTATES it)", antagonize: "the frontier audit samples SeedRetained rows for false-retention AND verifies every one of the 6 SelfEmitted receipts actually executes" } }, + PlanMilestone { id: ^no_frontier_lies, title: "No orphaned enrollment: every frontier receipt names an EXECUTING consumer; an enrolled-but-never-run receipt itself reds (the #6856 coverage-by-illusion class)", gate: GateHonestFrontier, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 0, days_high: 0, lane_state: "LANDED — the admission invariant (module-identity-storage-binding Phase 0): SelfEmitted receipts run on the falsifier wet cadence; quarantined known-red rows run on a probe cadence EXPECTING red so greening is a counted un-quarantine event. 'Enrolled, zero executions' reds", confidence: ConfidenceBasis { basis: "The wall is executable and runs over the corpus, not a grep", risk: "The wall itself goes inert (coverage-by-illusion one level up — a lens that exists but nothing gates on)", antagonize: "the executable hygiene backstop keeps every lens wired-or-deleted; the frontier audit confirms the wall actually fires" } }, + PlanMilestone { id: ^trigger_renegotiation, title: "DECISION: namespace-gated modules (03_resolve, 03_name_resolve) + body-producer tail — renegotiate migration triggers to emit under the current design (accept a later re-emit), or exclude from the 2-week scope", gate: GateHonestFrontier, brick_state: InFlight, role: BarBrick, parallelism: DecisionGate, fan_width: 1, days_low: 0, days_high: 0, lane_state: "RESOLVED 2026-07-20 (operator): do NOT wait on the namespace terminal — it is dragging. Renegotiate 03_resolve/03_name_resolve + body-producer tail triggers to emit under the current design with a declared later re-emit; the frontier-row renegotiation rides the flip-wave refresh", confidence: ConfidenceBasis { basis: "Operator-decided; the decision is made, only the mechanical frontier-row update remains", risk: "The row update lags and leaves a stale trigger on the frontier", antagonize: "the flip-wave refresh updates the rows and the no_frontier_lies wall catches a stale trigger" } }, + PlanMilestone { id: ^probe_flip_fanout, title: "Probe + flip the std_dup-gated modules (~13 at cargo stage after the 2026-07-19 re-probe); each probe/flip is an independent lane once the import-closure root reaches cargo-green. Seed-shrink beyond the fixed-point minimum", gate: GateHonestFrontier, brick_state: Gated, role: SeedShrink, parallelism: FanOutWide, fan_width: 13, days_low: 2, days_high: 5, lane_state: "GATED on emit_import_closure_root (+ generic_t_rendering for the generic-heavy candidates). The emitter fixed point (Gate 1) only needs the emitter modules to self-emit, so the flip wave GROWS the SelfEmitted count but is not itself a bar-brick. 2026-07-19 re-probe (TSVs #6891) read 18 of 19 candidates as import-closure-only. Fans out IN PARALLEL with deep_module_lanes on root-fix cargo-green. Flip PR #6881 HELD DRAFT; the flip set refreshes to the actual green set on root-fix merge", confidence: ConfidenceBasis { basis: "18 of 19 candidates read as import-closure-only after the re-probe; each flip is an independent lane once the root clears", risk: "The re-probe read only first_error, so a candidate may hide a second layer past import-closure", antagonize: "the full residual histogram per candidate on clear; each flip lands by-execution (cargo-green + witness-green), never on a probe prediction" } }, + PlanMilestone { id: ^witness_realization_kernel, title: "v2 execution path kernel: emit a witness to native code + run harness + scheduler (the piece that replaces the v1 interpreter for CI) — serial kernel, then families fan out", gate: GateLedgerGreen, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 3, days_high: 5, lane_state: "LANDED 2026-07-19 #6879 (da0e7c3d) at full bar; kernel handoff (partition, seams, traps) and the six-family diagnosis table durable as comments on the PR; stern-lark-430 closed out clean", confidence: ConfidenceBasis { basis: "Landed at full bar by execution; the kernel runs a family end-to-end", risk: "The kernel's partition/seams do not generalize to a family the diagnosis table did not cover", antagonize: "the 9 family lanes all exercised it and all went green — the generalization is proven, not assumed" } }, + PlanMilestone { id: ^witness_family_fanout, title: "Per-witness-family realization lanes (claim families, wet receipts, lens gates) once the kernel runs one family end-to-end", gate: GateLedgerGreen, brick_state: Placed, role: BarBrick, parallelism: FanOutWide, fan_width: 5, days_low: 4, days_high: 8, lane_state: "DONE 2026-07-20 — all 9 witness families GREEN with trustworthy controls. #6912 (eval-repair consolidation) + #6917 (fold closure-arg: structural RuntimeClosure at edge grain, both oracle legs real, un-quarantine receipt) + #6918 (field_access RED-control fail-open fix — the wrong-fixture control could not go red when behavior was wrong; section-5 coverage-by-illusion, now discriminating). Emitter was CLEAN across all 9; every fix was eval/harness-side (the side v1-deletion removes)", confidence: ConfidenceBasis { basis: "All 9 families green by execution WITH discriminating RED controls (the #6918 fix made the field_access control able to go red on a wrong fixture)", risk: "A family's green rests on a non-discriminating control (the exact #6918 class recurring elsewhere)", antagonize: "each control was checked to go red on a wrong fixture; ledger_projection (Pole B) re-derives the dispositions from the probe_red carrier so a silent regression reds" } }, + PlanMilestone { id: ^ledger_modeled, title: "The proactive verification ledger is modeled: 3 spine receipts (cold parity, compile-clean, regen fixed point) + 9 family receipts, typed dispositions, no fabricated green", gate: GateLedgerGreen, brick_state: Placed, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "LANDED #6915 (proactive_verification_ledger.dag). Typed dispositions; no soak — every receipt is a deliberate executed run, not an elapsed-time claim", confidence: ConfidenceBasis { basis: "proactive_verification_ledger.dag exists with typed receipt rows for the 3 spine + 9 family checks", risk: "A disposition is a hand-declared literal that goes stale — exactly the Pole B defect: 5 family dispositions were hand-literals, lying after the eval PRs greened them", antagonize: "ledger_projection (Pole B #6923) projects dispositions from the probe_red carrier so they self-update; until it lands, the hand-literals ARE the attack surface" } }, + PlanMilestone { id: ^ledger_projection, title: "The ledger self-updates: project family dispositions from the ci_layer_roots.dag probe_red carrier instead of hand-declared literals (DESIGN section 3 single authority)", gate: GateLedgerGreen, brick_state: InFlight, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "IN FLIGHT (gentle-bee, Pole B #6923). The genuinely-ORTHOGONAL Gate-3 lane runnable NOW (no Gate-1 dependency). Fixes the section-3 defect: 5 KnownRedPendingUnquarantine literals stale/lying after #6912/#6917/#6918 greened them", confidence: ConfidenceBasis { basis: "Root located — the probe_red carrier already holds the truth; the fix projects from it (single authority) rather than re-declaring the dispositions", risk: "The carrier does not cover every family, leaving a residue still hand-declared", antagonize: "gentle-bee executes the projection over all 9 families; a coverage gap reds it" } }, + PlanMilestone { id: ^cold_parity_receipt, title: "Spine receipt: whole-corpus COLD v1-vs-v2 witness parity with zero unexplained divergence — a deliberate executed run, not a soak", gate: GateLedgerGreen, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on emitter_fixed_point (no v2 emission = no cold parity to run). The falsifier cadence already carries the deterministic whole-tree cold control (GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL); this brick is the deliberate v1-vs-v2 comparison over it", confidence: ConfidenceBasis { basis: "The cold-control mechanism already exists in the falsifier cadence; this receipt is a comparison, not new machinery", risk: "Cannot execute until Gate 1 lands — the deepest cross-gate dependency, so a divergence would surface late", antagonize: "run it the moment the emitter fixed point lands, counted per-family, with no elapsed-time substitute permitted" } }, + PlanMilestone { id: ^compile_clean_parity_receipt, title: "Spine receipt: compile-clean parity — the v2-emitted path compiles the corpus clean, matching v1", gate: GateLedgerGreen, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "GATED on emitter_fixed_point. Compile-clean is already the CI gate for v1; the receipt runs it on the v2 path", confidence: ConfidenceBasis { basis: "Compile-clean is already the v1 CI gate; the receipt just runs it on the v2-emitted path", risk: "0-diagnostics compile is arity-blind — clean does not imply behaviorally equal", antagonize: "paired with cold_parity_receipt (the behavioral leg), never standing alone as the equality claim" } }, + PlanMilestone { id: ^regen_fixed_point_receipt, title: "Spine receipt: regen behavioral fixed point — regen_stage0 on the v2-emitted sources reproduces a behaviorally-equivalent emitter", gate: GateLedgerGreen, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "GATED on emitter_fixed_point. The self-host fixed-point step executed as a ledger receipt, scoped at its own closure (regen skip authority)", confidence: ConfidenceBasis { basis: "regen_stage0 --emit-fresh + --verify is the existing self-host proof harness", risk: "The fixed point holds for the emitter but a downstream module regresses", antagonize: "--verify divergence 0 over the FULL regen input set, never a sampled subset" } }, + PlanMilestone { id: ^ci_floor_cutover, title: "CI floor runs on v2-emitted execution; PROACTIVE falsifier parity against the v1 path — deliberately executed cold v1-vs-v2 runs with counted divergence (operator 2026-07-20: no passive soak; verify by execution, not elapsed time)", gate: GateDeletion, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 2, days_high: 4, lane_state: "GATED on emitter_fixed_point + probe_flip_fanout (the v2-emitted-execution half) + the ledger receipts. witness_family_fanout DONE. This is the cutover ACTION: CI stops using the v1 interpreter and runs the v2-emitted path", confidence: ConfidenceBasis { basis: "The ledger bricks supply the parity evidence; the cutover is the switch once they are green", risk: "The cutover exposes a CI-only path the per-family receipts did not cover", antagonize: "cold_parity_receipt runs the FULL corpus cold, not just the enrolled families" } }, + PlanMilestone { id: ^v1_quarantine, title: "v1 off the build path: seed crates frozen as a bootstrap artifact, nothing in CI or products depends on them — the products-can-build milestone", gate: GateDeletion, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 2, lane_state: "blocked on emitter_fixed_point (Gate 1) + ci_floor_cutover (itself gated on Gate 3 — ledger_projection + the 3 spine receipts) + unresolved_error_diagnosis + trigger_renegotiation (Gate 2). So all three gates read done before quarantine, Gate 3 reached transitively through the cutover — the DAG has no path to quarantine that skips the ledger", confidence: ConfidenceBasis { basis: "Quarantine is a build-path change (freeze the seed crates, ensure nothing depends on them) once all three gates read done", risk: "A product or CI step still references a seed crate", antagonize: "the products-can-build check — verify nothing in CI or products depends on src/v1 before flipping" } }, + PlanMilestone { id: ^v1_delete, title: "Delete src/v1 + stage0 when the PROACTIVE VERIFICATION LEDGER is green by execution — no calendar soak (operator 2026-07-20: suspicious of soaking; test/verify proactively). Ledger = enumerated executed receipts, each a deliberate run, none an elapsed-time claim", gate: GateDeletion, brick_state: Gated, role: BarBrick, parallelism: ForciblySerial, fan_width: 1, days_low: 1, days_high: 1, lane_state: "blocked on v1_quarantine, which transitively requires the executed verification ledger: Gate 3 (ledger_projection + cold parity + compile-clean + regen fixed point) gates the ci_floor_cutover that gates quarantine, so no DAG path reaches delete without the ledger green by execution (per-family receipts included). No calendar soak", confidence: ConfidenceBasis { basis: "A mechanical removal once quarantine holds and the ledger is green BY EXECUTION", risk: "Deleting too early on a soak-substituted green (the operator's explicit worry)", antagonize: "gate on the enumerated executed receipts, never elapsed time — the ledger is the wall" } } ] data v1_deletion_dependencies: List = [ diff --git a/dag/test/claim/host_standup_spine_witness_test.dag b/dag/test/claim/host_standup_spine_witness_test.dag index c32753a4260..136a6aa08e2 100644 --- a/dag/test/claim/host_standup_spine_witness_test.dag +++ b/dag/test/claim/host_standup_spine_witness_test.dag @@ -181,8 +181,8 @@ test fn declared_gap_steps_carry_interim_realization_authority() -> Bool { DeclaredGap { interim_realization: path, refusal: r } => string_contains(s: r, pattern: "host_standup:") && (string_contains(s: path, pattern: "ctrl:") - || (string_contains(s: path, pattern: "extdeps.") - && string_contains(s: path, pattern: "gunbc."))) + || string_contains(s: path, pattern: "extdeps.") + || string_contains(s: path, pattern: "gunbc.")) ModeledCompose { authorities: refs } => refs.length() > 0 } ) diff --git a/dag/test/claim/roadmap_page_witness_test.dag b/dag/test/claim/roadmap_page_witness_test.dag index 0fb64c9b189..f07b1581278 100644 --- a/dag/test/claim/roadmap_page_witness_test.dag +++ b/dag/test/claim/roadmap_page_witness_test.dag @@ -37,6 +37,18 @@ fn witness_authority_differs_from_empty() -> Bool { !(authority_page_html() == empty_doc_html()) } +fn witness_authority_shows_three_gate_progress() -> Bool { + let authority = authority_page_html() + let empty = empty_doc_html() + string_contains(s: authority, pattern: "class=\"three-gate-progress\"") + && string_contains(s: authority, pattern: "v1-delete bar: three gates") + && !string_contains(s: empty, pattern: "class=\"three-gate-progress\"") + && string_contains(s: authority, pattern: "Gate 1 — the emitter re-emits itself") + && string_contains(s: authority, pattern: "Gate 3 — verification ledger green by execution") + && !string_contains(s: authority, pattern: "Cutover and delete") + && !string_contains(s: authority, pattern: "std_dup-gated modules") +} + fn depth_chain_html(fuel: Int) -> String { let parent = gunbc.roadmap_authority.authored(id: "p", done: false, content: "parent-node") let child = gunbc.roadmap_authority.authored(id: "c", done: false, content: "child-node-title") @@ -112,6 +124,7 @@ test fn roadmap_page_keystone_holds() -> Bool { witness_authority_serializes_with_structure() && witness_empty_doc_is_minimal_shell() && witness_authority_differs_from_empty() + && witness_authority_shows_three_gate_progress() && witness_depth_cap_fails_honest() && witness_bold_title_renders_strong() && witness_open_node_doc_emits_button_and_script()