Feature Freeze Stabilization Workflow
Announce a freeze, convert the team to stabilization mode with daily bug triage, and measure exit by open-blocker burn-down to zero.
Objective
Drive a release candidate from feature freeze to shippable through daily triage, targeted fixes, and explicit exit criteria.
Environment
- A release branch under freeze
- A bug tracker with severity labels
- The team available for a stabilization period
Steps
1. Announce the freeze with exit criteria
Declare the freeze date and define exit as zero open blockers plus zero open criticals older than 48 hours, published where everyone sees them.
Expected state: The criteria are visible and agreed before the freeze starts, not negotiated during it.
2. Switch to daily triage
Hold a fifteen-minute daily triage over every new and existing issue against the release: blocker, critical, deferred, or not-a-blocker, with an owner for each.
Expected state: Every open issue has a classification and an owner by the end of each triage.
3. Fix in priority order
Assign capacity to blockers first, then criticals, with deferred items recorded for the next cycle rather than silently dropped.
Expected state: The burn-down chart shows blockers closing faster than they open on most days.
4. Verify fixes against the candidate
Require every stabilization fix to be verified on the current RC artifact, not on a developer build, before the issue closes.
Expected state: Closed issues reference the RC version where the fix was confirmed.
5. Exit on criteria, not on calendar
Release when the exit criteria hold for a full day, or explicitly reset scope by downgrading a blocker with a documented waiver.
Expected state: The exit decision cites the criteria state, and any waiver is written and owned.
Expected outcome
A stabilization period that ends on measured criteria with a full record of what was fixed, deferred, and waived, instead of ending on fatigue.
Verification
The tracker shows zero open blockers at exit, every closed issue verified on the RC, and the burn-down history attached to the release record.
Cleanup
Convert deferred items into the next cycle plan and archive the triage log with the release.
Freeze ends on criteria, not on fatigue
Stabilization periods drift when exit means everyone is tired of fixing. Publishing exit criteria before the freeze, triaging daily, and burning down blockers converts the period into a measurable trajectory with a defined end.
exit criteria (published day 1):
open blockers = 0
open criticals > 48h = 0
held for one full day
day blockers criticals deferred
1 9 14 0
4 5 8 11
8 2 3 17
11 0 1 19 <- one 30h-old critical
12 0 0 19 <- EXIT (criteria held)
Triage every day, including old items
The daily pass must cover previously classified issues too, because a critical sitting untouched for three days is a decision that nobody made. Re-triaging forces the demote-or-fix decision into the open each morning.
Waivers are written, never silent
Sometimes a blocker must ship: the workaround exists, the exposure is bounded. That is a legitimate business call, but only as a documented waiver naming the risk and the owner. Silent downgrades are how freezes rot.