docs(log): frank-tts phase 1 landed as PR #4; PTQ1_0 provenance line finished
The dragoon-window provenance bullet still said the zealot arm owed a
measurement — it does not: the numbers are recovered and in the fetch script and
runbook. Adds the frank-tts phase-1 entry (naming law, port 7772, voice-pack law,
384/384 suite, PR #4 merged as 49c4e19, and the measured Gitea merge-field law).
This commit is contained in:
1 parent
49c4e198fd
commit
4a6d5b8191
1 file changed
+49
-5
@@ -2247,11 +2247,12 @@ every restart since the cutover.
|
|||||||
the 9B swap of the same day had not reached those two spots. Re-keyed: 8
|
the 9B swap of the same day had not reached those two spots. Re-keyed: 8
|
||||||
full-attention + 24 Gated DeltaNet + the `blk.32` MTP block, 3 × 262,144,
|
full-attention + 24 Gated DeltaNet + the `blk.32` MTP block, 3 × 262,144,
|
||||||
tensor type **141**.
|
tensor type **141**.
|
||||||
- PTQ1_0 provenance corrected: `scripts/download-frank-zealot-bonsai2-ptq1.sh`
|
- PTQ1_0 provenance corrected (see the dedicated section above): the arm that
|
||||||
IS committed, so the armed-but-never-measured arm that hijacked the zealot
|
hijacked the zealot deploy was a **repo-tracked, Frank-ordered, measured**
|
||||||
deploy was a **repo-tracked candidate**, not an orphan. The runbook now states
|
candidate — `scripts/download-frank-zealot-bonsai2-ptq1.sh` is committed, and
|
||||||
the decision it still owes: measure it in a real window, or record it
|
its header now carries the recovered numbers (≈48 t/s decode, 801 t/s prefill
|
||||||
declined.
|
at 141k) and the verdict: −37 % decode against PQ2_0 for 1,201 MiB freed, then
|
||||||
|
scratched by Frank's 03:33 order in favour of the 9B. Nothing is owed on it.
|
||||||
- OpenWebUI: both decoration rows re-keyed in the live DB. The values live
|
- OpenWebUI: both decoration rows re-keyed in the live DB. The values live
|
||||||
inside JSON columns — `params.context.length` and `meta.description` — not in
|
inside JSON columns — `params.context.length` and `meta.description` — not in
|
||||||
fields named for them, and there is no `sqlite3` binary on the host, so
|
fields named for them, and there is no `sqlite3` binary on the host, so
|
||||||
@@ -2267,3 +2268,46 @@ every restart since the cutover.
|
|||||||
`timings` object and the `ttft;dur=` header are **llama.cpp** instruments —
|
`timings` object and the `ttft;dur=` header are **llama.cpp** instruments —
|
||||||
frank-zealot's, not dragoon's. AGENTS.md's Benchmarking Policy re-keyed to
|
frank-zealot's, not dragoon's. AGENTS.md's Benchmarking Policy re-keyed to
|
||||||
say which engine owns which instrument.
|
say which engine owns which instrument.
|
||||||
|
|
||||||
|
## 2026-10-18 — frank-tts phase 1: the cloned-voice endpoint, named and tested (not deployed)
|
||||||
|
|
||||||
|
- Voice-over goal, phase 1 (Gitea issue #2). New service **frank-tts** on
|
||||||
|
Dankclaw: `dankclaw/voiceservice/` (stdlib-only `app.py` + `Containerfile` +
|
||||||
|
rootless quadlet), `scripts/frank-tts.env`, `tests/frank_tts_unit.bats`
|
||||||
|
(12 tests). One OpenAI-shaped `POST /v1/audio/speech` surface; `voice=<name>`
|
||||||
|
is honoured only when `/voices/<name>/reference.wav` exists, otherwise a 400
|
||||||
|
listing the voices that are — no silent fallback voice. `voice_id` is the
|
||||||
|
harness alias; `response_format=mp3` really is mp3; oversized input is a 414,
|
||||||
|
not a half-narrated sentence; `/health` reports backend + voice list; no audio
|
||||||
|
ever reaches the log. Two backends behind it (`TTS_BACKEND=omni-http` forwards
|
||||||
|
to the host's `:8880` engine with the voice as base64 `reference_audio`;
|
||||||
|
`llama-tts-cli` runs a binary per request at `nice -n 19`), both exercised
|
||||||
|
through stubs — no GPU, no containers in the seam.
|
||||||
|
- **Naming law applied (Frank's call):** treat it as a first-class model
|
||||||
|
endpoint → alias-named `frank-tts` (TTS endpoint, so not `frank-asr`),
|
||||||
|
**port 7772**, joining `7770 frank-dragoon` / `7771 frank-zealot`; the engine
|
||||||
|
upstream keeps 8880 and is deliberately not a fleet endpoint. The internal
|
||||||
|
knob names stay `SHIM_*` (they name the façade component, not the service).
|
||||||
|
- **Voice-pack law recorded** in the env header: a pack needs `reference.wav`
|
||||||
|
(24 kHz mono, 18–25 s) **and** the pinned engine's own speaker artifact —
|
||||||
|
required, beside the WAV, never replacing it — plus `manifest.json` provenance
|
||||||
|
whose offsets are always past the first 10 s of the source (the
|
||||||
|
source-material law). Enforcement is split honestly: the shim gates on
|
||||||
|
`reference.wav` (the only engine-agnostic term); the pack builder is what will
|
||||||
|
refuse to emit a pack without its artifact.
|
||||||
|
- Suite green: **384/384** (`./tests/run.sh`, wall 66 s). Landed as **PR #4**
|
||||||
|
(branch `wt/20261017-181502` → `main`, merged as `49c4e19`) — the first PR on
|
||||||
|
this repo through the API, which cost three 422s to get right: the merge
|
||||||
|
endpoint takes **`{"Do":"merge"}`**, `Do` being a *string* naming the strategy.
|
||||||
|
`DoMerge`/`merge_method` do not exist on this Gitea; swagger JSON is disabled
|
||||||
|
on the instance, so the 422 messages are the schema. Law saved to the
|
||||||
|
`gitea-api-pr-operations` skill.
|
||||||
|
- Deliberately NOT in this phase: the `:8880` engine decision and its
|
||||||
|
speaker-artifact format, the pack builder, deployer/homepage/Prometheus
|
||||||
|
registration, the `models.yml` row that lets omp call it, and open-notebook.
|
||||||
|
Harness fact established while writing the PR body: the **`tts` tool** will
|
||||||
|
dispatch an `api: openai-speech` provider row to `POST <baseUrl>/audio/speech`
|
||||||
|
(`{model, input, response_format, voice}`), but the live `speech.*` vocalizer is
|
||||||
|
Kokoro-enum-only — so "the agent talks in my voice" needs that provider row or
|
||||||
|
a `pi.registerProvider` extension, decided in phase 2.
|
||||||
|
|
||||||
Reference in new issue
Block a user