Lesson 206: Multi-Channel Facilitator Contract and version_pin_ok Receipt (2026)
Direct answer: External facilitators need a written SOW that pins VERSION, lists allowed surfaces (playtest, fest_public, itch_public, gx_public), requires OBS audio gate proof before VOD batching, and commits to facilitator_contract_receipt_v1.json on your BUILD_RECEIPT row—after Lesson 201 channel_label_match and before Lesson 207 Whisper path when concat fails.

Why this matters now (October 2026 facilitator week)
October 2026 micro-studios hire contract facilitators to run GX + Steam + itch playtests in the same calendar week. Labels can match (triple-channel receipt) while behavior still diverges:
- Facilitators share fest_public URLs in a playtest Discord thread.
- OBS clips lack 48 kHz audio gates before concat batch.
- Contractors invoice against build IDs that never appeared in your scope map (playtest isolation).
The upcoming blog Multi-Channel Playtest Facilitator Contract Template (backlog #11) will ship a transactional template; this lesson is the course milestone that makes the contract machine-checkable via receipts. Press keys: Lesson 227 — review_key_demo_scope_receipt proves key batches match demo hour-one scope—contractors must not send press keys. GameMaker HTML5 teams run VERSION pin preflight before facilitators sign so version_pin_ok matches GX/Steam/itch upload logs.
Beginner path (40-minute contract draft)
| Step | Action | Success check |
|---|---|---|
| 1 | Copy repo-root VERSION into SOW §2 |
Same string as BUILD_RECEIPT |
| 2 | List three canonical URLs (Steam playtest, GX, itch) | Matches playtest_scope_map_v1.json |
| 3 | Add OBS audio gate clause (48 kHz, no music bed) | Facilitator initials |
| 4 | Require concat_ok before Whisper batch |
Links Lesson 200 policy |
| 5 | Sign SOW + store PDF in legal/facilitators/ |
Dated signature |
| 6 | Generate facilitator_contract_receipt_v1.json |
version_pin_ok: true |
| 7 | Patch BUILD_RECEIPT row | facilitator_contract_pass: true |
Time: ~40 minutes for first SOW; full lesson 68 minutes with SQL gate + Discord README pin.
Developer path (gates F1–F6)
| Gate | Check | Fail when |
|---|---|---|
| F1 | SOW version_pin equals VERSION file |
Drift or typo |
| F2 | All URLs in SOW exist in scope map | Mystery storefront |
| F3 | OBS profile documented (sample_rate, tracks) |
Missing audio spec |
| F4 | channel_label_match true on paired build |
Lesson 201 red |
| F5 | facilitator_contract_receipt_v1.json validates |
Schema errors |
| F6 | BUILD_RECEIPT version_pin_ok |
Any F1–F5 red |
facilitator_contract_receipt_v1.json
{
"schema": "facilitator_contract_receipt_v1",
"facilitator_id": "fac-oct-2026-01",
"sow_pdf_sha256": "sha256:REPLACE_WITH_REAL_HASH",
"version_pin": "fest-demo-2026-10-01-rc1",
"version_pin_ok": true,
"surfaces_authorized": ["playtest", "gx_public", "itch_public"],
"obs_audio_gate": {
"sample_rate_hz": 48000,
"tracks_max": 2,
"music_bed_allowed": false
},
"receipts_required": [
"triple_channel_label_receipt_v1",
"playtest_vod_triage_receipt_v1"
],
"channel_label_match_at_sign": true
}
Pin under release-evidence/ops/FACILITATOR_CONTRACT_RECEIPT.json.
Discord / README facilitator pin block
## Playtest week — build pin
- **VERSION:** fest-demo-2026-10-01-rc1
- **Surfaces:** playtest (Steam), gx_public, itch_public
- **Do not share:** fest_public store URL in this thread
- **VOD:** OBS 48 kHz → concat_ok before Whisper (see facilitator SOW)
- **Receipts:** facilitator_contract_receipt_v1.json on main branch
SOW sections (copy-ready)
§1 Scope of work
Facilitator runs three sessions (90 minutes each) on authorized surfaces only. No store-page QA, no trailer capture, no press keys.
§2 Version pin
version_pin must equal repository VERSION at session start. If VERSION changes mid-week, facilitator stops until new SOW amendment is signed—file Lesson 221 facilitator_amendment_receipt before resuming sessions or batch Whisper.
§3 Evidence deliverables
| Deliverable | Format | Due |
|---|---|---|
| Session notes | Markdown in repo | +24h |
| OBS Replay Buffer clips | .mkv per session |
+24h |
playtest_vod_triage_receipt_v1.json row |
JSON | +48h |
| Surface tags on every clip | surface column |
per clip |
§4 Audio and VOD policy
Align with 16 OBS ffmpeg tools listicle and OBS normalize preflight: normalize before concat; whisper_batch_allowed false when concat_ok false (Lesson 200).
§5 Multi-channel URLs
| Surface | URL pattern | Receipt |
|---|---|---|
playtest |
Steam playtest invite | playtest_isolation_receipt_v1 |
gx_public |
GX.games upload | GX tools resource |
itch_public |
*.itch.io subdomain |
itch MIME help |
Publish gate
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
facilitator_contract_blocked BOOLEAN NOT NULL DEFAULT false;
CI verify_facilitator_contract_v1 blocks external playtest spend when version_pin_ok is false or SOW hash mismatches committed receipt.
Wire into BUILD_RECEIPT row
| Column | Example |
|---|---|
build_label |
fest-demo-2026-10-01-rc1 |
version_pin_ok |
true |
facilitator_contract_pass |
true |
channel_label_match |
true |
facilitator_id |
fac-oct-2026-01 |
Thursday row review must show version_pin_ok beside channel_label_match.
Prerequisites
- Lesson 201 — triple-channel labels
- Phaser 3 surface tagging preflight — boot log audit for HTML5 facilitators
- Lesson 205 — July H2 arc complete
- Playtest isolation playbook
- Community playtest ops resource
- Triple-channel help fix
Common mistakes
- Signing SOW before
channel_label_matchpasses—facilitators reproduce on wrong builds. - Letting facilitators invent fourth URLs (Discord CDN, Google Drive) not in scope map.
- Paying invoice when
version_pin_okfalse but clips “look fine.” - Omitting OBS audio gate—Whisper triage wastes overnight GPU on silent tracks.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
SOW version ≠ VERSION |
Hotfix without amendment | Re-sign §2 |
| Facilitator shares fest URL | Scope bleed | Playtest isolation |
| Receipt validates, labels red | Lesson 201 skipped | Fix triple-channel first |
| Contract pass, concat fails | Audio/normalize | Guide queue #3 OBS preflight |
Mini exercise (55 minutes)
- Draft SOW from sections above; intentionally break F1 (
version_pintypo). - Run validator; confirm
version_pin_ok: false. - Fix pin; regenerate
facilitator_contract_receipt_v1.json. - Add BUILD_RECEIPT row; link from community playtest resource.
- Pin Discord README block; verify facilitator cannot post
fest_publiclink without scope warning.
Continuity
- Previous: Lesson 205 — Deck
gpu_idle_smoke_pass(July H2 arc) - Next: Lesson 207 — Whisper path when concat fails
- Arc close: Lesson 211 — Q4 capstone
- Blog (planned): Multi-channel facilitator contract template (#11)
- Guide (planned): GameMaker GX upload preflight (#8)
FAQ
Does this replace a lawyer?
No—this is an ops SOW skeleton for indie facilitator weeks; escalate commercial terms locally.
Can one facilitator cover only Steam?
Yes—set surfaces_authorized to ["playtest"] only; do not claim triple-channel pass on BUILD_RECEIPT.
GX-only facilitators?
Require gx_public + channel_label_match for GX lane; omit Steam URLs from SOW §5 table.
Relationship to Lesson 201?
Lesson 201 proves labels; Lesson 206 proves people and process honor those labels under contract.
Labels matching across storefronts is not enough until a signed facilitator contract pins VERSION and receipts prove version_pin_ok before playtest week spend.