Appearance
Give each agent exactly what this task needs — nothing more — because every token that isn't signal is noise competing with signal.
Pattern
Minimum Context
The shape
What the agent gets — and what it doesn't.
Signalreceives
- AGENT_SYSTEM.md
- task description (7 sections)
- requiredReads files — exactly these
- discoveredContext from upstream
Enough to orient and act. Architecture, the specific brief, the specific files, the specific handoff.
Noisedenied
- full parent conversation history
- prior phase agent transcripts
- tangential modules, "just in case"
- full spec pipeline output
Nothing the orchestrator happened to discuss, nothing the previous agent rambled through, nothing a sibling module touches. Those belong to other jobs.
If you pass the full history "so it has background," the agent drowns in noise and you can't tell which context caused the drift.
The budget
Context has a sweet spot. Too little guesses; too much loses the thread.
Context volume for one task
signal-to-noise ratio
STARVE
✓ SIGNAL
POLLUTE
0 filesjust enoughfull history
✗ STARVE Agent fills gaps with guesses. Invents conventions that don't match the codebase.
✓ SIGNAL Current schema + target schema + migration syntax. Nothing else for this job.
✗ POLLUTE UI layer, test suite, CI config, PR history all dumped in. Agent loses the thread.
The sweet spot is task-specific. The planner's job is to find it per task and hand it to the agent as requiredReads.
The enforcement
requiredReads makes "minimum" a constraint, not an aspiration.
The planner lists the exact files. The hook holds the agent at the boundary.
Agent spawn
task carries requiredReads = [schema.sql, target.sql, migrate.md]
Agent tries
Edit("migrate.sql") → BLOCKED by context-gate.sh
Agent reads
Read(schema.sql, target.sql, migrate.md) → logged
Agent tries
Edit("migrate.sql") → ALLOWED
The gate does two jobs at once — critical files can't be missed, and files not on the list aren't "discovered" and pulled in. Scope creep is impossible.
The handoff
Between tasks — curated record, not raw transcript.
dumpprior agent's full transcript
user: let's plan the auth migration...agent: I'll start by reading session.ts...user: wait actually check users firstagent: reading users.ts — hmm there's a...(47 tool calls elided)agent: ok so the approach is actually...user: no, do it the other wayagent: revised plan: ...· · ·
~18,000 tok90% noise
→
next task
discoveredContextstructured UPSTREAM_CONTEXT
decisions:- use migration table v2- defer users.role splitdrift_found:- session.expires is nullablegotchas:- oauth_tokens indexes hash
~300 tok100% signal
Read by the next agent via task_get.py's UPSTREAM_CONTEXT field — exactly what's relevant to its task, not everything the prior agent encountered.
The discipline
Context is a performance-determining resource — budget it per task, not per pipeline.
If you're tempted to add context "just in case," delegate it to a required read instead. One agent, one task, one precise list of files — and a hook that keeps it honest.