Files
aios/docs/gitops/trusted-builder-signer-provisioning.md
T
AIOS Governed Continuation 36ffb00ae9
autonomy-smoke-tests authorized task-writer smoke: PASS
autonomy-unit-tests isolated unit suite: 28 passed; 2 opt-in skipped
campaign-approval-gate standing Owner V15 authorization bound and verified
git-diff-check exact four-file diff and whitespace check: PASS
py-compile trusted-builder provisioner compile: PASS
reconciliation-contract authority/Gitea Git/API durable receipt convergence: PASS
release-state-machine release workflow state unit contract: PASS
secret-scan exact changeset credential and private-key scan: PASS
signer-validator-contract canonical signer compatibility/self-test contract: PASS
fix(gitops): bind trusted-builder provisioning to final common main
2026-08-29 20:53:18 +08:00

2.0 KiB

Trusted-builder signer provisioning

trusted_builder_signer_provisioning.py provisions the purpose-bound AIOS_TRUSTED_RELEASE_BUILDER signer only from an exact aios.trusted-builder-signer-provisioning.v2 payload and detached SSH signature for aios-task-grant-signer in namespace aios-owner-approval-v1.

A fresh payload is bound to the final common Gitea, authority, and governed main OID; the protected merge tree; the ordered two parents; and the selected PR head as the merge's second parent. The provisioner rechecks those facts in the authority repository and rejects ancestry or source drift. It does not reuse PR69, PR70, or a release-candidate recipe binding.

The payload evidence is an exact allowlist: provisioner, candidate builder, policy, service, socket, model-API config template, launcher, and the versioned package manifest. Missing, extra, modified, or mode-incompatible evidence is rejected. The package manifest is non-secret and declares daemon reload plus socket activation, with no credential installation or signer invocation. It requires the installed launcher target mode to be 0755; source checkout mode is treated separately from installed package mode. A controlled deterministic worktree may hold ordinary source evidence at 0600, 0640, 0644, or 0664; the installed package still enforces its declared target modes.

The provisioner generates the Ed25519 key and builder HMAC only on the host. Plaintext exists only in its private temporary directory and is encrypted with systemd-creds --with-key=host; the service receives encrypted credentials via LoadCredentialEncrypted. The public keyring and service-principal binding contain no private key.

Receipts append at /var/lib/aios-gitops/trusted-builder/provisioning-receipts.jsonl. An exact replay returns IDEMPOTENT_REPLAY_PASS; mismatched or unreceipted state fails closed. Provisioning is configuration only: activation, restart persistence, public-key verification and negative-capability tests are separate gates before TRUSTED_BUILDER_SIGNER_READINESS=PASS.