diff --git a/docs/cookbook-index.md b/docs/cookbook-index.md
index 23b12374c0..6f3c193781 100644
--- a/docs/cookbook-index.md
+++ b/docs/cookbook-index.md
@@ -2,7 +2,7 @@
> **Generated by `tools/cookbook_index.py` — do not hand-edit** (R33). Regenerate after adding a cookbook section.
>
-> `docs/matching-cookbook.md` is ~716 KB / 1056 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses.
+> `docs/matching-cookbook.md` is ~716 KB / 1057 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses.
**How to use:** name what you SEE in the diff (a stolen delay slot, an extra `la`, a swapped register pair, a `conflicting types` error), find that symptom below, read those sections first. If nothing fits, THEN grind — and add a section when you win.
@@ -1318,7 +1318,7 @@
- **§384** — ★★★ — A CARVE-CONFIG BANK IS RED UNTIL YOU RE-EXTRACT, AND THAT LOOKS EXACTLY LIKE A FALSE BANK (P31 S69; measured twice, cost one destroyed match) L32259
- **§378b** — ★★★ — THE FOUR VARIANTS OF THE DECL BLOCKER, AND THE TWO PLACES §378 DOES **NOT** APPLY (P31 S69, all four measured the same day) L32572
-### (unbucketed — title matched no symptom vocabulary) (311)
+### (unbucketed — title matched no symptom vocabulary) (312)
- **§3-How** — to use this L30
- **§1** — Idiom catalog (asm pattern → C that produces it) L39
@@ -1631,6 +1631,7 @@
- **§390** — ★★★ — MINIMUM DISTANCE IS NOT MINIMUM WORK; RANK TWIN CANDIDATES BY EFFORT, AND FILTER LOOKALIKES BY RATIO (P31 S69; byte-proven ov_SC01_077/func_80184D50, banked) L32450
- **§394** — ★★ — TWO ALIGN-1 ACCESSES IN ONE FUNCTION RESERVE A PHANTOM STACK SLOT (P31 S69; ov_SC02_005/func_80180610) L32560
- **§314b** — ★★ — TWO ABS-RANGE GUARDS IN ONE FUNCTION NEED **DIFFERENT SPELLINGS** (P31 S69; byte-proven ov_SC04_002/func_8018691C, 111 ins) L32645
+- **§397** — ★★★ — RE-RUN THE TWIN SCAN AFTER EVERY EXEMPLAR BANK; A CLUSTER SIBLING IS FREE THE MOMENT ITS EXEMPLAR LANDS (P31 S69; ~250k tokens spent proving it the expensive way) L32785
## All sections, in order
@@ -2691,6 +2692,7 @@
- **§332b** — ★★★ — THE §332 "WALLS" ARE A PER-OBJECT ASSEMBLER MODE, NOT A C LIMIT — 6 CLOSE AS REAL C (P31 S69, Fable-3) L32702
- **§378c** — ★★ — THE FIFTH DECL-BLOCKER VARIANT: THE DRAFT REDECLARES WHAT THE TU ALREADY OWNS (P31 S69) L32722
- **§396** — ★★★ — SIX LEVERS FROM THE S69 SINGLETON ROUND, INCLUDING ONE THAT ONLY A `COND_EXPR` REACHES (P31 S69) L32737
+- **§397** — ★★★ — RE-RUN THE TWIN SCAN AFTER EVERY EXEMPLAR BANK; A CLUSTER SIBLING IS FREE THE MOMENT ITS EXEMPLAR LANDS (P31 S69; ~250k tokens spent proving it the expensive way) L32785
---
@@ -3759,3 +3761,4 @@ Notes routinely quote that as a section id. This table resolves it. Grep bait: `
| L32702 | §332b | ★★★ — THE §332 "WALLS" ARE A PER-OBJECT ASSEMBLER MODE, NOT A C LIMIT — 6 CLOSE AS REAL C |
| L32722 | §378c | ★★ — THE FIFTH DECL-BLOCKER VARIANT: THE DRAFT REDECLARES WHAT THE TU ALREADY OWNS (P31 S6 |
| L32737 | §396 | ★★★ — SIX LEVERS FROM THE S69 SINGLETON ROUND, INCLUDING ONE THAT ONLY A `COND_EXPR` REACH |
+| L32785 | §397 | ★★★ — RE-RUN THE TWIN SCAN AFTER EVERY EXEMPLAR BANK; A CLUSTER SIBLING IS FREE THE MOMENT |
diff --git a/docs/matching-cookbook.md b/docs/matching-cookbook.md
index 5ddfffc3f3..c83fa5d85f 100644
--- a/docs/matching-cookbook.md
+++ b/docs/matching-cookbook.md
@@ -32781,3 +32781,36 @@ prescan trap — paraphrase the comment.
parameters PROMOTE to the TU's prototype — no decl edit, no cast, and the gate's "conflicting types"
disappears.
(byte-proven `ov_SC05_018/func_80182CDC`)
+
+## §397 ★★★ — RE-RUN THE TWIN SCAN AFTER EVERY EXEMPLAR BANK; A CLUSTER SIBLING IS FREE THE MOMENT ITS EXEMPLAR LANDS (P31 S69; ~250k tokens spent proving it the expensive way)
+
+**The mistake, measured.** A reach-6 cluster (`ov_SC06_018/020/022/024/032/033`) showed as
+**open-open** in the family map: six members, none banked, so `seed_ref` reported **"no banked twin"**
+for every one of them. I cracked the exemplar `ov_SC06_018/func_80189E60` (203k tokens, five new
+levers → §395), then **drafted four siblings at ~60k each**.
+
+They did not need drafting. The moment the exemplar banked, `seed_ref` returned it as a **banked twin
+for all of them** — and the agents' own diffs said why: *"label-stripped `.s` diff vs the twin is
+EMPTY"*, *"an EXACT clone (asm diff = labels only, same relocation symbols)"*. `family_remap` +
+the §378 chain banks those for **~0 tokens**. The waste included `ov_SC06_020/func_80183FD0`, which
+burned **257k tokens plateauing at permuter-class NEAR 4** and then remapped cleanly from the twin
+that had banked in the meantime.
+
+**The law: a bank CHANGES THE TWIN GRAPH, and every open-open cluster is one bank away from being a
+remap job.** The twin oracle answers "is there a BANKED body like this?" — so its answer for every
+sibling is stale the instant the exemplar lands.
+
+**The procedure, in order:**
+
+1. Crack ONE exemplar per cluster (never two — see below).
+2. Gate it. **Bank it.**
+3. **RE-RUN `seed_ref` (and `--near`) for every remaining member of that cluster.**
+4. Remap what now has a twin (`family_remap` → §378 chain → gate). Draft only what does not.
+
+**And never draft two members of the same cluster in parallel.** I drew `func_80189E60` and
+`func_80183FD0` — same cluster — in the same round: if either cracks the other is free, so the second
+agent is pure waste, and it was.
+
+This is the `crack-wave-sweep-map-regen` rule ("regen the map after banking") applied one level down:
+the FAMILY map is not the only stale artifact — **the twin oracle is stale too, and it is the one the
+cards read.**
diff --git a/docs/wave-playbook.md b/docs/wave-playbook.md
index c0784bb79d..b4aab01e12 100644
--- a/docs/wave-playbook.md
+++ b/docs/wave-playbook.md
@@ -135,6 +135,23 @@ is worse than no twin, because the agent believes it.
(§390). The scanner well is dry; the integration levers (§376/§378) out-earned it by an order of
magnitude in the same session.
+### 2a-3. AFTER EVERY EXEMPLAR BANK, RE-RUN THE TWIN SCAN BEFORE DRAFTING ITS SIBLINGS (S69)
+
+An open-open cluster reports "no banked twin" for ALL members — correctly, because none is banked.
+**Bank one and every sibling may become a remap job.** Measured S69: a reach-6 cluster's exemplar
+cost 203k tokens to crack, then four siblings were drafted at ~60k each when `seed_ref` would have
+returned the freshly-banked exemplar as their twin and `family_remap` would have banked them for ~0
+(the agents' own diffs read "label-stripped .s diff is EMPTY" and "an EXACT clone"). One of them had
+already burned 257k plateauing at permuter-class NEAR before the remap closed it.
+
+```
+crack ONE exemplar -> gate -> BANK -> re-run seed_ref/--near for the rest of the cluster
+ -> remap what now has a twin; draft only what does not
+```
+
+**And never draft two members of the same cluster in parallel** — if either cracks, the other is
+free, so the second agent is pure waste (§397).
+
### 2b. RUN `neighbor_ref` FOR EVERY CARD — the biggest measured cost lever in the wave
```