Unit 12.04: The deployment checklist before it goes live
Ship when the checklist is empty, not when the feature works.
Ten items, one outstanding
The full pre-deployment list with a readiness flag each.
The code shows what is outstanding.
CHECKLIST = [
("no key in the repository or its history", True),
("spend ceiling enforced in code", True),
("input validated before the prompt is built", True),
("user content redacted before logging", True),
("retention set per field", True),
("prompt and model version in every log line", True),
("offline test suite passes with no key", True),
("irreversible actions require confirmation", True),
("privacy notice matches the code", True),
("a rollback path that restores prompt version too", False),
]
print(f"{'check':52} ready?")
for item, ready in CHECKLIST:
print(f"{item:52} {'yes' if ready else 'NOT YET'}")
pending = [c for c, r in CHECKLIST if not r]
print(f"\n{len(pending)} outstanding: {pending}")
print("ship when this list is empty, not when the feature works")
The outstanding item is the rollback path that restores the prompt version alongside the code. It is the one people discover during their first incident, when rolling back the binary leaves the new prompt in place - a combination that was never tested.
Everything else on the list is a control from an earlier module, made concrete.
The mistake this prevents
The mistake is treating the checklist as documentation to complete after launch. Each item is cheap before launch and expensive afterwards, and the one you skip is the one the first incident finds.
Takeaway
Work through the checklist before shipping. Prompts are behaviour, so the rollback path must restore the prompt version alongside the code.
