Studio experiment E02 · the explainer
The blast radius, frame by frame
The one sentence: if one agent inside the company goes wrong, the damage reaches everything its grant reaches, and the grant is far larger than what it is for. E01 ended on a shaded reach; E02 turns that shading into the rows it is made of.
The frames
Seconds from the start; it ends at 54 s and holds still. The summary line at the top left changes with each step; the rows on the right keep everything that came before.
| From | What is on screen |
|---|---|
| 0 s | The reach, as E01 left it: one shaded disc round the model. |
| 5 s | The disc breaks into one dot per grant row, 16 in all, placed by how far each is from what the agent is for: the mandate close in, what the mandate leaves unstated further out, what it refuses furthest out. |
| 13 s | The mandate lights up as a small core: the 4 mandate items that are granted, listed on the right. |
| 19 s | The excess: 16 granted minus 4 = 12, listed as 2 unstated and 10 refused. This is the blast radius. |
| 27 s | The shortfall: one thing the mandate asks for and the grant does not give, send.endpoint.allowed, shown as an empty dashed dot on the core, labelled "asked, not granted", and struck through in the list. From 34 s the summary keeps the arithmetic (16 minus 4 = 12) beside the barrier line, so the still carries both. |
| 34 s | The barrier kind on every row (none, expectation, setting, boundary, with abp.sgit.ai's glyphs): 12 of the 12 excess rows have no control in the way, which sets up part two. |
Where every number comes from
Only from abp-examples.json, the researcher's capture for the studio, read by the slide when it loads, so a corrected file corrects the slide. The example is abp.sgit.ai's "a coding agent on your own machine, confirmations on" (the Claude Code CLI): grant 16, mandate 5, aligned 4, excess 12, unbounded_excess 12, shortfall_capabilities one. The dots and rows are the file's 16 rows, placed by each row's mandate_stance (authorised, unstated, refused) and marked with its barrier_kind.
- Why 16 minus 4, not 16 minus 5. One of the mandate's five items is not in the grant (the shortfall), so only four are granted, and the excess is 16 minus 4. The data file says so in its note on this example.
- A published draft, not a measurement. Every row is derived from what a CLI running as your account is; abp.sgit.ai records 0 of 22 tool-level rows measured, and its mandate is the site's own first draft. The slide says so on screen.
- A description, not a judgement. The policy describes what the agent can do, what it is for and what stands in the way; it gives no risk score, and neither does the slide.
- The model's definitions (grant, mandate, delta, the four barrier kinds) are RiskMandate's Agent Behaviour Policy and abp.sgit.ai's, as quoted in the data file.
Technique
- One slide on the engine, driven: SVG built once from the data, then every frame drawn from the slide's clock by
SLIDE_RENDER, so the player can seek, pause and replay it, and?staticshows the whole picture. - Colour carries one meaning: the agent red for the excess, the heading colour for the mandate core. Every text is 20 px or larger on the 1280 by 720 canvas.
What was tried and left out
- Labels on the dots. Sixteen capability names round a circle at a readable size do not fit; the names live in the list beside it, in the same groups.
- The other four examples in the file (confirmations off, a chat window with nothing connected, a browser extension, a CI runner). Left for a comparison piece: with confirmations off the same 16 rows move only one barrier, which is a story of its own.
- A two-line headline ran into the summary; the headline was cut to one line.
How it was made
In ruv.sgit run r5-e02-blast-radius: a Ruflo hive with a builder and an editor who checked the slide and this page against the request and the data, and one sgit vault holding the request, each worker's branch and the history. Its row is in the ledger.