13 of 23
classes rated catchable by a deterministic check still had no hook, deny rule or code gate.
Research / Aufstin Filiko
I study how to oversee multi-agent coding systems from their real traffic: which completion claims are backed by evidence, which rules hold, and which layer actually enforces them. I also apply AI to biology.
01Field note with data
Operating multi-agent coding agents at a small company. Version 0.1, October 2026.
Summary
Four months of one operator, the core developer on the software team of a small agriscience company, running coding agents (Claude Code, Codex, OpenCode and an in-house orchestrator that plans a goal into tasks and runs builder and reviewer agents), together with the 49 rules the operator wrote after observed failures. The note compiles 30 recurring failure classes into a taxonomy and records the layer that enforced each rule. Everything in it is descriptive.
Code and data Analysis scripts, aggregate data, the taxonomy and re-implemented controls are being prepared for public release.
43 active days of retained transcripts, mostly mid-September to October 17
30 failure classes, compiled from 161 of my own corrections, in five groups. Recurrence figures are floors taken from dated notes: at least 10 instances each of completion claims not backed by the check, and of gates that passed without running. Seven classes are failures of the environment the agents worked in, not of the agents.
13 of 23
classes rated catchable by a deterministic check still had no hook, deny rule or code gate.
24 of 49
rules lived only as memory notes, and 7 more as prompt rules. Only 15 became hooks, deny rules or code gates.
81 of 86
“failed” entries from a ticket-fixing bot were the harness exiting before any verdict. Read as agent outcomes, the count overstates agent failure by more than an order of magnitude.
On one day the operator rewrote the global instruction file and the harness deny rules: test suites only on request, no worktrees in interactive sessions, commits with explicit paths, never stash. The comparison is not causal; workload and projects changed too, and the “after” window is about 11 days.
| Measure | Before | After |
|---|---|---|
| Shell calls | 56,813 | 55,382 |
| Test-suite runs per 1,000 shell calls | 44.0 | 0.8 |
| Worktree creation commands | 99 | <5 |
git stash runs, main sessions / subagents | 19 / 23 | 0 / 0 |
Whole-tree git add, main sessions / subagents | 7 / 18 | 7 / <5 |
67 of the 99 worktree commands did not begin with the git command, so a deny rule matched on a command prefix would not have seen them. More than half of the stash runs before the change came from subagents, while a memory note in the main repository already forbade stashing.
Allow or deny each tool call with a rule id: force-push, hard reset, stash in a shared checkout, credential-shaped writes into memory or handoff files, deploys without a fresh operator approval.
An “already fixed in <sha>” claim is checked with git merge-base --is-ancestor before anyone believes it.
The agent can only relay a status rendered from stored state.
Replaced a model judge that flipped between pass and block on identical input at low temperature.
Caps on unattended runs and guards on the size and shape of their diffs.
Known gaps of these patterns are part of the release: prefix deny rules versus compound commands, prompt-only rules that may not reach subagents, drift between layers that express the same rule, and the limits of lexical matching.
One operator at one company. Transcripts mostly from the last five weeks, because the harness deletes older ones, against a four-month prompt history. Heuristic definitions inferred from harness files that change between versions. Noisy lexical measures for shell commands. No ground truth yet: the taxonomy has not been applied by independent labelers.
02Research agenda
Extract every “done”, “verified”, “passing” or “deployed” claim. Check it against the agent's own trajectory (did the matching check run after the last edit, pass, and execute a nonzero number of tests?) and against later outcomes (operator contradiction, revert, a fix on top). Trace subagent claims through the orchestrator to the human, and release the extractor as a local tool.
Compare deployed rule-based hooks with model-based monitors run offline on the same traffic, at an alert budget one operator can absorb: true and false positive rates, lead time over the operator's own interrupt, whether the same action is reached another way after a block, and test-retest stability.
Which rules survive a compaction, reach a subagent, or are weakened by a later memory note. Replay real incidents in a sandbox with stand-in deploy and push commands.
In an offline replay harness with frozen fixtures, measure calibration, omissions, answer flips under pushback and provenance accuracy when a bot answers status questions from people who cannot check the work themselves.
03AI in biotech
In progress
Lineage recovery
Legacy genetics records from 2013 to 2022 used identifiers that disagreed across stores. A pattern-detection pass rebuilt the lineage with confidence scores and gave researchers about 300 parent-child pairs to confirm instead of about 30,000 raw records. The result renders as interactive phylogeny trees.
Genetics
Predicting how terpene chemotypes are inherited, using the reconstructed lineage as the backbone. Working toward a bioRxiv preprint.
Analytical
ML-assisted peak identification for gas chromatography, anchored to an in-house library of terpene standards.
Earlier
At Corteva, a TensorFlow and OpenCV model that estimates plant weight from camera images, which started a new toxicology assay.