Attestree fleet inventory, v1
The predicate of the signed in-toto statement in a fleet inventory bundle: which rows the platform exported, for which tenant, when, and whether they carry user names.
- TYPE URI
- https://attestree.com/attestation/inventory/v1
- KIND
- in-toto predicate type
- USED AS
- predicateType of the in-toto Statement v1 in attestation.intoto.jsonl, inside fleet-inventory-<id>.tar.zst
- SIGNED BY
- The deployment’s catalog-attest key: ECDSA P-256 with SHA-256, in a DSSE envelope
- EMITTED SINCE
- Platform 0.240.0
- REPLACES
- None. It is new.
- PAGE UPDATED
- 2026-10-05
The bundle
Export inventory on the console’s fleet page (or
POST /api/v1/fleet/inventory/export) writes
fleet-inventory-<id>.tar.zst, holding inventory.json (canonical
JSON, keys sorted, rows in a fixed order), inventory.csv (the same rows, RFC 4180),
keys.json, README.txt, and the DSSE envelope
attestation.intoto.jsonl (payloadType
application/vnd.in-toto+json). The envelope is signed by the deployment’s
catalog-attest key; its keyid is the key’s SPKI SHA-256, lowercase hex.
The subjects
One per other file in the bundle, name being the file name and
digest.sha256 its SHA-256: inventory.json, inventory.csv,
keys.json and README.txt. Every file but the envelope is a subject, and
every subject is a file.
The predicate
All fields are always present.
| Field | Meaning |
|---|---|
exportId | UUID of the export, as inventory.json and the platform’s audit record (event.v1.fleet.inventoryExported) name it. |
tenant | The tenant whose fleet was exported. |
generatedAt | RFC 3339: when the inventory was read. |
rowCount | The rows each inventory file holds. |
endpointCount | The distinct endpoints those rows name. |
userNames | omitted or included: whether per-user rows carry the user name. included only when the exporter asked, holds the per-user export permission, stated a purpose (recorded on the platform’s audit trail, not in the bundle), and the tenant allows it. |
rowsInCatalog | The rows whose version the tenant’s catalog holds. |
rowsWithStatement | Of those, the rows that cite the version’s current signed per-version statement (detonation/v1). |
The rows
Keys of inventory.json, with the inventory.csv column in brackets where
it differs:
| Key [column] | Meaning |
|---|---|
endpointId [endpoint_id] | The endpoint. |
hostname | Its host name. |
manager, source | The package manager and source the agent reported. |
packageId [package_id], name, version | The package as reported. |
scope | machine or user. |
held | Whether the package is held. |
lastObservedAt [last_observed_at] | When the platform last received the row from a live read, UTC. |
userName [user_name] | Present only when userNames is included. |
catalog [catalog_manager, catalog_attestation_tier, catalog_statement_sha256, catalog_statement_keyid] | null, or {manager, attestationTier, statement: null | {digest: {sha256}, keyid}}. |
What the signature means
The platform exported these rows unchanged at generatedAt. The rows are what the
endpoints’ agents reported: the signature does not make an agent’s report true.
In inventory.csv, a value a spreadsheet would run as a formula (one starting with
=, +, -, @, a tab or a carriage return) is
prefixed with '. inventory.json carries every value unchanged; the two
files differ only in that prefix.
How to verify
wep-bundle-verify catalog-bundle fleet-inventory-<id>.tar.zst --expected-fingerprint <sha256>
Or pass --key keys.json with a key file from the console. The verifier requires the
statement to name both inventory files, and prints an Inventory: line with the
tenant, export id, time, row and endpoint counts, and whether user names are included.
By hand: rebuild the DSSE PAE, verify the ECDSA P-256/SHA-256 signature with a key you trust
from outside the bundle, then check every subject’s SHA-256. keys.json is a
convenience copy, never a trust anchor.