docs(transgenerational): M6.13 campaign close-out — STOP verdict + GC fix + logbook 020 + archive - #169
Conversation
- add-tei-prior-on-m3/tasks.md: drop the previously-planned § 6.10 (archive) and § 6.11 (push) tasks. Both would self-block the archive precondition (`openspec-archive-change` requires every task ticked) and the push step is user-sign-off gated per `feedback_ask_before_push_and_pr.md`. Inlined a short note clarifying that both operator-side steps happen after § 6.9 is ticked. - phase5-tracking/tasks.md M6.12: tick with a verdict-bearing description. M6.12 (`transgenerational+weights`) was NOT TRIGGERED per the PR-A null-floor pre-registered criterion and is now superseded by M6.13 (the wet-lab-aligned reframe of the same composed-inheritance mechanism). Matches the M4.6.5 / M5.9 / M6.8 precedent where ticks mean "decision recorded and propagated", not "experiment ran". Unblocks the eventual M8.7 phase5-tracking archive without leaving a stale [ ] M6.12 row behind. - Forward-pointer note on M6.12 → M6.13 added so a reader of the M6 thread doesn't read the NOT TRIGGERED row as the question being dropped — it was reframed, not abandoned. `openspec validate add-tei-prior-on-m3 --strict` clean. `openspec validate phase5-tracking --strict` clean. Docs-only — SKIP=tests on pre-commit since no Python changed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Calibration smoke pass 1 (2026-05-20T11:56:58Z, single seed=42 × pop 6 × 2 gens × weights_only arm only, ~10m 28s wall) measured: - F0 mean survival_rate = 0.407 (pop 6: 0.04 / 0.44 / 0.72 / 0.24 / 0.52 / 0.48) - F1 mean survival_rate = 0.600 (pop 6: 0.44 / 0.48 / 0.64 / 0.80 / 0.56 / 0.68) - Lamarckian lift F0 → F1 = +19.3pp in one generation at K=1000 Tripwire verdict (the two the smoke can measure on weights_only): - T1' F0 envelope: 0.30 ≤ 0.407 ≤ 0.70 → PASS - T3' high-end: F1=0.600 > 0.95×F0=0.387 → PASS (no saturation) - T3' low-end: F1=0.600 ≥ 0.80×F0=0.326 → PASS (above floor) T3' beats-control leg (F1 ≥ 1.2×control_F1) is structurally deferred to pilot time per design.md § D5 — the smoke runs weights_only only. YAML changes: - tei_weights.yml: lawn_schedule F1+ entry annotation 'K_test placeholder' → 'K_test (calibration-locked 2026-05-20)'; header note + transgenerational block comment cite the smoke session ID and the observed F0/F1 numbers. - weights_only.yml + control.yml: header + inline learn_episodes_per_eval comment note that K=1000 was calibration-locked on 2026-05-20. The numeric K=1000 is unchanged across all three arms — this is a comment-only commit that converts "placeholder" to "locked-in" so future readers see why K=1000 is the campaign value. Launcher parity check still passes (tei_weights F1+ K=[1000] == weights_only learn=1000 == control learn=1000). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…composed mode
The M6.13 pilot (1 seed × pop 8 × 4 gens × tei_weights arm) crashed
at F2 dispatch on 2026-05-20 with FileNotFoundError on the F0
substrate path. F0 + F1 had completed cleanly; the gen-000/ directory
was empty when F2 children tried to load F0's substrate for the
decay-cascade application.
Root cause at loop.py:_gc_inheritance_dir (pre-existing on main from
M3's initial Lamarckian GC implementation):
for path in gen_dir.glob("genome-*.pt"):
gid = path.stem.removeprefix("genome-")
if gid not in keep:
path.unlink(missing_ok=True)
Path.glob("genome-*.pt") matches BOTH weight checkpoints (genome-X.pt)
AND substrate files (genome-X.tei.pt). Path.stem strips only ONE
suffix, so for a genome-X.tei.pt file the extracted gid is X.tei
(not X), never matches keep_ids, and the substrate gets deleted.
Why this only surfaced now:
- M3 (lamarckian): only .pt files in the GC'd directory; .tei never
appears.
- M6.9+ (transgenerational): _inheritance_active() returns False, so
this main-loop GC doesn't fire. Substrate cleanup is owned by the
inline GC inside _run_f0_substrate_extraction which knows about
.tei.pt.
- M6.13 (weights+transgenerational, composed): both file types coexist
AND the main-loop GC fires. Bug surfaces immediately at end of F0
on the very first cleanup pass.
The cascade case (F2/F3 children inheriting F0's substrate with
decay_factor^2/decay_factor^3) makes the impact load-bearing: the
substrate must survive every main-loop GC pass for the whole campaign,
not just the F0→F1 transition.
Fix: skip .tei.pt entries in the main-loop GC entirely. Substrate
file lifecycle is owned by the F0 substrate-extraction pipeline (the
inline GC at _run_f0_substrate_extraction is already correctly
skipped under composed mode via _combined_inheritance_active()); the
main-loop GC now matches that contract.
Regression test: test_main_loop_gc_preserves_substrate_tei_pt seeds
a gen-000/ with two .pt files + one .tei.pt, calls
_gc_inheritance_dir(generation=0, keep_ids=['elite']), and asserts
the elite .pt survives, the non-elite .pt is GC'd, and the
substrate .tei.pt survives unconditionally.
Verification:
- 469 evolution tests pass (no regressions on M3 / Baldwin / M6.9+
pure-TEI / M6.13 composed paths).
- 11 m613-smoke tests pass including the new GC regression.
- ruff + pyright clean.
Pilot will be re-dispatched after this commit lands.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…erdict
M6.13 campaign-execution closes. Four pilots at K ∈ {1000, 500, 200,
200-F0-matched} all rule against the substrate-accelerates-Lamarckian-
retraining hypothesis. Under fair-F0 comparison, cross-arm
`tei_weights − weights_only` F1-F3 delta is +0.00pp at K=1000
(substrate inert) and −9.33pp at K=200 (substrate INTERFERES). The
K-sensitivity sweep apparent dose-response (Δ 0.00→4.00→5.33pp as K
decreased) was the F0 confound — tei_weights F0 held at K=2000 across
the sweep while weights_only/control F0 matched the swept K.
Disambiguation pilot inverted the sign under fair F0.
Logbook 020: docs/experiments/logbooks/020-tei-prior-on-lamarckian.md
(renamed from 020-tei-prior-on-m3.md to match the other logbooks'
no-milestone-label naming convention — 013/018/019 don't carry M3/M6
prefixes either). Documents the four pilots' retention tables, the
methodological audit of the broken post-hoc per-gen-eval script, the
mechanism diagnosis (action-distribution-bias substrate vs sensory-
excitability shift mismatch), the adversarial-critique findings, and
a substantive future-directions section for the three substrate-
redesign ideas (B/C/D) flagged for a possible Phase 6 quantum re-
evaluation arc. M6.14 frequency-prior ablation NOT triggered per
pre-registered criterion.
Artefacts stashed under artifacts/logbooks/020-tei-prior-on-lamarckian/
following the logbook 019 convention — only the aggregator outputs
per pilot (pilot_pivot_decision.md / retention_table.csv /
summary.md / decision_gate.csv / cross_arm_verdict.csv) plus a smoke
summary. 21 files, 84 KB total, no .pt weights or full diagnostics.
No absolute home paths; LFS rules cover the CSVs at no overhead.
phase5-tracking M6.13 row ticked [x] with the STOP verdict +
mechanism diagnosis + M6 thread-close framing. docs/roadmap.md gains
a new M6.13 row between M6.9+ and M7.
add-tei-prior-on-m3/tasks.md execution tasks 6.1-6.9 all ticked off
with verdict-bearing descriptions matching the M4.6.5 / M5.9 / M6.8
"checkbox = decision recorded and propagated" precedent. OpenSpec
change validates clean (`openspec validate add-tei-prior-on-m3
--strict`); phase5-tracking validates clean.
Docs-only commit; pre-commit hooks clean (SKIP=tests since no Python
changed).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The OpenSpec change drafted § D3 documenting only the inline-GC suppression at _run_f0_substrate_extraction (loop.py:~863-866). That covered the gen-0 substrate-extraction tail path, but missed the SECOND GC site — the main-loop GC at loop.py:~1649 that runs end-of-each-gen via _gc_inheritance_dir. Under composed mode, F0's gen-000/ holds both the elite's weights .pt AND its substrate .tei.pt. The main-loop GC globbed "genome-*.pt", which matched both files; Path.stem strips only one suffix so the extracted gid for genome-<elite>.tei.pt was "genome-<elite>.tei" (with the trailing .tei still attached), which never matches the elite-id keep-set, and the substrate got deleted. This was a pre-existing bug from M3's initial GC implementation but only surfaced under composed mode because M3-only never produces .tei.pt files and pure-TEI's main-loop GC doesn't fire (because _inheritance_active() is False under kind=transgenerational). The bug was caught + fixed during campaign execution at commit b78cdbb (logbook 020 § audit; tasks.md § 6.4 acknowledgment) with the test_main_loop_gc_preserves_substrate_tei_pt regression test. This commit adds the missing § D3.5 paragraph to design.md so the spec accurately reflects the as-shipped contract. `openspec validate add-tei-prior-on-m3 --strict` clean. Docs-only commit; SKIP=tests since no Python changed. Other drift-audit findings (verdict claims, test counts, K_test contract, M6.14 trigger conditions, per-gen-eval bridge) all OK as-is — the forward-looking spec correctly pre-declared both GO and STOP outcomes and the framework shipped as-spec'd. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Archived to openspec/changes/archive/2026-05-21-add-tei-prior-on-m3/ via `git mv` so history is preserved. All 47 tasks ticked; all 4 artefacts (proposal / design / specs / tasks) complete per `openspec status --json`. Spec sync intentionally SKIPPED per the M6.9+ STOP-archive precedent (`2026-05-19-add-transgenerational-memory-redesign` also archived without main-spec promotion). The delta specs describe an action-logit-bias substrate contract that M6.13's four pilots decisively falsified; promoting them to main `evolution-framework/` and `configuration-system/` specs would commit the repo to a known-null architectural choice. Logbook 020 + this archived change directory remain the canonical reference for the framework scenarios + the STOP verdict + the future-work substrate-redesign directions (Ideas B/C/D for a possible Phase 6 quantum re-evaluation arc). After this commit, the only active OpenSpec change is `phase5-tracking` (the long-running Phase 5 milestone tracker; will archive at M8.7 alongside the M8 synthesis change). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… stale archive refs Independent pre-push review of the M6.13 close-out branch surfaced three issues worth fixing before remote-state mutation: F1 (should-fix, latent footgun): coevolution.py:2186-2189 has the same Path.stem suffix-stripping anti-pattern that b78cdbb fixed in EvolutionLoop._gc_inheritance_dir. Coevolution currently never writes .tei.pt files (no per-side substrate machinery), but a future composed-coevolution arc would silently re-introduce the bug. Added the same .name.endswith(".tei.pt") guard preemptively with a comment cross-referencing the loop.py fix. F2 (should-fix, project-convention violation): the new GC regression test in test_loop_m613_smoke.py:486-487 introduced fresh "M3 / pure-TEI" milestone labels in the docstring. Commit 2371d45 on the parent branch had just scrubbed exactly these refs from the same file. Replaced with behavioural names "lamarckian-only / pure-transgenerational" per `feedback_no_milestone_refs_in_code`. F3 (note, post-archive cleanup): three docstring/comment refs to `openspec/changes/add-tei-prior-on-m3/` (no archive/ prefix) predated this branch but pointed to a nonexistent path after the archive commit (99600f5) moved the directory to `openspec/changes/archive/2026-05-21-add-tei-prior-on-m3/`. Updated the refs in `evolution/lamarckian_transgenerational_inheritance.py`, `evolution/inheritance.py`, and the `test_aggregate_m613_pilot.py` module docstring to point at the archive location. Verification: - 469 evolution tests pass (no regressions from coevolution.py defensive guard). - 71 touched tests pass under default marker selection. - ruff + ruff-format + pyright clean on all 5 touched files. - No remaining non-archive `openspec/changes/add-tei-prior-on-m3/` refs in the tree. - No M3/PR-A/PR-B milestone labels in test_loop_m613_smoke.py or coevolution.py's new lines (pre-existing M3 mentions at coevolution.py:162 + 2720 predate this branch). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
✅ Files skipped from review due to trivial changes (1)
📝 WalkthroughWalkthroughThis PR closes the M6.13 experiment (TEI-as-prior-on-Lamarckian reframe) with a STOP outcome, delivering a GC substrate-preservation fix, four pilot runs with decision records, configuration documentation updates, and a comprehensive logbook with mechanistic diagnosis of the null result. ChangesM6.13 Experiment Delivery and GC Fix
🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly Related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@artifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/pilot_pivot_decision.md`:
- Around line 5-13: The decision text ("Pilot signal: clean GO at K_test" and
"Pivot: NONE") conflicts with the observed metrics (`tei_weights` per-arm
verdict: STOP, per-arm gate pass: False, Wilcoxon p-threshold met: False,
cross-arm mean delta +5.33pp); update the narrative to match the metrics by
changing the pilot outcome and pivot statement to reflect a STOP/REJECT decision
(or alternately adjust the metrics to show GO/Pass if that was intended), and
ensure the artifact uses the same identifiers (`tei_weights`, `weights_only`,
"Per-arm verdict", "Per-arm gate pass", "Wilcoxon p-threshold met", and "Pivot")
so the reported decision and listed metrics are consistent.
In
`@artifacts/logbooks/020-tei-prior-on-lamarckian/smoke/calibration_smoke_K1000.md`:
- Line 7: The T3' Lamarckian-headroom line is inconsistent: with F1=0.600 and
thresholds 0.387/0.326 the condition "F1 ≤ 0.95×F0 AND F1 ≥ 0.80×F0" cannot be
true, so update the record for T3' Lamarckian-headroom to be self-consistent by
either flipping the PASS to FAIL or adjusting the inequality to match the
intended check; specifically, for the existing numeric values (F1=0.600;
thresholds 0.387/0.326) change the "PASS" to "FAIL" for T3' or rewrite the
condition so that it correctly reflects that F1 is greater than both thresholds.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: c72a6e42-a908-4dc9-b2f4-a652f892c24d
⛔ Files ignored due to path filters (12)
artifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k1000/cross_arm_verdict.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k1000/decision_gate.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k1000/retention_table.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/cross_arm_verdict.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/decision_gate.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/retention_table.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200_f0matched/cross_arm_verdict.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200_f0matched/decision_gate.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200_f0matched/retention_table.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k500/cross_arm_verdict.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k500/decision_gate.csvis excluded by!**/*.csvartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k500/retention_table.csvis excluded by!**/*.csv
📒 Files selected for processing (27)
artifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k1000/pilot_pivot_decision.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k1000/summary.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/pilot_pivot_decision.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/summary.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200_f0matched/pilot_pivot_decision.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200_f0matched/summary.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k500/pilot_pivot_decision.mdartifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k500/summary.mdartifacts/logbooks/020-tei-prior-on-lamarckian/smoke/calibration_smoke_K1000.mdconfigs/evolution/tei_prior_m613_control.ymlconfigs/evolution/tei_prior_m613_tei_weights.ymlconfigs/evolution/tei_prior_m613_weights_only.ymldocs/experiments/logbooks/020-tei-prior-on-lamarckian.mddocs/roadmap.mdopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/.openspec.yamlopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/design.mdopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/proposal.mdopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/specs/configuration-system/spec.mdopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/specs/evolution-framework/spec.mdopenspec/changes/archive/2026-05-21-add-tei-prior-on-m3/tasks.mdopenspec/changes/phase5-tracking/tasks.mdpackages/quantum-nematode/quantumnematode/evolution/coevolution.pypackages/quantum-nematode/quantumnematode/evolution/inheritance.pypackages/quantum-nematode/quantumnematode/evolution/lamarckian_transgenerational_inheritance.pypackages/quantum-nematode/quantumnematode/evolution/loop.pypackages/quantum-nematode/tests/quantumnematode_tests/campaigns/test_aggregate_m613_pilot.pypackages/quantum-nematode/tests/quantumnematode_tests/evolution/test_loop_m613_smoke.py
| **Pilot signal: clean GO at K_test (D6 row 2).** `tei_weights > weights_only` by ≥ 5pp — substrate prior accelerates Lamarckian retraining at K_test. The substrate-accelerates-retraining hypothesis is supported. | ||
| Pivot: NONE. Proceed to full campaign at K_test only (no K sweep — the test-point selection was made at calibration time). | ||
|
|
||
| Observed metrics: | ||
|
|
||
| - `tei_weights` per-arm verdict: **STOP** | ||
| - Cross-arm mean delta (tei_weights - weights_only): +5.33pp | ||
| - Per-arm gate pass (tei_weights): False | ||
| - Wilcoxon p-threshold met: False |
There was a problem hiding this comment.
Align the pivot narrative with the listed observed metrics.
The "clean GO / Pivot: NONE" statement conflicts with the recorded metrics (STOP, gate False, Wilcoxon False).
Please update the decision text (or the metrics) so this artifact reports a single consistent outcome.
🧰 Tools
🪛 LanguageTool
[grammar] ~5-~5: Ensure spelling is correct
Context: ...2).** tei_weights > weights_only by ≥ 5pp — substrate prior accelerates Lamarckian retraining...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@artifacts/logbooks/020-tei-prior-on-lamarckian/pilot_k200/pilot_pivot_decision.md`
around lines 5 - 13, The decision text ("Pilot signal: clean GO at K_test" and
"Pivot: NONE") conflicts with the observed metrics (`tei_weights` per-arm
verdict: STOP, per-arm gate pass: False, Wilcoxon p-threshold met: False,
cross-arm mean delta +5.33pp); update the narrative to match the metrics by
changing the pilot outcome and pivot statement to reflect a STOP/REJECT decision
(or alternately adjust the metrics to show GO/Pass if that was intended), and
ensure the artifact uses the same identifiers (`tei_weights`, `weights_only`,
"Per-arm verdict", "Per-arm gate pass", "Wilcoxon p-threshold met", and "Pivot")
so the reported decision and listed metrics are consistent.
Two findings from PR #169 inline review: (1) [FIX] smoke/calibration_smoke_K1000.md T3' line was internally inconsistent: it claimed "F1 ≤ 0.95×F0 AND F1 ≥ 0.80×F0: PASS" but with F1=0.600 and 0.95×F0=0.387, the first conjunct is False and the conjunction cannot be True. The PASS verdict itself is correct (Lamarckian grew F1 from 0.407 to 0.600, well past F0+0.05=0.457 — design.md § D5's "clear headroom" PASS clause). The wrong text was a tripwire-table-style summary glommed onto a procedural-rule outcome. Rewrote the line to cite the actual procedural PASS trigger (F1 > F0 + 0.05) and note both bands were cleared in the upward direction. (2) [DECLINE] pilot_k200/pilot_pivot_decision.md narrative ("clean GO ... proceed to full campaign") superficially conflicts with its own observed-metrics list (per-arm verdict STOP, gate False, Wilcoxon False). The file is a verbatim capture of aggregate_m613_pilot.py output, not hand-written narrative — editing it would falsify the forensic record showing how the F0-confound was discovered (K-sweep apparent GO → disambiguation flipped sign). The two-channel structure (pivot-row classification vs full GO-gate metric list) is a deliberate aggregator feature so operators see exactly which signal a pivot decision is keyed to. Mitigation for (2): added a README at the artefacts stash root explaining the two-channel reporting structure, why these files are forensic captures rather than narrative documents, and why the F0-confound disambiguation pilot supersedes the K-sweep pivot-row classifications for M6.13's actual verdict. Future readers see the reconciliation guidance immediately on entering the artefact dir. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
Summary
Closes the M6.13 (TEI-as-prior-on-Lamarckian) milestone with a decisive STOP verdict. Combined with the M6.9+ STOP on pure-TEI K=0, the M6 transgenerational-memory thread closes coherently — TEI doesn't transfer in either form on this LSTMPPO substrate. Logbook 020 captures the verdict + future-directions for a possible Phase 6 quantum re-evaluation arc.
tei_weights − weights_onlyF1-F3 delta is +0.00pp at K=1000 (substrate inert) and −9.33pp at K=200 (substrate INTERFERES) under fair-F0 comparison. The K-sweep apparent dose-response (+0.00 → +4.00 → +5.33pp) was the F0 confound — disambiguation inverted the sign. Mechanism diagnosis: action-distribution-bias substrate is the wrong abstraction for the wet-lab single-circuit excitability shift.loop.py:_gc_inheritance_dirwas deleting F0 substrate.tei.ptfiles becausePath.glob("genome-*.pt")matched substrate files too, andPath.stemstrips only one suffix so the extracted gid ended in.tei. Pre-existing bug from M3's initial Lamarckian GC implementation; only surfaced under composed mode. Fix + regression test inb78cdbb5. Preemptive sibling guard added tocoevolution.py:_gc_inheritance_diragainst future composed-coevolution arcs.artifacts/logbooks/020-tei-prior-on-lamarckian/.phase5-trackingM6.13 row ticked with STOP verdict;docs/roadmap.mdgains a new M6.13 row.add-tei-prior-on-m3moved toarchive/2026-05-21-add-tei-prior-on-m3/viagit mv(history preserved). Spec sync intentionally skipped per the M6.9+ STOP-archive precedent — the delta specs describe an architectural contract M6.13 falsified; promoting them would commit the repo to a known-null choice.Commits
e7223c1521919c8bb78cdbb504ede5582c4744d699600f5531378d51Test plan
not smoke and not nightlymarker selectionphase5-trackingvalidates ✓openspec/changes/add-tei-prior-on-m3/(non-archive) refs remain in production code or tests/tmp/build_pilot_per_gen_from_eval_diag.pyintentionally NOT committed (logbook 020 explains)Next milestone
Per discussion: skip both the proposed M6.14 substrate-extraction diagnostic AND the M7 NEAT optional milestone. Go directly to M8 (Phase 5 synthesis logbook) as the next milestone — synthesise M2/M3 GO + M4/M5/M6 STOPs with substrate-grounded diagnoses, cross-cite 2024-2026 literature (Resendez Prado, Mougi, Chen, Kaletsky, mammalian-TEI), and recommend Phase 6 priorities. M7 NEAT remains OPTIONAL in the tracker (architecture-symmetry hypothesis deferred to Phase 6 quantum re-evaluation by other means).
🤖 Generated with Claude Code
Summary by CodeRabbit
Bug Fixes
Documentation
Tests