SPECIFICATIONS IN-TOTO PREDICATE TYPE

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.

FieldMeaning
exportIdUUID of the export, as inventory.json and the platform’s audit record (event.v1.fleet.inventoryExported) name it.
tenantThe tenant whose fleet was exported.
generatedAtRFC 3339: when the inventory was read.
rowCountThe rows each inventory file holds.
endpointCountThe distinct endpoints those rows name.
userNamesomitted 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.
rowsInCatalogThe rows whose version the tenant’s catalog holds.
rowsWithStatementOf 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.
hostnameIts host name.
manager, sourceThe package manager and source the agent reported.
packageId [package_id], name, versionThe package as reported.
scopemachine or user.
heldWhether 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.