Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a126e1-76f8-7643-8cf3-e93336539ade
6.1 KiB
Activity-core unattended release admission
Owner: ACTIVITY-WP-0041-T03, with RPF-WP-0048-T02 for platform activation. Status: proposed contract; no credential minted and no automatic sync enabled. The user authorized implementation; these are enforcement requirements, not a request to reapprove the existing adoption.
Required enforcement
Use a dedicated non-admin service principal. Separate producer and reviewer
identities. Public source reads need no repository credential. A general repository
write PAT cannot enforce image-only changes by itself: the executor must validate
the exact before/after commits and authenticated receipts before writing, while
protected branches and required checks prevent bypass. Restrict its repository
membership to the release repository and reconciliation to the single
activity-core/activity-core application. This installation is ArgoCD Core:
there is no ArgoCD API-server role/token lane to reuse. Kubernetes RBAC cannot
restrict Application patch access to only the operation fields. Use a narrowly
implemented sync broker with admission enforcement before granting such patch
access; an Application-scoped Kubernetes Role alone is insufficient. No root-wide
sync, arbitrary application spec updates, project updates, exec, prune, overrides,
secrets or other applications.
The present parent Application pins the child's source revision in the platform repository. Therefore an app-only ArgoCD sync grant alone cannot perform durable promotion. Implement a reviewed broker for the single child revision field or a separately reviewed source-tracking design; do not grant the executor unrestricted platform repository writes to work around this boundary.
Keep credentials in OpenBao with the existing delivery subsystem; never in Git, receipts or prompts. Publish the exact subject, repository/branch/path scope, ArgoCD resource, TTL, revocation and negative-test evidence before admission. The warden routing catalog currently has no ready release-specific lane. Do not reuse source-read or package-admin credentials as deployment authority.
Receipt and failure requirements
Authenticate CI completion against the expected Forgejo repository and full commit; require the image-build and smoke checks. Bind the independently authenticated reviewer result to that same commit and actual image digest. Fetch current ArgoCD health from its authority, with bounded staleness; preserve observations proving at least 24 healthy hours. Producer-provided booleans are insufficient.
Before promotion retain the exact prior source revision and protect both live and rollback images in the additive registry inventory. Serialize releases, compare the current revision before writing, persist state, and recover idempotently after restart. Reconcile through ArgoCD without pruning. Check deployment readiness, report sink and schedule invariants. On timeout/failure revert the pinned revision through the same Git path, reconcile, verify recovery, and stop further promotion if recovery fails. Store sanitized receipts in the activity-core/State Hub run.
Acceptance must include denied out-of-scope mutation, stale/mismatched/forged receipts, concurrent release, restart, failed health and successful rollback. Run destructive failure fixtures in an isolated environment; production must not be intentionally broken to manufacture proof. Admit only after tests and the observation gate pass. Access, budget or scope expansion stays a monthly decision.
Deterministic platform readiness gate
python3 scripts/activity_promotion_readiness.py --live --observation observation.json --receipt readiness.json verifies only the current bounded adoption and reports
an explicit owner-proof wait until ACTIVITY-WP-0041-T03 acceptance exists. This
read-only check neither creates a principal nor activates a release worker. D2
removes the founder reapproval; the identity/custody and runtime proofs above
remain required. ACTIVITY-WP-0042 scheduling acceptance does not supply them.
Later activation checks require operator-owned --trusted-owner-key (raw
32-byte Ed25519 public key) and --trusted-owner-principal, supplied separately
from --owner-acceptance. No signer key supplied inside a receipt is trusted.
The acceptance envelope has exactly payload and signature (base64 Ed25519
signature of sorted compact JSON). Its payload uses
schema_version: activity-core-release-acceptance/v1, binds the existing
owner_task: ACTIVITY-WP-0041-T03, issuer, dedicated release principal,
authority: ACTIVITY-WP-0041-image-only-v1, application, exact estate cluster UID,
adoption revision and full broker implementation revision. It expires within
five minutes; the operator owns signer admission/revocation and actual native
evidence verification. An agent must not synthesize this production acceptance
from test fixtures or a producer's booleans.
The targets mapping is the exact single platform child
targetRevision path on main, selective root sync of only activity-core,
child activity-core and prune false, as named in the checker. checks must
contain exactly its named acceptance checks, all actual owner-verified: bounded
identity/custody/revocation/denials, independent authenticated receipts/CI digest
binding, continuous observer, image-only scope, source CAS/single-flight,
restart/lost-response recovery, retention, real failed-health rollback, Temporal
registration, durable audit sink and report/schedule invariants.
continuous_health binds the adoption revision and a current actual 24h sampled
interval with at most 90-second gaps. A source timestamp or snapshot is not this
proof. Signatures authenticate the accepted owner's assertions; the owner still
must ground them in actual runtime receipts.
Native adoption mismatch or malformed/forged/stale/widened owner acceptance returns unverified. Missing owner acceptance/trust binding returns waiting on the existing owner task, with its cross-owner coordination case. Only ready returns exit code zero. No automatic-sync source candidate is generated: ACTIVITY-WP-0041's current broker contract still relies on explicit selective manual child/root sync and forbids an automated child policy.