== plugin.json version ==
2:  "name": "sptc",
3:  "version": "0.1.3",
6:    "name": "perri"
== validate-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 ===
== package-skeleton DRY-RUN ==
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).


Prompt:
<task-notification>
<task-id>bozr9yeab</task-id>
<tool-use-id>toolu_01MvByirjQeRUT5VSHZ9nyDh</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bozr9yeab.output</output-file>
<status>completed</status>
<summary>Background command "Install cargo-zigbuild + add linux rust target" completed (exit code 0)</summary>
</task-notification>


zig install task done (exit 0). Skeleton stages the `hooks/` dir (my changed wrappers) — so a cplugs republish delivers them; plugin.json needs a bump (0.1.3 → 0.1.4). Checking the zigbuild result.


Bash

cat "C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bozr9yeab.output" 2>&1 | tail -12
echo "== cargo-zigbuild present? =="; command -v cargo-zigbuild || ls ~/.cargo/bin/ | grep -i zig || echo "MISSING"

Check zigbuild install result


removed stale linux asset
== install cargo-zigbuild (compiles from source) ==
    Blocking waiting for file lock on package cache
    Updating crates.io index
     Ignored package `cargo-zigbuild v0.23.0` is already installed, use --force to override
ZIGBUILD_INSTALL_EXIT=0
rustup linux target:
info: component 'rust-std' for target 'x86_64-unknown-linux-gnu' is up to date
== cargo-zigbuild present? ==
/c/Users/decid/.cargo/bin/cargo-zigbuild


cargo-zigbuild present + linux target ready, but it needs the **zig binary** itself (was MISSING). Checking for an existing zig (prior release may have fetched it).


echo "== search for zig binary =="
ls ~/.sptc-zig/ 2>/dev/null && find ~/.sptc-zig -name 'zig.exe' 2>/dev/null | head
for p in ~/.sptc-zig/*/zig.exe ~/zig*/zig.exe /c/zig/zig.exe; do [ -x "$p" ] && echo "FOUND: $p"; done
command -v zig || echo "zig not on PATH"
echo "== cargo-zigbuild self-check (does it fetch zig?) =="; cargo-zigbuild zig --help 2>&1 | head -5

Locate or probe zig binary availability


== search for zig binary ==
zig-x86_64-windows-0.14.1
/c/Users/decid/.sptc-zig/zig-x86_64-windows-0.14.1/zig.exe
FOUND: /c/Users/decid/.sptc-zig/zig-x86_64-windows-0.14.1/zig.exe
zig not on PATH
== cargo-zigbuild self-check (does it fetch zig?) ==
Zig linker wrapper

Usage: cargo-zigbuild.exe zig <COMMAND>

Commands:


Found zig at `~/.sptc-zig/.../zig.exe` (prior release). Cross-building the linux binaries + packaging the fresh linux asset (background — compiles take a bit).


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
export PATH="$HOME/.sptc-zig/zig-x86_64-windows-0.14.1:$PATH"
echo "zig: $(command -v zig)"
echo "== cross-build digest (linux) =="
cargo zigbuild --release --target x86_64-unknown-linux-gnu --manifest-path tools/claude-spt-digest/Cargo.toml 2>&1 | tail -4
echo "== cross-build psyche (linux) =="
cargo zigbuild --release --target x86_64-unknown-linux-gnu --manifest-path tools/claude-spt-psyche/Cargo.toml 2>&1 | tail -4
echo "== package linux asset =="
SPTC_OS=linux SPTC_ARCH=x86_64 SPTC_TARGET=x86_64-unknown-linux-gnu sh ci/publish/package-adapter.sh --apply 2>&1 | tail -6
echo "== dist =="; ls -la dist/
echo "== verify linux asset carries ELF binaries + 0.5.0 manifest =="
tar tzf dist/adapter-linux-x86_64.spt 2>/dev/null
tar xzf dist/adapter-linux-x86_64.spt -O manifest.toml 2>/dev/null | grep -E '^version'

Cross-build linux binaries + package linux asset


Command running in background with ID: bh58bb0xy. Output is being written to: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bh58bb0xy.output. You will be notified when it completes. To check interim output, use Read on that file path.


<task-notification>
<task-id>bh58bb0xy</task-id>
<tool-use-id>toolu_01GDMDHZnwqC9kkHvD6eohPF</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bh58bb0xy.output</output-file>
<status>completed</status>
<summary>Background command "Cross-build linux binaries + package linux asset" completed (exit code 0)</summary>
</task-notification>


While the linux build runs, bumping plugin.json for the cplugs skeleton republish (hook wrappers changed → structural).


1	{
2	  "name": "sptc",
3	  "version": "0.1.3",
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"]
9	}
10

sptc

spt spacetime messaging agents live claude-spt


Prompt:
<task-notification>
<task-id>bh58bb0xy</task-id>
<tool-use-id>toolu_01GDMDHZnwqC9kkHvD6eohPF</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bh58bb0xy.output</output-file>
<status>completed</status>
<summary>Background command "Cross-build linux binaries + package linux asset" completed (exit code 0)</summary>
</task-notification>


SessionStart identity injection for bind topology


Linux build done (exit 0). Bumping plugin.json + checking the linux asset result.


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)

"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).",


Bash

cat "C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-claude-code\4e641e64-4584-4260-a93c-b1450515a51d\tasks\bh58bb0xy.output" 2>&1 | tail -20

Check linux asset build result


-rw-r--r-- 1 decid 197609 266288 Jun 19 23:04 adapter-windows-x86_64.spt
== verify linux asset carries ELF binaries + 0.5.0 manifest ==
manifest.toml
strings/
strings/briefs/
strings/briefs/identity.md
strings/briefs/messaging-no-perch.md
strings/briefs/messaging-perch.md
strings/skills/
strings/skills/force-stop.md
strings/skills/list-agents.md
strings/skills/live.md
strings/skills/ready.md
strings/skills/setup.md
strings/skills/subnet.md
strings/skills/version.md
claude-spt-digest
claude-spt-psyche
version = "0.5.0"
version = { file = "skills/version.md" }


Linux asset is fresh: manifest `version = "0.5.0"`, includes `strings/briefs/*` + both binaries. Verifying both assets + ELF, then tagging.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== dist assets =="; ls -la dist/*.spt
echo "== linux binary is ELF? =="
tmp=$(mktemp -d); tar xzf dist/adapter-linux-x86_64.spt -C "$tmp" claude-spt-digest 2>/dev/null
file "$tmp/claude-spt-digest" 2>/dev/null || head -c4 "$tmp/claude-spt-digest" | xxd | head -1
echo "== windows asset manifest version =="; tar xzf dist/adapter-windows-x86_64.spt -O manifest.toml 2>/dev/null | grep -E '^version ='
rm -rf "$tmp"

Verify both assets fresh + linux ELF + windows version


== dist assets ==
-rw-r--r-- 1 decid 197609 468568 Jun 19 23:05 dist/adapter-linux-x86_64.spt
-rw-r--r-- 1 decid 197609 266288 Jun 19 23:04 dist/adapter-windows-x86_64.spt
== linux binary is ELF? ==
/tmp/tmp.ZRX3k7Kqq1/claude-spt-digest: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.0.0, stripped
== windows asset manifest version ==
version = "0.5.0"
version = { file = "skills/version.md" }


Both assets fresh + correct (linux ELF, both `version = "0.5.0"`). Committing the plugin.json bump, then tagging `v0.5.0` and pushing.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
git add plugin/sptc/.claude-plugin/plugin.json
git commit -q -F - <<'EOF'
chore(release): bump cplugs skeleton plugin.json 0.1.3 -> 0.1.4

Hook wrappers (session-start.sh, _common.sh) gained the SessionStart brief
relay; the skeleton ships those wrappers, so the marketplace plugin version
bumps to deliver them. Paired with adapter 0.5.0.

Co-authored by: perri
EOF
git log -1 --format='%h %s'
echo "== push main =="; git push origin main 2>&1 | tail -2
echo "== tag v0.5.0 =="; git tag v0.5.0 && git push origin v0.5.0 2>&1 | tail -3

Commit plugin.json bump, push main, tag v0.5.0


46b7952 chore(release): bump cplugs skeleton plugin.json 0.1.3 -> 0.1.4
== push main ==
To https://github.com/SaberMage/spt-claude-code.git
   4134898..46b7952  main -> main
== tag v0.5.0 ==
To https://github.com/SaberMage/spt-claude-code.git
 * [new tag]         v0.5.0 -> v0.5.0


Main + tag `v0.5.0` pushed. Creating the GitHub release with the CHANGELOG section as body + both per-OS assets.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
# Extract the [0.5.0] changelog section as the release body (verbatim, runbook rule).
awk '/^## \[0\.5\.0\]/{f=1} f&&/^## \[0\.4\.0\]/{exit} f' CHANGELOG.md > /tmp/rel-body.md
echo "== release body =="; cat /tmp/rel-body.md
echo "== create release v0.5.0 + attach assets =="
gh release create v0.5.0 \
  --repo SaberMage/spt-claude-code \
  --title "v0.5.0 — SessionStart identity/ring briefs" \
  --notes-file /tmp/rel-body.md \
  dist/adapter-windows-x86_64.spt dist/adapter-linux-x86_64.spt 2>&1 | tail -5

Create GitHub release v0.5.0 with per-OS adapter assets


== release body ==
## [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.

== create release v0.5.0 + attach assets ==
https://github.com/SaberMage/spt-claude-code/releases/tag/v0.5.0


Release live: https://github.com/SaberMage/spt-claude-code/releases/tag/v0.5.0. Verifying assets attached, then the final step — cplugs skeleton republish.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== release assets =="; gh release view v0.5.0 --repo SaberMage/spt-claude-code --json assets --jq '.assets[].name' 2>&1
echo "== stage cplugs skeleton (--apply) =="
sh ci/publish/package-skeleton.sh --apply 2>&1 | tail -12

Verify release assets, stage cplugs skeleton


== release assets ==
adapter-linux-x86_64.spt
adapter-windows-x86_64.spt
== stage cplugs skeleton (--apply) ==

== plan (APPLY) ==
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

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.


Both assets attached. cplugs skeleton staged. Committing + pushing the cplugs marketplace repo.


CP=~/.claude/plugins/marketplaces/cplugs
cd "$CP" || exit 1
echo "== branch + remote =="; git -C "$CP" branch --show-current; git -C "$CP" remote get-url origin
echo "== changed files =="; git -C "$CP" status --short plugins/sptc/ | head -20
git -C "$CP" add plugins/sptc/
git -C "$CP" commit -q -F - <<'EOF'
sptc 0.1.4: SessionStart identity/ring briefs (hook wrappers)

session-start.sh now relays an agent-facing brief as additionalContext
(identity for perched sessions, peer-gated ring brief for no-perch seeds);
_common.sh gains the compose/encode/peer-gate helpers. Pairs with adapter 0.5.0.

Co-authored by: perri
EOF
git -C "$CP" log -1 --format='%h %s'
echo "== push cplugs =="; git -C "$CP" push 2>&1 | tail -3

Commit and push cplugs marketplace skeleton


== branch + remote ==
main
https://github.com/SaberMage/cplugs.git
== changed files ==
 M plugins/sptc/.claude-plugin/plugin.json
 M plugins/sptc/hooks/_common.sh
 M plugins/sptc/hooks/session-start.sh
 M plugins/sptc/hooks/user-prompt-submit.sh
 M plugins/sptc/skills/commune/SKILL.md
 M plugins/sptc/skills/force-stop/SKILL.md
 M plugins/sptc/skills/list-agents/SKILL.md
 M plugins/sptc/skills/live/SKILL.md
 M plugins/sptc/skills/ready/SKILL.md
 M plugins/sptc/skills/send/SKILL.md
 M plugins/sptc/skills/setup/SKILL.md
 M plugins/sptc/skills/signoff/SKILL.md
 M plugins/sptc/skills/subnet/SKILL.md
 M plugins/sptc/skills/version/SKILL.md
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/hooks/_common.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/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
931bf92 sptc 0.1.4: SessionStart identity/ring briefs (hook wrappers)
== push cplugs ==
To https://github.com/SaberMage/cplugs.git
   43aa021..931bf92  main -> main
Shell cwd was reset to C:\Users\decid\Documents\projects\spt-claude-code


cplugs pushed (`43aa021..931bf92`) — republish also caught up the drifted SKILL.md skeletons to current source. Verifying the full release landed + the tag-triggered docs-publish workflow.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== tag + release =="; gh release view v0.5.0 --repo SaberMage/spt-claude-code --json tagName,assets,isDraft --jq '{tag:.tagName,draft:.isDraft,assets:[.assets[].name]}' 2>&1
echo "== HEAD manifest version (github) =="; git show HEAD:adapter/claude-spt.toml | grep -m1 '^version ='
echo "== docs-publish workflow (tag-triggered) =="; gh run list --repo SaberMage/spt-claude-code --limit 3 2>&1 | head -5 || echo "(no workflow runs / not configured)"

Verify release, HEAD version, docs-publish workflow


== tag + release ==
{"assets":["adapter-linux-x86_64.spt","adapter-windows-x86_64.spt"],"draft":false,"tag":"v0.5.0"}
== HEAD manifest version (github) ==
version = "0.5.0"
== docs-publish workflow (tag-triggered) ==


Release shipped. Both targets published.

## v0.5.0 released — full ceremony complete

**Adapter (target #2 — spt-core registry):**
- Bumped manifest `0.4.0 → 0.5.0`, CHANGELOG `[0.5.0]`, regen'd `llms.txt` (docs-drift in sync).
- Tagged `v0.5.0`, pushed.
- **GitHub release** (live, not draft): `adapter-windows-x86_64.spt` + `adapter-linux-x86_64.spt` — both carry the 0.5.0 manifest + `[strings.briefs]` + `briefs/*.md` + native binaries. Linux cross-built via zig (ELF-verified).

**cplugs skeleton (target #1 — marketplace):**
- Bumped `plugin.json 0.1.3 → 0.1.4`, republished `hooks/` (new `session-start.sh` + `_common.sh`) + caught up drifted SKILL.md skeletons → pushed to `SaberMage/cplugs` (`931bf92`).

**Delivery paths now both carry the feature** (needed together): `spt adapter add --release SaberMage/spt-claude-code` (briefs) + `claude plugin update`/`install sptc@cplugs` (wrappers).

**main commits:** `4134898` feat · `81969c2` adapter 0.5.0 · `46b7952` plugin.json · tag `v0.5.0`.

**Left for you (operator steps, intentionally not auto-run):**
- **Pointer flip:** `claude plugin install sptc@cplugs` + `/reload-plugins` — touches this machine's plugin install + needs a session restart.
- **docs-publish:** no GH Actions run surfaced (may be unconfigured/non-Actions); `llms.txt` regen'd + pushed, but the docs-site Pages publish is unverified.
- I did **not** re-acquire the live `claude-spt` adapter here (avoid disturbing the working pointer; you're on legacy owl this session anyway).

**Still deferred:** REQ `int` stage (needs the committed round-trip script; the published-adapter half is now satisfied) · live/ready flavor (doyle's `spt whoami --json`).

Want me to commune the release outcome to Psyche?


<local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.</local-command-caveat>


<command-name>/plugin</command-name>
            <command-message>plugin</command-message>
            <command-args></command-args>


<local-command-stdout>✔ Updated sptc. Run /reload-plugins to apply.</local-command-stdout>


<command-name>/reload-plugins</command-name>
            <command-message>reload-plugins</command-message>
            <command-args></command-args>


<local-command-stdout>Reloaded: 7 plugins · 0 skills · 40 agents · 15 hooks · 1 plugin MCP server · 1 plugin LSP server</local-command-stdout>


tried to update using spt, but it failed. is the update command not set up properly? check the docs. excerpt: PS C:\Users\decid\Documents\projects> spt adapter update claude-spt
ADAPTER_UPDATE:claude-spt: 0.4.0 -> 0.5.0 (fetching adapter.spt from SaberMage/spt-claude-code)
ADAPTER_UPDATE_FAIL:claude-spt: fetch: HTTP 404 Not Found


- autoplan: Auto-review pipeline — reads the full CEO, design, eng, and DX review skills from disk
and runs them sequentially with auto-decisions using 6 decision principles. Surfaces
taste decisions (close approaches, borderline scope, codex disagreements) at a final
approval gate. One command, fully reviewed plan out.
Use when asked to "auto review", "autoplan", "run all reviews", "review this plan
automatically", or "make the decisions for me".
Proactively suggest when the user has a plan file and wants to run the full review
gauntlet without answering 15-30 intermediate questions. (gstack)
- benchmark: Performance regression detection using the browse daemon. Establishes
baselines for page load times, Core Web Vitals, and resource sizes.
Compares before/after on every PR. Tracks performance trends over time.
Use when: "performance", "benchmark", "page speed", "lighthouse", "web vitals",
"bundle size", "load time". (gstack)
- browse: Fast headless browser for QA testing and site dogfooding. Navigate any URL, interact with
elements, verify page state, diff before/after actions, take annotated screenshots, check
responsive layouts, test forms and uploads, handle dialogs, and assert element states.
~100ms per command. Use when you need to test a feature, verify a deployment, dogfood a
user flow, or file a bug with evidence. Use when asked to "open in browser", "test the
site", "take a screenshot", or "dogfood this". (gstack)
- canary: Post-deploy canary monitoring. Watches the live app for console errors,
performance regressions, and page failures using the browse daemon. Takes
periodic screenshots, compares against pre-deploy baselines, and alerts
on anomalies. Use when: "monitor deploy", "canary", "post-deploy check",
"watch production", "verify deploy". (gstack)
- careful: Safety guardrails for destructive commands. Warns before rm -rf, DROP TABLE,
force-push, git reset --hard, kubectl delete, and similar destructive operations.
User can override each warning. Use when touching prod, debugging live systems,
or working in a shared environment. Use when asked to "be careful", "safety mode",
"prod mode", or "careful mode". (gstack)
- caveman: Ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman.
- ccs-delegation: Auto-activate CCS CLI delegation for deterministic tasks. Parses user input, auto-selects optimal profile (glm/kimi/custom) from ~/.ccs/config.json, enhances prompts with context, executes via `ccs {profile} -p "task"` or `ccs {profile}:continue`, and reports results. Triggers on "use ccs [task]" patterns, typo/test/refactor keywords. Excludes complex architecture, security-critical code, performance optimization, breaking changes.
- checkpoint: Save and resume working state checkpoints. Captures git state, decisions made,
and remaining work so you can pick up exactly where you left off — even across
Conductor workspace handoffs between branches.
Use when asked to "checkpoint", "save progress", "where was I", "resume",
"what was I working on", or "pick up where I left off".
Proactively suggest when a session is ending, the user is switching context,
or before a long break. (gstack)
- codex: OpenAI Codex CLI wrapper — three modes. Code review: independent diff review via
codex review with pass/fail gate. Challenge: adversarial mode that tries to break
your code. Consult: ask codex anything with session continuity for follow-ups.
The "200 IQ autistic developer" second opinion. Use when asked to "codex review",
"codex challenge", "ask codex", "second opinion", or "consult codex". (gstack)
- connect-chrome: Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in.
Opens a visible browser window where you can watch every action in real time.
The sidebar shows a live activity feed and chat. Anti-bot stealth built in.
Use when asked to "open gstack browser", "launch browser", "connect chrome",
"open chrome", "real browser", "launch chrome", "side panel", or "control my browser".
- cso: Chief Security Officer mode. Infrastructure-first security audit: secrets archaeology,
dependency supply chain, CI/CD pipeline security, LLM/AI security, skill supply chain
scanning, plus OWASP Top 10, STRIDE threat modeling, and active verification.
Two modes: daily (zero-noise, 8/10 confidence gate) and comprehensive (monthly deep
scan, 2/10 bar). Trend tracking across audit runs.
Use when: "security audit", "threat model", "pentest review", "OWASP", "CSO review". (gstack)
- design-consultation: Design consultation: understands your product, researches the landscape, proposes a
complete design system (aesthetic, typography, color, layout, spacing, motion), and
generates font+color preview pages. Creates DESIGN.md as your project's design source
of truth. For existing sites, use /plan-design-review to infer the system instead.
Use when asked to "design system", "brand guidelines", or "create DESIGN.md".
Proactively suggest when starting a new project's UI with no existing
design system or DESIGN.md. (gstack)
- design-html: Design finalization: generates production-quality Pretext-native HTML/CSS.
Works with approved mockups from /design-shotgun, CEO plans from /plan-ceo-review,
design review context from /plan-design-review, or from scratch with a user
description. Text actually reflows, heights are computed, layouts are dynamic.
30KB overhead, zero deps. Smart API routing: picks the right Pretext patterns
for each design type. Use when: "finalize this design", "turn this into HTML",
"build me a page", "implement this design", or after any planning skill.
Proactively suggest when user has approved a design or has a plan ready. (gstack)
- design-review: Designer's eye QA: finds visual inconsistency, spacing issues, hierarchy problems,
AI slop patterns, and slow interactions — then fixes them. Iteratively fixes issues
in source code, committing each fix atomically and re-verifying with before/after
screenshots. For plan-mode design review (before implementation), use /plan-design-review.
Use when asked to "audit the design", "visual QA", "check if it looks good", or "design polish".
Proactively suggest when the user mentions visual inconsistencies or
wants to polish the look of a live site. (gstack)
- design-shotgun: Design shotgun: generate multiple AI design variants, open a comparison board,
collect structured feedback, and iterate. Standalone design exploration you can
run anytime. Use when: "explore designs", "show me options", "design variants",
"visual brainstorm", or "I don't like how this looks".
Proactively suggest when the user describes a UI feature but hasn't seen
what it could look like. (gstack)
- devex-review: Live developer experience audit. Uses the browse tool to actually TEST the
developer experience: navigates docs, tries the getting started flow, times
TTHW, screenshots error messages, evaluates CLI help text. Produces a DX
scorecard with evidence. Compares against /plan-devex-review scores if they
exist (the boomerang: plan said 3 minutes, reality says 8). Use when asked to
"test the DX", "DX audit", "developer experience test", or "try the
onboarding". Proactively suggest after shipping a developer-facing feature. (gstack)
- diagnose: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says "diagnose this" / "debug this", reports a bug, says something is broken/throwing/failing, or describes a performance regression.
- document-release: Post-ship documentation update. Reads all project docs, cross-references the
diff, updates README/ARCHITECTURE/CONTRIBUTING/CLAUDE.md to match what shipped,
polishes CHANGELOG voice, cleans up TODOS, and optionally bumps VERSION. Use when
asked to "update the docs", "sync documentation", or "post-ship docs".
Proactively suggest after a PR is merged or code is shipped. (gstack)
- find-skills: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
- freeze: Restrict file edits to a specific directory for the session. Blocks Edit and
Write outside the allowed path. Use when debugging to prevent accidentally
"fixing" unrelated code, or when you want to scope changes to one module.
Use when asked to "freeze", "restrict edits", "only edit this folder",
or "lock down edits". (gstack)
- grill-me: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
- grill-with-docs: Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise. Use when user wants to stress-test a plan against their project's language and documented decisions.
- gsd-add-tests: Generate tests for a completed phase based on UAT criteria and implementation
- gsd-ai-integration-phase: Generate an AI-SPEC.md design contract for phases that involve building AI systems.
- gsd-audit-fix: Autonomous audit-to-fix pipeline — find issues, classify, fix, test, commit
- gsd-audit-milestone: Audit milestone completion against original intent before archiving
- gsd-audit-uat: Cross-phase audit of all outstanding UAT and verification items
- gsd-autonomous: Run all remaining phases autonomously — discuss→plan→execute per phase
- gsd-capture: Capture ideas, tasks, notes, and seeds to their destination
- gsd-cleanup: Archive accumulated phase directories from completed milestones
- gsd-code-review: Review source files changed during a phase for bugs, security issues, and code quality problems
- gsd-complete-milestone: Archive completed milestone and prepare for next version
- gsd-config: Configure GSD settings — workflow toggles, advanced knobs, integrations, and model profile
- gsd-debug: Systematic debugging with persistent state across context resets
- gsd-discuss-phase: Gather phase context through adaptive questioning before planning.
- gsd-docs-update: Generate or update project documentation verified against the codebase
- gsd-eval-review: Audit an executed AI phase's evaluation coverage and produce an EVAL-REVIEW.md remediation plan.
- gsd-execute-phase: Execute all plans in a phase with wave-based parallelization
- gsd-explore: Socratic ideation and idea routing — think through ideas before committing to plans
- gsd-extract-learnings: Extract decisions, lessons, patterns, and surprises from completed phase artifacts
- gsd-fast: Execute a trivial task inline — no subagents, no planning overhead
- gsd-forensics: Post-mortem investigation for failed GSD workflows — diagnoses what went wrong.
- gsd-graphify: Build, query, and inspect the project knowledge graph in .planning/graphs/
- gsd-health: Diagnose planning directory health and optionally repair issues
- gsd-help: Show available GSD commands and usage guide
- gsd-import: Ingest external plans with conflict detection against project decisions before writing anything.
- gsd-inbox: Triage and review open GitHub issues and PRs against project templates and contribution guidelines.
- gsd-ingest-docs: Bootstrap or merge a .planning/ setup from existing ADRs, PRDs, SPECs, and docs in a repo.
- gsd-manager: Interactive command center for managing multiple phases from one terminal
- gsd-map-codebase: Analyze codebase with parallel mapper agents to produce .planning/codebase/ documents
- gsd-milestone-summary: Generate a comprehensive project summary from milestone artifacts for team onboarding and review
- gsd-mvp-phase: Plan a phase as a vertical MVP slice — user story, SPIDR splitting, then plan-phase
- gsd-new-milestone: Start a new milestone cycle — update PROJECT.md and route to requirements
- gsd-new-project: Initialize a new project with deep context gathering and PROJECT.md
- gsd-ns-context: codebase intelligence | map graphify docs learnings
- gsd-ns-ideate: exploration capture | explore sketch spike spec capture
- gsd-ns-manage: config workspace | workstreams thread update ship inbox
- gsd-ns-project: project lifecycle | milestones audits summary
- gsd-ns-review: quality gates | code review debug audit security eval ui
- gsd-ns-workflow: workflow | discuss plan execute verify phase progress
- gsd-pause-work: Create context handoff when pausing work mid-phase
- gsd-phase: CRUD for phases in ROADMAP.md — add, insert, remove, or edit phases
- gsd-plan-phase: Create detailed phase plan (PLAN.md) with verification loop
- gsd-plan-review-convergence: Cross-AI plan convergence loop — replan with review feedback until no HIGH concerns remain.
- gsd-pr-branch: Create a clean PR branch by filtering out .planning/ commits — ready for code review
- gsd-profile-user: Generate developer behavioral profile and create Claude-discoverable artifacts
- gsd-progress: Check progress, advance workflow, or dispatch freeform intent — the unified GSD situational command
- gsd-quick: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
- gsd-resume-work: Resume work from previous session with full context restoration
- gsd-review: Request cross-AI peer review of phase plans from external AI CLIs
- gsd-review-backlog: Review and promote backlog items to active milestone
- gsd-secure-phase: Retroactively verify threat mitigations for a completed phase
- gsd-settings: Configure GSD workflow toggles and model profile
- gsd-ship: Create PR, run review, and prepare for merge after verification passes
- gsd-sketch: Sketch UI/design ideas with throwaway HTML mockups, or propose what to sketch next (frontier mode)
- gsd-spec-phase: Clarify WHAT a phase delivers with ambiguity scoring; produces a SPEC.md before discuss-phase.
- gsd-spike: Spike an idea through experiential exploration, or propose what to spike next (frontier mode)
- gsd-stats: Display project statistics — phases, plans, requirements, git metrics, and timeline
- gsd-surface: Toggle which skills are surfaced — apply a profile, list, or disable a cluster without reinstall
- gsd-thread: Manage persistent context threads for cross-session work
- gsd-ui-phase: Generate UI design contract (UI-SPEC.md) for frontend phases
- gsd-ui-review: Retroactive 6-pillar visual audit of implemented frontend code
- gsd-ultraplan-phase: [BETA] Offload plan phase to Claude Code's ultraplan cloud; review in browser and import back.
- gsd-undo: Safe git revert. Roll back phase or plan commits using the phase manifest with dependency checks.
- gsd-update: Update GSD to latest version with changelog display
- gsd-validate-phase: Retroactively audit and fill Nyquist validation gaps for a completed phase
- gsd-verify-work: Validate built features through conversational UAT
- gsd-workspace: Manage GSD workspaces — create, list, or remove isolated workspace environments
- gsd-workstreams: Manage parallel workstreams — list, create, switch, status, progress, complete, and resume
- gstack: Fast headless browser for QA testing and site dogfooding. Navigate pages, interact with
elements, verify state, diff before/after, take annotated screenshots, test responsive
layouts, forms, uploads, dialogs, and capture bug evidence. Use when asked to open or
test a site, verify a deployment, dogfood a user flow, or file a bug with screenshots. (gstack)
- gstack-upgrade: Upgrade gstack to the latest version. Detects global vs vendored install,
runs the upgrade, and shows what's new. Use when asked to "upgrade gstack",
"update gstack", or "get latest version".
- guard: Full safety mode: destructive command warnings + directory-scoped edits.
Combines /careful (warns before rm -rf, DROP TABLE, force-push, etc.) with
/freeze (blocks edits outside a specified directory). Use for maximum safety
when touching prod or debugging live systems. Use when asked to "guard mode",
"full safety", "lock it down", or "maximum safety". (gstack)
- handoff: Compact the current conversation into a handoff document for another agent to pick up.
- health: Code quality dashboard. Wraps existing project tools (type checker, linter,
test runner, dead code detector, shell linter), computes a weighted composite
0-10 score, and tracks trends over time. Use when: "health check",
"code quality", "how healthy is the codebase", "run all checks",
"quality score". (gstack)
- improve-codebase-architecture: Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
- investigate: Systematic debugging with root cause investigation. Four phases: investigate,
analyze, hypothesize, implement. Iron Law: no fixes without root cause.
Use when asked to "debug this", "fix this bug", "why is this broken",
"investigate this error", or "root cause analysis".
Proactively invoke this skill (do NOT debug directly) when the user reports
errors, 500 errors, stack traces, unexpected behavior, "it was working
yesterday", or is troubleshooting why something stopped working. (gstack)
- land-and-deploy: Land and deploy workflow. Merges the PR, waits for CI and deploy,
verifies production health via canary checks. Takes over after /ship
creates the PR. Use when: "merge", "land", "deploy", "merge and verify",
"land it", "ship it to production". (gstack)
- learn: Manage project learnings. Review, search, prune, and export what gstack
has learned across sessions. Use when asked to "what have we learned",
"show learnings", "prune stale learnings", or "export learnings".
Proactively suggest when the user asks about past patterns or wonders
"didn't we fix this before?"
- mux-send: Send keystrokes to a psmux terminal session. Use when the user says "send to",
"type in", "send keys to", "mux send", or wants to send input to another terminal
session by name.
- office-hours: YC Office Hours — two modes. Startup mode: six forcing questions that expose
demand reality, status quo, desperate specificity, narrowest wedge, observation,
and future-fit. Builder mode: design thinking brainstorming for side projects,
hackathons, learning, and open source. Saves a design doc.
Use when asked to "brainstorm this", "I have an idea", "help me think through
this", "office hours", or "is this worth building".
Proactively invoke this skill (do NOT answer directly) when the user describes
a new product idea, asks whether something is worth building, wants to think
through design decisions for something that doesn't exist yet, or is exploring
a concept before any code is written.
Use before /plan-ceo-review or /plan-eng-review. (gstack)
- open-gstack-browser: Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in.
Opens a visible browser window where you can watch every action in real time.
The sidebar shows a live activity feed and chat. Anti-bot stealth built in.
Use when asked to "open gstack browser", "launch browser", "connect chrome",
"open chrome", "real browser", "launch chrome", "side panel", or "control my browser".
- pair-agent: Pair a remote AI agent with your browser. One command generates a setup key and
prints instructions the other agent can follow to connect. Works with OpenClaw,
Hermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent
gets its own tab with scoped access (read+write by default, admin on request).
Use when asked to "pair agent", "connect agent", "share browser", "remote browser",
"let another agent use my browser", or "give browser access". (gstack)
- plan-ceo-review: CEO/founder-mode plan review. Rethink the problem, find the 10-star product,
challenge premises, expand scope when it creates a better product. Four modes:
SCOPE EXPANSION (dream big), SELECTIVE EXPANSION (hold scope + cherry-pick
expansions), HOLD SCOPE (maximum rigor), SCOPE REDUCTION (strip to essentials).
Use when asked to "think bigger", "expand scope", "strategy review", "rethink this",
or "is this ambitious enough".
Proactively suggest when the user is questioning scope or ambition of a plan,
or when the plan feels like it could be thinking bigger. (gstack)
- plan-design-review: Designer's eye plan review — interactive, like CEO and Eng review.
Rates each design dimension 0-10, explains what would make it a 10,
then fixes the plan to get there. Works in plan mode. For live site
visual audits, use /design-review. Use when asked to "review the design plan"
or "design critique".
Proactively suggest when the user has a plan with UI/UX components that
should be reviewed before implementation. (gstack)
- plan-devex-review: Interactive developer experience plan review. Explores developer personas,
benchmarks against competitors, designs magical moments, and traces friction
points before scoring. Three modes: DX EXPANSION (competitive advantage),
DX POLISH (bulletproof every touchpoint), DX TRIAGE (critical gaps only).
Use when asked to "DX review", "developer experience audit", "devex review",
or "API design review".
Proactively suggest when the user has a plan for developer-facing products
(APIs, CLIs, SDKs, libraries, platforms, docs). (gstack)
- plan-eng-review: Eng manager-mode plan review. Lock in the execution plan — architecture,
data flow, diagrams, edge cases, test coverage, performance. Walks through
issues interactively with opinionated recommendations. Use when asked to
"review the architecture", "engineering review", or "lock in the plan".
Proactively suggest when the user has a plan or design doc and is about to
start coding — to catch architecture issues before implementation. (gstack)
- propose-issue: Challenge an issue statement before fixing it. Probes scope, root cause, and assumptions
through interactive questioning grounded in the codebase. Use when the user says "propose issue",
"challenge this bug", "question this fix", "is this the right problem", or wants to pressure-test
a problem statement before jumping to implementation.
- qa: Systematically QA test a web application and fix bugs found. Runs QA testing,
then iteratively fixes bugs in source code, committing each fix atomically and
re-verifying. Use when asked to "qa", "QA", "test this site", "find bugs",
"test and fix", or "fix what's broken".
Proactively suggest when the user says a feature is ready for testing
or asks "does this work?". Three tiers: Quick (critical/high only),
Standard (+ medium), Exhaustive (+ cosmetic). Produces before/after health scores,
fix evidence, and a ship-readiness summary. For report-only mode, use /qa-only. (gstack)
- qa-only: Report-only QA testing. Systematically tests a web application and produces a
structured report with health score, screenshots, and repro steps — but never
fixes anything. Use when asked to "just report bugs", "qa report only", or
"test but don't fix". For the full test-fix-verify loop, use /qa instead.
Proactively suggest when the user wants a bug report without any code changes. (gstack)
- retro: Weekly engineering retrospective. Analyzes commit history, work patterns,
and code quality metrics with persistent history and trend tracking.
Team-aware: breaks down per-person contributions with praise and growth areas.
Use when asked to "weekly retro", "what did we ship", or "engineering retrospective".
Proactively suggest at the end of a work week or sprint. (gstack)
- review: Pre-landing PR review. Analyzes diff against the base branch for SQL safety, LLM trust
boundary violations, conditional side effects, and other structural issues. Use when
asked to "review this PR", "code review", "pre-landing review", or "check my diff".
Proactively suggest when the user is about to merge or land code changes. (gstack)
- screenshot-capture: Capture, process, and analyze screenshots of any running application on Windows 10/11. Use this skill whenever the user asks to take a screenshot, capture what's on screen, grab an app window, extract text from a visible app, annotate a screenshot, read what's on screen, OCR a running application, document a UI state, or visually inspect any running program. Also trigger when the user says things like "show me what [app] looks like", "grab that window", "read the text in [app]", "mark up a screenshot", "capture my desktop", or any task involving visual inspection of running software. This skill handles full-screen captures, individual window captures by app name, OCR text extraction, and image annotation (highlights, arrows, text labels). Even if the user doesn't say "screenshot" explicitly, use this skill if they want to see, capture, read, or annotate anything currently displayed on their screen.
- setup-browser-cookies: Import cookies from your real Chromium browser into the headless browse session.
Opens an interactive picker UI where you select which cookie domains to import.
Use before QA testing authenticated pages. Use when asked to "import cookies",
"login to the site", or "authenticate the browser". (gstack)
- setup-deploy: Configure deployment settings for /land-and-deploy. Detects your deploy
platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),
production URL, health check endpoints, and deploy status commands. Writes
the configuration to CLAUDE.md so all future deploys are automatic.
Use when: "setup deploy", "configure deployment", "set up land-and-deploy",
"how do I deploy with gstack", "add deploy config".
- ship: Ship workflow: detect + merge base branch, run tests, review diff, bump VERSION,
update CHANGELOG, commit, push, create PR. Use when asked to "ship", "deploy",
"push to main", "create a PR", "merge and push", or "get it deployed".
Proactively invoke this skill (do NOT push/PR directly) when the user says code
is ready, asks about deploying, wants to push code up, or asks to create a PR. (gstack)
- to-prd: Turn the current conversation context into a PRD and publish it to the project issue tracker. Use when user wants to create a PRD from the current context.
- trace: Find old conversations in Claude Code session history. Use when the user says
"find the conversation where", "when did we discuss", "trace back to", or wants
to locate a past session by topic, command, commit, or keyword.
- traceable-reqs: traceable-reqs
- unfreeze: Clear the freeze boundary set by /freeze, allowing edits to all directories
again. Use when you want to widen edit scope without ending the session.
Use when asked to "unfreeze", "unlock edits", "remove freeze", or
"allow all edits". (gstack)
- win-marketplace-add: Add a plugin marketplace on Windows, bypassing the EBUSY rename bug. Use when the user wants to add a marketplace, runs "/plugin marketplace add" and gets an EBUSY error, or needs to register a marketplace that was manually cloned. Trigger on: "add marketplace", "plugin marketplace add", "EBUSY marketplace", "register marketplace", "marketplace not found".
- write-a-skill: Create new agent skills with proper structure, progressive disclosure, and bundled resources. Use when user wants to create, write, or build a new skill.
- ccs: Delegate task with intelligent profile selection [AUTO ENHANCE]
- ccs:continue: Continue last CCS delegation session [AUTO ENHANCE]
- deep-research: Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. - When the user wants a deep, multi-source, fact-checked research report on any topic. BEFORE invoking, check if the question is specific enough to research directly — if underspecified (e.g., "what car to buy" without budget/use-case/region), ask 2-3 clarifying questions to narrow scope. Then pass the refined question as args, weaving the answers in.
- frontend-design:frontend-design: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
- spt:clear-psyche: Clear stored Psyche context. Use when the user says "clear psyche",
"reset psyche context", or wants to wipe a Psyche's saved state.
- spt:commune: Send a communal update to your Psyche. Use when the user says "commune",
"update psyche", or wants to sync context with their Psyche companion.
- spt:force-stop: Force-stop an SPT agent -- ready agent or live agent (with its
Psyche). Use when the user says "stop listening", "stop owl", "kill live
agent", "force stop", "tear down perch", or "immediately terminate".
Session-aware: a live session (or a target with `live:true` in info.json)
routes through `$LIVE stop` (3-step kill including Psyche teardown); a
ready agent routes through `$OWL stop`.
- spt:list-agents: Unified listing for SPT agents -- ready agents, live agents, and Psyche
processes. Use when the user says "list agents", "who's live", "who's
listening", "show psyches", "show active listeners", or wants a roster of
active perches. Session-aware: defaults to live agents in a live session,
ready agents otherwise. Pass `--psyches` to list Psyche processes
instead.
- spt:live: Run a live agent session. For past sessions, restores a summarized context.

EXPLICIT START phrases (route to /spt:live <id>):
- "live as"
- "start live"
- "go live"
- "start a live agent"

AUTO-RESUME phrases (route to /spt:live --auto, resumes most-recently-active live agent):
- continue live work
- resume live work
- continue live agent
- resume live agent
- live agent continue
- live agent resume
- live work continue
- live work resume

Does NOT route here (too ambiguous — require BOTH "live" AND ("agent" or "work")):
- "keep going"
- "resume work"
- "continue" (bare)
- spt:new-alarm: Schedule a one-shot timed alarm delivered as TIMED PULSE. Use when the user
says "remind me", "check back in", "set an alarm", "wake me when", or wants a
delayed notification.
- spt:psyche-sync-setup: Enable cross-machine Psyche context sync via a private GitHub repo
(spt-agent-storage). Drives install + auth checks for the `gh` CLI,
creates the repo via `gh repo create --private`, wires it as the
`origin` remote for every existing agent/project worktree, and
seeds the remote with `git push --all`. Idempotent — running again
when already enabled reports current status.

Use when the user says "enable cross-machine sync", "set up psyche
sync", "back up my agent context to GitHub", or runs the skill
directly via /spt:psyche-sync-setup.
- spt:ready: Enable inter-agent messaging for the current session.
Use when the user says "listen as", "ready as", or wants to receive inter-agent messages.
- spt:revive: Restart a live agent with new generation. Use when the user says "revive",
"restart live agent", or wants to refresh a live agent's session.
- spt:send: Send a message to another SPT agent. Use when the user says "send to",
"message", "tell <agent>", or wants to communicate with another agent.
- spt:signoff: Graceful live agent shutdown with final context summary. Use when the user
says "sign off", "graceful stop", or wants to cleanly end a live session.
- spt:whoami: Check which owl agent belongs to the current session. Use when the user asks
"which agent am I?", "what's my owl name?", or when you need to discover your
own perch identity.
- caveman:caveman: Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.
- caveman:caveman-commit: Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when "why" isn't obvious. Use when user says "write a commit", "commit message", "generate commit", "/commit", or invokes /caveman-commit. Auto-triggers when staging changes.
- caveman:caveman-help: Quick-reference card for all caveman modes, skills, and commands. One-shot display, not a persistent mode. Trigger: /caveman-help, "caveman help", "what caveman commands", "how do I use caveman".
- caveman:caveman-review: Ultra-compressed code review comments. Cuts noise from PR feedback while preserving the actionable signal. Each comment is one line: location, problem, fix. Use when user says "review this PR", "code review", "review the diff", "/review", or invokes /caveman-review. Auto-triggers when reviewing pull requests.
- caveman:compress: Compress natural language memory files (CLAUDE.md, todos, preferences) into caveman format to save input tokens. Preserves all technical substance, code, URLs, and structure. Compressed version overwrites the original file. Human-readable backup saved as FILE.original.md. Trigger: /caveman:compress <filepath> or "compress memory file"
- everything:search: Instantly search files and folders on Windows via voidtools Everything 1.5a HTTP JSON API. Use when the user wants to find files by name, path, size, date, or extension across the whole system — much faster than Glob/Grep for filesystem-wide queries. Triggers on "find file", "where is", "locate", "search my drive", "find all .ext files", "everything search".
- sptc:commune: Push a context update to your Psyche so it can brief your resume across a reset. Use when the
user says "commune" or "update psyche", or — as a live agent — after a significant body of work,
before a /clear or /compact.
- sptc:force-stop: Force-stop an SPT agent — a ready agent, or a live agent and its Psyche. Use when the user
says "stop listening", "kill live agent", "force stop", or "tear down perch". Session-aware: a
live target tears its Psyche down too.
- sptc:list-agents: List SPT agents and endpoints reachable from this node. Use when the user says "list agents",
"who's live", "who's listening", or wants a roster of active perches.
- sptc:live: Run a live agent session. For past sessions, restores a summarized context.

EXPLICIT START phrases (route to /sptc:live <id>):
- "live as"
- "start live"
- "go live"
- "start a live agent"

AUTO-RESUME phrases (route to /sptc:live --auto, resumes most-recently-active live agent):
- continue live work
- resume live work
- continue live agent
- resume live agent
- live agent continue
- live agent resume
- live work continue
- live work resume

Does NOT route here (too ambiguous — require BOTH "live" AND ("agent" or "work")):
- "keep going"
- "resume work"
- "continue" (bare)
- sptc:ready: Make this Claude Code session reachable for inter-agent messages (register a perch and
listen). Use when the user says "listen as", "ready as", or wants to receive messages from
other agents.
- sptc:send: Send a message to another SPT agent. Use when the user says "send to", "message",
"tell <agent>", or when you need to reach or reply to another agent yourself.
- sptc:setup: Install or repair spt-core AND activate the claude-spt adapter for this Claude Code session
(mid-session installer + post-install activation).
- sptc:signoff: Gracefully shut down your live session, saving a final context summary. Use when the user says
"sign off" or "graceful stop", or when you (a live agent) are done and want to go offline cleanly.
- sptc:subnet: Manage subnet membership — create a subnet, show a pairing code to invite a machine, or join
an existing one. Use when the user wants to pair machines, set up a subnet, or reach agents
across machines. Cross-machine /sptc:send and live agents depend on it.
- sptc:version: Report the spt-core-tracked adapter version (the version-of-truth, not the marketplace plugin
version). Use when the user asks the spt or adapter version, or runs /sptc:version.
- update-config: Use this skill to configure the Claude Code harness via settings.json. Automated behaviors ("from now on when X", "each time X", "whenever X", "before/after X") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions ("allow X", "add permission", "move permission to"), env vars ("set X=Y"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: "allow npm commands", "add bq permission to global settings", "move permission to user settings", "set DEBUG=true", "when claude stops show X". For simple settings like theme/model, suggest the /config command.
- keybindings-help: Use when the user wants to customize keyboard shortcuts, rebind keys, add chord bindings, or modify ~/.claude/keybindings.json. Examples: "rebind ctrl+s", "add a chord shortcut", "change the submit key", "customize keybindings".
- verify: Verify that a code change actually does what it's supposed to by running the app and observing behavior. Use when asked to verify a PR, confirm a fix works, test a change manually, check that a feature works, or validate local changes before pushing.
- code-review: Review the current diff for correctness bugs and reuse/simplification/efficiency cleanups at the given effort level (low/medium: fewer, high-confidence findings; high→max: broader coverage, may include uncertain findings; ultra: deep multi-agent review in the cloud). Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review.
- simplify: Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.
- fewer-permission-prompts: Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.
- loop: Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace. - When the user wants to set up a recurring task, poll for status, or run something repeatedly on an interval (e.g. "check the deploy every 5 minutes", "keep running /babysit-prs"). Do NOT invoke for one-off tasks.
- schedule: Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule. - When the user wants to schedule a recurring cloud agent, set up automated tasks, create a cron job for Claude Code, or manage their scheduled agents/routines. Also use when the user wants a one-time scheduled run ("run this once at 3pm", "remind me to check X tomorrow").
- claude-api: Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.
TRIGGER — read BEFORE opening the target file; don't skip because it "looks like a one-liner" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).
SKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).
- run: Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).
- init: Initialize a new CLAUDE.md file with codebase documentation
- review: Review a pull request
- security-review: Complete a security review of the pending changes on the current branch

autoplan benchmark browse canary careful caveman ccs-delegation checkpoint codex connect-chrome cso design-consultation design-html design-review design-shotgun devex-review diagnose document-release find-skills freeze grill-me grill-with-docs gsd-add-tests gsd-ai-integration-phase gsd-audit-fix gsd-audit-milestone gsd-audit-uat gsd-autonomous gsd-capture gsd-cleanup gsd-code-review gsd-complete-milestone gsd-config gsd-debug gsd-discuss-phase gsd-docs-update gsd-eval-review gsd-execute-phase gsd-explore gsd-extract-learnings gsd-fast gsd-forensics gsd-graphify gsd-health gsd-help gsd-import gsd-inbox gsd-ingest-docs gsd-manager gsd-map-codebase gsd-milestone-summary gsd-mvp-phase gsd-new-milestone gsd-new-project gsd-ns-context gsd-ns-ideate gsd-ns-manage gsd-ns-project gsd-ns-review gsd-ns-workflow gsd-pause-work gsd-phase gsd-plan-phase gsd-plan-review-convergence gsd-pr-branch gsd-profile-user gsd-progress gsd-quick gsd-resume-work gsd-review gsd-review-backlog gsd-secure-phase gsd-settings gsd-ship gsd-sketch gsd-spec-phase gsd-spike gsd-stats gsd-surface gsd-thread gsd-ui-phase gsd-ui-review gsd-ultraplan-phase gsd-undo gsd-update gsd-validate-phase gsd-verify-work gsd-workspace gsd-workstreams gstack gstack-upgrade guard handoff health improve-codebase-architecture investigate land-and-deploy learn mux-send office-hours open-gstack-browser pair-agent plan-ceo-review plan-design-review plan-devex-review plan-eng-review propose-issue qa qa-only retro review screenshot-capture setup-browser-cookies setup-deploy ship to-prd trace traceable-reqs unfreeze win-marketplace-add write-a-skill ccs ccs:continue deep-research frontend-design:frontend-design spt:clear-psyche spt:commune spt:force-stop spt:list-agents spt:live spt:new-alarm spt:psyche-sync-setup spt:ready spt:revive spt:send spt:signoff spt:whoami caveman:caveman caveman:caveman-commit caveman:caveman-help caveman:caveman-review caveman:compress everything:search sptc:commune sptc:force-stop sptc:list-agents sptc:live sptc:ready sptc:send sptc:setup sptc:signoff sptc:subnet sptc:version update-config keybindings-help verify code-review simplify fewer-permission-prompts loop schedule claude-api run init review security-review


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


tried to update using spt, but it failed. is the update command not set up properly? check the docs. excerpt: PS C:\Users\decid\Documents\projects> spt adapter update claude-spt ADAPTER_UPDATE:claude-…


The update failed because the `[update]` avenue fetches the **default asset name `adapter.spt`**, but I published **per-OS names** (`adapter-windows-x86_64.spt` / `adapter-linux-x86_64.spt`) — so the fetch 404s. Real mismatch. Investigating the manifest `[update]` config + the docs on update-asset naming before fixing.


15	#   * [session.<role>] for psyche_init/psyche_resume/echo_commune/signoff/notif — the live-agent /
16	#     Psyche layer (owl/$LIVE), absent from the core `spt` surface. Open scope question (does
17	#     claude-spt reach the Psyche layer?). [session.self] IS authored below (the endpoint-run/bind
18	#     bringup that hosts a fresh CC session — the M12 `cc` launcher target).
19	#   * [history]                     — transcript-access seam. Lands with [digest]'s sibling fetcher.
20	#   * [update]                      — NOW DECLARED below via the `gh_release` avenue (spt v0.8.0):
21	#     spt-core's `--release` machinery auto-updates the adapter from THIS repo's GitHub releases on
22	#     `spt adapter update`, with NO Ed25519 signing infra (closes the F-005 parked `file_pull`/
23	#     `delegated` legs). Per-OS interaction flagged to doyle (gh_release `asset` is a single name; how
24	#     does auto-update pick the host's `adapter-<os>-<arch>.spt`?).
25	#
26	# [impl->REQ-DIST-MANIFEST-SCHEMA]
27
28	[adapter]
29	name = "claude-spt"
30	kind = "harness"
31	version = "0.5.0"
32	# Floor BUMPED to 0.9.0 (2026-06-17, PREP-4): the legacy-parity bringup requires spt-core's
33	# adapter-agnostic seed + bind-time resolution by [adapter] host_binaries (shipped v0.9.0).
34	# On <0.9.0 `api seed`/`listen` still mandate --adapter, so the bare flow this manifest now wires
35	# would break — the compat gate refuses the adapter on older spt-core rather than misbehave.
36	min_spt_core_version = "0.9.0"
37	hostable_types = ["LiveAgent", "ReadyAgent", "Worker"]
38	# host_binaries — STAGED ahead of spt-core v0.9.0 (doyle 2026-06-16). The pid→binary match-key for
39	# adapter-agnostic resolution: `spt api listen <id>` resolves the owning adapter/profile by walking
40	# parent pid → exe basename → host_binaries match → active-profile pointer → registered_at_ms
41	# fallback (CONTEXT §170-186). Additive + N-1-safe: harmless before spt-core reads it (the
42	# vendored v0.7.0 schema's [adapter] allows additional props), live once v0.9.0 + `spt adapter use`
43	# land. Claude Code's host process basename is `claude`. [impl->REQ-SKILL-LIVE]
44	host_binaries = ["claude"]
45	# Brands the `spt endpoint run` picker shortcut as `cc-<id>` (default would be `spt-<id>`) — this is
46	# the M12 `cc` launcher, and matches the schema's own example (spt-claude-code → `cc`). The launcher
47	# brand is DECOUPLED from the plugin name (`sptc`, skills `/sptc:*`): the s/sptc/spt/ succession seam
48	# (ADR-0001) renames the plugin, not this shortcut. Guarded by tests/manifest-shortcut.sh
49	# (unit->REQ-DIST-SHORTCUT-BASENAME).
50	shortcut_basename = "cc"
51
52	# ── [update] ───────────────────────────────────────────────────────────────────────────────────
53	# Adapter self-update via OUR GitHub releases (gh_release avenue, spt v0.8.0). `spt adapter update`
54	# pulls the adapter `.spt` asset from this repo's releases through the same `--release` machinery —
55	# no signing infra (closes the F-005 file_pull/delegated blockers). `asset` omitted ⇒ spt's default
56	# (adapter.spt); the per-OS auto-update asset selection (REQ-DIST-ADAPTER-PEROS) is a flagged
57	# question to doyle, so we do not pin a single-OS asset here. [impl->REQ-DIST-ADAPTER-RELEASE]
58	[update]
59	avenue = "gh_release"
60	repo = "SaberMage/spt-claude-code"
61
62	# ── [hooks.<event>] ──────────────────────────────────────────────────────────────────────────
63	# CC hook event → the opaque `api …` command it fires. These mirror the hand-written plugin
64	# hooks.json (plugin/sptc/hooks/hooks.json) one-for-one; the plugin shells `spt api`, this table
65	# is the registry-side declaration (ADR-0002, F-001 resolution). `reads` = the CC hook-stdin
66	# fields we map; `can_inject` = whether the event can surface additionalContext back to the agent.
67
68	[hooks.SessionStart]
69	# Seed the endpoint — ADAPTER-AGNOSTIC since spt-core v0.9.0 (PREP-4): NO --adapter. The owning
70	# adapter resolves at bind time from this seed's {parent_pid} via [adapter] host_binaries (the
71	# legacy-parity bare flow). {parent_pid} is a spt-filled key; session_id is a CC stdin field. NOT the
72	# blocking poll/listen loop — that is /sptc:ready|live, never SessionStart. (Mirrors the hand-written
73	# plugin hook session-start.sh, whose bind/boundary branches keep an explicit --adapter override.)
74	fires = "api seed --session-id {session_id} --pid {parent_pid}"
75	reads = ["session_id", "parent_pid"]
76	can_inject = true

#   * [session.<role>] for psyche_init/psyche_resume/echo_commune/signoff/notif — the live-agent /
#     Psyche layer (owl/$LIVE), absent from the core `spt` surface. Open scope question (does
#     claude-spt reach the Psyche layer?). [session.self] IS authored below (the endpoint-run/bind
#     bringup that hosts a fresh CC session — the M12 `cc` launcher target).
#   * [history]                     — transcript-access seam. Lands with [digest]'s sibling fetcher.
#   * [update]                      — NOW DECLARED below via the `gh_release` avenue (spt v0.8.0):
#     spt-core's `--release` machinery auto-updates the adapter from THIS repo's GitHub releases on
#     `spt adapter update`, with NO Ed25519 signing infra (closes the F-005 parked `file_pull`/
#     `delegated` legs). Per-OS interaction flagged to doyle (gh_release `asset` is a single name; how
#     does auto-update pick the host's `adapter-<os>-<arch>.spt`?).
#
# [impl->REQ-DIST-MANIFEST-SCHEMA]

[adapter]
name = "claude-spt"
kind = "harness"
version = "0.5.0"
# Floor BUMPED to 0.9.0 (2026-06-17, PREP-4): the legacy-parity bringup requires spt-core's
# adapter-agnostic seed + bind-time resolution by [adapter] host_binaries (shipped v0.9.0).
# On <0.9.0 `api seed`/`listen` still mandate --adapter, so the bare flow this manifest now wires
# would break — the compat gate refuses the adapter on older spt-core rather than misbehave.
min_spt_core_version = "0.9.0"
hostable_types = ["LiveAgent", "ReadyAgent", "Worker"]
# host_binaries — STAGED ahead of spt-core v0.9.0 (doyle 2026-06-16). The pid→binary match-key for
# adapter-agnostic resolution: `spt api listen <id>` resolves the owning adapter/profile by walking
# parent pid → exe basename → host_binaries match → active-profile pointer → registered_at_ms
# fallback (CONTEXT §170-186). Additive + N-1-safe: harmless before spt-core reads it (the
# vendored v0.7.0 schema's [adapter] allows additional props), live once v0.9.0 + `spt adapter use`
# land. Claude Code's host process basename is `claude`. [impl->REQ-SKILL-LIVE]
host_binaries = ["claude"]
# Brands the `spt endpoint run` picker shortcut as `cc-<id>` (default would be `spt-<id>`) — this is
# the M12 `cc` launcher, and matches the schema's own example (spt-claude-code → `cc`). The launcher
# brand is DECOUPLED from the plugin name (`sptc`, skills `/sptc:*`): the s/sptc/spt/ succession seam
# (ADR-0001) renames the plugin, not this shortcut. Guarded by tests/manifest-shortcut.sh
# (unit->REQ-DIST-SHORTCUT-BASENAME).
shortcut_basename = "cc"

# ── [update] ───────────────────────────────────────────────────────────────────────────────────
# Adapter self-update via OUR GitHub releases (gh_release avenue, spt v0.8.0). `spt adapter update`
# pulls the adapter `.spt` asset from this repo's releases through the same `--release` machinery —
# no signing infra (closes the F-005 file_pull/delegated blockers). `asset` omitted ⇒ spt's default
# (adapter.spt); the per-OS auto-update asset selection (REQ-DIST-ADAPTER-PEROS) is a flagged
# question to doyle, so we do not pin a single-OS asset here. [impl->REQ-DIST-ADAPTER-RELEASE]
[update]
avenue = "gh_release"
repo = "SaberMage/spt-claude-code"

# ── [hooks.<event>] ──────────────────────────────────────────────────────────────────────────
# CC hook event → the opaque `api …` command it fires. These mirror the hand-written plugin
# hooks.json (plugin/sptc/hooks/hooks.json) one-for-one; the plugin shells `spt api`, this table
# is the registry-side declaration (ADR-0002, F-001 resolution). `reads` = the CC hook-stdin
# fields we map; `can_inject` = whether the event can surface additionalContext back to the agent.

[hooks.SessionStart]
# Seed the endpoint — ADAPTER-AGNOSTIC since spt-core v0.9.0 (PREP-4): NO --adapter. The owning
# adapter resolves at bind time from this seed's {parent_pid} via [adapter] host_binaries (the
# legacy-parity bare flow). {parent_pid} is a spt-filled key; session_id is a CC stdin field. NOT the
# blocking poll/listen loop — that is /sptc:ready|live, never SessionStart. (Mirrors the hand-written
# plugin hook session-start.sh, whose bind/boundary branches keep an explicit --adapter override.)
fires = "api seed --session-id {session_id} --pid {parent_pid}"
reads = ["session_id", "parent_pid"]
can_inject = true


This is a **pre-flagged gap**, not a setup mistake. The manifest `[update]` (lines 23-24, 55-57) explicitly notes it: the `gh_release` avenue fetches a single `asset` (default `adapter.spt`), but the runbook publishes **per-OS** assets — and "how auto-update picks the host's `adapter-<os>-<arch>.spt`" was already flagged to doyle as unresolved. The 404 is that gap going live: update wants `adapter.spt`, which we deliberately didn't publish.

Checking whether spt-core's update avenue supports a per-OS asset placeholder (a clean fix) before I act.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== spt adapter update --help =="; spt adapter update --help 2>&1 | head -30
echo; echo "== docs: update asset / placeholder / per-os =="
grep -rniE 'adapter\.spt|\{os\}|\{arch\}|asset.*=|per-os|gh_release' docs/ docs-site/src/ 2>/dev/null | grep -iE 'update|asset|os|arch|release' | head -15

Probe update avenue asset/placeholder support + docs


== spt adapter update --help ==
Update registered adapters that ship from their own GitHub releases: compare each `[update] avenue =
"gh_release"` adapter's latest release version against the installed one and, when newer, fetch the
release archive, verify it against the declared signing key if any (else trusting HTTPS + GitHub),
and re-register. With no name, sweeps every gh_release adapter; with a name, updates just that one

Usage: spt.exe adapter update [NAME]

Arguments:
  [NAME]  A single registered adapter to update (all gh_release adapters if omitted)

Options:
  -h, --help  Print help

== docs: update asset / placeholder / per-os ==
docs/adr/0002-hook-wiring-hand-written-hooks-json-shells-spt-api.md:120:  packaging on Windows (no per-OS branch needed for the hook to run).
docs/RELEASE-RUNBOOK.md:128:## adapter manifest publish — the `adapter.spt` release asset
docs/RELEASE-RUNBOOK.md:131:The CC adapter manifest (publish target #2) ships to end users as an **`adapter.spt`** GitHub
docs/RELEASE-RUNBOOK.md:141:- **Publish:** attach every per-OS `adapter-<os>-<arch>.spt` to the SAME GitHub release on
docs/RELEASE-RUNBOOK.md:146:- **Per-OS (REQ-DIST-ADAPTER-PEROS) — the asset carries native binaries, so it is platform-specific.**
docs/RELEASE-RUNBOOK.md:148:  `adapter.spt`) — it does NOT auto-pick per-OS, so we name + select. Naming: `adapter-<os>-<arch>.spt`
docs/RELEASE-RUNBOOK.md:150:  `SPTC_OS` / `SPTC_ARCH` (+ `SPTC_TARGET` = the cargo target triple for a cross build). Per-OS publish:
docs/RELEASE-RUNBOOK.md:175:    carries those per-OS assets — never before. Sequence: cut the per-OS-asset release FIRST, then
docs/SPT-CORE-FINDINGS.md:436:published **`adapter.spt`** release asset (a tar whose **root** holds `manifest.toml` + `strings/` +
docs/SPT-CORE-FINDINGS.md:449:the `adapter.spt` release-asset packer (`SETUP-SLICE-PLAN.md` Wave C′) + OQ2 (binary resolution: bare
docs/SPT-CORE-FINDINGS.md:463:SaberMage/spt-claude-code --tag v0.1.0` → fetched `adapter.spt` from the release →
docs/SPT-CORE-FINDINGS.md:640:- **`[update]` gh_release ✓ (declared)** — `adapter/claude-spt.toml` now declares `[update] avenue =
docs/SPT-CORE-FINDINGS.md:641:  "gh_release", repo = "SaberMage/spt-claude-code"`; validates against the re-vendored v0.8.0
docs/SPT-CORE-FINDINGS.md:642:  `manifest.schema.json`. Live `spt adapter update` test rides the per-OS re-release (the registered
docs/SPT-CORE-FINDINGS.md:723:- **(b) adapter ships a wrapper launcher** — `command = "claude-spt-launch {id}"`, a tiny per-OS shim


No `--asset` override, no per-OS placeholder — spt-core's `gh_release` update fetches a single fixed asset (default `adapter.spt`). Gap confirmed. Reading the existing finding entry (SPT-CORE-FINDINGS ~640) to extend rather than duplicate.


636
637	- **REQ-API-4 ✓** — `spt api --adapter claude-spt:live <verb>` (capability, listen) resolves the
638	  registered manifest + install-dir WITHOUT `--manifest`. The require-both-flags wart is gone.
639	- **F-007 ✓ (shipped)** — `spt how-to live` is a full topic; `/sptc:live` step 2 re-pointed at it.
640	- **`[update]` gh_release ✓ (declared)** — `adapter/claude-spt.toml` now declares `[update] avenue =
641	  "gh_release", repo = "SaberMage/spt-claude-code"`; validates against the re-vendored v0.8.0
642	  `manifest.schema.json`. Live `spt adapter update` test rides the per-OS re-release (the registered
643	  adapter is still the published v0.1.0 sans `[update]`).
644	- **Relay leg ✓** — `ci/psyche/live-relay-int.sh` green on 0.8.0: BOUND/READY + a probe relayed as the
645	  escaped `<EVENT>` off the listen child + live_agent kind. No `--manifest` needed.
646
647	- **RESOLVED (v0.8.1 dogfood, 2026-06-16) — daemon-hosted psyche-spawn.** Two layered bugs, not the
648	  net-race we first suspected. (1) spt-core v0.8.0 livehost did not reconcile/host at all (doyle's
649	  v0.8.1 fix addressed this — the daemon now reaches the spawn). (2) The spawn then SILENTLY failed:
650	  the daemon spawned `claude-spt-psyche` but it exited instantly (phantom pid, `status=online`, no
651	  `psyche_host_error`). Root cause = **F-009** (spt-core whitespace-splits the substituted
652	  `{psyche_prompt}`, so the runner's non-greedy `--prompt` rejected the 2nd word and exited 2).
653	  **Confirmed via argv-capture instrumentation:** the daemon passed `--prompt PSYCHE REVIVAL time:
654	  epoch-ms:… incoming event: (none)` as 7 separate argv tokens. Fixed adapter-side (greedy `--prompt`,
655	  commit ddf1965); the Psyche now stays resident, `ci/psyche/live-relay-int.sh` psyche leg flips
656	  skip→ASSERT green, and **REQ-INSTALL-11 / F-006** is proven in the same run. The "peer pump STALLED"
657	  correlate recurs ~7-8 min after every daemon start but did NOT block hosting (a Psyche hosted fine
658	  with the pump stalled) — flagged to doyle as **F-010**-adjacent, separate from the host path.
659
660	---
661
662	## F-013 — `spt endpoint run` does not substitute `[env.<VAR>].value = "{id}"` (the spt-hosted bind-path never gets its endpoint id)
663
664	**Surfaced:** 2026-06-17, root-causing the operator's wall-b zero-perch (`spt endpoint run claude-spt
665	wall-b` → CC PTY came up but `spt send wall-b` → `NO_PERCH` and **zero perch on disk**). This is the
666	M12 cc-launcher path — impl+UNIT only, **never int-proven E2E** — and wall-b was its first real
667	exercise. (Build orientation: `CC-LAUNCHER-BIND-PLAN.md`.)
668
669	**How the adapter intends the spt-hosted bind path to work.** `endpoint run` spawns
670	`[session.self].command = "claude"` (bare — CC has no CLI flag for an externally-chosen id; it mints
671	its own session id post-spawn). To tell the spawned CC *which* endpoint it is, the manifest declares:
672
673	```toml
674	[session.self]
675	command = "claude"

- **REQ-API-4 ✓** — `spt api --adapter claude-spt:live <verb>` (capability, listen) resolves the
  registered manifest + install-dir WITHOUT `--manifest`. The require-both-flags wart is gone.
- **F-007 ✓ (shipped)** — `spt how-to live` is a full topic; `/sptc:live` step 2 re-pointed at it.
- **`[update]` gh_release ✓ (declared)** — `adapter/claude-spt.toml` now declares `[update] avenue =
  "gh_release", repo = "SaberMage/spt-claude-code"`; validates against the re-vendored v0.8.0
  `manifest.schema.json`. Live `spt adapter update` test rides the per-OS re-release (the registered
  adapter is still the published v0.1.0 sans `[update]`).
- **Relay leg ✓** — `ci/psyche/live-relay-int.sh` green on 0.8.0: BOUND/READY + a probe relayed as the
  escaped `<EVENT>` off the listen child + live_agent kind. No `--manifest` needed.

- **RESOLVED (v0.8.1 dogfood, 2026-06-16) — daemon-hosted psyche-spawn.** Two layered bugs, not the
  net-race we first suspected. (1) spt-core v0.8.0 livehost did not reconcile/host at all (doyle's
  v0.8.1 fix addressed this — the daemon now reaches the spawn). (2) The spawn then SILENTLY failed:
  the daemon spawned `claude-spt-psyche` but it exited instantly (phantom pid, `status=online`, no
  `psyche_host_error`). Root cause = **F-009** (spt-core whitespace-splits the substituted
  `{psyche_prompt}`, so the runner's non-greedy `--prompt` rejected the 2nd word and exited 2).
  **Confirmed via argv-capture instrumentation:** the daemon passed `--prompt PSYCHE REVIVAL time:
  epoch-ms:… incoming event: (none)` as 7 separate argv tokens. Fixed adapter-side (greedy `--prompt`,
  commit ddf1965); the Psyche now stays resident, `ci/psyche/live-relay-int.sh` psyche leg flips
  skip→ASSERT green, and **REQ-INSTALL-11 / F-006** is proven in the same run. The "peer pump STALLED"
  correlate recurs ~7-8 min after every daemon start but did NOT block hosting (a Psyche hosted fine
  with the pump stalled) — flagged to doyle as **F-010**-adjacent, separate from the host path.

---

## F-013 — `spt endpoint run` does not substitute `[env.<VAR>].value = "{id}"` (the spt-hosted bind-path never gets its endpoint id)

**Surfaced:** 2026-06-17, root-causing the operator's wall-b zero-perch (`spt endpoint run claude-spt
wall-b` → CC PTY came up but `spt send wall-b` → `NO_PERCH` and **zero perch on disk**). This is the
M12 cc-launcher path — impl+UNIT only, **never int-proven E2E** — and wall-b was its first real
exercise. (Build orientation: `CC-LAUNCHER-BIND-PLAN.md`.)

**How the adapter intends the spt-hosted bind path to work.** `endpoint run` spawns
`[session.self].command = "claude"` (bare — CC has no CLI flag for an externally-chosen id; it mints
its own session id post-spawn). To tell the spawned CC *which* endpoint it is, the manifest declares:

```toml
[session.self]
command = "claude"


Confirmed: this v0.5.0 release is the **first live exercise** of the `gh_release` update avenue (per SPT-CORE-FINDINGS:640 — prior registered adapter was v0.1.0 sans `[update]`), and it surfaced the flagged per-OS gap. No `--asset`/placeholder support exists, so the avenue can only fetch the fixed default `adapter.spt`.

**Immediate unblock:** publish an `adapter.spt` (= the windows build, your active OS) to the v0.5.0 release so your existing `spt adapter update` resolves. The fleet here is windows (HFENDULEAM), so this is safe; linux stays on the per-OS `--release --asset` acquisition path.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
cp dist/adapter-windows-x86_64.spt dist/adapter.spt
echo "== upload default adapter.spt (= windows build) to v0.5.0 =="
gh release upload v0.5.0 dist/adapter.spt --repo SaberMage/spt-claude-code 2>&1 | tail -3
echo "== release assets now =="
gh release view v0.5.0 --repo SaberMage/spt-claude-code --json assets --jq '.assets[].name' 2>&1

Upload default adapter.spt to unblock the update avenue


== upload default adapter.spt (= windows build) to v0.5.0 ==
== release assets now ==
adapter-linux-x86_64.spt
adapter-windows-x86_64.spt
adapter.spt


`adapter.spt` uploaded (release now has all 3). Verifying the fix — running `spt adapter update claude-spt` (safe: my perri session is under legacy owl, not this adapter; this is the command you ran).


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== spt adapter update claude-spt =="; spt adapter update claude-spt 2>&1 | tail -6
echo "== verify version + briefs resolve on live adapter =="
spt adapter list 2>&1 | grep -i 'claude-spt' | head -2
spt adapter get-string claude-spt briefs.identity 2>&1 | head -1

Run update, verify 0.5.0 + briefs resolve on live adapter


== spt adapter update claude-spt ==
ADAPTER_UPDATE:claude-spt: 0.4.0 -> 0.5.0 (fetching adapter.spt from SaberMage/spt-claude-code)
ADAPTER_UPDATE_UNSIGNED:claude-spt: no signing_key — trusting HTTPS + GitHub
ADAPTER_UPDATE_FAIL:claude-spt: extract: tar exit Some(1)
== verify version + briefs resolve on live adapter ==
claude-spt: Harness Pointer active (from C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code)
  claude-spt:ccs (shipped)
You are spt agent "{id}". This Claude Code session already owns a live perch — you are reachable right now.


Fetch works now, but a **second** error: `extract: tar exit Some(1)`. Yet `briefs.identity` resolves — so `strings/` landed but tar failed (likely on the binaries). Diagnosing the tar failure by extracting the archive myself.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
tmp=$(mktemp -d)
echo "== tar tvf (list w/ perms) =="; tar tvzf dist/adapter.spt 2>&1 | head
echo "== extract verbose =="; tar xvzf dist/adapter.spt -C "$tmp" 2>&1 | tail -15; echo "tar_exit=$?"
echo "== extracted tree =="; ls -la "$tmp"
rm -rf "$tmp"

Extract adapter.spt verbosely to find tar failure cause


== tar tvf (list w/ perms) ==
-rw-r--r-- decid/197609  24254 2026-06-19 23:04 manifest.toml
drwxr-xr-x decid/197609      0 2026-06-19 23:04 strings/
drwxr-xr-x decid/197609      0 2026-06-19 23:04 strings/briefs/
-rw-r--r-- decid/197609    436 2026-06-19 23:04 strings/briefs/identity.md
-rw-r--r-- decid/197609    359 2026-06-19 23:04 strings/briefs/messaging-no-perch.md
-rw-r--r-- decid/197609    322 2026-06-19 23:04 strings/briefs/messaging-perch.md
drwxr-xr-x decid/197609      0 2026-06-19 23:04 strings/skills/
-rw-r--r-- decid/197609    592 2026-06-19 23:04 strings/skills/force-stop.md
-rw-r--r-- decid/197609    375 2026-06-19 23:04 strings/skills/list-agents.md
-rw-r--r-- decid/197609   2402 2026-06-19 23:04 strings/skills/live.md
== extract verbose ==
strings/
strings/briefs/
strings/briefs/identity.md
strings/briefs/messaging-no-perch.md
strings/briefs/messaging-perch.md
strings/skills/
strings/skills/force-stop.md
strings/skills/list-agents.md
strings/skills/live.md
strings/skills/ready.md
strings/skills/setup.md
strings/skills/subnet.md
strings/skills/version.md
claude-spt-digest.exe
claude-spt-psyche.exe
tar_exit=0
== extracted tree ==
total 3404
drwxr-xr-x 1 decid 197609      0 Jun 20 05:33 .
drwxr-xr-x 1 decid 197609      0 Jun 20 05:33 ..
-rwxr-xr-x 1 decid 197609 269824 Jun 19 23:04 claude-spt-digest.exe
-rwxr-xr-x 1 decid 197609 250880 Jun 19 23:04 claude-spt-psyche.exe
-rw-r--r-- 1 decid 197609  24254 Jun 19 23:04 manifest.toml
drwxr-xr-x 1 decid 197609      0 Jun 19 23:04 strings


My local `tar xvzf` extracts cleanly (`tar_exit=0`) — the **archive is valid**. So spt-core's update-extract `tar exit 1` is environmental: almost certainly the install-dir `.exe` binaries are **locked/can't-be-overwritten on Windows** (strings/ extracted → briefs resolve; binaries didn't). Checking the install-dir state + any locking process.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
D="$LOCALAPPDATA/spt-core/adapters/_github/SaberMage-spt-claude-code"
echo "== install dir =="; ls -la "$D" 2>&1 | head
echo "== installed manifest version =="; grep -m1 '^version =' "$D/manifest.toml" 2>&1
echo "== briefs present in install dir? =="; ls "$D/strings/briefs/" 2>&1
echo "== claude-spt processes (lock suspects) =="; tasklist 2>/dev/null | grep -iE 'claude-spt|psyche|digest' || echo "(none running)"

Inspect install dir version, briefs, locking processes


== install dir ==
total 540
drwxr-xr-x 1 decid 197609      0 Jun 20 05:32 .
drwxr-xr-x 1 decid 197609      0 Jun 20 05:32 ..
-rwxr-xr-x 1 decid 197609 269824 Jun 19 23:04 claude-spt-digest.exe
-rwxr-xr-x 1 decid 197609 250880 Jun 18 16:01 claude-spt-psyche.exe
-rw-r--r-- 1 decid 197609  24254 Jun 19 23:04 manifest.toml
drwxr-xr-x 1 decid 197609      0 Jun 20 05:32 strings
== installed manifest version ==
version = "0.5.0"
== briefs present in install dir? ==
identity.md
messaging-no-perch.md
messaging-perch.md
== claude-spt processes (lock suspects) ==
claude-spt-psyche.exe       147992 Console                    1      4,100 K


**Root cause found.** The update extracted everything — manifest `0.5.0` ✓, briefs ✓, `claude-spt-digest.exe` (new) ✓ — but **`claude-spt-psyche.exe` is running (pid 147992)**, so Windows locked it; tar couldn't overwrite the old binary → `tar exit 1` → spt-core flags the whole update failed (and will retry-fail every time until that process dies).

Checking whether that psyche is orphaned (safe to kill) or owned by a live claude-spt agent.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== live claude-spt agents? =="; spt endpoint list 2>&1 | sed -n '/LOCAL/,$p'
echo "== psyche processes (spt view) =="; spt endpoint list --detail 2>&1 | grep -i psyche || echo "(no psyche endpoints listed)"
echo "== pid 147992 parent + start =="; wmic process where 'ProcessId=147992' get ProcessId,ParentProcessId,CreationDate,CommandLine /format:list 2>/dev/null | tr -d '\r' | grep -E 'ProcessId|Parent|Creation|CommandLine' | head
echo "== is parent alive? =="

Determine if the running psyche is orphaned


== live claude-spt agents? ==
LOCAL (this node)
  wall-a                       live_agent     -                      ready=true alive=true
  wall-aa                      live_agent     -                      ready=true alive=false
  wall-b                       live_agent     -                      ready=true alive=false
  wall-c                       live_agent     -                      ready=true alive=false
== psyche processes (spt view) ==
(no psyche endpoints listed)
== pid 147992 parent + start ==
CommandLine="C:\Users\decid\AppData\Local\spt-core\adapters\_github\SaberMage-spt-claude-code\claude-spt-psyche.exe" --id wall-a-psyche --session-id a8655f3e-6789-4ffe-9991-dbfd52cb17d5 --prompt "PSYCHE REVIVAL
CreationDate=20260620035121.106947-420
ParentProcessId=163632
ProcessId=147992
== is parent alive? ==


**Important correction — do NOT kill it.** Pid 147992 is `claude-spt-psyche.exe --id wall-a-psyche`, and `wall-a` is **alive=true** — a *live* claude-spt agent. The lock is held by a legitimately-running Psyche, not an orphan. Killing it would break wall-a's live session.

So this is a second, deeper finding: **spt-core's update can't overwrite binaries locked by a running live agent on Windows, and fails the whole update (`tar exit 1`) even though manifest + strings applied.** Checking the effective installed version to tell you the true state.


cd /c/Users/decid/Documents/projects/spt-claude-code || exit 1
echo "== effective version (install-dir manifest = authoritative on disk) =="
grep -m1 '^version =' "$LOCALAPPDATA/spt-core/adapters/_github/SaberMage-spt-claude-code/manifest.toml"
echo "== does spt report it updated or stuck? (re-run update dry view) =="
spt adapter update claude-spt 2>&1 | tail -4
echo "== binary timestamps (digest new / psyche old+locked) =="
ls -la "$LOCALAPPDATA/spt-core/adapters/_github/SaberMage-spt-claude-code/"*.exe

Check effective version + whether update retry-loops


== effective version (install-dir manifest = authoritative on disk) ==
version = "0.5.0"
== does spt report it updated or stuck? (re-run update dry view) ==
ADAPTER_UPDATE_UPTODATE:claude-spt: installed 0.5.0, latest 0.5.0
== binary timestamps (digest new / psyche old+locked) ==
-rwxr-xr-x 1 decid 197609 269824 Jun 19 23:04 C:\Users\decid\AppData\Local/spt-core/adapters/_github/SaberMage-spt-claude-code/claude-spt-digest.exe
-rwxr-xr-x 1 decid 197609 250880 Jun 18 16:01 C:\Users\decid\AppData\Local/spt-core/adapters/_github/SaberMage-spt-claude-code/claude-spt-psyche.exe


**Resolved — you're on 0.5.0 with briefs live.** The re-run confirms it: `ADAPTER_UPDATE_UPTODATE: installed 0.5.0, latest 0.5.0`. The scary `FAIL` was two separate things, both now benign:

1. **The 404** = the per-OS asset gap (update fetched the default `adapter.spt`, which didn't exist) → fixed by publishing `adapter.spt` to the release.
2. **The `tar exit 1`** = Windows couldn't overwrite the running `claude-spt-psyche.exe` (locked by your live `wall-a` agent) — but spt-core still committed `0.5.0` (manifest + `strings/briefs` + new `digest.exe` all landed), and now reports up-to-date with **no retry-loop**. The only residue is the old `psyche.exe` binary — and since this release changed **no binaries** (briefs are strings + hook-wrapper only), it's functionally identical. Zero impact.

Briefs are delivered end-to-end: adapter `0.5.0` + `strings/briefs` resolve, cplugs wrappers reloaded.

Recording both as spt-core findings + reporting to doyle.


Edit

- **`[update]` gh_release ✓ (declared)** — `adapter/claude-spt.toml` now declares `[update] avenue =
  "gh_release", repo = "SaberMage/spt-claude-code"`; validates against the re-vendored v0.8.0
  `manifest.schema.json`. Live `spt adapter update` test rides the per-OS re-release (the registered
  adapter is still the published v0.1.0 sans `[update]`).

- **`[update]` gh_release ✓ (declared)** — `adapter/claude-spt.toml` now declares `[update] avenue =
  "gh_release", repo = "SaberMage/spt-claude-code"`; validates against the re-vendored v0.8.0
  `manifest.schema.json`. Live `spt adapter update` test rides the per-OS re-release (the registered
  adapter is still the published v0.1.0 sans `[update]`).
  - **LIVE-TESTED 2026-06-20 (v0.5.0 release) — surfaced TWO gh_release-update gaps (F-014, F-015).**
    First real exercise of the avenue (`0.4.0 -> 0.5.0`). Both flagged to doyle; v0.5.0 unblocked
    via stopgaps, adapter is functionally on 0.5.0 (briefs resolve; up-to-date, no retry-loop).

## F-014 — gh_release update fetches a single fixed `asset` (default `adapter.spt`); no per-OS resolution

**Surfaced:** 2026-06-20 — `spt adapter update claude-spt` →
`ADAPTER_UPDATE_FAIL: fetch: HTTP 404 Not Found` fetching `adapter.spt`. The release ships **per-OS**
assets (`adapter-<os>-<arch>.spt`, REQ-DIST-ADAPTER-PEROS) but the update avenue fetches one fixed
name — `asset` omitted ⇒ default `adapter.spt`, which we deliberately do NOT publish (the manifest
comment pre-flagged exactly this). `spt adapter update --help` exposes no `--asset` override and the
manifest `[update]` has no `{os}`/`{arch}` placeholder. So the avenue cannot target a per-OS asset.
**Stopgap (applied):** published `adapter.spt` = the windows build to the v0.5.0 release (this node's
OS; the active fleet is windows). **Needs (doyle):** per-OS resolution in the gh_release update avenue
— an `asset = "adapter-{os}-{arch}.spt"` placeholder, or host-derive like `--release` acquisition.

## F-015 — Windows update-extract fails (`tar exit 1`) when a live agent locks a bundled binary; whole update reported failed despite manifest+strings applying

**Surfaced:** 2026-06-20 — after the F-014 stopgap, update got past fetch but →
`ADAPTER_UPDATE_FAIL: extract: tar exit Some(1)`. The `.spt` archive is valid (local `tar xvzf` exits
0). Root cause: `claude-spt-psyche.exe` was **running** (pid for the live `wall-a` agent's Psyche), so
Windows locked it and tar could not overwrite the binary → exit 1. The non-binary entries DID extract
(install-dir `manifest.toml` = 0.5.0, `strings/briefs/` present + resolving, `claude-spt-digest.exe`
swapped); only the locked `claude-spt-psyche.exe` stayed the old build. spt-core reports the whole
update FAILED yet still records 0.5.0 (re-run → `UPTODATE installed 0.5.0`), leaving a **partial,
silently-inconsistent** state: a future release that DID change the psyche binary would believe it's
up-to-date with a stale binary. (v0.5.0 is unaffected — it changed no binaries, so the old psyche is
identical.) **Needs (doyle):** graceful locked-binary handling on Windows update — extract-to-temp +
atomic swap when free, or skip-locked + "restart the live agent to finish" semantics, and do NOT
record the new version until the binary swap actually succeeds.