Lesson 286: Construct Post-Fest Wishlist Velocity Receipt on BUILD_RECEIPT (2026)
Direct answer: Before March 2027 D+14 stand-up declares wishlist health, promote post_fest_wishlist_velocity_receipt_v1.json with V1–V6—name a facilitator roster, archive fourteen consecutive Steam Marketing daily CSVs, derive wishlists_per_visit with jq (not hand-typed Sheets), paint RED/YELLOW/GREEN, and fail-close post_fest_wishlist_velocity_ok on BUILD_RECEIPT so feature sprints cannot ship on fest-hour funnel GREEN alone. Pair Guide #45, 16 velocity tools, and cousin Lesson 282 (fest-hour snapshot—not fourteen-day velocity).

Why this matters now (March D+14 after February fest)
March 2027, two weeks after February Next Fest: Construct HTML5 / NW.js demos keep shipping event-sheet patches while marketing asks whether wishlists are recovering. Lesson 282 proved fest-hour click health; 286 owns the daily velocity BUILD_RECEIPT latch for the same RPG track—without reusing Discord playtest CSV schemas from Lesson 267.
Guide #45 is the ninety-second Construct + jq morning gate; this lesson is the BUILD_RECEIPT milestone + verify script for the course project.
Beginner path (55-minute D+14 latch)
| Step | Action | Success check |
|---|---|---|
| 1 | File velocity_roster_v1.json |
Primary + backup named |
| 2 | Confirm ≥14 consecutive daily CSVs | Dates continuous post-fest |
| 3 | Normalize with jq → derived ratio | wishlists_per_visit not hand-typed |
| 4 | Append daily jsonl with export_sha256 |
One line per UTC date |
| 5 | Paint band RED/YELLOW/GREEN | Stand-up color matches receipt |
| 6 | File velocity receipt + run verify | Exit 0 |
| 7 | Latch BUILD_RECEIPT post_fest_wishlist_velocity_ok |
Boolean after verify |
Time: ~55 minutes first D+14 latch; ~15 minutes when templates + fourteen files already exist.
Prerequisites: Steamworks Marketing export access; jq on PATH; write access to release-evidence/analytics/; Guide #45 bookmarked.
Developer path (gates V1–V6)
| Gate | Check | Fail when |
|---|---|---|
| V1 | Facilitator roster | Discord playtest roster reused as velocity owners |
| V2 | ≥14 consecutive utc_date rows |
Three-day “good enough” theater |
| V3 | Derived wishlists_per_visit |
Hand-typed ratio to force GREEN |
| V4 | Daily jsonl + export_sha256 |
Missing hash / orphaned export |
| V5 | Receipt committed | Schema wrong / cousin flattened |
| V6 | BUILD_RECEIPT latch | post_fest_wishlist_velocity_ok without verify |
Cross-cutting: Do not treat hour-one funnel GREEN as velocity GREEN. Do not mix Steam Marketing CSVs with Discord thread exports under the same folder.
Cousin receipt crosswalk
| Field | Lesson 282 hour-one funnel | Lesson 267 Discord CSV | This lesson (286) |
|---|---|---|---|
| Schema | hour_one_funnel_snapshot_receipt_v1 |
playtest CSV ingest | post_fest_wishlist_velocity_receipt_v1 |
| Window | Fest hours | Tuesday playtest | March D+1…D+14 daily |
| Pass field | hour_one_funnel_snapshot_ok |
ingest OK | post_fest_wishlist_velocity_ok |
Reference cousins in cousin_receipts—do not flatten schemas.
V1 — velocity_roster_v1.json (course project)
{
"schema": "velocity_roster_v1",
"fest_window": "2027-02-next-fest-live",
"facilitators": [
{
"name": "producer@studio",
"role": "primary_export",
"export_local_time": "09:00",
"timezone": "America/Los_Angeles",
"backup": "analytics@studio",
"construct_ops_note": "distinct from tuesday_discord_csv_owner"
}
],
"standup_channel": "#fest-metrics",
"sla_hours_if_gap": 24
}
Pin at release-evidence/analytics/velocity_roster_v1.json.
V2–V4 — fourteen days + derived ratio + jsonl
Archive raw Steamworks Marketing CSVs under release-evidence/analytics/steam-daily/YYYY-MM-DD.csv. Normalize to a derived header (listicle canonical):
utc_date,visits,wishlist_adds,wishlists_per_visit,export_sha256
Example jq sketch (adapt column names when Steamworks drifts—Help #44):
# Pseudocode — map your export headers once, then re-run daily
jq -n --arg d "2027-03-01" --argjson v 1200 --argjson w 36 \
'{utc_date:$d, visits:$v, wishlist_adds:$w,
wishlists_per_visit: ($w / $v), export_sha256:"…"}'
Band thresholds (from velocity listicle—confirm studio policy):
| Band | Meaning | Stand-up action |
|---|---|---|
| GREEN | Velocity within plan band | Continue scheduled follow-through |
| YELLOW | Soft stall | Cap new feature promises; check plateau playbook |
| RED | Hard stall / gaps | Block feature sprint until recovery plan |
| DEFERRED | Divide-by-zero / missing day | Document waiver; do not invent GREEN |
Append one jsonl line per day to release-evidence/analytics/wishlist_velocity_daily.jsonl.
V5–V6 — post_fest_wishlist_velocity_receipt_v1.json
{
"schema": "post_fest_wishlist_velocity_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"d_plus": 14,
"locked_utc": "2027-03-14T17:00:00Z",
"velocity_roster_path": "release-evidence/analytics/velocity_roster_v1.json",
"derived_csv_dir": "release-evidence/analytics/steam-daily-derived",
"daily_jsonl": "release-evidence/analytics/wishlist_velocity_daily.jsonl",
"consecutive_days": 14,
"band_at_d14": "YELLOW",
"gates": {
"V1_roster": "pass",
"V2_continuity": "pass",
"V3_derived_ratio": "pass",
"V4_jsonl_hash": "pass",
"V5_receipt": "pass",
"V6_build_receipt": "pass"
},
"cousin_receipts": {
"hour_one_funnel": "release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json",
"discord_csv_ingest": "release-evidence/playtest/PLAYTEST_CSV_INGEST_RECEIPT.json"
},
"post_fest_wishlist_velocity_ok": true
}
Pin at release-evidence/analytics/POST_FEST_WISHLIST_VELOCITY_RECEIPT.json.
BUILD_RECEIPT row
{
"post_fest_wishlist_velocity_ok": true,
"post_fest_wishlist_velocity_receipt": "release-evidence/analytics/POST_FEST_WISHLIST_VELOCITY_RECEIPT.json",
"wishlist_velocity_band_d14": "YELLOW"
}
verify_post_fest_wishlist_velocity.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/analytics/POST_FEST_WISHLIST_VELOCITY_RECEIPT.json}"
jq -e '.schema == "post_fest_wishlist_velocity_receipt_v1"' "$REC"
jq -e '.post_fest_wishlist_velocity_ok == true' "$REC"
jq -e '.consecutive_days >= 14' "$REC"
test -f "$(jq -r '.velocity_roster_path' "$REC")"
test -f "$(jq -r '.daily_jsonl' "$REC")"
lines="$(wc -l < "$(jq -r '.daily_jsonl' "$REC")")"
test "$lines" -ge 14
echo "post_fest_wishlist_velocity verify: OK"
Relationship to Guide / listicle / Help / funnel
| Artifact | Role |
|---|---|
| Guide #45 | Ninety-second Construct + jq morning gate |
| 16 velocity tools | Tool stack + V1–V6 policy |
| This lesson | BUILD_RECEIPT milestone |
| Lesson 282 | Fest-hour funnel cousin |
| Help #44 forward | Column-order drift recovery |
Order: D+1 roster (V1) → daily export (V2–V4) → D+14 receipt (V5–V6) → March weekly jq / evidence sprint (Lesson 287 forward).
Common mistakes
- Declaring velocity GREEN from one Steamworks UI screenshot.
- Reusing Discord playtest column maps for Marketing & Sales exports.
- Hand-typing
wishlists_per_visitto force GREEN. - Flipping BUILD_RECEIPT after three days “to unblock sprint.”
- Treating Lesson 282 funnel GREEN as D+14 velocity proof.
Troubleshooting
| Symptom | Lane |
|---|---|
| jq empty wishlist column | Help #44 forward — header map drift |
| Divide-by-zero / NaN ratio | band_at_d14: DEFERRED |
| Funnel GREEN, velocity RED | Expected—run plateau playbook |
| Wrong CSV folder | Steam daily under analytics/; Discord under playtest/ |
| Saturday gap | Document waiver; backfill if recoverable |
Key takeaways
- D+14 needs daily velocity, not fest-hour funnel alone.
post_fest_wishlist_velocity_okgates March feature promises.- Guide #45 paints the morning ritual; 286 promotes on BUILD_RECEIPT.
- Derived ratios beat hand-typed Sheets theater.
- Cousin funnel / Discord receipts stay referenced—not flattened.
- Next March prep continues at Lesson 287 (weekly sprint jsonl).
Continuity — March debrief + October prep (284–288)
| Lesson | Receipt focus |
|---|---|
| 284 | Post-fest debrief facilitator card |
| 285 | GameMaker October RC branch label |
| 286 (this) | Construct post-fest wishlist velocity |
| 287 | Unity March weekly sprint jsonl |
| 288 forward | OBS post-fest Whisper clips_index handoff |
Previous: Lesson 285 — GameMaker October RC branch label
Next: Lesson 287 — Unity March post-fest sprint weekly jsonl
FAQ
Does 286 replace Lesson 282?
No—282 is fest-hour funnel; 286 is fourteen-day wishlist velocity.
Can we latch after seven days?
No—V2 requires ≥14 consecutive days (or documented DEFERRED days that still leave fourteen honest rows).
Is Help #44 required first?
Only when column drift already broke jq—prevention is Guide #45 + this lesson.
Related GamineAI reads
- 16 free Steam daily export / wishlist velocity tools
- Construct wishlist velocity preflight (Guide #45)
- Hour-one funnel Lesson 282
- Post–Next Fest wishlist plateau diagnostic
- March post-fest sprint weekly jq
- Discord playtest CSV ingest Guide
- Help #44 forward — velocity jq fails when Steam column order drifts
- Official: Steamworks Marketing · Construct 3 Manual
Post-fest wishlists lie without fourteen daily exports—file the roster, normalize Steam CSV with jq, paint RED/YELLOW/GREEN, verify, then latch post_fest_wishlist_velocity_ok before the next feature sprint.