Judgment or code
Decide per OUTPUT, and write its acceptance rule down the way the operator would state the goal,
never in the phrasing that makes your preferred tool fit.
The failure this prevents is not choosing wrong once. It is choosing by habit: reaching for a regex
because regexes are cheap and testable, or reaching for a model because models feel smart, and then
writing the acceptance rule backwards from the tool you already picked.
The three failures this was written after
Read these first. Each rule below is one of them generalised.
- 203 vacuous outreach hooks. A cheap model was asked to "be specific" about companies whose
input records differed only in trivia. The model was not the problem; the grounding was. Every
hook passed the check "mentions the company", and every hook was garbage.
- 48 of 50 "confirmed" profile URLs were wrong. Confirmation rested on a name-only string match
against the claim's own subject. N fields scraped from one source is one signal, not
corroboration.
- A 200-word name blocklist still misfiring on real names. Every miss produced another entry. A
list that keeps growing to chase an open boundary is judgment mechanised, and it never converges.
The nine
Code owns the checkable; checkable never certifies quality. Exact match, schema, enum,
arithmetic, state, or a finite table the business maintains as policy: code. But passing a
mechanical check never makes creative output good. "mentions the city" passes, and is garbage.
An LLM judge owns every open meaning boundary. Semantic failure (vacuous, wrong entity, off
topic) in an open-ended category goes to a judge model with a written rubric plus real failing
examples. Closed policy registries are code plus normalisation. Try the cheaper exits first:
normalise the input, fix the source data, drop the unreliable feature.
Grounding before model tier, and the difference must be usable. Two subjects must receive
inputs that differ in material a writer could actually build the intended output from.
Differentiated trivia is still starvation. Fix what is fetched before touching the prompt or the
model.
Judge creative batches against sampled siblings, plus the class definition. Could whoever the
output lands on tell it was made for them? Is it welcome, rather than merely identifying? Does it
share a skeleton with its siblings? Per-row judging of a batch product is a blind spot: each row
passes, and the batch is obviously machine-made.
Real-world claims need evidence that could disagree. N fields scraped from the claim's own
subject are one signal. Confirmed requires independent corroboration or a first-party
authoritative source; otherwise the state is unconfirmed or conflicting: first-class,
visible, and never rounded up downstream.
Verdicts are categorical, with the evidence tied to the decision. Code thresholding a model's
own uncalibrated score is judgment laundering. A genuinely calibrated probability is evidence; the
default is a category plus a quoted reason.
Hard invariants stay mechanical. Spend, schemas, dedup, state machines, send and publish
gates: code, enforced once, no repair-loop stacking. A gate boolean may carry an upstream judged
verdict; the gate itself never improvises.
A human gate is sized to human attention, and thinning is defined. The machine judge rejects
or flags; the human reads everything flagged plus a stated sample of the approved; machine-
approved output ships only for a class the human approved as a class. Bulk approve is not
review.
Spend on judgment where wrongness is expensive. Output that reaches an outside person or gates
money gets judged whatever the calls cost. Internal low-stakes fields do not buy a jury. Cheap
calls are no licence to add LLM passes where code computes the one right answer.
Tripwires: any one means stop and re-route
- An open-category word list that needed another entry.
- A model told to "be specific" on class-shared input.
- "Confirmed" derived from single-provenance evidence.
- An uncalibrated self-score thresholded by code.
- An LLM inserted where code already computes the answer.
- A review step that has quietly become bulk approve.
The short version
Code owns the checkable. A judge owns every open meaning boundary. Passing a mechanical check never
certifies that creative output is good.
1---2name: judgment-or-code3description: Use when about to write or change something that decides or generates - a keyword blocklist, a name or entity matcher, a regex validator, a scoring threshold, a classification or validation step, a "confirmed" or "verified" flag, a quality gate on generated output, a dedup or filter rule, or a human review queue. Also use when adding or removing an LLM call from a pipeline, or when a mechanical rule keeps needing another exception. Decides which side of the line each output belongs on - deterministic code, or a judge model with a written rubric.4license: MIT5---67# Judgment or code89**Decide per OUTPUT, and write its acceptance rule down the way the operator would state the goal,10never in the phrasing that makes your preferred tool fit.**1112The failure this prevents is not choosing wrong once. It is choosing by habit: reaching for a regex13because regexes are cheap and testable, or reaching for a model because models feel smart, and then14writing the acceptance rule backwards from the tool you already picked.1516## The three failures this was written after1718Read these first. Each rule below is one of them generalised.1920- **203 vacuous outreach hooks.** A cheap model was asked to "be specific" about companies whose21 input records differed only in trivia. The model was not the problem; the *grounding* was. Every22 hook passed the check "mentions the company", and every hook was garbage.23- **48 of 50 "confirmed" profile URLs were wrong.** Confirmation rested on a name-only string match24 against the claim's own subject. N fields scraped from one source is one signal, not25 corroboration.26- **A 200-word name blocklist still misfiring on real names.** Every miss produced another entry. A27 list that keeps growing to chase an open boundary is judgment mechanised, and it never converges.2829## The nine30311. **Code owns the checkable; checkable never certifies quality.** Exact match, schema, enum,32 arithmetic, state, or a finite table the business maintains as policy: code. But passing a33 mechanical check never makes creative output good. *"mentions the city" passes, and is garbage.*34352. **An LLM judge owns every open meaning boundary.** Semantic failure (vacuous, wrong entity, off36 topic) in an open-ended category goes to a judge model with a written rubric **plus real failing37 examples**. Closed policy registries are code plus normalisation. Try the cheaper exits first:38 normalise the input, fix the source data, drop the unreliable feature.39403. **Grounding before model tier, and the difference must be usable.** Two subjects must receive41 inputs that differ in material a writer could actually build the intended output from.42 Differentiated trivia is still starvation. **Fix what is fetched before touching the prompt or the43 model.**44454. **Judge creative batches against sampled siblings**, plus the class definition. Could whoever the46 output lands on tell it was made for them? Is it welcome, rather than merely identifying? Does it47 share a skeleton with its siblings? Per-row judging of a batch product is a blind spot: each row48 passes, and the batch is obviously machine-made.49505. **Real-world claims need evidence that could disagree.** N fields scraped from the claim's own51 subject are one signal. *Confirmed* requires independent corroboration or a first-party52 authoritative source; otherwise the state is **unconfirmed** or **conflicting**: first-class,53 visible, and never rounded up downstream.54556. **Verdicts are categorical, with the evidence tied to the decision.** Code thresholding a model's56 own uncalibrated score is judgment laundering. A genuinely calibrated probability is evidence; the57 default is a category plus a quoted reason.58597. **Hard invariants stay mechanical.** Spend, schemas, dedup, state machines, send and publish60 gates: code, enforced once, no repair-loop stacking. A gate boolean may *carry* an upstream judged61 verdict; the gate itself never improvises.62638. **A human gate is sized to human attention, and thinning is defined.** The machine judge rejects64 or flags; the human reads everything flagged plus a stated sample of the approved; machine-65 approved output ships only for a class the human approved *as a class*. **Bulk approve is not66 review.**67689. **Spend on judgment where wrongness is expensive.** Output that reaches an outside person or gates69 money gets judged whatever the calls cost. Internal low-stakes fields do not buy a jury. Cheap70 calls are no licence to add LLM passes where code computes the one right answer.7172## Tripwires: any one means stop and re-route7374- An open-category word list that needed another entry.75- A model told to "be specific" on class-shared input.76- "Confirmed" derived from single-provenance evidence.77- An uncalibrated self-score thresholded by code.78- An LLM inserted where code already computes the answer.79- A review step that has quietly become bulk approve.8081## The short version8283Code owns the checkable. A judge owns every open meaning boundary. Passing a mechanical check never84certifies that creative output is good.