Skip to content

Application approval: manual is validated but deploy never enforces it #106

Closed
3 of 3 issues completed

Description

@shipmill-romamo

Found while writing the CI deploy guide for #89 (PR #104).

Application.spec.approval accepts automatic or manual (config/schemas/v1/application.schema.json). inventory.py parses it into DeploymentApproval and writes it into the inventory, but nothing reads it: cloudfall deploy --yes deploys an application declared approval: manual exactly as it deploys an automatic one. The example config/examples/applications/crm.yaml declares manual, and the Render importer writes "approval": "manual" for every application it imports, so imported projects look gated and aren't.

Checked on main (348ed73): the only references to DeploymentApproval outside tests are its definition in sdk/src/cloudfall/domain.py, the parse and serialisation in sdk/src/cloudfall/inventory.py, and the importer.

What would fix it

Either:

  • deploy honours manual: for example, it refuses --yes for a manual application unless an approval record (the operator's decision store) names that release, so an agent or a CI job can't approve its own deploy
  • or the field is documented as advisory, or deprecated, and the importer stops writing it

The CI guide in #104 tells teams to use GitHub's required reviewers as the real gate meanwhile.

Depends on #160
Depends on #163
Depends on #165

Activity

  1. shipmill-romamo commented on Oct 20, 2026

    @shipmill-romamo
    ContributorAuthor

    Triage: needs a decision. Confirmed on main (a9167f5): approval: manual is parsed into DeploymentApproval and written into the inventory, and nothing reads it, so cloudfall deploy --yes treats manual and automatic the same. The example crm.yaml and every application the Render importer writes say manual. Waits on your decision below.

  2. shipmill-romamo commented on Oct 20, 2026

    @shipmill-romamo
    ContributorAuthor

    @romamo Decision needed: should deploy enforce approval: manual, or should the field stop claiming a gate?

    1. Enforce it, through a spec (recommended): deploy --yes on a manual application refuses unless an approval in the operator's decision store names that release, so an agent or a CI job can't approve its own deploy. That fits "Cloudfall is the conscience", but it breaks every project that declares manual and deploys with --yes today, the example and imported projects included. It needs a spec and a Breaking changelog entry
    2. Document it as advisory: the schema description and the guides say manual is a declaration for the operator and the CI environment's reviewers, and the importer keeps writing it. No user breaks, but the record still carries a field that gates nothing
    3. Deprecate it: validation warns on the field and the importer stops writing it. No break now; removed in a later major

    Reply here with a number or your own answer; shipmill takes this up on the tick after your reply.

  3. romamo commented on Oct 27, 2026

    @romamo
    Collaborator

    1

  4. shipmill-romamo commented on Oct 27, 2026

    @shipmill-romamo
    ContributorAuthor

    Triage: feature, on your answer (1). deploy --yes on a manual application will refuse unless a person approved that exact release, so an agent or a CI job can't approve its own deploy. That is a new command, a new record and a breaking change for every project that declares manual and deploys with --yes today, so it goes through a spec rather than a fix.

    The spec is in #128 (docs/specs/008-enforce-manual-approval.md), with its acceptance criteria and the choices under "Decisions for you" in its body. Merging it is the approval, as is an answer on it that takes every recommendation, after which shipmill merges it once it is green; the build starts once it merges.

    On hold: the build waits on #128, the spec

  5. shipmill-romamo commented on Oct 31, 2026

    @shipmill-romamo
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions