Can AI Coding Agents Build Reliable Software?
Two engineering programs and nearly 3,200 commits implemented by AI coding agents: what they built wrong, what independent review exposed, and the gates and rules that made the result trustworthy.
Yes, when the system around them can refuse. Not on their own. For two programs running side by side, a live market-data research platform and a programming language with its compiler and runtime, AI coding agents were the implementation team: nearly 3,200 commits and more than 600,000 lines of Python, TypeScript and Rust, over 22 months and 8 months respectively. The agents introduced the documented evaluation leaks, and their original tests and validation often failed to detect them. They also implemented the tests and safeguards that eventually exposed these documented defects, once independent review had turned the failures into enforceable requirements. This article is the record of what they built wrong, what they could not see on their own, and the management system that was written down as it was learned.
Key findings
- The agents built the defects and passed their own checks on them. The documented look-ahead leaks in the research platform were introduced in agent-written code and initially escaped its validation; in the compiler, a statement that did nothing, a test that asserted nothing and a release build that skipped its own consistency check each passed the suite.
- Reliability came from gates the agents could not argue with, not from better prompting: a causality gate before any checkpoint changes, a feature store that certifies before it writes, two execution engines that must agree, a build that refuses an unplaced case.
- Every rule that mattered arrived the day after a specific failure, with its reason written beside it. A rule without its reason was argued with; with it, it was applied.
- The reviewer's questions were the control. "Are you sure?", "why is it slow even compiled?" and "more features should not have made it worse" each opened a retraction or a week of fixes the agents had not flagged.
- High commit activity continued in both programs as the gates were introduced and strengthened. That does not show the gates raised productivity; it shows stronger validation was compatible with continued development here.
1. The question
"Can agents write code" was answered in 2025. The question an engineering leader has in 2026 is whether a program implemented by agents can be trusted with something that will be wrong in expensive ways: a model whose number decides a position, a compiler whose two backends must agree on every program. Reliability there is not whether the code compiles or the tests pass; the agents make both true quickly. It is whether the numbers hold when the live system contradicts them, and whether anyone can tell. This article answers from two programs that were built that way and kept the record.
Reliability here does not mean an absence of defects. It means that the critical invariants are explicit, that violations can be detected independently of the code that produced them, and that failures become regression tests or enforced constraints rather than recurring lessons. That is the standard the rest of the article is judged against, and neither program claims more than it.
2. The two programs
| Finch | Crow | |
|---|---|---|
| What it is | An ML research and market-data platform: a point-in-time feature store, causal detectors, a replay harness and a live stack | A language for data work: compiler, interpreter, runtime, packages and a reactive web framework |
| Span | December 2024 to October 2026 | February to October 2026 |
| Commits | 2,670 | 522 |
| Size | About 400,000 lines of Python including research scripts and tests, and 81,000 of TypeScript | About 124,000 lines of Rust and 548 programs in the language |
| Principal risk | Incorrect data or evaluation results: a value read from after the decision, a population selected on the outcome | Incorrect language semantics or runtime behaviour: two backends that disagree, a case left to a wildcard |
| What keeps it honest | A causality gate run by one command before any production checkpoint changes; 154 test files, 81 of them causality-marked; a feature store that certifies before it writes | Two execution engines that must agree on 244 programs; 250 recorded error cases; generated programs that must be refused alike; a build that fails on an unplaced case; coverage floors |
| Operating manual | Born 2026-07-22, 10 revisions; its causality section opens with the four leaks that caused it | Born 2026-09-06, 64 revisions; 75 recorded failures, each with its rule |
| Standing notes | 169 memory notes, 24 of them feedback rules with a why and a how | 56 notes; 22 numbered design rules cited by number; 96 design notes of rejected ideas with their reasons |
| Human contribution | Research judgment, the audits, and the rejection of invalid results | The language design, the architecture, the correctness standards and the decisions to stop |
| What was killed | 32 research threads closed or refuted and recorded | 96 rejected language features kept as design notes so they are not re-proposed |
The two subjects are deliberately different. In the research platform the agents' mistakes were in data: a value read from after the decision, a population selected on the outcome, a reference table captured a year late. In the compiler they were in reasoning: a rule written in four places, a case left to a wildcard, a measurement taken on the wrong build. The management system that held is the same in both, which is why this is one article.
3. What the agents built wrong
A selection, dated where the record dates it. Every row was written by an agent, passed the agent's own validation, and was retired by a gate or a question.
| When | Program | What was built | How it was found | What followed |
|---|---|---|---|---|
| 2026-08-16 | Finch | A census that read indicators from buckets not yet closed at decision time | Live trades diverged from the census | Replay through the serving class, never a research loader |
| 2026-08-24 | Finch | A grid model with two features that read forward | "Are you sure?", then a truncation audit | The confirmation was retracted |
| 2026-09-14 | Finch | A codebook centred on the whole-session mean; its action moved from 0.001 to 0.899 between the prefix and the full day | A truncation probe | Causality became a hard requirement in the manual, with one command that runs the gate |
| 2026-09-18 | Finch | A census that stepped bar indices on sparse bars and filled resting limits from earlier lows | Replaying the live class at the live cadence: a 59% win rate became 34% | Censuses run at the live cadence |
| 2026-09-22 | Finch | A previous close backed out of the future open; 78 of 81 research fires vanished on the true anchor | Comparing the anchor with the provider's prior close | Reference data is checked by capture date, not column name |
| 2026-09-22 | Finch | A research universe of end-of-day gainers, selected after the day | Splitting results by data source | The causal universe rule |
| 2026-09-22 | Finch | An off-by-one that read the day's last close in 656 of 7,121 setups | The truncation test itself | The test stayed in the suite |
| 2026-10-08 | Finch | Four feature groups that had passed the store's first certification | Stronger cuts that remove whole names | Three group versions retired the same day |
| Oct 2026 | Crow | A list append written as a bare statement that did nothing; a check's result list stayed empty | Reading the output, after every test had passed | The rule is in the manual; a parity program holds it |
| Oct 2026 | Crow | A test block with a line meant as a truth that was not one; it passed for weeks | Reading it | A test that asserts nothing fails, by syntax and by type |
| 2026-10-08 | Crow | A release binary that skipped the intermediate-representation check, so a lowering slip reached both backends silently | Three unit tests looked flaky for an hour; the finding was real | The check is strict in every build |
| Oct 2026 | Crow | Hand-kept lists of builtins that held names after they went and lacked new ones the day they came; one list written in four places | "Undefined function" in a package, "documented but no such builtin" in the docs check | Every list is derived from one table; a bare name's module is decided in one resolver |
| Oct 2026 | Crow | A loop over a map and a tensor widening that the two engines ran differently | The differential fuzzer, two seeds | Two parity programs; the fuzzer widened |
| Oct 2026 | Crow | Timings taken as wall time under a running suite, three times off; a development build timed as if it were the shipped binary | "Why is it slow even in compiled mode?" | A week of 10 to 100 times speedups, and rules on what to measure |
One case end to end: the check that existed and was skipped
The compiler lowers every program to one intermediate representation, and a verifier checks that representation before either backend sees it: among its rules, an int may meet a float only through an explicit conversion, so that neither backend has to decide what mixed arithmetic means. The verifier existed, was run by the test suites, and was controlled by an environment variable. The release binary, the one the gate commands actually run, did not set it, so for about a month every program the gate lowered went to the backends unchecked. Nothing failed, because the interpreter had a fallback arm that computed mixed arithmetic on its own, which is exactly the kind of arm that hides a lowering slip: the two backends can both run a program the lowering should never have produced, and disagree with each other later.
On 2026-10-08 three unit tests began to look flaky. For an hour the explanation was the usual one. Then the variable turned out to be exported in some shells and not others: the tests were strict where it was set and permissive where it was not, and the finding they produced when strict was real, a lowering that let an int reach a float without a conversion. The fix was not to the program. The verifier was made strict in every build with no way to leave it off by accident, the interpreter's arms that had computed around the rule were changed to refuse, as a bug in the compiler rather than the program, and the coverage run now lists every backend arm that no suite reaches, because that is where the next slip hides. A correctness check is useful only when the system makes it unavoidable; this one had been a suggestion for a month, and the suite had looked green the whole time.
4. What independent review exposed
In these projects, the agents frequently accepted locally passing tests as sufficient evidence. Independent review exposed assumptions that their original validation had not challenged. Five patterns recur in the record; they are observations about these two programs and this workflow, not claims about coding agents in general.
- They built the bug and certified it. The same assistant that wrote a leak later found it; the difference was the question asked, not the model. Each fix that held was structural, a rule the build or the gate enforces, never "be more careful".
- Their confidence was not a dependable signal. In these incidents a finding that would be retracted arrived in the same tone as one that held, so the prose could not be used to triage. The signal had to be put in the system: a scorer that never commits is uncertified, a test that asserts nothing fails, a result without its null models is not quoted.
- They optimised the metric they were given. A classifier learned the late fires of a buggy census because the census was its label source. A performance target was met on the wrong build. The rules against reporting the best-looking cell, against judging by a mean one trade carries, and for showing the full table exist because an agent will otherwise hand you the cell that looked best.
- They wrote the same rule several times. An agent reaches for a local copy. Lists drifted within hours of a change; a rule lived in four places. The fix was one source of truth and a build that refuses an unplaced case.
- Operations were a blind spot. Three runs launched at once filled a 69 GB disk; a headless browser check froze the live server in premarket by exhausting the database pool; a replay wrote scores into the production lane's directory; the editor's language server ran a stale binary for two days; 185 GB of compiler builds accumulated. Each produced a rule, and the rules are mostly about doing one heavy thing at a time and verifying a process before touching it.
5. The management system that emerged
Three principles carry the system; the ten mechanisms under them are how each was built in practice.
Independent correctness gates
A feature computation is checked against truncated history. Compiler backends are checked against each other. Release builds enforce verification rather than relying on intention. In each case, correctness is checked against an explicit invariant rather than inferred from the implementation's own successful execution, and the system refuses rather than warns.
Failure-derived institutional memory
Every significant failure becomes a documented rule, a regression test or an architectural constraint, with the original reason preserved beside it. The manuals, the closed research threads, the rejected language features and the parity programs are the same mechanism in four forms.
Human ownership of judgment
The agents implement and test. A human reviewer owns the acceptance criteria, the architectural trade-offs, the rejected approaches and the decisions to retract results, and the questions that opened each retraction came from that reviewer, not from the suite.
| Mechanism | What it does | In Finch | In Crow |
|---|---|---|---|
| Rules written from post-mortems, with the why | A rule without its reason is argued with; with it, it is applied | The causality section opens with the four leaks that caused it | 75 entries, each a failure, its cause and its rule |
| Gates in the tool path, not in the review | The system refuses rather than advises | One command must pass before a checkpoint changes; the store certifies before it writes | Fifteen gate commands run by CI; the verifier strict in every build; totality at compile time |
| No verdict is not a pass | Stops a silent nothing from reading as success | A scorer that never commits is uncertified; a constant column is unserved | A test that asserts nothing fails; a parity program that prints nothing fails |
| Negative results recorded as permanently as wins | Stops the same idea being re-proposed | 32 closed research threads, checked before any proposal | 96 design notes of rejected features, searched before adding syntax |
| Every fix ships with the test that reproduces it | The suite becomes the history of what went wrong | 81 causality-marked tests | 244 parity programs, 250 error cases |
| One source of truth, enforced | A hand-kept copy drifts; a derived one cannot | Artifacts carry their causality manifest; loaders refuse a mismatch | The spec is the source of truth; every builtin list is derived from one table |
| Judge by median and trimmed mean, show the full table | Stops a tail or a cherry-picked cell carrying a verdict | A standing feedback rule since 2026-09-16 | Measure by rewriting the generated code one change at a time |
| Verify on real data before shipping | Synthetic tests confirm intentions; real data exposes assumptions | Real tape fixtures, replay at live cadence | Packages held to scikit-learn, scipy and pandas to the last digit |
| Decisions logged verbatim, with dates | Authorship of the judgment is on the record | The architecture documents and 24 feedback notes | 62 decisions quoted in the roadmap with their dates |
| The reviewer's questions become rules, then gates | The control that the agents lack is supplied from outside and then built in | "Are you sure?" became the truncation audit | "Why is it slow even compiled?" became the measurement rules and the bench harness |
6. What it took from the human
The agents wrote nearly all of the code. I owned the architectural choices, the acceptance criteria and the decisions to reject or retract work; the agents implemented most of the resulting systems, tests and safeguards. What they did not supply, and what the record shows was supplied from outside, is four things. The questions: the retractions above each began with one, asked by someone who did not accept the tone of the answer as evidence. The kill decisions: 32 research threads and 96 language features were ended and written down, each closing a door an agent would have reopened. The standards: the rules in the manuals were written after failures, with their reasons, and then moved into gates. And the architecture: one feature store rather than per-script features, one intermediate representation rather than two backends with their own rules. Those are the parts to be able to explain from memory, and they are the parts an interviewer should test.
Commit activity remained high as the engineering gates were introduced and strengthened: the research platform's manual arrived in July 2026 and its causality gate in September, the compiler's manual in September, and both repositories had their busiest months in August and September. This does not establish that the gates increased productivity; commit counts measure activity, not velocity or quality. It shows that stronger validation was compatible with continued development in these two projects.
7. Five lessons for engineering leaders
- Write the rule with its reason, or it will be argued with. Every rule that held in either manual names the failure that caused it.
- Put the gate where the tool refuses, not where a reviewer advises. A certification in the write path, a verifier in every build, one command before a checkpoint changes. A rule an agent can skip is a suggestion.
- No verdict is not a pass. A scorer that never commits, a column that never varied, a test that never asserted, a program that printed nothing: each had passed. Make silence fail.
- Record what failed as permanently as what worked. Agents re-propose; a written refutation is the only thing that stops the loop, and it is knowledge paid for once.
- The reviewer's questions are the control; turn them into rules. In these incidents the agents' confident explanations were not a dependable correctness signal; the reviewer's question was, and the question that caught a leak today is the gate that catches the next one.
The lesson from these two programs is not that AI coding agents can be trusted to get everything right. It is that an engineering organisation can make their work testable, rejectable and auditable. The agents can write the implementation and even the safeguards; someone still has to own what those safeguards must prove.
Appendix: manifest
| Item | Value |
|---|---|
| Finch counts | git on 2026-10-11: 2,670 commits from 2024-12-09; commits by month from the log; CLAUDE.md born 2026-07-22 with 10 revisions; 154 test files, 81 marked causality; 51 architecture documents; 169 memory notes, 24 of kind feedback; lines of Python and TypeScript counted over the application, scripts and tests |
| Crow counts | git on 2026-10-11: 522 commits from 2026-02-23; CLAUDE.md born 2026-09-06 with 64 revisions and 75 entries under "Things that have bitten"; 22 design rules; 96 design notes in the spec; 62 quoted decisions in the roadmap; 244 parity programs; 250 error cases; 56 memory notes |
| Finch cases | The manual's causality section; the audit documents of 2026-09-22 and 09-23; the memory notes on each leak; the feature store's certification log of 2026-10-08 |
| Crow cases | The manual's recorded failures; the roadmap entries of 2026-10-08 and 10-09; parity programs 190 and 198; the fuzzer's seeds |
| Quotations | The reviewer's questions are quoted as the roadmap and the memory notes recorded them, with their dates |
| Not claimed | Any return, win rate or trading result from the research platform; any user, adoption or production use of the language; any statement about coding agents in general beyond these two programs |
Scope
Two programs, one person, one method, and the agents' own failures as the evidence, which is the most honest evidence available since the alternative is their successes as they report them. What this documents is the set of defects the agents built and certified, the gates that caught them, and the management mechanisms that were written down as they were learned. What it does not claim is that agents are reliable or unreliable in general; it claims that reliability was a property of the system around them, and that the system was built one failure at a time. The agents wrote nearly all of the code in both programs, including the code that caught their own mistakes; I owned the architectural choices, the acceptance criteria, the standards and the decisions to reject or retract work.
