{
  "summary": "# Harness-contract audit: omp-spt\n\n**Method:** static, read-only audit only; no edit, build, test, package, registration, `digest-proof`, or `translate-proof` command was executed. Official checklist anchors were verified from the published HTML.\n\n**Status legend:** **I** implemented; **P** partial/miswired or missing required proof; **M** missing; **N** intentionally inapplicable. **B** would mean blocked by a published spt-core contract gap; no row below is B—the main gaps are adapter-side or need an OMP product decision, not a missing spt-core public surface.\n\n## Group 1 — Required\nOfficial anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#group-1--required-no-adapter-exists-without-these\n\n| # | Surface | Status | Exact implementation evidence | Test / active traceability |\n|---|---|---|---|---|\n| 1.1 | `[adapter]` header | **I** | `adapter/omp-spt.toml:[adapter]`: `name=\"omp-spt\"`, `kind=\"harness\"`, `version=\"0.1.3\"`, `min_spt_core_version=\"0.27.0\"`, `hostable_types=[\"LiveAgent\",\"ReadyAgent\",\"Worker\"]`. Manifest reference: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#adapter--header-required | `tests/manifest-shortcut.sh` checks `name` and only the `omp` member of `host_binaries`; `tests/manifest-schema.sh` validates the whole file but explicitly exits green as **skipped** when Python dependencies are absent. `REQ-DIST-MANIFEST-SCHEMA` is active, but its title/evidence text still says CC/`adapter/claude-spt.toml`, so coverage is misbound. |\n| 1.2 | `spt adapter add <dir>` registration | **P** | The artifact is registerable in shape: `adapter/omp-spt.toml`; `tests/adapter-archive.sh` checks release archive root `manifest.toml`, `strings/`, and both triples. | No targeted test in `tests/` actually invokes `spt adapter add` for `omp-spt`; `tests/manifest-schema.sh` is JSON-schema-only, not cross-field registration. `tests/adapter-archive.sh` can skip archive construction when binaries are absent. `REQ-DIST-MANIFEST-SCHEMA` claims an old claude-spt registration int outside this target, not OMP registration. |\n| 1.3 | `[adapter].host_binaries` | **I** field; **P** behavioral proof | `adapter/omp-spt.toml`: `host_binaries=[\"omp\",\"omp-spt\"]`. | `tests/manifest-shortcut.sh` checks only that `\"omp\"` appears; no test proves adapter-agnostic `seed`/listener resolution for either executable. `REQ-SKILL-LIVE` is active but still describes Claude Code and old resident-Monitor semantics. |\n| 1.4 | Startup pair | **I** implementation; **P** proof | Active spt-hosted path: `adapter/omp-spt.toml:[session.self]` → `omp --extension {adapter_dir}/strings/omp-spt.mjs`; `adapter/strings/omp-spt.mjs:ompSpt` registers `pi.on(\"session_start\")`, reads `ctx.sessionManager.getSessionId()`, calls `api --adapter omp-spt bind <id> --set-session-id <sid>`, marks idle, then `startListener()`. ADR: `docs/adr/0007-native-omp-tui-hosts-spt-extension.md`. Legacy/headless path remains in `tools/claude-spt/src/bridge.rs:run_argv`. | `tests/manifest-shortcut.sh` checks the two command strings; `tests/omp-extension.mjs` tests only `decodeBody`, `drainEvents`, and `extractReply`, not `session_start`, bind, listener startup, state, or teardown. `tests/bridge-acceptance.sh` exercises the **non-operative headless bridge**, not `[session.self]`; it is gated and tagged `[impl]`, not `[int]`. Only `REQ-OMP-NATIVE-TUI` is OMP-specific; it requires doc/impl/unit but deliberately no int. |\n| 1.5 | `api session-end <id>` | **I** implementation; coverage gap | Active path: `adapter/strings/omp-spt.mjs` `pi.on(\"session_shutdown\")` kills the listener and calls `api --adapter omp-spt session-end <id>` authenticated by bind token or sid. Headless fallback: `bridge.rs:run_argv` teardown does the same. | `tests/omp-extension.mjs` does not exercise the callback. `REQ-DIST-HOOKS-API` is active, but its tagged implementation is `hook.rs:handle_session_end`, which targets **`claude-spt`**, not the active OMP extension. |\n\n## Group 2 — Recommended\nOfficial anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#group-2--recommended-the-integration-is-hollow-without-them\n\n| # | Surface | Status | Exact implementation evidence | Test / active traceability |\n|---|---|---|---|---|\n| 2.1 | Honest idle/busy | **I** implementation; coverage gap | `adapter/strings/omp-spt.mjs`: initial idle after bind; `pi.on(\"agent_start\")` → `setState(\"busy\")`; `pi.on(\"agent_end\")` → `setState(\"idle\")`. `bridge.rs:run_argv` brackets each relayed turn with `set_state(...,\"busy\"/\"idle\")`. | No native-extension lifecycle test. Manifest `[hooks.Stop]` and `hook.rs:handle_stop` are inherited CC wiring and do not prove OMP. No OMP-specific requirement covers idle/busy. |\n| 2.2 | `[inject]` + pull/deferred delivery | **P** | Manifest declares `[inject] activity=[\"hook\"], idle=[\"hook\"]`; `[hooks.UserPromptSubmit]` and `[hooks.PreToolUse]` declare `api poll {session_id} --include-deferred`. The **active OMP path does neither**: `omp-spt.mjs:startListener` spawns blocking `spt ready <id>`, parses `<EVENT>` frames, queues them, and calls `pi.sendUserMessage`. | `tests/omp-extension.mjs` covers parsing complete/partial frames only. No test covers actual listener spawn, queue serialization, sendUserMessage, or deferred drain. The declared `hook` channel does not describe the native OMP extension, so routing metadata and runtime delivery are inconsistent. |\n| 2.3 | Honest `can_inject` | **P** / misleading declaration | Manifest marks SessionStart/UPS/PreToolUse `true`, Stop/End/worker/PostToolUse `false`. Those values describe the inherited Claude hook bridge. Native OMP uses extension callbacks and `sendUserMessage`; it does not execute manifest hook handlers. | `tests/hooks-dispatch.sh` only checks static Claude-plugin routing. No native OMP test or requirement establishes whether any OMP callback corresponds to these hook declarations. Official v0.16 text explicitly says `[hooks]` is outbound and spt-core never executes the handler: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#hook-dispatch-by-resolve-not-execute |\n| 2.4 | `api boundary clear|compact` with prior-sid proof | **M** on active OMP path | No boundary call exists in `adapter/strings/omp-spt.mjs` or `bridge.rs`. `tools/claude-spt/src/hook.rs:handle_session_start` has a thorough prior-sid boundary implementation, but `const ADAPTER=\"claude-spt\"` and it is reachable only through the broken Claude plugin dispatch. | `hook.rs` has `boundary_prefers_endpoint_id_and_presents_prior_proof`, persistence/refusal tests tagged to active `REQ-DIST-BOUNDARY-ROTATE`; all test the wrong adapter path. No OMP-native boundary requirement/test/int exists. This is a factual checklist miss. Whether OMP exposes a clear/compact callback is a product/API-wiring decision, not an spt-core public-contract blocker. |\n| 2.5 | SessionStart `api psyche-download` + inject stdout | **M** on active OMP path | No `psyche-download` call or context injection exists in `omp-spt.mjs` or `bridge.rs`. `hook.rs:psyche_download` and `handle_session_start` implement it for `ADAPTER=\"claude-spt\"` only. | Active `REQ-DIST-RESUME-CONTEXT` and its unit tests therefore provide false OMP assurance. A resumed native OMP session can reload its transcript via `-r` but is not shown rehydrating spt durable mind/pending commune into agent context. |\n| 2.6 | `[history]` | **I** implementation; **P** coverage | `adapter/omp-spt.toml:[history] strategy=\"fetcher\", fetcher=\"omp-spt history-omp --session {session_id}\"`; `tools/claude-spt/src/history_omp.rs:run` locates through `digest_omp::sessions_root/locate` and streams bytes verbatim. Manifest reference: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#history--transcript-access | `tests/manifest-shortcut.sh` checks only the command string. `history_omp.rs` has **no unit tests**. `REQ-HISTORY-FETCHER` is active, but its title and `[unit]` evidence refer to CC `history.rs`; the shared ID can go green without testing OMP. |\n| 2.7 | `[identity]` | **I** declaration; coverage gap | `adapter/omp-spt.toml:[identity] session_id_source=\"post_spawn\", parent_ancestor_name=\"omp\"`; active extension obtains the minted id from `ctx.sessionManager.getSessionId()`. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#identity--session-identity | No targeted test or OMP requirement validates post-spawn identity resolution/rebind behavior. |\n| 2.8 | `[env.*]` bridge | **I** core path; stale extra | `[env.SPT_ENDPOINT_ID] direction=\"inject\", value=\"{id}\"`; `omp-spt.mjs:ompSpt` gates on `process.env.SPT_ENDPOINT_ID`. `[env.SPT_INJECT_VERIFY_ECHO]` opts in. `[env.CLAUDE_CONFIG_DIR]` is inherited CC residue and explicitly inert for OMP. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#envvar--env-var-table | `tests/manifest-shortcut.sh` does not assert the SPT endpoint-id block; it only checks the echo-verify section exists. No event-level env test. |\n| 2.9 | `[update]` avenue | **I** primary avenue | `adapter/omp-spt.toml:[update] avenue=\"gh_release\", repo=\"BigscreenVR/omp-spt\", transport=\"gh\"`, plus message. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#update--adapter-self-update | `tests/manifest-shortcut.sh` asserts repo/transport/message; `tests/adapter-archive.sh` checks package shape. `REQ-DIST-ADAPTER-RELEASE` is active but its registry text still names `SaberMage/claude-spt`. No OMP release-acquire int appears under `tests/`. |\n| 2.10 | `[update.post]` | **P** and factually wrong for omp-spt | Manifest calls `{adapter_dir}/omp-spt post-update`; JSON/sentinel handling is implemented in `post_update.rs:update_applied_in`, `arbiter_line`, `run`. But the actual reconcile is hard-coded to Claude: `MARKETPLACE=\"cplugs\"`, `PLUGIN_REF=\"sptc@cplugs\"`, `choose_cli` requires `claude|ccs`, and emitted diagnostics say `claude-spt`. It does not reconcile plugin `omps`. | Unit tests explicitly lock `sptc@cplugs` (`plugin_sync_picks_update_when_installed_else_install`) and use `adapter_name:\"claude-spt\"`. `tests/manifest-shortcut.sh` checks only that `[update.post]` exists. Active `REQ-DIST-UPDATE-MESSAGE` is CC-specific. |\n\n## Group 3 — Optional/capability-specific\nOfficial anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#group-3--optional-capability-specific\n\n| # | Surface | Status | Exact implementation evidence | Test / active traceability |\n|---|---|---|---|---|\n| 3.1 | `api shutdown <id>` graceful signoff | **P** | `plugin/omps/skills/signoff/SKILL.md` directs `spt endpoint shutdown`; `[strings.skills].force-stop` points to a file-backed skill. Active native shutdown callback itself uses softer `session-end`. | No test invokes shutdown or proves final echo-commune ordering. No dedicated OMP requirement. |\n| 3.2 | `api presence` / `api driven-by` | **M** | No call in manifest, extension, binary, plugin, or tests. | No requirement. **Decision needed:** whether OMP needs local-vs-remote-drive distinction / most-recently-active routing. |\n| 3.3 | Workers | **P**, with overclaim | Manifest advertises `Worker` and declares Subagent hooks. `hook.rs:handle_subagent_start/stop` implements v0.27 worker truth—but with `ADAPTER=\"claude-spt\"` and Claude hook payload/state. Native OMP extension has no worker callbacks. | Active `REQ-DIST-WORKER-LIFECYCLE` unit tests validate only the wrong CC path. `REQ-DIST-WORKER-PERCH-REACH` is inactive. The advertised `Worker` capability is not backed by active OMP wiring. |\n| 3.4 | `[digest]` / digest input classification | **P** overall; extractor itself implemented | `adapter/omp-spt.toml:[digest] strategy=\"fetcher\", extractor=\"omp-spt digest-omp --session {session_id}\"`; `digest_omp.rs:extract`, `sessions_root`, `locate`, `run`. `user_text_becomes_input` proves an OMP `role=user` text becomes digest `role=input`; assistant text/tool calls map correctly. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#digest--session-digest-extractor | `tests/manifest-shortcut.sh` checks command only. No OMP `digest-proof` script in `tests/`; the manifest comment claims it was proven but this audit did not observe an executable proof. `digest_omp.rs` has no `[unit->REQ-DIST-DIGEST-EXTRACTOR]` tag, so active trace coverage can be satisfied by CC `digest.rs` tests instead. No E2E shows an inbound SPT message submitted by `sendUserMessage` becomes the opening OMP user record—this is `[INFERENCE]` from the extension and log mapping. |\n| 3.5 | `[session.notif]` | **M** / deferred | No role. Top-of-manifest comments explicitly say signoff/notif remain deferred. | No requirement/test. **Decision needed:** accept no native notification renderer or scope one. |\n| 3.6 | `[session.resume]` | **I** declaration; **P** E2E | `adapter/omp-spt.toml:[session.resume] command=\"omp -r {session_id} --extension {adapter_dir}/strings/omp-spt.mjs\", keys=[\"session_id\"]`. | `tests/manifest-shortcut.sh` checks exactly one `-r {session_id}` native command. The assertion is tagged only under `REQ-OMP-NATIVE-TUI`, while active `REQ-DIST-SESSION-RESUME` still specifies Claude `-r` + remote-control and has no OMP-targeted trace evidence. No live resume/bind/context test. |\n| 3.7 | `[message-idle-translation-binary]` | **P**, high-risk semantic mismatch | Manifest points to `{adapter_dir}/omp-spt translate`; `translate.rs` implements the JSONL/commit protocol and many unit tests. But it is explicitly Claude-specific: ctrl+s draft stash, `/clear`, `/rename`, checkpoint-fire choreography, and `interrupt_watch` with `ADAPTER=\"claude-spt\"`. Native OMP simultaneously starts its own `spt ready` listener, so the repository presents two delivery substrates without a proof of routing/exclusivity. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#message-idle-translation-binary--spt-hosted-idle-delivery | `tests/manifest-shortcut.sh` checks only command-vs-deprecated-path. No OMP `translate-proof` under `tests/`; `ci/idle-translate/translate-proof-int.sh` is inherited generic/CC choreography. Active `REQ-DIST-IDLE-TRANSLATE` has an int tag in CI but no `[unit]` tag on `translate.rs` tests and no OMP PTY apply proof. |\n| 3.8 | `shortcut_basename` | **I** | `adapter/omp-spt.toml`: `shortcut_basename=\"omp\"`. | `tests/manifest-shortcut.sh` asserts one assignment and the `omp-<id>` brand, tagged `[unit->REQ-DIST-SHORTCUT-BASENAME]`. Requirement title still says `cc-<id>`/Claude, so trace semantics are stale even though test behavior is correct. |\n| 3.9 | Shell surfaces | **N** | Manifest `kind=\"harness\"`; no `[shell]`. | Correctly inapplicable for this adapter. Manifest anchor: https://sabermage.github.io/spt-releases/harness-contract/manifest.html#shell-adapters-kind--shell |\n\n## Group 4 — Native-quality integrations\nOfficial anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#group-4--beyond-the-api-integrations-that-make-it-good\n\n| # | Integration | Status | Exact implementation evidence | Test / active traceability |\n|---|---|---|---|---|\n| 4.1 | Commune/signoff file-drops | **P** | `[session] commune_dir=\".claude\", signoff_dir=\".claude\"`; plugin commune/signoff prose uses `.claude/<id>-commune.md` and `endpoint shutdown`; psyche/echo roles exist. But the active native OMP extension neither injects the SessionStart briefs nor calls `psyche-download`; the `.claude` choice and all prose are inherited from Claude. | `tests/hooks-dispatch.sh` checks the CC `live-ops` brief and thin skills, not native OMP delivery or watcher ingestion. The shared manifest tag is `REQ-DIST-MANIFEST-SCHEMA`, not an OMP mind-continuity requirement. |\n| 4.2 | Resource advertisement | **M** | No `[session]` resource blurb and no `spt endpoint description` authoring call. | No requirement/test. **Decision needed:** define Librarian/OMP resources or accept undiscoverable capability. |\n| 4.3 | Install-on-demand bootstrap | **I** installer; **P** activation UX | `plugin/omps/bootstrap.sh` and `.ps1` implement the official installer and are called on plugin SessionStart before binary resolution. | Tagged `[impl->REQ-DIST-BOOTSTRAP-INSTALL]`; active requirement text still cites `plugin/sptc`. More importantly, `plugin/omps/skills/setup/SKILL.md` and `adapter/strings/skills/setup.md` tell users to activate **`claude-spt`**, use nonexistent `adapter/claude-spt.toml`, fetch `SaberMage/claude-spt`, and configure `claude-spt:ccs`; this makes the post-install activation path wrong for omp-spt. |\n| 4.4 | Surface `spt how-to` | **P** | `plugin/omps/skills/send/SKILL.md` links `spt how-to send`; subnet/setup skills point users to CLI help/verbs. | Native OMP extension does not inject these Claude plugin skills or any equivalent how-to context. No OMP-specific requirement. |\n| 4.5 | Presence-driven idle | **I** implementation; coverage gap | `omp-spt.mjs` uses real `agent_start`/`agent_end`, not a timer; `bridge.rs` uses actual relayed turn boundaries. | No callback-level unit/integration test or OMP-specific trace requirement. |\n\n## Patterns introduced in v0.16.0\nParent anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#patterns-introduced-in-v0160\n\n| Pattern | Status | Evidence and gap |\n|---|---|---|\n| Resolve-not-execute hook dispatch | **P / broken** | Intended pieces exist: `adapter/omp-spt.toml:[strings].hook_cmd=\"{adapter_dir}/omp-spt\"`, `plugin/omps/hooks/hooks.json`, and `dispatch.sh`. Exact anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#hook-dispatch-by-resolve-not-execute. **Fatal mismatch:** `plugin/omps/hooks/dispatch.sh` line 44 resolves `spt adapter get-string claude-spt hook_cmd`, not `omp-spt`; if claude-spt is absent it silently exits 0, and if present it can run the wrong adapter binary. Then `tools/claude-spt/src/hook.rs:ADAPTER` is hard-coded `\"claude-spt\"`, so every targeted bind/state/poll/boundary/worker/psyche-download/session-end call goes to the sister adapter. `tests/hooks-dispatch.sh` lines 47–48 explicitly require the wrong `claude-spt` lookup, locking the defect in. |\n| Incremental digest `--json` cursor | **P** | Exact anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#incremental-digest-consumption--the---json-cursor. Producer binding is present: `digest_omp.rs:user_text_becomes_input` maps native OMP user messages to `role=input`. The native extension drives inbound messages through `pi.sendUserMessage`, so they should enter the OMP log as user messages **[INFERENCE]**; no integration test proves that delivered SPT messages open distinct turns, and no OMP consumer implements/validates `seq`/`--after` semantics. |\n| Global `--json` read/status | **P legacy / N active native path** | Exact anchor: https://sabermage.github.io/spt-releases/harness-contract/integration-checklist.html#global---json-for-readstatus-commands. `hook.rs:self_id` parses `spt whoami --json` tolerantly and has tests, but that entire hook path targets claude-spt. The active native OMP extension does not parse read/status JSON, so there is no active obligation beyond avoiding brittle human-output parsing. No OMP-specific trace row. |\n\n## Ranked factual gaps to grill\n\n1. **P0 — Plugin dispatch is wired to the sister adapter.** `plugin/omps/hooks/dispatch.sh:44` asks for `claude-spt hook_cmd`; `hook.rs:ADAPTER` is `claude-spt`; `tests/hooks-dispatch.sh:47-48` enforces the wrong lookup. This makes the manifest `[hooks]`, `can_inject`, boundary, psyche-download, worker, and hook-poll evidence non-operative for omp-spt.\n2. **P0 — Native OMP continuity is incomplete.** `omp-spt.mjs` binds, listens, marks activity, replies, and tears down, but has no `api boundary` and no `api psyche-download`/context injection. These are explicit Group-2 floor checks under the official “Am I done?” list and are currently represented only by the wrong Claude hook path.\n3. **P1 — Update/setup surfaces still operate on claude-spt/sptc.** `post_update.rs:PLUGIN_REF=\"sptc@cplugs\"`; both setup bodies instruct `claude-spt`, `SaberMage/claude-spt`, `adapter/claude-spt.toml`, and `:ccs`; plugin metadata describes “adapter for Claude Code.” The primary gh-release avenue is correct, but its delegated post-step and user activation bridge are not.\n4. **P1 — `Worker` is advertised without active OMP worker wiring.** `hostable_types` claims Worker; only Claude Subagent hooks implement worker-start/stop. Either add native OMP worker lifecycle evidence or remove Worker from the claim.\n5. **P1 — Idle delivery has unresolved dual-path/semantics risk.** Active extension starts `spt ready`; manifest also activates a translation binary whose keystrokes and checkpoint commands are Claude-specific. There is no OMP `translate-proof` + live PTY apply proof, nor a test proving messages cannot race/duplicate across relay and translator.\n6. **P1 — Traceability can report inherited CC coverage as OMP coverage.** `traceable-reqs.toml` still identifies itself as `spt-claude-code`; only `REQ-OMP-NATIVE-TUI` is OMP-specific. Shared active IDs for hooks, boundary, resume context, digest, history, echo, update, worker, and translator point to CC titles and CC evidence. OMP `digest_omp` tests lack unit tags; `history_omp` has no tests; native extension callback behavior is untested. Formal stage completion is therefore not reliable for omp-spt.\n7. **P2 — The only live acceptance targets an inactive architecture.** `tests/bridge-acceptance.sh` validates `omp-spt bridge`/headless RPC, while ADR-0007 and `[session.self]` moved production hosting to native OMP + extension. `REQ-OMP-NATIVE-TUI` intentionally omits an `int` stage despite its own note that live PTY acceptance is manual.\n8. **P2 — Optional native quality is absent:** resource advertisement, presence/driven-by, native notification. These are not contract defects unless the product wants the capabilities, but they should be explicit accepted omissions rather than silence.\n\n## Design decisions needing user input (not factual defects)\n\n- **Boundary model:** identify the OMP-native event corresponding to clear/compact/resume rotation, or explicitly declare that native OMP cannot rotate context and define the continuity degradation. The spt `api boundary` contract is published; only the OMP event choice is unresolved.\n- **Single delivery owner:** choose broker translation vs the extension’s `spt ready` relay for spt-hosted native OMP, then make `[inject]`, `can_inject`, and tests describe that one topology.\n- **Plugin’s role:** decide whether `plugin/omps` remains a Claude Code control-plane plugin for launching/managing OMP endpoints or is unintended fork residue. If retained, it must consistently target `omp-spt`; if not, remove it from omp-spt conformance claims rather than counting its CC hooks.\n- **Capability claims:** decide whether to support Worker, native notif, presence/driven-by, and resource advertisement; otherwise remove/deactivate the claims and record intentional inapplicability.\n- **Mind UX:** choose an OMP-native watched directory/instruction injection mechanism for commune/signoff and psyche-download; `.claude` plus Claude plugin briefs is not a native OMP UX.\n\n## Traceability verdict\n\n`traceable-reqs.toml` has broad scan roots, so file discovery is not the problem. The problem is **semantic aliasing**: almost every active requirement is still worded for claude-spt and can be satisfied by inherited CC implementation/tests in the same crate. The sole OMP-specific row, `REQ-OMP-NATIVE-TUI`, covers doc/impl/unit only. There is no OMP-specific active coverage for registration, native bind/listener callbacks, session-end, idle/busy, boundary rotation, psyche-download, native history, digest-proof, translate-proof/apply, worker lifecycle, or update-post behavior. Active coverage should therefore be treated as **partial and capable of false-green results**, not as a row-by-row OMP harness conformance gate.",
  "files": [
    {
      "path": "adapter/omp-spt.toml",
      "description": "Complete declarative surface: correct omp-spt header/update/native session roles/history/digest, but inherited CC hooks, inject metadata, translator, comments, and setup assumptions create active-path mismatches."
    },
    {
      "path": "adapter/strings/omp-spt.mjs",
      "description": "Actual native OMP production lifecycle: bind, initial idle, ready listener, busy/idle, reply, session-end. Missing boundary rotation and psyche-download/context injection; callback effects have no direct test."
    },
    {
      "path": "tools/claude-spt/src/hook.rs",
      "description": "Rich Claude hook implementation for seed/bind/boundary/poll/psyche-download/worker/end, but hard-coded `ADAPTER = \"claude-spt\"`; not valid omp-spt evidence."
    },
    {
      "path": "plugin/omps/hooks/dispatch.sh",
      "description": "Resolve-not-execute wrapper incorrectly looks up `claude-spt hook_cmd`, causing no-op or cross-adapter execution."
    },
    {
      "path": "plugin/omps/hooks/hooks.json",
      "description": "Static Claude Code hook routing; does not represent native OMP extension events."
    },
    {
      "path": "tests/hooks-dispatch.sh",
      "description": "Static hook test explicitly requires the wrong `get-string claude-spt hook_cmd`, institutionalizing the dispatch defect."
    },
    {
      "path": "tools/claude-spt/src/bridge.rs",
      "description": "Legacy/headless OMP RPC host with bind/listener/activity/reply/end behavior; retained but no longer selected by native `[session.self]`."
    },
    {
      "path": "tests/bridge-acceptance.sh",
      "description": "Gated live E2E for the inactive headless bridge, not ADR-0007's native OMP hosting path."
    },
    {
      "path": "tools/claude-spt/src/digest_omp.rs",
      "description": "OMP JSONL fetcher/extractor and useful mapping tests, including user→input turn boundaries; lacks OMP-specific trace unit tag and digest-proof E2E."
    },
    {
      "path": "tools/claude-spt/src/history_omp.rs",
      "description": "Correct-looking verbatim OMP history fetcher; has no unit tests."
    },
    {
      "path": "tools/claude-spt/src/echo_commune_omp.rs",
      "description": "OMP bounded echo-commune summarizer with pure tests; trace ID is shared with the CC requirement."
    },
    {
      "path": "tools/claude-spt/src/psyche_omp.rs",
      "description": "OMP ephemeral Psyche role implementation with substantial unit tests; does not compensate for missing parent-session psyche-download."
    },
    {
      "path": "tools/claude-spt/src/translate.rs",
      "description": "Protocol-complete but Claude-specific idle translator (`ctrl+s`, `/clear`, `/rename`, CC interrupt watcher); unproven for native OMP PTY semantics."
    },
    {
      "path": "tools/claude-spt/src/post_update.rs",
      "description": "Published update-post JSON/sentinel machinery, but plugin reconciliation is hard-coded to Claude/ccs and `sptc@cplugs`, not omps."
    },
    {
      "path": "plugin/omps/skills/setup/SKILL.md",
      "description": "User setup entrypoint still activates claude-spt, old repo/path, and ccs profile instead of omp-spt."
    },
    {
      "path": "adapter/strings/skills/setup.md",
      "description": "Adapter-delivered setup body has the same stale claude-spt activation instructions."
    },
    {
      "path": "tests/manifest-shortcut.sh",
      "description": "Useful structural assertions for native session commands, OMP subcommands, update, translator, and profile absence; no live behavior and limited trace tags."
    },
    {
      "path": "tests/omp-extension.mjs",
      "description": "Tests only three pure helpers; does not instantiate the extension or test callback-driven bind/listen/state/reply/end behavior."
    },
    {
      "path": "tests/manifest-schema.sh",
      "description": "Schema negative tests plus real-manifest validation, but can green-skip if Python/jsonschema dependencies are unavailable and does not exercise registration cross-field rules."
    },
    {
      "path": "traceable-reqs.toml",
      "description": "Still a claude-spt registry; only REQ-OMP-NATIVE-TUI is OMP-specific, allowing inherited CC tags/tests to false-green OMP checklist coverage."
    },
    {
      "path": "docs/adr/0007-native-omp-tui-hosts-spt-extension.md",
      "description": "Accepted architecture selecting native OMP + extension and relegating the RPC bridge to headless callers; key basis for separating operative from inherited evidence."
    }
  ],
  "architecture": "The operative hosted topology is `spt endpoint run` → manifest `[session.self|resume]` → native `omp` as PTY leader → packaged `adapter/strings/omp-spt.mjs` for bind/listen/activity/reply/end. The repository simultaneously retains three inherited Claude-era planes: (1) a Claude plugin/hook dispatch surface, (2) a consolidated binary containing CC hook/translation/update logic, and (3) trace requirements/tests worded for claude-spt. Because published `[hooks.*]` entries are declarations the harness must fire—not handlers spt-core executes—the inherited hook tables and `hook.rs` cannot be credited to native OMP, especially while both dispatch and the hook binary target `claude-spt`. The central architectural grill is to make native OMP the sole conformance path, then either retarget the plugin as a deliberate control plane or remove it from adapter coverage; add native boundary/mind continuity and one authoritative delivery path; and mint OMP-specific trace rows/tests so inherited CC evidence cannot satisfy OMP contracts."
}