cd "C:/Users/decid/Documents/projects/spt-claude-code" && git add -A && git commit -F - <<'EOF'
build(packaging): single multi-platform fat adapter.spt (drop F-014 stopgap) + simplify proof ints

C — modernize claude-spt packaging on spt-core v0.13.2 (ADR-0024 W1).

Fat archive (retires F-014):
- ci/publish/package-adapter.sh now emits ONE multi-platform dist/adapter.spt: shared
  manifest.toml + strings/ at the archive root, each recognized target-triple's binaries
  under <triple>/ (x86_64-pc-windows-msvc/*.exe + x86_64-unknown-linux-gnu/* ELF). spt-core
  classifies the triple dirs and flattens this node's triple into the install dir, so bare-name
  resolution (REQ-INSTALL-11) is preserved. Guards the unrecognized-top-level-dir footgun and
  refuses a < 0.13.2 floor. This replaces the per-OS adapter-<os>-<arch>.spt scheme AND the
  F-014 windows-copy adapter.spt stopgap (which broke self-update on a linux host) — one
  host-agnostic asset, no --asset to choose.
- adapter/claude-spt.toml: min_spt_core_version 0.9.0 -> 0.13.2 (mandatory for a fat archive;
  older spt-core cannot read it). [adapter].version stays 0.6.0 (packaging-only). [update]
  default asset adapter.spt is now the fat archive — comment updated.
- tests/adapter-archive.sh rewritten to assert the fat layout (shared root + both <triple>/
  binary sets + no stray top-level dir + fat-capable floor). REQ-DIST-ADAPTER-PEROS reframed
  to the multi-platform model; RELEASE-RUNBOOK packaging section + F-014 finding updated.
- Win-triple flatten LOCAL-dogfooded: extract dist/adapter.spt -> flatten win triple ->
  translate-proof + digest-proof OK (binaries resolve at install-dir root). spt-core's real
  extract is proven at install-from-release time (outward release HELD for operator GO).

Proof-int simplification (F-011 closed, W5):
- ci/idle-translate/translate-proof-int.sh + ci/digest/digest-proof-int.sh now use the v0.13.2
  --dir/--manifest override instead of staging a disposable install dir via adapter add. Drops
  the stale bare-file form (which on 0.13.x hit F-011 manifest-not-present) AND the cleanup that
  soft-removed the REAL registered claude-spt. Read-only now -> no SPTC_ACCEPTANCE gate. Both green.

Layout was a published-docs gap (only in spt-core internal CONTEXT.md); doyle confirmed + is
adding it to harness-contract + llms (not separately logged per his call). Gates green:
traceable-reqs, manifest-schema, docs-drift, shell-syntax, adapter-archive unit, both proofs.

Co-authored by: perri
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X4AP1gmKAAYkNX2MDnJK8A
EOF
echo "COMMIT_RC=$?"; git log -1 --format='%h %s'

Commit C source changes on main


[main 3ad54c0] build(packaging): single multi-platform fat adapter.spt (drop F-014 stopgap) + simplify proof ints
 9 files changed, 252 insertions(+), 206 deletions(-)
COMMIT_RC=0
3ad54c0 build(packaging): single multi-platform fat adapter.spt (drop F-014 stopgap) + simplify proof ints


Committed (`3ad54c0`) on main. C code + docs complete and gated; the outward release upload is the remaining held step. Report the dogfood result to doyle (he's waiting), then surface the release decision to you.


Bash

$OWL send doyle <<'EOF'
perri — repack + dogfood RESULT: GREEN.

Built one fat dist/adapter.spt: manifest.toml + strings/ shared at root, x86_64-pc-windows-msvc/{3 .exe} + x86_64-unknown-linux-gnu/{3 ELF}. Local extract proof (no upload, no registry touch): extracted the fat archive → simulated spt-core's win-triple flatten (cp x86_64-pc-windows-msvc/* to root, drop both triple dirs) → install dir = {manifest.toml, strings/, claude-spt-digest.exe, claude-spt-psyche.exe, cc-spt-idle-translate.exe} → ran translate-proof + digest-proof against it via --dir/--manifest → BOTH OK (binaries resolve at install-dir root, bare-name preserved). Footgun guard in the packer refuses any unrecognized top-level dir.

Committed 3ad54c0 on main (NOT pushed): fat packer + min_spt_core 0.13.2 (version stays 0.6.0, packaging-only) + rewrote tests/adapter-archive.sh for the fat layout + reframed REQ-DIST-ADAPTER-PEROS + RELEASE-RUNBOOK fat section + F-014 marked RESOLVED-SHIPPED + CHANGELOG packaging note. Also simplified BOTH proof-ints to --dir/--manifest (green). All gates green: traceable-reqs, manifest-schema, docs-drift, shell-syntax, adapter-archive unit, both proofs.

The REAL spt-core extract (your classify+flatten code) is the one thing the local proof can't exercise — spt has no local-.spt install path, so it needs the asset on a release. I'm at the HOLD: outward steps (push 3ad54c0 + upload fat adapter.spt to the v0.6.0 release + re-install-from-release to prove the real extract) await operator GO. Relay publish-readiness when you like; I'm asking the operator here too.
EOF
echo OK

Send dogfood-green result to doyle


➜ SENT:doyle
OK


go ahead and apply (C) to the existing release


Now the release decision is yours (operator) — the upload mutates a published release, so I'm holding for your call. The code is committed locally (`3ad54c0`, unpushed); the fat `.spt` is built and locally dogfood-verified.


AskUserQuestion

Question: How should I apply C to the v0.6.0 release? (Any 'proceed' option = push 3ad54c0, upload the fat adapter.spt in-place on v0.6.0, then re-install from the release to prove spt-core's real extract on this node.)

Choices:
Replace adapter.spt (windows-copy stopgap) with the fat multi-platform archive; KEEP the existing adapter-windows/linux-x86_64.spt assets. Minimal blast radius: /sptc:setup's --asset path keeps working, auto-update + default `adapter add` become host-agnostic. Drops F-014. Recommended.
Replace adapter.spt with the fat archive AND delete the per-OS assets. Cleaner end state, but /sptc:setup still requests --asset adapter-<os>-<arch>.spt → I must also simplify setup (drop os-detection) + likely republish the cplugs skeleton. Bigger change.
Don't touch the GitHub release or push yet. Keep 3ad54c0 local; I stop at the verified-artifact stage.


<owl_messages>
<owl_message from="doyle" priority="high">GREEN dogfood = the doc fix validated end-to-end — you authored a correct fat .spt purely from my layout answer (shared root + 2 triple dirs, win-triple flatten → bare-name resolves, both proofs OK, unrecognized-dir guard). Exactly right.

On your one coverage gap: spt-core's real classify+flatten extract is NOT an unknown leap — it's UNIT-covered on our side (classify_archive_layout + the shared-root/triple-flatten in extract_release_archive, gated at v0.13.2 W1). Your local cp-flatten mirrors it faithfully. So the release round-trip (upload → re-install-from-release) is the FINAL confirmation of the wire-through, not a first test of the logic — low risk.

HOLD is correct: push 3ad54c0 + upload the fat asset + re-install-from-release are outward steps = operator GO. I'm relaying your publish-readiness to the operator now (he's in my channel too). Everything green your side; sit tight at the hold. Nice clean modernization — F-014 dies here.

(My published-doc fix for the layout is up as spt-core PR #31, so the next author won't hit the gap you did.)</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


Your questions have been answered: "How should I apply C to the v0.6.0 release? (Any 'proceed' option = push 3ad54c0, upload the fat adapter.spt in-place on v0.6.0, then re-install from the release to prove spt-core's real extract on this node.)"="clean up `/sptc:setup` and simply cut as a new v0.6.1 release". You can now continue with these answers in mind.

Question: How should I apply C to the v0.6.0 release? (Any 'proceed' option = push 3ad54c0, upload the fat adapter.spt in-place on v0.6.0, then re-install from the release to prove spt-core's real extract on this node.)

Choices:
Replace adapter.spt (windows-copy stopgap) with the fat multi-platform archive; KEEP the existing adapter-windows/linux-x86_64.spt assets. Minimal blast radius: /sptc:setup's --asset path keeps working, auto-update + default `adapter add` become host-agnostic. Drops F-014. Recommended.
Replace adapter.spt with the fat archive AND delete the per-OS assets. Cleaner end state, but /sptc:setup still requests --asset adapter-<os>-<arch>.spt → I must also simplify setup (drop os-detection) + likely republish the cplugs skeleton. Bigger change.
Don't touch the GitHub release or push yet. Keep 3ad54c0 local; I stop at the verified-artifact stage.

clean up `/sptc:setup` and simply cut as a new v0.6.1 release


ACK doyle + operator chose: **clean up `/sptc:setup` and cut a new v0.6.1 release** (fat-only, version bump). Acknowledging doyle, then starting the setup cleanup.


Bash

$OWL send doyle <<'EOF'
perri — ACK, thank you. Good to know the real classify+flatten is unit-covered your side (classify_archive_layout + extract_release_archive @ W1) — so the release round-trip is wire-through confirmation, low risk, as you say. And nice: PR #31 closes the doc gap for the next author.

Operator GO received with a tweak: clean up /sptc:setup (drop the now-redundant os-detection + --asset since the fat default is host-agnostic) and cut it as a NEW v0.6.1 release (not in-place on v0.6.0). So: version 0.6.0→0.6.1, setup simplified to bare `adapter add --release`, fat-only assets, then push + cut v0.6.1 + upload fat adapter.spt + re-install-from-release real-extract proof + cplugs skeleton republish. Doing the code + gates now; will ping at the cut. F-014 dies in v0.6.1.
EOF
echo OK

ACK doyle + state v0.6.1 plan


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== adapter/strings/skills/setup.md (os-detection / --asset) ==="; grep -n -iE "os|arch|uname|--asset|adapter add|--release|platform|windows|linux" adapter/strings/skills/setup.md | head -30

Find os-detection in setup.md


=== adapter/strings/skills/setup.md (os-detection / --asset) ===
14:   - **POSIX:** `curl -fsSL https://sabermage.github.io/spt-releases/install.sh | sh`
15:   - **Windows (PowerShell):** `irm https://sabermage.github.io/spt-releases/install.ps1 | iex`
24:       `spt adapter add ./adapter/claude-spt.toml`.
25:     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick
26:       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;
27:       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
28:       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
29:       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to
30:       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.
31:       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->
35:   host (the legacy-parity bare flow — `/sptc:live`/`/sptc:ready` need no `--adapter`). The
51:   `/sptc:send`, `/sptc:ready`, and live agents work cross-machine (local use needs none). Check
56:   - **Elevation:** create/join/show-code are OS-elevation-gated — Windows: elevated (UAC) shell;
57:     Linux desktop: pkexec/polkit or sudo terminal; Linux TTY: inline sudo; headless: print the exact


Found the os-detection block (setup.md:24-31). Read the full context to rewrite to the bare host-agnostic form.


18	   `"$HOME/.local/bin/spt" --version`. After this, `spt update` handles signed self-updates.
19
20	2. **Activate the adapter.** Run `spt adapter list` and find `claude-spt`:
21	   - Listed and **not** `deregistered` → already active; report it and skip to step 3.
22	   - Missing or `deregistered` → activate it:
23	     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` near cwd):
24	       `spt adapter add ./adapter/claude-spt.toml`.
25	     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick
26	       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;
27	       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
28	       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
29	       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to
30	       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.
31	       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->
32
33	3. **Verify + set active.** Re-run `spt adapter list` — `claude-spt` must read **active** (no
34	   `deregistered`). Then `spt adapter use claude-spt` so bare resolution lands here for the `claude`
35	   host (the legacy-parity bare flow — `/sptc:live`/`/sptc:ready` need no `--adapter`). The

   `"$HOME/.local/bin/spt" --version`. After this, `spt update` handles signed self-updates.

2. **Activate the adapter.** Run `spt adapter list` and find `claude-spt`:
   - Listed and **not** `deregistered` → already active; report it and skip to step 3.
   - Missing or `deregistered` → activate it:
     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` near cwd):
       `spt adapter add ./adapter/claude-spt.toml`.
     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick
       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;
       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to
       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.
       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->

3. **Verify + set active.** Re-run `spt adapter list` — `claude-spt` must read **active** (no
   `deregistered`). Then `spt adapter use claude-spt` so bare resolution lands here for the `claude`
   host (the legacy-parity bare flow — `/sptc:live`/`/sptc:ready` need no `--adapter`). The


Rewrite the setup.md end-user block to the bare host-agnostic fat acquisition (keep the PEROS doc tag — it now documents the single multi-platform asset).


Edit

     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick
       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;
       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to
       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.
       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->

     - **End-user (plugin only):** `spt adapter add --release SaberMage/spt-claude-code` — fetches the
       single multi-platform `adapter.spt` (one archive bundling every supported platform's binaries
       beside a shared manifest; install auto-resolves the host's), extracts to the durable home,
       registers. No `--asset` / os-detection needed — the fat archive is host-agnostic (ADR-0024 W1).
       `--tag <ver>` pins a version. Needs spt **v0.13.2+** (the version that reads a fat archive).
       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->


<owl_messages>
<owl_message from="doyle" priority="high">Plan sound, operator GO noted. The setup simplification is correct: bare `adapter add --release <repo>` works because the fat archive IS the default asset (adapter.spt) — spt-core fetches it + classify+flattens the host triple, so the os-detection + --asset in /sptc:setup are genuinely redundant now. Dropping them is right. v0.6.1 (not in-place v0.6.0) is the clean call — a re-cut asset on the same tag would be ambiguous.

Sequence looks complete: 0.6.0→0.6.1, setup→bare add --release, fat-only assets, push → cut v0.6.1 → upload fat adapter.spt → re-install-from-release (THE real classify+flatten proof) → cplugs skeleton republish. That re-install-from-release is the milestone-closer — it's the one seam your local cp-flatten couldn't exercise. Ping me at the cut + the re-install result; I'll relay F-014-dead + the real-extract confirmation to the operator. Go.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


The file C:\Users\decid\Documents\projects\spt-claude-code\adapter\strings\skills\setup.md has been updated successfully. (file state is current in your context — no need to Read it back)

     - **End-user (plugin only):** `spt adapter add --release SaberMage/spt-claude-code` — fetches the
       single multi-platform `adapter.spt` (one archive bundling every supported platform's binaries
       beside a shared manifest; install auto-resolves the host's), extracts to the durable home,
       registers. No `--asset` / os-detection needed — the fat archive is host-agnostic (ADR-0024 W1).
       `--tag <ver>` pins a version. Needs spt **v0.13.2+** (the version that reads a fat archive).
       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->

# /sptc:setup — operative instructions

**Goal:** install or repair spt-core for this session **and activate the claude-spt adapter** — the
mid-session installer covering the gap when no SessionStart bootstrap has fired. Installing the
binary is only half the job: a present binary with a **deregistered** adapter has no
profiles/strings/hints/`[digest]`, so the `/sptc:*` surface is inert until activation.

<!-- [doc->REQ-SETUP-ACTIVATE] -->

**Do this:**

1. **Binary.** If spt-core is absent (`command -v spt && spt --version` reports nothing), run the
   published install-on-demand bootstrap (spt-releases `harness-contract/install-on-demand.md`):
   - **POSIX:** `curl -fsSL https://sabermage.github.io/spt-releases/install.sh | sh`
   - **Windows (PowerShell):** `irm https://sabermage.github.io/spt-releases/install.ps1 | iex`

   `PATH` is not reloaded in this shell after a fresh install — verify with the absolute path:
   `"$HOME/.local/bin/spt" --version`. After this, `spt update` handles signed self-updates.

2. **Activate the adapter.** Run `spt adapter list` and find `claude-spt`:
   - Listed and **not** `deregistered` → already active; report it and skip to step 3.
   - Missing or `deregistered` → activate it:
     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` near cwd):
       `spt adapter add ./adapter/claude-spt.toml`.
     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick
       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;
       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to
       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.
       <!-- [doc->REQ-DIST-ADAPTER-PEROS] -->

3. **Verify + set active.** Re-run `spt adapter list` — `claude-spt` must read **active** (no
   `deregistered`). Then `spt adapter use claude-spt` so bare resolution lands here for the `claude`
   host (the legacy-parity bare flow — `/sptc:live`/`/sptc:ready` need no `--adapter`). The
   `claude-spt-digest` + `claude-spt-psyche` tools are invoked by bare name and resolve **from the
   adapter install dir** (the `from …` path in `spt adapter list`), where activation extracted them —
   no PATH copy needed. If either fails to start, confirm both are present in that dir (a packaging
   defect, not a PATH problem).

4. **ccs wiring (optional).** Detect `~/.ccs`:
   - Present → the shipped `claude-spt:ccs` profile leaf-replaces the session command with `ccs` (a
     drop-in for `claude`), so live/ready agents can run on ccs backends via `--adapter
     claude-spt:ccs`. Check `command -v ccs`; if `~/.ccs` exists but `ccs` isn't on PATH, point the
     user at their ccs bin dir.
   - Absent → ccs is an optional CLI router for alternate model backends in place of `claude`. To
     enable: install ccs, then re-run `/sptc:setup`. Skip if unwanted.
   <!-- [doc->REQ-SETUP-CCS] -->

5. **Subnet onboarding (optional).** A subnet is the private group of paired machines that makes
   `/sptc:send`, `/sptc:ready`, and live agents work cross-machine (local use needs none). Check
   `spt subnet status`:
   - In a subnet → invite a machine with `spt subnet show-code`; on the joiner, `spt subnet join`.
   - Not in one → offer **create** (`spt subnet create` — this node becomes seed-holder) or **join**
     (`spt subnet join`). Full verb guidance → **/sptc:subnet**.
   - **Elevation:** create/join/show-code are OS-elevation-gated — Windows: elevated (UAC) shell;
     Linux desktop: pkexec/polkit or sudo terminal; Linux TTY: inline sudo; headless: print the exact
     command for the user to run elevated.
   <!-- [doc->REQ-SETUP-SUBNET] -->

Idempotent and safe to re-run — the same bootstrap + activation the SessionStart hook performs.

-     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** — pick

-       the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux, Darwin=macos;

-       `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then

-       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches

-       the per-OS asset (tar root = `manifest.toml` + `strings/` + native tool binaries), extracts to

-       the durable home, registers. `--tag <ver>` pins a version. v1 ships windows + linux.

+     - **End-user (plugin only):** `spt adapter add --release SaberMage/spt-claude-code` — fetches the

+       single multi-platform `adapter.spt` (one archive bundling every supported platform's binaries

+       beside a shared manifest; install auto-resolves the host's), extracts to the durable home,

+       registers. No `--asset` / os-detection needed — the fat archive is host-agnostic (ADR-0024 W1).

+       `--tag <ver>` pins a version. Needs spt **v0.13.2+** (the version that reads a fat archive).


ACK doyle — proceeding. Cleaning up the plugin-side setup SKILL.md next.


Bash

$OWL send doyle <<'EOF'
perri — ACK, go confirmed. v0.6.1 fresh tag (agree — re-cutting v0.6.0 assets on the same tag is ambiguous). Executing the sequence; I'll ping at the cut AND with the re-install-from-release result (the real classify+flatten proof). F-014 dies in v0.6.1.
EOF
echo OK; cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== plugin setup SKILL.md os-detection ==="; ls plugin/sptc/skills/setup/ 2>&1; grep -n -iE "uname|--asset|adapter-\$|adapter add --release|per-os|os=\$|arch=\$" plugin/sptc/skills/setup/SKILL.md 2>&1 | head -20

ACK doyle + find os-detection in plugin setup SKILL.md


➜ SENT:doyle
OK
=== plugin setup SKILL.md os-detection ===
SKILL.md
37:     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —
38:       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,
39:       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
40:       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
41:       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native


35	     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` is present near cwd):
36	       `spt adapter add ./adapter/claude-spt.toml` (the file-form accepts any path + filename).
37	     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —
38	       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,
39	       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
40	       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
41	       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native
42	       tool binaries), extracts to the durable home, registers. `--tag <ver>` pins a version. v1
43	       ships windows + linux. Recommended (from the monorepo, no dedicated repo); needs the spt
44	       release carrying `--release`.
45
46	3. **Verify activation.** Re-run `spt adapter list` — `claude-spt` must read **active**

     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` is present near cwd):
       `spt adapter add ./adapter/claude-spt.toml` (the file-form accepts any path + filename).
     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —
       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,
       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native
       tool binaries), extracts to the durable home, registers. `--tag <ver>` pins a version. v1
       ships windows + linux. Recommended (from the monorepo, no dedicated repo); needs the spt
       release carrying `--release`.

3. **Verify activation.** Re-run `spt adapter list` — `claude-spt` must read **active**


Edit

     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —
       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,
       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native
       tool binaries), extracts to the durable home, registers. `--tag <ver>` pins a version. v1
       ships windows + linux. Recommended (from the monorepo, no dedicated repo); needs the spt
       release carrying `--release`.

     - **End-user (plugin only):** `spt adapter add --release SaberMage/spt-claude-code` — fetches the
       single multi-platform `adapter.spt` (one archive bundling every supported platform's binaries
       beside a shared manifest; install auto-resolves the host's), extracts to the durable home,
       registers. No `--asset` / os-detection needed — the fat archive is host-agnostic (ADR-0024 W1).
       `--tag <ver>` pins a version. Recommended (from the monorepo, no dedicated repo); needs spt
       **v0.13.2+** (the version that reads a fat archive).


The file C:\Users\decid\Documents\projects\spt-claude-code\plugin\sptc\skills\setup\SKILL.md has been updated successfully. (file state is current in your context — no need to Read it back)

     - **End-user (plugin only):** `spt adapter add --release SaberMage/spt-claude-code` — fetches the
       single multi-platform `adapter.spt` (one archive bundling every supported platform's binaries
       beside a shared manifest; install auto-resolves the host's), extracts to the durable home,
       registers. No `--asset` / os-detection needed — the fat archive is host-agnostic (ADR-0024 W1).
       `--tag <ver>` pins a version. Recommended (from the monorepo, no dedicated repo); needs spt
       **v0.13.2+** (the version that reads a fat archive).

---
name: setup
description: |
  Install or repair spt-core AND activate the claude-spt adapter for this Claude Code session
  (mid-session installer + post-install activation).
allowed-tools: [Bash]
---

# /sptc:setup

> **Self-contained by necessity.** Unlike other `/sptc:*` skills, `setup` cannot rely on
> UPS-injection of its body: it runs precisely when spt-core may be **absent**, so the injection
> source is unavailable. The operative steps therefore live in this SKILL.md (the floor); the
> adapter body mirrors them for the spt-present repair path.

Covers the mid-session install + activation gap (ADR-0001): a user who installs the plugin mid-session
has not had a SessionStart bootstrap fire, so `/sptc:setup` runs the same invisible-installer
bootstrap to fetch + verify spt-core on demand **and then activates the claude-spt adapter**. A
present binary is not enough: an unregistered/`deregistered` adapter has no profiles/strings/hints/
`[digest]`, so the `/sptc:*` surface is inert until activation.

**Do this:**

1. **Binary.** If spt-core is absent (`command -v spt && spt --version` reports nothing), run the
   published install-on-demand bootstrap (spt-releases `harness-contract/install-on-demand.md`):
   - **POSIX:** `curl -fsSL https://sabermage.github.io/spt-releases/install.sh | sh`
   - **Windows (PowerShell):** `irm https://sabermage.github.io/spt-releases/install.ps1 | iex`

   `PATH` is not reloaded in this shell after a fresh install — verify with the absolute path:
   `"$HOME/.local/bin/spt" --version`. After this, `spt update` handles signed self-updates.

2. **Activate the adapter.** Run `spt adapter list` and find `claude-spt`:
   - Listed and **not** `deregistered` → already active; report it and skip to step 3.
   - Missing or `deregistered` → activate it:
     - **Local dev / dogfooding a repo checkout** (an `adapter/claude-spt.toml` is present near cwd):
       `spt adapter add ./adapter/claude-spt.toml` (the file-form accepts any path + filename).
     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —
       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,
       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then
       `spt adapter add --release SaberMage/spt-claude-code --asset adapter-$os-$arch.spt` — fetches
       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native
       tool binaries), extracts to the durable home, registers. `--tag <ver>` pins a version. v1
       ships windows + linux. Recommended (from the monorepo, no dedicated repo); needs the spt
       release carrying `--release`.

3. **Verify activation.** Re-run `spt adapter list` — `claude-spt` must read **active**
   (no `deregistered`). The `[digest]`/`[session]` templates invoke `claude-spt-digest` +
   `claude-spt-psyche` by **bare name**, and spt-core resolves them **from the adapter install dir**
   (the `from …/adapters/_github/<safe>/` path in `spt adapter list`), where `--release` activation
   already extracted them beside the manifest. **No PATH copy needed** (REQ-INSTALL-11, spt v0.8.0
   Feature B; verified live on v0.8.1 — digest + daemon-hosted Psyche both resolve from the install
   dir). If either ever fails to start, confirm both `.exe`s are present in that install dir — their
   absence is a packaging defect, not a PATH problem. *(Legacy F-006 interim PATH-copy: retired.)*

4. **ccs wiring (optional — SCOPE setup #7).** Detect `~/.ccs`:
   - Present → ccs is installed. The shipped `claude-spt:ccs` profile leaf-replaces the session
     command with `ccs` (drop-in for `claude`) → run live/ready agents on ccs backends
     (glm/kimi/custom) via `--adapter claude-spt:ccs` (e.g. `/sptc:live`, `/sptc:ready`,
     `spt endpoint run --adapter claude-spt:ccs`). Check `command -v ccs`; if `~/.ccs` exists but `ccs`
     isn't on PATH, point the user at their ccs bin dir. No action needed if unwanted (base
     `claude-spt` is unaffected).
   - Absent → ccs is an optional CLI router for driving alternate model backends (glm/kimi/custom) in
     place of `claude`. To enable: install ccs (its docs), then re-run `/sptc:setup`. Skip if unwanted.

5. **Subnet onboarding (optional — SCOPE setup #3/#4).** A subnet is the private group of paired
   machines that makes `/sptc:send`, `/sptc:ready`, and live agents work cross-machine (local use
   needs none). Check: `spt subnet status`.
   - In a subnet → to invite a machine: `spt subnet show-code` (6-digit code + URI + QR); on the
     joiner: `spt subnet join <name> --code <code>`.
   - Not in one → offer create (`spt subnet create <name>` — seed-holder; prints code/URI/QR) or join
     (`spt subnet join <name> --code <code>`). Skip if single-machine.
   - Full verb guidance → **/sptc:subnet**. **Elevation:** create/join/show-code are
     OS-elevation-gated — Windows: elevated (UAC) shell; Linux desktop: pkexec/polkit or sudo
     terminal; Linux TTY: inline sudo; headless: print the command for the user to run elevated.

Idempotent and safe to re-run — the same bootstrap + activation the SessionStart hook performs.

-     - **End-user (plugin only):** the `.spt` carries native binaries, so it ships **per-OS** —

-       pick the host's. Detect: `os=$(uname -s)` → MINGW*/MSYS*/CYGWIN*=windows, Linux=linux,

-       Darwin=macos; `arch=$(uname -m)` → x86_64/amd64=x86_64, arm64/aarch64=aarch64. Then

-       the per-OS `adapter-<os>-<arch>.spt` asset (tar root = `manifest.toml` + `strings/` + native

-       tool binaries), extracts to the durable home, registers. `--tag <ver>` pins a version. v1

-       ships windows + linux. Recommended (from the monorepo, no dedicated repo); needs the spt

+       `--tag <ver>` pins a version. Recommended (from the monorepo, no dedicated repo); needs spt

+       **v0.13.2+** (the version that reads a fat archive).


Bump the manifest version 0.6.0 → 0.6.1 (the operator chose a fresh tag). Update the version line + comment.


# 0.6.0 (2026-06-21): adds the v0.13.0 harness-contract RUN-group seams [session.resume] +
# [message-idle-translation-binary]. Bumped off 0.5.0 so nothing that resolves a manifest by VERSION
# (rather than by registered path) can shadow-pick the pre-seam 0.5.0 _github copy (doyle note,
# 2026-06-21). The seams themselves are ADDITIVE, but the v0.6.0 release now ships a single
# MULTI-PLATFORM fat .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract
# — so the floor moves to 0.13.2 (see below). Packaging-only modernization; the [adapter].version
# stays 0.6.0 (the seam surface is unchanged).
version = "0.6.0"

# 0.6.1 (2026-06-22): PACKAGING modernization — the release now ships a single MULTI-PLATFORM fat
# .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract, so the floor moves
# to 0.13.2 (see below) and /sptc:setup drops its now-redundant os-detection (`adapter add --release`
# is host-agnostic). The seam surface is unchanged from 0.6.0 (the v0.13.0 RUN-group seams
# [session.resume] + [message-idle-translation-binary], added in 0.6.0). Fresh tag, not an in-place
# v0.6.0 re-cut (a re-cut asset on the same tag is ambiguous — operator + doyle call).
version = "0.6.1"


The file C:\Users\decid\Documents\projects\spt-claude-code\adapter\claude-spt.toml has been updated successfully. (file state is current in your context — no need to Read it back)

# 0.6.0 (2026-06-21): adds the v0.13.0 harness-contract RUN-group seams [session.resume] +
# [message-idle-translation-binary]. Bumped off 0.5.0 so nothing that resolves a manifest by VERSION
# (rather than by registered path) can shadow-pick the pre-seam 0.5.0 _github copy (doyle note,
# 2026-06-21). The seams themselves are ADDITIVE, but the v0.6.0 release now ships a single
# MULTI-PLATFORM fat .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract
# — so the floor moves to 0.13.2 (see below). Packaging-only modernization; the [adapter].version
# stays 0.6.0 (the seam surface is unchanged).
version = "0.6.0"

# 0.6.1 (2026-06-22): PACKAGING modernization — the release now ships a single MULTI-PLATFORM fat
# .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract, so the floor moves
# to 0.13.2 (see below) and /sptc:setup drops its now-redundant os-detection (`adapter add --release`
# is host-agnostic). The seam surface is unchanged from 0.6.0 (the v0.13.0 RUN-group seams
# [session.resume] + [message-idle-translation-binary], added in 0.6.0). Fresh tag, not an in-place
# v0.6.0 re-cut (a re-cut asset on the same tag is ambiguous — operator + doyle call).
version = "0.6.1"

-# 0.6.0 (2026-06-21): adds the v0.13.0 harness-contract RUN-group seams [session.resume] +

-# [message-idle-translation-binary]. Bumped off 0.5.0 so nothing that resolves a manifest by VERSION

-# (rather than by registered path) can shadow-pick the pre-seam 0.5.0 _github copy (doyle note,

-# 2026-06-21). The seams themselves are ADDITIVE, but the v0.6.0 release now ships a single

-# MULTI-PLATFORM fat .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract

-# — so the floor moves to 0.13.2 (see below). Packaging-only modernization; the [adapter].version

-# stays 0.6.0 (the seam surface is unchanged).

+# 0.6.1 (2026-06-22): PACKAGING modernization — the release now ships a single MULTI-PLATFORM fat

+# .spt (per-triple subdirs, ADR-0024 W1) which only spt-core >= 0.13.2 can extract, so the floor moves

+# to 0.13.2 (see below) and /sptc:setup drops its now-redundant os-detection (`adapter add --release`

+# is host-agnostic). The seam surface is unchanged from 0.6.0 (the v0.13.0 RUN-group seams

+# [session.resume] + [message-idle-translation-binary], added in 0.6.0). Fresh tag, not an in-place

+# v0.6.0 re-cut (a re-cut asset on the same tag is ambiguous — operator + doyle call).

# Floor BUMPED to 0.13.2 (2026-06-22, C / F-014 drop): the release packaging moved from the per-OS

# stopgap (`adapter.spt` = a windows-binary copy — F-014; broke on a linux host) to ONE fat .spt that

# bundles both x86_64 triples beside a shared manifest. spt-core extracts a fat archive (classify


Now restructure the CHANGELOG: revert my 0.6.0 edits and add a new [0.6.1] section. Read the current top.


11	## [0.6.0] - 2026-06-22
12
13	> Requires spt-core **v0.13.2 or newer**. The two capabilities below need v0.13.0; the v0.6.0 release
14	> now also ships as a single multi-platform package (see *Packaging*) that only spt-core ≥ 0.13.2 can
15	> install, so 0.13.2 is the effective floor.
16
17	### Added
18	- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
19	  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
20	  for you — instead of going unseen until the agent next acted. If you were part-way through typing
21	  your own input, your draft is stashed first and restored right after, so an incoming message never
22	  eats what you were writing.
23	- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
24	  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
25	  folder so you can tell them apart.
26
27	### Changed
28	- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
29	  cplugs plugin skeleton is unchanged (still on its own slower track).
30
31	### Packaging
32	- **One download now covers every platform.** The adapter ships as a single multi-platform
33	  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
34	  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
35	  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
36	  `spt adapter update` now just work on either OS with no `--asset` to choose. Requires spt-core
37	  **v0.13.2+** (the version that can read a multi-platform package).
38
39	## [0.5.0] - 2026-06-19
40

## [0.6.0] - 2026-06-22

> Requires spt-core **v0.13.2 or newer**. The two capabilities below need v0.13.0; the v0.6.0 release
> now also ships as a single multi-platform package (see *Packaging*) that only spt-core ≥ 0.13.2 can
> install, so 0.13.2 is the effective floor.

### Added
- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
  for you — instead of going unseen until the agent next acted. If you were part-way through typing
  your own input, your draft is stashed first and restored right after, so an incoming message never
  eats what you were writing.
- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
  folder so you can tell them apart.

### Changed
- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton is unchanged (still on its own slower track).

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform
  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
  `spt adapter update` now just work on either OS with no `--asset` to choose. Requires spt-core
  **v0.13.2+** (the version that can read a multi-platform package).

## [0.5.0] - 2026-06-19


## [0.6.0] - 2026-06-22

> Requires spt-core **v0.13.2 or newer**. The two capabilities below need v0.13.0; the v0.6.0 release
> now also ships as a single multi-platform package (see *Packaging*) that only spt-core ≥ 0.13.2 can
> install, so 0.13.2 is the effective floor.

### Added
- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
  for you — instead of going unseen until the agent next acted. If you were part-way through typing
  your own input, your draft is stashed first and restored right after, so an incoming message never
  eats what you were writing.
- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
  folder so you can tell them apart.

### Changed
- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton is unchanged (still on its own slower track).

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform
  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
  `spt adapter update` now just work on either OS with no `--asset` to choose. Requires spt-core
  **v0.13.2+** (the version that can read a multi-platform package).

## [0.5.0] - 2026-06-19

## [0.6.1] - 2026-06-22

> Requires spt-core **v0.13.2 or newer** (the version that can install a multi-platform package).
> Packaging-only release — no change to what the adapter does, only how it ships.

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform
  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
  `spt adapter update` now just work on either OS with no platform to pick. Requires spt-core
  **v0.13.2+** (the version that can read a multi-platform package).

### Changed
- **Setup is simpler.** `/sptc:setup` now activates the adapter with a plain
  `spt adapter add --release SaberMage/spt-claude-code` — no OS detection or asset selection, since
  the one package is host-agnostic.
- Adapter version of truth is now **0.6.1** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton bumps with the simplified setup body.

## [0.6.0] - 2026-06-22

> Requires spt-core **v0.13.0 or newer** for the two new capabilities below. On older spt-core
> they're simply inactive — nothing else changes, so this release is safe to take on any version.

### Added
- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
  for you — instead of going unseen until the agent next acted. If you were part-way through typing
  your own input, your draft is stashed first and restored right after, so an incoming message never
  eats what you were writing.
- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
  folder so you can tell them apart.

### Changed
- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton is unchanged (still on its own slower track).

## [0.5.0] - 2026-06-19


The file C:\Users\decid\Documents\projects\spt-claude-code\CHANGELOG.md has been updated successfully. (file state is current in your context — no need to Read it back)

## [0.6.1] - 2026-06-22

> Requires spt-core **v0.13.2 or newer** (the version that can install a multi-platform package).
> Packaging-only release — no change to what the adapter does, only how it ships.

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform
  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
  `spt adapter update` now just work on either OS with no platform to pick. Requires spt-core
  **v0.13.2+** (the version that can read a multi-platform package).

### Changed
- **Setup is simpler.** `/sptc:setup` now activates the adapter with a plain
  `spt adapter add --release SaberMage/spt-claude-code` — no OS detection or asset selection, since
  the one package is host-agnostic.
- Adapter version of truth is now **0.6.1** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton bumps with the simplified setup body.

## [0.6.0] - 2026-06-22

> Requires spt-core **v0.13.0 or newer** for the two new capabilities below. On older spt-core
> they're simply inactive — nothing else changes, so this release is safe to take on any version.

### Added
- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
  for you — instead of going unseen until the agent next acted. If you were part-way through typing
  your own input, your draft is stashed first and restored right after, so an incoming message never
  eats what you were writing.
- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
  folder so you can tell them apart.

### Changed
- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton is unchanged (still on its own slower track).

## [0.5.0] - 2026-06-19

# Changelog

All notable user-facing changes to the **sptc** plugin (Spacetime adapter for Claude Code).
The format follows [Keep a Changelog](https://keepachangelog.com/); each release section is the
public release body verbatim.

> Each release below is keyed to the **adapter version of truth** (the version you see in
> `/sptc:version` and the GitHub release tag). The cplugs *plugin skeleton* version (`plugin.json`)
> moves on its own slower schedule and may differ.

## [0.6.0] - 2026-06-22

> Requires spt-core **v0.13.2 or newer**. The two capabilities below need v0.13.0; the v0.6.0 release
> now also ships as a single multi-platform package (see *Packaging*) that only spt-core ≥ 0.13.2 can
> install, so 0.13.2 is the effective floor.

### Added
- **Idle agents now receive your messages.** When an spt-hosted agent is sitting at its prompt
  (idle, not mid-task), a message sent to it now lands *in that session* — typed in and submitted
  for you — instead of going unseen until the agent next acted. If you were part-way through typing
  your own input, your draft is stashed first and restored right after, so an incoming message never
  eats what you were writing.
- **Resuming an agent brings back its conversation.** Relaunching a session now reloads its prior
  transcript instead of cold-starting a blank one, and the resume picker shows each session's project
  folder so you can tell them apart.

### Changed
- Adapter version of truth is now **0.6.0** (shown in `/sptc:version` and the release tag). The
  cplugs plugin skeleton is unchanged (still on its own slower track).

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform
  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing
  picks your platform automatically. This replaces the previous per-OS files and the Windows-only
  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and
  `spt adapter update` now just work on either OS with no `--asset` to choose. Requires spt-core
  **v0.13.2+** (the version that can read a multi-platform package).

## [0.5.0] - 2026-06-19

### Added
- **Agents now know who they are the moment a session starts.** When a session is already
  reachable — you launched it through `cc`, or it cleared/compacted mid-run — it now opens with a
  short brief: its own agent name, a reminder that it's already live (so it won't try to re-arm),
  and how to message other agents (`spt send` and reply, plus `spt endpoint list` to see who's
  around). Previously a resumed or spt-launched session could start not knowing its own name.
- **Sessions that aren't reachable yet learn how to reach out.** On a machine that belongs to a
  subnet, a plain session with no perch now gets a one-line tip on reaching other agents with
  `spt ring` — without having to go reachable first. Solo machines with no peers see nothing.

## [0.4.0] - 2026-06-18

### Changed
- **Your live-agent companion now runs in a safe, limited mode.** When you go live with
  `/sptc:live`, the background companion that writes your context-resume notes works with a
  file-only toolset and a lighter, cheaper model. It is more contained and costs less to run,
  with no change to what you see or do.
- **Removed the experimental `:deep` profile.** `claude-spt:deep` was an unused placeholder. The
  one shipped profile overlay is `claude-spt:ccs` (routes sessions through `ccs`). If you ever
  selected `:deep`, use `:ccs` or the base adapter instead.

### Fixed
- **Sessions that spt starts for you no longer stall on a permission prompt.** When spt brings up
  a Claude Code session on your behalf (the live companion, and the spt-hosted launcher), it could
  hang waiting on an approval prompt that no one was there to answer. Those sessions now start
  cleanly.

## [0.3.0] - 2026-06-17

### Changed
- **Going live is now a single, seamless step.** A live agent comes up directly — no behind-the-scenes
  adapter selection, no chained setup commands. `/sptc:live` just brings your session up live, and
  `/sptc:ready` brings it up reachable-but-light; the difference is simply which one you run. This is
  full parity with the original live-agent experience.
- **Requires spt-core 0.9.0 or newer.** This release uses spt-core's newer automatic
  harness-resolution, so the adapter now needs spt-core **0.9.0+**. If you keep spt-core up to date
  (it self-updates), there's nothing to do; on an older spt-core the adapter will decline to install
  until you update.

### Fixed
- **Setup pins this adapter as your default.** `/sptc:setup` now records `claude-spt` as the active
  adapter for Claude Code, so going live or ready needs no extra flags.

## [0.2.1] - 2026-06-16

### Fixed
- **Going live shows a clean status, not raw machine output.** Starting a live agent previously
  leaked internal setup markers and tokens into the chat. `/sptc:live` now reports a single tidy
  summary — your agent id, online status, how other agents reach you, and how to reply — and
  nothing else.

### Changed
- **Self-contained live setup.** Bringing a session live no longer bounces you to a separate help
  topic; `/sptc:live` carries the full bringup itself, so going live works in one step.

## [0.2.0] - 2026-06-16

### Fixed
- **Live agents now reliably start their background companion.** Previously a live agent could come
  up marked "online" while its persistent companion silently failed to start, leaving it with no
  running context. The companion now launches and stays resident.

### Changed
- **Simpler setup — no manual PATH step.** The adapter's helper tools are now found automatically
  from where the adapter is installed; `/sptc:setup` no longer asks you to copy anything onto your
  PATH.
- **Automatic adapter updates.** The adapter now updates itself from this project's GitHub releases
  (`spt adapter update`) — logic and instruction changes reach you without a reinstall.

### Added
- **Linux support.** The adapter ships native **Windows and Linux** builds; `/sptc:setup` detects
  your OS and installs the right one.
- **ccs integration.** If you use [ccs](https://github.com/kaitranntt/ccs), `/sptc:setup` wires the
  shipped `claude-spt:ccs` profile so live/ready agents can run on your ccs backends instead of
  `claude`.
- **Private-network onboarding.** `/sptc:setup` now offers to create or join a private network
  (subnet) so you can pair machines and reach agents across them.

## [0.1.0] - 2026-06-15

First public release.

### Added
- **One-step setup — `/sptc:setup`.** Sets the plugin up and installs the Spacetime (`spt`)
  engine for you if it isn't already present, so messaging and live agents just work. Also offers
  to create or join a private network and to register the always-on background service.
- **Agent messaging.** `/sptc:ready` turns on your inbox so other agents can reach this session;
  `/sptc:send` messages another agent; `/sptc:list-agents` shows who is currently active.
- **Live agents.** `/sptc:live` upgrades the current session into a live agent with a persistent
  companion that keeps its own running context. `/sptc:commune` pushes a context update to that
  companion, and `/sptc:signoff` ends a live session cleanly with a final summary.
- **`/sptc:force-stop`** immediately tears down a listening or live agent when you need it gone.
- **Cross-machine networks — `/sptc:subnet`.** Pair machines into a private network (create,
  show the join code, or join an existing one) so your agents can reach each other across nodes.
- **`/sptc:version`** reports the running engine version.
- **Alternate model backends (advanced).** Ships a ready-made `ccs` profile template you can
  select to launch sessions through [ccs](https://github.com/kaitranntt/ccs) — useful for routing
  an agent to a different model or billing backend. You supply your own ccs configuration.
- **Invisible engine install.** Starting a session automatically installs the `spt` engine the
  first time if it is missing — no separate install step.

+> Requires spt-core **v0.13.2 or newer** (the version that can install a multi-platform package).

+> Packaging-only release — no change to what the adapter does, only how it ships.

+- **One download now covers every platform.** The adapter ships as a single multi-platform

+  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing

+  picks your platform automatically. This replaces the previous per-OS files and the Windows-only

+  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and

+  `spt adapter update` now just work on either OS with no platform to pick. Requires spt-core

+  **v0.13.2+** (the version that can read a multi-platform package).

+- **Setup is simpler.** `/sptc:setup` now activates the adapter with a plain

+  `spt adapter add --release SaberMage/spt-claude-code` — no OS detection or asset selection, since

+- Adapter version of truth is now **0.6.1** (shown in `/sptc:version` and the release tag). The

+  cplugs plugin skeleton bumps with the simplified setup body.

-> Requires spt-core **v0.13.2 or newer**. The two capabilities below need v0.13.0; the v0.6.0 release

-> now also ships as a single multi-platform package (see *Packaging*) that only spt-core ≥ 0.13.2 can

-> install, so 0.13.2 is the effective floor.

+> Requires spt-core **v0.13.0 or newer** for the two new capabilities below. On older spt-core

+> they're simply inactive — nothing else changes, so this release is safe to take on any version.

-- **One download now covers every platform.** The adapter ships as a single multi-platform

-  `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing

-  picks your platform automatically. This replaces the previous per-OS files and the Windows-only

-  stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and

-  `spt adapter update` now just work on either OS with no `--asset` to choose. Requires spt-core

-  **v0.13.2+** (the version that can read a multi-platform package).


Fix stale "0.6.0" references in the docs I wrote (the packaging shipped in 0.6.1 now). Check.


Bash

cd "C:/Users/decid/Documents/projects/spt-claude-code" && grep -rn "v0.6.0\|0\.6\.0\|since v0.6" docs/RELEASE-RUNBOOK.md docs/SPT-CORE-FINDINGS.md | grep -iE "fat|multi-platform|since|packaging|adapter.spt" | head

Find stale 0.6.0 refs in my doc edits


docs/RELEASE-RUNBOOK.md:136:Since v0.6.0 the asset is **ONE multi-platform fat `adapter.spt`** (ADR-0024 W1, spt-core ≥ 0.13.2):


Edit

Since v0.6.0 the asset is **ONE multi-platform fat `adapter.spt`** (ADR-0024 W1, spt-core ≥ 0.13.2):

Since v0.6.1 the asset is **ONE multi-platform fat `adapter.spt`** (ADR-0024 W1, spt-core ≥ 0.13.2):


The file C:\Users\decid\Documents\projects\spt-claude-code\docs\RELEASE-RUNBOOK.md has been updated successfully. (file state is current in your context — no need to Read it back)

(doyle's `--release` source; needs **spt v0.7.3+ / counter 15** — not in 0.7.2). No dedicated

adapter repo: the asset is packed straight from `adapter/`.

-Since v0.6.0 the asset is **ONE multi-platform fat `adapter.spt`** (ADR-0024 W1, spt-core ≥ 0.13.2):

+Since v0.6.1 the asset is **ONE multi-platform fat `adapter.spt`** (ADR-0024 W1, spt-core ≥ 0.13.2):

a single archive bundles every supported platform's binaries, and install auto-resolves the host's.

This RETIRED the F-014 per-OS stopgap — there is no longer a default-vs-per-OS-asset split.


Rebuild the fat `.spt` (now carrying the 0.6.1 manifest) + check plugin.json version for the cplugs bump.


Bash

cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== rebuild fat .spt ==="; sh ci/publish/package-adapter.sh --apply 2>&1 | grep -E "min_spt_core|ok |WROTE"; echo "=== manifest version in fat .spt ==="; tar -xzOf dist/adapter.spt manifest.toml 2>/dev/null | grep -E '^version' || (SD="C:/Users/decid/AppData/Local/Temp/claude/C--Users-decid-Documents-projects-spt-claude-code/e2a44c8e-df24-4cba-8ede-fff02a618f5e/scratchpad"; rm -rf "$SD/v"; mkdir "$SD/v"; cd "$SD/v"; powershell -NoProfile -Command "tar -xzf 'C:\\Users\\decid\\Documents\\projects\\spt-claude-code\\dist\\adapter.spt' manifest.toml" >/dev/null 2>&1; grep -E '^version' manifest.toml); echo "=== plugin.json version ==="; grep -n '"version"' plugin/sptc/.claude-plugin/plugin.json 2>/dev/null || find plugin -name plugin.json

Rebuild fat .spt, verify manifest version, find plugin.json


=== rebuild fat .spt ===
ok   C:/Users/decid/Documents/projects/spt-claude-code/adapter/claude-spt.toml
ok   manifest validates against published manifest.schema.json
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt-digest/target/release/claude-spt-digest.exe
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt-digest/target/x86_64-unknown-linux-gnu/release/claude-spt-digest
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt-psyche/target/release/claude-spt-psyche.exe
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt-psyche/target/x86_64-unknown-linux-gnu/release/claude-spt-psyche
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/cc-spt-idle-translate/target/release/cc-spt-idle-translate.exe
  ok    /c/Users/decid/Documents/projects/spt-claude-code/tools/cc-spt-idle-translate/target/x86_64-unknown-linux-gnu/release/cc-spt-idle-translate
manifest : /c/Users/decid/Documents/projects/spt-claude-code/adapter/claude-spt.toml  ->  (root) manifest.toml          [min_spt_core 0.13.2]
ok   manifest.toml + strings/ at root; x86_64-pc-windows-msvc/ + x86_64-unknown-linux-gnu/ binaries present; no stray top-level dirs
WROTE /c/Users/decid/Documents/projects/spt-claude-code/dist/adapter.spt (single fat adapter.spt). Next (operator): attach as 'adapter.spt' to a GitHub release
=== manifest version in fat .spt ===
version = "0.6.1"
version = { file = "skills/version.md" }
=== plugin.json version ===
3:  "version": "0.1.4",


Fat `.spt` carries manifest 0.6.1 ✓. Bump the cplugs skeleton plugin.json 0.1.4 → 0.1.5 (ships the simplified setup body).


1	{
2	  "name": "sptc",
3	  "version": "0.1.4",
4	  "description": "Spacetime (spt) adapter for Claude Code — agent messaging, live agents, and spt-core bootstrap. Thin skeleton; logic rides the spt binary + adapter manifest (spt-core-conducted).",
5	  "author": {
6	    "name": "perri"
7	  },
8	  "keywords": ["spt", "spacetime", "messaging", "agents", "live", "claude-spt"]

{
  "name": "sptc",
  "version": "0.1.4",
  "description": "Spacetime (spt) adapter for Claude Code — agent messaging, live agents, and spt-core bootstrap. Thin skeleton; logic rides the spt binary + adapter manifest (spt-core-conducted).",
  "author": {
    "name": "perri"
  },
  "keywords": ["spt", "spacetime", "messaging", "agents", "live", "claude-spt"]


The file C:\Users\decid\Documents\projects\spt-claude-code\plugin\sptc\.claude-plugin\plugin.json has been updated successfully. (file state is current in your context — no need to Read it back)

sptc

spt spacetime messaging agents live claude-spt

"description": "Spacetime (spt) adapter for Claude Code — agent messaging, live agents, and spt-core bootstrap. Thin skeleton; logic rides the spt binary + adapter manifest (spt-core-conducted).",


Run the gate bundle after the version + setup + cplugs changes.


Bash

cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== traceable-reqs ==="; traceable-reqs check >/dev/null 2>&1 && echo "TR OK" || echo "TR FAIL"; echo "=== adapter-archive unit ==="; sh tests/adapter-archive.sh >/dev/null 2>&1 && echo "ARCHIVE OK" || echo "ARCHIVE FAIL"; echo "=== validate-skeleton ==="; sh ci/publish/validate-skeleton.sh 2>&1 | tail -4; echo "=== docs drift ==="; sh ci/docs/check-docs.sh 2>&1 | tail -3

Run gate bundle after version/setup/cplugs changes


=== traceable-reqs ===
TR OK
=== adapter-archive unit ===
ARCHIVE OK
=== validate-skeleton ===
ok   skill ok: version
ok   published surface clean (no runtime/binary/manifest leak)

=== SKELETON: INSTALLABLE ===
=== docs drift ===
ok   mdbook build
ok   llms.txt in sync


All gates green (traceable-reqs, archive unit, skeleton INSTALLABLE, docs-drift). Commit the v0.6.1 changes.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && git add -A && git status --short && git commit -F - <<'EOF'
release(0.6.1): cut packaging modernization as v0.6.1 + simplify /sptc:setup

Operator chose a fresh tag (not an in-place v0.6.0 re-cut — a re-cut asset on the same
tag is ambiguous) and a setup cleanup, on top of the fat-archive infra (3ad54c0).

- adapter/claude-spt.toml: [adapter].version 0.6.0 -> 0.6.1 (packaging-only; the seam
  surface is unchanged from 0.6.0). Floor stays 0.13.2 (fat-archive requirement).
- /sptc:setup simplified — adapter/strings/skills/setup.md + plugin/sptc/skills/setup/SKILL.md
  drop the os-detection + `--asset adapter-<os>-<arch>.spt` step for a bare
  `spt adapter add --release SaberMage/spt-claude-code` (the single fat adapter.spt is the
  default asset and host-agnostic, so os-detection is genuinely redundant — doyle confirmed).
- cplugs skeleton plugin.json 0.1.4 -> 0.1.5 (ships the simplified setup body).
- CHANGELOG: new [0.6.1] packaging section; [0.6.0] restored to its as-shipped notes.
- RELEASE-RUNBOOK: "since v0.6.1" for the fat-archive packaging.

Fat dist/adapter.spt rebuilt carrying the 0.6.1 manifest. Gates green: traceable-reqs,
manifest-schema, docs-drift, validate-skeleton (INSTALLABLE), adapter-archive unit.
Outward steps (push + cut v0.6.1 release + upload fat asset + re-install-from-release
real-extract proof + cplugs republish) follow with operator GO (given).

Co-authored by: perri
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X4AP1gmKAAYkNX2MDnJK8A
EOF
echo "RC=$?"; git log --oneline -3

Commit v0.6.1 release-cut changes


M  CHANGELOG.md
M  adapter/claude-spt.toml
M  adapter/strings/skills/setup.md
M  docs/RELEASE-RUNBOOK.md
M  plugin/sptc/.claude-plugin/plugin.json
M  plugin/sptc/skills/setup/SKILL.md
[main 934b79d] release(0.6.1): cut packaging modernization as v0.6.1 + simplify /sptc:setup
 6 files changed, 42 insertions(+), 35 deletions(-)
RC=0
934b79d release(0.6.1): cut packaging modernization as v0.6.1 + simplify /sptc:setup
3ad54c0 build(packaging): single multi-platform fat adapter.spt (drop F-014 stopgap) + simplify proof ints
62cfbe3 test(subnet): F-017 multi-subnet bringup regression seed + validate W3 psyche-lock fix


All gates green, committed (`934b79d`). Operator GO is given — executing the outward sequence. **Step 1: push** (both commits).


cd "C:/Users/decid/Documents/projects/spt-claude-code" && git push origin main 2>&1; echo "PUSH_RC=$?"

Push main (3ad54c0 + 934b79d)


To https://github.com/SaberMage/spt-claude-code.git
   62cfbe3..934b79d  main -> main
PUSH_RC=0


Pushed. **Step 2: cut the v0.6.1 release** with the fat `adapter.spt` (fat-only, notes from the CHANGELOG 0.6.1 section).


cd "C:/Users/decid/Documents/projects/spt-claude-code" && gh release create v0.6.1 --repo SaberMage/spt-claude-code --title "v0.6.1 — single multi-platform adapter package" --notes "$(cat <<'EOF'
> Requires spt-core **v0.13.2 or newer** (the version that can install a multi-platform package).
> Packaging-only release — no change to what the adapter does, only how it ships.

### Packaging
- **One download now covers every platform.** The adapter ships as a single multi-platform `adapter.spt` that bundles both the Windows and Linux builds beside one shared manifest; installing picks your platform automatically. This replaces the previous per-OS files and the Windows-only stopgap `adapter.spt` (which broke self-update on Linux), so `spt adapter add --release …` and `spt adapter update` now just work on either OS with no platform to pick. Requires spt-core **v0.13.2+**.

### Changed
- **Setup is simpler.** `/sptc:setup` now activates the adapter with a plain `spt adapter add --release SaberMage/spt-claude-code` — no OS detection or asset selection, since the one package is host-agnostic.
- Adapter version of truth is now **0.6.1** (shown in `/sptc:version` and the release tag).
EOF
)" dist/adapter.spt 2>&1; echo "REL_RC=$?"

Create v0.6.1 release with fat adapter.spt


https://github.com/SaberMage/spt-claude-code/releases/tag/v0.6.1
REL_RC=0


Release live at `releases/tag/v0.6.1`. **Step 3: the real-extract proof** — run the gh_release auto-update path (`spt adapter update`), which fetches the new v0.6.1 fat archive and makes spt-core's own classify+flatten do the extract. This directly exercises the F-014 fix. Check current version first, then update.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== current ==="; spt adapter version claude-spt 2>&1; echo "=== UPDATE (fetch v0.6.1 fat, real classify+flatten extract) ==="; spt adapter update claude-spt 2>&1; echo "UPDATE_RC=$?"

Run adapter update to fetch+extract the fat v0.6.1


=== current ===
ADAPTER_VERSION_FAIL:claude-spt: adapter 'claude-spt' is registered as a pointer but its manifest is not present yet at C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code — the adapter's binary/manifest has not been extracted/downloaded. Complete the install (e.g. re-run the installer or `spt adapter add`) so the source tree exists, then retry.
=== UPDATE (fetch v0.6.1 fat, real classify+flatten extract) ===
ADAPTER_SKIP:claude-spt — adapter 'claude-spt' is registered as a pointer but its manifest is not present yet at C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code — the adapter's binary/manifest has not been extracted/downloaded. Complete the install (e.g. re-run the installer or `spt adapter add`) so the source tree exists, then retry.
ADAPTER_UPDATE_SKIP:claude-spt: not a registered gh_release adapter (no [update] avenue = "gh_release")
UPDATE_RC=1


The current registration is in the **manifest-not-present** (F-011) state — the install dir lost its manifest again (residue from the earlier F-018 footgun path). The `update` avenue can't read it to confirm gh_release, so it skips. Inspect the install dir, then re-acquire cleanly from the v0.6.1 release via `--release` — which both proves the real fat extract AND repairs the registration.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== install dir state ==="; ls "C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-spt-claude-code" 2>&1 | head; echo "=== manifest.toml present? ==="; ls "C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-spt-claude-code/manifest.toml" 2>&1; echo "=== registry list ==="; spt adapter list 2>&1 | head -4

Inspect broken install dir + registry


=== install dir state ===
=== manifest.toml present? ===
ls: cannot access 'C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-spt-claude-code/manifest.toml': No such file or directory
=== registry list ===
claude-spt: Harness Pointer active (from C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code)
probe-spt: Harness Copy deregistered (from C:/Users/decid/AppData/Local/Temp/sptc-probe)
probe-sptc: Harness Pointer deregistered (from C:/Users/decid/AppData/Local/Temp/sptc-brief-probe)


The install dir is **empty** — the pointer survives but its contents were wiped (silently, sometime after my earlier F-018 recovery). The sanctioned repair (per the error message itself) is re-acquire — and `--release --tag v0.6.1` doubles as the real fat-extract dogfood. Run it.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && spt adapter add --release SaberMage/spt-claude-code --tag v0.6.1 --https 2>&1; echo "ADD_RC=$?"

Re-acquire claude-spt from v0.6.1 fat release (real extract)


Fetching adapter release asset adapter.spt from SaberMage/spt-claude-code via Https…
ADAPTER_ADD:claude-spt:Harness:Pointer (registered)
ADAPTER_INSTALL_DEFERRED: GhReleaseManaged (rides the update engine)
ADD_RC=0


`add --release` registered the pointer but **deferred** the extraction ("rides the update engine") — the F-011 deferred-install behavior. Check the dir, then trigger the update engine to do the actual fat fetch+extract.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== install dir after add ==="; ls "C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-spt-claude-code" 2>&1 | head; echo "=== trigger update engine ==="; spt adapter update claude-spt 2>&1; echo "UPD_RC=$?"

Check dir + trigger update engine extraction


=== install dir after add ===
cc-spt-idle-translate.exe
claude-spt-digest.exe
claude-spt-psyche.exe
manifest.toml
strings
=== trigger update engine ===
ADAPTER_UPDATE_UPTODATE:claude-spt: installed 0.6.1, latest 0.6.1
UPD_RC=0


**REAL EXTRACT PROOF PASSED.** spt-core fetched the v0.6.1 fat `adapter.spt`, classified the triple dirs, and **flattened the win triple into the install dir root** — it now holds `manifest.toml`, `strings/`, and the 3 win `.exe` (no triple subdirs). `adapter update` → **UPTODATE: installed 0.6.1**. Verify the adapter fully resolves.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== version ==="; spt adapter version claude-spt 2>&1; echo "=== list ==="; spt adapter list 2>&1 | head -2; echo "=== translate-proof (registered, real install) ==="; spt adapter translate-proof claude-spt --event '<EVENT type="msg" from="ci">v0.6.1 fat real-extract</EVENT>' 2>&1 | tail -3; echo "=== digest-proof (registered) ==="; spt adapter digest-proof claude-spt --sample ci/digest/sample.jsonl 2>&1 | grep -E 'parsed|DIGEST_PROOF_OK'

Verify v0.6.1 adapter resolves + proofs against real install


=== version ===
0.6.1
=== list ===
claude-spt: Harness Pointer active (from C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code)
  claude-spt:ccs (shipped)
=== translate-proof (registered, real install) ===
  text  "<EVENT type=\"msg\" from=\"ci\">v0.6.1 fat real-extract</EVENT>\r"
  commit true
TRANSLATE_PROOF_OK:claude-spt
=== digest-proof (registered) ===
parsed 5 record(s), dropped 0
--- parsed records ---
DIGEST_PROOF_OK:claude-spt


**Full verification PASSED on the real fat-extracted install:** version 0.6.1, active, ccs resolves, translate-proof + digest-proof OK against the registered (non-`--dir`) install. **F-014 dead, end-to-end.** Ping doyle the milestone-closer, then do the cplugs republish.


$OWL send doyle <<'EOF'
perri — CUT + REAL-EXTRACT PROOF: GREEN. F-014 is dead.

v0.6.1 release cut on SaberMage/spt-claude-code (push 62cfbe3..934b79d, tag v0.6.1, fat adapter.spt attached, fat-only). Then the milestone-closer — spt-core's REAL classify+flatten extract on this win node:

`spt adapter add --release SaberMage/spt-claude-code --tag v0.6.1` → fetched the fat adapter.spt → classified the triple dirs → FLATTENED x86_64-pc-windows-msvc/* into the install dir root. Install dir now = {manifest.toml, strings/, claude-spt-digest.exe, claude-spt-psyche.exe, cc-spt-idle-translate.exe} — win binaries flattened to root, NO triple subdirs left, bare-name resolution intact. `spt adapter update claude-spt` → ADAPTER_UPDATE_UPTODATE: installed 0.6.1, latest 0.6.1. Registered (non --dir) translate-proof + digest-proof → both OK. version=0.6.1, ccs profile resolves.

So your classify_archive_layout + extract_release_archive (W1) wire-through is confirmed on a real harness adapter end-to-end. The local cp-flatten predicted it exactly. One note: `add --release` printed ADAPTER_INSTALL_DEFERRED: GhReleaseManaged (rides the update engine) but the dir WAS populated (extracted) right after — so deferred-label, eager-extract in practice; flagging in case the label is meant to mean lazy.

Remaining: cplugs skeleton republish (0.1.5, simplified setup body) — doing now. Relay F-014-dead + real-extract-confirmed to the operator whenever. Thanks for the fast layout answer — clean close.
EOF
echo OK

Ping doyle the cut + real-extract success


➜ SENT:doyle
OK


Now the cplugs skeleton republish. Find the procedure + marketplace clone location.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && grep -n -iE "cplugs|skeleton|marketplace|plugin install|package-skeleton" docs/RELEASE-RUNBOOK.md | head -20; echo "=== package-skeleton.sh head ==="; sed -n '1,30p' ci/publish/package-skeleton.sh

Find cplugs republish procedure


14:1. **The `SaberMage/cplugs` marketplace** — the thin **skeleton plugin** (namespaced
15:   `/spt:*` skill skeletons, `hooks.json`, the SessionStart bootstrap, `plugin.json`). This
27:no release keys here. The only setup is marketplace/registry publish credentials for the two
28:targets above (a `cplugs` push token + whatever the spt-core adapter-registry publish step
51:   - **Skeleton plugin** → push to the `SaberMage/cplugs` marketplace **only when the plugin
52:     skeleton structurally changed** (new/removed skill skeleton, hook wiring, bootstrap, or
53:     `plugin.json`). Most releases do not bump the marketplace.
58:## cplugs skeleton publish — concrete mechanics
60:<!-- [doc->REQ-DIST-PLUGIN-SKELETON] -->
61:The concrete cplugs marketplace steps, captured from the sister project's
62:`claude_skill_owl/docs/DEPLOY.md`. **Take only the SKELETON SUBSET.** spt-claude-code's cplugs
63:target is the **thin skeleton** — `/spt:*` skill skeletons, `hooks.json`, the SessionStart
64:bootstrap, `plugin.json`. **No binary, no manifest in cplugs** — the binary + adapter manifest
69:> `ci/publish/validate-skeleton.sh` is a binary installability gate (valid `plugin.json` with
72:> `ci/run-gates.sh` (the `skeleton-validate` gate) and is unit-tested by `tests/skeleton-validate.sh`.
73:> `ci/publish/package-skeleton.sh` codifies the per-bump copy below — validates first, **dry-run by
74:> default**, stages only the skeleton subset, never pushes (the marketplace commit/push stays the
77:**One-time marketplace setup:**
80:# Clone the marketplace repo
81:git clone https://github.com/SaberMage/cplugs.git ~/.claude/plugins/marketplaces/cplugs
=== package-skeleton.sh head ===
#!/bin/sh
# Stage the sptc cplugs SKELETON into a marketplace clone — the runbook "per skeleton bump" cp
# mechanic as a real, idempotent, validated script. DRY-RUN by default: prints the plan and stages
# nothing. Never pushes (marketplace credentials + the commit/push are the operator's step).
# [impl->REQ-DIST-PLUGIN-SKELETON]
#
# Usage:
#   package-skeleton.sh                 # dry-run against the default $MARKET
#   package-skeleton.sh --apply         # actually copy the skeleton subset into $MARKET
#   MARKET=/path/to/cplugs/plugins/sptc package-skeleton.sh --apply
set -u
HERE=$(CDPATH= cd "$(dirname "$0")" && pwd)
ROOT=$(CDPATH= cd "$HERE/../.." && pwd)
PLUGIN="$ROOT/plugin/sptc"
MARKET="${MARKET:-$HOME/.claude/plugins/marketplaces/cplugs/plugins/sptc}"
APPLY=0
[ "${1:-}" = "--apply" ] && APPLY=1

# Validate first — refuse to stage an invalid / leaky skeleton.
echo "== validate skeleton =="
if ! sh "$HERE/validate-skeleton.sh" "$PLUGIN"; then
  echo "REFUSING to package: skeleton failed validation (fix above, then retry)." >&2
  exit 1
fi

# The skeleton SUBSET — exactly what cplugs carries (no binary, no manifest, no runtime state).
SUBSET=".claude-plugin/plugin.json hooks skills bootstrap.sh bootstrap.ps1"

echo
echo "== plan ($([ "$APPLY" -eq 1 ] && echo APPLY || echo DRY-RUN)) =="


cplugs republish = `package-skeleton.sh --apply` into the marketplace clone, then commit+push it. Check the clone exists + dry-run.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && echo "=== marketplace clone present? ==="; ls -d "$HOME/.claude/plugins/marketplaces/cplugs/plugins/sptc" 2>&1; echo "=== current cplugs plugin.json version ==="; grep '"version"' "$HOME/.claude/plugins/marketplaces/cplugs/plugins/sptc/.claude-plugin/plugin.json" 2>&1; echo "=== dry-run package-skeleton ==="; sh ci/publish/package-skeleton.sh 2>&1 | tail -20

Check marketplace clone + dry-run skeleton package


=== marketplace clone present? ===
/c/Users/decid/.claude/plugins/marketplaces/cplugs/plugins/sptc
=== current cplugs plugin.json version ===
  "version": "0.1.4",
=== dry-run package-skeleton ===
ok   skill ok: send
ok   skill ok: setup
ok   skill ok: signoff
ok   skill ok: subnet
ok   skill ok: version
ok   published surface clean (no runtime/binary/manifest leak)

=== SKELETON: INSTALLABLE ===

== plan (DRY-RUN) ==
source : /c/Users/decid/Documents/projects/spt-claude-code/plugin/sptc
target : /c/Users/decid/.claude/plugins/marketplaces/cplugs/plugins/sptc
  stage  .claude-plugin/plugin.json
  stage  hooks
  stage  skills
  stage  bootstrap.sh
  stage  bootstrap.ps1

DRY-RUN: nothing copied. Re-run with --apply to stage into $MARKET, then commit+push the
cplugs repo and 'claude plugin install sptc@cplugs' (see docs/RELEASE-RUNBOOK.md).


Marketplace clone present (0.1.4), dry-run clean. Apply the 0.1.5 skeleton into the clone.


cd "C:/Users/decid/Documents/projects/spt-claude-code" && sh ci/publish/package-skeleton.sh --apply 2>&1 | tail -8; echo "APPLY_RC=${PIPESTATUS[0]}"; echo "=== staged version + setup body check ==="; grep '"version"' "$HOME/.claude/plugins/marketplaces/cplugs/plugins/sptc/.claude-plugin/plugin.json"; grep -c "adapter add --release SaberMage/spt-claude-code$\|--asset adapter-" "$HOME/.claude/plugins/marketplaces/cplugs/plugins/sptc/skills/setup/SKILL.md" 2>&1; echo "=== marketplace git status ==="; git -C "$HOME/.claude/plugins/marketplaces/cplugs" status --short 2>&1 | head

Apply skeleton to clone + verify staged version/setup


  stage  .claude-plugin/plugin.json
  stage  hooks
  stage  skills
  stage  bootstrap.sh
  stage  bootstrap.ps1

STAGED into /c/Users/decid/.claude/plugins/marketplaces/cplugs/plugins/sptc. Next (operator): cd into the cplugs repo, 'git add plugins/sptc/',
commit + push, then 'claude plugin install sptc@cplugs' + /reload-plugins.
APPLY_RC=0
=== staged version + setup body check ===
  "version": "0.1.5",
0
=== marketplace git status ===
 M plugins/sptc/.claude-plugin/plugin.json
 M plugins/sptc/skills/setup/SKILL.md


Staged: plugin.json 0.1.5, setup SKILL.md simplified (old `--asset` lines gone). Commit + push the marketplace clone (the final outward step).


MKT="$HOME/.claude/plugins/marketplaces/cplugs" && cd "$MKT" && echo "=== branch ==="; git branch --show-current; git -C "$MKT" add plugins/sptc/ && git -C "$MKT" commit -F - <<'EOF'
sptc 0.1.5 — simplified /sptc:setup (bare adapter add --release)

Ships the simplified setup body: /sptc:setup now activates claude-spt with a plain
`spt adapter add --release SaberMage/spt-claude-code` — no os-detection / --asset, since
the adapter ships as a single host-agnostic multi-platform adapter.spt (v0.6.1, spt-core
v0.13.2+). plugin.json 0.1.4 -> 0.1.5.

Co-authored by: perri
EOF
echo "COMMIT_RC=$?"; git -C "$MKT" log --oneline -1

Commit the cplugs marketplace skeleton bump


=== branch ===
main
warning: in the working copy of 'plugins/sptc/.claude-plugin/plugin.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/bootstrap.ps1', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/bootstrap.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/_common.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/hooks.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/session-end.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/session-start.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/stop.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/subagent-start.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/subagent-stop.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/hooks/user-prompt-submit.sh', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/commune/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/force-stop/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/list-agents/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/live/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/ready/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/send/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/setup/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/signoff/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/subnet/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'plugins/sptc/skills/version/SKILL.md', LF will be replaced by CRLF the next time Git touches it
[main 871becb] sptc 0.1.5 — simplified /sptc:setup (bare adapter add --release)
 2 files changed, 7 insertions(+), 9 deletions(-)
COMMIT_RC=0
871becb sptc 0.1.5 — simplified /sptc:setup (bare adapter add --release)
Shell cwd was reset to C:\Users\decid\Documents\projects\spt-claude-code


Marketplace committed (`871becb`, 2 files). Push it.


MKT="$HOME/.claude/plugins/marketplaces/cplugs" && git -C "$MKT" push origin main 2>&1; echo "PUSH_RC=$?"

Push the cplugs marketplace


To https://github.com/SaberMage/cplugs.git
   931bf92..871becb  main -> main
PUSH_RC=0


cplugs marketplace pushed (`931bf92..871becb`). **The entire C sequence is complete.** Final ping to doyle closing his sequence, then I'll report.


$OWL send doyle <<'EOF'
perri — sequence CLOSED. cplugs skeleton republished: sptc 0.1.5 pushed to SaberMage/cplugs (931bf92..871becb) carrying the simplified bare `adapter add --release` setup body.

Full C done end-to-end: fat packer + min 0.13.2 + proof-int --dir/--manifest simplification (3ad54c0) → v0.6.1 cut + setup cleanup + cplugs bump (934b79d) → pushed → v0.6.1 release w/ fat adapter.spt → REAL classify+flatten extract proven on this node (claude-spt 0.6.1, win-triple flattened, proofs green) → cplugs 0.1.5. F-014 DEAD. Relay F-014-dead + real-extract-confirmed to the operator at your convenience. Thanks doyle — clean modernization, fast layout answer made it smooth.
EOF
echo OK

Final ping to doyle — sequence closed


<owl_messages>
<owl_message from="doyle" priority="high">Milestone-closer GREEN confirmed — spt-core's real classify+flatten wire-through (classify_archive_layout + extract_release_archive, v0.13.2 W1) is now proven end-to-end on a real harness adapter: fetch fat → classify triples → flatten win-triple to install-dir root → bare-name resolves → update UPTODATE → both proofs OK. Your local cp-flatten predicted it exactly. F-014 dead. Clean close.

On the DEFERRED label — NOT a bug, expected by design (verified in cli.rs add path): `add --release` runs fetch_release_adapter which fetches + extracts + registers EAGERLY (that's why your dir was populated). The "Skipped(GhReleaseManaged)" / deferred label refers to the post-install [update] CONDUCT being skipped — a gh_release adapter self-manages updates via `spt adapter update` (REQ-UPD-7/9 keep the HTTP fetch CLI-side, not re-run at add-time). So: install/extract = eager (correct), update-management = deferred to the gh_release engine. No lazy install. Your observation is right; the WORD "deferred" next to a populated dir just reads ambiguously. I'm logging a low-priority LABEL-CLARITY polish (sharpen the message so it doesn't read as lazy-install) — batched with the F-018 adapter-safety pass, not v0.14.0. Nothing for you to change; v0.6.1 install is working as designed.

Finish the cplugs skeleton republish; ping when 0.1.5 is up. Relaying the F-014-dead + real-extract-confirmed to the operator now.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


ACK doyle — the deferred-label clarification lands (eager extract + deferred update-conduct, not lazy install; my v0.6.1 works as designed). cplugs 0.1.5 already pushed (my last ping crossed yours).


$OWL send doyle <<'EOF'
perri — ACK on the DEFERRED label: clear, not a bug — eager fetch+extract+register, only the post-install [update] CONDUCT is skipped (gh_release self-manages via `spt adapter update`). Matches what I saw (populated dir + UPTODATE). The LABEL-CLARITY polish batched with F-018 is a nice touch for the next reader; nothing my end. And cplugs 0.1.5 is already UP (my prior ping crossed yours): sptc 0.1.5 on SaberMage/cplugs, 931bf92..871becb, bare `adapter add --release` setup. Sequence fully closed. F-014 dead. 🦉
EOF
echo OK

ACK doyle deferred-label clarification


<owl_messages>
<owl_message from="doyle" priority="high">Sequence closed cleanly — sptc 0.1.5 + v0.6.1 fat-only + the real-extract proof on-node. F-014 DEAD, full C done end-to-end. Great execution; the dogfood-before-upload discipline is exactly right. Relaying the close to the operator now. Until the next thing — nice work.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


ACK doyle (final close), then commune the C completion.


$OWL send doyle <<'EOF'
perri — thanks doyle. Closed. Until the next thing. 🦉
EOF
$LIVE commune perri <<'EOF'
## C COMPLETE — packaging modernized, v0.6.1 shipped (F-014 dead)

All of C done end-to-end + dogfooded + shipped. doyle confirmed F-014 DEAD.

WHAT SHIPPED:
- claude-spt v0.6.1 (GitHub release on SaberMage/spt-claude-code, tag v0.6.1, fat-only adapter.spt attached). main @ 934b79d (pushed). Two commits: 3ad54c0 (fat packer + min 0.13.2 + proof-int --dir/--manifest simplification) + 934b79d (v0.6.1 cut + setup cleanup + cplugs bump).
- Single MULTI-PLATFORM fat adapter.spt (ADR-0024 W1): shared manifest.toml+strings/ at root, x86_64-pc-windows-msvc/ + x86_64-unknown-linux-gnu/ binary subdirs. Replaces the F-014 windows-copy stopgap AND the per-OS asset scheme. ci/publish/package-adapter.sh rewritten as the fat packer (refuses <0.13.2 floor, guards unrecognized-top-level-dir footgun).
- min_spt_core_version 0.9.0 -> 0.13.2 (MANDATORY for a fat archive; only 0.13.2+ extracts it). [adapter].version 0.6.0 -> 0.6.1 (packaging-only).
- /sptc:setup simplified: bare `spt adapter add --release SaberMage/spt-claude-code` (dropped os-detection + --asset; the fat default is host-agnostic). Both adapter/strings/skills/setup.md + plugin/sptc/skills/setup/SKILL.md.
- cplugs sptc 0.1.5 pushed (SaberMage/cplugs 931bf92..871becb) carrying the simplified setup.
- Proof ints: translate-proof-int.sh + digest-proof-int.sh now use --dir/--manifest (dropped the stale bare-file adapter add/remove staging that soft-removed the real adapter; F-011 W5). Read-only, no SPTC_ACCEPTANCE gate. tests/adapter-archive.sh rewritten for the fat layout. REQ-DIST-ADAPTER-PEROS reframed to multi-platform.

REAL-EXTRACT PROOF (doyle's milestone-closer, GREEN on this node): `adapter add --release --tag v0.6.1` → spt-core fetched the fat adapter.spt → classified triples → FLATTENED win-triple to install-dir root → claude-spt 0.6.1, `adapter update` UPTODATE, registered translate-proof + digest-proof OK. (Note: DEFERRED label on add = eager extract + deferred [update]-conduct, NOT lazy — doyle confirmed by design; he's batching a label-clarity polish with F-018.)

DOC GAP: the multi-platform .spt authoring layout was published-docs-MISSING (only in spt-core internal CONTEXT.md). doyle gave me the layout (per-triple dirs, 2 recognized triples only, win-triple flatten) + is fixing docs in spt-core PR #31. Not separately logged (his call).

INSTALL-DIR WIPE (minor, self-resolved): mid-session the _github install dir went empty (manifest-not-present, F-011 state) — re-acquire via --release v0.6.1 repaired + re-extracted it. Watch if it recurs.

## Next Up (waiting on doyle pings)
1. v0.14.0 PUBLISH VALIDATION — re-run the multi-subnet repro on real claude-spt when doyle ships v0.14.0 (he pings at publish). My committed next deliverable.
2. F-018 fast-follow + the deferred-label polish — doyle dispatches; watch.
3. Nothing else queued. Node clean: spt-core 0.13.2, claude-spt 0.6.1 healthy.
EOF
echo DONE

ACK doyle + commune C completion


➜ SENT:doyle
➜ SENT:perri-psyche
DONE


Update durable cross-session memory (the index is stale at v0.4.0; this session shipped v0.6.1).


Write

---
name: v06x-w3-f017-v061
description: 2026-06-22 perri session — W3 psyche-lock validated, F-017 multi-subnet seed shipped, v0.6.1 fat-archive packaging shipped (F-014 dead)
metadata:
  type: project
---

2026-06-22 live session (perri, legacy spt). spt-core now v0.13.2 (counter 29); claude-spt **v0.6.1** shipped; node clean. Three bodies of work, all closed with doyle:

**A — W3 psyche-lock fix VALIDATED on spt-core v0.13.2** (doyle ADR-0025). Ran my F-010×F-015 repro on real claude-spt: (1a) live psyche runs from `<perch>/.live-bin/claude-spt-psyche.exe` own-copy (NOT install dir); (1b) install-dir binary stays unlocked while live (tar-exit-1 precondition gone); (2) orphan psyche reaps on `spt endpoint stop` (1→0). **F-010×F-015 CLOSED both sides.** Live-bringup recipe on a multi-subnet node = `api seed` + persistent `api listen <id> --subnet SPT_DEV` (hook-path listen TAKES --subnet; only spt-hosted `endpoint run` lacks it = the F-017 gap).

**B — F-017 logged + regression seed shipped.** `ci/subnet/multi-subnet-bringup-int.sh` (3 cases, multi-subnet-gated; commit 62cfbe3, pushed). F-017 = REQ-RUN-MULTISUBNET-HOME (doyle ADRs 0026/0027, v0.14.0 milestone, todlando W6/PR#30). HOME_REFUSED pins through v0.13.2.

**C — packaging modernized, v0.6.1 shipped (F-014 DEAD).** Single MULTI-PLATFORM fat `adapter.spt` (ADR-0024 W1): shared manifest.toml+strings/ at root + per-triple binary subdirs (`x86_64-pc-windows-msvc/`, `x86_64-unknown-linux-gnu/` — the ONLY two spt-core recognizes; unrecognized triple silently flattens = footgun, packer guards it). Install classify+flattens this node's triple → install-dir root → bare-name resolves. **min_spt_core_version 0.9.0→0.13.2 (MANDATORY for a fat archive).** Replaces F-014 windows-copy stopgap + per-OS scheme. /sptc:setup simplified to bare `adapter add --release` (host-agnostic). cplugs sptc **0.1.5** pushed. Proof ints (translate/digest) simplified to v0.13.2 `--dir/--manifest` (F-011 W5; dropped the stale `adapter add/remove claude-spt` staging that soft-removed the real adapter). Commits 3ad54c0 + 934b79d (pushed). **Real-extract proven on-node**: `adapter add --release --tag v0.6.1` → spt-core fetch→classify→flatten win-triple → claude-spt 0.6.1, update UPTODATE, proofs green.

**FINDINGS this session:** F-018 (`spt adapter add --github` on an already-extracted gh_release Pointer is a destructive footgun — wipes install, os-error-2, F-011 sibling; doyle accepted, adapter-safety fast-follow). Multi-platform .spt authoring layout was published-docs-MISSING (only in spt-core CONTEXT.md) → doyle fixing in spt-core PR #31 (not separately logged, his call). `add --release` DEFERRED label = eager-extract + deferred-update-conduct, not lazy (doyle confirmed; label-clarity polish batched w/ F-018).

**NEXT (on doyle pings):** (1) v0.14.0 publish validation — re-run multi-subnet repro on real claude-spt when shipped (my committed deliverable); (2) F-018 + deferred-label-polish dispatch — watch. See [[prep4-v030-parity-closed]], [[psyche-sandbox-and-adr-leak]].