Lesson 220: Playtest VOD Facilitator Concat Batch Receipt for Whisper Triage (2026)
Direct answer: Before a multi-session Whisper batch, file facilitator_vod_batch_receipt_v1.json proving every facilitator session in batch_manifest.csv has honest concat_ok on playtest_vod_triage_receipt_v1.json (or a paired ffmpeg_concat_decision_receipt when merge failed)—then set whisper_batch_allowed: true only on the batch aggregate row. This is the H2 BUILD_RECEIPT milestone after Lesson 219, distinct from Lesson 200 (single merge) and Lesson 207 (path when concat fails).

Why this matters now (August 2026 facilitator batch week)
August 2026 fest playtests run three facilitators × two evenings—ops drops twelve MKV folders into one whisper-batch.ps1 run. OBS ffprobe preflight defines concat_ok per session; 16-free OBS/ffmpeg tools lists the stack—but nobody owns batch-level honesty when session 2 failed concat and session 4 used per-clip Whisper without updating triage receipts.
Blog When ffmpeg concat fails is the decision tree; planned help #5 fixes MKV concat—this lesson wires facilitator_vod_batch_receipt_v1.json on BUILD_RECEIPT before overnight triage (pairs Lesson 206 facilitator SOW).
Beginner path (batch manifest + per-session concat)
| Step | Action | Success check |
|---|---|---|
| 1 | One folder per facilitator session | playtest-vod/sessions/<id>/ |
| 2 | Run normalize + concat per session | merged_playtest.wav each |
| 3 | File triage receipt per session | concat_ok honest |
| 4 | Build batch_manifest.csv |
All rows session_concat_ok |
| 5 | File facilitator_vod_batch_receipt_v1.json |
batch_whisper_allowed: true |
| 6 | Thursday row review | playtest_vod_batch column GREEN |
Time: ~25 min per session × 2 sessions + 20 min manifest—70 minutes first two-session batch.
Developer path (gates B1–B6)
| Gate | Check | Fail when |
|---|---|---|
| B1 | facilitator_id + build_label pinned |
Mismatch vs Lesson 206 SOW |
| B2 | batch_manifest.csv complete |
Missing session row |
| B3 | Per-session concat_ok or decision receipt |
Silent concat_ok: true after failed merge |
| B4 | ffprobe_concat_ok_fragment linked each session |
No sha256 on ffprobe table |
| B5 | whisper_batch_allowed policy on batch |
Batch true while any session false |
| B6 | BUILD_RECEIPT playtest_vod_batch row |
Ops runs Whisper without batch receipt |
batch_manifest.csv (B2)
| Column | Example | Rule |
|---|---|---|
session_id |
fac-02-2026-08-03-eve |
Unique |
facilitator_id |
fac-02 |
Matches contract |
surface |
steam_playtest |
From SOW |
fragment_count |
4 |
Matches folder |
concat_ok |
true |
From triage receipt |
decision_receipt_path |
"" or path |
Required when concat_ok false |
triage_receipt_path |
playtest-vod/sessions/.../triage.json |
Relative to evidence root |
merged_wav_sha256 |
sha256:... |
After concat |
concat_ok on playtest_vod_triage_receipt_v1.json (batch column)
Extend the triage receipt with a batch block (do not overwrite per-session truth):
{
"schema": "playtest_vod_triage_receipt_v1",
"build_label": "fest-demo-2026-08-03-rc1",
"surface": "steam_playtest",
"concat_ok": true,
"whisper_batch_allowed": true,
"ffprobe_concat_ok_fragment": "playtest-vod/sessions/fac-02-eve/ffprobe_concat_ok_fragment_v1.json",
"facilitator_batch": {
"batch_id": "batch-2026-08-03-fac-02",
"session_count": 2,
"all_sessions_concat_ok": true,
"facilitator_vod_batch_receipt": "release-evidence/playtest/FACILITATOR_VOD_BATCH_RECEIPT.json"
}
}
When one session has concat_ok: false, set whisper_batch_allowed: false on the batch receipt until Lesson 207 documents chosen_path and post_path_concat_ok (or exclude that session from batch with facilitator sign-off).
facilitator_vod_batch_receipt_v1.json
{
"schema": "facilitator_vod_batch_receipt_v1",
"build_label": "fest-demo-2026-08-03-rc1",
"batch_id": "batch-2026-08-03-fac-02",
"facilitator_id": "fac-02",
"contract_receipt_path": "release-evidence/playtest/facilitator_contract_receipt_v1.json",
"batch_manifest_csv": "playtest-vod/batch_manifest.csv",
"sessions": [
{
"session_id": "fac-02-2026-08-03-eve",
"concat_ok": true,
"triage_receipt_path": "playtest-vod/sessions/fac-02-eve/triage.json",
"merged_wav_sha256": "sha256:REPLACE"
},
{
"session_id": "fac-02-2026-08-04-eve",
"concat_ok": true,
"triage_receipt_path": "playtest-vod/sessions/fac-02-eve2/triage.json",
"merged_wav_sha256": "sha256:REPLACE"
}
],
"batch_whisper_allowed": true,
"whisper_model": "large-v3",
"consent_readme_present": true,
"gates": {
"B1_facilitator_build_label": "pass",
"B2_manifest": "pass",
"B3_per_session_concat": "pass",
"B4_ffprobe_linked": "pass",
"B5_batch_whisper_policy": "pass",
"B6_build_receipt": "pass"
}
}
Pin under release-evidence/playtest/FACILITATOR_VOD_BATCH_RECEIPT.json.
Proof table (two-session batch)
| session_id | concat_ok | decision receipt | batch_whisper_allowed |
|---|---|---|---|
| fac-02-eve | true | n/a | |
| fac-02-eve2 | true | n/a | |
| batch | all true | — | true only if both pass |
BUILD_RECEIPT row
| Column | Green value |
|---|---|
playtest_vod_batch |
facilitator_vod_batch_receipt_v1 |
batch_whisper_allowed |
true |
concat_ok_aggregate |
true |
Cross-link Thursday row review after Wednesday smoke.
Key takeaways
- One batch receipt does not replace per-session triage receipts.
concat_okmust be per session—never average failures away.batch_manifest.csvis the facilitator-facing audit artifact.- Failed concat → Lesson 207 path before batch
whisper_batch_allowed. - OBS E-gates supply ffprobe columns.
- Local Whisper pipeline runs only after batch gate passes.
- 16-tool listicle is prep, not batch policy.
- Facilitator contract VERSION must match B1
build_label. - Cloud Whisper requires consent_readme_present on batch receipt.
- H2 capstone 223 wired fest hardening; Q1 224 owns MKV gap reencode on BUILD_RECEIPT when session merge is short.
Common mistakes
- One
concat_ok: trueon batch JSON while a session folder has no merged WAV. - Mixing facilitators in one batch without separate receipts.
- Running Whisper on folder tree before B2 manifest exists.
- Using per-clip transcripts but tagging issues with wrong session_id.
- Skipping
ffprobe_table_sha256on session 2 because session 1 passed.
Troubleshooting
| Symptom | Lane |
|---|---|
| Batch blocked, one session red | Fix session; re-file triage; refresh manifest |
| concat_ok false, urgent triage | OBS MKV gap reencode preflight + Lesson 207 + help #5 (planned) |
| ffprobe columns missing | OBS guide E2 |
| Facilitator VERSION drift | Lesson 206 contract receipt |
Mini exercise (65 minutes)
- Seed two session folders with three fragments each.
- Pass E-gates + concat per session; file triage receipts.
- Author
batch_manifest.csvwith honestconcat_ok. - Deliberately fail session 2 concat—confirm B5 blocks batch Whisper.
- Recover with
reencode_concat; refresh batch receipt; update BUILD_RECEIPT.
Continuity — H2 2026 arc (218–223)
| Lesson | Receipt focus |
|---|---|
| 218 | Deck static menu |
| 219 | Addressables fest string tables |
| 220 (this) | Facilitator VOD concat batch |
| 221 | Facilitator amendment |
| 222–223 | HTML5 + capstone |
Previous: Lesson 219 — Addressables string table fest receipt
Next: Lesson 221 — multi-channel facilitator amendment.
FAQ
Same as Lesson 200?
200 is one merge gate; 220 is N sessions under one facilitator batch with facilitator_vod_batch_receipt.
Same as Lesson 207?
207 picks a path when one concat fails; 220 requires every session resolved before batch Whisper.
Can sessions use different Whisper models?
Document per-session overrides in manifest notes—default one whisper_model on batch receipt unless compliance requires split.
October fest only?
Hook is August 2026 multi-facilitator batches; discipline applies whenever batching VOD triage.
What if VERSION changes mid-batch?
Invalidate affected sessions in the batch receipt; file Lesson 221 amendment before re-running Whisper.
A batch Whisper job without facilitator_vod_batch_receipt_v1.json is not “faster triage”—it is unaccountable mixing of broken and healthy sessions.