Lesson 258: OBS Replay Buffer Uniform Fragments Receipt on BUILD_RECEIPT (2026)
Direct answer: Before June–October 2026 batch Whisper nights, promote replay_buffer_uniform_receipt_v1.json proving facilitators share one OBS playtest profile (fixed Replay Buffer seconds, 48 kHz project audio, ≥2 s between saves), replay_buffer_uniform_ladder_v1.json pins the sample-rate ladder, and +genpts is documented on the concat path—distinct from Lesson 200 (concat_ok on playtest_vod_triage_receipt_v1), Lesson 207 (path fork when merge fails), and Lesson 243 (highlight consent). Pair the OBS uniform fragments preflight (Guide #21).

Why this matters now (batch Whisper nights)
October 2026 facilitators save 12–20 Replay Buffer MKVs per Discord thread—per-clip Whisper works, ffmpeg -f concat fails on mixed 44100 vs 48000 Hz, non-monotonic DTS, and VFR offsets. Teams open MKV concat help at 11pm instead of pinning OBS before capture—258 files replay_buffer_uniform_receipt_v1.json so BUILD_RECEIPT replay_buffer_uniform_ok blocks promotion when fragment policy drifts. Concat decision tree picks paths after concat_ok: false; this lesson prevents the fork.
The OBS uniform fragments preflight is the ninety-second gate—258 is the BUILD_RECEIPT milestone.
Beginner path (OBS profile → ladder → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Clone Playtest_48k_120s OBS profile | Profile name in README |
| 2 | Lock Replay Buffer 120 s, audio 48 kHz | R2 screenshot |
| 3 | Publish replay_buffer_uniform_ladder_v1.json |
Ladder sha256 pinned |
| 4 | Document +genpts on concat script | R4 policy row |
| 5 | File receipt + BUILD_RECEIPT | replay_buffer_uniform_ok: true |
Time: ~55 minutes first batch night; ~12 minutes when profile is cloned.
Developer path (gates R1–R6)
| Gate | Check | Fail when |
|---|---|---|
| R1 | playtest-vod/README.md names OBS profile |
Ad-hoc per-host settings |
| R2 | Fixed Replay Buffer length (e.g. 120 s) | Mixed 30/60/120 across facilitators |
| R3 | Audio sample rate 48000 on profile | 44100 Hz project default |
| R4 | +genpts on MKV concat or WAV ladder first |
Raw MKV concat without policy |
| R5 | replay_buffer_uniform_ladder_v1.json committed |
No ladder artifact |
| R6 | Receipt + BUILD_RECEIPT | Promote before R3 GREEN |
R1 — cousin receipt crosswalk
| Field | Cousin (200) | Cousin (224) | Cousin (243) | This lesson (258) |
|---|---|---|---|---|
| Schema | playtest_vod_triage_receipt_v1 |
mkv_gap_reencode_receipt_v1 |
playtest_clip_consent_receipt_v1 |
replay_buffer_uniform_receipt_v1 |
| Scope | Post-merge concat_ok |
Gap re-encode | Consent log | Pre-capture uniform policy |
| Path | release-evidence/playtest/vod/ |
release-evidence/playtest/mkv-gap/ |
release-evidence/playtest/consent/ |
release-evidence/playtest/replay-uniform/ |
Do not merge schemas—reference paths in cousin_receipts only.
replay_buffer_uniform_ladder_v1.json
{
"schema": "replay_buffer_uniform_ladder_v1",
"build_label": "october-fest-2026-playtest-rc3",
"obs_profile": "Playtest_48k_120s",
"replay_buffer_seconds": 120,
"audio": {
"project_sample_rate_hz": 48000,
"normalize_target_hz": 48000,
"channels": "mono",
"allowed_rates_in_fragments": [48000]
},
"save_spacing_seconds_min": 2,
"concat_policy": {
"prefer_wav_ladder": true,
"mkv_remux_genpts": true,
"ffmpeg_genpts_flag": "+genpts"
},
"fragment_manifest_columns": ["clip_id", "wall_time_utc", "duration_s", "sample_rate_hz", "sha256"]
}
Pin under release-evidence/playtest/replay-uniform/REPLAY_BUFFER_UNIFORM_LADDER.json.
R4 — concat policy snippet (WAV ladder + genpts)
# Per-fragment normalize (R3 ladder)
ffmpeg -i "$frag" -ar 48000 -ac 1 "normalized/${base}.wav"
# MKV remux path when WAV skipped — genpts required (R4)
ffmpeg -i "input.mkv" -c copy -fflags +genpts "work/remux_${base}.mkv"
# Concat WAV list (preferred)
ffmpeg -f concat -safe 0 -i fragments.txt -c copy merged_playtest.wav
replay_buffer_uniform_receipt_v1.json
{
"schema": "replay_buffer_uniform_receipt_v1",
"build_label": "october-fest-2026-playtest-rc3",
"ladder_path": "release-evidence/playtest/replay-uniform/REPLAY_BUFFER_UNIFORM_LADDER.json",
"ladder_sha256": "cc33…",
"obs_profile_export": "release-evidence/playtest/replay-uniform/obs_profile_Playtest_48k_120s.json",
"facilitator_roster_sha256": "dd44…",
"cousin_receipts": {
"vod_triage_concat_ok": "release-evidence/playtest/vod/PLAYTEST_VOD_TRIAGE_RECEIPT.json",
"mkv_gap_reencode": "release-evidence/playtest/mkv-gap/MKV_GAP_REENCODE_RECEIPT.json",
"clip_consent": "release-evidence/playtest/consent/PLAYTEST_CLIP_CONSENT_RECEIPT.json"
},
"gates": {
"R1_readme_profile": "pass",
"R2_buffer_length": "pass",
"R3_sample_rate_48k": "pass",
"R4_genpts_policy": "pass",
"R5_ladder_committed": "pass",
"R6_build_receipt": "pass"
},
"replay_buffer_uniform_ok": true,
"whisper_batch_prerequisite_met": true
}
Pin under release-evidence/playtest/replay-uniform/REPLAY_BUFFER_UNIFORM_RECEIPT.json.
BUILD_RECEIPT row (R6)
| Column | Pass when |
|---|---|
replay_buffer_uniform |
replay_buffer_uniform_ok: true |
playtest_vod_concat |
Cousin 200 concat_ok independent |
playtest_clip_consent |
Cousin 243 independent |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
replay_buffer_uniform_blocked BOOLEAN NOT NULL DEFAULT false;
Thursday row review — Replay uniform line: profile + 48 kHz Y/N.
Key takeaways
- Uniform at capture beats ffmpeg heroics at midnight (R1–R3).
+genptsis policy, not optional trivia (R4).- Lesson 200 — post-merge
concat_ok; 258 — pre-night profile. - MKV concat help — reactive triage cousin.
- Concat decision tree — path after
concat_ok: false. - Lesson 243 — legal consent column.
- Cousin: Lesson 259 Bevy menu flush—parallel engine fest column.
- Lesson 257 — parallel Unity strip column.
- October capstone 265 wires 254–264 including this row.
- Top 20 receipts hub — replay uniform row in fest→public map.
Common mistakes
- Fixing concat only in ffmpeg while OBS profile still 44100 Hz (R3).
- Mixed Replay Buffer 30 s vs 120 s across facilitators (R2).
- Filing 200 while uniform receipt RED—merge vs capture are different gates.
- Merging
replay_buffer_uniform_receiptintoplaytest_vod_triage_receipt. - Skipping +genpts on MKV path then blaming Whisper (R4).
Troubleshooting
| Symptom | Lane |
|---|---|
concat_ok false after uniform GREEN |
Lesson 200 + MKV concat help |
| Non-monotonic DTS only on some hosts | R2 spacing + Lesson 224 |
| Which Whisper path? | Lesson 207 |
| Highlight legal block | Lesson 243 |
| Zero-duration audio | Zero-duration help |
Mini exercise (45 minutes)
- Export two MKVs from different OBS profiles—confirm sample-rate mismatch in
ffprobe. - Clone Playtest_48k_120s—re-export; confirm 48000 Hz only.
- Commit ladder JSON; run R5 hash pin.
- File receipt; BUILD_RECEIPT GREEN.
Continuity — October–Q4 2026 fest ops truth (254–265)
| Lesson | Receipt focus |
|---|---|
| 257 | Unity Addressables jq inventory audit |
| 258 (this) | OBS replay buffer uniform fragments |
| 259 | Bevy menu UI flush |
| 265 | October ops capstone (queued) |
Previous: Lesson 257 — Unity Addressables jq audit
Next: Lesson 260 — Unity UGS/OTLP diligence (queued)
FAQ
Same as Lesson 200?
200 = concat_ok after merge; 258 = uniform OBS policy before capture nights.
Same as Help #5?
Help is reactive ffmpeg; 258 is BUILD_RECEIPT prevention + ladder artifact.
Still need per-clip Whisper?
Yes when decision tree picks per_clip_local—uniform policy reduces how often you fork.
WAV ladder vs MKV +genpts?
Ladder prefers WAV concat; MKV remux with +genpts is documented fallback (R4).
Batch Whisper nights fail when every facilitator uses a different Replay Buffer profile—pin 48 kHz, fixed seconds, genpts policy, ladder JSON, then replay_buffer_uniform_ok before triage promotion.