Not recorded yet. The lesson below is complete and runnable today — the video is added later without touching this page.
recordings/F1.8.mp4Vendor AI features enabled by default; sub-processor chains you never mapped.
Questions that actually discriminate between vendors.
Run a real AIBOM against a vendor model artefact.
Your model vendor, your hosting, your adapters and your MCP servers are all somebody else's risk decisions, inherited. Diligence questions that produce real answers are specific; the generic questionnaire produces a filing.
depth_mapped is usually zero.The vendor assessment's two blind spots: AI features that arrive enabled by default so no purchase event triggers a review, and the sub-processor chain behind the vendor, which is where the data actually goes.
For a hosted model the estate holds no source to measure, so there is nothing to compute an indicator from.
Assess each component on whether it can change without telling you, and accept an attestation with an expiry where it can.
Third-party controls carrying an unexpired attestation. It is a weaker instrument than a measurement, and worth scoring as one.
Measure this
| what to measure | denominator or target |
|---|---|
| third-party controls carrying an unexpired attestation | share; a weaker instrument than a measurement, and scored as one |
inherited decisions model vendor --> training data, safety posture, retention hosting --> where inference happens, what is logged adapters --> who built them, against which base agent tooling --> MCP servers, their tool descriptions generic questionnaire -> a filing specific question -> an answer you can act on
Third-party risk for AI has the ordinary supply-chain problem plus a question nobody's assessment form asks:
Can this component change without telling us?
For a library the answer is no — you pin a version. For a hosted model the answer is usually yes, and it changes the risk rating, because every control you tested was tested against behaviour the vendor can replace at any time, without telling you and without a version number changing.
Three artefact classes, with genuinely different maturity:
Saying which signals are unavailable is part of the assessment, not a gap in it.
Anchor → F1.1. These are the indicators you cannot compute yourself. For a third-party model the estate holds no source to measure, so the indicator becomes an attestation with an expiry — which is a weaker instrument, and worth naming as one rather than scoring it the same.
The skill scores each AI component on the two properties that make it different from ordinary software:
Then it does something that surprises people: it marks every control test taken before the model changed as no longer valid.
That is not pedantry. A test run against a different model is evidence about that other model. It says nothing about the one running now.
The skill — skills/grc/third-party-ai-assessment/SKILL.md
name: third-party-ai-assessment
description: >-
Assess the AI components of a supply chain for the two properties that make
them different — silent change, and running with agent authority — and
invalidate the control tests that predate a model change. Use when a model
provider changed the model and you need to know what that invalidates, and at
vendor assessment or renewal.
allowed-tools: Read, Grep, GlobThird-party AI differs from ordinary third-party software in two ways. A hosted model can change underneath you with no change record on your side, which invalidates every control test taken before it. And a tool package or MCP connector runs with your agent's authority, so its risk is not the vendor's — it is yours.
Vendor assessment, renewal, and any time a provider announces a model update.
1 — Enumerate the AI components. Hosted models, tool packages, MCP servers, embedded features in products you already bought. The last category is the one nobody lists.
2 — Score each on the two properties. Can it change without telling you, and does it execute with your agent's authority? Either one alone justifies a higher tier than the ordinary assessment would give.
3 — Record the last known model version, with a date. Without it you cannot tell whether a control test predates a change, which makes the next step impossible.
4 — Invalidate control tests taken before the change. Not "review" — mark them unevidenced. A test performed against a different model is not weak evidence, it is evidence about something else.
5 — Ask the questions a contract can answer. Notice period for model change, whether the version is pinnable, what telemetry you get, and exit. Then record which ones the vendor declined; that list is the assessment.
Input — the fixture committed at the top of scripts/third_party_ai_assessment.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:
component kind tier flags
------------------------------------------------------------------------------------------------
cryptography==42.0.5 library low —
langchain==0.2.1 library medium unsigned
hosted GLM-4.6 endpoint hosted model high unsigned, not version-pinned, CAN CHANGE WITHOUT NOTICE
local glm-4.6 weights (pinned digest) weights low —
mcp-jira-connector==0.0.3 tool package high unsigned, runs with agent authority
your controls were tested against a model that changed 5 days ago:
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.
{
"components": [{"name": "str", "kind": "model|tool|mcp|embedded",
"silent_change": true, "runs_with_agent_authority": false, "tier": "str"}],
"versions": [{"component": "str", "version": "str", "as_of": "str", "changed_at": "str|null"}],
"control_tests": [{"id": "str", "tested_at": "str", "status": "valid|unevidenced", "why": "str"}],
"contract_questions": [{"question": "str", "answered": false}]
}
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 F1.8Then restart your agent and open it in that folder. On Windows, if python3 says Python was not found, use python instead.
Then pick f1-8-third-party-and-model-supply-chain-risk:
| agent | install just for this agent | start it |
|---|---|---|
| Claude Code | python3 scripts/install_skills.py --tool claude --lessons F1.8 | type /f1-8-third-party-and-model-supply-chain-risk |
| GitHub Copilot (VS Code) | python3 scripts/install_skills.py --tool copilot --lessons F1.8 | type /f1-8-third-party-and-model-supply-chain-risk in Chat |
| Cursor | python3 scripts/install_skills.py --tool cursor --lessons F1.8 | type / in Agent chat and search for it |
| Codex | python3 scripts/install_skills.py --tool agents --lessons F1.8 | type $f1-8-third-party-and-model-supply-chain-risk, 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 F1.8Neither 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 F1.8 --out work/cybertravels
python3 scripts/checkpoint.py --at F1.8 --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 hosted model and the MCP tool package both tier high — one for silent change, one for running with agent authority. The silent model change invalidates all three control tests taken before it. The signal table shows libraries with 4 of 4 signals available and hosted models with 0 of 4, and each assessment statement names what was unavailable.
Add "can this change without notifying us?" to your third-party assessment form. For hosted models the answer is usually yes, and it should carry an explicit control-test expiry.
Tools used
Skill source: skills/grc/third-party-ai-assessment