Build an agent bill of materials for a deployed agent: inventory every component that can change its behaviour (base model and version, system prompts, skills with source and version, tools and connectors with their permissions, memory stores, sandbox and runtime, model router and fallback rules), record provenance and owner for each, diff the inventory when anything changes, and flag unpinned or unowned components before they cause an incident. Use when documenting a deployed agent, preparing an agent for review or handover, investigating why an agent's behaviour changed, or setting up drift checks across agent releases.
./install.sh agent-bill-of-materialsname: agent_bill_of_materials description: Build an agent bill of materials for a deployed agent: inventory every component that can change its behaviour (base model and version, system prompts, skills with source and version, tools and connectors with their permissions, memory stores, sandbox and runtime, model router and fallback rules), record provenance and owner for each, diff the inventory when anything changes, and flag unpinned or unowned components before they cause an incident. Use when documenting a deployed agent, preparing an agent for review or handover, investigating why an agent's behaviour changed, or setting up drift checks across agent releases.
A software bill of materials lists packages. That is not enough for an agent. An agent's behaviour also changes when a system prompt is edited, a skill is bumped, a router sends more traffic to a fallback model, a memory store fills with stale summaries, or a connector quietly gains a new permission. None of those show up in a package list, and two of them have no component type at all in CycloneDX or SPDX, which is why prompts and tool graphs fall out of standard AIBOM work.
An agent bill of materials (ABOM) fixes that. It is a deployed-state inventory, in the CISA sense of a deployed or runtime BOM rather than a design BOM: what is actually running, pinned as it actually is, with a source, provenance evidence, and an owner for every row. It follows the NTIA minimum fields for a BOM (supplier, component name, version, unique identifiers, dependency relationships, author, timestamp) and the NIST SSDF practice PS.3.2 on collecting and sharing provenance data, and it adds three fields software BOMs do not carry: how the component can change behaviour, what permissions it holds, and what is not known about it.
references/collector-checklist.md layer by layer: model, prompts, skills, tools and connectors, memory and data, routing, guardrails, runtime, and sandbox. Take versions from lockfiles, config exports, registry entries, and deployed file hashes. A component someone remembers installing is a lead, not a row, until the deployment itself confirms it.references/inventory-schema.md. Every component gets an id, type, name, deployed version, a pin, a source with supplier and locator, provenance evidence with who asserted it, an owner, and one plain sentence on how it can change behaviour. Tools and connectors also get their granted permissions, scope by scope, with the approval rule for every write. Routers get their fallback written out. Memory stores get retention and access. Never record a secret value anywhere in the file; secret names and locations only.known_unknowns. Do the same for a continuously updating knowledge corpus (snapshot date plus a drift note) and for any component you found but could not identify. A stated gap is a finding. A filled-in guess is a defect in the BOM.python3 bin/abom.py validate <abom.json>. Errors mean the BOM is not done: unowned components, unpinned components, missing sources, tools with no permissions recorded, routers with no fallback. Treat each error as a fact about the deployment, not as paperwork. Read warnings to the owner: broad permission grants, write access with no approval rule, missing provenance evidence with no gap recorded. Use --strict in a release gate to fail on warnings too.python3 bin/abom.py diff <old.json> <new.json>. Act on the risk flags the diff raises: a model change means rerun the eval set before calling the agent unchanged, a new permission means a reviewer looks at the grant, a source change means provenance gets checked again, and a prompt hash change means someone diffs the prompt text. When behaviour changes and nobody knows why, the ABOM diff between the last good version and now is the first place to look. The worked example in references/worked-example.md shows that investigation end to end.A finished ABOM delivery contains:
references/inventory-schema.md, passing bin/abom.py validate with zero errors.known_unknowns record, either inside components or as a short companion list, covering every fact that could not be verified.references/inventory-schema.md, with a note that prompts, permissions, memory, and routing stay authoritative in the ABOM because the standard formats have no fields for them.known_unknowns and the validation finding stays visible until it is resolved. Do not delete the row to make the report clean.python3 bin/abom.py init --out abom.json --agent-id <id>. The template fails validation on purpose until the empty fields are filled from the real deployment.publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.