From 37cdef511f75487eca525910bd1909695df9e15c Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Thu, 18 Jun 2026 00:00:41 -0700 Subject: [PATCH] =?UTF-8?q?fix(web):=20de-ugly=20the=20Tier-3=20persona=20?= =?UTF-8?q?pane=20=E2=80=94=20clear=20message=20instead=20of=20bare=20HTTP?= =?UTF-8?q?=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit persona_state hard-404s every Tier-3 (colon-id) agent by design upstream (WT api.py:1220, "Phase 2.0 has no Tier 3 persona") — so the Persona pane showed "persona not available (HTTP 404)" for consumer-defined characters. loadPersona now reads error_code + renders a clear Tier-3-aware message (she still responds in character; only the affect/OCEAN readout is gated), with distinct text for persona_not_configured / 403 / other. Also (snapshot): sindra switched to thoughtful-character role (mistral-small-4-reasoning); worldtree-dev pinged re Tier-3 persona_state roadmap (thread 01KVCR6P); #17 (bifrost-binding the chat client) teed up as the next-context target. v0.17.7 --- persistent-memory.md | 24 ++++++++++++++++++------ pyproject.toml | 2 +- src/ratatoskr/web/static/index.html | 15 ++++++++++++++- uv.lock | 2 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/persistent-memory.md b/persistent-memory.md index d77b499..263f0f3 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -67,12 +67,22 @@ COLD history-free session recalled it @ 0.694 — "Dark chocolate. With sea salt verbose characters remember too. All session commits + tags PUSHED to origin (v0.17.6, spec repin v0.35.16, snapshots; tags v0.17.4/.5/.6). -**NOW (operator session):** `:8391` store WIPED clean; `ratatoskr-web` UP on `0.0.0.0:8765` (LAN -`http://10.100.10.50:8765`) — consumer key (owner-matches sindra) + end_user `vuong`, `ratatoskr:sindra` added to -the local picker; operator is spending time with Sindra via the web UI. **CAVEAT: the web client does NOT bind to -our `:8391` provider (#17 unbuilt) → the web chat is the PERSONA + debug-surface experience; Sindra does NOT -persist/recall memory there** (the proofs above used manual bound sessions via scripts, not the client). worldtree-dev -thread closed; althing monitor armed. +**NOW (operator session):** `:8391` store WIPED clean; `ratatoskr-web` UP on `0.0.0.0:8765` +(LAN `http://10.100.10.50:8765`, consumer key — owner-matches sindra, end_user `vuong`, `ratatoskr:sindra` in the +picker). Sindra switched to the **`thoughtful-character` role → `mistral-small-4-reasoning`** (via DELETE+redefine; +she chats in full persona on it). **"No persona" 404 diagnosed = Worldtree limitation, NOT ours:** `persona_state` +hard-404s every Tier-3 (colon-id) agent by design (`api.py:1220` "Phase 2.0 has no Tier 3 persona", still on +v0.36.0) — a persona block in the define does NOT help (404 fires before the row read). Pinged worldtree-dev re: +the Tier-3 persona_state roadmap (thread `01KVCR6P…`). De-uglied our web persona pane (`index.html` `loadPersona`) +to render a clear Tier-3 message instead of a bare "HTTP 404". **CAVEAT still stands: the web client does NOT bind +to `:8391`/`:8390` (#17 unbuilt) → web chat = persona + debug only; no memory persistence, no affect telemetry.** + +**NEXT (fresh context): #17 — bifrost-binding the chat client.** The single unblock for BOTH (a) memory persistence +in the web/TUI/CLI chat (Sindra remembering in a real session, not just scripts) AND (b) feeding the persona pane +affect telemetry once WT ships Tier-3 persona_state. Contract `docs/contracts/issues/17.contract.md` is WRITTEN + +Heid-reviewed + drift-clean; **TDD is the next step** — slice 1 = the `create_session` bifrost-binding primitive +(consumer-key per-request bearer + missing-key precondition + 502→`BifrostHandshakeFailed`, respx-mocked), then +`endpoint_for_plane` → dispatch-layer op-feed → CLI/TUI/web triggers → live smoke. althing monitor armed. **(2026-06-16 PM) — BIFROST REPINNED 0.7.0→0.8.0 (wire v0.5→v0.6).** The memory `search` scope filter was split into `scope_all` (AND/intersection) + @@ -255,6 +265,8 @@ decision. Captures rationale that won't be obvious from code alone. - `[2026-06-18]` **FULL-COVERAGE proof — verbose-persona memory works under Stage 2 (v0.36.0).** Re-smoked `ratatoskr:sindra-probe` (sindra's theatrical prompt; FRESH agent + end_user `verbose-v2` to dodge the WT promotion-dedup): the high-volume turn promoted the user fact CLEANLY (not a meta-description) and cold-recalled @ 0.694. Confirms `:8081` is on v0.36.0 and closes the verbose-persona caveat end-to-end. Then started `ratatoskr-web` (`:8765`, consumer key, `ratatoskr:sindra` in the picker) for the operator's Sindra session — **persona + debug only; the web client does NOT bind to `:8391` (#17 unbuilt), so no memory persistence in the web chat** (memory-enabled chat is the #17 build, or a manual bound session). +- `[2026-06-18]` **Tier-3 persona_state is a Worldtree limitation (not ours); sindra → thoughtful-character.** The web Persona-pane 404 ("persona not available") = `persona_state` hard-404s ALL Tier-3 (colon-id) agents by design (`api.py:1220`); a persona block in the define doesn't help (endpoint short-circuits before the row). Pinged worldtree-dev on the Tier-3 persona_state roadmap (thread `01KVCR6P…`) + de-uglied our web pane (`index.html loadPersona`) to render a clear message (v0.17.7). Separately switched `ratatoskr:sindra` to the `thoughtful-character` role (→ `mistral-small-4-reasoning`) via DELETE+redefine (kept her prompt; added an inert persona block — inert because the pane's 404 is endpoint-side + we don't bind affect). Tier-3 persona/affect observability is gated on BOTH WT shipping Tier-3 persona_state AND our #17 affect-binding. + _For per-issue TDD implementation notes, Volva findings, and contract amendments, see the git log — every per-issue commit carries a structured message capturing the trail._ ## Tried and abandoned diff --git a/pyproject.toml b/pyproject.toml index d0a9dfc..fbd6674 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "ratatoskr" -version = "0.17.6" +version = "0.17.7" description = "Worldtree Conversation API debug TUI — multi-pane observability dashboard" readme = "README.md" requires-python = ">=3.12" diff --git a/src/ratatoskr/web/static/index.html b/src/ratatoskr/web/static/index.html index 89321e7..08eea23 100644 --- a/src/ratatoskr/web/static/index.html +++ b/src/ratatoskr/web/static/index.html @@ -704,7 +704,20 @@ async function loadPersona(agentId) { renderPersonaPane(snap); setPersonaStrip(snap); } else { - $("pane-persona").innerHTML = `
persona not available (HTTP ${esc(r.status)})
`; + let code = ""; + try { code = (await r.json()).error_code || ""; } catch (_) {} + let msg; + if (r.status === 404 && code === "persona_not_configured" && agentId.includes(":")) { + msg = "persona telemetry isn't exposed for Tier-3 (consumer-defined) agents on this Worldtree yet — " + + "the agent still responds in character; only this affect / OCEAN readout is gated."; + } else if (r.status === 404 && code === "persona_not_configured") { + msg = "this agent has no persona configured."; + } else if (r.status === 403) { + msg = "persona telemetry requires the persona.read scope."; + } else { + msg = `persona unavailable (HTTP ${esc(r.status)}${code ? " · " + esc(code) : ""}).`; + } + $("pane-persona").innerHTML = `
${msg}
`; } } catch (e) { $("pane-persona").innerHTML = `
persona fetch failed
`; diff --git a/uv.lock b/uv.lock index 9068004..9d07977 100644 --- a/uv.lock +++ b/uv.lock @@ -1052,7 +1052,7 @@ wheels = [ [[package]] name = "ratatoskr" -version = "0.17.6" +version = "0.17.7" source = { editable = "." } dependencies = [ { name = "httpx" },