Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
7c89510
integration: slice-2 (length->count) + marker derives
briansrls Jun 20, 2026
ad440de
integration: + bright-badger Measure (04_infer+05_emit) + eager-boar …
briansrls Jun 20, 2026
8b8fbb9
emit(import-completeness): authored imports for emitter-rendered symb…
briansrls Jun 20, 2026
c840cc6
integration: bring #5325 regen_stage0.rs languages_consumer_census mo…
briansrls Jun 20, 2026
d6b4c39
emit(List seed carrier): render List nominal as host Vec in seed bran…
briansrls Jun 20, 2026
239ff28
emit(Int generic-arg seed carrier): apply rust_seed_host_numeric_alia…
briansrls Jun 20, 2026
36348c8
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
a33c5ae
Merge origin/main into emitter/seed-green-integration (resolve emitte…
briansrls Jun 21, 2026
8c1dd84
Merge origin/main (#5476) into emitter/seed-green-integration
briansrls Jun 21, 2026
0a069ec
Re-ignore machine_width emit test: committed seed not yet regenerated
briansrls Jun 21, 2026
2018cd8
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
9cf103f
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
cb921c1
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
eeec49e
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
65e1f83
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
c0f35e0
Add lexer-layer host builtins to v2 interpreter (chars/chars_to_strin…
briansrls Jun 21, 2026
4a8afdd
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
63eba0e
Interpreter spike: additive record-form-map + list_push method dispatch
briansrls Jun 21, 2026
5f9d24c
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 21, 2026
6a9e5db
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 21, 2026
6f0c583
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 21, 2026
dd81e67
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
2d0df5e
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
be52559
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
23015bb
Route-A class 1/6: correct splice dissolution pointer to adhoc-1bdd02…
briansrls Jun 22, 2026
ffb12b4
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
fc5a9ec
Route-A: rustfmt the fixture-lever mirror splice (CI fmt gate)
briansrls Jun 22, 2026
8961054
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 22, 2026
751dfa9
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
f5bef4a
WIP class-3 computation layer: corpus_repr single authority (inert, .…
briansrls Jun 22, 2026
aeb61f6
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
e5b0ca0
Revert "WIP: Section 5 self-host execution manager: Lane A drive the …
briansrls Jun 22, 2026
6cf05a7
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
dee71b3
Revert "WIP: Section 5 self-host execution manager: Lane A drive the …
briansrls Jun 22, 2026
8f95dc3
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
86f71b0
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
675046c
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
bedc415
Section 5 self-host: thread corpus-global RustCorpusRepr selector thr…
briansrls Jun 22, 2026
ca4d06e
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
c725862
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
6525026
Restore known-good stage0 seed (revert premature regen); keep .dag cl…
briansrls Jun 22, 2026
ad010f6
WIP: Section 5 self-host execution manager: Lane A drive the emitted …
briansrls Jun 22, 2026
9757de2
Restore known-good stage0 seed (auto-committed local regen reverted a…
briansrls Jun 22, 2026
6d37177
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 22, 2026
e6d38e6
class-3 review fix: correct §6 dissolution-direction comment (src/v1 …
briansrls Jun 22, 2026
588bcc6
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
Jun 22, 2026
3b28498
PATH A — land class-3-embodying cargo-green seed via overlay-3-committed
Jun 22, 2026
1ca2ab8
PATH A carrier-mark: append quick-seal's representation-invariance ca…
Jun 22, 2026
56f4a87
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 22, 2026
85c7600
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
briansrls Jun 22, 2026
ab174e1
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
3ee8d30
Merge remote-tracking branch 'origin/main' into emitter/seed-green-in…
Jun 24, 2026
4e4929b
Lane A E0308 re-baseline: faithful emitted-seed crate, categorized count
Jun 24, 2026
f2949b3
Move E0308 re-baseline out of docs/ into the PR body (fix doc-reachab…
Jun 24, 2026
e673061
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
6c6b94f
Family-A: type-derived map-literal key coercion (.dag authority)
Jun 24, 2026
dbc66d1
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
0cc25d7
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
cc06289
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
e7d837f
Relax map_string_int fixture assertion to faithful-repr seam output
Jun 24, 2026
c6dce78
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
e9d963d
WIP: first-Option carrier-sig renderer fix (lane branch)
Jun 24, 2026
acf5175
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
ed294cc
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
1e045c5
Merge remote-tracking branch 'origin/main' into emitter/first-option-…
Jun 24, 2026
d3394a1
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
3625b00
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
3153ca9
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
4e97994
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
3c5f3af
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
8f6bd72
WIP: Lane A E0308 re-baseline (Route-A last mile): CONTINUE emitter/s…
Jun 24, 2026
21ca390
Merge remote-tracking branch 'origin/main' into emitter/first-option-…
Jun 24, 2026
e0bbe84
Restore unrelated-lane files clobbered by merge resolution (#5716)
Jun 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/plans/ci-humming.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,7 @@ The hosts co-host the agent-session fleet AND the CI runners. Full safe-by-const
## Critical path to capacity (do first, both hosts ASAP)

T0 (un-zero the runner slice) → model derives sane N + per-slot caps → T1+T2 verified-effective apply on srv1+srv2, **with the session slice either capped (5) or oomd-backstopped** → safe by construction (Σ caps + overhead + baselines ≤ physical). T4 (peak → 8GiB) multiplies N afterward. oomd is not required on the critical path.

## Dissolution trigger (DESIGN §6)

Delete this doc when CI throughput, wall-clock, and reliability all fall out of the single modeled fleet budget consumed by a verified-effective apply (T0 un-zeroes the runner slice, T1/T2 caps are verified-effective on srv1+srv2, and the session slice is capped or oomd-backstopped) — so capacity is safe by construction rather than hand-managed.
105 changes: 25 additions & 80 deletions docs/plans/edge-b-rust-dag-provenance-brief.md
Original file line number Diff line number Diff line change
@@ -1,115 +1,60 @@
# Edge-(b) scoped dispatch brief — rust-test ↔ consumed-.dag provenance (the coverage keystone)

**Status: SCOPING ONLY.** The multi-day build holds for the operator's explicit greenlight.
This document is the decision artifact for that greenlight call.
**Status: SCOPING ONLY.** The multi-day build holds for the operator's explicit greenlight. This document is the decision artifact for that greenlight call.

## Goal

Make the rust↔.dag dependency a **declared structural fact**, recorded once and read in two
directions. It is the single fact under three consumers (DESIGN §4, one grammar both directions),
which is why this is the §1 *coverage keystone*, not a cost follow-up.
Make the rust↔.dag dependency a **declared structural fact**, recorded once and read in two directions. It is the single fact under three consumers (DESIGN §4, one grammar both directions), which is why this is the §1 *coverage keystone*, not a cost follow-up.

## Why — one fact, three consumers

1. **Coverage wall (soundness, fail-closed).** Today a pure-.dag PR fires *no* rust gate:
`any_rust_monolith` (`dsl/tools/rust_stage0_gates.dag`) matches only `.rs`/Cargo/toolchain
suffixes. But rust tests *read* `.dag` via opaque `filesystem_read`/`ws.join`, so a `.dag`
change that breaks a rust test ships **silently green** — a §5 fail-OPEN. That file's own
COMPLETENESS CLAIM ("every change that can alter a rust gate's verdict carries a `.rs`/Cargo
suffix") is *false* for .dag-consuming tests, and its header names per-file rust→.dag
dependence as the deliberately-skipped proper model. Edge-(b) FIRES the rust gate when a
changed `.dag` is in a rust test's declared closure → makes the claim true. This is the
operator's "lock fail-closed before you expand" priority.
1. **Coverage wall (soundness, fail-closed).** Today a pure-.dag PR fires *no* rust gate: `any_rust_monolith` (`dsl/tools/rust_stage0_gates.dag`) matches only `.rs`/Cargo/toolchain suffixes. But rust tests *read* `.dag` via opaque `filesystem_read`/`ws.join`, so a `.dag` change that breaks a rust test ships **silently green** — a §5 fail-OPEN. That file's own COMPLETENESS CLAIM ("every change that can alter a rust gate's verdict carries a `.rs`/Cargo suffix") is *false* for .dag-consuming tests, and its header names per-file rust→.dag dependence as the deliberately-skipped proper model. Edge-(b) FIRES the rust gate when a changed `.dag` is in a rust test's declared closure → makes the claim true. This is the operator's "lock fail-closed before you expand" priority.
2. **Affordability selector.** The *same* declared closure read the other way — skip rust tests whose closure the diff doesn't touch — is the affected-set shrink (the ROADMAP end-state: run-all baseline SHRUNK to affected). cargo has *zero* affected-test selection (every `#[test]` every run; nextest too) and can't see `.dag` deps, so a declared closure is the *only* path to it.
3. **Testgen reflection.** The rust-test→.dag closure is the same provenance testgen needs to regenerate the right tests when a `.dag` node changes.

2. **Affordability selector.** The *same* declared closure read the other way — skip rust tests
whose closure the diff doesn't touch — is the affected-set shrink (the ROADMAP end-state:
run-all baseline SHRUNK to affected). cargo has *zero* affected-test selection (every `#[test]`
every run; nextest too) and can't see `.dag` deps, so a declared closure is the *only* path to it.

3. **Testgen reflection.** The rust-test→.dag closure is the same provenance testgen needs to
regenerate the right tests when a `.dag` node changes.

FIRE-when-consumed and SKIP-when-unaffected are the single fact read in opposite directions —
that unification is the moat (one carrier, three consumers).
FIRE-when-consumed and SKIP-when-unaffected are the single fact read in opposite directions — that unification is the moat (one carrier, three consumers).

## The asymmetry that decides what the build buys (construction, not validation)

The two directions have **asymmetric robustness to an incomplete declaration**, and this is the
construction-vs-validation lesson made concrete:
The two directions have **asymmetric robustness to an incomplete declaration**, and this is the construction-vs-validation lesson made concrete:

- **Affordability (skip-unaffected) is fail-SAFE to over-declaration.** Declare too much → you just
run more → never unsound. Robust to a sloppy/partial closure.
- **Coverage (fire-on-change) is fail-OPEN to UNDER-declaration.** If a test reads `.dag` A and B but
its closure declares only A, a change to B does NOT fire the gate → the exact `.dag`→rust fail-open
we are closing, silently re-introduced as **declaration drift**. The coverage wall is only as sound
as the declaration is COMPLETE: **closure ⊇ actual-.dag-reads**.
- **Affordability (skip-unaffected) is fail-SAFE to over-declaration.** Declare too much → you just run more → never unsound. Robust to a sloppy/partial closure.
- **Coverage (fire-on-change) is fail-OPEN to UNDER-declaration.** If a test reads `.dag` A and B but its closure declares only A, a change to B does NOT fire the gate → the exact `.dag`→rust fail-open we are closing, silently re-introduced as **declaration drift**. The coverage wall is only as sound as the declaration is COMPLETE: **closure ⊇ actual-.dag-reads**.

Consequence: the coverage wall's soundness lives entirely in the *completeness* of the closure, which
means a **hand-authored closure is the §3/§5 fork** — for the coverage consumer it silently re-opens
the hole. So the closure MUST be structurally derived (drift-proof); any hand-authored interim must be
marked **NON-SOUND** (delivers affordability only, not the coverage wall). The "shared blocker" below
is therefore not the tail of the work — it is *where the soundness lives*.
Consequence: the coverage wall's soundness lives entirely in the *completeness* of the closure, which means a **hand-authored closure is the §3/§5 fork** — for the coverage consumer it silently re-opens the hole. So the closure MUST be structurally derived (drift-proof); any hand-authored interim must be marked **NON-SOUND** (delivers affordability only, not the coverage wall). The "shared blocker" below is therefore not the tail of the work — it is *where the soundness lives*.

## Bounded core

1. **Declare rust-test → consumed-.dag-paths on the EXISTING `NodeArtifactProvenance` /
`EditLocusBinding` carrier** — no parallel mint (§3 single authority). Implementer must first
verify the carrier shape fits `rust-test-identity → .dag-path list`; if not, add a *sibling
entry on the same authority*, never a new module.
2. **Gate integration is small and precise:** extend `should_run_gates` / `any_rust_monolith`
(`dsl/tools/rust_stage0_gates.dag`) so a changed `.dag` path in the union of declared rust-test
closures ALSO returns true.
3. **Fail-closed default AT THE CONSUMER:** a rust test with no declared closure → *must-run*,
never skip. Absent provenance = run. This keeps the soundness direction safe while declarations
are added incrementally.
4. **Completeness-lens gated — on CORRECTNESS, not presence.** A lens that merely asserts "every
rust test HAS a closure declaration" checks *presence*, which is exactly the §5 trap: it is
satisfiable by editing the declaration while the realization diverges (the faked-cache-key /
dead-field pattern). The lens must check **closure ⊇ actual-.dag-reads** — otherwise a partial or
stale declaration passes the lens AND leaks coverage. Presence-only is not enough; correctness
(the superset relation) is the soundness condition.
1. **Declare rust-test → consumed-.dag-paths on the EXISTING `NodeArtifactProvenance` / `EditLocusBinding` carrier** — no parallel mint (§3 single authority). Implementer must first verify the carrier shape fits `rust-test-identity → .dag-path list`; if not, add a *sibling entry on the same authority*, never a new module.
2. **Gate integration is small and precise:** extend `should_run_gates` / `any_rust_monolith` (`dsl/tools/rust_stage0_gates.dag`) so a changed `.dag` path in the union of declared rust-test closures ALSO returns true.
3. **Fail-closed default AT THE CONSUMER:** a rust test with no declared closure → *must-run*, never skip. Absent provenance = run. This keeps the soundness direction safe while declarations are added incrementally.
4. **Completeness-lens gated — on CORRECTNESS, not presence.** A lens that merely asserts "every rust test HAS a closure declaration" checks *presence*, which is exactly the §5 trap: it is satisfiable by editing the declaration while the realization diverges (the faked-cache-key / dead-field pattern). The lens must check **closure ⊇ actual-.dag-reads** — otherwise a partial or stale declaration passes the lens AND leaks coverage. Presence-only is not enough; correctness (the superset relation) is the soundness condition.

## Shared blocker (testgen-reflection) — this IS the soundness, not optional polish

Per the asymmetry above: the `.dag`-closure must be DISCOVERED structurally, not hand-listed
(hand-listing is the §3/§5 fork that rots, and for the coverage consumer it *silently re-opens the
hole*). The reflection infra exists *partially* — `v2.std.node_query` + `dependency_lens` + the
`affected_set` node-frontier (compile-time, structural over Node/DependencyView). The missing piece:
rust tests reach `.dag` through *opaque host paths* (`ws.join`/`filesystem_read`), so the closure
isn't visible to the Node-tree lens. Surfacing each rust test's `.dag` reads as a declared,
lens-visible dependency is the shared blocker all three consumers wait on — and because the coverage
wall is only sound when `closure ⊇ actual-reads`, this structural discovery is the **load-bearing
core**, not the tail. It is the hard part and the multi-day driver precisely because it is where the
soundness is bought.
Per the asymmetry above: the `.dag`-closure must be DISCOVERED structurally, not hand-listed (hand-listing is the §3/§5 fork that rots, and for the coverage consumer it *silently re-opens the hole*). The reflection infra exists *partially* — `v2.std.node_query` + `dependency_lens` + the `affected_set` node-frontier (compile-time, structural over Node/DependencyView). The missing piece: rust tests reach `.dag` through *opaque host paths* (`ws.join`/`filesystem_read`), so the closure isn't visible to the Node-tree lens. Surfacing each rust test's `.dag` reads as a declared, lens-visible dependency is the shared blocker all three consumers wait on — and because the coverage wall is only sound when `closure ⊇ actual-reads`, this structural discovery is the **load-bearing core**, not the tail. It is the hard part and the multi-day driver precisely because it is where the soundness is bought.

## First vertical slice (smallest end-to-end, green-by-execution)

- Pick ONE rust test with a clear `.dag` closure — `coproduct_reflection_conformance_test`
(inputs entirely `.dag`) is the natural first.
- Pick ONE rust test with a clear `.dag` closure — `coproduct_reflection_conformance_test` (inputs entirely `.dag`) is the natural first.
- Declare its consumed-.dag closure on the carrier.
- Wire `should_run_gates` to fire when a changed path is in THAT test's declared closure.
- Prove by execution with a discriminating control: a diff to a `.dag` IN the closure FIRES the
gate; a diff to a `.dag` OUTSIDE the closure does NOT. Green = both directions observed.
- Prove by execution with a discriminating control: a diff to a `.dag` IN the closure FIRES the gate; a diff to a `.dag` OUTSIDE the closure does NOT. Green = both directions observed.
- This proves the structural fact end-to-end on one test before any corpus fan-out.
- **State explicitly which the slice proves.** For the slice to prove the *coverage direction
soundly*, `coproduct_reflection_conformance_test`'s closure must be **structurally derived** (so a
newly-added `.dag` read is captured automatically). If slice-1 hand-lists the closure as an interim,
it proves the *wiring* (fire/skip plumbing) but NOT the *wall* (drift-proof completeness) — and must
be labelled accordingly. The keystone's value is the wall, so the slice should target the derived
closure, not the hand-listed one.
- **State explicitly which the slice proves.** For the slice to prove the *coverage direction soundly*, `coproduct_reflection_conformance_test`'s closure must be **structurally derived** (so a newly-added `.dag` read is captured automatically). If slice-1 hand-lists the closure as an interim, it proves the *wiring* (fire/skip plumbing) but NOT the *wall* (drift-proof completeness) — and must be labelled accordingly. The keystone's value is the wall, so the slice should target the derived closure, not the hand-listed one.

## Honest estimate

Multi-day.

- Slice 1 (one test: declare + gate-fire + discriminating control): ~1 day.
- Shared blocker (structural .dag-closure discovery through opaque host reads, lens-visible):
the bulk — ~2–4 days, depending on whether the host-read seam can surface declarations cheaply
or needs the reflection layer deepened.
- Shared blocker (structural .dag-closure discovery through opaque host reads, lens-visible): the bulk — ~2–4 days, depending on whether the host-read seam can surface declarations cheaply or needs the reflection layer deepened.
- Corpus fan-out + completeness lens: after.

## Decoupling

Independent of #5427. #5427 is the cheap `.rs`-hole-closer (widen the rust gate's test command on
`.rs`-touching PRs) — lands now, behind the two operator levers. Edge-(b) is the structural
keystone that later makes the rust gate BOTH sound on `.dag` changes AND affordable by selection.
Neither blocks the other.
Independent of #5427. #5427 is the cheap `.rs`-hole-closer (widen the rust gate's test command on `.rs`-touching PRs) — lands now, behind the two operator levers. Edge-(b) is the structural keystone that later makes the rust gate BOTH sound on `.dag` changes AND affordable by selection. Neither blocks the other.

## Dissolution trigger (DESIGN §6)

Delete this brief once edge-(b) is built and merged — the rust-test→consumed-.dag closure is a structurally-derived (drift-proof) declared fact on the NodeArtifactProvenance carrier, the coverage wall fires the rust gate on an in-closure .dag change (closure ⊇ actual-reads, lens-checked on correctness not presence), and the affordability selector skips unaffected rust tests — so the scoping decision this doc records is realized.
Loading