[{"data":1,"prerenderedAt":277},["ShallowReactive",2],{"navigation":3,"/blog/how-a-step-earns-autonomy":96,"/blog/how-a-step-earns-autonomy-surround":270},[4,23,60,80],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","/docs/getting-started","1.docs/1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Core concepts","/docs/getting-started/concepts","1.docs/1.getting-started/2.concepts","i-lucide-lightbulb",{"title":18,"path":19,"stem":20,"icon":21},"Your first run","/docs/getting-started/first-run","1.docs/1.getting-started/3.first-run","i-lucide-play","i-lucide-rocket",{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":59},"Operator Guide","i-lucide-layout-dashboard","/docs/operator-guide","1.docs/2.operator-guide",[29,34,39,44,49,54],{"title":30,"path":31,"stem":32,"icon":33},"Runs","/docs/operator-guide/runs","1.docs/2.operator-guide/1.runs","i-lucide-git-branch",{"title":35,"path":36,"stem":37,"icon":38},"Targets","/docs/operator-guide/targets","1.docs/2.operator-guide/2.targets","i-lucide-building-2",{"title":40,"path":41,"stem":42,"icon":43},"Queue","/docs/operator-guide/queue","1.docs/2.operator-guide/3.queue","i-lucide-list-checks",{"title":45,"path":46,"stem":47,"icon":48},"Search","/docs/operator-guide/search","1.docs/2.operator-guide/4.search","i-lucide-search",{"title":50,"path":51,"stem":52,"icon":53},"Metrics","/docs/operator-guide/metrics","1.docs/2.operator-guide/5.metrics","i-lucide-chart-line",{"title":55,"path":56,"stem":57,"icon":58},"Promotion","/docs/operator-guide/promotion","1.docs/2.operator-guide/6.promotion","i-lucide-shield-check",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"Automation","i-lucide-bot","/docs/automation","1.docs/3.automation",[66,71,75],{"title":67,"path":68,"stem":69,"icon":70},"Automation levels","/docs/automation/automation-levels","1.docs/3.automation/1.automation-levels","i-lucide-gauge",{"title":72,"path":73,"stem":74,"icon":58},"Promotion & drift","/docs/automation/promotion","1.docs/3.automation/2.promotion",{"title":76,"path":77,"stem":78,"icon":79},"Approvals & spot-checks","/docs/automation/approvals","1.docs/3.automation/3.approvals","i-lucide-user-check",{"title":81,"icon":82,"path":83,"stem":84,"children":85,"page":59},"Reference","i-lucide-book-marked","/docs/reference","1.docs/4.reference",[86,91],{"title":87,"path":88,"stem":89,"icon":90},"Glossary","/docs/reference/glossary","1.docs/4.reference/1.glossary","i-lucide-book-open",{"title":92,"path":93,"stem":94,"icon":95},"Frequently asked questions","/docs/reference/faq","1.docs/4.reference/2.faq","i-lucide-circle-help",{"id":97,"title":98,"body":99,"description":257,"extension":258,"meta":259,"navigation":265,"path":266,"seo":267,"stem":268,"__hash__":269},"posts/3.blog/9.how-a-step-earns-autonomy.md","How a step earns the right to run unattended.",{"type":100,"value":101,"toc":247},"minimark",[102,107,111,119,122,128,132,135,152,158,161,165,182,192,196,199,214,220,223,227,234,237,241,244],[103,104,106],"h2",{"id":105},"the-gate-is-a-lease-not-a-badge","The gate is a lease, not a badge",[108,109,110],"p",{},"Every step in a workflow sits at one of three levels. L3 is fully manual: a person does the work. L2 is the interesting middle: an agent does the work, and a human must approve its output before the run advances. L1 is the prize. The agent runs, and the workflow moves on without anyone looking over its shoulder.",[108,112,113,114,118],{},"A step does not start at L1, and it does not get there by assertion. In the model it is a promotion: a documented, evidential decision that an L2 step may drop its approval gate. The object that records it is called ",[115,116,117],"code",{},"PromotionEvidence",", and its docstring is unambiguous. \"Why an L2 step was allowed to drop its approval gate.\"",[108,120,121],{},"That promotion is never permanent. It is a lease, and it is revoked the moment the conditions it was granted under stop holding.",[108,123,124,125,127],{},"A note on what is live today: this post describes the model the platform is built around. At the time of writing promotion is not yet operator-facing — a step is promoted by setting its ",[115,126,117],{}," in the workflow definition (a configuration change), and nothing ships pre-promoted. The drift and fallback machinery below is implemented but only comes into effect once a step has been promoted.",[103,129,131],{"id":130},"three-bodies-of-evidence","Three bodies of evidence",[108,133,134],{},"Promotion requires three separate proofs, all collected on the exact prompt and model the agent is running at the time.",[136,137,138,146,149],"ul",{},[139,140,141,142,145],"li",{},"A fixed-scenario batch of at least 100 runs, gated on a ",[115,143,144],{},"max_failure_rate",".",[139,147,148],{},"A replay corpus of at least 30 approved real cases, rebuilt exactly as their first attempt saw them.",[139,150,151],{},"Live step acceptance at or above threshold across at least 30 real, human-decided decisions.",[108,153,154,155,157],{},"The fixed scenarios are committed and anonymised, a fictional \"Acme Widgets Ltd\", so they can run deterministically. Each carries a ",[115,156,144],{},": one per cent in the reference fixtures. If more than one run in a hundred fails an invariant such as \"facts are grounded in the source\" or \"the price is taken from the pricing notes, not invented\", the batch does not pass and the promotion does not happen.",[108,159,160],{},"The replay corpus is the stronger half. It does not use synthetic examples. It pulls real, human-decided jobs and rebuilds the exact scenario their first attempt saw, selected by time so later feedback cannot leak into the evaluation. Two details matter. First, only the human's first decision counts, because later attempts were shaped by feedback. Second, human-written outputs are excluded outright. An overridden job is not agent evidence. You cannot promote an agent on work a person finished by hand.",[103,162,164],{"id":163},"what-gets-frozen","What gets frozen",[108,166,167,168,170,171,174,175,177,178,181],{},"When the step promotes, ",[115,169,117],{}," freezes the world it was proven in. It stores the prompt hash, a content hash of the prompt template, the model the agent was configured to call, and ",[115,172,173],{},"served_model",", the model the provider was actually serving. It stores both evaluation run IDs, the shared ",[115,176,144],{},", and a ",[115,179,180],{},"min_spot_check_acceptance"," floor for the monitoring that follows.",[108,183,184,185,188,189,191],{},"The distinction between ",[115,186,187],{},"model"," and ",[115,190,173],{}," is worth noticing. One is what you asked for. The other is what the provider actually ran. Both are captured, because both can drift.",[103,193,195],{"id":194},"drift-is-what-revokes-it","Drift is what revokes it",[108,197,198],{},"A promoted step is designed to be checked on two fronts.",[108,200,201,202,205,206,209,210,213],{},"The first is a hard gate, evaluated at instantiation. ",[115,203,204],{},"promotion_problems()"," compares the agent's current prompt hash and its ",[115,207,208],{},"default_model()"," against what the step was promoted on. Any mismatch, a rewritten prompt, a moved model default, returns a problem, and ",[115,211,212],{},"effective_requires_approval()"," falls back to L2. Crucially, the step keeps running. It does not block the workflow. It simply requires a human to approve its output again, exactly as it did before promotion.",[215,216,217],"blockquote",{},[108,218,219],{},"\"A promotion that no longer holds falls back to L2: the step still runs, a human approves it.\"",[108,221,222],{},"The second front is a scheduled drift check. It watches three things. Whether the most common served model over the last 24 hours has moved from the one recorded at promotion. Whether a re-proof batch has run in the last seven days. And whether live spot-check acceptance has fallen below the floor. If any of those breaks, the step is flagged and re-proven against the same fixed scenarios and a fresh sample of approved corpus cases.",[103,224,226],{"id":225},"spot-checks-close-the-loop","Spot checks close the loop",[108,228,229,230,233],{},"Promotion does not mean the step stops being watched. It means watching gets cheaper. Every promoted step carries a ",[115,231,232],{},"spot_check_rate",": a share of its L1 outputs is routed to a human for after-the-fact review. The sampling is deliberately un-gameable. It hashes the job ID, so the decision to check is reproducible and cannot be gamed by retries.",[108,235,236],{},"Those spot-check decisions are non-blocking. They never change the job or the run. But they are not inert. A rejection requires a reason, and that reason feeds the replay corpus and new checks. The same human judgement that once approved every output now samples a fraction of it, over a 30-day window, and the accumulated acceptance rate is the number that holds the step to its floor.",[103,238,240],{"id":239},"governance-not-vibes","Governance, not vibes",[108,242,243],{},"The whole thing is a closed loop. A step earns L1 with a hundred deterministic runs and thirty real cases. It keeps L1 only while the prompt, the model, and the served model stay what they were proven as, and while humans keep accepting its sampled output above an agreed floor. When any condition breaks, the gate is meant to come back — automatically, without a meeting, without anyone deciding the step \"feels off\".",[108,245,246],{},"That is the difference between wrapping an LLM and governing one. Most tools can call a model. The hard part is knowing when it is safe to stop watching, being able to prove it, and having the machinery to pull the approval back the moment that proof stops holding.",{"title":248,"searchDepth":249,"depth":249,"links":250},"",2,[251,252,253,254,255,256],{"id":105,"depth":249,"text":106},{"id":130,"depth":249,"text":131},{"id":163,"depth":249,"text":164},{"id":194,"depth":249,"text":195},{"id":225,"depth":249,"text":226},{"id":239,"depth":249,"text":240},"How a workflow step earns promotion to unattended operation, and what drift is designed to pull back to human approval.","md",{"image":260,"date":262,"badge":263},{"src":261},"https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?auto=format&fit=crop&w=1200&q=80","2026-10-14",{"label":264},"Engineering",true,"/blog/how-a-step-earns-autonomy",{"title":98,"description":257},"3.blog/9.how-a-step-earns-autonomy","EOmj86DA-0qxFCgIRoeG51hhoMPsZdfKa6q74VaBJOQ",[271,276],{"title":272,"path":273,"stem":274,"description":275,"children":-1},"Minutes displaced, quality held: the only AI metric worth reporting.","/blog/minutes-displaced-quality-held","3.blog/8.minutes-displaced-quality-held","Demand a frozen baseline and a post-hoc quality check before you trust any AI efficiency number.",null,1793716435448]