From 1f289098bacc758e8cb85c97690ed61ff6847a62 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Tue, 30 Jun 2026 15:32:15 -0700 Subject: [PATCH] =?UTF-8?q?memory:=20scope=20(b)=20Tier-1=20frontier=20?= =?UTF-8?q?=E2=80=94=20SSE-resume=20+=20session-picker=20slices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capture the contract-first plan for the two presenter-wiring gaps (resume-orchestration wrapper per design-brief 8b; picker + CLI flags per 4) so the next focused TDD cycle has the slice plan resident. --- persistent-memory.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/persistent-memory.md b/persistent-memory.md index b451a1f..57703f2 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -148,6 +148,8 @@ decision. Captures rationale that won't be obvious from code alone. - `[2026-06-30]` **Scope mandate A locked (operator): v1 "done" = every frozen I/O point CLASSIFIED (covered-or-excluded-with-rationale), zero unaccounted β€” NOT a feature-complete client.** The coverage map is a LEDGER, not a build-everything mandate. Reconciles the 2026-06-19 "consume all I/O" reframe with the 2026-05-20 design-brief's "NOT an admin tool" + deferral negative clauses (which predate both the provider identity and the reframe). Resolved the 11 design-brief-vs-reframe ❓ rows via the debug-observability test (*does a turn flow through it?*): 🚫 search / uploads / pending / embed / judgments (consumer-product + eval utilities); ⬜ transient-characters routing (4) + persona_state-write (Tier-2 frontier). **Frontier Tier 1 (all unblocked except #11):** session-picker + SSE-resume (wrappers `list_sessions`/`reconnect_turn` exist with NO caller β€” presenter-wiring only) β†’ `GET /capabilities` + `GET /me` β†’ BifrostState/Tools widgets (`GET /admin/sessions/{id}/{bifrost,tools}`, admin-key) β†’ **#11 AdminEvents BLOCKED on `admin.events.read` scope**. The 3 admin-observability widgets + picker + resume were design-brief Β§5/Β§4/Β§8d v1 items that **were never built**. - `[2026-06-30]` **Finding P-1 (pin drift) + pin-remediation PENDING.** We vendor the PROSE markdown (`docs/conversation-api-spec.md`), which is **byte-identical to live WT's** but frozen at v0.35.16-era content (last WT edit 2026-05-31) β€” it does NOT capture b2: 7 new endpoints (admin/keys/bulk, admin/persona/{archive,erase}, admin/usage, embed, judgments, me/usage), the 409/503 on messages-POST (#331), the unified error envelope (#328), or the SSE schema. **WT's authoritative v1 truth is now the FROZEN OpenAPI 2.2.0 + SSE-schema JSON** (`Worldtree/docs/v1-schema-freeze-manifest.md`). So the previously-deferred "re-vendor markdown to b2" is a **near-no-op** (markdown content identical). **Pending operator nod:** re-pin to the machine-readable artifacts (recommended β€” drift-checkable via `canonical_drift.py`, makes the coverage map reproducible vs a frozen diffable target) vs markdown-only. Deferred (not auto-applied) because it adds vendored artifacts + a canonical-sync pin = substrate change with CI-gating reach. **β†’ RESOLVED 2026-06-30 (operator: "a then b").** Vendored `conversation-api-openapi.json` (2.2.0) + `conversation-api-sse-events.schema.json` + re-copied the prose markdown; pinned all three in `.corviduo-canonicals.toml` (OpenAPI+SSE = strict drift gates, markdown = `tolerate_drift` reference); advanced `worldtree-spec-rev` f1b59f8β†’5810a26 + `worldtree-version` v0.29.0(STALE, never bumped from the v0.35.16 pin)β†’v1.0.0b2 + `pinned-on`β†’2026-06-30; SPEC-PIN.md history row added. `canonical_drift.py` green (10/10). `pin:`-only, no version bump (no client-facing code change; the b2 409/503 + error-envelope were already consumed in v0.18.3/.4). +- `[2026-06-30]` **(b) Tier-1 frontier SCOPED, ready for a contract-first TDD cycle (next focused work).** The primitives already exist + are contracted + tested; the gap is PRESENTER-level wiring. Two slices: **(b1) SSE-resume** β€” contract #1 (`ratatoskr.sse_client`) DELIBERATELY makes resume caller-owned ("on `SseConnectionDropped`, the caller MAY invoke `reconnect_turn`"); `reconnect_turn` (sse_client.py:524) has NO caller. Gap = a SHARED resume-orchestration wrapper (catch `SseConnectionDropped` β†’ track last-seen `sse_id` β†’ `reconnect_turn` β†’ continue), consumed by all 3 presenters per design-brief Β§8b "share the consumer, branch the presenter" (NOT per-presenter β€” that forks the consumer). New function block β†’ **amend contract #1** (additive FN, e.g. `stream_turn_resilient`) then TDD (RED: drop-mid-streamβ†’resume continuity; GREEN: wrapper; wire `cli --send` first as the tracer). Resume design pre-locked: in-process Last-Event-ID only, cross-process deferred to v2 (design-brief Β§8d). **(b2) session-picker** β€” `list_sessions` (sessions.py:198) has NO caller; add a Textual DataTable startup picker (>1 session) + `--session `/`--new` CLI flags (design-brief Β§4, decisions pre-locked). Both pre-locked β†’ heid-contract-review likely skippable as ceremony (small additive amendments to mature specs); heid-code-review still valuable. **#11 AdminEvents stays BLOCKED** on `admin.events.read` scope (infra-ops). + _41 older entries (2026-05-* β€” the original debug-TUI/web build era) archived to archival-memory.md._ _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._