· 4 min read
Conservative to the token
The agent harness primitives that survived the last year are the ones you can read off deprecation notices: a loop with no limits, a frozen tool set, a markdown file, and a transcript on disk.

The Philosophy section of pi's README is mostly a list of refusals: no MCP, no sub-agents, no permission popups, no plan mode, no built-in to-dos, no background bash. Read that and you brace for a tiny program. Then you clone the repository and count 437 source files and 102,286 lines, one of which — agent-session.ts — is 111 KB by itself.
Both things are true at once, and the distance between them is the whole design. pi is conservative about exactly one resource, the tokens the model reads before it does anything. Everything underneath that line can be as large as it needs to be, because you are the only one paying for that part.
// packages/coding-agent/src/core/tools/index.tsexport type ToolName = "read" | "bash" | "edit" | "write" | "grep" | "find" | "ls";// packages/coding-agent/src/core/system-prompt.tsconst tools = selectedTools || ["read", "bash", "edit", "write"];Seven tools are implemented and four are switched on. Why write grep against ripgrep, teach it .gitignore, cap its lines at 500 characters, and then not tell the model it exists? You can turn it on for a read-only session with pi --tools read,grep,find,ls, and the rest of the time it stays quiet. The code gets written once and the description gets paid for on every single request.
The only scarce thing#
Mario Zechner's figure for pi is that the system prompt and all four tool definitions together come in below 1,000 tokens, on the theory that frontier models have been trained hard enough on coding work that they do not need ten thousand tokens explaining what a coding agent is. The comparison he keeps drawing is against MCP servers, which hand over a full catalogue whether or not the session will ever touch it.
| Chrome DevTools MCP, 26 tools | 18,000 |
|---|---|
| Playwright MCP, 21 tools | 13,700 |
| pi: system prompt and four tools | 1,000 |
| Browser tools as a CLI with a README | 225 |
There is a harder reason the set has to stay frozen. Anthropic's prompt cache builds its prefix in the order tools, system, messages, and a change at any level invalidates that level and everything after it. Add one tool mid-session and the cache for the entire conversation is gone. The Claude Code team designed plan mode around this: rather than removing tools on the way in, every tool stays present and entering and leaving the mode are themselves tool calls.
Then Zechner benchmarked the thing he had been arguing against and it went the other way. Across 120 runs of terminal-control tasks his terminalcp tool hit a 100 percent success rate as an MCP server and as a plain CLI, with the MCP version finishing 23 percent faster because every bash invocation was tripping a command-safety check that MCP calls skipped. He came away calling the protocol plumbing and went on counting catalogue sizes.
Read what the specs delete#
If you want to know which primitives are load-bearing, skip the launch posts and read the deprecations. MCP's July 28, 2026 revision retires Roots, Sampling, and Logging, and the pull request says why: they were identified as having low adoption relative to their implementation complexity. Three primitives, specified, implemented across four SDKs, retired for being hard to build and unloved.
| Deprecated feature | Official migration path |
|---|---|
| Roots | Pass directories or files through tool parameters, resource URIs, or server configuration |
| Sampling | Integrate directly with LLM provider APIs |
| Logging | Log to stderr on stdio transports, and use OpenTelemetry for observability |
Every migration path in that table points at something that already existed before the protocol did. Meanwhile ACP, the editor-to-agent protocol Zed and JetBrains co-govern, published a v2 draft on July 20 that removes fs/read_text_file, fs/write_text_file and the whole terminal/* family, telling agents to reach for MCP servers instead. Both specifications are cutting from opposite ends, and both have landed on a smaller surface than they shipped with.
What is left in the box#
The surviving list is short. The loop runs until the model stops asking for tools and carries no step limit; pi's author says he never found a use for one. The tool set is four entries whose definitions never move mid-session. For project context you use a file you did not invent, since AGENTS.md already sits in tens of thousands of repositories under Linux Foundation stewardship and pi looks for it by name alongside CLAUDE.md.
The fourth piece is the one people skip. pi's transcript is JSONL, one object per line, every entry carrying a parentId, which makes the history a tree that branches in place rather than a log you replay into a database. Resume, fork, and an RPC mode that pipes the same events into another program all fall out of that file existing. I have not run pi for a month of real work, so the four-tool claim is his evidence rather than mine. The file, at least, you can open and read yourself.
The crack in the design is compaction, which pi shipped without and now runs by default: hold back 16,384 tokens, keep roughly the last 20,000, hand everything older to another model call to summarize. That summary is lossy, and the model never sees the originals again. What got dropped is still sitting in the JSONL, in a file you will open exactly once, on the afternoon the agent confidently contradicts something you told it an hour earlier.