docs: record the wire rename, the OpenWebUI re-key, and the frank-primary bench drop-in trap
- AGENTS.md Model Config: the Protoss names are now the ids on the wire (per-endpoint knob named); verify a rename on /v1/models, never on a chat response — radiance echoes the requested name - OMP Harness.md: harness id == served id; one id per model everywhere - Homepage.md: the docs-page "api id" annotations and the switchover promise are retired - OpenWebUI.md: the id-keyed trio (model row, access_grant, api_configs model_ids) is a foreign-key set — re-key it in the same deploy; plus the contenteditable-composer probe note - frank-secondary/frank-large/frank-primary runbooks: served ids frank-zealot/frank-dragoon/frank-archon, and the bench.conf drop-in that made every frank-primary deploy since 2026-10-08 04:09 restart the staging worktree behind a green health gate
This commit is contained in:
@@ -13,13 +13,17 @@ registry; single source of truth — there is no copy on the servers) and
|
||||
`~/.omp/agent/config.yml` (roles, compaction, global samplers). Nothing in
|
||||
this file is repo-managed; edits are harness-side only.
|
||||
|
||||
**Model ids are the StarCraft unit names (official 2026-10-08):**
|
||||
`frank-archon` (dankserver :7770, radiance), `frank-dragoon` (dankclaw
|
||||
:7770, flash-server), `frank-zealot` (dankclaw :7771, the 3090
|
||||
compaction hub) — formerly `frank-primary`, `frank-large`,
|
||||
**Model ids are the StarCraft unit names (official 2026-10-08, on the wire
|
||||
since 2026-10-09):** `frank-archon` (dankserver :7770, radiance),
|
||||
`frank-dragoon` (dankclaw :7770, flash-server), `frank-zealot` (dankclaw
|
||||
:7771, the 3090 compaction hub) — formerly `frank-primary`, `frank-large`,
|
||||
`frank-secondary`. The SERVICES keep the old names (units, scripts, env
|
||||
files, runbook pages); pages written in the old era name the service,
|
||||
the harness names the model.
|
||||
the harness names the model. The wire now matches: each endpoint's
|
||||
`/v1/models` answers with the Protoss name, so `models.yml`, the OpenWebUI
|
||||
picker/grants, the homepage docs and the raw API all use one id per model
|
||||
(see [[OpenWebUI]] for the grant re-key and the [[frank-primary-radiance-swift15-w4dn8]]
|
||||
note on radiance echoing the requested name).
|
||||
|
||||
## Compaction chain arithmetic (verify before ANY window change)
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ on large sizes ⇒ check ComfyUI resources; 401 ⇒ the token is bad.
|
||||
- The image tracks upstream `main`; pin a digest in the quadlet unit if reproducible rollback matters more than tracking. (The old "CPU-only host" framing is stale: this APU runs the gfx1151 ROCm build — see [[ComfyUI]].)
|
||||
- The default admin account is created on first login; secure it immediately.
|
||||
- If the backend is loading (3–8 minute model load), OpenWebUI shows connection errors until the model is ready.
|
||||
- The on-host LLM services (frank-large `:7770`, frank-secondary `:7771`) are reached via `host.containers.internal`, NOT the host LAN IP: the container's netavark bridge cannot hairpin to its own host's non-published ports via `192.168.0.143` (connection refused), and the bridge gateway (`10.89.3.1`) lives in the rootless netns while llama-server runs in the host netns, so it refuses too. `host.containers.internal` (169.254.1.2) resolves to the host on the bridge and works — verified end-to-end for both endpoints. The Dankserver backend (frank-medium) is a different host, reached via its LAN IP `192.168.0.235:7770`.
|
||||
- The on-host LLM services (Dankclaw `:7770`, `:7771`) are reached via `host.containers.internal`, NOT the host LAN IP: the container's netavark bridge cannot hairpin to its own host's non-published ports via `192.168.0.143` (connection refused), and the bridge gateway (`10.89.3.1`) lives in the rootless netns while llama-server runs in the host netns, so it refuses too. `host.containers.internal` (169.254.1.2) resolves to the host on the bridge and works — verified end-to-end for both endpoints. The Dankserver backend is a different host, reached via its LAN IP `192.168.0.235:7770`.
|
||||
|
||||
## History
|
||||
|
||||
@@ -279,6 +279,35 @@ on large sizes ⇒ check ComfyUI resources; 401 ⇒ the token is bad.
|
||||
|
||||
- **2026-10-07 — picker narrowed to `frank-secondary` only.** Per Frank: the only model accessible in OpenWebUI is `frank-secondary`. Rebuilt the `model` table to a single `frank-secondary` row (the old rows `frank-large`/`frank-primary`/`frank-small` are deleted), set `openai.api_configs` indices 0 (frank-large) and 1 (frank-primary) to `enable: false`, and retargeted index 2's `model_ids` from the stale `frank-small` label to `frank-secondary` — llama.cpp serves by alias, so the old label addressed a model name the server does not know. Pre-change snapshot: `/home/dank/Containers/open-webui/data/webui.db.bak-20261007` (+ `-wal`/`-shm`). Verified: `/api/v1/models/list` returns exactly `["frank-secondary"]`, chat completion answers `pong` (needs `max_tokens≥1500` — the Qwen3.5 thinking block consumes a 200-token budget), and anonymous API probes are all 401 (see [API access](#api-access-auth-gated)).
|
||||
|
||||
- **2026-10-09 — re-keyed to the Protoss ids (wire rename).** The endpoints
|
||||
began serving `frank-zealot` / `frank-dragoon` / `frank-archon`, so three
|
||||
id-keyed objects had to move in the same window as the alias flip:
|
||||
`model.id`+`name` (`frank-secondary` → `frank-zealot`, `params`
|
||||
`{"context":{"length":200704}}` and the `meta.description` kept),
|
||||
`access_grant` (`resource_type='model'`, `resource_id`, principal
|
||||
`user`/`*`, permission `read`), and `openai.api_configs` per-backend
|
||||
`model_ids` (index 2 = `:7771` is the enabled family backend; indices 0/1
|
||||
= `:7770` and Dankserver `:7770` stay `enable: false`). Snapshot first:
|
||||
`/home/dank/Containers/open-webui/data/webui.db.bak-20261009`. Apply from
|
||||
inside the container (`podman exec -i open-webui python3 -`, sqlite3; the
|
||||
image has no sqlite3 binary) then `systemctl --user restart open-webui.service`
|
||||
(it is a rootless quadlet) to drop the cached model list. Verify in a real
|
||||
browser as the family QA account: the welcome screen selects
|
||||
`frank-zealot` and answers. **A stale id fails silently** — the picker
|
||||
simply lists nothing, because OpenWebUI intersects the backend's
|
||||
`/v1/models` with `model_ids`.
|
||||
|
||||
Law: **the model id is a foreign key in three tables.** Any future alias
|
||||
change on an endpoint OpenWebUI fronts must ship with this re-key, in the
|
||||
same deploy.
|
||||
|
||||
- **2026-10-09 — composer is `contenteditable`, not `<textarea>`.** A
|
||||
Playwright probe that waits for `textarea` after SSO times out on the
|
||||
welcome screen: OpenWebUI 0.6 renders the composer as a contenteditable
|
||||
div. The stable anchor is the model button (`getByRole("button", {
|
||||
name: /selected model/i })`) and the welcome text "How can I help you
|
||||
today?"; that snapshot is also the cheapest proof the picker is populated.
|
||||
|
||||
## See Also
|
||||
|
||||
- [[Dankclaw Stack]]
|
||||
|
||||
@@ -65,7 +65,7 @@ pinned in `homepage_config.bats`.
|
||||
**Protoss rename + Model Information component (2026-10-08):** the model
|
||||
cards became the StarCraft trio — `frank-large` → **frank-dragoon**
|
||||
(iGPU), `frank-primary` → **frank-archon** (Dankserver), `frank-secondary`
|
||||
→ **frank-zealot** (3090). The endpoint/API ids did NOT change; only the
|
||||
→ **frank-zealot** (3090). The endpoint/API ids did NOT change in this wave; only the
|
||||
family-facing names. The three cards fused into one **Model Information**
|
||||
component (`app.js` `renderModelInfo()`, `.model-info`/`.mi-*` styles):
|
||||
Protoss unit art (`/img/unit-<unit>.jpg`, hex-clipped), per-unit accent
|
||||
@@ -205,6 +205,14 @@ systemd services keep the `frank-primary`/`frank-large`/
|
||||
`frank-secondary` names. Homepage, docs page and harness now agree on
|
||||
one name per model.
|
||||
|
||||
**Api ids renamed on the wire (2026-10-09):** the promise in
|
||||
`docs.html` is kept — the served model ids are now `frank-zealot`,
|
||||
`frank-dragoon`, `frank-archon`, so the docs page no longer carries
|
||||
`api id:` annotations, and the curl/opencode/Pi examples send
|
||||
`frank-zealot`. The systemd services keep the old names. `docs.html`
|
||||
names the fleet trio once each; `homepage_config.bats` pins the card
|
||||
ids, which did not change.
|
||||
|
||||
**Console polish (2026-10-08, eighth wave):** five fixes — octagon
|
||||
clip-paths replaced with `border-radius` (the clipped corners read as
|
||||
gaps in the 1px border); section-title diamonds moved from absolute
|
||||
|
||||
@@ -88,7 +88,7 @@ resume law throughout; no token — the repos are public).
|
||||
| `HALOGEN_MAX_TOK` / `HALOGEN_MAX_TOKENS_CAP` / `HALOGEN_QUEUE_TIMEOUT` | 8192 / 65536 / 7200 | 8192 is only the per-request DEFAULT (the harness sends at most its `maxTokens` 45,056); the cap/timeout pair is COUPLED per FLAGS.md (65536 at ~10 t/s serial needs > 6550 s) |
|
||||
| `HALOGEN_TEMPERATURE` / `TOP_P` / `TOP_K` | 1.0 / 0.95 / 20 | the card's thinking recipe as SERVER-SIDE defaults — the engine HAS a sampler now, so an absent temperature is no longer greedy; models.yml extraBody matches it (consistent, not load-bearing) |
|
||||
| `HALOGEN_WEIGHTS_LOCK` | 1 | card's belt-and-braces; the engine pins weights by default on v2 (`HALOGEN_FLASH_PIN_TRUNK=0` is a w4b-only knob and is REFUSED by v2) |
|
||||
| `HALOGEN_MODEL_ID` / publish | frank-large / 7770:8731 | unchanged aliases; engine port 8730 never published |
|
||||
| `HALOGEN_MODEL_ID` / publish | **frank-dragoon** / 7770:8731 | served id renamed 2026-10-09 (service/unit/env keep `frank-large`); engine port 8730 never published |
|
||||
| MTP depth | default 2 | FLAGS.md: 2 is best all-round, 3 for code — Frank's traffic is agent/prose |
|
||||
|
||||
**Memory ledger** (121.2 GiB unified, the referee is the boot ledger):
|
||||
|
||||
@@ -157,6 +157,34 @@ MiB measured**); the serve size floor `FRANK_PRIMARY_RAD_MIN_MIB` moves
|
||||
pools 57.84 GiB, cards settled 1.41 GiB free, `serving on :7770`.
|
||||
Live decode probe (512 tokens, streamed, temp 0): ~190 t/s.
|
||||
|
||||
### Wire rename + the bench drop-in trap (2026-10-09)
|
||||
|
||||
`FRANK_PRIMARY_SERVED_NAME` moved `frank-primary` → **frank-archon**; the
|
||||
service, unit, scripts and env file keep the old name. Radiance is the only
|
||||
fleet engine whose `/v1/models` listing reflects the flag, and it echoes the
|
||||
**requested** model name in chat responses — so a chat probe that returns 200
|
||||
proves nothing about the served id. Always read `/v1/models`.
|
||||
|
||||
The first deploy after the edit came up green and `/v1/models` still said
|
||||
`frank-primary`. Cause: a campaign leftover drop-in
|
||||
`/etc/systemd/system/frank-primary.service.d/bench.conf` (2026-10-08 04:09)
|
||||
overrode BOTH `Environment=FRANK_PRIMARY_ENV_FILE` and `ExecStart` to the
|
||||
staging worktree `/home/dank/serverAppConfigs-swift15`. Every
|
||||
`deploy.sh dankserver --service frank-primary` since then restarted the
|
||||
staging tree: green health gate, old configuration, silently. Verified before
|
||||
removing: the staging `serve-frank-primary.sh` and `frank-primary.service`
|
||||
are byte-identical to the checkout, its `frank-primary.env` differed only by
|
||||
the alias line, and its HEAD (`8375567`) is an ancestor of `main`. The
|
||||
drop-in is staged in `/home/dank/.AGENTTRASH/20261009-frank-primary-bench-dropin/`.
|
||||
After `daemon-reload` + restart, `/v1/models` reports `frank-archon` (boot
|
||||
healthy in 102 s, shape unchanged: fp8 KV, spec depth 2, seqs 3, vram pair
|
||||
26071/3543).
|
||||
|
||||
**Deployer blind spot:** `deploy.sh` plans from repo paths and gates on the
|
||||
port. It cannot see host-side drop-ins, so unit drift is invisible to a green
|
||||
run. After an LLM deploy, verify the served configuration behaviourally
|
||||
(here: `podman inspect <name> --format {{json .Config.Cmd}}` and `/v1/models`).
|
||||
|
||||
|
||||
|
||||
## Deploy + verify
|
||||
|
||||
@@ -25,7 +25,7 @@ conversation slot and unquantized KV back.
|
||||
| | |
|
||||
|---|---|
|
||||
| Host / device | Dankclaw (192.168.0.143), RTX 3090, 24,576 MiB |
|
||||
| Endpoint | `http://192.168.0.143:7771` — alias `frank-secondary`, `/v1` OpenAI surface |
|
||||
| Endpoint | `http://192.168.0.143:7771` — served model id **`frank-zealot`** (`ALIAS` in the env; the SERVICE keeps the `frank-secondary` name), `/v1` OpenAI surface |
|
||||
| Runtime | llama.cpp master (0.5.0-dev, commit `5fc4f3c`), CUDA sm_86 build `…/llama-master/build-cuda/bin/llama-server` (`GGML_CUDA_FA_ALL_QUANTS=ON`); `qwen35` is registered in the build's own `src/llama-arch.cpp` and `src/models/qwen35.cpp` exists at that commit |
|
||||
| Unit | root systemd `frank-secondary.service` ([`scripts/frank-secondary.service`](../../scripts/frank-secondary.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` |
|
||||
| Serve script | [`scripts/serve-frank-secondary.sh`](../../scripts/serve-frank-secondary.sh), tunables [`scripts/frank-secondary.env`](../../scripts/frank-secondary.env) |
|
||||
@@ -96,7 +96,15 @@ which is what the engine printed. The `n_ctx_seq (200704) < n_ctx_train
|
||||
(262144)` line is informational (a context **below** the trained window is
|
||||
safe; the Gemma4 era's warning was the opposite case, a drafter running 53 %
|
||||
**past** its window). Weights load in ~6 s from page cache; `/health` answers
|
||||
`{"status":"ok"}` and `/v1/models` serves the alias `frank-secondary`.
|
||||
`{"status":"ok"}` and `/v1/models` serves the alias `frank-zealot`.
|
||||
|
||||
**Wire rename (2026-10-09):** `ALIAS` moved `frank-secondary` → `frank-zealot`,
|
||||
so the served id matches the harness model id and the family-facing name.
|
||||
Consumers re-keyed in the same change: OpenWebUI (`model` row, `access_grant`
|
||||
row, `openai.api_configs` index-2 `model_ids`) and `models.yml` (already
|
||||
renamed 2026-10-08). llama.cpp does NOT validate the requested model name —
|
||||
it answers and echoes the served alias — so a stale client keeps working;
|
||||
the picker and any id-keyed grant is what breaks. See [[OpenWebUI]].
|
||||
|
||||
The deploy's Playwright gate passed (33 tests) and the fleet e2e set is
|
||||
unchanged.
|
||||
|
||||
Reference in New Issue
Block a user