memory: snapshot — McCarthy and Krakauer D1 built, Krakauer's quotation scope is an open operator call

This commit is contained in:
2026-09-17 08:26:52 -07:00
parent 4be063071a
commit a5ddfed81e
2 changed files with 156 additions and 1 deletions
@@ -0,0 +1,120 @@
# `[2026-09-17]` McCarthy and Krakauer D1 — both corpora built, and one of them should not be trained yet
Operator picked **both** after the library survey. McCarthy first, because the splitter work
is shared and he is the cleaner author.
| corpus | units | words | where | guards |
|---|---|---|---|---|
| **lv-mccarthy** | 167 | **584,756** | `~/mccarthy-corpus` | style ✅ name ✅ |
| **lv-krakauer** | 126 | **422,880** | `~/krakauer-corpus` | name ✅ (2 allowed) · quotation ⚠ UNRESOLVED |
Commits `705fa3a` (splitter) `f3bf3ca` (McCarthy) `4be0630` (Krakauer).
## The shared blocker: a splitter that chooses by SIZE
`scripts/r49-corpus/split_units.py`. The inherited rule was "most units above a floor", and
it is wrong for any book whose markers are PARTS:
```
Cities of the Plain 4 roman marks -> 4 units, median 22,312w
The Crossing 4 roman marks -> 4 units, median 37,310w
```
"Most units" scores 4 over the 1 that finding-nothing gives, so it wins, and the existing
guard only fires at exactly one unit. Now: a mode qualifies only if its median unit is inside
**[600, 12000]** AND no single unit holds half the work; among qualifying modes **priority**
breaks the tie (contents > chapter-word > roman > bare-numeral > caps-title). Works with no
divisions fall back to **paragraph-block sections** at ~3,000 words, cut on block boundaries.
⭐⭐ **BOTH RULES EXIST BECAUSE A CONTROL RUN CAUGHT THEM, and the first version was worse
than what it replaced.** Scoring eligible modes by "median closest to target" chose
`caps-title` over the real chapters of Hemingway's *True at First Light*:
```
bare-numeral 20 units median 5,337w max 11,155 <- the book's own chapters
caps-title 6 units median 777w max 113,886 <- median looked BETTER
```
Five stray all-caps lines gave five tiny units beside **one holding 97% of the book**. A
median cannot see that distribution; a max bound can. Controls now green both ways: 8/10
Hemingway works reproduce the shipped mode and unit count exactly (the two differences are
`contents`, which the harness does not supply, and The Old Man and the Sea, deliberately kept
whole), and 40,000 words with no blank lines returns **1 unit** rather than fabricating
sections.
⚠ The Hemingway builder is deliberately NOT repointed at this module. Its corpus is shipped
and its sha is pinned by a live adapter.
## lv-mccarthy — the job was protecting a style that reads as damage
```
quote marks 0.0 per 10k (Hemingway 838)
apostrophes 123 per 10k (Hemingway 241) `dont` `aint` `wont` `didnt`
semicolons 0 per 10k
```
⚠⚠ **`repair_typography.py` MUST NOT be run on this corpus.** It normalises "toward what the
text does" and would put the quotation marks back, deleting the single most identifiable
thing about the author before training starts. The builder runs no normalisation and then
**asserts** the quote density, so a future well-meaning change fails the build.
**AND IT MAKES THE VOICE GATE EASY TO PASS FOR THE WRONG REASON.** `voice_distance.py` is
Burrows's Delta over CHARACTER BIGRAMS. An adapter that learns only "emit no quotation marks"
moves delta_cb a long way without having learned a sentence. **Pre-register a
punctuation-normalised secondary read before gating lv-mccarthy**, the same way the pairwise
floor rule was pre-registered for Hemingway.
Other measured work: two truncated catalogue rows dropped for complete mobi siblings; all 15
cross-work containment pairs measured (worst **0.10%**, no subsumption); back matter in 4 of
6 works, different marker each time, carrying the author's own name 26 times → **0**; one
lost drop cap (`HE CANDLEFLAME`) patched by name with an assertion rather than a heuristic;
alphabet re-derived at 1,411 non-ASCII letters across 14 forms (the Border Trilogy is half
set in Mexico).
**The back-matter strip runs BEFORE the split for McCarthy**, inverting the Hemingway
order. Blood Meridian and The Crossing end with a dumped table of contents made of bare roman
numerals on their own lines — the exact shape of a chapter marker. Only the 150-word floor
saves the current build by accident.
## lv-krakauer — builds clean, and the open question is not technical
**THREE DEFECTS THE NAME GUARD CAUGHT**, none of which the build would otherwise report:
1. **Back matter searched only the LAST unit.** Where Men Win Glory's ACKNOWLEDGMENTS sits at
94.8% and the splitter made 41 units, so the apparatus landed in unit **37**, with NOTES
and BIBLIOGRAPHY after it — all past a strip that only looked at unit 41. Into the Wild
kept its acknowledgments *and* a full-page advertisement for another of his books.
2. **Relying on the splitter to drop front matter did not work.** Units begin at the first
heading mark, and in two works the ebook's table of contents sits above the author's note,
handing the splitter a `Chapter Thirty-Two` to start on — so unit 1 swallowed the whole
apparatus including its signed `Jon Krakauer , February 2015`.
3.**Zero was the wrong bar.** 21 survivors became 2, and both were read: `Lewis Krakauer
loved his five children deeply` is Krakauer writing about his own father in Into the
Wild's two autobiographical chapters, and the other is a reader's letter he quotes calling
him a kook. **Hemingway's own name in his corpus was always publisher apparatus, so 0 was
right there; this author writes about himself.** Pinned at 2, every survivor printed.
⚠ Both strips are **windowed in the opposite direction from McCarthy's** — front matter cut
at the author's signature inside the first 10%, back matter at the earliest apparatus marker
inside the last 25% — because Krakauer's `ALSO BY` / `Copyright` / `About the Author` sit at
0.00.6% of the file and an earliest-marker rule would cut 99.9% of the book.
## ⚠⚠ THE OPEN CALL: an unmeasured fraction of Krakauer is not his prose
He quotes constantly and at length — McCandless's journals and letters, Tillman's diaries,
court transcripts, depositions, nineteenth-century Mormon documents, newspaper reports, and
whole paragraphs of Jack London, Wallace Stegner and Thoreau at the chapter heads. In print
those are indented or italic. **The extraction lost both**, so in the master they are
ordinary paragraphs, indistinguishable from his own sentences by any signal available.
Only **52 words** were removable — chapter-head epigraphs whose all-caps attribution line
survived. That is **0.01%, and it is not the answer**: the method would report 0.0% for a
book made entirely of undated block quotes. The floor is the finding, not the number.
This is the same error as excluding *The Torrents of Spring* from Hemingway — another
author's style under the target's name — **distributed rather than concentrated**, and the
fraction is unknown. Scope is the operator's call exactly as fiction-only was. D2 for
Krakauer is the only thing waiting on it.
Related: [[2026-09-17-lv-hemingway-gate]], [[2026-09-16-lv-hemingway-corpus]],
[[2026-09-17-lv-bronte-gate]].
+36 -1
View File
@@ -1,6 +1,6 @@
# Persistent memory — eshpfi-management
_Last updated: 2026-09-17 ~03:40 PT (lv-hemingway SHIPPED on ckpt850 — the line's strongest voice pass; the axis-B negative control was found to be the wrong one and replaced with the author's own self-similarity; the floor rule went pairwise, which retroactively passes lv-bronte.)_
_Last updated: 2026-09-17 ~08:30 PT (lv-hemingway SHIPPED; the floor rule went pairwise, which retroactively passes lv-bronte; McCarthy and Krakauer D1 corpora BUILT — Krakauer's quoted-material scope is an open operator call.)_
> **Always check for `/tmp/infra-ops-handoff.md`** — if it exists and its
> `Written:` stamp is under **8 hours** old, read it (it carries the in-flight
@@ -133,6 +133,36 @@ gap vs a 0.113 floor) so the tiebreak fell to the resolving axes, and 850 wins a
(2.3x tighter spread, lower memorisation, less ran-on, half an epoch less overfit).
**The two-epoch recipe is now 0 for 2.** Read the curve; prefer the earlier tied checkpoint.
### BUILT — `lv-mccarthy` and `lv-krakauer` D1 corpora (operator: "both", 2026-09-17)
| corpus | units | words | notes |
|---|---|---|---|
| **mccarthy** | 167 | **584,756** | `~/mccarthy-corpus`, 6 novels, both guards PASS |
| **krakauer** | 126 | **422,880** | `~/krakauer-corpus`, 4 works, ALL NON-FICTION |
Shared blocker solved first: `scripts/r49-corpus/split_units.py` picks a unit mode by SIZE
not count (the inherited "most units" rule gave Cities of the Plain 4 units of 22,312w — the
book's PARTS), and falls back to paragraph-block sections for works with no divisions.
`persistent-memory.d/2026-09-17-mccarthy-krakauer-d1.md`
**McCarthy's voice IS missing punctuation** — 0.0 quote marks/10k against Hemingway's 838,
and `dont`/`aint`/`wont`. `repair_typography.py` MUST NOT be run on that corpus; the builder
runs no normalisation and asserts the quote density so a future change fails the build.
**And delta_cb is a char-bigram metric**, so an adapter that learns only "emit no quotes"
will pass the voice axis without learning a sentence. **Pre-register a punctuation-normalised
secondary read before gating lv-mccarthy.**
### ⚠ OPEN, OPERATOR'S CALL — is lv-krakauer's corpus trainable at all?
An **unmeasured and unmeasurable** fraction of it is other people's prose: McCandless's
journals, Tillman's diaries, court transcripts, depositions, Mormon documents, paragraphs of
Jack London and Stegner. Print set those as indented/italic block quotes; **the extraction
lost both**, so they are ordinary paragraphs now. Only **52 words** were removable (epigraphs
with a surviving attribution line) — 0.01%, and that number is NOT the answer: the method
would report 0.0% for a book made entirely of block quotes. Same error class as excluding
*The Torrents of Spring* from Hemingway, distributed rather than concentrated. Scope is the
operator's call exactly as fiction-only was. **Nothing is blocked on it but D2.**
### OPEN for the operator — two measured defects, neither acted on
1. **Hemingway's TRAIN beats carry the source-name leak: 70 of 7,094 (0.96%)** (Santiago x16,
@@ -177,6 +207,11 @@ before this session began. ⚠ **Do NOT commit them** — untouched and delibera
## Recent decisions
- `[2026-09-17]` ⭐⭐ **A unit splitter must choose by SIZE, not by count — the inherited rule silently produced 22,000-word "chapters".** `scripts/r49-corpus/split_units.py`: a marker mode qualifies only if its median unit is inside [600, 12000] AND no unit holds half the work; among qualifying modes PRIORITY breaks the tie (contents > chapter-word > roman > bare-numeral > caps-title), and paragraph-block sections are the fallback for works with no divisions. ⭐ **Both rules exist because a control caught them**: scoring by "median closest to target" chose `caps-title` (6 units, one holding **97%** of the book) over True at First Light's real 20 chapters, because a median cannot see that distribution and a max bound can. Positive control: 8/10 Hemingway works reproduce the shipped mode and count exactly. Negative control: 40,000 words with no blank lines → 1 unit, refuses to fabricate divisions. Commit `705fa3a`.
- `[2026-09-17]`**lv-mccarthy D1 built — 167 units, 584,756 words — and the whole job was protecting a style that reads as damage.** 0.0 quote marks per 10k (Hemingway 838), `dont`/`aint`/`wont`. The builder runs NO typography normalisation and asserts the quote density afterwards. Two truncated catalogue rows dropped for complete mobi siblings; all 15 containment pairs measured (worst 0.10%); back matter in 4 of 6 works carried the author's name 26 times → 0. ⚠ The back-matter strip runs BEFORE the split here — Blood Meridian and The Crossing end with a dumped TOC of bare roman numerals, the exact shape of a chapter marker. Commit `f3bf3ca`.
- `[2026-09-17]`**lv-krakauer D1 built — 126 units, 422,880 words — and its name guard caught three defects nothing else would have reported.** Back matter searched only the LAST unit while the apparatus sat in unit 37 of 41; relying on the splitter to drop front matter failed because the ebook TOC sits above the author's note and gave it a `Chapter Thirty-Two` to start on; and **zero was the wrong bar** — 2 survivors are Krakauer writing about his own father in Into the Wild's autobiographical chapters, so the allowance is pinned at 2 with every survivor printed. ⚠ Both strips are windowed in the OPPOSITE direction from McCarthy's, because Krakauer's `ALSO BY`/`Copyright`/`About the Author` sit at 0.00.6% of the file. Commit `4be0630`.
- `[2026-09-17]`**`triage_disposition = 'accepted'` in the Kvasir catalogue does NOT mean the extraction succeeded.** Blood Meridian's epub row holds 1,167 words of a 117,000-word book, The Crossing's 222 of 150,000 — real prose, real titles, accepted. Faulkner's *The Mansion* is 39 words. `near_dup_pairs` holds ONE row in the entire 1,284-work library and is blind to a fragment beside its full sibling. **Word-count every master before trusting a row**, and note that word count alone cannot tell a truncated novel from a legitimately short work.
- `[2026-09-17]` ⭐⭐⭐ **lv-hemingway SHIPPED (ckpt850) with the line's strongest voice result — and the memorisation control it passed turned out to be the WRONG control.** Voice +0.413 delta_cb at 6.4x the floor, closing 73.8% of the achievable span (lv-bronte closed 48%). ⚠ `memorization_check.py` uses the base-unadapted arm as its negative control, but base writes 18,035 words of summary against the adapted arms' 27,413 of pastiche — **text that does not imitate the register cannot collide with its n-grams**, so a 0.00 there means "different register", not "did not memorise". The right reference is the author himself: **held-out Hemingway against the train split collides at 0.01 while the adapter does at 0.07**, so the comfortable "his plain register makes collisions inevitable" story is FALSE and was refuted rather than assumed. All 19 matched runs were READ: stock dialogue, max **9 words**, no proper noun — shorter than the 10-word run unseen Hemingway shares with the train split by coincidence. ⭐ **A negative control that differs from the candidate in a way correlated with the metric is not a control.**`persistent-memory.d/2026-09-17-lv-hemingway-gate.md`
- `[2026-09-17]` ⭐⭐ **The v2 voice floor is now PAIRWISE, and it retroactively passes lv-bronte.** lv-bronte's ckpt475 shipped as a voice-axis FAILURE at +0.193 against a 0.251 floor contributed entirely by ckpt925 — a third arm nobody was shipping, on one outlier seed. Scored against the arm it was actually compared to the floor is 0.091 and it clears at **2.1x**. The rule was changed **prospectively**, pre-registered for lv-hemingway before any Hemingway number existed, on an argument independent of the answer: the sampling variability of a difference AB depends on A and B, never on a third arm C. The previous session found the defect and deliberately declined to exploit it; this follows from fixing it. lv-hemingway passes under **both** rules, so its verdict does not lean on the change. Caveats amended append-only in the compose, the NFS README and the gate record. Commits `0bb4938` `2e9b118`.
- `[2026-09-17]`**The beat-contamination leak IS present in Hemingway — 70 of 7,094 train beats (0.96%), 0 of 200 val.** `scripts/r49-corpus/audit_pairs_sourcenames.py` closes the blind spot `leak_gate.py` has by construction (it reads the corpus and the renamed copies, never the generated beats). Cross-validated on real data: the fixed Brontë pairs return 0 of 3,858 and `pairs-full.CONTAMINATED` returns 15 of 792 = 1.89% with the recorded names. `--filter-out` yields a verified-clean 7,024-pair set in one command; the retrain is the operator's call. **The val split being clean is why the gate could run at all.**