Skip to the content.

The harness pattern: make 'is it done' a number, not an opinion

The harness pattern: make 'is it done' a number, not an opinion

“Is this done?” is usually answered by an opinion in a meeting or a review comment, which means it is answered differently by different people on different days. A harness replaces that opinion with a number: the complete set of checks that decide whether a piece of work is good enough, run automatically, producing a pass or a fail. The value is not that checks are novel — tests and linters are old — but that treating “done” as an exit code changes who can do the work and how much you can trust it. It is the difference between a standard you defend by hand and one the machine defends for you, which is the only way autonomous or AI-heavy work stays honest at volume.

Work flows into a harness of checks that emits a single pass or fail A change enters a harness box containing schema, links, budget, tests and accessibility checks; the harness emits one composite verdict, and a fail loops back for a fix. change harness schema links budget tests a11y pass/fail fail → fix and re-run
Many checks, one verdict. "Done" is whatever makes the harness green — and a fail is a specific, actionable message, not a vibe.

A check is executable, specific, and unattended

The three properties that make a harness a harness: each check runs (it is code, not a guideline), it names a specific deficit when it fails, and it runs without a human. A link checker is a tiny, complete example — it turns “make sure the links work” from a manual click-through into an exit code:

// harness/links.test.js — every internal link resolves to a real page
const pages = new Set(allSlugs());
for (const link of internalLinks()) {
  const target = link.replace(/^\//, "").replace(/\/$/, "");
  test(`link ${link} resolves`, () => {
    expect(pages.has(target)).toBe(true);   // fails naming the exact dead link
  });
}

The failure message is not “something’s off with the links” — it is link /guides/acme resolves, red, pointing at the one that broke.

The composite is the “done” signal

A single check is a test. A harness is the whole set, rolled into one number you can gate on. That composite is what lets you say “green means shippable” with a straight face, and it is what an autonomous or AI agent optimises against:

# the harness is the definition of done; CI gates on it, agents heal against it
$ node harness/check.js
  pass  schema        1.00
  pass  links         1.00
  FAIL  bundle-budget 0.00  entry chunk 340kb > 250kb budget
composite 0.83 — required failing: bundle-budget   # not done; here is exactly why

Why it matters more now

When humans wrote all the code slowly, an informal “we’ll catch it in review” mostly kept up. When a model writes code faster than review can absorb, the informal standard collapses — there is simply too much to eyeball. A harness scales the way review cannot: it costs the same to run against one diff or a thousand, it never gets tired or generous at 6pm, and it gives an AI a target it can heal toward on its own. That is the real unlock — “is it done” becomes something a machine can both check and chase. The harness-link-checker and harness-bundle-budget exercises build two real checks from scratch, which is the fastest way to feel the shift from opinion to exit code.