diff --git a/docs/coverage-map.md b/docs/coverage-map.md index 5951632..4d6ecd2 100644 --- a/docs/coverage-map.md +++ b/docs/coverage-map.md @@ -23,6 +23,23 @@ anchors against the frozen machine-readable artifacts, NOT the prose markdown: | Conversation SSE events | `conversation-api-sse-events.schema.json` (sha `9deeebf4…`) — **11 discriminated event types** | **client** | | Bifrost wire (consumer protocol) | wire **v0.6** STABLE/FROZEN (`bifrost==1.0.0`) — memory + affect planes | **provider** (Worldtree dispatches into us) | +> **External ratification — worldtree-sdk v1.0.0 (wtsdk-dev, 2026-07-18, althing +> thread `01KXVF24WQD2T5ZCS49KKFCCMH`).** The TypeScript v0 consumer SDK wires all +> **41 ops as typed methods** from the **same OpenAPI 2.3.0** (sha +> `36148179601453a0` — matches our vendored pin exactly), so it is the independent +> parity authority for the surface this ledger tracks. Ratatoskr does **not** adopt +> the SDK — we are the parallel **Python/httpx** reference-consumer of the identical +> surface (no TS/npm surface exists to pin it into). Cross-check corroboration: the +> SDK's **W-4** (send `config.role`, response echoes `model` unremapped) matches what +> ratatoskr shipped in **v0.21.2** for ephemeral-Echo create. +> +> **Future consumable — worldtree-sdk Python spine (wtsdk-dev, next milestone).** The +> TS v1 surface is our parity *checklist*; the forthcoming **Python spine** (same +> behavioral-spec + fixture corpus, TS decisions kept Python-portable per their +> surface-design §6) is what ratatoskr would actually *consume* when it lands. +> wtsdk-dev slots ratatoskr as **THE reference consumer** whose coverage column +> drives that spine — a future repin candidate, not yet available. + > **Pin drift (finding P-1) — REMEDIATED 2026-06-30.** Ratatoskr formerly > vendored only the **prose markdown** (`docs/conversation-api-spec.md`), which > is byte-identical to live Worldtree's but frozen at v0.35.16-era content (last @@ -67,7 +84,7 @@ sub-gap). | Endpoint | Status | Where consumed | Note | |---|---|---|---| -| `POST /sessions` | ✅ | `sessions.py:307` → `cli.py:482`,`tui.py:1508`,`web/server.py:155` | + `end_user_id`, `bifrost` binding; 404→AgentNotFound, 502→BifrostHandshakeFailed | +| `POST /sessions` | ✅ | `sessions.py` `create_session` → `cli.py`,`tui.py`,`web/server.py` | + `end_user_id`, `bifrost` binding; 404→AgentNotFound, 502→BifrostHandshakeFailed. **v0.21.2 (#19): ephemeral-template (Echo) create** — `config` passthrough (`--system-prompt`), `role` not `model` (W-4), `kind`/`config` captured; 422 ephemeral_requires_config now reachable-and-handled. Depth enhancement to an already-covered route — count unchanged | | `POST /sessions/{id}/messages` (turn stream, SSE) | ✅ | `sse_client.py:484` `stream_turn` → cli/tui/web | the primary surface; 409→AgentNotAvailable, 503→TurnLaunchUnavailable (b2 #331) | | `POST /sessions/{id}/history` (authored-history-write, #347) | ✅ | `sessions.py:583` `write_authored_history` → `cli.py:758` `--seed-first-message` | v1: author=assistant, effects=none, per-session idempotency; 404→AuthoredHistoryUnavailable (hide-existence: feature-absent, never probe); 409/422 mapped. **LIVE-PROVEN 2026-07-06** on personal :8081 (grant applied via a rule-based Heimdall allow, worldtree-dev): create mimir session → seed → **201** (seq=0, phase=seeded, turn_id=1798) → GET /messages reads it back as a plain role=assistant turn (model-invisible provenance confirmed). Hide-404 for ungranted is unit+probe covered | | `GET /sessions/{id}/messages` (history) | ✅ | `sessions.py:635` `get_session_messages` → `cli.py:758` `--seed-first-message` read-back | un-deferred as the #347 seed read-back — confirms model-invisible provenance (a seed reads back as a normal `role=assistant` turn) | @@ -78,7 +95,7 @@ sub-gap). | `PATCH /agents/{id}` | ✅ | `tier3.py:219` → `_run_patch` | Tier-3 mutate (system_prompt/model) | | `DELETE /agents/{id}` | ✅ | `tier3.py:242` → `_run_delete` | Tier-3 hard-delete | | `GET /me` | ✅ | `sessions.py:411` `get_me` → `cli.py` `--whoami` | identity/whoami probe; 401→SessionApiFailed | -| `GET /capabilities` | ✅ | `sessions.py:428` `get_capabilities` → `cli.py` `--whoami` | Echo ephemeral-template discovery | +| `GET /capabilities` | ✅ | `sessions.py` `get_capabilities` → `cli.py` `--whoami` | Echo ephemeral-template discovery. **v0.21.2: `--whoami` renderer reads `allowed_roles`/`default_role`** (was the dead `allowed_models`/`default_model`) + tolerates malformed caps; matches conversation-api-spec **v1.1** (`b4a278c`) | | `GET /sessions/{id}/tools` | ✅ | `sessions.py:411` `get_session_tools` → `tui.py` `_hydrate_session_tools` | owner-scoped tool inventory in the TUI Tools pane (#183) | | `GET /admin/sessions/{id}/bifrost` | ✅ | `sessions.py:428` `get_session_bifrost` → `tui.py` `_hydrate_bifrost_state` | admin-scoped BifrostState pane (#176); admin key (`RATATOSKR_ADMIN_API_KEY`); live-auth-proven | | `GET /admin/events` (SSE) | ✅ | `sse_client.py` `stream_admin_events` → `tui.py` `_stream_admin_events` | admin lifecycle SSE stream (#11), session-filtered AdminEvents pane; admin key; live-auth-proven |