Repository navigation
fix(artifacts): rotate the signing key without a gap - #556
Conversation
The skilld CLI refuses a signature over a statement created outside the key window. The site checked only the current time, so it could store, reuse and serve an attestation every CLI refuses until the key expired. A signing key cutover made that case reachable.
One key ID var set and one secret could not change together: a secret put deployed at once with the old key ID, so every build failed until the vars deploy landed. A staged secret in the free slot now signs nothing until its vars deploy. The signer picks the newest key whose window holds both the statement creation time and now.
The site never checks a root signature, and every released CLI does. A hand-built key entry with a bad signature stops every skilld run with an upgrade message no upgrade fixes. The tool signs entries with the offline root key and checks a root by the CLI rules before it reaches the secret.
skilld-production-2026-08 closes on 2026-11-20 and nothing watched it. The check reads the signer windows and the live trusted root, and finds when no key is both open and trusted.
The rollout guide's rotation steps swapped the secret and key ID non-atomically and retired the old key with an unsigned status change.
|
Agent comment (Harlan Agent Kit). A local dry run of the whole rotation, with throwaway keys only. Nothing touched production. Setup. A throwaway root key with the production key ID Released binaries 3.0.0 to 3.6.4 all embed the live root key ID and public key, and no signing key. Signer
Site verifier
CLI (3.3.0, 3.6.1, 3.6.4 patched, and a build of skilld
|
🤖 MERGED
GitHub merged this pull request.
c314599a-b55e-4263-95b0-3bb3b3d480cd Selected findings run after merge and open separate pull requests. |
There was a problem hiding this comment.
Harlan Agent Kit posted this automated review. AI open source policy.
Automated Review: BLOCKED.
There was a problem hiding this comment.
Harlan Agent Kit posted this automated review. AI open source policy.
Automated Review: READY.
🔗 Linked issue
❓ Type of change
📚 Description
The Artifact signing key
skilld-production-2026-08closes at2026-11-20T00:00:00Z. After that the signer refuses to sign and the site stops trusting stored attestations, so everyskilld runfails. The signer could not change keys without a gap: it read one key ID var and one secret, andwrangler secret putdeploys at once with the old key ID.createdAtand the current time.createdAtinside the key window. The skilld CLI already applied that rule, so the site could store and reuse an attestation that every CLI refuses.scripts/trusted-root.tsgenerates a signing key, signs its trusted root entry with the offline root key, and checks a root by the CLI rules. The site never checks a root signature, so this check gates every change toARTIFACT_TRUSTED_ROOT_JSON.skilld.signing-key. It warns 30 days and fails 7 days before no signer key is both open and trusted.Every released CLI from 3.0.0 to 3.6.4 pins only the root key
skilld-root-2026, so this rotation needs no CLI release.