vh
af07a2329a
feat( #2 ): Tier-2 — transient characters + persona-state write; audit converges
...
v1 coverage-audit: the last in-scope client I/O points. The audit now
CONVERGES — REST 17/40 covered with zero in-scope gaps (23 excluded-by-
design), SSE 11/11, Bifrost planes 8/8.
- sessions.py: list_character_models / create_character / get_character_state
/ delete_character (#161 , character.read/write) + set_persona_state
(POST /sessions/{id}/persona_state — freeform body, unpinned in the
frozen surface). 200/201 -> dict (or None on 204), off-status ->
SessionApiFailed.
- cli.py: two one-shot probes (mirror --whoami): --characters (CRUD
lifecycle report) + --set-persona-pad "p,a,d" (requires --session).
New ParsedArgs.characters/set_persona_pad + probe mutual-exclusion.
- Contract #2 amended (5 FNs) + validated. TDD: 7 wrapper + 5 cli tests.
Suite 573 green; touched code ruff-clean.
- Char read side live-proven (GET /models/available-for-characters -> 200).
Coverage-map: convergence frontier CLOSED — scope-A "done" (every frozen
I/O point classified) is met; ratatoskr cuts v1 when Worldtree tags 1.0.
2026-06-30 23:57:09 -07:00
vh
a3c92b68dc
feat( #11 ): AdminEvents pane — GET /admin/events SSE (session-filtered)
...
v1 coverage-audit: the last unbuilt design-brief §5 debug pane. #11 's
blocker was already satisfied (admin key carries admin.events.read).
Completes the admin/debug-observability core.
- sse_client.py: AdminEvent dataclass + stream_admin_events — a new
long-lived SSE consumer for the admin lifecycle stream (envelope
{id,type,timestamp,data}), admin-scoped (bearer-override), Last-Event-ID
resume. non-200 -> SseConnectFailed; mid-drop -> SseConnectionDropped.
- tui.py: "AdminEvents" TabPane + _format_admin_event + _admin_event_matches
(design-brief §6 filter: active-session + non-heartbeat system.*) +
_stream_admin_events long-lived best-effort worker (unconditional
on_mount; self-labels not-configured / unavailable / stream-ended).
- Contract-skipped for stream_admin_events (out of #1 's turn-SSE scope;
spec § Admin Event Stream is the reference). TDD: 4 sse_client + 5 tui
tests. Suite 561 green.
- LIVE-AUTH-PROVEN on :8081 (GET /admin/events -> HTTP 200 under admin key).
Coverage: REST 12/40. Tier 1 debug-observability core complete.
2026-06-30 23:25:34 -07:00
vh
9ce83d5fdc
feat( #2 ): BifrostState pane — GET /admin/sessions/{id}/bifrost (admin-key)
...
v1 coverage-audit: the last unbuilt design-brief §5 debug widget. First
admin-key consumer in ratatoskr.
- sessions.py: get_session_bifrost(client, session_id, *, admin_key) —
admin-scoped (admin.sessions.read); the request overrides Authorization
with admin_key (distinct from the consumer bearer). 200 -> dict, non-200
-> SessionApiFailed (403 scope-denied, 404 not-bound).
- cli.py: --admin-key flag + RATATOSKR_ADMIN_API_KEY env -> ParsedArgs.admin_key.
- tui.py: new "Bifrost" TabPane + _format_bifrost_state + _hydrate_bifrost_state
best-effort worker (unconditional on_mount). Writes {endpoint, connected,
caps, tools} + audits; self-labels "not configured" / "not bound" / graceful
on 403+error, never crashes.
- Contract #2 amended (FN, incl. the bearer-override POST) + validated. TDD:
4 wrapper tests + 1 format unit + 3 hydrate integration. Suite 552 green.
- LIVE-AUTH-PROVEN on :8081 (admin key reached resource-layer 404, not 401/403).
Ledger correction: #11 (AdminEvents) is NO LONGER BLOCKED — the admin key
was verified to carry admin.events.read; only the pane is unbuilt. Coverage:
REST 11/40.
2026-06-30 23:12:29 -07:00
vh
e62208d8e3
feat( #2 ): consume GET /sessions/{id}/tools — Tools-pane inventory hydrate
...
v1 coverage-audit Tier-2 quick win. The owner-scoped tool-inventory
endpoint (#183 ) had no caller; wire it into the TUI Tools pane.
- sessions.py: get_session_tools (GET /sessions/{id}/tools) — owner-
scoped (consumer key, no admin scope), 200 -> parsed dict verbatim,
non-200 -> SessionApiFailed. Mirrors get_persona_state / get_me.
- tui.py: _format_tool_inventory helper + _hydrate_session_tools
best-effort worker (mirrors _hydrate_persona), wired unconditionally
in on_mount. Writes the merged {agent_id, builtin_tools,
bifrost_tools} inventory the LLM saw at turn-fire into the Tools
pane + audits; never crashes on failure.
- Covers the design-brief 5 "Tools widget" via the reachable owner
endpoint (the admin variant stays a gap only for cross-user debug).
- Contract #2 amended (FN) + validated. TDD: 3 wrapper tests + 1
format-helper unit + 2 hydrate integration tests. Coverage: REST
10/40. Suite 544 green; touched code ruff-clean.
2026-06-30 22:50:12 -07:00
vh
387ac4ab2c
feat( #2 ): consume GET /me + GET /capabilities via --whoami one-shot
...
v1 coverage-audit slice (capabilities+me). Both endpoints had no
caller; add them as cheap boot-time debug primitives.
- sessions.py: get_me (GET /me — identity/whoami) + get_capabilities
(GET /capabilities — Echo ephemeral-template discovery). Mirror
get_persona_state: 200 -> parsed dict verbatim, non-200 ->
SessionApiFailed. Freeform dicts (frozen OpenAPI types both as
objects).
- cli.py: new --whoami one-shot mode (mirrors --send). Fetches both,
prints an identity + capabilities report, exits. Standalone probe:
mutually exclusive with --send/--session/--new/--agent; opens no
session. New ParsedArgs.whoami field + main() dispatch.
- Contract #2 amended (2 FNs) + validated. TDD: 5 wrapper tests +
5 cli tests (validation + mode + error). Coverage map: REST 9/40.
Suite 538 green; touched code ruff-clean.
Audit note: /capabilities is the Echo ephemeral-template discovery
endpoint, not a generic server-caps endpoint (coverage-map framing
corrected). TUI-surfacing of /me + /capabilities deferred.
2026-06-30 22:21:59 -07:00
vh
b798068932
pin: re-pin to Worldtree's FROZEN v1 surface (OpenAPI 2.2.0 + SSE schema)
...
v1 coverage-audit remediation P-1: vendor the authoritative machine-
readable artifacts and pin them for drift-checking, advancing the spec
pin from v0.35.16 (f1b59f8) to v1.0.0b2 (5810a26).
- Vendor docs/conversation-api-openapi.json (OpenAPI 2.2.0, 40 path-
groups) + docs/conversation-api-sse-events.schema.json (11 events).
- Pin all three Conversation-API artifacts in .corviduo-canonicals.toml:
OpenAPI + SSE schema as strict drift gates (canonical_drift.py), the
prose markdown as tolerate_drift reference. Drift check green (10/10).
- pyproject: worldtree-spec-rev -> 5810a26, worldtree-version -> v1.0.0b2
(was stale at v0.29.0), pinned-on -> 2026-06-30.
- SPEC-PIN.md: current-pin table + history row + vendored-artifacts list.
- coverage-map.md: P-1 marked remediated; the map now audits a frozen,
diffable target.
The prose markdown is byte-identical to v0.35.16 (last WT edit
2026-05-31); the b2 surface lives only in the OpenAPI. No client-
facing code change (the b2 409/503 + unified error envelope were
already consumed in v0.18.3/.4) -> pin-only, no version bump.
2026-06-30 15:28:52 -07:00
vh
93e4176346
docs: author v1 coverage-map ledger; lock scope mandate A
...
First coverage map — every Worldtree v1-FROZEN I/O point x ratatoskr
status. Anchored on WT's frozen machine-readable artifacts (OpenAPI
2.2.0 = 40 REST path-groups + SSE schema = 11 events + bifrost wire
v0.6), not the stale vendored prose markdown.
- SSE 11/11 and Bifrost provider planes 8/8 covered + live-proven;
client REST 7/40 live, 11 in-scope frontier, 22 excluded-by-design.
- Scope mandate A (operator): v1 done = every frozen point classified
(covered-or-excluded-with-rationale), zero unaccounted; not a
feature-complete client.
- Finding P-1: vendored prose markdown is byte-identical to live WT
but frozen at v0.35.16-era content; b2's surface lives in the
OpenAPI 2.2.0 + SSE-schema JSON we don't vendor. Pin-remediation
pending operator nod.
No version bump (docs-only).
2026-06-30 14:41:06 -07:00