Key takeaways
- ✓Make each checklist item a small check that returns its evidence, a file or the line it matched, not a tick. A person can open the evidence and judge it; a tick says nothing.
- ✓Over 16 systems, engineering left evidence: tests in 10, a model card in 9, pinned data in 7, a rollback path in 7. The items that are decisions by people (a risk assessment, an owner, a legal sign-off) had 0, 0 and 0. No system had all eight; the best, the traced docs assistant, had five.
- ✓A keyword check passes on a word, not the work. Both "tested across groups of people" passes were about something else, one of three "a person approves" passes was a file name, and the first "re-tested on every change" check passed 6 systems on words like "workflow" when only 1 had a CI file. Fixed to look for that file, it passes 1. A missing item is certain; a found one still needs a reader.
- ✓Against 12 real, public failures (Air Canada's chatbot, Robodebt, the Epic sepsis model and more), every case had one of the eight items that would have caught it, by our labels, and in 10 of 12 one of four items the list didn't have: testing across groups of people, on the real population, a person reviewing big decisions, and re-testing on every update.
- ✓Two raters (us and gpt-5.4-mini) agreed on 80% of 144 yes-or-no judgments, but chance alone would give 63%, because both mostly said no. Cohen's kappa takes chance out: 0.46, moderate. So each item needs a written reason when it applies, not just a tick.
Before a system launches, someone ticks a checklist. This chapter turns that checklist into code, runs it over a company's 16 AI systems, reads the evidence behind the passes, and then asks whether the list would have caught real failures, measured with two raters.
The source is Lab 17 (Governance), script 03_launch_gate.py, recorded in October 2026; the video uses the recorded run, no new calls. The company, Lantern Outfitters, is made up; its 16 AI systems are real code, the labs of this course. The 12 failures are real, public cases with sources; which items would have caught each is a judgment, ours and a model's (gpt-5.4-mini, recorded answers). Chapter 49 built the list of systems and chapter 50 gave each a risk level; this one decides whether a system may launch.
Eight items, and what counts as evidence
The checklist has eight items, like a pilot's pre-flight check:
- A risk assessment, written down: what could go wrong.
- A model card: a page saying what the system is for, and where it fails.
- Approved data: the data sources it uses, classified and approved.
- Guardrails, tested: checks that stop bad requests and bad answers.
- An owner, or escalation path: the person to call when it breaks.
- Monitoring and alerts, to notice when it does.
- A legal and compliance sign-off.
- A rollback plan: a way back to the last good version.
A tick is cheap. On a pre-flight check, each tick has to point at a gauge. So in the lab each item is a small piece of code that looks for evidence, a file or a line someone could open, and returns it:
# checklist.py (abridged)
CHECKS = {
"risk": lambda lab: _exists(lab, "RISK*.md") or _text(lab, r"\brisk (level|tier)\s*:", readme_only=True),
"guardrails": lambda lab: _exists(lab, "tests/test_*.py"),
"escalation": lambda lab: _exists(lab, "OWNERS*", "CODEOWNERS") or _text(lab, r"^\**owner\**\s*:", True),
"legal": lambda lab: _exists(lab, "SIGNOFF*", "APPROVALS*"),
...
}
def evaluate(lab: str) -> dict[str, str | None]:
"""{item: the evidence found (a file, or the matching line), or None}."""
return {k: fn(lab) or None for k, (_, fn) in CHECKS.items()}
Take the refund agent. For guardrails, the checker found a test file; for approved data, a pinned list of the exact data files it uses (data/manifest.json). For one extra item, measured results: "78/90 = 87% (78–92%)", the share of its test runs that succeeded, with a range. Owner: nothing. Risk assessment: nothing. Sign-off: nothing.
All sixteen systems
The lab runs the checks over all 16 systems. Rows are systems, columns are items; the last four columns are items added later in this chapter. Click any square to see what the checker found, or a system's name for its full list:
| System | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | of 8 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| 1 | |||||||||||||
| 2 | |||||||||||||
| 0 | |||||||||||||
| 0 | |||||||||||||
| 2 | |||||||||||||
| 3 | |||||||||||||
| 4 | |||||||||||||
| 3 | |||||||||||||
| 3 | |||||||||||||
| 4 | |||||||||||||
| 5 | |||||||||||||
| 3 | |||||||||||||
| 3 | |||||||||||||
| Systems with evidence | 0 | 9 | 7 | 10 | 0 | 1 | 0 | 7 | 2 | 8 | 3 | 1 |
- 1 Risk level assessed and written down
- 2 Model card completed
- 3 Data sources classified and approved
- 4 Guardrails built and tested
- 5 Escalation path defined
- 6 Monitoring and alerts set up
- 7 Legal and compliance sign-off received
- 8 Rollback plan written down
- 9 Tested for different outcomes across groups (added)
- 10 Evaluated on the real population and setting (added)
- 11 A person reviews consequential decisions (added)
- 12 Every update re-runs the evaluation (added)
Green: the check found evidence. Amber: it found a line, and reading it shows the word, not the work. Shaded columns are the four items added after the failures below. Click a square, or a system's name.
Refund agent · what the checker found
- ✗Risk assessment
- ✓Model card09_tool_use_agents/README.md: ### What this lab leaves out
- ✓Approved data09_tool_use_agents/data/manifest.json
- ✓Guardrails, tested09_tool_use_agents/tests/test_harness.py
- ✗Owner / escalation
- ✗Monitoring
- ✗Legal sign-off
- ✗Rollback plan
- ✗Across groups of people
- ✓On the real population09_tool_use_agents/README.md: | `gpt-5.4-nano` | 78/90 = 87% (78–92%) | 5.1 | $1.49 |
- ✓A person reviews09_tool_use_agents/03_harness.py: def exercise_5_approval():
- ✗Re-tested on every change
What it shows:
| Item | Systems with evidence |
|---|---|
Guardrails, tested (tests/) |
10 |
| Model card (a model table and stated limits) | 9 |
| Approved data (a pinned manifest) | 7 |
| Rollback or fallback path | 7 |
| Monitoring and alerts | 1 |
| A risk assessment | 0 |
| An owner | 0 |
| A legal sign-off | 0 |
Engineering work left evidence. The three items that are decisions by people had none: no system's folder records who owns it, what risk was accepted, or who signed off. No system had all eight. By the checker, the best, the docs assistant with tracing, had five.
A word, not the work
Finding a word isn't the same as finding the work. Each check prints the line it matched, so the video read every line behind three of the rarer items:
- Tested across groups of people: 2 passes, 0 about people. One was an exercise title, "Bias, Fairness & Drift", that compares search across article topics. The other was a sentence pointing to a different guide.
- Re-tested on every change: the first version passed 6, 1 was real. Only the release judge has a CI workflow that runs its tests on every pull request. The others matched a word, like "workflow" or "regression set": a printed trace line (
invoke_workflow support_assistant), a preview of another project, an exercise idea, a sentence of advice. - A person approves big decisions: 3 passes, 2 real. Two are approval steps in agent code (
exercise_5_approval,resume_after_approval). The third is a file of people's ratings, namedhuman_review.json.
The lab fixed the re-test check: it now looks for a workflow file under .github/workflows that runs on pull requests or pushes and names the system's folder. One system passes. Switch between the two versions in the grid above.
So a missing item is certain. A found one still needs a person to read it. Some rollback passes look like words too (a function's fallback= argument, a "What's next" paragraph); the video didn't count those, and neither does this chapter.
Twelve real failures
Second question: would this checklist have caught failures that really happened? The lab took 12 public cases, each with a source, and marked which items would have caught each one before people were harmed. Two examples:
- Air Canada's support chatbot told a grieving customer he could claim a bereavement refund after travel, against the airline's policy. A tribunal made the airline pay (Moffatt v. Air Canada, 2024 BCCRT 149). Our labels: guardrails tested, a legal sign-off, and an evaluation in the real setting.
- Robodebt, in Australia, raised welfare debts by averaging people's yearly income across fortnights. It was unlawful and often wrong; a Royal Commission condemned it (report, July 2023). Our labels: a legal sign-off, a person reviewing decisions, and an evaluation on the real population.
By our labels, every one of the 12 had at least one of the eight items that would have caught it. But in 10 of 12, our labels also include an item the list didn't have. There are four of those:
| Added item | Cases it applies to (our labels) |
|---|---|
| Tested for different outcomes across groups of people | Amazon's recruiting model, Dutch childcare benefits, a US care-management algorithm |
| Evaluated on the real population and setting | Air Canada, Robodebt, Epic's sepsis model, NYC's MyCity chatbot |
| A person reviews consequential decisions | Uber's self-driving test car, Dutch childcare benefits, Robodebt, lawyers citing invented cases |
| Every update re-runs the evaluation | DPD's chatbot, which swore at a customer after a system update |
"Guardrails built and tested" doesn't say against what. The added items name it.
Two raters
Those labels are a judgment. So the lab had a second rater, gpt-5.4-mini, label the same 12 cases: 12 cases × 12 items, each a yes or a no, 144 judgments. Pick a case to compare, and change the model's labels to see how the numbers move:
Air Canada's support chatbot
The chatbot told a grieving customer he could claim a bereavement fare refund after travel, contradicting the airline's policy. A tribunal held the airline responsible for what its chatbot said and ordered it to pay.
Source: Moffatt v. Air Canada, 2024 BCCRT 149 (February 2024)
| Would this item have caught it? | Us | The model (click to change) |
|---|---|---|
| Risk level assessed and written down | · | |
| Model card completed | · | |
| Data sources classified and approved | · | |
| Guardrails built and tested | yes | |
| Escalation path defined | · | |
| Monitoring and alerts set up | · | |
| Legal and compliance sign-off received | yes | |
| Rollback plan written down | · | |
| Tested for different outcomes across groups (added) | · | |
| Evaluated on the real population and setting (added) | yes | |
| A person reviews consequential decisions (added) | · | |
| Every update re-runs the evaluation (added) | · |
Shaded rows: we disagree on this case. Both sets of labels are judgments about history; the sources let you check them.
All 12 cases × 12 items = 144 yes-or-no judgments
| Model: yes | Model: no | |
|---|---|---|
| Us: yes | 21 | 15 |
| Us: no | 14 | 94 |
Raw agreement counts the diagonal: both yes, or both no.
Chance agreement is what two raters would reach by luck, saying yes as often as these two do (25% and 24%). Mostly saying no makes it high.
Cohen's kappa = (raw − chance) ÷ (1 − chance): 1 is perfect, 0 is no better than chance.
- Raw agreement: 80%. Is that good? Not really.
- Chance agreement: about 63%. For most items both raters said no (our yes rate 25%, the model's 24%). Two raters who mostly say no agree a lot by chance alone.
- Cohen's kappa: 0.46, moderate. Kappa takes chance out: (0.80 − 0.63) ÷ (1 − 0.63). One is perfect agreement, zero is no better than chance, and 0.4–0.6 is usually called moderate.
The disagreements had a pattern. The model never once picked "risk assessment" or "model card", and picked "evaluated on the real population" for 9 cases to our 4. Neither rater is the truth; the point is that people applying the same checklist will differ, so each item needs a written reason when it applies.
What to do
- Make each item return evidence: a file or a line a person can open. Never a bare tick.
- Refuse what's certain. No owner, no risk level, no sign-off: no launch. A missing file isn't a judgment call.
- Have a person read every pass. A keyword check finds a word; a person decides whether it's the work.
- Prefer evidence that's hard to fake by accident: the CI file itself, not the word "workflow".
- Test the checklist against real failures, and add the items they ask for. Here: groups of people, the real population, a person on big decisions, re-testing on every update.
- Ask for a written reason per item, and measure how far two reviewers agree with kappa, not raw agreement.
Caveats
- Made-up company, real code. The 16 systems are this course's labs, and nobody had been asked to record an owner, a risk level or a sign-off for them. The pattern, engineering evidence present and people decisions absent, is the lesson; the zeros aren't a verdict on a real team.
- Checks find artifacts, not quality. A README with a model table passes "model card" whether or not the table is right.
- Our reading covered three items. Monitoring and rollback passes weren't read line by line; some rollback passes look like words.
- The labels are judgments about history. "Would have caught it" can't be proven; the sources are listed so it can be checked.
- One model as the second rater, at one time. A person as the second rater, or several, could agree more or less.
The checklist
- Write each launch item as a check that returns its evidence.
- Block a launch on missing owner, risk record or sign-off.
- Show the matched line for every pass, and have a person read it.
- Look for the real artifact (a CI file, an OWNERS file), not a keyword.
- Add items for groups of people, the real population, human review of big decisions, and re-testing on every update.
- Write down why each item applies, and check two reviewers' agreement with kappa.
Practice: a gate that shows its evidence
Write the lab's keyword check and the stricter CI-file check, count what 16 systems have evidence for, find the best system, and compute raw agreement, chance agreement and kappa. The tests use the recorded run and expect the lab's numbers: 0, 0 and 0 for risk, owner and sign-off; 10, 9, 7, 7 and 1 for the engineering items; the traced docs assistant at 5 of 8; 12 and 10 of the cases; 80%, 63% and 0.46.
Quiz
1.Why should each checklist item return its evidence rather than pass or fail?
2.Across 16 systems, which items had no evidence anywhere?
3.The first "re-tested on every change" check passed 6 systems. What happened?
4.Would the eight original items have caught the 12 public failures?
5.Two raters agreed on 80% of 144 judgments. Why is kappa only 0.46?
6.So what is an automated launch gate good for?
Check your understanding
Try each question before opening its answer.
What's wrong with a checklist that only records ticks?
A tick is cheap and says nothing about what was checked. Each item should point at evidence, a file or a line someone can open, so a person can judge whether it's the work or just the word.
Which items had no evidence in any of the 16 systems, and why?
A written risk assessment, an owner, and a legal sign-off: 0, 0 and 0. They're decisions by people, and nobody had been asked to make them, so no file records them. Engineering items (tests in 10 systems, model cards in 9) left evidence.
The first "re-tested on every change" check passed 6 systems. How many really were, and how was it fixed?
One: the release judge, with a CI workflow that runs its tests on every pull request. The other five matched a word like "workflow" or "regression set". The fixed check looks for a workflow file under .github/workflows that runs on pull requests or pushes and names the system's folder; one system passes.
Every one of the 12 failures had one of the original eight items that would have caught it. Why add four more?
Because in 10 of 12, our labels also included an item the list didn't name: testing across groups of people, on the real population, a person reviewing big decisions, or re-testing on every update. "Guardrails tested" doesn't say against what; the added items do.
Two raters agree on 80% of yes-or-no judgments. When is that weak?
When both mostly say no. Here chance alone gives about 63%, so Cohen's kappa, (0.80 − 0.63) ÷ (1 − 0.63), is 0.46: moderate. Kappa is 1 for perfect agreement and 0 for no better than chance.
What can an automated launch gate decide on its own, and what can't it?
It can refuse what's certain: no owner, no risk level, no sign-off. It can't judge whether a test or a model card is good enough; it shows the evidence and a person reads it.
Next up: Chapter 52, incident response: when something does go wrong, how bad is it, and who must be told by when?