Repository navigation
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
Builds part of spec S-008, docs/specs/008-enforce-manual-approval.md (feature issue #106): the acceptance criteria below. Each needs a test that names its id (test_s008_<k>_..., or a proves: S-008-1 comment line).
This is deploy enforcing approval: manual: the counting rules, the plan's approval object, the MCP tool, the Breaking changelog entry and the docs.
- S-008-1:
deploy crm-backend --release R --yeson a project whose application declaresapproval: manualand whose approvals folder holds no record exits 4PRECONDITIONwithcontext.code: deployment_approval_missing, a message naming the application,crm-backendandR, andcontext.commandequal tocloudfall release approve crm-backend --release R; noansible-playbookruns and no release receipt is written - S-008-3: After S-008-2,
deploy crm-backend --release R --yesdeploys and its result carriesapprovalwith that record'spath,approverandapprovedAt - S-008-5:
cloudfall mcp servefor a project lists norelease_approvetool, and itsdeploytool called withyes: truefor amanualapplication without a record returnsPRECONDITIONwithdeployment_approval_missing - S-008-6: A record for release
Rdoesn't count when the archive attmp/artifacts/crm-backend/R.tar.gzand its metadata now give another SHA-256, when the component's declared servers differ from the record'sservers, or whenexpiresAthas passed;deploy --yesrefuses withdeployment_approval_missingand lists the record withdigest_mismatch,servers_changedorexpired - S-008-7: A record naming another release or another component doesn't count for
R - S-008-8:
deploywithout--yesexits 0, runs noansible-playbook, and showsapprovalwithpolicy: manual,status: missingandcommandbefore S-008-2, andstatus: approvedwith the record'spath,approverandexpiresAtafter it - S-008-9: For an
automaticapplication,deploy --yesdeploys without any record, its plan showsapproval: {"policy": "automatic"}, and a file in the approvals folder that isn't valid JSON doesn't stop it - S-008-10: For a
manualapplication, a file in the approvals folder that isn't valid JSON or doesn't matchrelease-approval.schema.jsonmakesdeployexitRECORD_INVALIDnaming the file - S-008-15: A deploy that fails its health gate leaves its approval record unchanged, and a second
deploy --yesof the same release beforeexpiresAtuses the same record - S-008-16:
changelog.d/106-enforce-manual-approval.mdhas a### Breakingentry namingdeploy --yesandmigrate --yesonmanualapplications and both migrations (approve withcloudfall release approve, or switch toapproval: automatic), anddocs/ci-deploy-guide.mdno longer says that no command acts onapproval
Depends on #160
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
shipmill-romamo commentedon Oct 30, 2026
Triage: implement. Serves: G-2. A build issue of spec S-008 (
docs/specs/008-enforce-manual-approval.md, approved in #128), sub-issue of #106. The criteria above are the scope; each gets a test naming its id. It starts once every issue on itsDepends online has closed.shipmill-romamo commentedon Oct 30, 2026
The build is in #178:
deploy --yesrefuses amanualapplication's release withPRECONDITION/deployment_approval_missingunless arelease approverecord still counts (same archive digest, same servers, not expired), before any playbook or receipt; the plan and the result carryapproval, and a broken file in the approvals folder fails amanualdeploy withRECORD_INVALIDwhile anautomaticone never reads the folder.Behaviour change, as the spec intends: every project that declares
manualand deploys today is refused until it approves or switches toautomatic. The changelog's Breaking entry namesmigrate --yestoo, which only #165 gates, so #165 is being built stacked on #178 and the two land together.This issue closes when #178 merges.
shipmill-romamo commentedon Oct 30, 2026
Update: #178 passed review (no way around the approval found) and CI is green, but it waits on a maintainer decision posted on the PR: its
### Breakingchangelog entry, which S-008-16 asks for, makes the next release a major one. #182 (for #165) is stacked on it and lands right after.shipmill-romamo commentedon Oct 31, 2026
Released in v0.8.0rc14 (pre-release).
A plain install gets it with the next stable release.
If you filed this: react 👍 on this comment once it works for you, or reply if it doesn't.