Lesson 266: Whisper Playtest Issue Tag Receipt on BUILD_RECEIPT (2026)
Direct answer: After Whisper transcripts exist but before gh issue create, promote whisper_issue_tag_receipt_v1.json with W1–W6 gates, a whisper_issue_tag_map_v1 JSON per clip, producer human gate, and build_id only from BUILD_RECEIPT—fail-closed on invented repro. Pair the Whisper tag map preflight (Guide #28), Whisper→GitHub strategy blog, and Lesson 207 chosen_path discipline.

Why this matters now (November fest close-out triage)
November 2026 facilitators batch 40+ Whisper transcripts per week after OBS concat nights. LLM summarize buttons invent “beat boss → backtrack” repro steps never spoken in the clip. Programmers burn stand-up time on cannot reproduce while the real bug hides in build_id drift, per_clip_local timestamps, or fest_public surface mis-tags.
October ops capstone 265 wired 254–264 store/CI columns—266 opens the November playtest triage truth arc: quotes and BUILD_RECEIPT facts only on GitHub.
The strategy blog is the checklist; 266 is the BUILD_RECEIPT milestone before promotion.
Beginner path (transcript → tag map → human gate)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm .txt transcript path + sha256 |
W1 pass |
| 2 | Pull build_id from BUILD_RECEIPT only |
W2 character match |
| 3 | Draft tag map JSON (quotes only) | W3 + W4 |
| 4 | Producer reads transcript verbatim | W5 row in facilitator README |
| 5 | Open GitHub issue (quote-only body) | Issue # recorded |
| 6 | File receipt + BUILD_RECEIPT column | github_issue_allowed: true |
Time: ~55 minutes first November batch night; ~12 minutes per clip when tag map template is pinned.
Quote-only issue body (copy/paste)
## Playtest VOD triage (quote-only)
**Build:** 2026-11-04-playtest-rc4
**Fragment:** fragment_03.mkv
**Surface:** playtest
**Whisper path:** per_clip_local
**Transcript:** playtest-vod/transcripts/fragment_03_2026-11-04.txt
### Player quote
> 04:12 — soft lock after boss door when backtracking
### Repro steps
Unknown — quote-only triage (no invented steps)
### Labels
bug, playtest, P2, progression
Rule: If repro_steps_quoted is empty, the issue body must say Repro: unknown — quote-only triage.
Developer path (gates W1–W6)
| Gate | Check | Fail when |
|---|---|---|
| W1 | Transcript exists | Path missing or sha256 mismatch |
| W2 | build_id crosswalk BUILD_RECEIPT |
Discord pin ≠ receipt row |
| W3 | Tag map JSON drafted | Quotes not from transcript |
| W4 | Invented repro blocked | LLM steps in issue body |
| W5 | Human gate sign-off | Producer + UTC before API |
| W6 | whisper_issue_tag_receipt_v1.json |
github_issue_allowed false at promote |
Align with Guide #28 preflight — blog = strategy; guide = ninety-second gate; 266 = BUILD_RECEIPT column.
W1 — Transcript + hash
TRANSCRIPT="playtest-vod/transcripts/fragment_03_2026-11-04.txt"
test -f "$TRANSCRIPT"
sha256sum "$TRANSCRIPT"
PowerShell:
Get-FileHash "playtest-vod\transcripts\fragment_03_2026-11-04.txt" -Algorithm SHA256
Log path + hash in receipt. If transcript empty, fix upstream (MKV concat help, loudness spot)—do not invent repro in GitHub.
W2 — build_id crosswalk
BUILD="$(jq -r '.build_id' release-evidence/BUILD_RECEIPT.json)"
MAP_BUILD="$(jq -r '.build_id' release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_MAP_fragment_03.json)"
test "$BUILD" = "$MAP_BUILD"
Fail-closed: if Discord pin disagrees, fix clip labeling before W3. Visible build label on the demo helps players confirm the same string.
W3 — whisper_issue_tag_map_v1.json
{
"schema": "whisper_issue_tag_map_v1",
"build_id": "2026-11-04-playtest-rc4",
"fragment_id": "fragment_03.mkv",
"surface": "playtest",
"chosen_whisper_path": "per_clip_local",
"transcript_path": "playtest-vod/transcripts/fragment_03_2026-11-04.txt",
"transcript_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"quotes": [
{ "timestamp": "04:12", "text": "soft lock after boss door when backtracking" }
],
"area_tags_proposed": ["progression"],
"severity_proposed": "P2",
"repro_steps_quoted": [],
"repro_steps_invented_blocked": true,
"allowed_facts_source": "BUILD_RECEIPT + transcript only"
}
Pin as release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_MAP_fragment_03.json.
Area tag rule: map player words to allowed enum—do not add combat if transcript only mentions “door.”
W4 — LLM guard table
| Field | Allowed | Blocked |
|---|---|---|
| Summary | Paraphrase quote | New mechanics not in clip |
| Repro steps | Verbatim tester steps | LLM “beat boss → backtrack” |
| Build | BUILD_RECEIPT build_id |
“Latest Steam build” |
| Timestamps | From transcript SRT/txt | Merged offset on per_clip_local |
Add to facilitator README:
## LLM summarize ban list
- Do not ask models to "write repro steps"
- Do not paste "Repro (guess)" sections
- Allowed: extract quotes + propose P0-P3 + area tags
W5 — human gate before GitHub API
## Whisper → GitHub human gate
| Clip | Approver | UTC timestamp | issue # |
|------|----------|---------------|---------|
| fragment_03.mkv | producer@studio | 2026-11-05T10:00:00Z | GH-142 |
No gh issue create until W5 row exists. Automation may draft W3 JSON; humans publish.
W6 — whisper_issue_tag_receipt_v1.json
{
"schema": "whisper_issue_tag_receipt_v1",
"build_label": "2026-11-04-playtest-rc4",
"tag_map_path": "release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_MAP_fragment_03.json",
"github_issue_number": 142,
"github_issue_url": "https://github.com/org/game/issues/142",
"cousin_receipts": {
"playtest_vod_triage": "release-evidence/playtest/PLAYTEST_VOD_TRIAGE_RECEIPT.json",
"ffmpeg_concat_decision": "release-evidence/playtest/FFMPEG_CONCAT_DECISION_RECEIPT.json"
},
"gates": {
"W1_transcript_exists": "pass",
"W2_build_id_crosswalk": "pass",
"W3_tag_map_json": "pass",
"W4_invented_repro_blocked": "pass",
"W5_human_gate": "pass",
"W6_receipt": "pass"
},
"github_issue_allowed": true,
"invented_repro_blocked": true
}
Path: release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_RECEIPT_fragment_03.json.
C1 — cousin receipt crosswalk
| Field | Cousin (207) | Cousin (200) | This lesson (266) |
|---|---|---|---|
| Schema | ffmpeg_concat_decision_receipt_v1 |
playtest_vod_triage_receipt_v1 |
whisper_issue_tag_receipt_v1 |
| Scope | chosen_path when concat fails |
concat_ok before batch |
GitHub issue honesty after ASR |
| Path | release-evidence/playtest/concat-decision/ |
release-evidence/playtest/triage/ |
release-evidence/playtest/whisper-tags/ |
Do not merge schemas—reference paths in cousin_receipts only.
W6 — BUILD_RECEIPT promotion jq
RECEIPT="release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_RECEIPT_fragment_03.json"
jq -e '.github_issue_allowed == true' "$RECEIPT"
jq -e '.invented_repro_blocked == true' "$RECEIPT"
jq -e '.gates.W5_human_gate == "pass"' "$RECEIPT"
Add Whisper issue human gate Y/N column beside crash rows in Thursday BUILD_RECEIPT review.
Severity rubric (P0–P3 from player words)
| Severity | Player signal examples | Issue label | Smoke scope |
|---|---|---|---|
| P0 | “cannot progress”, “crash every time”, “save broken” | P0-blocker |
Blocks Wednesday smoke |
| P1 | “soft lock”, “quest stuck”, “inventory gone” | P1-major |
Same-week fix target |
| P2 | “confusing”, “UI wrong”, “audio glitch once” | P2-minor |
Backlog unless cluster |
| P3 | “typo”, “wish”, “maybe later” | P3-triage |
Defer list |
Facilitator rule: severity comes from quote tone + repeat reports, not LLM drama.
Surface and fragment_id discipline
Playtest isolation playbook requires honest surface tags:
surface |
GitHub label | Wrong pairing |
|---|---|---|
playtest |
playtest |
fest_public clip with playtest label |
fest_public |
fest_public |
Steam Playtest URL on fest demo issue |
When chosen_whisper_path: per_clip_local (Lesson 207), every issue carries fragment_id, not merged timeline offset. Cousin: Lesson 200 concat_ok gate sets whisper_batch_allowed—do not open GitHub issues on batch path clips using per-clip timestamps.
Key takeaways
- W4 blocks invented repro—quote-only triage is valid; LLM guesses are not.
build_idonly from BUILD_RECEIPT (W2)—not Discord memory.fragment_idon per-clip path—not merged offsets (Lesson 207).- Human gate before GitHub API (W5)—automation drafts, humans publish.
- Guide #28 preflight — ninety-second gate before this lesson.
- Strategy blog owns W1–W6 narrative; 266 owns BUILD_RECEIPT column.
- Help #5 MKV concat fix — upstream when transcripts never arrive.
- 15 free Whisper + ffmpeg tools — ASR lane before tagging.
- Cousin: Lesson 267 forward — Discord CSV ingest on smoke scope.
- October capstone 265 closed store/CI arc—266 opens November triage truth.
- Q4 diligence crash lane is separate—
crash_symbolicate_receipt_v1≠whisper_issue_tag_receipt_v1.
Common mistakes
- Pasting LLM “Repro (guess)” without W4 scrub.
build_idfrom memory instead of BUILD_RECEIPT (W2).- Opening issues on
fest_publicwith playtest labels. - Skipping W5 because “the bot already posted.”
- Merging per-clip quotes into one issue without separate
fragment_idrows. gh issue createbefore transcript sha256 logged (W1).- Using merged-batch timestamps when
chosen_path: per_clip_local.
Troubleshooting
| Symptom | Lane |
|---|---|
| Cannot reproduce closes spike | W4 quote-only body; verify W2 build_id |
| Empty transcript | MKV concat help; Lesson 207 path tree |
| Silent / clipped Whisper | Audacity loudness spot preflight; Lesson 273 |
| Bot opened issue before W5 | Close; re-open after human gate |
422 Unprocessable Entity on gh issue create |
GitHub 422 invented repro help — quote-only body + dry-run |
| P0 label on “kinda weird” | Severity from quote tone—wait for second fragment |
Mini exercise (50 minutes)
- Start with a real
.txttranscript—log W1 sha256. - Crosswalk
build_idfrom BUILD_RECEIPT (W2). - Draft tag map JSON—confirm W4 blocks invented repro.
- Producer signs W5 row before
gh issue create. - File
whisper_issue_tag_receipt_v1.json; jq promotion gates. - Add BUILD_RECEIPT Whisper issue human gate column for Thursday review.
Continuity — November 2026 fest close-out + playtest triage (266–276)
| Lesson | Receipt focus |
|---|---|
| 265 | October ops capstone |
| 266 (this) | Whisper issue tag BUILD_RECEIPT |
| 267 | Discord CSV ingest |
Previous: Lesson 265 — October ops truth capstone
Next: Lesson 268 — Unity CI concurrency cancel Library poison receipt
FAQ
Same as the strategy blog?
Blog owns W1–W6 narrative and templates; 266 is the course milestone with BUILD_RECEIPT promotion jq.
Same as Guide #28?
Guide = ninety-second preflight; 266 = receipt culture + cousin crosswalk to 207/200.
Can we use ChatGPT for repro if marked guess?
No. W4 is fail-closed. Use Repro: unknown — quote-only triage or verbatim tester steps only.
What if player gave detailed repro on voice?
Populate repro_steps_quoted with verbatim lines—still no LLM expansion.
Does this replace GitHub Projects?
No. Minimum honesty for VOD-derived issues; export tags after W6.
How does crash symbolicate relate?
Separate Q4 diligence lane—do not merge receipt schemas.
Cloud Whisper allowed?
Policy per concat decision tree—W1–W6 still apply to whatever transcript you file.
November triage lies when LLMs invent repro—file the tag map, run W1–W6, get human gate, then open GitHub with quotes and build_id only.