{"type":"title","v":1,"title":"omp-spt-v0312-smoke @ HFENDULEAM (omp-spt/)","source":"user","updatedAt":"2026-07-20T02:21:11.206Z","pad":"                                                                                                                   "}
{"type":"session","version":3,"id":"019f7d53-c7ec-7000-bd8a-8cd1c0c97da2","timestamp":"2026-07-20T02:21:10.508Z","cwd":"C:\\Users\\decid\\Documents\\projects\\omp-spt","title":"omp-spt-v0312-smoke @ HFENDULEAM (omp-spt/)","titleSource":"user"}
{"type":"model_change","id":"5cca8459","parentId":null,"timestamp":"2026-07-20T02:21:10.769Z","model":"openai-codex/gpt-5.6-sol"}
{"type":"thinking_level_change","id":"47b23eff","parentId":"5cca8459","timestamp":"2026-07-20T02:21:10.769Z","thinkingLevel":"low","configured":null}
{"type":"title_change","id":"13eb5ee5","parentId":"47b23eff","timestamp":"2026-07-20T02:21:11.206Z","title":"omp-spt-v0312-smoke @ HFENDULEAM (omp-spt/)","source":"user"}
{"type":"custom_message","customType":"xdev-mount-notice","content":"<system-notice>\nThe xd:// device inventory changed.\nThese tools became available:\n- xd://mcp__mempalace_mempalace_mempalace_add_drawer — File verbatim content into the palace. Checks for duplicates first.\n- xd://mcp__mempalace_mempalace_mempalace_check_duplicate — Check if content already exists in the palace before filing\n- xd://mcp__mempalace_mempalace_mempalace_delete_drawer — Delete a drawer by ID. Irreversible.\n- xd://mcp__mempalace_mempalace_mempalace_diary_read — Read your recent diary entries (in AAAK). See what past versions of yourself recorded — your journal across sessions.\n- xd://mcp__mempalace_mempalace_mempalace_diary_write — Write to your personal agent diary in AAAK format. Your observations, thoughts, what you worked on, what matters. Each agent has their own diary with full history. Write in AAAK for compression — e.g. 'SESSION:2026-04-04|built.palace.graph+diary.tools|ALC.req:agent.diaries.in.aaak|★★★'. Use entity codes from the AAAK spec.\n- xd://mcp__mempalace_mempalace_mempalace_find_tunnels — Find rooms that bridge two wings — the hallways connecting different domains. E.g. what topics connect wing_code to wing_team?\n- xd://mcp__mempalace_mempalace_mempalace_get_aaak_spec — Get the AAAK dialect specification — the compressed memory format MemPalace uses. Call this if you need to read or write AAAK-compressed memories.\n- xd://mcp__mempalace_mempalace_mempalace_get_taxonomy — Full taxonomy: wing → room → drawer count\n- xd://mcp__mempalace_mempalace_mempalace_graph_stats — Palace graph overview: total rooms, tunnel connections, edges between wings.\n- xd://mcp__mempalace_mempalace_mempalace_kg_add — Add a fact to the knowledge graph. Subject → predicate → object with optional time window. E.g. ('Max', 'started_school', 'Year 7', valid_from='2026-09-01').\n- xd://mcp__mempalace_mempalace_mempalace_kg_invalidate — Mark a fact as no longer true. E.g. ankle injury resolved, job ended, moved house.\n- xd://mcp__mempalace_mempalace_mempalace_kg_query — Query the knowledge graph for an entity's relationships. Returns typed facts with temporal validity. E.g. 'Max' → child_of Alice, loves chess, does swimming. Filter by date with as_of to see what was true at a point in time.\n- xd://mcp__mempalace_mempalace_mempalace_kg_stats — Knowledge graph overview: entities, triples, current vs expired facts, relationship types.\n- xd://mcp__mempalace_mempalace_mempalace_kg_timeline — Chronological timeline of facts. Shows the story of an entity (or everything) in order.\n- xd://mcp__mempalace_mempalace_mempalace_list_rooms — List rooms within a wing (or all rooms if no wing given)\n- xd://mcp__mempalace_mempalace_mempalace_list_wings — List all wings with drawer counts\n- xd://mcp__mempalace_mempalace_mempalace_search — Semantic search. Returns verbatim drawer content with similarity scores.\n- xd://mcp__mempalace_mempalace_mempalace_status — Palace overview — total drawers, wing and room counts\n- xd://mcp__mempalace_mempalace_mempalace_traverse — Walk the palace graph from a room. Shows connected ideas across wings — the tunnels. Like following a thread through the palace: start at 'chromadb-setup' in wing_code, discover it connects to wing_myproject (planning) and wing_user (feelings about it).\nRead `xd://<tool>` for docs + JSON schema before first use; write the JSON args object to `xd://<tool>` to execute.\n</system-notice>","display":false,"attribution":"agent","id":"95e204c9","parentId":"13eb5ee5","timestamp":"2026-07-20T02:21:30.037Z"}
{"type":"message","id":"2f3ebabf","parentId":"95e204c9","timestamp":"2026-07-20T02:21:30.038Z","message":{"role":"user","content":[{"type":"text","text":"<msg from=\"emphasys\"/>"}],"attribution":"user","timestamp":1784514090022}}
{"type":"message","id":"2f4649d5","parentId":"2f3ebabf","timestamp":"2026-07-20T02:21:36.281Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_QhAcTalMIuArY5wvjUfl8Xdy|fc_090a953a35d8b472016a5d862fe2d4819a894ede7505393133","name":"read","arguments":{"i":"Inspecting changelog","path":"CHANGELOG.md"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":15090,"output":76,"cacheRead":9984,"cacheWrite":0,"totalTokens":25150,"reasoningTokens":48,"cost":{"input":0.07545,"output":0.00228,"cacheRead":0.004992,"cacheWrite":0,"total":0.082722}},"stopReason":"toolUse","timestamp":1784514090087,"responseId":"resp_090a953a35d8b472016a5d862b232c819a9d92f7d763ab3587","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_090a953a35d8b472016a5d862e2a00819ab46e8ad6905ef110","type":"reasoning","content":[],"encrypted_content":"gAAAAABqXYYvoVYn-Sajl16xfw6mUwTXt8CY53YK8W59cEZ4rwnZcUNRKZPpGEywe2VE4GctFCopds5PnDbt-FNWKrh6wA60_7vjrfr-9AU5NvgB6uEKZ1o3pf1XoM7a-tjzgkW5oWDwPDCbW-GkIDNDCM9BZG3i6e_OffSDod5L1yOsysbQw5SHUg5tZ7QxFjjyfrm9PTw7yJZo_lG1eIIaJ6jcLAVDykdRibQOL4d5qSh81Tvd-P9930nuYlVpvHccUs5TtqA0Q3cjklN6AN1X0SraHdAQq3o0HMUtNslj0C__zifLsvFtNEF5OHjd0r1WBXrHqSaEZccHZaP0Lm0X7UiT142zKbXCn5MhvMW0XSVBxoac1NwZehTORtI0b-_08yQjbpjY7ZKbJu46jAfw7Rl1OY7yoYVDK2WXiV6cW-6sXZrL7StI9p87vh4Rj3_SPIBtfrop3vJKIZw1iw5fRJZJCwMG2YS81eyzcTZIg74i1T7Gdf7_CTiZMlJHCJXeU40kfMjoiXMv9SZJNFIJIs4UoRVcuDnFWi2ZLqyidSPzfl4tE8ADdAmJPuoYjWctW2fFop3xSGQYdnW2PNBl05ShiHs3Btp0P-yvZqj6LHEn8Ft4_N9CG19tIZNTqDBhPioZIFo16OF2PzBJDntFOaykxylsTuhJkxRMqi8xzkFh7-Zs1HwNzhU7A245Zw38f27kbbOhjPxA24VRd17o2DqqQ0WTzsfVo8OwkGMQSTQFED2yTkHItzd08OE4P9FnM1QI8KLuKcekYc5aOHuNeDiqC8zthtQZun7me2XYMGHgVh4vgjo-he6r2LEQvfgop_r8Jsdph_iAqWMfRuCmv8aANvuC6Ca8GsjK_2VYeqTgSh4yOJw_XtiXleKqquAmiulJLb8GzBKF5uaOToahCWIh50lN-VdGzfPdMgPJkOnF9JP7YClsBhk2xTnrYXPtO2EkDAR_bDGwcibwIlAAqlXB_piTcmJKSOMfQPn0PoyNUxD9ocbm0OrCVTbq7-sLVbvkZe3u-DSKmwtXnhN7K3ZEw3DTO-R9OJl4U54akXaStgLDHvenTxCyz0UuNgIXZT-8gYaiYUnC0HN3QLB8CoCInMtyzCYwV6mImj6HrdDcMJSawAQwwRlFcVE5FLYAGUc723fAkp0q5Yw-9xghXceuDXLaJB8zBMgokjTSGoDYX_Es9kY=","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"summary":[],"metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}},{"id":"fc_090a953a35d8b472016a5d862fe2d4819a894ede7505393133","type":"function_call","status":"completed","arguments":"{\"i\":\"Inspecting changelog\",\"path\":\"CHANGELOG.md\"}","call_id":"call_QhAcTalMIuArY5wvjUfl8Xdy","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"name":"read","metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}}]},"duration":6183.442600000002,"ttft":4063.0939,"contextSnapshot":{"promptTokens":25074,"nonMessageTokens":22961}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_QhAcTalMIuArY5wvjUfl8Xdy|fc_090a953a35d8b472016a5d862fe2d4819a894ede7505393133","toolName":"read","startedAt":"2026-07-20T02:21:36.284Z","args":{"path":"CHANGELOG.md"},"intent":"Inspecting changelog"},"id":"f92691b2","parentId":"2f4649d5","timestamp":"2026-07-20T02:21:36.284Z"}
{"type":"message","id":"1fc5e1cf","parentId":"f92691b2","timestamp":"2026-07-20T02:21:36.318Z","message":{"role":"toolResult","toolCallId":"call_QhAcTalMIuArY5wvjUfl8Xdy|fc_090a953a35d8b472016a5d862fe2d4819a894ede7505393133","toolName":"read","content":[{"type":"text","text":"[CHANGELOG.md#5ABB]\n1:# Changelog\n2:\n3:All notable user-facing changes to **omp-spt** (the Spacetime adapter for oh-my-pi). The format follows [Keep a Changelog](https://keepachangelog.com/); each release section is the public release body verbatim.\n4:\n5:> Each release below is keyed to the **adapter version of truth** (the version `spt adapter list` reports and the GitHub release tag). omp-spt starts its own version line at 0.1.0; the sections from [0.17.3] down are the inherited **claude-spt** lineage this project forked from, retained for history.\n6:\n7:## [0.3.12] - 2026-07-19\n8:\n9:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n10:\n11:### Fixed\n12:- **Endpoint activation no longer fails while coloring the inline identity.** OMP's theme API exposes semantic palette keys rather than a literal `cyan` key. The footer now uses `statusLineModel`, the cyan status-line role, after v0.3.11's literal key caused `Unknown theme color: cyan` during bind.\n13:\n14:## [0.3.11] - 2026-07-19\n15:\n16:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n17:\n18:### Fixed\n19:- **Messages received while an agent is working now reach the model.** Active-turn delivery uses OMP's native user-message steering queue before the context hook expands the inert sender stub into the full SPT envelope. The former context-only injection could write an `owl_message` into OMP history after an ACP request was already assembled, making the delivery visible in history but absent from model context.\n20:- **A local prompt can no longer overtake queued peer custody at turn completion.** The next accepted delivery is submitted synchronously before the completed turn releases its lifecycle hook.\n21:- **Shortform delivery no longer adds an internal `omp-spt-peer-status` panel to the transcript.** Explicit `@<…@>` sends remain bounded and ordered without adding adapter-internal result messages to the TUI.\n22:- **The inline endpoint identity is explicitly cyan.** The status renderer now requests the theme's `cyan` color rather than its theme-dependent `accent`.\n23:- **Busy window-title animation is calmer.** Spinner frames advance every 500 ms instead of every 80 ms.\n24:- **Graceful shutdown clears durable session state before spending time reaping the listener.** Authenticated `session-end` now precedes listener termination, reducing the chance that a bounded shutdown leaves stale online state. Abrupt process or machine death still requires spt-core's owner-death reconciliation because no in-process adapter callback can run after its host has disappeared.\n25:\n26:## [0.3.10] - 2026-07-19\n27:\n28:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n29:\n30:### Fixed\n31:- **ACP-hosted endpoints wake for deferred peer deliveries again.** Deferred custody now enters OMP through the native user-prompt flow. OMP 17 defers extension-initiated hidden turns under an ACP client, so v0.3.9's `nextTurn` trigger could queue a message without starting the receiving agent.\n32:- **Inbound context is easier to identify and read.** The obsolete internal `omp-spt-peer-message` custom-message identifier is gone, and complete `<EVENT>` envelopes place their body on lines between the opening and closing tags.\n33:- **The inline endpoint identity is cyan again.** Status styling now uses OMP's theme API instead of raw ANSI escapes that the status renderer discarded.\n34:\n35:## [0.3.9] - 2026-07-19\n36:\n37:### Fixed\n38:- **Deferred peer deliveries now wake the receiving OMP session reliably.** Accepted messages use OMP's hidden next-turn channel with an explicit turn trigger, preserving the full SPT envelope without depending on the editable follow-up queue to resume after an active or interrupted turn.\n39:\n40:## [0.3.8] - 2026-07-19\n41:\n42:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected listener and session identity.\n43:\n44:### Fixed\n45:- **Incoming messages containing quoted SPT events no longer shut the endpoint down.** The listener now preserves complete `<EVENT>…</EVENT>` text inside a peer message, while incomplete frames remain bounded and fail closed. Deferred messages also use OMP's follow-up queue so a streaming-state race cannot silently lose them.\n46:- **The inline OMP status now shows the complete endpoint identity.** The footer reads `<endpoint-id> @ <node> (<project-name>/)` in cyan instead of `spt:<endpoint-id>`, matching the session and terminal-window naming introduced in v0.3.7.\n47:\n48:## [0.3.7] - 2026-07-19\n49:\n50:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new title behavior.\n51:\n52:### Added\n53:- **Hosted OMP windows identify themselves at a glance.** Session names now use `<endpoint-id> @ <node> (<project-name>/)`. Terminal titles add `○` while idle and cycle a braille spinner while busy, then return to idle without leaking a timer.\n54:\n55:## [0.3.6] - 2026-07-19\n56:\n57:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n58:\n59:### Fixed\n60:- **Assistant output stays inside the local OMP conversation.** This release republishes the v0.3.5 behavioral fix from a corrected release commit; runtime behavior is unchanged.\n61:\n62:## [0.3.5] - 2026-07-19\n63:\n64:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n65:\n66:### Fixed\n67:- **Assistant output now stays inside the local OMP conversation.** Receiving a peer message no longer forwards subsequent assistant prose, errors, or shutdown text back to that peer. Outbound messages occur only when the agent or operator explicitly uses `spt send` or the `@<…@>` peer-message shortform, restoring `claude-spt` behavioral parity.\n68:\n69:## [0.3.4] - 2026-07-16\n70:\n71:> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new extension and skills.\n72:\n73:### Added\n74:- **An ordinary OMP session can now become a ready or live SPT endpoint in place.** Native `/ready` and `/live` commands select or create endpoint identity, while `/live --auto` offers the most-recent compatible live identity for explicit confirmation; the extension owns the listener, so the agent never has to run a background poll.\n75:- **Live endpoints stay reachable during long turns and after interrupted work.** Accepted peer messages enter at the next safe tool or model boundary, retain ordered custody when no boundary appears, and restore honest receivability after cancellation, interruption, or failure.\n76:- **OMP now ships native commune, signoff, role, and setup skills.** Commune includes an OMP-native checkpoint mode that saves continuity, compacts context, and wakes the same endpoint; setup diagnoses versions, activation, GitHub transport, and subnet onboarding.\n77:- **Activated sessions now teach the SPT surface directly.** Startup guidance, targeted hints, and compatible-update notices cover identity, roster, messaging, lifecycle, continuity, versions, and subnet operations without duplicating public `spt` commands as skills.\n78:- **Assistant output can send peer messages with `@<target[,target] message @>`.** The extension dispatches only the explicit shortform, excludes code blocks and ordinary mentions, and reports each target's delivery result.\n79:- **The release now includes a static Linux x86-64 musl helper compatibility tier.** Windows MSVC, GNU Linux, and static-musl Linux helpers ship together in one deterministic `adapter.spt`.\n80:\n81:### Fixed\n82:- **Hosted messaging no longer tears down the listener when a peer reply mentions `<EVENT>` literally.** The frame parser tolerates non-frame `<EVENT>` text inside a message while still rejecting a genuinely nested valid frame, and decodes both published `<br/>` and legacy `<br>` newline forms.\n83:\n84:### Changed\n85:- **Release truth is now mechanically enforced.** The manifest version drives helper, plugin, changelog, and public-doc versions; deterministic documentation drift checks gate GitHub Pages publication; each supported target has schema-validated, digest-bound native acceptance evidence.\n86:\n87:## [0.2.1] - 2026-07-15\n88:\n89:> Requires spt-core **v0.31.0 or newer** for identity-preserving listener authentication. Run `spt update`, then `spt adapter update omp-spt`, and restart each endpoint.\n90:\n91:### Fixed\n92:- **Starting or resuming an endpoint now records exactly one OMP session in endpoint history.** The listener continues from the already-bound native OMP session instead of registering a second synthetic `boot` session, so resume selection and session metadata remain tied to the real OMP transcript.\n93:\n94:## [0.2.0] - 2026-07-14\n95:\n96:> Native OMP cutover. Requires spt-core **v0.29.0 or newer** and Oh My Pi **v16.3.15 or newer**. If OMP is older, run `omp update` before launching an endpoint. Update the adapter with `spt adapter update omp-spt`, then restart each endpoint so it loads the packaged extension and helper from this release.\n97:\n98:### Added\n99:- **Every endpoint now remains a real, attachable OMP session.** Ready and live endpoints use the same native OMP launch path, so an unattended endpoint can still be attached later without losing OMP's normal terminal interface.\n100:- **Inbound peer messages now arrive as ordinary OMP turns with full SPT context.** The visible prompt is a safe sender stub, while the complete event envelope is supplied to that turn as context; peer text cannot accidentally invoke a slash command.\n101:- **OMP profile-aware session tools.** History, digest, echo-commune, and Psyche session lookup now follow OMP's profile and configuration precedence, including deterministic exact-id and prefix handling.\n102:\n103:### Changed\n104:- **The adapter is now OMP-native only.** The inherited Claude Code plugin, hooks, CCS profiles, worker topology, headless RPC bridge, and message-idle translation path are removed. `omp-spt` advertises ReadyAgent and LiveAgent only; Worker remains an intentional capability opt-out.\n105:- **Fresh, resumed, and daemon-driven turns validate the real Oh My Pi executable before launch.** Explicit overrides, known install paths, and PATH candidates all receive the same identity probe, so an unrelated `omp` command cannot become the hosted terminal.\n106:- **One endpoint stays bound to one OMP session for its lifetime.** In-TUI new, resume, fork, handoff, and branch actions are blocked; stop and relaunch the endpoint to select another native session.\n107:- **Commune and signoff drops now live under the project-local `.spt/` directory.** The old harness-specific continuity path is no longer used.\n108:\n109:### Fixed\n110:- **Accepted messages cannot disappear after an outbound reply failure.** Correlated outcomes retry within a finite budget; exhaustion shuts the endpoint down loudly instead of marking undelivered custody as settled.\n111:- **Bind, activity, and shutdown races no longer advertise the wrong endpoint state or leak a late listener.** Busy-before-bind is preserved, shutdown-before-bind tears down immediately, and concurrent fatal and lifecycle shutdowns share one bounded session-end sequence.\n112:- **Listener recovery now distinguishes crash loops from isolated failures.** Immediate repeated exits still fail closed, while a listener that remains stable resets its consecutive-failure budget.\n113:- **Echo-commune handles Unicode transcript boundaries safely.** A byte cap that lands inside a multi-byte character no longer crashes the summarizer.\n114:\n115:## [0.1.3] - 2026-07-13\n116:\n117:### Fixed\n118:- **Attached endpoints now show OMP's full native TUI.** Native `omp` is the broker PTY process, with SPT messaging supplied by a packaged OMP extension. The previous headless `omp --mode rpc` bridge could only display bridge logs, regardless of whether the endpoint command attached to its PTY.\n119:\n120:## [0.1.2] - 2026-07-10\n121:\n122:> Liaison bugfix rollup for the two Reavo-reported omp-spt v0.1.1 issues ([#2](https://github.com/BigscreenVR/omp-spt/issues/2), [#3](https://github.com/BigscreenVR/omp-spt/issues/3)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart omp endpoints.\n123:\n124:### Fixed\n125:- **The fresh-endpoint update guidance now keeps the harness terminal attached.** The update notice no longer tells operators to use `--start` for a new Librarian endpoint; the documented command uses attach-default `spt endpoint run --adapter omp-spt --id <id> --create`, so the bringup log (`bridge starting`, `omp ready`, `bound`, `listening`, `READY`) is visible instead of launching silently in the background.\n126:- **Adapter updates now use the authenticated GitHub CLI transport.** The repository is currently public, but the release fetch path is now auth-capable via `gh`, so a private or visibility-flipped repo can still discover and download `adapter.spt` through the user's existing GitHub authentication.\n127:\n128:## [0.1.1] - 2026-07-09\n129:\n130:> Hardening release, driven by a maintainer field report of a wedged endpoint (thanks doyle — [#1](https://github.com/BigscreenVR/omp-spt/pull/1)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart your omp endpoints.\n131:\n132:### Changed\n133:- **The endpoint process is now named `omp-spt`** (was `claude-spt`), so a task list tells you at a glance which adapter a process belongs to — no more misdiagnosing an omp endpoint as a Claude Code one.\n134:\n135:### Fixed\n136:- **Stopping an endpoint no longer leaves orphans.** The bridge now ties its omp and listener children to its own lifetime at the OS level: however the bridge dies — a stop, a crash, a hard kill — the whole tree goes down with it, and the perch is unregistered on the way out instead of advertising a dead endpoint as listening.\n137:- **A silent endpoint is now a diagnosable endpoint.** The attached terminal shows live operational output by default: bringup steps, one line per message in and reply out, every delivery/registration failure, and a periodic idle heartbeat — a working, idle, and broken endpoint each look different now.\n138:- **A hung bringup or turn can no longer wedge the perch forever.** Startup is bounded (a wrong or stalled `omp` fails loudly before the endpoint registers, so a failed bringup can't trap the endpoint on this adapter), and each turn has a deadline — on breach the perch recovers to idle and the sender is told the turn failed instead of receiving silence or an empty reply.\n139:- **A dead omp process is noticed immediately** (and the endpoint shuts down cleanly), not on the next message.\n140:\n141:## [0.1.0] - 2026-07-09\n142:\n143:> First release of **omp-spt**: host an [oh-my-pi (omp)](https://github.com/can1357/oh-my-pi) coding agent as a reachable spt endpoint. Requires spt-core **v0.27.0 or newer** and an installed `omp` CLI. Install: `spt adapter add --release BigscreenVR/omp-spt`.\n144:\n145:### Added\n146:- **Host omp as an spt endpoint.** `spt endpoint run --adapter omp-spt --id <id>` brings up a reachable omp agent: a message sent to its perch becomes an omp turn, and the answer goes back to the sender. Ask from anywhere on the subnet with `spt ring <id>`.\n147:- **Conversation memory across messages.** The endpoint holds one omp session for its lifetime, so follow-ups continue the same conversation; resuming an endpoint reloads its prior session.\n148:- **Session digest.** `spt endpoint digest <id>` shows the endpoint's conversation as it happens — prompts, replies, and the tools omp used.\n149:- **Live-agent lifecycle.** A live omp endpoint gets a Psyche companion that carries its context across resets, and a session that ends without a signoff is auto-summarized so its context delta is kept anyway.\n150:- **OpenRouter billing guide.** `docs/OMP-OPENROUTER.md` covers routing the endpoint's model spend through OpenRouter using omp's own provider config — nothing to configure in the adapter itself.\n151:\n152:### Changed\n153:- **The adapter drives omp natively.** Unlike the Claude Code lineage it forked from, omp-spt talks to omp over omp's built-in control protocol: bringup is a single bridge process, with no hook or plugin installation inside the agent, and none of the injection limits that came with hook-based delivery.\n154:- **The skills namespace is `/omps:*`** (was `/sptc:*` in the lineage): setup, ready, live, send, commune, signoff, subnet, list-agents, force-stop, version.\n155:\n156:## [0.17.3] - 2026-07-08\n157:\n158:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n159:\n160:### Fixed\n161:- **The message shortcut no longer cries \"not delivered\" when it actually delivered.** Sending with `@<peer …@>` would tell you the peer \"wasn't reachable\" even though the message had arrived — so you'd needlessly re-send by hand. The delivered/not-delivered confirmation is now correct. (Messaging to yourself was never affected.)\n162:\n163:### Changed\n164:- **Communes now file project detail under the project, not your permanent identity.** When you commune (or when a session is auto-summarized), detail specific to the project you're in is kept separate from your cross-project, standing context — so your durable memory stays clean and project notes don't bleed between projects. Wrap project detail in `<project-context>…</project-context>` and identity/role context in `<live-context>…</live-context>`; anything left untagged is treated as standing context.\n165:\n166:## [0.17.2] - 2026-07-08\n167:\n168:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n169:\n170:### Fixed\n171:- **A message shortcut written as the last thing in a reply now actually sends.** Previously, if the `@<…@>` tag (or a `>>commune<<`) was the very last output of a turn — the normal \"fire it off and wait for a reply\" case — it wasn't delivered until you next did something, so a send-then-wait could hang. It's now delivered the moment the turn ends, for both live and daemon-hosted agents. Tags written mid-reply were unaffected and still work.\n172:\n173:## [0.17.1] - 2026-07-08\n174:\n175:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n176:\n177:### Fixed\n178:- **The message shortcut no longer fires when you're just *talking about* it.** In 0.17.0, writing an example of the `@<…@>` form in a reply — even wrapped in backticks — could actually send it. Now a tag only sends when written plainly; any tag inside inline-code (backticks) or a code block is treated as a quotation and ignored. Write a real send bare; show an example in backticks.\n179:\n180:## [0.17.0] - 2026-07-08\n181:\n182:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** for the feature — `spt adapter update claude-spt` is the whole update (the send-skill help note also refreshes if you reinstall the plugin skeleton). Takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n183:\n184:### Added\n185:- **Message another agent without leaving your train of thought — no shell command needed.** Write `@<alice hey, can you check the deploy? @>` anywhere in a reply and the adapter delivers \"hey, can you check the deploy?\" to `alice`, then tells you (in your next context) whether it landed or the agent wasn't reachable. Send to several at once with `@<alice,bob,carol …@>`. Only that exact `@<…@>` form sends, so you can still talk *about* the syntax without firing anything.\n186:- **Save a working-context note the same way.** Start a message with `>>commune<<` and the rest becomes your commune (the context hand-off that survives a reset) — the same result as writing the commune file by hand, without the file step. Include `!!checkpoint!!` in it to also reset-and-rebuild your context from that note.\n187:\n188:## [0.16.2] - 2026-07-08\n189:\n190:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Note: this heal rides the endpoint's background delivery process, so it takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n191:\n192:### Fixed\n193:- **A daemon-launched endpoint interrupted with Esc no longer goes deaf.** Pressing Esc to interrupt a running turn — whether a tool was mid-flight or the agent was just thinking — used to leave the endpoint looking online while silently queuing every incoming message, sometimes for many minutes, until the next thing you typed flushed the backlog. The endpoint now notices it's sitting at an interrupted prompt and returns itself to ready-to-receive within ~15 seconds, so queued messages are delivered. To recover an already-stuck endpoint immediately, send it any message once it's back at an idle prompt, or restart it.\n194:\n195:## [0.16.1] - 2026-07-08\n196:\n197:> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update; no plugin reinstall or `/reload-plugins` needed.\n198:\n199:### Fixed\n200:- **Follow-up to 0.16.0: the interrupted-turn recovery now actually takes effect on daemon-launched endpoints.** In 0.16.0 the recovery could silently fail to register (an ownership-check mismatch), so an endpoint interrupted mid-turn could still stop receiving. It now reliably marks the endpoint ready-to-receive again after an interrupt. Also adds a local diagnostic log (`hook-trace.log`, next to the adapter binary) recording endpoint lifecycle events, to make this class of issue observable.\n201:\n202:## [0.16.0] - 2026-07-08\n203:\n204:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary; the new failure hooks require the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate them. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n205:\n206:### Fixed\n207:- **A daemon-launched endpoint no longer goes deaf after an interrupted or errored turn.** Pressing Esc during a running tool, or a turn that ends with an API error (rate limit, server error), used to leave the endpoint looking online while silently queuing every incoming message instead of delivering it — until the next thing you typed happened to flush the backlog. The endpoint now returns to ready-to-receive the moment such a turn ends, so messages are delivered right away. Anything queued in the meantime is delivered as soon as it goes ready — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's idle, or restart it.\n208:\n209:## [0.15.9] - 2026-07-08\n210:\n211:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary fix; the new idle notification requires the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate it. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n212:\n213:### Fixed\n214:- **A daemon-launched endpoint that hasn't taken a turn yet no longer silently swallows every message sent to it.** A freshly-launched endpoint (or one whose only input so far was a client-side command like `/login`, which never produces a full turn) was treated as permanently busy, so incoming messages were queued and never delivered — the endpoint looked online and healthy while receiving nothing. Endpoints are now marked ready-to-receive as soon as they start, and re-marked ready whenever they return to an idle prompt, so messages are delivered instead of piling up. Any messages that were queued this way are delivered as soon as the endpoint next goes idle — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's i…\n215:\n216:## [0.15.8] - 2026-07-07\n217:\n218:> Requires spt-core **v0.27.0 or newer** (unchanged). Instruction-only change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect at the next endpoint launch; fully forward-safe on current spt-core and activates automatically once the matching spt-core release is deployed.\n219:\n220:### Added\n221:- **Opt-in delivery verification for messages injected into a session.** The adapter now enables spt-core's echo-verification belt for Claude Code sessions: because the Claude Code terminal re-renders text that is typed into it, spt-core can confirm an injected message actually landed. This is off by default in spt-core and the adapter now turns it on for Claude Code. It stays dormant on spt-core versions that don't yet support it and switches on by itself once a supporting spt-core is installed — no configuration and no forced upgrade.\n222:\n223:## [0.15.7] - 2026-07-07\n224:\n225:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed. Recommended for anyone who uses Claude Code's `/resume` on a daemon-launched endpoint.\n226:\n227:### Fixed\n228:- **Using Claude Code's `/resume` inside a daemon-launched endpoint no longer makes it silently unreachable.** When an endpoint launched by the spt daemon switched conversations with the in-app `/resume` command, its perch could quietly detach from the live session — the endpoint still looked healthy and running, but messages sent to it went nowhere and the failure was never surfaced. Resuming now re-attaches the perch to the resumed conversation correctly, and if the re-attach is ever rejected it is reported loudly instead of swallowed. If an endpoint got stranded this way, relaunching it without `/resume` restores delivery.\n229:\n230:## [0.15.6] - 2026-07-07\n231:\n232:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + instruction change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n233:\n234:### Fixed\n235:- **A message whose delivery gets cut off mid-transmission can no longer vanish silently.** Previously, if an incoming message's delivery frame arrived truncated, it was quietly dropped — counted as delivered but never shown to the agent. Now the agent sees a clear marker with whatever partial content survived and a pointer to where the full message can be recovered, so a cut-off delivery is always visible instead of lost.\n236:\n237:### Changed\n238:- **Going live or ready in a daemon-launched session no longer starts a redundant listener.** A live agent or ready session that was launched by the spt daemon is already reachable through the broker — messages arrive on its turn automatically. Bringup now recognizes this kind of session and skips starting an extra in-session listener, which in that context could not receive anything anyway and only reported an error. Sessions you launch yourself are unaffected and still start their listener as before.\n239:\n240:## [0.15.5] - 2026-07-07\n241:\n242:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Completes the 0.15.4 Psyche repair for ccs-launched endpoints.\n243:\n244:### Fixed\n245:- **End-of-session summaries work for ccs-launched endpoints.** 0.15.4 fixed finding the session transcript, but the summarizer's own Claude run still failed for ccs-launched endpoints because it ran without the endpoint's ccs configuration (no auth). It now runs with the endpoint's own configuration, so end-of-session context capture works everywhere. Psyches affected by the earlier failures recover on their own at the next commune — no restart needed.\n246:\n247:## [0.15.4] - 2026-07-07\n248:\n249:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently** — inter-agent messages received while an agent is mid-task are silently lost without it. After updating, wake any endpoint whose Psyche shows a hosting error.\n250:\n251:### Fixed\n252:- **Messages delivered while an agent is busy actually reach the agent again.** A message arriving while the receiving agent was mid-task was consumed but never shown — the sender saw a successful send, the receiver saw nothing, and the message was gone. Every agent was affected. Mid-task deliveries now surface reliably.\n253:- **Psyches no longer shut down when a session's transcript can't be found.** The end-of-session summarizer (added in 0.15.2) treated a missing transcript as a fatal error, which after a few occurrences shut down the endpoint's whole Psyche — and it missed transcripts for every ccs-launched session because it looked in the wrong place. It now finds ccs session transcripts correctly, and when a transcript genuinely doesn't exist it records that fact and moves on instead of escalating.\n254:\n255:## [0.15.3] - 2026-07-07\n256:\n257:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n258:\n259:### Added\n260:- **Agents on a perch are now steered to run long tasks in the background.** Previously, agents routinely ran subagents and long commands in the foreground, which made them unreachable for incoming messages until the task finished. Every perched turn now carries a reachability notice reminding the agent to use background execution, with an extra targeted reminder right before a subagent launches — so agents stay responsive while work runs. (Ported from the legacy owl plugin, where this notice existed for the same reason.)\n261:\n262:## [0.15.2] - 2026-07-07\n263:\n264:> Requires spt-core **v0.27.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.27.0+** — agent checkpoints and communes are broken without it. Restart affected live agents once after updating.\n265:\n266:### Fixed\n267:- **Agent checkpoints and communes work again on spt-core v0.27.0+.** Newer spt-core asks the adapter to summarize a session's history whenever a session ends without a signoff (and when syncing a commune). The adapter didn't provide that summarizer, so after a few attempts spt-core gave up on the whole Psyche — checkpoints did nothing, communes stopped reaching the agent's tracked mind, and the endpoint showed a Psyche hosting error. The adapter now ships the summarizer, so end-of-session context is captured and checkpoints fire normally again.\n268:\n269:### Added\n270:- **Sessions that end without a signoff now keep their context.** When a live agent's session ends abruptly (closed window, crash, no `/sptc:signoff`), spt-core now gets a concise summary of what the session was doing, ingested into the agent's tracked mind — so the next session resumes with that context instead of losing it.\n271:\n272:## [0.15.1] - 2026-07-06\n273:\n274:> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. The same fix is also available as **v0.14.3** for nodes still on spt-core v0.25.0/v0.26.0.\n275:\n276:### Fixed\n277:- **A checkpoint's resume instruction can no longer get swallowed by the session-name restore.** Since 0.14.1, restoring the session name after a clear and delivering the checkpoint's resume instruction could occasionally collide: the resume text ended up inside the session's title, the agent never received it, and the session sat idle until someone noticed. The two now land as one carefully-paced delivery, so the name is restored and the resume instruction starts the agent every time. If an agent hit this, its session title contains the swallowed instruction — rename the session and resend the instruction to recover.\n278:\n279:## [0.15.0] - 2026-07-06\n280:\n281:> Requires spt-core **v0.27.0 or newer** (floor raised). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update spt-core first** (`spt update fetch` then `spt update apply`), then the adapter.\n282:\n283:### Fixed\n284:- **Subagent working perches no longer pile up as permanent offline entries.** Previously, every subagent an agent spawned left behind a dead worker perch that sat in your endpoint list forever and could never be cleaned up normally. With spt-core v0.27.0, worker perches now get proper names (like `flynn-w4` instead of a random hex string), stop cleanly when the subagent finishes, stay out of the default `spt endpoint list` view (pass `--workers` to see them), and any stragglers are reaped automatically within a day. If a worker can't be registered or stopped, the reason now appears in the session's hook log instead of failing silently.\n285:\n286:## [0.14.2] - 2026-07-06\n287:\n288:> Requires spt-core **v0.25.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.25.0+** — their Psyches are broken without it.\n289:\n290:### Fixed\n291:- **A live agent's Psyche works again on spt-core v0.25.0+.** Since 0.14.0, every Psyche turn failed before it could start (a leftover reference to a setting the new Psyche lifecycle no longer provides), so a live agent's Psyche silently stopped producing context notes and resume briefs. The Psyche now runs its turns normally again. Recovery: update the adapter, then restart affected live agents once.\n292:\n293:## [0.14.1] - 2026-07-05\n294:\n295:> Requires spt-core **v0.25.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change.\n296:\n297:### Fixed\n298:- **Sessions keep their name across `/clear`.** Previously, running `/clear` (or an agent checkpoint, which clears internally) dropped the session's display name — the terminal lost its `<id> @ <node> (<project>/)` title and you could no longer tell at a glance which agent a window belonged to. The name is now automatically re-applied right after every clear, before the agent resumes work. Sessions started before this update keep the old behavior until they are restarted once.\n299:\n300:## [0.14.0] - 2026-07-04\n…\n308:\n…\n557:- **Invisible engine install.** Starting a session automatically installs the `spt` engine the first time if it is missing — no separate install step.\n\n[Showing lines 1-300 of 558. Use :301 to continue. Some lines truncated to 768 chars]"}],"details":{"truncation":{"content":"# Changelog\n\nAll notable user-facing changes to **omp-spt** (the Spacetime adapter for oh-my-pi). The format follows [Keep a Changelog](https://keepachangelog.com/); each release section is the public release body verbatim.\n\n> Each release below is keyed to the **adapter version of truth** (the version `spt adapter list` reports and the GitHub release tag). omp-spt starts its own version line at 0.1.0; the sections from [0.17.3] down are the inherited **claude-spt** lineage this project forked from, retained for history.\n\n## [0.3.12] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Endpoint activation no longer fails while coloring the inline identity.** OMP's theme API exposes semantic palette keys rather than a literal `cyan` key. The footer now uses `statusLineModel`, the cyan status-line role, after v0.3.11's literal key caused `Unknown theme color: cyan` during bind.\n\n## [0.3.11] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Messages received while an agent is working now reach the model.** Active-turn delivery uses OMP's native user-message steering queue before the context hook expands the inert sender stub into the full SPT envelope. The former context-only injection could write an `owl_message` into OMP history after an ACP request was already assembled, making the delivery visible in history but absent from model context.\n- **A local prompt can no longer overtake queued peer custody at turn completion.** The next accepted delivery is submitted synchronously before the completed turn releases its lifecycle hook.\n- **Shortform delivery no longer adds an internal `omp-spt-peer-status` panel to the transcript.** Explicit `@<…@>` sends remain bounded and ordered without adding adapter-internal result messages to the TUI.\n- **The inline endpoint identity is explicitly cyan.** The status renderer now requests the theme's `cyan` color rather than its theme-dependent `accent`.\n- **Busy window-title animation is calmer.** Spinner frames advance every 500 ms instead of every 80 ms.\n- **Graceful shutdown clears durable session state before spending time reaping the listener.** Authenticated `session-end` now precedes listener termination, reducing the chance that a bounded shutdown leaves stale online state. Abrupt process or machine death still requires spt-core's owner-death reconciliation because no in-process adapter callback can run after its host has disappeared.\n\n## [0.3.10] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **ACP-hosted endpoints wake for deferred peer deliveries again.** Deferred custody now enters OMP through the native user-prompt flow. OMP 17 defers extension-initiated hidden turns under an ACP client, so v0.3.9's `nextTurn` trigger could queue a message without starting the receiving agent.\n- **Inbound context is easier to identify and read.** The obsolete internal `omp-spt-peer-message` custom-message identifier is gone, and complete `<EVENT>` envelopes place their body on lines between the opening and closing tags.\n- **The inline endpoint identity is cyan again.** Status styling now uses OMP's theme API instead of raw ANSI escapes that the status renderer discarded.\n\n## [0.3.9] - 2026-07-19\n\n### Fixed\n- **Deferred peer deliveries now wake the receiving OMP session reliably.** Accepted messages use OMP's hidden next-turn channel with an explicit turn trigger, preserving the full SPT envelope without depending on the editable follow-up queue to resume after an active or interrupted turn.\n\n## [0.3.8] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected listener and session identity.\n\n### Fixed\n- **Incoming messages containing quoted SPT events no longer shut the endpoint down.** The listener now preserves complete `<EVENT>…</EVENT>` text inside a peer message, while incomplete frames remain bounded and fail closed. Deferred messages also use OMP's follow-up queue so a streaming-state race cannot silently lose them.\n- **The inline OMP status now shows the complete endpoint identity.** The footer reads `<endpoint-id> @ <node> (<project-name>/)` in cyan instead of `spt:<endpoint-id>`, matching the session and terminal-window naming introduced in v0.3.7.\n\n## [0.3.7] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new title behavior.\n\n### Added\n- **Hosted OMP windows identify themselves at a glance.** Session names now use `<endpoint-id> @ <node> (<project-name>/)`. Terminal titles add `○` while idle and cycle a braille spinner while busy, then return to idle without leaking a timer.\n\n## [0.3.6] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Assistant output stays inside the local OMP conversation.** This release republishes the v0.3.5 behavioral fix from a corrected release commit; runtime behavior is unchanged.\n\n## [0.3.5] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Assistant output now stays inside the local OMP conversation.** Receiving a peer message no longer forwards subsequent assistant prose, errors, or shutdown text back to that peer. Outbound messages occur only when the agent or operator explicitly uses `spt send` or the `@<…@>` peer-message shortform, restoring `claude-spt` behavioral parity.\n\n## [0.3.4] - 2026-07-16\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new extension and skills.\n\n### Added\n- **An ordinary OMP session can now become a ready or live SPT endpoint in place.** Native `/ready` and `/live` commands select or create endpoint identity, while `/live --auto` offers the most-recent compatible live identity for explicit confirmation; the extension owns the listener, so the agent never has to run a background poll.\n- **Live endpoints stay reachable during long turns and after interrupted work.** Accepted peer messages enter at the next safe tool or model boundary, retain ordered custody when no boundary appears, and restore honest receivability after cancellation, interruption, or failure.\n- **OMP now ships native commune, signoff, role, and setup skills.** Commune includes an OMP-native checkpoint mode that saves continuity, compacts context, and wakes the same endpoint; setup diagnoses versions, activation, GitHub transport, and subnet onboarding.\n- **Activated sessions now teach the SPT surface directly.** Startup guidance, targeted hints, and compatible-update notices cover identity, roster, messaging, lifecycle, continuity, versions, and subnet operations without duplicating public `spt` commands as skills.\n- **Assistant output can send peer messages with `@<target[,target] message @>`.** The extension dispatches only the explicit shortform, excludes code blocks and ordinary mentions, and reports each target's delivery result.\n- **The release now includes a static Linux x86-64 musl helper compatibility tier.** Windows MSVC, GNU Linux, and static-musl Linux helpers ship together in one deterministic `adapter.spt`.\n\n### Fixed\n- **Hosted messaging no longer tears down the listener when a peer reply mentions `<EVENT>` literally.** The frame parser tolerates non-frame `<EVENT>` text inside a message while still rejecting a genuinely nested valid frame, and decodes both published `<br/>` and legacy `<br>` newline forms.\n\n### Changed\n- **Release truth is now mechanically enforced.** The manifest version drives helper, plugin, changelog, and public-doc versions; deterministic documentation drift checks gate GitHub Pages publication; each supported target has schema-validated, digest-bound native acceptance evidence.\n\n## [0.2.1] - 2026-07-15\n\n> Requires spt-core **v0.31.0 or newer** for identity-preserving listener authentication. Run `spt update`, then `spt adapter update omp-spt`, and restart each endpoint.\n\n### Fixed\n- **Starting or resuming an endpoint now records exactly one OMP session in endpoint history.** The listener continues from the already-bound native OMP session instead of registering a second synthetic `boot` session, so resume selection and session metadata remain tied to the real OMP transcript.\n\n## [0.2.0] - 2026-07-14\n\n> Native OMP cutover. Requires spt-core **v0.29.0 or newer** and Oh My Pi **v16.3.15 or newer**. If OMP is older, run `omp update` before launching an endpoint. Update the adapter with `spt adapter update omp-spt`, then restart each endpoint so it loads the packaged extension and helper from this release.\n\n### Added\n- **Every endpoint now remains a real, attachable OMP session.** Ready and live endpoints use the same native OMP launch path, so an unattended endpoint can still be attached later without losing OMP's normal terminal interface.\n- **Inbound peer messages now arrive as ordinary OMP turns with full SPT context.** The visible prompt is a safe sender stub, while the complete event envelope is supplied to that turn as context; peer text cannot accidentally invoke a slash command.\n- **OMP profile-aware session tools.** History, digest, echo-commune, and Psyche session lookup now follow OMP's profile and configuration precedence, including deterministic exact-id and prefix handling.\n\n### Changed\n- **The adapter is now OMP-native only.** The inherited Claude Code plugin, hooks, CCS profiles, worker topology, headless RPC bridge, and message-idle translation path are removed. `omp-spt` advertises ReadyAgent and LiveAgent only; Worker remains an intentional capability opt-out.\n- **Fresh, resumed, and daemon-driven turns validate the real Oh My Pi executable before launch.** Explicit overrides, known install paths, and PATH candidates all receive the same identity probe, so an unrelated `omp` command cannot become the hosted terminal.\n- **One endpoint stays bound to one OMP session for its lifetime.** In-TUI new, resume, fork, handoff, and branch actions are blocked; stop and relaunch the endpoint to select another native session.\n- **Commune and signoff drops now live under the project-local `.spt/` directory.** The old harness-specific continuity path is no longer used.\n\n### Fixed\n- **Accepted messages cannot disappear after an outbound reply failure.** Correlated outcomes retry within a finite budget; exhaustion shuts the endpoint down loudly instead of marking undelivered custody as settled.\n- **Bind, activity, and shutdown races no longer advertise the wrong endpoint state or leak a late listener.** Busy-before-bind is preserved, shutdown-before-bind tears down immediately, and concurrent fatal and lifecycle shutdowns share one bounded session-end sequence.\n- **Listener recovery now distinguishes crash loops from isolated failures.** Immediate repeated exits still fail closed, while a listener that remains stable resets its consecutive-failure budget.\n- **Echo-commune handles Unicode transcript boundaries safely.** A byte cap that lands inside a multi-byte character no longer crashes the summarizer.\n\n## [0.1.3] - 2026-07-13\n\n### Fixed\n- **Attached endpoints now show OMP's full native TUI.** Native `omp` is the broker PTY process, with SPT messaging supplied by a packaged OMP extension. The previous headless `omp --mode rpc` bridge could only display bridge logs, regardless of whether the endpoint command attached to its PTY.\n\n## [0.1.2] - 2026-07-10\n\n> Liaison bugfix rollup for the two Reavo-reported omp-spt v0.1.1 issues ([#2](https://github.com/BigscreenVR/omp-spt/issues/2), [#3](https://github.com/BigscreenVR/omp-spt/issues/3)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart omp endpoints.\n\n### Fixed\n- **The fresh-endpoint update guidance now keeps the harness terminal attached.** The update notice no longer tells operators to use `--start` for a new Librarian endpoint; the documented command uses attach-default `spt endpoint run --adapter omp-spt --id <id> --create`, so the bringup log (`bridge starting`, `omp ready`, `bound`, `listening`, `READY`) is visible instead of launching silently in the background.\n- **Adapter updates now use the authenticated GitHub CLI transport.** The repository is currently public, but the release fetch path is now auth-capable via `gh`, so a private or visibility-flipped repo can still discover and download `adapter.spt` through the user's existing GitHub authentication.\n\n## [0.1.1] - 2026-07-09\n\n> Hardening release, driven by a maintainer field report of a wedged endpoint (thanks doyle — [#1](https://github.com/BigscreenVR/omp-spt/pull/1)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart your omp endpoints.\n\n### Changed\n- **The endpoint process is now named `omp-spt`** (was `claude-spt`), so a task list tells you at a glance which adapter a process belongs to — no more misdiagnosing an omp endpoint as a Claude Code one.\n\n### Fixed\n- **Stopping an endpoint no longer leaves orphans.** The bridge now ties its omp and listener children to its own lifetime at the OS level: however the bridge dies — a stop, a crash, a hard kill — the whole tree goes down with it, and the perch is unregistered on the way out instead of advertising a dead endpoint as listening.\n- **A silent endpoint is now a diagnosable endpoint.** The attached terminal shows live operational output by default: bringup steps, one line per message in and reply out, every delivery/registration failure, and a periodic idle heartbeat — a working, idle, and broken endpoint each look different now.\n- **A hung bringup or turn can no longer wedge the perch forever.** Startup is bounded (a wrong or stalled `omp` fails loudly before the endpoint registers, so a failed bringup can't trap the endpoint on this adapter), and each turn has a deadline — on breach the perch recovers to idle and the sender is told the turn failed instead of receiving silence or an empty reply.\n- **A dead omp process is noticed immediately** (and the endpoint shuts down cleanly), not on the next message.\n\n## [0.1.0] - 2026-07-09\n\n> First release of **omp-spt**: host an [oh-my-pi (omp)](https://github.com/can1357/oh-my-pi) coding agent as a reachable spt endpoint. Requires spt-core **v0.27.0 or newer** and an installed `omp` CLI. Install: `spt adapter add --release BigscreenVR/omp-spt`.\n\n### Added\n- **Host omp as an spt endpoint.** `spt endpoint run --adapter omp-spt --id <id>` brings up a reachable omp agent: a message sent to its perch becomes an omp turn, and the answer goes back to the sender. Ask from anywhere on the subnet with `spt ring <id>`.\n- **Conversation memory across messages.** The endpoint holds one omp session for its lifetime, so follow-ups continue the same conversation; resuming an endpoint reloads its prior session.\n- **Session digest.** `spt endpoint digest <id>` shows the endpoint's conversation as it happens — prompts, replies, and the tools omp used.\n- **Live-agent lifecycle.** A live omp endpoint gets a Psyche companion that carries its context across resets, and a session that ends without a signoff is auto-summarized so its context delta is kept anyway.\n- **OpenRouter billing guide.** `docs/OMP-OPENROUTER.md` covers routing the endpoint's model spend through OpenRouter using omp's own provider config — nothing to configure in the adapter itself.\n\n### Changed\n- **The adapter drives omp natively.** Unlike the Claude Code lineage it forked from, omp-spt talks to omp over omp's built-in control protocol: bringup is a single bridge process, with no hook or plugin installation inside the agent, and none of the injection limits that came with hook-based delivery.\n- **The skills namespace is `/omps:*`** (was `/sptc:*` in the lineage): setup, ready, live, send, commune, signoff, subnet, list-agents, force-stop, version.\n\n## [0.17.3] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **The message shortcut no longer cries \"not delivered\" when it actually delivered.** Sending with `@<peer …@>` would tell you the peer \"wasn't reachable\" even though the message had arrived — so you'd needlessly re-send by hand. The delivered/not-delivered confirmation is now correct. (Messaging to yourself was never affected.)\n\n### Changed\n- **Communes now file project detail under the project, not your permanent identity.** When you commune (or when a session is auto-summarized), detail specific to the project you're in is kept separate from your cross-project, standing context — so your durable memory stays clean and project notes don't bleed between projects. Wrap project detail in `<project-context>…</project-context>` and identity/role context in `<live-context>…</live-context>`; anything left untagged is treated as standing context.\n\n## [0.17.2] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **A message shortcut written as the last thing in a reply now actually sends.** Previously, if the `@<…@>` tag (or a `>>commune<<`) was the very last output of a turn — the normal \"fire it off and wait for a reply\" case — it wasn't delivered until you next did something, so a send-then-wait could hang. It's now delivered the moment the turn ends, for both live and daemon-hosted agents. Tags written mid-reply were unaffected and still work.\n\n## [0.17.1] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **The message shortcut no longer fires when you're just *talking about* it.** In 0.17.0, writing an example of the `@<…@>` form in a reply — even wrapped in backticks — could actually send it. Now a tag only sends when written plainly; any tag inside inline-code (backticks) or a code block is treated as a quotation and ignored. Write a real send bare; show an example in backticks.\n\n## [0.17.0] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** for the feature — `spt adapter update claude-spt` is the whole update (the send-skill help note also refreshes if you reinstall the plugin skeleton). Takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n\n### Added\n- **Message another agent without leaving your train of thought — no shell command needed.** Write `@<alice hey, can you check the deploy? @>` anywhere in a reply and the adapter delivers \"hey, can you check the deploy?\" to `alice`, then tells you (in your next context) whether it landed or the agent wasn't reachable. Send to several at once with `@<alice,bob,carol …@>`. Only that exact `@<…@>` form sends, so you can still talk *about* the syntax without firing anything.\n- **Save a working-context note the same way.** Start a message with `>>commune<<` and the rest becomes your commune (the context hand-off that survives a reset) — the same result as writing the commune file by hand, without the file step. Include `!!checkpoint!!` in it to also reset-and-rebuild your context from that note.\n\n## [0.16.2] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Note: this heal rides the endpoint's background delivery process, so it takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n\n### Fixed\n- **A daemon-launched endpoint interrupted with Esc no longer goes deaf.** Pressing Esc to interrupt a running turn — whether a tool was mid-flight or the agent was just thinking — used to leave the endpoint looking online while silently queuing every incoming message, sometimes for many minutes, until the next thing you typed flushed the backlog. The endpoint now notices it's sitting at an interrupted prompt and returns itself to ready-to-receive within ~15 seconds, so queued messages are delivered. To recover an already-stuck endpoint immediately, send it any message once it's back at an idle prompt, or restart it.\n\n## [0.16.1] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update; no plugin reinstall or `/reload-plugins` needed.\n\n### Fixed\n- **Follow-up to 0.16.0: the interrupted-turn recovery now actually takes effect on daemon-launched endpoints.** In 0.16.0 the recovery could silently fail to register (an ownership-check mismatch), so an endpoint interrupted mid-turn could still stop receiving. It now reliably marks the endpoint ready-to-receive again after an interrupt. Also adds a local diagnostic log (`hook-trace.log`, next to the adapter binary) recording endpoint lifecycle events, to make this class of issue observable.\n\n## [0.16.0] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary; the new failure hooks require the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate them. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n\n### Fixed\n- **A daemon-launched endpoint no longer goes deaf after an interrupted or errored turn.** Pressing Esc during a running tool, or a turn that ends with an API error (rate limit, server error), used to leave the endpoint looking online while silently queuing every incoming message instead of delivering it — until the next thing you typed happened to flush the backlog. The endpoint now returns to ready-to-receive the moment such a turn ends, so messages are delivered right away. Anything queued in the meantime is delivered as soon as it goes ready — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's idle, or restart it.\n\n## [0.15.9] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary fix; the new idle notification requires the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate it. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n\n### Fixed\n- **A daemon-launched endpoint that hasn't taken a turn yet no longer silently swallows every message sent to it.** A freshly-launched endpoint (or one whose only input so far was a client-side command like `/login`, which never produces a full turn) was treated as permanently busy, so incoming messages were queued and never delivered — the endpoint looked online and healthy while receiving nothing. Endpoints are now marked ready-to-receive as soon as they start, and re-marked ready whenever they return to an idle prompt, so messages are delivered instead of piling up. Any messages that were queued this way are delivered as soon as the endpoint next goes idle — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's i…\n\n## [0.15.8] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Instruction-only change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect at the next endpoint launch; fully forward-safe on current spt-core and activates automatically once the matching spt-core release is deployed.\n\n### Added\n- **Opt-in delivery verification for messages injected into a session.** The adapter now enables spt-core's echo-verification belt for Claude Code sessions: because the Claude Code terminal re-renders text that is typed into it, spt-core can confirm an injected message actually landed. This is off by default in spt-core and the adapter now turns it on for Claude Code. It stays dormant on spt-core versions that don't yet support it and switches on by itself once a supporting spt-core is installed — no configuration and no forced upgrade.\n\n## [0.15.7] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed. Recommended for anyone who uses Claude Code's `/resume` on a daemon-launched endpoint.\n\n### Fixed\n- **Using Claude Code's `/resume` inside a daemon-launched endpoint no longer makes it silently unreachable.** When an endpoint launched by the spt daemon switched conversations with the in-app `/resume` command, its perch could quietly detach from the live session — the endpoint still looked healthy and running, but messages sent to it went nowhere and the failure was never surfaced. Resuming now re-attaches the perch to the resumed conversation correctly, and if the re-attach is ever rejected it is reported loudly instead of swallowed. If an endpoint got stranded this way, relaunching it without `/resume` restores delivery.\n\n## [0.15.6] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + instruction change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n\n### Fixed\n- **A message whose delivery gets cut off mid-transmission can no longer vanish silently.** Previously, if an incoming message's delivery frame arrived truncated, it was quietly dropped — counted as delivered but never shown to the agent. Now the agent sees a clear marker with whatever partial content survived and a pointer to where the full message can be recovered, so a cut-off delivery is always visible instead of lost.\n\n### Changed\n- **Going live or ready in a daemon-launched session no longer starts a redundant listener.** A live agent or ready session that was launched by the spt daemon is already reachable through the broker — messages arrive on its turn automatically. Bringup now recognizes this kind of session and skips starting an extra in-session listener, which in that context could not receive anything anyway and only reported an error. Sessions you launch yourself are unaffected and still start their listener as before.\n\n## [0.15.5] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Completes the 0.15.4 Psyche repair for ccs-launched endpoints.\n\n### Fixed\n- **End-of-session summaries work for ccs-launched endpoints.** 0.15.4 fixed finding the session transcript, but the summarizer's own Claude run still failed for ccs-launched endpoints because it ran without the endpoint's ccs configuration (no auth). It now runs with the endpoint's own configuration, so end-of-session context capture works everywhere. Psyches affected by the earlier failures recover on their own at the next commune — no restart needed.\n\n## [0.15.4] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently** — inter-agent messages received while an agent is mid-task are silently lost without it. After updating, wake any endpoint whose Psyche shows a hosting error.\n\n### Fixed\n- **Messages delivered while an agent is busy actually reach the agent again.** A message arriving while the receiving agent was mid-task was consumed but never shown — the sender saw a successful send, the receiver saw nothing, and the message was gone. Every agent was affected. Mid-task deliveries now surface reliably.\n- **Psyches no longer shut down when a session's transcript can't be found.** The end-of-session summarizer (added in 0.15.2) treated a missing transcript as a fatal error, which after a few occurrences shut down the endpoint's whole Psyche — and it missed transcripts for every ccs-launched session because it looked in the wrong place. It now finds ccs session transcripts correctly, and when a transcript genuinely doesn't exist it records that fact and moves on instead of escalating.\n\n## [0.15.3] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n\n### Added\n- **Agents on a perch are now steered to run long tasks in the background.** Previously, agents routinely ran subagents and long commands in the foreground, which made them unreachable for incoming messages until the task finished. Every perched turn now carries a reachability notice reminding the agent to use background execution, with an extra targeted reminder right before a subagent launches — so agents stay responsive while work runs. (Ported from the legacy owl plugin, where this notice existed for the same reason.)\n\n## [0.15.2] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.27.0+** — agent checkpoints and communes are broken without it. Restart affected live agents once after updating.\n\n### Fixed\n- **Agent checkpoints and communes work again on spt-core v0.27.0+.** Newer spt-core asks the adapter to summarize a session's history whenever a session ends without a signoff (and when syncing a commune). The adapter didn't provide that summarizer, so after a few attempts spt-core gave up on the whole Psyche — checkpoints did nothing, communes stopped reaching the agent's tracked mind, and the endpoint showed a Psyche hosting error. The adapter now ships the summarizer, so end-of-session context is captured and checkpoints fire normally again.\n\n### Added\n- **Sessions that end without a signoff now keep their context.** When a live agent's session ends abruptly (closed window, crash, no `/sptc:signoff`), spt-core now gets a concise summary of what the session was doing, ingested into the agent's tracked mind — so the next session resumes with that context instead of losing it.\n\n## [0.15.1] - 2026-07-06\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. The same fix is also available as **v0.14.3** for nodes still on spt-core v0.25.0/v0.26.0.\n\n### Fixed\n- **A checkpoint's resume instruction can no longer get swallowed by the session-name restore.** Since 0.14.1, restoring the session name after a clear and delivering the checkpoint's resume instruction could occasionally collide: the resume text ended up inside the session's title, the agent never received it, and the session sat idle until someone noticed. The two now land as one carefully-paced delivery, so the name is restored and the resume instruction starts the agent every time. If an agent hit this, its session title contains the swallowed instruction — rename the session and resend the instruction to recover.\n\n## [0.15.0] - 2026-07-06\n\n> Requires spt-core **v0.27.0 or newer** (floor raised). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update spt-core first** (`spt update fetch` then `spt update apply`), then the adapter.\n\n### Fixed\n- **Subagent working perches no longer pile up as permanent offline entries.** Previously, every subagent an agent spawned left behind a dead worker perch that sat in your endpoint list forever and could never be cleaned up normally. With spt-core v0.27.0, worker perches now get proper names (like `flynn-w4` instead of a random hex string), stop cleanly when the subagent finishes, stay out of the default `spt endpoint list` view (pass `--workers` to see them), and any stragglers are reaped automatically within a day. If a worker can't be registered or stopped, the reason now appears in the session's hook log instead of failing silently.\n\n## [0.14.2] - 2026-07-06\n\n> Requires spt-core **v0.25.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.25.0+** — their Psyches are broken without it.\n\n### Fixed\n- **A live agent's Psyche works again on spt-core v0.25.0+.** Since 0.14.0, every Psyche turn failed before it could start (a leftover reference to a setting the new Psyche lifecycle no longer provides), so a live agent's Psyche silently stopped producing context notes and resume briefs. The Psyche now runs its turns normally again. Recovery: update the adapter, then restart affected live agents once.\n\n## [0.14.1] - 2026-07-05\n\n> Requires spt-core **v0.25.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change.\n\n### Fixed\n- **Sessions keep their name across `/clear`.** Previously, running `/clear` (or an agent checkpoint, which clears internally) dropped the session's display name — the terminal lost its `<id> @ <node> (<project>/)` title and you could no longer tell at a glance which agent a window belonged to. The name is now automatically re-applied right after every clear, before the agent resumes work. Sessions started before this update keep the old behavior until they are restarted once.\n\n## [0.14.0] - 2026-07-04","truncated":true,"truncatedBy":"lines","totalLines":558,"totalBytes":34620,"outputLines":300,"outputBytes":34620,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"# Changelog\n\nAll notable user-facing changes to **omp-spt** (the Spacetime adapter for oh-my-pi). The format follows [Keep a Changelog](https://keepachangelog.com/); each release section is the public release body verbatim.\n\n> Each release below is keyed to the **adapter version of truth** (the version `spt adapter list` reports and the GitHub release tag). omp-spt starts its own version line at 0.1.0; the sections from [0.17.3] down are the inherited **claude-spt** lineage this project forked from, retained for history.\n\n## [0.3.12] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Endpoint activation no longer fails while coloring the inline identity.** OMP's theme API exposes semantic palette keys rather than a literal `cyan` key. The footer now uses `statusLineModel`, the cyan status-line role, after v0.3.11's literal key caused `Unknown theme color: cyan` during bind.\n\n## [0.3.11] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Messages received while an agent is working now reach the model.** Active-turn delivery uses OMP's native user-message steering queue before the context hook expands the inert sender stub into the full SPT envelope. The former context-only injection could write an `owl_message` into OMP history after an ACP request was already assembled, making the delivery visible in history but absent from model context.\n- **A local prompt can no longer overtake queued peer custody at turn completion.** The next accepted delivery is submitted synchronously before the completed turn releases its lifecycle hook.\n- **Shortform delivery no longer adds an internal `omp-spt-peer-status` panel to the transcript.** Explicit `@<…@>` sends remain bounded and ordered without adding adapter-internal result messages to the TUI.\n- **The inline endpoint identity is explicitly cyan.** The status renderer now requests the theme's `cyan` color rather than its theme-dependent `accent`.\n- **Busy window-title animation is calmer.** Spinner frames advance every 500 ms instead of every 80 ms.\n- **Graceful shutdown clears durable session state before spending time reaping the listener.** Authenticated `session-end` now precedes listener termination, reducing the chance that a bounded shutdown leaves stale online state. Abrupt process or machine death still requires spt-core's owner-death reconciliation because no in-process adapter callback can run after its host has disappeared.\n\n## [0.3.10] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **ACP-hosted endpoints wake for deferred peer deliveries again.** Deferred custody now enters OMP through the native user-prompt flow. OMP 17 defers extension-initiated hidden turns under an ACP client, so v0.3.9's `nextTurn` trigger could queue a message without starting the receiving agent.\n- **Inbound context is easier to identify and read.** The obsolete internal `omp-spt-peer-message` custom-message identifier is gone, and complete `<EVENT>` envelopes place their body on lines between the opening and closing tags.\n- **The inline endpoint identity is cyan again.** Status styling now uses OMP's theme API instead of raw ANSI escapes that the status renderer discarded.\n\n## [0.3.9] - 2026-07-19\n\n### Fixed\n- **Deferred peer deliveries now wake the receiving OMP session reliably.** Accepted messages use OMP's hidden next-turn channel with an explicit turn trigger, preserving the full SPT envelope without depending on the editable follow-up queue to resume after an active or interrupted turn.\n\n## [0.3.8] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected listener and session identity.\n\n### Fixed\n- **Incoming messages containing quoted SPT events no longer shut the endpoint down.** The listener now preserves complete `<EVENT>…</EVENT>` text inside a peer message, while incomplete frames remain bounded and fail closed. Deferred messages also use OMP's follow-up queue so a streaming-state race cannot silently lose them.\n- **The inline OMP status now shows the complete endpoint identity.** The footer reads `<endpoint-id> @ <node> (<project-name>/)` in cyan instead of `spt:<endpoint-id>`, matching the session and terminal-window naming introduced in v0.3.7.\n\n## [0.3.7] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new title behavior.\n\n### Added\n- **Hosted OMP windows identify themselves at a glance.** Session names now use `<endpoint-id> @ <node> (<project-name>/)`. Terminal titles add `○` while idle and cycle a braille spinner while busy, then return to idle without leaking a timer.\n\n## [0.3.6] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Assistant output stays inside the local OMP conversation.** This release republishes the v0.3.5 behavioral fix from a corrected release commit; runtime behavior is unchanged.\n\n## [0.3.5] - 2026-07-19\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the corrected extension.\n\n### Fixed\n- **Assistant output now stays inside the local OMP conversation.** Receiving a peer message no longer forwards subsequent assistant prose, errors, or shutdown text back to that peer. Outbound messages occur only when the agent or operator explicitly uses `spt send` or the `@<…@>` peer-message shortform, restoring `claude-spt` behavioral parity.\n\n## [0.3.4] - 2026-07-16\n\n> Requires spt-core **v0.31.0 or newer** and Oh My Pi **v16.3.15 or newer**. Update with `spt adapter update omp-spt`, then restart existing endpoints so they load the new extension and skills.\n\n### Added\n- **An ordinary OMP session can now become a ready or live SPT endpoint in place.** Native `/ready` and `/live` commands select or create endpoint identity, while `/live --auto` offers the most-recent compatible live identity for explicit confirmation; the extension owns the listener, so the agent never has to run a background poll.\n- **Live endpoints stay reachable during long turns and after interrupted work.** Accepted peer messages enter at the next safe tool or model boundary, retain ordered custody when no boundary appears, and restore honest receivability after cancellation, interruption, or failure.\n- **OMP now ships native commune, signoff, role, and setup skills.** Commune includes an OMP-native checkpoint mode that saves continuity, compacts context, and wakes the same endpoint; setup diagnoses versions, activation, GitHub transport, and subnet onboarding.\n- **Activated sessions now teach the SPT surface directly.** Startup guidance, targeted hints, and compatible-update notices cover identity, roster, messaging, lifecycle, continuity, versions, and subnet operations without duplicating public `spt` commands as skills.\n- **Assistant output can send peer messages with `@<target[,target] message @>`.** The extension dispatches only the explicit shortform, excludes code blocks and ordinary mentions, and reports each target's delivery result.\n- **The release now includes a static Linux x86-64 musl helper compatibility tier.** Windows MSVC, GNU Linux, and static-musl Linux helpers ship together in one deterministic `adapter.spt`.\n\n### Fixed\n- **Hosted messaging no longer tears down the listener when a peer reply mentions `<EVENT>` literally.** The frame parser tolerates non-frame `<EVENT>` text inside a message while still rejecting a genuinely nested valid frame, and decodes both published `<br/>` and legacy `<br>` newline forms.\n\n### Changed\n- **Release truth is now mechanically enforced.** The manifest version drives helper, plugin, changelog, and public-doc versions; deterministic documentation drift checks gate GitHub Pages publication; each supported target has schema-validated, digest-bound native acceptance evidence.\n\n## [0.2.1] - 2026-07-15\n\n> Requires spt-core **v0.31.0 or newer** for identity-preserving listener authentication. Run `spt update`, then `spt adapter update omp-spt`, and restart each endpoint.\n\n### Fixed\n- **Starting or resuming an endpoint now records exactly one OMP session in endpoint history.** The listener continues from the already-bound native OMP session instead of registering a second synthetic `boot` session, so resume selection and session metadata remain tied to the real OMP transcript.\n\n## [0.2.0] - 2026-07-14\n\n> Native OMP cutover. Requires spt-core **v0.29.0 or newer** and Oh My Pi **v16.3.15 or newer**. If OMP is older, run `omp update` before launching an endpoint. Update the adapter with `spt adapter update omp-spt`, then restart each endpoint so it loads the packaged extension and helper from this release.\n\n### Added\n- **Every endpoint now remains a real, attachable OMP session.** Ready and live endpoints use the same native OMP launch path, so an unattended endpoint can still be attached later without losing OMP's normal terminal interface.\n- **Inbound peer messages now arrive as ordinary OMP turns with full SPT context.** The visible prompt is a safe sender stub, while the complete event envelope is supplied to that turn as context; peer text cannot accidentally invoke a slash command.\n- **OMP profile-aware session tools.** History, digest, echo-commune, and Psyche session lookup now follow OMP's profile and configuration precedence, including deterministic exact-id and prefix handling.\n\n### Changed\n- **The adapter is now OMP-native only.** The inherited Claude Code plugin, hooks, CCS profiles, worker topology, headless RPC bridge, and message-idle translation path are removed. `omp-spt` advertises ReadyAgent and LiveAgent only; Worker remains an intentional capability opt-out.\n- **Fresh, resumed, and daemon-driven turns validate the real Oh My Pi executable before launch.** Explicit overrides, known install paths, and PATH candidates all receive the same identity probe, so an unrelated `omp` command cannot become the hosted terminal.\n- **One endpoint stays bound to one OMP session for its lifetime.** In-TUI new, resume, fork, handoff, and branch actions are blocked; stop and relaunch the endpoint to select another native session.\n- **Commune and signoff drops now live under the project-local `.spt/` directory.** The old harness-specific continuity path is no longer used.\n\n### Fixed\n- **Accepted messages cannot disappear after an outbound reply failure.** Correlated outcomes retry within a finite budget; exhaustion shuts the endpoint down loudly instead of marking undelivered custody as settled.\n- **Bind, activity, and shutdown races no longer advertise the wrong endpoint state or leak a late listener.** Busy-before-bind is preserved, shutdown-before-bind tears down immediately, and concurrent fatal and lifecycle shutdowns share one bounded session-end sequence.\n- **Listener recovery now distinguishes crash loops from isolated failures.** Immediate repeated exits still fail closed, while a listener that remains stable resets its consecutive-failure budget.\n- **Echo-commune handles Unicode transcript boundaries safely.** A byte cap that lands inside a multi-byte character no longer crashes the summarizer.\n\n## [0.1.3] - 2026-07-13\n\n### Fixed\n- **Attached endpoints now show OMP's full native TUI.** Native `omp` is the broker PTY process, with SPT messaging supplied by a packaged OMP extension. The previous headless `omp --mode rpc` bridge could only display bridge logs, regardless of whether the endpoint command attached to its PTY.\n\n## [0.1.2] - 2026-07-10\n\n> Liaison bugfix rollup for the two Reavo-reported omp-spt v0.1.1 issues ([#2](https://github.com/BigscreenVR/omp-spt/issues/2), [#3](https://github.com/BigscreenVR/omp-spt/issues/3)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart omp endpoints.\n\n### Fixed\n- **The fresh-endpoint update guidance now keeps the harness terminal attached.** The update notice no longer tells operators to use `--start` for a new Librarian endpoint; the documented command uses attach-default `spt endpoint run --adapter omp-spt --id <id> --create`, so the bringup log (`bridge starting`, `omp ready`, `bound`, `listening`, `READY`) is visible instead of launching silently in the background.\n- **Adapter updates now use the authenticated GitHub CLI transport.** The repository is currently public, but the release fetch path is now auth-capable via `gh`, so a private or visibility-flipped repo can still discover and download `adapter.spt` through the user's existing GitHub authentication.\n\n## [0.1.1] - 2026-07-09\n\n> Hardening release, driven by a maintainer field report of a wedged endpoint (thanks doyle — [#1](https://github.com/BigscreenVR/omp-spt/pull/1)). Requires spt-core **v0.27.0 or newer** (unchanged). Update: `spt adapter update omp-spt`, then restart your omp endpoints.\n\n### Changed\n- **The endpoint process is now named `omp-spt`** (was `claude-spt`), so a task list tells you at a glance which adapter a process belongs to — no more misdiagnosing an omp endpoint as a Claude Code one.\n\n### Fixed\n- **Stopping an endpoint no longer leaves orphans.** The bridge now ties its omp and listener children to its own lifetime at the OS level: however the bridge dies — a stop, a crash, a hard kill — the whole tree goes down with it, and the perch is unregistered on the way out instead of advertising a dead endpoint as listening.\n- **A silent endpoint is now a diagnosable endpoint.** The attached terminal shows live operational output by default: bringup steps, one line per message in and reply out, every delivery/registration failure, and a periodic idle heartbeat — a working, idle, and broken endpoint each look different now.\n- **A hung bringup or turn can no longer wedge the perch forever.** Startup is bounded (a wrong or stalled `omp` fails loudly before the endpoint registers, so a failed bringup can't trap the endpoint on this adapter), and each turn has a deadline — on breach the perch recovers to idle and the sender is told the turn failed instead of receiving silence or an empty reply.\n- **A dead omp process is noticed immediately** (and the endpoint shuts down cleanly), not on the next message.\n\n## [0.1.0] - 2026-07-09\n\n> First release of **omp-spt**: host an [oh-my-pi (omp)](https://github.com/can1357/oh-my-pi) coding agent as a reachable spt endpoint. Requires spt-core **v0.27.0 or newer** and an installed `omp` CLI. Install: `spt adapter add --release BigscreenVR/omp-spt`.\n\n### Added\n- **Host omp as an spt endpoint.** `spt endpoint run --adapter omp-spt --id <id>` brings up a reachable omp agent: a message sent to its perch becomes an omp turn, and the answer goes back to the sender. Ask from anywhere on the subnet with `spt ring <id>`.\n- **Conversation memory across messages.** The endpoint holds one omp session for its lifetime, so follow-ups continue the same conversation; resuming an endpoint reloads its prior session.\n- **Session digest.** `spt endpoint digest <id>` shows the endpoint's conversation as it happens — prompts, replies, and the tools omp used.\n- **Live-agent lifecycle.** A live omp endpoint gets a Psyche companion that carries its context across resets, and a session that ends without a signoff is auto-summarized so its context delta is kept anyway.\n- **OpenRouter billing guide.** `docs/OMP-OPENROUTER.md` covers routing the endpoint's model spend through OpenRouter using omp's own provider config — nothing to configure in the adapter itself.\n\n### Changed\n- **The adapter drives omp natively.** Unlike the Claude Code lineage it forked from, omp-spt talks to omp over omp's built-in control protocol: bringup is a single bridge process, with no hook or plugin installation inside the agent, and none of the injection limits that came with hook-based delivery.\n- **The skills namespace is `/omps:*`** (was `/sptc:*` in the lineage): setup, ready, live, send, commune, signoff, subnet, list-agents, force-stop, version.\n\n## [0.17.3] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **The message shortcut no longer cries \"not delivered\" when it actually delivered.** Sending with `@<peer …@>` would tell you the peer \"wasn't reachable\" even though the message had arrived — so you'd needlessly re-send by hand. The delivered/not-delivered confirmation is now correct. (Messaging to yourself was never affected.)\n\n### Changed\n- **Communes now file project detail under the project, not your permanent identity.** When you commune (or when a session is auto-summarized), detail specific to the project you're in is kept separate from your cross-project, standing context — so your durable memory stays clean and project notes don't bleed between projects. Wrap project detail in `<project-context>…</project-context>` and identity/role context in `<live-context>…</live-context>`; anything left untagged is treated as standing context.\n\n## [0.17.2] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **A message shortcut written as the last thing in a reply now actually sends.** Previously, if the `@<…@>` tag (or a `>>commune<<`) was the very last output of a turn — the normal \"fire it off and wait for a reply\" case — it wasn't delivered until you next did something, so a send-then-wait could hang. It's now delivered the moment the turn ends, for both live and daemon-hosted agents. Tags written mid-reply were unaffected and still work.\n\n## [0.17.1] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Takes effect on an endpoint's next start.\n\n### Fixed\n- **The message shortcut no longer fires when you're just *talking about* it.** In 0.17.0, writing an example of the `@<…@>` form in a reply — even wrapped in backticks — could actually send it. Now a tag only sends when written plainly; any tag inside inline-code (backticks) or a code block is treated as a quotation and ignored. Write a real send bare; show an example in backticks.\n\n## [0.17.0] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** for the feature — `spt adapter update claude-spt` is the whole update (the send-skill help note also refreshes if you reinstall the plugin skeleton). Takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n\n### Added\n- **Message another agent without leaving your train of thought — no shell command needed.** Write `@<alice hey, can you check the deploy? @>` anywhere in a reply and the adapter delivers \"hey, can you check the deploy?\" to `alice`, then tells you (in your next context) whether it landed or the agent wasn't reachable. Send to several at once with `@<alice,bob,carol …@>`. Only that exact `@<…@>` form sends, so you can still talk *about* the syntax without firing anything.\n- **Save a working-context note the same way.** Start a message with `>>commune<<` and the rest becomes your commune (the context hand-off that survives a reset) — the same result as writing the commune file by hand, without the file step. Include `!!checkpoint!!` in it to also reset-and-rebuild your context from that note.\n\n## [0.16.2] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update. Note: this heal rides the endpoint's background delivery process, so it takes effect on an endpoint's **next start** — restart (or re-launch) a daemon-launched endpoint to activate it on an already-running session.\n\n### Fixed\n- **A daemon-launched endpoint interrupted with Esc no longer goes deaf.** Pressing Esc to interrupt a running turn — whether a tool was mid-flight or the agent was just thinking — used to leave the endpoint looking online while silently queuing every incoming message, sometimes for many minutes, until the next thing you typed flushed the backlog. The endpoint now notices it's sitting at an interrupted prompt and returns itself to ready-to-receive within ~15 seconds, so queued messages are delivered. To recover an already-stuck endpoint immediately, send it any message once it's back at an idle prompt, or restart it.\n\n## [0.16.1] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). **Binary-only** — `spt adapter update claude-spt` is the whole update; no plugin reinstall or `/reload-plugins` needed.\n\n### Fixed\n- **Follow-up to 0.16.0: the interrupted-turn recovery now actually takes effect on daemon-launched endpoints.** In 0.16.0 the recovery could silently fail to register (an ownership-check mismatch), so an endpoint interrupted mid-turn could still stop receiving. It now reliably marks the endpoint ready-to-receive again after an interrupt. Also adds a local diagnostic log (`hook-trace.log`, next to the adapter binary) recording endpoint lifecycle events, to make this class of issue observable.\n\n## [0.16.0] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary; the new failure hooks require the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate them. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n\n### Fixed\n- **A daemon-launched endpoint no longer goes deaf after an interrupted or errored turn.** Pressing Esc during a running tool, or a turn that ends with an API error (rate limit, server error), used to leave the endpoint looking online while silently queuing every incoming message instead of delivering it — until the next thing you typed happened to flush the backlog. The endpoint now returns to ready-to-receive the moment such a turn ends, so messages are delivered right away. Anything queued in the meantime is delivered as soon as it goes ready — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's idle, or restart it.\n\n## [0.15.9] - 2026-07-08\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + plugin skeleton change. **Two-part update:** `spt adapter update claude-spt` picks up the binary fix; the new idle notification requires the refreshed plugin skeleton — reinstall the `sptc` plugin and run `/reload-plugins` (or restart Claude Code) to activate it. **Recommended for anyone running daemon-launched Claude Code endpoints.**\n\n### Fixed\n- **A daemon-launched endpoint that hasn't taken a turn yet no longer silently swallows every message sent to it.** A freshly-launched endpoint (or one whose only input so far was a client-side command like `/login`, which never produces a full turn) was treated as permanently busy, so incoming messages were queued and never delivered — the endpoint looked online and healthy while receiving nothing. Endpoints are now marked ready-to-receive as soon as they start, and re-marked ready whenever they return to an idle prompt, so messages are delivered instead of piling up. Any messages that were queued this way are delivered as soon as the endpoint next goes idle — nothing is lost. To recover an already-stuck endpoint immediately, send it any message once it's i…\n\n## [0.15.8] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Instruction-only change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect at the next endpoint launch; fully forward-safe on current spt-core and activates automatically once the matching spt-core release is deployed.\n\n### Added\n- **Opt-in delivery verification for messages injected into a session.** The adapter now enables spt-core's echo-verification belt for Claude Code sessions: because the Claude Code terminal re-renders text that is typed into it, spt-core can confirm an injected message actually landed. This is off by default in spt-core and the adapter now turns it on for Claude Code. It stays dormant on spt-core versions that don't yet support it and switches on by itself once a supporting spt-core is installed — no configuration and no forced upgrade.\n\n## [0.15.7] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed. Recommended for anyone who uses Claude Code's `/resume` on a daemon-launched endpoint.\n\n### Fixed\n- **Using Claude Code's `/resume` inside a daemon-launched endpoint no longer makes it silently unreachable.** When an endpoint launched by the spt daemon switched conversations with the in-app `/resume` command, its perch could quietly detach from the live session — the endpoint still looked healthy and running, but messages sent to it went nowhere and the failure was never surfaced. Resuming now re-attaches the perch to the resumed conversation correctly, and if the re-attach is ever rejected it is reported loudly instead of swallowed. If an endpoint got stranded this way, relaunching it without `/resume` restores delivery.\n\n## [0.15.6] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary + instruction change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n\n### Fixed\n- **A message whose delivery gets cut off mid-transmission can no longer vanish silently.** Previously, if an incoming message's delivery frame arrived truncated, it was quietly dropped — counted as delivered but never shown to the agent. Now the agent sees a clear marker with whatever partial content survived and a pointer to where the full message can be recovered, so a cut-off delivery is always visible instead of lost.\n\n### Changed\n- **Going live or ready in a daemon-launched session no longer starts a redundant listener.** A live agent or ready session that was launched by the spt daemon is already reachable through the broker — messages arrive on its turn automatically. Bringup now recognizes this kind of session and skips starting an extra in-session listener, which in that context could not receive anything anyway and only reported an error. Sessions you launch yourself are unaffected and still start their listener as before.\n\n## [0.15.5] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Completes the 0.15.4 Psyche repair for ccs-launched endpoints.\n\n### Fixed\n- **End-of-session summaries work for ccs-launched endpoints.** 0.15.4 fixed finding the session transcript, but the summarizer's own Claude run still failed for ccs-launched endpoints because it ran without the endpoint's ccs configuration (no auth). It now runs with the endpoint's own configuration, so end-of-session context capture works everywhere. Psyches affected by the earlier failures recover on their own at the next commune — no restart needed.\n\n## [0.15.4] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently** — inter-agent messages received while an agent is mid-task are silently lost without it. After updating, wake any endpoint whose Psyche shows a hosting error.\n\n### Fixed\n- **Messages delivered while an agent is busy actually reach the agent again.** A message arriving while the receiving agent was mid-task was consumed but never shown — the sender saw a successful send, the receiver saw nothing, and the message was gone. Every agent was affected. Mid-task deliveries now surface reliably.\n- **Psyches no longer shut down when a session's transcript can't be found.** The end-of-session summarizer (added in 0.15.2) treated a missing transcript as a fatal error, which after a few occurrences shut down the endpoint's whole Psyche — and it missed transcripts for every ccs-launched session because it looked in the wrong place. It now finds ccs session transcripts correctly, and when a transcript genuinely doesn't exist it records that fact and moves on instead of escalating.\n\n## [0.15.3] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. Takes effect immediately after the update — no session restarts needed.\n\n### Added\n- **Agents on a perch are now steered to run long tasks in the background.** Previously, agents routinely ran subagents and long commands in the foreground, which made them unreachable for incoming messages until the task finished. Every perched turn now carries a reachability notice reminding the agent to use background execution, with an extra targeted reminder right before a subagent launches — so agents stay responsive while work runs. (Ported from the legacy owl plugin, where this notice existed for the same reason.)\n\n## [0.15.2] - 2026-07-07\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.27.0+** — agent checkpoints and communes are broken without it. Restart affected live agents once after updating.\n\n### Fixed\n- **Agent checkpoints and communes work again on spt-core v0.27.0+.** Newer spt-core asks the adapter to summarize a session's history whenever a session ends without a signoff (and when syncing a commune). The adapter didn't provide that summarizer, so after a few attempts spt-core gave up on the whole Psyche — checkpoints did nothing, communes stopped reaching the agent's tracked mind, and the endpoint showed a Psyche hosting error. The adapter now ships the summarizer, so end-of-session context is captured and checkpoints fire normally again.\n\n### Added\n- **Sessions that end without a signoff now keep their context.** When a live agent's session ends abruptly (closed window, crash, no `/sptc:signoff`), spt-core now gets a concise summary of what the session was doing, ingested into the agent's tracked mind — so the next session resumes with that context instead of losing it.\n\n## [0.15.1] - 2026-07-06\n\n> Requires spt-core **v0.27.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. The same fix is also available as **v0.14.3** for nodes still on spt-core v0.25.0/v0.26.0.\n\n### Fixed\n- **A checkpoint's resume instruction can no longer get swallowed by the session-name restore.** Since 0.14.1, restoring the session name after a clear and delivering the checkpoint's resume instruction could occasionally collide: the resume text ended up inside the session's title, the agent never received it, and the session sat idle until someone noticed. The two now land as one carefully-paced delivery, so the name is restored and the resume instruction starts the agent every time. If an agent hit this, its session title contains the swallowed instruction — rename the session and resend the instruction to recover.\n\n## [0.15.0] - 2026-07-06\n\n> Requires spt-core **v0.27.0 or newer** (floor raised). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update spt-core first** (`spt update fetch` then `spt update apply`), then the adapter.\n\n### Fixed\n- **Subagent working perches no longer pile up as permanent offline entries.** Previously, every subagent an agent spawned left behind a dead worker perch that sat in your endpoint list forever and could never be cleaned up normally. With spt-core v0.27.0, worker perches now get proper names (like `flynn-w4` instead of a random hex string), stop cleanly when the subagent finishes, stay out of the default `spt endpoint list` view (pass `--workers` to see them), and any stragglers are reaped automatically within a day. If a worker can't be registered or stopped, the reason now appears in the session's hook log instead of failing silently.\n\n## [0.14.2] - 2026-07-06\n\n> Requires spt-core **v0.25.0 or newer** (unchanged). Manifest + binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change. **Update urgently if any live agents run on spt-core v0.25.0+** — their Psyches are broken without it.\n\n### Fixed\n- **A live agent's Psyche works again on spt-core v0.25.0+.** Since 0.14.0, every Psyche turn failed before it could start (a leftover reference to a setting the new Psyche lifecycle no longer provides), so a live agent's Psyche silently stopped producing context notes and resume briefs. The Psyche now runs its turns normally again. Recovery: update the adapter, then restart affected live agents once.\n\n## [0.14.1] - 2026-07-05\n\n> Requires spt-core **v0.25.0 or newer** (unchanged). Binary change — `spt adapter update claude-spt` picks it up; no plugin skeleton change.\n\n### Fixed\n- **Sessions keep their name across `/clear`.** Previously, running `/clear` (or an agent checkpoint, which clears internally) dropped the session's display name — the terminal lost its `<id> @ <node> (<project>/)` title and you could no longer tell at a glance which agent a window belonged to. The name is now automatically re-applied right after every clear, before the agent resumes work. Sessions started before this update keep the old behavior until they are restarted once.\n\n## [0.14.0] - 2026-07-04\n…\n\n…\n- **Invisible engine install.** Starting a session automatically installs the `spt` engine the first time if it is missing — no separate install step.","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,null,308,null,557]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\omp-spt\\CHANGELOG.md"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":558,"totalBytes":34620,"outputLines":300,"outputBytes":34620,"shownRange":{"start":1,"end":300},"nextOffset":301},"limits":{"columnTruncated":{"maxColumn":768}}}},"isError":false,"timestamp":1784514096315}}
{"type":"message","id":"bb06ee1e","parentId":"1fc5e1cf","timestamp":"2026-07-20T02:21:40.306Z","message":{"role":"assistant","content":[{"type":"toolCall","id":"call_F0N6GWKrwOekn6eCqO5O93Bs|fc_06c0efb83758881c016a5d8633bf6c819a9677e7028827d4d3","name":"read","arguments":{"i":"Inspecting extension tests","path":"tests/omp-extension.mjs"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9562,"output":29,"cacheRead":24320,"cacheWrite":0,"totalTokens":33911,"cost":{"input":0.047810000000000005,"output":0.00087,"cacheRead":0.012159999999999999,"cacheWrite":0,"total":0.060840000000000005}},"stopReason":"toolUse","timestamp":1784514096325,"responseId":"resp_06c0efb83758881c016a5d86308e14819a89081144bfd4b7b5","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"fc_06c0efb83758881c016a5d8633bf6c819a9677e7028827d4d3","type":"function_call","status":"completed","arguments":"{\"i\":\"Inspecting extension tests\",\"path\":\"tests/omp-extension.mjs\"}","call_id":"call_F0N6GWKrwOekn6eCqO5O93Bs","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"name":"read","metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}}]},"duration":3980.144699999997,"ttft":3410.795299999998,"contextSnapshot":{"promptTokens":33882,"nonMessageTokens":22961}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_F0N6GWKrwOekn6eCqO5O93Bs|fc_06c0efb83758881c016a5d8633bf6c819a9677e7028827d4d3","toolName":"read","startedAt":"2026-07-20T02:21:40.306Z","args":{"path":"tests/omp-extension.mjs"},"intent":"Inspecting extension tests"},"id":"667d0616","parentId":"bb06ee1e","timestamp":"2026-07-20T02:21:40.306Z"}
{"type":"message","id":"c52a0e71","parentId":"667d0616","timestamp":"2026-07-20T02:21:40.334Z","message":{"role":"toolResult","toolCallId":"call_F0N6GWKrwOekn6eCqO5O93Bs|fc_06c0efb83758881c016a5d8633bf6c819a9677e7028827d4d3","toolName":"read","content":[{"type":"text","text":"[omp-extension.mjs#265A]\n1:import assert from \"node:assert/strict\";\n…\n3:import {\n4:\tcreateOmpSpt,\n5:\tendpointDisplayName,\n6:\tendpointInlineStatus,\n7:\tformatInboundEnvelope,\n8:\tdecodeBody,\n9:\tdrainEvents,\n10:\tparsePeerShortforms,\n11:\trunSpt,\n12:} from \"../adapter/strings/omp-spt.mjs\";\n13:\n14:const flush = () => new Promise((resolve) => setImmediate(resolve));\n15-23:function deferred() { … }\n24:\n25:let nextAssistantTimestamp = 1;\n26-34:function assistantMessage(content, options = {}) { … }\n35:\n36-46:class FakeStream extends EventEmitter { … }\n47:\n48-75:class FakeChild extends EventEmitter { … }\n76:\n77-106:class FakeClock { … }\n107:\n108-321:function createHarness(options = {}) { … }\n322:\n323:function commandCalls(harness, command) {\n324:\treturn harness.calls.filter((call) => call.args[0] === command);\n325:}\n326:\n327:function stateCalls(harness) {\n328:\treturn harness.calls.filter((call) => call.args[0] === \"api\" && call.args[3] === \"state\");\n329:}\n330:\n331:\n332-338:function assertNoAgentManagedPoll(harness) { … }\n339:\n340:\n341-410:async function testParsing() { … }\n411:\n412:// [unit->REQ-OMP-SESSION-TITLES]\n413-439:async function testEndpointSessionNameAndAnimatedWindowTitle() { … }\n440:\n441:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n442:// [unit->REQ-OMP-SESSION-IMMUTABLE]\n443:// [unit->REQ-OMP-MESSAGE-CONTEXT]\n444:// [unit->REQ-OMP-NATIVE-TUI]\n445-578:async function testLifecycleCustodyAndContext() { … }\n579:\n580:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n581:// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\n582-614:async function testLocalAssistantOutputDoesNotReplyToPeer() { … }\n615:\n616-690:async function testDeferredBindLifecycleSerialization() { … }\n691:\n692:\n693:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n694-732:async function testSubmissionFailureAdvancesQueue() { … }\n733:\n734-760:async function testFailedIdleRecoveryFailsClosed() { … }\n761:\n762:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n763-802:async function testListenerRestartExhaustion() { … }\n803:\n804-848:async function testListenerStableIntervalResetsRetries() { … }\n849:\n850:\n851-896:async function testSessionEndRetriesAfterTransientFailure() { … }\n897:\n898-916:async function testHumanBusyFailureFailsClosed() { … }\n917:\n918:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n919:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n920-962:async function testShutdownReapsAndReleasesQueuedCustody() { … }\n963-1029:async function testRunSptRejectsStdinErrorsAndHungCommands() { … }\n1030:\n1031:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n1032-1081:async function testListenerTerminationEscalatesAndReaps() { … }\n1082:\n1083:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n1084:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n1085-1120:async function testProtocolCorruptionFailsClosed() { … }\n1121:\n1122:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n1123:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n1124-1166:async function testInboundQueueOverflowReleasesAcceptedCustody() { … }\n1167:\n1168:\n1169:// [unit->REQ-OMP-EXTENSION-CUSTODY]\n1170:// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\n1171-1197:async function testShutdownFallbackStaysBelowHostCap() { … }\n1198:\n1199:// [unit->REQ-PARITY-READY-ACTIVATION]\n1200:// [unit->REQ-PARITY-LIVE-ACTIVATION]\n1201-1316:async function testNativeActivationCommandsAndErrors() { … }\n1317:\n1318:// [unit->REQ-PARITY-READY-ACTIVATION]\n1319-1354:async function testNativeActivationSelectionAndCompletion() { … }\n1355-1390:async function testPlatformAwareActivationCandidatePaths() { … }\n1391:\n1392:\n1393:// [unit->REQ-PARITY-LIVE-AUTO-RESUME]\n1394-1473:async function testExplicitLiveAutoResume() { … }\n1474:\n1475:// [unit->REQ-PARITY-STARTUP-BRIEF]\n1476:// [unit->REQ-PARITY-TARGETED-HINTS]\n1477:// [unit->REQ-PARITY-UPDATE-NOTICE]\n1478-1624:async function testStartupBriefHintsAndUpdateNotices() { … }\n1625:\n1626:// [unit->REQ-PARITY-SAFE-BOUNDARY-DELIVERY]\n1627:// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\n1628-1680:async function testActiveTurnBoundaryDeliveryAndFallback() { … }\n1681:\n1682:// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\n1683-1718:async function testAbnormalTurnsRestoreReceivability() { … }\n1719:\n1720:\n1721-1755:async function testCompletionStopReasonGatesSideEffects() { … }\n1756:\n1757-1801:async function testCompactionPreservesLocalAssistantOutput() { … }\n1802:\n1803:// [unit->REQ-PARITY-PEER-SHORTFORM]\n1804-1941:async function testPeerShortformParsingAndDispatch() { … }\n1942:\n1943:// [unit->REQ-PARITY-CHECKPOINT]\n1944-2026:async function testNativeCheckpointTool() { … }\n2027:\n2028:await testParsing();\n2029:await testEndpointSessionNameAndAnimatedWindowTitle();\n2030:await testRunSptRejectsStdinErrorsAndHungCommands();\n2031:await testLifecycleCustodyAndContext();\n2032:await testLocalAssistantOutputDoesNotReplyToPeer();\n2033:await testDeferredBindLifecycleSerialization();\n2034:await testSubmissionFailureAdvancesQueue();\n2035:await testFailedIdleRecoveryFailsClosed();\n2036:await testListenerRestartExhaustion();\n2037:await testListenerStableIntervalResetsRetries();\n2038:await testSessionEndRetriesAfterTransientFailure();\n2039:await testHumanBusyFailureFailsClosed();\n2040:await testShutdownReapsAndReleasesQueuedCustody();\n2041:await testListenerTerminationEscalatesAndReaps();\n2042:await testProtocolCorruptionFailsClosed();\n2043:await testInboundQueueOverflowReleasesAcceptedCustody();\n2044:await testShutdownFallbackStaysBelowHostCap();\n2045:await testNativeActivationCommandsAndErrors();\n2046:await testNativeActivationSelectionAndCompletion();\n2047:await testPlatformAwareActivationCandidatePaths();\n2048:await testExplicitLiveAutoResume();\n2049:await testStartupBriefHintsAndUpdateNotices();\n2050:await testActiveTurnBoundaryDeliveryAndFallback();\n2051:await testAbnormalTurnsRestoreReceivability();\n2052:await testCompletionStopReasonGatesSideEffects();\n2053:await testCompactionPreservesLocalAssistantOutput();\n2054:await testPeerShortformParsingAndDispatch();\n2055:await testNativeCheckpointTool();\n2056:\n2057:console.log(\"OMP-EXTENSION OK\");\n\n[…1865ln elided; re-read needed ranges, e.g. tests/omp-extension.mjs:2-2,15-23]"}],"details":{"displayContent":{"text":"import assert from \"node:assert/strict\";\n…\nimport {\n\tcreateOmpSpt,\n\tendpointDisplayName,\n\tendpointInlineStatus,\n\tformatInboundEnvelope,\n\tdecodeBody,\n\tdrainEvents,\n\tparsePeerShortforms,\n\trunSpt,\n} from \"../adapter/strings/omp-spt.mjs\";\n\nconst flush = () => new Promise((resolve) => setImmediate(resolve));\nfunction deferred() { … }\n\nlet nextAssistantTimestamp = 1;\nfunction assistantMessage(content, options = {}) { … }\n\nclass FakeStream extends EventEmitter { … }\n\nclass FakeChild extends EventEmitter { … }\n\nclass FakeClock { … }\n\nfunction createHarness(options = {}) { … }\n\nfunction commandCalls(harness, command) {\n\treturn harness.calls.filter((call) => call.args[0] === command);\n}\n\nfunction stateCalls(harness) {\n\treturn harness.calls.filter((call) => call.args[0] === \"api\" && call.args[3] === \"state\");\n}\n\n\nfunction assertNoAgentManagedPoll(harness) { … }\n\n\nasync function testParsing() { … }\n\n// [unit->REQ-OMP-SESSION-TITLES]\nasync function testEndpointSessionNameAndAnimatedWindowTitle() { … }\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-OMP-SESSION-IMMUTABLE]\n// [unit->REQ-OMP-MESSAGE-CONTEXT]\n// [unit->REQ-OMP-NATIVE-TUI]\nasync function testLifecycleCustodyAndContext() { … }\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\nasync function testLocalAssistantOutputDoesNotReplyToPeer() { … }\n\nasync function testDeferredBindLifecycleSerialization() { … }\n\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\nasync function testSubmissionFailureAdvancesQueue() { … }\n\nasync function testFailedIdleRecoveryFailsClosed() { … }\n\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testListenerRestartExhaustion() { … }\n\nasync function testListenerStableIntervalResetsRetries() { … }\n\n\nasync function testSessionEndRetriesAfterTransientFailure() { … }\n\nasync function testHumanBusyFailureFailsClosed() { … }\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testShutdownReapsAndReleasesQueuedCustody() { … }\nasync function testRunSptRejectsStdinErrorsAndHungCommands() { … }\n\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testListenerTerminationEscalatesAndReaps() { … }\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testProtocolCorruptionFailsClosed() { … }\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testInboundQueueOverflowReleasesAcceptedCustody() { … }\n\n\n// [unit->REQ-OMP-EXTENSION-CUSTODY]\n// [unit->REQ-OMP-LISTENER-FAIL-CLOSED]\nasync function testShutdownFallbackStaysBelowHostCap() { … }\n\n// [unit->REQ-PARITY-READY-ACTIVATION]\n// [unit->REQ-PARITY-LIVE-ACTIVATION]\nasync function testNativeActivationCommandsAndErrors() { … }\n\n// [unit->REQ-PARITY-READY-ACTIVATION]\nasync function testNativeActivationSelectionAndCompletion() { … }\nasync function testPlatformAwareActivationCandidatePaths() { … }\n\n\n// [unit->REQ-PARITY-LIVE-AUTO-RESUME]\nasync function testExplicitLiveAutoResume() { … }\n\n// [unit->REQ-PARITY-STARTUP-BRIEF]\n// [unit->REQ-PARITY-TARGETED-HINTS]\n// [unit->REQ-PARITY-UPDATE-NOTICE]\nasync function testStartupBriefHintsAndUpdateNotices() { … }\n\n// [unit->REQ-PARITY-SAFE-BOUNDARY-DELIVERY]\n// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\nasync function testActiveTurnBoundaryDeliveryAndFallback() { … }\n\n// [unit->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY]\nasync function testAbnormalTurnsRestoreReceivability() { … }\n\n\nasync function testCompletionStopReasonGatesSideEffects() { … }\n\nasync function testCompactionPreservesLocalAssistantOutput() { … }\n\n// [unit->REQ-PARITY-PEER-SHORTFORM]\nasync function testPeerShortformParsingAndDispatch() { … }\n\n// [unit->REQ-PARITY-CHECKPOINT]\nasync function testNativeCheckpointTool() { … }\n\nawait testParsing();\nawait testEndpointSessionNameAndAnimatedWindowTitle();\nawait testRunSptRejectsStdinErrorsAndHungCommands();\nawait testLifecycleCustodyAndContext();\nawait testLocalAssistantOutputDoesNotReplyToPeer();\nawait testDeferredBindLifecycleSerialization();\nawait testSubmissionFailureAdvancesQueue();\nawait testFailedIdleRecoveryFailsClosed();\nawait testListenerRestartExhaustion();\nawait testListenerStableIntervalResetsRetries();\nawait testSessionEndRetriesAfterTransientFailure();\nawait testHumanBusyFailureFailsClosed();\nawait testShutdownReapsAndReleasesQueuedCustody();\nawait testListenerTerminationEscalatesAndReaps();\nawait testProtocolCorruptionFailsClosed();\nawait testInboundQueueOverflowReleasesAcceptedCustody();\nawait testShutdownFallbackStaysBelowHostCap();\nawait testNativeActivationCommandsAndErrors();\nawait testNativeActivationSelectionAndCompletion();\nawait testPlatformAwareActivationCandidatePaths();\nawait testExplicitLiveAutoResume();\nawait testStartupBriefHintsAndUpdateNotices();\nawait testActiveTurnBoundaryDeliveryAndFallback();\nawait testAbnormalTurnsRestoreReceivability();\nawait testCompletionStopReasonGatesSideEffects();\nawait testCompactionPreservesLocalAssistantOutput();\nawait testPeerShortformParsingAndDispatch();\nawait testNativeCheckpointTool();\n\nconsole.log(\"OMP-EXTENSION OK\");","startLine":1},"summary":{"lines":158,"elidedSpans":36,"elidedLines":1865},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\omp-spt\\tests\\omp-extension.mjs"}}},"isError":false,"timestamp":1784514100334}}
{"type":"message","id":"dd2c7c1d","parentId":"c52a0e71","timestamp":"2026-07-20T02:21:44.178Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_IgdLBYknMrvHLQBCUDaS6K0L|fc_06c0efb83758881c016a5d86379620819a8de66e924fcdd4de","name":"bash","arguments":{"i":"Checking send syntax","command":"spt how-to send","cwd":"C:/Users/decid/Documents/projects/omp-spt","timeout":30}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":2151,"output":91,"cacheRead":33536,"cacheWrite":0,"totalTokens":35778,"reasoningTokens":42,"cost":{"input":0.010755,"output":0.0027300000000000002,"cacheRead":0.016767999999999998,"cacheWrite":0,"total":0.030253}},"stopReason":"toolUse","timestamp":1784514100377,"responseId":"resp_06c0efb83758881c016a5d8634b074819ab380914d6a956d58","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_06c0efb83758881c016a5d86368b58819aa680e517951b3bac","type":"reasoning","content":[],"encrypted_content":"gAAAAABqXYY3vcTCkMj8qedUz1tfLTOKBza7Skqc6Wb8hBCXUztIDr9cXNs2cCkTwn_nlewls01jmIPt0t_bIvrqSx1sHtm2F9gXnBCgvLIoWYMjOChHrE5kPa5zCGECrwW1kgzyl0HDo0T55v9bNEpzhUwLNwvBii7V6DEI7cZ2HRtBGcC7lDG_yycggc_0bd5St5RqboLUjM4pICz9y4ilQ_WzZGfhxoZsK_1YsQ_h0VFgR7MamC-qZ4XoJOwe1bZ3O_weKlH4wS6ilZdcr26oafujb7XJP9LFdR7h2p0BRwa2K6EF6y1D24kJjaRDPzOl9XsUSnvOOfpefQJ_bwEjSRkisfeBJ1uuUf0amTuc60AiG1N97FY_Q-XGhVaJYKUhZJAMkn9Z7FtPi86yK53powH8aIe4g1u98XhINCGJ5ToXdrdri8KvvT0r4jB6y4vo-_Bhcwwtgbc29OJl0hdDuLbNpCudxWWSOFFWB0gS81PT3Z_7yKW7WkE1IUPebMinKi7rtBxx3mjQoFiJs-bBnp9Oczf914xBiPGL5qyOdIYx_cr43-KgwHUll_HKz13rPkwLWpAHUuFggHvTD5TeZ-9FxWu1maCQJbYIov2EhnVLjC-8AN4Mw5n40_SXMmtPF99gUB-b4NKs9QxBjRTEkDoSTgG0OjyNkqevkP3MU6T33YoHADapaQZGPcUBG7T1DyRcWHA-3dtEMmxuYgYWYjp8XF20CGCNGUhOh9pSbqSnrOD8hKQn4L2myn2VCesRCkqOPiMG5sP7c_RJhVm9mg41banoqh0HQeClhtzd2h4bPBWXnrCsJMidSP1uHj2SnJdQ-SV-3wEWLEUDPxh7E99z9HBC2OQHhLM8OeO825Ys6vWKmQpZ2o-Fgb9D_nWKlMhpHUyn_XzxpBtLmYlo9w-htap8leYNXIiREZg7TYDJow5cnZKvzmBTGU8D_7sBZNvBqq4zP-WAkoYGTE3TE77cC9etu3wLSV2ln5J67dAdxA-UFHV7pJFGxvd3xp5zSyjklKIiK_FVkMT4sRoL8cBln6HA0QVpJxjIXUPWYmBznTb4Ep_zNmt0Dgu-IfI4XwSRXF2SYQ4GlWglMiQhIVOC8w7C_TjvOi1Thtkj048fckt8E8RJOZz-0qbxMXUkKvoIMcqd","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"summary":[],"metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}},{"id":"fc_06c0efb83758881c016a5d86379620819a8de66e924fcdd4de","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking send syntax\",\"command\":\"spt how-to send\",\"cwd\":\"C:/Users/decid/Documents/projects/omp-spt\",\"timeout\":30}","call_id":"call_IgdLBYknMrvHLQBCUDaS6K0L","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"name":"bash","metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}}]},"duration":3799.388500000001,"ttft":2154.5777000000016,"contextSnapshot":{"promptTokens":35687,"nonMessageTokens":22961}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_IgdLBYknMrvHLQBCUDaS6K0L|fc_06c0efb83758881c016a5d86379620819a8de66e924fcdd4de","toolName":"bash","startedAt":"2026-07-20T02:21:44.179Z","args":{"command":"spt how-to send"},"intent":"Checking send syntax"},"id":"bcf1675d","parentId":"dd2c7c1d","timestamp":"2026-07-20T02:21:44.179Z"}
{"type":"message","id":"8075c920","parentId":"bcf1675d","timestamp":"2026-07-20T02:21:44.345Z","message":{"role":"toolResult","toolCallId":"call_IgdLBYknMrvHLQBCUDaS6K0L|fc_06c0efb83758881c016a5d86379620819a8de66e924fcdd4de","toolName":"bash","content":[{"type":"text","text":"how-to: send — deliver messages\n\nFire-and-forget (the body is read from stdin):\n\n    spt send <target>\n\n- SENT:<target>   — delivered live to a listening agent.\n- QUEUED:<target> — the target is not listening; the message spooled and\n  drains when it next runs spt ready. QUEUED is success, not an error — do\n  not retry.\n\nReply to a message you received: send to its from — there is no reply mode,\nreply-correlation rides the structural from of the message you got:\n\n    spt send <sender>\n\nSend and block for the reply (body from stdin; the reply body prints to stdout):\n\n    spt ring <target> --timeout 60\n\n- TIMEOUT after the wait is exit 0 — the message still landed; the reply will\n  arrive on your listener instead.\n\nYour own sender id is auto-detected in most sessions; --from <id> overrides.\n\n\nWall time: 0.16 seconds"}],"details":{"timeoutSeconds":30,"wallTimeMs":164.73040000000037},"isError":false,"timestamp":1784514104345}}
{"type":"message","id":"342ffc35","parentId":"8075c920","timestamp":"2026-07-20T02:22:07.575Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_fgDgqq5QBXiCoUblzgIJxAdP|fc_05ea514f072e3b1d016a5d8646cf60819b897cd312438f05c7","name":"bash","arguments":{"i":"Sending smoke completion","command":"printf 'FIRST-SMOKE-DONE' | spt send emphasys","cwd":"C:/Users/decid/Documents/projects/omp-spt","timeout":30}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":1438,"output":92,"cacheRead":34560,"cacheWrite":0,"totalTokens":36090,"reasoningTokens":33,"cost":{"input":0.00719,"output":0.00276,"cacheRead":0.01728,"cacheWrite":0,"total":0.02723}},"stopReason":"toolUse","timestamp":1784514104395,"responseId":"resp_05ea514f072e3b1d016a5d86389a30819b8a5da2c2263fabe6","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_05ea514f072e3b1d016a5d864600cc819b81a47388660c7fdc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqXYZGQOloV-t48vxa8fLe5TzQl5n4vLl_TJBRvfS65anT7yE90u5U09rG9RF9gcXOO35U_q8H5amQb7xjL8kvfHBt3pH-_In2HVJBhjV4UnezAVH3rYZ65cT8TBNDVv6Q86T7mNOfOp7wNArOsD8iL3eJbfDFwdJ7Tyi5TRrvuW4DbqCMVQd9KjbY2GDGKpQEucCYNHq2zUboC5XR1kng43TznIBzaiISa2TdJPvM4eHaBUI7LRLaq4ceRd1DXk4NOFrFppRv2jS9AlHnjN_bM-y0J9lXFugAZHlTU-Lru7dur1E87ahv1Owwp2MrU9OEjV3V9-daPmHkBI2tIWxdJoWgoLbJc9G8KlDSzpW2DjOjp0Ow1E38PRw38ZcFIPXQkMz1N7CQqFiAlLlF8GNkBqzUSP6Z6RxcnZ9RosjToBfnAKX1hC5dkzjOqPMHPoiUiw_bXAnjrReUqkRneJmjSgxRgnGTDiiFRbjLxXdEIK_fTqRlrNWexNJ_KD9y6H6_VrI45i2n3lXsF4QztkC2WHRfkrFLMOO7-0WvUBkagPiPM8BNKDK_FUnjbgpm5uss3qGqHE-9NUi6fFHwOgY9QRT5KluKUqZsl39HWONg9oglJt3m8-sKx_HEeLZ6ImjRKk6U6UCf4sGGsjCF4FaT3LiQRti8Z6SarAH5A83MjdODRpl7LZNz0YJVL0Wi30d_dX0wOLcBFLMC-PGHghKIEnBSQJx9Ag2tRQjsanpngXNx3eqYkDT1ZDznFkzwHFDrzLCyMHqNhGKLOkRkS1786wIMuTUaCytS3BzJlEC7z45Fi2wVTuxci3AFriYhX6xb5OhCjFRA4V1yH7kMSmzrfuJlgEK8XkW_7m_DHy83LXcKDUtQg-4p61OAyT00XLG37yLnZ4YWVxRj6h_Vl-Ah9x72k8erjofMA0YypHnbgtM7iIBLV4cVKIzLIB2AhskNyPOVyZwAgfycE7vB5hEM2aHuM6qFXshi6LS1rK7sk7h0vxd6GnP3hsEB_Nr0XNRAGg5Kc0hhUNgQAz3oAIRnK6KKbqirOkyAGy63jtUiCHQkkWCs__pVQN9imsYBqxr2UVqtxt1job1UF6iFmPYYXDJoSw==","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"summary":[],"metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}},{"id":"fc_05ea514f072e3b1d016a5d8646cf60819b897cd312438f05c7","type":"function_call","status":"completed","arguments":"{\"i\":\"Sending smoke completion\",\"command\":\"printf 'FIRST-SMOKE-DONE' | spt send emphasys\",\"cwd\":\"C:/Users/decid/Documents/projects/omp-spt\",\"timeout\":30}","call_id":"call_fgDgqq5QBXiCoUblzgIJxAdP","internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"name":"bash","metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}}]},"duration":23179.935899999997,"ttft":13593.1034,"contextSnapshot":{"promptTokens":35998,"nonMessageTokens":22961}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fgDgqq5QBXiCoUblzgIJxAdP|fc_05ea514f072e3b1d016a5d8646cf60819b897cd312438f05c7","toolName":"bash","startedAt":"2026-07-20T02:22:07.575Z","args":{"command":"printf 'FIRST-SMOKE-DONE' | spt send emphasys"},"intent":"Sending smoke completion"},"id":"4ff784e0","parentId":"342ffc35","timestamp":"2026-07-20T02:22:07.575Z"}
{"type":"message","id":"71588ef2","parentId":"4ff784e0","timestamp":"2026-07-20T02:22:07.613Z","message":{"role":"toolResult","toolCallId":"call_fgDgqq5QBXiCoUblzgIJxAdP|fc_05ea514f072e3b1d016a5d8646cf60819b897cd312438f05c7","toolName":"bash","content":[{"type":"text","text":"SENT:emphasys\n\n\nWall time: 0.03 seconds"}],"details":{"timeoutSeconds":30,"wallTimeMs":33.237600000000384},"isError":false,"timestamp":1784514127613}}
{"type":"message","id":"b26cdff4","parentId":"71588ef2","timestamp":"2026-07-20T02:22:12.010Z","message":{"role":"assistant","content":[{"type":"text","text":"Sent `FIRST-SMOKE-DONE` to `emphasys`.","textSignature":"{\"v\":1,\"id\":\"msg_02b8d8f915c76a1b016a5d865366d08199b871eeff502f63fe\",\"phase\":\"final_answer\"}"}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":532,"output":19,"cacheRead":35584,"cacheWrite":0,"totalTokens":36135,"cost":{"input":0.00266,"output":0.00057,"cacheRead":0.017792,"cacheWrite":0,"total":0.021022}},"stopReason":"stop","timestamp":1784514127664,"responseId":"resp_02b8d8f915c76a1b016a5d864fec748199b54199bf436686ec","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"msg_02b8d8f915c76a1b016a5d865366d08199b871eeff502f63fe","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Sent `FIRST-SMOKE-DONE` to `emphasys`."}],"internal_chat_message_metadata_passthrough":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"},"phase":"final_answer","role":"assistant","metadata":{"turn_id":"c46cebed-33f4-415a-8082-ce51db74b821"}}]},"duration":4345.719799999999,"ttft":3723.4084999999977,"contextSnapshot":{"promptTokens":36116,"nonMessageTokens":22961}}}
{"type":"message","id":"5f5d39b5","parentId":"b26cdff4","timestamp":"2026-07-20T02:22:12.070Z","message":{"role":"user","content":[{"type":"text","text":"<msg from=\"emphasys\"/>"}],"steering":true,"attribution":"user","timestamp":1784514132067}}
{"type":"message","id":"bc66d839","parentId":"5f5d39b5","timestamp":"2026-07-20T02:22:17.275Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_VpBhneXstthIzkDS2c8miiZn|fc_02cb7f040929251b016a5d865852f8819b8b65c47291b3262c","name":"bash","arguments":{"i":"Answering context probe","command":"printf 'ACTIVE-CONTEXT-OK' | spt send emphasys","cwd":"C:/Users/decid/Documents/projects/omp-spt","timeout":30}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":12908,"output":68,"cacheRead":23296,"cacheWrite":0,"totalTokens":36272,"reasoningTokens":8,"cost":{"input":0.06454,"output":0.00204,"cacheRead":0.011647999999999999,"cacheWrite":0,"total":0.07822799999999999}},"stopReason":"toolUse","timestamp":1784514132116,"responseId":"resp_02cb7f040929251b016a5d865493d8819ba08ae14d637fcf6f","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_02cb7f040929251b016a5d8657fb80819b829025a0e8728df0","type":"reasoning","content":[],"encrypted_content":"gAAAAABqXYZYnoerQu21Fwehk1BeoWT8gqdAYCOxVLxx5g8spPU9OQwx1-axiId8OBDmb3r2vHxDJ6txJY8wqoaQDAmINslgZxCkcWN8DWeR7x3gbxHlwJ3uTsr8nogpeZmpc4YGs1N9YD6dpS53NQxTbEeAiWZldhAP5F1t-SdFg7BKJo8BZXZ1OytmCrWF-Ul9zxHwy1uTaJN0i55CC722F7QydySnQ5Q9eOZWuQgMzmmil1lVGRz1Xt1geL9gKLJ0SYzTHc3r5EDGMjriEWvXwoRqSY26fcXgRhRRM7MMuMLch7uEzeDhg3CdzLzHP2d7yNm2qZCL0iRgOqZzRfAsIoNj4Z_0WAodBopwS2GaVgX_uIiIjcw8rznOeOgfS0GE_Mu32BoYIl-7sRgTIfOX--OrwanPI5N34bEqrPUrMU6L27KlOt0HZWGOscD4TYxaR-4nWmE568qriCmSFhr6cHixe1JQXJCozyy9DxAe4vp2em14H4skDplhBRWi7fyqDMys03pxzxFVY9879FguBshUVQgl4enVJh5_jfBpX8fFNSg0jfnKowlk-4SmLU9Jd-N60VUML7YsWGxaZMw61ad-4oScRf_qDmB7XnqDrjpjeHJ1hdaf2VnLNfdB1aALqD1waNYZv7lG4PI8x0s9WI-K6kPG502_-h57QRdU1oO2JSDYL6zNweFSh3rUpQ8j8E6xyWzBd2GyjzVAosWNKHUPyX8lwiTr460lK6xlRQbPA2699Xri_F6E7NYDplVrkvDf0NWTGae0wXrSQH0vXHKKIkLhWUyxyR33gDb5A2nw7U4SGRkLXasD9a-uuK81IKJv1Ir53Js_aEDlKsJc3vMP_5DJ3LzAN8As19Y2JlUulCcjDM3XBMcQ9zWkHGC7YG3pFAWJsMqRWXPAP8E-ktmJe9pvsqn0kyIsxXcR1qMrqcwl8BjPl3Aq6MpoqqdvqsRj-QLq","internal_chat_message_metadata_passthrough":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"},"summary":[],"metadata":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"}},{"id":"fc_02cb7f040929251b016a5d865852f8819b8b65c47291b3262c","type":"function_call","status":"completed","arguments":"{\"i\":\"Answering context probe\",\"command\":\"printf 'ACTIVE-CONTEXT-OK' | spt send emphasys\",\"cwd\":\"C:/Users/decid/Documents/projects/omp-spt\",\"timeout\":30}","call_id":"call_VpBhneXstthIzkDS2c8miiZn","internal_chat_message_metadata_passthrough":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"},"name":"bash","metadata":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"}}]},"duration":5158.691899999998,"ttft":3850.2962999999945,"contextSnapshot":{"promptTokens":36204,"nonMessageTokens":22961}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_VpBhneXstthIzkDS2c8miiZn|fc_02cb7f040929251b016a5d865852f8819b8b65c47291b3262c","toolName":"bash","startedAt":"2026-07-20T02:22:17.275Z","args":{"command":"printf 'ACTIVE-CONTEXT-OK' | spt send emphasys"},"intent":"Answering context probe"},"id":"9ebe9776","parentId":"bc66d839","timestamp":"2026-07-20T02:22:17.275Z"}
{"type":"message","id":"f64878c7","parentId":"9ebe9776","timestamp":"2026-07-20T02:22:17.323Z","message":{"role":"toolResult","toolCallId":"call_VpBhneXstthIzkDS2c8miiZn|fc_02cb7f040929251b016a5d865852f8819b8b65c47291b3262c","toolName":"bash","content":[{"type":"text","text":"SENT:emphasys\n\n\nWall time: 0.05 seconds"}],"details":{"timeoutSeconds":30,"wallTimeMs":46.71370000000752},"isError":false,"timestamp":1784514137322}}
{"type":"message","id":"9203873e","parentId":"f64878c7","timestamp":"2026-07-20T02:22:21.228Z","message":{"role":"assistant","content":[{"type":"text","text":"Sent `ACTIVE-CONTEXT-OK` to `emphasys`.","textSignature":"{\"v\":1,\"id\":\"msg_0cc4d96216219f81016a5d865bb61081999629fa25ff0d6712\",\"phase\":\"final_answer\"}"}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":714,"output":19,"cacheRead":35584,"cacheWrite":0,"totalTokens":36317,"cost":{"input":0.0035700000000000003,"output":0.00057,"cacheRead":0.017792,"cacheWrite":0,"total":0.021932}},"stopReason":"stop","timestamp":1784514137375,"responseId":"resp_0cc4d96216219f81016a5d8659a47c8199a1abace5fffdd404","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"msg_0cc4d96216219f81016a5d865bb61081999629fa25ff0d6712","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Sent `ACTIVE-CONTEXT-OK` to `emphasys`."}],"internal_chat_message_metadata_passthrough":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"},"phase":"final_answer","role":"assistant","metadata":{"turn_id":"37d0cf7c-791f-4410-9d11-0505f7354aba"}}]},"duration":3852.541000000012,"ttft":2343.929700000008,"contextSnapshot":{"promptTokens":36298,"nonMessageTokens":22961}}}
{"type":"custom","customType":"session_exit","data":{"reason":"sighup","kind":"signal","recordedAt":"2026-07-21T07:47:29.485Z"},"id":"922e0a27","parentId":"9203873e","timestamp":"2026-07-21T07:47:29.485Z"}
