Thursday Content Update BUILD_RECEIPT Row Review - Ten Minutes After Wednesday Warm Catalog Smoke - 2026

Wednesday evening: warm catalog returns GREEN. Thursday noon: someone promotes the remote catalog to the Sale CDN label because "warm already proved it." Thursday 4 p.m.: BUILD_RECEIPT.json still shows last week's catalog_hash, warm_catalog_ok is a three-day-old boolean, and PATCH exception count is zero while jq weekly already saw a silent bump. The path ran—the receipt lied, and Sale weekend inherits stale truth.
April–June 2027 content-update Thursdays are when micro-studios skip the ritual that Fest demos already learned: after proof day, row-review day. The fest cousin is Thursday BUILD_RECEIPT row review after Wednesday demo smoke (gates R1–R10, promotion_allowed). This Process & Workflow URL owns a cousin with different columns: after Wednesday warm catalog, run a ten-minute Thursday content-update row review—diff catalog_hash, warm_catalog_ok, patch_exception_list_ok, CDN label pointers—before setting BUILD_RECEIPT content_update_promote_allowed: true.
Non-repetition note: Fest Thursday row review owns demo/surface/channel promotion after smoke. Warm catalog evening owns A1–A6 path proof. jq April weekly owns Monday catalog identity (J1–J6). PATCH opinion owns numbered ship authorization (P1–P6). Friday March capstone owns pre-April latch. This URL owns T1–T10 promote ritual after warm—Sale must not inherit last Wednesday's boolean.
Pair warm catalog, jq April weekly, PATCH exception, fest Thursday cousin, June aftermath, Course 289 forward, forward blog #12 Whisper highlight reel.
Why this matters now (April–June 2027 content-update weeks)
- Warm GREEN is not promote GREEN — Warm evening proves a candidate path; Thursday proves receipt rows still describe this week's catalog.
- Stale booleans survive Sale — Teams leave
warm_catalog_ok: trueuntouched across three catalog bumps; Sale store week then trusts ghosts. - jq weekly vs Thursday — Monday jq detects identity drift; Thursday decides promote permission.
- PATCH without promote latch — PATCH opinion numbers ships; without T-gates you promote a numbered lie.
- Orphan ambulance week — Orphan recovery is what you run when Thursday was skipped.
Direct answer: After Wednesday warm GREEN, spend ten minutes Thursday on gates T1–T10, file content_update_row_diff_receipt_v1.json, set BUILD_RECEIPT content_update_promote_allowed only when blockers pass—refuse CDN/Sale label promotion on warm theater alone.
Who this ritual is for
| Audience | Outcome |
|---|---|
| Solo tech-art | Clipboard card: promote Y/N in ten minutes |
| Producer | Block Sale CDN label until T4–T8 GREEN |
| Working devops | Wire verify_content_update_row_diff.sh + CI after warm artifact upload |
Time: 10 minutes every content-update Thursday (default), immediately after Wednesday warm when both run the same week.
Prerequisites: Current BUILD_RECEIPT.json, last Thursday (or last promoted) baseline receipt, Wednesday april_content_update_warm_catalog_receipt (or equivalent), PATCH list if a hash changed this week, row catalog below.
Format ladder (content-update week)
| Day | Artifact | Layer |
|---|---|---|
| Monday | jq April weekly | Catalog identity hashes |
| Before ship | PATCH-00N | Authorization |
| Wednesday | Warm catalog evening | Installed/player path |
| Thursday | This row review | Machine-readable claims + promote latch |
| As needed | Orphan recovery | Ghost ambulance |
Fest demos still use Wednesday smoke + fest Thursday—different columns, do not reuse promotion_allowed for Addressables CDN promote.
Content-update row catalog (what to diff)
Store release-evidence/content-update/receipt-row-catalog-content-update.md:
| Row key | Type | Must match warm? | Typical drift |
|---|---|---|---|
catalog_hash / content_catalog_hash |
string | Yes | Forgot bump after PATCH |
warm_catalog_ok |
bool | Yes | Stale true from last week |
warm_catalog_receipt_path |
string | Yes | Path points at old ISO week |
warm_iso_week |
string | Yes | Wednesday was W15, receipt still W14 |
patch_exception_list_ok |
bool | If hash changed | true without PATCH-00N |
patch_exception_count |
int | If hash changed | count ≠ exceptions length |
cdn_label / promote_target |
string | Yes | Sale label vs staging |
cdn_purge_noted |
bool | If CDN touch | Missing after catalog ship |
april_content_update_weekly_ok |
bool | Prefer | Monday jq RED ignored |
orphan_risk_cleared |
bool | If prior orphan | Still false after R recovery |
content_update_promote_allowed |
bool | Output | Manually set true without T-gates |
human_signoff.signed_at_utc |
timestamp | Yes | Unsigned promote |
Add rows when you adopt new sidecars—never delete mid-Sale without receipt_version bump in diff notes.
Gates T1–T10 (Thursday promote blockers)
| Gate | Name | Pass criteria |
|---|---|---|
| T1 | File exists | Current BUILD_RECEIPT.json + baseline path documented |
| T2 | catalog_hash parity | Receipt hash equals warm receipt / CDN candidate hash |
| T3 | warm linkage | warm_catalog_receipt_path exists; warm_catalog_ok true this ISO week |
| T4 | warm week freshness | warm_iso_week matches current review week (not last week's GREEN) |
| T5 | PATCH coupling | If hash ≠ baseline ⇒ patch_exception_list_ok + count aligned |
| T6 | weekly jq | april_content_update_weekly_ok true or freeze week documented |
| T7 | CDN / promote target | cdn_label / promote_target matches intended Thursday promote |
| T8 | purge / orphan note | CDN touch ⇒ cdn_purge_noted or orphan note; prior orphan cleared |
| T9 | signoff | Producer signoff within 7 days of warm |
| T10 | diff receipt | content_update_row_diff_receipt_v1.json committed; latch set honestly |
T4–T8 are promote blockers when RED. T6 YELLOW (freeze week) allows promote only with written notes waiver.
The ten-minute ritual (minute-by-minute)
| Min | Action |
|---|---|
| 0–1 | Confirm Wednesday warm log GREEN; open current + baseline receipts |
| 1–3 | T1–T3: files, catalog_hash, warm path + ok |
| 3–5 | T4–T5: ISO week freshness; PATCH if hash changed |
| 5–7 | T6–T8: weekly jq, CDN label, purge/orphan |
| 7–9 | T9: signoff; decide RED/YELLOW/GREEN |
| 9–10 | Write content_update_row_diff_receipt_v1.json; set content_update_promote_allowed |
Calendar invite: "Thursday content-update row review — promote gate (warm week)."
Same-week calendar (recommended)
| Day | Block | Total |
|---|---|---|
| Monday | jq catalog weekly | ~15–20 min |
| Before ship | PATCH-00N if bumping | 10–25 min |
| Wednesday | Warm catalog | evening |
| Thursday | Row review (this) | 10 min |
| Thursday PM | CDN / Sale label promote (human) | Only if Wed + Thu GREEN |
content_update_row_diff_receipt_v1.json (template)
{
"schema": "content_update_row_diff_receipt_v1",
"iso_week": "2027-W15",
"reviewed_at_utc": "2027-04-10T14:10:00Z",
"current_catalog_hash": "c3d4e5f6a1b2",
"baseline_catalog_hash": "a1b2c3d4e5f6",
"paired_warm_catalog": "release-evidence/content-update/PATCH_001_WARM.json",
"paired_patch_list": "release-evidence/content-update/PATCH_EXCEPTION_LIST_RECEIPT.json",
"gates": {
"T1_file_exists": "GREEN",
"T2_catalog_hash_parity": "GREEN",
"T3_warm_linkage": "GREEN",
"T4_warm_week_freshness": "GREEN",
"T5_patch_coupling": "GREEN",
"T6_weekly_jq": "GREEN",
"T7_cdn_promote_target": "GREEN",
"T8_purge_orphan": "GREEN",
"T9_signoff": "GREEN",
"T10_diff_receipt": "GREEN"
},
"row_diff": [
{
"key": "catalog_hash",
"baseline": "a1b2c3d4e5f6",
"current": "c3d4e5f6a1b2",
"expected": "c3d4e5f6a1b2",
"status": "expected_change"
},
{
"key": "warm_iso_week",
"baseline": "2027-W14",
"current": "2027-W15",
"expected": "2027-W15",
"status": "fixed"
}
],
"content_update_promote_allowed": true,
"notes": "PATCH-001 ship; warm same week; Sale staging CDN only"
}
Store under release-evidence/content-update/receipt-diffs/.
BUILD_RECEIPT root rows
{
"catalog_hash": "c3d4e5f6a1b2",
"warm_catalog_ok": true,
"warm_iso_week": "2027-W15",
"patch_exception_list_ok": true,
"april_content_update_weekly_ok": true,
"content_update_promote_allowed": true,
"content_update_row_diff_receipt": "release-evidence/content-update/receipt-diffs/W15.json"
}
Fail-closed: Do not set content_update_promote_allowed: true while any of T4–T8 are RED.
verify_content_update_row_diff.sh
#!/usr/bin/env bash
set -euo pipefail
DIFF="${1:-release-evidence/content-update/receipt-diffs/LATEST.json}"
BR="${2:-BUILD_RECEIPT.json}"
jq -e '.schema == "content_update_row_diff_receipt_v1"' "$DIFF" || exit 1
for g in T4_warm_week_freshness T5_patch_coupling T7_cdn_promote_target T8_purge_orphan; do
jq -e --arg g "$g" '.gates[$g] == "GREEN"' "$DIFF" || { echo "blocker $g"; exit 2; }
done
ALLOWED=$(jq -r '.content_update_promote_allowed' "$DIFF")
BR_ALLOWED=$(jq -r '.content_update_promote_allowed' "$BR")
[[ "$ALLOWED" == "$BR_ALLOWED" ]] || { echo "latch mismatch"; exit 3; }
HASH=$(jq -r '.current_catalog_hash' "$DIFF")
BR_HASH=$(jq -r '.catalog_hash // .content_catalog_hash' "$BR")
[[ "$HASH" == "$BR_HASH" ]] || { echo "hash mismatch"; exit 4; }
echo "content_update_row_diff verify: OK"
Beginner path — printable ritual card
THURSDAY CONTENT-UPDATE ROW REVIEW (10 min)
ISO week: ________ Warm GREEN? Y/N Week match? Y/N
catalog_hash current: ________ baseline: ________
PATCH required? Y/N patch_exception_list_ok? Y/N
weekly jq ok / freeze? ________
cdn_label / promote_target: ________
purge/orphan noted? Y/N
content_update_promote_allowed: Y / N
Signer: ________ Date: ________
Tape beside the warm evening checklist so promote cannot skip the card.
Developer path — jq skim before the ten minutes
jq -r '.catalog_hash, .warm_catalog_ok, .warm_iso_week,
.patch_exception_list_ok, .content_update_promote_allowed' BUILD_RECEIPT.json
jq -r '.catalog_hash_after // .catalog_hash, .warm_iso_week // .iso_week' \
release-evidence/content-update/PATCH_*_WARM.json | tail -1
If warm week ≠ review week, T4 is already RED—stop before promoting.
Diff mechanics (Python sketch)
import json
from pathlib import Path
KEYS = [
"catalog_hash", "warm_catalog_ok", "warm_iso_week",
"patch_exception_list_ok", "cdn_label", "content_update_promote_allowed"
]
def get(o, k):
return o.get(k) if isinstance(o, dict) else None
cur = json.loads(Path("BUILD_RECEIPT.json").read_text())
base = json.loads(Path("receipts/baseline-content-update.json").read_text())
for k in KEYS:
b, c = get(base, k), get(cur, k)
if b != c:
print(k, b, "->", c)
Run after warm artifact upload in CI—fail if T4–T8 would be RED while content_update_promote_allowed is true.
Worked example — W15 near-Sale promote
| Gate | Finding | Status |
|---|---|---|
| T2 | Warm hash c3d4…, BUILD_RECEIPT still a1b2… |
RED |
| T4 | Warm ISO W15, receipt warm_iso_week W14 |
RED |
| T5 | Hash changed; PATCH list empty | RED |
| T7 | cdn_label still staging while Sale label requested |
RED |
Outcome: Promote slipped one day. Tech-art bumped hash, filed PATCH-001, refreshed warm week, set Sale staging first—re-ran T1–T10 GREEN Thursday PM. Marketing avoided orphan ambulance on Sale Friday.
Scenarios A–G
| ID | Situation | Move |
|---|---|---|
| A | Standard mid-April bump | Full T1–T10 before CDN promote |
| B | Freeze week, no hash change | T5 N/A; T6 freeze note; promote may stay false |
| C | Warm GREEN last week reused | T4 RED—re-warm or no promote |
| D | PATCH filed, warm same week | Expect T5 GREEN; still run T7 label |
| E | Monday jq J5 RED | Fix PATCH / honesty before Thursday promote |
| F | Orphan recovery last week | T8 needs orphan_risk_cleared |
| G | Sale weekend tomorrow | Only promote if T4–T8 GREEN—no "close enough" |
RED / YELLOW / GREEN routing
| Signal | Route |
|---|---|
| T4 RED | Re-run warm this week or block promote |
| T5 RED | File PATCH-00N or revert hash claim |
| T6 RED | File Monday jq or document freeze |
| T7 RED | Fix CDN label string before human promote |
| T8 RED | Purge note / orphan clear first |
| Warm GREEN / promote RED | Correct—do not treat as conflict |
| All GREEN | Set content_update_promote_allowed: true |
Comparison pack — fest Thursday vs content-update Thursday
| Item | Fest Thursday | This URL |
|---|---|---|
| Proof day | Wednesday demo smoke | Wednesday warm catalog |
| Gates | R1–R10 | T1–T10 |
| Diff schema | build_receipt_row_diff_receipt_v1 |
content_update_row_diff_receipt_v1 |
| Latch | promotion_allowed |
content_update_promote_allowed |
| Lineage | build_id / surface |
catalog_hash / CDN label |
| Season | Fest demo weeks | Apr–Jun content-update |
PowerShell verify cousin
$d = Get-Content release-evidence/content-update/receipt-diffs/LATEST.json -Raw | ConvertFrom-Json
if ($d.schema -ne "content_update_row_diff_receipt_v1") { throw "schema" }
foreach ($g in @("T4_warm_week_freshness","T5_patch_coupling","T7_cdn_promote_target","T8_purge_orphan")) {
if ($d.gates.$g -ne "GREEN") { throw $g }
}
"OK content_update_row_diff"
CI sketch
name: content-update-thursday-row-diff
on:
pull_request:
paths:
- "BUILD_RECEIPT.json"
- "release-evidence/content-update/receipt-diffs/**"
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: bash scripts/verify_content_update_row_diff.sh
Common mistakes
Reusing fest Thursday card for Addressables — Wrong gate letters and latch name.
Promote on warm alone — Skips T4 freshness and T5 PATCH.
Leaving content_update_promote_allowed: true all season — Reset false until each Thursday GREEN.
Ignoring Monday jq — Thursday cannot launder a J5 RED.
Capsule-only weeks marked promote — No catalog change ⇒ leave latch false (honesty).
Orphan cleared verbally — T8 needs a receipt path.
Facilitator stand-up (two minutes)
Producer: content_update_promote_allowed last value? ____
Tech-art: Warm this week? Y/N iso_week on receipt? ____
Hash changed vs baseline? Y/N → PATCH id? ____
Monday jq: GREEN / J5 / freeze
CDN target tomorrow: staging / Sale / none
If any T4–T8 RED: no promote language in Discord.
Waiver when you must promote under YELLOW (T6 only)
{
"waiver_id": "CU-PROMOTE-WAIVER-2027-W16",
"gates_overridden": ["T6_weekly_jq"],
"reason": "Freeze week documented; catalog_hash unchanged; Sale label not touched",
"signed_by": "producer",
"expires_iso_week": "2027-W16"
}
Never waiver T4 or T5—stale warm week or missing PATCH is not a paperwork inconvenience.
Engine / CDN notes
| Stack | Thursday focus |
|---|---|
| Unity Addressables | Diff remote catalog hash + profile label; pair drift loop |
| Godot remote packs | Manifest hash ≈ catalog_hash; warm = install+load one player build |
| Custom CDN | T7 cdn_label must match the hostname players hit, not the upload bucket name |
| Steam depot + Addressables | Two promotes: depot setlive (fest Thursday cousin) vs catalog CDN (this ritual)—run both cards when both change |
Worked narrative — Studio East vs West (Sale −10 days)
East warmed Wednesday, promoted Thursday noon without row review, left warm_iso_week on W14. Sale traffic pulled a mix of W14 and W15 hashes; Discord filled with InvalidKey. They paid orphan recovery during Sale opener and lost store response hours.
West printed the ritual card, caught T4 and T5 RED in nine minutes, filed PATCH-002, re-warmed Wednesday late (same ISO week), Thursday PM GREEN promote to Sale staging only. Partner zip showed content_update_row_diff_receipt_v1.json beside warm and PATCH receipts—no archaeology.
Proof table (diligence)
| Artifact | Proves |
|---|---|
| Diff receipt T1–T10 | Promote decision was gated |
| Warm path same ISO week | T3/T4 honesty |
| PATCH list when hash moved | T5 coupling |
| Monday weekly ok / freeze note | T6 |
| BUILD_RECEIPT latch == diff latch | No dual truths |
| verify script exit 0 | Machine check |
Integration with June aftermath / October prep
If you are transferring lessons from June Next Fest aftermath into Addressables weeks, treat "keep" rows that say "always promote Thursday" as incomplete—promote only after this ritual. Aftermath REWRITE language for Sale store pages does not replace catalog_hash honesty.
Partner zip minimum (content-update Thursday)
content_update_row_diff_receipt_v1.json(this week)- Paired warm receipt path
- PATCH list (or empty latch-true if no hash change)
- Monday weekly receipt or freeze note
- BUILD_RECEIPT excerpt showing
content_update_promote_allowed
Skip any of these and diligence reviewers will treat Sale GREEN as marketing theater.
Ten things not to do on Thursday lunch
- Promote because Slack said warm was fine.
- Copy last week's diff JSON and flip only the date.
- Set latch true in BUILD_RECEIPT before writing the diff receipt.
- Use fest
promotion_allowedas a synonym. - Skip T5 because "PATCH is paperwork."
- Promote Sale CDN and staging in one click without two label rows.
- Ignore Monday J5 because "Thursday will catch it."
- Leave orphan_risk false after recovery week.
- Sign produce blank cards "for later."
- Cancel the calendar invite during Sale crunch—that is when you need it most.
Relationship to forward highlight reel
Forward blog #12 (Whisper creator highlight reel) is press/creator media—not a substitute for catalog promote honesty. Finish Thursday latch before spending editor time on reels that advertise a broken Sale build.
Outbound references
- Unity Addressables documentation — catalog update cadence
- Steamworks branches — when depot + content update combine
- Steamworks documentation — store week context
Related GamineAI reads
- April warm catalog evening
- jq April content-update weekly catalog row diff
- PATCH exception opinion
- Thursday BUILD_RECEIPT row review after Wednesday smoke (fest cousin)
- Remote catalog orphan recovery
- Friday March capstone before April content update
- June 2026 Next Fest aftermath → October prep
- 5-day Summer Sale store response challenge
- BUILD_RECEIPT beginner pipeline
- Forward: blog #12 Whisper creator highlight reel; Course 289
Key takeaways
- Warm GREEN ≠ promote GREEN—Thursday T1–T10 decide
content_update_promote_allowed. content_update_row_diff_receipt_v1.jsonis the promote artifact—not a vibe.- T4 freshness kills last week's warm boolean theater.
- T5 couples hash bumps to PATCH-00N.
- Pair Monday jq—identity before promote.
- Fest Thursday cousin uses different gates/latch—do not copy-paste.
- T4–T8 RED block CDN/Sale promote even if warm path ran.
- Reset
content_update_promote_allowedfalse between green Thursdays. - Orphan recovery is what skipped Thursdays buy.
- Ten-minute card keeps solo studios honest.
- CI verify fail-closes latch vs hash mismatch.
- Freeze weeks may leave promote false—document T6.
- Forward #12 highlight reel comes after promote honesty.
- Sale week inherits whatever Thursday allowed—gate it.
FAQ
Is this the same as the fest Thursday row review?
No—different proof day (warm vs demo smoke), gates (T vs R), schemas, and latches.
Do we still need Monday jq?
Yes—Monday = identity; Thursday = promote permission.
What if warm was GREEN but iso_week is last week?
T4 RED—re-warm or refuse promote.
Can we promote without PATCH when hash unchanged?
Yes—T5 N/A; still run T4/T7/T8.
How does PATCH opinion relate?
PATCH authorizes the ship; Thursday proves receipt rows match before CDN promote.
What if we are not touching CDN this Thursday?
Leave content_update_promote_allowed: false and note "no promote week."
Does Course 289 replace this?
Course milestone can rehearse the ritual; this URL owns the public strategy/checklist.
Can promotion_allowed from fest Thursday substitute?
No—different schema and semantics; dual-latch confusion is how Sale deploys wrong CDN labels.
What if Wednesday warm failed?
No Thursday promote review needed for GREEN latch—fix warm first; leave content_update_promote_allowed: false.
How often reset the latch?
Every ISO week after a promote decision—or immediately after any new catalog publish before next Thursday.
Closing
Warm evenings without Thursday row review are how Sale weeks inherit lies—diff catalog hashes, insist on same-week warm, couple PATCH when hashes move, and latch content_update_promote_allowed only after T1–T10. Pair warm catalog, jq weekly, and PATCH opinion; keep the fest Thursday cousin for demo promote weeks. Ten minutes of receipt honesty beats two days of orphan archaeology.