Skip to content

spec(split-reel): v9 -- each voice is held to its own slowest measured pace - #5932

Merged
gHashTag merged 5 commits into
masterfrom
claude/split-reel-v9-pace-per-voice
Oct 4, 2026
Merged

gHashTag merged 5 commits into
masterfrom
claude/split-reel-v9-pace-per-voice

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

What

specs/automation/split-reel.t27 goes from v8 to v9: each voice is held to its own slowest measured pace before it is paid for.

Closes #5925. Host: gHashTag/999-multibots-telegraf#3573 (option (c) there; options (a) and (b) were rejected for the reasons given in that issue).

  1. A pace per voice: PACE_PER_VOICE = true, next to MS_PER_CHAR.
    • The problem in v8: every text was judged at MS_PER_CHAR = 56, the owner's pace. A slower voice was charged, measured past SPEECH_MAX_SECONDS, and given back, on every reel it was asked for.
    • In v9, a voice keeps the slowest pace it was ever measured at, on its clone's own row. The pace is ms per speech unit, rounded up.
    • The next text for that voice is judged at the slower of MS_PER_CHAR and that pace. A voice is never judged faster than MS_PER_CHAR.
    • New fns:
      • pace_for(slowest)
      • measured_pace(ms, units)
      • slowest_pace(kept, measured)
      • pace_to_keep(kept, ms, units)
      • row_pace_after(row_of_measured, kept, ms, units)
    • speech_ms_estimate(units, slowest) and text_fits(units, slowest) now take the voice's pace. A voice never measured passes 0 and is judged at MS_PER_CHAR, exactly as in v8.
  2. A pace never lands on another voice: PACE_ON_OTHER_VOICES = false.
    • A measurement is kept on the measured voice's own row and nowhere else.
    • Another voice keeps the pace it had: another client's, another seller's, or one never measured. A never-measured clone stays at 0 and is judged at MS_PER_CHAR.
    • Written onto them, one voice's pace would refuse a stranger's text, before the charge, at a pace that voice never spoke at.
    • Found by the host as a surviving mutant. keepVoicePace's WHERE voice_id = $1, widened to ... OR ms_per_char IS NULL, passed every test. The test fake applied the UPDATE to the voice in $1, whatever the WHERE said.
    • New test: "a voice's pace is kept on its own row and never on another voice".
    • VERSION stays 9.
  3. Speech units.
    • A digit is read out as a word: DIGIT_WEIGHT = 4.
    • A letter of a script that writes a syllable or a word per character (Han, Hiragana, Katakana, Hangul) is spoken at ~150-250 ms per 999#3573: WIDE_CHAR_WEIGHT = 4.
    • Everything else, including Latin and Cyrillic letters, weighs PLAIN_CHAR_WEIGHT = 1. MS_PER_CHAR was measured on such text, and the measured clip has no digits and no wide letters (checked).
    • A letter of another alphabet (Greek, Arabic, Hebrew...) weighs 1. Weighing it more would refuse honest texts with no way back; its voice's own pace corrects a slow one.
    • Both weights are a guess that errs long. They are labelled as a guess in the spec.
  4. MIN_PACE_UNITS = 107 (half of the 214 that fit at MS_PER_CHAR).
    • A shorter text is not counted as a measurement. The fixed silence around its words reads as a slow voice, and slowest-wins would keep that error forever: one "Hello" would cap the voice for good.
    • This is a rule, not a measurement.
  5. What stays the same. The refund (REFUND_TOO_LONG_VOICE) stays as the backstop for a voice's first reel and for a voice slower than its own slowest.

Checks (run on this branch at 3adcffa3a, numbers from the output)

  • t27c test-report specs/automation/split-reel.t27 (this checkout's own t27c): tests 24, pass 24, FAIL 0, rate 100.0%. Four are new in v9:

    • "a voice is held to its own slowest measured pace before it is paid"
    • "a voice keeps the slowest pace it was ever measured at"
    • "a digit or a syllable character weighs more than a letter"
    • "a voice's pace is kept on its own row and never on another voice"
  • t27c validate-vacuity --specs-dir <dir holding only this spec>: 0 of 24 tests assert nothing (0.0%).

  • t27c seal --save: tests 24/24, failed 0, forced false. spec_hash sha256:e7db3e6e0176f80ad1aa09b51dd8630e288bb988aec00ef2c983d25f7c2aaf29.

  • Negative controls. tri spec-controls (999) runs the host's 34 controls against copies of this spec: 34 of 34 caught.

    • The two new controls are caught by the new test:
      • PACE_ON_OTHER_VOICES = true
      • the other-row guard in row_pace_after replaced by if kept > 0 (a never-measured clone takes the measured pace)
    • The v9 controls:
    # Control (host controls.json) Tests that failed
    24 every voice judged at MS_PER_CHAR (PACE_PER_VOICE ignored) 1
    25 max to min in pace_for 3
    26 latest wins in slowest_pace 2
    27 the measured pace rounded down 1
    28 MIN_PACE_UNITS guard dropped: a short text caps the voice 1
    29 MIN_PACE_UNITS moved off half the ceiling 1
    30 every character weighs one 1
    31 a digit weighs as a letter 1
    32 a syllable character weighs as a letter 1
    33 PACE_ON_OTHER_VOICES = true 1
    34 a never-measured clone takes the measured pace 1
  • The host copy is byte-identical to this spec (cmp rc 0). Host: 47 of 47 mutants killed (see 999#3581).

  • The commit-msg gate (L1) and the pre-commit tri hooks pre-commit / NOW gate pass on both new commits. tri hooks pre-push (the NOW range gate) passes.

Limit

  • A voice with no clone row is never measured: the owner's own reel, spoken by the house's clone. It stays at MS_PER_CHAR. The house is never charged, so no tokens are at stake there.
  • A TTS length has no upper bound before synthesis. v9 narrows the after-charge refusal; it cannot remove it.

Notes

  • 703302b55 (the HOUSE_SKIPS_ELEVENLABS drop) carries no Refs #5925 in its message. Force-push is not allowed, so it stays as is; every later commit carries it.
  • t27c test-report builds in a fixed $TMPDIR/t27c-test-report-<file stem>. Two runs on the same file stem at once overwrite each other's binary. That made one control read MISSED, and made a seal drop its tests record (failed to invalidate kernel cache: FileNotFound). The numbers above come from runs with a private TMPDIR.

phi^2 + 1/phi^2 = 3 | TRINITY

🤖 Generated with Claude Code

gHashTag and others added 2 commits October 4, 2026 14:02
…d pace

v8 judged every text at MS_PER_CHAR=56, the owner's pace. A slower voice was charged, measured past SPEECH_MAX_SECONDS and given back, on every reel it was asked for.

v9 (PACE_PER_VOICE=true):
- A voice keeps, on its clone's own row, the slowest pace it was ever measured at (measured_pace, slowest_pace, pace_to_keep).
- A text is judged at the slower of MS_PER_CHAR and that pace (pace_for). speech_ms_estimate and text_fits take the voice's pace.
- A text is counted in speech units: DIGIT_WEIGHT=4 and WIDE_CHAR_WEIGHT=4 for Han, kana and Hangul.
- A text under MIN_PACE_UNITS=107 is not counted as a measurement.

The refund stays as the backstop for a voice's first reel and for a voice slower than its own slowest.

test-report 23/23. validate-vacuity: 0 of 23 vacuous. 7 negative controls on copies, all red.

Closes #5925
Refs gHashTag/999-multibots-telegraf#3573

phi^2 + 1/phi^2 = 3 | TRINITY

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sured pace

Refs #5925

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 07:07:22 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 47
PRs with All Checks Green 3
READY 1
FAILING 47
PENDING 0
NO CHECKS YET 0

These columns do not partition: 1 + 47 + 0 + 0 = 48, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

crm-story-reel v24 (t27#5915) removes HOUSE_SKIPS_ELEVENLABS; the voice
note in split-reel.t27 no longer points at it. Comment only, re-sealed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 07:29:01 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 48
PRs with All Checks Green 2
READY 1
FAILING 48
PENDING 0
NO CHECKS YET 0

These columns do not partition: 1 + 48 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

This was referenced Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 10:42:42 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 41
PRs with All Checks Green 9
READY 2
FAILING 41
PENDING 0
NO CHECKS YET 0

These columns do not partition: 2 + 41 + 0 + 0 = 43, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d7588f739847 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

This was referenced Oct 4, 2026
@gHashTag
gHashTag merged commit cedb826 into master Oct 4, 2026
28 of 30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

split-reel v9: hold each voice to its own slowest measured pace before the charge

1 participant