Not recorded yet. The lesson below is complete and runnable today — the video is added later without touching this page.
recordings/F2.3.mp4Regime-specific mappings with nothing to hang off.
AI RMF / management-system standards as the structure; regulator mappings as overlays.
Hang two regulator mappings off one framework spine.
Voluntary frameworks are the cheapest structural decision available: build one control set against a recognised spine, then map it outward to every regime that asks. The alternative is a control set per regulator.
choose_spine() ranks frameworks by how much of your control set each covers, picks the best as the structure, and returns the remainder to be supplied from the others. The alternative is a mapping per regime with nothing to hang it off, which produces documents rather than a programme.Choosing the framework that covers the most of the controls you actually have as a spine and supplying the remainder from the others, rather than building a programme shaped like a document.
Regime-specific mappings have nothing to hang off, so each new law restarts the programme.
Pick a control-shaped framework as the spine and map outward from it.
Indicators the spine already computes that each new overlay can reuse — and the gaps the spine does not reach, stated plainly.
Measure this
| what to measure | denominator or target |
|---|---|
| indicators the spine already computes that an overlay can reuse | count |
| gaps the spine does not reach | count, stated plainly |
one control set, mapped outward
+--------------------+
| your control set |
+---------+----------+
|
+------------+-----+------+------------+
v v v v
NIST AI RMF ISO 42001 sector rule customer DDQ
the alternative is a control set per regulator, foreverVoluntary frameworks make a better spine than regulation, for two reasons that have nothing to do with enthusiasm for standards.
They are written as controls. NIST AI RMF and ISO 42001 describe things you do. Regulation describes outcomes you must achieve, which is harder to operationalise and easier to satisfy on paper.
They change more slowly than the law. Building against a framework and mapping outward to regulation means new regulation is a mapping exercise rather than a programme.
The method: pick one spine with the best coverage of the controls you actually operate, map outward, and be explicit about what the spine does not reach — because every spine has gaps, and the gaps are where the sector overlay lives.
Anchor → F1.1. The framework spine is where indicators attach. Pick the spine first and each regulator's overlay maps onto indicators you already compute; pick the regulator first and you rebuild the set per jurisdiction.
The skill works out, for each framework, how much of it your own control catalogue already covers.
Then it picks the widest one as a spine and supplies the three remaining controls from the other frameworks. One programme, not four.
Finally it prices that against the alternative — running a separate programme per framework — so the choice is made on cost rather than on which auditor asked most recently.
The skill — skills/regulatory/framework-spine-selection/SKILL.md
name: framework-spine-selection
description: >-
Choose the framework that covers the most of your controls as a spine, supply
the remainder from the others, and compare that against building a programme
per framework. Use when several frameworks apply and each is proposing its own
programme.
allowed-tools: Read, Grep, GlobVoluntary frameworks overlap heavily. Building a programme per framework multiplies the same work by the number of logos, and the artefacts are nearly identical. Choosing the one with the widest coverage as a spine and supplying the gaps from the others produces the same coverage for a fraction of the effort — and the comparison is arithmetic, so it survives a meeting.
When more than one framework is in scope, and when a second framework is proposed as a separate workstream.
1 — Take your control catalogue as the fixed thing. Frameworks are mapped to it, not the other way round. If you do not have one, build it first; there is nothing to compare otherwise.
2 — Compute coverage per framework. How many of your controls each one addresses. Report the counts, not impressions of comprehensiveness.
3 — Select the widest as the spine, and name the controls it leaves uncovered. Those are the gaps, and they are usually few.
4 — Assign each gap to whichever framework covers it best. One control, one source. The result is a single programme with a few supplements rather than several programmes.
5 — Cost both plans. Spine-plus-supplements against per-framework. Include the duplicated evidence collection, which is where the difference actually sits.
Input — the fixture committed at the top of scripts/framework_spine_selection.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:
framework covers controls
--------------------------------------------------------------
NIST AI RMF 5 ['AC-1', 'AC-2', 'DR-1', 'EV-2', 'SB-1']
ISO 42001 4 ['AC-1', 'AC-2', 'DR-1', 'EV-1']
EU AI Act 4 ['AC-1', 'EV-1', 'SB-2', 'ST-1']
ISO 27001 1 ['SB-1']
DORA 1 ['ST-1']
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.
{
"catalogue": ["str"],
"coverage": [{"framework": "str", "covers": ["str"], "count": 0}],
"spine": {"framework": "str", "count": 0, "gaps": ["str"]},
"supplements": [{"control": "str", "from": "str"}],
"cost": {"spine_plan": 0, "per_framework_plan": 0, "duplicated_evidence": 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 F2.3Then restart your agent and open it in that folder. On Windows, if python3 says Python was not found, use python instead.
Then pick f2-3-voluntary-frameworks-as-your-spine:
| agent | install just for this agent | start it |
|---|---|---|
| Claude Code | python3 scripts/install_skills.py --tool claude --lessons F2.3 | type /f2-3-voluntary-frameworks-as-your-spine |
| GitHub Copilot (VS Code) | python3 scripts/install_skills.py --tool copilot --lessons F2.3 | type /f2-3-voluntary-frameworks-as-your-spine in Chat |
| Cursor | python3 scripts/install_skills.py --tool cursor --lessons F2.3 | type / in Agent chat and search for it |
| Codex | python3 scripts/install_skills.py --tool agents --lessons F2.3 | type $f2-3-voluntary-frameworks-as-your-spine, 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 F2.3Neither 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 F2.3 --out work/cybertravels
python3 scripts/checkpoint.py --at F2.3 --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.
NIST AI RMF covers the most controls (4 of 8) and is selected as the spine, leaving SB-2, EV-1 and ST-1 as gaps supplied by ISO 42001, the EU AI Act and DORA. Building per-framework would produce 14 control implementations for 8 distinct controls — a 1.8× duplication factor with controls claimed by several frameworks drifting apart.
Pick your spine and justify it in one sentence to an assessor. "It has the best coverage of the controls we actually operate" is far stronger than "it is the one our regulator mentioned".
Tools used
Skill source: skills/regulatory/framework-spine-selection