BD6.4 — anchor-positive curriculum, anchor gate at 7/19 (2026-05-01)
TL;DR — first surgery pass to keep ANY pass-1 wins. BD6.3 with the same hyperparameters lost all 19 wins (0/19). BD6.4 with poison + 5× anchor-positive replication kept 7/19. The strict gate (19/19) still rejected the pack and production reverted, but the direction is validated: anchor-positive curriculum is the right shape, and the lever is anchor weight relative to poison, not hyperparameters.
Pipeline (PYTHON_QUARANTINE-compliant)
production pack: physarum05b_code_skeleton.planck (BD6 pass-1)
anchor_eval.py → 19/19 confirmed before capture
┌─ tools/surgery/build_anchor_positive.py [Python]
│ for each of 19 anchor task_ids:
│ run --chat under production pack (NO_7B_FALLBACK=1)
│ extract def, save as anchor_positive.jsonl
│ 19/19 captured
│
├─ inline merge: poison_train.jsonl (245 with refs) + anchor × 5
│ = bd6_4_mixed_train.jsonl, 340 rows
│ by source: MBPP 152, HumanEval 188
│
├─ tools/surgery/train_code_skeleton_lora.py [Python, GPU]
│ --rank 8 --alpha 16 --lr 1e-4 --epochs 1
│ trainable params 1.08 M / 495 M = 0.22 %
│ avg encoded length 326 tokens (mixed dataset is shorter avg
│ than poison-only because anchor-positive targets are simple)
│ epoch 0 avg_loss = 0.6009
│
├─ merge_code_skeleton_lora.py → physarum05b_code_skeleton_v4.planck
├─ flip PHYS05_PACK → v4, rebuild
│
├─ anchor_eval.py [GATE]
│ ▼
│ 7/19 PASS (rate 36.8 %)
│ ▼
│ threshold 85 % (= 17/19) → REGRESSION
│ ▼
├─ REVERT: PHYS05_PACK = physarum05b_code_skeleton.planck
├─ REBUILD
└─ VERIFY: anchor 19/19 ✅ production safe
PYTHON_QUARANTINE held: capsule produced two artefacts (.jsonl, .planck), zero Python in the request path, the gate caught the regression before any user-visible damage.
Numbers in context
| pass | dataset | r | lr | ep | anchor pass-rate post-merge | gate decision | |-------------|------------------------------|----|------|----|-----------------------------|--------------------| | BD6 pass-1 | poison v1 (256 rows w/ refs) | 16 | 2e-4 | 3 | 19 / 19 (defines anchor) | KEEP (production) | | BD6.2 | union v1∪v2 (260 rows) | 16 | 2e-4 | 4 | not run pre-merge | REVERT (post-bench MBPP regressed 13→6) | | BD6.3 | fresh-only (245 rows) | 8 | 1e-4 | 1 | 0 / 19 | REVERT at gate | | BD6.4 | fresh + 5× anchor-pos (340 rows) | 8 | 1e-4 | 1 | 7 / 19 | REVERT at gate (still < 17/19 strict spec) |
The 0/19 → 7/19 jump with identical hyperparameters and the same fresh-poison rows is the signal that matters. Anchor weight prevented total catastrophic forgetting.
Per-row anchor result on v4
KEPT (7): MBPP/19, MBPP/41, MBPP/51, MBPP/52, MBPP/64, MBPP/99, MBPP/105
LOST (12): MBPP/17, MBPP/20, MBPP/53, MBPP/90, MBPP/93, MBPP/96
HumanEval/23, /27, /34, /45, /53, /85
All 6 HumanEval anchors regressed; 6/13 MBPP anchors regressed. HumanEval is more sensitive — anchor-positive targets there are longer (avg ~250 chars vs ~80 for MBPP) and the model couldn't hold the longer patterns under one epoch of poison pressure.
What this proves
- Catastrophic forgetting is a continuum, not a binary. BD6.3's
0/19 was not "the surgery doesn't work" — it was "the curriculum was missing the anchor signal entirely."
- Anchor-positive curriculum scales. 5× replication → 7 wins
saved. More weight + better-balanced sampling should save more.
- The gate is the right tool. It cleanly rejected v4 even though
v4 was a real improvement over v3 — because production-safety is a strict invariant, not a relative one.
What's needed for BD6.5
Two leverage points, both inside the surgery capsule:
Lever A — increase anchor weight further
5× → ~28 % anchor share didn't hold. Try 10× or 15× so anchor matches or exceeds poison count. With 245 poison + 19×15 = 285 anchor, the model should sit closer to "produce these familiar outputs" than "learn the hard tail."
Cost: epoch is 2× longer in wall time. Acceptable.
Lever B — per-bench balanced minibatches
Currently each batch is whatever the random-permute draws. With 245 poison and 95 anchor (5×), most batches see only poison. Use a stratified sampler that guarantees each minibatch contains at least one anchor row — gradient step always has the "don't drift" signal.
This is a 10-line change in train_code_skeleton_lora.py (replace torch.randperm(len(enc)) with stratified shuffle).
Lever C (optional) — KL-anchored loss
Add KLDivLoss(student_logits, ref_logits) on the 19 anchor prompts only, against the frozen pass-1 base. Forces the LoRA to match base output exactly on anchors regardless of how the poison gradient pulls. ~30 lines extra; canonical PEFT pattern.
A and B are cheap. C is the principled fix. BD6.5 should be A+B before C.
Production state (after BD6.4 revert)
PHYS05_PACK = physarum05b_code_skeleton.planck(BD6 pass-1, unchanged).- MBPP B = 13/100, HumanEval B = 6/164, LCB B = 0/50, anchor 19/19.
physarum05b_code_skeleton_v4.planckarchived (kept for surgery history).tools/surgery/output/code_skeleton_lora_v4/archived.data/organ_surgery/phys05_code_skeleton/anchor_positive.jsonl(19 rows) — reusable for BD6.5.data/organ_surgery/phys05_code_skeleton/bd6_4_mixed_train.jsonl(340 rows) — kept for analysis.
Files this pass touched
tools/surgery/build_anchor_positive.py— new, captures pass-1's actual code outputs as positive targetsdata/organ_surgery/phys05_code_skeleton/anchor_positive.jsonl— 19 captured rowsdata/organ_surgery/phys05_code_skeleton/bd6_4_mixed_train.jsonl— 340-row mixed train settools/surgery/output/code_skeleton_lora_v4/— PEFT adapter (rejected at gate)tools/surgery/output/Physarum05B-CodeSkeleton-v4/— merged HF dir (rejected)physarum05b_code_skeleton_v4.planck— repacked (rejected, archived)src/organs/organ_manager.cpp::PHYS05_PACK— flipped to v4 then back to v1reports/BD6_4_ANCHOR_POSITIVE_PARTIAL.md— this file
The runtime is on the production pack. The gate did its job. Direction is validated; BD6.5 has clear levers (A: more anchor replication, B: stratified batches, C: KL anchor) without needing to invent a new recipe from scratch.