Whisper Playtest Tag Extraction to Structured GitHub Issues Without Invented Repro Steps - 2026
Your facilitator pasted a Whisper summary into GitHub. The issue reads: Repro: defeat boss → backtrack → interact with door → soft-lock. The player never said defeat boss. The programmer spent forty minutes on a path that does not exist in the clip. The ticket closed cannot reproduce while the real bug—wrong build_id, wrong fragment_id, or a per_clip_local quote merged into a fake timeline—stays invisible.
June–October 2026 async playtest volume outruns stand-up time. Teams adopted local Whisper VOD triage, ffmpeg concat decision trees, and BUILD_RECEIPT rows—but the last mile (GitHub Issues) still runs on LLM optimism. ChatGPT fills missing repro. Copilot drafts steps from genre tropes. A tired producer clicks Create issue before reading the transcript.
This AI Integration / Workflow post owns strategy: how to extract structured tags from Whisper output, file whisper_issue_tag_receipt_v1.json, enforce a human gate before GitHub API, and ship issues with build_id-only facts plus quoted speech—never invented repro. The ninety-second checklist lives in Whisper transcript tag map preflight (Guide); this article explains why, when, and how teams wire the discipline layer.
Non-repetition note: Local Whisper pipeline owns folder + batch triage; AI voice QA reason codes owns WAV tag hallucination; concat decision tree owns chosen_path when merge fails. This URL owns Whisper → GitHub issue discipline—not OBS concat fixes (Help MKV concat), not crash symbolication (October evening tutorial).
Why this matters now (June–October 2026)
- Batch transcript nights — After OBS Replay Buffer concat evenings, facilitators run Whisper on 40+ clips per week; summarization without gates scales false repro faster than real bugs.
- LLM default behavior — Models complete stories. A player saying “stuck after the door” becomes a full quest walkthrough in the issue body unless you block it.
- Programmer trust collapse — Three cannot reproduce closes per fest week and engineers stop reading
#playtest—exactly when refund correlation needs honestbuild_labelrows. - Publisher diligence — Q4 observability analysis treats playtest triage as a separate lane from crash receipts; partners ask how you prevent fabricated steps in issue trackers.
- Visible build labels — Player-visible build label opinion supplies
build_idfacts; this workflow consumes them in GitHub bodies without guessing “latest Steam build.”
Direct answer: Draft whisper_issue_tag_map_v1.json per clip (quotes + proposed severity/area), run W1–W6 gates, get producer sign-off, then call GitHub API with quote-only bodies and file whisper_issue_tag_receipt_v1.json.
Who this is for
| Audience | Outcome |
|---|---|
| Solo founder | Copy/paste issue template with build_id only facts |
| Producer | Human gate roster before any gh issue create |
| Facilitator | Stop pasting LLM repro into GitHub |
| Engineer | Searchable issues tied to fragment_id and BUILD_RECEIPT |
| QA contractor | Severity rubric that matches player words |
Time: ~90 minutes to wire templates + first issue; ~15 minutes per clip once tag map is pinned.
Prerequisites: Whisper .txt per clip; Lesson 207 chosen_path; BUILD_RECEIPT row for that playtest night.
Mental model — four layers
Transcript (ground truth)
│
v
Tag map JSON (quotes + proposed tags)
│
v
Human gate (producer sign-off)
│
v
GitHub issue (quote-only body)
│
v
whisper_issue_tag_receipt_v1.json
| Layer | Allowed content | Blocked content |
|---|---|---|
| Transcript | Player speech, timestamps | Facilitator paraphrase as fact |
| Tag map | Quotes, build_id, fragment_id, proposed P0–P3 |
Invented repro steps |
| Human gate | Approver + UTC timestamp | Bot-only publish |
| GitHub issue | Quotes + build_id + “Repro: unknown” |
LLM quest walkthrough |
Rule: If repro_steps_quoted is empty in the tag map, the issue body must say Repro: unknown — quote-only triage. Programmers escalate with questions; they do not close as false repro on invented paths.
Beginner path — copy/paste issue template
Use this before you touch GitHub API or LLM summarize buttons.
Step 1 — Confirm transcript file (2 minutes)
playtest-vod/transcripts/fragment_03_2026-11-04.txt
Filename should include fragment_id and date. If you used per_clip_local per Lesson 207, do not reference merged-batch timestamps in the issue.
Step 2 — Pull build_id from BUILD_RECEIPT only (1 minute)
jq -r '.build_id' release-evidence/BUILD_RECEIPT.json
Fail-closed: if Discord pin says a different build, fix clip labeling before opening issues. Visible build label on the demo helps players confirm the same string.
Step 3 — Paste quote-only issue body (5 minutes)
## 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
Step 4 — Producer reads transcript (5 minutes)
Producer confirms the quote exists verbatim in .txt. No API call until this human step completes.
Step 5 — File receipt JSON (5 minutes)
Pin whisper_issue_tag_receipt_v1.json under release-evidence/playtest/whisper-tags/ (full schema in Developer path below).
Success check: A programmer who never watched the VOD can find the clip, know the build, and see only what the player said—without a fabricated quest path.
Developer path — W1–W6 gates + receipts
These gates align with Whisper tag map preflight (Guide). Blog = strategy; guide = ninety-second checklist.
| Gate | Check | Pass when |
|---|---|---|
| W1 | Transcript exists | Path + sha256 in receipt |
| W2 | build_id crosswalk BUILD_RECEIPT |
Character match receipt row |
| W3 | Tag map JSON drafted | Quotes only from transcript |
| W4 | Invented repro blocked | No steps unless quoted verbatim |
| W5 | Human gate sign-off | Producer + UTC timestamp |
| W6 | whisper_issue_tag_receipt_v1.json |
github_issue_allowed: true |
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
}
Thursday BUILD_RECEIPT row review — add Whisper issue human gate Y/N column beside crash and refund rows.
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 per founder time-box |
Facilitator rule: severity comes from quote tone + repeat reports, not from LLM drama. One clip saying “kinda weird” is P3 until a second fragment confirms.
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, every issue carries fragment_id, not merged timeline offset. Cousin: Lesson 200 concat_ok gate sets whisper_batch_allowed on triage receipt—do not open GitHub issues on batch path clips using per-clip timestamps.
GitHub issue forms (structured fields)
Use GitHub Issue forms to block free-text repro:
name: Playtest VOD (quote-only)
description: Whisper triage — no invented repro
body:
- type: input
id: build_id
attributes:
label: BUILD_RECEIPT build_id
validations:
required: true
- type: input
id: fragment_id
attributes:
label: fragment_id (mkv)
- type: textarea
id: player_quote
attributes:
label: Verbatim player quote
validations:
required: true
- type: dropdown
id: repro_known
attributes:
label: Repro steps known?
options:
- "No — quote-only triage"
- "Yes — tester stated steps verbatim (paste below)"
- type: textarea
id: repro_verbatim
attributes:
label: Verbatim repro (only if tester stated)
CI sketch: gh issue create --dry-run must exit 0 before W6 receipt marks github_issue_allowed: true. Pairs forward Help #5 API validation lane.
Automation boundaries (what bots may and may not do)
| Action | Bot OK? | Human required? |
|---|---|---|
| Draft tag map JSON from transcript | Yes | W5 before publish |
Propose area_tags_proposed |
Yes | Producer confirms |
gh issue create |
Only after W5 | Yes |
| Invent repro to “help programmers” | Never | N/A |
| Close issue as cannot reproduce | Engineer | Quote-only issues need questions first |
Webhook anti-pattern: Slack bot posts “New playtest bug” with LLM summary before W4 scrub—delete and re-open quote-only.
Weekly ritual — Tuesday tag extract, Wednesday smoke
Align with Tuesday CSV ingest ritual and Wednesday smoke:
| Day | Action | Receipt |
|---|---|---|
| Tuesday PM | Whisper batch completes; tag maps drafted | playtest_vod_triage_receipt_v1.json |
| Tuesday PM +15 | Human gate on top P0/P1 quotes | W5 roster |
| Tuesday PM +30 | GitHub issues published (quote-only) | whisper_issue_tag_receipt_v1.json |
| Wednesday AM | 15-minute smoke | P0 blockers from issues |
Blocker count in smoke scope should match open P0 issues with passing W6—not Discord vibes.
Proof table (facilitator audit)
| Row | Evidence | Pass |
|---|---|---|
| Transcript sha256 | W1 receipt field | Matches file on disk |
| BUILD_RECEIPT crosswalk | W2 jq output | Exact string match |
| Quote in issue | Screenshot + issue URL | Substring of transcript |
| No invented repro | W4 repro_steps_invented_blocked |
true |
| Human gate | W5 roster row | Timestamp before API |
| Cousin triage | playtest_vod_triage path |
Same build_id |
Export proof folder: release-evidence/playtest/whisper-tags/PROOF_PACK_fragment_03/ for Q4 diligence questions about triage integrity.
Seven scenarios (A–G)
| ID | Situation | Correct response |
|---|---|---|
| A | LLM added boss fight repro | W4 fail; strip body; quote-only |
| B | build_id from Discord pin |
W2 fail; fix BUILD_RECEIPT first |
| C | per_clip_local but merged timestamp in issue |
Re-file with fragment_id only |
| D | Player gave verbatim repro | Populate repro_steps_quoted array |
| E | Silent Whisper output | Audacity loudness spot forward; no issue until transcript exists |
| F | fest_public clip tagged playtest | Fix surface per isolation playbook |
| G | Bot opened issue before W5 | Close; re-open after human gate |
Relationship to upstream pipelines
| Upstream artifact | This workflow consumes |
|---|---|
| Normalize preflight | concat_ok before batch Whisper |
| Concat decision tree | chosen_path |
| Local Whisper pipeline | Transcripts + summaries folder |
| Lesson 207 | per_clip_local vs batch |
| Lesson 266 forward | BUILD_RECEIPT promotion gate |
Order: capture → normalize → Whisper → tag map + W1–W6 → GitHub API → Thursday row review.
Common mistakes
- Pasting LLM “Repro (guess)” from summary templates without W4 scrub.
build_idfrom memory instead of BUILD_RECEIPT (W2).- Opening issues on fest_public with playtest labels.
- Skipping W5 because “the bot already posted.”
- Merging per-clip quotes into one issue without separate
fragment_idrows. - Closing quote-only tickets as cannot reproduce without asking the player.
- Cloud Whisper upload because merge failed—policy decision per concat tree, not a shortcut around W1.
jq validation sketch (optional CI)
#!/usr/bin/env bash
set -euo pipefail
MAP="release-evidence/playtest/whisper-tags/WHISPER_ISSUE_TAG_MAP_fragment_03.json"
jq -e '.repro_steps_invented_blocked == true' "$MAP"
jq -e '.quotes | length >= 1' "$MAP"
BUILD="$(jq -r '.build_id' release-evidence/BUILD_RECEIPT.json)"
test "$(jq -r '.build_id' "$MAP")" = "$BUILD"
echo "W3 tag map OK"
Wire as optional gate before github_issue_allowed flips true in W6 receipt.
Multi-channel and facilitator contract note
Multi-channel facilitator contract governs who runs sessions; Lesson 206 files SOW receipts. This workflow governs what text may enter GitHub after Whisper—channel_label_match drift does not excuse invented repro; fix VERSION pin first, then re-tag quotes.
Tools and sibling resources
- 15 Free local Whisper + ffmpeg playtest VOD tools
- 16 free OBS ffmpeg Silero concat tools
- 18 free playtest feedback tools
- Top-20 evidence receipts hub
- Whisper CUDA silent CPU fallback (help)
- Official: openai/whisper, GitHub CLI issue create
Key takeaways
- LLMs invent repro—W4 blocks steps not present in transcript.
build_idonly from BUILD_RECEIPT (W2)—visible label helps players confirm.fragment_idon per_clip_local path—not merged offsets (Lesson 207).- Human gate before GitHub API (W5)—bots draft, humans publish.
- Tag map JSON is the audit trail for diligence and Thursday row review.
- Severity P0–P3 from player words, not model drama.
- Quote-only issues beat false repro closes—programmers ask questions instead.
- Guide preflight holds the ninety-second checklist; this post holds team policy.
- Tuesday tag extract → Wednesday smoke wires blockers honestly.
whisper_issue_tag_receipt_v1.jsonproves the gate ran before promotion.
FAQ
Can we use ChatGPT to write repro if we mark it as a guess?
No. W4 is fail-closed. Use Repro: unknown — quote-only triage or verbatim tester steps only.
What if the player gave detailed repro on voice?
Populate repro_steps_quoted with verbatim lines from transcript—still no LLM expansion.
Does this replace GitHub Projects or Jira?
No. It defines minimum honesty for playtest VOD-derived issues. Export tags to your board after W6.
How does this relate to crash symbolicate receipts?
Separate lane per Q4 diligence—crash stacks use crash_symbolicate_receipt_v1.json; playtest quotes use whisper_issue_tag_receipt_v1.json.
Can we auto-close stale quote-only issues?
Only after engineer questions and player follow-up—or fold into Tuesday CSV ingest blocker counts.
What if Whisper transcript is wrong?
Fix ASR path (local pipeline, loudness spot, concat tree)—do not “correct” with invented repro in GitHub.
Is cloud Whisper allowed?
Policy decision when concat_ok is false—W1–W6 still apply to whatever transcript you file.
Where does Lesson 266 fit?
Course milestone wires whisper_issue_tag_receipt into BUILD_RECEIPT promotion—pairs this strategy with receipt culture.
Conclusion
Invented repro steps waste programmer hours during the weeks that matter. Whisper gives you searchable player speech—not permission to fabricate quest paths.
File the tag map. Run W1–W6. Get human gate. Open GitHub with quotes and build_id only. Pin whisper_issue_tag_receipt_v1.json beside BUILD_RECEIPT.
Next reads: Whisper tag map preflight (Guide), Local Whisper VOD pipeline, Lesson 207 path decision tree, Wednesday demo smoke, Thursday row review.
Found this useful? Share the quote-only issue template with your facilitator before the next Whisper batch—not after the third cannot-reproduce close.