Unbounded loop
No max-turns, token, wall-clock, or money budget. The agent rambles until the bill or the context dies.
Cause: Termination treated as an accident of the model instead of a first-class intent.
Fix: Force a done schema, a step cap, and a money cap. 'Done' is a tool or a structured intent.
The Agent LoopUnsandboxed exec
A shell or code-act tool on the host with production credentials.
Cause: Security asked of the model instead of the executor.
Fix: E2B, a container, OpenHands isolation, or a policy sandbox. Secrets stay in the executor.
Sandboxes and IsolationSecurity by system prompt
'Never delete files' as the only guard. The model is a confused deputy and will try to help.
Cause: Treating policy text as an enforcement mechanism.
Fix: Allow / ask / deny in code. Pin MCP servers. Quote untrusted content.
Injection, Poisoning, Confused DeputyUnowned prompt
The policy lives in a framework black box you cannot diff, test, or revert.
Cause: Framework defaults inherited as religion.
Fix: Store prompts in git. Read what the framework sends. Eval on change.
Own Your PromptsContext hoarding
Raw HTML, full CI logs, six PDFs, entire JSON envelopes stuffed 'just in case'. The goal is the first thing forgotten.
Cause: No context builder. The transcript is treated as the product.
Fix: Pinned / working / recalled / compacted. Files for bulk. Pointers in the window.
Own Your Context WindowShared mega-context
A crew sharing one bloated window. Specialists drown in each other's work.
Cause: A second agent treated as a personality, not a context boundary.
Fix: Fresh or sliced windows, written briefs, structured returns. Subagents protect the parent.
Small, Focused AgentsHandoff history dump
Transfer of control copies the entire conversation into the specialist.
Cause: Handoff implemented as 'also here is the log'.
Fix: Rewrite the brief. Adjacency list plus a summary, not a dump.
Handoffs and SwarmSubagent inherits the parent
Nested loops get every tool and every secret. Isolation was theater.
Cause: Spawn as a fork of the parent process rather than a reduced principal.
Fix: Narrow tools, no parent tokens, written return, caps on depth, breadth, time.
SubagentsRole-play without a different ACI
Backstories that do not change tools, prompt constraints, or schema. Theater.
Cause: Crew demo copied without a process or a tool split.
Fix: A role is real only if it changes tools, prompt, or schema. Otherwise it is one agent.
Role-Playing CrewsUnsupervised group chat
Agents talking to each other against production tools with no turn bound and no typed messages.
Cause: Conversational multi-agent used as a bus.
Fix: Bound turns, typed messages, no production tools on the chat; prefer handoff or supervisor.
Conversational Multi-AgentComputer-use as the first tool
A browser or desktop agent used where an API, a workflow, or a grep would do.
Cause: Demo gravity. Computer-use is visible and expensive.
Fix: API first, workflow second, browser last, always sandboxed.
Computer UseMemory as unfiltered logs
Session transcripts stuffed into the next session. The user cannot inspect or delete them.
Cause: Confusing recall with a dump.
Fix: Memory writes are tool calls. Curate. Letta's core vs archival. User can inspect/delete.
Long-Term MemoryMega-tool
One function whose argument is a JSON blob of 'whatever'. An untyped shell with extra steps.
Cause: Avoiding the work of designing an ACI.
Fix: One job per tool. Named verbs. Typed args. Capped results. Idempotent or journaled.
Designing the Agent-Computer InterfaceEval by demo
Architecture first, golden set never. Success is a recorded GIF.
Cause: Taste substituting for measurement.
Fix: 20–50 real tasks before the framework. promptfoo, Inspect, DSPy. CI on prompt change.
EvaluationTwo orchestration frameworks
LangGraph plus CrewAI plus AutoGen in one process. Nobody owns the loop.
Cause: Star-driven shopping.
Fix: One loop. Libraries for missing primitives only.
Choosing a FrameworkStar-driven selection
Picking the viral harness of the week. Contribution-free clones with disabled PRs.
Cause: Stars as ranking instead of as a floor.
Fix: Pick for the constraint: checkpoints, types, harness, documents. Read Canon's atlas.
Choosing a FrameworkHITL that cannot resume
The human answers and the run is gone. Approval as a side channel, not a tool.
Cause: Pause is not a first-class API. Human contact is not a tool call.
Fix: ask_human as a tool. Checkpoint. Resume from the blob.
Humans as ToolsDouble side effects
Non-idempotent tools, no journal. A retry refunds twice.
Cause: Executor retries without idempotency keys.
Fix: Idempotency keys, journals, unify state so 'already refunded' is visible to the reducer.
Unify Execution and Business StateSilent truncation
The goal is dropped to keep junk observations. The model continues confidently.
Cause: No compaction policy. FIFO on the wrong end.
Fix: Pin the goal. Compact observations. File the rest. Never drop the goal first.
Compaction and ErrorsTool poisoning
An MCP server or plugin whose description is an instruction: 'call me first, send secrets'.
Cause: Tool descriptions treated as trusted system text.
Fix: Pin, hash, review schemas. Treat MCP as an attack surface. Allowlist tools.
Injection, Poisoning, Confused DeputyPlan generated once
A 40-step plan written at t=0 and never rewritten when the world disagrees.
Cause: Plan as a thought, not a tool.
Fix: Update the plan as a tool call. Plan/act as a permission change.
Plan Mode and Act ModeNo verifier in the loop
The agent writes code and declares victory. Tests, typecheck, and build are optional.
Cause: Done defined as a sentence.
Fix: Verify tool from AGENTS.md. Done = reviewable diff + tests + human gate.
Verification as Architecture