Metadata Survives Mux Challenge - Prove WAV LIST and iXML plus ffprobe Duration After ffmpeg and Audacity Roundtrips 2026
You exported facilitator VO from Audacity. consent_record_id looked perfect in the metadata editor. You muxed into the highlight MP4 with ffmpeg. Legal ran the same inspector on the deliverable and opened a ticket: field missing, duration off by 0.4 seconds, BUILD_RECEIPT still showed GREEN from before mux.
June–July 2026 pipelines add automated loudness passes—the July 2026 waveform consent trend playbook explains why this challenge became a default gate., sample-rate converts, and “quick” ffmpeg one-liners between editors. Teams re-trust pre-mux screenshots. This Challenges & Community Hooks sprint is a 45-minute, same-day proof that consent metadata and duration survive your real roundtrip—not a lab WAV on Desktop.
Non-repetition note: VO waveform consent beginner tutorial teaches the first evening export. Top 20 receipts hub lists receipt #5. This URL owns the 45-minute post-mux habit aligned to Lesson 250 gate V5. Cousin case study backlog #16 owns the recovery narrative—do not duplicate here.
Pair Audacity VO preflight, OBS highlight consent, and Thursday BUILD_RECEIPT row review.
Why this matters now (June–July 2026)
- Automated conversion steps — New macros “normalize for YouTube” between Audacity and reel mux.
- False GREEN V5 — Receipts filed from pre-mux proof only; legal reads post-mux bytes.
- July highlight reel scale — More facilitators, more handoffs, more strip points.
- 243 vs 250 split — Video clip consent passes while VO lane fails after mux—challenge catches V5 only.
- CI gap — Pipelines hash video; few teams assert custom RIFF chunks after AAC encode.
Direct answer: In 45 minutes, run gates M1–M6, produce before/after proof artifacts, file metadata_survives_mux_receipt_v1.json, then update vo_consent_metadata_receipt_v1.json conversion_survival.metadata_survives: true only if post-mux checks pass.
Who this challenge is for
| Audience | Outcome |
|---|---|
| Audio lead | Know which ffmpeg flags strip LIST/iXML |
| Producer | Block reel upload until M6 pass |
| Solo dev wearing all hats | One documented mux chain, not hope |
Time: 45 minutes timed (beginner first run); ~20 minutes when mux command is pinned.
Prerequisites: One VO line exported per VO tutorial; ffprobe on PATH; a real highlight video stub (even 10 s black video).
Challenge rules
- One owner signs the challenge log—no anonymous “team pass.”
- Fail stops the clock—fix mux settings before claiming M5.
- Use production mux command, not a simplified
-c copydemo that skips your AAC step. - Archive before and after proof in
release-evidence/audio/mux-challenge/<tag>/. - Do not promote BUILD_RECEIPT
wav_consent_metadata_okuntil M6 ties toVO_CONSENT_METADATA_RECEIPT.json. - Post pass/fail in community thread with
build_labelonly—no player PII in screenshots.
Folder layout (create first — 5 minutes)
release-evidence/audio/mux-challenge/2026-05-26-rc1/
CHALLENGE_LOG.md
vo_line_01_pre_mux.wav # copy from art/voice/
vo_line_01_pre_mux_proof.txt # M2 output
duration_pre.csv # M3
highlight_stub.mp4 # 10s test video
vo_line_01_post_mux.wav # extracted or handoff lane
vo_line_01_post_mux_proof.txt # M4 output
duration_post.csv # M5
metadata_survives_mux_receipt_v1.json
Link folder from release-evidence taxonomy audio/ subtree.
Gate overview (M1–M6)
| Gate | Minutes | Proves |
|---|---|---|
| M1 | 5 | Baseline WAV + consent log row pinned |
| M2 | 8 | Four consent fields present pre-mux |
| M3 | 5 | ffprobe duration pre-mux matches clip plan |
| M4 | 12 | Run real mux + extract/post handoff WAV |
| M5 | 8 | Four fields + duration post-mux |
| M6 | 7 | Receipt filed + cousin VO receipt updated |
Total 45 when mux is already documented; add 15 if you must write mux command from scratch.
M1 — Baseline pin (5 minutes)
| Step | Action |
|---|---|
| 1 | Copy vo_line_01.wav to challenge folder as vo_line_01_pre_mux.wav |
| 2 | Copy matching consent_log.csv row to consent_row_snapshot.json |
| 3 | Record build_label, mux_step_name, ffmpeg_version in CHALLENGE_LOG.md |
Pass when: build_label matches BUILD_RECEIPT and cousin playtest clip consent path exists if marketing uses video clips.
Beginner mistake: Starting challenge with MP3 “because faster.” Restart with WAV.
M2 — Pre-mux metadata proof (8 minutes)
Verify four fields in file bytes (not spreadsheet):
consent_record_idconsent_scopeconsent_expiresopt_out
Save inspector output to vo_line_01_pre_mux_proof.txt. Note chunk_type: LIST or iXML.
Snippet-friendly check (duration only via ffprobe here):
ffprobe -hide_banner -show_format -show_streams vo_line_01_pre_mux.wav > vo_line_01_pre_mux_ffprobe.txt 2>&1
Pass when: All four fields documented in proof file with values matching consent_row_snapshot.json.
Maps to Lesson 250 gates V2–V3; this challenge does not re-teach export—see VO tutorial if M2 fails.
M3 — Pre-mux duration spot (5 minutes)
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 vo_line_01_pre_mux.wav
Write result to duration_pre.csv:
file,duration_sec,expected_sec,pass
vo_line_01_pre_mux.wav,3.21,3.20,true
Tolerance: team policy ±0.05 s unless highlight script documents padding.
Pass when: pass column true. Maps to Lesson 250 V4.
M4 — Production mux roundtrip (12 minutes)
Run the same command you use for July highlight reels. Example pattern (replace paths):
ffmpeg -y -i highlight_stub.mp4 -i vo_line_01_pre_mux.wav \
-map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest \
highlight_mux_out.mp4
Then obtain audio for post-mux verification—pick one lane and document it in the receipt:
| Lane | Command sketch | When teams use it |
|---|---|---|
| A — extract | ffmpeg -i highlight_mux_out.mp4 -vn -acodec pcm_s16le -ar 48000 post_mux.wav |
Legal reads extracted WAV |
| B — parallel WAV | Keep separate VO WAV on timeline export | DaVinci handoff |
| C — re-open in Audacity | Import deliverable, export WAV | Manual QA |
Pass M4 when: Deliverable exists and post_mux WAV path is recorded—not when fields are verified yet.
Developer note: If Lane A strips tags, try -c:a pcm_s16le mux to MP4 with separate WAV master—record tradeoff in receipt mux_step field.
M5 — Post-mux metadata + duration (8 minutes)
Repeat M2 on vo_line_01_post_mux.wav → vo_line_01_post_mux_proof.txt.
Repeat M3 → duration_post.csv.
| Check | Pass when |
|---|---|
| All four consent fields | Present and values match snapshot |
| Duration | Within tolerance vs pre-mux (or documented intentional change) |
chunk_type |
Same family as pre-mux OR documented migration in log |
Fail M5 → do not file GREEN conversion_survival. Open mux settings ticket; link forward to case study #16 if strip point is exotic.
This gate is Lesson 250 V5 in challenge form.
M6 — Receipt + BUILD_RECEIPT tie-in (7 minutes)
metadata_survives_mux_receipt_v1.json
{
"schema": "metadata_survives_mux_receipt_v1",
"build_label": "playtest-july-2027-rc1",
"vo_asset_path": "art/voice/facilitator/vo_line_01.wav",
"mux_step": "ffmpeg_highlight_mp4_lane_a_extract",
"chunk_type_pre": "WAV_LIST_OR_IXML",
"chunk_type_post": "WAV_LIST_OR_IXML",
"consent_fields_pre": true,
"consent_fields_post": true,
"duration_pre_sec": 3.21,
"duration_post_sec": 3.21,
"duration_within_tolerance": true,
"gates": {
"M1_baseline": "pass",
"M2_pre_metadata": "pass",
"M3_pre_duration": "pass",
"M4_mux_executed": "pass",
"M5_post_metadata_duration": "pass",
"M6_receipt_filed": "pass"
},
"metadata_survives_mux_ok": true,
"cousin_receipts": {
"vo_consent_metadata": "release-evidence/audio/VO_CONSENT_METADATA_RECEIPT.json"
}
}
Update cousin vo_consent_metadata_receipt_v1.json:
"conversion_survival": {
"mux_step": "ffmpeg_highlight_mp4_lane_a_extract",
"metadata_survives": true,
"challenge_receipt": "release-evidence/audio/mux-challenge/2026-05-26-rc1/metadata_survives_mux_receipt_v1.json"
}
Pass M6 when: Both JSON files committed under release-evidence/ and BUILD_RECEIPT row reviewed on Thursday ritual.
Proof table template (paste in CHALLENGE_LOG.md)
| Field | Pre-mux | Post-mux | Match |
|---|---|---|---|
| consent_record_id | Y/N | ||
| consent_scope | Y/N | ||
| consent_expires | Y/N | ||
| opt_out | Y/N | ||
| duration_sec | Y/N |
Community hook — share format
Post with hashtag #MetadataSurvivesMux2026 (optional):
build_label: playtest-july-2027-rc1
mux_step: ffmpeg_highlight_mp4_lane_a_extract
M5: PASS | duration delta: 0.00s
metadata_survives_mux_ok: true
(receipt path internal only)
Do not paste UUIDs or player names in public threads.
Facilitator team variant (two laptops)
| Role | Gates |
|---|---|
| Editor | M1–M3 on export laptop |
| Reel lead | M4–M5 on mux laptop |
| Producer | M6 + BUILD_RECEIPT |
Sync via shared release-evidence/ drive path—no Slack screenshots as proof.
Audacity roundtrip add-on (+10 minutes)
If your pipeline re-opens deliverable in Audacity for loudness:
- Complete M1–M5 on ffmpeg path first.
- Import
highlight_mux_out.mp4audio → exportvo_line_01_audacity_roundtrip.wav. - Run M2/M3 again; append
audacity_roundtrip_passto receipt.
Document as second mux_step—V5 fails if any production step strips tags.
PowerShell duration spot (Windows)
function Get-WavDuration($path) {
$d = ffprobe -v error -show_entries format=duration -of csv=p=0 $path
[pscustomobject]@{ file=$path; duration_sec=[double]$d }
}
Get-WavDuration vo_line_01_pre_mux.wav | Export-Csv duration_pre.csv -NoTypeInformation
Get-WavDuration vo_line_01_post_mux.wav | Export-Csv duration_post.csv -NoTypeInformation
CI hook sketch (optional)
test -f release-evidence/audio/mux-challenge/latest/metadata_survives_mux_receipt_v1.json
jq -e '.metadata_survives_mux_ok == true' release-evidence/audio/mux-challenge/latest/metadata_survives_mux_receipt_v1.json
Symlink latest/ to current tag after M6—pattern from validate-packet scripts.
Common strip points (2026)
| Strip point | Symptom | Mitigation |
|---|---|---|
| AAC encode in MP4 | Tags gone in extracted WAV | Separate WAV master + Lane B |
| Sample-rate convert | Duration drift | Pin 48000 Hz before mux |
| “Cleanup” macro | Empty LIST chunk | Disable strip in macro |
| Wrong stream map | VO replaced by music bed | -map audit in M4 |
| Cloud auto-normalize | Fields removed upload-side | Run M5 on downloaded file |
Relationship to top 20 receipts index
| Hub # | This challenge |
|---|---|
| #5 vo_consent_metadata | Updates conversion_survival after M6 |
| #4 playtest_clip_consent | Independent—run both before reel |
| #6–#7 smoke + row diff | Schedule challenge before Thursday promotion |
Anti-patterns
- Screenshot pre-mux only in legal packet.
- Passing M5 because “it sounds the same.”
- Skipping M4 production command for a toy ffmpeg line.
- Merging
metadata_survives_mux_receiptinto clip consent JSON. - Running challenge once per studio—re-run when
ffmpegor Audacity version changes.
Forward pointers (same cluster)
| Backlog | URL role |
|---|---|
| #16 case study | Legal-block recovery when M5 failed in production |
| #19 ffprobe matrix | Batch duration + sample-rate QA for multi-line reels |
| #23 | Ten-minute ritual before mux |
Beginner path — minute-by-minute timer script
Set a 45:00 timer. Read steps aloud in standup practice once before solo run.
| Timer | Gate | Say aloud |
|---|---|---|
| 0:00 | Start | “Challenge for build_label, owner [name].” |
| 0:05 | M1 done | “Baseline WAV and consent row copied.” |
| 0:13 | M2 done | “Four fields present pre-mux.” |
| 0:18 | M3 done | “Duration pre within tolerance.” |
| 0:30 | M4 done | “Production mux executed; post WAV path: [lane].” |
| 0:38 | M5 done | “Post-mux fields and duration verified.” |
| 0:45 | M6 done | “Receipts filed; BUILD_RECEIPT row queued for Thursday.” |
If M2 fails at 0:13, stop timer—return to VO tutorial Block 2, not this challenge.
Developer path — ffmpeg flag experiment matrix
When M5 fails, run one variable at a time on a copy of vo_line_01_pre_mux.wav:
| Test id | Variable | Hypothesis |
|---|---|---|
| T1 | -c:a aac vs -c:a pcm_s16le in MP4 |
AAC path strips LIST |
| T2 | -ar 44100 vs -ar 48000 |
Resample drops chunk |
| T3 | -af loudnorm filter |
Filter strips metadata |
| T4 | Map wrong input | Music bed replaces VO |
| T5 | Two-pass encode | Second pass strips tags |
Log each test in CHALLENGE_LOG.md with pass/fail. Attach winning command to metadata_survives_mux_receipt_v1.json mux_step string.
Honest limit: Some platforms re-encode on upload—challenge proves your handoff; platform re-check may still be required for storefront trailers.
DaVinci Resolve lane (M4 variant)
| Step | Action |
|---|---|
| 1 | Import vo_line_01_pre_mux.wav + highlight timeline |
| 2 | Deliver WAV master separate from H.264 if legal requires |
| 3 | Run M5 on delivered WAV, not only on MP4 audio |
Set mux_step: davinci_deliverable_wav_master_v1 in receipt. 14 free LUFS tools may run after M5 if loudness pass is separate—re-run M5 if loudness macro touches metadata.
Multi-line VO sprint (+15 minutes per extra line)
After first line passes M6, clone folder to vo_line_02/ subfolder—do not reuse post-mux proof across lines. Each VO line needs unique consent_record_id in M2/M5 tables.
Producer spreadsheet:
| line | M5 pass | receipt filed |
|---|---|---|
| vo_line_01 | true | true |
| vo_line_02 |
Cap at five lines per evening—fatigue causes false PASS on field comparison.
Legal review packet (what to zip)
mux-challenge-<tag>.zip
metadata_survives_mux_receipt_v1.json
vo_line_01_pre_mux_proof.txt
vo_line_01_post_mux_proof.txt
duration_pre.csv
duration_post.csv
CHALLENGE_LOG.md (no player names)
Email template subject: [build_label] metadata survives mux M6 PASS.
Incident response — M5 fail after reel already uploaded
- Pull public reel immediately if
opt_outor wrongconsent_scoperisk. - File M5 fail log with strip point from matrix above.
- Do not edit receipt to GREEN—file waiver or re-run full M1–M6.
- Route narrative to backlog #16 case study doc when root cause is exotic.
- Tag
vod_consentvia Lesson 239.
Comparison to Whisper and concat receipts
| Receipt family | Proves | This challenge |
|---|---|---|
playtest_vod_triage_receipt_v1 |
Merge for triage | Unrelated lane |
ffmpeg_concat_decision_receipt_v1 |
Concat recovery | Unrelated lane |
vo_consent_metadata_receipt_v1 |
VO consent + V5 survival | Updated at M6 |
Do not set concat_ok from mux challenge results.
Wednesday / Thursday calendar placement
| Day | Action |
|---|---|
| Tuesday | VO export tutorial evening |
| Wednesday | Demo smoke on game binary |
| Wednesday PM | This challenge on VO line for upcoming reel |
| Thursday | Row review includes metadata_survives_mux_ok |
Never promote fest branch on Thursday if M6 failed Wednesday PM.
Schema crosswalk (Lesson 250 V1–V6 vs M1–M6)
| Lesson 250 | This challenge |
|---|---|
| V1 export | Assumed before M1 (tutorial) |
| V2 fields | M2 pre, M5 post |
| V3 values | M2/M5 vs snapshot |
| V4 duration | M3 pre, M5 post |
| V5 conversion | M4 + M5 |
| V6 BUILD_RECEIPT | M6 |
Course milestone remains Lesson 250; challenge is repeatable ops habit.
Studio size variants
| Size | How to run |
|---|---|
| Solo | Full M1–M6 alone in one sitting |
| 2-person | Editor M1–M3, reel lead M4–M5 |
| 5+ | Producer holds timer; one “mux sheriff” owns M4 command doc |
Reward hook (community, optional)
Teams that post #MetadataSurvivesMux2026 PASS with build_label (no PII) earn internal “mux sheriff” badge in devlog—purely cultural; receipt JSON remains authoritative.
Extended FAQ — search phrasing
What is metadata survives mux challenge 2026
A 45-minute gated sprint proving playtest VO consent metadata and ffprobe duration remain valid after your real ffmpeg or editor mux—not only after Audacity export.
Why does ffmpeg remove WAV LIST chunks
Some AAC mux paths re-encode audio without copying custom RIFF chunks; the challenge finds your strip point and documents a lane that preserves fields or a parallel WAV master.
How does this relate to vo_consent_metadata_receipt
M6 updates conversion_survival.metadata_survives on the cousin receipt; challenge files metadata_survives_mux_receipt_v1.json as auditable proof.
Gate failure playbooks (what to do when stuck)
M2 fail — fields missing pre-mux
You skipped the VO tutorial. Re-export with metadata preset PlaytestVOConsent2026. Do not continue to M4.
M3 fail — duration drift pre-mux
Clip plan spreadsheet wrong or region includes trailing silence. Trim in Audacity, re-export, restart M1–M3. Check OBS MKV gap preflight if VO was cut from playtest fragments.
M4 fail — ffmpeg error
Log stderr to CHALLENGE_LOG.md. Common fixes: escape Windows paths, add -shortest, verify audio stream exists in stub MP4. 16 OBS/ffmpeg tools for capture stack—not mux legal proof.
M5 fail — fields present pre, missing post
You found the value of this challenge. Walk the T1–T5 matrix, pick Lane B parallel WAV master if AAC always strips. Document in receipt; notify legal before next upload.
M5 fail — duration only
Metadata survived but duration out of tolerance—investigate -shortest cutting VO early or sample-rate mismatch. May still be legal fail if reel sync depends on timing.
M6 fail — JSON not in repo
Receipts in Downloads folder do not count. Commit under release-evidence/ or shared drive path named in facilitator contract.
BUILD_RECEIPT row snippet (paste after M6)
"vo_consent_metadata": {
"wav_consent_metadata_ok": true,
"metadata_survives_mux_ok": true,
"challenge_receipt": "release-evidence/audio/mux-challenge/2026-05-26-rc1/metadata_survives_mux_receipt_v1.json"
}
Thursday row review line: VO / mux survival Y/N.
Friday Block 5 maintenance (+5 minutes weekly)
From Friday Block 5 ritual:
- Archive challenge folders older than 8 weeks to
archive/2026-Q2/. - Verify
latest/symlink points to current tag. - If
ffmpegminor version changed, schedule re-challenge before next reel.
Outbound technical references
Standup scripts (producer)
PASS: “Metadata survives mux M6 GREEN for build_label; post-mux consent fields match; duration delta [X]s; challenge receipt filed.”
FAIL: “Reel hold—M5 fail on VO line 02; AAC mux strips LIST; testing parallel WAV master; see mux-challenge folder.”
MISROUTE: “This is not concat_ok—route to ffmpeg decision tree instead.”
Sample CHALLENGE_LOG.md header (copy)
# Metadata Survives Mux Challenge Log
build_label: playtest-july-2027-rc1
owner: [team role]
date: 2026-05-26
ffmpeg_version: [ffmpeg -version first line]
audacity_version: 3.7.x
mux_step_final: ffmpeg_highlight_mp4_lane_a_extract
M1: pass
M2: pass
M3: pass
M4: pass
M5: pass
M6: pass
notes: no strip on T1-T3; AAC extract lane preserves LIST
Pairing with playtest isolation and fest scope
Before marketing publishes, confirm playtest isolation receipt scope matches reel audience. Mux challenge does not prove surface—only VO metadata survival. A passing M6 on playtest_invite VO must not appear in fest_public reel without scope review.
AI-generated VO note (2026)
Model-exported WAV may include bogus tags. M2 must still match consent_log.csv—if model invented a UUID, V3 fails even when fields exist. Governance for generator failures: backlog #22 reason-codes. Challenge remains valid: prove your mux does not strip correct tags.
Re-challenge triggers (calendar)
| Event | Re-run M1–M6 |
|---|---|
| ffmpeg minor bump | Yes |
| Audacity major bump | Yes |
| New loudness macro | Yes |
| New facilitator | Yes for their export preset |
| Copy-paste mux command from new blog post | Yes |
Skipping re-challenge after ffmpeg bump is the most common regression in July 2026 incident threads.
Quick reference card (printable)
| Gate | One-line pass |
|---|---|
| M1 | WAV + consent row + build_label pinned |
| M2 | Four fields in pre-mux bytes |
| M3 | ffprobe duration OK pre-mux |
| M4 | Production mux ran; post WAV path known |
| M5 | Four fields + duration OK post-mux |
| M6 | Both JSON receipts filed in release-evidence |
Tape beside monitor until July reel season ends.
Key takeaways
- Pre-mux GREEN is not enough—challenge proves post-mux bytes.
- 45 minutes, gates M1–M6, one real VO line, one real mux command.
- M5 = Lesson 250 V5—file
metadata_survives_mux_receipt_v1.json. - Archive before/after proof under
release-evidence/audio/mux-challenge/. - Update cousin
VO_CONSENT_METADATA_RECEIPT.jsononly after M5 pass. - Duration and metadata both matter—ffprobe twice.
- Document mux lane (extract vs parallel WAV vs Audacity roundtrip).
- Pair with VO tutorial and receipts hub.
- Block public reel upload until M6 and Thursday row review align.
- Re-run challenge when automation adds a new conversion step.
FAQ
How long is the metadata survives mux challenge
45 minutes for a pinned mux chain; up to 60 if you must document ffmpeg flags first.
Is this the same as the VO waveform consent tutorial
No. The tutorial teaches export and first proof; this challenge proves survival after your production mux.
What if M5 fails but audio sounds fine
M5 fail is legal/compliance fail for public reels—fix mux or change handoff lane; do not waive without waiver ticket in release-evidence/cert-and-platform/waivers/.
Which receipt schema do I file
metadata_survives_mux_receipt_v1.json plus update vo_consent_metadata_receipt_v1.json conversion_survival.
Do I need video clip consent too
Yes if the reel uses OBS fragments—Lesson 243 is separate from this WAV challenge.
Can we run this in CI
Assert receipt exists and metadata_survives_mux_ok: true on tags you promote; human M2/M5 field reads may stay manual until you script RIFF walks.
Should facilitators run this challenge every playtest night
Run when a new reel muxes VO for public highlight use—not after every internal Whisper triage session. Pair timing with facilitator contract receipt manifest requirements.
Post-mux proof is the habit—forty-five minutes once per mux chain change beats a legal block the night before July reels ship.