{
  "summary": "# Release/distribution parity audit (worker endpoints excluded)\n\n## Executive findings\n\n1. **Common release topology:** both adapters ship one default-name, multi-platform GitHub release asset, `adapter.spt`, with a root `manifest.toml` plus target-triple subdirectories. Neither has per-OS asset names. OMP publishes at `BigscreenVR/omp-spt`; Claude publishes at `SaberMage/claude-spt` (`ci/publish/package-adapter.sh:1-18` in each repo; OMP `docs/RELEASE-RUNBOOK.md:1-20`; Claude `docs/RELEASE-RUNBOOK.md:170-186`).\n2. **Concrete target parity gap:** Claude’s implemented packer has a third target, `x86_64-unknown-linux-musl`, in addition to the shared Windows-MSVC and Linux-GNU targets (`../spt-claude-code/ci/publish/package-adapter.sh:23-30,48-60,80-96,128-160`). OMP packages only `x86_64-pc-windows-msvc` and `x86_64-unknown-linux-gnu` (`ci/publish/package-adapter.sh:32-38,65-99,118-181`). OMP therefore has no static/pre-glibc Linux release target corresponding to Claude’s musl tier.\n3. **macOS claim/build contradiction in Claude:** Claude’s README presents a “bash (macOS / Linux / Git Bash on Windows)” installation path (`../spt-claude-code/README.md:31-35`), but no Darwin target appears in its packer or archive test; only three x86_64 Windows/Linux triples exist (`../spt-claude-code/ci/publish/package-adapter.sh:54-59`; `../spt-claude-code/tests/adapter-archive.sh:11-24`). OMP is explicit that macOS and Arm64 are not supported (`README.md:27`; `docs/RELEASE-RUNBOOK.md:18-20`).\n4. **Claude release documentation is stale relative to implementation:** its current runbook still says only Windows-MSVC and Linux-GNU are recognized and instructs building “both platforms” (`../spt-claude-code/docs/RELEASE-RUNBOOK.md:188-214`), while current packer/test require three binaries including musl. The changelog claims the musl tier shipped in v0.18.1 (`../spt-claude-code/CHANGELOG.md:107-114`). There is no musl build recipe or musl-native acceptance procedure in the runbook.\n5. **No hosted CI matrix exists in either repository:** broad searches found no `.github/workflows`, YAML CI configuration, Jenkinsfile, CircleCI, Azure Pipelines, or GitLab CI file. OMP has a local deterministic dispatcher (`ci/run-gates.sh:1-38`) and a manual two-host release acceptance specification (`docs/CI.md:31-104`). Claude explicitly documents a Windows+Linux private fleet and explicitly rejects hosted runners (`../spt-claude-code/docs/CI.md:1-9,92-95`), but its only trigger is a non-fatal client `pre-push` message to one configured runner id (`../spt-claude-code/ci/git-hooks/pre-push:1-19`); no source-controlled runner/OS matrix assigns or requires both platforms.\n6. **Target testing is weaker than target packaging, especially in Claude:** OMP’s archive test always synthesizes PE/ELF fixtures and verifies target names, magic bytes, Linux executable mode, exact members, and missing/wrong-format refusal (`tests/adapter-archive.sh:25-143`). Claude’s archive test first looks for all three real binaries and, if any is absent, merely proves the packer refuses and then exits successfully with `SKIP` (`../spt-claude-code/tests/adapter-archive.sh:18-36`). Thus Claude’s default gate can be green without ever constructing or inspecting a fat archive. Its packer also checks only file existence, not PE/ELF magic or Linux executable mode (`../spt-claude-code/ci/publish/package-adapter.sh:76-96,134-160`).\n7. **OMP packaging validation is materially stronger:** OMP refuses non-PE/non-ELF inputs (`ci/publish/package-adapter.sh:65-99`), authors portable Linux mode `0755` plus normalized uid/gid names through Python (`ci/publish/create-adapter-archive.py:9-18,27-56`), and revalidates exact members, magic, and executable mode from the finished archive (`ci/publish/package-adapter.sh:145-183`). Claude stages with ordinary `cp`/`tar` and validates names/top-level directories only (`../spt-claude-code/ci/publish/package-adapter.sh:128-160`). This is a concrete platform-release parity gap: Claude can accept a mislabeled target file or a non-executable Linux member that OMP rejects.\n8. **Signing/checksum reality differs from Claude’s prose:** neither current manifest declares `signing_key`; both use `[update] avenue = \"gh_release\"`, `transport = \"gh\"` (OMP `adapter/omp-spt.toml:18-31`; Claude `adapter/claude-spt.toml:557-608`). The vendored public schema explicitly says absent `signing_key` means HTTPS+GitHub first-acquisition trust, while a present key enables fail-closed Ed25519 verification (`adapter/manifest.schema.json:599-664`; Claude copy `../spt-claude-code/adapter/manifest.schema.json:599-659`). Therefore Claude runbook statements that signing is “delegated to the spt binary” and that it performs signing/integrity (`../spt-claude-code/docs/RELEASE-RUNBOOK.md:3-6,24-29,91-98`) are documentation claims, not evidence of signed adapter bytes. Neither packer generates `.sha256`, `.sig`, SBOM, provenance, or attestation assets.\n9. **Checksums:** OMP’s release runbook computes SHA-256 for the archive and both input executables immediately before upload and requires retaining them as release evidence (`docs/RELEASE-RUNBOOK.md:157,180-184,269-278`), but uploads only `adapter.spt`; it does not publish a checksum file. The public GitHub API for v0.2.1 independently reports the uploaded asset’s GitHub-computed digest `sha256:0aaeba23d550da918845a995053285e24ba2c584aad47eec19364527a506aeba`, size 671260, and exactly one user-uploaded asset named `adapter.spt`: https://api.github.com/repos/BigscreenVR/omp-spt/releases/tags/v0.2.1 . No analogous public verification was possible for Claude because the repository is private/returns 404; the repo-local report only claims v0.21.0 and its Windows/supported-Linux artifacts were published (`../spt-claude-code/.claude/reports/2026-07-10-user-prompt-hook-timeout/README.md:41-49`).\n10. **Installer/runtime dependency asymmetries:** OMP intentionally has no plugin distribution or reload step (`README.md:15-27`; `docs/RELEASE-RUNBOOK.md:16`). Claude has two independent versioned distribution targets: adapter manifest/binary and the `sptc` cplugs skeleton (`../spt-claude-code/docs/RELEASE-RUNBOOK.md:10-29`; plugin version `0.1.13` at `../spt-claude-code/plugin/sptc/.claude-plugin/plugin.json:1-9`, versus adapter version `0.21.0` at `../spt-claude-code/adapter/claude-spt.toml:491`). Its skeleton staging is manual/operator-pushed (`../spt-claude-code/ci/publish/package-skeleton.sh:1-49`) and update reconciliation is a post-update binary subcommand (`../spt-claude-code/adapter/claude-spt.toml:607-609`; `../spt-claude-code/tools/claude-spt/src/post_update.rs:1-18,39-71`).\n11. **Install documentation omits load-bearing dependencies:** both manifests force `transport = \"gh\"`. OMP’s acquisition test requires `gh` installed and authenticated (`ci/publish/release-acquire-int.sh:12-27`), yet end-user README prerequisites/install commands install only OMP and spt (`README.md:15-50`). Claude’s private-repo runbook correctly states every node needs authenticated `gh` or `GH_TOKEN` (`../spt-claude-code/docs/RELEASE-RUNBOOK.md:215-225`), but its end-user install block likewise mentions only Claude Code and spt (`../spt-claude-code/README.md:13-38`). Claude additionally requires Bash for all plugin hooks, including Windows (`../spt-claude-code/plugin/sptc/hooks/hooks.json:1-42`), while the Windows README path does not state a Git-Bash/Bash prerequisite.\n12. **Claude terminal install does not visibly install the advertised plugin:** Method A only installs spt and runs `spt adapter add --release` (`../spt-claude-code/README.md:13-35`). The skeleton’s authoritative install/pointer flip is a separate `claude plugin install sptc@cplugs` plus `/reload-plugins` step (`../spt-claude-code/docs/RELEASE-RUNBOOK.md:145-153`), and `[update.post]` is documented/code-wired after `spt adapter update`, not initial `adapter add` (`../spt-claude-code/adapter/claude-spt.toml:588-609`; `../spt-claude-code/tools/claude-spt/src/post_update.rs:1-18`). This is an installer completeness asymmetry; OMP has no secondary plugin by intentional design.\n13. **Runtime floor guidance mismatch in Claude’s packer:** current manifest requires spt-core `0.27.0` (`../spt-claude-code/adapter/claude-spt.toml:541`), but the packer’s end-user dry-run/final text hard-codes “Needs spt v0.13.2+” (`../spt-claude-code/ci/publish/package-adapter.sh:112-121,164-168`). OMP’s equivalent text derives the actual manifest floor (`ci/publish/package-adapter.sh:52-63,108-116,184-188`) and its tests assert that coupling (`tests/adapter-archive.sh:140-151`).\n\n## Platform matrix\n\nStatus vocabulary: **Published** = externally observed release asset; **Implemented** = packager has a required target leg; **Packaging-tested** = deterministic archive behavior is asserted; **Runtime-test specified** = release docs mandate native acceptance but no run record was found; **Claimed** = prose/repo-local status only; **Absent** = no build/package target.\n\n| Platform / target | omp-spt build & distribution | omp-spt test/evidence | claude-spt build & distribution | claude-spt test/evidence | Parity result |\n|---|---|---|---|---|---|\n| Windows x86_64, `x86_64-pc-windows-msvc` | **Implemented + Published** in `adapter.spt`; PE required (`ci/publish/package-adapter.sh:34-38,72-84,123-130`). Public v0.2.1 archive listing contains this triple. | **Packaging-tested** with PE fixture/magic (`tests/adapter-archive.sh:33-47,99-115`). **Runtime-test specified** independently on Windows (`docs/CI.md:31-104`), but no committed v0.2.1 acceptance record found. | **Implemented** and repo-local **Claimed published** (`../spt-claude-code/ci/publish/package-adapter.sh:54-60,80-96`; report lines 41-49). Public asset cannot be observed because repo is private. | Native build/test script builds the current host (`../spt-claude-code/ci/digest/build.sh:13-24`). Archive construction test is conditional/SKIP-capable (`tests/adapter-archive.sh:18-36`). Several Windows-only live tests exist, but no target-complete release record/matrix. | Shared intended target; OMP has stronger artifact validation and public evidence. |\n| Linux x86_64 GNU, `x86_64-unknown-linux-gnu` | **Implemented + Published**; ELF required; build recipe uses cargo-zigbuild or native Linux (`ci/publish/package-adapter.sh:35-38,72-99`; `docs/RELEASE-RUNBOOK.md:109-125`). Public v0.2.1 archive listing contains this triple. | **Packaging-tested** with ELF fixture, mode, exact layout (`tests/adapter-archive.sh:49-67,107-143`). **Runtime-test specified** independently on GNU Linux, but no committed run record found (`docs/CI.md:31-104`). | **Implemented** and repo-local **Claimed published** (`../spt-claude-code/ci/publish/package-adapter.sh:55-60,81-96`; report lines 41-49). GNU cross-build recipe exists (`docs/RELEASE-RUNBOOK.md:196-214`). | CI docs claim a Linux fleet (`docs/CI.md:1-9`), but no matrix/run evidence; archive test may SKIP. | Shared intended target; OMP has stronger artifact validation and explicit per-target release acceptance. |\n| Linux x86_64 musl, `x86_64-unknown-linux-musl` | **Absent.** OMP supports GNU Linux only and explicitly excludes all other targets (`docs/RELEASE-RUNBOOK.md:18-20`). | None. | **Implemented** in packer and test; changelog **claims shipped** since v0.18.1 for pre-glibc-2.39 hosts (`ci/publish/package-adapter.sh:23-30,56-59,82-95`; `CHANGELOG.md:107-114`). | Conditional archive-name assertion only (`tests/adapter-archive.sh:14,18-36,69-71`); no magic/static-link verification, no musl-native acceptance, no current runbook build recipe. | **Concrete Claude-only release target.** OMP parity gap. Claude’s own evidence remains incomplete. |\n| macOS x86_64 | **Absent and explicitly not supported** (`README.md:27`). | None. | **Absent from packer/tests**, but README offers a macOS installation command (`README.md:31-35`). | No Darwin build or acceptance. | No actual support in either; Claude has a docs-only claim/installer contradiction. |\n| macOS Arm64 / AArch64 | **Absent and explicitly not supported** (`README.md:27`). | None. | **Absent.** README’s unqualified macOS shell heading may imply it, but no aarch64/Darwin triple exists. | None. | No implemented target in either. |\n| Windows Arm64 | **Absent and explicitly excluded by “x86_64 Windows only”** (`README.md:27`). | None. | **Absent.** Only `x86_64-pc-windows-msvc`. | None. | No implemented target in either. |\n| Linux Arm64 GNU/musl | **Absent and explicitly excluded by “x86_64 Linux only”** (`README.md:27`). | None. | **Absent.** Both Linux targets are x86_64. README does not qualify Linux architecture. | None. | No implemented target in either; Claude docs omit the architecture boundary. |\n\n## Runtime/build dependency matrix\n\n| Dependency | omp-spt | claude-spt |\n|---|---|---|\n| Harness runtime | OMP `>=16.3.15`, command `omp` (`README.md:17-21`); helper validates real OMP before launch (`tools/omp-spt/src/launch_omp.rs:155-169,319-368`). | Claude Code preinstalled (`../spt-claude-code/README.md:13-16`); optional `ccs` profile/substitute. Helper directly spawns `claude` for Psyche/echo roles (`../spt-claude-code/tools/claude-spt/src/psyche.rs:252-256`; `echo_commune.rs:245-249`). |\n| spt-core floor | `0.31.0` (`adapter/omp-spt.toml:8-17`). | `0.27.0` (`../spt-claude-code/adapter/claude-spt.toml:541`). |\n| Install/update transport | `gh` CLI forced by manifest; acceptance requires installed+authenticated gh (`adapter/omp-spt.toml:18-31`; `ci/publish/release-acquire-int.sh:22-27`). | `gh` CLI forced because repo is private; OAuth/GH_TOKEN/read access required (`adapter/claude-spt.toml:571-582`; runbook `215-225`). |\n| User bootstrap tools | PowerShell `irm` on Windows or curl+sh on POSIX for OMP and spt (`README.md:29-50`). No in-product bootstrap. | Plugin bootstrap uses PowerShell `irm` or curl+sh (`plugin/sptc/bootstrap.ps1:1-15`; `bootstrap.sh:1-18`); terminal install uses the same external spt scripts (`README.md:17-35`). |\n| Hook/plugin runtime | None; packaged OMP extension is `strings/omp-spt.mjs`, loaded by OMP (`adapter/omp-spt.toml:64-75`; packer lines 20-29). | Bash is explicitly selected for every Claude hook, including Windows (`plugin/sptc/hooks/hooks.json:1-42`); `dispatch.sh` resolves and execs the packaged helper. Claude plugin manager and cplugs marketplace are required for `/sptc:*`. |\n| Helper implementation deps | Rust crate uses `serde_json` and `getrandom`; release is stripped (`tools/omp-spt/Cargo.toml:1-19`). Linux GNU target carries its platform libc dependency; no musl target. | Rust crate uses only `serde_json`; stripped release (`../spt-claude-code/tools/claude-spt/Cargo.toml:1-28`). GNU and claimed-static musl variants are packaged. |\n| Release operator toolchain | Rust/Cargo, Node, Python+TOML+jsonschema+tarfile, traceable-reqs, Zig/cargo-zigbuild for Linux, gh, and real OMP+spt acceptance hosts (`docs/RELEASE-RUNBOOK.md:29-41`). | Rust/Cargo, shell/tar, Python+TOML/jsonschema for schema gates, mdBook/traceable-reqs when present, Zig/cargo-zigbuild for GNU and musl; separate cplugs clone/credentials. Many gates explicitly SKIP absent tools (`ci/run-gates.sh:1-87`; `ci/publish/package-adapter.sh:76-96`). |\n\n## Implemented behavior versus documentation claims\n\n- **OMP:** implementation, README, packer, archive test, and release runbook agree on two x86_64 targets. Its public v0.2.1 asset is directly observable and has only the Windows and GNU-Linux triple directories. The only evidence gap is execution: the repo specifies full native acceptance on both target hosts but does not retain a committed v0.2.1 result record.\n- **Claude:** implemented target set is three x86_64 triples, while runbook still documents two; README additionally claims a macOS install route without a Darwin artifact. Its CI document claims Windows+Linux fleet execution, but no checked-in matrix or result artifact proves per-target execution. The v0.21.0 publication and combined Windows/Linux assets are repo-local claims because the private GitHub release is not externally readable in this investigation.\n- **Trust:** actual manifest behavior for both is unsigned `gh_release` acquisition under GitHub/transport trust. OMP’s local SHA-256 record discipline is not a published verification channel. Claude’s “delegated signing” prose overstates the configured manifest.\n\n## Intentional distribution asymmetry (not a parity defect by itself)\n\nOMP’s lack of a cplugs skeleton, Claude hooks, plugin reload, and plugin-version stream is explicit native-product design, not an accidental release omission (`README.md:23`; `OMP-ADAPTER-PLAN.md:147-154`; `CHANGELOG.md:16-27`). Platform-target findings above exclude endpoint worker topology as required.",
  "files": [
    {
      "path": "ci/publish/package-adapter.sh",
      "description": "OMP authoritative fat-archive packer: two target triples, PE/ELF validation, exact layout, executable-mode validation, and default `adapter.spt` naming."
    },
    {
      "path": "ci/publish/create-adapter-archive.py",
      "description": "OMP portable archive writer; explicitly authors member modes and normalized ownership metadata."
    },
    {
      "path": "tests/adapter-archive.sh",
      "description": "OMP deterministic archive contract proof using PE/ELF fixtures; validates target presence, magic, executable mode, exact members, and refusal cases."
    },
    {
      "path": "docs/RELEASE-RUNBOOK.md",
      "description": "OMP release sequence, build recipes, hashes, one-asset publication, two-host native acceptance, promotion, and update verification."
    },
    {
      "path": "docs/CI.md",
      "description": "OMP deterministic versus native acceptance boundary; requires separate Windows-x86_64 and Linux-GNU-x86_64 release acceptance."
    },
    {
      "path": "adapter/omp-spt.toml",
      "description": "OMP adapter version/floor and gh_release/gh transport manifest; no signing_key."
    },
    {
      "path": "README.md",
      "description": "OMP end-user prerequisites/installers and explicit x86_64 Windows/Linux-only support statement."
    },
    {
      "path": "tools/omp-spt/Cargo.toml",
      "description": "OMP helper crate dependency/runtime profile."
    },
    {
      "path": "../spt-claude-code/ci/publish/package-adapter.sh",
      "description": "Claude authoritative packer: Windows x86_64, Linux GNU x86_64, and Linux musl x86_64; checks existence and archive names but not binary magic/mode."
    },
    {
      "path": "../spt-claude-code/tests/adapter-archive.sh",
      "description": "Claude archive test; conditionally exits green after SKIP when any platform binary is missing."
    },
    {
      "path": "../spt-claude-code/docs/RELEASE-RUNBOOK.md",
      "description": "Claude two-target stale runbook, separate cplugs and adapter publish targets, private gh transport dependency, and misleading delegated-signing claims."
    },
    {
      "path": "../spt-claude-code/docs/CI.md",
      "description": "Claude claimed Windows+Linux private fleet CI and explicit absence of hosted runners."
    },
    {
      "path": "../spt-claude-code/ci/run-gates.sh",
      "description": "Claude local gate dispatcher; no OS/architecture matrix and multiple tool-dependent SKIPs."
    },
    {
      "path": "../spt-claude-code/adapter/claude-spt.toml",
      "description": "Claude adapter version/floor, gh_release/gh transport, post-update plugin reconciliation, no signing_key, and musl release history comments."
    },
    {
      "path": "../spt-claude-code/README.md",
      "description": "Claude end-user installer claims, including unsupported macOS heading and omission of gh/plugin pointer-flip prerequisites."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/.claude-plugin/plugin.json",
      "description": "Independent cplugs skeleton version stream (0.1.13)."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/hooks/hooks.json",
      "description": "All Claude hooks force Bash, including Windows runtime."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/bootstrap.sh",
      "description": "POSIX invisible spt-core installer using curl+sh."
    },
    {
      "path": "../spt-claude-code/plugin/sptc/bootstrap.ps1",
      "description": "Windows invisible spt-core installer using PowerShell irm/iex."
    },
    {
      "path": "../spt-claude-code/ci/publish/package-skeleton.sh",
      "description": "Manual/operator-driven skeleton staging; dry-run default and no marketplace push."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/src/post_update.rs",
      "description": "Post-update cplugs reconciliation behavior and Claude/ccs runtime dependencies."
    },
    {
      "path": "../spt-claude-code/tools/claude-spt/Cargo.toml",
      "description": "Claude helper crate dependency/runtime profile."
    },
    {
      "path": "adapter/manifest.schema.json",
      "description": "Vendored public manifest contract proving absent gh_release signing_key means HTTPS+GitHub trust, not content-signature verification."
    },
    {
      "path": "../spt-claude-code/CHANGELOG.md",
      "description": "Documentation claim that musl/static Linux shipped in adapter v0.18.1."
    },
    {
      "path": "../spt-claude-code/.claude/reports/2026-07-10-user-prompt-hook-timeout/README.md",
      "description": "Repo-local claim that v0.21.0 and Windows/supported-Linux artifacts were published; remaining acceptance explicitly noted."
    }
  ],
  "architecture": "Both projects delegate install/update orchestration to the published spt CLI and distribute a default `adapter.spt` tar.gz. At install, spt retains shared root files and selects/flattens the recipient platform’s recognized target directory. OMP’s archive is deliberately minimal: root manifest, one OMP extension, one Windows helper, and one GNU-Linux helper. Claude’s archive contains root manifest plus the entire strings tree and one consolidated helper for Windows-MSVC, Linux-GNU, and Linux-musl. Claude also has a second, independently versioned cplugs skeleton channel; adapter updates invoke a compiled post-update reconciler, while the final `/reload-plugins` remains manual. OMP intentionally has no second channel.\n\nNeither repository contains a hosted CI platform matrix. OMP’s source-controlled process is deterministic local gates followed by a documented manual prerelease→two-host native acceptance→promotion workflow. Claude’s source-controlled process is local gates plus a non-fatal pre-push message to an externally configured fleet runner; the claimed Windows/Linux fleet mapping and outcomes are outside the repository. Consequently target directories prove package intent, not native execution. OMP’s public release asset proves the two payload directories were actually published; Claude’s private release cannot be independently inspected here.\n\nThe configured trust chain is: external installer script first-fetch → spt registration → GitHub release fetch through authenticated `gh` → optional Ed25519 verification only if `signing_key` exists. Neither adapter configures that key, so both terminate at GitHub transport/account trust. OMP records local hashes and GitHub now exposes an API digest, but neither publishes checksum/signature sidecars. Claude’s prose describing delegated signing should therefore be classified separately from implemented behavior."
}