Lesson 227: Steam Review-Key Press Demo Scope Receipt (2026)
Direct answer: Before you send January 2027 Next Fest press or curator key batches, file review_key_demo_scope_receipt_v1.json proving each batch maps to fest_demo branch + build_id, hour-one features match store FAQ, and press URLs differ from playtest invites—then set BUILD_RECEIPT review_key_demo_scope to verified. After Lesson 206 facilitator contract and distinct from playtest isolation alone.

Why this matters now (January 2027 Next Fest press keys)
January 2027 coverage installs before public fest traffic. Teams finish Wwise packaged rows then blast keys with email copy still saying “full beta” while the depot is fest_demo_2027_01. Outlets quote modes you gated off; players arrive angry because review key checklist promised co-op. Planned blog #11 (facilitator contract template) governs who runs sessions; this lesson governs what build keys unlock.
The playtest isolation playbook owns playtest_isolation_receipt; press keys are a fourth surface on the scope map—same build_label, different email + redemption path proof.
Beginner path (key batch audit)
| Step | Action | Success check |
|---|---|---|
| 1 | Open playtest_scope_map_v1.json |
press row exists |
| 2 | Redeem one test key on clean account | Installs fest branch |
| 3 | Run hour-one checklist (15 min) | Matches store bullets |
| 4 | Compare key email text vs FAQ | No “full game” drift |
| 5 | File review_key_demo_scope_receipt_v1.json |
key_batch_scope_ok: true |
| 6 | Update BUILD_RECEIPT | review_key_demo_scope GREEN |
Time: ~2 hours first batch + template rewrite—72 minutes when scope map is pinned.
Developer path (gates K1–K6)
| Gate | Check | Fail when |
|---|---|---|
| K1 | playtest_scope_map_v1.json current |
Missing press / curator rows |
| K2 | Key activates fest depot | Wrong branch or deprecated build |
| K3 | Hour-one feature matrix | Press unlocks gated mode |
| K4 | Email + README labels | “Beta” / “EA” language mismatch |
| K5 | URL matrix isolated | Playtest URL in press email |
| K6 | BUILD_RECEIPT row | Keys ship without receipt |
Press vs playtest URL matrix (K5)
| Surface | Allowed URL type | Example label | Must not appear in |
|---|---|---|---|
steam_playtest |
Playtest invite link | Playtest — build 2027-01-rc1 |
Press email body |
fest_public |
Store demo / Next Fest | Fest demo — hour-one slice |
Playtest NDA thread |
press |
Review key redemption | Press install — DEMO scope |
Public Discord |
curator |
Curator key batch | Curator — DEMO only |
Playtest facilitators |
Archive release-evidence/steam/review_key_url_matrix.csv with columns: surface, url, build_id, branch, nda_required.
Hour-one proof table (K3)
| Feature | Store FAQ claims | Key install shows | Pass? |
|---|---|---|---|
| Max players | |||
| Co-op / online | |||
| Progression carries | |||
| DLC / IAP |
Fail closed when any Yes in FAQ is No in first 15 minutes of press install.
review_key_demo_scope_receipt_v1.json
{
"schema": "review_key_demo_scope_receipt_v1",
"build_label": "fest-demo-2027-01-14-rc1",
"build_id": "12345678",
"steam_branch": "fest_demo_2027_01",
"key_batch_id": "press-batch-2027-01-12",
"keys_issued_count": 50,
"surfaces": {
"press": {
"url": "https://store.steampowered.com/app/APPID/",
"branch": "fest_demo_2027_01",
"hour_one_pass": true
},
"steam_playtest": {
"url": "https://playtest.steamplaytest.com/INVITE",
"isolated_from_press": true
}
},
"email_scope_label": "DEMO — hour-one fest slice only",
"faq_row_1_aligned": true,
"paired_receipts": {
"facilitator_contract": "release-evidence/playtest/FACILITATOR_CONTRACT_RECEIPT.json",
"playtest_isolation": "release-evidence/playtest/PLAYTEST_ISOLATION_RECEIPT.json"
},
"gates": {
"K1_scope_map": "pass",
"K2_key_depot": "pass",
"K3_hour_one": "pass",
"K4_email_labels": "pass",
"K5_url_matrix": "pass",
"K6_build_receipt": "pass"
},
"key_batch_scope_ok": true,
"fest_promotion_allowed": true
}
Pin under release-evidence/steam/REVIEW_KEY_DEMO_SCOPE_RECEIPT.json.
BUILD_RECEIPT row (K6)
| Column | Pass when |
|---|---|
review_key_demo_scope |
Receipt path + key_batch_scope_ok: true |
build_id / build_label |
Matches redeemed test key |
playtest_isolation |
Independent—isolation playbook |
facilitator_contract |
Lesson 206 when contractors send keys |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
review_key_scope_blocked BOOLEAN NOT NULL DEFAULT false;
CI verify_review_key_demo_scope_v1 fails when keys_issued_count > 0 and key_batch_scope_ok is false for that build_label.
Relationship to facilitator ops
| Artifact | Owner |
|---|---|
facilitator_contract_receipt |
Lesson 206 / blog #11 |
playtest_isolation_receipt |
Isolation playbook |
review_key_demo_scope_receipt |
This lesson (press/curator) |
Contractors must not email press keys—only producers with K6 sign-off.
Key takeaways
- Press keys are store-adjacent truth—not logistics.
- Hour-one proof beats email adjectives.
presssurface is separate fromsteam_playtestURLs.- Redeem one key yourself before batch 50.
- Review keys checklist blog is the strategy doc; this lesson is BUILD_RECEIPT promotion.
- Lesson 221 amendment invalidates keys when
VERSIONchanges—re-issue batch. - Q1 capstone 229 wires 227 with 224–226, 228.
- 12-free isolation runbooks list tools; receipt is policy.
Common mistakes
- Sending keys before hour-one matrix is green.
- Press email links playtest invite URL.
build_idin receipt ≠ redeemed depot.- FAQ says solo; press kit still says co-op.
- Issuing keys on
mainwhile fest usesfest_demobranch.
Troubleshooting
| Symptom | Lane |
|---|---|
| Key installs wrong game | Steamworks app ID audit |
| Key works, wrong branch | K2 depot + branch naming checklist |
| Press quotes wrong mode | K4 email + press kit refresh |
| Playtest leak in press thread | K5 URL matrix + Lesson 206 SOW |
| VERSION bump mid-batch | Lesson 221 amendment — revoke keys |
Mini exercise (72 minutes)
- Add
press+curatorrows toplaytest_scope_map_v1.json. - Redeem test key; log
build_id+ branch. - Run hour-one checklist; fail one row deliberately.
- Fix FAQ or build; pass K3; file receipt.
- Draft press email with DEMO label only; attach receipt path to BUILD_RECEIPT.
Continuity — Q1 2027 post-fest recovery (224–229)
| Lesson | Receipt focus |
|---|---|
| 224–226 | VOD, Ren'Py, Wwise |
| 227 (this) | Review-key demo scope |
| 228 | FMOD WebGL fest snapshot |
| 229 | Q1 capstone (queued) |
Previous: Lesson 226 — Wwise DSP packaged Windows
Next: Lesson 228 — FMOD WebGL fest demo snapshot receipt.
FAQ
Same as playtest isolation?
Isolation prevents playtest URLs on fest threads; 227 proves press keys unlock the demo you advertise.
Same as facilitator contract?
206 governs contractor behavior; 227 governs key batch ↔ demo scope proof.
Curator vs press batches?
Separate rows in receipt surfaces—same K-gates per batch.
A press key email that lies about scope is a refund headline waiting to happen—redeem one key, prove hour-one, file review_key_demo_scope_receipt, then send the batch.