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).

Lesson hero for Construct post-fest wishlist velocity receipt

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_visit to 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

  1. D+14 needs daily velocity, not fest-hour funnel alone.
  2. post_fest_wishlist_velocity_ok gates March feature promises.
  3. Guide #45 paints the morning ritual; 286 promotes on BUILD_RECEIPT.
  4. Derived ratios beat hand-typed Sheets theater.
  5. Cousin funnel / Discord receipts stay referenced—not flattened.
  6. 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


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.