diff --git a/serverAppConfigs-docs/log.md b/serverAppConfigs-docs/log.md index eb01660..b397e67 100644 --- a/serverAppConfigs-docs/log.md +++ b/serverAppConfigs-docs/log.md @@ -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=` + is honoured only when `/voices//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 /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. +