Restructure: descriptive tier and experiment names, paper/manuscript

- paper/pnas -> paper/manuscript (venue-neutral)
- configs/layer1 -> configs/inheritance, src/knowledge -> src/inheritance
  (imported as `inheritance`), make layer1 -> make inheritance; layer2 alias dropped
- inheritance and trained-network bundles named after the manuscript figure
  they feed (fig2_grounding_sweep, figS3_rebaselining, ...), or descriptively
  where they feed none; configs keep their `experiment:` value so parquet
  hashes are unchanged, only output.dir moves
- figure scripts, SI figure sources, notebooks, REPRODUCING.md, README and the
  SI Methods/tables updated; make clean no longer deletes tracked manifests;
  reproduce.sh hashes the s{seed}/ layouts too

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y64o8FKP7rCuXzC48pxpMm
This commit is contained in:
Giorgio Gilestro 2026-09-13 17:00:40 +01:00
parent 84124de143
commit ab3dc10587
240 changed files with 477 additions and 476 deletions

View file

@ -1,4 +1,4 @@
# Clarity audit of paper/pnas/main.md (2026-09-13)
# Clarity audit of paper/manuscript/main.md (2026-09-13)
Standard: an interpretive sentence must state the concrete formula, number or mechanism it refers
to; figure citations must match what the figure plots; no herald sentences; no process ghosts.

View file

@ -92,7 +92,7 @@ E9, H1"; spell codenames out.
## 2026-09-11 — check the figure panel inventory before flagging cross-references
In the manuscript review I flagged Table 1's "Fig. 4CE" and "Fig. 3C" as inconsistent with the text. They were
correct: `make_figs.py` puts the E11 ablation in Fig. 4's bottom row and the predictive grid in Fig. 3CD; the text
simply failed to cite them. Rule: before calling a cross-reference wrong, read `paper/pnas/make_figs.py` and the
simply failed to cite them. Rule: before calling a cross-reference wrong, read `paper/manuscript/make_figs.py` and the
captions in `build.py` for the panel inventory; the fix is usually a missing citation in the text, not a wrong table.
## 2026-09-11 — never type a result number that a script has not printed
@ -103,7 +103,7 @@ print it first. This is the same rule the plan stated ("copied from the stats-sc
typed") and I broke it within the hour.
## Reference numbers hardcoded outside the renumber path (2026-09-11)
`renumber_refs.py` rewrites main.md, si.md and build.py captions, but `make_figs.py` carries a literal "(refs. N, M)" in the fig1a grounding cell, which went stale after references were added. Rule: after any renumber, grep `refs\.` and `ref\.` across `paper/pnas/*.py` and fix by hand (or extend renumber_refs.py to cover make_figs.py). Also: fig text is rendered, so verify by `pdftotext figs/fig1a.pdf`, not by grepping the source alone.
`renumber_refs.py` rewrites main.md, si.md and build.py captions, but `make_figs.py` carries a literal "(refs. N, M)" in the fig1a grounding cell, which went stale after references were added. Rule: after any renumber, grep `refs\.` and `ref\.` across `paper/manuscript/*.py` and fix by hand (or extend renumber_refs.py to cover make_figs.py). Also: fig text is rendered, so verify by `pdftotext figs/fig1a.pdf`, not by grepping the source alone.
## 2026-09-12 — GG's manuscript comments: heralds, undefined terms, and phantom SI references
Forty-five comments on the ODT. Three patterns. (1) **Herald sentences** ("Two boundaries follow.",

View file

@ -28,7 +28,7 @@ These are the only places the spec is genuinely underdetermined. Recommendation
- [x] Install `uv` (`curl -LsSf https://astral.sh/uv/install.sh | sh`; lands in `~/.local/bin`, no sudo).
- [x] **Reproducibility path = `uv` venv from a committed, hash-pinned `uv.lock`** (GG decision, 2026-07-04; no Apptainer/Docker for Layer 1). `pyproject.toml` (Python ≥3.11; deps: numpy, scipy, pandas, pyarrow, matplotlib, pydantic, pyyaml; dev: pytest). Commit `uv.lock`. Create `.venv` via `uv sync`.
- [x] Repo layout per §5: `src/knowledge/`, `configs/layer1/`, `figures/`, `results/` (gitignored), `tests/`, `paper/`. Add `src/lamarckian/` package root or make `knowledge` importable (decide package name — recommend `src/lamarckian/knowledge/...` with `src`-layout).
- [x] Repo layout per §5: `src/inheritance/`, `configs/inheritance/`, `figures/`, `results/` (gitignored), `tests/`, `paper/`. Add `src/lamarckian/` package root or make `knowledge` importable (decide package name — recommend `src/lamarckian/knowledge/...` with `src`-layout).
- [x] `.gitignore` (`.venv/`, `results/`, `__pycache__/`, `*.parquet` under results but keep hashes).
- [x] Seeding util `lamarckian/utils/seeding.py`: master seed → `np.random.SeedSequence(seed).spawn(n)` → per-replicate `np.random.default_rng(child)`. No global RNG anywhere.
- [x] Config loader `lamarckian/config.py`: pydantic schema mirroring the §2.7 YAML, a `load_config(path)`, a `expand_sweeps(cfg) -> list[ResolvedConfig]`, and `write_resolved(cfg, dir)`.
@ -58,22 +58,22 @@ Implement to the normative signatures in §2.7. Order chosen so each piece is un
- [x] `knowledge/experiment.py::run_experiment(cfg)` — sweep grid × `n_replicates`; long-form results + CIs; write `results.parquet` + `resolved_config.yaml` + `manifest.json`.
- [x] **E1** config + run: `m=0`, single teacher, no selection. Expect `H` geometric decay, support→1, KL diverges, tail-first loss.
- [x] **E2** config + run: sweep `g`, single teacher, uniform grounding, no selection. Locate critical `g*` (transition in **tail mass / support**, since H is smooth in m — the sharp threshold is in discrete tail survival). Report `g*` with CI. **This is the load-bearing result.**
- [x] `figures/plot_E1.py`, `plot_E2.py` — read `results.parquet` only.
- [x] `figures/plot_collapse_null.py`, `plot_fig2_grounding_sweep.py` — read `results.parquet` only.
## Phase 3 — E3E6
- [x] **E3 region-matched grounding.** Fixed total `m`; `uniform` vs `matched`; one designated inherited-but-unwatered region with a rare tail. Expect uniform lets that region's tail collapse; matched holds it. Per-region metrics essential. `plot_E3.py`.
- [x] **E3 region-matched grounding.** Fixed total `m`; `uniform` vs `matched`; one designated inherited-but-unwatered region with a rare tail. Expect uniform lets that region's tail collapse; matched holds it. Per-region metrics essential. `plot_figS5_aimed_grounding.py`.
- [x] **§2.7.1 correlated-teacher construction** — `knowledge/teachers.py`:
- `make_retention_matrix(T, K_T, rho, q, rng)` — shared-switch exchangeable Bernoulli.
- `make_correlated_teachers(...)` — retention→distributions (head kept at `p*`; tail at `p*_i` if retained else `tail_floor`; renormalise). `region_specialisation` option.
- **Pred. 5** validation: `make_retention_matrix` reproduces marginal `q`, pairwise `ρ`, and union coverage `U(K_T,ρ,q)=T[ρq+(1ρ)(1(1q)^K_T)]` to 3 decimals over a `(ρ,q)` grid.
- [x] **E4 multi-teacher decorrelation.** Sweep `K_T∈{1,2,3,5}`, `ρ∈[0,1]` at fixed `q`, matched budget (`n/K_T` each). Report **both** union `U` and post-distillation surviving coverage; show their gap shrinks as `g` rises. `plot_E4.py` (coverage surface over `(K_T,ρ)`).
- [x] **E5 QD vs greedy.** `apply_selection` (`none`/`greedy`/`qd`, pinned fitness form). Sweep novelty `α`. Expect greedy→fixation (`H→0`), qd holds `H` plateau + re-introduces tails. `plot_E5.py`.
- [x] **E6 re-mint gate.** Re-mint at high vs low `H`; track KL to *original* truth. Expect collapsed re-mint locks KL high forever; gated (high-H) does not. `plot_E6.py`.
- [x] **E4 multi-teacher decorrelation.** Sweep `K_T∈{1,2,3,5}`, `ρ∈[0,1]` at fixed `q`, matched budget (`n/K_T` each). Report **both** union `U` and post-distillation surviving coverage; show their gap shrinks as `g` rises. `plot_figS8_multiparent_union.py` (coverage surface over `(K_T,ρ)`).
- [x] **E5 QD vs greedy.** `apply_selection` (`none`/`greedy`/`qd`, pinned fitness form). Sweep novelty `α`. Expect greedy→fixation (`H→0`), qd holds `H` plateau + re-introduces tails. `plot_figS12_quality_diversity.py`.
- [x] **E6 re-mint gate.** Re-mint at high vs low `H`; track KL to *original* truth. Expect collapsed re-mint locks KL high forever; gated (high-H) does not. `plot_figS3_rebaselining.py`.
## Phase 4 — Reproducibility polish (Layer 1 slice)
- [x] `configs/layer1/E1..E6.yaml` all committed with explicit params (no magic numbers in code).
- [x] `configs/inheritance/E1..E6.yaml` all committed with explicit params (no magic numbers in code).
- [x] `paper/figure_manifest.md` — the §6 claim→experiment→figure rows for Layer 1.
- [x] `make layer1` runs E1E6; `make figures` regenerates all figures from committed parquet.
- [x] Full `test_correctness.py` (shapes, normalisation, determinism) + `test_scientific_validation.py` (Pred. 15) green in CI.
@ -97,7 +97,7 @@ Every Layer-1 row of blueprint §6 has a committed figure produced by `make figu
**2026-07-04 — Phases 0 & 1 complete; hard gate PASSED.**
- Reorg: docs → `paper/` (`blueprint.md`, `the-lamarckian-society-v4.md`). src-layout under `src/knowledge/`.
- Reorg: docs → `paper/` (`blueprint.md`, `the-lamarckian-society-v4.md`). src-layout under `src/inheritance/`.
- A pre-existing `tests/test_scientific_validation.py` (author-supplied, 22 KB) turned out to hard-specify the package contract — implemented *to it* rather than inventing interfaces. Key contracts it locked (now honoured): package imports as `knowledge.*`; `run_lineage(cfg_dict, seed)` returns a tidy per-gen frame with a `heterozygosity` column, rows 0..T; `p_0` initialises **uniform** (`H_0=11/K`); `metrics.heterozygosity` and `teachers.make_retention_matrix` match the reference to 1e-12 / closed form.
- Env: `uv` 0.11.26 installed; `pyproject.toml` + `uv.lock` committed; numpy 2.5, pandas 3.0, scipy 1.18, pydantic 2.13, pytest 9.1.
- Modules written: `metrics`, `seeding`, `config` (dataclasses + `from_dict`), `truth`, `teachers`, `step`, `lineage`. Config is dataclass-based (not pydantic) — the conformance test passes a raw dict; dataclasses validate cleanly and stay stdlib-simple. **Pydantic still a dep for the Phase-2 YAML/experiment layer.**
@ -107,9 +107,9 @@ Design decisions #1 (dataclasses now / pydantic at YAML layer), #2 (fitness `f_i
**2026-07-04 — Phase 2 complete (E1 + E2).**
- `experiment.py`: sweep expansion (Cartesian grid; special-cases `g→m`), paired replicate seeds (shared across grid points), output contract (`results.parquet` + `resolved_config.yaml` + `manifest.json` with lib versions + git commit + sha256). CLI `python -m knowledge.experiment <cfg>`.
- **E1 (null collapse)** — reproduces tail-first collapse: H geometric decay matches `H₀(11/n)ᵗ` within CI; tail items die ~10× faster than head items; support 500→1; forward-KL diverges. Figure `results/E1/E1.png`.
- **E2 (headline)**`H_sim` tracks the *exact* `H_eq` closed form across the sweep; phase boundary at **`g* ≪ 1`**: g=0.005 (m=1 real sample vs n=200) → 68% of truth H; g=0.05 → 96%. g=0 slides to ~0.10 over 500 gens. Figure `results/E2/E2.png`. **Headline result achieved.**
- `experiment.py`: sweep expansion (Cartesian grid; special-cases `g→m`), paired replicate seeds (shared across grid points), output contract (`results.parquet` + `resolved_config.yaml` + `manifest.json` with lib versions + git commit + sha256). CLI `python -m inheritance.experiment <cfg>`.
- **E1 (null collapse)** — reproduces tail-first collapse: H geometric decay matches `H₀(11/n)ᵗ` within CI; tail items die ~10× faster than head items; support 500→1; forward-KL diverges. Figure `results/collapse_null/E1.png`.
- **E2 (headline)**`H_sim` tracks the *exact* `H_eq` closed form across the sweep; phase boundary at **`g* ≪ 1`**: g=0.005 (m=1 real sample vs n=200) → 68% of truth H; g=0.05 → 96%. g=0 slides to ~0.10 over 500 gens. Figure `results/fig2_grounding_sweep/E2.png`. **Headline result achieved.**
- Metric subtlety found & fixed: aggregate **`tail_mass` is a drift martingale** (mean-conserved), so it's a poor collapse indicator. Added `tail_support`/`head_support`/`tail_frac_alive`/`head_frac_alive`; E1 & E2 figures now use tail-*item* survival, which is honest and monotone.
- E2 extended 300→500 generations (GG-approved) so the g=0 arm visibly approaches 0 while g>0 arms sit on plateaus.
- Makefile `layer1`/`figures` wired to E1E2. `make test` still green (68).
@ -140,17 +140,17 @@ C3 vertical claim deferred.*
- **Env:** installed `uv` 0.11.26 (`~/.local/bin`); `/home` was 100% full — GG approved clearing
pip/yay/browser caches (~10 GB freed). Base venv synced; 71 Layer-1 tests green.
- **Stage A (scaffold, pure NumPy):** `src/neural/``config.py` (frozen dataclasses reusing
`knowledge.config` GroundingCfg/RemintCfg/MetricsCfg/_sub), `synthetic.py` (mode-truth via
`inheritance.config` GroundingCfg/RemintCfg/MetricsCfg/_sub), `synthetic.py` (mode-truth via
`make_true_distribution`; lossless identity + stochastic style token grammar), `oracle.py`
(`ExactOracle` zero-error + `measure_distribution`), `models.py` (`GenerativeModel` protocol +
`HistogramModel` bridge), `evaluate.py` (reuses `knowledge.metrics`, Layer-1 row schema),
`HistogramModel` bridge), `evaluate.py` (reuses `inheritance.metrics`, Layer-1 row schema),
`generation_loop.py` (`run_generative_lineage`, reuses `allocate_m`/`structured_multinomial`).
15 correctness tests green.
- **Stage B — HARD GATE PASSED:** `tests/test_neural_validation.py` — histogram lineage reproduces
Pred. 1 (neutral decay, <3% rel err), Pred. 3 (exact `H_eq`, <5%), and tracks Layer-1
`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`,
g→m, paired seeds); extended `inheritance.experiment.save_artifacts` (optional `extra_libs`,
`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.)
@ -216,7 +216,7 @@ C3 vertical claim deferred.*
those are the wrong metrics for a smoothing model, not because grounding fails. Reported as such.
- **Robustness fix:** a fully-degenerate RNN can emit only invalid codewords → `measure_distribution`
now returns a terminal-collapse sentinel (fixation on the dominant mode) instead of crashing a long
sweep. Edge-case test added. `figures/plot_grounding.py` written (4-panel, states its own verdict),
sweep. Edge-case test added. `figures/plot_figS6_grounding_rnn.py` written (4-panel, states its own verdict),
wired into `make figures` (glob all `plot_*.py` except `plot_E[1-6]`).
**2026-07-05 — neural figures (all five).**
@ -236,8 +236,8 @@ C3 vertical claim deferred.*
reused verbatim): `mnist_data.py` (load, per-class thickness bins, mode = class×thickness bijection,
`MnistSampler`), `mnist_oracle.py` (frozen CNN + deterministic thickness = `ClassifierOracle`,
confusion matrix), `mnist_vae.py` (`ConvVAEGenerator`), `mnist_loop.py` (`run_mnist_lineage`), plus
`kind=mnist_lineage` dispatch in `experiment.py`, `configs/neural/mnist_collapse.yaml`,
`figures/plot_mnist.py`, `figures/mnist_montage.py` (eyeball diagnostic), `MnistCfg`/`OracleCfg`.
`kind=mnist_lineage` dispatch in `experiment.py`, `configs/neural/fig2_mnist_collapse.yaml`,
`figures/plot_fig2_mnist_collapse.py`, `figures/mnist_montage.py` (eyeball diagnostic), `MnistCfg`/`OracleCfg`.
- **Gates:** CNN mode accuracy **98.5%** (30×30 confusion matrix in the manifest = noise floor);
VAE gen-0 recovers full 30/30 support (over-smooths freq, KL≈0.5, no prior hole).
- **Result (4 reps):** dry (g=0) VAE **collapses to a single mode** (KL 0.5→18, support 30→1, tail
@ -255,7 +255,7 @@ C3 vertical claim deferred.*
neutral is inert, sharpening `τ=0.8` reproduces the collapse-to-one-mode. RNN regime (n=200,K=256):
neutral → H=0, mutation `u=0.006` reproduces the H-floor (~0.68). Uniform-mutation overshoots the
RNN's KL → its prior is truth-like, not uniform (honest caveat, future refinement).
- `configs/layer1/kernel_{sharpen,smooth}.yaml`, `figures/plot_kernel.py` (overlays analytic arms vs
- `configs/inheritance/kernel_{sharpen,smooth}.yaml`, `figures/plot_kernel.py` (overlays analytic arms vs
the committed neural endpoints), READMEs, `tests/test_kernel.py` (+6). Wired into `make layer1`.
- **Strategic (see CLAUDE.md finding):** concede "collapse=drift" to Riis (prior art; cite); his
mixed environment retains OLD SYNTHETIC (no real-data injection) → pessimistic, no g* that prevents
@ -272,8 +272,8 @@ C3 vertical claim deferred.*
per-locus marginals). Reuses all K-mode machinery + `make_retention_matrix` (locus mastery).
- **E8 (star, `kind: society`, `knowledge/society.py`) — the vertical claim:** decorrelated parents
recombined; **sexual merge reaches the optimum (12/12, a genotype no parent had)** as parent count
grows / `ρ→0`, while best-parent (~8.7) and mean-mixture soup (~11.6) plateau. `configs/layer1/E8.yaml`,
`plot_E8.py`, README. The FisherMuller effect for AI.
grows / `ρ→0`, while best-parent (~8.7) and mean-mixture soup (~11.6) plateau. `configs/inheritance/figS9_specialist_superparent.yaml`,
`plot_figS9_specialist_superparent.py`, README. The FisherMuller effect for AI.
- **E7 (`kind: genotype_lineage`, `knowledge/genotype_lineage.py`) — advantage of sex:** sexual lineage
adapts faster than asexual (LD→0 vs LD spike). Honest: a speed advantage, not a permanent ratchet gap.
- **Metaphor shift (GG):** sexual reproduction with **unbounded parents**, not teacher→pupil (which caps
@ -293,7 +293,7 @@ C3 vertical claim deferred.*
(0.66→0.51); **directed sex** (choose mates + select offspring + unbounded parents, iterated) tracks/
exceeds the best parent at every ruggedness. The distinctly-AI superpower, no biological analog.
- Complete picture: dramatic super-parent offspring when complementary (E8); outbreeding-depression
risk when entangled (E9); directed sex resolves it (E10). `configs/layer1/{E9,E10}.yaml`,
risk when entangled (E9); directed sex resolves it (E10). `configs/inheritance/{E9,E10}.yaml`,
`plot_{E9,E10}.py`, READMEs, +5 tests (117 green).
**2026-07-05 — the dynamic Lamarckian society (E11): the vertical claim / C3 realized.**
@ -306,7 +306,7 @@ C3 vertical claim deferred.*
diversity maintained longest); no_sex 0.77; no_diversity/greedy 0.74; **no_grounding 0.48
(self-consumption collapse to unfit consensus).** Only the full society climbs. Integrates E1-E6 +
kernel + E7-E10 into one system: needs ALL of grounding + directed sex + diversity.
- `configs/layer1/E11.yaml`, `plot_E11.py`, README, `tests/test_dynamic_society.py` (+5, 122 green).
- `configs/inheritance/fig4_society_ablation.yaml`, `plot_fig4_society_ablation.py`, README, `tests/test_dynamic_society.py` (+5, 122 green).
Closes C3 analytically; the LLM rung remains the eventual empirical instantiation.
## Remaining (all optional / next)
@ -532,7 +532,7 @@ writing standard is paramount: every term defined at first use with an example f
- [x] si.md: S3 text, Table S1/S2 rows, M2/M5/M6 additions, SI figures list; fixed two stale SI
citation numbers (41→44, 43→46 pre-renumbering) and one leftover "honest"
- [x] References: +8 (7380 appended, then renumbered to first-appearance order by
`paper/pnas/renumber_refs.py`; 80 refs, 0 orphans, recheck = 0 renumbered)
`paper/manuscript/renumber_refs.py`; 80 refs, 0 orphans, recheck = 0 renumbered)
- [x] Verification: fig6 rendered+inspected twice (legend fix); PDFs build (main 24 pp, SI 11 pp; no
unresolved FIG markers); gap/meta-language grep clean; two-reader pass (added "verifier",
"frozen", validation glosses); `make test` 196 passed
@ -555,7 +555,7 @@ writing standard is paramount: every term defined at first use with an example f
via doi.org content negotiation: 77 from DOI (53 printed in the manuscript, 22 found by
title-matched Crossref search, 2 hand-verified — Brinkmann *Machine culture*, Schwarz *Progress &
Compress*), 3 hand-written because they predate DOIs (Jenkin 1867, Fisher 1930, Templeton 1986).
Artifacts in `paper/pnas/refs/`; generator `paper/pnas/build_zotero_library.py`.
Artifacts in `paper/manuscript/refs/`; generator `paper/manuscript/build_zotero_library.py`.
**Not yet in Zotero** — the app is closed and its library lives in ownCloud; direct writes to
`zotero.sqlite` are unsafe, so import is one step in the Zotero UI (see refs/README.md).
- [ ] Optional: sync long-form `paper/the-evolution-of-sex-for-ai.md` L797 ("LLM society is unbuilt")
@ -587,7 +587,7 @@ the inverse of his rhythm. That is the measurable cause of "too cryptic".
## Manuscript review pass (2026-09-11)
Review of `paper/pnas/main.md` (novelty, accessibility, calibration, cheap experiments); corrections applied:
Review of `paper/manuscript/main.md` (novelty, accessibility, calibration, cheap experiments); corrections applied:
- [x] Abstract rewritten (one idea per sentence, jargon removed, 250 words); own-ancestor result added, mating-breadth hypothesis dropped
- [x] Own-ancestor (seed-bank) merge given its own paragraph, Table 1 row, and design rule
- [x] Emergent null (merge rescues forgetting specialists) and the overlap control (delta-cosine +0.60 → +0.03) promoted from asides to findings
@ -615,19 +615,19 @@ Review of `paper/pnas/main.md` (novelty, accessibility, calibration, cheap exper
- Discovered: the venv carried paths from before the repo moved into `LLMs/` (stale shebangs; `uv run pytest` could not spawn). `pytest` re-installed; other console scripts still stale — `uv sync --all-extras --reinstall` would fix all. Hardening candidate: specialist cache key lacks the base model (fails loudly, not silently).
## Venue + novelty audit (2026-09-11)
Target: Nature Machine Intelligence first; PLOS Comput Biol as the venue reaching both ML and pop-gen readers. All PNAS wording removed from `paper/pnas/` sources (SI Appendix → Supplementary Information; build/tex comments). Directory name `paper/pnas/` kept (Makefile/REPRODUCING paths); Significance statement kept pending GG decision.
Target: Nature Machine Intelligence first; PLOS Comput Biol as the venue reaching both ML and pop-gen readers. All PNAS wording removed from `paper/manuscript/` sources (SI Appendix → Supplementary Information; build/tex comments). Directory name `paper/manuscript/` kept (Makefile/REPRODUCING paths); Significance statement kept pending GG decision.
Literature audit (three WebSearch sweeps) found claims that need rewording/citations before submission:
- [x] "Every merging study merges once" is false → narrow to "no study combines per-generation skill acquisition with repeated, optional merging across lineages". Cite iterated-merging work: model kinship 2410.12613 (stagnation by gen 2, inbreeding analogy), GENOME 2503.01155, M2N2, TIME 2412.06712, MagMax, ACMap 2412.18219 (early-stop precedent), K-Merge 2510.13537 (similarity-gated merge), SFA/"Soup to go" 2501.05559 + IMM 2503.02103 (ancestor-averaging precedent)
- [x] Predictor section: "functional > weight geometry" is already shown by Cao 2603.09463 (must-cite), Zhu 2608.09490, Zhou 2601.22285 (gradient > cosine). Reframe novelty as held-out predictive design + the overlap control (cosine = shared-data artefact; not found anywhere)
- [x] Speciation: credit permutation+rescaling decomposition to Git Re-Basin + REPAIR 2211.08403; cite ZipIt 2305.03053, Sharma non-local 2410.12766 for residual barriers; Git Re-Basin §5.4 already merges complementary-class parents. Keep as new: conflicting-label manipulation, three-arm contrast, emergent null (against Pari 2411.02207 / Horoi / Kozodoi)
- [x] Grounding: must cite Alemohammad 2307.01850 (fresh-data loop fixed point), Bertrand 2310.00429 (stability theorem in real fraction), Dohmatob 2402.07043 + 2410.04840 (counter-claim: any synthetic fraction caps performance — reconcile with H_eq<H*), Kazdan 2410.16713 (cardinality not proportion supports Pred. 4), Suresh 2412.17646 (per-item no-immigration law), Garg 2509.22341 / He 2502.18049 (fresh-data optimal ratio 0.62 under MSE explain the different objective); Shumailov's 10%-retention datum
- [x] Blending proposition: present as lemma (linearity + Poisson thinning); cite Yuan 2601.13572 (signal dilution), Malinin 2020 ensemble-distribution distillation, BTM/BTX, Bulmer 2004 for Jenkin/Fisher; FisherMuller-for-merging framing appears to be ours
All five applied to main.md (2026-09-11): 19 references added (now 100), renumbered by first appearance, PDFs rebuilt. Not yet done: regenerate `paper/pnas/refs/` exports (Zotero/RIS/CSL) for the new entries; confirm Bertrand's λ convention and Alemohammad's fixed-point statement against the full texts before submission.
All five applied to main.md (2026-09-11): 19 references added (now 100), renumbered by first appearance, PDFs rebuilt. Not yet done: regenerate `paper/manuscript/refs/` exports (Zotero/RIS/CSL) for the new entries; confirm Bertrand's λ convention and Alemohammad's fixed-point statement against the full texts before submission.
## Manuscript review pass (2026-09-12)
- [x] Act on the 45 comments in `paper/pnas/main_with_comments.odt` (clarity, nomenclature, heralds).
- [x] Number Supplementary Figures S1S13 (`paper/pnas/si_figures.py`, `build.py`, `si.tex` counter) and cite them from the main text.
- [x] Act on the 45 comments in `paper/manuscript/main_with_comments.odt` (clarity, nomenclature, heralds).
- [x] Number Supplementary Figures S1S13 (`paper/manuscript/si_figures.py`, `build.py`, `si.tex` counter) and cite them from the main text.
- [x] SI Text S4: proof of the blending-inheritance proposition (regime corrected to `n·p ≪ 1`).
- [x] Clarity pass on the final Results section (predictive test), unprompted per GG's note.
- [ ] **Discovered:** SI figure PDFs still carry codename suptitles ("E2 —", "grounding —") and teacher/pupil axis labels (Fig. S8); regenerate with manuscript vocabulary before submission (`figures/plot_*.py` title lines or a `--paper` flag).
@ -647,7 +647,7 @@ All five applied to main.md (2026-09-11): 19 references added (now 100), renumbe
- [x] Culling: 3 seeds fetched; README, S15, Results paragraph, Discussion rewritten (prediction withdrawn), Abstract, Table S2, M2, M5.
- [x] SI figures S14-S16; Results/SI text; Table S2 rows; REPRODUCING.md; Fig. 5 caption; Discussion rewritten.
- [ ] **Discovered:** a curriculum in which some skills are obtainable only by merging (not delivered to every lineage) is the experiment that would separate the LLM population from the inheritance-model society; not run.
- [x] Student-level figure guide: `paper/pnas/figure_legends_for_students.md` (+ `build_lay_legends.py`, built by `make paper`); 21 legends, glossary.
- [x] Student-level figure guide: `paper/manuscript/figure_legends_for_students.md` (+ `build_lay_legends.py`, built by `make paper`); 21 legends, glossary.
- [x] Figures made self-explanatory (2026-09-13): headlines on every data panel; Fig. 3 gains a schematic panel A (models compared), paired-t brackets on B/C, grouped predictors in E; Fig. 4 gains an explainer strip A; clearer legends in Figs. 2 and 5; all five captions rewritten at the midway register; panel letters renumbered in text, SI, figure map and student guide.
- [x] SI figures S1S16 lettered (shared `letter_axes` helper in `_figlib`, called in every plot script); captions re-lettered.
- [x] SI figures brought to the main-figure standard: suptitles and codenames removed from all 16 plot scripts, panels lettered, captions rewritten in the main-figure format, appendix legends re-lettered.

View file

@ -34,7 +34,7 @@ tail metric showing the deep band stays dead while the shallow band recovers —
---
## 1. New module: `src/knowledge/analysis.py`
## 1. New module: `src/inheritance/analysis.py`
Post-hoc analysis of E2 results. Pure NumPy/pandas, seeded, deterministic.
@ -109,7 +109,7 @@ def critical_grounding(stationary_df, H_star, frac=0.95, sweep_col="g",
---
## 2. New online metric in `src/knowledge/metrics.py` (optional band panel)
## 2. New online metric in `src/inheritance/metrics.py` (optional band panel)
Compute this each generation from the current `p` and log the per-band arrays exactly
like the existing per-region metrics (e.g. columns `tail_frac_alive_band{b}` and
@ -143,7 +143,7 @@ def tail_band_metrics(p, p_star, tail_mask, n_bands=4, alive_eps=1e-9):
---
## 3. Figure updates: `figures/plot_E2.py`
## 3. Figure updates: `figures/plot_fig2_grounding_sweep.py`
- **Middle panel:** call `critical_grounding(reduce_to_stationary(df), H_star, frac=0.95)`
and draw a vertical line/marker at `g_star` with a shaded CI band; annotate
@ -164,8 +164,8 @@ def tail_band_metrics(p, p_star, tail_mask, n_bands=4, alive_eps=1e-9):
```python
import numpy as np, pandas as pd, pytest
from knowledge.analysis import reduce_to_stationary, critical_grounding
from knowledge.metrics import tail_band_metrics
from inheritance.analysis import reduce_to_stationary, critical_grounding
from inheritance.metrics import tail_band_metrics
def _H_eq(n, m, Hs): return Hs * m * (2 * n + m - 1) / (n + 2 * n * m + m * m)

View file

@ -83,7 +83,7 @@ disagreement), consensus accuracy, conformitytruth gap. E11's three panels re
+0.24 vs +0.16 in `full`. One seed, N=6: direction only. `results/llm_society`.
- [ ] GG gate: review pilot curves before the campaign
- [ ] `hpc/llm_society.pbs` array job (arm × seed) → campaign
- [ ] Figure `paper/pnas/make_figs.py` panel(s); fold into main.md (replaces the "open" cell)
- [ ] Figure `paper/manuscript/make_figs.py` panel(s); fold into main.md (replaces the "open" cell)
- [ ] 7B headline confirm (optional, post-campaign decision)
## Open design decisions (defaults chosen; GG may override)

View file

@ -154,7 +154,7 @@ re-run md2tex + tectonic at that point)
## Phase 4 — The PNAS manuscript — Weeks 34
- [x] **Restructure** → PNAS research article draft (`paper/pnas/main.md` + build.py + PDF, 2026-08-11:
- [x] **Restructure** → PNAS research article draft (`paper/manuscript/main.md` + build.py + PDF, 2026-08-11:
significance/abstract/intro/Table-1 dictionary/results ladder incl. the predictive test at
second-review calibration/discussion with design rules + ledger + limits/methods; ~5.6k words main).
*(Remaining polish at submission: pnas.cls reflow, numeric refs, bespoke unified figures.)*
@ -177,7 +177,7 @@ re-run md2tex + tectonic at that point)
- [ ] **Dual-audience devices**: Table 1 = the population-genetics ↔ machine-learning dictionary;
every term defined in one clause at first use; keep "the ML statement / the genetics statement"
paired-paragraph device, compressed.
- [x] **Figures: publication-ready** (paper/pnas/make_figs.py re-plots all 6 figures from committed
- [x] **Figures: publication-ready** (paper/manuscript/make_figs.py re-plots all 6 figures from committed
artifacts as unified, lettered, codename-free panels — no suptitles, plain-language labels;
fig1 A-B grounding+MNIST montage (title band cropped), fig2 A-B blending/Fisher-Muller,
fig3 A-D rugged+mating, fig4 A-C society, fig5 A-F speciation x3 tiers, fig6 A-D LLM tier;
@ -186,7 +186,7 @@ re-run md2tex + tectonic at that point)
montage — the one image both audiences get instantly; 3 sex: FisherMuller/outbreeding/directed +
merge-don't-average; 4 speciation across three tiers; 5 society ablation + headroom law).
Everything else → SI figures. All regenerated from committed parquet.
- [x] **SI Appendix skeleton** (`paper/pnas/si.md`: propositions, claims ledger, per-tier methods,
- [x] **SI Appendix skeleton** (`paper/manuscript/si.md`: propositions, claims ledger, per-tier methods,
statistics, figure list). Original plan: results-summary.md as the skeleton; full methods, all closed forms +
tolerances, per-experiment configs/seeds, the E13 floor proposition, confusion matrices,
reproduce.sh instructions.