Turns one incident-driven teaching essay into a fixed 8-slide carousel — same shape every run, every claim traced back to the exact paragraph and sentence it came from, checked by an offline verifier before anything ships. Nothing invented. Nothing that matters silently dropped.
Eight fixed roles, every run, in this order. A role with nothing to fill it says so — it never guesses.
Every populated field carries one or more citations — a quote plus a
p<N>s<M> coordinate (paragraph, sentence). verify.py checks each
quote as a literal substring of that specific location, ±1 sentence for boundary drift, never crossing
into a neighboring paragraph. A real fact cited under the wrong-but-nearby location still fails — that
narrowness is the whole point. Full mechanism in reference/grounding-methodology.md.
{"quote": "build it, use it, trust it, and then orchestrate it", "loc": "p5s1"} —
checked against paragraph 5, sentence 1's window. Found. Passes.
{"quote": "...nineteen retries...", "loc": "p1s2"} — the real 19-retries fact,
cited under the wrong (12-retries) paragraph. Not found there. Fails — on purpose.
Two slides from a real translation of a real essay
(fixtures/essay-1-dont-automate.md) — full output in fixtures/essay-1-dont-automate.output.json.
{"role": "Insight",
"text": "I'd tested the script. I hadn't tested the absence of me.",
"citations": [
{"quote": "I'd tested the script.", "loc": "p4s1"},
{"quote": "I hadn't tested the absence of me.", "loc": "p4s2"}
]}
{"role": "Rule-or-Citation",
"text": "Kieran Klaassen has a name for the order: build it, use it, trust it, and then orchestrate it.",
"citations": [
{"quote": "build it, use it, trust it, and then orchestrate it", "loc": "p5s1"}
]}
On a different real essay with no named citation
(fixtures/essay-3-demo-bugs.md), the same role correctly resolves to
"not in source" — not a shorter guess, the literal field.
Four adversarial checks, run live, each printed with the real incident or comp lesson it encodes — not a README paragraph asking you to trust it.
essay-carousel-translator --judge-mode
Four adversarial checks. Each one encodes a named failure this build was built to resist.
-- neighbor-swap-decoy.md --
Skool Comp #12 'The Auditor' lesson, ported: a real value cited under the wrong
location beat 7/20 entries including this build family's own ancestor.
[PASS] caught: "...nineteen retries..." NOT found in the source window at p1s2
-- misspelled-name.md --
the brief's own named disqualifying-invention example: a name "corrected" to the
version that's usually right, instead of preserved as written.
[PASS] caught: "...Alex Petrosian..." NOT found in the source window at p1s2
-- garbage-input.txt --
the can-spam-auditor 2026-09-05 incident, ported: garbage input must refuse to
parse, not produce a confident carousel from noise.
[PASS] refused to parse (NotATeachingEssayError)
-- repeated-never-stated.md --
volume of discussion is not the same as a stated, groundable claim.
[PASS] caught: "...nobody owned the flaky test..." NOT found in the source window
JUDGE-MODE PASSED -- all four confirmed live, right now
Six more fixtures — a truncated source, a buried fact
stated once and never restated, a self-corrected date, and an exemplar-leakage test — run every time in
verify.py --selftest (10 fixture pairs) and verify.py --matrix (337 planted faults, each caught through the gate it names). Full table in
fixtures/manifest.md.
| Fixture | Type | Proves |
|---|---|---|
| 3 real essays | real | shape holds across genuinely different real inputs |
| neighbor-swap-decoy.md | attack | real-but-wrong-location value must fail |
| misspelled-name.md | attack | never "correct" a name to the usual spelling |
| one-word-perturbed.md | attack | examples.md's worked pair can't leak into a new translation |
| garbage-input.txt | attack | refuse to parse, never fake a full carousel |
| truncated.md | attack | cut-off source ≠ source with nothing to say |
| buried-fact.md | attack | a fact stated once, in a subordinate clause, still gets extracted |
| repeated-never-stated.md | attack | discussed-a-lot ≠ plainly stated |
| contradicted-correction.md | attack | a corrected fact resolves to the corrected value (documented boundary — see fixtures/manifest.md) |
Same two-track honesty as this worker's own can-spam-auditor
build: grounding is fully mechanical, extraction judgment isn't.
No. verify.py verifies a given output against a given essay — it doesn't produce one.
The extraction (deciding what's Hook vs. Insight, reading the essay) is done by whoever is loaded
with identity.md/rules.md/examples.md, same as every other
specialist this worker builds.
Not mechanically. If an essay states a fact then corrects it, both values are literally present in
the text — a citation of either would ground successfully. Resolving to the corrected value is a rule
taught in rules.md and demonstrated in examples.md, not something the
offline checker enforces. See fixtures/manifest.md § Known boundary.
pip install.python3 verify.py --selftest.python3 verify.py --judge-mode.python3 verify.py fixtures/essay-1-dont-automate.md fixtures/essay-1-dont-automate.output.json.identity.md/rules.md/examples.md/reference/ into a Claude Project (code execution enabled), paste in an essay matching the genre in reference/genre-notes.md, and ask for a translation.