jq Gate Sketch for november_closeout_capstone_v1.json Child Receipt Crosswalk - 2026
Ten child receipts GREEN in Discord threads. Thursday row review shows demo_smoke_ok: true. December defer list says FREEZE—then a partner asks whether fest-demo-2026-11-rc4 on Whisper issue tags matches VDF LF proof and FMOD menu spot. One receipt still says fest-demo-2026-11-rc3.
November 2026 fest close-out closes the 266–275 playtest-triage arc before December holiday defer and Course 276 capstone forward. Eleven lessons filed individual *_receipt_v1.json files—partners and producers need one jq proof that build_label aligns across the cluster, not eleven manual opens.
This Programming & Technical post is a copy-paste jq + bash sketch: validate child paths, diff build_label, file november_closeout_capstone_v1.json, block CI promote when crosswalk fails—strategy layer above per-lesson evenings and below Lesson 276 BUILD_RECEIPT milestone.
Non-repetition note: October capstone Lesson 265 owns october_ops_truth_capstone_v1 wiring 254–264. jq rclone mirror sketch owns Team Drive ID guards. Addressables jq Lesson 257 owns inventory groups. This URL owns november_closeout_capstone_v1 child crosswalk + build_label jq for 266–275.
Pair BUILD_RECEIPT beginner, GitHub Actions concurrency patterns, and Friday capstone row review.
Why this matters now (November fest close-out / December freeze)
- Child receipt sprawl — November arc adds Whisper tags, CSV ingest, CI cancel, VDF LF, setlive dry-run, Blender mirror, SteamPipe wall-clock, loudness spot, Unreal OTLP, FMOD menu spot.
build_labeldrift — Hotfix bumps one receipt; others stale until someone notices in partner zip.- Holiday defer FREEZE — December defer playbook assumes stable label through capstone jq.
- Capstone wiring — Lesson 276 forward expects this sketch done first.
- CI promotion culture — jq exit 0 before
setlivebeats heroic manual JSON diff.
Direct answer: Pin november_closeout_capstone_v1.json with receipt_paths for 266–275, run verify_november_closeout.sh (jq proves one build_label), gates J1–J6, set BUILD_RECEIPT november_closeout_ok: true before December freeze.
Who this sketch is for
| Audience | You will… |
|---|---|
| Beginner | Copy jq one-liner; read exit code table |
| Solo founder | Stop eleven-file manual audit |
| Engineer | Wire bash guard in GitHub Actions |
| Producer | Require capstone JSON before defer FREEZE |
Time: ~60 minutes first crosswalk setup; ~3 minutes per promote after script pinned.
Mental model — capstone vs child receipts
| Layer | File | Proves |
|---|---|---|
| Child | whisper_issue_tag_receipt_v1.json etc. |
One lane passed |
| Capstone | november_closeout_capstone_v1.json |
All children + same build_label |
| BUILD_RECEIPT | Root row | Promote allowed |
| Prior arc | october_ops_truth_capstone_v1.json |
October 254–264 not orphaned |
Rule: Capstone does not re-run child gates—it indexes child pass fields and jq-unifies build_label.
Child receipt crosswalk (Lessons 266–275)
| Lesson | Schema | Typical path | Pass field |
|---|---|---|---|
| 266 | whisper_issue_tag_receipt_v1 |
release-evidence/playtest/whisper/WHISPER_ISSUE_TAG_RECEIPT.json |
whisper_issue_tag_ok |
| 267 | playtest_csv_ingest_receipt_v1 |
release-evidence/playtest/csv/PLAYTEST_CSV_INGEST_RECEIPT.json |
playtest_csv_ingest_ok |
| 268 | ci_cancel_safe_receipt_v1 |
release-evidence/ci/CI_CANCEL_SAFE_RECEIPT.json |
ci_cancel_safe_ok |
| 269 | vdf_line_ending_receipt_v1 |
release-evidence/steam/vdf/VDF_LINE_ENDING_RECEIPT.json |
vdf_lf_ok |
| 270 | gm_steam_setlive_dry_run_receipt_v1 |
release-evidence/steam/setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json |
setlive_dry_run_ok |
| 271 | blender_glb_mirror_receipt_v1 |
release-evidence/art/blender/BLENDER_GLB_MIRROR_RECEIPT.json |
blender_glb_mirror_ok |
| 272 | steampipe_wall_clock_receipt_v1 |
release-evidence/steam/upload/STEAMPIPE_WALL_CLOCK_RECEIPT.json |
queue_wait_ok |
| 273 | playtest_vod_loudness_spot_receipt_v1 |
release-evidence/audio/loudness/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json |
loudness_spot_ok |
| 274 | unreal_otlp_diligence_receipt_v1 |
release-evidence/telemetry/UNREAL_OTLP_DILIGENCE_RECEIPT.json |
unreal_otlp_diligence_ok |
| 275 | fmod_menu_snapshot_spot_receipt_v1 |
release-evidence/audio/menu-snapshot/FMOD_MENU_SNAPSHOT_SPOT_RECEIPT.json |
menu_snapshot_spot_ok |
Paths are team conventions—receipt JSON paths must match your release-evidence/ tree.
Prior arc pointers (required)
| Pointer | Capstone schema | Role |
|---|---|---|
| 265 | october_ops_truth_capstone_v1 |
October 254–264 closed |
| 253 | q4_playtest_scale_capstone_v1 |
Q4 playtest scale |
| 223 | h2_fest_hardening_capstone_v1 |
H2 hardening |
Same pattern as Lesson 265 October wiring.
Beginner path — copy/paste jq + exit codes
One-liner — all children share build_label
jq -e '
.expected_build_label as $exp
| .receipt_paths
| to_entries
| map(.value)
| map(select(length > 0))
| length > 0
| . as $paths
| [$paths[] | input]
| all(.build_label == $exp)
' november_closeout_capstone_v1.json \
$(jq -r '.receipt_paths | to_entries[] | .value' november_closeout_capstone_v1.json)
Beginner note: The above multi-file jq is advanced—use the bash script below instead.
Exit code table (snippet-friendly)
| Exit | Meaning | Fix |
|---|---|---|
| 0 | jq guard passed | Promote allowed |
| 1 | jq filter returned false | build_label mismatch or missing file |
| 2 | jq parse error | Invalid JSON in capstone or child |
| 3 | bash: child file missing | Path wrong in receipt_paths |
| 4 | bash: capstone missing | Create november_closeout_capstone_v1.json |
| 5 | prior arc pointer missing | File 265/253/223 path |
Five-command beginner path
# 1) Verify capstone exists
test -f release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json
# 2) Run crosswalk script (below)
./scripts/verify_november_closeout.sh
# 3) Read exit code — must be 0
echo $?
# 4) Optional: print unified build_label
jq -r '.expected_build_label' release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json
# 5) Set BUILD_RECEIPT november_closeout_ok after pass
Success check: Script prints OK: all child build_label match fest-demo-2026-11-rc4.
Developer path — gates J1–J6
| Gate | Check | Pass when |
|---|---|---|
| J1 | november_closeout_capstone_v1.json pinned |
expected_build_label set |
| J2 | All ten receipt_paths exist on disk |
bash test -f |
| J3 | Each child *_ok or gate pass field true |
Per-schema jq |
| J4 | build_label jq unified |
verify_november_closeout.sh exit 0 |
| J5 | Prior arc pointers exist | 265, 253, 223 paths |
| J6 | Capstone november_closeout_ok: true |
BUILD_RECEIPT column |
november_closeout_capstone_v1.json
Pin at release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json:
{
"schema": "november_closeout_capstone_v1",
"expected_build_label": "fest-demo-2026-11-rc4",
"arc_lessons": ["266", "267", "268", "269", "270", "271", "272", "273", "274", "275", "276"],
"receipts": {
"266": "whisper_issue_tag_receipt_v1.json",
"267": "playtest_csv_ingest_receipt_v1.json",
"268": "ci_cancel_safe_receipt_v1.json",
"269": "vdf_line_ending_receipt_v1.json",
"270": "gm_steam_setlive_dry_run_receipt_v1.json",
"271": "blender_glb_mirror_receipt_v1.json",
"272": "steampipe_wall_clock_receipt_v1.json",
"273": "playtest_vod_loudness_spot_receipt_v1.json",
"274": "unreal_otlp_diligence_receipt_v1.json",
"275": "fmod_menu_snapshot_spot_receipt_v1.json"
},
"receipt_paths": {
"266": "release-evidence/playtest/whisper/WHISPER_ISSUE_TAG_RECEIPT.json",
"267": "release-evidence/playtest/csv/PLAYTEST_CSV_INGEST_RECEIPT.json",
"268": "release-evidence/ci/CI_CANCEL_SAFE_RECEIPT.json",
"269": "release-evidence/steam/vdf/VDF_LINE_ENDING_RECEIPT.json",
"270": "release-evidence/steam/setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json",
"271": "release-evidence/art/blender/BLENDER_GLB_MIRROR_RECEIPT.json",
"272": "release-evidence/steam/upload/STEAMPIPE_WALL_CLOCK_RECEIPT.json",
"273": "release-evidence/audio/loudness/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json",
"274": "release-evidence/telemetry/UNREAL_OTLP_DILIGENCE_RECEIPT.json",
"275": "release-evidence/audio/menu-snapshot/FMOD_MENU_SNAPSHOT_SPOT_RECEIPT.json"
},
"prior_arc_pointers": {
"265": "release-evidence/capstone/OCTOBER_OPS_TRUTH_CAPSTONE.json",
"253": "release-evidence/capstone/Q4_PLAYTEST_SCALE_CAPSTONE.json",
"223": "release-evidence/capstone/H2_FEST_HARDENING_CAPSTONE.json"
},
"gates": {
"J1_capstone_pinned": "pass",
"J2_paths_exist": "pass",
"J3_child_ok_fields": "pass",
"J4_build_label_unified": "pass",
"J5_prior_arcs": "pass",
"J6_receipt": "pass"
},
"november_closeout_ok": true,
"december_freeze_allowed": true
}
Set december_freeze_allowed: true only after December defer receipt H5 passes on same expected_build_label.
verify_november_closeout.sh (bash + jq)
Save under scripts/verify_november_closeout.sh:
#!/usr/bin/env bash
set -euo pipefail
CAPSTONE="${1:-release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json}"
if [[ ! -f "$CAPSTONE" ]]; then
echo "MISSING capstone: $CAPSTONE" >&2
exit 4
fi
EXP=$(jq -r '.expected_build_label' "$CAPSTONE")
if [[ -z "$EXP" || "$EXP" == "null" ]]; then
echo "MISSING expected_build_label" >&2
exit 2
fi
# J2 — paths exist
while IFS= read -r path; do
[[ -z "$path" ]] && continue
if [[ ! -f "$path" ]]; then
echo "MISSING child: $path" >&2
exit 3
fi
done < <(jq -r '.receipt_paths | to_entries[] | .value' "$CAPSTONE")
# J4 — build_label unified
while IFS= read -r path; do
[[ -z "$path" ]] && continue
LABEL=$(jq -r '.build_label // empty' "$path")
if [[ "$LABEL" != "$EXP" ]]; then
echo "MISMATCH: $path has build_label=$LABEL expected=$EXP" >&2
exit 1
fi
done < <(jq -r '.receipt_paths | to_entries[] | .value' "$CAPSTONE")
# J5 — prior arcs
for key in 265 253 223; do
PP=$(jq -r --arg k "$key" '.prior_arc_pointers[$k] // empty' "$CAPSTONE")
if [[ -n "$PP" && ! -f "$PP" ]]; then
echo "MISSING prior arc $key: $PP" >&2
exit 5
fi
done
echo "OK: all child build_label match $EXP"
exit 0
chmod +x scripts/verify_november_closeout.sh
./scripts/verify_november_closeout.sh
GitHub Actions CI gate (working dev)
verify-november-closeout:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: November closeout crosswalk
run: ./scripts/verify_november_closeout.sh
- name: Capstone boolean gate
run: |
jq -e '.november_closeout_ok == true' \
release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json
Pair concurrency cancel patterns so verify job does not race Addressables build.
PowerShell variant (Windows CI / local)
$Capstone = "release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json"
if (-not (Test-Path $Capstone)) { Write-Error "MISSING capstone"; exit 4 }
$Exp = (Get-Content $Capstone -Raw | ConvertFrom-Json).expected_build_label
$paths = Get-Content $Capstone -Raw | ConvertFrom-Json
foreach ($p in $paths.receipt_paths.PSObject.Properties.Value) {
if (-not (Test-Path $p)) { Write-Error "MISSING child: $p"; exit 3 }
$child = Get-Content $p -Raw | ConvertFrom-Json
if ($child.build_label -ne $Exp) {
Write-Error "MISMATCH: $p has $($child.build_label) expected $Exp"
exit 1
}
}
Write-Host "OK: all child build_label match $Exp"
exit 0
Use the same exit code table as bash—producers on Windows laptops can audit before push without WSL.
Partial cluster honesty (advanced)
If lessons 269–275 are still in flight, do not set november_closeout_ok: true. Instead:
{
"deferred_children": ["269", "270", "271", "272", "273", "274", "275"],
"november_closeout_ok": false,
"december_freeze_allowed": false,
"notes": "266–268 GREEN only; capstone jq blocked until VDF LF evening ships"
}
Partners prefer honest partial JSON over a false GREEN capstone. Remove deferred_children entries as each lesson lands; re-run verify_november_closeout.sh when list empty.
BUILD_RECEIPT root row (after J6)
{
"build_label": "fest-demo-2026-11-rc4",
"november_closeout_ok": true,
"november_closeout_capstone_path": "release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json",
"october_ops_truth_ok": true,
"holiday_defer_ok": true
}
Thursday row review diff should show november_closeout_ok flip only after verify script exit 0—not when capstone JSON hand-edited.
Troubleshooting matrix
| Symptom | Exit | Lane |
|---|---|---|
MISMATCH: ... rc3 expected rc4 |
1 | Re-file stale child receipt |
MISSING child: ... |
3 | Fix receipt_paths or ship lesson |
MISSING prior arc 265 |
5 | Run October capstone first |
jq null build_label |
1 | Child schema missing field |
| CI passes locally fails | — | Path separators or wrong working directory |
| Capstone OK but smoke fails | — | Wednesday smoke—orthogonal gate |
jq recipes — per-child pass field (J3)
Map each schema's OK boolean—adjust if your child receipt uses different keys:
CAP=release-evidence/capstone/NOVEMBER_CLOSEOUT_CAPSTONE.json
check_ok() {
local path="$1" field="$2"
jq -e --arg f "$field" '.[$f] == true' "$path" >/dev/null \
|| { echo "FAIL $field in $path"; exit 1; }
}
check_ok release-evidence/playtest/whisper/WHISPER_ISSUE_TAG_RECEIPT.json whisper_issue_tag_ok
check_ok release-evidence/ci/CI_CANCEL_SAFE_RECEIPT.json ci_cancel_safe_ok
# ... repeat for 267–275 pass fields
Optional: Encode pass_field per lesson in capstone JSON receipts_meta[] for generic loop—Lesson 276 forward may standardize.
Proof table
| Evidence | Proves | Fail signal |
|---|---|---|
NOVEMBER_CLOSEOUT_CAPSTONE.json |
Index + expected label | Missing file |
verify_november_closeout.sh log |
J4 unified label | Exit 1 mismatch |
| CI job green | Promote discipline | Skipped job |
november_closeout_ok on BUILD_RECEIPT |
Producer sign-off | Manual true without script |
| Prior arc paths | Arc continuity | Orphan November cluster |
Scenarios A–H
| ID | Situation | Playbook move |
|---|---|---|
| A | Only 266–268 done | Partial capstone—list missing lessons in deferred_children[] |
| B | Hotfix bumps label | Re-run all child receipts; bump capstone version |
| C | One child missing build_label |
Fail J4; add field before promote |
| D | October 265 stale | Refresh pointer path only—do not merge schemas |
| E | December freeze same week | J4 then defer H2 |
| F | Monorepo multiple SKUs | expected_build_label per SKU capstone file |
| G | Windows paths in JSON | Normalize forward slashes for CI |
| H | Lesson 276 ships | Blog sketch = preflight; lesson = BUILD_RECEIPT milestone |
Relationship to October capstone (format ladder)
| Field | October Lesson 265 | November (this sketch) |
|---|---|---|
| Schema | october_ops_truth_capstone_v1 |
november_closeout_capstone_v1 |
| Children | 254–264 (11 receipts) | 266–275 (10 receipts) |
| jq script | Team-specific | verify_november_closeout.sh |
| BUILD_RECEIPT | october_ops_truth_ok |
november_closeout_ok |
| Next freeze | Store metadata | December defer |
November close-out week calendar
| Day | Crosswalk action |
|---|---|
| Monday | Collect child receipt paths into capstone draft |
| Tuesday | CSV ingest + label check |
| Wednesday | Demo smoke on expected_build_label |
| Thursday | Row review + run verify_november_closeout.sh |
| Friday | File capstone; run Friday capstone row review; set december_freeze_allowed |
| Before Dec 20 | Defer receipt FREEZE |
Counterarguments (honest limits)
"We only have six lessons done."
Partial clusters fail J2—honest defer until 266–275 complete or document waived_lessons[] with producer sign-off (not default).
"Manual Discord audit is enough."
jq takes three minutes—cheaper than partner call embarrassment.
"Same as October capstone copy-paste."
Different child schemas and paths—reuse pattern, not JSON blob.
Key takeaways
- November close-out needs one jq proof—not eleven manual JSON opens.
november_closeout_capstone_v1.jsonindexes 266–275 child paths.verify_november_closeout.shenforces J4build_labelunity.- Exit codes 0–5 map to actionable fixes for beginners.
- Prior pointers 265, 253, 223 prevent orphan arcs.
- Lesson 276 forward BUILD_RECEIPT milestone follows this sketch.
- December defer assumes J4 GREEN before FREEZE.
- Thursday row review lists November capstone beside October.
- CI gate blocks promote on jq fail—pair concurrency patterns.
- Child pass fields differ per schema—J3 loop must map each
*_okkey. - jq rclone mirror cousin for diligence paths—not label crosswalk.
- Friday capstone row review latches
december_freeze_allowedbefore freeze. - December engineering floor cap for contractor blackout hours.
- Hotfix label bump requires all children refreshed—not capstone-only edit.
december_freeze_allowedis capstone field—tie to defer receipt same week.
FAQ
Is this Lesson 276?
276 owns BUILD_RECEIPT milestone + N1–N11 gates; this blog owns copy-paste jq sketch and verify_november_closeout.sh.
How is this different from October Lesson 265?
265 wires 254–264 ops receipts; this wires 266–275 playtest-triage receipts.
Do all ten children need to exist?
Strict J2 yes—for partial November arcs, document waivers explicitly (not recommended for partner zip).
What jq version?
jq 1.6+ on Ubuntu CI; Windows use Git Bash or WSL for script.
Can I use Node instead of bash?
Yes—receipt culture needs reproducible exit codes; bash+jq is lowest dependency.
What if child uses fest_build_label not build_label?
Normalize in child receipts—capstone jq expects .build_label (alias in export script).
Does this run on every commit?
Run on promote branches and pre-freeze tags—not every doc edit.
Where does winter capsule fit?
Art-only upload—does not change build_label if scenario G; still run J4 if any child bumped.
Will jq gate guarantee fest success?
No—it prevents label schizophrenia in evidence folders—execution quality still varies.
| Which blog evenings map to child lessons? | Lesson | Evening / strategy cousin |
|---|---|---|
| 266 | Whisper tag extraction | |
| 267 | Tuesday CSV ritual | |
| 268 | 12 concurrency patterns | |
| 269 | Godot VDF LF evening | |
| 270 | GameMaker setlive evening | |
| 271 | Blender glb mirror evening | |
| 272 | SteamPipe wall-clock trend | |
| 273 | Audacity loudness evening | |
| 274 | Unreal OTLP case study | |
| 275 | FMOD five-night challenge |
Capstone jq verifies paths and labels—child implementation stays in lessons and cousin blogs.
Closing read (November 2026)
Fest close-out is not "every receipt GREEN in chat." It is one machine-readable proof that the same build_label flows from Whisper tags through VDF LF proofs to FMOD menu spots—before December freeze locks scope.
Micro-studios that pin verify_november_closeout.sh enter holiday defer with capstone evidence partners can jq-verify in thirty seconds. Teams that skip jq learn about rc3 vs rc4 on the first January promote.
Start with expected_build_label and ten paths—run the script before Thursday row review.
Found this useful? Add the CI job beside your Addressables build—not after the holiday hotfix.