Context
Impl half of ADR-0002 (PR #32). The ADR proposes a workflow-mediated tag-push flow as the only Free-plan mechanism that gates signed-tag-object verification at push time. This issue tracks the impl PR that follows once the ADR is accepted.
Mechanism (per ADR-0002)
- Flip
creation = false → true in modules/ruleset-tag-protection/main.tf. Blocks all direct v* pushes.
- Declare
bypass_actors entry for the millsymills-org-bot-writer GitHub App on the tag-protection ruleset (App ID 3663090).
- Add
workflow_dispatch release workflow on main that:
- Takes a
version input matching v[0-9]+\.[0-9]+\.[0-9]+.
- Fetches an SSH signing key from AWS Secrets Manager to
${RUNNER_TEMP}/release-signing.key at mode 0600 (mirroring the App-PEM pattern in tofu-apply.yml).
- Creates a signed tag object on the workflow's
HEAD.
- Runs
git verify-tag against .github/allowed_signers — exits non-zero before push if verification fails.
- Pushes via the writer App (token minted at workflow runtime).
- Keep the existing post-push
release.yml as audit-only for one quarter / three runs, then delete.
Acceptance criteria
Blocked on
Out of scope
- Release artifact building (separate concern).
- Migrating any existing
v* tags (none exist; if any are added before this lands, retroactive verification is manual).
References
Context
Impl half of ADR-0002 (PR #32). The ADR proposes a workflow-mediated tag-push flow as the only Free-plan mechanism that gates signed-tag-object verification at push time. This issue tracks the impl PR that follows once the ADR is accepted.
Mechanism (per ADR-0002)
creation = false → trueinmodules/ruleset-tag-protection/main.tf. Blocks all directv*pushes.bypass_actorsentry for themillsymills-org-bot-writerGitHub App on the tag-protection ruleset (App ID 3663090).workflow_dispatchrelease workflow onmainthat:versioninput matchingv[0-9]+\.[0-9]+\.[0-9]+.${RUNNER_TEMP}/release-signing.keyat mode0600(mirroring the App-PEM pattern intofu-apply.yml).HEAD.git verify-tagagainst.github/allowed_signers— exits non-zero before push if verification fails.release.ymlas audit-only for one quarter / three runs, then delete.Acceptance criteria
github-app-key/millsymills-org-release-signing(or similar). Public key added to.github/allowed_signers.modules/ruleset-tag-protectionchanges land first underenforcement = "evaluate"so the ruleset behavior can be observed in rule-insights without breaking releases.workflow_dispatchrun of the new release flow with av0.0.0-testversion succeeds, lands the tag,verify-signed-tagaudit also succeeds.git push origin v0.0.0-directfrom a maintainer's laptop is flagged as a violation in rule-insights.enforcement = "active"flip in a follow-up PR after both tests pass.Blocked on
Out of scope
v*tags (none exist; if any are added before this lands, retroactive verification is manual).References
docs/adr/0002-required-signed-tag-check.mdrelease.yml(becomes audit-only)bootstrap/aws-output.json— Secrets Manager naming pattern