Skip to content

Publication

Publication creates an immutable server plan for one exact released component version, and confirms that plan by its hash. Attestation signing binds credential-dependent test evidence to the active device key.

Everyday publication is the publish intent. The engine drains plan and confirm in-process. Do not type publication plan unless you are recovering a stopped plan.

ai-stp task start --intent publish --idempotency-key publish-session-01 --json

Follow continuations. Expert plan / status / confirm leaves below stay for operators who already hold a plan hash.

The plan does not make the version public. Confirm does. A failed check must not leave a partially published version behind. author_verified still does not mean the content is safe.

Command table

Command Mutability Confirmation When
ai-stp task start --intent publish apply none everyday publication; drains plan/confirm
ai-stp attestation sign apply explicit_flag sign exact credential-dependent test evidence with the active device key
publication plan plan none expert: create an immutable server plan for one exact released component version
ai-stp publication status read none read the current server state of one publication plan
publication confirm apply explicit_flag expert: confirm one exact unexpired publication plan hash

--json is global. Always pass it.

attestation sign requires --confirm. publication confirm requires --plan-hash and --confirm. For a whole setup graph, use setup publish plan / setup publish confirm instead of confirming each member by hand.

Attestation sign

Sign observed test evidence locally. The output file is owner-only JSON. The command does not upload it.

ai-stp attestation sign \
  --id <stable_id> \
  --version 1.0 \
  --check-id <check_id> \
  --policy-version <policy> \
  --harness-id codex \
  --harness-version 0.140.1 \
  --provider-version 1.2.3 \
  --test-case-id <case_id> \
  --result passed \
  --output ./attestation.json \
  --confirm \
  --json

Required: --id, --version, --check-id, --policy-version, --harness-id, --harness-version, --provider-version, --test-case-id (repeatable), --result (passed or failed), --output, --confirm. --tool-version is repeatable name=version.

Success fields: object_digest, subject, check_id, policy_version, harness_id, harness_version, provider_version, test_case_ids, result, account_id, device_id, attested_at, signature, output_path, attestation_digest.

Pass --output into publication plan --attestation-file later. Do not put secrets in the attestation file.

Publication plan

ai-stp publication plan --id <stable_id> --version 1.0 --json
ai-stp publication plan \
  --id <stable_id> \
  --version 1.0 \
  --attestation-file ./attestation.json \
  --json

--id is the stable identifier of the released component. --version is the exact local X.Y. --attestation-file is repeatable.

The version must already be released (component version release). The active session's device must match the signer of any attached attestation.

Success fields: plan_id, plan_hash, state, object_kind, stable_id, version, content_digest, component_verified, policy_version, actor_id, device_id, effects, evidence, expires_at. Read effects before confirming. component_verified here is the plan's recorded bit, not a reason to skip the hash check.

Status

ai-stp publication status --plan-id <plan_id> --json

--plan-id is required. The answer is the same publication-plan view. Confirm only an unexpired plan whose plan_hash still matches.

Confirm

ai-stp publication confirm \
  --plan-id <plan_id> \
  --plan-hash sha256:... \
  --confirm \
  --json

--plan-id and --plan-hash are required. --confirm is the explicit flag. The hash is the one plan returned. A changed plan is a new plan.

The answer is the plan view in its new state. Follow with publication status if the envelope tells you to wait, or with owner version show to see the public version.

Happy path

task start --intent publish --idempotency-key publish-session-01 --json
→ follow continuations until there are none

Expert (already-held plan hash):

component passport validate --id <id>
→ component version release --id <id>
→ attestation sign … --output ./attestation.json --confirm   # when evidence is required
→ publication plan --id <id> --version <X.Y> --attestation-file ./attestation.json
→ publication status --plan-id <plan_id>
→ publication confirm --plan-id <plan_id> --plan-hash <hash> --confirm
→ owner version show --kind component --id <id> --version <X.Y>

Embedded member:

component publish --from-setup <setup> --setup-version <X.Y> --component-id <id>
→ publication confirm --plan-id <plan_id> --plan-hash <hash> --confirm

Whole setup graph: Setup commands setup publish plan then setup publish confirm --set-digest … --confirm.

Named success fields

Command Fields to read
attestation sign output_path, attestation_digest, signature, result
publication plan / status / confirm plan_id, plan_hash, state, effects, evidence, expires_at

Also read content_digest, component_verified, and policy_version on the plan. They must match the version you intended.

Refusals

What you see What it means What to do
AI_STP_AUTH_REQUIRED no signed-in account task start --intent account --idempotency-key account-session-01 --json
AI_STP_USER_DECISION_REQUIRED --confirm was omitted pass --confirm after reading effects
AI_STP_VALIDATION_ERROR --id, --version, --plan-id, or --plan-hash missing read the descriptor
AI_STP_PRECONDITION_FAILED attestation not bound to this version, device, and account sign again on this device after login
AI_STP_PLAN_STALE / expired expires_at the plan is no longer current publication plan again
AI_STP_PERMISSION_DENIED this account cannot publish that id owner object show
AI_STP_CONFLICT a concurrent publication of the same version publication status; do not confirm a second hash
AI_STP_NOT_FOUND the version was never released locally, or the plan id is unknown component version list
treating component_verified as safety provenance and checks, not a guarantee read Trust and safety

A public version must come from a public GitHub repository at an exact commit and subpath. Local-only provenance is refused at plan time.

Flags come from continuation argv

ai-stp task intents --json

Do not dump help --agent as a prelude. Flags for a running task come from continuation argv.

This page groups publication commands so a person can find them. If this page and the CLI disagree, follow the CLI.