Lesson 278: GameMaker Fest-Day setlive Depot Manifest Receipt on BUILD_RECEIPT (2026)
Direct answer: Before February 2027 live-week production setlive, promote a prevention fest_day_setlive_recovery_receipt_v1.json with S1–S6 gates—RC + BUILD_RECEIPT label lock, Steamworks depot/branch build ID screenshot, ContentBuilder crosswalk (setlive_depot_manifest_audit_v1.json), player-visible footer, dry-run latch, and BUILD_RECEIPT setlive_allowed: true. Pair fest-day depot audit (Guide #42), setlive mismatch case study, cousin Lesson 270, and Help #38 forward.

Why this matters now (February 2027 live week)
February 2027 fest day two: BUILD_RECEIPT says fest-demo-2027-02-rc2, RC label is GREEN, and players still boot rc1 because the live Steamworks build ID never moved. Lesson 270 proves branch SetLive string; 278 proves depot manifest build ID ↔ intended label so CI blocks promote until audit GREEN.
Lesson 277 wired pager clips; 278 wires fest-day setlive truth. Guide #42 is the ninety-second gate—278 is the BUILD_RECEIPT milestone.
Promotion order on BUILD_RECEIPT: gm_steam_partner_ok (262) → setlive_dry_run_ok (270) → setlive_allowed (278 prevention) → production setlive → Wednesday smoke.
Beginner path (screenshot → audit → promote)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm RC + BUILD_RECEIPT same build_label |
S1 |
| 2 | Screenshot Steamworks live build ID on fest branch | S2 |
| 3 | Match ID to ContentBuilder upload for that label | S3 |
| 4 | Capture player-visible footer on that package | S4 |
| 5 | Confirm Lesson 270 dry-run still GREEN | S5 |
| 6 | File prevention receipt + BUILD_RECEIPT | setlive_allowed: true |
Time: ~45 minutes first live promote; ~12 minutes when Guide #42 template exists.
Common mistake: Skipping S3 because branch name matched dry-run—branch string ≠ depot bytes.
Developer path (gates S1–S6)
| Gate | Check | Fail when |
|---|---|---|
| S1 | Intended label lock | RC ≠ BUILD_RECEIPT |
| S2 | Manifest screenshot | No live build ID evidence |
| S3 | Build ID crosswalk | Live ID is stale rc1 |
| S4 | Visible label spot | Footer ≠ intended string |
| S5 | Dry-run latch | setlive_dry_run_ok false / label drift |
| S6 | Prevention receipt | Bool flipped without verify |
Cousin receipt crosswalk
| Field | Cousin (270 dry-run) | Cousin (262 partner) | This lesson (278) |
|---|---|---|---|
| Schema | gm_steam_setlive_dry_run_receipt_v1 |
gm_steam_partner_receipt_v1 |
fest_day_setlive_recovery_receipt_v1 (mode: prevention) |
| Scope | SetLive branch string | Who may upload | Depot build ID vs intended label |
| BUILD_RECEIPT | setlive_dry_run_ok |
gm_steam_partner_ok / depot_upload_allowed |
setlive_allowed |
| Path | …/gamemaker-setlive/ |
…/steam/ |
…/fest-day-setlive/ |
Do not merge schemas—link paths in cousin_receipts only. If live mismatch already exists, follow case study recovery (Help #38 forward)—do not fake prevention GREENS.
S1 — lock intended build_label
jq -r '.build_label' release-evidence/BUILD_RECEIPT.json
jq -r '.build_label' release-evidence/steam/FEBRUARY_RC_BRANCH_LABEL_RECEIPT.json
Must match before any Steamworks audit.
S2–S3 — manifest audit JSON
{
"schema": "setlive_depot_manifest_audit_v1",
"fest_window": "2027-02-next-fest-live",
"intended_build_label": "fest-demo-2027-02-rc2",
"intended_steam_build_id": "18492031",
"observed_live_steam_build_id": "18492031",
"mismatch_confirmed": false,
"audit_mode": "prevention"
}
Pin at release-evidence/steam/fest-day-setlive/setlive_depot_manifest_audit_v1.json.
S4 — visible label
Screenshot GameMaker player footer / version for the package tied to intended_steam_build_id. Pair visible label opinion when Discord claims a fix that players cannot name.
S5 — dry-run cousin
jq -e '.setlive_dry_run_ok == true' \
release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
Re-run Lesson 270 / dry-run Guide if RED.
S6 — fest_day_setlive_recovery_receipt_v1 (prevention)
{
"schema": "fest_day_setlive_recovery_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"fest_day_detected": "D1",
"mode": "prevention",
"intended_build_label": "fest-demo-2027-02-rc2",
"observed_player_label_before": "fest-demo-2027-02-rc2",
"observed_player_label_after": "fest-demo-2027-02-rc2",
"manifest_audit": "release-evidence/steam/fest-day-setlive/setlive_depot_manifest_audit_v1.json",
"dry_run_receipt": "release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json",
"cousin_receipts": {
"gm_steam_partner": "release-evidence/steam/GM_STEAM_PARTNER_RECEIPT.json",
"gm_setlive_dry_run": "release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json"
},
"gates": {
"S1_label_lock": "pass",
"S2_manifest_shot": "pass",
"S3_build_id_crosswalk": "pass",
"S4_visible_label": "pass",
"S5_dry_run_latch": "pass",
"S6_prevention_receipt": "pass"
},
"mismatch_confirmed": false,
"setlive_allowed": true,
"fest_day_setlive_recovery_ok": true
}
Pin at release-evidence/steam/fest-day-setlive/FEST_DAY_SETLIVE_PREVENTION_RECEIPT.json.
Fail-closed verify
#!/usr/bin/env bash
# verify_fest_day_setlive_prevention.sh
set -euo pipefail
REC="${1:-release-evidence/steam/fest-day-setlive/FEST_DAY_SETLIVE_PREVENTION_RECEIPT.json}"
AUD="${2:-release-evidence/steam/fest-day-setlive/setlive_depot_manifest_audit_v1.json}"
jq -e '.schema == "fest_day_setlive_recovery_receipt_v1"' "$REC"
jq -e '.mode == "prevention"' "$REC"
jq -e '.mismatch_confirmed == false' "$REC"
jq -e '.setlive_allowed == true' "$REC"
jq -e '.mismatch_confirmed == false' "$AUD"
jq -e '.intended_steam_build_id == .observed_live_steam_build_id
or .observed_live_steam_build_id == null' "$AUD"
echo "fest_day_setlive prevention: OK"
Promote BUILD_RECEIPT only when exit 0:
jq -e '.setlive_allowed == true' BUILD_RECEIPT.json
Thursday row review lists setlive_allowed under February Live Ops.
Scope constraints (honest limits)
- Does not replace Lesson 270 dry-run—S5 requires it.
- Does not fix live mismatch already serving wrong bytes—use case study / Help #38.
- SteamPipe queue waits are a separate lane after S3 GREEN (observability tools).
- CDN lag can delay bytes with the same label; S3 still requires intended ID assigned to the branch.
Key takeaways
- RC GREEN ≠ live depot—audit Steamworks build ID.
setlive_depot_manifest_audit_v1is the prevention evidence row.- Prevention uses
fest_day_setlive_recovery_receipt_v1withmode: prevention. - Guide #42 = ninety-second gate; 278 = BUILD_RECEIPT column.
- Lesson 270 dry-run is cousin S5—never skip.
- Case study owns recovery narrative; 278 owns prevent-before-promote.
- Capstone 283 will wire 277–282—keep schemas separate.
- Next lesson 279 owns HOTFIX visible labels—not depot IDs.
verify_fest_day_setlive_prevention.shgives CI one exit code.- Pager P2 still diffs after promote.
Common mistakes
- Flipping
setlive_allowedwithout manifest audit. - Matching branch name only (270) while live ID is stale.
- Editing an old recovery JSON instead of a new prevention file.
- Promoting before footer S4 because Discord wants speed.
- Treating queue delay as root cause when S3 is RED.
Troubleshooting
| Symptom | Lane |
|---|---|
| Live ID ≠ intended | Case study / Help #38 |
| SetLive string drift | Lesson 270 |
| Wrong partner login | Lesson 262 |
| Footer ≠ label | Visible label opinion |
| Queue after S3 GREEN | SteamPipe tools |
Mini exercise (45 minutes)
- Lock identical
build_labelon RC + BUILD_RECEIPT (S1). - Screenshot Steamworks live build ID (S2).
- File
setlive_depot_manifest_audit_v1.json(S3). - Capture footer for that package (S4).
- Confirm
setlive_dry_run_ok(S5). - File prevention receipt, 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 (this) | Fest-day setlive depot manifest |
| 279 | HOTFIX visible label |
Previous: Lesson 277 — OBS February pager clip receipt
Next: Lesson 279 — Godot February HOTFIX visible build label receipt
FAQ
Same as Guide #42?
Guide = ninety-second S1–S6 preflight; 278 = BUILD_RECEIPT setlive_allowed + promotion verify.
Same as Lesson 270?
270 = branch dry-run string; 278 = depot build-ID audit before promote.
Same as the mismatch case study?
Case study = recovery after wrong live bytes; 278 = prevention so recovery never starts.
Can we skip when Steamworks UI looks right?
No—file audit JSON; UI screenshots without ID crosswalk fail S3.
Does setlive_allowed replace Wednesday smoke?
No—smoke proves installed player truth after promote.
Related GamineAI reads
- Fest-day depot manifest audit (Guide #42)
- Fest-day setlive mismatch case study
- setlive branch dry-run preflight
- Lesson 270 — setlive dry-run receipt
- Lesson 262 — Steam partner receipt
- 12 steamcmd setlive preflight checks
- Thursday BUILD_RECEIPT row review
Sign-off: Lock labels, audit Steamworks build ID, latch dry-run, file prevention fest_day_setlive_recovery_receipt_v1, promote setlive_allowed—then keep HOTFIX labels for Lesson 279.