Cherry-picked from e868a16 (branch phase/60-pre-mortem-doc) and finalized for P64. The pre-mortem was originally authored at P60 but the roadmap assigns it to P64 (REQ-120). Part 1 — v1.10 decay incident post-mortem: - Root cause: VERIFY was diff-scoped — checked the phase diff only, never re-ran underlying capability. 8 NFR-patch phases (v1.9.1– v1.9.8) passed VERIFY while the platform decayed. - Mitigations landed in v1.10: D-091 regression gate, D-092 local emulators, D-093 capability inventory, D-094 verified-reality rewrite. Part 2 — forward pre-mortem (OSS reference + leadership pitch): - FM-1 IAM drift recurs → IAM_POLICY.md baseline test (REQ-116) - FM-2 cost spike from un-torn-down stacks → D-096 teardown mandatory - FM-3 deck overstates capability → Verified-only claims (REQ-121) - FM-4 pilot consumer hits a contract gap → honest scope (G-010) ---ci--- project: acdl phase: P64 milestone: v1.11 status: execute ---/ci---
12 KiB
ACDL — Pre-mortem (v1.11, REQ-120)
Authored: 2026-07-28, Phase 64 (previously drafted at P60, finalized here). Mandated by: GRILL Axis 7 Q4 (no pre-mortem on file — flagged, no binding decision; user accepted autonomous governance in G-009). Structure: (1) v1.10 decay incident post-mortem, (2) forward pre-mortem for the OSS reference + leadership pitch.
Part 1 — Post-mortem: v1.10 capability decay incident
Summary
Capabilities marked complete in v1.1–v1.8 ran successfully at the time
of tagging. As of 2026-07-27 they were not reproducible — the v1.7/
v1.8 platform simplification introduced 7 adapter defects in
adapters/terraform/adapter.py that prevented terraform init/ validate/plan from succeeding against live AWS. The decks (v1.9.1–
v1.9.8) presented the capability as current across 8 NFR-patch phases
without disclosing the decay. v1.10 (Phases 52–55) re-verified every
advertised capability, fixed all 7 defects in-sweep (D-090: no cap), and
rewrote PROJECT/ROADMAP/decks to match verified reality.
Timeline
| Date | Event |
|---|---|
| 2026-07-21 | v1.7 Phases 22–27 ship. The adapter simplification lands (the 7 defects are introduced here). |
| 2026-07-21 | v1.8 Phases 28–38 ship. The defects persist undetected; VERIFY is diff-scoped so the decay is invisible. |
| 2026-07-21 → 2026-07-27 | v1.9.0 + v1.9.1–v1.9.8 (8 NFR-patch phases) ship. Each passes VERIFY (diff-scoped — checks the phase diff only, never re-runs underlying capability). Decks present capability as current. |
| 2026-07-27 | CLARIFY/RESEARCH for v1.10 surfaces the structural defect: VERIFY is diff-scoped; advertised capability is not reproducible; deck work was sequenced backwards. |
| 2026-07-27 | User decisions D-090 (no cap on sweep), D-091 (regression-class VERIFY), D-092 (local emulating adapters), D-093 (re-verify v1.1→v1.8), D-094 (rewrite to verified reality). |
| 2026-07-27 | Phase 52 adds the regression-class VERIFY. Phase 53 builds local emulating adapters. Phase 54 enumerates + re-verifies every capability — finds 7 adapter defects, fixes all in-sweep. Phase 55 rewrites PROJECT/ROADMAP/decks to verified reality. |
| 2026-07-27 | v1.10.0 tagged; all 16 auto-verifiable capabilities Verified. 6 IAM-gated capabilities (CAP-017..022) escalated (G-005). |
Root cause
VERIFY was diff-scoped. The standard VERIFY stage checked the phase diff only — the files changed in that phase — and never re-ran the underlying platform capability. 8 NFR-patch phases (v1.9.1→v1.9.8) passed VERIFY while the platform decayed underneath, because each phase's diff was docs-only (decks) and the decay was in code the diff didn't touch. The VERIFY gate was structurally incapable of catching decay in code outside the phase diff.
Contributing factors
- Deck work was sequenced backwards. The honest order is re-verify → rewrite → polish. v1.9.x did it backwards: polish the decks first, then discover (in v1.10) that the capability they advertised had decayed.
- No regression-class gate existed. Each milestone's VERIFY re-checked the phase diff, not the cumulative capability. There was no mechanism to ask "does everything we previously claimed still work?"
- Local emulating adapters did not exist. Without a local tier, re-verification required live AWS access on every phase — costly and not run. The decay was therefore never re-probed between v1.7 and v1.10.
- Decks were frozen before re-verification. The v1.9.x decks presented capability as current without a re-verification step gating the claim.
Impact
- 8 phases of inaccurate status reporting. v1.9.1–v1.9.8 decks advertised capability as current that was not reproducible.
- 7 adapter defects shipped undetected. Duplicate output
definitions, duplicate args, missing required args, deprecated AWS
provider v5 arg names — all in
adapters/terraform/adapter.py. - Credibility gap. The OSS reference's headline E2E did not run against live AWS between v1.7 and v1.10. The grill (G-005) flagged this as the project-killing risk.
Mitigations (landed in v1.10)
| Mitigation | Decision | Status |
|---|---|---|
| Regression-class VERIFY that re-runs capability checks at milestone completion | D-091 (REQ-112) | Landed — scripts/run_regression.sh + core/regression_verify.py. 16/16 Verified at v1.10.0. |
| Local emulating adapters so the platform is fully locally testable without cloud credentials | D-092 (REQ-113) | Landed — flat-file DynamoDB outbox, local ECS Fargate emulator, local S3 state, local Lambda stub. Headline E2E runs locally. |
| Capability inventory with per-capability Verified/Decayed/Broken tags | D-093 (REQ-114) | Landed — .ciagent/CAPABILITY_INVENTORY.md. 16/16 Verified; 6 IAM-gated escalated (G-005). |
| Rewrite docs/decks to verified reality; decks unfrozen only after re-verification | D-094 (REQ-115) | Landed — PROJECT.md §Capability Status (Re-Verified 2026-07-27), ROADMAP v1.9.x noted as superseded-by-reverification, both decks rewritten. |
Follow-up (accepted debt)
- G-007 (per-phase regression): the regression gate runs at milestone completion, not per-phase. Inter-milestone decay between phase N and milestone COMPLETE is an accepted trade-off (grill Axis 3 Q4, confidence 0.70). Per-phase regression hardening is a separate future milestone.
- G-005 (IAM-gated capabilities): 6 capabilities (CAP-017..022) remain deploy-unverified as of v1.10 — the spike-runner cannot fix its own IAM. v1.11 (this milestone) closes G-005 by re-bootstrapping IAM and live-deploying the stacks.
Part 2 — Forward pre-mortem: OSS reference + leadership pitch
Scenario
It is 90 days after the v1.11 ship. The leadership pitch has been delivered. The grill's 90-day conditions (G-001 pitch yields a pilot platform team; G-005 deploy path verifiable; G-008 cost operating model documented) were the success criteria. Assume the project has failed. What killed it?
Top failure modes + mitigations
FM-1 — IAM drift recurs (the spike-runner loses permissions again)
How it kills the project: the v1.11 IAM re-bootstrap grants are revoked or drift (admin action, account re-organization, SCP change). The next regression run (D-091) fails closed on CAP-017..022. The verified-reality claim in the decks becomes false again — a repeat of the v1.10 incident in a different shape. Leadership loses trust.
Mitigation (user-owned):
- The IAM policy baseline is now regression-tested
(
tests/test_iam_policy_baseline.py, REQ-116). Any permission removal surfaces as a test failure at the next milestone COMPLETE — the gate fails closed, the false claim never ships. .ciagent/IAM_POLICY.mddocuments the required grants. An admin who re-organizes the account can read the baseline and re-grant.- The user reviews the baseline test at each milestone COMPLETE. If the grants have drifted, the user re-bootstraps (D-095 path) before re-attempting COMPLETE.
FM-2 — Cost spike from un-torn-down stacks
How it kills the project: the v1.11 deploy-verification leaves the microservice + static-assets + uptime stacks running. Live ECS Fargate + CloudFront + WAF accrue spend. The COST.md (REQ-119) documents the v1.0–v1.10 window, not the ongoing burn. A pilot platform team clones the reference, runs the same apply, and leaves it running — multiply the spend by the number of clones. AWS budget alerts fire at leadership level. The reference is perceived as expensive.
Mitigation (user-owned):
- D-096 (teardown mandatory before milestone COMPLETE). Phase 61 tears down the stacks via D-070 decommission mode. The live AWS account returns to zero-cost steady state. The milestone does not complete until teardown is verified.
- COST.md teardown guidance. REQ-119 documents the teardown path + cost-ceiling guidance for downstream clones. A clone that follows the guidance runs the same teardown.
- The user enforces D-096 at Phase 61 — no merge to main until
terraform showconfirms no resources. Thedecommissioned: { stack, cr_id, completed_at }record in the---ci---block is the audit trail.
FM-3 — Deck overstates capability (a future v1.9.x-style incident)
How it kills the project: a future NFR-patch milestone adds a deck slide claiming a capability that hasn't been re-verified. The regression gate runs at milestone COMPLETE and catches the underlying decay — but the deck has already been rendered and uploaded to a release. Leadership sees the deck before the regression gate fails. Repeat of the v1.9.x sequencing incident.
Mitigation (user-owned):
- Verified-only claims. REQ-121 enforces that decks match
CAPABILITY_INVENTORY.mdexactly;ci-doc-verifierconfirms no stale claims. Any deck claim must trace to a Verified capability. - Decks unfrozen only after re-verification. The v1.10 lesson (D-094) is codified: decks are frozen until the regression gate passes. A future milestone that adds a deck slide must land the capability re-verification in the same milestone.
- The user reviews the
ci-doc-verifieroutput at each milestone COMPLETE. If a stale claim is found, the milestone does not complete until the deck is corrected.
FM-4 — Pilot consumer hits a contract gap
How it kills the project: a pilot platform team (post-pitch) clones the reference and tries to deploy a stack the L2 catalog doesn't cover (e.g. a worker queue, a scheduled job, a database-backed service). The contract schema + L2 compositions support only microservice + static- assets. The pilot team concludes the reference is a demo, not a foundation. The pitch's "feature-complete MVP" claim (G-001) is undermined.
Mitigation (user-owned):
- CONSUMER_GUIDE.md + L2 catalog coverage.
docs/CONSUMER_GUIDE.mddocuments the supported L2 compositions; the L2 catalog (modules/l2/) is the supported surface. A pilot team that reads the guide knows the boundary before cloning. - Honest scope. The grill (G-010) accepted OSS scope as contributor-bounded. The pitch should not claim "any stack" — it should claim "microservice + static-assets today; the L2 pattern is extensible." The v1.9.5 Anti-goals slide (What This Platform Is — and Isn't) is the honest framing.
- The user adds L2 compositions as pilot demand surfaces. The reference value is the shape (contract → IR → adapter → terraform → confidence → outbox), not the catalog size. A pilot team that understands the shape can extend it.
What the pre-mortem tells us
The four failure modes all reduce to the same root pattern: a claim outruns the verification that backs it. v1.10 was the first instance (decks outran capability). v1.11 closes G-005 + G-008 by making the verification back the claim. The mitigations are all structural — regression-testable baselines, mandatory teardown, Verified-only deck claims, honest scope — not procedural. The user owns enforcement at each milestone COMPLETE.
Confidence
- FM-1 (IAM drift recurs): confidence 0.75 — the baseline test catches it; the user enforces re-bootstrap at COMPLETE.
- FM-2 (cost spike): confidence 0.85 — D-096 teardown is mandatory and
audited in the
---ci---block. - FM-3 (deck overstates): confidence 0.70 —
ci-doc-verifieris automated; the sequencing risk is procedural. - FM-4 (pilot contract gap): confidence 0.65 — the mitigation is honest framing, not catalog completeness; a pilot may still hit the gap.
Links to existing controls
- D-091 regression gate (REQ-112) —
scripts/run_regression.sh. - D-094 verified-reality rewrite (REQ-115) — decks match
CAPABILITY_INVENTORY.md. - D-096 teardown mandatory (v1.11) — Phase 61.
- G-005 deploy verification (v1.11) — Phases 56–58.
- G-008 cost documentation (v1.11) — Phase 59.
- G-010 contributor-bounded scope — honest pitch framing.