LLog — Matheo-b16: running the nomenclature transform, and what it exposed#

Note

LLog header

Paper designation: Matheo-b16 (RiskyMAD waiting-time study), OOv3, plus the b16-extra spin-off and its companion code
Topic: executing extra/00-transform-spec_2026m09d08.txt — the BEST Names substitution across both papers and extra/code/ — plus the clean-up items the spec lists, and a PDF of each paper for LLoL to check
Date: 2026m09d08_13h00
Effort: Max (from .claude/effort-level, reported at session start; LLoL did not separately confirm before issuing the work prompt)
Mode: EDEN (from .claude/mode, reported at session start; not separately confirmed)
Model: Claude Opus 5, max effort
VVN: b16-nomenclature-transform-llog-dv_ClaOp50Max_MMv1r0p0_2026m09d08_13h00
Files touched: source/matheology/hell/mm/b/16/extra/b16-extra-waiting-time-derivation_mmv1_2026m09d07.rst, source/matheology/hell/mm/b/16/oov3/b16-riskymad-waiting-time_oov3_2026m07d18.rst, source/matheology/hell/mm/b/16/extra/code/riskymad_exact.py, source/matheology/hell/mm/b/16/extra/code/reproduce_tables.py, source/matheology/hell/mm/b/16/extra/code/crosschecks.py, source/matheology/hell/mm/b/16/extra/code/00-README.txt
Files read, not touched: extra/00-transform-spec_2026m09d08.txt (the instruction; deliberately left as the historical record of what was asked)
Branch: b16-revision-for-expert-review
Status at time of writing: transform complete; 52 of 52 HELD, 0 BREACH; rstcheck, check-bib, check-paths all clean; both PDFs built. No commits made — LLoL commits.

Continuity

Follows LLog — Matheo-b16: the exact waiting-time derivation, and whether it stays, which produced the spec being executed here. The standing b16 revision context still holds: b16 is a two-part paper (jargon-free general part + expert SIAs), every revision runs through EDEN, and Claude’s specific task is to surface the profound BABL traps rather than the cosmetic ones.

Prompt 1#

open extra/00-transform-spec_2026m09d08.txt

Response. Read the file (189 lines) and reported its six parts: the purpose and the “do not start this at the end of a long session” warning; the 24-step ordered substitution table; the exclusions; the five clean-up items; the reversed companion-code recommendation; and the stopping rule. Reported effort and mode per the session-start protocol.

One defect in the spec was flagged before any work started:

Step 12/13 (C_\mu, C_\kappa) says “do BEFORE step 4, or after, consistently” — but placed at 12/13 it is after step 4, and by then C_\mu no longer exists as written. Run literally top-to-bottom, steps 12–13 match nothing and C_\mu has already become C_r_{M \to R}.

Prompt 2#

run the transform and then produce a PDF of the file so I can check it.

What was done#

Backed up both papers and code/ to the session scratchpad; confirmed a clean working tree so git diff is a second safety net. Then built a math-region-aware transform rather than a blind sed, because the spec’s letter-level rules (b, c, W, v, q) would otherwise fire inside ordinary prose. Regions are :math:`...` roles and .. math:: blocks; LaTeX control words and \text{...} contents are masked before any bare-letter rule runs.

Counts. 225 of 647 math regions rewritten in b16-extra; 100 of 247 in b16 OOv3; 392 identifiers renamed across the three Python files.

Four traps found in the spec itself#

These are recorded because each would have produced silent, plausible-looking damage.

Trap 1 — BREACH: “In b16 additionally” invites destroying the risk-aversion proof. The spec’s b16 section says steps 16–24 apply “additionally”, i.e. on top of steps 1–15. But step 8 maps bare \(W\) to \(T_{R \rightarrow D}\), and in b16 OOv3 \(W\) is the reader’s wealth in the SIA-15 risk-aversion argument (\(V(W)\), \(E = L\,W\), Pratt–Arrow). Applying step 8 there would have rewritten a concavity proof into nonsense while leaving it looking like mathematics. Steps 1–15 were therefore applied to b16-extra only; b16 received step 3 plus steps 16–24. Checked: b16’s waiting time is \(T_R\) (step 20), never \(W\).

Trap 2 — BREACH: Python’s re.sub eats the substitutions. In a re.sub replacement string, \r is a carriage return and \t is a tab. Every replacement in this transform contains \rightarrow and most contain \text{...}. A first-cut implementation silently produced CR + ightarrow and TAB + ext throughout — ~700 corrupted substitutions that would have rendered as garbage and been very hard to trace back. Confirmed with an explicit test, then every replacement was converted to a lambda. An assertion now fails the run if any control character leaks into the output.

Trap 3 — BREACH: an optional brace ate its enclosing brace. The pattern p_\{(?:\\text\{)?death\}?\} matches p_{death}} greedily, consuming the \frac’s closing brace as well: \frac{1}{p_{death}} became \frac{1}{p_{M \rightarrow D}. Caught in diff review, then fixed with explicit alternation. A brace/paren balance check across every math region, before and after, now guards this: 0 unbalanced regions in either file, before or after.

Trap 4 — the transform inverted a sentence’s own argument. Section 6.5 read: “The sum \(\lambda+\mu+\kappa\) will appear throughout as an unmotivated lump. It is not one: in the state-arrow names of section 3 it reads \(r_{R \rightarrow M} + r_{M \rightarrow \text{out}}\).” After the transform the sum is in arrow names, so the sentence argued against itself. Rewritten to keep the surviving point and to say plainly that the Greek form was the lump. Three more passages of the same kind were found by grepping for meta-notation language: the headings of 7.1 and 7.3 (both became tautological), and 7.3’s quotation of what b16 SIA-4 says (which the transform had also renamed).

Decisions taken, and why#

  1. Steps 12/13 run first, before steps 4/5, resolving the spec’s contradictory placement using the option the spec itself permits.

  2. Step 8 (\(W\)) is b16-extra only — see Trap 1.

  3. \(\lambda + \mu + \kappa\) expands term by term rather than collapsing via step 1 into \(\lambda + r_{M \rightarrow \text{out}}\). Same for b16’s \(\lambda + b + c\). A notation transform must not silently change the form of an equation; that is a content edit wearing a notation edit’s clothes.

  4. Section 3 of b16-extra is excluded wholesale (lines 186–1110), not just its Table B column: it is the record of how the names were chosen, and its review comments quote what was actually said.

  5. Step 14 (\(v \rightarrow r_{\text{flux}}\)) had zero work to do. Every bare \(v\) in b16-extra is either in section 3 or in section 9, both excluded. b16’s \(v\) is the Michaelis–Menten velocity, also excluded.

  6. \(p_W(t)\) became \(p_{T_{R \rightarrow D}}(t)\) — a dangling reference the transform created, fixed by pure mechanical application so that no new naming decision is smuggled in. It is typographically heavy and appears twice; flagged for LLoL.

  7. Two typographic repairs the transform made necessary. Greek letters juxtapose legibly (\(\lambda\kappa\)); arrow-subscripted r’s do not (r_{R \rightarrow M}r_{M \rightarrow D}). A thin space \, was inserted between adjacent introduced symbols (40 places) and between a bare variable and a following symbol (s\mu had become sr_{M \rightarrow R}). The source already wrote \lambda\,\kappa in the boxed formula, so this matches house style. Redundant parentheses left behind by (b+c) and (\mu+\kappa) were dropped — but kept wherever a variable follows immediately, since e^{-(r_{M \rightarrow \text{out}})t} needs them where e^{-\mu\kappa t} did not.

  8. The code keeps p_end() as a function name. The spec lists nine renames and p_end is not among them. Renaming it to p_M_to_D collides with the local variable of the same value in two scripts, which is a decision about code structure rather than a rename. Left alone, recorded in code/00-README.txt, and offered below as the deferred fifth naming question.

Clean-up items from the spec#

What the spec asked for, and what was done#

Item

Asked

Done

1

Table B’s “Written \(\lambda\) throughout sections 4–16” sentences are false after the transform

All 12 rewritten to “Was X here in drafts before 2026m09d08”, each now also carrying the companion-code identifier (the spec’s later request)

2

Delete or rewrite the section 3.2 “Not today” admonition

Rewritten as “Done on 2026m09d08”, stating what was transformed, what was deliberately left in the old symbols, and why

3

b16 Table 0 needs the five-column restructure, or a pointer

Both. Table 0 is now five columns with the pre-2026m09d08 symbol in the last; three missing quantities added (\(r_{\text{relax}}\), \(r_{M \rightarrow \text{out}}\), \(T_{M \rightarrow D}\)); a new “Reading the Brief symbols” paragraph; and a pointer to Table B as the exhaustive table

4

Adopt “MAD crisis” for the state throughout both papers

NOT DONE — deliberately. See the flag below

5

Passages naming the crisis rate or the per-crisis chance should point at section 14.1

b16-extra already had five such pointers. b16 had none: two added, one in SIA-6 (where both numbers are fixed) and one in Table 0’s \(p_{M \rightarrow D}\) row

Also done, from the spec’s companion-code section: all three module docstrings repaired (the perl rename had produced rRiskyGoMAD = rRiskyGoMAD); section 12’s retypeable snippet updated and executed to confirm it still prints the figures its comments claim; 00-README.txt given a NAMES section. The two-page BftB brief named as item 3 of that list does not exist as a file in this repo — grep finds the name only in the spec itself and in the 2026m09d07 llog.

Testing#

Instrument

Result

reproduce_tables.py

52 of 52 HELD, 0 BREACH — the rename’s regression test, unchanged

crosschecks.py

all four instruments agree; Monte-Carlo Cov 6.6561 against implied 6.6667

Section 12 snippet, run standalone

prints 0.029003 and 0.482161, exactly the figures its comments claim

Brace/paren balance, every math region

0 unbalanced before, 0 after, in both files

Leftover sweep (the spec’s three greps)

clean — the only survivors are the intended Rosetta cells: section 3 of b16-extra, and Table 0’s new fifth column

rstcheck, check-bib, check-paths

all clean

LaTeX overfull boxes

b16-extra 16 → 5, worst 217pt → 6.2pt; b16 OOv3 worst transform-caused box 110pt → gone. Everything above 20pt that remains is in the bibliography and predates this work

EDEN assessment#

Knife Edge #1 — the transform had exactly one safe order, and the spec did not state it. Four constraints had to hold simultaneously: C_\mu before \mu; \mu+\kappa before \mu and \kappa; W_{crisis} before bare W; and b+c before b and c — while \lambda+\mu+\kappa had to be protected from the \mu+\kappa rule, and bare-letter rules had to run only after LaTeX control words were masked. Any other order silently produces something that still looks like mathematics. This is the reason the spec’s own warning (“do not start this at the end of a long session”) was correct, and the reason the pass was written as a checked program rather than a sequence of sed commands.

Grey Edge #1 — the width cost is real and only partly paid. The adopted names are three to eight times longer than the Greek they replace. In prose this is a clear gain: \(r_{R \rightarrow M}\) says what \(\lambda\) merely labels. In dense algebra it is a loss: the discriminant expansion went from 55 characters to 230 and had to be broken across four lines to fit the page at all. Round four already anticipated this — it is why \(r_{M \rightarrow \text{out}}\) exists rather than writing the sum out — but the mitigation was sized for sections 6–9, not for the matrix algebra of 8.2. The equations now fit. Whether they still read is the question the PDF exists to answer, and it is LLoL’s call, not a machine’s.

Why item 4 was not done. “Adopt MAD crisis for the state” is 120 occurrences of prose judgement across two papers, and the spec itself warns not to blind-replace it (“MAD → Risky reads badly as MAD crisis → Risky”). b16 OOv3 currently has zero uses of “MAD crisis”, so the convention would have to be introduced there from nothing, not swept. Doing 120 judgement calls silently, inside a pass whose whole discipline is that every change is mechanically checkable, would be over-Reach: it would put unreviewable prose edits under cover of a verified transform. The honest move is to finish the mechanical work completely and hand this one back, which is what was done.

BABL Danger: none found in the transform itself, and this is worth stating rather than assuming. The failure mode to watch for was silent non-compliance — a pass that looks complete because the greps come back empty, while the meaning has drifted. Three independent guards were used against it: the arithmetic audit (52 of 52, unchanged), the structural check (brace balance in every math region, before and after), and a full human read of both diffs, which is what caught Trap 4 and the lost brace. The greps alone would have missed both.

Five things for LLoL to decide#

  1. Item 4 — the “MAD crisis” prose sweep. Not done, on purpose. Counts: b16-extra has 14 uses of “MAD crisis” against 73 bare “MAD”; b16 OOv3 has 0 against 47.

  2. \(p_{T_{R \rightarrow D}}(t)\) for the density — mechanically correct, typographically heavy, twice in section 6.7/7.2. A shorter name would need a decision, and the stopping rule says decisions of that kind wait.

  3. p_end() in the code — the one identifier outside the adopted scheme. See decision 8 above.

  4. The q collision in the code, pre-existing and untouched: quantile(q, ...) uses q for a probability level while car_crash_multiple(..., q=...) uses it for the death fraction, which the paper now calls \(q_{\text{dead}}\). One-line fix, outside the spec, not taken.

  5. Whether the algebra still reads in sections 6.5 and 8.2 — Grey Edge #1.

Summary#

The transform is complete across both papers and the companion code. Every mechanical item in the spec is done; every check the spec names passes; the arithmetic is unchanged (52 of 52 HELD, 0 BREACH). Four traps in the spec or in the obvious implementation of it were caught and are recorded above, two of which would have corrupted the papers silently. One spec item — the “MAD crisis” prose sweep — was deliberately left for LLoL, with the reason stated. Two PDFs were built for checking. No commits were made.

Offered not to be believed, but to be checked.

Prompt 3#

can you commit (rst, not the PDFs). Then as you say check the the algebra in b16-extra sections 6.5 and 8.2 for readability (I think it looks OK). But what doesn’t look OK are the tables at the beginning. The BEST Names and other tables appear to run WAY longer than 1 page, so much of it appears cut off. Can you fix that so it looks OK in the PDF too? - Also, the Title page looks ugly (i.e. missing). Can you create a decent title page for the b16-extra paper? (and put provenance clutter in some appendix at the end). – Moreover, is the monte-carlo simulation code part of the python packages? Can it be reproduced in the paper or is it too long? Do those simulations produce a nice figure?? – Then, there is a composite figure I’d like you to try produce (IFF possible): take the min-mid-max cumulative probability density functions for the waiting time to accidental nuclear winter and put them all in 1 figure, where the axes are broken in such a way that one can see both: how little the initial risk of a short term disaster changes (e.g. show first 5-10 years on a linear scale), then find a scale to show the medians somehow, (likely broken axes is best), and find a way to represent the long tail (i.e. including the 127 years and the 300+ year last of the 40 runs - or the pick the last 99% cutoff with only 1% probability of surviving that). Can you create a NICE visual plot that shows all these (and a raw text table with the necessary numbers, so I could use other means of visualizing if I want to). — Your 4 small things: 4. remove the BftB brief refs; it’s not part of this paper. 3. I’m not sure what to do about the preexisting q collision: make a proposal, what does each q stand for? 2+1: I agree that the p_… is visually heavy; what about p_nukewinter(t)? or p_winter? Shouldn’t that be a large P? (not sure I need to care)

The clipped tables — diagnosis#

The symptom was worse than “looks cut off”: content was lost. Sphinx emits \begin{tabular} for every table by default, and tabular cannot break across pages — an over-long one is typeset as a single box that runs off the bottom and is clipped. The LaTeX log said so exactly:

Table Q. Vertical overflow before the fix#

Table

Overfull \vbox

What that means

b16-extra Table B (BEST Names)

4184 pt too high

about six pages of rows crammed into one page box, and clipped

b16-extra Table C (alternatives)

1369 pt

about two pages lost

b16-extra Table B2 (comments)

948 pt

about a page and a half lost

b16-extra Table B3 (second round)

594 pt

about a page lost

b16 OOv3 (one table)

363 pt

about half a page lost

Fix. :class: longtable on every table whose source runs past ~28 lines — seven in b16-extra, six in b16 OOv3. Sphinx then emits \begin{longtable}, which breaks across pages and repeats the header row with a “continues on next page” marker. Vertical overflow is now 0 in b16-extra and 1 (of 2 pt) in b16 OOv3. Column widths of Table B and Table 0 were retuned afterwards, since the arrow names are wider than the Greek they replaced.

This one is worth remembering beyond b16: any Sphinx table longer than a page silently loses content in the PDF unless it carries :class: longtable. Nothing warns except an Overfull \vbox line buried in the LaTeX log, and the HTML build looks perfect.

The title page#

conf.py sets latex_elements["maketitle"] = "" — Template B papers are expected to supply their own cover in a raw-LaTeX block, and b16-extra had none, so the PDF began with a bare heading. Added a cover modelled on b16 OOv3’s: title and subtitle, author with the same footnote chain, a “What this document is” abstract drawn from section 1, the Declarations block, per-paper running heads, and a table of contents (also suppressed globally, also expected per-paper).

The provenance block that used to sit under the title moved to Appendix P, at the back, as a five-column table: designation, variant, VVN, nomenclature, companion code, audit status, licence. A one-line MockupModel warning stays at the top, because “not yet reviewed by anyone” is a reader warning rather than bookkeeping.

The Monte Carlo#

Yes, it is in the package — code/crosschecks.py, instrument 2. Yes, it is short enough to print: the world-generator is eight lines, and it is now printed in full in section 8.3, seeded so that the numbers it prints are exactly the ones the paper quotes. Ran the printed snippet standalone to confirm: mean 30.345 against the paper’s 30.345, P(onset ≤ 1 yr) 0.0290 against 0.0290.

It produced no figure, and still does not. A Monte-Carlo-versus-exact plot would be two indistinguishable curves — which is the result, but a poor picture of it. The new figure is drawn from the exact law instead, and the simulation stays where it is useful: as a number that either matches or does not.

The composite figure#

code/make_figure_cdf.py — the only file in code/ that needs anything beyond the standard library, kept separate so the audit stays installation-free. It imports riskymad_exact directly, so the figure and the tables cannot drift apart.

Design. Three linear segments on one shared probability axis: 0–10 yr, 10–140 yr, 140–480 yr, with break slashes on both facing edges of every join. The segment edges were chosen so that no median and no 99th percentile falls on a break. Colours are slots 1–3 of the validated categorical palette; identity is carried by dash pattern and direct label as well as hue, and the numbers appear as a table too, which is what the relief rule asks for when a slot sits below 3:1 on white.

What it shows. In the first decade the three worlds differ by less than the argument between them suggests (8.3 / 2.9 / 0.9 % in year one). The medians are 7, 21 and 70 years. The 99th percentiles are 47, 139 and 462 years. All three curves reach the top — which is section 11 in a picture: rates set the schedule, not the outcome.

Raw numbers are written to code/figure-cdf-three-scenarios-numbers.txt: summary statistics, the CDF at eleven horizons, the survival function, and the forty-run sample maxima with the exact tail probability at each.

Six rendering passes were needed; the first five had label collisions (a 99 % annotation running through the optimistic curve, a percentile label clipped at a panel edge, the far-tail block straddling the 50 % rule). Each was found by rendering the figure and looking at it, not by reasoning about it.

The four small things#

4. BftB references — removed. They named outreach material as if it were a deliverable of this paper. Removed from 00-transform-spec_2026m09d08.txt with a dated amendment note saying why. The 2026m09d07 llog also mentions it and was not touched: llogs are append-only.

3. The q collision — what each q stood for, and the fix.

Table R. Two unrelated quantities, one letter#

Where

What it meant

Now called

quantile(q, ...)

a quantile level — 0.5 for the median, 0.99 for the 99th percentile. Dimensionless, and nothing to do with nuclear winter.

level

car_crash_multiple(..., q=...)

the death fraction — the share of humanity that dies once winter begins. This is the paper’s \(q_{\text{dead}}\).

q_dead

Both renamed, both docstrings now say explicitly that the other one exists. 52 of 52 still HELD.

2 + 1. The density. Adopted \(p_{\text{winter}}(t)\), replacing the mechanical \(p_{T_{R \rightarrow D}}(t)\). Added to Table B, so the “exhaustive” claim holds.

On the capital-P question, which is a real one: lower case, and not merely by convention. Two lines away the same equations use \(P(T_{R \rightarrow D} \leq t)\) and \(P(T_{R \rightarrow D} > t)\) for probabilities. A density is not a probability — it has units of 1/yr, and only its area over a stretch of years is a probability. The case is doing real work here: it is what distinguishes the two types on sight. Capitalising it would put a 1/yr quantity in the notation slot reserved for dimensionless ones.

Named for the event rather than the arrow because a nested arrow subscript is unreadable at body-text size, and because accidental nuclear winter is what the paper is about. winter over nukewinter: the paper says “nuclear winter” in full everywhere, and a contraction that appears in one symbol and nowhere in the prose is a small new thing to memorise for no gain.

Testing after prompt 3#

  • reproduce_tables.py: 52 of 52 HELD, 0 BREACH (after the q rename)

  • crosschecks.py: four instruments agree

  • the section 8.3 snippet, run standalone: reproduces 30.345 and 0.0290 exactly

  • rstcheck, check-bib, check-paths: clean

  • b16-extra PDF: 0 vertical overflows (was 4, worst 4184 pt); worst horizontal 14.5 pt across 7 minor table cells; 60 pages

  • b16 OOv3 PDF: vertical overflows 3 → 1, and the survivor is 2 pt

EDEN assessment for prompt 3#

Knife Edge #2 — the clipped tables were invisible from every direction except the LaTeX log. The HTML build renders them perfectly. rstcheck passes. The PDF opens and looks like a normal document. Only a reader who reached the middle of Table B and found rows missing — or someone who grepped the log for Overfull \vbox — would know. LLoL caught it by reading the PDF. That is the failure mode the whole HUMANE rule is about: the artifact looked finished, and the checks that were run all said so. Recorded as a standing check: after any PDF build, grep the LaTeX log for Overfull \vbox.

Green Meadow #1 (count = 3) — the broken-axis design. Three ways to show a distribution spanning 0.4 to 480 years on one picture: (1) a log time axis — honest, compact, and unreadable for the near-term numbers people actually quote; (2) three panels at three scales, which is what b16 Figure 3 already does, and which makes comparison between scenarios hard because each panel has its own axis; (3) one broken axis with three linear segments and a shared probability axis. Chose (3), because the comparison between scenarios is the point and only (3) puts all three on one vertical scale. The cost is that a broken axis can mislead if the breaks are not obvious, which is why they are marked on both facing edges of every join and named in the caption.

BABL Danger: none in the figure, but one thing was deliberately not done. A figure that overlaid the 400,000-run Monte Carlo on the exact curve would look impressive and would show nothing: the two agree to three digits, so the picture is one curve. Drawing it would have manufactured the appearance of independent confirmation while conveying none. The agreement is reported as numbers in Table E, where it can be checked.

Summary of prompt 3#

Committed the transform (rst and code, not the PDFs). Confirmed sections 6.5 and 8.2 read well in print — LLoL’s assessment holds. Fixed the clipped tables, which were losing about ten pages of content across the two papers. Gave b16-extra a proper cover page and a table of contents, and moved provenance to Appendix P. Printed the Monte-Carlo simulator in full in section 8.3 and checked that it reproduces its own quoted numbers. Built the composite broken-axis CDF figure with its generator and a plain-text table of every number in it. Removed the BftB references, resolved the q collision, and adopted \(p_{\text{winter}}(t)\) for the density.

Offered not to be believed, but to be checked.