{
  "summary": "# Cross-adapter feature-parity audit\n\n## Scope and evidence posture\n\n- Compared the current `omp-spt` checkout with `../spt-claude-code` using adapter manifests, plugin/skill definitions, helper-binary dispatch, harness dispatch, packaging scripts, test source, and public/product documentation.\n- Read-only investigation only. No files were changed, no project-wide commands were executed, and no tests were run. Test references below establish that coverage artifacts exist; they do **not** claim a passing result in this session.\n- Did not inspect `spt-core` source. Generic `spt` behavior is credited only where these repositories invoke or document its public CLI/manifest surfaces.\n- `Worker` endpoints are intentionally excluded from parity classification. Claude does implement them (`adapter/claude-spt.toml` `[adapter].hostable_types`, `[hooks.SubagentStart]`, `[hooks.SubagentStop]`; `tools/claude-spt/src/hook.rs::handle_subagent_start/handle_subagent_stop`), but they are filtered out by product decision.\n- Important classification rule from the direct comparison request: `omp-spt`’s own `docs/PARITY.md` says the sister plugin/hooks/CCS/skills were intentionally retired, but the new requested baseline excludes **only** workers. Therefore, absent sister surfaces are classified as **Missing in omp-spt / scope decision required**, not automatically excused as intentional differences. Harness-specific mechanisms are called an intentional difference only when both products expose the same normalized behavior.\n\n## Legend\n\n- **Parity** — same normalized user capability exists, even if command names or harness glue differ.\n- **Intentional harness difference** — same normalized capability, necessarily implemented or named through different harness-native primitives.\n- **Missing in omp-spt** — present and user-visible in Claude, absent from OMP’s implementation/public surface; prior OMP retirement language does not settle the new direct-parity scope.\n- **OMP-only** — user-visible OMP behavior with no equivalent located in Claude.\n\n# Evidence-backed normalized matrix\n\n## A. Installation, launch, lifecycle, sessions, and messaging\n\n| Normalized feature | Claude surface and implementation | OMP surface and implementation | Classification |\n|---|---|---|---|\n| Release install | `spt adapter add --release SaberMage/claude-spt`; `adapter/claude-spt.toml` `[update]`; `README.md` Install | `spt adapter add --release BigscreenVR/omp-spt`; `adapter/omp-spt.toml` `[update]`; `README.md` Install | **Parity** |\n| Adapter update | `spt adapter update claude-spt`; `[update]` plus `[update.post]` | `spt adapter update omp-spt`; `[update]` | **Parity** for adapter acquisition; Claude’s plugin reconciliation is a separate missing surface below |\n| Fresh endpoint create/run | `[session.self]` calls `claude-spt launch`; public route is `spt endpoint run`; helper `launch.rs::run` | `[session.self]` calls `omp-spt launch-omp`; canonical documented route `spt endpoint run --adapter omp-spt --id <id> --create`; `launch_omp.rs::run` | **Parity** |\n| Attached native harness TUI | Claude launch inherits broker PTY and starts Claude Code; launch helper also assigns display/remote-control names | OMP launch starts genuine OMP with packaged extension in broker PTY; native attach is documented as default | **Parity**, with **intentional harness difference** in native flags and naming |\n| Endpoint reattach | Claude manifest launch creates broker-held PTY and remote-control identity; `spt rc <id>` is the generic endpoint route described in launch comments/docs | `spt rc <id>` explicitly documented in `docs/PARITY.md` and native contract | **Parity** |\n| Native session resume | `[session.resume]` → `claude-spt launch --resume`; `launch.rs::cli_argv` emits Claude `-r` | `[session.resume]` → `omp-spt launch-omp --resume`; `launch_omp.rs::omp_argv` emits OMP `-r` | **Parity** |\n| Hostable ReadyAgent | Manifest advertises `ReadyAgent`; `/sptc:ready` can make a self-launched session reachable | Manifest advertises `ReadyAgent`; endpoint runs through the native OMP hosting path | **Parity** at endpoint-role capability; **missing OMP command/skill UX** is recorded separately |\n| Hostable LiveAgent | Manifest advertises `LiveAgent`; `/sptc:live`; `[session.psyche_*]` | Manifest advertises `LiveAgent`; same native endpoint plus `[session.psyche_*]` | **Parity** at endpoint-role capability; **missing OMP command/skill UX** separately |\n| Post-spawn session identity | `[identity] session_id_source = \"post_spawn\"`, `parent_ancestor_name = \"claude\"`; hook seed/bind/boundary | Same post-spawn source, ancestor `omp`; extension `session_start` obtains OMP session id and calls `api bind` | **Parity**, **intentional harness difference** in hook versus extension bind |\n| Endpoint-id injection | `[env.SPT_ENDPOINT_ID]`; launch helper carries identity into Claude | `[env.SPT_ENDPOINT_ID]`; native extension reads it | **Parity** |\n| Incoming message delivery | Hook/poll channel when active plus idle PTY translation/stubs for spt-hosted sessions; `hook.rs`, `translate.rs`, `[inject]`, `[message-idle-translation-binary]` | Extension starts authenticated `api listen`, parses `<EVENT>`, queues it, calls OMP `sendUserMessage`, and injects full envelope into turn context; `omp-spt.mjs::startListener`, `dispatchNext`, `injectEnvelope` | **Parity** in normalized delivery, **intentional harness difference** in mechanism |\n| Sender-preserving correlated response | Hook renderer preserves `from`; skill/brief replies through `spt send`; idle path preserves envelope | Extension keeps `event.from`, extracts the completed assistant response, and settles the outcome to the originating sender | **Parity** |\n| Explicit failure rather than silent empty reply | Claude hook/translation code has frame-integrity and delivery-heal paths; send status is classified | OMP explicitly returns failure text for submission rejection/no assistant response and fails closed if outcome delivery exhausts retries | **Parity** at outcome contract; OMP’s stronger serialized-custody guarantee is listed as OMP-only below |\n| Busy/idle activity | `UserPromptSubmit`/`PreToolUse` mark busy; `Stop`, failure, and notification handlers heal idle; manifest `[hooks.*]` and `hook.rs::dispatch` | Extension `agent_start` marks busy and `completeTurn` marks idle | **Parity**, **intentional harness difference** in activity events |\n| Delivery while a model turn is already active | `PreToolUse` polls `--include-deferred`, so a message can enter additional context while Claude is working | OMP extension deliberately queues the message and submits it only after the current OMP turn completes | **Missing in omp-spt** if “mid-turn reachability” is part of parity; otherwise a product-level semantic difference requiring a decision |\n| Graceful session end/shutdown | `SessionEnd` hook calls `api session-end`; `/sptc:signoff`/`endpoint shutdown`; spt-hosted translation process is lifecycle-managed | `session_shutdown` performs bounded teardown, returns failures for pending custody, ends session, terminates listener, and clears status | **Parity** |\n| Commune/signoff continuity drops | `[session] commune_dir/signoff_dir = \".claude\"`; skills author/use endpoint-qualified files | `[session] commune_dir/signoff_dir = \".spt\"` | **Parity**, **intentional harness difference** in project-local directory |\n| LiveAgent Psyche turns | `claude-spt psyche`; `[session.psyche_init]`/`[session.psyche_resume]`; exit 95 reseed contract | `omp-spt psyche-omp`; same role tables and exit-95 model | **Parity** |\n| End-without-signoff summarization | `claude-spt echo-commune`; `[session.echo_commune]` | `omp-spt echo-commune-omp`; `[session.echo_commune]` | **Parity** |\n| Opaque single-session history | `[history] strategy = \"fetcher\"`; `claude-spt history`; `history.rs::run` streams JSONL verbatim | Same fetcher strategy; `omp-spt history-omp`; `history_omp.rs::run` streams selected OMP JSONL verbatim | **Parity** |\n| Digest extraction | `[digest] strategy = \"fetcher\"`; `claude-spt digest`; Claude transcript mapper includes hook-delivered frames | Same strategy; `omp-spt digest-omp`; OMP message/tool mapper | **Parity**, with harness-native transcript parsing |\n| Immutable running endpoint/session binding | Claude has launch-time resume and boundary handling, but no located code that cancels every in-TUI session switch/branch | OMP extension registers `session_before_switch` and `session_before_branch`, returns `{ cancel: true }`, and warns that the SPT session must end first | **OMP-only** |\n| Bounded listener restart and fail-closed exhaustion | Claude has multiple receive-heal paths, but no equivalent adapter-owned authenticated listener restart budget was located | `omp-spt.mjs::handleListenerDeath/startListener/failClosed` retries with a finite schedule, resets the streak after a stable interval, then tears down loudly | **OMP-only** as an explicit adapter-owned guarantee |\n| Serialized accepted-message custody with queue/byte limits | Claude has transactional parked-message custody in hooks, but a different split pipeline | OMP extension owns one accepted queue/current record through submission, response, retry, or explicit failure; queue and byte overflow fail closed | **OMP-only** in this exact end-to-end native-turn form |\n\n## B. Commands, skills, hints, and convenience UX\n\nClaude ships **11** plugin commands under `plugin/sptc/skills/*`: `live`, `ready`, `send`, `commune`, `signoff`, `setup`, `role`, `list-agents`, `subnet`, `force-stop`, and `version`. Eight have file-backed `[strings.skills]` bodies (`setup`, `ready`, `version`, `list-agents`, `force-stop`, `subnet`, `role`, `live`); `send`, `commune`, and `signoff` are supplied through plugin stubs plus proactive SessionStart/live-operation briefs rather than UPS lookup. OMP has no current skill directory, no `[strings.skills]`, no `[[hints]]`, and no plugin artifact; `adapter/omp-spt.toml` has only `[strings].adapter_label`.\n\n| User intent/surface | Claude | OMP | Classification |\n|---|---|---|---|\n| Namespaced harness command surface | `/sptc:*` plugin namespace, skill metadata, triggers, and argument hints | No `/omps:*`, `/spt:*`, or other adapter namespace in current implementation | **Missing in omp-spt — scope decision required**. `docs/PARITY.md` calls it retired, but the direct parity baseline excludes only workers |\n| Ready this already-open harness session | `/sptc:ready [<id>] [--once]`; persistent Monitor listener; `spt ready` | Native OMP endpoints can be ReadyAgent, but no OMP skill/command was found for upgrading an already-open ordinary OMP session | **Missing in omp-spt** at command/skill surface |\n| Make/resume this session live | `/sptc:live [<id>] [--auto]`; distinguishes self-launched from spt-hosted sessions, resolves previous identity, downloads Psyche context | Native endpoint supports LiveAgent/Psyche, but there is no OMP in-session live skill or `--auto` resume UX | **Missing in omp-spt** at command/skill surface |\n| Send/reply skill | `/sptc:send <target>`; stdin body; `spt send`/`spt ring` guidance | Generic public `spt send`/`spt ring` remains usable, and inbound native reply is implemented; no OMP skill wrapper | **Missing in omp-spt** as adapter UX; underlying core CLI capability is parity |\n| Roster skill | `/sptc:list-agents [--show-all] [--workers] [--detail]` → `spt endpoint list` | Generic `spt endpoint list` belongs to core and is linked generically, but no OMP skill | **Missing in omp-spt** as adapter UX; ignore the worker option under the explicit exclusion |\n| Force-stop skill | `/sptc:force-stop [<id>]` → graceful `endpoint shutdown` or lighter `stop` | Generic stop/shutdown is documented for updates, but no OMP skill wrapper | **Missing in omp-spt** as adapter UX |\n| Version skill | `/sptc:version` reports spt plus registered adapter version-of-truth | OMP release docs use `spt adapter version omp-spt`, but no OMP skill | **Missing in omp-spt** as adapter UX |\n| Subnet skill | `/sptc:subnet [status|create|show-code|join]`, pairing/elevation guidance | OMP delegates subnet ownership/documentation to spt-core and has no skill or OMP-specific onboarding | **Missing in omp-spt** as user-facing adapter surface; transport capability may still exist through generic core |\n| Commune skill | `/sptc:commune [--checkpoint]`; writes `.claude/<id>-commune.md` and explains live-only use | `.spt` commune drop is configured, but no OMP command/skill teaches or performs it | **Missing in omp-spt** at command/skill surface |\n| Signoff skill | `/sptc:signoff`; optional final summary, then graceful shutdown | `.spt` signoff drop and endpoint shutdown exist, but no OMP signoff skill | **Missing in omp-spt** at command/skill surface |\n| Durable role editor | `/sptc:role [directive] [--include-desc]`; reads/overwrites role and can round-trip a draft through the live input box | No OMP skill, hook/extension directive, or documented role-edit flow found | **Missing in omp-spt** |\n| Mid-session setup/repair | `/sptc:setup` installs spt-core when absent, activates adapter, sets active adapter, checks optional CCS and subnet | OMP has manual prerequisite/install docs and explicitly no plugin bootstrap | **Missing in omp-spt** under direct surface parity; whether manual native installation is sufficient is a scope decision |\n| Keyword hints | Manifest `[[hints]]` covers live, identity, messaging, subnet, checkpoint; hook `skill_key`/hint flow surfaces them | No `[[hints]]` and no extension-native equivalent | **Missing in omp-spt** |\n| SessionStart briefs | Claude composes identity, messaging, live operations, roster, and work-discipline blocks from `[strings.briefs]` | No comparable adapter-authored startup brief was located | **Missing in omp-spt** |\n| Output shortform peer messaging | Bare `@<target[,target] body @>` in assistant output; `tag_scan.rs::parse_tag_sections/plan_dispatch`; confirmation returns to context | No output scanner or equivalent OMP extension path | **Missing in omp-spt** |\n| Output shortform commune | `tag_scan.rs` still implements leading `>>commune<<`, though current agent-facing prose says it was retired as fragile | No equivalent | **Missing in omp-spt**, but Claude’s own public status is ambiguous/stale and must be settled before treating it as required parity |\n| Agent-driven checkpoint clear-and-wake | Commune `!!checkpoint!!` trigger; `PostToolUse`, self-send JSON, translation `commands_for_clear/commands_for_boundary`, `<wake/>` park/drain | No OMP checkpoint/reset skill or clear-and-wake choreography | **Missing in omp-spt**; exact `/clear` mechanics are Claude-specific, but the normalized “save context, reset, and auto-resume” product feature needs an explicit scope ruling |\n| In-input-box role edit choreography | Hook/translation structured `role_edit` directive and pending/failure contexts | No equivalent | **Missing in omp-spt** |\n| Update-available context nudge | Claude hook recognizes `spt-update` frames, compares versions, and emits an agent-facing `spt update apply` nudge | OMP has only adapter update messaging, not this hook-driven core-update nudge | **Missing in omp-spt** |\n| Failure/interrupt receive-heal hooks | Claude wires `PostToolUseFailure`, `Notification`, and `StopFailure`; `interrupt_watch.rs` repairs idle state after interrupt markers | No corresponding OMP hook surface or equivalent recovery behavior located | **Missing in omp-spt**, unless OMP-native events are shown to make these failure classes impossible |\n| CCS adapter profile | Shipped `claude-spt:ccs` overlay changes launch CLI while preserving transcript resolution through captured `CLAUDE_CONFIG_DIR` | No shipped OMP adapter profile overlay; OMP has native provider/profile configuration and an OpenRouter guide, but that is not the same user surface | **Missing in omp-spt / scope decision required**, not automatic parity |\n| OMP provider/profile routing | Claude’s adapter-specific alternative is CCS; Claude itself has its own model selection | OMP natively supports profile/provider routing; `docs/OMP-OPENROUTER.md` documents it as OMP configuration, not adapter code | **OMP-only at the named OMP configuration surface**; potentially an alternative to CCS, but equivalence is a product decision |\n\n## C. Manifest seams and helper command dispatch\n\n| Surface | Claude | OMP | Classification |\n|---|---|---|---|\n| Consolidated helper binary | `tools/claude-spt/src/main.rs::Sub/classify`: `digest`, `echo-commune`, `history`, `psyche`, `post-update`, `translate`, `hook`, `launch` | `tools/omp-spt/src/main.rs::Sub/classify`: `digest-omp`, `echo-commune-omp`, `history-omp`, `psyche-omp`, `launch-omp` | **Parity** for digest/history/psyche/echo/launch; names are an **intentional harness difference** |\n| Hook dispatcher helper | `claude-spt hook <event>` handles 11 Claude Code events; stale bare-event dispatch degrades safely in `main.rs` | No helper hook subcommand; native extension registers OMP events directly | Baseline lifecycle is an **intentional harness difference**, but extra hook-derived user features above are **missing** |\n| Idle translation helper | `claude-spt translate`; `[message-idle-translation-binary]` | No translation seam; extension calls native `sendUserMessage` | **Intentional harness difference** for baseline idle delivery |\n| Post-update helper | `claude-spt post-update`; `[update.post]` reconciles `sptc@cplugs` and optional CCS plugin state | No post-update command/table | **Missing in omp-spt** under direct sister-surface audit, though its purpose is tied to the absent plugin |\n| Manifest hook declarations | SessionStart, UserPromptSubmit, PreToolUse, Stop, SessionEnd, PostToolUse plus worker hooks; plugin additionally wires failure/notification events | No `[hooks.*]`; extension owns OMP events | Same core lifecycle is **intentional harness difference**; skill injection, checkpoint, mid-turn, and heal behaviors remain missing |\n| Inject/translation declaration | `[inject] activity/idle = [\"hook\"]`, `[message-idle-translation-binary]`, `SPT_INJECT_VERIFY_ECHO` | No `[inject]` or translation table | Baseline delivery is **intentional harness difference**; echo verification is **missing in omp-spt** as a declared capability |\n| Shipped profile/opaque strings | CCS profile, label, hook path, notice, 8 skill bodies, 5 briefs, 5 hints | Only `adapter_label`; no profiles/skills/briefs/hints | **Missing in omp-spt** except the basic label |\n| Real harness executable validation | Claude launch resolves `claude`/`ccs` on PATH and carries noninteractive flags; no adapter-enforced Claude version floor located | `launch_omp.rs` resolves override/known/PATH candidates, identity-probes `omp --version`, rejects collisions and OMP below 16.3.15 with update guidance | **OMP-only** |\n| Core compatibility floor | Claude manifest `min_spt_core_version = \"0.27.0\"` | OMP manifest `0.31.0` | **Intentional dependency difference**, but OMP has a materially higher installation prerequisite |\n\nHelper subcommands are printed by each helper’s `--help`, but they primarily serve manifest roles. Whether these count as supported end-user commands or internal-yet-visible adapter tooling is ambiguous and should be decided before freezing the public command inventory.\n\n## D. Packaging and platform/architecture support\n\n| Surface | Claude | OMP | Classification |\n|---|---|---|---|\n| One default fat `adapter.spt` | Root `manifest.toml` + shared `strings/` + target-specific `claude-spt` | Root `manifest.toml` + `strings/omp-spt.mjs` + target-specific `omp-spt` | **Parity** |\n| GitHub release updater | `[update] avenue = \"gh_release\"`, `transport = \"gh\"`, repo `SaberMage/claude-spt` | Same avenue/transport, repo `BigscreenVR/omp-spt` | **Parity** |\n| Windows x86_64 payload | `x86_64-pc-windows-msvc/claude-spt.exe` | `x86_64-pc-windows-msvc/omp-spt.exe` | **Parity** |\n| glibc Linux x86_64 payload | `x86_64-unknown-linux-gnu/claude-spt` | `x86_64-unknown-linux-gnu/omp-spt` | **Parity** |\n| musl Linux x86_64 payload | Current packer and archive test require/package `x86_64-unknown-linux-musl/claude-spt` | No musl target in packer, docs, or archive test | **Missing in omp-spt** platform target |\n| macOS payload | None in current packer | Explicitly absent | **Parity limitation**: neither packages macOS. Claude README’s “bash (macOS …)” is installer prose, not evidence of a usable adapter payload |\n| Arm64 payload | None found | Explicitly absent | **Parity limitation** |\n| Secondary plugin publication | cplugs skeleton with independent plugin version and structural update cadence | No plugin publication target | **Missing in omp-spt** under the direct surface comparison; whether native OMP should have any analogous extension/skill distribution channel is a scope decision |\n| Extension payload | Static Claude plugin supplies hooks/skill stubs; adapter archive supplies dynamic strings/helper | OMP archive directly supplies load-bearing native `strings/omp-spt.mjs` extension | **Intentional harness difference** for hosting glue; OMP lacks the command/skill distribution half |\n| Reload after update | Claude update reconciles plugin then tells active sessions to `/reload-plugins` or restart | OMP says no reload step; new endpoint bringup loads the extension, while existing endpoints must restart | **Intentional harness difference** |\n\n# Test/verification surface inventory (source inspected, not executed)\n\n## OMP\n\n- `tests/omp-extension.mjs` exercises event parsing, context injection, bind/state/reply lifecycle, deferred bind serialization, submission failure, outcome/session-end retry, listener restart/reset/exhaustion, protocol corruption, queue overflow, shutdown budgets, child termination, and pending-custody failures. Key named cases include `testLifecycleCustodyAndContext`, `testListenerRestartExhaustion`, `testProtocolCorruptionFailsClosed`, and `testInboundQueueOverflowReturnsAcceptedCustody`.\n- `tests/manifest-shortcut.sh` and `tests/native-launch-manifest.sh` pin exactly the two hostable roles, fresh/resume launch templates, `.spt` continuity paths, and Psyche role keys.\n- Rust tests under `tools/omp-spt/src/*` and `tools/omp-spt/tests/*` cover helper dispatch, OMP executable/version validation, fresh/resume argv, history/digest selection, profile-aware environment snapshots, echo-commune bounds/isolation, and Psyche reseed behavior.\n- `tests/adapter-archive.sh` uses deterministic PE/ELF fixtures and asserts exact two-target archive shape and executable Linux mode.\n- `docs/CI.md` requires real tagged native acceptance on both Win-x64 and Linux-x64 for fresh TUI, message/turn/reply, state transitions, resume/switch blocking, both non-worker roles, and shutdown. No committed per-release execution record was located, so this is a required procedure, not proof that v0.2.1 was executed here.\n\n## Claude\n\n- `tests/hooks-dispatch.sh` pins the static plugin routing for 11 Claude hook events and manifest/dispatch alignment.\n- `tools/claude-spt/src/hook.rs` has extensive unit tests around envelope rendering, skill lookup, registration branching, briefs, checkpoint detection, role editing, hook routing, custody staging, hints/update nudges, and failure recovery.\n- `translate.rs`, `tag_scan.rs`, `interrupt_watch.rs`, `launch.rs`, `post_update.rs`, transcript helpers, and Psyche helper all contain focused unit coverage.\n- `tests/skeleton-validate.sh`, `manifest-shortcut.sh`, `manifest-schema.sh`, and `adapter-archive.sh` cover plugin/install/archive structures.\n- Several integrations are opt-in or may skip. In particular, the archive test exits successfully after proving the packer refusal if any one of three real target binaries is absent; it does not then construct the archive. The real Claude acceptance harness in `ci/acceptance/run-acceptance.sh` proves a UserPromptSubmit hook fires, not the entire current feature set. `ci/psyche/live-relay-int.sh` is stale relative to the current run-to-completion Psyche design.\n\n## CI asymmetry\n\n- Neither checkout contains a `.github` workflow tree.\n- Claude’s `ci/run-gates.sh` includes a `docs-drift` gate backed by `ci/docs/check-docs.sh`; OMP’s `ci/run-gates.sh` has no mdBook/llms/docs-drift step.\n- OMP’s `docs/DOCS-STRATEGY.md` and `docs-site/README.md` claim docs are GitHub-Pages-published and CI-gated, but no hosted workflow or local docs gate is present. This is an implemented-process gap, not merely a recommendation.\n\n# Documentation claims versus implemented behavior\n\n## OMP documentation drift\n\n1. **Version drift:** current adapter/public README/changelog say 0.2.1 (`adapter/omp-spt.toml`, `README.md`, top of `CHANGELOG.md`), while `tools/omp-spt/Cargo.toml`, `docs-site/src/quickstart.md`, `docs/CI.md`, and `docs/RELEASE-RUNBOOK.md` still say 0.2.0. The packer validates the manifest and payload shape but has no manifest↔Cargo↔public-doc version consistency gate.\n2. **Docs-CI claim not implemented:** `docs/DOCS-STRATEGY.md` requires reproducible mdBook, generated references/exports, and CI drift checks; `ci/run-gates.sh` does none of these, and no `.github` workflow exists.\n3. **Current skill status:** `docs/PARITY.md` accurately says Claude plugin/CCS/`/sptc:*` were retired, while `docs/OMP-BRIDGE-FIELD-ISSUES.md` separately calls OMP skill distribution an **open public-contract gap**. Under the new only-workers-excluded audit, these documents do not resolve whether the missing skills should now be built.\n4. **Historical changelog warning:** older inherited entries mention an `/omps:*` skills namespace, but current native cutover code/manifests ship no skills. Treat those as historical, not current behavior.\n\n## Claude documentation drift\n\n1. `README.md` explicitly labels deeper docs outdated. `docs-site/src/introduction.md` and `quickstart.md` still describe an early build with skills “still being wired,” while current plugin/manifest/source implement the 11-skill surface and extensive hook logic.\n2. `docs/PARITY.md` says `send`/`commune`/`signoff` are full-fat plugin skills, but current manifest comments and thin stubs say their operative prose is proactively supplied by briefs/live body rather than `[strings.skills]`.\n3. `docs/RELEASE-RUNBOOK.md` still says only Windows-MSVC and Linux-GNU are recognized and a third triple must be separate. Current `ci/publish/package-adapter.sh`, `tests/adapter-archive.sh`, and manifest changelog implement Linux-musl as a third fat-archive target.\n4. The same runbook later says `--release` establishes no `[update]` route and that the manifest declares no `[update]`, contradicting the current manifest’s `[update]` and `[update.post]` and an earlier section of the runbook itself.\n5. Claude README labels a bash path “macOS / Linux / Git Bash on Windows,” but there is no Darwin binary in the adapter archive. At most this installs `spt`; it does not prove the adapter’s helper can run on macOS.\n6. Claude has intentionally distinct version numbers: adapter manifest 0.21.0, plugin skeleton 0.1.13, helper Cargo package 0.1.0. The runbook explicitly treats plugin and adapter versions as independent; unlike OMP’s 0.2.1/0.2.0 split, this is documented as a distribution model, though helper-version semantics remain less clear.\n\n# Gaps/asymmetries requiring a user grill before recommendations\n\n1. **What is the parity unit: capability, named command, or both?** OMP can receive/send/list/stop through native extension plus generic `spt`, but lacks all 11 adapter skills. The direct request says compare surfaces and excludes only workers, so this audit marks them missing. Confirm whether every normalized skill intent must have an OMP-native command/skill, or whether generic `spt` commands satisfy some rows.\n2. **Does the previous OMP native-cutover decision still stand?** `docs/PARITY.md` says plugin/CCS/skills/hooks are retired non-goals, while this comparison’s only explicit exclusion is workers and `docs/OMP-BRIDGE-FIELD-ISSUES.md` calls skill distribution open. Which decision supersedes which?\n3. **What should an OMP “skill” be?** Is the expected surface an OMP-native slash command, packaged agent instruction, startup brief, ordinary `spt` CLI documentation, or some combination? No proven OMP skill registration/distribution route exists in this repo.\n4. **Ready/live command semantics:** Is parity satisfied because an OMP endpoint can be created with either hostable type, or must an already-open native OMP session support `ready`/`live` upgrades and Claude’s `--once`/`--auto` conveniences?\n5. **Active-turn reachability:** Claude injects at `PreToolUse`; OMP serializes and waits for the active turn to end. Is mid-turn interruption a required product capability, or is ordered turn-boundary delivery the desired OMP behavior?\n6. **Checkpoint continuity:** Must OMP offer the normalized “write commune, reset context, wake and continue automatically” feature? If yes, its implementation should be OMP-native rather than cloning Claude’s `/clear` PTY choreography.\n7. **CCS versus OMP provider profiles:** Does OMP’s native provider/profile system count as normalized parity for alternate model/account routing, or is a shipped SPT adapter overlay comparable to `claude-spt:ccs` required?\n8. **Shortform output actions:** Are `@<…@>` peer sends, role-editor round-trip, and output commune/checkpoint markers first-class cross-harness product features or Claude-only ergonomics? Note that Claude’s output-commune implementation remains present while current prose says it was retired.\n9. **Startup hints and briefs:** Should OMP inject equivalent identity/messaging/live-ops guidance into native sessions, or does the native OMP UI provide sufficient discoverability without adapter-authored context?\n10. **Subnet definition of done:** OMP delegates network topology to spt-core and excludes cross-node behavior from release acceptance. Is parity based on core-owned availability, adapter-specific onboarding/docs, or adapter acceptance evidence?\n11. **Platform target:** Should OMP add `x86_64-unknown-linux-musl` to match the current Claude archive? Neither product packages macOS or Arm64; confirm whether those are accepted shared limitations or future release targets.\n12. **Public helper CLI:** Are `omp-spt digest-omp/history-omp/psyche-omp/echo-commune-omp/launch-omp` supported user commands because help lists them, or implementation details behind the manifest? The same question applies to Claude’s helper subcommands.\n13. **Docs authority:** For Claude, should current manifest/source override self-labeled-outdated docs-site and stale runbook sections? For OMP, should 0.2.1 manifest/README/changelog override 0.2.0 Cargo/quickstart/CI/runbook? A canonical source is needed before any user-facing parity promise is frozen.\n14. **Release verification evidence:** Do documented manual acceptance checklists count, or must parity require checked-in per-target execution records/hosted matrices? Neither repo has hosted CI; OMP requires two-host native acceptance but carries no located v0.2.1 record.\n15. **Release trust terminology:** Neither manifest declares a signing key; both use authenticated `gh_release` transport. Claude runbook language about signing being delegated to `spt` should be clarified separately from actual GitHub-release acquisition trust before comparing security/release promises.\n\n# Bottom line\n\nAt the normalized core endpoint level, the adapters are close: release install/update, attached fresh launch, native resume, ReadyAgent/LiveAgent, identity, messaging/reply, activity, shutdown, Psyche, continuity drops, echo-commune, history, digest, and the Win-x64/Linux-GNU fat-archive targets all have parity.\n\nThe large divergence is the **agent-facing product layer**. Claude adds a plugin, 11 namespaced skills, runtime instruction injection, briefs/hints, mid-turn delivery, idle translation, checkpoint automation, role editing, shortform messaging, failure-heal hooks, CCS overlay, and plugin reconciliation. OMP’s native extension replaces the baseline hook/translation transport cleanly, but it does not replace those higher-level user surfaces. Under the requested only-workers-excluded comparison, those are gaps pending explicit scope decisions—not automatically accepted harness differences.\n\nConversely, OMP adds strict native-session immutability, genuine OMP executable/version validation, and a cohesive bounded listener/custody/fail-closed path that have no exact Claude equivalents. Release-wise, OMP lacks Claude’s Linux-musl target and has a concrete 0.2.1/0.2.0 version/docs/gate drift; Claude has its own stale docs/runbook contradictions and an advertised macOS install shell without a Darwin adapter payload.",
  "files": [
    {
      "path": "adapter/omp-spt.toml",
      "description": "Authoritative current OMP adapter manifest: version/floor, two non-worker hostable types, gh_release updater, identity, session/Psyche/resume/echo/history/digest/env contracts, and absence of hooks/profiles/skills/hints."
    },
    {
      "path": "adapter/strings/omp-spt.mjs",
      "description": "OMP-native harness seam. `createOmpSpt` registers OMP lifecycle events and implements bind, listener, bounded recovery, queue/custody, context envelope injection, reply correlation, state, session-switch blocking, and shutdown."
    },
    {
      "path": "tools/omp-spt/src/main.rs",
      "description": "OMP helper’s five-subcommand public dispatch (`Sub`, `classify`, `usage`)."
    },
    {
      "path": "tools/omp-spt/src/launch_omp.rs",
      "description": "Native OMP fresh/resume argv, real-executable discovery/identity validation, minimum OMP version enforcement, and endpoint environment snapshot launch path."
    },
    {
      "path": "tools/omp-spt/src/digest_omp.rs",
      "description": "OMP transcript location/profile/environment resolution and digest-record mapping."
    },
    {
      "path": "tools/omp-spt/src/history_omp.rs",
      "description": "Opaque one-session OMP JSONL history fetcher."
    },
    {
      "path": "tools/omp-spt/src/psyche_omp.rs",
      "description": "Ephemeral OMP Psyche turn and exit-95 reseed behavior."
    },
    {
      "path": "tools/omp-spt/src/echo_commune_omp.rs",
      "description": "Bounded isolated OMP end-of-session summarizer."
    },
    {
      "path": "tools/omp-spt/Cargo.toml",
      "description": "OMP helper package remains version 0.2.0, contradicting current manifest/README/changelog 0.2.1."
    },
    {
      "path": "tests/omp-extension.mjs",
      "description": "Deterministic OMP extension behavior coverage source for parsing, lifecycle, custody, retries, fail-closed paths, and shutdown."
    },
    {
      "path": "tests/manifest-shortcut.sh",
      "description": "OMP manifest cutover assertions, including native launch/resume, continuity directories, Psyche roles, update repo, and non-worker surface."
    },
    {
      "path": "tests/native-launch-manifest.sh",
      "description": "Pins native launch templates and exactly ReadyAgent/LiveAgent hostable types."
    },
    {
      "path": "tests/adapter-archive.sh",
      "description": "Deterministic exact two-target OMP fat-archive packaging coverage using PE/ELF fixtures."
    },
    {
      "path": "ci/publish/package-adapter.sh",
      "description": "Implemented OMP release artifact: one archive with Win-x64 and Linux-GNU-x64 payloads plus native extension."
    },
    {
      "path": "ci/run-gates.sh",
      "description": "OMP deterministic gate dispatcher; notably lacks docs/mdBook/llms drift coverage."
    },
    {
      "path": "README.md",
      "description": "Current OMP 0.2.1 installation, platform limitations, launch, update, and documentation entry points."
    },
    {
      "path": "docs/PARITY.md",
      "description": "OMP’s existing native-cutover boundary and native capability record; its retired-lineage decision conflicts with the new only-workers-excluded audit baseline."
    },
    {
      "path": "docs/OMP-BRIDGE-FIELD-ISSUES.md",
      "description": "Records current OMP skill distribution as an open public-contract gap and cross-node acceptance as intentionally outside the adapter boundary."
    },
    {
      "path": "docs/CI.md",
      "description": "Manual two-target native release acceptance requirements; still labeled v0.2.0."
    },
    {
      "path": "docs/DOCS-STRATEGY.md",
      "description": "Claims mdBook/GitHub Pages/generated-doc drift gates that are not implemented in current OMP CI/workflows."
    },
    {
      "path": "docs-site/src/quickstart.md",
      "description": "Public OMP quickstart, still labeled v0.2.0 while manifest/README are v0.2.1."
    },
    {
      "path": "../spt-claude-code/adapter/claude-spt.toml",
      "description": "Claude adapter manifest: current 0.21.0/floor, non-worker and worker roles, updater/post-update, hook declarations, session roles, inject/translation, history/digest, CCS profile, strings/skills/briefs/hints."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/.claude-plugin/plugin.json",
      "description": "Independent low-churn plugin identity/version (`sptc` 0.1.13)."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/skills",
      "description": "All 11 namespaced user-visible Claude skill definitions and argument/trigger metadata."
    },
    {
      "path": "../spt-claude-code/adapter/strings/skills",
      "description": "Eight file-backed operative skill bodies resolved through `[strings.skills]`."
    },
    {
      "path": "../spt-claude-code/adapter/strings/briefs",
      "description": "SessionStart identity, messaging, live operations, and work-discipline instruction surfaces."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/hooks/hooks.json",
      "description": "Static plugin registration for 11 current Claude Code hook events."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/hooks/dispatch.sh",
      "description": "Thin static resolver/exec shim that forwards hook stdin to the installed helper."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/main.rs",
      "description": "Claude helper dispatch for eight subcommands plus stale-hook fallback."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/hook.rs",
      "description": "Main Claude product dispatch: lifecycle, skill/hint injection, briefs, polls, state, checkpoint, role edit, update nudge, failure heal, and hook event routing."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/translate.rs",
      "description": "Idle PTY translation, checkpoint clear/wake, boundary rename, and role-edit command choreography."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/tag_scan.rs",
      "description": "Shortform `@<…@>` peer messaging and `>>commune<<` output parsing."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/interrupt_watch.rs",
      "description": "Interrupt-marker activity-state repair behavior."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/post_update.rs",
      "description": "cplugs marketplace/plugin reconciliation and reload notice after adapter update."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/launch.rs",
      "description": "Claude/CCS fresh/resume launch, display/remote-control naming, and PATH resolution."
    },
    {
      "path": "../spt-claude-code/ci/publish/package-adapter.sh",
      "description": "Current Claude three-target fat archive implementation: Win-MSVC x64, Linux-GNU x64, Linux-musl x64."
    },
    {
      "path": "../spt-claude-code/tests/adapter-archive.sh",
      "description": "Claude archive assertions; real construction is green-skipped if any platform binary is absent."
    },
    {
      "path": "../spt-claude-code/tests/hooks-dispatch.sh",
      "description": "Pins plugin event routing and dispatch/manfiest alignment."
    },
    {
      "path": "../spt-claude-code/ci/run-gates.sh",
      "description": "Claude deterministic gates, including docs-drift unlike OMP."
    },
    {
      "path": "../spt-claude-code/docs/PARITY.md",
      "description": "Claude’s own skill disposition audit; some operative-body descriptions are stale relative to current thin stubs/brief delivery."
    },
    {
      "path": "../spt-claude-code/docs/RELEASE-RUNBOOK.md",
      "description": "Stale/contradictory release documentation: two-target claim versus implemented musl target, and no-update claim versus current `[update]`/`[update.post]`."
    },
    {
      "path": "../spt-claude-code/README.md",
      "description": "Current install/update overview and explicit warning that deeper docs are outdated; also advertises a macOS shell despite no Darwin adapter payload."
    },
    {
      "path": "../spt-claude-code/docs-site/src/introduction.md",
      "description": "Self-stale early-build/skeleton status language."
    },
    {
      "path": "../spt-claude-code/docs-site/src/quickstart.md",
      "description": "Outdated plugin-first/invisible-bootstrap quickstart and incomplete current-surface status."
    }
  ],
  "architecture": "The two adapters share the same public spt-core endpoint model but put the harness seam in different places.\n\nClaude path:\n`Claude Code plugin skill/hook → plugin/sptc/hooks/dispatch.sh → claude-spt hook/translate/launch helper → public spt API + broker PTY`, with the manifest supplying hook declarations, session roles, transcript helpers, a CCS overlay, dynamic skill bodies, startup briefs, and hints. Idle spt-hosted delivery is translated into PTY keystrokes; active delivery is drained through Claude hook `additionalContext`. The helper also owns higher-level automation such as checkpoint, role edit, shortform sends, update nudges, and plugin reconciliation.\n\nOMP path:\n`public spt endpoint command → broker-held PTY → omp-spt launch-omp → genuine native OMP + packaged omp-spt.mjs extension → public spt API`. The extension binds the real OMP session, owns one serialized delivery/custody queue, drives ordinary OMP turns, correlates replies, reports activity, blocks session identity changes, retries its listener finitely, and tears down fail-closed. The Rust helper handles launch validation plus transcript/Psyche/echo roles. There is no plugin, hook manifest, translation worker, shipped adapter profile, skill namespace, hint tree, or startup-brief layer.\n\nThus the architecture supports strong parity for core endpoint/session/messaging/lifecycle capabilities while explaining—but, under the new scope, not automatically excusing—the missing OMP command/skill/product layer. Worker topology exists only in Claude and was deliberately omitted from the comparison."
}