Operator-flagged third pass: "overall background for the whole app is blue." The previous "zero blue rects" investigations missed the structural cause — Australis's design principle "all colors are cooler than neutral" bakes a blue cast into every dark surface: Ice black #222531 = RGB(34, 37, 49) — blue +44% over red Sea bright #373b46 = RGB(55, 59, 70) — blue +27% over red Sea dark-30 #414751 = RGB(65, 71, 81) — blue +25% over red Sea dark-60 #86929d = RGB(134,146,157) — blue +17% over red Every chrome surface inherits the lean. The user reading "the whole app is blue" is correct — the SVG export just rendered hex values that aren't named "blue" but ARE measurably blue-tinted. ## Fix: keep accents, neutralize darks Australis brand signature lives in the ACCENTS — Aurora blue, cyan, green; Dawn red, yellow. Those are unchanged. The Ice/Sea dark palette is replaced with LAB-matched neutral grays (R=G=B) so the chrome reads truly neutral: $background #222531 → #1a1a1a (neutral near-black) $surface #373b46 → #2a2a2a (neutral dark gray) $panel #414751 → #3a3a3a (neutral mid gray) $foreground #a9bcc3 → #bdbdbd (neutral light gray) $au-dark-30 #414751 → #3a3a3a $au-dark-40 #565f69 → #4f4f4f $au-dark-50 #6e7882 → #6b6b6b $au-dark-60 #86929d → #878787 $au-bright-70 #9daeb6 → #9e9e9e $au-bright-80 #b3cbcf → #bdbdbd $au-bright-white #cce7ec → #e0e0e0 `_AU_DEMOTED` and `_AU_DEMOTED_FAINT` constants (Rich Text styling for demoted telemetry + placeholders) updated to the neutral equivalents. The Aurora bright variants (`$au-bright-blue`, `$au-bright-cyan`, `$au-bright-green`) stay verbatim — those are where the brand voice lives. ## What this preserves vs sacrifices **Preserved**: - Aurora accents: focus borders, active-tab indicator, pane-name widget, user-prompt echo all still render in cyan/blue/green. - Done/Error/Cancelled labels still tinted in Aurora green / Dawn red / Dawn yellow. - Identity widget still Aurora bright-blue. - The "Australis" theme name + variable slugs ($au-*) — downstream CSS rules don't have to change. **Sacrificed**: - The "all colors cooler than neutral" Australis design principle. Deliberate per-operator-feedback deviation; documented in the AUSTRALIS_THEME docstring as a v0.6.2 conscious break with spec. ## Tests + smoke 241/241 GREEN; ruff clean. Live screenshot exports: - Main app: chrome colors are #1a1a1a / #2a2a2a / #3a3a3a / #6b6b6b / #bdbdbd — all neutral grays. Aurora accents preserved as textual highlights. - Agent picker: same — neutral chrome, Aurora accents intact for highlighted item border + agent-id-line. Patch bump (v0.6.1 → v0.6.2): purely cosmetic palette adjustment; no public-API change.
Ratatoskr
A Worldtree Conversation API debug TUI. Runs up and down Worldtree's API surface — sessions, turns, persona, tools, admin events, Bifrost state — carrying messages between layers. Like the squirrel.
The product is the observability surface; chat is the input mechanism. Devs run Ratatoskr against a local Worldtree to watch a turn flow through every layer of the system, side-by-side, in one terminal.
Status
v0 scaffold. Design locked; implementation hasn't started. The dev team owns the implementation pass.
Read in this order
docs/design-brief.md— the locked design. Read this first. Every architectural decision is recorded with its rationale, the alternatives considered, and (where relevant) the operator's lock-in moment.docs/SPEC-PIN.md— what Worldtree spec version Ratatoskr is built against, where the vendored snapshot lives, and how to bump the pin.docs/conversation-api-spec.md— the vendored Worldtree spec snapshot. Read this to understand the API surface Ratatoskr consumes. Do not import anything from a Worldtree checkout — the boundary is the spec, not the code. Seedocs/design-brief.md§2.CLAUDE.md— Claude Code conventions for this repo (mostly inherited from the Corviduo template).persistent-memory.md— durable intent across context resets. Update as decisions and state evolve.
Quickstart
# 1. Environment
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
# 2. Verify the spec pin
cat docs/SPEC-PIN.md # documented Worldtree SHA + bump procedure
# 3. Tests (none yet; scaffold only)
uv run pytest
# 4. Run against a local Worldtree (once implementation lands)
# Worldtree must be running: python -m core.conversation_api
ratatoskr --agent mimir
What this repo is NOT
- NOT a polished consumer for Worldtree's end-users — that's the web app.
- NOT a Worldtree admin tool — admin CLI is separate (
sessions_cli.pylives in Worldtree). - NOT a featuretracking shadow of the web app — when the Conversation API surface grows, Ratatoskr does not necessarily grow with it.
- NOT a remote-Worldtree debug client — file-tail surfaces (persona log, server log) assume local-dev posture.
The full negative-clause list lives in docs/design-brief.md §6.
Boundary rule
Ratatoskr depends on three things only:
httpx+httpx-sse(network layer)textual(TUI framework)- Worldtree's published Conversation API spec at the pinned SHA
Hard rule: no imports from a Worldtree checkout. No core.* imports,
no from worldtree.*, no shared models, no submodule of Worldtree. The
spec is the entire surface. Boundary smoke test at tests/test_no_worldtree_imports.py
enforces this in CI.
Version-skew strategy
The dev team is decoupled from Worldtree's dev team. To detect drift when Worldtree changes the API:
- Spec-version pin in
pyproject.toml(worldtree-spec-rev). Bump explicitly; bumps are a tracked action. - Recorded-SSE snapshot tests at
tests/snapshots/. Captured against a live Worldtree; replayed in CI. Re-record after every pin bump. - Conformance smoke test — boots Worldtree via Docker compose in CI, runs a one-turn happy path. Catches integration-level drift.
See docs/SPEC-PIN.md for the bump procedure.
Consumer-side discoveries
If you find a spec gap, ambiguity, or missing-but-needed endpoint while working on Ratatoskr: route the discovery back to worldtree-dev via althing rather than via PR on Worldtree directly. The separate-team boundary is intentional and helps catch spec gaps that an in-tree consumer would paper over.
Related repos
- Worldtree — the API Ratatoskr consumes
- brokkr-smithy — authored this design brief
- Skaldsong — another Worldtree API consumer (Python; render-and-aggregate pattern)
- mead-hall — another Worldtree API consumer (TypeScript; server-side broker)