Skool Comp #13 — "The Translator"

A converter with a contract, not a summarizer with good intentions.

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.

What you get

Eight fixed roles, every run, in this order. A role with nothing to fill it says so — it never guesses.

How grounding actually works

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.

Grounded correctly

{"quote": "build it, use it, trust it, and then orchestrate it", "loc": "p5s1"} — checked against paragraph 5, sentence 1's window. Found. Passes.

Caught as a failure

{"quote": "...nineteen retries...", "loc": "p1s2"} — the real 19-retries fact, cited under the wrong (12-retries) paragraph. Not found there. Fails — on purpose.

Sample output

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.

essay-1-dont-automate.output.json (excerpt)
{"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.

Tested by trying to break it

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.

$ python3 verify.py --judge-mode
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.

FixtureTypeProves
3 real essaysrealshape holds across genuinely different real inputs
neighbor-swap-decoy.mdattackreal-but-wrong-location value must fail
misspelled-name.mdattacknever "correct" a name to the usual spelling
one-word-perturbed.mdattackexamples.md's worked pair can't leak into a new translation
garbage-input.txtattackrefuse to parse, never fake a full carousel
truncated.mdattackcut-off source ≠ source with nothing to say
buried-fact.mdattacka fact stated once, in a subordinate clause, still gets extracted
repeated-never-stated.mdattackdiscussed-a-lot ≠ plainly stated
contradicted-correction.mdattacka corrected fact resolves to the corrected value (documented boundary — see fixtures/manifest.md)

What this honestly doesn't check

Same two-track honesty as this worker's own can-spam-auditor build: grounding is fully mechanical, extraction judgment isn't.

Does the offline checker generate translations?

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.

Can it catch a citation of the wrong self-corrected value?

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.

Setup

  1. Clone the repo. Python 3.9+, nothing else — no pip install.
  2. Confirm the checker works: python3 verify.py --selftest.
  3. Watch it get attacked: python3 verify.py --judge-mode.
  4. Verify a real translation by hand: python3 verify.py fixtures/essay-1-dont-automate.md fixtures/essay-1-dont-automate.output.json.
  5. Translate a new essay: load 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.

In the wild

No customer proof yet — this section fills in after real use, not before.