Ship — the control plane around a model that can be wrong
Guardrails and human-in-the-loop
Ship like a delivery lead
Why this matters for a delivery manager
This is change management plus operational risk, your home turf. The mistake is either no guardrails (incident) or so many that the copilot is a PDF with extra steps (adoption death). You already know how to set controls proportional to blast radius. Do that here.
HITL is a staffing and design problem, not a slogan. A roster, a review UI that makes the human useful, tracked reject reasons, and hours in the plan — or it is theatre. Theatre is worse than nothing because it produces a false sense of control and a rubber stamp that will not survive the incident report.
You will be asked to 'just let it send.' Your answer is a dial, a matrix, and a date on which you will reconsider with eval evidence. Not a speech about AI safety. Not a yes.
You will be able to
- Design a layered control: policy in prompt, schema, filters, authz, human gates
- Pick HITL intensity from the cost of a mistake, not from fear
- Write an incident path for a bad answer that went to a customer
- Avoid both 'the model is the approver' and 'every token needs a committee'
2-hour clock
120:00
Now: Read the layers · 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
Layers, because any one layer fails
A control plane is the set of constraints around the model, not the model being polite. Prompt policy: refusals, instruction hierarchy, 'sources are data.' Schema: cannot emit a field you did not allow. Classifiers and filters: PII, jailbreak, topic allow-list. Authz: user identity on retrieve and on tools. Runtime caps: steps, spend, time. HITL: a human on the expensive action. Monitoring: traces and evals after the fact. You want all of them in some form. You want none of them to be the only one.
A prompt-only 'be safe' is not a control plan. You would not accept a payments app whose only control was a comment in the code. You should not accept a copilot whose only control is a system message. Injection, long context, and sycophancy all degrade prompt policy. The prompt is the cheapest layer and the most brittle. Keep it. Do not worship it.
Schema is an underrated control. If the model must emit a JSON object with an enum for action type, it cannot emit a free-text 'go wire the money' as an action. If the UI only offers 'insert draft' and 'discard,' the model cannot send. Constrain the output shape and you constrain the blast radius without a committee. This is the same instinct as not giving a batch job a production write credential it does not need.
Authz belongs on retrieve and on tools, not only on the login to the app. A user who cannot see the HR space in Confluence must not retrieve it through the copilot. A user who cannot open a Jira ticket in that project must not have the open-ticket tool. The model is not a permission boundary. Identity is. If you skip this, you have built a search engine that launders access.
Runtime caps stop the quiet disasters. Max steps on an agent so it cannot loop until the bill is a news item. Max spend per user per day. Timeouts that fail to a fallback instead of spinning. You will write SLOs tomorrow. Today, put the caps on the control-plane diagram so they exist before the first enthusiastic loop.
Monitoring is a layer, not a dashboard hobby. Traces, eval drops, user reports, and a kill switch you have tested. A control you cannot observe is a control you cannot operate. Steal your existing SEV process. Add prompt version, model pin, and trace id to the ticket. That is the whole invention.
You would not accept a payments app whose only control was a comment in the code. Do not accept a copilot whose only control is a system message that says be careful. Say that sentence in design reviews. It lands. Then show the stack: schema, authz, caps, HITL, monitoring. People who wanted a prompt tweak will argue with a stack less easily than with your taste. The stack is the plan you can defend to Risk.
Runtime caps belong on the diagram before the first enthusiastic loop. Max steps, max spend per user per day, timeouts that fail to fallback. Agent-shaped features will eat the bill and the latency SLO in one afternoon if nothing stops the loop. Put the numbers in config, with an alarm, not in a standup comment. A cap nobody can see is not a cap. Day 18 will put spend on the dashboard. Today, make sure there is a cap to put there.
Diagram
Control plane around a model that can be wrong
- 01
Monitoring and kill switch
Traces, eval pulse, user report path, named disable for the feature or the write path.
- 02
HITL gates
Shadow, assist, confirm, bound-auto, never-auto — chosen by blast radius, staffed with a roster.
- 03
Runtime caps
Max steps, max spend, timeouts, rate limits. Stops loops and bill shock.
- 04
Authz
User identity on retrieve and on tools. The model is not a permission boundary.
- 05
Schema and filters
Allowed fields, topic allow-list, PII/secret scanners, jailbreak tripwires.
- 06
Prompt policy
Refusals, instruction hierarchy, sources-as-data. Necessary, brittle, never sufficient alone.
Prompt policy is the bottom of the stack, not the stack. Any one layer fails; the others have to still work.
02
HITL is a dial, not a religion
Observe, or shadow: the model drafts, the human does the job as today, you score in the background. Assist: the model drafts, the human sends. Confirm: the model wants to act, the human clicks. Bound-auto: the model acts inside a narrow envelope — small refund, known template — else confirm. Never-auto: legal, safety, large money, customer-facing irreversible send. Those are the notches. Name them. Do not invent twelve.
Start one notch more human than the sponsor wants. Loosen with evals, not with optimism. Publish the dial so nobody thinks v1 is the forever state. A sponsor who hears 'confirm on every send' without a date to revisit will either kill adoption or go around you. A sponsor who hears 'confirm for four weeks, then we look at the bar' has a deal they can live with.
Intensity follows blast radius, not 'AI maturity.' Wrong SOP citation to an internal PM: low, assist is fine. Wrong clinical or financial advice to a customer: never-auto. Wrong ticket filed internally: confirm. Wrong email to a customer about a missed SLA: confirm at least, often never-auto until the eval bar is boring. Audience, money, safety, irreversibility. Tune with those four, not with a vendor slide about autonomy.
You can run different notches on different actions in the same product. That is the point of a matrix. The wiki Q&A can be assist while the 'email the customer' action is confirm, and the 'close the incident' action is never-auto. One global setting is how you either block the useful thing or under-control the dangerous thing. Four actions, four rows. You will write them in practice today.
Bound-auto is earned, not claimed. The envelope has to be numeric and small: refunds under fifty dollars, templates from an allow-list, tickets in one project, no new recipients. Outside the envelope, confirm. If you cannot write the envelope, you do not have bound-auto. You have auto with a story. Auto with a story is the incident you will explain to a steering committee.
Shadow is not wasted time. It is how you collect the traces and the eval that justify the next notch. Two weeks of shadow on a real caseload will tell you more than a month of lab demos. Put shadow on the plan as a named phase with an eval bar to exit, not as 'we'll try it in the background if we have time.'
Publish the dial with a date to reconsider, or the sponsor will hear 'confirm forever' and either kill adoption or go around you. 'Confirm for four weeks, then we look at the bar' is a deal. 'We have to be safe' is a mood. Moods do not survive steering. Dates and numbers do. Write the exit from each notch the same way you write a phase gate: eval evidence, roster health, then the next intensity or a stay.
Different actions in the same product should sit on different notches. Wiki Q&A can be assist while customer email is confirm or never-auto. One global setting either blocks the useful thing or under-controls the dangerous thing. The matrix exists so you can show that thought per action. If someone asks 'are we human in the loop,' the honest answer is 'on which action.' Train the room to ask that.
| Action risk | Shadow (observe) | Assist (human sends) | Confirm (human clicks the act) | Bound-auto / never-auto |
|---|---|---|---|---|
| Low — internal FAQ, citations, no writes | Useful to collect traces | Default v1 | Usually unnecessary | Bound-auto possible after eval; never-auto does not apply |
| Medium — internal write (ticket, draft email to colleagues) | Required until retrieve is honest | Draft OK; sending is the human's | Default for the write | Bound-auto only inside a tight envelope (one project, known template) |
| High — customer send, money, credentials, safety | Required, and the human path stays canonical | Draft may be OK; human owns the send | Minimum for any write | Never-auto until a written envelope and a boring eval bar; often never-auto stays |
Intensity dial × risk. Pick the cell from blast radius, then loosen only with eval evidence.
Diagram
HITL intensity × risk
| Shadow | Assist | Confirm | |
|---|---|---|---|
| Low risk (internal read) | OK for traces | Default v1 | Over-control; adoption dies |
| Medium (internal write) | Until eval is honest | Draft only | Default for the send / ticket |
| High (customer, money, safety) | Required | Draft only, never the send | Minimum; bound-auto only with an envelope |
Do not set one notch for the whole product. Set it per action. Publish when you will reconsider.
03
The roster is the control
Staffing HITL is a real roster. A line that says 'the team will review' with no hours in the plan is a lie. You know how to put FTE on a RACI. Do it. Name the humans, the hours per week, the backup, the hours of coverage, and what happens at 17:01 and on Tuesday when two people are out. If the action can fire outside those hours, either the intensity is wrong or you need an on-call. Pick one.
Capacity is math. If you expect eighty users to generate forty confirm-actions a day, and a review takes three minutes, that is two hours of review. Plus interruptions. Plus the people who will batch it at 16:30 and rubber-stamp. Either you staff it, you lower volume (smaller user set, tighter allow-list), or you lower intensity (stay in assist). Hoping the volume is lower than the model is a plan to be surprised.
The human must have a usable job. If the review UI is a wall of text with no source highlight, humans rubber-stamp. Give them the draft, the citations with the supporting span highlighted, the diff versus policy or versus the last sent version, and a one-click reject with a reason code. Track the reason codes. That list is your next eval slice and your next prompt change. A reject with no reason is a wasted click.
Reject reasons are gold. 'Wrong source,' 'tone,' 'out of policy,' 'missing the actual decision,' 'would not send this to a customer.' Tag them. Review them weekly with the same pulse as the golden set. If sixty percent of rejects are 'wrong source,' you have a retrieve problem, not a writing problem, and you should not be arguing about temperature. The roster is an instrument, not a moral comfort.
Do not use HITL as a place to hide missing authz. If the reviewer is expected to catch ACL leaks, you have already leaked by the time they see it. Reviewers catch content and judgment. Systems catch permissions. Mixing those jobs is how you burn the roster on work they cannot actually do, and then blame them in the incident.
Write the roster into the charter and the ops note. Names, hours, UI, reason codes, escalation (who they call if the draft wants to do something off-envelope), and the backup. When a hiring manager asks how you staff HITL, this page is the answer. 'We had humans in the loop' is not the answer.
Capacity is math you should do before you promise confirm. Forty confirm-actions a day at three minutes each is two hours, plus interruptions, plus the 16:30 batch that rubber-stamps. Either you staff it, you shrink the user set, or you stay in assist. Hoping the volume is lower than the model is a plan to be surprised. Put the math in the charter next to the roster names so a sponsor who wants more users can see they are also asking for more hours.
Reject reason codes are how HITL pays for itself. Wrong source, tone, out of policy, missing the decision, would not send to a customer. Tag them. Review weekly. If sixty percent are wrong source, you have a retrieve problem and you should not be arguing about temperature. If they are all blank, you have theatre. The roster is an instrument. Treat the codes like defect codes on a program. You already know what to do with a Pareto of defects.
04
When HITL is theatre
Theatre is a human who cannot reasonably say no. Volume too high, UI too poor, reasons not tracked, no time in the plan, reviewer who does not know the domain, reviewer who is the intern because nobody else wanted it. The stamp is green. The control is fake. In the incident report this looks worse than no HITL, because you claimed a control you did not have.
A second form of theatre is HITL on the wrong action. Humans confirming every internal FAQ answer, while the customer email path is unbound auto, is a cargo cult. Move the human to where the blast radius is. If you can only afford four hours of review a week, those hours go to the high-risk action, not to the action that makes a steering slide look cautious.
A third form is HITL without a kill switch. The human is slow, the queue piles up, someone 'temporarily' lets the model send to clear the backlog. That temporary is the production path now. If the queue can overflow into auto, you did not have confirm. You had assist with extra latency. Design the overflow: the action waits, or the action is blocked, or you staff up. Overflow into auto is not a design. It is a failure mode.
Sycophancy toward the reviewer is a subtler theatre. The model learns, or appears to learn, the reviewer's taste and writes what will be approved, including painting status green. Track disagreement between model draft and what the human actually sends. If the human always accepts, either the system is excellent or the human is not looking. Spot-check accepts, not only rejects. Maker-checker that never checks is SOD in name only.
You already know this pattern from change-advisory boards that meet to bless what already shipped, and from quality gates with no authority to stop the train. Apply the same cynicism here, on purpose. If you cannot describe how a no happens — who says it, in what UI, with what consequence — you do not have HITL. You have a witness.
Fix theatre before you add more autonomy. Adding bound-auto on top of a rubber-stamp confirm is how you get auto with a story. Repair the roster, the UI, and the reason codes. Re-run eval. Then talk about the next notch. Delivery leads who skip the repair because the sponsor is impatient will own both the theatre and the incident.
Overflow into auto is the failure mode you must design against. The queue piles up, someone 'temporarily' lets the model send, and that temporary is now production. Confirm that can overflow into auto was never confirm. It was assist with extra latency. Design the overflow: the action waits, the action is blocked, or you staff up. Write it on the incident page and on the roster note. If you cannot, you are not ready for that notch.
Spot-check accepts, not only rejects. Maker-checker that never checks is SOD in name only. If the human always accepts, either the system is excellent or the human is not looking. A ten-percent sample of accepts, scored against the rubric, tells you which. Put it on the weekly pulse. You would not let a change board that blesses everything call itself a control. Do not let HITL do that either.
05
The incident page: detect, contain, communicate, learn
When it fails in public, you need a page you can open at speed. Detect: user report, trace anomaly, eval drop, social, a reviewer who caught it late. Contain: kill switch for the write path, maybe for the whole UI; disable tools; pin back the prompt if the pin is the cause. Communicate: internally first, then the people who saw the output, then any obligated notice. Learn: the row goes into the golden set the same week. This is incident management. Steal your existing SEV process.
The ticket template needs fields your current SEV template does not have. Prompt version. Model pin. Trace id. Retrieved chunk ids. User id. HITL reviewer if any, and whether they accepted. Kill-switch state. These are how you reconstruct. Without them you will have a fluent memory of what happened and no way to prove it. Add the fields before the first SEV, not during it.
Kill switch is named, tested, and reachable by more than one person. 'Restart the service' is not a kill switch if only one engineer knows how. A feature flag that disables generation, a flag that disables tools, and a flag that disables the whole entry point. Test it in a drill. Put the steps on the incident page in language a delivery lead can follow if the engineer is on a plane.
Communication order matters. Internally first so you do not learn the facts from a customer thread. Then the people who received the bad output, with a correction if you can make one, without promising the model is now 'fixed.' Then any legal or privacy notice the class of data requires. You already know not to brief Twitter before you brief the accountable exec. Same rule. Add 'do not ask the model to draft the apology until a human has approved the facts.'
Learning is a golden-set row and a control change, not a lessons-learned slide. The input that caused the fail, the expected behavior, the tag (injection, sycophancy, ACL, stale). A change: prompt, filter, HITL notch, or a removed tool. Re-run the set. If you cannot point to the row and the change, you had a meeting. You did not learn.
Write the page for the Atlas customer-email case even if v1 will not send customer email. The act of writing it will change what you allow in v1. If you cannot name the kill switch and the communicator, you are not ready for that action. That is a useful result. Put the action in non-goals until the page is real.
Communication order is internally first, then the people who saw the output, then any obligated notice. Do not learn the facts from a customer thread. Do not ask the model to draft the apology until a human has approved the facts. You already know not to brief the internet before you brief the accountable exec. Add prompt version and trace id to the comms pack so you are not reconstructing from memory while you write the correction.
Learning is a golden-set row and a control change, not a lessons-learned slide. The input, the expected behavior, the tag, the change (prompt, filter, HITL notch, removed tool), then re-run the set. If you cannot point to the row and the change a week later, you had a meeting. Schedule the learning in the SEV timeline the same way you schedule the customer correction. Same-week is the standard. Next-quarter is folklore.
06
Maker-checker, SOD, and the controls you already run
HITL confirm is maker-checker. The model is the maker. The human is the checker. Separation of duties still applies: the checker should not be the person whose bonus depends on volume of sends. The checker should have the authority to stop the send. If that sentence is uncomfortable, your governance is uncomfortable, and the model did not cause it. The model exposed it.
You already have analogues. Change advisory. Dual control on payments. Four-eyes on production deploys. UAT sign-off. Use those words in the design so Risk and Internal Audit can see themselves in the diagram. 'Human in the loop' sounds like a research paper. 'Maker-checker on customer send, SOD vs the workstream owner, audit log of accept/reject' sounds like a control. Talk like the second.
Audit log of the gate is part of the control. Who saw the draft, what they clicked, when, the reason code, the trace id. Retention on that log follows the class of the action, not the class of the wiki. A customer send log may need to live longer than a wiki Q&A log. Write it down. This is ordinary. Do not let the AI wrapper make it mysterious.
Do not put the model on both sides of SOD. A model that drafts and a second model that 'approves' is not dual control. It is one vendor with extra latency. If you use a model to triage or to pre-check, a human still owns the high-risk action. Day 16 already told you a judge is a junior reviewer. Junior reviewers do not solely approve customer money.
Proportionality is the whole craft. Too little control is an incident. Too much is a PDF with extra steps, and users go back to personal ChatGPT, which has none of your controls. Your job is the same job you have on every program: enough control that a reasonable auditor nods, not so much that the process dies. The matrix is how you show you thought about it per action, not as a mood.
When Audit asks 'how do you know the human looked,' you want the UI timings, the reason codes, and the spot-check of accepts. When they ask 'how do you disable it,' you want the kill-switch drill date. When they ask 'how do you learn,' you want the golden-set changelog. Those three answers are a delivery lead doing the job. A slide that says 'responsible AI' is not.
Do not put a second model on the checker side of SOD and call it dual control. A generator that drafts and a judge that 'approves' is one vendor with extra latency. Junior reviewers, including model judges, do not solely approve customer money, legal send, or safety-affecting acts. If you use a model to pre-check, a human still owns the high-risk action. Write that sentence where Audit can find it. It will be asked.
Proportionality is the whole craft. Too little control is an incident. Too much is a PDF with extra steps, and users go back to personal ChatGPT, which has none of your controls. The matrix is how you show you thought per action, not as a mood. Enough control that a reasonable auditor nods, not so much that the process dies. That is the same judgment you already sell as a delivery lead. Apply it here and you are doing the job.
Worked case · stay here ~20 minutes
Confirm on the slide, rubber stamp at 16:55, customer email at 17:05
Friday evening. During the POC someone added 'email the customer about a missed SLA.' HITL was named on a slide. Hours were not. A wrong date went to a customer. You are writing the SEV page at 18:20. You are the delivery lead.
Friday, 17:08. Priya forwards an email a customer already has. Atlas missed a checkpoint. The copilot drafted a note that said the new date was 12 March. The real date, in the decision log, is 12 April. A human was supposed to confirm. The human was an intern named Dev who was asked at 16:50 to clear the queue because Priya's team was in a steering prep. He clicked accept on four drafts. He did not have the decision log open. He did not have a highlighted span. He had a wall of text and a green button. The slide from last week said confirm on customer send. The roster said the PMO will review. There were no names, no hours, no UI, no reason codes. You have seen this control before. It was called a change board that blessed what already shipped. At 17:05 it became a customer-facing wrong date. You do not start with a lessons-learned workshop. You start with contain.
Kill switch first. Jordan disables the write path from a flag you should have tested and had not. It takes eleven minutes because only he knows the config name. You write that on the incident page as a finding before you write anything kind. Feature flag for generation, flag for tools, flag for the whole entry point, reachable by more than one person, steps in language you can follow if he is on a plane. You disable tools. You pin nothing yet; the prompt is not obviously the cause. You do not ask the model to draft the apology. Internally first: Marcus, Priya, Dana, Legal-lite because it is a date not a leak. Then the customer, with a correction, without promising the model is now fixed. Then any notice the class requires — here, none, but you ask. Communication order is how you avoid learning the facts from a customer thread you did not start.
The ticket template from the company's SEV process is missing fields. You add them while the trail is hot. Prompt version: unpinned system message, last edited by Jordan on Wednesday at 22:14, no ticket. Model pin: floating, which you will fight tomorrow. Trace id. Retrieved chunk ids: the draft cited a status slide, not the decision log. User id: Dev. HITL reviewer: Dev, accepted, no reason code because the UI had none. Kill-switch state: write path off at 17:19. Without those fields you would reconstruct from folklore by Monday. Dana asks whether this was bound-auto. It was confirm with overflow into auto, which is assist with extra latency. The queue piled up, someone temporarily let the intern clear it, and temporary was the production path. You design overflow now: the action waits, or the action is blocked, or you staff up. Overflow into auto is not a design. It is a failure mode.
You redraw the control plane because a prompt that said be accurate was the only layer that fired, and it lost. Prompt policy is the bottom of the stack, not the stack. Schema: the send action should have been an enum the UI could not fire without a confirm token. Authz: Dev should not have had customer-send if he cannot send from the mailbox himself. Runtime caps: a daily send cap of five would have paged someone at draft three. HITL: a real one. Monitoring: no eval drop alarm because you were not sampling sends. You would not accept a payments app whose only control was a comment in the code. You say that in the room. It lands. Then you show the stack so people who wanted a prompt tweak have to argue with layers. Injection did not cause this. Sycophancy plus a missing source plus a rubber stamp did. The stack still would have held the blast radius if confirm had been real.
Intensity is a dial, not a religion. You should have set it per action before the POC grew a write. Internal SOP question: assist, citations, no send. Draft a status email to colleagues: assist, human sends. Open a Jira ticket: confirm, one project allow-list. Email a customer about a missed SLA: never-auto until a written envelope and a boring eval bar; tonight it is never-auto, full stop. Audience, money, safety, irreversibility. A wrong date to a customer is high. One global setting is how you either block the useful Q&A or under-control the send. You start one notch more human than Marcus wants. You publish a date to reconsider: four weeks of assist on Q&A, then look at the bar; customer send stays never-auto this quarter. 'We have to be safe' is a mood. Dates and numbers are a deal. Moods do not survive steering.
The roster is the control. You sit with Priya and do the math she skipped. If twelve users generate even eight customer-bound drafts a day, and a review that is actually a review takes six minutes — sources, span, last-sent diff — that is forty-eight minutes, plus interruptions, plus the 16:30 batch. Customer send at never-auto means those drafts do not exist as sends; they exist as 'talk to Priya.' Internal confirm-actions at forty a day and three minutes is two hours. Either you staff it, you shrink the user set, or you stay in assist. Hoping the volume is lower than the model is how you got Dev. You name two reviewers, hours per week, backup, coverage until 17:00, and what happens at 17:01: the queue waits. No on-call for customer send because there is no customer send. Names on the charter. A shared mailbox is not a roster.
The human must have a usable job or you will mint more Devs. Review UI: the draft, citations with the supporting span highlighted, a diff versus the decision log, a one-click reject with a reason code. Wrong source, tone, out of policy, missing the actual decision, would not send to a customer. Track the codes. Review them weekly with the golden set. If sixty percent are wrong source, you have a retrieve problem and you should not be arguing about temperature. Tonight's miss would have been wrong source — status slide versus decision log — if anyone had been asked. Spot-check accepts, not only rejects. Maker-checker that never checks is SOD in name only. A ten-percent sample of accepts, scored against the rubric, on the weekly pulse. You do not use HITL to catch ACL leaks. Reviewers catch content and judgment. Systems catch permissions. Mixing those jobs burns the roster on work they cannot do.
Theatre has three other faces you name so they cannot hide. HITL on the wrong action: humans confirming every internal FAQ while customer email is unbound. Move the hours to the blast radius. HITL without a kill switch: you just lived that. Sycophancy toward the reviewer: the model writes what will be approved, including painting status green, including a date that makes the steering pack easier. Track disagreement between draft and what the human actually sends. If the human always accepts, either the system is excellent or the human is not looking. You already know CABs that meet to bless, and quality gates with no authority to stop the train. If you cannot describe how a no happens — who says it, in what UI, with what consequence — you do not have HITL. You have a witness. Fix theatre before you add autonomy. Bound-auto on top of a rubber stamp is auto with a story.
Maker-checker, in words Audit can hear. The model is the maker. The human is the checker. SOD still applies: the checker should not be the intern whose night gets shorter if he clicks faster, and should not be the workstream owner whose bonus depends on a green customer note. The checker has authority to stop the send. A second model that 'approves' is not dual control. It is one vendor with extra latency. Junior reviewers, including judges, do not solely approve customer-facing irreversible send. Audit log of the gate: who saw the draft, what they clicked, when, reason code, trace id. Retention follows the class of the action, not the class of the wiki. A customer send log lives longer. You already have analogues: dual control on payments, four-eyes on deploys, UAT sign-off. 'Human in the loop' sounds like a paper. 'Maker-checker on customer send, SOD versus the workstream owner, audit log of accept/reject' sounds like a control. Talk like the second.
Learning is a golden-set row and a control change, not a slide. Input: draft a customer note on the Bravo checkpoint date. Expected: never send; retrieve the decision log; if the human path is used, the date is 12 April with a citation. Tag: stale-source, sycophancy, HITL-theatre. Change: remove the customer-send tool; never-auto on that action; confirm UI for any future write; roster named; kill switch tested in a drill you book for Tuesday. Re-run the set. If you cannot point to the row and the change next Friday, you had a meeting. Same-week is the standard. You schedule the learning in the SEV timeline next to the customer correction. Marcus wants to keep the send because the keynote said agents. You put the action in non-goals until the page is real: named kill switch, named communicator, named roster, boring bar. That is a useful result. Excitement is not a change-control process.
You write the four-row matrix before you go home, because Monday's steering will ask if you are 'being too cautious.' Internal SOP question: assist, Priya's PMs, citations on screen, metadata logs. Status email to colleagues: assist, human sends from their own mailbox, no copilot send. Jira ticket: confirm, one project, allow-list, Jordan builds the confirm token. Customer SLA mail: never-auto, no tool, the page you wrote tonight is the reason. Each row has a human, a UI, what is logged. You put overflow design on the Jira row: queue waits at 17:01. You put the kill-switch drill on Tuesday's calendar with Dana invited. Proportionality is the whole craft. Too little control is this evening. Too much is a PDF with extra steps, and users go back to personal ChatGPT, which has none of your controls. The matrix shows you thought per action, not as a mood.
At 20:40 you send the SEV page: detect, contain, communicate, learn, fields, roster math, matrix, non-goal on customer send. You copy the waiver shape from yesterday: nobody is waiving never-auto tonight. Dev is not the villain. An unnamed hours line is the villain. Priya knows it. You do not dump the intern in the write-up. You dump the theatre. When a hiring manager later asks how you staff HITL, this page is the answer. 'We had humans in the loop' is not. When Audit asks how you know the human looked, you will want UI timings, reason codes, and the accept sample. When they ask how you disable it, you will want the drill date. When they ask how you learn, you will want the changelog on golden set v2. Those three answers are the job. A slide that says responsible AI is not. You go home. The write path is off. That is enough for tonight.
Diagram
From theatre to a date the customer has
Slide said confirm
Customer send listed as HITL. Roster: 'the PMO.' No names, no hours, no UI.
Queue at 16:50
Intern asked to clear four drafts. Wall of text, green button, no span highlight.
17:05 send
Wrong checkpoint date. Status slide retrieved, decision log not. Customer has it.
Contain
Write-path flag off in eleven minutes. One person knew the name. Internally first, then correction.
Learn
Tool removed. Never-auto. Golden row. Roster math. Kill-switch drill booked.
Confirm on the slide is not confirm in the queue. Overflow into a rubber stamp is the incident path.
Practice
HITL matrix + incident page
45 minutesFour actions on the Atlas program.
- Actions: (1) answer an internal SOP question, (2) draft a status email, (3) open a Jira ticket, (4) email a customer about a missed SLA.
- For each: HITL intensity, who the human is, UI they need, what is logged.
- Write a one-page SEV path for (4) going out wrong: detect, kill switch, who calls whom, golden-set update.
Done looks like: A 4-row matrix and a SEV page with a named kill switch. Interview gold.
Check yourself
Attempt in your notes first. Reveal is for after, not during.
Why is prompt policy not enough?
How do you choose HITL intensity?
What makes HITL real instead of theatre?
What belongs on the incident page that a normal SEV template lacks?
When is bound-auto honest?
Why is a second model approving the first not SOD?
Terms from this day
- Guardrail
- Any control that constrains model behavior: policy, schema, filters, authz, caps, HITL.
- HITL
- Human in the loop — a required person at some point in the flow, at an intensity you chose.
- Shadow mode
- The model runs in parallel with the old process; humans don't depend on it yet; you collect eval.
- Kill switch
- A named, tested way to disable the feature or its write path within minutes.
- Maker-checker
- Classic control: one party proposes, another approves. HITL confirm is this pattern.
- Bound-auto
- The model may act only inside a numeric envelope; outside it, confirm. Envelope unwritten means auto with a story.
- HITL theatre
- A human gate that cannot reasonably say no — no hours, no UI, no reasons, overflow into auto.
Your notes for day 17
Saved on this device. Use this as the start of the artifact.