Repository navigation
Spec manual deployment approval for #106 - #128
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@romamo Decision needed: does spec 008, enforcing In short: a person approves a release with
Reply here with a number or your own answer; shipmill takes this up on the tick after your reply. |
|
Decision by @romamo, relayed by Claude Code
|
Spec for #106
Adds
docs/specs/008-enforce-manual-approval.md(status: approved; merging it is the approval). Spec only, no code.Design
cloudfall release approve COMPONENT --release RELEASE, verifies the artifact, asks the person to type the release id at a terminal (PERSON_REQUIREDoff a terminal,ATTESTATION_MISMATCHon a typo,--yesnever answers it), and writes oneReleaseApprovalrecord underdecisions/releases/. The record names the application, component, release, archive SHA-256, git commit, the component's servers, the approver, and an expiry (24 h by default). It deploys nothing, and it is not an MCP tooldeploy --yeson amanualapplication refuses with 4PRECONDITION(deployment_approval_missing) unless a record names the same component, release and archive digest and the same servers and hasn't expired. The error names the exactrelease approvecommand. The plan without--yesshows anapprovalobject (status, the record that counts, the records that don't and why, the command)automaticapplications deploy as today and the approvals folder is never read for themmigrate --yespauses atdeploy:<component>until the release is approved, then resumes without rebuildingrollbackandrestartneed no approval (see below)### Breakingchangelog entry, with two ways to migrate: approve each release first, or switch toapproval: automaticwhen GitHub reviewers are the real gate. The CI guide gets an approve-then-deploy flow (a build job uploads the artifact, a person approves and commits the record, the deploy job downloads the same artifact)Decisions for you
cloudfall release approve COMPONENT --release R(recommended: a short top-level group, next todeploy) orcloudfall decisions approve-release, which keeps it under the existing approvals but mixes a project-mode command into the fleet-modedecisionsgroupdecisions/releases/in the project, committed with it (recommended: CI finds the approval in its checkout, and the approval comes in through the project's own review), ortmp/like other receipts, which a CI runner never sees--valid-for1 to 168 h (recommended), or no expiry, which lets an approval from months ago push an old release through CImanual(recommended: an imported project has no other gate, so the firstmigrate --yespausing for an approval is the point) or writeautomaticto avoid the break for new importsautomaticapplication's release. Refused withrelease_approval_not_required(recommended: the record would claim a gate that doesn't exist) or allowed, so a team can approve ahead of switching tomanualPlan
@romamo's answer on this PR (all nine choices as recommended)🤖 Generated with Claude Code