Carve out synthetic TTS fixtures from the no-committed-audio rule (#433) #485

Merged
claude-bot merged 1 commit from docs/433-synthetic-audio-carve-out into main 2026-09-01 20:59:34 +00:00
Contributor

First acceptance criterion of #433, written before any audio is committed rather than alongside it — which is the point of it being a criterion.

What changes

Recorded audio stays absolutely banned. The bullet is reworded to say audio of real people, which is what it always meant, and a new CLAUDE.md section states the one exception explicitly: invented TTS speech under webapp/backend/evals/fixtures/, committed as .opus.

Why it has to be committed rather than generated

Recorded in the file so nobody re-derives it from the spike comment on #433:

  1. piper has no --seed — a re-render is not the fixture the scorers were calibrated against, so the clip is the artifact and the manifest alone cannot reproduce it.
  2. The Opus encode is the Discord-codec simulation, and decode is bit-exact per RFC 6716, so a committed lossy file decodes identically everywhere. That is what makes a golden transcript meaningful.
  3. Voice models are 63 MB each — a test-time dependency costs 190 MB of CI downloads for no gain.

The .gitignore half

*.mp3, *.wav, *.pcm and *.ogg are ignored; *.opus was not — by omission rather than by decision. That is the kind of accident that quietly becomes load-bearing, so it now says so, with an explicit un-ignore under the fixtures path to document the intent for whoever next adds *.opus to that list.

Keeping Opus as the only permitted format is deliberate beyond the codec argument: the extension itself becomes a signal that a file was authored rather than captured.

Constraints written into the rule

Path-scoped to the fixtures tree, Opus only, ~10 MB budget, and the manifest is the source of truth for content while the clips are committed build output — so a diff to a clip without a matching manifest change should be treated as suspicious.

Docs and .gitignore only; no code.

First acceptance criterion of #433, written **before** any audio is committed rather than alongside it — which is the point of it being a criterion. ## What changes **Recorded audio stays absolutely banned.** The bullet is reworded to say audio *of real people*, which is what it always meant, and a new CLAUDE.md section states the one exception explicitly: invented TTS speech under `webapp/backend/evals/fixtures/`, committed as `.opus`. ## Why it has to be committed rather than generated Recorded in the file so nobody re-derives it from the spike comment on #433: 1. **piper has no `--seed`** — a re-render is not the fixture the scorers were calibrated against, so the clip *is* the artifact and the manifest alone cannot reproduce it. 2. **The Opus encode is the Discord-codec simulation**, and decode is bit-exact per RFC 6716, so a committed lossy file decodes identically everywhere. That is what makes a golden transcript meaningful. 3. **Voice models are 63 MB each** — a test-time dependency costs 190 MB of CI downloads for no gain. ## The `.gitignore` half `*.mp3`, `*.wav`, `*.pcm` and `*.ogg` are ignored; `*.opus` was not — **by omission rather than by decision.** That is the kind of accident that quietly becomes load-bearing, so it now says so, with an explicit un-ignore under the fixtures path to document the intent for whoever next adds `*.opus` to that list. Keeping Opus as the *only* permitted format is deliberate beyond the codec argument: the extension itself becomes a signal that a file was authored rather than captured. ## Constraints written into the rule Path-scoped to the fixtures tree, Opus only, ~10 MB budget, and the manifest is the source of truth for content while the clips are committed build output — so a diff to a clip without a matching manifest change should be treated as suspicious. Docs and `.gitignore` only; no code.
docs: carve out synthetic TTS fixtures from the no-committed-audio rule (#433)
All checks were successful
CI / Backend lint (ruff) (pull_request) Successful in 26s
CI / Frontend tests, audit, and build (pull_request) Successful in 1m32s
CI / Bot/backend version sync (pull_request) Successful in 38s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m29s
CI / Bot tests and audit (pull_request) Successful in 1m31s
CI / Docker image build (pull_request) Successful in 4m47s
CI / Backend migration, tests, and audit (pull_request) Successful in 10m1s
d445c12ec7
First acceptance criterion of #433, and deliberately written before any audio
is committed rather than alongside it.

Recorded audio stays absolutely banned — the rule is unchanged and the wording
is now explicit that it is about audio *of real people*, which is what it always
meant. The exception is invented speech under webapp/backend/evals/fixtures/,
committed as .opus, with no real voices, no real session content, and timing
sampled from statistics rather than copied from a session.

The three reasons it must be committed rather than generated are recorded so
nobody has to re-derive them: piper has no --seed so a re-render is not the
fixture the scorers were calibrated against; the Opus encode *is* the Discord
codec simulation and decode is bit-exact per RFC 6716, which is what makes a
golden transcript meaningful; and the voice models are 63 MB each, so a
test-time dependency costs 190 MB of CI downloads for nothing.

.gitignore already permitted .opus — by omission rather than by decision, which
is the kind of accident that becomes load-bearing. It now says so, with an
explicit un-ignore under the fixtures path documenting the intent for whoever
next adds *.opus to that list.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
claude-bot deleted branch docs/433-synthetic-audio-carve-out 2026-09-01 20:59:36 +00:00
Sign in to join this conversation.
No description provided.