The destruction gate
Every application deploy computes a resource-level change plan before it mutates anything. If that plan would destroy or replace a stateful resource, the deploy stops at an unconditional gate and nothing is applied. There is no blanket override:No blanket flag exists:Consent is per resource and by exact name. You tell Fjall what to do with each affected resource, and the deploy proceeds only when every one is covered. Three findings stop a deploy:--auto-approve,--skip-confirmationand approval tokens never satisfy this gate.
Stateless changes never stop here. A plain replacement of a stateless resource, or a delete that loses no data, flows through the normal plan and confirmation surfaces.
Resources deleted outside CloudFormation are a different problem with a
different tool: the deploy pre-flight blocks with a confirmed finding and
points you at
fjall drift.The ticket
When the gate stops a deploy, it prints a ticket naming every affected resource: the finding, the resource type, its stack and logical id, the exact physical name you must consent with, the property change that caused it, and the verbs you may choose:The verbs
What each verb does in practice:
pin
Offered when the change is safe to accept in place instead of replacing the resource. A consentedpin probes the live value of the offending property from AWS and writes it back into your fjall config, so the diff disappears. The deploy then stops (exit code 4) for you to review and commit the config change:
pin is only offered where the live value can be captured.
recreate
Consents to a new physical resource under the same name.- On a plain replacement or a consented delete, CloudFormation performs its native action; nothing extra is orchestrated.
- On a custom-named resource, CloudFormation refuses to replace in place, so Fjall runs a surgical removal and the same deploy re-creates the resource under its pinned name. For types that support it, the removal takes a final snapshot first: DocumentDB clusters, EBS volumes, ElastiCache cache clusters and replication groups, Neptune clusters, RDS clusters and instances, and Redshift clusters. For every other type the data loss is exactly what you consented to.
forget
Stops CloudFormation tracking a resource that no longer exists, without touching anything physical. On a deploy ticket this verb applies to out-of-band deletions, which are remediated throughfjall drift repair rather than the deploy itself.
abort and repair
abort declines: the deploy is withheld and nothing is applied. repair is the report-only arm for findings that cannot be safely remediated automatically.
Consenting interactively
Run interactively, the deploy walks you through the ticket one resource at a time. For each resource you pick a verb from a menu (each verb shows its meaning), and then, for any verb with consequences, you must type the resource’s exact physical name:Consenting with flags
Non-interactive runs (and CI) cannot hold a ceremony. The deploy exits with code4 and prints the ticket plus the consent shape:
All three flags work on
fjall ci run deploy. fjall drift repair takes --remediate and --destruction-consent-digest (not --allow-replace, whose verb belongs to the deploy).
Consents fail closed
Every supplied consent gets a verdict. A misspelt or surplus name, or a verb that is not legal for the finding, fails the gate closed with a per-name verdict table rather than being ignored:Plan first, consent bound to the plan
fjall deploy <app> --plan prints the pending destructive changes alongside the change plan, together with the ticket digest to bind consents against. Applying later with --destruction-consent-digest guarantees the consent covers exactly the changes that were reviewed: if the plan has changed in between, the deploy withholds and asks for a fresh review.
Exit codes
The deploy exit-code contract:Exit code 4 in CI
Exit4 is not a failure. It means a human decision is required and nothing was applied. A pipeline that hits it should:
- Surface the printed ticket to a human (in the job log, a PR comment, or a chat notification).
- Stop. Let the failed-by-default step be the stop; do not retry.
- After a human has reviewed, re-run the deploy with the named consents, ideally minted from a
--planrun and bound with--destruction-consent-digest.
Next Steps
fjall drift
Detect and repair resources deleted outside CloudFormation.
fjall deploy
Every deploy flag, target, and option.
CI/CD Integration
Wire deploys, plans, and consent handling into your pipeline.
fjall destroy
Explicit teardown of a whole application or organisation.