Not recorded yet. The lesson below is complete and runnable today — the video is added later without touching this page.
recordings/D1.9.mp4Fire a fleet-wide kill switch and measure what survives it: tokens, processes, and the runs that should have been preserved.
An agent fleet completes thousands of actions inside one human approval cycle, so containment is pre-authorised or it is too late. Terminating the agents while their tokens stay valid moves the incident rather than ending it.
verify_delegated checks registry.active on every call, which is what B2.5 built. The direct path is not: agents/file_agent.py::handle calls payments_api.download_invoice in-process, so nothing on that route ever reaches a check. coverage() returns 0.4, and that is a finding about the architecture rather than about the switch — it is B1.1's "direct APIs, no policy point" card, priced.The second question about a kill switch, which is the one that gets asked on the night: what is still able to act after it is thrown. Measured as coverage over the act-paths, with the conflict between containment and evidence decided in advance rather than at 3am.
A fleet completes thousands of actions inside one human approval cycle, so containment is pre-authorised or it is too late.
Build a zero-trust gatekeeper and a revocation path that isolates the whole fleet in one action.
What the credentials can still do after the agents stop. Termination without revocation moves the incident rather than ending it.
Measure this
| what to measure | denominator or target |
|---|---|
| what the credentials can still do after the agents stop | count of actions still authorised; termination without revocation moves the incident |
an agent at machine speed vs a human approval cycle
approval cycle: 8 min -> ~2,400 further agent actions
automated stop: -> ~60
one revocation, at the gateway, reaching the whole fleet
terminate processes -> tokens still valid -> persistence remains
REVOKE credentials -> persistence ends <- the property that countsContainment against a swarm is a race the defender starts behind. An agent fleet operating at machine speed completes thousands of actions inside a human approval cycle, so the containment has to be pre-authorised and automated: zero-trust runtime gatekeepers, and dynamic token revocation that isolates the fleet in one action.
The detail that decides whether containment worked is revocation versus termination. Terminating agents while their bearer tokens stay valid leaves the persistence in place and moves the incident rather than ending it — which is the Moltbook lesson, 770,000 agents behind one missing policy.
The skill pulls a fleet-wide kill switch on CyberTravels' agents. Then it checks the thing that actually matters.
Stopping a program is not the same as ending its access. A killed agent whose credentials still work has not been stopped, it has been paused, and anything else holding those credentials carries on. So the skill checks that the credentials were cancelled, not just that the programs died.
The skill — skills/response/fleet-kill-switch-test/SKILL.md
name: fleet-kill-switch-test
description: >-
Test a fleet-wide stop for what it leaves behind — valid tokens, destroyed
evidence, and the runs that should have been preserved — and measure how long
the whole thing takes. Use before relying on a kill switch, and after
designing one.
allowed-tools: Read, Grep, GlobA fleet kill switch usually terminates workloads. Termination does not revoke credentials, so every token the fleet held stays valid until it expires — up to seventy-two hours of an attacker being able to act as agents that no longer exist. And a kill that does not preserve first destroys the evidence for the incident that triggered it.
Before a kill switch is relied on, after it is built, and once a year as a rehearsal.
1 — Terminate only, and count what stays valid. Tokens, sessions, outstanding delegated grants. This is the baseline failure and it is invisible in a design review.
2 — Terminate and revoke together, and re-count. Zero is the target. If revocation is a separate runbook step performed by a different team, it will not happen at speed.
3 — Check evidence preservation. Kill with and without preservation, then attempt the reconstruction. A kill switch that destroys the run records is a containment that ends the investigation.
4 — Test selectivity. Stop one agent, one class, the whole fleet. A switch with only the last setting will not be used until it is far too late, which is the same as not having one.
5 — Measure the time. Decision to last agent stopped and last token revoked. Set a target and report against it; an untimed rehearsal is a demonstration.
Input — the fixture committed at the top of scripts/fleet_kill_switch_test.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:
terminate only : 8 agents stopped, 8 tokens still valid for up to 72h
terminate and revoke : 8 agents stopped, 0 tokens still valid
In the source incident, third-party access ended when the third party
revoked its keys - not when the agents stopped. Stopping the process is
the visible half of containment and the smaller one.
terminate first terminate -> revoke credentials reconstructable=False
preserve first snapshot state and transcripts -> terminate -> revoke credentialsreconstructable=True
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.
{
"fleet": {"agents": 0, "tokens": 0},
"terminate_only": {"tokens_valid_after": 0, "max_validity_hours": 0},
"terminate_and_revoke": {"tokens_valid_after": 0},
"preservation": {"preserved": true, "reconstructable": true},
"selectivity": [{"scope": "one|class|fleet", "supported": true}],
"timing": {"target_minutes": 0.0, "measured_minutes": 0.0}
}
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 D1.9Then restart your agent and open it in that folder. On Windows, if python3 says Python was not found, use python instead.
Then pick d1-9-machine-speed-containment-and-fleet:
| agent | install just for this agent | start it |
|---|---|---|
| Claude Code | python3 scripts/install_skills.py --tool claude --lessons D1.9 | type /d1-9-machine-speed-containment-and-fleet |
| GitHub Copilot (VS Code) | python3 scripts/install_skills.py --tool copilot --lessons D1.9 | type /d1-9-machine-speed-containment-and-fleet in Chat |
| Cursor | python3 scripts/install_skills.py --tool cursor --lessons D1.9 | type / in Agent chat and search for it |
| Codex | python3 scripts/install_skills.py --tool agents --lessons D1.9 | type $d1-9-machine-speed-containment-and-fleet, 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 D1.9Neither 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 D1.9 --out work/cybertravels
python3 scripts/checkpoint.py --at D1.9 --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 kill switch selects the whole fleet in one action and the run shows persistence surviving termination but not revocation, so the control is judged on what the tokens can still do afterwards.
Time how long it takes to revoke every credential one class of agent holds. If the answer is 'we would terminate the processes', you have not tested containment, only restart.
Tools used
Skill source: skills/response/fleet-kill-switch-test