Lesson 283: February Live-Ops Truth Capstone Receipt on BUILD_RECEIPT (2026)
Direct answer: February 2027 live week latches when february_live_ops_truth_capstone_v1.json links six child receipts from Lessons 277–282, proves one expected_build_label across pager clips, setlive, HOTFIX label, hourly jsonl, moderation webhook, and hour-one funnel, and points to Sunday closeout plus November closeout 276 so Monday debrief is not “six GREEN Discord threads, prior arcs unknown.”

Why this matters now (Sunday closeout before Monday debrief)
February 2027 producers filed six live-ops receipts—OBS pager, GameMaker setlive, Godot HOTFIX label, Unity hourly jsonl, Construct moderation webhook, hour-one funnel CSV—but partners still ask: “Is fest-demo-2027-02-rc3 safe to hand to Monday facilitator debrief?” Sunday closeout row review and Thursday BUILD_RECEIPT review need one February Live-Ops Capstone section—not six Slack pins.
This lesson closes arc 277–283 (same wiring pattern as Lesson 276 November closeout). Run verify_february_live_ops_capstone.sh before flipping february_live_ops_truth_ok. Pair jq hourly truth on the same expected_build_label—do not invent a second hourly schema.
Beginner path (75-minute capstone audit)
| Step | Action | Success check |
|---|---|---|
| 1 | Collect six receipt paths from Lessons 277–282 | Files exist |
| 2 | Verify same build_label / expected_build_label |
Crosswalk GREEN |
| 3 | Confirm OBS pager clip | Lesson 277 |
| 4 | Confirm setlive allowed | Lesson 278 |
| 5 | Confirm HOTFIX visible label | Lesson 279 |
| 6 | Confirm hourly live-ops jsonl | Lesson 280 |
| 7 | Confirm moderation webhook | Lesson 281 |
| 8 | Confirm hour-one funnel snapshot | Lesson 282 |
| 9 | Link Sunday closeout + November 276 pointers | Prior truth on disk |
| 10 | Run verify_february_live_ops_capstone.sh |
Exit 0 |
| 11 | File february_live_ops_truth_capstone_v1.json |
F1–F11 pass |
Time: ~75 minutes when child lessons done; ~90 minutes first full February audit.
Prerequisites: Lessons 277–282 receipts GREEN (or honest deferred_children[]); ImageMagick/jq not required beyond verify script; write access to release-evidence/capstone/.
Developer path (gates F1–F11)
| Gate | Check | Fail when |
|---|---|---|
| F1 | february_pager_clip_receipt_v1 + february_pager_clip_ok |
Pager clip missing / hash crosswalk RED (Lesson 277) |
| F2 | fest_day_setlive_recovery_receipt_v1 + setlive_allowed |
Depot/build-ID mismatch (Lesson 278) |
| F3 | HOTFIX list + hotfix_label_ok |
Visible label screenshot missing (Lesson 279) |
| F4 | february_fest_live_ops_receipt_v1 + february_fest_live_ops_hourly_ok |
Hourly jsonl without build_label (Lesson 280) |
| F5 | fest_moderation_webhook_receipt_v1 + fest_moderation_webhook_ok |
Webhook URL drift after thread rename (Lesson 281) |
| F6 | hour_one_funnel_snapshot_receipt_v1 + hour_one_funnel_snapshot_ok |
Funnel rates invented by hand (Lesson 282) |
| F7 | Sunday closeout receipt / post_fest_debrief_allowed path |
Closeout skipped; Monday debrief starts blind (Sunday ritual) |
| F8 | November capstone pointer 276 on disk | February without prior closeout truth |
| F9 | expected_build_label matches all six children |
Label drift across engines |
| F10 | verify_february_live_ops_capstone.sh exit 0 |
jq / path mismatch |
| F11 | Capstone JSON filed; BUILD_RECEIPT february_live_ops_truth_ok |
Boolean flipped without verify |
Cross-cutting (required before february_live_ops_truth_ok: true): verify exit 0; all six children share expected_build_label; post_fest_debrief_allowed only after Sunday C gates—not from this capstone alone inventing debrief permission.
Child receipt crosswalk
| Lesson | Receipt schema | Typical path | Pass field |
|---|---|---|---|
| 277 | february_pager_clip_receipt_v1 |
release-evidence/playtest/pager/FEBRUARY_PAGER_CLIP_RECEIPT.json |
february_pager_clip_ok |
| 278 | fest_day_setlive_recovery_receipt_v1 |
release-evidence/steam/setlive/FEST_DAY_SETLIVE_RECOVERY_RECEIPT.json |
setlive_allowed / fest_day_setlive_recovery_ok |
| 279 | godot_hotfix_visible_label_receipt_v1 + list |
release-evidence/steam/hotfix/GODOT_HOTFIX_VISIBLE_LABEL_RECEIPT.json |
hotfix_label_ok |
| 280 | february_fest_live_ops_receipt_v1 |
release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json |
february_fest_live_ops_hourly_ok |
| 281 | fest_moderation_webhook_receipt_v1 |
release-evidence/discord/FEST_MODERATION_WEBHOOK_RECEIPT.json |
fest_moderation_webhook_ok |
| 282 | hour_one_funnel_snapshot_receipt_v1 |
release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json |
hour_one_funnel_snapshot_ok |
Order note: 278 setlive before trusting live branch traffic; 279 HOTFIX only with numbered exception list; 280 hourly feeds Sunday annex; 282 funnel before stand-up debates store copy; 281 webhook before P0 Discord nights.
february_live_ops_truth_capstone_v1.json
{
"schema": "february_live_ops_truth_capstone_v1",
"expected_build_label": "fest-demo-2027-02-rc3",
"arc_lessons": ["277", "278", "279", "280", "281", "282", "283"],
"receipts": {
"277": "february_pager_clip_receipt_v1.json",
"278": "fest_day_setlive_recovery_receipt_v1.json",
"279": "godot_hotfix_visible_label_receipt_v1.json",
"280": "february_fest_live_ops_receipt_v1.json",
"281": "fest_moderation_webhook_receipt_v1.json",
"282": "hour_one_funnel_snapshot_receipt_v1.json"
},
"receipt_paths": {
"277": "release-evidence/playtest/pager/FEBRUARY_PAGER_CLIP_RECEIPT.json",
"278": "release-evidence/steam/setlive/FEST_DAY_SETLIVE_RECOVERY_RECEIPT.json",
"279": "release-evidence/steam/hotfix/GODOT_HOTFIX_VISIBLE_LABEL_RECEIPT.json",
"280": "release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json",
"281": "release-evidence/discord/FEST_MODERATION_WEBHOOK_RECEIPT.json",
"282": "release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json"
},
"prior_arc_pointers": {
"276": "release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json",
"sunday_closeout": "release-evidence/february-live/FEBRUARY_FEST_CLOSEOUT_RECEIPT.json"
},
"gates": {
"F1_pager_clip": "pass",
"F2_setlive_allowed": "pass",
"F3_hotfix_label": "pass",
"F4_hourly_jsonl": "pass",
"F5_moderation_webhook": "pass",
"F6_hour_one_funnel": "pass",
"F7_sunday_closeout": "pass",
"F8_november_pointer": "pass",
"F9_build_label_crosswalk": "pass",
"F10_verify_script": "pass",
"F11_capstone_filed": "pass"
},
"february_live_ops_truth_ok": true,
"post_fest_debrief_ready": true
}
Pin under release-evidence/capstone/FEBRUARY_LIVE_OPS_TRUTH_CAPSTONE.json. Align Sunday pointer fields with Sunday closeout—do not invent a second closeout schema.
Verify before BUILD_RECEIPT flip
#!/usr/bin/env bash
# scripts/verify_february_live_ops_capstone.sh
set -euo pipefail
CAP="${1:-release-evidence/capstone/FEBRUARY_LIVE_OPS_TRUTH_CAPSTONE.json}"
jq -e '.schema == "february_live_ops_truth_capstone_v1"' "$CAP"
LABEL=$(jq -r '.expected_build_label' "$CAP")
for key in 277 278 279 280 281 282; do
path=$(jq -r --arg k "$key" '.receipt_paths[$k]' "$CAP")
test -f "$path"
child_label=$(jq -r '.build_label // .expected_build_label // empty' "$path")
if [[ -n "$child_label" && "$child_label" != "$LABEL" ]]; then
echo "FAIL: label mismatch $key ($child_label != $LABEL)" >&2
exit 2
fi
done
test -f "$(jq -r '.prior_arc_pointers["276"]' "$CAP")"
test -f "$(jq -r '.prior_arc_pointers.sunday_closeout' "$CAP")"
jq -e '.february_live_ops_truth_ok == true' "$CAP"
echo "february_live_ops_capstone verify: OK"
./scripts/verify_february_live_ops_capstone.sh \
release-evidence/capstone/FEBRUARY_LIVE_OPS_TRUTH_CAPSTONE.json
jq -e '.february_live_ops_truth_ok == true' \
release-evidence/capstone/FEBRUARY_LIVE_OPS_TRUTH_CAPSTONE.json
Exit 0 is required before Sunday closeout lists the February Live-Ops Capstone row as GREEN for Monday facilitator handoff.
BUILD_RECEIPT capstone row
| Column | Source |
|---|---|
february_pager_clip_ok |
Lesson 277 |
setlive_allowed |
Lesson 278 |
hotfix_label_ok |
Lesson 279 |
february_fest_live_ops_hourly_ok |
Lesson 280 |
fest_moderation_webhook_ok |
Lesson 281 |
hour_one_funnel_snapshot_ok |
Lesson 282 |
february_live_ops_truth_ok |
This lesson |
november_closeout_ok (pointer) |
Lesson 276 |
post_fest_debrief_allowed (cousin) |
Sunday closeout ritual |
CI verify_february_live_ops_capstone fails when february_live_ops_truth_ok is false and Monday debrief flag is set.
Key takeaways
- Capstone = wiring Lessons 277–282—not re-running OBS, setlive, or funnel CSV from scratch.
expected_build_labeljoins pager, Steam, Godot HOTFIX, Unity hourly, Discord, and analytics rows.- Verify first —
verify_february_live_ops_capstone.shbefore Boolean flip. - Sunday closeout owns C1–C10 ritual; 283 owns BUILD_RECEIPT milestone JSON.
- 276 November still required—February live-ops does not erase prior closeout truth.
- jq hourly stays the per-hour sketch—capstone does not replace it.
- March debrief starts at Lesson 284—do not merge facilitator-card schema into this file.
- Multi-engine studios keep 278 setlive, 279 HOTFIX, and 280 hourly as separate columns.
- Guide preflights #38–#42 / Construct #39 are ninety-second gates; 283 is promotion wiring.
- Thursday review lists 277–282 in one February Live Ops section.
- Honest
deferred_children[]beats fake GREEN when one lane is mid-recovery (Help #39–#41 cousins). - February arc 277–283 closed — March runway starts at Lesson 284.
Common mistakes
- Filing capstone while 280 RED but stand-up declared GREEN from screenshots.
- Setting
post_fest_debrief_allowedwithout Sunday closeout C gates. - Skipping 276 because “February already covers ops.”
- Merging
february_live_ops_truth_capstone_v1intonovember_closeout_capstone_v1or March sprint schemas. - Promoting with one child deferred and no honesty row.
Troubleshooting
| Symptom | Lane |
|---|---|
| One child RED | Open that lesson / Help cousin; do not waive in capstone JSON |
build_label mismatch |
Re-export child on correct label; re-run verify |
| Sunday closeout missing | Sunday ritual |
| November pointer missing | Lesson 276 |
| Smoke RED, capstone GREEN | Wednesday smoke—separate gate |
| verify exit 2 | Fix child build_label / path table |
Mini exercise (80 minutes)
- Collect six receipt paths; confirm each pass field GREEN.
- Run
./scripts/verify_february_live_ops_capstone.sh. - Link 276 + Sunday closeout paths.
- Intentionally omit 282—confirm capstone promotion blocked.
- Restore 282; file
february_live_ops_truth_capstone_v1.json. - Add BUILD_RECEIPT February Live-Ops Capstone row for Thursday / Sunday review.
Continuity — February 2027 live week ops (277–283)
| Lesson | Receipt focus |
|---|---|
| 277 | OBS February pager clip |
| 278 | Fest-day setlive depot |
| 279 | Godot HOTFIX visible label |
| 280 | Unity hourly live-ops jsonl |
| 281 | Discord moderation webhook |
| 282 | Hour-one funnel snapshot CSV |
| 283 (this) | February live-ops truth capstone |
| Arc | Lessons | Capstone |
|---|---|---|
| November close-out | 266–276 | 276 |
| February live week | 277–283 | 283 (this) |
| March debrief + October prep | 284–288 | Lesson 288 forward |
Previous: Lesson 282 — Hour-one funnel snapshot CSV
Next: Lesson 284 — Post-fest debrief facilitator card
FAQ
Does 283 replace Sunday closeout?
No—Sunday owns C1–C10 ritual; 283 wires 277–282 receipt columns for BUILD_RECEIPT.
Can we skip 276 if 277–282 are GREEN?
No—276 documents November closeout truth; February adds live-week honesty lanes.
Is jq hourly enough without this lesson?
Hourly sketch owns per-hour append; 283 owns the six-child promotion latch.
Is 283 the last February lesson?
Yes for 277–283 live week; March starts at Lesson 284 when shipped.
Same as November 276?
Same wiring pattern, different children and Sunday pointer—do not reuse november_closeout_capstone_v1 schema.
Where to go next
- Child lessons: 277 through 282
- Sunday ritual: February fest closeout row review
- Hourly sketch: jq February live-ops hourly
- November cousin: Lesson 276
- Thursday review: BUILD_RECEIPT row review
- March next: Lesson 284 facilitator card (Guide #43 / Help #42)
Live week lies when six lanes are GREEN in chat but unlinked on disk—crosswalk 277–282, point at Sunday + November, verify, then latch february_live_ops_truth_ok before Monday debrief.