Verify and Activate Bundles
A bundle takes effect only after the policy service verifies it, compiles it, and records its revision. Verification runs once, when the policy service ingests the bundle: at startup, on a refresh, or when the HTTP source fetches a newer archive. Nothing downstream verifies the bundle signature again.
Bundle States
Distinguish these states when you track a rollout. Each one leaves its own evidence.
Verification Checks
The signature is checked first. If it fails, or if the signed payload does not parse, verification stops. Every later check runs and reports its own failure, so one rejection can list several reasons.
signature_invalid carries a detail that explains the cause: a malformed or unsigned artifact, a signature with no keyid, trust_root_unknown: <keyid>, an unsupported algorithm, or a failed cryptographic check.
With the HTTP source, the policy service picks the manifest from the archive by trying each .yaml file until one verifies and parses. If none does, for example because the signature is invalid or the signing key is not trusted, it never reaches the verification step: no policy_verification record is written, and the only message is find bundle manifest: no bundle manifest (.yaml) found in extracted archive at <path> in the service log.
manifest_hash_unset means the manifest still carries an empty digest or the REPLACE_WITH_DIGEST placeholder. Sign the template before you publish it.
Refer to Error Reference for every reason.
Runtime Compatibility
runtime_compatibility maps a runtime adapter name to a version range:
The verifier checks min_version against a version presented by the verifying component, and rejects an entry whose version is not valid semantic versioning. In this release the policy service does not present any runtime versions, so only malformed entries are rejected and the range itself is not enforced. max_version is accepted and not checked.
Activation
After verification succeeds, the policy service compiles the bundle into its surfaces. Only if compilation succeeds does it persist the revision in the counter store and start serving the new projections. A bundle that fails compilation never consumes a revision.
What happens to a rejected bundle depends on when it arrives:
- At startup, the policy service exits. With the HTTP source, the same is true for the first fetch.
- On a refresh or poll, the policy service keeps serving the bundle it already has.
Expiry While Active
The validity window is checked when the bundle is ingested. A bundle that expires while it is active keeps being served and enforced until it is replaced. The next restart or reload rejects it with bundle_expired, and a policy service that is restarted with only an expired bundle does not start. Publish a replacement well before expires_at. Refer to Expiry and Rollback Protection.
Next Steps
- To publish a new revision, refer to Update Policies.
- To find these records, refer to Access Audit Events.