Both voice services are deployed (2026-10-18, e2e 33/33 on each) and the harness speech role now points at 7772 — but the vault still said the endpoint did not exist, and the homepage card still said wip: down.
Commit 1 — the card.wip becomes false (the registry schema requires the key on every service; false is what live cards carry), description drops “Hidden until deployed”. showLink: false and category: admin stay: an HTTP API has no page to open, and homepage-status.py counts any HTTP response as up, so the probe is honest without a link. The voice seam that pinned wip == "down" is re-keyed to the deployed contract and now also refuses a link or a user-category placement — that is the only test change, and it exists because the behavior legitimately changed.
Commit 2 — the six stale statements. Both vault descriptions, two index.md bullets, the Open Notebook blocker (the voice leg works; the app itself is what is missing), and the engine page’s “Deploy order — nothing below has been run” is now a Deploy record carrying the real ledger: healthy 31 s after the build at 4.0 GiB resident, three voices warm, the ladder measured at 1,883 ms then 1,226–1,283 ms (not the retired 6.2–8.0 s), two voices rendering one sentence into different bytes.
New section The harness speech role on the endpoint page — three laws measured the day of the flip:
Law
Evidence
speech.voice is the forwarded key; tts.localVoice belongs to Kokoro
control test answered voice=kokoro/bm_george, backend=local
An explicit speech role has no fallback candidate
dead-path error: “No available speech model matches the speech role”
models.yml loads at process start, config.yml is live
the open session failed twice in the same minute a fresh omp -p --tools tts saved 180 524 bytes with voice=narrator1, and the façade logged the matching speech voice=narrator1 format=wav chars=51
./tests/run.sh → 444/444. After merge this needs ./scripts/deploy.sh dankclaw --service homepage to put the card on the panel; no container restarts.
Both voice services are **deployed** (2026-10-18, e2e 33/33 on each) and the harness `speech` role now points at 7772 — but the vault still said the endpoint did not exist, and the homepage card still said `wip: down`.
**Commit 1 — the card.** `wip` becomes `false` (the registry schema requires the key on every service; `false` is what live cards carry), description drops “Hidden until deployed”. `showLink: false` and `category: admin` stay: an HTTP API has no page to open, and `homepage-status.py` counts *any* HTTP response as up, so the probe is honest without a link. The voice seam that pinned `wip == "down"` is re-keyed to the deployed contract and now also refuses a link or a user-category placement — that is the only test change, and it exists because the behavior legitimately changed.
**Commit 2 — the six stale statements.** Both vault descriptions, two `index.md` bullets, the [[Open Notebook]] blocker (the voice leg works; the app itself is what is missing), and the engine page’s “Deploy order — *nothing below has been run*” is now a **Deploy record** carrying the real ledger: healthy 31 s after the build at **4.0 GiB** resident, three voices warm, the ladder measured at **1,883 ms then 1,226–1,283 ms** (not the retired 6.2–8.0 s), two voices rendering one sentence into different bytes.
New section **The harness speech role** on the endpoint page — three laws measured the day of the flip:
| Law | Evidence |
|---|---|
| `speech.voice` is the forwarded key; `tts.localVoice` belongs to Kokoro | control test answered `voice=kokoro/bm_george, backend=local` |
| An explicit speech role has **no** fallback candidate | dead-path error: *“No available speech model matches the speech role”* |
| `models.yml` loads at process start, `config.yml` is live | the open session failed twice in the same minute a fresh `omp -p --tools tts` saved 180 524 bytes with `voice=narrator1`, and the façade logged the matching `speech voice=narrator1 format=wav chars=51` |
`./tests/run.sh` → **444/444**. After merge this needs `./scripts/deploy.sh dankclaw --service homepage` to put the card on the panel; no container restarts.
The endpoint deployed on 2026-10-18, so the admin card must carry its state rather than a placeholder: wip becomes false (the registry schema wants the key on every service; false is what the live cards use) and the description drops the "Hidden until deployed" line. showLink stays false and the card stays admin-only: an HTTP API has no page to open, and homepage-status.py counts ANY HTTP response as up, so the card is honest with no link and no /health path in the probe. The voice seam that pinned wip == down is re-keyed to the deployed contract and now also refuses a link or a user-category placement.
Six statements still claimed the endpoint did not exist: both vault descriptions, the two index.md bullets, the Open Notebook blocker, and the engine page deploy order that opened with "Nothing below has been run". All re-keyed to the deployed state, with the ledger the deploys printed: engine healthy 31 s after the build at 4.0 GiB resident, three voices warm, the ladder measured at 1883 ms then 1226-1283 ms (not the retired 6.2-8.0 s), and two voices rendering the same sentence into different bytes.
Adds a The harness speech role section to the endpoint page with the three wiring laws measured the day of the flip: speech.voice is the forwarded key (tts.localVoice belongs to Kokoro), an explicit speech role has no fallback candidate, and models.yml loads at process start while config.yml is read live - so a session older than the frank-tts row fails exactly like a dead endpoint. Fresh-process proof: omp -p --tools tts saved 180524 bytes with voice=narrator1 while the facade logged the matching speech line.
The section this PR adds claimed speech.voice was the forwarded voice key. It is not: the openai-speech transport builds {model, input, response_format, voice?} and sets voice only when the CALL passed voice_id, tts.localVoice is the local Kokoro backend key, and speech.voice is the TUI speak-aloud voice whose enum is Kokoro-only. A restarted session proved it the honest way - the tts device arrived at 7772 with no voice key and got "unknown voice None; available voices: narrator1, narrator2, narrator3" - so the fresh-process success earlier that day was the run that was told to pass voice_id, not evidence of a setting.
The law now reads: voice comes from voice_id alone, so a voice-less call is the harness default shape (the endpoint grew DEFAULT_VOICE in its own PR to answer it), and speech.voice must stay a Kokoro name - a pack name there breaks the vocalizer and does nothing for synthesis. config.yml reverted to am_fenrir on the operator box, and the worklog entry that recorded narrator1 as wiring carries the correction.
dank
merged commit b590695e2a into main2026-10-18 19:25:38 -07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Both voice services are deployed (2026-10-18, e2e 33/33 on each) and the harness
speechrole now points at 7772 — but the vault still said the endpoint did not exist, and the homepage card still saidwip: down.Commit 1 — the card.
wipbecomesfalse(the registry schema requires the key on every service;falseis what live cards carry), description drops “Hidden until deployed”.showLink: falseandcategory: adminstay: an HTTP API has no page to open, andhomepage-status.pycounts any HTTP response as up, so the probe is honest without a link. The voice seam that pinnedwip == "down"is re-keyed to the deployed contract and now also refuses a link or a user-category placement — that is the only test change, and it exists because the behavior legitimately changed.Commit 2 — the six stale statements. Both vault descriptions, two
index.mdbullets, the Open Notebook blocker (the voice leg works; the app itself is what is missing), and the engine page’s “Deploy order — nothing below has been run” is now a Deploy record carrying the real ledger: healthy 31 s after the build at 4.0 GiB resident, three voices warm, the ladder measured at 1,883 ms then 1,226–1,283 ms (not the retired 6.2–8.0 s), two voices rendering one sentence into different bytes.New section The harness speech role on the endpoint page — three laws measured the day of the flip:
speech.voiceis the forwarded key;tts.localVoicebelongs to Kokorovoice=kokoro/bm_george, backend=localmodels.ymlloads at process start,config.ymlis liveomp -p --tools ttssaved 180 524 bytes withvoice=narrator1, and the façade logged the matchingspeech voice=narrator1 format=wav chars=51./tests/run.sh→ 444/444. After merge this needs./scripts/deploy.sh dankclaw --service homepageto put the card on the panel; no container restarts.The section this PR adds claimed speech.voice was the forwarded voice key. It is not: the openai-speech transport builds {model, input, response_format, voice?} and sets voice only when the CALL passed voice_id, tts.localVoice is the local Kokoro backend key, and speech.voice is the TUI speak-aloud voice whose enum is Kokoro-only. A restarted session proved it the honest way - the tts device arrived at 7772 with no voice key and got "unknown voice None; available voices: narrator1, narrator2, narrator3" - so the fresh-process success earlier that day was the run that was told to pass voice_id, not evidence of a setting. The law now reads: voice comes from voice_id alone, so a voice-less call is the harness default shape (the endpoint grew DEFAULT_VOICE in its own PR to answer it), and speech.voice must stay a Kokoro name - a pack name there breaks the vocalizer and does nothing for synthesis. config.yml reverted to am_fenrir on the operator box, and the worklog entry that recorded narrator1 as wiring carries the correction.