- **Prior (1.108.162):** — **Canonical handoff contract: `finalize_handoff` + `munch://handoff/<id>` (#374, @mightydanp, CLOSED).** Server-owned canonical final handoff (`jcodemunch.handoff/v1`, shape 3 as accepted): the assistant AUTHORS the analysis; new `handoff.py` owns deterministic assembly (caller sections + named appendices, each exactly once, dup names rejected), session-scoped in-memory persistence (process == session, `_steer_state` precedent, `clear_handoffs()` test hook), identity (`handoff_id = sha256(body)[:16]` — same inputs ⇒ same body/id/hash), and immutable serving. **Marquee = evidence attestation:** `evidence_refs` validate against the session retrieval record — new `token_tracker.served_symbol_ids()` snapshot of the v1.108.146 yield tracker (populated by search_symbols/get_ranked_context `note_served`); a ref = served symbol id OR its file path; unknown refs → in-band error dict → `CallToolResult(isError=True)` + `unknown_refs` + hint (v1.108.74 contract). Receipt `{schema, handoff_id, resource_uri, sha256, length(bytes utf-8), canonical:true(ADVISORY only), evidence_count, appendices}`. Resource follows the #371 pattern: `list_resources()` appends per-handoff rows, `read_resource()` resolves `munch://handoff/<id>` → text/markdown, unknown → ValueError. Registration: all surfaces (_CANONICAL_TOOL_NAMES / Session-Aware Routing category / _TOOL_TIER_STANDARD / Tool schema / dispatch / config.py all_tools ×2); counter `STATE_CHANGING_ACTIONS` (order needs allow_state_change=true; readOnlyHint:false derives) + `EXAMPLES` entry (live-schema-validated). Standard tier — core_compact unchanged (baseline refreshed: core_compact 3996, still <4000 live-ceiling). Tool count **90 → 91** full (test_server counts + expected-names bumped). No char limit, no repo writes, nothing persisted to disk. README "Canonical handoff" section. Tests `tests/test_v1_108_162.py` (22, modeled on the reporter's own citations: v1_108_74 shapes / v1_108_152 resource / counter example parity); suite 5528. **Suite parity (jdoc/jdata) = eventual, versioned contract, NOT a blocker; memory [[project-handoff-contract]] updated.**
0 commit comments