February Fest HOTFIX Upload Blocked Without Numbered hotfix_exception_list_ok - How to Fix
Problem: During February 2027 Steam Next Fest live week (D1–D7), engineering finishes an urgent crash fix, but CI, Thursday row review, or steamcmd promotion scripts refuse setlive because BUILD_RECEIPT hotfix_exception_list_ok is false (or missing). Discord pressure peaks; the binary is ready; the evidence gate is not.
Who is affected now: Godot / Unity / multi-engine teams following HOTFIX exception opinion and the Godot HOTFIX visible label preflight (Guide #41). This is live-week numbered exception truth, not SHIP holiday freeze exceptions, not SteamPipe “queued forever” when the depot is already uploading (Help #14 forward), and not fest-day setlive depot mismatch after RC passed (Help #38 forward / setlive recovery case study).
Fastest safe fix: Add the next HOTFIX-00N row → bump player-visible build_label + capture screenshot → file hotfix_exception_list_receipt_v1.json → run verify_hotfix_exception_list.sh → re-run Wednesday smoke same calendar day → set hotfix_exception_list_ok: true.
Direct answer
Blocked HOTFIX uploads mean the studio tried to promote a mid-fest binary without a monotonic HOTFIX-00N row, matching branch + visible label, and same-day smoke. SteamPipe queue length is irrelevant until those gates pass. Complete the list → receipt → smoke path; do not force setlive by flipping the bool manually.
Why this issue spikes in February 2027 live week
- Pager compassion — Teams ship HOTFIX binaries on verbal approval, then CI catches a false GREEN rebuild.
- SHIP vs HOTFIX confusion — SHIP list rows are archived at D1; live week needs a fresh HOTFIX list.
- Label drift — Branch is
hotfix3but player footer still saysrc2—jq hourly J3 fails. - Smoke skipped — Opinion H3 requires smoke same day as the exception—yesterday’s smoke does not latch.
- Seq gaps — HOTFIX-003 filed without HOTFIX-002 → verify script exits non-zero.
Symptoms and search phrases
hotfix_exception_list_okfalse / CI jobverify_hotfix_exception_listfails.- “Hotfix ready but setlive blocked.”
next_seqmismatch / “skipped HOTFIX number.”- Player Discord: “which build am I on?” with no footer string.
- Staging branch green; fest branch promotion script exits 6 on exception list.
- Thursday review RED on
hotfix_exception_list_okwhile binary artifact exists.
Root causes (check in order)
- No HOTFIX-00N row — list empty or still pointing at SHIP archive.
- Branch name ≠
branch_afteron the exception row. - Visible label missing — Project Settings / UI not bumped (Guide #41).
- Screenshot path empty — receipt fails H4 honesty.
- Smoke not same day — calendar day mismatch vs
smoke_same_day. - Seq gap — next integer skipped under Discord pressure.
- Bool flipped without verify — theater GREEN; gate still fails in CI.
Beginner path (first 20 minutes)
Prerequisites: Write access to release-evidence/february-live/, HOTFIX opinion template, ability to export a player build, Wednesday smoke runnable.
- Open
hotfix-exception-list-2027-live.md→ add the next HOTFIX-00N line (never skip). - Checkout the HOTFIX branch; bump player-visible version string.
- Export player → screenshot footer (Guide #41 for Godot).
- Refresh
HOTFIX_EXCEPTION_LIST_RECEIPT.json→ run verify script. - Run smoke on the HOTFIX binary → promote only when verify exit 0.
Common mistake: Reusing SHIP-00N numbering mid-fest—start HOTFIX at HOTFIX-001 on first live-week binary touch.
Fastest safe fix path
Step 1 — Reserve HOTFIX-00N (H1)
| HOTFIX-004 | D5 | Null ref on Deck resume | yes | yes | fest-demo-2027-02-rc2 | fest-demo-2027-02-hotfix4 | … |
Confirm next_seq in receipt equals that integer:
jq -e '.next_seq == (.exceptions | length) + 1 or .exceptions[-1].id == ("HOTFIX-" + (.exceptions | length | tostring | if length == 1 then "00" + . elif length == 2 then "0" + . else . end))' \
release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json
Simpler honesty check:
jq -r '.exceptions[-1].id, .next_seq' release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json
Step 2 — Branch + label proof (H2–H4)
git branch --show-current | tee release-evidence/february-live/hotfix/BRANCH.txt
# After export: screenshot player-visible label
test -f release-evidence/february-live/hotfix/HOTFIX-004_label_capture.png
Godot: follow Guide #41 H3–H4—Config version and on-screen Label must match build_label_after.
Step 3 — Refresh hotfix_exception_list_receipt_v1.json (H6)
Minimum fields (align with HOTFIX opinion template):
{
"schema": "hotfix_exception_list_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"next_seq": 5,
"exceptions": [
{
"id": "HOTFIX-004",
"fest_day": "D5",
"scope": "Null ref on Deck resume",
"build_label_before": "fest-demo-2027-02-rc2",
"build_label_after": "fest-demo-2027-02-hotfix4",
"branch_after": "fest-demo-2027-02-hotfix4",
"label_screenshot": "release-evidence/february-live/hotfix/HOTFIX-004_label_capture.png",
"smoke_same_day": true,
"producer_signoff": "pager-oncall"
}
],
"hotfix_exception_list_ok": false
}
Leave hotfix_exception_list_ok false until Steps 4–5 pass.
Step 4 — Verify script (fail-closed)
./scripts/verify_hotfix_exception_list.sh \
release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json
Pass: prints hotfix_exception_list verify: OK (exit 0).
Fail seq / screenshot / schema: fix receipt—do not edit BUILD_RECEIPT alone.
Step 5 — Same-day smoke + latch bool (H5–H6)
- Run Wednesday smoke on the HOTFIX export.
- Set
"smoke_same_day": truewith today’s UTC date in smoke receipt path. - Flip receipt + BUILD_RECEIPT:
"hotfix_exception_list_ok": true,
"hotfix_exception_count": 4,
"hotfix_exception_list_receipt": "release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json"
- Re-run verify → exit 0 → unlock setlive / SteamPipe promotion job.
Verification
| Check | Pass when |
|---|---|
| Seq | Last id is next integer; no gaps |
| Branch | git branch matches branch_after |
| Label | Screenshot shows build_label_after |
| Verify script | Exit 0 |
| Smoke | Same UTC day as exception |
| BUILD_RECEIPT | hotfix_exception_list_ok: true |
| Hourly ops | jq J3 hotfix_id matches row |
Alternative fixes (edge cases)
Branch A — CI green, Thursday still RED
Local verify passed with a laptop path; CI runner missing screenshot file. Commit evidence under release-evidence/ or store artifact URL both environments can read.
Branch B — Feature disguised as HOTFIX
If scope is a new mode/UI, do not mint HOTFIX-00N—route to post-fest defer (HOTFIX opinion). Gate stays RED intentionally.
Branch C — SHIP list still in active path
Archive SHIP at D1. Point CI at hotfix-exception-list-2027-live.md only. Mixing lists causes schema / fest_window fails.
Branch D — Godot label blank in export only
Editor Play shows version; Steam players do not—re-export after Config change (Guide #41).
Branch E — Upload already queued, exception late
If SteamPipe already ingested a bad build, complete this help and follow setlive mismatch recovery (Help #38 forward)—do not treat queue wait as the root cause.
Prevention
- Keep a blank HOTFIX template in facilitator README before D1.
- Run Guide #41 (or engine cousin) on every live-week binary touch.
- Wire
verify_hotfix_exception_list.shas a required check before setlive jobs. - Pair nightly pager challenge with HOTFIX count diff.
- Archive HOTFIX list at Sunday closeout; March uses MERGE exceptions.
Related problems
- HOTFIX exception opinion — policy (why numbered lists).
- Godot HOTFIX visible label preflight — ninety-second paint gate.
- Visible build label opinion — why players must see the string.
- Wednesday smoke — same-day latch.
- jq February hourly — J3
hotfix_idcrosswalk. - SHIP exception opinion — holiday cousin.
- Lesson 279 — Godot HOTFIX visible label on BUILD_RECEIPT — prevention milestone after this recovery.
- Help #38 forward — depot mismatch after setlive (different failure mode).
- Help #14 forward — SteamPipe queued validation delay (upload already in flight).
- Setlive mismatch case study — recovery narrative when wrong depot was already live.
FAQ
Can we set hotfix_exception_list_ok true to ship tonight?
No—verify script must exit 0 with real HOTFIX-00N + smoke evidence.
Is this the same as SHIP exceptions?
No—SHIP is holiday freeze; HOTFIX is live week D1–D7 only.
Do Unity teams need Guide #41?
Guide #41 is Godot-shaped; the same H1–H6 receipt fields apply—swap engine paint steps for your footer / Application.version.
What if Discord demands a fix with no time for smoke?
Document a waiver line with producer sign-off and still file HOTFIX-00N + label screenshot; smoke incomplete = keep setlive_allowed false.
Bookmark this page for live-week promotion nights. Share it with your on-call pair if a crash fix is waiting on SteamPipe.
Live-week HOTFIX uploads stay blocked until HOTFIX-00N, visible label, same-day smoke, and verify exit 0—then flip hotfix_exception_list_ok and promote.