diff --git a/dag/gunbc/plans/v2_self_hosting.dag b/dag/gunbc/plans/v2_self_hosting.dag index 1b41161d709..e524fc1486e 100644 --- a/dag/gunbc/plans/v2_self_hosting.dag +++ b/dag/gunbc/plans/v2_self_hosting.dag @@ -24,10 +24,10 @@ fn v2_self_hosting_body() -> List { h3(text: "Wave 1 — emit-surface + naming foundation (IN FLIGHT)"), p(text: "The old 2-wave plan collapsed here: \"Wave 2 = the sweep\" hid the emit-surface keystone. Exit gate — **all** must be green-by-execution before Wave 2 opens:"), ol(items: [ - li(text: "**General body producer emits REAL ingested fn bodies** — forward reader over grammar rows ([general-body-producer-design.md](general-body-producer-design.md)), not fixture-bound MVP productions. Stage A landed (#6443); Stages B/C/D in flight (#6459). Builds on [body-lowering-design.md](body-lowering-design.md)."), - li(text: "**Namespace SymbolIndex / tree-resolution lands** — B1 merged + fill ([namespace-resolution-design.md](namespace-resolution-design.md)); unblocks roster rows whose `SeedRetained.migration_trigger` is `^migrate_when_namespace_only_resolution_lands` on `frontier.dag` (e.g. `03_name_resolve`, `03_resolve`). Resolution works while `import` grammar still exists."), - li(text: "**FLAG D binder identity grounded** — DerivedBy producer-minting; position-qualified canonical binders (no parallel binder-identity scheme in the body producer)."), - li(text: "**Weak self-host behavioral receipt green** — `std/logic` (or equivalent): emit -> compile -> run -> equals seed on discriminating corpus ([s2-v2-self-emit-direction.md](s2-v2-self-emit-direction.md) §11)."), + li(text: "**General body producer emits REAL ingested fn bodies** — RECEIPT LANDED (#6558 body producer + #6526/#6523 fast+long witnesses). Residual explicitly NOT proven by those witnesses: Stage D MVP subsumption, FLAG D binding-key re-grounding, frontier probe per-module receipts, FLAG E body_lowering_fold dissolution."), + li(text: "**Namespace SymbolIndex / tree-resolution lands** — RECEIPT LANDED (#6523 gate-2 witnesses + #6538 scaling receipt). Residual: 03_name_resolve/03_resolve end-to-end ingest wire + frontier probe blocker_class rows."), + li(text: "**FLAG D binder identity grounded** — OPEN. Conform-now protocol live; `bind_eval_occurrence_identity_defect` witness documents occurrence-distinct binder/ref miss until EnvironmentBindingKey re-grounding lands ([general-body-producer-design.md](general-body-producer-design.md) §9)."), + li(text: "**Weak self-host behavioral receipt green** — OPEN. Partial: `std/logic` Bool enum type-decl self-emit (#6401) + fn-level emit-host equals-eval receipts; whole-module emit→compile→run→compare not green (#6429 closed without merge)."), ]), p(text: "**NO v1 deleted in Wave 1.**"), h3(text: "Wave 2 — first real flips"), @@ -46,8 +46,8 @@ fn v2_self_hosting_body() -> List { ul(items: [ li(text: "**FIRM:** 0/27 self-emitted (`compiler_frontier_self_emitted_baseline`, census witnesses on `frontier.dag`)."), li(text: "**FIRM (qualitative):** emit surface is the dominant blocker class across the roster."), - li(text: "**Carrier-held (do not transcribe counts in this doc):** per-module gap classification lives on `src/v2/compiler/self_host/frontier.dag` today as the 27-row roster's `SeedRetained { reason, migration_trigger }` dispositions plus `compiler_frontier_census_attribution: KnowledgeAttributed` — **the carrier holds the numbers; this doc points at the carrier** (DESIGN §2/§6: no parallel-ledger doc). #6464 IN FLIGHT will add execution-measured `blocker_class_distribution` and `frontier_probe.dag`; until then, do not cite those symbols as present-tense authority."), - li(text: "**IN FLIGHT mechanism (#6464):** execution-measured per-module emit probe + `frontier_probe.dag` will dissolve hand-refreshed gap clustering when the ingest-manifest fold binds live probe receipts — not landed in tree yet."), + li(text: "**Carrier-held (do not transcribe counts in this doc):** per-module gap classification lives on `src/v2/compiler/self_host/frontier.dag` as the 27-row roster's `SeedRetained { reason, migration_trigger }` dispositions plus `compiler_frontier_census_attribution: ExecutionMeasured` — **the carrier holds the numbers; this doc points at the carrier** (DESIGN §2/§6: no parallel-ledger doc)."), + li(text: "**LANDED mechanism (#6464):** structural census + fail-closed classifier on `frontier.dag`; per-module `frontier_probe_emit_from_ingest` execution receipts bind via `frontier_probe_survey` host transport — overlay manifest must not append trailing imports post-namespace-wave (header-only import rule)."), ]), h2(text: "3. Import-deletion ladder (parallel track — NOT a wave gate)"), p(text: "Namespace resolution and import deletion are **separate timelines**. Tree-resolution can work while imports still exist."), diff --git a/docs/plans/v2-self-hosting.md b/docs/plans/v2-self-hosting.md index ffea084d9bc..55e1afcd75c 100644 --- a/docs/plans/v2-self-hosting.md +++ b/docs/plans/v2-self-hosting.md @@ -23,10 +23,10 @@ Operator-signed 2026-07-11. Each wave is a **dependency-gated exit** (green-by-e The old 2-wave plan collapsed here: "Wave 2 = the sweep" hid the emit-surface keystone. Exit gate — **all** must be green-by-execution before Wave 2 opens: -1. **General body producer emits REAL ingested fn bodies** — forward reader over grammar rows ([general-body-producer-design.md](general-body-producer-design.md)), not fixture-bound MVP productions. Stage A landed (#6443); Stages B/C/D in flight (#6459). Builds on [body-lowering-design.md](body-lowering-design.md). -2. **Namespace SymbolIndex / tree-resolution lands** — B1 merged + fill ([namespace-resolution-design.md](namespace-resolution-design.md)); unblocks roster rows whose `SeedRetained.migration_trigger` is `^migrate_when_namespace_only_resolution_lands` on `frontier.dag` (e.g. `03_name_resolve`, `03_resolve`). Resolution works while `import` grammar still exists. -3. **FLAG D binder identity grounded** — DerivedBy producer-minting; position-qualified canonical binders (no parallel binder-identity scheme in the body producer). -4. **Weak self-host behavioral receipt green** — `std/logic` (or equivalent): emit -> compile -> run -> equals seed on discriminating corpus ([s2-v2-self-emit-direction.md](s2-v2-self-emit-direction.md) §11). +1. **General body producer emits REAL ingested fn bodies** — RECEIPT LANDED (#6558 body producer + #6526/#6523 fast+long witnesses). Residual explicitly NOT proven by those witnesses: Stage D MVP subsumption, FLAG D binding-key re-grounding, frontier probe per-module receipts, FLAG E body_lowering_fold dissolution. +2. **Namespace SymbolIndex / tree-resolution lands** — RECEIPT LANDED (#6523 gate-2 witnesses + #6538 scaling receipt). Residual: 03_name_resolve/03_resolve end-to-end ingest wire + frontier probe blocker_class rows. +3. **FLAG D binder identity grounded** — OPEN. Conform-now protocol live; `bind_eval_occurrence_identity_defect` witness documents occurrence-distinct binder/ref miss until EnvironmentBindingKey re-grounding lands ([general-body-producer-design.md](general-body-producer-design.md) §9). +4. **Weak self-host behavioral receipt green** — OPEN. Partial: `std/logic` Bool enum type-decl self-emit (#6401) + fn-level emit-host equals-eval receipts; whole-module emit→compile→run→compare not green (#6429 closed without merge). **NO v1 deleted in Wave 1.** @@ -50,8 +50,8 @@ Remaining ~13 roster modules flip to self-emitted **or** are declared **pinned-k - **FIRM:** 0/27 self-emitted (`compiler_frontier_self_emitted_baseline`, census witnesses on `frontier.dag`). - **FIRM (qualitative):** emit surface is the dominant blocker class across the roster. -- **Carrier-held (do not transcribe counts in this doc):** per-module gap classification lives on `src/v2/compiler/self_host/frontier.dag` today as the 27-row roster's `SeedRetained { reason, migration_trigger }` dispositions plus `compiler_frontier_census_attribution: KnowledgeAttributed` — **the carrier holds the numbers; this doc points at the carrier** (DESIGN §2/§6: no parallel-ledger doc). #6464 IN FLIGHT will add execution-measured `blocker_class_distribution` and `frontier_probe.dag`; until then, do not cite those symbols as present-tense authority. -- **IN FLIGHT mechanism (#6464):** execution-measured per-module emit probe + `frontier_probe.dag` will dissolve hand-refreshed gap clustering when the ingest-manifest fold binds live probe receipts — not landed in tree yet. +- **Carrier-held (do not transcribe counts in this doc):** per-module gap classification lives on `src/v2/compiler/self_host/frontier.dag` as the 27-row roster's `SeedRetained { reason, migration_trigger }` dispositions plus `compiler_frontier_census_attribution: ExecutionMeasured` — **the carrier holds the numbers; this doc points at the carrier** (DESIGN §2/§6: no parallel-ledger doc). +- **LANDED mechanism (#6464):** structural census + fail-closed classifier on `frontier.dag`; per-module `frontier_probe_emit_from_ingest` execution receipts bind via `frontier_probe_survey` host transport — overlay manifest must not append trailing imports post-namespace-wave (header-only import rule). ## 3. Import-deletion ladder (parallel track — NOT a wave gate) diff --git a/src/v1/stage0/src/bin/frontier_probe_survey.rs b/src/v1/stage0/src/bin/frontier_probe_survey.rs index 53e96ac46ca..7136bdbb947 100644 --- a/src/v1/stage0/src/bin/frontier_probe_survey.rs +++ b/src/v1/stage0/src/bin/frontier_probe_survey.rs @@ -236,9 +236,12 @@ fn unknown_probe_row(module_path: &str, cause: &str) -> ProbeReceiptRow { fn write_probe_overlay_manifest(module_path: &str, ingest_manifest: &Path) -> Result<(), String> { let escaped = module_path.replace('\\', "/"); - let append = format!( - "\nimport v2.std.text {{ String }}\n\ndata frontier_probe_entry_module_path: String = \"{escaped}\"\n" - ); + // The emitted ingest manifest already imports `String` in its header block + // (`host_source_root_ingest_content_hash: String`), and post-namespace-wave the + // grammar accepts imports ONLY in the header — a trailing `import` at EOF is now a + // parse error ("expected item declaration"). Append the `data` decl alone; String + // is already in scope. + let append = format!("\ndata frontier_probe_entry_module_path: String = \"{escaped}\"\n"); let mut body = fs::read_to_string(ingest_manifest).map_err(|e| format!("read ingest manifest: {e}"))?; if body.contains("frontier_probe_entry_module_path") {