All lessons › Function F — AI Governance for Agentic Systems › Building the Governance Framework — Risk and Control
F1.8

Third-party and model supply chain risk

F1
▶
Lightboard recording

Not recorded yet. The lesson below is complete and runnable today — the video is added later without touching this page.

Video placeholderpublishes automatically from recordings/F1.8.mp4
Risk

Vendor AI features enabled by default; sub-processor chains you never mapped.

Control

Questions that actually discriminate between vendors.

The lab

Run a real AIBOM against a vendor model artefact.

◉Use case relevance

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.

At CyberTravels. Two gaps most vendor assessments miss. AI features arrive on by default in a product you already bought, so no purchase event triggered a review — and behind the vendor is a sub-processor chain, which is where the data actually goes. depth_mapped is usually zero.

◴What this lesson is — Day 0, Day 1, Day 2

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.

Day 0 — why

For a hosted model the estate holds no source to measure, so there is nothing to compute an indicator from.

Day 1 — how

Assess each component on whether it can change without telling you, and accept an attestation with an expiry where it can.

Day 2 — measure

Third-party controls carrying an unexpired attestation. It is a weaker instrument than a measurement, and worth scoring as one.

Measure this

what to measuredenominator or target
third-party controls carrying an unexpired attestationshare; a weaker instrument than a measurement, and scored as one

▦The framework, and how it works

   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:

  • Libraries — signing, version pinning, download signals. Mature.
  • Model weights or a hosted model — attestation possible and rare; no popularity signal that means anything; version stability is a contractual question, not a technical one.
  • Prompt and tool packages (MCP, skills) — no signing convention, and they run with your agent's authority.

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.

2 · Demo — the ordinary signals, and where they run out

3 · Where it breaks — the silent change, priced

4 · The control — the four questions, and stating the gaps

5 · The procedure, as a skill

The skill scores each AI component on the two properties that make it different from ordinary software:

  • It can change without telling you.
  • It runs with the agent's authority.

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.

▶Real time execution as skill

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, Glob

The vendor changed the model and your control tests expired

Third-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.

When to use this

Vendor assessment, renewal, and any time a provider announces a model update.

Procedure

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.

Example

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.

Output contract

{
  "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}]
}

Failure modes

  • Assessing the vendor and not the authority. The connector runs as your agent.
  • Keeping a control test that predates a model change. It evidences the old model.
  • Missing embedded AI features. They arrived with a product you already own.

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.

1In your AI agent — you are taught

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.8

Then 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:

agentinstall just for this agentstart it
Claude Codepython3 scripts/install_skills.py --tool claude --lessons F1.8type /f1-8-third-party-and-model-supply-chain-risk
GitHub Copilot (VS Code)python3 scripts/install_skills.py --tool copilot --lessons F1.8type /f1-8-third-party-and-model-supply-chain-risk in Chat
Cursorpython3 scripts/install_skills.py --tool cursor --lessons F1.8type / in Agent chat and search for it
Codexpython3 scripts/install_skills.py --tool agents --lessons F1.8type $f1-8-third-party-and-model-supply-chain-risk, or run /skills

2As one Python command — you just run it

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.8

3Read the code, and the difference — nothing runs

Neither 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 --diff

On 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.

✓What you just proved

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.

✎Your turn

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

OWASP AIBOMSigstore

Skill source: skills/grc/third-party-ai-assessment

← PreviousF1.7 · Continuous control verification