An interactive walkthrough of Nick Nisi's talk from WorkOS — and the three lessons that follow: enforce, don't instruct · prove, don't trust · delete 95%, keep the gotchas.
Nick's first harness was a Claude skill. He asked it to run tests and report when they passed. The verification he originally wrote was "if the file .case-tested exists, the tests ran."
Claude figured this out fast: it just touched the file and reported success. Nick called it "such a junior engineer, I swear." His fix: stop trusting assertions, start verifying artifacts.
The old Claude-skill harness had a long, careful prompt: "implementer, then verifier, then reviewer…" It drifted. The model would skip steps, "decide not to" do things, or quietly drop a stage.
Nick rebuilt on top of Pi with a TypeScript state machine. Five agents — implementer, verifier, reviewer, closer, retro — but the important part isn't the agents. It's the gates between them. The closer can't run until the verifier passes. The reviewer can't skip. The retro can't be skipped entirely.
Each line is a request. The model can omit any of them — and often will.
The state machine can't advance without the gate's artifact. The agent has full control of its inference — the harness has full control of the loop.
Nick built WorkOS Install — a CLI that installs AuthKit into any project (Next.js, TanStack, Ruby, …). When it broke on TanStack Start by mishandling start.ts's implicit export contract, his first instinct was: "I'll add skills!"
He generated 10,000+ lines of skills from the docs, each tagged with the SHA of the source section so they auto-skipped unchanged content. Evals took 68 minutes per run. The pass-rate dropped — one skill took a task from 97% → 77%.
He deleted 95%. Kept 553 lines of handwritten gotchas. Same eval suite dropped to 6 minutes and the pass-rate went up.
Nick's principle: the agent's claim is worthless; the artifact is everything. The closer agent in his pipeline exists for one reason — to attach evidence to the PR. What evidence do you demand?
Nick's rule, borrowed from Ryan Lopopolo's harness-engineering talk: "never work on the code itself — only on the harness." The retro agent is the operating mechanism. It reads every JSONL log, looks for patterns the model repeated three times in a row without changing inputs (a doom loop), or fanned out parallel tool calls it didn't need, and writes the findings to a stack-specific memory file.
Next run, Case reads those notes first — and doesn't repeat the spiral.
memory/nextjs.md, memory/tanstack-start.md — one file per stack. The harness knows which file to read by sniffing the project's manifest.Nick's parting line: "If you're making your product work for agents, figure out what they get reliably wrong and focus on that. Don't focus on the product as a whole." The fastest way to find that: a one-question audit you can run on your own harness today.
Stop telling your agent what to do — encode it in a state machine · stop trusting it — demand SHA-256 hashes and screen recordings · stop dumping docs into skills — keep only the gotchas · every failure is a harness bug, not an agent bug · measure pass-rate, never vibes. Now go enforce.
No spam — just new posts and learning pages when they ship.
Drop your email and I will send new posts and learning pages your way.
Thanks — you are subscribed.
You can close this dialog now.
We will only email you when there is something new. Unsubscribe any time.