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.

Lesson hero for GameMaker fest-day setlive depot BUILD_RECEIPT receipt

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

  1. RC GREEN ≠ live depot—audit Steamworks build ID.
  2. setlive_depot_manifest_audit_v1 is the prevention evidence row.
  3. Prevention uses fest_day_setlive_recovery_receipt_v1 with mode: prevention.
  4. Guide #42 = ninety-second gate; 278 = BUILD_RECEIPT column.
  5. Lesson 270 dry-run is cousin S5—never skip.
  6. Case study owns recovery narrative; 278 owns prevent-before-promote.
  7. Capstone 283 will wire 277–282—keep schemas separate.
  8. Next lesson 279 owns HOTFIX visible labels—not depot IDs.
  9. verify_fest_day_setlive_prevention.sh gives CI one exit code.
  10. Pager P2 still diffs after promote.

Common mistakes

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

  1. Lock identical build_label on RC + BUILD_RECEIPT (S1).
  2. Screenshot Steamworks live build ID (S2).
  3. File setlive_depot_manifest_audit_v1.json (S3).
  4. Capture footer for that package (S4).
  5. Confirm setlive_dry_run_ok (S5).
  6. 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


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.