A rubric, a pre-registered hypothesis, and the hypothesis being wrong.
The system under evaluation Giga Production Studio ›
I built an evaluation for a production system I own. Giga Production Studio is a web app that runs a full AI production crew, and one stage of it is a writers' room in which three frontier models, from three different labs, each write a section of a video script from the same outline. Nobody had been measuring whether that output was any good, in the specific sense of "good" the pipeline actually needs.
The first measurable criterion produced three findings, in ascending order of usefulness.
Sections reproduced the outline's example prose beyond a 12-word verbatim threshold, despite an explicit instruction not to copy it.
I predicted which model would paraphrase most. It failed the most sections instead. That refutation is reported first, on purpose.
The examples writers are told not to copy are finished, shippable prose. That makes this a pipeline design finding rather than a model failure, and it is the result worth acting on.
Along the way, applying the rubric to real production data found five defects in my own rubric and three in the brief that feeds the models. The rubric defect mattered most: it was ranking prose layout and calling it depth, and left unfixed it would have produced a confident, wrong result with healthy-looking numbers underneath it.
Most published model comparisons have a structural problem: the models choose their own structure, so any difference in output confounds "wrote it better" with "organised it differently."
This pipeline removes that confound by accident. Every writer receives an identical outline with the beats already assigned. The models are not inventing substance. They are rendering supplied substance in their own words. That makes the comparison unusually clean, and it caps what the comparison can claim, which is a trade I am happy to make and obliged to state.
The other reason it exists is less flattering. Giga's original quality checker shared a model family with one of the three writers it was grading, and it always audited the same writer first, with no order randomisation. Every comparative judgement it ever made carries an unquantifiable self-preference bias and an unquantifiable position bias. I found this in my own system while writing the rubric. Both defects are corrected in the design below.
The criterion is C5, paraphrase compliance. The pipeline already told writers not to copy the outline's example column word for word. Nobody had ever checked whether they did.
C5 is a code check: longest common contiguous word run, plus the proportion of the section's 8-grams that also appear in the example text. A section fails if any verbatim run exceeds 12 words, or if 8-gram overlap exceeds 10%. Three mandated brand phrases (a required signature opening, a presenter self-identification, and a branded sign-off) are stripped from both texts first, because reproducing those is compliance rather than copying.
No model is called. It cost nothing to run, it is deterministic, and it gives the same answer every time.
Two of the three writers hew close to the outline's example column while the third paraphrases further.
| Section | Model 1 | Model 2 | Model 3 |
|---|---|---|---|
| HOOK | 5 / 0.0% PASS | 7 / 0.0% PASS | 5 / 0.0% PASS |
| ACT 1 | 49 / 38.3% FAIL | 44 / 22.8% FAIL | 49 / 29.3% FAIL |
| ACT 2 | 104 / 64.4% FAIL | 21 / 25.7% FAIL | 104 / 61.4% FAIL |
| CHECKPOINT | 23 / 43.2% FAIL | 21 / 46.7% FAIL | 23 / 43.2% FAIL |
| ACT 3 | 54 / 36.0% FAIL | 75 / 65.1% FAIL | 38 / 26.3% FAIL |
| STORY BEAT | 40 / 86.8% FAIL | 32 / 75.8% FAIL | 25 / 62.5% FAIL |
| ACT 4 | 70 / 50.5% FAIL | 66 / 41.4% FAIL | 58 / 44.1% FAIL |
| ACT 5 | 94 / 55.3% FAIL | 210 / 100.0% FAIL | 94 / 55.3% FAIL |
| CALL TO ACTION | 6 / 0.0% PASS | 11 / 16.7% FAIL | 6 / 0.0% PASS |
| Sections failed | 7 of 9 | 8 of 9 | 7 of 9 |
Each cell: longest verbatim run in words / proportion of the section's 8-grams also present in the example column.
The model I had identified as the paraphraser failed the most sections, 8 of 9 against 7 of 9.
I am reporting that first, and prominently, because a refuted pre-registration is worth more than a confirmed one. It is the clearest available evidence that the prediction preceded the data instead of being fitted to it. An evaluation in which every hypothesis is confirmed should be read with suspicion.
Look at Model 2's two extreme cells.
The lowest verbatim run in the entire table, against 104 for the other two models on the same section.
A 210-word section with a 210-word verbatim run and 100% 8-gram overlap. The example column, reproduced in full, word for word.
Same model, same episode, same instruction. My original reading was not wrong about Act 2. It was wrong to think Act 2 was about the model.
That reframes the question. "Which model follows the paraphrase instruction" is the wrong thing to ask. "Which sections get copied, and what is different about them" is the right one, and it points at the examples rather than at the writers.
That reframing only became visible because the run covered all nine sections instead of the two that generated the hypothesis. It is the concrete argument for measuring the whole sample even when a pattern already looks obvious.
The outline's own editorial notes show that the example column was assembled from prior finished drafts. It is not a sketch. It is polished, on-voice, correctly paced copy: a shippable draft sitting in the column the writer is told to look at and not reproduce.
Instructing a model not to copy a passage that is already exactly what is wanted is close to an impossible brief. A section like Act 5, where the example is 210 words and the target is 210 words, leaves essentially no room to comply. The measurement is real, the number is real, and the most likely explanation is a design defect in my pipeline rather than disobedience in the models.
That leaves a decision, which is open at the time of publishing.
If polished examples are what the pipeline wants, reproduction is the expected outcome, and C5 should stop being a pass-or-fail compliance check. It becomes a divergence measurement: how far each writer moved from the reference, with no pass line attached.
Bullet fragments and tonal notes instead of finished prose, leaving the model something to actually write. Then C5 measures compliance meaningfully and the 22 of 27 figure becomes interpretable.
I have not chosen yet, and I would rather publish that honestly than resolve it quietly before anyone notices the ambiguity. Which option is taken determines whether "22 of 27" means anything at all.
Before the run, I pilot-labelled three real sections purely to find holes in my own criteria. Nothing from that pilot is reported as a result. Its output is a list of places where a second person applying my rubric would have had to guess.
It found five. One of them was serious. C2, the development criterion, was measuring prose form and calling it depth. The original version counted elaborating sentences per beat. One section rendered a four-item group as four one-line numbered items, mirroring the outline's own numbered layout. Under that criterion, four one-line items are four undeveloped beats and an automatic fail.
But a numbered set of tactics is good script writing, not padding.
The fix uses the outline's own nested structure, reading each level for what it is good at. Bullets give the coverage criterion an unambiguous unit. Groups give the development criterion the right unit for depth. A group rendered as a list is developed if its items supply a mechanism, a consequence, an example, a contrast or a qualification. A group rendered as prose is judged identically. Layout stops mattering, which was the point.
This is the part I would want to be judged on. Not the numbers. Any competent person can run an n-gram check. The skill being demonstrated is catching a criterion that produces confident, well-formatted, entirely wrong rankings, and catching it before it is pointed at real data rather than after someone else finds it.
The pilot also found three defects in the outline that feeds the models. These were worse in kind, because they mean parts of the rubric cannot be scored at all yet.
The outline has a beat list and an example column. Two writers tracked the example column and stopped where it stopped. The third followed the beat list, which continues further. Nothing says which one governs, so "missed a beat" and "followed the other column" are indistinguishable.
A named figure is assigned to Act 3 in the beat table, while an editorial note at the foot of the same document says her introduction was merged into Act 2. Two writers put her in Act 2. One did not. That single contradiction decides the additions criterion for two of three sections.
The row header says ~450 words, the verification block says ~420. The three sections came in at ~420, ~420 and ~450. A gate with two pass lines is not a gate.
Three models given the same outline resolved its internal contradictions differently. That is not a model difference. It is an instruction defect, and an evaluation built on top of it would have charged the outline's ambiguity to the writers.
Finding this is, I think, the most transferable part of the exercise. It only turns up when a rubric is applied to real production material instead of to a curated benchmark, and the fix belongs in the brief, not in the rubric.
An evaluation is as much what you refuse to report as what you report.
The judged criteria need a model judge validated against human labels, plus a second human labeller for the agreement ceiling. That work is specified in full and has not been run. Publishing a judge score without its validation would be the exact failure the protocol exists to prevent.
The tempting shortcut was to synthesise model outputs to enlarge the sample. Findings drawn from invented outputs would be fabricated research, so I used the 27 real outputs already sitting unused in one existing episode. Synthetic text appears here only as clearly-labelled test fixtures demonstrating the method.
I use Claude heavily, including on this rubric. It cannot serve as the human labeller: it is not human, it co-authored the criteria so it is not independent, and it shares a model family with one of the writers being graded. A model can be a second judge. It can never be a human one.
Every number is reported per criterion and per model. A single blended score would hide which criterion drove the result, and the breakdown is the part with information in it.
Volunteered limitations read as rigour. The same limitations found by a reader read as sloppiness.
In priority order, and the first item is not more measurement.
Published in full, inline. Open any document to read it on this page, or download the original file.
Public version. Part of the evaluation artifact. See the summary above for the results and the documents section for what is published and what is held back.
Scope: Act 1 sections. Not hooks, not later acts, not conclusions. Section type demonstrably changes what “adequate development” means, so the rubric does not claim to travel beyond the type it was calibrated on.
Three frontier models, spanning three different labs, each render the same Act 1 section from a shared outline produced in an earlier stage of the pipeline. The outline carries two relevant columns: a beat-by-beat column with example content, under an explicit instruction not to copy it word for word, and a structural column.
The writers are not generating substance. They are rendering supplied substance in their own words. The rubric measures rendering quality, not invention.
Given a fixed outline, which model produces the densest, best-developed Act 1 prose while following the paraphrase instruction.
Which model “writes better scripts.” The outline is held constant, so the comparison is of marginal variation on a fixed skeleton. That is a genuine strength, because most model comparisons are confounded by models choosing different structures, but it caps the claim and the cap has to be stated.
Written before any output was scored.
An Act 1 section is good when it covers every beat it was assigned, develops each one rather than merely asserting it, adds nothing the outline did not ask for, and does so in its own words rather than the outline’s.
Act 1 is the setup act. It carries more obligation to develop than a fifteen-second hook, and less than a body section. It is expected to move quickly. It is not expected to be a list.
Checked before quality scoring. Never contributes to the score.
The section meets the length required for video pacing.
Why this is a gate and not a criterion. Word count is the proxy that was already being gamed: writers hit the target by restating the same point in different words. Scoring length as quality would rebuild the exact incentive this rubric exists to remove, and would bake verbosity bias into the instrument. Length is a real production constraint, so it is checked. It is never rewarded.
List the beats assigned to this section in the outline. For each, mark whether it appears in the section as a distinct claim, regardless of wording. Fail if fewer than N of the assigned beats appear.
N is unset. It is calibrated on the pilot sample before any scoring run. See §7.Granularity comes from the outline, but the outline has to be read at the right level. The beat list is nested: headed groups containing bullets. The unit is the individual bullet, never the heading. One act in the pilot episode has 4 headed groups containing 15 bullets, and C1 reads completely differently at 4 than at 15.
Corrected after the pilot. An earlier draft of this rubric claimed the outline settled granularity by itself, so graders could not disagree. That was wrong. Nested structure leaves the unit ambiguous unless the rubric names the level.
Declared limitation: because the outline supplies the beats, C1 measures rendering fidelity, not the model’s capacity to generate substance. It would not transfer to a free-form writing task.
Revised after the pilot. The original version failed the best section in the sample. See “Why C2 was rewritten” below.
Assess development at the level of the beat GROUP, not the individual bullet. A group is the headed block in the outline.
A group is DEVELOPED if the section supplies at least two distinct elaborating moves across that group’s material, where a move is: a mechanism, a consequence, an example, a contrast, or a qualification. Moves count whether they appear in prose or in enumerated form. Fail if more than one third of the section’s groups are undeveloped.
Restating is not elaborating. Repeating a beat in new words supplies none of the five moves, so padding cannot pass, and length gains a section nothing.
Form is not depth. A numbered list item that states a mechanism is a mechanism. The criterion counts what the text supplies, never how it is laid out.
Declared limitations:
The original criterion counted elaborating sentences per bullet and failed any section where more than a third of bullets had fewer than two.
In the pilot, one section rendered a four-item group as four one-line numbered items, mirroring the outline’s own numbered layout. Under the original C2 that is four undeveloped beats and an automatic fail. But a numbered set of tactics is good script writing, not padding.
The result was that the original C2 failed the section with perfect outline coverage, no scope creep and full paraphrase compliance, while passing the two sections that copied the example column near-verbatim and overran into the next act’s material. The rubric was ranking prose form, not quality.
The fix uses the outline’s own structure. The beat list is nested, so each level is read for what it is good at: bullets give C1 an unambiguous unit for coverage, groups give C2 the right unit for depth. A group rendered as a list is developed if its items supply the moves. A group rendered as prose is judged the same way. Layout stops mattering, which is the point.
Consequence still to be checked: the three fixtures in the adversarial fixtures were built against the original C2. T3 (breadth-padded) has to be re-verified against this revision. It should still fail, because twelve one-line assertions with no mechanism, consequence, example, contrast or qualification leave every group undeveloped. That expectation is a prediction, not a result, until it is actually run.
Removed from the text rubric. Checked at the research stage against the production research document, not against the script.
Why. Act 1 sections make hard factual claims (dates, percentages, named people) and carry no citations, because scripts do not carry citations. Applied to script text, C3 fails every section from every model, which makes it useless rather than strict. The claim’s correctness is a property of the research that fed the outline, and that is where it has to be checked.
Identify any material in the section that does not correspond to a beat in the outline. Classify each as either a transition (connective material serving assigned beats) or scope creep (new claims, teases, or arguments the outline did not ask for). Fail if the section contains any scope creep.
Why this exists. C1 counts what should be there. C4 catches what should not. Without it, a model that adds three unrequested claims looks identical to one that followed the brief, and in the labelled sample one model’s extra material was mostly appended closing teases.
Declared limitation: the transition versus scope-creep line is a judgement call and is expected to be the lowest-agreement criterion in the set. It is kept because the distinction matters to production, and its disagreement rate is reported rather than hidden.
Compute the longest common contiguous word sequence and the proportion of overlapping 8-grams between the section and the outline’s example column for the corresponding beats. Fail if any single verbatim run exceeds 12 words, or if more than 10% of the section’s 8-grams appear in the example column.
Why this exists. The pipeline already instructs writers not to copy the example column word for word. Nobody was measuring compliance. It is the only criterion in the set that is fully mechanical, and therefore free to run on every sample.
Hypothesis, stated in advance and refuted by the run. The prediction was: two of the three writers hew close to the example column while the third paraphrases further.
Result: wrong. The model identified as the paraphraser fails more sections than the other two, 8 of 9 against 7 of 9. 22 of 27 sections fail C5, and copying tracks the section rather than the model. Full results in the full C5 results.
Pre-registering the hypothesis was deliberate, and its refutation is the more valuable outcome. A prediction that survives is evidence. A prediction that is published and then reported as wrong is proof the prediction preceded the data rather than being fitted to it.
Confound found by the run, which may invalidate C5 as a compliance check: the example column is finished, on-voice, shippable prose assembled from prior drafts, not a sketch. Instructing a model not to copy a passage that is already exactly what is wanted is close to an impossible brief. See the full C5 results §4.
Declared limitations: both thresholds (12 words, 10%) are author-chosen and not derived. N-gram overlap detects copying, not close paraphrase that reuses structure while changing every word.
The section addresses the topic and audience the outline specifies, and does not drift into a different framing. Fail if the section’s framing could not be predicted from the outline.
Expected to pass almost always, since the outline is prescriptive. It is retained as a guard rather than a discriminator: a criterion that catches a rare catastrophic failure earns its place even when it almost never fires.
| Criterion | Grader | Cost | Runs on |
|---|---|---|---|
| G1 length | Code | free | every sample |
| C5 paraphrase | Code | free | every sample |
| C1 coverage | Model, human-validated | per call | every sample |
| C2 development | Model | per call | every sample |
| C4 additions | Model finds, human classifies | per call plus human time | every sample |
| C6 on brief | Model | per call | every sample |
Principle: the cheapest grader that can do the job. Code is free and deterministic, so it runs on everything. Model graders cost money and vary between calls, so they are spent where judgement is genuinely required. Human time is scarcest and is spent validating the judge and reading disagreements, never on bulk grading.
One episode. All sections. Three models. 27 real outputs, at zero additional generation cost.
Generating new episodes costs real API spend, so the run uses data that already existed. The episode already had nine sections (a hook, five acts, a checkpoint, a story beat and a call to action), each written by all three models. That is a genuine dataset that was sitting unused.
Tier 1: C5 paraphrase compliance, across all 27 sections. C5 compares each section to its own example column, so it is section-type agnostic: it works on the hook and the call to action exactly as well as on Act 2. It is a code check, so it needs no judge, no blind protocol, no human labeller and no agreement statistics.
This is the tier that could be finished and published quickly, and it carries the pre-registered hypothesis. It is the tier reported in this artifact.
Tier 2: C1, C2, C4 and C6, on the Act sections only. These need judgement, so they need the judge and a second human labeller. Restricted to sections of a single type at a time, since C2’s thresholds are type-specific. Tier 2 has not been run and nothing about it is reported here.
These are real limitations and they are the price of not spending weeks and an API budget. A narrow finding published honestly beats a broad one that never ships, but the narrowness has to be on the page, not left for a reader to work out.
Reported per model: result per criterion per section, with raw counts. Never a single composite score.
N in C1 at the threshold that separates sections judged adequate from sections judged thin. If no such threshold exists, C1 is not discriminative and has to be reworked rather than tuned.The pilot exists so that the second human labeller is not spent on a rubric that still has holes in it.
Full procedure and the judge prompt: the judge protocol.
What has to be true before any judge output is reported:
Published in full. Volunteered limitations read as rigour. The same limitations found by a reader read as sloppiness.
Design
N, one third, 12 words, 10%) are author-chosen judgements, not derived values.Scope
Scale
Measurement
Prior-work context
Public version, and it has to be public. The generated scripts stay private, so a reader cannot check the conclusions. Only the method. This document and the rubric are what the artifact rests on.
Status: this protocol governs Tier 2 (the judged criteria C1, C2, C4 and C6). Tier 2 has not been run. Nothing in this document is a result. It is the procedure, published in advance, so that the numbers it eventually produces can be checked against the design that was committed to beforehand.
The three candidate writers span three different labs, so no obvious frontier judge is neutral. Two runs, both reported:
| Run | Judge | Purpose |
|---|---|---|
| Primary | A model from a fourth family (for example Mistral Large, Llama, DeepSeek or Qwen) | The headline scoring run. No family overlap with any candidate. |
| Bias measurement | One judge per candidate family, all three | Measures how much each judge favours its own sibling. |
The question this design answers: does the ranking survive changing the judge? A stable ranking across all four judges is a robustness finding and strengthens the primary result. A ranking that flips depending on who judges is a more interesting result and probably the headline. Publishable either way, which is the point.
Report per judge, never averaged into a single number. Averaging would hide precisely the effect being measured.
Used verbatim. Any change requires re-validation.
Revision note. An earlier version of this prompt counted elaborating sentences per individual beat, matching the original C2. The pilot showed that criterion was measuring prose form rather than depth, and C2 was rewritten to grade at beat-group level (see the rubric §4). The prompt below has been brought into line with the revised C2. Because Tier 2 has not been run, no agreement figure has ever been reported against either version.
You are grading a single Act 1 section of a video script against a fixed rubric.
You will be given:
1. The outline beats assigned to this section, organised into headed groups.
2. The outline's example text for those beats.
3. The section to grade.
Rules:
- Apply only the criteria given. Do not import your own taste about what makes
writing good.
- Do not reward or penalise length. A longer section is not a better section.
- Do not reward or penalise layout. Prose and enumerated lists are judged by
what they supply, never by their form.
- Work through the analysis steps in order and write them out BEFORE giving any
verdict. Do not state a verdict early and justify it afterwards.
- If a criterion is genuinely ambiguous for this section, say so explicitly and
mark it AMBIGUOUS rather than guessing.
=== ASSIGNED BEATS ===
{beat_list}
=== OUTLINE EXAMPLE TEXT ===
{example_column}
=== SECTION TO GRADE ===
{section_text}
=== ANALYSIS (complete in order, before any verdict) ===
STEP 1 - Beat coverage.
For each assigned bullet, quote the sentence or sentences in the section that
express it, or write ABSENT. Wording will differ from the outline; judge on
meaning, not phrasing.
STEP 2 - Development, by beat GROUP.
The assigned beats are organised into headed groups. Work group by group, not
bullet by bullet.
For each group, list every elaborating MOVE the section supplies across that
group's material. A move is exactly one of five things:
MECHANISM - how something works or why it follows
CONSEQUENCE - what resulted from it
EXAMPLE - a specific instance of it
CONTRAST - a comparison, counter-case or reversal
QUALIFICATION - a limit, caveat or exception
For each move, quote the text supplying it and name which of the five it is.
A sentence that restates a beat in different words is NOT a move.
Moves count whether they appear in prose or in an enumerated list.
Then state per group: DEVELOPED (2 or more moves) or UNDEVELOPED (fewer than 2).
STEP 3 - Additions.
List any material in the section that does not correspond to an assigned beat.
For each, classify as TRANSITION (connective material serving assigned beats) or
SCOPE_CREEP (a new claim, tease or argument the outline did not ask for).
STEP 4 - Framing.
State the topic and audience the section is written for. Could that framing have
been predicted from the outline? YES or NO.
=== VERDICTS ===
C1_COVERAGE: <number of bullets present> of <total bullets assigned>
C2_DEVELOPMENT: <number of UNDEVELOPED groups> of <total groups>
C4_ADDITIONS: PASS if no SCOPE_CREEP, otherwise FAIL
C6_ON_BRIEF: PASS or FAIL
AMBIGUOUS: <list any criterion you could not apply confidently, or NONE>
Reasoning before verdict is not a style preference. A model conditions each token on what came before, so a verdict stated first turns everything after it into post-hoc justification, which will read as convincing. Reasoning first means the verdict is conditioned on the analysis. Same words, opposite causality.
Every step produces an artifact before a judgement. Quoted sentences, named moves, a classified list. When judge and human disagree you compare artifacts and see exactly where the divergence happened, instead of two parties trading opinions.
The judge returns counts, not pass or fail, for C1 and C2. Thresholds are applied afterwards in code. A threshold can then be changed without re-running the judge, and the threshold decision stays with the rubric author rather than being delegated to the model.
Naming the move type is not decoration. Forcing the judge to classify each move into one of five named categories is what stops “it elaborates” from being asserted. A move that cannot be named is not counted, which is the mechanism that keeps decorative elaboration from passing quietly.
AMBIGUOUS is a permitted answer. A judge forced to guess produces confident noise. An ambiguity rate is itself a measurement of rubric quality.
C5 and G1 never reach the judge. They are code checks.
Run in this order. The order is the safeguard.
N for C1 from the pilot.Percent agreement and Cohen’s kappa. Not correlation. The criteria are binary, and correlation is for scales.
Kappa matters here specifically: if 90% of sections pass a criterion, a judge that stamps PASS on everything scores 90% raw agreement while being worthless. Kappa corrects for agreement expected by chance and exposes that.
Not 100%. Human to human agreement. If two careful people applying this rubric agree 78% of the time, a judge agreeing with the author 85% of the time is performing above the task’s own consistency, and pushing for 95% would mean the judge is more consistent than the task actually is.
If no second labeller can be found, the report has to state plainly: “Single labeller. No inter-human baseline was established, so judge agreement cannot be calibrated against the task’s own ceiling.” That sentence is not a weakness in the write-up. Omitting it would be.
Iterating the judge prompt is expected. Reporting agreement on the sample used for tuning is not. Either hold out a fresh set for the reported number, or state explicitly that iteration occurred and on which sample.
Aggregate agreement can look healthy while the judge fails the one job it exists for, because most real sections are not padded and it gets those right.
Run the judge on the three fixtures in the adversarial fixtures, which are matched to roughly 300 words each so length cannot explain any difference:
| Fixture | Engineered flaw | Judge must return |
|---|---|---|
| T1 Dense | none, control | C1 pass, C2 pass |
| T2 Repetition-padded | restates the same points | C1 fail |
| T3 Breadth-padded | many claims, none developed | C1 pass, C2 fail |
A judge that misses T2 or T3 is not usable, whatever its aggregate agreement score. Report the result per fixture, never averaged: catching repetition padding but missing breadth padding is a specific, nameable weakness that an average would conceal.
This test matters most for C2, because a verbosity-biased judge conflates more text with more elaboration. That failure mode would reward exactly the padding C2 exists to catch.
Tier 2 has not been run. This is the shape the report will take, published in advance so the eventual numbers cannot be selectively framed.
JUDGE
primary judge <model, version, date>
bias-measurement judges <three models, versions>
prompt frozen, published verbatim above
iterations <n, and on which sample>
VALIDATION
pilot sample 6 sections
validation sample <n> sections
human-human agreement <%> k = <k> [or: NOT ESTABLISHED, single labeller]
judge-human agreement <%> k = <k> per criterion
ambiguity rate <%> of criterion applications marked AMBIGUOUS
ADVERSARIAL FIXTURES
T1 dense <pass/fail vs expected>
T2 repetition-padded <pass/fail vs expected>
T3 breadth-padded <pass/fail vs expected>
RESULTS (per model, per section, across the Act sections of the run)
C1 coverage <pass rate, raw counts>
C2 development <pass rate, undeveloped-group counts>
C4 additions <pass rate, scope-creep instances>
C5 paraphrase <pass rate, max verbatim run, 8-gram overlap %>
C6 on brief <pass rate>
G1 length (gate) <pass rate, reported separately>
RANKING STABILITY
ranking under primary judge <order>
ranking under each family judge <order x 3>
self-preference effect <per judge, toward its own family>
Report every number per criterion and per model. A single composite score would hide which criterion drove the result, and the per-criterion breakdown is the part with information in it.
Public version. Written after the pilot found three defects in the outline, not in the models. These are fixes to the outline template, not to the rubric. Until they are applied, C4 and G1 cannot be scored at all.
Episode specifics are removed throughout. The defects are structural and survive the removal intact.
Three models were given the same outline and resolved its internal contradictions differently. That is not a model difference. It is an instruction defect, and any evaluation run on top of it would attribute the outline’s ambiguity to the writers.
An outline that can be read two ways is not a controlled brief.
This is the part of the exercise that is easy to skip. It is much more comfortable to grade the models than to discover that the instrument handing them their work is inconsistent with itself. The pilot found the defects only because the criteria were applied to real production data rather than to a curated sample.
Problem. The outline has a What to Include column (the assigned beats) and an Example column (sample prose). Two of three writers tracked the Example column and stopped where it stopped. The third followed the beat list, which continues further. Nothing in the document says which one governs.
Fix. Add this block to the top of every outline:
COLUMN AUTHORITY
What to Include = the assignment. Every beat listed here must appear.
Example = illustration only. Never copy it. It is not the assignment,
and it is not a completeness signal: it may be shorter than
the beat list.
Synthesis Decisions = editorial commentary, written after the fact.
NOT instructions. Writers must ignore this block.
That last line matters most. See Fix 2.
Problem. The What to Include column for ACT 2 does not mention a particular named figure. ACT 3 assigns her explicitly. But the Synthesis Decisions block at the foot of the same document says:
[original, ACT 2 integration] Merged her introduction into ACT 2 (not split across ACT 2 and ACT 3)...
Two of three writers put her in Act 2. One did not. The same document supports both behaviours, so it is impossible to say whether that is scope creep or obedience. This single contradiction decides C4 for two of the three sections.
Fix, and it is an editorial call rather than a technical one. Pick one and make the beat table match:
What to Include, remove them from ACT 3, and rebalance both word counts.Recommendation: Option B, if the merge was a real editorial decision. The note reads like one, and it describes a deliberate narrative choice worth keeping. But the decision has to live in the beat table, not in a commentary block the writers were never told to read.
The general rule: if an editorial decision changes what a writer should produce, it belongs in What to Include. If it does not, it belongs nowhere the writer can see.
Problem. ACT 2’s row header says ~450 words. The verification block at the foot of the same outline says ACT 2: ~420. The three sections came in at ~420, ~420 and ~450, so the writers picked different targets from the same document.
Fix. The row header is authoritative. Regenerate the verification block from the row headers rather than maintaining it by hand, so the two cannot drift apart.
Until this is fixed, G1 is unscoreable. A gate with two different pass lines is not a gate.
Problem. Beats are nested: headed groups containing bullets. One act in the pilot episode has 4 headed groups containing 15 bullets. C1 counts beats, and the count is 4 or 15 depending on how the outline is read.
Fix. Number the groups and bullets explicitly. Illustrated below on the neutral demonstration topic used by the fixtures in the adversarial fixtures, so the convention can be shown without publishing production material:
ACT 1 - assigned beats
A. THE PROBLEM
A1. 1937: shoppers carry hand baskets
A2. A full basket is heavier than most people will carry
A3. When the basket gets heavy, the shopping trip ends
A4. Every heavy basket is a sale that never happened
B. THE INVENTOR
B1. Store owner in Oklahoma City notices the pattern
B2. Diagnoses it as a physical limit, not a demand limit
B3. Builds a wheeled cart from a folding chair frame
B4. Solves the engineering problem completely
C. THE REJECTION
C1. Nobody uses it
C2. Men refuse: pushing a cart reads as weak
C3. Women refuse: it resembles pushing a pram
C4. The social problem is harder than the engineering one
D. THE FIX
D1. Hires actors of both sexes and various ages to push carts
D2. Places a greeter at the door to hand out carts
D3. Refusing now means refusing a person, not an object
D4. Within a year the carts are never idle
Why this is worth doing. It gives the rubric an unambiguous unit at both levels: bullets for coverage (C1), groups for development (C2). It also makes grading machine-checkable, because a grader can return A1: present, A2: present, C4: absent instead of prose. And it costs nothing at authoring time.
These are template changes, so they apply to every future episode. The pilot episode can be retro-fitted by hand for the run, or simply excluded from C4 and G1 scoring with the reason stated.
This document is part of the artifact on purpose. “The evaluation found defects in the instrument that produces the work, not only in the work” is a stronger finding than a model ranking, and it is the kind of thing that only turns up when someone actually applies a rubric to real production data instead of to a benchmark.
Public version. Three purpose-built test sections, published in full so a reader can see the criteria operating rather than taking the author’s word for it.
These are test fixtures. They are not pipeline output and they are not findings. They were written as test material, on a neutral topic, tied to no channel and no client.
The real generated scripts stay private. That leaves a reader unable to see the criteria actually working, and “trust me, I applied it” is the weakest sentence in any evaluation. Fixtures solve that: they can be published in full.
There is a second reason, independent of privacy. Real data gives you the distribution. Constructed cases probe specific failure modes on demand. Each case below is engineered to trip exactly one criterion, which is how you find out whether a criterion works at all.
Content is illustrative and not fact-checked. This is deliberate and does not weaken the fixtures, because C1 and C2 measure structure, not truth: claim distinctness and depth of treatment. Factual accuracy is C3’s job and is checked separately against the production research document. Do not cite these as history.
Three sections on one brief, matched to roughly 300 words each, so that length cannot explain any score difference. Length matching is the point. It is what stops a verbosity-biased judge from passing the test by accident.
| Case | Engineered flaw | Expected C1 | Expected C2 |
|---|---|---|---|
| T1 Dense | none, this is the control | Pass | Pass |
| T2 Repetition-padded | restates the same points in new words | Fail | Pass, on the few real claims |
| T3 Breadth-padded | many claims, none developed | Pass | Fail |
T2 and T3 are the two padding modes, separated. A judge that catches one and not the other is only half working, and an aggregate agreement score would hide that.
Brief used for all three: Act 1 opening, roughly 300 words, on how the shopping cart was adopted.
Status note. These fixtures were written against the original C2, which counted elaborating sentences per bullet. C2 has since been rewritten to grade at beat-group level. T3 is expected to still fail C2 under the revision, because twelve one-line assertions supply no mechanism, consequence, example, contrast or qualification, leaving every group undeveloped. That is a prediction, not a result, until it is run.
Picture a grocery store in 1937. You are carrying a wire basket that cuts into your fingers, and it is half full, because half full is all you can lift. When it gets heavy, you stop shopping. You go and pay.
That last sentence was the whole problem, and one store owner was the only person who noticed it. Sylvan Goldman ran a chain in Oklahoma City, and he worked out that his customers were not leaving because they had everything they needed. They were leaving because their arms hurt. Every basket that got heavy was a sale that never happened.
So he built a cart: two wire baskets on a folding frame with wheels, borrowed from the folding chair in his office. By any reasonable measure it was a good idea. It solved a real problem that was costing him real money.
Nobody used it.
Men refused, because pushing a cart looked weak and they were not going to be seen doing it. Women refused too, because after years of pushing prams they had no appetite for pushing another one around a shop. Goldman had solved the engineering problem and walked straight into a social one, and the social one was harder.
His fix was to lie. He hired actors, men and women of different ages, and paid them to push carts around his stores looking perfectly content. He put a greeter at the door to hand a cart to every arriving customer, so refusing meant refusing a person rather than an object. Within a year the carts were never idle.
The shopping cart did not win because it was better. It won because Goldman manufactured the appearance that everyone else had already accepted it.
Picture a grocery store in 1937. You are carrying a wire basket, and it is heavy. It is genuinely heavy, the kind of heavy that you feel. Baskets in those days were heavy things to carry, and carrying them was hard work.
When the basket got heavy, shoppers stopped shopping. They would stop. The weight made them stop. Once a basket became too heavy to carry comfortably, the shopping trip was effectively over, because nobody wants to carry something uncomfortable. So they went and paid, and that was the end of it.
One store owner noticed this. Sylvan Goldman ran a chain in Oklahoma City, and he noticed what was happening in his stores. He saw the problem clearly. He understood it. He recognised that something was going wrong, and he was the one who spotted it when others had not.
So he built a cart. It was a cart, with wheels, designed for carrying shopping. The idea was that the cart would carry the things the basket had been carrying, so the customer would not have to.
It was a good idea. It was, in fact, a very good idea, and a sensible one, and it addressed something real. Good ideas like this one deserve to succeed.
Nobody used it. People did not use it. Adoption was essentially zero, and the cart sat there unused, because customers were not using it.
Goldman had a problem on his hands. The problem was that his solution was not being taken up, which is a problem when you have built something and nobody takes it up. He had built the thing. The thing was not being used. That was the situation he found himself in as 1937 went on.
Picture a grocery store in 1937. Shoppers carried wire baskets. The baskets were small. They cut into your fingers. Most people could manage about fifteen pounds. Heavy baskets ended shopping trips early. Lost sales followed.
Sylvan Goldman ran a chain in Oklahoma City. He noticed the pattern. He had a background in retail. His stores were doing reasonably well. He wanted them to do better.
He built a cart. It used a folding frame. The design came from a folding chair. It held two wire baskets. It had four wheels. It could be stacked for storage. It cost very little to make. He patented it.
Nobody used it. Men thought it looked weak. Women associated it with prams. Older shoppers found it unfamiliar. Staff were unsure how to explain it. The carts sat by the entrance. Weeks passed.
Goldman hired actors. They pushed carts around the stores. They looked relaxed. They were different ages. Some were men. Some were women. He also hired a greeter. The greeter stood at the door. The greeter handed out carts.
It worked. Adoption climbed. Within a year the carts were in constant use. Stores had to buy more. Other chains copied the design. Goldman licensed it. He became wealthy. The cart got bigger over the following decades. Average basket size grew with it. Supermarkets redesigned aisles around cart width. The layout of retail changed permanently.
The lesson is about social proof. People follow other people. Objects need permission before they get adopted. Engineering was never the hard part. The hard part was persuasion. Goldman understood this before most people did. That insight was worth more than the patent.
Public version. Run 2026-07-31 via the measurement code, published in full. Deterministic, no model calls, no API cost. One episode, nine sections, three models = 27 measurements. Thresholds: longest verbatim run greater than 12 words, or 8-gram overlap greater than 10%, fails a section. Either condition alone is sufficient. Mandated brand phrases are stripped from both texts before comparison. Three phrases: a required signature opening, a presenter self-identification, and a branded sign-off. Reproducing those is compliance with the outline, not copying. The phrases themselves are not published. Writers appear as Model 1, 2 and 3. The mapping to named models is not published, because the finding is not a model ranking.
Each cell is longest verbatim run in words / proportion of the section’s 8-grams also present in the example column.
| Section | Model 1 | Model 2 | Model 3 |
|---|---|---|---|
| HOOK | 5 / 0.0% PASS | 7 / 0.0% PASS | 5 / 0.0% PASS |
| ACT 1 | 49 / 38.3% FAIL | 44 / 22.8% FAIL | 49 / 29.3% FAIL |
| ACT 2 | 104 / 64.4% FAIL | 21 / 25.7% FAIL | 104 / 61.4% FAIL |
| CHECKPOINT | 23 / 43.2% FAIL | 21 / 46.7% FAIL | 23 / 43.2% FAIL |
| ACT 3 | 54 / 36.0% FAIL | 75 / 65.1% FAIL | 38 / 26.3% FAIL |
| STORY BEAT | 40 / 86.8% FAIL | 32 / 75.8% FAIL | 25 / 62.5% FAIL |
| ACT 4 | 70 / 50.5% FAIL | 66 / 41.4% FAIL | 58 / 44.1% FAIL |
| ACT 5 | 94 / 55.3% FAIL | 210 / 100.0% FAIL | 94 / 55.3% FAIL |
| CALL TO ACTION | 6 / 0.0% PASS | 11 / 16.7% FAIL | 6 / 0.0% PASS |
| Fail rate | 7 of 9 (78%) | 8 of 9 (89%) | 7 of 9 (78%) |
22 of 27 sections fail.
Written into the rubric before this data was seen:
“Two of the three writers hew close to the outline’s example column while the third paraphrases further.”
Wrong. The model identified as the paraphraser, on the evidence of Act 1 and Act 2, fails more sections than the other two: 8 of 9 against 7 of 9. The inference generalised from two sections to nine, and nine sections disagreed.
This is reported first, and prominently, on purpose. A refuted pre-registration is worth more than a confirmed one. It demonstrates that the prediction preceded the data rather than being fitted to it, and it is the clearest available evidence that the evaluation was not steered toward a convenient story. An evaluation whose every hypothesis is confirmed should be read with suspicion, not admiration.
The same model copies heavily in one section and paraphrases well in another.
The same model produced both. “Which model follows the paraphrase instruction” is therefore the wrong question. The better one is “which sections get copied”, and the pattern points at the examples rather than at the models. That reframing is the single most useful thing this run produced, and it is a direct consequence of measuring all nine sections instead of the two that prompted the hypothesis.
All three models pass HOOK once the mandated signature phrases are stripped: runs of 5 to 7 words, 0% overlap. Given a one-line brief and three short example variants, all three wrote genuinely original copy.
The call to action is the threshold-sensitivity case. Models 1 and 3 pass cleanly (run 6, 0%). Model 2 fails on overlap alone: its run of 11 words is under the 12-word limit, but 16.7% overlap is over the 10% limit. A single marginal fail driven by one of two thresholds is a useful reminder that both numbers are author-chosen judgements, not derived values.
This is the most important caveat in the report, and it is why the headline is not “the models disobeyed.”
The outline’s own Synthesis Decisions block shows the example column was assembled from prior complete drafts. It is polished, on-voice, correctly paced copy. Not a guideline, but a shippable draft.
Instructing a model not to copy a passage that is already exactly what is wanted is close to an impossible brief. This is plausibly a pipeline design finding rather than a model compliance failure.
Option 2 makes C5 a real criterion. Option 1 keeps the current pipeline and drops the pretence that the instruction is being followed. This decision is open at the time of publication. It is recorded here rather than resolved quietly, because which option is chosen determines whether the 22 of 27 figure means anything at all.
Defensible:
“Across one episode of nine sections, three frontier models reproduced the outline’s example prose beyond a 12-word verbatim threshold in 22 of 27 sections. Copying tracked the section rather than the model, and one section was reproduced in full. The example column consists of finished prose, which the report treats as the likeliest cause.”
Not defensible: any statement ranking the models on instruction-following, any pass rate presented as generalising beyond this episode, and any claim that the models “ignored” the instruction without noting the confound.
The C5 check exactly as run. No model is called: it is deterministic text measurement, so it returns the same numbers every time.
/**
* C5 - paraphrase compliance check.
*
* Measures how closely each generated section reproduces the outline's Example
* column for that same section.
*
* Two measures per section:
* 1. longest verbatim run - longest continuous sequence of matching words
* 2. 8-gram overlap - proportion of the section's 8-grams that also
* appear in the example text
*
* C5 fails a section if EITHER the longest verbatim run exceeds MAX_RUN words,
* or 8-gram overlap exceeds MAX_OVERLAP.
*
* Mandated brand phrases (a required signature opening, a presenter
* self-identification, and a branded sign-off) are stripped from BOTH texts
* before comparison. Reproducing them is compliance with the outline, not
* copying; leaving them in would report the hook as the worst offender in the
* script. The phrases live in mandated_phrases.txt, one per line, which is not
* published.
*
* PUBLIC RELEASE NOTE
* This is the measurement code exactly as run. The two input files it reads,
* sections.md (generated script sections) and examples.md (the outline's
* example column), are production material and are NOT published, so the
* published numbers can be audited for method but not re-run. Both are plain
* markdown in the formats parsed below, so the script runs against any
* equivalent pair.
*
* Where a section has several example variants, the section is compared against
* EACH variant and the WORST result is kept: a writer copying variant 2 is
* copying regardless of what variants 1 and 3 say.
*
* No model is called. This is a deterministic text measurement.
*
* Usage: node c5-paraphrase-check.mjs
*/
import { readFileSync, existsSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
const HERE = dirname(fileURLToPath(import.meta.url));
const MAX_RUN = 12; // words
const MAX_OVERLAP = 0.10; // proportion
const NGRAM = 8;
function loadMandated() {
const f = join(HERE, "mandated_phrases.txt");
if (!existsSync(f)) return [];
return readFileSync(f, "utf8")
.split(/\r?\n/)
.map((l) => l.trim())
.filter((l) => l && !l.startsWith("#"));
}
/** Parse "# SCRIPT X" / "## SECTION" into { script: { section: text } }. */
function parseSections(path) {
const out = {};
let script = null, sec = null, buf = [];
const flush = () => {
if (script && sec) {
out[script] ??= {};
out[script][sec] = buf.join("\n").trim();
}
};
for (const line of readFileSync(path, "utf8").split(/\r?\n/)) {
if (/^# (?!#)/.test(line)) { flush(); buf = []; script = line.slice(2).trim(); sec = null; }
else if (/^## (?!#)/.test(line)) { flush(); buf = []; sec = line.slice(3).trim(); }
else buf.push(line);
}
flush();
return out;
}
/** Parse "## SECTION" / "### VARIANT n" into { section: [variant, ...] }. */
function parseExamples(path) {
const out = {};
let sec = null, buf = [];
const flush = () => {
if (sec) {
const t = buf.join("\n").trim();
if (t) (out[sec] ??= []).push(t);
}
};
for (const line of readFileSync(path, "utf8").split(/\r?\n/)) {
if (/^## (?!#)/.test(line)) { flush(); buf = []; sec = line.slice(3).trim(); }
else if (/^### /.test(line)) { flush(); buf = []; }
else buf.push(line);
}
flush();
return out;
}
function normalise(s, mandated) {
let t = s.toLowerCase();
for (const p of mandated) t = t.split(p.toLowerCase()).join(" ");
t = t.replace(/[‘’“”—–]/g, " ");
t = t.replace(/[^a-z0-9\s]/g, " ");
return t.replace(/\s+/g, " ").trim();
}
/** Longest common contiguous word sequence. */
function longestRun(a, b) {
if (!a.length || !b.length) return { len: 0, text: "" };
let prev = new Array(b.length + 1).fill(0);
let best = 0, bestEnd = 0;
for (let i = 1; i <= a.length; i++) {
const cur = new Array(b.length + 1).fill(0);
const ai = a[i - 1];
for (let j = 1; j <= b.length; j++) {
if (ai === b[j - 1]) {
cur[j] = prev[j - 1] + 1;
if (cur[j] > best) { best = cur[j]; bestEnd = i; }
}
}
prev = cur;
}
return { len: best, text: a.slice(bestEnd - best, bestEnd).join(" ") };
}
function ngrams(ws, n) {
const s = new Set();
for (let i = 0; i + n <= ws.length; i++) s.add(ws.slice(i, i + n).join(" "));
return s;
}
function compare(sectionText, exampleText, mandated) {
const a = normalise(sectionText, mandated).split(" ").filter(Boolean);
const b = normalise(exampleText, mandated).split(" ").filter(Boolean);
const run = longestRun(a, b);
const ga = ngrams(a, NGRAM), gb = ngrams(b, NGRAM);
let hit = 0;
for (const g of ga) if (gb.has(g)) hit++;
return { words: a.length, run: run.len, runText: run.text, overlap: ga.size ? hit / ga.size : 0 };
}
const pad = (s, n) => String(s).padEnd(n);
const padL = (s, n) => String(s).padStart(n);
function main() {
const mandated = loadMandated();
const scripts = parseSections(join(HERE, "sections.md"));
const examples = parseExamples(join(HERE, "examples.md"));
console.log(`C5 paraphrase compliance MAX_RUN=${MAX_RUN} MAX_OVERLAP=${(MAX_OVERLAP * 100).toFixed(0)}% n-gram=${NGRAM}`);
console.log(`mandated phrases excluded: ${mandated.length}\n`);
const header = pad("script", 12) + pad("section", 16) + padL("words", 6) + padL("run", 6) + padL("8gram", 8) + " verdict";
console.log(header);
console.log("-".repeat(header.length));
const totals = {};
for (const [script, secs] of Object.entries(scripts)) {
for (const [sec, body] of Object.entries(secs)) {
const variants = examples[sec];
if (!variants) { console.log(pad(script, 12) + pad(sec, 16) + padL("", 6) + padL("", 6) + padL("", 8) + " NO EXAMPLE"); continue; }
let worst = null;
for (const v of variants) {
const r = compare(body, v, mandated);
if (!worst || r.run > worst.run || (r.run === worst.run && r.overlap > worst.overlap)) worst = r;
}
const fail = worst.run > MAX_RUN || worst.overlap > MAX_OVERLAP;
(totals[script] ??= []).push(fail);
console.log(pad(script, 12) + pad(sec, 16) + padL(worst.words, 6) + padL(worst.run, 6) + padL((worst.overlap * 100).toFixed(1) + "%", 8) + " " + (fail ? "FAIL" : "pass"));
if (fail) console.log(" ".repeat(34) + `longest run: "${worst.runText.slice(0, 100)}..."`);
}
console.log("");
}
console.log("summary");
console.log("-".repeat(48));
for (const [script, v] of Object.entries(totals)) {
const f = v.filter(Boolean).length;
console.log(pad(script, 12) + `${f} FAIL of ${v.length} sections (${Math.round((f / v.length) * 100)}%)`);
}
}
main(); Giga Production Studio is public and has its own case study. What stays private is the channel it produces: the channel's name, its presenter, and the three mandated brand phrases that identify it on screen. Those phrases are described by category above and never quoted.
The generated scripts and the outline are production material and are not published either, so the documents below describe the outline's structure rather than its content. Writers appear as Model 1, 2 and 3, and the mapping to named models is not published, because the finding is not a model ranking.
For a rubric-design credential the rubric is the artifact and the scripts are only the substrate, which is why the method is published in far more detail than the data. The cost of that choice is stated in the limitations: a reader can audit how the numbers were produced but cannot reproduce them.
Running the numbers is the easy half. Deciding what good means is the hard one, and that is what twenty years across 3D, VFX, design and shipped software buys. If that is the problem in front of you, I would like to hear about it.