Sequencing and Rollback Register
Harlow Grid, a fictional energy retailer moving its metering platform onto managed Postgres 16 and Kubernetes. Rollback Ends When is an event; the hours follow from it.
| Phase | What moves | Rollback | Ends when | Window | Rehearsed | One-way |
|---|---|---|---|---|---|---|
| P1 | Target cluster stood up, no traffic | Delete the cluster | Nothing, while no data has been written | unbounded | Not needed | No |
| P2 | Expand-only schema change on the target | Drop the added columns and indexes | The application starts writing them, at P6 | unbounded | 2026-09-16 | No |
| P3 | Logical replication, old primary to target | Drop the subscription | Nothing, while writes go to the old primary | unbounded | 2026-09-18 | No |
| P4 | New app deployed, preview service only | Scale the deployment to zero | Nothing, while no production traffic reaches it | unbounded | 2026-09-22 | No |
| P5 | 5 percent of read traffic to the target | Revert the traffic weight | Old ReplicaSet scaled down after the promotion delay | 0.5h | 2026-09-24 | No |
| P6 | All reads, and the new columns start being written | Revert the weight, stop writing the columns | Old ReplicaSet scaled down after the promotion delay | 0.5h | Never | No |
| P7 | Writes cut over to the target | Reverse replication, target to old primary | The reverse slot falls outside WAL retention | 8h | Never | Yes |
| P8 | Old application fleet decommissioned | Redeploy the retained previous revision | ReplicaSet garbage collected past a limit of 3 | unbounded | Never | No |
| P9 | Old Postgres 13 cluster dropped | Restore from backup, measured at 6h | Backup retention expires at 14 days | 336h | Never | Yes |
Nine phases, ordered by rollback rather than by convenience: four unbounded first, then the two half-hour phases, then the one-way cutover. Four rollbacks have never been rehearsed and they are the last four, which is the ordinary pattern and runs exactly opposite to where the stakes are. P2 is the coupling nobody spots: its rollback expires because of P6, two weeks later, so the register names the ending event as a phase identifier rather than a date. P8's window is measured in deploys, not hours, because the revision history limit is 3.