jq Gate Sketch for february_fest_live_ops_receipt_v1.json Hourly BUILD_RECEIPT Row Diff - 2026

February 2027 live week, hour six: Pager P2 shows build_label drift, hour-one funnel went YELLOW, and someone asks “did we already file queue receipt?” Nobody ran jq since yesterday’s Thursday row review—that ritual is weekly, not hourly.
Live fest needs february_fest_live_ops_receipt_v1.json appended each hour with a honest row_diff[] against the prior snapshot—same discipline as BUILD_RECEIPT truth, compressed for stand-ups.
This Programming & Technical sketch ships february_fest_live_ops_receipt_v1.json, verify_february_live_ops.sh, gates J1–J6, copy-paste jq for CI and facilitator laptops—strategy above per-evening tutorials, below Course 280 forward and Guide #40 forward.
Non-repetition note: January reentry jq pointer owns pre-live capstone crosswalk. November crosswalk owns child receipt unity. Thursday row review owns weekly ten-minute diff. This URL owns hourly live-week february_fest_live_ops row diff jq.
Pair 5-night pager challenge, February timebox, queue wall-clock playbook, stream overlay O pass.
Why this matters now (February 2027 live week)
- Hourly drift —
build_label, funnel rates, and queue receipts change between stand-ups—not only on Wednesdays. - Pager P2 without diff — Nightly challenge diffs columns; hourly receipt stores the proof path.
- Cluster receipts — Timebox, funnel, queue, overlay, and pager each own files—hourly receipt indexes them.
- HOTFIX noise — Without jq, teams debate whether drift is new or already filed.
- Sunday closeout — Forward #11 needs hourly jsonl trail—not reconstructed from Discord.
Direct answer: Append hourly rows to february_fest_live_ops_hourly_log.jsonl, file february_fest_live_ops_receipt_v1.json with row_diff[], run verify_february_live_ops.sh, gates J1–J6, set BUILD_RECEIPT february_fest_live_ops_hourly_ok: true before declaring stand-up GREEN.
Who this sketch is for
| Audience | You will… |
|---|---|
| Beginner | Copy bash + jq one-liners; read exit table |
| Facilitator | Paste hourly diff into #fest-live-ops |
| Engineer | Wire CI cron every 60 minutes during D1–D7 |
| Producer | Block HOTFIX comms until J4 passes |
Time: ~40 minutes first hourly template; ~90 seconds per hour after scripts pinned.
Mental model — hourly receipt vs weekly row review
| Cadence | Artifact | Proves |
|---|---|---|
| Weekly | Thursday row review | Ten-minute BUILD_RECEIPT column diff |
| Nightly | Pager P1–P5 | Ritual completion per fest night |
| Hourly | february_fest_live_ops_receipt_v1.json |
Snapshot + row_diff[] vs prior hour |
| BUILD_RECEIPT | Root row | february_fest_live_ops_hourly_ok |
Rule: Hourly jq does not replace Thursday review—it feeds Sunday closeout and pager P2 with timestamped deltas.
february_fest_live_ops_receipt_v1.json (schema)
{
"schema": "february_fest_live_ops_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"fest_day": "D3",
"hour_utc": "2027-02-24T18:00:00Z",
"build_label": "fest-demo-2027-02-rc2",
"snapshot": {
"fest_live_timebox_ok": true,
"hour_one_funnel_receipt": "release-evidence/funnel/HOUR_ONE_FUNNEL_SNAPSHOT.json",
"february_live_queue_wall_clock_ok": true,
"fest_stream_overlay_safe_zone_ok": true,
"february_live_ops_challenge_night": "N3",
"pager_build_label": "fest-demo-2027-02-rc2"
},
"row_diff": [
{"field": "hour_one_launch_rate", "before": 0.41, "after": 0.38, "delta": -0.03},
{"field": "build_label", "before": "fest-demo-2027-02-rc2", "after": "fest-demo-2027-02-rc2", "delta": "unchanged"},
{"field": "february_live_queue_wall_clock_ok", "before": true, "after": true, "delta": "unchanged"}
],
"gates": {
"J1_schema": "pass",
"J2_prior_hour": "pass",
"J3_build_label_policy": "pass",
"J4_snapshot_paths": "pass",
"J5_row_diff_honest": "pass",
"J6_receipt_filed": "pass"
},
"february_fest_live_ops_hourly_ok": true
}
Hourly log (jsonl)
release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl — one line per hour:
{"hour_utc":"2027-02-24T17:00:00Z","fest_day":"D3","build_label":"fest-demo-2027-02-rc2","february_fest_live_ops_hourly_ok":true,"receipt_path":"release-evidence/february-live/FEbruary_LIVE_OPS_RECEIPT_1700.json"}
Gates J1–J6
| Gate | Check | Pass when |
|---|---|---|
| J1 | Schema + fest_window | schema == february_fest_live_ops_receipt_v1 |
| J2 | Prior hour in jsonl | Previous line exists for same fest_day or documented D1 first hour |
| J3 | build_label policy |
Unchanged OR hotfix_id in notes with exception list forward #10 |
| J4 | Snapshot paths exist | Funnel, queue, overlay paths resolvable on disk |
| J5 | row_diff honest |
Numeric deltas recompute from before/after; no hand-waved zeros |
| J6 | Receipt + verify script | february_fest_live_ops_hourly_ok: true |
J3 fail-closed: build_label change without HOTFIX doc → route setlive case study before gameplay patch.
Gate-by-gate facilitator notes (working dev depth)
J1 — schema and fest_window latch
J1 is not cosmetic naming—it prevents hourly receipts from colliding with January reentry pointer or November crosswalk schemas in the same release-evidence/ folder. Facilitators should fail CI when fest_window drifts from 2027-02-next-fest-live mid-week; that usually means someone copied a January template without renaming.
jq -e '.schema == "february_fest_live_ops_receipt_v1" and .fest_window == "2027-02-next-fest-live"' "$REC"
J2 — prior hour and jsonl continuity
D1 hour one may document prior_hour: null in notes—that is the only waiver. Every other hour must point at the previous jsonl line for the same fest_day. Gaps (skipped stand-ups) fail J2 until backfilled or waived in writing on the receipt.
tail -n 1 release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl | jq -e '.fest_day == "D3"'
J3 — build_label policy and pager coupling
J3 ties directly to Pager P2: nightly diff catches label columns; hourly receipt stores the build_label row for stand-up paste. If label changes, require hotfix_id in notes and forward #10 HOTFIX exception opinion before community posts.
J4 — snapshot path resolution
J4 checks that cluster receipts from #1–#7 exist on disk—not that every gate inside them is GREEN. A YELLOW funnel receipt path is still valid; routing happens via row_diff and pager lanes. Missing files fail J4 and block february_fest_live_ops_hourly_ok.
| Snapshot key | Owning evening tutorial |
|---|---|
fest_live_timebox_ok |
#1 timebox |
hour_one_funnel_receipt |
#2 funnel |
february_live_queue_wall_clock_ok |
#6 queue |
fest_stream_overlay_safe_zone_ok |
#7 overlay |
J5 — row_diff honesty audit
Hand-typed deltas are the fastest way to lose partner trust. Recompute with jq or the Python cousin below; attach recompute output to stand-up thread when facilitators dispute a YELLOW.
J6 — receipt filed + verify script
J6 requires both february_fest_live_ops_hourly_ok: true and verify_february_live_ops.sh exit 0 on the same file. BUILD_RECEIPT root row should mirror the latch—do not flip the bool before verify passes.
jsonl integrity checks (Sunday closeout prep)
Forward #11 Sunday closeout will consume the full jsonl as debrief annex. Run these before fest ends:
# Line count should equal facilitated hours (± documented waivers)
wc -l release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl
# No duplicate hour_utc stamps
jq -s '[.[].hour_utc] | length as $n | unique | length == $n' \
release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl
# build_label stability tail (24h)
tail -n 24 release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl | \
jq -s '[.[].build_label] | unique'
If the unique tail returns more than one label without matching HOTFIX rows in receipts, pause post-fest debrief until setlive case study routing completes.
Beginner path — five-command hourly stand-up
# 1) Latest receipt exists
REC=release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json
test -f "$REC"
# 2) Verify gates
./scripts/verify_february_live_ops.sh "$REC"
# 3) Print build_label drift only
jq -r '.row_diff[] | select(.field=="build_label") | "\(.before) → \(.after)"' "$REC"
# 4) Append to hourly log (facilitator)
jq -c '{hour_utc, fest_day, build_label, february_fest_live_ops_hourly_ok, receipt_path: $rec}' \
--arg rec "$REC" "$REC" >> release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl
# 5) Confirm exit 0
echo $?
Success check: Script prints february_fest_live_ops verify: OK.
Exit code table (snippet-friendly)
| Exit | Meaning | Fix |
|---|---|---|
| 0 | J1–J6 pass | Stand-up GREEN |
| 1 | Wrong schema | Fix february_fest_live_ops_receipt_v1 |
| 2 | Missing fest_day/window | Fill required fields |
| 3 | J3 build_label policy fail | HOTFIX doc or setlive case study |
| 5 | Empty or dishonest row_diff |
Recompute deltas |
| 6 | february_fest_live_ops_hourly_ok false |
Complete child snapshot paths |
Worked example — synthesized D3 hour 18:00 UTC
| Step | Action | Output |
|---|---|---|
| T+0 | Export BUILD_RECEIPT row to now.json |
build_label: rc2 |
| T+2m | Load prior.json from jsonl hour 17:00 |
launch_rate: 0.41 |
| T+5m | jq diff launch_rate | delta -0.03 → funnel YELLOW |
| T+8m | Verify queue + overlay paths on disk | J4 pass |
| T+10m | Write receipt + run verify script | exit 0 |
| T+12m | Append jsonl line | debrief trail updated |
Producer rule: Do not post “investigating gameplay” until J3 confirms label policy—not queue CDN (queue playbook).
CI hourly job sketch (GitHub Actions)
name: february-live-ops-hourly
on:
schedule:
- cron: "0 * * * *" # adjust to fest week window only
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: verify latest receipt
run: |
test -f release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json
bash scripts/verify_february_live_ops.sh release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json
Pin if: to fest dates only—do not run hourly year-round on empty receipts.
jq one-liners (copy-paste)
Diff launch_rate vs prior hour
jq -s '
.[1] as $now | .[0] as $prev |
($now.snapshot.hour_one_launch_rate // null) as $a |
($prev.snapshot.hour_one_launch_rate // null) as $b |
{field:"hour_one_launch_rate", before:$b, after:$a, delta: ($a - $b)}
' prior.json now.json
Flag any changed build_label in jsonl tail
tail -n 24 release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl | \
jq -s '[.[].build_label] | unique | length'
Output 1 means stable label across last 24 hours; 2+ triggers pager P2.
Crosswalk queue + overlay booleans
jq -e '
.snapshot.february_live_queue_wall_clock_ok == true and
.snapshot.fest_stream_overlay_safe_zone_ok == true
' "$REC"
Hourly funnel YELLOW detector
jq -r '
.row_diff[] |
select(.field=="hour_one_launch_rate" and (.delta | tonumber) < -0.03) |
"YELLOW launch_rate \(.delta)"
' "$REC"
Pair hour-one funnel F4 routing.
Python cousin — recompute row_diff for J5 audit
# audit_row_diff.py — compare two snapshot exports
import json, sys
prev, now = json.load(open(sys.argv[1])), json.load(open(sys.argv[2]))
fields = ["hour_one_launch_rate", "hour_one_quit_rate", "build_label"]
for f in fields:
b, a = prev.get(f), now.get(f)
print({"field": f, "before": b, "after": a, "delta": a if f == "build_label" else (a - b)})
Run before filing receipt when facilitators distrust hand-typed deltas.
verify_february_live_ops.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json}"
jq -e '.schema == "february_fest_live_ops_receipt_v1"' "$REC" || exit 1
jq -e '.fest_window != null and .fest_day != null' "$REC" || exit 2
jq -e '.gates.J3_build_label_policy == "pass"' "$REC" || exit 3
jq -e '.row_diff | length >= 1' "$REC" || exit 5
jq -e '.february_fest_live_ops_hourly_ok == true' "$REC" || exit 6
# J5: build_label row must exist
jq -e '.row_diff[] | select(.field=="build_label")' "$REC" >/dev/null || exit 5
echo "february_fest_live_ops verify: OK"
PowerShell verify cousin
$Rec = "release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json"
$j = Get-Content $Rec -Raw | ConvertFrom-Json
if ($j.schema -ne "february_fest_live_ops_receipt_v1") { exit 1 }
if (-not $j.fest_day) { exit 2 }
if ($j.gates.J3_build_label_policy -ne "pass") { exit 3 }
if (-not $j.february_fest_live_ops_hourly_ok) { exit 6 }
Write-Host "february_fest_live_ops verify: OK"
BUILD_RECEIPT wiring
{
"build_label": "fest-demo-2027-02-rc2",
"february_fest_live_ops_hourly_ok": true,
"february_fest_live_ops_receipt": "release-evidence/february-live/FEBRUARY_LIVE_OPS_RECEIPT_LATEST.json",
"february_fest_live_ops_hourly_log": "release-evidence/february-live/february_fest_live_ops_hourly_log.jsonl"
}
Latch order during live week:
- Cluster receipts (timebox T, funnel F, queue Q, overlay O, pager P) filed on their evenings.
- Hourly receipt snapshots their paths—not replaces their gates.
february_fest_live_ops_hourly_okflips true only when J1–J6 pass for that hour.
Integration with February cluster #1–#7
| Row | Hourly snapshot field |
|---|---|
| #1 timebox | fest_live_timebox_ok |
| #2 funnel | hour_one_funnel_receipt + launch_rate in row_diff |
| #3 moderation | moderation_roster_path optional in notes |
| #4 pager | february_live_ops_challenge_night + pager_build_label |
| #5 setlive case study | J3 routes label drift |
| #6 queue playbook | february_live_queue_wall_clock_ok |
| #7 overlay O | fest_stream_overlay_safe_zone_ok |
Facilitator stand-up script (hourly, 5 min)
## Hourly february_fest_live_ops stand-up
- [ ] Run verify_february_live_ops.sh on latest receipt
- [ ] Paste build_label row_diff line to stand-up thread
- [ ] If launch_rate delta YELLOW → pager owns; community holds
- [ ] If queue_ok flipped false → queue playbook Q4 routing
- [ ] Append jsonl line with receipt path
- [ ] Do not declare HOTFIX until J3 pass
Proof table
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | Hourly receipt JSON | J1 pass |
| P2 | jsonl prior line | J2 pass |
| P3 | build_label row_diff | J3 pass |
| P4 | Snapshot path stat | J4 pass |
| P5 | Recomputed delta | J5 pass |
| P6 | verify script exit 0 | J1–J6 pass |
Scenarios A–G
A — First hour D1 — J2 waived with prior_hour: null in notes; still file receipt.
B — launch_rate -0.04 — row_diff triggers funnel YELLOW; pager lane per timebox D4.
C — build_label change with HOTFIX-002 — J3 pass when hotfix_id documented; attach setlive case study if player label diverges.
D — queue_ok false — Snapshot shows queue receipt path; route Q4 without blaming players.
E — overlay_ok false — Block co-stream proof clips until O2 GREEN.
F — Skipped hour — jsonl gap; next hour J2 fail until facilitator backfills or documents waiver.
G — Sunday closeout — Forward #11 consumes full jsonl as debrief annex.
Comparison pack (jq sketches)
| Sketch | Cadence | Schema |
|---|---|---|
| November crosswalk | Pre-holiday | november_closeout_capstone_v1 |
| January pointer | Re-entry | january_reentry_capstone_v1 |
| This sketch | Live hour | february_fest_live_ops_receipt_v1 |
| Thursday review | Weekly | row review ritual (no hourly jsonl) |
Common mistakes
Weekly jq only — Drift happens between Thursdays.
row_diff theater — Hand-entered deltas without recomputation fails J5.
Skipping snapshot paths — Hourly receipt becomes vibes-only JSON.
Replacing child receipts — Snapshot points to funnel/queue files; does not merge schemas.
CI weekly cron — Live week needs hourly job or manual facilitator discipline.
Printable facilitator card
# february_fest_live_ops hourly (pin near #fest-live-ops)
1. prior.json ← last jsonl hour
2. now.json ← BUILD_RECEIPT export
3. jq diff launch_rate + build_label
4. verify_february_live_ops.sh → exit 0
5. append jsonl + post row_diff to stand-up
6. YELLOW launch → pager; GREEN → community holds
Engine / tooling notes
| Tool | Role |
|---|---|
| jq | Primary diff + gate checks |
| bash | verify_february_live_ops.sh |
| Python | Optional J5 recompute audit |
| GitHub Actions | Fest-week hourly cron |
| PowerShell | Windows facilitator verify cousin |
Official jq reference: stedolan.github.io/jq.
Related GamineAI reads
- 5-night pager challenge
- February live week timebox
- Hour-one funnel snapshot
- Queue wall-clock playbook
- Stream overlay O pass
- Thursday row review
- January jq pointer cousin
- Forward: refund spike threshold worksheet (blog #9)
Key takeaways
- Live fest needs hourly BUILD_RECEIPT row diff—not only weekly Thursday review.
february_fest_live_ops_receipt_v1.jsongates J1–J6 with honestrow_diff[].february_fest_live_ops_hourly_log.jsonlfeeds Sunday closeout C7 jsonl annex—#11 consumed.- Snapshot indexes cluster #1–#7 receipts—does not replace their gates.
- J3 routes
build_labeldrift to setlive case study before gameplay HOTFIX. - jq launch_rate delta pairs hour-one funnel YELLOW routing.
verify_february_live_ops.shgives CI one exit code per hour.- Pager P2 nightly diff cousins hourly
build_labelrow. - Course 280 + Guide #40 forward own milestone cousins.
- Refund spike threshold worksheet snapshots
refund_spike_watch_okwhen funnel + refunds diverge—#9 consumed. - Forward #10 HOTFIX exception when J3 needs waiver ID—#10 consumed (HOTFIX list opinion).
- February cluster #12 published—same-day Whisper live-week triage closes February cluster #1–#12.
FAQ
Is this the same as Thursday row review?
No—Thursday is weekly ten-minute ritual; this is hourly jsonl + receipt during D1–D7.
Do we need CI every hour?
Facilitator laptop is enough if jsonl + verify run each stand-up; CI optional.
Can one receipt cover multiple hours?
No—file per hour; jsonl append keeps audit trail.
What if cluster receipt missing?
J4 fails—run the owning evening tutorial first.
What ships next in February cluster?
Blog-Create #9 — February fest refund spike threshold worksheet.
How does this relate to Thursday row review?
Thursday row review diffs BUILD_RECEIPT columns weekly; this sketch diffs hourly during D1–D7 and feeds Sunday closeout jsonl.
Can we skip jsonl on quiet hours?
Only with a documented waiver line—gaps fail J2 on the next hour and break Sunday annex continuity.
Does hourly replace pager P2?
No—pager owns nightly ritual completion; hourly indexes P2 build_label rows for stand-up paste.
What if queue_ok and launch_rate disagree?
Route queue first per queue playbook Q4; funnel YELLOW without queue drift is a different comms template.
Closing
February live week is too fast for “we’ll diff on Thursday.” One hourly jq sketch, one jsonl append, and J1–J6 turn pager noise into timestamped BUILD_RECEIPT truth—beginners copy bash, working devs wire cron, producers get a single exit code before HOTFIX language ships.