Narration check.
A deployed check that reads generated narration and refuses to let it reach voice synthesis when it carries a fault. Every rule it enforces was written after that exact fault shipped.
Deployed automation — this configuration is running in production. Client identities are withheld.
Classified as automation: it executes a predefined path, interpreting nothing and selecting between nothing. It is a deployed component of a working system, built this way because the problem required no decision.
A model produces the input, and everything downstream of it is deterministic. The check that judges the model's output contains no model.
Objective
Catch a bad spoken line at the moment it is still text and free to fix, rather than after it has been voiced, assembled and published.
Runtime
01
Read
Loads the generated narration for each lesson while it is still editable text.
02
Test
Applies each rule: an unqualified figure on the cover, raw digits, repeated slides, empty lines.
03
Measure
Estimates spoken runtime from a measured words-per-second rate.
04
Report
Names the lesson, the slide and the offending line for each failure.
05
Gate
Exits non-zero on any failure, so the expensive synthesis step does not run.
Anatomy
Context
- Generated narration, before any audio exists
- A measured speech rate for the chosen voice
- The runtime a platform will still classify as a short
Capabilities
- Detect a figure stated without its unit
- Detect raw digits a speech engine would mispronounce
- Detect one slide restating another
- Estimate spoken runtime from word count
- Fail the run so the next step cannot proceed
Activation
- Operator runs it between script generation and voice synthesis
Authority
What can it change?
- Autonomy
- Autonomous
- Horizon
- Operator-invoked
Read
- Generated narration files
Write
- Nothing — it reports and sets an exit code
Conditional
- Pass the run only when every rule is satisfied
Prohibited
- Edit the narration it judges
- Pass a lesson with an empty or digit-bearing line
- Silently downgrade a failure to a warning
Escalate
- Any failure stops the pipeline and names the line for a human to fix
Composition and verification
Made from explicit parts.
Composition
- Locally generated narration
- Deterministic rule checks
- A measured speech-rate model
- Exit code as the gate
- Human edit before rerun
Verification
- Every rule that rejects exists because that failure shipped, on one day: 2026-08-17
- Runs before synthesis, where a fix is still free
- Long runtime is flagged as advisory, never as failure
- The check writes nothing it could corrupt
Evidence
Check it yourself.
The rules are not good ideas someone had. Each one rejects a line that actually reached synthesis.
A mechanism, shown in source
Every check here exists because the failure it catches actually happened on 2026-08-17,
not because it seemed like a good idea:
COVER-NO-UNIT Lesson 02's opening line came out "Two hundred fifty from eighteen beats
five hundred from thirty-six" — inside its word budget and meaningless
spoken aloud. The cover is the only line with no preceding context, so a
figure there without its currency or unit is unrecoverable.The docstring keeps the broken line itself, not a description of it. Feeding that exact sentence back in still trips COVER-NO-UNIT; adding the missing unit — "Two hundred fifty euro from eighteen…" — passes. The rule discriminates, rather than rejecting anything that looks numeric. LONG is excluded from this claim: it is advisory and flags nothing as an error.
- Rules that reject
- 4
- grep -c 'out.append' check-narration.py
- Lessons currently clean
- 25
- uv run --python 3.11 studio/shorts/check-narration.py
- Speech rate, measured not guessed
- 2.31 w/s
A financial-education studio. The checker is published; the lessons it gates are the client's and are not. The one date is the docstring's own — git shows the pipeline built 2026-08-17 and the checker committed the next day, which is consistent with it, not independent proof of it.
What this establishes: that the mechanism exists and behaves as described, in source you can read and by figures you can reproduce. It does not by itself show the mechanism operating in production, and it is not an outcome observed by anyone other than us.
Next step
What you can do with this.
This configuration runs in production, client identity withheld. To discuss the same for your operation, start with the problem rather than the system: a first call is thirty minutes and costs nothing.
Related entries