Build — ReAct, caps, and why 'autonomous' is a smell
Agents and tools: when a loop is worth it
Build enough to be dangerous
Why this matters for a delivery manager
Every sponsor who watched a demo now wants an 'agent' that does the job. Most should stay a retrieval copilot or a form. The ones that should be agents still need the controls you use on any integration with side effects. Today you get language that lets you shrink the scope without looking anti-innovation.
Mechanically, an agent is a model allowed to call tools in a loop until a final answer or a cap. 'Autonomous' means you were sloppy about the cutoff. Each turn is a model call — cost, latency, a chance to go stupid. Unbounded loops are unbounded invoices and unbounded incident surfaces. You already run batch jobs with timeouts. This is that instinct with a probabilistic contractor in the loop.
The practice is a three-tool spec for a support copilot: two reads, one write that does not send (it opens a confirm UI), plus caps. You will also write four sentences on why this is not 'autonomous support.' Those sentences are for the sponsor who watched a keynote. Keep them.
You will be able to
- Define an agent as a model with tools in a loop, not as a personality
- Write a tool contract: name, args, authz, idempotency, human gate
- Cap steps, time, and spend — the delivery controls
- Decide agent vs RAG vs a plain form in one paragraph
2-hour clock
120:00
Now: Read the loop, the tools, and the caps · 50m
The 2-hour session
Concepts, in full
This block is a slow read — about an hour with the diagrams. After each concept, write one sentence in notes (what you already do vs what is new) and tick annotated. Do not skim the last concept.
01
An agent is a loop, not a vibe
Pattern (ReAct and cousins): the model emits a thought and a tool call, your runtime executes the tool, the result comes back as an observation, the model continues until it emits a final answer or you cut it off. That is all. There is no inner homunculus. There is no 'the agent decided to be helpful.' There is a sampled next token that happens to be shaped like a function call because you offered tools and a prompt that invites them.
'Autonomous' just means you were sloppy about the cutoff. Marketing uses the word to mean 'fewer clicks.' Security hears 'unbounded side effects.' Your job is to retire the word in working conversations. Say 'a model with these three tools, max five steps, writes confirm in the UI.' If that sentence is less exciting than the keynote, good. Excitement is not a control.
Each turn is a model call: cost, latency, a chance to go stupid. A six-step loop is six chances to pick the wrong tool, hallucinate an argument, ignore the observation, or start searching forever. Unbounded loops are unbounded invoices and unbounded incident surfaces. The cap is the product. A loop without a cap is a job you would never approve for a cron.
Thought traces are optional to show the user and mandatory to log (redacted). They are how you debug 'it went crazy.' They are also how the model talks itself into a bad action if you feed the whole ramble back in. Keep the runtime's trace. Do not assume the model's 'thought' field is truthful. It is more tokens, not a confession.
Multi-agent, swarms, managers-and-workers: extra loops. You now have several unbounded invoices and a coordination problem. v1 does not need this. If a vendor leads with a swarm diagram for a wiki Q&A, they are selling a keynote. A single model, three tools, a cap, a human gate on writes — that is an agent you can run.
The wiki copilot from days 10–12 should not be an agent yet. Retrieval plus generate plus cite is a pipeline, not a loop. Adding a 'search again if unsure' loop is the first agent-ish temptation. It can wait until recall@5 is honest. Query rewrite is a retrieve trick you can do once, without a free-form loop. Do not gift the model a while(true) because the answer was empty. Empty is allowed.
When someone says 'we need an agent,' translate: which tools, which writes, which cap, which human gate, which eval (did the tool get the right args, did we cap, did we confirm). If they cannot answer, they need a copilot or a form. Your four sentences in the practice exist for this moment.
An agent is a model allowed to call tools in a loop until a final answer or a cap. Autonomous means you were sloppy about the cutoff. Each turn is a model call — cost, latency, a chance to go stupid. Thought traces are logged (redacted) and not trusted as confession. Multi-agent swarms are extra unbounded invoices; v1 does not need them. The wiki copilot is not an agent yet. Retrieval plus generate plus cite is a pipeline. Do not gift the model a while-true because the answer was empty. Empty is allowed. When someone says they need an agent, translate: which tools, which writes, which cap, which human gate, which eval. If they cannot answer, they need a copilot or a form. Your four sentences exist for that moment. Use them without apology.
Diagram
ReAct as a loop you are allowed to cut
Think
Model emits a thought (optional to show) and either a tool call or a final answer.
Act
Runtime validates args against the schema, checks authz, executes or opens a confirm UI for writes.
Observe
Tool result (or error, or 'user cancelled') goes back into context. Log the trace.
Think again
Next model call. Cost and stupidity increment by one.
Cut
Max steps, max time, max spend, or final answer. Return what you have and offer a human.
Four steps in the cycle, plus the cut. If you cannot point at the cut in the design, you do not have an agent. You have a process that will run until the bill or the incident.
02
Tools are APIs with extra superstition
A tool has a name, a JSON schema for arguments, a description the model reads, and your implementation. Bad descriptions → wrong calls. Wide arguments ('query: string' that can be any SQL) → a security incident. Tight tools ('get_ticket(id)') beat clever ones. The model is not a DBA. Do not hand it run_sql.
The description is a prompt. 'search_kb: find relevant SOP chunks for a product. Args: query (string), product (enum: Atlas, Orion). Returns: up to 5 chunks with source and heading. Does not search HR or finance.' That is a contract. 'search: look stuff up' is how you get the model querying salary. Spend time on descriptions. They are cheaper than incidents.
Read tools vs write tools. Reads: search, get_status, lookup_account. Writes: create_ticket, send_email, refund, change_group. Writes need authz of the user (not a god token), idempotency keys, audit, and usually a confirmation step in v1. The confirm UI is the human gate. The model drafts. The human sends. If you skip confirm because 'the demo was smoother,' you shipped an intern with prod credentials.
Authz is the user's identity, not the agent's. The tool executes as the user, through the same SSO groups as a normal UI. A support copilot that looks up accounts the user cannot see in the CRM is an ACL leak with a nicer name. God tokens behind tools are the day-12 leak, moved to the tool layer. Ban them in the spec.
Failure behavior is part of the contract. lookup_account on an unknown id returns a structured not_found, not a 500 the model then invents around. Timeouts return timeout. The model may retry a read; the runtime, not the model, retries writes, and only with the same idempotency key. If the model is allowed to invent a second key, you get two tickets. The runtime holds the key.
Do not expose tools that are 'the entire API surface.' Three tools for v1 is a feature. Twenty tools is a model that will pick the wrong one and a security review that will never end. Add tools when an eval shows a missing verb, not when a roadmap slide has empty boxes.
Side effects belong in the schema comments and in the audit log: who (user), what (tool + args), when, request id, whether confirmed, whether retried. You already wanted this for integrations. The new part is that a probabilistic caller is choosing the args. That makes the audit more important, not less.
Tools are APIs with a name, a tight JSON schema, a description that is a prompt, user-scoped authz, structured failures, and an audit line. Wide arguments are incidents. God tokens are the day-12 leak moved to the tool layer. Reads versus writes: writes need a human gate, an idempotency key minted by the runtime not the model, and no send tool in the list if you only meant draft. Three tools for v1 is a feature. Twenty is a model that will pick the wrong one and a security review that will never end. The description is cheaper than the incident. Spend time on it. 'search: look stuff up' is how you get salary queries. 'search_kb: SOP chunks for a product enum, k=5, no HR' is a contract. Write contracts.
# yes — tight, typed, user-scoped
get_ticket(id: string) -> ticket | not_found
search_sop(query: string, product: "Atlas" | "Orion") -> chunks[<=5]
draft_ticket(account_id: string, title: string, body: string) -> draft_id
# draft_ticket does NOT file. Runtime opens confirm UI.
# idempotency_key is generated by runtime, not by the model.
# no — wide, god-token, irreversible
run_sql(sql: string)
send_any_email(to: string, body: string)
http(url: string, method: string, body: object)03
Caps are the product
Max steps (e.g. 6). Max wall-clock (e.g. 20s for interactive). Max tokens / spend per session (e.g. $0.20). A watchdog that stops 'I will try another search' forever. On cap: return what you have, show the trace, ask the human. This is identical in spirit to a batch job with a timeout — you already run those. The new part is putting the numbers on a steering slide so 'autonomous' has a ceiling.
Steps vs time vs spend catch different failure modes. A loop can take 3 steps and 40 seconds if a tool hangs — time cap. It can take 20 steps in 8 seconds if the model is spinning on search — step cap. It can take 4 steps and $3 if it stuffed the history — spend cap. You want all three. One cap is a hole the other two exist to cover.
Watchdog is the runtime, not the prompt. 'Please stop after five tools' in the system prompt is a wish. The runtime counts and cuts. The prompt can mention the cap so the model tries to wrap up. The cut happens whether it wraps up or not. Wishes are not controls. You have been told this every day this week. It is still the failure.
On cap, the UX is a feature: here is what I found, here is the trace, hand to human. Not a blank bubble. Not a silent retry from step 0 (that retries the bill). Partial useful output is allowed. Inventing the rest to look finished is not. The generator-as-prisoner rule still applies to the final message.
Observability: log the trace (tool, args, latency, success, who confirmed) so you can debug with a timeline, not a shrug. request id joins the UI to the trace to the tool audit. If you cannot replay the loop, you cannot tell a sponsor why it refunded twice. Replay is a requirement on write-capable agents. It is a strong want on read-only loops.
Kill switch from day 9 still applies: error rate, spend, or a vendor incident trips it. Degrade to the non-agent path (search, form, human queue). An agent that cannot be turned off without a deploy will be turned off by finance after the bill, which is worse.
Caps belong in the same spec block as the tools. They are not an appendix. A tool table without caps is a menu without a budget. Sponsors will order everything.
Caps are the product: max steps, max wall-clock, max spend, a watchdog in the runtime not in the prompt, a kill switch, and a UX on cut that returns what you have plus a hand-to-human. One cap is a hole the other two exist to cover. Prompt wishes do not cut. Observability is the trace you can replay, especially on write-capable loops. Put caps in the same spec block as the tools. A tool table without caps is a menu without a budget. Sponsors will order everything. You already run batch jobs with timeouts. This is that instinct with a probabilistic contractor in the loop. Write the numbers on the steering slide so 'autonomous' has a ceiling someone other than you can see.
Diagram
Caps that make a loop shippable
- 01
Kill switch
Stop all agent traffic without a deploy. Degrade to search / form / human.
- 02
Spend cap / session
Dollars or tokens. Stops the stuffed-history invoice.
- 03
Wall-clock cap
Interactive budget (e.g. 20s). Stops the hung tool from freezing the page.
- 04
Step cap
e.g. 5 model turns. Stops 'one more search' forever.
- 05
Prompt wish (not a cap)
'Please wrap up after a few tools.' Nice. Insufficient.
Prompt wishes sit at the bottom and do not cut anything. Runtime caps cut. UX on cap is part of the product.
04
When the loop earns its keep — and when it does not
Multi-hop questions ('compare the Q2 decision to the current SOP and open a follow-up if they conflict') may need a search, a second search, then a draft. That is a small agent. A refund flow with four systems may need tools — or it may need a BPM engine with a model only on the email text. Prefer the boring orchestrator when the path is known.
If you can flowchart it without a model, maybe do not put a model in the loop. Use the model where the input is messy language (the email, the chat, the SOP exception) and use code where the path is known (if status == paid, then refund via this API). Mixing them by letting the model choose every hop is how you get a different flowchart every Tuesday.
RAG without tools is the default for 'what do our documents say.' A single read tool (ticket lookup, account lookup) is worth it when the answer lives in a system of record, not in a PDF. That is not a loop yet. It is RAG plus one fetch. Do the fetch, stuff the packet, generate, cite. Only start looping when you must retrieve, then fetch, then retrieve again, or when a write is in scope.
A form is still allowed. 'Create a ticket' with fields the user fills is more reliable than a write-tool that might invent the priority. Use the model to draft the body from the conversation, then dump the draft into the form. That is a copilot, not an agent, and it will pass security faster. Do not be ashamed of forms. Forms are how money moves today.
When the loop is not worth it: v1 wiki copilot; any corpus without evals; any write without a confirm UI; any path you can BPM; any sponsor request that cannot name the tools; any team that cannot staff the trace review. Write that list into the design pack as non-goals. Day 14 will need it.
Eval for agents is extra. Retrieval eval still exists if you search. Plus: tool-arg correctness (did it pass the right id), gate compliance (did a write ever fire without confirm), cap compliance (did we cut), and task success on a frozen set of messy tickets. If you only eval the final prose, you will ship a polite loop that files the wrong account.
The decision in one paragraph, which you should be able to say out loud: 'If the job is find-and-cite in a corpus, it is RAG. If the job is fill a known path, it is a form or an orchestrator, maybe with a model on the messy text. If the job is a short unknown hop-count with named tight tools and a cap and a human gate on writes, it can be an agent. If you cannot name the tools and the cap, it is not an agent yet.'
The loop earns its keep on short unknown hops with named tight tools. If you can flowchart it without a model, do not put a model in the loop. Prefer BPM when the path is known. Prefer RAG when the job is find-and-cite. Prefer a form when money moves. A single read tool stuffed into a packet is not yet a loop — do that before you start ReAct. Eval for agents is extra: tool-arg correctness, gate compliance, cap compliance, task success. Final prose is not enough. The decision in one paragraph is the one you should be able to say out loud in a steering meeting without notes. If you cannot, you are not ready to pick the rightmost column, and defaulting left is the grown-up move.
Diagram
RAG vs form vs loop — pick one on purpose
RAG copilot
- Job: what do our docs / decisions say
- No tools, or one fetch stuffed into the packet
- Refuse-when-empty, citations
- Eval: recall@k + groundedness
- v1 for the wiki
Form / orchestrator
- Job: known path, side effects
- Model optional on messy text
- User or BPM owns the write
- Eval: the existing process QA
- Still how money should move
Capped agent
- Job: short unknown hops, named tools
- Tight schemas, user authz
- Human gate on writes, runtime caps
- Eval: args, gates, caps, task success
- v1.5 / v2, not the wiki's first ship
The exciting column is the rightmost. It is also the one that needs the most delivery. Default left until an eval forces you right.
05
A three-tool spec you can hand an engineer
Use case: a support copilot for an account manager. You will not give it a god token. Tool 1 read: lookup_account(id). Tool 2 read: search_kb(query). Tool 3 write: draft_ticket(...) that does not send — it opens a confirm UI. That set is enough to be useful and small enough to review. Resist the fourth tool until these three have traces you can stand.
lookup_account(id): schema is an account id string with a format (not 'any string that might be a name'). Authz: the calling user's CRM visibility. Failure: not_found, timeout, forbidden (user cannot see it — do not leak existence beyond what CRM would). Returns a small object: name, tier, region, open_tickets count — not the whole account dump. Wide returns become wide context and accidental PII in logs.
search_kb(query): this is yesterday's retrieve, exposed as a tool so the model can hop. Constrain with product enum if you have one. k=5. Empty is allowed. Do not let this tool search tickets or CRM. One verb per tool. Hybrid search underneath, ACL of the user, same as the copilot. The model does not get a second, wider search 'just in case.'
draft_ticket(account_id, title, body): runtime checks the account is one the user can see, generates idempotency key, stores a draft, returns draft_id and a confirm URL. The model never calls send. A separate confirm action is a button the user hits, not a tool the model has. If you expose send_ticket as a tool, the model will eventually call it. Do not put it in the list.
Caps for this use: max 5 model steps, 20s wall-clock, $0.20/session. On cap: show the trace and a 'hand to human' button, including any draft that exists so the user is not starting from zero. Kill switch named. Logs: tool names, args redacted for PII, latency, confirm events. Retention as Legal said on day 9.
Failure of the write: if confirm is abandoned, the draft expires (put a TTL). If confirm is hit twice, idempotency on the actual create. If the CRM is down at confirm, the UI says so; the model is out of the picture. Once the human is in the gate, stop looping.
Four sentences for the sponsor: This is not autonomous support. It can look up an account the user already can see, search the KB, and draft a ticket. A human sends the ticket. Loops stop at five steps or twenty seconds. If you want it to send mail or refund, that is a different design with a different review, not a flag.
The three-tool spec is lookup_account, search_kb, draft_ticket-that-does-not-send. Tight schemas, user CRM/KB visibility, structured not_found, runtime idempotency, confirm UI, TTL on abandoned drafts. Caps: five steps, 20 seconds, 20 cents, trace on cut, kill switch. Four sentences for the sponsor: not autonomous; can look up what the user can already see; a human sends; loops stop. If you want mail or refund, that is a different design with a different review, not a flag. Resist the fourth tool until these three have traces you can stand. Small and reviewable beats a menu that security will never sign.
| Tool | Type | Schema (tight) | Authz | Failure | Idempotency / gate |
|---|---|---|---|---|---|
| lookup_account(id) | Read | id: account id format | User's CRM visibility | not_found / forbidden / timeout | Retry-safe read |
| search_kb(query) | Read | query: str, product: enum | User's KB ACL, k=5 | empty allowed; timeout | Retry-safe read |
| draft_ticket(...) | Write (draft only) | account_id, title, body | Same account visibility | validation / CRM down | Runtime key; confirm UI; no send tool |
Three-tool spec — the practice table. Copy the columns; fill the rows for your domain if support is not your world.
06
What you take into the lab tomorrow
Day 14 is a wiki copilot, which you will argue should not be an agent yet. That argument is this day applied. v1: RAG, citations, refuse, ACL, evals, no writes, no loop. Later: maybe lookup_ticket as a read. Much later: draft a RAID row with a confirm. Anyone who wants an 'Atlas agent' on the first ship is asking for the keynote. You have the sentences to shrink it.
Bring forward: the day 10 retrieval table, the day 11 one-pager and generator contract, the day 12 RAID and no-go, today's tool table as a non-goal (or as a v1.5 appendix). The design pack is an assembly of objects you already wrote. If one of them is thin, thicken it tonight, not during the 70-minute write block.
The talk track distinction: 'we could loop' vs 'we will loop.' Interviews like people who can draw ReAct and then refuse to use it. That is judgment. Building a swarm on a wiki is a tell that you learned the words and not the controls.
If your primary role is FDE, you may want a 20-line pseudo-loop in the optional script: for step in range(MAX): think/act/observe, break on final or cap. Keep it rude. No swarms. If your primary role is delivery lead, the spec is enough. Do not fake a runtime.
Security will ask: user identity on tools, no god token, confirm on writes, audit, caps, kill switch. You can now answer without waiting for an engineer to translate. That is the point of the week.
Sponsors will ask: when do we get the agent. Answer with the shrink path: copilot, one read, one gated write. Put dates only on the copilot until evals exist. Dates on v2 without numbers are how you inherit a demo.
Stop treating 'agent' as a grade of AI. It is an architecture with a blast radius. You pick it like you pick 'we'll call the billing API from a cron' — with a runbook, or not at all.
Tomorrow's lab is a wiki copilot you will argue should not be an agent. Bring the shrink path: copilot, one read later, one gated write much later. Dates only on the copilot until evals exist. Interviews like people who can draw ReAct and then refuse to use it. That is judgment. Building a swarm on a wiki is a tell that you learned the words and not the controls. Security will ask identity, god token, confirm, audit, caps, kill switch. You can answer now. Sponsors will ask when they get the agent. Answer with the path, not with a date on v2 without numbers. Stop treating agent as a grade of AI. It is an architecture with a blast radius. You pick it like you pick 'we'll call the billing API from a cron' — with a runbook, or not at all.
Worked case · stay here ~20 minutes
Just make it an agent
Tuesday steering, twenty minutes. Marcus watched a keynote over the weekend. He wants the Atlas copilot to just be an agent that files follow-ups, pings owners, and handles the wiki like a teammate. Priya is game. Dev is game. You have the day-13 sentences and a three-tool spec in your notes that you will mostly refuse to use. The wiki still has no recall number.
Marcus opens with the word autonomous, and Security, who is on the call because of last week's near-miss, puts down their coffee. You retire the word before the slide with the swarm. Autonomous means we were sloppy about the cutoff. What I think you want is fewer clicks: look up a decision, maybe open a draft follow-up. That is a model with named tools, a cap, and a human on writes. It is not a teammate. It is not unbounded. If that sentence is less exciting than the keynote, good. Excitement is not a control. You draw ReAct in five boxes because you can, and because interviews and architects both like people who can draw it and then refuse to use it: think, act, observe, think, cut. You point at the cut. If you cannot point at the cut in the design, you do not have an agent. You have a process that will run until the bill or the incident. Atlas v1 still does not have a cut, because Atlas v1 is not a loop. It is retrieve, generate, cite. You will say that eight times.
The wiki copilot should not be an agent yet, and you put the reasons in a list so they are not vibes. Recall at 5 is not a number you would put on a slide. Empty retrieve is still being papered over in Priya's private branch by search-again-if-unsure, which is a while-true with a polite name. ACL just failed a leak-test last week; a loop that can search a second corpus is a loop that can search a second ACL. There is no write owner. There is no confirm UI. There is no idempotency story. There is no trace anyone has replayed. Adding a free-form loop will not fix retrieve. It will hide empty by finding a neighbor, and that neighbor will be wrong, and Marcus will screenshot the wrongness as the agent being brilliant. Query rewrite once is a retrieve trick you will allow later. A model allowed to call search until it is happy is not a trick. It is an unbounded invoice and an unbounded incident surface. You already run batch jobs with timeouts. This is that instinct with a probabilistic contractor in the loop.
Priya offers a compromise: three tools, like the practice. lookup_account, search_kb, draft_ticket. You take the list seriously and then you cut it for Atlas. lookup_account is a CRM object. Atlas PMs asking what we decided about vendor X do not need CRM. That tool is a different product, the support copilot, which is allowed to be a later case. search_kb is yesterday's retrieve exposed so the model can hop. That is the temptation. Once search is a tool, the model can hop into a second query that drops a filter. Keep retrieve in the pipeline, k from eval, empty allowed, user ACL on the query, not in a loop the model controls. draft_ticket is a write even if she renamed it draft. If the tool can file, it will file. If the tool is actually a draft that opens a confirm UI and the model cannot send, you have a copilot with a form, which is what you wanted, and you do not need a loop to fill a form. Use the model to draft the body, dump it into the form, human sends.
You still walk a tight tool contract so the room knows you are not afraid of tools, you are afraid of sloppy ones. Name, JSON schema, description that is a prompt, user-scoped authz, structured failures, audit line. Wide arguments are incidents. God tokens are last week's leak moved to the tool layer. The model must not mint the idempotency key; if it does, a retry is a new key and you get three tickets. Runtime mints, runtime retries writes. Reads may retry. 400, 401, 403, filter do not. Descriptions are cheaper than incidents: search_kb is SOP chunks for a product enum, k=5, no HR, empty allowed — not look stuff up. Three tools is a feature. Twenty is a model that will pick the wrong one and a security review that will never end. Atlas v1 gets zero tools. Atlas v1.5, when recall holds for two weeks, may get one read stuffed into the packet, still not a loop. v2, when a knowledge owner asks, may get draft-with-confirm. Dates only on v1. Anyone selling v4 on a greenfield is selling a keynote.
Caps are the product, and you write numbers even though you are refusing the loop, because Marcus will come back on Thursday with a prototype Priya built to please him. Max five model steps, twenty seconds wall-clock, twenty cents a session, a watchdog in the runtime not in the prompt, a kill switch, UX on cut that returns what you have plus hand-to-human. Prompt wishes do not cut. One cap is a hole the other two exist to cover. You already have a kill switch on the client from last week's blank bubble. It still applies. An agent that cannot be turned off without a deploy will be turned off by finance after the bill, which is worse. Observability is a trace you can replay, especially on writes: tool, args, latency, who confirmed. Request id joins UI to trace to audit. If you cannot replay, you cannot tell a sponsor why it refunded twice. Replay is a requirement on write-capable agents. Atlas is not write-capable. Put the cap block in the appendix so when the prototype appears, the spec is already older than the prototype.
The decision in one paragraph is the one you say out loud without notes, because this is a steering meeting and your notes will look like a lecture. If the job is find-and-cite in a corpus, it is RAG. If the job is fill a known path, it is a form or an orchestrator, maybe with a model on the messy text. If the job is a short unknown hop-count with named tight tools and a cap and a human gate on writes, it can be an agent. If you cannot name the tools and the cap, it is not an agent yet. Atlas is find-and-cite. It is RAG. Marcus says the keynote agent compared a decision to an SOP and opened a follow-up. That is a small agent, and it is a v2 story: retrieve decision, retrieve SOP, draft a RAID row, human confirms. Path is almost known. A BPM with a model on the exception text would do it with less blast radius. Prefer the boring orchestrator when the path is known. Prefer RAG when the job is find-and-cite. Prefer a form when something mutates.
Security's questions, you answer without waiting for Priya to translate. User identity on tools, not a god token. No send in the tool list if you only meant draft. Confirm on writes. Audit. Caps. Kill switch. Last week's leak-test still applies to every tool that retrieves. A search tool that does not inherit SSO groups is the CEO folder with a function name. They ask when they will allow a write. When there is a confirm UI, an idempotency key minted by the runtime, a TTL on abandoned drafts, an owner of a wrong ticket, and a replayable trace. Not this quarter on Atlas unless a knowledge owner asks and the evals exist. They nod. Marcus hears a delay. You reframe: v1 can ship without a security exception. An agent cannot. Shipping a copilot that finds decisions is the demonstration that we can be trusted with a draft button later. Shipping an agent now, after a leak-test fail last week, is how we get a permanent no. He has been around. He knows permanent no. He does not like it. He likes v1 with a path.
Four sentences for the sponsor, written on the slide, not improvised. This is not autonomous support and it is not an autonomous PMO. It can retrieve Atlas SOPs, decision logs, and RAID, with citations, and it can refuse. A human files follow-ups. Loops stop at zero in v1, and if we ever loop, at five steps or twenty seconds. If you want mail, Jira writes, or refunds, that is a different design with a different review, not a flag. You read them. You stop. Priya adds that she can have the copilot in a staging UI by the date you already committed, without tools. That is the only date in the minutes. Dev asks about multi-agent because the keynote had a manager and workers. Extra loops, extra unbounded invoices, a coordination problem. v1 does not need this. If a vendor leads with a swarm for wiki Q&A, they are selling a keynote. A single model, zero tools, a prisoner prompt, a cap on the client, a human gate that is there is no write — that is an architecture you can run.
Eval for agents is extra, and you name it so we-will-just-eval-the-answers cannot sneak in later. Retrieval eval still exists if you search. Plus tool-arg correctness, gate compliance (did a write fire without confirm), cap compliance (did we cut), task success on a frozen set of messy tickets. Final prose is not enough. A polite loop that files the wrong account is a fail. Atlas v1 evals remain recall at 5 and groundedness. If someone ships a prototype loop this week, it does not get a production path because it feels helpful. It gets the extra evals or it gets turned off by the kill switch you already own. You would rather be accused of slowing innovation than of staffing a loop you cannot score. Marcus will accuse you of the first. Take it. The second accusation comes from Legal and does not leave the building. You have enough of those this month. Write the non-goals into the design pack tonight: no agents, no unbounded ReAct, no writes, no search-again-until-happy. Day 14 will need it. If it is only in your mouth, the pack will grow a tool overnight.
After the meeting Priya pings you: she already has a loop in a branch, eight steps, search_kb plus a Jira create, no confirm, the key is her own. You do not yell. You ask her not to point it at the tenant, not to demo it, and to bring the branch to a review with Security as a design of what we will not ship. Then you make the kill switch trip criteria include unreviewed tool-capable branch in a shared environment. That is petty and it is correct. Last week's god-index was the same shape of convenience. She is a good engineer under a sponsor who watched a keynote. Your job is the cutoff. You pair for thirty minutes to strip the Jira tool and the loop, leave retrieve in the pipeline, leave a draft-in-a-textbox that does not post. The textbox is the form. She can keep it. The loop goes. The key rotates because it was in her shell history on a shared screenshot from Sunday. You are back in day 8. Keys, caps, writes. The week is one week. The controls repeat because the temptations repeat.
What you take into the lab tomorrow is the shrink path, written, not a vibe. v1: RAG, citations, refuse, ACL, evals, no writes, no loop. Later: maybe a read tool. Much later: draft a RAID row with a confirm. Anyone who wants an Atlas agent on the first ship is asking for the keynote. You have the sentences. Interviews like people who can draw ReAct and then refuse to use it. That is judgment. Building a swarm on a wiki is a tell. Security will ask identity, god token, confirm, audit, caps, kill switch. You can answer. Sponsors will ask when they get the agent. Answer with the path, not with a date on v2 without numbers. Stop treating agent as a grade of AI. It is an architecture with a blast radius. You pick it like you pick we will call the billing API from a cron — with a runbook, or not at all. Tomorrow you walk a skeptical sponsor through a wiki copilot that is deliberately not an agent. If you cannot say why in two minutes, reread this case. Then assemble the pack.
The interview version of Marcus's keynote is four sentences plus a cut. Sponsor wanted an agent that filed follow-ups. The wiki had no recall number and a recent ACL near-miss. We drew ReAct, pointed at the cut, and shipped RAG with a form for drafts. Tools later, writes with confirm, caps in the spec before any loop exists. If they ask you to define an agent, you say a model allowed to call tools in a loop until a final answer or a cap. If they ask you when you would use one, you say short unknown hops, named tight tools, human gate on writes, evals on args and gates and caps. If they ask you about this wiki, you refuse. That refusal is the skill. The market is full of people who can wire a loop. It is short of people who can unwire one in a steering meeting without looking anti-innovation. You offered a path. You named numbers. You killed a branch that had a Jira write and a personal key. That is innovation with a cutoff. That is the job.
Diagram
Shrink agent until a wiki can ship
- 01
Capped agent with writes
Named tools, runtime caps, confirm UI, idempotency, replay. Not Atlas v1. Not this quarter unless evals and an owner exist.
- 02
One read tool, no loop
Stuff a ticket or RAID row into the packet. Still retrieve-then-generate. v1.5 after recall holds.
- 03
Form / draft box
Model drafts, human sends. No send tool. Security will sign this sooner than a write-tool.
- 04
RAG copilot (Atlas v1)
Find-and-cite, prisoner generator, ACL, refuse, no loop. This is the ship.
Default down the stack. Climb only when an eval and a named owner force you up. The keynote lives at the top. v1 lives at the bottom.
Practice
Three-tool spec and a cap
45 minutesUse case: a support copilot for an account manager. You will not give it a god token.
- Tool 1 read: lookup_account(id). Tool 2 read: search_kb(query). Tool 3 write: draft_ticket(...) that does NOT send — it opens a confirm UI.
- For each: schema, authz, failure behavior, idempotency (for the write).
- Caps: max 5 model steps, 20s, $0.20/session. On cap: show the trace and a 'hand to human' button.
- Write four sentences on why this is not 'autonomous support.'
Done looks like: A tool table plus caps plus a sentence you could say to a sponsor who watched a keynote.
Check yourself
Attempt in your notes first. Reveal is for after, not during.
What is an agent, mechanically?
Why are write tools different from read tools in v1?
Name three caps that belong in the design.
Why must the runtime, not the model, mint the idempotency key?
When is a loop not worth it?
What should v1 of the wiki copilot be?
Terms from this day
- Agent
- A model-in-a-loop with tools. Not a personality and not a license to skip controls.
- ReAct
- A common pattern: reason + act (tool) + observe, repeated.
- Tool contract
- Name, schema, authz, side effects, idempotency, and failure behavior of a function the model may call.
- Trace
- The timeline of thoughts, tool calls, and results. Your debugger when it 'goes crazy.'
- Human gate
- A required confirmation before a write-tool executes.
Your notes for day 13
Saved on this device. Use this as the start of the artifact.