feat(#20): worldtree-sdk cutover teardown (slice-7) + v0.22.0

The last slice of the consumer-layer cutover. Teardown only — zero
runtime-logic change; the 494-green suite is the regression gate.

- Drop `httpx-sse` from pyproject + lockfile: slice-6 deleted its last
  user, nothing imports `httpx_sse`, the SDK owns SSE parsing now.
- Module boundary (operator decision): KEEP `sessions.py` + `sse_client.py`
  as pure caller-semantic type/exception homes (no rename, no fold —
  A3 was blocked by the `AgentNotAvailable` name collision + `wt.py`
  would mis-home `endpoint_for_plane`). Docstrings updated to stop
  claiming "client"; the `AdminEvent`/`SseId`/exception homes stay put
  (resolves the slice-6 deferred-home item).
- Retire wire contracts #2 (sessions) + #15 (tier3): DEC-1 phase-2 —
  normative authority already transferred to the cutover contract; the
  code they specified is gone, so the files are deleted. #1 (SSE event
  vocab) and `first_message` stay (ratatoskr-owned, not retired).
- Final coverage-map re-anchor: tools/list_sessions re-homed to `wt.py`;
  the Last-Event-ID SSE-resume sub-gap CLOSED (folded into `stream_turn`
  auto-resume); Surface-2 SSE parsing re-anchored to the SDK.
- Stale doc-rot fix: the cli.py transport comment no longer calls
  `seed_preset_first_message` "not-yet-migrated" (it rides `wt`).
- v0.22.0 (minor, DEC-6, operator-approved): publishes the full 6-slice
  cutover milestone.
This commit is contained in:
vh
2026-07-19 13:41:34 -07:00
parent 8274ed2d89
commit ec68b1f3a5
10 changed files with 72 additions and 947 deletions
@@ -335,6 +335,43 @@ re-anchor its coverage-map rows.
`except (…, MalformedSseId, MalformedSseData)` stays a harmless defensive superset
(pre-existing, not introduced here).
### Slice-7 notes (Teardown — the LAST slice, decided at teardown)
- **Module boundary: KEEP `sessions.py` + `sse_client.py` as pure type/exception
homes (operator decision A1, 2026-07-19).** Post-cutover both modules hold NO
client — only ratatoskr's caller-semantic exception surface + a couple of
dataclasses (`BifrostBinding`; `SseId`, `AdminEvent`) + the `endpoint_for_plane`
provider helper. Options weighed: (A1) keep as-is + fix docstrings; (A2) rename to
honest names (`session_errors`/`stream_errors`), re-point ~7 importers; (A3)
consolidate into one `errors.py` / fold into `wt.py`. **A1 chosen** — teardown is
deletion + dep-drop, not a rename refactor; A3 is blocked by the `AgentNotAvailable`
name collision (two distinct classes: persona-404 in `sessions` vs eager-turn-409 in
`sse_client`) which would force renaming a contract-level caller-semantic type + its
§ Error-map rows + catch sites, and folding into `wt.py` mis-homes
`endpoint_for_plane` (provider-side). Naming-honesty (principle-2) addressed by the
one-line docstring note, not a rename. **Resolves the slice-6 open item** (line ~326):
the ratatoskr `AdminEvent`/`SseId` + exceptions stay in `sse_client.py`; the
session/tier3 exceptions + `BifrostBinding` stay in `sessions.py`.
- **`httpx-sse` dropped from `pyproject.toml` + lockfile.** Slice-6 deleted its last
user (`sse_client.stream_admin_events`); a tree grep confirmed nothing imports
`httpx_sse`. `uv sync` physically pruned it; suite green (494) with the module absent.
- **Wire contracts #2 (sessions) + #15 (tier3) retired (files DELETED, DEC-1
phase-2).** Their normative authority transferred to this contract at authoring;
the code they specified is gone, so the files are removed now. **#1 (SSE event
vocabulary) is NOT retired** — it stays current (amended `4bd9abd` 2026-07-18) as
ratatoskr's SSE-event-rendering reference; **`first_message` is NOT retired** (DEC-1,
ratatoskr-owned usage contract). Accepted side-effect: `issues/5.contract.md`'s
historical "amended #2/#3/#4 in-place" line now points at a deleted #2 — left as-is
(frozen issue-record of a past action; not expanding DEC-1's #2/#15 scope).
- **Final coverage-map re-anchor.** `GET /sessions/{id}/tools` → `wt.py get_session_tools`
(SDK `sessions.tools`) → `web/server.py` (the old `sessions.py`→`tui.py` row was
stale; TUI deleted). `GET /sessions` `list_sessions` re-homed to `wt.py`, still
caller-less (picker was a TUI frontier, now moot). The `Last-Event-ID` SSE-resume
sub-gap is CLOSED — `reconnect_turn` deleted, resume folded into `wt.py stream_turn`
auto-resume. Surface-2 SSE parsing re-anchored to the SDK (`_envelope_for_type` gone).
- **Ships as v0.22.0 (minor, DEC-6, operator-approved 2026-07-19).** Publishes the
full 6-slice consumer-layer cutover milestone.
## Out of scope
- Bifrost PROVIDER planes (memory/affect) — hand-rolled, ADR-0009, untouched.