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:
@@ -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
|
||||
full-attention + 24 Gated DeltaNet + the `blk.32` MTP block, 3 × 262,144,
|
||||
tensor type **141**.
|
||||
- PTQ1_0 provenance corrected: `scripts/download-frank-zealot-bonsai2-ptq1.sh`
|
||||
IS committed, so the armed-but-never-measured arm that hijacked the zealot
|
||||
deploy was a **repo-tracked candidate**, not an orphan. The runbook now states
|
||||
the decision it still owes: measure it in a real window, or record it
|
||||
declined.
|
||||
- PTQ1_0 provenance corrected (see the dedicated section above): the arm that
|
||||
hijacked the zealot deploy was a **repo-tracked, Frank-ordered, measured**
|
||||
candidate — `scripts/download-frank-zealot-bonsai2-ptq1.sh` is committed, and
|
||||
its header now carries the recovered numbers (≈48 t/s decode, 801 t/s prefill
|
||||
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
|
||||
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
|
||||
@@ -2267,3 +2268,46 @@ every restart since the cutover.
|
||||
`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
|
||||
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