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.
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.