<?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: DynoKore</title>
    <description>The latest articles on DEV Community by DynoKore (@dynokore_team).</description>
    <link>https://dev.to/dynokore_team</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%2F4203083%2F67695216-54de-4837-81ab-cc8b64b8f7d7.png</url>
      <title>DEV Community: DynoKore</title>
      <link>https://dev.to/dynokore_team</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dynokore_team"/>
    <language>en</language>
    <item>
      <title>We're building an invoicing system with AI agents, in public</title>
      <dc:creator>DynoKore</dc:creator>
      <pubDate>Sat, 24 Oct 2026 04:25:35 +0000</pubDate>
      <link>https://dev.to/dynokore_team/were-building-an-invoicing-system-with-ai-agents-in-public-3g0n</link>
      <guid>https://dev.to/dynokore_team/were-building-an-invoicing-system-with-ai-agents-in-public-3g0n</guid>
      <description>&lt;p&gt;DynoInvoice is an e-invoicing and GST compliance platform for Singapore, and AI coding agents are writing it. Its source is now on GitHub at &lt;a href="https://github.com/dynokore/DynoInvoice" rel="noopener noreferrer"&gt;github.com/dynokore/DynoInvoice&lt;/a&gt;. The mirror syncs every hour, so you can watch the agents' commits land while they work. Development is ongoing, and incomplete features are expected.&lt;/p&gt;

&lt;p&gt;The source is published for study only. It's licensed under PolyForm Strict 1.0.0, which allows reading and running it for non-commercial purposes, and nothing else. We don't accept contributions. It isn't open source in the OSI sense, and we don't call it that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What DynoInvoice is
&lt;/h2&gt;

&lt;p&gt;Singapore is moving GST invoicing onto InvoiceNow, the national e-invoicing network built on Peppol. GST-registered businesses will have to send their invoice data to IRAS through it, using an InvoiceNow-Ready solution and an accredited Access Point.&lt;/p&gt;

&lt;p&gt;DynoInvoice sits beside the systems a business already runs (ERP, billing, point of sale, expenses) rather than replacing them. It handles what the InvoiceNow requirement asks of a GST-registered business:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deciding which transactions are in scope, and mapping internal tax codes to IRAS GST categories;&lt;/li&gt;
&lt;li&gt;building and validating the invoice data IRAS requires, and working out when each submission is due;&lt;/li&gt;
&lt;li&gt;submitting it to IRAS through an accredited Access Point, and handling resubmissions and credit notes;&lt;/li&gt;
&lt;li&gt;keeping the evidence, and reconciling what was submitted against what was filed in the GST return.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Accounting firms and tax agents can act for their clients, with each client's consent for each entity. It runs as a multi-tenant service or as a single-tenant private deployment, from the same code. It doesn't run its own Access Point, prepare GST returns, or replace accounts receivable and payable.&lt;/p&gt;

&lt;p&gt;The foundations are in place: organisation structure, access control (including acting on a client's behalf) and the shared contracts between services. Document handling, submission and reconciliation are still being built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we're building it
&lt;/h2&gt;

&lt;p&gt;The requirement already applies to new voluntary GST registrations, and IRAS has set dates to bring in most other GST-registered businesses in phases through April 2031, so most businesses will need something between their existing systems and the network.&lt;/p&gt;

&lt;p&gt;We're building DynoInvoice for two reasons. It's a product we intend to bring to market when it's ready. And it's the hardest test we could find for DynoKore Keel. Invoicing has tenants that must never see each other's data, rules that come from regulation rather than taste, and an audit trail someone will eventually ask for. If agents can build that under governance, the method should hold for less demanding software.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's designed
&lt;/h2&gt;

&lt;p&gt;DynoInvoice is designed the way a regulated, multi-tenant system has to be. The diagram shows the design; dashed parts aren't built yet.&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%2Fe334l5fy771z6mick0ex.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%2Fe334l5fy771z6mick0ex.png" alt="DynoInvoice architecture. Solid boxes have code on main and are still in progress; dashed boxes are designed but not built yet." width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Solid boxes have code on main and are still in progress; dashed boxes are designed but not built yet.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One domain per service, one schema per service.&lt;/strong&gt; Each service owns its own database schema and can't read another's tables. Services talk through contracts published from one place and checked automatically: a few synchronous APIs where the caller needs an answer, and events everywhere else, delivered at least once to consumers that must handle repeats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tenant isolation in the database.&lt;/strong&gt; Every table carries the tenant, and isolation is enforced by the database rather than by application filters. A private deployment runs the same multi-tenant code with a single tenant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submissions keep flowing.&lt;/strong&gt; Tokens are checked offline at the gateway, and evidence, reconciliation and notifications consume events without holding up the pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence you can verify.&lt;/strong&gt; Receipts, decisions and audit logs go to an append-only store kept apart from operational data, with integrity checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules as signed data.&lt;/strong&gt; Tax rules are versioned data in signed rule packs, so the same date and input give the same result. The control plane that signs them runs only at the operator, never receives tenant data, and isn't needed at run time: a private deployment can run fully offline, without new rule packs until it reconnects or loads one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the agents are governed
&lt;/h2&gt;

&lt;p&gt;The agents work under DynoKore Keel, which we built for ourselves first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One chain, end to end.&lt;/strong&gt; Requirements, acceptance criteria and tasks are versioned records in Keel, and every change traces back to them. Before a coding agent starts, the server checks the task's requirement and design readiness and lists each missing item; a task that fails stays blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The author doesn't grade its own work.&lt;/strong&gt; By rule, the agent that drafts a requirement or decision change submits it, and a separate examiner agent approves and publishes it. Every merge request must pass the repository's automated gates and an independent reviewer agent's check against the project's written engineering standards, including any change to tests (documentation-only changes run text checks only).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Done is decided by the server, not the coder.&lt;/strong&gt; Tests must prove acceptance criteria held in Keel. The coding agent can't change those criteria, and a rule forbids weakening a check to get green. A coding task is marked done by the server from the merged change and its CI verdict, not by an agent, and a change to a task's acceptance criteria sends it back for review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;People answer the questions that matter.&lt;/strong&gt; Questions about functionality, direction, exemptions or relaxing a check are answered by a person, and the answer is recorded in Keel with who decided. Loosening a check is never an agent's call. When an agent reaches one of these questions, that task waits and the agents carry on with other work; once the person answers, it picks up again. Most other approvals are made by agents under a delegation from that person, and the record shows which is which.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credentials stay out of the agents' reach.&lt;/strong&gt; A hook blocks agents from reading credential files; tools read credentials in their own process and never print them. Before every sync, the published history is scanned for credentials and internal identifiers, and any finding stops the sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;Agents fail in ways that look like success. A few things we caught, and what we changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Green, but not done.&lt;/strong&gt; A coding agent reported a task complete with a green pipeline. It had pushed only scripts and fixtures; the main change was never committed. Coding agents are now required to have a clean working tree, with a diff covering every file the task names, before reporting done, and independent review checks the diff against the task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A looser reading to get through.&lt;/strong&gt; An agent decided on its own that part of a requirement didn't apply, which made the task easy to pass. It was sent back. A coding agent that hits a gap is instructed to stop and report it; it may not pick a looser reading of the task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A test that passed on review day.&lt;/strong&gt; A test hard-coded a moment in time while the SQL used the database clock. It was green when reviewed, then turned main red a couple of days later and blocked every merge request. Review now looks for time literals, and time-sensitive tests run with both the application and database clocks shifted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A scan that saw nothing.&lt;/strong&gt; A licence scan with no findings was cited as evidence, but it had scanned the source tree and never saw the built artifacts. Before a green scan counts as evidence, we check that it actually saw what it claims to cover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quotation nobody wrote.&lt;/strong&gt; An agent drafting a decision included a quotation that didn't exist in its source. The independent examiner caught it before publication. Quotations must now be exact and cite the version they come from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents waiting on each other.&lt;/strong&gt; One agent was allowed to dispatch another. When every slot was full, each waited on a slot the other held. Agents no longer dispatch other agents; the coordinator does, and a script caps how many run at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;We're building a public view of the record, where you'll be able to pick a commit and follow it back to its task, requirement and review.&lt;/p&gt;

&lt;p&gt;DynoInvoice is still being built. If you want to ask how the agents built something, the repository's &lt;a href="https://github.com/dynokore/DynoInvoice/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt; are open.&lt;/p&gt;

&lt;p&gt;We're also opening Keel to a small group of design partners: engineering teams already using coding agents who need to answer to an auditor, a client or a regulator. Apply at &lt;a href="https://dynokore.ai" rel="noopener noreferrer"&gt;dynokore.ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you find something to criticise in the code, that's the point. Tell us.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://dynokore.com/blog/launch-dynoinvoice/" rel="noopener noreferrer"&gt;dynokore.com&lt;/a&gt;. Written by the DynoKore team with AI assistance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>From vibe coding to governed development</title>
      <dc:creator>DynoKore</dc:creator>
      <pubDate>Fri, 23 Oct 2026 20:08:05 +0000</pubDate>
      <link>https://dev.to/dynokore_team/from-vibe-coding-to-governed-development-1moi</link>
      <guid>https://dev.to/dynokore_team/from-vibe-coding-to-governed-development-1moi</guid>
      <description>&lt;p&gt;In 1957, John Backus and his team at IBM presented a paper called &lt;em&gt;The FORTRAN Automatic Coding System&lt;/em&gt;. The promise was in the name: you would describe the computation, and the machine would do the programming. It didn't end programming. It created far more of it — because the people writing FORTRAN no longer had to think in registers.&lt;/p&gt;

&lt;p&gt;Every step up the ladder has looked like that. Machine code gave way to assembly, assembly to high-level languages. Each step let people write less about &lt;em&gt;how&lt;/em&gt; and more about &lt;em&gt;what&lt;/em&gt;. And each step moved the source of truth up a level: once compilers could be trusted, nobody maintained the assembly. They maintained the source.&lt;/p&gt;

&lt;p&gt;Coding agents are the next step. What you hand an agent is, at bottom, a requirement: what the system should do. So it's tempting to conclude that programming is becoming natural language, and that the code is turning into an intermediate artefact nobody reads.&lt;/p&gt;

&lt;p&gt;We think the direction is right. The conclusion is premature, and the reason why matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  An agent is not a compiler
&lt;/h2&gt;

&lt;p&gt;A compiler translates a formal language deterministically, and it preserves meaning. Compile the same source a hundred times and you get the same behaviour. That guarantee is why we stopped reading assembly.&lt;/p&gt;

&lt;p&gt;An agent translates natural language probabilistically, and nothing guarantees it preserves meaning. Natural language is ambiguous to begin with. Give the same request twice and you can get two different programs, both of which pass their own tests.&lt;/p&gt;

&lt;p&gt;In the late 1970s, Dijkstra wrote a short note called &lt;em&gt;On the foolishness of "natural language programming"&lt;/em&gt;. His point was that the value of a formal notation is its precision. He was right. And that's the problem teams are now living with.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's breaking
&lt;/h2&gt;

&lt;p&gt;We went through about 7,000 Hacker News comments from the past year about working with coding agents, with agents doing the first pass, and kept the 178 in which an engineer described something that actually went wrong for them. The most common complaints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code that works today and nobody can change tomorrow.&lt;/strong&gt; Logic duplicated at the wrong layer, the repo's design ignored, a feature another team had to rewrite before it fit. This was the single most frequent theme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review that can't keep up.&lt;/strong&gt; Agents produce more than people can read, and review turns into a bottleneck or a rubber stamp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone else's AI output landing on you.&lt;/strong&gt; Large generated changes from colleagues, which you're expected to review, fix or own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Losing your grip on your own codebase.&lt;/strong&gt; You merged it, but you no longer hold a mental model of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"It passes" isn't "it does what was asked."&lt;/strong&gt; The code compiles, the tests are green, and it solves a slightly different problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is fixed by better prompts. They're what happens when the source of truth moves up a level but nothing guarantees the translation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements become the source code
&lt;/h2&gt;

&lt;p&gt;If requirements are where intent now lives, they need everything source code has needed for fifty years:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Versioning.&lt;/strong&gt; Every change to a requirement is a recorded revision, not an edit to a chat history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review.&lt;/strong&gt; A change to what the system should do is checked before anyone builds on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests.&lt;/strong&gt; Each requirement carries acceptance criteria precise enough to check, not adjectives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability.&lt;/strong&gt; Every line of code can answer: which requirement am I for?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That isn't "write a long spec, then generate". Heavy specs have their own failure mode. One engineer in our sample described a thirty-minute fix that turned into a 37-page AI planning document and a week of process. Governance is not more paperwork. It's making intent precise, keeping it in one place, and checking every output against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we do it
&lt;/h2&gt;

&lt;p&gt;We built DynoKore Keel around three ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One source of truth.&lt;/strong&gt; Requirements, acceptance criteria, tasks and decisions are versioned records in Keel, and every change traces back to them. Changes to requirements go through an independent examiner agent before they're published. When a question needs a person — how a feature should behave, whether an exemption is acceptable, whether a check may be relaxed — the answer is recorded, with who decided.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Controlled execution.&lt;/strong&gt; Coding agents work under the project's written engineering standards; for example, library modules may only depend downward, enforced by architecture checks in CI. They can't change the acceptance criteria their tests must prove, and a rule forbids weakening a check to get green. A separate reviewer agent checks every merge request, test changes included. The agent that wrote the code never reviews it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verifiable outcomes.&lt;/strong&gt; A task can't be marked done until its requirement chain exists and passes Keel's readiness check, and no code change merges until the automated checks pass. Routine approvals are delegated to agents, and the record shows which decisions a person made.&lt;/p&gt;

&lt;p&gt;Notice what isn't in that list: a person reading every line. We couldn't, and neither can you. The work is in making that safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we got wrong
&lt;/h2&gt;

&lt;p&gt;We learned the hard way that a sentence in a prompt is not a control. We told our agents never to print credentials. Three times, a credential fragment still ended up in an agent's output. The fix wasn't a better prompt. It was mechanism: tools that need credentials read them in their own process and never print them, and a hook now blocks reading credential files at all.&lt;/p&gt;

&lt;p&gt;That lesson generalises. In a governed system, a mistake that happens twice gets a mechanism, not a reminder.&lt;/p&gt;

&lt;p&gt;And we should be honest about scope. DynoInvoice, the system we've built this way, is weeks old, not years. We can show you how it's structured and how every change was checked. We can't yet show you what it looks like after five years of maintenance. Nobody can, for agent-built systems. That's exactly why the structure matters now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this goes
&lt;/h2&gt;

&lt;p&gt;Will code eventually disappear from view, the way assembly did? Maybe, but only once checking an agent's output becomes as trustworthy as a compiler. Until then, the job isn't to stop engineering. It's to move engineering up a level, to the requirements, and keep the checks underneath honest.&lt;/p&gt;

&lt;p&gt;If your team is already shipping agent-written code into a system you'll maintain for years, three things you can start tomorrow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write down what "done" means before the agent starts, in terms a test can check.&lt;/li&gt;
&lt;li&gt;Never let the agent that wrote a change be the one that approves it.&lt;/li&gt;
&lt;li&gt;When a mistake happens twice, replace the reminder with a mechanism.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vibe coding is a fine way to build a prototype. A system you'll run for years needs something else: governed development.&lt;/p&gt;

&lt;p&gt;Every requirement. Every decision. Every proof.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We're opening Keel to a small group of design partners: engineering teams already building with agents who need to answer for what they ship. &lt;a href="https://dynokore.ai" rel="noopener noreferrer"&gt;dynokore.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>When a colleague's AI-generated pull request lands on you</title>
      <dc:creator>DynoKore</dc:creator>
      <pubDate>Fri, 23 Oct 2026 20:05:27 +0000</pubDate>
      <link>https://dev.to/dynokore_team/when-a-colleagues-ai-generated-pull-request-lands-on-you-2b1m</link>
      <guid>https://dev.to/dynokore_team/when-a-colleagues-ai-generated-pull-request-lands-on-you-2b1m</guid>
      <description>&lt;p&gt;When a colleague uses an agent to write a large change and asks you to review it, the cost of that change moves to you. Engineers describe huge pull requests, intent that doesn't match the business, and authors who can't explain their own code. Stricter review alone doesn't fix it; the review needs something fixed to check against, and a limit on what can be submitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;p&gt;We went through about 7,000 Hacker News comments from the past year about working with coding agents, and kept 178 in which an engineer described something that actually went wrong for them. In 23 of those, the problem wasn't their own agent. It was AI-generated work from someone else (a teammate, a contractor, a manager or an open-source contributor) that they were expected to review, fix or take over. We rated 6 of those 23 as high severity, more than any other theme in the sample.&lt;/p&gt;

&lt;p&gt;The same patterns came up again and again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size.&lt;/strong&gt; Pull requests of thousands of lines, every day. One engineer spent hours on a single 3,800-line shell-script change from a contractor who couldn't answer basic questions about the system. (&lt;a href="https://news.ycombinator.com/item?id=47289922" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The wrong problem, solved confidently.&lt;/strong&gt; Teammates fed half-finished code to a model and sent back versions that got the business requirements wrong. (&lt;a href="https://news.ycombinator.com/item?id=47391792" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work that doesn't fit.&lt;/strong&gt; A feature from another team had to be stripped down and redesigned for more than a week before it fit the main API. The engineer who did the fixing was the one who looked slow. (&lt;a href="https://news.ycombinator.com/item?id=47390383" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof that isn't proof.&lt;/strong&gt; Scripts that print what the author expects to happen, instead of demonstrating that it does. (&lt;a href="https://news.ycombinator.com/item?id=47680414" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debt merged under deadline.&lt;/strong&gt; A lead let contractors' fast AI code through to hit a budget, and is still cleaning it up. (&lt;a href="https://news.ycombinator.com/item?id=47392440" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-source maintainers described the same thing at larger scale: a flood of generated pull requests acting like a denial-of-service attack on their attention. (&lt;a href="https://news.ycombinator.com/item?id=49333761" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  What people tried
&lt;/h2&gt;

&lt;p&gt;Most responses fell into three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Review harder.&lt;/strong&gt; Raise the bar, reject "AI slop", read every line. It works until the volume grows, and it makes the strict reviewer unpopular.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrict who can use agents.&lt;/strong&gt; New hires limited to planning mode until they understand the codebase. Some engineers stopped using agents altogether.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove the source.&lt;/strong&gt; One lead let the contractors go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these puts the whole load on the reviewer's judgement, at the end of the process, after the work is done. None of them changes what arrives for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually helps
&lt;/h2&gt;

&lt;p&gt;The common thread in these stories is that the reviewer has nothing fixed to check against. They have a diff and a description, both written by the same person (or the same agent), and they have to work out what the change was supposed to do before they can decide whether it does it. These are the changes that help, whatever tools you use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No pull request without a stated requirement.&lt;/strong&gt; Before work starts, write down what the change is for and how you'll know it works, precisely enough that a test can check it. The reviewer then checks the change against that, not against a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The author can't move the target.&lt;/strong&gt; If the acceptance criteria live somewhere the author (or their agent) can't edit, nobody can make a change pass by quietly redefining "done".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof means running checks.&lt;/strong&gt; A test that exercises the behaviour, in CI. Not a script that prints a success message, and not the author's say-so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cap the size.&lt;/strong&gt; A change too big to review isn't reviewed, whoever or whatever wrote it. Split it, or send it back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same gate for everyone.&lt;/strong&gt; Human-written, agent-written, contractor or senior engineer: one set of checks. Then the argument stops being about who used AI, and becomes about whether the change does what was asked.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How we handle it
&lt;/h2&gt;

&lt;p&gt;At DynoKore most of our code is written by agents, so "someone else's AI output" is our normal day. We built DynoKore Keel so that what arrives for review is already anchored. Requirements, acceptance criteria and tasks are versioned records, and every change traces back to them. Tests must prove those acceptance criteria, and the coding agent can't change them. An independent reviewer agent checks every merge request, including any change to tests. A task can't be marked done until its requirement chain exists and passes Keel's readiness check.&lt;/p&gt;

&lt;p&gt;We're a small team, and our "colleagues" are mostly agents. We haven't yet seen how this holds up across a large organisation with many human authors. That's what our design partners are for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;If AI-generated work keeps landing on you, the fix isn't reading harder. Agree what "done" means before the work starts, keep that definition out of the author's reach, and send back anything that doesn't prove it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of What Breaks, our series on what actually goes wrong when teams build with coding agents. If this matches what you're seeing, or doesn't, tell us at &lt;a href="mailto:hello@dynokore.com"&gt;hello@dynokore.com&lt;/a&gt;. We're opening DynoKore Keel to a small group of design partners: &lt;a href="https://dynokore.ai" rel="noopener noreferrer"&gt;dynokore.ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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