This starts chapter F3. Its course guide is F3 in the Function F course guide →
Not recorded yet. The lesson below is complete and runnable today — the video is added later without touching this page.
recordings/F3.1.mp4Blast radius explained in engineering terms to a board that needs consequence.
What can happen, how fast, who can stop it.
Convert one blast-radius measurement into a board paragraph.
The board does not want the threat model. It wants to know the exposure, whether it is going up or down, and what decision is being asked of them — in that order, in language that survives being repeated by someone else.
translate() turns "the agent holds payments:refund with a ceiling of twelve calls" into "one compromised run can move up to 60,000 before any human is involved, it is not recoverable, and we would know within five minutes". Same fact. The first sentence answers a question nobody asked.Translating blast radius into consequence, so the sentence a board hears is about what one compromised run can move rather than about which scope the agent holds.
A board cannot act on "we found prompt injection"; it can act on exposure, likelihood and a decision being requested.
Drop the mechanism, keep three things, and offer written risk acceptance as a legitimate outcome.
Three indicators the board sees, chosen from the set that already exists so anyone can re-compute them.
Measure this
| what to measure | denominator or target |
|---|---|
| indicators the board sees | three, chosen from the set that already exists so anyone can re-compute them |
technical risk board-usable exposure +-------------------+ +--------------------------+ | prompt injection | --> | exposure: X, trend: down | | in the RAG path | | decision asked: fund Y | +-------------------+ +--------------------------+ it has to survive being repeated by someone else, without you
Translating agentic risk upward means dropping every mechanism and keeping three things: exposure, likelihood, and the decision being requested.
The failure mode is not using too much jargon. It is presenting findings when the audience needs a decision. A board cannot act on "we found prompt injection in the review agent". It can act on "a critical system can take N units of unreviewed action, we demonstrated it, and we are asking for X or for written acceptance".
That last clause matters more than people expect. Accepting the risk in writing, with a named owner and a review date, is a legitimate outcome. Offering it makes the ask credible, because it shows you are presenting a decision rather than lobbying for a budget.
Anchor → F1.1. Translating risk upward is mostly choosing which three indicators a board sees. Pick them from the set that already exists, or the board gets a number invented for the slide and nobody can re-compute it.
The skill computes three numbers: exposure, containment ASR, and control coverage.
Then it writes the same numbers up twice:
Same evidence, two documents. Only one of them can be acted on.
The skill — skills/programme/risk-translation-upward/SKILL.md
name: risk-translation-upward
description: >-
Compute a fleet's exposure, containment effectiveness and control coverage,
then translate the three numbers into a statement a board can act on rather
than a list of findings. Use when preparing an executive update on agentic
risk.
allowed-tools: Read, Grep, GlobAn executive update made of findings asks the reader to do the synthesis, and they will do it wrong or not at all. Three computed numbers — how much the fleet can reach, how much of an attack it stops, how much of the control set is evidenced — support a position, a decision and a request.
Preparing a board or executive committee update, and whenever the current one is a list of incidents.
1 — Compute exposure. Sum the blast radius across the fleet, weighted by scope, with gated actions discounted. One number, and say what it is a sum of.
2 — Compute containment effectiveness. Attack success rate against the controls as they run today, from the eval suite rather than from design intent.
3 — Compute control coverage in three states. Evidenced, stale, unevidenced. The stale count is the one that moves an executive conversation, because it is the one nobody expected.
4 — Write the findings-shaped version and mark what is wrong with it. Usually: no trend, no comparison, no decision requested, no cost, and no statement of what happens if nothing changes. Showing that is how the format changes.
5 — Write the position. Where the exposure is concentrated, what would reduce it most per unit of friction, what you are asking for, and what you will report next time. Same numbers, different artefact.
Input — the fixture committed at the top of scripts/risk_translation_upward.py. Edit it and re-run: the buckets, counts and verdicts below are derived from it, not hard-coded.
Output — the opening lines of a real run:
agent blast radius
----------------------------------------
pr-remediation-agent 44
claims-triage-agent 1
doc-summariser 1
FLEET TOTAL 46
red-team attack success rate (containment surface): 25%
The run continues past this. test_skills.py executes the script on every build, with no model configured — so what CI proves is that it runs and refuses legibly, not that it prints these lines. The output above is a recorded run against a real model, and nothing re-diffs it: a model's answer is not reproducible, and this repository does not claim otherwise anywhere it can be checked.
{
"exposure": {"total": 0, "by_agent": [{"name": "str", "blast": 0, "gated": ["str"]}]},
"containment": {"asr": 0.0, "from": "eval suite"},
"coverage": {"evidenced": 0, "stale": 0, "unevidenced": 0, "of": 0},
"findings_version": {"problems": ["str"]},
"position": {"concentration": "str", "best_reduction": "str", "ask": "str", "next_report": "str"}
}
Three ways to do this lesson. Pick one. They run the same procedure against the same code — what changes is who drives it, and how much you see.
The agent reads the lesson, explains the idea, fetches the code, runs the check and answers your questions as you go. This is the one to take if you are here to learn.
Install it, once. From the folder you cloned. --all does every agent it finds on your machine:
python3 scripts/install_skills.py --all --lessons F3.1Then restart your agent and open it in that folder. On Windows, if python3 says Python was not found, use python instead.
Then pick f3-1-translating-agentic-risk-upward:
| agent | install just for this agent | start it |
|---|---|---|
| Claude Code | python3 scripts/install_skills.py --tool claude --lessons F3.1 | type /f3-1-translating-agentic-risk-upward |
| GitHub Copilot (VS Code) | python3 scripts/install_skills.py --tool copilot --lessons F3.1 | type /f3-1-translating-agentic-risk-upward in Chat |
| Cursor | python3 scripts/install_skills.py --tool cursor --lessons F3.1 | type / in Agent chat and search for it |
| Codex | python3 scripts/install_skills.py --tool agents --lessons F3.1 | type $f3-1-translating-agentic-risk-upward, or run /skills |
No agent, no conversation. The same lesson executes and prints the same readback. Take this one if you have no assistant, if you are reviewing rather than learning, or if you want the result without the teaching around it.
python3 scripts/lesson.py F3.1Neither of the above, and no model needed. The first command writes CyberTravels exactly as it stood at the end of this lesson; the second prints the diff — the lines this lesson added or changed, and nothing from any later one.
python3 scripts/checkpoint.py --at F3.1 --out work/cybertravels
python3 scripts/checkpoint.py --at F3.1 --diffOn Windows, type python wherever these say python3 — and use \ instead of / in the paths. Everything else is identical. A0.0 step 2 explains why.
Ways 1 and 2 need a model; way 3 does not. A signed-in Claude Code CLI needs no API key, and any OpenAI-compatible endpoint works too. With neither, the audit exits 2 and says so rather than inventing an answer. A0.0 sets this up.
Ways 1 and 2 both end with the same readback: What I did, What changed, The number and Read this next. A step that was skipped or refused is reported as exactly that, never as a pass.
If you did the last lesson’s challenge, expect this to stop. Most challenges ask you to edit the code, and ways 1 and 2 will not overwrite your edits: you get stopped, not a failure, with two options — --out for a fresh folder that keeps your work, or --force to discard it and start this lesson clean.
The fleet's exposure totals 46 units, containment ASR is 25%, and control coverage is 50%. The findings-shaped update is shown with five specific problems. The board translation states exposure, likelihood, assurance and a decision, contains no mechanism jargon, carries the measured numbers, and explicitly offers written acceptance as an alternative.
Write these four lines for your highest-tier system. If you cannot fill the likelihood line with a measurement, that is the first thing to fund — an assessment is not a number.
Skill source: skills/programme/risk-translation-upward