Contents
- 01The Builder's Starting Line
- 02Your Computer, Explained
- 03How Software Fits Together
- 04Start With the Work
- 05Build Your First Useful Tool
- 06Make Changes Safely
- 07Prompts Are Specifications
- 08Models Are Components
- 09Give Agents Jobs, Not Vibes
- 10Tools, APIs, and the Harness
- 11Truth Before Intelligence
- 12Patterns for Real Systems
- 13Approval Is a Feature
- 14Receipts or It Didn’t Happen
- 15Operate and Debug the Loop
- 16Design Your Own OS
- 17Make It Ready for Real Life
- 18Build and Evolve Your OS
Give Agents Jobs, Not Vibes
Specialize workers with outcomes, boundaries, and proof.
Capability is not a role
A model may be able to write, code, research, browse, and plan. That does not mean every task should ask it to do all five at once. Roles create repeatable expectations: what context arrives, which tools are available, what the worker may change, and what proof it must return.
One system might use a coding lane, a research and writing lane, and a tightly controlled local-operations lane. Providers and model names may change over time. The durable part is the contract around each lane.
“An agent becomes reliable when its job is clearer than its personality.”
The task packet
A worker should receive a bounded packet, not a motivational speech. Include the objective, current state, relevant files or sources, constraints, allowed actions, acceptance checks, and required receipt. If another worker is already active nearby, include the ownership boundary.
Good packets make delegation legible. They also make failure diagnosable: you can tell whether the packet was incomplete, the worker made a poor decision, a tool failed, or the acceptance test was wrong.
- Objective: one concrete outcome.
- Context: only the truth needed for this task.
- Scope: files, systems, people, and time horizon.
- Authority: actions allowed without another approval.
- Checks: observable completion criteria.
- Receipt: evidence returned to the control layer.
Route by job shape
Choose a worker based on the shape of the job, not loyalty to a model. A repository refactor needs code navigation, tests, and safe file edits. A positioning memo needs synthesis and voice. A local maintenance task needs controlled shell access. A browser workflow needs visible state and confirmation rules.
The control layer should make that routing decision from requirements and current availability. The front door should not force the user to know which worker is best before asking for the outcome.
Case file
specialists as worker lanes
A growing agent system needs several capabilities that are easy to blur together. Repository work requires code navigation, precise edits, builds, and tests. Strategy and long-form synthesis require reasoning across ambiguous source material and voice. Local operations require controlled access to a machine, runtimes, and services. Calling all three ‘AI assistants’ hides the operational differences.
A control layer instead routes to job-shaped lanes. A coding worker owns bounded repository tasks and returns diffs plus test evidence. A research worker can own a sourced synthesis or writing artifact. A local operator supplies machine access behind explicit tools and permissions. The front door remains the user-facing layer, while an operational view displays task and receipt state.
The lane names are replaceable. The contracts are not. If a future worker performs better, the system can change the route without changing the request schema, acceptance checks, or relationship the user experiences.
Decisions made
- 01Define lanes by responsibility, authority, artifact, and proof—not by model personality.
- 02Keep local execution behind narrowly scoped operations and current runtime evidence.
- 03Partition concurrent work by owned surfaces and name one integration owner.
- 04Make the routing policy replaceable without changing the front door or receipt format.
A durable multi-agent system is less like a group chat and more like an operating model: explicit jobs, typed handoffs, constrained tools, current status, and one owner for the integrated outcome.
Orchestration needs ownership
Parallel workers help only when their tasks are independent and their boundaries do not collide. Split work by owned surface: content, implementation, verification, research, or a specific subsystem. Give one owner responsibility for integration and the final definition of done.
A swarm without integration ownership creates fast fragments. A small number of clear lanes usually beats a crowd of agents touching the same files and assumptions.
Failure mode: agent theater
A dashboard can show several workers as active while no executor is actually running, no artifact is changing, and no receipt is being produced. Status language becomes decoration. This is agent theater: the appearance of an organization without operational proof.
Treat activity as a claim that needs evidence. Show the task identity, executor, last meaningful event, output artifact, and exit condition. If those are missing, the honest state is queued or blocked—not working.
Three ways to compose workers
Multi-agent design begins with control flow, not headcount. In a manager pattern, one agent keeps the task and calls specialists for bounded results. In a handoff pattern, control moves to a specialist with its own instructions and tools. In a pipeline, deterministic code moves a typed artifact through sequential or parallel worker stages. Each pattern creates a different accountability boundary.
Managers are useful when a single owner must synthesize several perspectives or maintain a consistent user relationship. Handoffs help when the specialist needs a sustained conversation and can responsibly own the remainder of the turn. Pipelines are strongest when outputs can be validated between stages: research produces cited notes, planning produces a task graph, implementation produces a diff, and verification produces receipts.
Do not reach for another agent when a function will do. A formatter, schema validator, file resolver, permission check, or test runner should remain deterministic. Agents belong where interpretation or adaptive search creates value. The seams between them should be typed enough that failure can be localized.
- Manager: central synthesis, shared policy, one accountable relationship.
- Handoff: specialist control, explicit transition, deeper domain dialogue.
- Pipeline: typed artifacts, stage gates, parallelism at owned boundaries.
- Function: deterministic work that does not benefit from model judgment.
Tool design is product design
A worker’s reliability is constrained by the tools it can see. A vague ‘run shell command’ tool grants broad power and forces the model to invent syntax, target selection, error handling, and validation on every use. A purpose-built ‘deploy preview’ tool can require a project identifier, resolve the approved target, run fixed checks, return a deployment receipt, and refuse production by policy.
Design tools around meaningful actions with narrow schemas. Give parameters names a person can understand. Return structured errors that distinguish invalid input, missing authorization, dependency failure, policy denial, and an unsuccessful external action. Make read and write capabilities distinct so a worker can inspect broadly without gaining accidental authority to mutate broadly.
Model Context Protocol can standardize how hosts connect to external tool and resource providers, but protocol interoperability does not decide trust. The host still owns consent, credential scope, server allowlists, result validation, and what data enters the model context. Connectivity is plumbing; authority remains a product decision.
Parallelism needs an integration plan
Parallel agents reduce elapsed time only when their work can proceed independently. Two workers editing the same component, changing the same database schema, or relying on different unstated assumptions create integration debt faster than they create value. The cost appears at the end, when a human must reconcile contradictory artifacts.
Partition work by ownership and contract. A research lane may deliver a source packet without touching implementation. A design lane may define states and acceptance criteria. Two code lanes can own separate packages with a stable interface. A verification lane should test the integrated result rather than merely endorsing each fragment. One integrator owns the final branch, decision reconciliation, and completion receipt.
Concurrency also needs cancellation and budgets. If an upstream assumption changes, dependent workers should stop or be marked stale. If one lane fails, the task graph should reveal which other results remain usable. Speed is valuable only when the system can explain what ran, what it cost, what collided, and which artifact became authoritative.
Across the business
What this looks like in other departments
The engineering principle stays the same; the workflow, risk, and proof change with the domain.
Marketing
Campaign production lanes
Give research, drafting, design coordination, brand review, legal review, publishing, and measurement distinct contracts and one integration owner.
Finance
Accounts-payable specialists
Separate invoice extraction, vendor matching, policy checks, exception review, payment approval, and reconciliation instead of giving one agent broad money authority.
Customer support
Triage, response, and QA
Use different lanes for classification, context assembly, draft resolution, sensitive-case escalation, quality review, and customer-facing delivery.
Recruiting
Responsible hiring workflows
Separate scheduling and evidence assembly from human candidate judgment, protect sensitive data, and make each handoff and decision reviewable.
Technical deep dive
The worker contract and routing matrix
Use a stable contract to select a worker, constrain its run, and make the returned artifact composable with the rest of the system.
- 01ShapeClassify the job by domain, ambiguity, tool needs, side effects, duration, interaction style, and the artifact that represents success.
- 02SelectScore eligible lanes on capability, current availability, trust level, context locality, cost, and the evaluation evidence available for this job class.
- 03BindIssue a task packet with scope, authority, budget, source bundle, ownership boundary, stopping conditions, and a typed return contract.
- 04ObserveCollect executor identity, tool events, intermediate artifacts, approval pauses, errors, cost, and heartbeat without treating mere activity as progress.
- 05IntegrateValidate the returned artifact, resolve conflicts against the canonical task state, run system-level checks, and record which worker output became authoritative.
Reference schema
worker.role: stable responsibility + supported job classes worker.tools: allowlist + credential scope + side-effect class task.packet: objective + context + scope + authority + budget task.ownership: surfaces + dependencies + integration owner task.return: artifact schema + acceptance results + receipts run.telemetry: executor + events + cost + status + error category route.reason: selected lane + alternatives + confidence basis
Try it yourself
Write one worker contract
Choose a recurring job and define a lane narrow enough that success and failure are obvious.
- 1Name the job in outcome language.
- 2List allowed tools and prohibited side effects.
- 3Define the input packet and output schema.
- 4Write acceptance checks and the receipt format.
Reusable artifact
Worker task packet
The smallest useful contract between a control layer and a worker lane.
Task: [stable identifier] Objective: [one outcome] Owner: [worker lane] Context: [sources and current state] Scope: [included and excluded surfaces] Authority: [read / edit / deploy / communicate] Acceptance: [checks that must pass] Receipt: [artifacts and evidence to return]
Before you move on
Receipt checklist
- Each worker lane has a stable responsibility.
- Tasks carry scope, authority, and acceptance checks.
- Parallel work has non-overlapping ownership.
- Activity is backed by executor and artifact evidence.
Primary sources
