Stop Hotfixing Fest Demos During Live Week Without a Numbered HOTFIX Exception List - 2026 Opinion

February fest D4 hour ten: #playtest wants a crash fix tonight. Pager already ran P2 diff. Refund spike worksheet hit SR4 RED. Someone merges to setlive because "players are leaving"—without a number, without Wednesday smoke, without updating jq hourly J3 build_label policy.
February 2027 live week is when compassionate hotfixes destroy the evidence trail you built in January. SHIP exception opinion disciplined holiday freeze → re-entry. Live fest needs a cousin list with different stakes: every mid-week binary promotion during D1–D7 must appear as the next integer in hotfix_exception_list_receipt_v1.json—not Slack heroics, not moderator promises, not "we'll file the receipt after the stream."
This Opinion & Hot Takes piece makes a narrow claim: during February Next Fest live week, no setlive or player-visible depot promotion happens unless the change is HOTFIX-00N with same-day smoke, label bump, and pager producer sign-off—refuse merges that skip the next number even when refunds are RED.
Non-repetition note: SHIP exception list owns holiday freeze O1–O6 and January baseline. Visible build label opinion owns player-facing label policy. Refund spike worksheet owns daily % thresholds SR1–SR5. Setlive case study owns recovery after mismatch. This URL owns numbered HOTFIX exception list + H1–H6 gates when live-week promotion pressure peaks.
Pair Wednesday smoke ritual, 5-night pager challenge, February live week timebox, and hour-one funnel.
Why this matters now (February 2027 live week)
#playtestvelocity — Live fest threads reward visible action; unreceipted hotfixes feel moral even when they poison BUILD_RECEIPT rows.- Refund SR4 coupling — Refund worksheet SR4 blocks HOTFIX without exception ID—this opinion supplies the ID format.
- jq J3 policy — Hourly receipt routes
build_labeldrift to setlive case study unlesshotfix_idexists innotes. - Moderator false promises — Moderation listicle scripts need HOTFIX-00N language—not "fixing tonight" without seq.
- Sunday closeout — Forward #11 debrief counts hotfixes; unnumbered merges become partner folklore.
Direct answer: Maintain hotfix-exception-list-2027-live.md with monotonic HOTFIX-001…N, file hotfix_exception_list_receipt_v1.json, set BUILD_RECEIPT hotfix_exception_list_ok: true, run Wednesday smoke same calendar day any exception touches player binaries—refuse setlive that skips the next number.
The opinion in one paragraph
Live fest is not a hackathon with a Steam page. If you promote a binary during D1–D7 without incrementing a numbered HOTFIX exception, you did not save the demo—you created a second fest inside the first: new bits, old receipts, moderators quoting fixes that jq cannot find, and finance reading refund spikes you cannot correlate to build_label. Micro-studios cannot afford two fests in one week. Numbered HOTFIX lists are the minimum correlation layer between pager nights, community tone, and the smoke ritual you already claim to respect. Verbal "we're hotfixing" is how teams ship four builds in forty-eight hours while telling partners the label never moved.
Who this opinion is for
| Audience | Why read |
|---|---|
Solo founder in #fest-live-ops |
Copy-paste "next HOTFIX number or no setlive" |
| Producer on pager nights | Block promote until list matches smoke + label |
| Engineer | Wire verify_hotfix_exception_list.sh before CI setlive |
| Community manager | Replace "fixing soon" with seq row or defer language |
SHIP vs HOTFIX — format ladder
| List | Window | Schema | Primary gate |
|---|---|---|---|
| SHIP exception | Dec freeze → Jan re-entry | ship_exception_list_receipt_v1 |
O1–O6 |
| HOTFIX exception | Feb live D1–D7 | hotfix_exception_list_receipt_v1 |
H1–H6 |
| Refund SR4 | Daily mornings | february_refund_spike_receipt_v1 |
R1–R6 |
| jq hourly J3 | Each hour | february_fest_live_ops_receipt_v1 |
J1–J6 |
Rule: SHIP rows do not substitute for HOTFIX rows after live week starts—archive SHIP list before D1; start HOTFIX list at HOTFIX-001 on first live-week binary touch.
Beginner path — numbered list in 25 minutes
Copy into release-evidence/february-live/hotfix-exception-list-2027-live.md:
# Numbered HOTFIX exception list (February 2027 live week)
fest_window: 2027-02-next-fest-live
list_owner: producer
next_seq: 2
live_week_start: D1
| Seq | Fest day | Summary | P0? | Touches binary? | build_label_before | build_label_after | Smoke same day? | Pager night | Owner |
|-----|----------|---------|-----|-----------------|--------------------|--------------------|-----------------|-------------|-------|
| HOTFIX-001 | D2 | Menu null ref crash | yes | yes | fest-demo-2027-02-rc2 | fest-demo-2027-02-hotfix1 | yes | N2 | engineering |
| HOTFIX-002 | (reserved) | — | — | — | — | — | — | — | — |
Beginner rules:
- Next setlive must be
next_seq—no HOTFIX-003 before HOTFIX-002 exists. - Binary touch ⇒ smoke same day—cousin Wednesday smoke, compressed to fifteen minutes.
build_label_aftermust update when players receive new bits—pair visible label opinion.- Feature scope ⇒ DEFER—live week HOTFIX list is P0/P1 only; new modes belong in post-fest defer, not HOTFIX-00N theater.
Success check: Moderator can cite HOTFIX-001 in a player reply without asking engineering "did we ship?"
Developer path — gates H1–H6
| Gate | Check | Fail action |
|---|---|---|
| H1 | exceptions[] seq integers 1..N contiguous |
Fix gaps before setlive |
| H2 | next_seq == N+1 in markdown matches JSON |
Sync list + receipt |
| H3 | touches_binary: true ⇒ smoke_receipt_path same calendar day |
Block setlive |
| H4 | Last build_label_after matches BUILD_RECEIPT build_label |
Fix label lineage |
| H5 | fest_day on last exception ∈ D1–D7 |
Reject post-fest rows here |
| H6 | hotfix_exception_list_ok: true + producer sign-off path |
Fail jq bundle |
hotfix_exception_list_receipt_v1.json (template)
{
"schema": "hotfix_exception_list_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"generated_at": "2027-02-24T22:00:00Z",
"next_seq": 2,
"exceptions": [
{
"seq": 1,
"id": "HOTFIX-001",
"fest_day": "D2",
"date": "2027-02-23",
"summary": "Menu null ref crash on Deck",
"p0": true,
"touches_binary": true,
"build_label_before": "fest-demo-2027-02-rc2",
"build_label_after": "fest-demo-2027-02-hotfix1",
"smoke_required": true,
"smoke_receipt_path": "release-evidence/smoke/HOTFIX_001_SMOKE.json",
"pager_night": "N2",
"producer_signoff_path": "release-evidence/february-live/PAGER_N2_SIGNOFF.json",
"owner": "engineering",
"refund_spike_status_at_file": "YELLOW",
"jq_hourly_receipt_path": "release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_2200.json"
}
],
"pointers": {
"february_live_timebox": "release-evidence/ops/FEBRUARY_LIVE_TIMEBOX_RECEIPT.json",
"refund_spike_latest": "release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json"
},
"gates": {
"H1": "pass",
"H2": "pass",
"H3": "pass",
"H4": "pass",
"H5": "pass",
"H6": "pass"
},
"hotfix_exception_list_ok": true
}
Store canonical copy at release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json.
BUILD_RECEIPT row
{
"hotfix_exception_list_ok": true,
"hotfix_exception_count": 1,
"hotfix_exception_list_receipt": "release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json",
"build_label": "fest-demo-2027-02-hotfix1",
"refund_spike_watch_ok": true
}
Fail-closed: If hotfix_exception_count ≠ exceptions[].length or last build_label_after ≠ build_label, setlive gate fails.
verify_hotfix_exception_list.sh
#!/usr/bin/env bash
set -euo pipefail
LIST="${1:-release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json}"
BR="${2:-BUILD_RECEIPT.json}"
jq -e '.schema == "hotfix_exception_list_receipt_v1"' "$LIST" || exit 1
COUNT=$(jq '.exceptions | length' "$LIST")
for i in $(seq 1 "$COUNT"); do
ACT=$(jq -r --argjson n "$i" '.exceptions[] | select(.seq == $n) | .seq' "$LIST")
[[ "$ACT" == "$i" ]] || { echo "H1 fail: missing seq $i"; exit 2; }
done
jq -e '
[.exceptions[] | select(.touches_binary == true)
| .smoke_receipt_path] | all(. != null and . != "")
' "$LIST" || { echo "H3 fail: binary touch without smoke"; exit 3; }
LAST=$(jq -r '.exceptions[-1].build_label_after' "$LIST")
BL=$(jq -r '.build_label' "$BR")
[[ "$LAST" == "$BL" ]] || { echo "H4 fail: label mismatch"; exit 4; }
FD=$(jq -r '.exceptions[-1].fest_day' "$LIST")
[[ "$FD" =~ ^D[1-7]$ ]] || { echo "H5 fail: fest_day"; exit 5; }
jq -e '.hotfix_exception_list_ok == true' "$LIST" || exit 6
echo "hotfix_exception_list verify: OK"
Exit codes: 1 schema, 2 H1 gaps, 3 H3 smoke, 4 H4 label, 5 H5 fest_day, 6 H6 latch.
Hotfix theater vs honest HOTFIX exception
| Behavior | Theater | Honest exception |
|---|---|---|
| "Quick setlive tonight" | No HOTFIX row | HOTFIX-00N filed same day |
| "Smoke tomorrow" | H3 ignored | smoke_receipt_path exists |
| Label unchanged after hotfix | jq J3 fail | build_label_after bumps |
| CM promises fix in thread | Informal | Seq cited in reply |
| Three bugs one merge | One vague row | Three seq rows or explicit scope hash |
| Ship new boss phase | Feature creep | DEFER post-fest—not HOTFIX |
Producer script for #fest-live-ops:
Live week binary changes need the next HOTFIX-00N in
hotfix-exception-list-2027-live.md, same-day smoke,build_labelbump, and pager producer sign-off. Refund RED triggers SR4—exception row required before setlive. Feature ideas go to post-fest defer—not HOTFIX.
Integration with February cluster #1–#9
| Row | HOTFIX list coupling |
|---|---|
| #1 timebox | D4 engineering cap—each HOTFIX notes estimated_engineering_h |
| #2 funnel | File refund_spike_status_at_file on exception row |
| #4 pager | pager_night + producer_signoff_path on each HOTFIX |
| #5 setlive case study | Recovery when H4 fails after unnumbered setlive |
| #8 jq hourly | J3 hotfix_id must match HOTFIX-00N |
| #9 refund | SR4 names exception before promote on RED |
Wednesday smoke coupling (live-week compression)
Pre-fest Wednesday smoke owns branch promotion ritual. During live week, each HOTFIX reuses the same fifteen-minute script—not a shortened "we already smoked this fest."
| Smoke element | HOTFIX requirement |
|---|---|
| Installed binary | Fresh build from build_label_after |
| Menu boot | Pass before setlive |
| Demo scope spot-check | No new features smuggled in HOTFIX |
| Receipt path | HOTFIX_00N_SMOKE.json same date as exception |
Working dev: Template smoke JSON from Wednesday ritual—swap ritual_type: "live_week_hotfix" in notes.
jq gate sketch (CI + hourly crosswalk)
# H1 + latch
jq -e '
.hotfix_exception_list_ok == true
and (.exceptions | length) == (.exceptions | map(.seq) | max)
' release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json
# J3 coupling — hotfix_id must exist on label change hour
jq -e '
.row_diff[] | select(.field=="build_label" and .after != .before)
| .notes.hotfix_id
' release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json
Run after verify_february_live_ops.sh when build_label row changes.
Proof table
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | HOTFIX_EXCEPTION_LIST_RECEIPT.json |
H1–H6 pass |
| P2 | Per-HOTFIX smoke JSON | Same calendar date |
| P3 | BUILD_RECEIPT build_label |
Matches last build_label_after |
| P4 | Pager night sign-off JSON | Producer path on row |
| P5 | Visible label screenshot | Matches BUILD_RECEIPT |
| P6 | jq hourly receipt | hotfix_id on label change |
Scenarios A–G
A — Zero HOTFIXs (stable fest)
exceptions: [], next_seq: 1. Any setlive during D1–D7 without HOTFIX-001 is H6 fail.
B — One P0 crash D2
HOTFIX-001 only. Label hotfix1. Moderator reply links seq. jq J3 pass with hotfix_id: HOTFIX-001.
C — Refund RED D4 + engineer panic
SR4 requires exception before setlive—even when refunds scream.
D — "Config only" that moves depot
touches_binary: true—players download new bits. HOTFIX row required.
E — Stream overlay layout HOTFIX
If only 1920×1080 assets change without depot, not HOTFIX—re-run overlay O2–O4. If depot changes, HOTFIX row.
F — Two HOTFIXs same night
HOTFIX-002 and HOTFIX-003 sequential—no batch row unless scope hash documented.
G — D7 hotfix request
Allowed with HOTFIX-00N—but triggers Sunday closeout #11 forward annex requirement.
Engine-specific notes (working dev)
| Engine | setlive touch signal | Label field |
|---|---|---|
| Unity | Player build hash changes | BUILD_LABEL env |
| Godot | Export preset output changes | config/version |
| Unreal | Staged build folder changes | PROJECT_VERSION |
| GameMaker | YYZ changes | GM_BUILD_LABEL per setlive evening |
| Ren'Py | Bundle changes | config.version |
Rule: New depot ID ⇒ HOTFIX row—even for "one script."
PowerShell verify cousin
$List = "release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json"
$Br = "BUILD_RECEIPT.json"
$j = Get-Content $List -Raw | ConvertFrom-Json
$build = Get-Content $Br -Raw | ConvertFrom-Json
if ($j.schema -ne "hotfix_exception_list_receipt_v1") { exit 1 }
if (-not $j.hotfix_exception_list_ok) { exit 6 }
if ($j.exceptions[-1].build_label_after -ne $build.build_label) { exit 4 }
Write-Host "hotfix_exception_list verify: OK"
Git tag pairing (optional)
Tag hotfix-001-20270223 at the exception merge commit. Partners browsing Git without opening release-evidence/ still see promotion anchors—tags supplement JSON, never replace receipts.
Moderation template coupling
Moderation listicle scripts should include three reply classes:
| Player ask | Approved reply pattern |
|---|---|
| "When fix?" | "Tracked under HOTFIX-00N—smoke gate pending" OR honest defer |
| "Broken on Deck" | Escalate pager—do not promise HOTFIX without seq |
| "Add co-op?" | Defer post-fest—not HOTFIX scope |
CM policy: Only producer assigns next next_seq—moderator empathy is not H6-compliant approval.
Live-week enforcement calendar
| Fest day | Policy emphasis |
|---|---|
| D1 | List starts next_seq: 1; zero unnumbered setlive |
| D2–D3 | Peak #playtest pressure—H6 strict |
| D4 | Refund lag + SR4 coupling—producer owns sign-off |
| D5–D6 | Limit to P0—reject feature HOTFIX theater |
| D7 | Last HOTFIX needs closeout pointer—forward #11 |
Counterarguments (and rebuttals)
"Numbered lists slow live fixes."
HOTFIX-001 takes five minutes—setlive case study recovery takes five hours.
"Pager already approved it."
Pager owns ritual; HOTFIX list owns binary promotion audit trail.
"SHIP list covered January."
SHIP closes at D1—live week needs fresh HOTFIX-001 lineage from RC label.
"Players demand fixes—we'll lose wishlists."
Unnumbered hotfixes lose refund correlation and partner trust—worse than waiting one smoke cycle.
"Exceptions look incompetent."
Incompetent is four mystery builds—numbered lists show discipline under pressure.
Printable producer card
# HOTFIX gate (pin near setlive)
1. Next HOTFIX-00N reserved in markdown?
2. P0 scope only—features → defer
3. Smoke same day → receipt path
4. build_label_after bumped + visible label
5. verify_hotfix_exception_list.sh → exit 0
6. Refund RED? SR4 satisfied
7. jq hourly J3 hotfix_id matches
8. Pager producer sign-off attached
Related GamineAI reads
- SHIP exception opinion
- Wednesday smoke ritual
- Refund spike worksheet
- jq hourly live ops
- 5-night pager challenge
- Setlive mismatch case study
- Forward: Sunday closeout row review (blog #11)
Key takeaways
- Live fest D1–D7 needs numbered HOTFIX exceptions—not verbal pager heroics.
hotfix_exception_list_receipt_v1.jsongates H1–H6 with same-day smoke on binary touch.- HOTFIX-001…N is a fresh list at live week—cousin to SHIP, not a continuation.
- Refund SR4 requires exception ID before setlive on RED.
- jq J3
hotfix_idmust match HOTFIX-00N. - BUILD_RECEIPT
hotfix_exception_list_oklatches before live-week setlive GREEN. - Wednesday smoke compresses to per-HOTFIX fifteen-minute ritual.
- Pager P2 diff cousins each HOTFIX
build_labelrow. - Sunday closeout C4 annexes HOTFIX count for partners—#11 consumed.
- Feature scope during live week belongs in defer—not HOTFIX theater.
- Moderators cite seq in replies—or defer without promising binaries.
- February cluster #12 published—same-day Whisper live-week triage closes February cluster #1–#12.
FAQ
Is this the same as the SHIP exception list?
No—SHIP owns holiday freeze; HOTFIX owns February live week D1–D7.
Can we reuse SHIP-003 as HOTFIX-001?
No—start HOTFIX list fresh from RC build_label at D1.
Does every Discord bug need HOTFIX?
Only binary promotions—investigate first; comms-only fixes skip the list.
What if smoke fails on HOTFIX-002?
Do not setlive; file rollback row or mark exception status: rolled_back in notes.
What ships next in February cluster?
Blog-Create #11 — Sunday February fest closeout BUILD_RECEIPT row review.
Closing
Live fest pressure will always outrun your documentation instinct—that is why the list exists. One HOTFIX integer, one smoke receipt, and H1–H6 turn #playtest noise into BUILD_RECEIPT truth—beginners copy the markdown table, working devs wire verify + jq J3, producers get a line they can refuse in public without sounding cruel.