Screenshot 1 — annotated (after fix): Project detail page with a pre-existing failed project row. The red circle highlights the activation-failed banner, which now displays the actual cloud-provider error message (an IAM permission failure) — not the hardcoded "24 hours" string the client originally saw.
What's visible inside the red circle: the activation-failed banner now contains the actual cloud-provider error — an AccessDenied on the AssumeRole operation, including the calling principal and the target role ARN. Before the fix, this same banner showed only the hardcoded message "cloud account service activation timed out after 24 hours" regardless of the real cause. The pixels match the fix: the banner reflects the recorded bootstrap_error from the database, not the old hardcoded string.
Served-asset check: N/A for this fix — it's a data + template-rendering change, not a static-asset change. Verified by the annotated screenshot above. The template source change is committed and the running service rolled forward to the matching image digest.
Screenshot 2 — admin customer list (no regression): After applying the database constraint and the dispatch change, the admin customer list still renders normally. Existing customer rows continue to load.
Screenshot 3 — customer creation form: The "New Customer" admin form renders correctly. The form submission now writes the cloud-partition value on every new organization. Full end-to-end form round-trip is deferred to the test-stage proof (this dev environment lacks one piece of background config).
FIXED & VERIFIED (dev, light proof)
| Check | Status | Detail |
|---|---|---|
| Application service rollout | PASS | rolloutState=COMPLETED, running=1/1 after deploy of fix commit (hash redacted) |
| Database migration applied | PASS | NULL partitions=0 in customer table; new CHECK constraint exists; column NOT NULL; CHECK rejects invalid values |
| Banner renders real error | PASS | Headless-browser eval: failure banner body contains the full cloud-provider error from the database, not the hardcoded "24 hours" string |
This kind of report is what we ship instead of "we fixed it" emails. The agent assembles the card from the bug ticket, the verbatim client quote, the diff, and a real after-state screenshot — but it refuses to ship the card unless the cross-checks resolve: the served code matches the diff, the database migration matches the schema claim, the rendered banner contains the asserted text. The pattern generalizes well beyond bug fixes — any AI-driven workflow that produces results a human must approve (medical record review, document classification, policy decisions) benefits from a "card that can't be assembled until the result is real."