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.

Lesson hero for Godot February HOTFIX visible build label BUILD_RECEIPT receipt

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

  1. HOTFIX-00N before export—never reverse H1/H3.
  2. Exported binary screenshot only—Editor Play is theater.
  3. Guide #41 = ninety-second paint; 279 = BUILD_RECEIPT hotfix_label_ok.
  4. hotfix_exception_list_ok and hotfix_label_ok are cousin columns—latch both.
  5. Same-day Wednesday smoke is H5.
  6. Help #41 owns blocked-setlive recovery.
  7. Capstone 283 will wire 277–282—keep schemas separate.
  8. Next lesson 280 owns Unity hourly jsonl—not HOTFIX labels.
  9. verify_hotfix_label_milestone.sh gives CI one exit code.
  10. Visible label opinion explains why players need the string.

Common mistakes

  • Flipping hotfix_label_ok without 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)

  1. Reserve next HOTFIX-00N (H1).
  2. Checkout branch; record BRANCH.txt (H2).
  3. Bump Godot Version + footer; export (H3).
  4. Screenshot exported label; attach path (H4).
  5. Run same-day smoke (H5).
  6. 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


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.