From a5ddfed81e89a44bed7b77e455dea7b0713f4d17 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Thu, 17 Sep 2026 08:26:52 -0700 Subject: [PATCH] =?UTF-8?q?memory:=20snapshot=20=E2=80=94=20McCarthy=20and?= =?UTF-8?q?=20Krakauer=20D1=20built,=20Krakauer's=20quotation=20scope=20is?= =?UTF-8?q?=20an=20open=20operator=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-17-mccarthy-krakauer-d1.md | 120 ++++++++++++++++++ persistent-memory.md | 37 +++++- 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 persistent-memory.d/2026-09-17-mccarthy-krakauer-d1.md diff --git a/persistent-memory.d/2026-09-17-mccarthy-krakauer-d1.md b/persistent-memory.d/2026-09-17-mccarthy-krakauer-d1.md new file mode 100644 index 0000000..4d22cb3 --- /dev/null +++ b/persistent-memory.d/2026-09-17-mccarthy-krakauer-d1.md @@ -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.0–0.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]]. diff --git a/persistent-memory.md b/persistent-memory.md index 4533d31..4b51ebb 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -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.0–0.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 A−B 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.**