Lesson 279: Godot February HOTFIX Visible Build Label Receipt on BUILD_RECEIPT (2026)
Direct answer: Before February 2027 live-week HOTFIX SteamPipe, complete H1–H6—reserve HOTFIX-00N, checkout matching branch, bump Godot Config version + on-screen footer, screenshot the exported player, run same-day smoke, crosswalk hotfix_exception_list_receipt_v1.json—then promote BUILD_RECEIPT hotfix_label_ok: true. Pair Godot HOTFIX visible label preflight (Guide #41), HOTFIX exception opinion, Wednesday smoke, and HOTFIX blocked help.

Why this matters now (February 2027 live week)
February 2027 D4–D5: Discord reports a Deck resume crash, engineering ships a binary in two hours, and players still quote rc2 in bug reports because the footer never changed. HOTFIX opinion requires a numbered list; Guide #41 paints the Godot string—279 latches both on BUILD_RECEIPT so CI and Thursday row review refuse SteamPipe when the label proof is missing.
Lesson 278 proved depot build ID truth for fest-day promote; 279 proves HOTFIX identity players can quote—different failure mode, same live-week discipline.
Promotion order on BUILD_RECEIPT: hotfix_exception_list_ok (list + verify) → hotfix_label_ok (this lesson) → SteamPipe / setlive lane → Wednesday smoke same day.
Beginner path (list → Godot → screenshot → promote)
| Step | Action | Success check |
|---|---|---|
| 1 | Add next HOTFIX-00N row | H1 |
| 2 | Checkout branch_after |
H2 |
| 3 | Bump Project Settings Version + footer | H3 |
| 4 | Export player; screenshot footer | H4 |
| 5 | Run smoke same UTC day | H5 |
| 6 | Refresh list receipt + BUILD_RECEIPT | hotfix_label_ok: true |
Time: ~40 minutes first live-week HOTFIX; ~12 minutes when Guide #41 and list template exist.
Common mistake: Screenshot of Editor Play—Steam players get last RC export; H4 fails honesty.
Developer path (gates H1–H6)
| Gate | Check | Fail when |
|---|---|---|
| H1 | HOTFIX seq reserved | Gap / SHIP row reused |
| H2 | Branch matches row | Wrong checkout |
| H3 | Godot version + footer | Config stale / UI blank |
| H4 | Label screenshot path | Missing PNG / Editor-only |
| H5 | Same-day smoke | Yesterday’s smoke |
| H6 | List + label crosswalk | Verify exit ≠ 0 |
Cousin receipt crosswalk
| Field | Opinion / Help | Guide #41 | This lesson (279) |
|---|---|---|---|
| Schema | hotfix_exception_list_receipt_v1 |
godot_hotfix_visible_label_receipt_v1 |
Same list + BUILD_RECEIPT columns |
| Scope | Policy + blocked setlive recovery | Godot paint + capture | Milestone latch for CI |
| BUILD_RECEIPT | hotfix_exception_list_ok |
godot_hotfix_label_ok (engine mini) |
hotfix_label_ok (+ list ok) |
| Path | …/HOTFIX_EXCEPTION_LIST_RECEIPT.json |
…/GODOT_HOTFIX_VISIBLE_LABEL_RECEIPT.json |
Crosswalk both in cousin_receipts |
Do not merge schemas—link paths only. If CI already blocks on false list gate, start with Help #41 before pretending H3–H4.
H1 — reserve HOTFIX-00N
| HOTFIX-003 | D4 | Save wipe on Deck resume | yes | yes | fest-demo-2027-02-rc2 | fest-demo-2027-02-hotfix3 | … |
Mirror into exceptions[] with "id": "HOTFIX-003". Never skip integers (opinion).
H2 — branch proof
git branch --show-current | tee release-evidence/february-live/hotfix/BRANCH.txt
git rev-parse --short HEAD | tee -a release-evidence/february-live/hotfix/BRANCH.txt
Must match branch_after on the new exception row.
H3 — Godot Config + footer
Project → Project Settings → Application → Config → Version = fest-demo-2027-02-hotfix3 (same as build_label_after).
$BuildLabel.text = "%s (%s)" % [
ProjectSettings.get_setting("application/config/version"),
Engine.get_version_info().get("string", "godot")
]
Rebuild the player after Config change—Editor Play is not depot proof (Guide #41 H3).
H4 — exported label capture
release-evidence/february-live/hotfix/HOTFIX-003_label_capture.png
Launch the exported binary; capture main menu / pause HUD. Paste path into exception row label_screenshot.
H5 — same-day smoke
Run Wednesday smoke (or live-week smoke) against this HOTFIX binary same UTC calendar day. Record smoke receipt on the exception row.
H6 — receipts + BUILD_RECEIPT
Refresh list receipt gates; file Godot mini-receipt; promote BUILD_RECEIPT:
{
"schema": "godot_hotfix_visible_label_receipt_v1",
"build_label": "fest-demo-2027-02-hotfix3",
"hotfix_id": "HOTFIX-003",
"branch": "fest-demo-2027-02-hotfix3",
"project_version": "fest-demo-2027-02-hotfix3",
"label_screenshot": "release-evidence/february-live/hotfix/HOTFIX-003_label_capture.png",
"hotfix_list_receipt": "release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json",
"smoke_same_day": true,
"cousin_receipts": {
"hotfix_exception_list": "release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json",
"vdf_line_ending": "release-evidence/steam/VDF_LINE_ENDING_RECEIPT.json"
},
"gates": {
"H1_seq": "pass",
"H2_branch": "pass",
"H3_godot_version": "pass",
"H4_screenshot": "pass",
"H5_smoke": "pass",
"H6_crosswalk": "pass"
},
"godot_hotfix_label_ok": true
}
Pin at release-evidence/february-live/GODOT_HOTFIX_VISIBLE_LABEL_RECEIPT.json.
Fail-closed verify
#!/usr/bin/env bash
# verify_hotfix_label_milestone.sh
set -euo pipefail
LIST="${1:-release-evidence/february-live/HOTFIX_EXCEPTION_LIST_RECEIPT.json}"
GODOT="${2:-release-evidence/february-live/GODOT_HOTFIX_VISIBLE_LABEL_RECEIPT.json}"
BR="${3:-release-evidence/BUILD_RECEIPT.json}"
./scripts/verify_hotfix_exception_list.sh "$LIST"
jq -e '.godot_hotfix_label_ok == true' "$GODOT"
jq -e '.exceptions[-1].label_screenshot | length > 0' "$LIST"
LABEL="$(jq -r '.exceptions[-1].build_label_after' "$LIST")"
jq -e --arg L "$LABEL" '.project_version == $L and .build_label == $L' "$GODOT"
jq -e '.hotfix_exception_list_ok == true and .hotfix_label_ok == true' "$BR"
echo "hotfix_label milestone: OK"
Promote BUILD_RECEIPT only when exit 0:
jq -e '.hotfix_label_ok == true' BUILD_RECEIPT.json
Thursday row review lists hotfix_label_ok under February Live Ops. After VDF edits on Windows, re-check Lesson 269 LF discipline before steamcmd.
Scope constraints (honest limits)
- Does not replace list policy—HOTFIX opinion still owns when a fix is a HOTFIX vs post-fest defer.
- Does not fix depot mismatch after wrong live bytes—Lesson 278 / Help #38.
- Godot-shaped paint; other engines keep the same receipt fields with their footer APIs.
- Unity hourly J3 must still see matching
hotfix_id—label alone is not hourly ops.
Key takeaways
- HOTFIX-00N before export—never reverse H1/H3.
- Exported binary screenshot only—Editor Play is theater.
- Guide #41 = ninety-second paint; 279 = BUILD_RECEIPT
hotfix_label_ok. hotfix_exception_list_okandhotfix_label_okare cousin columns—latch both.- Same-day Wednesday smoke is H5.
- Help #41 owns blocked-setlive recovery.
- Capstone 283 will wire 277–282—keep schemas separate.
- Next lesson 280 owns Unity hourly jsonl—not HOTFIX labels.
verify_hotfix_label_milestone.shgives CI one exit code.- Visible label opinion explains why players need the string.
Common mistakes
- Flipping
hotfix_label_okwithout H4 PNG path. - Reusing SHIP-00N mid-fest.
- Bumping Git branch only—Config Version still
rc2. - Smoke from previous RC binary.
- Skipping VDF LF after editing
app_build_*.vdf.
Troubleshooting
| Symptom | Lane |
|---|---|
| CI blocks setlive on list gate | Help #41 |
| Label blank in export | Guide #41 H3 Autoload / re-export |
| Discord cites wrong build | H4 screenshot missing |
| Seq gap | Insert missing HOTFIX-00N |
| jq hourly J3 fail | Match hotfix_id to list id |
| steamcmd parse after VDF edit | Lesson 269 |
Mini exercise (40 minutes)
- Reserve next HOTFIX-00N (H1).
- Checkout branch; record BRANCH.txt (H2).
- Bump Godot Version + footer; export (H3).
- Screenshot exported label; attach path (H4).
- Run same-day smoke (H5).
- File Godot + list receipts, run verify, promote BUILD_RECEIPT for Thursday review.
Continuity — February 2027 live week ops (277–283)
| Lesson | Receipt focus |
|---|---|
| 277 | OBS February pager clip |
| 278 | Fest-day setlive depot manifest |
| 279 (this) | Godot HOTFIX visible build label |
| 280 | Unity hourly live-ops jsonl |
Previous: Lesson 278 — fest-day setlive depot manifest
Next: Lesson 280 — Unity February fest live-ops hourly jsonl
FAQ
Same as Guide #41?
Guide = ninety-second Godot paint; 279 = BUILD_RECEIPT hotfix_label_ok + list crosswalk verify.
Same as Help #41?
Help = recovery when setlive is already blocked; 279 = prevention milestone before you queue SteamPipe.
Same as Lesson 278?
278 = depot build ID; 279 = HOTFIX player-visible identity.
Unity team—skip Godot Config?
Keep the receipt fields; swap H3 for your Application.version / footer path.
Can we ship without smoke if Discord is screaming?
Document a waiver and keep setlive_allowed / promotion false until H5—do not fake hotfix_label_ok.
Related GamineAI reads
- Godot HOTFIX visible label preflight (Guide #41)
- HOTFIX exception opinion
- HOTFIX blocked without hotfix_exception_list_ok
- Visible build label opinion
- Wednesday demo smoke
- Lesson 269 — VDF LF steamcmd
- jq February hourly
- Thursday BUILD_RECEIPT row review
Sign-off: Reserve HOTFIX-00N, paint Godot version + footer, screenshot the export, smoke same day, crosswalk the list receipt, promote hotfix_label_ok—then keep hourly ops for Lesson 280.