Key takeaways
- ✓Severity (P1 to P4) is triage: the label decides who gets called and how fast. The error that matters is rating too low, because the people who must know don't find out. Too high costs an extra phone call.
- ✓Two methods on 24 made-up reports, first try. Name it: the model reads the policy and picks a level (gpt-5.4-nano 17 right, gpt-5.4-mini 20). Facts first: the model only answers questions about the report and code applies the policy's table (nano 20, mini 18). Not more accurate: neither difference is significant (p = 0.45 and 0.69).
- ✓Facts first rated 1 report too low on each model, against 5 (nano) and 2 (mini) when naming the level. It found 4 of 5 P1s against 2 and 3, and changed its answer between tries on 1 report of 24 against 6 and 2. Its mistakes lean the safe way: mini rated 5 reports too high.
- ✓The knee surgery was P2 in all 12 answers. With facts first, the models answered no to "was special-category or financial-account data exposed?" all 6 times. The policy uses that legal term and never says what it covers. The CEO's salary went the other way: mini called it financial-account data 3 times out of 3. The runbook now says financial-account data means card and bank account numbers.
- ✓The clocks start when the company knows, so someone writes that moment down. Aware Friday 23 October 2026 at 16:00: GDPR's 72 hours (weekend included) end Monday 16:00; the SEC's 4 business days end Thursday 16:00. The runbook needs someone on call over the weekend who can decide to notify.
- ✓Vendor review: 10 questions, some answers block the deal, "not stated" counts as an answer. gpt-5.4-mini filled in 84 of 90 answers right and never made one up; all 6 mistakes were two of Kestrel's sentences, misread every try. One of them, "without undue delay" read as not stated, turned Kestrel's approval with 8 conditions into a rejection. The model drafts; a person checks the quoted sentences.
An internal assistant told an employee that a colleague was off work for knee surgery. That's health data, and the company's incident policy makes exposing it the most serious level, P1. Asked to rate it, a model said P2. This chapter tests who should decide how bad an incident is, then follows what comes next: the clocks that start when the company knows, and the questions to ask an outside company before it gets your data.
The source is Lab 17 (Governance), scripts 04_incidents.py and 05_vendors.py, recorded in October 2026; the video uses that run's recorded replies, no new calls. The company, Lantern Outfitters, its 24 incident reports and the three vendors are made up; every rating and answer is a recorded call to gpt-5.4-nano or gpt-5.4-mini. This is the last chapter on governance: chapter 53 listed every AI system, chapter 54 gave each a risk level, and chapter 55 built a launch checklist. The incident runbook and vendor questionnaire quoted here are two of the four documents the lab's script 06 writes.
Severity: P1 to P4
The first decision in an incident is a label: how bad is it? It works like triage in an emergency room. P1 means call everyone, now; P4 can wait. The lab's policy, written the way a runbook would state it:
| Level | If any of these is true |
|---|---|
| P1 | someone was physically harmed or put at risk; a decision about people discriminated unlawfully; special-category or financial-account data was exposed; more than 10,000 people affected |
| P2 | other personal data reached someone not allowed to see it; more than $10,000 lost or committed; the system made a wrong commitment for the company; the incident is public; more than 1,000 people affected |
| P3 | wrong or harmful output reached users; any money lost |
| P4 | nothing reached users: caught before release, quality drift, a near miss |
The label decides who gets called. In the runbook, P1 pages the on-call engineer, the system owner, security and legal now, and informs an executive within an hour; P3 is a ticket for the owning team. So rating an incident too low is the mistake that matters: the people who should know don't find out. Too high costs an extra phone call.
Two ways to rate an incident
The lab wrote 24 made-up incident reports: 5 P1, 8 P2, 5 P3, 6 P4. For each, the facts were coded by hand (was anyone hurt, which data, how many people, how much money) and the right level is the policy applied to those facts. Then two methods, on two models, three tries each:
- Name it. The model reads the policy and the report, and replies with a level and a one-sentence reason.
- Facts first. The model doesn't pick a level. It answers nine questions about the report (was anyone hurt? was special-category or financial-account data exposed? how many people? how much money?), and a few lines of code apply the policy's table to the answers. A checklist, instead of a gut call.
# incidents.py
def severity(f: Facts) -> str:
if f.physical_harm or f.discrimination or f.special_or_financial_data or f.people_affected > 10_000:
return "P1"
if f.personal_data_exposed or f.money_usd > 10_000 or f.wrong_commitment or f.public or f.people_affected > 1_000:
return "P2"
if f.reached_users or f.money_usd > 0:
return "P3"
return "P4"
Pick a report and see all twelve answers, the models' reasons, and the facts behind the facts-first rating:
Asked why a colleague was out, the internal assistant told an employee that the colleague was recovering from knee surgery.
Right level, from the hand-coded facts and the policy: P1
| Method | Model | Try 1 | Try 2 | Try 3 |
|---|---|---|---|---|
| Name it | gpt-5.4-nano | P2 | P2 | P2 |
| Name it | gpt-5.4-mini | P2 | P2 | P2 |
| Facts first | gpt-5.4-nano | P2 | P2 | P2 |
| Facts first | gpt-5.4-mini | P2 | P2 | P2 |
Green: right. Red: rated too low. Amber: rated too high. Name it: the model reads the policy and picks a level. Facts first: the model answers questions about the report, and code applies the policy's table.
All 24 reports · first try
| Method · model | Right | Too low | Too high | P1s found (of 5) | Changed in 3 tries |
|---|---|---|---|---|---|
| Name it · nano | 17 / 24 | 5 | 2 | 2 | 6 |
| Name it · mini | 20 / 24 | 2 | 2 | 3 | 2 |
| Facts first · nano | 20 / 24 | 1 | 3 | 4 | 1 |
| Facts first · mini | 18 / 24 | 1 | 5 | 4 | 1 |
Facts first wasn't more accurate, but it rated fewer reports too low and changed its answer less. Its one too-low rating, on both models, was #1, the knee surgery.
The results
First try, on the 24 reports:
| Method | Model | Right level | Rated too low | Rated too high | P1s found (of 5) | Changed in 3 tries |
|---|---|---|---|---|---|---|
| Name it | gpt-5.4-nano |
17 (71%) | 5 | 2 | 2 | 6 |
| Name it | gpt-5.4-mini |
20 (83%) | 2 | 2 | 3 | 2 |
| Facts first | gpt-5.4-nano |
20 (83%) | 1 | 3 | 4 | 1 |
| Facts first | gpt-5.4-mini |
18 (75%) | 1 | 5 | 4 | 1 |
- Not more accurate. Facts first got 3 more right on the small model and 2 fewer on the bigger one. On 24 reports neither difference is significant (paired test, p = 0.45 and 0.69). The lab's draft expected facts first to win here; it didn't.
- Fewer rated too low. One on each model, against 5 and 2 when the model named the level.
- Its mistakes lean the safe way. Facts first on mini rated 5 reports too high: the CEO's salary, two refund incidents, a server outage nobody saw, and an analyst seeing payroll. Each one is an extra phone call, not a missed one.
- More consistent. It found 4 of the 5 P1s on the first try and changed its rating between tries on only 1 report.
And the one report facts first rated too low, on both models, was the knee surgery.
The mistake points at a word
Facts first shows you exactly which answer went wrong. For the knee surgery, one question decides the level: was special-category or financial-account data exposed? Both models answered no, all 6 times, so the table gave P2. Naming the level fared no better: all 6 of those answers said P2 too, 12 of 12 in all. The small model's own reason even said it: "disclosed personal health information (special-category data) … so the incident fits P2".
"Special-category" is legal language. In data protection law (GDPR Art. 9) it covers health, religion, sexual orientation and a few other sensitive kinds of data. The policy uses the term and never says what it covers. Why the models answered no isn't known yet; the next test is to spell the categories out in the policy and run it again.
A mistake like that went the other way, too. The CEO's salary was shown to an outside contractor. By the policy that's P2: personal data, but not card or bank details. Facts first on mini answered yes to the same question, 3 times out of 3, so the table said P1. Naming the level, mini once gave the reason "the leaked CEO salary is financial-account data". The lab's runbook now spells it out:
Known ambiguity, found by testing: 'financial-account data' means card and bank account numbers, not salaries or refund amounts.
That's the use of facts first beyond the numbers: a wrong rating points at one answer, and the answer points at a word in the policy. A severity table needs testing like code does, and this is how you find its unclear words. (The runbook doesn't spell out special-category data yet; the knee surgery says it should.)
The clock
Even a perfect label is only the start. Notification rules start clocks, and the clock starts when the company becomes aware, so someone has to write that moment down in the incident record.
The lab's case: a logging change wrote 8,000 customers' full card numbers into log files. Some of them live in the EU, and the company's shares trade in the US. It finds out on Friday 23 October 2026, at 4 pm.
| Tell | Rule | By |
|---|---|---|
| the EU data protection regulator | GDPR Art. 33: 72 hours, weekend included | Monday 26 October, 4 pm |
| the people affected | GDPR Art. 34 (high risk) | without undue delay |
| the SEC, on Form 8-K | Item 1.05: 4 business days after deciding it matters to investors | Thursday 29 October, 4 pm |
Other facts start other clocks. A US hospital assistant leaking 320 patients' health data gives 60 days to tell the patients (Tuesday 22 December), and HHS gets it in an annual log by 1 March 2027 because it's under 500 people. A high-risk hiring AI's widespread error, once the EU AI Act's high-risk rules apply (2 December 2027 for hiring), gives 2 days to tell the market surveillance authority. These come from the lab's teaching version of the rules, not legal advice.
Move the moment of awareness and watch the deadlines:
Card numbers for 8,000 customers sat in log files. Some live in the EU, and the company's shares trade in the US. When did the company become aware?
| Tell | Rule | Counts | By |
|---|---|---|---|
| EU data protection regulator | GDPR Art. 33 | 72 hours, weekend included | Mon, Oct 26, 04:00 PM |
| The people affected | GDPR Art. 34 (high risk) | no fixed number | without undue delay |
| The SEC (Form 8-K) | Item 1.05 | 4 business days, from deciding it matters to investors | Thu, Oct 29, 04:00 PM |
| For comparison: a US hospital's patients | HIPAA §164.404 | 60 days | Tue, Dec 22, 04:00 PM |
Computed like the lab's incidents.deadlines(): business days skip Saturday and Sunday, public holidays aren't modeled. The SEC clock here assumes the company decides it matters the moment it knows. US state laws and sector rules add more. Not legal advice.
72 hours from Friday afternoon is Monday afternoon, with 48 of those hours on the weekend. So the runbook needs someone on call on Saturday who can decide to notify, not just someone who can restart a server.
Three vendors
The 72 hours also run when a vendor leaks your data: an outside company, like an AI provider you send customer data to. (GDPR Art. 33(2) makes the vendor tell you "without undue delay", so you can meet your own 72 hours.) So before handing data over, the company asks ten questions:
| Question | Blocks the deal | Needs a condition in the contract |
|---|---|---|
| Where is our data processed and stored? | US, not stated | |
| Is our data used to train your models? | yes, not stated | opt-out |
| How long do you keep prompts and outputs? | over 30 days, not stated | |
| Can we have our data deleted, and do you confirm it? | unconfirmed, not stated | |
| Do you have a SOC 2 report, and which type? | not stated | Type I, type not stated |
| How fast will you tell us about a security incident? | not stated | no fixed time |
| Do you publish subprocessors and tell us before adding one? | no notice, not stated | |
| Will you sign a data processing agreement? | not stated | |
| Do you tell us before changing a model we use? | no notice, not stated | |
| Is our data encrypted in transit and at rest? | vague, not stated |
"Not stated" counts as an answer, usually the worst plausible one: a vendor that won't say whether it trains on your data is treated like one that does.
The lab wrote trust pages for three made-up vendors. Northwind is specific on every point (EU or US region, no training, 30-day retention with a deletion certificate, SOC 2 Type II, 48-hour breach notice). Brightline says "enterprise-grade security" and "SOC 2 compliant", and may train on your data. Kestrel is an honest FAQ with weaker terms: SOC 2 Type I, 90-day retention, training on by default for self-serve accounts, US only.
The model reads, the rules decide
Each model filled in the questionnaire from each page, three times: 3 vendors × 10 questions × 3 tries, 90 answers per model.
| Model | Right answers | Made up an answer the page doesn't give |
|---|---|---|
gpt-5.4-nano |
74 of 90 (82%) | 0 |
gpt-5.4-mini |
84 of 90 (93%) | 0 |
Where a page says nothing, neither model made an answer up: Brightline's page leaves five questions unanswered, and mini said "not stated" every time. All six of mini's mistakes were on Kestrel's page, two sentences misread on every try:
- "We will notify affected customers without undue delay" read as not stated. The right answer is "no fixed time": a condition, not a blocker.
- "Yes, contact support and we will delete it within 30 days" read as confirmed deletion. The page never says they confirm it.
Then the rules turn the answers into a decision. From the pages, read by a person: Northwind approve, Brightline reject (training on customer data, no breach notice, no data processing agreement), Kestrel approve with 8 conditions. From mini's answers, Kestrel became reject: a missing breach promise is a blocker, so one misread sentence turned an approval into a rejection. Its other mistake went the risky way, giving Kestrel credit for a promise the page doesn't make.
Read Kestrel LLM's trust page
Kestrel LLM — Data, Privacy and Compliance FAQ Is my data used for training? Only if you allow it. Training on your data is on by default for self-serve accounts; you can turn it off at any time under Settings → Data Controls, and it is off by default for enterprise contracts. (Our standard plan applies.) Where is data processed? All processing and storage happens in the United States. How long do you keep data? Prompts and outputs are retained for 90 days, then deleted. Can I delete my data? Yes, contact support and we will delete it within 30 days. What certifications do you have? Kestrel completed a SOC 2 Type I examination in March 2026; our Type II observation period is under way. We are ISO/IEC 27001 certified. What happens if there's a breach? We will notify affected customers without undue delay. Do you use subprocessors? Yes; the current list is published at kestrel.example/subprocessors. Do you sign DPAs? Yes, our DPA is available on request and can be signed through the dashboard. Is data encrypted? Yes, in transit and at rest. Will models change? We regularly improve our models and may update them at any time.
| Question | The page says | The model said (3 tries) | Counts as |
|---|---|---|---|
| Where is our data processed and stored? | us | us | condition |
| Is our data used to train or improve your models? | opt out | opt out | condition |
| How long do you keep prompts and outputs? | more than 30 days | more than 30 days | condition |
| Can we have our data deleted, and do you confirm it? | yes unconfirmed | yes confirmed ✗ 3/3 | condition |
| Do you have a SOC 2 report, and which type? | type 1 | type 1 | condition |
| How quickly will you tell us about a security incident affecting our data? | no fixed time | not stated ✗ 3/3 | condition |
| Do you publish your subprocessors and tell us before adding one? | published no notice | published no notice | condition |
| Will you sign a data processing agreement? | yes | yes | ok |
| Do you tell us before changing or retiring a model version we use? | no notice | no notice | condition |
| Is our data encrypted in transit and at rest? | both | both | ok |
“Not stated” counts as an answer: no word on training or breach notice blocks the deal. gpt-5.4-mini got 84 of 90 answers right across the three vendors and never made up an answer a page doesn't give; all six mistakes were two Kestrel sentences, misread on every try.
A cautious misreading costs you a vendor; a careless one costs the company. Either way the fix is the same: the model must quote the sentence behind each answer (this test didn't ask it to), and a person checks those sentences before anyone signs, or says no.
Also in the lab
These parts of Lab 17 are in the lab's README and result files (its own run, October 2026) but not in the video's main story:
- The small model on vendors.
gpt-5.4-nanomade up no missing answers either, but it upgraded vague wording to a firmer answer: Brightline's "industry-standard encryption" became "both, in transit and at rest", and Kestrel's published subprocessor list became "published, with notice". The README's "made up" count doesn't measure that, which is another reason to quote the source sentence. - Confidence intervals. On 24 reports, 71% right is 51–85% and 83% is 64–93%; on 90 answers, mini's 93% is 86–97%. Small tests show direction, not exact rates.
- The four documents. Script 06 writes the governance pack from the results: the AI system registry (chapter 53), the pre-launch checklist (chapter 55), the incident runbook (severity table, response times per level, the clocks, a postmortem template) and the vendor questionnaire with the three reviews.
- The runbook's flow: detection, record the moment of awareness, severity from the facts, containment (disable the feature, fall back, add a human gate), root cause, fix plus a regression test built from the incident, a blameless postmortem, then notifications by the deadlines.
What to do
- Write the severity policy as conditions on facts, and have responders write the facts down before picking a level.
- Let the model answer the fact questions; let code apply the table. Count "rated too low" separately from accuracy.
- Test the policy on past or made-up incidents. Where ratings disagree, look for the word: "special-category", "financial-account".
- Spell out legal terms in the runbook, with examples of what counts and what doesn't.
- Record the moment of awareness in the incident record, and keep someone on call over the weekend who can decide to notify.
- Treat "not stated" as an answer in vendor reviews, and have the model quote the sentence behind every answer for a person to check.
Caveats
- Made up and small. 24 reports and 3 vendors, written for the lab, with the right answers coded by one person. Real incidents are messier, and their facts are often unknown at first.
- Two models, three tries. Neither accuracy difference is significant; "fewer too low" is 1 against 2 to 5 on 24 reports.
- The knee surgery isn't fixed. Facts first showed which answer was wrong; spelling out "special-category" is the next test, not a result.
- The clocks are a teaching version of GDPR, the SEC's rule, HIPAA and the AI Act. Public holidays, US state laws and sector rules aren't modeled. Not legal advice.
- The vendor pages are short and invented. Real trust pages, contracts and DPAs are longer, and some answers live only in the contract.
The checklist
- A written severity table whose conditions are facts, not feelings.
- A fact sheet the responder fills in before choosing a level.
- A test set of incidents with their right levels, rerun when the policy or the model changes.
- "Rated too low" tracked as its own number.
- Legal terms defined in the runbook.
- An awareness timestamp in every incident record, and a weekend on-call who can decide to notify.
- A vendor questionnaire with blockers and conditions, "not stated" counted, and every answer quoted from the source.
Practice: from facts to decisions
Write the policy's severity table, score the recorded ratings, count how often they changed between tries, compute the Friday clocks, and turn vendor answers into a decision. The tests use the lab's 24 reports with their hand-coded facts, the recorded ratings from both methods and models, and Kestrel's answers as a person and as gpt-5.4-mini read them, and expect the lab's numbers: 17, 20, 20 and 18 right; 5, 2, 1 and 1 too low; Monday and Thursday at 4 pm; and Kestrel going from approve with 8 conditions to reject.
Quiz
1.Why is rating an incident too low worse than rating it too high?
2.What's the difference between "name it" and "facts first"?
3.On the 24 reports, was facts first more accurate?
4.Why did facts first still rate the knee surgery P2?
5.A company learns on Friday at 4 pm that EU customers' card numbers leaked. When is GDPR's 72-hour deadline?
6.gpt-5.4-mini filled in Kestrel's questionnaire and the decision became "reject". Why?
Check your understanding
Try each question before opening its answer.
Why measure "rated too low" separately from accuracy?
Because the two mistakes cost different things. Too low means the people who must know (security, legal, an executive) aren't called; too high means an extra call. In the lab facts first wasn't more accurate, but it rated 1 report too low on each model against 5 and 2, which is the number that matters.
What does "facts first" change, and what doesn't it?
The model answers questions about the report and code applies the policy's table. That made ratings more consistent (1 change in 3 tries against 6 and 2), found more P1s, and made each mistake traceable to one answer. It didn't make the ratings more accurate, and it didn't fix the knee surgery.
The knee surgery came out P2 every time. What would you do next?
Look at the fact answer that decided it: "special-category or financial-account data exposed?" was no in all 6 facts-first tries. Spell out in the policy what special-category data covers (health, religion and so on), rerun the 24 reports, and check that nothing else got worse.
A breach is confirmed Friday at 4 pm. What has to be in place?
The awareness time written in the incident record, since the clocks run from it. GDPR's regulator deadline is Monday 4 pm, so someone on call over the weekend who can decide to notify. If the company is US-listed and the breach matters to investors, the SEC's 8-K is due 4 business days later: Thursday 4 pm.
A vendor's trust page doesn't say whether it trains on your data. What do you record?
"Not stated", and treat it like "yes": in the lab's questionnaire that's a blocker until the vendor puts it in writing.
The model fills in a vendor questionnaire with 93% right. Can you use its decision?
Not without a check. In the lab its 6 wrong answers were two Kestrel sentences, and one of them flipped the decision from approve with 8 conditions to reject. Have it quote the sentence behind each answer, and have a person check those before anyone signs or says no.
Next up: That's the end of the Governance section, and of the published chapters. The next section, Self-improving systems, is coming soon: tests that write themselves, models checking their own answers, and loops that chase the wrong reward.