<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nikita Kitaychik</title>
    <description>The latest articles on DEV Community by Nikita Kitaychik (@nickghost).</description>
    <link>https://dev.to/nickghost</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4040504%2F8d972ba1-0440-44b0-93b8-e02a9b867d42.png</url>
      <title>DEV Community: Nikita Kitaychik</title>
      <link>https://dev.to/nickghost</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nickghost"/>
    <language>en</language>
    <item>
      <title>Contracts, Not Tasks</title>
      <dc:creator>Nikita Kitaychik</dc:creator>
      <pubDate>Wed, 12 Aug 2026 22:24:39 +0000</pubDate>
      <link>https://dev.to/nickghost/contracts-not-tasks-22m7</link>
      <guid>https://dev.to/nickghost/contracts-not-tasks-22m7</guid>
      <description>&lt;p&gt;I timed where my week actually goes. Decomposing one feature into precise tasks — which files, which methods, what order — costs me hours. Then I watched what a developer did with my decomposition.&lt;/p&gt;

&lt;p&gt;He pasted it into Claude.&lt;/p&gt;

&lt;p&gt;Sit with that for a second; it took me embarrassingly long. A detailed task list is, functionally, a prompt. I was writing prompts by hand, with the most expensive hours in the team — for a model that sits next to the code and regenerates the same plan in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The duplication
&lt;/h2&gt;

&lt;p&gt;The repository my team ships from has its own agent tooling: given a well-formed requirement, it produces the implementation plan — files, layers, order — as a matter of course.&lt;/p&gt;

&lt;p&gt;So every file-by-file task I wrote was a &lt;em&gt;duplicate&lt;/em&gt;: my guess at an implementation plan, produced farther from the code than the tool that would redo it anyway.&lt;/p&gt;

&lt;p&gt;Two passes over the same work. And of the two, mine was the expensive one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck math
&lt;/h2&gt;

&lt;p&gt;Here's why this isn't a cosmetic inefficiency:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Who pays&lt;/th&gt;
&lt;th&gt;Typical cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fine-grained decomposition&lt;/td&gt;
&lt;td&gt;the owner&lt;/td&gt;
&lt;td&gt;hours per feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation from it&lt;/td&gt;
&lt;td&gt;developer + agent&lt;/td&gt;
&lt;td&gt;often less than that&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When specification costs more than production, the queue forms in front of the owner. Not occasionally — structurally. Features stop waiting for hands and start waiting for my write-up.&lt;/p&gt;

&lt;p&gt;And the trap has a cruel twist: the more diligent I am — the finer I decompose — the worse it gets. Every extra hour of pre-chewing lands on the expensive side of the ledger and removes nothing from the cheap side. Diligence digs the hole deeper.&lt;/p&gt;

&lt;p&gt;So the fix cannot be "decompose better." It has to be "decompose &lt;em&gt;less&lt;/em&gt; — and still stay safe." Here's what that looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same feature, two handoffs
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;As a task list:&lt;/strong&gt; add the column, patch the handler, extend the validation, don't forget the migration, update the client call. Five predictions about &lt;em&gt;how&lt;/em&gt; — every one of them re-derivable by the tooling next to the code, none of them checkable by me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a contract:&lt;/strong&gt; a rename operation exists; a duplicate name is rejected with its own error; only the scope owner may call it; when the parent object dies, the record dies with it; done means these three checks pass.&lt;/p&gt;

&lt;p&gt;Five promises about &lt;em&gt;what must become true&lt;/em&gt; — every one of them checkable, none of them my guess about someone else's file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the entire replacement. The unit I hand over is no longer a change to make but &lt;strong&gt;a promise to keep.&lt;/strong&gt; What goes into one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;th&gt;Why it survives contact with reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What exists when you're done?&lt;/td&gt;
&lt;td&gt;Abstract schema, named by the API's own conventions — nothing invented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Behavior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What happens on success, on failure, at the edges?&lt;/td&gt;
&lt;td&gt;In text, not code — the implementer owns the translation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Who may call this, under which privilege and scope?&lt;/td&gt;
&lt;td&gt;Includes the cases everyone forgets: the admin bypass, the machine identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lifecycle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What happens on parent delete / update / detach?&lt;/td&gt;
&lt;td&gt;"We forgot the cascade" is the most boring production incident there is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acceptance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What does "done" mean?&lt;/td&gt;
&lt;td&gt;Runnable without asking the author what they meant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Impact radar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What must not break, and what depends on this?&lt;/td&gt;
&lt;td&gt;Ordering becomes data instead of tribal knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What a contract deliberately omits: file paths, method names, SQL, step-by-step instructions. They're the implementer's jurisdiction, they're regenerated better closer to the code — and every such line in a spec is a line I paid for twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fear, and the law that answers it
&lt;/h2&gt;

&lt;p&gt;Handing over a coarse promise instead of five chewed steps feels reckless. The fear is legitimate — and it has an exact answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decomposition granularity should scale inversely with the strength of your acceptance gate.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the consumer's gate is strong — review against the contract, tests written by the author as a norm, a script that checks the contract's own structure — coarse units are &lt;em&gt;safe&lt;/em&gt;: one contract bundles what would have been six tasks, and the gate catches what goes wrong.&lt;/p&gt;

&lt;p&gt;If the gate is weak, big pieces really are reckless. You must decompose finer — not forever, but until the gate grows.&lt;/p&gt;

&lt;p&gt;I run both regimes at once, which is how I know the law holds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Track&lt;/th&gt;
&lt;th&gt;Gate today&lt;/th&gt;
&lt;th&gt;Unit size today&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong: senior reviews against the contract, author writes the tests, a script checks structure&lt;/td&gt;
&lt;td&gt;Coarse — one contract instead of six tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weaker, still growing&lt;/td&gt;
&lt;td&gt;Fine-grained, layer by layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The backend contracts got &lt;em&gt;harder&lt;/em&gt; over time, not softer: the senior who consumes them kept pushing back — a missing lifecycle clause, a field name that drifted from the API doc, an access row that forgot the admin case. Each ruling became a permanent check. That's the gate literally strengthening — and each time it did, I could afford to hand over a slightly bigger piece.&lt;/p&gt;

&lt;p&gt;Frontend stays fine-grained not because frontend is harder, but because that gate is younger. Same law, other end of the dial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the hours went
&lt;/h2&gt;

&lt;p&gt;The payoff closes the loop this essay opened with:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;My hours per feature&lt;/td&gt;
&lt;td&gt;pre-chewing an implementation plan&lt;/td&gt;
&lt;td&gt;writing promises + judging acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The developer gets&lt;/td&gt;
&lt;td&gt;my prediction to paste into a model&lt;/td&gt;
&lt;td&gt;room to own the &lt;em&gt;how&lt;/em&gt;, with a gate that catches failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The queue&lt;/td&gt;
&lt;td&gt;forms in front of me&lt;/td&gt;
&lt;td&gt;forms in front of the gate — which scales&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two contracts that share an interface boundary can even proceed in parallel — frontend against the schema, backend against the behavior — because the contract, not a meeting, is the source of truth at the boundary. Pre-chewed tasks can't do that; they serialize on shared files even when the promises are independent.&lt;/p&gt;

&lt;p&gt;Honest prior art, dated: design-by-contract is forty years old — preconditions and postconditions are Meyer's, not mine — and 2026 work revives it &lt;em&gt;underneath&lt;/em&gt; task decompositions to verify codegen. The move here is different: the contract &lt;strong&gt;replaces&lt;/strong&gt; the task as the unit of handoff at the human↔agent boundary, and the granularity law that comes with it I haven't seen stated anywhere. As of mid-July 2026 — check the date before quoting me.&lt;/p&gt;

&lt;p&gt;The uncomfortable implication, which I'll take head-on later in the series: if granularity is a function of gate strength, then improving your gates — not your prompts, not your models — is the highest-leverage investment in an AI-assisted team. The gate is the product.&lt;/p&gt;

&lt;p&gt;The owner stops being the bottleneck on the day the unit of handoff is a promise the consumer's gate can check — not a plan the owner had to write twice.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next: The Two-Layer Compiler — why a dumb procedural layer plus a learning layer compounds, and hand-tuned cleverness doesn't.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Prompting. Write Loops</title>
      <dc:creator>Nikita Kitaychik</dc:creator>
      <pubDate>Tue, 21 Jul 2026 17:14:38 +0000</pubDate>
      <link>https://dev.to/nickghost/stop-prompting-write-loops-1fa9</link>
      <guid>https://dev.to/nickghost/stop-prompting-write-loops-1fa9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"You shouldn't be prompting coding agents anymore. You should be designing the loops that prompt them for you." — Peter Steinberger&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back in November, Boris Cherny — the creator of Claude Code — deleted his IDE. Stopped using it. In a recent interview he says it plainly: &lt;em&gt;"I don't prompt Claude anymore. I have loops running that prompt it and decide for themselves what to do. My job is to write the loops."&lt;/em&gt; And he adds: this is a transition the market will spend the rest of the year living through.&lt;/p&gt;

&lt;p&gt;The shift is simple to say and enormous in its consequences. &lt;strong&gt;Before&lt;/strong&gt;, you're in a chat: prompt → answer → edit → prompt again. The human is the bottleneck on every iteration. &lt;strong&gt;Now&lt;/strong&gt; you design a system once, and it finds the work itself, hands it out to agents, checks the result, writes down what got done, and decides what comes next. It pokes the agents instead of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ladder of abstraction
&lt;/h2&gt;

&lt;p&gt;Daniel Demmel laid this out as a ladder, with prompting on the bottom rung:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompt engineering&lt;/strong&gt; — how to phrase the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context engineering&lt;/strong&gt; — what to put in the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback-loop engineering&lt;/strong&gt; — letting the agent &lt;em&gt;see the consequences&lt;/em&gt; of its own work: tests, logs, real APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harness engineering&lt;/strong&gt; — running the whole apparatus: what launches, what verifies, when to call a human.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trend is a move up the ladder. You stop machining the part and start designing the assembly line. Why it all lined up right now: models got reliable enough to trust with a step you don't check on every iteration; parallelism got cheap; and the infrastructure drove straight into the tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a loop
&lt;/h2&gt;

&lt;p&gt;A loop closes without a human for one reason: the code has a &lt;strong&gt;cheap, objective oracle&lt;/strong&gt; — compilation, tests, lint, execution. The agent sees for itself where it lied. That's how you build a closed-loop: agents compile, run, screenshot, hit real keys — they verify themselves.&lt;/p&gt;

&lt;p&gt;The loop itself boils down to a formula: &lt;strong&gt;find work → bounded action → verification → report → escalation.&lt;/strong&gt; You formalize this as a one-page contract for each loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger:  when it fires
scope:    what it touches / what it doesn't
budget:   max attempts / time / files
stop:     conditions for escalating to a human
report:   where to write the outcome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Six orchestration primitives
&lt;/h3&gt;

&lt;p&gt;Anthropic described six patterns that an agent assembles into a harness for a specific task — like snapping together building blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Classify-and-act&lt;/strong&gt; — routing by type. Whatever comes in (an issue, an email, a ticket, an error) gets classified, and each type goes to its own handler. This is the "dispatcher" at the front of the loop: don't treat everything the same, first figure out what actually arrived.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fan-out-and-synthesize&lt;/strong&gt; — the task is split into independent pieces, each solved in parallel in a &lt;em&gt;clean&lt;/em&gt; context, then the results are pulled back into one. This is how an agent analyzes a large codebase with a dozen sub-agents at once, while a synthesizer assembles the whole picture. Parallelism where the pieces don't depend on each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial-verify&lt;/strong&gt; — a separate skeptic agent checks the result against a rubric, and its job is to &lt;em&gt;disprove&lt;/em&gt;, not to confirm. This removes self-preferential bias: the author shouldn't be the one grading their own work. The core trust pattern is that whoever checks isn't whoever did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate-and-filter&lt;/strong&gt; — produce many candidates, filter by quality, throw out the duplicates. Useful when it's cheaper to produce ten options and pick than to try to guess the one right answer on the first try.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tournament&lt;/strong&gt; — several agents solve the same task with &lt;em&gt;different&lt;/em&gt; approaches, and judges compare them pairwise until one winner is left. This is for cases where the solution space is wide and it isn't clear in advance which path is best.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop-until-done&lt;/strong&gt; — spawn agents until a stop condition holds: nothing new is found, zero errors, the goal is reached. This is how you do an exhaustive sweep — for example, hunting bugs until two passes in a row come back empty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the key thing: almost every primitive rests on the &lt;strong&gt;verification&lt;/strong&gt; step — adversarial-verify checks, filter selects, until-done watches for "zero errors." Which means they all bottom out in the oracle again. Without a way to say objectively "this is correct," the primitives turn into a pretty imitation of work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Order matters: tests before code
&lt;/h3&gt;

&lt;p&gt;And here's the nuance that decides accuracy. If the agent writes the code and then the tests, it's checking itself: the tests inherit the same misunderstanding as the code, they converge, and a green build means nothing. If &lt;strong&gt;tests come before code&lt;/strong&gt;, the oracle becomes independent of the implementation: the test encodes the intent before there's a solution. Then "tests passed" is a real signal. Test-first turns the test from a check into a spec-as-oracle, and the loop's accuracy climbs sharply.&lt;/p&gt;

&lt;p&gt;The trap: the agent can write weak tests or bend them to the code just to get green. So the test has to be derived from the contract and the acceptance criteria, not invented by the agent, and it has to be protected from rewrites. With that discipline the loop converges on the correct thing, not the convenient one.&lt;/p&gt;

&lt;p&gt;And where there's no oracle at all — design, a product decision, a specification — the loop doesn't converge on its own, and a human has to stand at the gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  The sober risk
&lt;/h3&gt;

&lt;p&gt;Addy Osmani puts it honestly: the loop makes mistakes &lt;strong&gt;unsupervised&lt;/strong&gt; — and they stay unnoticed. Comprehension debt grows: the code moves faster than your understanding of it. And there's "cognitive surrender" — when you stop forming an opinion and accept whatever the machine produced. His formula: &lt;em&gt;"Build the loop. But build it as someone who intends to stay an engineer, not just hit 'run.'"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice: from contract to dev loop
&lt;/h2&gt;

&lt;p&gt;If code agents work in loops, the bottleneck moves: it's &lt;strong&gt;not in writing the code, but in the quality of the contract the loop checks itself against.&lt;/strong&gt; The loop is exactly as good as your definition of "done" is precise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 0. The requester hands over a contract, not a task.&lt;/strong&gt; It has three things that make it loop-ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;claims about the code are &lt;strong&gt;grounded&lt;/strong&gt; — a method/field actually exists, verified, not "should be there";&lt;/li&gt;
&lt;li&gt;acceptance criteria are &lt;strong&gt;observable&lt;/strong&gt; — you can run them, not eyeball them;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;why&lt;/strong&gt; is written down — so the decision transfers instead of being re-invented every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1. The dev loop starts from acceptance, not from code.&lt;/strong&gt; The agent reads the criteria → writes tests that encode them (test-first, from the contract) → implements → runs tests and lint → fixes red itself within budget → repeats until green.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2. Escalation only on real forks.&lt;/strong&gt; The loop calls a human when "the contract says X but the code does Y" or "the criterion is ambiguous." It doesn't call over a missing bracket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3. The output is a PR and a test run.&lt;/strong&gt; Review happens over the PR and the contract, not step-by-step behind the agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changes for the developer, concretely:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;routine &lt;strong&gt;verifiable&lt;/strong&gt; pieces stop being hand-written — the loop drives them;&lt;/li&gt;
&lt;li&gt;the role shifts from implementer to &lt;strong&gt;loop owner and PR reviewer&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;the engineer's judgment moves to where &lt;strong&gt;there is no oracle&lt;/strong&gt; — an architectural fork, a non-obvious tradeoff — instead of "implement the obvious thing."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The honest boundary.&lt;/strong&gt; This works where acceptance is objective and the contract is grounded. Where there's no oracle — design, the product choice of "are we building the right thing" — a human is at the gate, the loop doesn't converge on its own. And test-first is mandatory: without it, the agent grades itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why keep a senior engineer?
&lt;/h2&gt;

&lt;p&gt;Let's follow the logic all the way, without flinching. If the requester hands over a &lt;strong&gt;verifiable&lt;/strong&gt; contract, and the loop implements and verifies it — why keep a senior engineer?&lt;/p&gt;

&lt;p&gt;There's an error hidden in the question. It assumes that &lt;strong&gt;the architecture that satisfies the contract is itself unambiguous.&lt;/strong&gt; For the simple case — yes. For the complex one — no. The contract specifies the &lt;strong&gt;WHAT&lt;/strong&gt; and the acceptance. It doesn't specify the &lt;strong&gt;HOW&lt;/strong&gt;: the data model, the transaction boundaries, where the lock goes, the routing, the behavior on a network partition, the migration strategy. In that gap between the "what" and a sound "how" there's no test-first oracle, because the solution space is open and the tradeoffs run deep.&lt;/p&gt;

&lt;p&gt;So the contract doesn't transfer in a single act — it's an &lt;strong&gt;enrichment chain:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3hs75a4s4md5bjefoxa6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3hs75a4s4md5bjefoxa6.png" alt="Enrichment chain: contract → senior → technical contract → dev loop" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three things make this work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The technical contract is also verifiable, and its criteria are the oracle.&lt;/strong&gt; The senior doesn't enrich with prose: the technical acceptance criteria are observable and become the very tests-before-code. The senior &lt;em&gt;finishes writing the oracle&lt;/em&gt; — after which the loop can run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation runs upward.&lt;/strong&gt; If the contract is ambiguous or unbuildable, the senior sends it back to the requester rather than quietly patching it. The contract isn't "handed down," it's negotiated between two gates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The amount of enrichment scales with architectural novelty.&lt;/strong&gt; A trivial feature — nothing to enrich, the loop runs almost straight from the contract, the senior barely touches it. A complex one — the enrichment &lt;em&gt;is&lt;/em&gt; the senior's core value. Involvement scales with complexity, not with the number of features.&lt;/p&gt;

&lt;p&gt;From this comes the symmetry that holds the whole conclusion. &lt;strong&gt;The requester owns the intent gate&lt;/strong&gt; — "is this the right feature" has no oracle. &lt;strong&gt;The senior owns the architecture gate&lt;/strong&gt; — "is this the right design, is it correct under load, under a race, under attack" has no oracle either. &lt;strong&gt;The loop fills the verifiable middle.&lt;/strong&gt; Remove either gate and you get confident-wrong at scale: either the wrong feature, or a beautifully described feature on a naive, insecure architecture that passed shallow tests.&lt;/p&gt;

&lt;p&gt;The honest, uncomfortable part: &lt;strong&gt;the headcount drops.&lt;/strong&gt; The "implementer of clear specs" engineer is in the danger zone. The "architect and loop owner" engineer is needed more than ever. For the business, that's exactly the point: the same number of people delivers several times more. Leverage.&lt;/p&gt;

&lt;p&gt;The one-line takeaway: &lt;strong&gt;the loop pushes everyone up — to where there is no oracle — and erases the middle that the oracle covers. It doesn't remove the role, it removes the oracle-coverable part of the role.&lt;/strong&gt; The requester on intent. The senior on architecture. The loop in between, running exactly as far as the contract is verifiable from both ends.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building on Boris Cherny, Peter Steinberger, Addy Osmani, and Anthropic Engineering.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Oracle Lens</title>
      <dc:creator>Nikita Kitaychik</dc:creator>
      <pubDate>Tue, 21 Jul 2026 17:09:16 +0000</pubDate>
      <link>https://dev.to/nickghost/the-oracle-lens-3c2l</link>
      <guid>https://dev.to/nickghost/the-oracle-lens-3c2l</guid>
      <description>&lt;p&gt;In the last piece I said a specification deserves a compiler: a gate that &lt;em&gt;fails&lt;/em&gt; when the input is wrong. That sounds clean until you try to build one, because you immediately hit a question the word "wrong" was hiding: wrong &lt;em&gt;how?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Verification is not one thing. When you check a spec, or a plan, or a chunk of generated code, you are actually asking up to three different questions that feel the same and are not.&lt;/p&gt;

&lt;p&gt;Conflating them is the most common mistake I see in AI-for-products tooling, including in tools that are otherwise very good. So before any gate, the lens. There are three axes, and they are orthogonal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Truth, Coherence, Intent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;The question&lt;/th&gt;
&lt;th&gt;What you check it against&lt;/th&gt;
&lt;th&gt;How you check it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Truth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is this claim actually so?&lt;/td&gt;
&lt;td&gt;The world outside the document — codebase, running system, data&lt;/td&gt;
&lt;td&gt;Go and look: grep the source, call the endpoint, run the query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coherence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does this hang together?&lt;/td&gt;
&lt;td&gt;The document itself&lt;/td&gt;
&lt;td&gt;Read it against itself: contradictions, gaps, terms used two ways&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is this the &lt;em&gt;right thing&lt;/em&gt;?&lt;/td&gt;
&lt;td&gt;A human's head&lt;/td&gt;
&lt;td&gt;No mechanical check exists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Truth&lt;/strong&gt; is groundedness in reality. "The API returns this field." "This table has a &lt;code&gt;status&lt;/code&gt; column." "The consumer can tolerate the extra parameter."&lt;/p&gt;

&lt;p&gt;Each is true or false against a world that exists independently of the document. Truth has an external referent, which is exactly why it's the most mechanizable of the three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coherence&lt;/strong&gt; is internal consistency. Does the document contradict itself? Are there gaps — behavior specified for some inputs and silent for others? Is the same term used two ways?&lt;/p&gt;

&lt;p&gt;Coherence needs no world outside the document. This is the axis most spec tooling has actually reached: when Kiro flags an ambiguous sentence or two requirements that can't both hold, or when Spec Kit's checklist asks whether every case is covered, that's a coherence oracle. It's genuinely useful and I don't want to undersell it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent&lt;/strong&gt; is the match to what was actually wanted. Not "is this consistent" and not "is this true" — "is this the &lt;em&gt;right thing&lt;/em&gt;."&lt;/p&gt;

&lt;p&gt;A spec can be flawlessly coherent and perfectly grounded in reality and still describe a feature nobody needed, or the wrong feature, or the right feature with a subtly wrong default that only the person who asked would recognize as wrong. Intent lives in a human's head. It has no external referent you can grep and no internal test the document can pass.&lt;/p&gt;

&lt;p&gt;The reason to name all three is that they come apart. That's the whole utility of the lens.&lt;/p&gt;

&lt;h2&gt;
  
  
  They pull apart, and that's the point
&lt;/h2&gt;

&lt;p&gt;A spec can be &lt;strong&gt;coherent and false.&lt;/strong&gt; It hangs together beautifully, every requirement consistent with every other, and it's built on a claim about the system that isn't true. Nothing internal will catch it; the document is at peace with itself. Only a truth check, reaching outside the document, catches it.&lt;/p&gt;

&lt;p&gt;A spec can be &lt;strong&gt;true and incoherent.&lt;/strong&gt; Every individual claim checks out against the codebase, but two requirements quietly contradict each other, or half the input space is unspecified. Grounding passes claim by claim; coherence fails at the seams.&lt;/p&gt;

&lt;p&gt;And a spec can be &lt;strong&gt;true, coherent, and wrong&lt;/strong&gt;: the hardest case. It lies about nothing, contradicts nothing, and describes something other than what was wanted. No mechanical oracle catches this, because there's nothing mechanical to check it against.&lt;/p&gt;

&lt;p&gt;Here's the tidy real-world proof that these axes are separable rather than a philosopher's distinction: look at where the industry stopped.&lt;/p&gt;

&lt;p&gt;Everyone who climbed to the spec layer (Kiro, Spec Kit) built a coherence oracle and planted a flag. They can tell you your spec contradicts itself. Not one of them can tell you your spec is &lt;em&gt;lying&lt;/em&gt; about the API — that's a different axis entirely, and it needs different machinery: something that leaves the document and goes to look.&lt;/p&gt;

&lt;p&gt;The coherence gate and the truth gate are not the same gate at different strengths. They're different gates. The market accidentally ran the experiment and confirmed the lens.&lt;/p&gt;

&lt;h2&gt;
  
  
  A live example: coherence without truth
&lt;/h2&gt;

&lt;p&gt;I'll give you one from the making of this very series, because it's the cleanest illustration I have and it happened to me last week.&lt;/p&gt;

&lt;p&gt;I was researching whether anyone had already published a Truth/Coherence/Intent-style taxonomy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What the agent reported.&lt;/strong&gt; A 2026 paper that split verification oracles along exactly those lines and &lt;em&gt;declared intent-matching to be fundamentally non-mechanizable&lt;/em&gt; — complete with a quotation. On-topic, well-phrased, and it fit my thesis so snugly I almost used it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a second pass found.&lt;/strong&gt; The word "intent" appears twice in the paper, in unrelated sentences. The quoted line does not exist. The citation was fabricated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coherence: green.&lt;/strong&gt; The summary was flawless — fluent, plausible, internally consistent. It passed every check a reader could apply &lt;em&gt;to the summary itself&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Truth: red.&lt;/strong&gt; It failed the only check that mattered: go read the source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If I had a coherence gate and mistook it for a truth gate, that fabrication would be a citation in this article right now.&lt;/p&gt;

&lt;p&gt;That is the entire argument for the lens in one anecdote. The dangerous errors are not the incoherent ones — those look wrong. The dangerous errors are the coherent-but-false ones, because they look right, and only an oracle pointed at the &lt;em&gt;world&lt;/em&gt; rather than at the &lt;em&gt;document&lt;/em&gt; will stop them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The strength gradient — and the axis you can't mechanize
&lt;/h2&gt;

&lt;p&gt;The three axes don't just differ in kind; they differ in how mechanizable they are, and that ordering should drive where you spend effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Truth is the most mechanizable.&lt;/strong&gt; It has an external referent, so you can automate the check: grep, compile, execute, query. Build the hardest, most automatic gate here. This is where a spec compiler earns its keep, and, per the market, where the least has been built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coherence is partly mechanizable.&lt;/strong&gt; Consistency and completeness checks can be automated to a real degree, and LLMs are decent at flagging contradictions. It has diminishing returns but it's tractable. The field is already here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent is not mechanically oracle-able, and pretending otherwise is the trap.&lt;/strong&gt; There is no external referent and no internal test. The ground truth is a state of mind — often underspecified even to the person holding it, and it changes when they see the result.&lt;/p&gt;

&lt;p&gt;You can &lt;em&gt;approximate&lt;/em&gt; it: acceptance tests encode a slice, examples pin the corners, accumulated human rulings (a later piece: case law) give you a weak, drifting proxy. But approximate is the ceiling.&lt;/p&gt;

&lt;p&gt;So the honest engineering move is not to fake an Intent oracle with a confident LLM judge. It's to &lt;em&gt;name&lt;/em&gt; Intent as the axis that requires a human, put the person exactly there, and mechanize Truth and Coherence hard enough that the human's scarce attention is spent only on the question no machine can answer.&lt;/p&gt;

&lt;p&gt;That is what the lens buys you. Not a new gate — a way to know, for every gate you build, which of the three questions it actually answers.&lt;/p&gt;

&lt;p&gt;So you never again let a coherence check stand guard over a truth-shaped hole, or let a machine pretend to hold the one gate that was always yours to hold.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coming later in the series: the truth gate itself — grounding a specification against reality, and why the interesting failures are about layers, not lies.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Specification Is a Compile Target</title>
      <dc:creator>Nikita Kitaychik</dc:creator>
      <pubDate>Tue, 21 Jul 2026 17:09:09 +0000</pubDate>
      <link>https://dev.to/nickghost/specification-is-a-compile-target-1oef</link>
      <guid>https://dev.to/nickghost/specification-is-a-compile-target-1oef</guid>
      <description>&lt;p&gt;For most of my career, the specification was the cheap part. You wrote a paragraph, maybe a ticket, and the expensive, skilled, irreplaceable work happened downstream: turning that paragraph into correct code. The spec was a suggestion. The implementation was the truth.&lt;/p&gt;

&lt;p&gt;That ratio has inverted, and almost nobody has repriced their work to match.&lt;/p&gt;

&lt;p&gt;When an agent can take a precise description of a change and produce a working, tested implementation in minutes, the implementation stops being the bottleneck. It stops being where the skill lives.&lt;/p&gt;

&lt;p&gt;The skill moves up, to the only place left that the machine cannot do for you: deciding what to build, and stating it precisely enough that the rest is mechanical. The senior engineer doesn't disappear. They get pushed one rung up the ladder, onto the specification.&lt;/p&gt;

&lt;p&gt;And here's the part the tooling hasn't caught up to: if implementation is now a compile step, then &lt;strong&gt;the specification is a compile target.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's no longer prose you hand to a human who will fill the gaps with judgment. It's a source artifact that gets compiled into a system. And like any source artifact fed to a compiler, it deserves a type checker, a linter, and a build that &lt;em&gt;fails&lt;/em&gt; when the input is wrong.&lt;/p&gt;

&lt;p&gt;That's the whole thesis. The rest of this series is what it looks like when you take it literally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "compile" actually demands
&lt;/h2&gt;

&lt;p&gt;A compiler is unforgiving in a specific, useful way. It doesn't ask whether your program is a nice idea. It asks whether your program is &lt;em&gt;grounded&lt;/em&gt;: do these symbols exist, do these types line up, does this call match a real signature?&lt;/p&gt;

&lt;p&gt;It refuses to proceed when the answer is no. The refusal is the feature. A compiler that warned politely and emitted a binary anyway would be useless.&lt;/p&gt;

&lt;p&gt;Apply that standard to a product specification and most of them fail instantly. A typical spec is full of claims about reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"the API already returns this field"&lt;/li&gt;
&lt;li&gt;"this is just a UI change"&lt;/li&gt;
&lt;li&gt;"the consumer can handle the extra parameter"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of those is either true or false against an actual codebase — and almost none of them are checked. They're asserted in a planning doc, they survive review because they're &lt;em&gt;plausible&lt;/em&gt;, and they detonate three weeks later in implementation when someone discovers the field was never there.&lt;/p&gt;

&lt;p&gt;When a human wrote the implementation, this was survivable: the human caught the lie while coding, cursed, and patched the spec in their head. When an agent writes the implementation, the lie goes straight through. The agent trusts the spec. The spec was wrong. Now you have a confidently wrong system, built fast.&lt;/p&gt;

&lt;p&gt;Here is the shape of the failure I see constantly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The claim.&lt;/strong&gt; The system already contains a dormant mechanism for the thing you're about to build — a flag, a commented-out block, a function whose name matches exactly. The proposal is essentially: &lt;em&gt;it's already there, just switch it on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it survives review.&lt;/strong&gt; The symbol exists. A lazy check — does the name appear in the code? — comes back green.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a real gate finds.&lt;/strong&gt; Refuse name-matching as evidence and open the body instead: the code with the right name does something unrelated. It guards a different resource, at a different layer, than the claim assumes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cost.&lt;/strong&gt; Right name, wrong thing — and an entire workstream would have been built on it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you force every claim to a citation and re-read it in context, the ones that fail are almost never absurd inventions. They're plausible claims that happen to be true about a &lt;em&gt;different part of the system&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So the first thing a spec-as-compile-target needs is the compiler's core move: &lt;strong&gt;a blocking gate that refuses to admit an unverified claim.&lt;/strong&gt; Not a reviewer who might notice. A gate that demands evidence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLAIM      "the API already returns this field"
EVIDENCE   required — file:line, plus the actual shape at that line
VERDICT    admitted         claim enters the spec
           rejected         claim is struck, or demoted to an open question
           layer mismatch   symbol exists, but guards something else → back to the author
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grep it, cite the file and line, or the claim doesn't enter the spec. I'll spend a whole piece on this one, including what a &lt;em&gt;leak rate&lt;/em&gt; of unverified claims looks like when you actually measure it, and why the interesting failures aren't lies but &lt;strong&gt;layer confusion&lt;/strong&gt; — claims that are true, but true about the wrong layer of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cell nobody is standing in
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable, and I think defensible, claim: I looked, and almost everyone is building the compiler one floor too low.&lt;/p&gt;

&lt;p&gt;The spec-driven-development movement is real now. GitHub's Spec Kit, AWS's Kiro, Tessl — there's a credible map of who occupies what, and it's worth reading.&lt;/p&gt;

&lt;p&gt;Some of them even have a gate &lt;em&gt;at the spec layer&lt;/em&gt;, which is more than I expected when I went looking. Kiro walks you from requirements to design to tasks and checks the requirements document as it goes. Spec Kit ships a Review &amp;amp; Acceptance Checklist you validate before generating.&lt;/p&gt;

&lt;p&gt;So the room isn't empty. But look at &lt;em&gt;what those gates check&lt;/em&gt;, because that's the whole point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate sits&lt;/th&gt;
&lt;th&gt;What it checks&lt;/th&gt;
&lt;th&gt;Grounds spec claims in the codebase?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Kiro&lt;/strong&gt; — requirements → design → tasks&lt;/td&gt;
&lt;td&gt;Ambiguity, inconsistency, completeness, level of detail&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Spec Kit&lt;/strong&gt; — review checklist before generating&lt;/td&gt;
&lt;td&gt;Whether the spec is complete and well-formed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Spec Kit&lt;/strong&gt; — reality check&lt;/td&gt;
&lt;td&gt;Built code vs. the spec&lt;/td&gt;
&lt;td&gt;After implementation, not before&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Grounding research&lt;/strong&gt; (2026: blocking gates, typed evidence, citation-checking)&lt;/td&gt;
&lt;td&gt;Claims against source&lt;/td&gt;
&lt;td&gt;One floor down — code and retrieved chunks, not requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Design-system tooling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Components actually used&lt;/td&gt;
&lt;td&gt;Grounds the implementation, not the spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Render oracles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Screenshots of the result&lt;/td&gt;
&lt;td&gt;Judges the output, not the spec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every one of those spec-layer checks is a &lt;strong&gt;coherence&lt;/strong&gt; check. Is the document self-consistent? Is it complete? Does it contradict itself? Real, useful questions.&lt;/p&gt;

&lt;p&gt;None of them asks the other one: &lt;strong&gt;is it true?&lt;/strong&gt; Does "the API already returns this field" survive contact with the actual API? Nothing in that table grounds the spec's claims about reality against the codebase &lt;em&gt;before&lt;/em&gt; it generates.&lt;/p&gt;

&lt;p&gt;That's the room that's actually empty, and it's a sharper room than "nobody has a spec gate." Everyone who reached the spec layer built a &lt;strong&gt;coherence oracle.&lt;/strong&gt; Almost nobody built a &lt;strong&gt;truth oracle&lt;/strong&gt; for the spec: a gate that refuses a requirement because its claim about the existing system is false.&lt;/p&gt;

&lt;p&gt;"Refuse my spec when it's lying" — not "when it's vague." That distinction between coherence and truth turns out to be the spine of this whole series, and I'll make it explicit in the next piece.&lt;/p&gt;

&lt;p&gt;Now, why is that room empty? The flattering explanation is also the wrong one. It's not empty because it's a clever niche I alone spotted. It's empty because it's &lt;strong&gt;early.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hybrid it requires — someone who decides what to build &lt;em&gt;and&lt;/em&gt; can engineer the verification of that decision — is rare, and the whole industry's attention is pointed at automating implementation, the thing that just became easy.&lt;/p&gt;

&lt;p&gt;My bet is that this is temporary, and my own argument predicts it: as implementation automates, every senior gets pushed onto the spec layer, and they'll arrive needing exactly these tools. This series is a playbook written from inside the room, before the crowd arrives.&lt;/p&gt;

&lt;p&gt;That's a bet, not a certainty. "Early" is a synonym for "risk." The audience that needs a spec compiler &lt;em&gt;today&lt;/em&gt; is small, and a fair reader will say this is just good engineering hygiene with grandiose framing. Maybe. I'm writing for the version of you that's six months from now, standing on the rung you're about to be pushed onto.&lt;/p&gt;

&lt;h2&gt;
  
  
  The series: a map, not the territory
&lt;/h2&gt;

&lt;p&gt;What I've built is a real pipeline that does this: a compiler for specifications, in daily use on a production codebase.&lt;/p&gt;

&lt;p&gt;I'm going to give away the &lt;strong&gt;map&lt;/strong&gt; — the frameworks, the vocabulary, the patterns, the reasoning, and the honest numbers. I'm keeping the &lt;strong&gt;territory&lt;/strong&gt; — the actual prompts, the harness wiring, the accumulated rulings, the datasets. The map is what recruits you to the idea. The territory is the part that doesn't copy out of a blog post anyway.&lt;/p&gt;

&lt;p&gt;Here's what's coming next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Oracle Lens.&lt;/strong&gt; Before you can build a gate you need to know what kind of truth it can check. I split verification oracles into three axes: &lt;em&gt;Truth&lt;/em&gt; (is this grounded in reality), &lt;em&gt;Coherence&lt;/em&gt; (is this internally consistent), and &lt;em&gt;Intent&lt;/em&gt; (is this what was actually wanted). They're orthogonal, which is why a spec can pass grounding and still be the wrong thing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grounding the spec.&lt;/strong&gt; The blocking gate above, in full: evidence-or-it-doesn't-count, the leak-rate metric, and layer confusion as the real enemy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contracts, Not Tasks.&lt;/strong&gt; How you hand work to an agent matters more than which agent, and the principle underneath: decomposition granularity should scale inversely with the strength of your acceptance gate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's more behind these: why the whole thing compounds over time, what to do about the one axis no machine can check, and the honest numbers from measuring my own pipeline. The series will get to it.&lt;/p&gt;

&lt;p&gt;But it starts with the reframe, because it reorganizes everything else: &lt;strong&gt;the implementation was never the hard part. Stating the truth precisely enough to compile it — that's the job now. Build the compiler for that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next: &lt;a href="https://nikitakitaychik.com/en/the-oracle-lens/" rel="noopener noreferrer"&gt;The Oracle Lens&lt;/a&gt; — the three kinds of truth a gate can check, and the one it can't.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
