# omp-spt capability parity record

> This record compares `omp-spt` with its sister adapter, `claude-spt`.
> Parity means the same user outcome, including agent-facing outcomes, through
> the best OMP-native seam or a discoverable public `spt` command. It does not
> require Claude command names, hooks, PTY translation, or source structure.
> Worker endpoints remain intentionally excluded.

## Versioned comparison baseline

<!-- [doc->REQ-PARITY-BASELINE] -->
Current baseline: `omp-spt v0.9.4` → `BigscreenVR/claude-spt-bs v0.38.6`.
`omp-spt` v0.8.0 was published at 2026-09-06 10:56:17 UTC. The first repository commit after that
release, `ebb3bf77d8f0e0f8556d7c5a4791a95a1540d075`, landed at 2026-09-06 10:57:00 UTC and fixes the start of the
work interval that produced v0.9.0 (the context ledger, `cfee63f` at 2026-09-06 11:43:15 UTC —
operator design, replacing every per-request and per-turn injection with one durable block).
`claude-spt-bs` v0.38.6 was still the latest published sister release when that interval opened
(published 2026-09-06 09:53:41 UTC); no sister change was triaged in it.

The previous baseline (`omp-spt v0.3.32` → `claude-spt-bs v0.25.1`, sister published
2026-07-19 04:55:53 UTC) identified the sister behavior used to define v0.3.20 parity. This
baseline records the sister behavior triaged by parity pass v2 (below). It is not a claim that
every later `claude-spt` capability is covered — the matrix says which are. Any subsequent feature-parity work must
first select and record the exact published `claude-spt` release being consulted. Every
parity-informed `omp-spt` release must update this baseline to its own version; the release
version-consistency gate rejects a stale `omp-spt` baseline.


## Parity pass v2 — sister v0.25.1 → v0.38.6 (closed 2026-09-06)

Sixty `claude-spt-bs` releases (v0.25.2 … v0.38.6) were triaged against the native OMP host.
Dispositions: **covered** (same outcome here, by the same or a stronger mechanism), **N/A**
(Claude Code plumbing with no OMP analogue), **divergence** (deliberately different, recorded),
**unverified** (plausibly covered, needs a test before it is claimed), **gap → phase N** (built by
the numbered phase of `PARITY-V2-PLAN.md`; each phase advances this baseline when it ships).

| Sister change | Releases | Disposition |
|---|---|---|
| Interrupt/stuck-session watcher reads only real agent work | 0.25.2, 0.25.5 | N/A — CC transcript watcher; OMP turns are observed natively |
| Skill short forms, inline skill-size limits, picked-for-you skill instructions | 0.25.3, 0.25.4, 0.28.0 | N/A — CC skill-stub mechanics; OMP `omp-plugins` skills load whole |
| Hook additional-context cap (~2 KB) spill files, per-delivery files, spill-note failure modes | 0.25.9, 0.25.11, 0.25.17 | N/A — no injection cap on the native boundary splice |
| Borrowed/inner CC sessions must not act as the agent; stale host pid after daemon restart; digest follows config root | 0.25.10, 0.25.12, 0.25.13, 0.25.18, 0.25.20, 0.25.22 | N/A — one endpoint ↔ one OMP session, bound in-process at activation (REQ-OMP-SESSION-IMMUTABLE) |
| Psyche/summarizer sessions run without user hooks or plugins | 0.25.7 | covered — `psyche-omp` / `echo-commune-omp` are bounded helper turns with isolated context roots (REQ-PSYCHE-EPHEMERAL-SHIM) |
| Companion failure carries the inner session's stdout/stderr | 0.25.14 | covered — `psyche-omp` / `echo-commune-omp` failure lines carry a bounded tail of BOTH inner streams and name a silent channel explicitly (REQ-COMPANION-FAILURE-TAILS, 0.6.0) |
| Account/usage-limit refusal reported as outage-not-fault; endpoint held unavailable until the stated reset, re-asserted against stray recoveries, respected across daemon restart | 0.25.15, 0.25.25, 0.25.26, 0.25.27, 0.25.28 | covered — a turn refused for account reasons (OMP `errorId` UsageLimit / 402 / refusal wording) is reported as an outage, not a fault; the endpoint is held `busy` until the provider's stated reset + 1 min, re-asserted every 5 s, with deliveries custodied unsubmitted and the liveness ladder paused; a human prompt releases it; the session record re-arms it after a restart (REQ-USAGE-LIMIT-HOLD, 0.6.0). The Psyche turn maps the same refusal to the published exit 96 (REQ-PSYCHE-ACCOUNT-REFUSAL) |
| End-of-turn shortform send fires at turn end, on tool-using turns too; first-turn send after setup not dropped | 0.25.16, 0.25.21 | covered — dispatch runs on OMP's `agent_end` with the final assistant text in hand (REQ-PARITY-PEER-SHORTFORM) |
| Spooled vs delivered vs local-failure reported distinctly; sends logged; end-of-turn confirmation shown next turn | 0.25.23, 0.25.32, 0.29.2, 0.29.4 | covered — since 0.4.0 the adapter carries no shortform parser; spt-core reads `@<…@>` from the turn feed and reports every dispatch outcome (delivered, spooled, no perch) in the now-signal's `DISPATCH_RESULTS` at the next boundary, and the startup brief says outcomes arrive only there (REQ-PARITY-PEER-SHORTFORM). Recorded as covered 2026-09-06; the row had kept its phase-2 wording after phase 2 shipped |
| Inline sends carry the same sender proof as shell sends | 0.28.2, 0.28.3 | covered — core dispatches inline sends from the session's own turn feed (`[io] compliance = true`, 0.4.0), so they carry the session's proof exactly as a shell `spt send` does. Recorded as covered 2026-09-06 |
| Message arriving just before `/compact` no longer stalls delivery | 0.25.6 | covered — deaf-idle self-heal ladder (REQ-HAZARD-DELIVERY-TURN-LIVENESS) restores receivability regardless of cause |
| Messages surface only in the main conversation, never a subagent's | 0.25.8 | covered — OMP re-runs every extension factory for an in-process subagent session (no subagent marker exists); the nested copy used to run a second `api bind` (field: hertz 2026-09-06, refused by core's ownership guard — F-037). Since 0.7.0 exactly one binding per process activates and every later one is inert (REQ-HAZARD-NESTED-ACTIVATION, KNOWN-HAZARDS #15) |
| Hook log names its endpoint | 0.25.19 | covered — every extension log line is prefixed `[omp-spt <id>]` through one wrapper (REQ-ENDPOINT-NAMED-LOGS, 0.6.0) |
| `spt ring` guidance withdrawn, then restored with a version floor for perchless sessions only | 0.25.24, 0.25.30 | covered — CI.md acceptance floor (installed spt ≥ v0.46.0); startup brief offers ring only to a perchless session |
| Summarizer never lists machines/hosts as peer agents | 0.25.29 | covered — the echo-commune policy prompt names another agent only on a direct exchange and never presents a machine, host, or node name as an agent or teammate (REQ-ECHO-NO-MACHINE-PEERS, 0.6.0) |
| Linux members packaged executable; reproducible archives | 0.25.31 | covered — archive writer sets explicit `0755` modes and `SOURCE_DATE_EPOCH`; packer refuses a non-executable Linux member |
| `/knock` skill; sender-declared send-only / send-receive wording; invite-code subnet sealing | 0.26.0, 0.28.1 | covered — packaged knock skill + `[[hints]]` row (REQ-KNOCK-SKILL, 0.5.0) |
| Long foreground command → background-it reminder | 0.26.0 | divergence — omp-spt nudges AFTER the fact from OMP's measured wall time (foreground `bash` ≥ 30 s, one `[spt]` line appended to the result, ≤ 3 per turn, advice only) instead of a pre-run heuristic (REQ-LONG-FOREGROUND-NUDGE, 0.6.0). Field-verified on hertz 2026-09-06 (35 s `sleep`, line quoted verbatim). Window: OMP itself backgrounds a foreground `bash` at `bash.autoBackground.thresholdMs` (default 60 s) and backgrounds early when a steer arrives, so the nudge fires for completed foreground runs of 30–60 s; longer ones OMP already backgrounds |
| Deliveries during a save-and-clear turn held for the next session; hold self-releases | 0.26.0 | covered — from arming `spt_checkpoint` until its wake (or failure notice) is queued, inbound deliveries stay custodied unsubmitted and the deaf-session ladder pauses; the release resubmits them and OMP orders the wake turn against the delivery turns (queued steers survive native compaction) (REQ-CHECKPOINT-DELIVERY-HOLD, 0.7.0). Field-run on hertz 2026-09-06: a peer message sent after arming surfaced only in the post-reset turn, right after the wake |
| Keyword tips actually delivered, once per session | 0.26.1 | covered — targeted hints unit-tested (REQ-PARITY-TARGETED-HINTS); phase 2 migrates them to the core briefing |
| Matched monic note arrives ahead of the message | 0.26.2 | covered — `[spt]` note per matched record ahead of the opening tag, attribute still rides (REQ-MONIC-NOTE-AHEAD, KNOWN-HAZARDS #13, 0.5.0) |
| "You are reachable" only after registration succeeds; refusal quoted | 0.27.0 | covered — activation announces only after a successful bind; a failed bind reports the reason and leaves the session unactivated |
| Trust warning rides the message envelope | 0.27.0, spt-core #170 | covered — REQ-HAZARD-ENVELOPE-ATTRIBUTE-PASSTHROUGH (0.3.33) |
| Alt Anthropic accounts: profiles, shared work history, plugin store, update from alt session | 0.29.0, 0.29.1, 0.29.3, 0.29.5 | N/A — OMP's native provider/profile routing already covers alternate accounts (explicit non-goal below) |
| Sealed message arrives with its seal shown and verify commands named | 0.30.0 | covered — `[spt] SEALED by … seal=<token>` note names `spt api seal verify` / `describe` (REQ-SEAL-SURFACE, 0.5.0) |
| Every envelope attribute survives delivery | 0.31.0 | covered — REQ-HAZARD-ENVELOPE-ATTRIBUTE-PASSTHROUGH |
| Damaged envelope: body delivered with a warning | 0.31.0 | divergence — omp-spt fails closed on protocol corruption (listener-fatal, REQ-tested); a corrupt frame is never presented as a delivery |
| Turn text (user prompt, every assistant message, closing text) reported to spacetime's feed, exactly once | 0.32.0, 0.33.0, 0.35.0 | covered — REQ-IO-TURN-FEED (0.4.0): `api state --payload-stdin`, mid spans `--mid`, stub turns carry no USER_INPUT |
| Per-turn "what changed?" briefing at turn start and mid-turn; agent's own words feed keyword matching | 0.33.0, 0.33.1, 0.34.0 | covered — REQ-NOW-SIGNAL-INJECT (0.4.0): `api now-signal --spec-manifest` at turn start and every in-turn boundary; hints are manifest `[[hints]]` |
| `@<…@>` and `;;` read by spacetime, not the adapter; results in `DISPATCH_RESULTS`; reset-turn send still goes out | 0.36.0 | covered — REQ-IO-COMPLIANCE + REQ-HAZARD-SHORTFORM-DOUBLE-FIRE (0.4.0): `[io] compliance = true` landed with the parser deletion; the message that invokes `spt_checkpoint` is a `toolUse` stop, reported at `message_end` before the tool compacts, so a tag in it goes out |
| Commune-across wake marker detected whatever tool wrote the file; marker near the top; quoted markers inert | 0.37.0, 0.38.0, 0.38.1, 0.38.2 | N/A — omp-spt's checkpoint is the explicit native `spt_checkpoint` tool (REQ-PARITY-CHECKPOINT); no file-marker parsing exists to misfire |
| spt-core floor raised (v0.64.0, v0.66.0) for the feed | 0.32.0, 0.35.0 | covered — omp-spt floor is v0.67.0 (0.3.33) |
| Commune drop no longer mistaken for a Psyche summary (boundary armed only from a self-written commune); one more tool call after a commune protects the wake | 0.38.3 | N/A — omp-spt's checkpoint is the native `spt_checkpoint` tool; no drop-file marker or race with the Psyche summary |
| Boundary armed only from a commune written during the current session; the newest commune in an io-events replay wins; the record names the commune and matched text | 0.38.4, 0.38.5 | N/A — omp-spt reads no `io-events` and arms no boundary from communes (its checkpoint is the native `spt_checkpoint` tool), so a replayed or re-numbered history cannot clear a live session |
| "One more tool call after a commune" guidance narrowed to across-communes | 0.38.6 | N/A — omp-spt has no commune drop file to race and no wake marker to arm; its checkpoint is the explicit native `spt_checkpoint` tool, which since 0.7.0 arms in the tool and resets after the turn ends (KNOWN-HAZARDS #16) |

Not sister-driven but absorbed by the same pass: spt-core v0.67.0 retired `spt endpoint run`
(`ENDPOINT_RUN_RETIRED`); every bringup this adapter teaches now names `endpoint create` /
`start` / `resume` / `spt go` (0.3.33).

## Proven shared endpoint surface

The current adapters already share release install/update, broker-hosted fresh
launch and attachment, native resume, ReadyAgent and LiveAgent roles,
post-spawn identity, inbound delivery, explicit outbound messaging, busy/idle
lifecycle, graceful shutdown, Psyche turns, commune/signoff storage,
echo-commune, opaque history, digest extraction, and Windows x86-64 plus GNU
Linux x86-64 release payloads.

<!-- [doc->REQ-OMP-SESSION-TITLES] -->
Hosted OMP matches the sibling session-name shape, `<endpoint-id> @ <node>
(<project-name>/)`, and improves fleet scanning with an idle glyph or animated
busy spinner in the terminal window title.

OMP keeps its stronger native invariants: immutable endpoint/session binding,
one bounded custody queue, finite listener recovery, fail-closed exhaustion,
real OMP executable validation, and strict separation between local assistant
output and explicit outbound peer messaging. Capability parity does not weaken
those guarantees.

## Agent-facing parity decisions

<!-- [doc->REQ-PARITY-READY-ACTIVATION] -->
<!-- [doc->REQ-PARITY-LIVE-ACTIVATION] -->
<!-- [doc->REQ-PARITY-LIVE-AUTO-RESUME] -->
Ordinary OMP sessions gain extension-native `/ready` and `/live` activation
commands with argument completion or native selection dialogs. Explicit live
auto-resume selects the most-recent compatible live identity; ordinary
activation never guesses silently. The extension binds the current session and
owns the authenticated listener, after which binding is immutable.

<!-- [doc->REQ-PARITY-SAFE-BOUNDARY-DELIVERY] -->
Messages accepted during an active OMP turn enter at the first proven boundary
before the next tool or model continuation. Custody and arrival order remain
intact; a turn with no injectable boundary falls back to ordinary next-turn
delivery rather than interruption.

<!-- [doc->REQ-HAZARD-ABNORMAL-TURN-RECEIVABILITY] -->
Cancelled, interrupted, and failed turns settle affected custody and restore
receivability automatically. Only exhausted listener recovery closes the
endpoint.

<!-- [doc->REQ-PARITY-RESUME-CONTEXT] -->
An activated session pulls its durable mind — role, cross-project live context,
and the current project's context, plus any commune or signoff drop not yet
synthesized into them — and receives it as opening context ahead of the startup
brief. The pull is authenticated by the bind token, so reading the mind never
re-pins the perch; a fresh endpoint with nothing stored yet injects nothing, and
a failed pull is reported without failing activation.

<!-- [doc->REQ-PARITY-STARTUP-BRIEF] -->
<!-- [doc->REQ-NOW-SIGNAL-INJECT] -->
<!-- [doc->REQ-PARITY-TARGETED-HINTS] -->
<!-- [doc->REQ-PARITY-UPDATE-NOTICE] -->
Activated sessions receive a concise startup brief for identity, roster,
messaging (shortform-by-core, `DISPATCH_RESULTS`, seals), continuity,
lifecycle, subnet, version, and update operations. Its messaging line spells the
shortform grammar out (`@<doyle your text @>`: the opener is `@<` glued to the
id, `@<doyle` never `@doyle`, ids comma-joined, closer ` @>`), after todlando
opened with `@doyle … @>` on 2026-09-06 and had to resend. The brief is the
head of the **context ledger** (below), so every provider request of the session
carries it. Everything situational after
that arrives through spt-core's one funnel, `api now-signal <id> --session <sid>
--spec-manifest`: the extension polls it at turn start with the user's words
(none on a delivery-stub turn), and again at every in-turn context boundary with
the assistant's words since the last poll, and logs every non-empty answer —
every kind, verbatim, timestamped — in the context ledger, which the next
provider request carries. It is
delta-only, so a quiet boundary adds nothing; a failed poll is a soft comms fault
and never a broken turn; inline words are clipped to 8 KB. Targeted hints for
clear live-activation, identity, messaging, subnet, and checkpoint intent are
declared as manifest `[[hints]]` (regex keywords, first match wins) and surface
once per session through the `HINTS` category; the versions in play (spt-core,
this adapter) surface through `UPDATES` whenever they change, so the adapter runs
no version probe of its own.

<!-- [doc->REQ-CONTEXT-LEDGER] -->
### The context ledger (0.9.0)

OMP applies an extension's `context` hook per provider request (`transformContext`
inside `prepareProviderCall`) and never writes its output back to the session
store, and it discards the `before_agent_start` system-prompt override when the
turn ends (`agent-session.ts`: "the per-turn before_agent_start override lives
only for this turn"). claude-spt's hook `additionalContext` lands in the Claude
Code transcript and persists; on omp-spt, everything added those two ways — the
brief, the durable mind on resume, every now-signal, every delivery polled while
busy — was seen for one turn or one request and then gone. KNOWN-HAZARDS #10 was
the first symptom (delivered bodies); the ledger closes the class (#18).

The ledger is one hidden custom message (`spt-context-ledger`) re-spliced as the
**last** message of every provider request of an activated session, in-turn and
off-turn alike: a head — the durable mind (prepended when its pull resolves), then
the startup brief — and an ordered log of everything spt added since the last
reset, each entry stamped `[YYYY-MM-DDTHH:MM:SSZ] <kind>`: `now-signal` (every
kind, verbatim, turn-start and boundary alike), `delivery` (arrival time and
sender; the body stays durable through the stub, #10), `delivery (polled while
busy)` (the envelopes verbatim — they had no other durable home), `reset`. Order
and timing are part of the memory: nothing is filtered or summarised (operator
ruling, 2026-09-06). Tail placement keeps the transcript prefix cache-stable; a
changing system prompt would invalidate the provider cache for the whole session
on every change. The log is bounded (32 KB by default, `contextLedgerBytes`),
evicts oldest first with a visible count, clips a single entry at 16 KB, and
clears on `session_compact` — the head stays and the reset is the new log's first
entry. A new session gets a new ledger at activation. The old per-turn
system-prompt override and the per-request `spt-now-signal` / `spt-event`
messages are gone. Field check on hertz (0.9.0, stopped + resumed 11:49:50Z,
2026-09-06): asked to quote the block, it returned the header sentence verbatim
and, on turn 1, two entries — `[2026-09-06T11:50:20Z] delivery`,
`[2026-09-06T11:50:20Z] now-signal`; on turn 2, four — the same two followed by
`[2026-09-06T11:51:10Z] delivery`, `[2026-09-06T11:51:10Z] now-signal` — the
turn-1 entries persisted, in order, timestamped. A native checkpoint then
compacted the session and the wake turn quoted a one-line log:
`[2026-09-06T11:55:00Z] reset` — the head intact, the log restarted.

<!-- [doc->REQ-IO-TURN-FEED] -->
Every turn's text is reported to spt-core's IO feed exactly once per span:
the user's prompt opens the turn as `USER_INPUT` on `api state busy <id>
--payload-stdin`, each completed assistant message goes out as a mid-turn
`AGENT_OUTPUT` span (`--mid` — at `message_end` for a `toolUse` stop, so a peer
named in it never waits on a long tool, and at the next context boundary as the
catch-all), and the closing message rides `api state idle <id> --payload-stdin`.
Payloads travel on stdin only. A payload-carrying call is an event and never
takes the same-state short-circuit; a failed report is logged and the turn
completes. A delivery-stub turn (a peer's `<msg from=…/>` woke the model)
carries no `USER_INPUT`: that body is already core's `MSG_IN`. Partial output
of an aborted or errored turn is not reported.

<!-- [doc->REQ-PARITY-COMMUNE-SKILL] -->
<!-- [doc->REQ-PARITY-CHECKPOINT] -->
<!-- [doc->REQ-PARITY-SIGNOFF-SKILL] -->
<!-- [doc->REQ-PARITY-ROLE-SKILL] -->
Public OMP `omp-plugins` packaging supplies model-driven skills for commune,
signoff, and durable-role inspection/editing. Commune checkpoint mode saves
continuity, resets OMP context through native session APIs, and wakes the same
endpoint without operator intervention.

<!-- [doc->REQ-KNOCK-SKILL] -->
The packaged knock skill (0.5.0) teaches the published access-control grammar: bare
`spt knock <target>` is `send` and asks for `MSG`; `send`/`redeem` require exactly one of
`--send-only` | `--send-receive` while `approve`/`new-code` take none; `--send-only` never bars
replies; approving opens nothing in reverse (knock back); invite codes are sealed to a subnet;
`--monic` imparts a standing note; the inbox is quiet, so look with `spt knock list`. A manifest
`[[hints]]` row surfaces the skill on knock intent.

<!-- [doc->REQ-USAGE-LIMIT-HOLD] -->
A provider usage-limit refusal (0.6.0) is an outage, not a fault. When a turn ends with an
account-level refusal — OMP's `errorId` UsageLimit flag, HTTP 402, or refusal wording without
per-interval wording — the extension says so once (nothing is broken, the session and its context
are intact, only a human or the stated reset changes anything, the provider's line quoted) and then
holds the endpoint `busy` until the provider's stated reset plus one minute, re-asserting `api state
busy` every five seconds so a stray recovery is corrected within seconds. Peer deliveries stay
custodied and unsubmitted (a submission would spend the message into a refused turn) and the
deaf-session ladder is paused for the hold. A real human prompt releases the hold early; the
deadline releases it and resubmits everything queued, in order. Across a restart the session's own
record re-arms the hold when its last message is still the refusal and the anchored deadline lies
ahead; a refusal that is merely old history never triggers. No parseable or plausible reset means no
hold beyond the notice — the failure direction is always "reachable too early".

<!-- [doc->REQ-PSYCHE-ACCOUNT-REFUSAL] -->
<!-- [doc->REQ-COMPANION-FAILURE-TAILS] -->
<!-- [doc->REQ-PSYCHE-INVOCATION-BUDGET] -->
The Psyche runner (`psyche-omp`) maps the same refusal on its inner OMP turn to the published
reserved exit code `96` — spt-core then paces retries, keeps custody, never reseeds and spends no
strike — with a `PSYCHE_ACCOUNT_REFUSAL` line that says outage-not-fault and quotes the provider.
Every other inner failure (Psyche or echo-commune) exits 1 with a bounded tail of BOTH inner
streams in the line, naming a silent channel explicitly. Both LLM-turn roles declare their
invocation budget in the manifest (`psyche_resume` 240 s, `echo_commune` 180 s) instead of riding
the 90-second default.

<!-- [doc->REQ-ECHO-NO-MACHINE-PEERS] -->
<!-- [doc->REQ-ENDPOINT-NAMED-LOGS] -->
<!-- [doc->REQ-LONG-FOREGROUND-NUDGE] -->
Phase 5 polish rides 0.6.0: the echo-commune summarizer names another agent only where the
transcript shows a direct exchange and never presents a machine, host, or node name as an agent or
teammate; every extension log line is prefixed `[omp-spt <id>]`; and a foreground `bash` call that
measured 30 s or more gets one `[spt]` nudge appended to its result (at most three per turn, advice
only) to run such commands with `async: true` so peer deliveries keep landing at the boundaries.

<!-- [doc->REQ-CHECKPOINT-DELIVERY-HOLD] -->
The 0.7.0 close-out of this pass turned the two `unverified` rows into covered ones and fixed
what the audit found underneath them. The native checkpoint is now armed by `spt_checkpoint`
and run by the extension after the arming turn ends — OMP's compaction aborts the run and waits
for it, and the run waits for the tool, so an in-tool reset was a hang (KNOWN-HAZARDS #16) —
and from arming until the wake is queued every inbound delivery stays custodied unsubmitted, the
status rail reads ` · checkpoint pending`, and the release resubmits them into the post-reset
turns. A subagent's copy of the extension is inert: exactly one binding per OMP process
activates (KNOWN-HAZARDS #15), so a message can only ever surface in the main conversation.

<!-- [doc->REQ-BIND-REFUSAL-DIAGNOSTIC] -->
A failed `spt` command is reported by the line that explains it (0.7.1). spt-core prints
diagnostics and its status line on the same streams and a diagnostic can come first — `api bind`
prints the eager reserved-id probe `ER_HOSTED_PROBE:…` ahead of a `CONFLICT:<id> is live under
session …` refusal (spt-bs-releases#279) — so the summary skips such diagnostics and the log line
carries the command's whole output. The 0.7.0 subagent field report cited the probe line as the
refusal because the first-line summary had dropped the CONFLICT line (F-037).

<!-- [doc->REQ-PARITY-SETUP] -->
Setup is hybrid: an extension-native command owns deterministic probes and
activation, while a packaged skill owns diagnosis, repair strategy, published
installer use, subnet onboarding, and explicit operator handoffs for
authentication or elevation.

<!-- [doc->REQ-PARITY-PEER-SHORTFORM] -->
<!-- [doc->REQ-IO-COMPLIANCE] -->
Assistant output may dispatch the explicit cross-harness peer-message shortform
`@<target[,target] message @>` and mint wax seals with a `;;…;;` pair — read by
**spt-core**, not the adapter: the manifest declares `[io] compliance = true`,
so core parses the `AGENT_OUTPUT` spans the feed reports (a tag inside backticks
or a fence is a quotation; a tag that never closes sends nothing) and reports
the outcome only through the now-signal's `DISPATCH_RESULTS`. The extension
carries no shortform parser and issues no `send` at turn end (KNOWN-HAZARDS
#12). Ordinary `@` mentions have no side effect.
Normal outbound messaging, roster, stop/shutdown, version, and subnet commands
are taught through setup or startup context rather than duplicated as skills.

OMP's native provider/profile routing satisfies alternate provider, account,
and model routing parity; no `omp-spt:<profile>` analogue of Claude's CCS
overlay is required.

## Release-target parity

<!-- [doc->REQ-DIST-LINUX-MUSL] -->
The supported target set is Windows x86-64 MSVC, GNU Linux x86-64, and a static
Linux x86-64 musl helper compatibility tier for OMP-capable hosts where the GNU
helper is incompatible. The musl tier requires full native endpoint acceptance
on a representative target host; it does not imply generic Alpine support when
OMP itself is unavailable.

Neither sister adapter packages macOS or Arm64, so those remain explicit shared
limitations rather than current parity gaps.

<!-- [doc->REQ-DIST-VERSION-CONSISTENCY] -->
The manifest version is canonical. Release gates reject disagreement in the
helper crate, changelog heading, and versioned public documentation.

<!-- [doc->REQ-DOCS-PUBLISH-GATE] -->
Deterministic local documentation generation and drift checks gate changes.
GitHub Pages publication runs the same gate before publishing.

<!-- [doc->REQ-DIST-RELEASE-EVIDENCE] -->
Each supported target retains a machine-readable release record naming the
target, source commit and tag, artifact digests, acquisition result, and native
fresh/resume, message/explicit-reply, lifecycle, shutdown, and
ReadyAgent/LiveAgent acceptance outcomes.

## Explicit non-goals

- Worker endpoint advertisement or OMP-subagent endpoint topology.
- macOS, Arm64, or 32-bit release payloads in this parity program.
- A CCS adapter overlay where native OMP provider/profile routing supplies the
  same outcome.
- Claude hooks, PTY translation, plugin reconciliation, or model-managed
  background polling.
- Claude's retired `>>commune<<` output marker.
- Public support promises for the helper binary's manifest-role subcommands.
- Separate skills for send, roster, stop, version, or subnet.

## Delivery order

Coverage lands in dependency order:

1. repair version and documentation truth, then prove packaged-skill discovery
   and injectable OMP event seams;
2. implement extension-owned ready/live activation, live auto-resume,
   safe-boundary delivery, and abnormal-turn receivability;
3. add startup briefs, targeted hints, update notices, packaged skills,
   checkpoint continuity, hybrid setup, and peer-message shortform;
4. add the musl target and durable machine-readable acceptance records for all
   supported targets.
