{
  "verdict": "BLOCK",
  "summary": "The canonical v0.2.0 topology is otherwise coherent, but five release blockers can either test the wrong tag, decouple the uploaded asset from the tag tree, or allow a stale/unlaunchable payload to be promoted.",
  "observed_release_history": {
    "source": "GitHub Releases API plus repository refs, observed 2026-07-14",
    "canonical_tags": [
      "omp-spt-v0.1.0",
      "omp-spt-v0.1.1",
      "omp-spt-v0.1.2",
      "omp-spt-v0.1.3"
    ],
    "canonical_titles": [
      "omp-spt v0.1.0",
      "omp-spt v0.1.1",
      "omp-spt v0.1.2",
      "omp-spt v0.1.3"
    ],
    "asset_layout": "Every observed omp-spt release is stable and has exactly one asset named adapter.spt.",
    "current_latest": "omp-spt-v0.1.3",
    "legacy_collision": "The repository already contains an unrelated inherited tag v0.2.0 at a11f545..., whose commit changes adapter/claude-spt.toml and the old sptc plugin. The new release must use omp-spt-v0.2.0."
  },
  "verified_good": [
    "adapter/omp-spt.toml declares adapter version 0.2.0, min_spt_core_version 0.29.0, gh_release repo BigscreenVR/omp-spt, gh transport, and no alternate asset name, so the public default adapter.spt update path is correct.",
    "CHANGELOG.md starts with omp-spt 0.2.0 dated 2026-07-14 and states the matching spt-core v0.29.0 floor and restart-based update path.",
    "docs/RELEASE-RUNBOOK.md uses the observed canonical tag/title convention omp-spt-vX.Y.Z / omp-spt vX.Y.Z, stages a prerelease with --latest=false, promotes only after acceptance, and publishes only dist/adapter.spt.",
    "ci/publish/package-adapter.sh targets the correct four logical members: root manifest.toml, strings/omp-spt.mjs, x86_64-pc-windows-msvc/omp-spt.exe, and x86_64-unknown-linux-gnu/omp-spt.",
    "The update commands spt adapter update omp-spt, version verification, and endpoint stop/re-run are consistent with the manifest update notice and current public installation path."
  ],
  "blockers": [
    {
      "severity": "P1",
      "confidence": "10/10",
      "path_symbol": "docs/CI.md:38, tagged candidate install command; ci/publish/release-acquire-int.sh:6, TAG default",
      "problem": "Both use the legacy unnamespaced vX.Y.Z convention. For 0.2.0, v0.2.0 already names the inherited claude-spt tree, while every actual omp-spt GitHub release uses omp-spt-vX.Y.Z. The integration default v0.1.3 also has no matching omp-spt GitHub Release in the observed release list.",
      "impact": "The documented native acceptance command cannot acquire the staged omp-spt v0.2.0 candidate. Depending on release state, it either 404s or addresses the legacy tag namespace instead of the candidate being promoted.",
      "fix": "Change docs/CI.md to --tag omp-spt-vX.Y.Z. Change the integration default to omp-spt-v0.1.3 or, safer, require OMP_SPT_RELEASE_TAG whenever OMP_SPT_ACCEPTANCE=1. The exact v0.2.0 acquisition command is: spt adapter add --release BigscreenVR/omp-spt --tag omp-spt-v0.2.0."
    },
    {
      "severity": "P1",
      "confidence": "10/10",
      "path_symbol": "docs/RELEASE-RUNBOOK.md:37,53-150, tag-tree source-of-truth and build/package/tag order",
      "problem": "The runbook declares the tag tree authoritative but builds and packages the working tree before creating the tag, with no clean-tree or commit-identity gate. This branch is explicitly uncommitted and .git/logs/HEAD contains no commit after checkout from 9c70f357..., so running the release steps now would package the working-tree 0.2.0 source and tag the old committed tree.",
      "impact": "GitHub can publish an adapter.spt whose manifest, extension, and binaries do not come from the commit named by omp-spt-v0.2.0. --verify-tag verifies only that the tag exists, not asset provenance.",
      "fix": "Require a committed, clean release tree before any gate/build, capture its commit, and recheck it immediately before tagging/uploading. Recommended guard sequence after the release commit exists: git diff --exit-code; git diff --cached --exit-code; RELEASE_COMMIT=$(git rev-parse HEAD); run gates/build/package; test \"$(git rev-parse HEAD)\" = \"$RELEASE_COMMIT\"; git diff --exit-code; git diff --cached --exit-code; git tag omp-spt-v0.2.0; test \"$(git rev-list -n 1 omp-spt-v0.2.0)\" = \"$RELEASE_COMMIT\". A fresh detached worktree at that commit is stronger."
    },
    {
      "severity": "P1",
      "confidence": "9/10",
      "path_symbol": "ci/publish/release-acquire-int.sh:22-38; docs/RELEASE-RUNBOOK.md:152-202, acquisition and promotion flow",
      "problem": "Tagged acquisition verifies registration source and adapter_label but never verifies that the manifest inside the uploaded candidate reports 0.2.0. The first version assertion occurs only after the prerelease has already been promoted to latest stable.",
      "impact": "A stale prior adapter.spt uploaded under omp-spt-v0.2.0 can pass the acquisition integration and potentially the behavior checks, then be promoted. The mismatch is discovered only after the default stable channel has been changed.",
      "fix": "Make the integration accept/derive an expected version and fail unless spt adapter version omp-spt reports it. At minimum, before gh release edit, run: spt adapter add --release BigscreenVR/omp-spt --tag omp-spt-v0.2.0; spt adapter version omp-spt, and require exactly 0.2.0. Also inspect the staged release before promotion with: gh release view omp-spt-v0.2.0 --repo BigscreenVR/omp-spt --json tagName,isPrerelease,assets."
    },
    {
      "severity": "P1",
      "confidence": "9/10",
      "path_symbol": "ci/publish/package-adapter.sh:88-112, staging/self-validation; tests/adapter-archive.sh:62-70, shared strings assertion",
      "problem": "The packer does not fail individual cp operations and its final validation never requires the exact strings/omp-spt.mjs member. The unit test accepts any strings/ entry rather than the required extension file.",
      "impact": "A missing or partially copied native extension can still produce a packer success if the strings directory exists. Installation can register successfully, but every native endpoint launch then fails because the manifest points at {adapter_dir}/strings/omp-spt.mjs.",
      "fix": "Require adapter/strings/omp-spt.mjs as an input, make every staging copy/mkdir fail-fast, assert an exact strings/omp-spt.mjs member in the finished archive, and add a negative test proving packaging refuses when that file is absent. Before upload, verify tar -tzf dist/adapter.spt includes exactly manifest.toml, strings/omp-spt.mjs, and the two target binaries, aside from directory entries."
    },
    {
      "severity": "P1",
      "confidence": "8/10",
      "path_symbol": "ci/publish/package-adapter.sh:52-67,88-107; tests/adapter-archive.sh:35-86; docs/RELEASE-RUNBOOK.md:65-97,152-175",
      "problem": "The packer checks only that each binary path is a regular file. The archive test deliberately uses text fixtures and even accepts a Linux fixture created without an executable-bit setup. The release flow performs native acceptance on one unspecified node/platform, so the other target is never executed before promotion.",
      "impact": "A stale, wrong-format, corrupt, or non-executable Windows or Linux member can be shipped in the one shared asset. Acceptance on the good platform still passes; users on the other platform receive an installed adapter that cannot launch.",
      "fix": "Have packaging enforce the Linux member's executable mode and validate target formats, add corresponding negative tests, and run tagged acquisition plus at least a fresh native launch on both x86_64 Windows and x86_64 Linux before promotion. On each platform: spt adapter add --release BigscreenVR/omp-spt --tag omp-spt-v0.2.0; spt adapter version omp-spt; spt endpoint run --adapter omp-spt --id <platform-specific-disposable-id> --create. The current workspace has tools/omp-spt/target/release/omp-spt.exe, but the Linux release binary and dist/adapter.spt are absent, so the documented cargo zigbuild and package-adapter.sh --apply steps are still required."
    }
  ],
  "required_release_commands_after_fixes": [
    "git diff --exit-code",
    "git diff --cached --exit-code",
    "sh tests/ci-gates.sh",
    "sh ci/run-gates.sh",
    "node tests/omp-extension.mjs",
    "sh ci/digest/build.sh",
    "rustup target add x86_64-unknown-linux-gnu",
    "cargo zigbuild --release --target x86_64-unknown-linux-gnu --manifest-path tools/omp-spt/Cargo.toml",
    "sh ci/publish/package-adapter.sh --apply",
    "tar -tzf dist/adapter.spt",
    "git tag omp-spt-v0.2.0",
    "git push origin omp-spt-v0.2.0",
    "gh release create omp-spt-v0.2.0 dist/adapter.spt --repo BigscreenVR/omp-spt --verify-tag --prerelease --latest=false --title \"omp-spt v0.2.0\" --notes-file <release-notes-file>",
    "OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=omp-spt-v0.2.0 sh ci/publish/release-acquire-int.sh",
    "spt adapter add --release BigscreenVR/omp-spt --tag omp-spt-v0.2.0",
    "spt adapter version omp-spt",
    "Run the native launch/role/shutdown acceptance on both supported platforms, then: gh release edit omp-spt-v0.2.0 --repo BigscreenVR/omp-spt --prerelease=false --latest",
    "gh release view --repo BigscreenVR/omp-spt --json tagName,isPrerelease,assets",
    "On a node holding 0.1.3: spt adapter update omp-spt; spt adapter version omp-spt; stop/re-run the endpoint and require 0.2.0."
  ],
  "verification": "Read-only audit only, as required. No edits, commands, formatters, linters, or tests were run."
}