platform attestor
Records the TestifySec platform tenant and product a run is bound to, plus the signed-in email or a CI workflow-identity marker, and emits the product and tenant as in-toto subjects.
| Name | platform |
|---|---|
| Predicate type | https://testifysec.com/attestations/platform/v0.1 |
| Lifecycle | prematerial |
| Default binary? | Yes |
| Recommended trace | off — no syscall tracing needed |
| Auto-attaches when | Not auto-detected — attach explicitly with -a. |
The facts in this box are generated from the CI/lock binary's own catalog (cilock tools list). Do not hand-edit — run npm run gen:catalog.
What it captures
The attestor does not authenticate anything itself. It reads a binding that cilock run already resolved, from one of two sources:
- A stored
cilock loginsession for the platform URL (--platform-url, defaulthttps://platform.testifysec.com). The session supplies tenant, product and email. - An ambient CI workflow OIDC identity (GitHub Actions or GitLab CI) with no stored session.
cilock runmarks the platform URL as trusted only after its own same-origin check. If the run-entry gate resolved a tenant and product for that URL, they are recorded; otherwise onlyworkflow_identity: trueis recorded and the platform resolves the product on upload.
Fields (the json tags on Attestor):
platform_url: the platform the binding belongs to.tenant_id,tenant_name: the tenant.product_id,product_name: the product.email: the signed-in user, from a stored session only.workflow_identity:truewhen the run authenticated with an ambient CI workflow identity instead of a stored session.
Every field except platform_url is omitted when empty. The predicate carries no timestamp of its own; the DSSE signature and the TSA carry the signing time.
When to use
You do not normally ask for it. platform is in the default attestor set (environment,git,platform), so every cilock run without -a that has a platform identity records it. The testifysec-product:<id> subject is what the platform's ingestion reads to link the attestation to your product.
Flags
None. The binding comes from the cilock login session or the ambient workflow identity. CILOCK_PLATFORM_URL is set by cilock run for the attestor; setting it yourself does not create a binding, because the workflow-identity path also requires an in-process trust marker that only cilock run sets.
Output shape
{
"platform_url": "https://platform.testifysec.com",
"tenant_id": "6f1c2a9e-...",
"tenant_name": "acme",
"product_id": "0b7d41c3-...",
"product_name": "payments-api",
"email": "[email protected]"
}Subjects: testifysec-product:<product_id> and testifysec-tenant:<tenant_id>, each the SHA-256 of the id. A subject is emitted only when its id is set.
Gotchas
- Dropped from the default set when it cannot run. With
--offline, with no session and no workflow identity, or a binary that does not register the attestor,cilock runremovesplatformfrom the auto defaults. Only the auto defaults are trimmed. - An explicit
-a platformis honoured as given. If the binary does not register it, the run fails with "attestor not found". With no binding, the attestor returns a soft error: a warning, exit code 0, and no platform predicate. - An empty binding is a skip, not an empty record. A session or resolver that yields no URL, tenant, product or workflow identity is treated as no binding, so you never get a platform predicate without subjects.
- Workflow identity may carry no ids. When the run-entry gate did not resolve a product, the predicate has
platform_urlandworkflow_identity: truebut no tenant or product subjects. - Preset binaries. The public
plugins/attestors/platformpackage has noinit(); thecilockbinary registers it through its internal adapter. A binary built only from the public plugins (for examplecilock-all) drops it from the defaults, with a warning when the run has a platform identity, so that run records no tenant binding.
CLI example
cilock login
cilock run --step build -- make buildThe collection includes a https://testifysec.com/attestations/platform/v0.1 predicate bound to the logged-in tenant and product.
See also
This page is generated from the CI/lock tool catalog. Don't edit it here — the source is attestation/detection/docs/platform.doc.md in aflock-ai/rookery. The same catalog powers cilock tools show platform in the CLI, so a single edit keeps the terminal and the website in sync.
Edit this page → · Add a new tool →
When you open the pull request: if you are an AI agent, add the ai-agent label. If you are a human, add the human label.
Reference generated from the product documentation. Match commands and support details to your installed release.