About this series. This is a detailed account of an agentic AI coding project I undertook a few months ago, published in three parts.

Part 1 — Getting started covers what agentic programming is, why I chose BioMysteryBench, my setup, and the iterative loop that produced a first working harness.

Part 2 — Improving the performance of the base model is the engineering heart: swapping in an open model on purpose, the provider odyssey, the critic agent, the trajectory post-mortems, and the BLAST and I/O fixes that mattered more than any model upgrade.

Part 3 — Reflections steps back to what it all means. Understanding AI as middleware and AI’s relationship to life.

A github code repository accompanies these posts. See https://github.com/iandonaldson/bio-mystery-bench

Recursive Human Ltd [19] is currently searching for founding clients and surveying needs in the bioinformatics, data science and AI space. Take a look at the about page and, if you think your company might benefit from the described approaches, please email me or book an introductory meeting.

Table of Contents

Preamble

In November of 2025, Anthropic Engineering published an article that had a state-change effect on how I used AI for agentic coding — and, judging by how quickly the wider industry converged on the same scaffold-first thinking, I doubt I was alone [1]. The article's central argument is that letting an agent make progress across multiple context windows depends far more on the surrounding scaffolding — a features list, a progress file, git commits, end-to-end verification — than on the raw capability of the model. In this article, I want to describe my current practice and demonstrate its use in tackling a problem that is interesting in its own right: creating a harness for an AI agent that autonomously answers questions in Anthropic's bioinformatics benchmark test for agents, BioMysteryBench [2].

Along the way, I'll explain agentic programming, using agents to answer benchmark questions, and techniques to improve the performance of both tasks. It is my hope that this will be useful to anyone interested in this area; I have also made the GitHub repository [18] available for those who code and might want to dive into the details.

What is agentic programming?

Agentic programming is the practice of using a Large Language Model (LLM) to help write code. There is no standardised nomenclature for how people use AI to code, but it is common to describe the practice as having a set of ascending levels [4][5]. The published taxonomies I've seen tend to have five levels, and they all turn on a single variable — how much work the AI does before it hands back to you. Ive added a level 0 for completeness.

  • Level 0 — Autocomplete. You use an "autocomplete" feature inside an Integrated Development Environment (IDE) — a text editor purpose-built for writing software, such as VS Code, Posit/RStudio, Claude Code, or Google's Antigravity [20]. You type def parse_fasta(path): and the IDE offers to complete the function body, which you accept, reject, or edit.

  • Level 1 — Copy-and-paste from a chatbot. You use a web interface to a chatbot (like Claude, OpenAI's ChatGPT, or Google's Gemini) to describe a function in terms of input, process and output. The chatbot writes code that you copy and paste into your repository and then test.

  • Level 2 — One-shot generation in the IDE. You describe an entire programme in an IDE (input, parameters, process and output) and allow the AI to generate the code in a single shot.

  • Level 3 — Plan, then generate with review. The same as level 2, but with constraints: the AI must present a plan for developing the code that a human reviews before it is carried out, and the human reviews and approves all changes to the code base. This "plan-approve-execute" mode is widely regarded as the 2026 sweet spot for real work [4].

  • Level 4 — Autonomous within a scope. The same as level 3, but the developer foregoes review of every change and lets the AI deal with errors and problems during development by itself; it reads and interprets the errors the program returns and only once a working change is produced does the human review and approve the final result.

  • Level 5 — Full autonomy. The developer foregoes review of the code entirely and only examines and provides feedback on the final product; the AI is directed by this high-level feedback alone. As of early 2026 this was still science fiction for most software engineers, but stories of "dark factory" codebases [22] — in which agents plan, write, test and ship with no human review at any step — and of Cursor's FastRender [23], a browser rendering engine assembled by 2,000+ parallel agents over a few weeks, were already in the air. The prevailing expectation is that development of this kind will only become more common [22][24].

You will come across multiple accountings of what constitutes agentic programming on YouTube, LinkedIn, and your-favourite-ai-tech-site. The distinguishing factor between the different levels is the degree of freedom that the developer affords the AI, and the shift in attention that the developer makes — from writing and reading code toward defining and examining the behaviour of the final software product that the code generates.

Choosing a problem

In April of 2026, Anthropic published an article called Evaluating Claude's bioinformatics research capabilities with BioMysteryBench [2]. BioMysteryBench is a set of 99 questions in the domain of bioinformatics, written by domain experts, meant to serve as a test set for assessing an AI system's ability to answer bioinformatics questions.

It is not the first such benchmark — LAB-Bench [6], BixBench [7], Biomni [8], SciGym [10] and ProteinGym [9] all precede it — but it is distinctive in an important way. Rather than grading against a scientist's derived conclusion, BioMysteryBench grades against objective, ground-truth properties of the data — questions whose answers come from controlled, objective properties of the data or from orthogonally validated metadata — while still allowing full freedom in analytical strategy. Anthropic highlights three properties: the benchmark is method-agnostic (research freedom and creativity are allowed), it has objective ground-truth answers, and — because it does not require a question to be human-solvable — it permits "human-difficult" question inclusion [2].

That last property matters. Of the 99 questions, 76 are human-solvable and 23 are "human-difficult" — questions that Anthropic's "panel of experts" could not solve. Claude's own models made real progress even on the hard subset: Claude Opus 4.6 scored 77.4% on the human-solvable problems and 23.5% on the human-difficult ones, while Claude Mythos Preview reached roughly 30% on the human-difficult set [2].

BioMysteryBench presented a unique opportunity. Although the benchmark questions are freely available through Hugging Face [3] (the preview set of five is public; the full set requires access approval), there is no readily available default application that can iterate through these questions and attempt to answer them. So this was a non-trivial problem in my domain that I could use to demonstrate the power of agentic coding to create such an application. But most importantly, it represented what ought to be the heart of every agentic programming project — a set of test questions.

Materials

There are many ways to carry out agentic coding. Even if you stick with one LLM provider, each can be used in multiple ways. Anthropic itself provides three different interfaces for coding — the web interface at claude.ai, the Claude desktop application, and the Claude CLI (command-line interface, "Claude Code"). All the major players (Google, Microsoft, OpenAI) offer analogous products vying for your attention, and the internet is rife with reviews claiming one to be better than another. All of them change constantly. My advice is to pick one and stick with it while you learn, then explore others. (For a getting-started orientation, see the official docs for Claude Code [12], OpenAI Codex [13] and GitHub Copilot [14], and a recent side-by-side comparison [11] — the pattern most teams settled on in 2026 is Copilot as a broad autocomplete baseline plus Claude Code for high-leverage agentic work.)

Here's my full setup:

  1. A MacBook Pro from 2020 with a 2.3 GHz Quad-Core Intel Core i7 processor and 16 GB RAM — purposefully not a powerhouse machine; I'll offload all the heavy GPU work remotely.

  2. Claude Desktop for Mac version 1.8555.2 (includes Chat, Cowork and Code interfaces) with a Claude Pro subscription. I use this as my main interface to the Claude Code functionality.

  3. Visual Studio Code, local git, and a GitHub account with a monthly Copilot subscription. This lets me keep tabs on what Claude is doing and review results; Copilot can independently review pull requests.

  4. Docker Desktop version 4.46.0. Used to sandbox the agent that has rights to install and run bioinformatics software.

  5. Claude API pay-as-you-go subscription (https://platform.claude.com/).

  6. OpenAI API pay-as-you-go subscription (https://platform.openai.com/).

  7. Cerebras API pay-as-you-go subscription (https://cloud.cerebras.ai/).

  8. Tavily API pay-as-you-go subscription (https://app.tavily.com/).

Getting started

Getting started was as simple as opening a text file and describing the system I wanted to build. The whole project began with a single message pasted into a fresh session — a link to the BioMysteryBench article and this request:

Can you help me set up a repository that would create a long-running agent to work on the bio-mystery-bench problems and assess performance? […] Obviously, this is not an interactive session with Claude but a ReAct agent with a long-running harness. Look for a description of the setup (provide references) or try to re-create the setup based on current product knowledge. Could this system be safely run on my laptop (using a container maybe)? Place a copy of your system description and findings in the documents directory.

That prompt already encodes most of what I care about: a clear deliverable, a request for references rather than guesses, an explicit safety constraint, and an instruction to write its findings down where I can review them. This first step — describing the system and getting a plan you agree with — is the single most important part of the whole process. Everything after it is iteration.

Mechanically, here is how the first session went. I created a directory on my laptop called bio-mystery-bench and, inside it, another directory called documents. I then opened Claude Desktop, clicked Code (to select a coding session as opposed to a Chat or Cowork session), and then + New Session. At the bottom of the window, just above the input dialog bar, I selected the bio-mystery-bench directory to tell Claude where I wanted to work, and selected Plan mode to tell Claude I wanted a plan based on my input before any code was written.

Figure 1 — Starting a new coding session in Claude Desktop. In order: (1) select the Code interface; (2) click + New Session; (3) set the working directory to bio-mystery-bench; (4) switch on Plan mode so Claude proposes a plan before writing any code.

Claude then asked me a few questions — about the dataset to start with (the first 5 questions of BioMysteryBench or all 99; it suggested sticking with the first 5) and about the default model to answer the questions (it suggested claude-sonnet-4-6). I accepted the suggestions and it generated a plan, which it presented in a side panel. I reviewed the plan and accepted it, allowing Claude to create the first version of the code base. Finally, Claude gave me a summary of what it had made.

Figure 2 — Plan mode in action. The side panel (left) holds the proposed plan I reviewed and approved; the summary (right) describes the first version of the repository Claude built once I accepted.

I then asked Claude to push these changes to a GitHub repository where I could review and accept them. This constitutes the basic cycle I would continue in the next 60 hours of session time and dozens of separate conversations over the course of two and a half weeks.

The initial creation of the first untested repo took less than two hours.

How I worked: the iterative loop

What follows is less a diary than a catalogue of behaviours — the practices that made the loop productive, the division of labour between me and Claude Code, and the gotchas that cost time. If you take one thing from this section, let it be that the interesting work was almost never writing code; it was deciding what to build next and how to keep the system honest.

The division of labour

A useful way to see the project is as two roles that rarely overlapped:

  • What I contributed: the questions. Which problem to solve next, what "done" meant, which trade-offs were acceptable, and — repeatedly — why a proposed shortcut would not generalise. I set constraints (safety, cost, scope), reviewed plans, approved pull requests, and made the strategic calls (switch models, add a critic, stop chasing a dead end).

  • What Claude Code contributed: essentially all of the code, the tests, the documentation, the debugging, and — when asked — the research. It also proposed plans, surfaced trade-offs I hadn't considered, and caught its own bugs once the harness around it was good enough to make them visible.

The shift the November article describes is exactly this: my attention moved from reading and writing code to defining and inspecting behaviour.

Practices that kept the loop on course

A number of habits accreted over the first week and then hardened into rules (many of them living in the project's CLAUDE.md, the file Claude Code reads automatically at the start of every session):

  • Start in Plan mode. Never let the first move be code. A reviewed plan is cheap; an unreviewed refactor is not.

  • Work on feature branches; merge only after tests pass. I asked Claude to branch for any non-trivial change, commit only when the test suite was green, and open a pull request I would review and merge. Commits happened only when I asked.

  • Elephant-carpaccio slicing. New features had to be cut into thin, independently testable sub-slices before any code was written. This one rule prevented more thrash than any other (see the gotchas below).

  • A test for every feature. Early on I asked Claude to create documents/features.md describing each functionality, then write a pytest test for each. I wasn't after exhaustive coverage — just enough to protect against regressions. The suite grew from a handful of tests to 370+ over the project.

  • Keep the documentation live. A directive in CLAUDE.md requires the README.md to be reviewed after any change. Detailed "code walkthroughs" (single-source reference documents that trace, in call order, what happens when you run the eval) were generated per session.

  • Capture learnings so future sessions inherit them. After a run of avoidable bugs, I asked Claude to create a code-learnings SKILL — a growing list of concrete lessons (L-01, L-02, …), each tied to the bug that taught it and a copy-pasteable code pattern. CLAUDE.md tells every new session to read it first. By the end it held 30+ entries.

  • Session-close hygiene. A session-close SKILL reconciles features.md, the progress file, the learnings, and a fresh walkthrough at the end of a session, then opens a single docs-only PR.

Two of these — code-learnings and session-close — are worth dwelling on, because they are the mechanism by which a stateless model accumulates something like institutional memory. The model does not remember previous sessions; the harness remembers for it.

Gotchas, and how they were handled

The failures were more instructive than the successes:

  • Context-window fatigue. In one long session, Claude "corrected" a deprecated model name in the wrong direction and had to reverse it a PR later, and independently missed a second copy of a routing bug. Both are consistent with a saturated context losing track of details. The remedy was procedural: shorter sessions, thinner slices, and the learnings file.

  • Silently swallowed errors. A critic agent was wired up but called the wrong client; an except Exception: return "" made the failure invisible until I read the raw trajectory logs. This produced a durable coding standard (never swallow exceptions to empty strings) written into both code-learnings and every SKILL that generates bash.

  • The agent's "time-angst." The bioinformatics agent repeatedly abandoned strategies citing "time constraints" — but there is no wall-clock limit in the harness, only a step limit. It also gave up when a genome download "timed out" at the container's 10-minute exec ceiling, even though a correctly formed download would have finished. (More on both in Part 2.)

  • "The tool isn't installed" — when it was. The agent read an empty BLAST result as evidence that BLAST was missing, and burned a dozen steps trying to reinstall it. Worse, in one embarrassing stretch I discovered BLAST genuinely was never in the Docker image. This whole saga gets its own section in Part 2, because it turned out to be the single most important performance lever in the project.

  • Soft caps that aren't caps. The step-limit feature fired a "please answer now" prompt once at the limit — but didn't actually stop the loop, so the agent ran 18 steps past a max of 100. A reminder that a nudge in a prompt is not an enforcement.

  • The parallel-agents misadventure. At one point I ran three Claude Code agents in parallel against disjoint file sets to speed up a batch of features. It worked — but I couldn't keep track of three branches and three conversations under time pressure. My own note from that day reads: "This was a mistake. I'm the bottleneck." Parallelism doesn't help when the human review step is the constraint.

Proving the solution was sound

Before I optimised anything, I wanted to know the solution was sound. The earliest questions I put to Claude were deliberately about properties of the whole system, not features. I summarised them to myself as SERFScalable, Extensible, Robust, Feasible — and probed each with a concrete question and a follow-up demand:

  • Will the workflow preserve a record of the agent's reasoning for later inspection? Follow-up: if not, fix it. (Initially it did not — trajectories were truncated and the agent's scripts were lost; this was fixed so every step is logged.)

  • Can the whole thing run inside a container on a 16 GB laptop with no possibility of altering data outside the project directory? Follow-up: make it physically impossible, not merely discouraged by a prompt. (This drove real changes — container writes were restricted to the project directory, and later the read-only input mount was replaced with a put_archive call after long-running Docker sessions started throwing I/O deadlocks.)

  • Can I add my own problem/solution datasets? Follow-up: document the format with worked examples. (Yes, with a documented format built from the existing examples.)

Those questions map onto the four SERF properties directly: reasoning logs and a passing test suite make the system robust (testable, transparent, observable); the container sandbox and the dataset format make it feasible and extensible; and the deliberate refusal to depend on my laptop's hardware keeps it scalable. Establishing all four before chasing benchmark scores is what let the later performance work in Part 2 proceed without constantly re-litigating whether the foundation was trustworthy.

References

  1. Anthropic Engineering, Effective harnesses for long-running agents (2025-11-26). https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents

  2. Anthropic, Evaluating Claude's bioinformatics research capabilities with BioMysteryBench (2026). https://www.anthropic.com/research/Evaluating-Claude-For-Bioinformatics-With-BioMysteryBench

  3. BioMysteryBench dataset, Hugging Face (preview set public). https://huggingface.co/datasets?search=biomysterybench

  4. Swarmia, Five levels of AI coding agent autonomy, and why higher isn't always better. https://www.swarmia.com/blog/five-levels-ai-agent-autonomy/

  5. Cloud Security Alliance, Autonomy Levels for Agentic AI (2026-01-28). https://cloudsecurityalliance.org/blog/2026/01/28/levels-of-autonomy

  6. Laurent et al., LAB-Bench: Measuring Capabilities of Language Models for Biology Research, arXiv:2407.10362 (2024). https://arxiv.org/abs/2407.10362

  7. FutureHouse, Announcing BixBench: A Benchmark to Evaluate AI Agents. https://www.futurehouse.org/research-announcements/bixbench

  8. Biomni: a general-purpose biomedical AI agent (Stanford). https://biomni.stanford.edu

  9. Notin et al., ProteinGym: Large-Scale Benchmarks for Protein Design and Fitness Prediction, NeurIPS 2023 / bioRxiv. https://www.biorxiv.org/content/10.1101/2023.12.07.570727

  10. SciGym: Measuring Scientific Capabilities of Language Models with a Systems Biology Dry Lab, arXiv:2507.02083. https://arxiv.org/abs/2507.02083

  11. Cosmic JS, Claude Code vs GitHub Copilot vs Cursor (2026): Full Comparison. https://www.cosmicjs.com/blog/claude-code-vs-github-copilot-vs-cursor-which-ai-coding-agent-should-you-use-2026

  12. Anthropic, Claude Code overview (documentation). https://docs.claude.com/en/docs/claude-code/overview

  13. Model Context Protocol (MCP). https://modelcontextprotocol.io

  14. VADAOrchestra: Neurosymbolic Orchestration of Adaptive Reasoning Workflows, arXiv:2606.22485. https://arxiv.org/abs/2606.22485

  15. SPL: Orchestrating Workflows with Declarative Deterministic–Probabilistic Composition, arXiv:2607.07727. https://arxiv.org/abs/2607.07727

  16. Donaldson, I., bio-mystery-bench (GitHub repository). https://github.com/iandonaldson/bio-mystery-bench

  17. Recursive Human Ltd. https://recursivehuman.com/

  18. MindStudio, What Is a Dark Factory AI Agent? How to Build Fully Autonomous Software Pipelines. https://www.mindstudio.ai/blog/what-is-a-dark-factory-ai-agent

  19. Willison, S. (on W. Lin), FastRender: a browser built by thousands of parallel agents (2026-01-23). https://simonwillison.net/2026/Jan/23/fastrender/

  20. BCG Platinion, The Agentic Software Factory. https://www.bcgplatinion.com/insights/the-agentic-software-factory

  21. Anthropic Engineering, Equipping agents for the real world with Agent Skills (Agent Skills open standard; see also agentskills.io and github.com/anthropics/skills). https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills

  22. Anthropic, Extending Claude's capabilities with SKILLs and MCP servers (SKILLs and MCP are complementary; SKILL portability "depends on the implementation"; vendors ship SKILLs alongside their MCP connectors). https://claude.com/blog/extending-claude-capabilities-with-skills-mcp-servers

  23. Unite.AI, Anthropic Opens Agent Skills Standard, Continuing Its Pattern of Building Industry Infrastructure (notes MCP was donated to the Linux Foundation's Agentic AI Foundation, Dec 2025, and Agent Skills opened 2025-12-18). https://www.unite.ai/anthropic-opens-agent-skills-standard-continuing-its-pattern-of-building-industry-infrastructure/

  24. Agrawal, J., The Model Context Protocol (MCP): Game-Changer or Vendor Lock-in Trap? (Medium) — argues an MCP/SKILLs stack led by one vendor raises lock-in questions, and weighs the mitigations. https://medium.com/@jalajagr/the-model-context-protocol-mcp-game-changer-or-vendor-lock-in-trap-27a5cb404ab8

  25. Model Context Protocol (MCP) at First Glance: Studying the Security and Maintainability of MCP Servers, arXiv:2506.13538 — notes vendor-lock-in concerns and the largely unexplored maintainability/security of public MCP servers. https://arxiv.org/abs/2506.13538

  26. Anthropic, Claude Science, an AI workbench for scientists (2026-06-30). https://www.anthropic.com/news/claude-science-ai-workbench

  27. Zhou, C. et al., Externalization in LLM Agents: A Unified Review of Memory, Skills, Protocols and Harness Engineering, arXiv:2604.08224 (2026). https://arxiv.org/abs/2604.08224

  28. Banu, B., Biological Motifs for Agentic Control: A Typed Interface Correspondence between Gene Regulatory Networks and Agentic Software Architectures, arXiv:2607.04240 (2026). https://arxiv.org/abs/2607.04240

  29. Istrail, S., Ben-Tabou de-Leon, S. & Davidson, E.H., The regulatory genome and the computer, Developmental Biology 310, 187–195 (2007). https://doi.org/10.1016/j.ydbio.2007.08.009

  30. Istrail, S. & Davidson, E.H., Logic functions of the genomic cis-regulatory code, PNAS 102, 4954–4959 (2005). https://doi.org/10.1073/pnas.0409624102

  31. Buchler, N.E., Gerland, U. & Hwa, T., On schemes of combinatorial transcription logic, PNAS 100, 5136–5141 (2003). https://doi.org/10.1073/pnas.0930314100

  32. Sabari, B.R. et al., Coactivator condensation at super-enhancers links phase separation and gene control, Science 361, eaar3958 (2018). https://doi.org/10.1126/science.aar3958

  33. Nolan, C. (director), Memento, Newmarket Films (2000). https://www.imdb.com/title/tt0209144/

Reply

Avatar

or to participate

Keep Reading