AI Integration / Workflow Jul 10, 2026

Whisper Playtest Tag Extraction to Structured GitHub Issues Without Invented Repro Steps - 2026

2026 Whisper playtest tag extraction for structured GitHub issues—whisper_issue_tag_receipt_v1.json, quote-only repro, human gate, and build_id facts without invented steps.

By GamineAI Team

Whisper Playtest Tag Extraction to Structured GitHub Issues Without Invented Repro Steps - 2026

Pixel-art hero for Whisper playtest tag extraction 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)

  1. 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.
  2. 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.
  3. Programmer trust collapse — Three cannot reproduce closes per fest week and engineers stop reading #playtest—exactly when refund correlation needs honest build_label rows.
  4. Publisher diligenceQ4 observability analysis treats playtest triage as a separate lane from crash receipts; partners ask how you prevent fabricated steps in issue trackers.
  5. Visible build labelsPlayer-visible build label opinion supplies build_id facts; 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

  1. Pasting LLM “Repro (guess)” from summary templates without W4 scrub.
  2. build_id from memory instead of BUILD_RECEIPT (W2).
  3. Opening issues on fest_public with playtest labels.
  4. Skipping W5 because “the bot already posted.”
  5. Merging per-clip quotes into one issue without separate fragment_id rows.
  6. Closing quote-only tickets as cannot reproduce without asking the player.
  7. 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

Key takeaways

  1. LLMs invent repro—W4 blocks steps not present in transcript.
  2. build_id only from BUILD_RECEIPT (W2)—visible label helps players confirm.
  3. fragment_id on per_clip_local path—not merged offsets (Lesson 207).
  4. Human gate before GitHub API (W5)—bots draft, humans publish.
  5. Tag map JSON is the audit trail for diligence and Thursday row review.
  6. Severity P0–P3 from player words, not model drama.
  7. Quote-only issues beat false repro closes—programmers ask questions instead.
  8. Guide preflight holds the ninety-second checklist; this post holds team policy.
  9. Tuesday tag extract → Wednesday smoke wires blockers honestly.
  10. whisper_issue_tag_receipt_v1.json proves 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.