Skip to content

docs(paper): research paper + presenter pack, with six figures (supersedes #14) - #15

Merged
ksdisch merged 1 commit into
mainfrom
docs/paper-figures
Jul 30, 2026
Merged

docs(paper): research paper + presenter pack, with six figures (supersedes #14)#15
ksdisch merged 1 commit into
mainfrom
docs/paper-figures

Conversation

@ksdisch

@ksdisch ksdisch commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Write-up of the closed v1 chain (M0–M4) from the 18 committed result JSONs in results/. Review only — please do not merge without your sign-off.

Supersedes #14. That PR was tables-only by rule, not by choice: the research-paper skill forbade figures outright. It has since been fixed (claude-config d95f620), so this run let the recorded data earn its figures. I have not touched #14 — its disposition is your call.

What's new vs #14

Six figures, plus a committed script that draws them:

Figure The shape a table hides
1 gate contrasts all five pre-committed contrasts and their interval widths on one axis
2 window sweep the late cliff on a floor, and 0.5B's visibly raised floor
3 dose grid a dimmer not a step; binary and mass channels falling together
4 the 12 × 12 matrix the dark diagonal on a near-white grid — what M3's brief calls "the killer figure", finally drawn. silver's fragile column vs its harmless row is visible at a glance
5 M4 floor reads why the verdict says AS-SCORED ONLY: one lower bound clears 0.5, another doesn't
6 collateral asymmetry primes cluster tight and high; probes are bimodal with a tail to 0.5

Figure 4 replaces the brief's 12 × 12 ASCII grid entirely — each cell is annotated with its recorded hits/n, so the figure is its own table view.

What the figure script may and may not compute

docs/paper/figures.py is deterministic and headless, reads only the committed JSONs, and writes only the six PNGs beside it. It computes nothing beyond hits / n where a file records the pair rather than the rate; every interval drawn is a recorded wilson_95 or newcombe_* endpoint. It never smooths, interpolates, fits, re-bins, or pools arms the runners did not pool. Specifically:

  • No line joins the marks on the sweep or dose figures — the values between two grid points were never measured.
  • The interpolated half-mute λs (0.23 / 0.29 / 0.36) are quoted in prose, labelled as interpolations, and plotted nowhere.
  • It prints every plotted number with its source key, so the figures check against the paper's tables without opening a PNG.
  • Re-running produces byte-identical PNGs (verified).
  • matplotlib is injected per-run — uv run --with matplotlib docs/paper/figures.py. pyproject.toml is unchanged.

Constraints honoured

  • No new measurements. No runner, gate, ablation or anchor script was executed; nothing in results/ was written or overwritten. uv run pytest was not run either — the 396-test count is quoted from HANDOFF.md rather than claimed as re-verified.
  • No fabricated numbers. Every load-bearing statistic was re-checked by parsing its named source file (a throwaway script over all 18 JSONs; all checks pass). Two claims that looked derived — "126 of 132 ordered pairs" and "633 of the 2,340" — are recorded verbatim in M3-BRIEF.md and DECISIONS.md.
  • Honesty framing intact. Every null, the AS-SCORED ONLY qualifier inside the verdict string, both re-attributions (silver's column vs row; category-block composition), the M1 coverage bound, and the full owned-deviations ledger are carried through. CLAUDE.md's stale "v1 chain (M0–M3) is closed" was overridden by the briefs and result files — the paper covers M4.

Two things for your review

  1. Length. The paper's prose runs ~6,600 words against the skill's ~3,000–5,000 guideline. I cut what didn't cost content; the remainder is five milestones, six figure captions carrying required disclosure, and an owned-deviations ledger I'm not willing to thin. Say the word if you want it inside the band and I'll propose specific cuts.
  2. Figure 6's denominators differ per mark (12 deletions × a concept's gated items, or 11 × for a subset concept). Stated in the caption and on every labelled mark — worth a look to confirm it reads clearly.

🤖 Generated with Claude Code

https://claude.ai/code/session_016PZepEZ6FAuLU51giFk31i

Write-up of the closed v1 chain (M0-M4) from the 18 committed result JSONs
in results/. No new measurements: no runner, gate or ablation script was
executed, and nothing in results/ was touched.

Supersedes PR #14, which was tables-only because the research-paper skill
forbade figures at the time. Six figures now carry the shapes the tables
hide -- above all the 12 x 12 prime x probe matrix M3's brief calls "the
killer figure".

docs/paper/figures.py renders all six, deterministically and headless, from
the committed JSONs alone. It computes nothing beyond hits/n where a file
records the pair rather than the rate; every interval drawn is a recorded
wilson_95 or newcombe_* endpoint. It never smooths, interpolates, fits,
re-bins, or pools arms the runners did not pool -- no line joins the marks
on the sweep or dose figures, and the interpolated half-mute lambdas
(0.23/0.29/0.36) are quoted in prose and plotted nowhere. It prints every
plotted number with its source key, so the figures check against the tables
without opening a PNG. matplotlib is injected per-run
(uv run --with matplotlib docs/paper/figures.py); pyproject.toml is
unchanged.

Every load-bearing statistic was re-verified by parsing its named source
file. All nulls, the AS-SCORED ONLY qualifier, both re-attributions and the
full owned-deviations ledger are carried through.

Review only -- not for merge without Kyle's sign-off.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PZepEZ6FAuLU51giFk31i
@ksdisch
ksdisch merged commit bd7b1d2 into main Jul 30, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant