From aca7b394a3f4b1f487afdb01d70757956408d59f Mon Sep 17 00:00:00 2001 From: Giorgio Gilestro Date: Sat, 4 Jul 2026 21:21:56 +0100 Subject: [PATCH] Rename neural experiments to descriptive paths (drop N* codes) configs/neural/{N0,N1,N2,N5}.yaml -> {bridge,collapse,grounding,architectures}.yaml, results dirs likewise. Updated experiment/output.dir fields, comments/docstrings, and docs; regenerated the four result manifests (now carrying the real git commit). No functional path resolution referenced the codes (the Makefile globs configs/neural/*.yaml and tests use inline configs), so nothing breaks. 92 tests green. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 10 +++--- .../neural/{N5.yaml => architectures.yaml} | 6 ++-- configs/neural/{N0.yaml => bridge.yaml} | 4 +-- configs/neural/{N1.yaml => collapse.yaml} | 6 ++-- configs/neural/{N2.yaml => grounding.yaml} | 6 ++-- results/N0/manifest.json | 16 --------- results/{N5 => architectures}/manifest.json | 6 ++-- .../resolved_config.yaml | 6 ++-- results/bridge/manifest.json | 17 +++++++++ results/{N0 => bridge}/resolved_config.yaml | 6 ++-- results/{N1 => collapse}/manifest.json | 6 ++-- results/{N1 => collapse}/resolved_config.yaml | 6 ++-- results/{N2 => grounding}/manifest.json | 6 ++-- .../{N2 => grounding}/resolved_config.yaml | 6 ++-- src/neural/experiment.py | 6 ++-- src/neural/generation_loop.py | 4 +-- src/neural/models.py | 2 +- src/neural/torch_mlp.py | 2 +- src/neural/torch_models.py | 2 +- src/neural/torch_vae.py | 2 +- tasks/todo.md | 35 ++++++++++--------- 21 files changed, 82 insertions(+), 78 deletions(-) rename configs/neural/{N5.yaml => architectures.yaml} (90%) rename configs/neural/{N0.yaml => bridge.yaml} (95%) rename configs/neural/{N1.yaml => collapse.yaml} (88%) rename configs/neural/{N2.yaml => grounding.yaml} (87%) delete mode 100644 results/N0/manifest.json rename results/{N5 => architectures}/manifest.json (56%) rename results/{N5 => architectures}/resolved_config.yaml (97%) create mode 100644 results/bridge/manifest.json rename results/{N0 => bridge}/resolved_config.yaml (98%) rename results/{N1 => collapse}/manifest.json (56%) rename results/{N1 => collapse}/resolved_config.yaml (97%) rename results/{N2 => grounding}/manifest.json (56%) rename results/{N2 => grounding}/resolved_config.yaml (97%) diff --git a/CLAUDE.md b/CLAUDE.md index c255a75..e1de2d6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,10 +13,12 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co models* (histogram bridge + RNN + MLP; VAE implemented but not fidelity-passing) on a fully-synthetic sandbox with an exact oracle, plus real MNIST as a later secondary tier. See `tasks/todo.md` for status and `~/.claude/plans/we-are-going-to-cheerful-fog.md` for the plan. - **Done:** scaffold, the histogram bridge gate (reproduces Layer 1 exactly), N0 (bridge, neural - g*=0.047 ≈ Layer 1), N1 (collapse in RNN weights), N2 (neural phase boundary), N5 - (architecture-generality). **Remaining:** N4 (mean-vs-max-merge, load-bearing), N3, N6, figures, - the MNIST tier. The LLM/LoRA rung and the C3 vertical claim are deferred. + **Done:** scaffold, the histogram bridge gate (reproduces Layer 1 exactly), `bridge` (neural + g*=0.047 ≈ Layer 1), `collapse` (in RNN weights), `grounding` (neural phase boundary), + `architectures` (architecture-generality). **Remaining:** `recombination` (mean-vs-max-merge, + load-bearing), `region_matched`, `remint`, figures, the MNIST tier. The LLM/LoRA rung and the C3 + vertical claim are deferred. Experiments are named descriptively (`configs/neural/.yaml`), + not by code. The two design documents are the source of truth for intent: diff --git a/configs/neural/N5.yaml b/configs/neural/architectures.yaml similarity index 90% rename from configs/neural/N5.yaml rename to configs/neural/architectures.yaml index 9e02c74..232f121 100644 --- a/configs/neural/N5.yaml +++ b/configs/neural/architectures.yaml @@ -1,9 +1,9 @@ -experiment: N5_architecture_generality +experiment: architecture_generality kind: gen_lineage seed: 20260704 n_replicates: 5 -# N5 (a new Layer-1.5 axis, no Layer-1 counterpart): is collapse ARCHITECTURE-GENERAL? +# (a new Layer-1.5 axis, no Layer-1 counterpart): is collapse ARCHITECTURE-GENERAL? # Run the same dry-vs-grounded protocol across three genuinely different learners that # share only the generative-collapse operator: the exact histogram (= Wright-Fisher, the # analytic anchor), an autoregressive GRU (recurrent), and an autoregressive MLP (feed- @@ -51,4 +51,4 @@ sweep: values: [0.0, 0.05] output: - dir: results/N5 + dir: results/architectures diff --git a/configs/neural/N0.yaml b/configs/neural/bridge.yaml similarity index 95% rename from configs/neural/N0.yaml rename to configs/neural/bridge.yaml index 9d6e580..9064529 100644 --- a/configs/neural/N0.yaml +++ b/configs/neural/bridge.yaml @@ -1,4 +1,4 @@ -experiment: N0_bridge_histogram +experiment: bridge_histogram kind: gen_lineage seed: 20260704 n_replicates: 60 @@ -39,4 +39,4 @@ sweep: values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4] output: - dir: results/N0 + dir: results/bridge diff --git a/configs/neural/N1.yaml b/configs/neural/collapse.yaml similarity index 88% rename from configs/neural/N1.yaml rename to configs/neural/collapse.yaml index 1c73e1a..f55d770 100644 --- a/configs/neural/N1.yaml +++ b/configs/neural/collapse.yaml @@ -1,9 +1,9 @@ -experiment: N1_collapse_in_weights +experiment: collapse_in_weights kind: gen_lineage seed: 20260704 n_replicates: 5 -# N1 (Layer 1.5, maps to Layer-1 E1 / blueprint C1): does model collapse appear in REAL +# (maps to Layer-1 E1 / blueprint C1): does model collapse appear in REAL # trained weights under dry recursive self-training, and does a little grounding arrest it? # An autoregressive RNN is retrained each generation on n samples drawn from the previous # generation's RNN (drift), optionally mixed with m verifier-grounded samples. Expect: the @@ -47,4 +47,4 @@ sweep: values: [0.0, 0.02, 0.05, 0.1] output: - dir: results/N1 + dir: results/collapse diff --git a/configs/neural/N2.yaml b/configs/neural/grounding.yaml similarity index 87% rename from configs/neural/N2.yaml rename to configs/neural/grounding.yaml index df31add..ad7f99a 100644 --- a/configs/neural/N2.yaml +++ b/configs/neural/grounding.yaml @@ -1,9 +1,9 @@ -experiment: N2_grounding_phase_boundary_neural +experiment: grounding_phase_boundary kind: gen_lineage seed: 20260704 n_replicates: 5 -# N2 (Layer 1.5 headline, maps to Layer-1 E2): the grounding phase boundary in REAL weights. +# (Layer 1.5 headline, maps to Layer-1 E2): the grounding phase boundary in REAL weights. # Sweep the grounding fraction g = m/(n+m) and locate the neural critical g* at which # stationary diversity is restored. Layer 1 found g* = 0.048 << 1. The neural regime (finite # model capacity, a smaller K so gen-0 fidelity holds) will not reproduce that value exactly @@ -47,4 +47,4 @@ sweep: values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2] output: - dir: results/N2 + dir: results/grounding diff --git a/results/N0/manifest.json b/results/N0/manifest.json deleted file mode 100644 index 58ce453..0000000 --- a/results/N0/manifest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "experiment": "N0_bridge_histogram", - "master_seed": 20260704, - "git_commit": null, - "python": "3.14.5", - "libraries": { - "numpy": "2.5.0", - "scipy": "1.18.0", - "pandas": "3.0.3", - "pyarrow": "24.0.0" - }, - "rows": 96480, - "results_sha256": "445fd5165fc69edbca87f79c0cf669b5879025637f4d36ddc769e940fb02f114", - "layer": "1.5", - "model_kind": "histogram" -} \ No newline at end of file diff --git a/results/N5/manifest.json b/results/architectures/manifest.json similarity index 56% rename from results/N5/manifest.json rename to results/architectures/manifest.json index fa038e9..887baf2 100644 --- a/results/N5/manifest.json +++ b/results/architectures/manifest.json @@ -1,7 +1,7 @@ { - "experiment": "N5_architecture_generality", + "experiment": "architecture_generality", "master_seed": 20260704, - "git_commit": null, + "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5", "python": "3.14.5", "libraries": { "numpy": "2.5.0", @@ -11,7 +11,7 @@ "torch": "2.12.1" }, "rows": 690, - "results_sha256": "4e8d7931e791493aa35ea7b114d81b90a3a58eabd92d8b1dbd87cf0a9e200ba1", + "results_sha256": "8f44a15e66c638fc0c717dab9b9d3feedad1cb4cee1890159a325f884677b32e", "layer": "1.5", "model_kind": "rnn" } \ No newline at end of file diff --git a/results/N5/resolved_config.yaml b/results/architectures/resolved_config.yaml similarity index 97% rename from results/N5/resolved_config.yaml rename to results/architectures/resolved_config.yaml index 48f7ee1..82126fa 100644 --- a/results/N5/resolved_config.yaml +++ b/results/architectures/resolved_config.yaml @@ -1,8 +1,8 @@ -experiment: N5_architecture_generality +experiment: architecture_generality seed: 20260704 n_replicates: 5 source_config: - experiment: N5_architecture_generality + experiment: architecture_generality kind: gen_lineage seed: 20260704 n_replicates: 5 @@ -49,7 +49,7 @@ source_config: - 0.0 - 0.05 output: - dir: results/N5 + dir: results/architectures grid: - label: kind: histogram diff --git a/results/bridge/manifest.json b/results/bridge/manifest.json new file mode 100644 index 0000000..ec14092 --- /dev/null +++ b/results/bridge/manifest.json @@ -0,0 +1,17 @@ +{ + "experiment": "bridge_histogram", + "master_seed": 20260704, + "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5", + "python": "3.14.5", + "libraries": { + "numpy": "2.5.0", + "scipy": "1.18.0", + "pandas": "3.0.3", + "pyarrow": "24.0.0", + "torch": "2.12.1" + }, + "rows": 96480, + "results_sha256": "c4e96e1e0ff01b103624a2ca6ac7508d4482df79224336f6a76debab3f93428c", + "layer": "1.5", + "model_kind": "histogram" +} \ No newline at end of file diff --git a/results/N0/resolved_config.yaml b/results/bridge/resolved_config.yaml similarity index 98% rename from results/N0/resolved_config.yaml rename to results/bridge/resolved_config.yaml index 9318e66..389ae78 100644 --- a/results/N0/resolved_config.yaml +++ b/results/bridge/resolved_config.yaml @@ -1,8 +1,8 @@ -experiment: N0_bridge_histogram +experiment: bridge_histogram seed: 20260704 n_replicates: 60 source_config: - experiment: N0_bridge_histogram + experiment: bridge_histogram kind: gen_lineage seed: 20260704 n_replicates: 60 @@ -44,7 +44,7 @@ source_config: - 0.2 - 0.4 output: - dir: results/N0 + dir: results/bridge grid: - label: g: 0.0 diff --git a/results/N1/manifest.json b/results/collapse/manifest.json similarity index 56% rename from results/N1/manifest.json rename to results/collapse/manifest.json index 981cc7c..d46649f 100644 --- a/results/N1/manifest.json +++ b/results/collapse/manifest.json @@ -1,7 +1,7 @@ { - "experiment": "N1_collapse_in_weights", + "experiment": "collapse_in_weights", "master_seed": 20260704, - "git_commit": null, + "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5", "python": "3.14.5", "libraries": { "numpy": "2.5.0", @@ -11,7 +11,7 @@ "torch": "2.12.1" }, "rows": 520, - "results_sha256": "27438db70af3240524855e59c4a14d3fb63bf6fca2d2002cdcb1ac354559909b", + "results_sha256": "4f3642005e383b07826c3f36c888485005d710f15fb2773a6295d672f6c9af4d", "layer": "1.5", "model_kind": "rnn" } \ No newline at end of file diff --git a/results/N1/resolved_config.yaml b/results/collapse/resolved_config.yaml similarity index 97% rename from results/N1/resolved_config.yaml rename to results/collapse/resolved_config.yaml index 21020a9..cb0bebd 100644 --- a/results/N1/resolved_config.yaml +++ b/results/collapse/resolved_config.yaml @@ -1,8 +1,8 @@ -experiment: N1_collapse_in_weights +experiment: collapse_in_weights seed: 20260704 n_replicates: 5 source_config: - experiment: N1_collapse_in_weights + experiment: collapse_in_weights kind: gen_lineage seed: 20260704 n_replicates: 5 @@ -46,7 +46,7 @@ source_config: - 0.05 - 0.1 output: - dir: results/N1 + dir: results/collapse grid: - label: g: 0.0 diff --git a/results/N2/manifest.json b/results/grounding/manifest.json similarity index 56% rename from results/N2/manifest.json rename to results/grounding/manifest.json index b4fb6fb..a32de39 100644 --- a/results/N2/manifest.json +++ b/results/grounding/manifest.json @@ -1,7 +1,7 @@ { - "experiment": "N2_grounding_phase_boundary_neural", + "experiment": "grounding_phase_boundary", "master_seed": 20260704, - "git_commit": null, + "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5", "python": "3.14.5", "libraries": { "numpy": "2.5.0", @@ -11,7 +11,7 @@ "torch": "2.12.1" }, "rows": 1085, - "results_sha256": "93590677221955189814ccf044b9dc8aee36b026e350c9dea7e8d23b137e514b", + "results_sha256": "ca87a339c207adb50953df0f81297fed24d24d98b71e2911709f9708b00ede2d", "layer": "1.5", "model_kind": "rnn" } \ No newline at end of file diff --git a/results/N2/resolved_config.yaml b/results/grounding/resolved_config.yaml similarity index 97% rename from results/N2/resolved_config.yaml rename to results/grounding/resolved_config.yaml index 4922775..0f9120c 100644 --- a/results/N2/resolved_config.yaml +++ b/results/grounding/resolved_config.yaml @@ -1,8 +1,8 @@ -experiment: N2_grounding_phase_boundary_neural +experiment: grounding_phase_boundary seed: 20260704 n_replicates: 5 source_config: - experiment: N2_grounding_phase_boundary_neural + experiment: grounding_phase_boundary kind: gen_lineage seed: 20260704 n_replicates: 5 @@ -49,7 +49,7 @@ source_config: - 0.1 - 0.2 output: - dir: results/N2 + dir: results/grounding grid: - label: g: 0.0 diff --git a/src/neural/experiment.py b/src/neural/experiment.py index 576f583..6d72e87 100644 --- a/src/neural/experiment.py +++ b/src/neural/experiment.py @@ -6,7 +6,7 @@ provenance helpers, and its output contract (``save_artifacts``). Only the per-r the config key set differ: a neural run trains generative models rather than resampling a frequency vector, and its config groups are ``synthetic``/``model``/``dynamics``/... . -CLI: python -m neural.experiment configs/neural/N0.yaml +CLI: python -m neural.experiment configs/neural/bridge.yaml """ from __future__ import annotations @@ -98,7 +98,7 @@ def run_and_save(config_path: str | Path) -> Path: out_dir = Path(cfg.get("output", {}).get("dir", f"results/{cfg['experiment']}")) kind = cfg.get("kind", "gen_lineage") if kind == "recombination": - from .recombine import run_recombination # Stage C (N4); imported lazily + from .recombine import run_recombination # the `recombination` experiment; lazy import df = run_recombination(cfg) grid = None elif kind == "gen_lineage": @@ -114,7 +114,7 @@ def run_and_save(config_path: str | Path) -> Path: def main(argv: list[str] | None = None) -> None: parser = argparse.ArgumentParser(description="Run a Layer-1.5 neural experiment from a YAML config.") - parser.add_argument("config", help="Path to configs/neural/NX.yaml") + parser.add_argument("config", help="Path to configs/neural/.yaml") args = parser.parse_args(argv) out_dir = run_and_save(args.config) print(f"wrote artifacts to {out_dir}/") diff --git a/src/neural/generation_loop.py b/src/neural/generation_loop.py index 975f166..18680b5 100644 --- a/src/neural/generation_loop.py +++ b/src/neural/generation_loop.py @@ -72,7 +72,7 @@ def run_generative_lineage(cfg: Mapping[str, Any] | NeuralLineageCfg, grounding = cfg.dynamics.grounding exercised = np.asarray(grounding.exercised) if grounding.exercised is not None else None m_vector = allocate_m(grounding.m, R, grounding.policy, exercised) - p_star_eff = p_star_orig.copy() # grounding reference; may be re-minted (N6) + p_star_eff = p_star_orig.copy() # grounding reference; may be re-minted (`remint`) remint = cfg.dynamics.remint n = cfg.dynamics.n @@ -105,7 +105,7 @@ def run_generative_lineage(cfg: Mapping[str, Any] | NeuralLineageCfg, if remint.enabled and remint.period and t % remint.period == 0: # Founder event: current distribution becomes the new grounding reference and - # the original truth is discarded for grounding. Gated on diversity (N6). + # the original truth is discarded for grounding. Gated on diversity (`remint`). if remint.H_gate is None or heterozygosity(p) >= remint.H_gate: p_star_eff = p.copy() record(t, p) diff --git a/src/neural/models.py b/src/neural/models.py index 6a69fe6..bb6a8e5 100644 --- a/src/neural/models.py +++ b/src/neural/models.py @@ -3,7 +3,7 @@ Every model implements the same three-method protocol: ``fit`` on a batch of token sequences, ``sample`` fresh token sequences, and report its ``mode_distribution`` (the model's ``p_t``). Keeping the interface identical is what makes "collapse is -architecture-general" (experiment N5) a single sweep over ``model.kind``. +architecture-general" (the `architectures` experiment) a single sweep over ``model.kind``. ``HistogramModel`` is the bridge: its ``fit`` is a maximum-likelihood mode histogram and its ``sample`` is a multinomial draw, so a lineage of histogram models is *exactly* diff --git a/src/neural/torch_mlp.py b/src/neural/torch_mlp.py index 3326224..2a60f70 100644 --- a/src/neural/torch_mlp.py +++ b/src/neural/torch_mlp.py @@ -1,4 +1,4 @@ -"""Autoregressive MLP generative model (Stage C, for the N5 architecture-generality axis). +"""Autoregressive MLP generative model (Stage C, for the `architectures` generality axis). A causal feed-forward next-token model: token ``i`` is predicted from the concatenated (causally-masked) embeddings of all earlier tokens. Deliberately a *different* inductive diff --git a/src/neural/torch_models.py b/src/neural/torch_models.py index 7d44143..022d311 100644 --- a/src/neural/torch_models.py +++ b/src/neural/torch_models.py @@ -2,7 +2,7 @@ Each model implements the same ``GenerativeModel`` protocol as the histogram bridge (``initialise`` / ``fit`` / ``sample`` / ``mode_distribution``), so a lineage is -architecture-agnostic and N5 is a single sweep over ``model.kind``. Unlike the histogram +architecture-agnostic and the `architectures` experiment is a single sweep over ``model.kind``. Unlike the histogram model, a neural model's ``mode_distribution`` is *estimated* by generate-and-classify (``n_eval`` samples), which is the honest, slightly-noisy neural readout of ``p_t``. diff --git a/src/neural/torch_vae.py b/src/neural/torch_vae.py index 0030335..631f1e9 100644 --- a/src/neural/torch_vae.py +++ b/src/neural/torch_vae.py @@ -1,4 +1,4 @@ -"""Sequence VAE generative model (Stage C, for the N5 architecture-generality axis). +"""Sequence VAE generative model (Stage C, for the `architectures` generality axis). A GRU encoder maps a token sequence to a Gaussian latent ``z``; a GRU decoder (its initial hidden state projected from ``z``) reconstructs the sequence. Trained by the ELBO diff --git a/tasks/todo.md b/tasks/todo.md index 01bba08..667e180 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -151,12 +151,13 @@ C3 vertical claim deferred.* `run_lineage` directly (<3%). The neural plumbing reproduces the analytic core. - **Plumbing:** `neural/experiment.py` (`run_and_save` dispatch on `kind`, reuses `_apply_param` g→m, paired seeds); extended `knowledge.experiment.save_artifacts` (optional `extra_libs`, - `extra_manifest`, injectable `grid`; skips missing libs — backward compatible). `configs/neural/N0.yaml`, - Makefile `neural`/`env-neural`/`layer2` targets, `.gitignore`. -- **N0 result (bridge, 17s):** neural **g\* = 0.0474, CI [0.045, 0.052]** — reproduces Layer-1 E2's + `extra_manifest`, injectable `grid`; skips missing libs — backward compatible). `configs/neural/bridge.yaml`, + Makefile `neural`/`env-neural`/`layer2` targets, `.gitignore`. (Experiments are named + descriptively — `bridge`, `collapse`, `grounding`, `architectures` — not by code.) +- **`bridge` result (17s):** neural **g\* = 0.0474, CI [0.045, 0.052]** — reproduces Layer-1 E2's g\*=0.048 essentially exactly (g=0.005→67% of H*, g=0.05→96%). **89 tests green.** -**2026-07-04 — Stage C: torch models + N1/N2/N5.** +**2026-07-04 — Stage C: torch models + collapse/grounding/architectures.** - **Env:** torch **2.12.1+cu130** (default PyPI wheel ships CUDA 13, matches RTX A4000 driver; no custom index needed, cp314 wheels exist). `--extra neural` = torch only; `--extra mnist` = @@ -168,16 +169,16 @@ C3 vertical claim deferred.* - **Validated regime:** K=256, n=200, zipf_s=1.3, RNN hidden=128/epochs=25. RNN gen-0 fidelity KL(p*‖p̂)=0.008, 64/64 (or 256/256) modes recovered. MLP fidelity KL=0.011. **VAE does NOT clear the gen-0 gate** on the Zipf-codeword task (KL≈0.8; prior-hole mismatch — sampling z~N(0,I) misses - the aggregate posterior) → excluded from N5 to avoid confounding collapse with underfitting. -- **N1 (collapse in weights):** dry RNN lineage collapses — forward-KL rises to ~2.2 vs grounded + the aggregate posterior) → excluded from `architectures` to avoid confounding collapse with underfitting. +- **`collapse` (in weights):** dry RNN lineage collapses — forward-KL rises to ~2.2 vs grounded ~1.4; grounding lifts tail survival (tailalive 0.31 dry → 0.50 at g=0.02). Sign confirmed. -- **N2 (neural phase boundary):** stationary H hovers 80–91% of H* and is **noisy / non-monotonic** +- **`grounding` (neural phase boundary):** stationary H hovers 80–91% of H* and is **noisy / non-monotonic** at 5 reps — no crisp g*. **KEY FINDING:** the neural models' smoothing inductive bias *partially resists* H-collapse (dry H stays ~83% of H*), so **forward-KL and tail survival are the sharp neural collapse metrics, not H** (mirrors Layer-1's "H is smooth; the threshold lives in tail - survival"). N2 needs (a) forward-KL as the phase metric, (b) more reps (≥10), and/or (c) a + survival"). `grounding` needs (a) forward-KL as the phase metric, (b) more reps (≥10), and/or (c) a stronger-collapse regime for a clean neural g*. -- **N5 (architecture-generality) — clean result:** collapse + grounding-rescue appear in ALL three +- **`architectures` (architecture-generality) — clean result:** collapse + grounding-rescue appear in ALL three model classes (dry→grounded forward-KL: histogram 6.2→4.6, MLP 4.8→1.3, RNN 3.8→1.1; tailalive RNN 0.41→0.64, MLP 0.07→0.20). The WF operator is architecture-general. Bonus: neural smoothing lets RNN/MLP retain *more* tail than the exact histogram under grounding (they generalise to @@ -185,16 +186,16 @@ C3 vertical claim deferred.* ## Remaining -- [ ] **N2 refinement:** re-run with forward-KL as the phase metric + ≥10 reps (and/or smaller n) - for a clean neural g*. Pin the falsifier ("g* ≪ 1 exists") before re-running. -- [ ] **N4 (load-bearing):** `recombine.py` — mean-mixture vs union-preserving merge. The neural - merge MUST be **oracle-guided mixture sampling** (sample from the teacher strongest on each mode), - NOT weight-averaging of recurrent nets (flag #7). Reproduce the E4 "mean flat, max rises" finding. -- [ ] **N3** region-matched grounding (R>1), **N6** re-mint gate (optional). +- [ ] **`grounding` refinement:** re-run with forward-KL as the phase metric + ≥10 reps (and/or + smaller n) for a clean neural g*. Pin the falsifier ("g* ≪ 1 exists") before re-running. +- [ ] **`recombination` (load-bearing):** `recombine.py` — mean-mixture vs union-preserving merge. + The neural merge MUST be **oracle-guided mixture sampling** (sample from the teacher strongest on + each mode), NOT weight-averaging of recurrent nets. Reproduce the E4 "mean flat, max rises" finding. +- [ ] **`region_matched`** grounding (R>1), **`remint`** re-mint gate (optional). - [ ] **VAE fidelity:** fix the prior-hole mismatch (KL-annealing / free-bits / larger latent) so it - clears the gen-0 gate, then add to N5. Or document as a known limitation. + clears the gen-0 gate, then add to `architectures`. Or document as a known limitation. - [ ] Real-MNIST secondary tier (`ClassifierOracle` + confusion matrix; `--extra mnist`). -- [ ] `figures/plot_N*.py` (reuse `figures/_figlib.py`); wire into `make figures`. +- [ ] `figures/plot_.py` (reuse `figures/_figlib.py`); wire into `make figures`. ## Discovered during work