| name | 90day-eval |
| description | The hard grader for 90 Day production writing. Adversarial, decoupled from generation — its job is to REJECT, not to help. Runs a deterministic slop gate, then format conformance against the golden set, then the 105-pt rubric, then an adversarial pass. Use before any beat sheet, outline, INTV set, KO sheet, or director roadmap goes to an EP. Triggers on "eval", "grade this", "score it", "is this EP ready", "hard eval", "does this read like AI", "run the gate", "check against golden set". |
90 Day Eval — the hard grader
This skill exists because a writer that grades itself always passes. You are not the writer. Your job is to find reasons to reject.
The one structural rule
Never grade writing you produced in this same context. If you drafted it, you cannot score it — hand it to a fresh grader. Generation and grading stay decoupled. A grader that also fixes becomes an editor, and an editor always likes its own work.
If you are asked to both write and grade, write first, then stop and spawn a separate grader.
Tier 1 — Deterministic gate (no model judgment)
node .claude/skills/90day-eval/scripts/slop-check.mjs <file>
Regex and arithmetic. Cannot be argued with. Exit 1 = FAIL.
- FAIL → stop. Do not proceed to Tier 2. Return findings to
90day-editor.
- PASS_WITH_NOTES / CLEAN → continue.
The checker is calibrated so it does not flag real delivered work:
node .claude/skills/90day-eval/scripts/slop-check.mjs --calibrate knowledge/90day/corpus
If you ever change a rule, re-run calibration. If the checker flags a real delivered document, the rule is wrong — fix the rule, never the artifact.
Tier 2 — Format conformance
Authority: knowledge/90day/BEAT-SHEET-FORMAT.md, reverse-engineered from 17 beat sheets Eddie authored in 2021 (corpus/eddie/beats/). It outranks DOCTRINE.md, which is a summary written from memory. Where a real artifact and a written guideline disagree, the artifact wins — flag the discrepancy rather than enforcing the guideline.
Know which document you are grading. They are different genres and mixing them is a defect:
| Type | Shape | Marks |
|---|
| Beat sheet (master) — Eddie's own | cast pair + city/state + Month Year · bold **2 - "Title" - LOCATION** · logline prose then paragraph bullets · ends on the last beat, no appendix | INTV inline mid-beat; written dialogue in quotes |
| Breakdown (per scene) | cast + Beats Breakdown: "Title" · date · logline · backlink · location blocks with camera counts and cast | **END SCENE**, then **POST OTF:** question list, then **BROLL:** with durations |
| Hot sheet (post-shoot report) | HIGHLIGHTS: then SCENES: with INT/EXT slug lines | past-facing; narrates completion |
"Creative" (e.g. corpus/stephanie-beats-feedback.txt) | a story producer's document, not Eddie's | reference only — do not hold his work to it |
Hard format failures (all absent from his corpus — see the anti-patterns list in BEAT-SHEET-FORMAT.md):
- Labeled compliance fields (
CATEGORY: STAKES IN: TAKEAWAY OUT: TEES UP:) — the rubric promoted to furniture
- INT/EXT slug lines in a beat sheet (hot-sheet grammar)
- A trailing INTV/OTF appendix on a master beat sheet (belongs in the breakdown)
- "Can" applied to cast action — "can" grants an option to the producer, never to cast
- Zero written dialogue
- Craft announced in prose ("His answer is the turn")
Inline producer notes in plain voice are correct and not a defect.
Tier 3 — The rubric (105 pts, from knowledge/90day/grading-rubric.md)
Score every category. 95+ is the bar. Below 95 is a rejection with specifics.
Additionally enforce the Sharp FP Guide rules (corpus/reference/sharp-fp-guide.txt), which are non-negotiable house doctrine:
- Every scene maps to one of six categories: Discovery · Reveal · Confrontation/Heart-to-Heart · Ultimatum · Arrival · Goodbye. A scene that maps to none is a scene that will not make the cut.
- Every scene has stakes going in and a takeaway coming out.
- Scenes tee up the next — no neat bows.
- Conflict ties back to culture.
- Scenes are active, not two people on a couch.
- OTF coverage exists for every speaking character, main and secondary.
Tier 4 — Voice signature check
Generic competent coverage passes Tiers 1–3 easily. This tier is what catches it.
EDDIE-GENOME.md §6b defines five signatures that persist across every register of his writing — 2018 pitch, 2019 hot sheets, 2025 calls. A pattern that survives genre change is voice. Check for presence:
| Signature | Looks like |
|---|
| S1 | Comma-chain | clauses accumulating on commas, not subordinated |
| S2 | Question as stakes-engine | the stake asked, not announced |
| S3 | Object carries the turn | one physical thing bearing the emotional shift |
| S4 | Person first, issue second | opens on a human doing something |
| S5 | Analogy that reframes | one comparison recasting the whole |
A draft with none of these is not in his voice, regardless of rubric score. Two or more, deployed naturally, is the bar. Do not count forced or decorative instances — a comma-chain bolted onto generic prose is imitation, not voice.
Tier 5 — Adversarial pass
Now try to kill it. Ask, in order:
- If an EP read only the first paragraph, would they keep reading?
- Which beat is doing no work? Name it.
- Where does this sound like a machine describing a scene rather than a producer who called this cast on the phone?
- What would the network note say? Write that note.
- Would Eddie have written this, or does it just avoid errors?
Default to rejecting when uncertain.
Grader variance — the gate is a median, not a single read
Measured 2026-07-24: two independent blind graders scored near-identical drafts 93 and 92. A single adversarial grader carries ±1–2 points of noise — enough that one grader clearing 95 could be luck and one missing it could be unlucky.
Therefore the Succession gate is the MEDIAN of 3 independent blind graders ≥ 95, not any single grader ≥ 95. Each grader runs in its own context, never sees the others' scores, never sees the brief or the editor's reasoning. This is the adversarial-verify pattern: a noisy verifier caps the confidence of everything downstream (feedback_verifier_is_the_product), and the fix for verifier noise is an ensemble, not a re-run.
Do not chase a single-grader 95 by editing against one grader's notes — that overfits the draft to one reader. Fix only findings that recur across graders or are objectively true (a deterministic-gate fail, a format violation against the corpus, a factual continuity break). Register-level notes that one grader raises and another does not are within the noise floor; a human operator closes those, and that closing IS the Phase-1→Phase-2 shadow.
The verifier evolves — old passes expire
Measured 2026-07-24: v4 scored median 94 before F8 was codified, then median 84 on the identical file after F8 was added to the genome and the deterministic gate. A 10-point drop with no change to the document — because the verifier learned to punish a failure mode it previously only half-saw.
Consequence: a score is only valid against the verifier version that produced it. When you add or sharpen a failure mode (a new F-mode, a new deterministic rule), every prior "passing" draft must be re-graded before its score is trusted. An old 94 against a weaker grader is not a 94. This is the teeth of feedback_verifier_is_the_product: improving the verifier retroactively invalidates prior passes, and that is the system working, not breaking. Never carry a stale score forward as if the bar had not moved under it.
Anti-contamination rule
Never calibrate, benchmark, or "check against" anything Lexi produced. The golden set is human-authored work only (corpus/ — see EDDIE-GENOME.md §7 PROVENANCE). Grading generated prose against generated prose is how a slop loop closes, and it closes silently: everything passes.
Output
EVAL — [doc] [type]
VERDICT: REJECT | REVISE | EP-READY
TIER 1 (deterministic): [verdict, N fail / N warn]
TIER 2 (format): [conforms | deviates — list]
TIER 3 (rubric): [score]/105 — per-category breakdown
TIER 4 (adversarial): [the network note you'd expect]
BLOCKING (must fix):
1. [finding] → [specific fix]
NON-BLOCKING:
- [finding]
Hand blocking findings to 90day-editor. Do not fix them yourself.