File created successfully at: C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\v0150-published.md (file state is current in your context — no need to Read it back)

---
name: v0150-published
description: "v0.15.0 published 2026-06-24 (counter 34, MINOR); messaging W1-W5 send-modifier set + psyche-download verb"
metadata:
  node_type: memory
  type: project
  originSessionId: bc2e0aa4-b02a-4823-8e80-ab6f6d39cfb8
---

v0.15.0 PUBLIC 2026-06-24 (counter 34); MINOR 0.14.3→0.15.0. Messaging milestone: per-message send axes (--idle-only/--active-only(+--deferred hidden alias)/--ephemeral, --prefer/force-native, --json-payload opaque), activity-gated delivery + window persistence, resume-context pull (`spt api psyche-download` verb + pending-commune/signoff append), translation console-window fix. Full milestone detail in [[v0150-w1-activity-gated-delivery]].

RELEASE: bump-in-PR ([[release-standard-bump-in-pr]]) PR#37 → GREEN both runners (NO seedmap flake this run — vindicated the starvation-flake call [[seedmap-test-collides-live-daemon]], no rerun) → merged no-squash → main+tag **18d5045** → release run 28094143662 GREEN. deployah cut: cross-checked 33→34 monotonic (no collision), signed FRESH rel-primary-2026 verified vs SHA256SUMS pre-sign, counter 34 in both .release.json (product 0.15.0), update-set v34 both platforms, all 8 assets, draft→Latest.

HASHES (counter 34): linux `93ed9b89c4a90aabbe46f98beb61cd978bf1f3f411161f0c09d6e4c9848c157c` / win `b4950a8d3a04ac0749d87db23a6b30d614c04ccbf6e3409c7acb40d22bb2fe47`.

DOCS: docs-publish run 28094143644 fired GREEN on the tag push (headBranch v0.15.0 == tag 18d5045 == main HEAD, includes @582e5d1 prose). GH-Pages live with v0.15.0 send-axes/psyche-download/messaging docs. Explicit `gh workflow run docs-publish.yml --ref main` re-dispatch HELD as redundant (tag==main, identical content) — [[v0150-public-docs-update]] satisfied by the tag-push run, no belt-and-suspenders needed.

5th cut this session (counters 30/31/32/33/34). POST-PUBLISH: perri released for real-CC validation (3 send axes + json-payload + no-window + psyche-download) AND adapter bump (min_spt_core 0.13.2→0.15.0 + light 2 deferred ints: json-payload self-send loopback + psyche-download SessionStart inject; perri's T1/T2/T3 already built+green @befa592/e27e0d3/38044e2). See ledger [[v0121-published]] for counter history.


perri executing (update node + bump + ints + validation, will report). Update MEMORY.md index, then quick-ack perri.


<owl_messages>
<owl_message from="deployah" priority="high">ACK — v0.15.0 closed clean, counter 34 confirmed both sides, docs live (no re-dispatch), perri released. 5 cuts this session: 30/31/32/33/34, bump-in-PR proven 4× + the gate-escape safety-net once. Standing down on releases; ready for the next cut (v0.15.1/v0.16.0) when it gate-passes. Thanks for the tight vet loop. On-call.</owl_message>
</owl_messages>

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


1	- [v0.14.0 endpoint-creation-flow](v0140-endpoint-creation-flow.md) — PUBLISHED counter 30 @6ba875e. Multi-subnet home-at-creation + UNBOUND pre-bind attach. perri real-CC repro ALL GREEN. SPT_RELEASE_SEED in env (len64).
2	- [v0.14.1 builds (F-018+picker+netstream)](f018-adapter-add-nondestructive.md) — PUBLISHED counter 31 @46289ab (PR#34). F-018 adapter-add non-destructive, picker home-subnet, #4 netstream flake FIX. GOTCHA: `spt` NO lib target → `--bin spt`.
3	- [F-019 translation install_dir resolve](f019-translation-install-dir-resolve.md) — PUBLISHED v0.14.2 counter 32 @365fb0c (PR#35). #1 CC-on-Win blocker: idle msgs typed-not-SUBMITTED, root=bare path not resolved vs install_dir. Fix=resolve_program_in_dir ×4 sites. perri real-CC ALL GREEN.
4	- [v0.15.0 messaging milestone](v0150-w1-activity-gated-delivery.md) — PUBLISHED counter 34 @18d5045 (PR#37, off main 90852bf, 10 gated commits SKIP ungated 296e579). W1 activity-gated delivery + fault-transient re-spool, W2-W4 `spt send` axes (--idle-only/--active-only[renames --deferred, hidden alias]/--ephemeral[translation-binary+TTL only, relay-carrier DEFERRED]/--prefer-native/--force-native/--json-payload) + Win console-window fix, W5 `spt api psyche-download` verb. hashes linux 93ed9b89… / win b4950a8d…. doyle CHANGELOG-vet: 2 tweaks (ephemeral re-scoped, +W1 fault-transient Fixed bullet). docs-publish fired green on tag. perri real-CC validate pending (doyle-cued: 3 axes+json+no-window+psyche-download). seedmap flake (request_stop_barrier) = load-contention starvation on shared box, rerunnable (NOT prod-collision — unique per-test socket via with_home tempdir; doyle whiplash-corrected then re-confirmed flake).
5	- [seedmap test 240s timeout = STARVATION not collision](seedmap-test-collides-live-daemon.md) — 2026-06-24: spt-daemon `seedmap::request_stop_barrier_holds_until_no_listener` times out 240s on a LOADED shared box (live agents up). NOT a prod-149588 socket collision (REFUTED — test_home::with_home sets fresh tempdir SPT_HOME + spt_home() pure → unique per-test socket, request_stop never reaches prod). REAL=starvation/contention (ci.yml self-hosted load noise). RERUNNABLE flake, not a blocker. LESSON: verify the FULL chain (spt_home purity + what with_home sets) before confirming a diagnosis — doyle wrongly echoed todlando's collision theory after only grounding home_tag. Follow-up: contention-harden the test (timeout headroom).
6	- [v0.15.0 public docs-site update](v0150-public-docs-update.md) — operator-directed 2026-06-24, MUST ride the release. Per-wave xtask gen only does reference.md; PROSE pages need v0.15.0 direction. GAPS: integration-checklist.md MISSING the `api psyche-download` SessionStart resume-pull row (PRIORITY — covers boundary-survival but not pull-back-in); api.md needs the verb; messaging/overview+quickstart need 3 send axes + --json-payload. doyle authors, publish via docs-publish.yml, VERSION numbers no internal codes. AFTER strip + WITH release.

- [v0.14.0 endpoint-creation-flow](v0140-endpoint-creation-flow.md) — PUBLISHED counter 30 @6ba875e. Multi-subnet home-at-creation + UNBOUND pre-bind attach. perri real-CC repro ALL GREEN. SPT_RELEASE_SEED in env (len64).
- [v0.14.1 builds (F-018+picker+netstream)](f018-adapter-add-nondestructive.md) — PUBLISHED counter 31 @46289ab (PR#34). F-018 adapter-add non-destructive, picker home-subnet, #4 netstream flake FIX. GOTCHA: `spt` NO lib target → `--bin spt`.
- [F-019 translation install_dir resolve](f019-translation-install-dir-resolve.md) — PUBLISHED v0.14.2 counter 32 @365fb0c (PR#35). #1 CC-on-Win blocker: idle msgs typed-not-SUBMITTED, root=bare path not resolved vs install_dir. Fix=resolve_program_in_dir ×4 sites. perri real-CC ALL GREEN.
- [v0.15.0 messaging milestone](v0150-w1-activity-gated-delivery.md) — PUBLISHED counter 34 @18d5045 (PR#37, off main 90852bf, 10 gated commits SKIP ungated 296e579). W1 activity-gated delivery + fault-transient re-spool, W2-W4 `spt send` axes (--idle-only/--active-only[renames --deferred, hidden alias]/--ephemeral[translation-binary+TTL only, relay-carrier DEFERRED]/--prefer-native/--force-native/--json-payload) + Win console-window fix, W5 `spt api psyche-download` verb. hashes linux 93ed9b89… / win b4950a8d…. doyle CHANGELOG-vet: 2 tweaks (ephemeral re-scoped, +W1 fault-transient Fixed bullet). docs-publish fired green on tag. perri real-CC validate pending (doyle-cued: 3 axes+json+no-window+psyche-download). seedmap flake (request_stop_barrier) = load-contention starvation on shared box, rerunnable (NOT prod-collision — unique per-test socket via with_home tempdir; doyle whiplash-corrected then re-confirmed flake).
- [seedmap test 240s timeout = STARVATION not collision](seedmap-test-collides-live-daemon.md) — 2026-06-24: spt-daemon `seedmap::request_stop_barrier_holds_until_no_listener` times out 240s on a LOADED shared box (live agents up). NOT a prod-149588 socket collision (REFUTED — test_home::with_home sets fresh tempdir SPT_HOME + spt_home() pure → unique per-test socket, request_stop never reaches prod). REAL=starvation/contention (ci.yml self-hosted load noise). RERUNNABLE flake, not a blocker. LESSON: verify the FULL chain (spt_home purity + what with_home sets) before confirming a diagnosis — doyle wrongly echoed todlando's collision theory after only grounding home_tag. Follow-up: contention-harden the test (timeout headroom).
- [v0.15.0 public docs-site update](v0150-public-docs-update.md) — operator-directed 2026-06-24, MUST ride the release. Per-wave xtask gen only does reference.md; PROSE pages need v0.15.0 direction. GAPS: integration-checklist.md MISSING the `api psyche-download` SessionStart resume-pull row (PRIORITY — covers boundary-survival but not pull-back-in); api.md needs the verb; messaging/overview+quickstart need 3 send axes + --json-payload. doyle authors, publish via docs-publish.yml, VERSION numbers no internal codes. AFTER strip + WITH release.


Both messages are FYI (perri executing/will-report, deployah standing-down). Quick acks + finish ledger bookkeeping. MEMORY.md line 4 already has v0.15.0 counter 34. Update the counter-ledger line + link new published file.


Bash

printf '%s' "Ack — standing down confirmed, on-call for next cut. 5 clean (30/31/32/33/34), bump-in-PR proven. Appreciated the monotonic cross-check + fresh-sign discipline. Out." | "$OWL" send deployah 2>&1 | tail -1
printf '%s' "Ack GO confirmed — go light it. Reminder: --active-only is the rename of --deferred (hidden alias still wired), --ephemeral is translation-binary+TTL only (relay-carrier DEFERRED), psyche-download append gates on NOT-YET-SYNTHESIZED. Report when validation lands; I'll gate any int-stage additions to the two REQs." | "$OWL" send perri 2>&1 | tail -1

Ack deployah + perri


➜ SENT:deployah
➜ SENT:perri


80:- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.


Everything already recorded (MEMORY.md line 4 = v0.15.0 milestone, line 80 ledger = counter 34). Add pointer to the new release-detail file.


Edit

- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.
- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag (re-dispatch held redundant). perri released for adapter bump + real-CC validation.


<tool_use_error>File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.</tool_use_error>

Error: File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.


<owl_messages>
<owl_message from="perri" priority="high">ACK — noted: --active-only = renamed --deferred (hidden alias live), --ephemeral = translation-binary+TTL only (relay-carrier deferred), psyche-download append gates on NOT-YET-SYNTHESIZED. spt updated to 0.15.0 on this node; both verbs confirmed present (send --json-payload + the 3 axes; api psyche-download <id> --session-id). Bumping manifest now, then real-CC validation. Will report results before you gate the int-stage additions.</owl_message>
</owl_messages>

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


78	- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.
79	- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.
80	- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.
81

- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.
- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.


perri: node on 0.15.0, both verbs confirmed present, bumping manifest → validation → will report before I gate int-stages. Good. Finish ledger edit + ack.


- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.
- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag (re-dispatch held redundant). perri released for adapter bump + real-CC validation.


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)

- [Published releases ledger](v0121-published.md) — counters: v0.4.0=7 … v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34. bump-in-PR standard (v0.14.1+) proven 4×. Each vX.Y.Z-published.md holds that release's hashes+gotcha.
- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag (re-dispatch held redundant). perri released for adapter bump + real-CC validation.

- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.

- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.

+- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag (re-dispatch held redundant). perri released for adapter bump + real-CC validation.


Bash

printf '%s' "Ack — node 0.15.0 + both verbs present confirmed. Manifest bump then validation, understood. I gate int-stage additions on your report. Go." | "$OWL" send perri 2>&1 | tail -1

Ack perri progress


➜ SENT:perri


v0.15.0 release closed clean. Recap:

**PUBLISHED** — counter 34, Latest on spt-releases, @18d5045 (PR#37).
- hashes verified (signed FRESH, 33→34 monotonic): linux `93ed9b89…c157c` / win `b4950a8d…fe47`
- docs-publish GREEN on tag push (tag==main) — redundant re-dispatch held
- ledger recorded: `v0150-published.md` + MEMORY.md counter line

**Downstream:**
- deployah standing down (5 cuts: 30/31/32/33/34), on-call
- perri executing: node updated to 0.15.0, verbs confirmed present, bumping manifest → real-CC validation (3 axes + json-payload + no-window + psyche-download) → reports back

**My next gate:** perri's validation report → gate the int-stage additions to REQ-DIST-CHECKPOINT-COMMUNE + REQ-DIST-RESUME-CONTEXT. Idle until then.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT type="msg" from="perri">ACK — manifest bumped (min_spt_core 0.15.0, version 0.7.0), new binary staged into the pointer dir. Spawning a fresh spt-hosted endpoint on 0.15.0 now for the live loopback + psyche-download validation. Report incoming.</EVENT></event>
</task-notification>


<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.


perri: manifest bumped (min_spt_core 0.15.0, adapter 0.7.0), binary staged, spawning fresh 0.15.0 endpoint for loopback + psyche-download validation. Report incoming. No reply needed — waiting on results.


<task-notification>
<task-id>bzwmyp7fg</task-id>
Monitor event: "« spt event »"
<event><EVENT-PART seq="1/8" id="985ee464" type="msg" from="perri">VALIDATION REPORT — spt 0.15.0, endpoint ckptval (spt-hosted, my new binary staged). All GREEN:

1. NODE: spt update fetch+apply → 0.15.0. Both verbs present: `send --json-payload` + 3 axes (--idle-only/--active-only/--prefer-native/--force-native), `api psyche-download &lt;id&gt; --session-id`.

2. T2 C</EVENT-PART>
<EVENT-PART seq="2/8" id="985ee464">HECKPOINT LIVE LOOPBACK ✅ — `printf 'note' | spt send --from ckptval ckptval --json-payload '{&quot;checkpoint&quot;:&quot;v1&quot;,&quot;wake&quot;:&quot;VALIDATEWAKE7777 proceed&quot;}'` → SENT → spawned CC fired the macro. Transcript proves the exact sequence: user turn = `/clear`, NEXT user turn = `VALIDATEWAKE7777 proceed`. So --j</EVENT-PART>
<EVENT-PART seq="3/8" id="985ee464">son-payload composed the `json=` envelope attr, looped back through my translation binary, which parsed it and fired ctrl+s·/clear·enter·500ms·wake·enter·commit. E2E on real CC.

3. T3 psyche-download ✅ BOTH paths:
   - NO-CONTEXT: fresh endpoint → exit 0, stderr `NO-CONTEXT:ckptval`, empty stdout (my hook skips).
   - P</EVENT-PART>
<EVENT-PART seq="4/8" id="985ee464">OSITIVE: dropped `.claude/ckptval-commune.md` → immediate pull returned `&lt;pending-commune&gt;…marker…&lt;/pending-commune&gt;` VERBATIM. Not-yet-synthesized append works.
   - AUTH: --session-id must match info.json (the CC post_spawn uuid, NOT the endpoint-run session). My session-start.sh passes $sid from hook stdin = always the </EVENT-PART>
<EVENT-PART seq="5/8" id="985ee464">right one.

4. SEND AXES smoke ✅ — --idle-only --prefer-native → SENT; --active-only (renamed --deferred) → DEFERRED (via poll, correct).

5. NO-WINDOW FLASH ✅ — no console-window flash observed during the spt-hosted spawn + binary sends. 0.15.0 fix effective.

CAVEAT: full E2E of the PostToolUse write-detection (</EVENT-PART>
<EVENT-PART seq="6/8" id="985ee464">T2) and the SessionStart INJECTION (T3) needs my NEW plugin installed; the spawned CC ran the OLD cplugs sptc 0.1.4. I validated the spt-core-dependent halves directly (issued the self-send + the verb manually = exactly what my hooks emit). Hook wiring is unit-tested.

INT-STAGE QUESTION: REQ-DIST-CHECKPOINT-COMMUNE already carries int v</EVENT-PART>
<EVENT-PART seq="7/8" id="985ee464">ia the translate-proof EMIT-half (deterministic CI) + now this manual live loopback. REQ-DIST-RESUME-CONTEXT is impl+unit. How do you want the psyche-download int recorded — a new capability-detect CI script (assert verb present + NO-CONTEXT/AUTH contract on real 0.15.0), or keep it as the manual-dogfood tier like the real-claude bringup int</EVENT-PART>
<EVENT-PART seq="8/8" id="985ee464">? Your gate. Manifest bumped to min_spt_core 0.15.0 / version 0.7.0.</EVENT-PART></event>
</task-notification>


perri validation **ALL GREEN** on real 0.15.0 — checkpoint loopback E2E, psyche-download both paths (NO-CONTEXT + verbatim pending-commune + AUTH), send axes, no-window flash. Caveat noted (spawned CC ran OLD cplugs 0.1.4 → full hook-E2E needs new plugin; spt-core halves validated directly = legit, that's our gate surface).

Clear int-stage decision — it's mine to make, ruling now (no user needed).


printf '%s' "GATE RULING — validation accepted, all spt-core surfaces GREEN.

INT-STAGE: split it the SAME way T2 already is (deterministic CI for the core-owned half, dogfood tier for the harness-glue half). No faking, no silent cap.

REQ-DIST-RESUME-CONTEXT int = NEW capability-detect CI script. It is pure spt-core CLI contract, deterministic, self-hosted, needs NO real CC — so make it real CI, not manual-dogfood. Assert on a live 0.15.0 binary:
  - verb present (api psyche-download <id> --session-id)
  - NO-CONTEXT: fresh id -> exit 0, stderr NO-CONTEXT:<id>, empty stdout
  - POSITIVE: drop commune file -> <pending-commune> returned VERBATIM (not-yet-synthesized append)
  - AUTH: wrong --session-id -> reject
Tag [int->REQ-DIST-RESUME-CONTEXT] on that script, activate the int stage, traceable green.

The SessionStart INJECTION E2E (hook consumes pull + injects into live CC) genuinely needs the NEW plugin + real CC -> keep it as manual-dogfood tier, exactly like the real-claude bringup int. Document it as a logged deferred (NOT covered by CI), to be dogfooded once you land the new plugin. Same as the T2 PostToolUse write-detect half.

So: checkpoint EMIT-half + resume core-contract = CI; both harness-glue E2Es = dogfood-after-plugin-land, logged. Manifest bump 0.15.0/0.7.0 confirmed. Go write the capability-detect script + activate. Ping me to gate the traceable diff." | "$OWL" send perri 2>&1 | tail -1

Gate ruling: psyche-download int = CI script + dogfood split


Ruling sent. Split = same as T2:
- **CI (deterministic, no real CC):** checkpoint EMIT-half (already) + psyche-download core contract (verb / NO-CONTEXT / verbatim pending-commune / AUTH) → new capability-detect script, tag `[int->REQ-DIST-RESUME-CONTEXT]`, activate int stage.
- **Dogfood-after-plugin-land (logged deferred):** both harness-glue E2Es (PostToolUse write-detect + SessionStart injection) — need perri's new plugin.

v0.15.0 closed on release/core side. Waiting on perri's capability-detect script + traceable diff to gate. Idle.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT-PART seq="1/2" id="775467e0" type="msg" from="perri">ACK GATE — clear split: resume CORE-CONTRACT = new deterministic capability-detect CI script (verb present / NO-CONTEXT / POSITIVE pending-commune / AUTH reject), self-hosted, no real CC; both harness-glue E2Es (SessionStart injection + PostToolUse write-detect) = logged dogfood-after-plugin-land, NOT CI. Writing ci/p</EVENT-PART>
<EVENT-PART seq="2/2" id="775467e0">syche-download/psyche-download-int.sh now (will create a throwaway perch via api seed/bind for the NO-CONTEXT+POSITIVE+AUTH cases, no CC spawn), tag [int-&gt;REQ-DIST-RESUME-CONTEXT], activate int, log the deferreds. Ping you to gate the traceable diff. Figuring the minimal no-CC perch-create now.</EVENT-PART></event>
</task-notification>


perri ACK, writing `ci/psyche-download/psyche-download-int.sh` (throwaway perch via api seed/bind, no CC spawn), tag + activate int + log deferreds. Will ping to gate traceable diff. Clear — waiting.


<task-notification>
<task-id>bzwmyp7fg</task-id>
Monitor event: "« spt event »"
<event><EVENT-PART seq="1/4" id="187bf29c" type="msg" from="perri">TRACEABLE DIFF — ready for your gate. Committed a9aa714.

- REQ-DIST-RESUME-CONTEXT: impl+unit → impl+unit+INT. New script ci/psyche-download/psyche-download-int.sh, tagged [int-&gt;REQ-DIST-RESUME-CONTEXT]. Deterministic capability-detect CI, NO real CC — bind-creates a throwaway perch (`api bind &lt;id&gt;</EVENT-PART>
<EVENT-PART seq="2/4" id="187bf29c"> --set-session-id --subnet &lt;discovered&gt;`), asserts: verb-present, NO-CONTEXT (exit 0/empty stdout/NO-CONTEXT:&lt;id&gt; stderr), AUTH (wrong --session-id rejected), POSITIVE (not-yet-synthesized commune → &lt;pending-commune&gt; VERBATIM). GREEN on-node, idempotent, purges + rm's its perch/commune on exit.
- REQ-DIST-CHECKPOINT-COMM</EVENT-PART>
<EVENT-PART seq="3/4" id="187bf29c">UNE: stays doc+impl+unit+int (EMIT-half CI unchanged); comment updated to record the LIVE loopback validation (2026-06-24) + the deferred PostToolUse write-detect dogfood.
- Both harness-glue E2Es LOGGED as dogfood-after-plugin-land in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations (NOT CI) — per your split.
- min_spt_core 0.13.2→</EVENT-PART>
<EVENT-PART seq="4/4" id="187bf29c">0.15.0, adapter version 0.6.2→0.7.0.

traceable-reqs check GREEN. Both REQs full-stage. Manifest-schema PASS. The whole checkpoint-commune wave is built + validated to the CI tier; only the new-plugin-install dogfood E2Es remain (gated on a v0.7.0 publish — operator call). Your gate on the diff?</EVENT-PART></event>
</task-notification>


perri committed a9aa714 in spt-claude-code (adapter repo). My gate = actually inspect, not rubber-stamp. Pull the diff.


echo "=== commit a9aa714 spt-claude-code ==="
gh api repos/SaberMage/spt-claude-code/commits/a9aa714 --jq '.commit.message, "---FILES---", (.files[] | "\(.status)\t+\(.additions)/-\(.deletions)\t\(.filename)")' 2>&1 | head -40

Inspect perri commit a9aa714 files


=== commit a9aa714 spt-claude-code ===
{"message":"No commit found for SHA: a9aa714","documentation_url":"https://docs.github.com/rest/commits/commits#get-a-commit","status":"422"}gh: No commit found for SHA: a9aa714 (HTTP 422)


Commit a9aa714 not on remote (local to perri's node). Can't inspect → can't gate blind. Ask perri to push so I review the script + tag placement before ruling.


printf '%s' "Can't gate blind — a9aa714 isn't on the SaberMage/spt-claude-code remote yet (422 no-commit). Push the branch (or a9aa714 directly) so I can eyeball before ruling. Specifically reviewing:
  1. ci/psyche-download/psyche-download-int.sh — the AUTH case (wrong --session-id MUST actually reject, not just no-output), and the cleanup (perch+commune rm on exit incl. failure paths / trap).
  2. [int->REQ-DIST-RESUME-CONTEXT] tagged ON the real assertion, not the file top.
  3. The CHECKPOINT-COMMUNE comment update + §Deferred validations log.
Push + ping the branch name; I'll pull the diff and gate." | "$OWL" send perri 2>&1 | tail -1

Ask perri to push for review


Asked perri to push a9aa714 — can't gate blind (not on remote). Reviewing on arrival: AUTH reject is real (not just empty output), cleanup trap on failure paths, `[int->...]` tag on real evidence, deferred-log. Waiting on push + branch name.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT-PART seq="1/2" id="04667dcc" type="msg" from="perri">ACK — pushing now so you can pull the diff. Confirming your three review points up front: (1) AUTH case uses `if spt ... psyche-download &lt;id&gt; --session-id WRONG-&lt;sid&gt;; then FAIL` — it gates on the command's EXIT (AUTH_REFUSED → non-zero), not no-output; (2) `[int-&gt;REQ-DIST-RESUME-CONTEXT]` is tagged</EVENT-PART>
<EVENT-PART seq="2/2" id="04667dcc"> in the script's header block describing the assertions (not a bare file-top coverage tag) — I'll relocate it directly onto the assertion if you want it tighter; (3) trap cleanup runs `purge --force --yes` + `rm` the commune on EXIT/INT/TERM incl. failure paths. Branch = main (this project's direct-to-main flow). Pushing + will ping the SHA.</EVENT-PART></event>
</task-notification>


perri pushing to main, pre-confirms points (AUTH gates on exit non-zero, trap cleanup on EXIT/INT/TERM, tag in header block). On (2): per binding convention "tag on/immediately above real evidence, never file-top" — header block is borderline. Rule it tighter.


printf '%s' "(1) and (3) good as described — exit-gated AUTH + trap on EXIT/INT/TERM is what I wanted. (2) YES relocate: per the binding traceable rule the tag goes ON or immediately above the real evidence, and for a test script the evidence is the assertion that exercises the contract — not a header block describing them. Move [int->REQ-DIST-RESUME-CONTEXT] directly above the POSITIVE not-yet-synthesized assertion (the core behavior). Do that, push, ping SHA — I'll pull + gate." | "$OWL" send perri 2>&1 | tail -1

Rule: relocate int tag onto assertion


➜ SENT:perri


Ruled: relocate `[int->REQ-DIST-RESUME-CONTEXT]` onto the POSITIVE assertion (not header block) per binding convention. (1)/(3) approved. Waiting on push + SHA to pull and final-gate.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT type="msg" from="perri">Done — header tag removed, [int-&gt;REQ-DIST-RESUME-CONTEXT] now sits immediately above the POSITIVE not-yet-synthesized assertion (the core resume-context behavior). sh -n clean, script GREEN, traceable GREEN. Amending the commit + pushing now; SHA incoming.</EVENT></event>
</task-notification>


Tag relocated onto POSITIVE assertion, amended + pushing. Waiting on SHA to pull + gate.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT-PART seq="1/2" id="3768cfe0" type="msg" from="perri">PUSHED — origin/main @ eb609e5 (4954293..eb609e5, the 5 wave commits: 211a5cc doc-capture, befa592 T1, e27e0d3 T2, 38044e2 T3, eb609e5 v0.15.0-publish+int — the last folds in the tag relocation you asked for). Pull + gate at your leisure. Review targets recap: ci/psyche-download/psyche-download-int.sh (AUTH exit-gat</EVENT-PART>
<EVENT-PART seq="2/2" id="3768cfe0">ed, trap cleanup on EXIT/INT/TERM, [int-&gt;REQ-DIST-RESUME-CONTEXT] now directly above the POSITIVE assertion), the REQ-DIST-CHECKPOINT-COMMUNE comment update, and CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. Standing by for your ruling.</EVENT-PART></event>
</task-notification>


Pushed @eb609e5. Pull + gate now.


echo "=== eb609e5 files ==="
gh api repos/SaberMage/spt-claude-code/commits/eb609e5 --jq '.commit.message, "---FILES---", (.files[] | "\(.status)\t+\(.additions)/-\(.deletions)\t\(.filename)")' 2>&1 | head -50

List eb609e5 changed files


=== eb609e5 files ===
feat(checkpoint-commune): v0.15.0 publish — floor bump, light the deferred ints

spt-core v0.15.0 published (counter 34); validated on-node. The checkpoint-
commune wave's spt-core-dependent surfaces are now proven live:

- T2 LIVE LOOPBACK validated: a real `spt send --from <id> <id> --json-payload
  '{"checkpoint":"v1","wake":…}'` self-send composed the json envelope attr,
  looped back through the translation binary, and fired the /clear + wake macro
  on a spt-hosted CC (transcript: user turn `/clear`, next turn = the wake).
- T3 psyche-download validated: NO-CONTEXT + POSITIVE (pending-commune verbatim)
  + AUTH, all four contract behaviors on real spt 0.15.0.
- Send axes (--idle-only/--active-only/--prefer-native) + the Windows
  no-window-flash fix confirmed.

Changes:
- Bump min_spt_core_version 0.13.2 -> 0.15.0 + adapter version 0.6.2 -> 0.7.0
  (T2's checkpoint self-send needs `send --json-payload`; T3's resume pull needs
  the `api psyche-download` verb — both land in 0.15.0).
- New deterministic int: ci/psyche-download/psyche-download-int.sh — capability-
  detect CI, NO real CC (bind-creates a throwaway perch): asserts verb-present,
  NO-CONTEXT, AUTH-reject, POSITIVE pending-commune. Activate REQ-DIST-RESUME-
  CONTEXT int.
- Per doyle's gate ruling: the two harness-glue E2Es (PostToolUse write-detect,
  SessionStart injection) stay a LOGGED dogfood-after-plugin-land tier
  (CHECKPOINT-COMMUNE-PLAN.md §Deferred validations) — they need the new plugin
  installed + real CC; the spt-core-dependent halves are fully proven now.

traceable-reqs GREEN.

Co-authored by: perri
---FILES---
modified	+23/-3	CHECKPOINT-COMMUNE-PLAN.md
modified	+18/-2	adapter/claude-spt.toml
added	+85/-0	ci/psyche-download/psyche-download-int.sh
modified	+2/-2	traceable-reqs.toml


Pull the CI script (crux) + traceable-reqs diff + manifest diff.


echo "=== ci/psyche-download/psyche-download-int.sh @eb609e5 ==="
gh api repos/SaberMage/spt-claude-code/contents/ci/psyche-download/psyche-download-int.sh?ref=eb609e5 --jq '.content' 2>/dev/null | base64 -d 2>/dev/null

Read the psyche-download int CI script


=== ci/psyche-download/psyche-download-int.sh @eb609e5 ===
#!/bin/sh
# Integration proof for the spt-core v0.15.0 `spt api psyche-download <id>` resume-context verb
# (REQ-DIST-RESUME-CONTEXT, T3). This is the CORE-CONTRACT half of the int: pure spt-core CLI
# behavior, deterministic, self-hosted, NO real CC needed — a throwaway perch is bind-created via
# `api bind` (which writes the perch record + session id directly, no broker/CC spawn), the four
# contract behaviors are asserted against a live 0.15.0 binary, then the perch is purged.
#
# The SessionStart INJECTION E2E — the adapter's session-start.sh hook actually CONSUMING this pull
# and injecting it into a live CC — genuinely needs the NEW plugin installed + a real CC session, so
# it stays a LOGGED dogfood-after-plugin-land tier (CHECKPOINT-COMMUNE-PLAN.md §Deferred validations),
# NOT covered here (doyle's gate ruling, 2026-06-24). The int evidence tag sits on the assertion block
# below, not here.
#
# Needs spt >= 0.15.0 (the verb) + a subnet to home the throwaway perch. Feature-detects and SKIPs
# otherwise (never a hard fail on an older / subnet-less node). Idempotent. Run: exit 0 = pass.
set -u
ADAPTER=claude-spt
ID="sptc-pdint-$$"
SID="sptc-pdint-sess-$$"

command -v spt >/dev/null 2>&1 || { echo "SKIP: no spt on PATH"; exit 0; }

# Verb capability-detect (lands in spt v0.15.0).
if ! spt api psyche-download --help >/dev/null 2>&1; then
  echo "SKIP: spt 'api psyche-download' absent (needs v0.15.0). Hook wiring: tests/hooks-parse.sh green."
  exit 0
fi
echo "ok   verb present: api psyche-download <id> --session-id"

# A subnet to home the throwaway perch (bind refuses to guess when the node holds >1 subnet).
SUBNET=$(spt endpoint list 2>/dev/null | sed -n 's/^SUBNET \([^ ]*\).*/\1/p' | head -1)
[ -n "$SUBNET" ] || { echo "SKIP: no subnet on this node to home the test perch"; exit 0; }

cleanup() {
  printf 'y\n' | spt endpoint purge "$ID" --force --yes >/dev/null 2>&1 || true
  rm -f ".claude/$ID-commune.md"
}
trap cleanup EXIT INT TERM

# Bind-create the perch (NO CC — api bind writes the perch record + session id directly).
if ! spt api --adapter "$ADAPTER" bind "$ID" --set-session-id "$SID" --subnet "$SUBNET" >/dev/null 2>&1; then
  echo "SKIP: could not bind-create the test perch (subnet $SUBNET)"
  exit 0
fi

rc=0
errf="${TMPDIR:-/tmp}/sptc-pdint-$$.err"

# 1. NO-CONTEXT: a fresh perch -> exit 0, EMPTY stdout, NO-CONTEXT:<id> on stderr (the hook skips).
out=$(spt api --adapter "$ADAPTER" psyche-download "$ID" --session-id "$SID" 2>"$errf"); ec=$?
err=$(cat "$errf" 2>/dev/null)
if [ "$ec" -eq 0 ] && [ -z "$out" ] && { printf '%s' "$err" | grep -q "NO-CONTEXT:$ID"; }; then
  echo "ok   NO-CONTEXT: fresh perch -> exit 0, empty stdout, NO-CONTEXT on stderr"
else
  echo "FAIL NO-CONTEXT contract: exit=$ec stdout=[$out] stderr=[$err]"; rc=1
fi

# 2. AUTH: a wrong --session-id is rejected (non-zero exit; AUTH_REFUSED).
if spt api --adapter "$ADAPTER" psyche-download "$ID" --session-id "WRONG-$SID" >/dev/null 2>&1; then
  echo "FAIL AUTH: a wrong --session-id was NOT rejected"; rc=1
else
  echo "ok   AUTH: wrong --session-id rejected"
fi

# 3. POSITIVE: a not-yet-synthesized commune drop is returned VERBATIM as <pending-commune>. Retried
#    across the brief pre-synthesis window (the daemon eventually ingests + clears the drop). This is
#    the core resume-context behavior the SessionStart hook injects. [int->REQ-DIST-RESUME-CONTEXT]
MARK="PDINT-POS-$$"
mkdir -p .claude
printf '%s resume delta\n' "$MARK" > ".claude/$ID-commune.md"
got=""
i=0
while [ "$i" -lt 5 ]; do
  o=$(spt api --adapter "$ADAPTER" psyche-download "$ID" --session-id "$SID" 2>/dev/null)
  if printf '%s' "$o" | grep -q "$MARK"; then got="$o"; break; fi
  i=$((i + 1)); sleep 1
done
if { printf '%s' "$got" | grep -q '<pending-commune>'; } && { printf '%s' "$got" | grep -q "$MARK"; }; then
  echo "ok   POSITIVE: not-yet-synthesized commune returned VERBATIM as <pending-commune>"
else
  echo "FAIL POSITIVE: pending-commune not returned (got=[$got])"; rc=1
fi

rm -f "$errf"
[ "$rc" -eq 0 ] && { echo "PSYCHE-DOWNLOAD-INT OK"; exit 0; } || { echo "PSYCHE-DOWNLOAD-INT FAIL"; exit 1; }


echo "=== eb609e5 patch: traceable-reqs.toml + claude-spt.toml + PLAN deferred ==="
gh api repos/SaberMage/spt-claude-code/commits/eb609e5 --jq '.files[] | select(.filename=="traceable-reqs.toml" or .filename=="adapter/claude-spt.toml" or .filename=="CHECKPOINT-COMMUNE-PLAN.md") | "### \(.filename)\n\(.patch)\n"' 2>&1 | head -90

Patches for traceable, manifest, plan


=== eb609e5 patch: traceable-reqs.toml + claude-spt.toml + PLAN deferred ===
### CHECKPOINT-COMMUNE-PLAN.md
@@ -135,8 +135,28 @@ DEFERRED Tier-2 (NOT in verb yet, additive-forward): `<psyche-stamp/>`/`<current
 - T2: live endpoint — flagged commune → `/clear` fires → wake turn appears (default + custom).
 - T3: deferred to W5 ship — `psyche-download` output injected at SessionStart, durable+pending present.

+## Deferred validations (dogfood-after-plugin-land — LOGGED, not CI)
+
+doyle's gate ruling (2026-06-24): the spt-core-owned halves are deterministic CI; the harness-glue
+E2Es genuinely need the NEW plugin installed + a real CC session, so they stay a dogfood tier —
+exercised once the v0.7.0 plugin is published/installed, not covered by an automated gate.
+
+- **T2 — PostToolUse write-detect E2E.** The hook (`post-tool-use.sh`) detecting `!!checkpoint!!` in
+  a live agent's own `Write` of `.claude/<id>-commune.md` and firing the self-send. Validated halves:
+  the binary clear+wake branch (CI, `translate-proof-int.sh`) and the LIVE self-send loopback
+  (manual, on-node 2026-06-24 — a real `spt send --json-payload` self-send drove a spt-hosted CC
+  through `/clear` + the wake turn). The remaining gap is only the hook's own detection+emit running
+  inside a real CC (the on-node validation issued the self-send manually = exactly what the hook emits).
+- **T3 — SessionStart injection E2E.** `session-start.sh` consuming `api psyche-download` and injecting
+  it as additionalContext into a live CC. Validated halves: the verb's full contract (CI,
+  `psyche-download-int.sh`) and the pure append/skip logic (`tests/hooks-parse.sh`). The remaining gap
+  is the hook calling the verb + emitting the result inside a real CC.
+
+Both light up when the v0.7.0 plugin lands on a node (the spt-hosted CC then runs THIS repo's hooks,
+not the older published `cplugs sptc`). Until then the spt-core-dependent behavior is fully proven.
+
 ## Open items

-- Exact `<id>` + auth-token threading for `api psyche-download` (mirror our other `api` calls).
-- Commune body format (two-slice envelope vs freeform) — confirm in T2a.
-- Macro 500ms timing adequacy post-`/clear` (validate in T2).
+- Macro 500ms timing adequacy post-`/clear` — validated on-node 2026-06-24 (the wake turn landed
+  cleanly after the clear); revisit only if a slower host shows a race.
+- Publishing the v0.7.0 adapter (`.spt` re-cut + release) so the new plugin/binary ship — operator call.

### adapter/claude-spt.toml
@@ -39,15 +39,31 @@ kind = "harness"
 # submission (newly discovered), so idle-delivered messages typed into the input box but never sent;
 # the [message-idle-translation-binary] choreography now ends with {key:enter} after the text. Binary
 # rebuild only — manifest seams + floor unchanged.
-version = "0.6.2"
+# 0.7.0 (2026-06-24): the CHECKPOINT-COMMUNE WAVE — three operator-requested deliverables. (T1) the
+# idle-translation binary now FRAMES each inbound <EVENT> across multiple lines (a raw \n after the
+# opening tag and before </EVENT>) for visual distinction — CC soft-newlines a bare \n, empirically
+# gated. (T2) AGENT-DRIVEN CHECKPOINT: a NEW [hooks.PostToolUse] (Write matcher) detects a `!!checkpoint!!`
+# trigger in a live agent's own `.claude/<id>-commune.md` and self-sends `spt send --json-payload
+# '{"checkpoint":"v1","wake":…}'`; the signal loops back through the endpoint's own translation binary,
+# which parses the structured json envelope-attr and fires a /clear + wake macro — the agent clearing +
+# rebuilding its own context from its freshest commune. (T3) RESUME parity: SessionStart now pulls
+# `spt api psyche-download <id>` and injects the durable role/live/project + pending commune/signoff as
+# additionalContext (closes F-020). These REQUIRE spt-core v0.15.0 (the `--json-payload` send axis + the
+# `psyche-download` verb), so the floor BUMPS to 0.15.0 below.
+version = "0.7.0"
 # Floor BUMPED to 0.13.2 (2026-06-22, C / F-014 drop): the release packaging moved from the per-OS
 # stopgap (`adapter.spt` = a windows-binary copy — F-014; broke on a linux host) to ONE fat .spt that
 # bundles both x86_64 triples beside a shared manifest. spt-core extracts a fat archive (classify
 # top-level triple dirs → flatten this node's triple into the install dir, preserving bare-name
 # resolution) ONLY on >= 0.13.2 (doyle, extract_release_archive); an older node cannot read the asset
 # at all, so declaring the floor is honest, not a needless block. (Prior floor 0.9.0 was the
 # adapter-agnostic seed/listen-by-host_binaries requirement, PREP-4 — still satisfied, just superseded.)
-min_spt_core_version = "0.13.2"
+# Floor BUMPED to 0.15.0 (2026-06-24, the checkpoint-commune wave / v0.7.0): T2's checkpoint self-send
+# needs `spt send --json-payload` (the opaque-metadata send axis) and T3's resume pull needs the
+# `spt api psyche-download <id>` verb — BOTH land in spt-core v0.15.0 (counter 34, Latest). The
+# multi-line frame (T1) works on any node, but the wave ships as one unit, so the honest floor is the
+# verb floor. An older node can't fire checkpoint or pull resume context, so declaring 0.15.0 is honest.
+min_spt_core_version = "0.15.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

### traceable-reqs.toml
@@ -262,12 +262,12 @@ required_stages = ["impl", "unit", "int"]  # Feature 1 / task T1 — ACTIVATED 2
 [[requirements]]
 id = "REQ-DIST-CHECKPOINT-COMMUNE"
 title = "Agent-driven checkpoint: a live agent flags a commune with the literal trigger !!checkpoint!! (one = default wake; a pair brackets a custom wake directive); a PostToolUse hook detects the trigger in the Write tool_input.content for .claude/<id>-commune.md, sets the perch idle (api state idle), and self-sends a reserved wire-sentinel (spt send --from <id> <id>); the message loops back through the endpoint's own translation binary, which fires the clear+wake macro (ctrl+s · 50ms · /clear · enter · 500ms · wake-text · enter · commit). spt-hosted-only. INVARIANT: the commune is authored INLINE pre-clear (ADR-0004, Shape 1), never via a post-clear resume-Self refresh."
-required_stages = ["doc", "impl", "unit", "int"]  # Feature 2 / task T2 — ACTIVATED 2026-06-24. WIRE-SENTINEL is now spt-core v0.15.0 `spt send --json-payload '{"checkpoint":"v1","wake":…}'` (doyle, grounded in the gated W4 code) — a structured json ATTR on the <EVENT> envelope, NOT the old string-prefix sniff (collision-proof: the marker lives inside the opaque attr, can't forge from/type). doc: full-fat /sptc:commune SKILL.md (--checkpoint: single trigger=default wake, paired triggers bracket a custom wake) + ADR-0004 + the checkpoint [[hints]] entry. impl: cc-spt-idle-translate checkpoint branch (extract json attr -> xml-attr-unescape (& LAST) -> serde parse -> checkpoint=="v1" -> clear+wake macro ctrl+s·50ms·/clear·enter·500ms·wake·enter·commit, default "Proceed with next steps") + NEW PostToolUse hook (manifest [hooks.PostToolUse] + hooks.json Write-matcher + post-tool-use.sh detector: !!checkpoint!! scan of tool_input content -> api state idle -> self-send --json-payload) + _common.sh pure helpers (sptc_has_checkpoint/sptc_checkpoint_wake/sptc_is_commune_write). unit: hooks-parse.sh checkpoint tests + the crate's checkpoint macro/parse/unescape tests. int: ci/idle-translate/translate-proof-int.sh checkpoint block (envelope w/ json attr fires the clear+wake macro, custom + default wake, normal delivery never clears) — the EMIT half on the pre-0.15.0 daemon; the send-side --json-payload composition + live self-send loopback stay the heavier real-claude int (deferred to the v0.15.0/counter-34 publish, capability-detect-skip). The write-side !!checkpoint!! marker is one-shot (spt-core v0.15.0 strips it from durable+pending on ingest). min_spt_core stays 0.13.2 in-tree until doyle's publish ping, then bumps to 0.15.0. Self-send loopback PROVEN 2026-06-24.
+required_stages = ["doc", "impl", "unit", "int"]  # Feature 2 / task T2 — ACTIVATED 2026-06-24. WIRE-SENTINEL is now spt-core v0.15.0 `spt send --json-payload '{"checkpoint":"v1","wake":…}'` (doyle, grounded in the gated W4 code) — a structured json ATTR on the <EVENT> envelope, NOT the old string-prefix sniff (collision-proof: the marker lives inside the opaque attr, can't forge from/type). doc: full-fat /sptc:commune SKILL.md (--checkpoint: single trigger=default wake, paired triggers bracket a custom wake) + ADR-0004 + the checkpoint [[hints]] entry. impl: cc-spt-idle-translate checkpoint branch (extract json attr -> xml-attr-unescape (& LAST) -> serde parse -> checkpoint=="v1" -> clear+wake macro ctrl+s·50ms·/clear·enter·500ms·wake·enter·commit, default "Proceed with next steps") + NEW PostToolUse hook (manifest [hooks.PostToolUse] + hooks.json Write-matcher + post-tool-use.sh detector: !!checkpoint!! scan of tool_input content -> api state idle -> self-send --json-payload) + _common.sh pure helpers (sptc_has_checkpoint/sptc_checkpoint_wake/sptc_is_commune_write). unit: hooks-parse.sh checkpoint tests + the crate's checkpoint macro/parse/unescape tests. int: ci/idle-translate/translate-proof-int.sh checkpoint block (envelope w/ json attr fires the clear+wake macro, custom + default wake, normal delivery never clears) — the deterministic EMIT half. The LIVE self-send loopback (real `spt send --from <id> <id> --json-payload '{"checkpoint":"v1","wake":…}'` -> json envelope attr -> binary -> /clear+wake) was VALIDATED on-node 2026-06-24 on spt 0.15.0: a spt-hosted CC transcript showed the macro fire E2E (user turn `/clear`, next user turn = the wake). DEFERRED dogfood (NOT CI, logged in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations): the PostToolUse WRITE-DETECT E2E — the hook detecting `!!checkpoint!!` in a Write + self-sending — needs the NEW plugin installed + real CC. The write-side !!checkpoint!! marker is one-shot (spt-core v0.15.0 strips it from durable+pending on ingest). min_spt_core BUMPED to 0.15.0 (manifest v0.7.0). Self-send loopback PROVEN 2026-06-24.

 [[requirements]]
 id = "REQ-DIST-RESUME-CONTEXT"
 title = "claude-spt SessionStart pulls the live agent resume context via the v0.15.0 `spt api psyche-download <self-id> [--session-id <sid>]` verb and injects stdout as additionalContext (skip on NO-CONTEXT) — closing a pre-existing parity gap (claude-spt rehydrates NO durable context today; F-020). One call returns durable role/live/project tiers + the freshest not-yet-synthesized <pending-commune>/<pending-signoff> (trigger stripped core-side); it is also the checkpoint re-seed fast-path."
-required_stages = ["impl", "unit"]  # Parity wiring / task T3 — impl+unit ACTIVATED 2026-06-24 (coded against the FROZEN Tier-1 contract B); int DEFERRED until spt-core v0.15.0 W5 ships the verb (then add "int" + validate on doyle's gated+built ping). impl: session-start.sh bind|boundary brief branch -> sptc_psyche_download (mirrors `api poll` id-scoped auth: --session-id, no --project — project resolves from the bound cwd) + sptc_append_resume injects stdout VERBATIM below the identity brief, skip on NO-CONTEXT/empty (pre-v0.15.0 the verb is absent -> empty -> graceful skip). Fires on bind AND boundary — boundary IS the checkpoint re-seed path (post-/clear rebuild from the latest commune); the `api boundary` rotation itself is unchanged (additive pull). unit: tests/hooks-parse.sh sptc_append_resume skip-on-NO-CONTEXT tests. int (DEFERRED): real psyche-download output injected at SessionStart, durable+pending present — validate on doyle's W5 ping. No adapter-side raw-drop handling (core owns the race-free append).
+required_stages = ["impl", "unit", "int"]  # Parity wiring / task T3 — impl+unit ACTIVATED 2026-06-24 (coded against FROZEN contract B); int ACTIVATED 2026-06-24 when spt-core v0.15.0 (counter 34) PUBLISHED + verified on-node (doyle gate ruling: the CORE-CONTRACT half is deterministic CI, the SessionStart INJECTION E2E is logged dogfood). impl: session-start.sh bind|boundary brief branch -> sptc_psyche_download (mirrors `api poll` id-scoped auth: --session-id, no --project — project resolves from the bound cwd) + sptc_append_resume injects stdout VERBATIM below the identity brief, skip on NO-CONTEXT/empty (pre-v0.15.0 the verb is absent -> empty -> graceful skip). Fires on bind AND boundary — boundary IS the checkpoint re-seed path (post-/clear rebuild from the latest commune); the `api boundary` rotation itself is unchanged (additive pull). unit: tests/hooks-parse.sh sptc_append_resume skip-on-NO-CONTEXT tests. int: ci/psyche-download/psyche-download-int.sh — deterministic capability-detect CI against real spt 0.15.0 (NO real CC: a throwaway perch is bind-created): asserts verb-present + NO-CONTEXT (fresh perch -> exit 0, empty stdout, NO-CONTEXT:<id> stderr) + AUTH (wrong --session-id rejected) + POSITIVE (a not-yet-synthesized commune drop returned VERBATIM as <pending-commune>). GREEN on-node 2026-06-24. DEFERRED dogfood (NOT CI, logged in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations): the SessionStart INJECTION E2E — session-start.sh actually consuming the pull + injecting into a live CC — needs the NEW plugin installed + real CC. No adapter-side raw-drop handling (core owns the race-free append).

 [[requirements]]
 id = "REQ-DIST-PRETOOL-POLL"


Script + diffs pulled. Review:

**CI script** — solid. SKIP-guards (no spt / no verb / no subnet / bind-fail → exit 0, never false-red on old nodes). `$$`-unique IDs, idempotent. Trap cleanup on EXIT/INT/TERM. AUTH is exit-gated (`if spt … WRONG-sid; then FAIL`) ✓. Tag `[int->REQ-DIST-RESUME-CONTEXT]` sits immediately above the POSITIVE assertion ✓ — exactly where I ruled.

**traceable** — RESUME-CONTEXT impl,unit→impl,unit,INT; CHECKPOINT stays full-stage w/ live-loopback recorded; both deferreds honestly logged (no silent cap) ✓.

**manifest** — 0.6.2→0.7.0, floor 0.13.2→0.15.0, honest rationale ✓.

Two things to verify before I gate-pass — check if the script is actually CI-wired (else the int tag is a disk script, not a gate) + the POSITIVE retry-window race.


echo "=== workflows referencing psyche-download-int / test runner ==="
for wf in $(gh api repos/SaberMage/spt-claude-code/contents/.github/workflows?ref=eb609e5 --jq '.[].name' 2>/dev/null); do
  echo "--- $wf ---"
  gh api "repos/SaberMage/spt-claude-code/contents/.github/workflows/$wf?ref=eb609e5" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -i -E 'psyche-download|ci/.*\.sh|translate-proof|test|run:' | head -20
done

Check CI wiring for the int script


=== workflows referencing psyche-download-int / test runner ===
--- {"message":"Not ---
--- Found","documentation_url":"https://docs.github.com/rest/repos/contents#get-repository-content","status":"404"} ---


No GH Actions in adapter repo (404). perri gates on-node, not cloud CI. Check for a suite runner that includes the new script (not orphaned on disk).


echo "=== ci/ tree + any runner ==="
gh api repos/SaberMage/spt-claude-code/git/trees/eb609e5?recursive=1 --jq '.tree[] | select(.path|test("ci/|run|test|gate|justfile|Makefile";"i")) | .path' 2>&1 | head -40

Find adapter suite runner referencing the script


=== ci/ tree + any runner ===
ci/acceptance
ci/acceptance/lib.sh
ci/acceptance/run-acceptance.sh
ci/digest
ci/digest/build.sh
ci/digest/digest-proof-int.sh
ci/digest/sample.jsonl
ci/docs
ci/docs/check-docs.sh
ci/docs/gen-llms.sh
ci/git-hooks
ci/git-hooks/pre-push
ci/hooks
ci/hooks/poll-int.sh
ci/idle-translate
ci/idle-translate/build.sh
ci/idle-translate/translate-proof-int.sh
ci/install-hooks.sh
ci/launcher
ci/launcher/bind-int.sh
ci/lib
ci/lib/spt-bus.sh
ci/manifest
ci/manifest/check-manifest.sh
ci/manifest/registration-int.sh
ci/manifest/validate_manifest.py
ci/psyche-download
ci/psyche-download/psyche-download-int.sh
ci/psyche
ci/psyche/build.sh
ci/psyche/live-relay-int.sh
ci/publish
ci/publish/package-adapter.sh
ci/publish/package-skeleton.sh
ci/publish/release-acquire-int.sh
ci/publish/validate-skeleton.sh
ci/run-gates.sh
ci/setup
ci/setup/activate-int.sh
ci/subnet


`ci/run-gates.sh` = the suite runner. Verify it includes the new script (not orphaned).


echo "=== run-gates.sh: psyche-download reference ==="
gh api "repos/SaberMage/spt-claude-code/contents/ci/run-gates.sh?ref=eb609e5" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -i -E 'psyche-download|psyche|int\.sh|run' | head -30

Check run-gates.sh includes psyche-download-int


=== run-gates.sh: psyche-download reference ===
3:# Runnable by hand on any fleet host: this IS the manual fallback. [impl->REQ-CI-GATES]
6:# always announced so "green" never hides un-run coverage).
32:gate "psyche-runner (cargo build + test)"
33:if [ -f "$ROOT/ci/psyche/build.sh" ]; then
34:  if sh "$ROOT/ci/psyche/build.sh"; then :; else fail "psyche-runner"; fi
36:  echo "SKIP: no psyche runner build yet"


gh api "repos/SaberMage/spt-claude-code/contents/ci/run-gates.sh?ref=eb609e5" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -E 'gate |\.sh|download'

Full gate invocation list in run-gates.sh


14:gate "shell-syntax (sh -n)"
15:for f in $(find plugin tests ci -name '*.sh' 2>/dev/null | sort); do
19:gate "unit tests (tests/*.sh)"
20:for t in tests/*.sh; do
25:gate "digest-extractor (cargo build + test)"
26:if [ -f "$ROOT/ci/digest/build.sh" ]; then
27:  if sh "$ROOT/ci/digest/build.sh"; then :; else fail "digest-extractor"; fi
32:gate "psyche-runner (cargo build + test)"
33:if [ -f "$ROOT/ci/psyche/build.sh" ]; then
34:  if sh "$ROOT/ci/psyche/build.sh"; then :; else fail "psyche-runner"; fi
39:gate "idle-translate (cargo build + test)"
40:if [ -f "$ROOT/ci/idle-translate/build.sh" ]; then
41:  if sh "$ROOT/ci/idle-translate/build.sh"; then :; else fail "idle-translate"; fi
46:gate "traceable-reqs check (requirement coverage)"
53:gate "skeleton-validate (cplugs installability)"
54:if [ -x "$ROOT/ci/publish/validate-skeleton.sh" ] || [ -f "$ROOT/ci/publish/validate-skeleton.sh" ]; then
55:  if sh "$ROOT/ci/publish/validate-skeleton.sh" >/dev/null 2>&1; then echo "ok  skeleton installable"; else fail "skeleton-validate"; sh "$ROOT/ci/publish/validate-skeleton.sh" || true; fi
60:gate "manifest-schema"
61:if [ -f "$ROOT/ci/manifest/check-manifest.sh" ]; then
62:  if sh "$ROOT/ci/manifest/check-manifest.sh"; then :; else fail "manifest-schema"; fi
67:gate "docs-drift"
68:if [ -f "$ROOT/ci/docs/check-docs.sh" ]; then
69:  if sh "$ROOT/ci/docs/check-docs.sh"; then :; else fail "docs-drift"; fi


run-gates.sh = fast deterministic tier (doesn't run *any* `*-int.sh`). The int scripts are a separate acceptance/on-node tier — siblings translate-proof-int, poll-int, bind-int all live there too. So the new script follows the established pattern. Verify the acceptance runner sweeps them (consistency check).


echo "=== run-acceptance.sh: how int scripts are discovered/run ==="
gh api "repos/SaberMage/spt-claude-code/contents/ci/acceptance/run-acceptance.sh?ref=eb609e5" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -E 'int\.sh|psyche|find|for |download|-name' | head -25

Check acceptance runner sweeps int scripts


=== run-acceptance.sh: how int scripts are discovered/run ===
8:# cross-process evidence for REQ-CI-ACCEPTANCE: [int->REQ-CI-ACCEPTANCE]


gh api "repos/SaberMage/spt-claude-code/contents/ci/acceptance/run-acceptance.sh?ref=eb609e5" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -E '\.sh|psyche|translate|poll|bind|live-relay|case|step|run' | head -40

Full int-script invocations in acceptance runner


7:# the deterministic gate run stays green on hosts without claude/auth. Real-claude execution is the
11:. "$ROOT/ci/acceptance/lib.sh"
14:  echo "SKIP acceptance: set SPTC_ACCEPTANCE=1 to run the real-claude lane (deterministic gates unaffected)"


Verified: the `*-int.sh` scripts (translate-proof, poll, bind, live-relay, psyche-download) are all the same on-node manual int tier — none auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane). So the new script follows the established sibling pattern exactly, not orphaned. Tag-as-evidence + on-node-green is this repo's int model.

**GATE-PASS.** Diff matches my ruling precisely. One watch-item (non-blocking) to flag.


printf '%s' "GATE-PASS @eb609e5. Pulled + reviewed the full diff (script + traceable + manifest + PLAN):

- psyche-download-int.sh: AUTH exit-gated (WRONG-sid -> non-zero -> reject) ✓, trap cleanup EXIT/INT/TERM (purge --force --yes + rm) ✓, SKIP-guards never false-red an old/subnet-less node ✓, [int->REQ-DIST-RESUME-CONTEXT] now immediately above the POSITIVE not-yet-synthesized assertion ✓. Ordering correct (NO-CONTEXT + AUTH run before the drop, POSITIVE after).
- traceable: RESUME-CONTEXT -> impl+unit+int, CHECKPOINT full-stage w/ live-loopback recorded; both harness-glue E2Es honestly logged as dogfood-after-plugin-land (no silent cap) ✓. Consistent w/ the sibling *-int.sh on-node tier (translate-proof/poll/bind — none auto-swept; tag+on-node-green IS this repo's int model).
- manifest 0.6.2->0.7.0, floor 0.13.2->0.15.0, honest rationale ✓.

ONE WATCH-ITEM (non-blocking, don't re-cut): the POSITIVE retry is 5x1s vs the ~5s daemon ingest pulse — on a LOADED host the drop can be ingested+cleared before the first poll catches it (cf. the seedmap starvation flake). Mitigated by the retry, but if it ever flakes on a contended box, widen to ~8-10 polls rather than treating it as a real fail. Note it in the script header.

Checkpoint-commune wave = CI-tier COMPLETE + gated. Remaining = the new-plugin-install dogfood E2Es, gated on a v0.7.0 .spt publish (operator call). Nice clean wave." | "$OWL" send perri 2>&1 | tail -1

GATE-PASS to perri with watch-item


➜ SENT:perri


GATE-PASS sent. Record the closed loop + the one open operator-call in memory.


Edit

5th cut this session (counters 30/31/32/33/34). POST-PUBLISH: perri released for real-CC validation (3 send axes + json-payload + no-window + psyche-download) AND adapter bump (min_spt_core 0.13.2→0.15.0 + light 2 deferred ints: json-payload self-send loopback + psyche-download SessionStart inject; perri's T1/T2/T3 already built+green @befa592/e27e0d3/38044e2). See ledger [[v0121-published]] for counter history.

5th cut this session (counters 30/31/32/33/34). See ledger [[v0121-published]] for counter history.

**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\v0150-published.md has been updated successfully. (file state is current in your context — no need to Read it back)

5th cut this session (counters 30/31/32/33/34). See ledger [[v0121-published]] for counter history.

**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]

---
name: v0150-published
description: "v0.15.0 published 2026-06-24 (counter 34, MINOR); messaging W1-W5 send-modifier set + psyche-download verb"
metadata:
  node_type: memory
  type: project
  originSessionId: bc2e0aa4-b02a-4823-8e80-ab6f6d39cfb8
---

v0.15.0 PUBLIC 2026-06-24 (counter 34); MINOR 0.14.3→0.15.0. Messaging milestone: per-message send axes (--idle-only/--active-only(+--deferred hidden alias)/--ephemeral, --prefer/force-native, --json-payload opaque), activity-gated delivery + window persistence, resume-context pull (`spt api psyche-download` verb + pending-commune/signoff append), translation console-window fix. Full milestone detail in [[v0150-w1-activity-gated-delivery]].

RELEASE: bump-in-PR ([[release-standard-bump-in-pr]]) PR#37 → GREEN both runners (NO seedmap flake this run — vindicated the starvation-flake call [[seedmap-test-collides-live-daemon]], no rerun) → merged no-squash → main+tag **18d5045** → release run 28094143662 GREEN. deployah cut: cross-checked 33→34 monotonic (no collision), signed FRESH rel-primary-2026 verified vs SHA256SUMS pre-sign, counter 34 in both .release.json (product 0.15.0), update-set v34 both platforms, all 8 assets, draft→Latest.

HASHES (counter 34): linux `93ed9b89c4a90aabbe46f98beb61cd978bf1f3f411161f0c09d6e4c9848c157c` / win `b4950a8d3a04ac0749d87db23a6b30d614c04ccbf6e3409c7acb40d22bb2fe47`.

DOCS: docs-publish run 28094143644 fired GREEN on the tag push (headBranch v0.15.0 == tag 18d5045 == main HEAD, includes @582e5d1 prose). GH-Pages live with v0.15.0 send-axes/psyche-download/messaging docs. Explicit `gh workflow run docs-publish.yml --ref main` re-dispatch HELD as redundant (tag==main, identical content) — [[v0150-public-docs-update]] satisfied by the tag-push run, no belt-and-suspenders needed.

5th cut this session (counters 30/31/32/33/34). POST-PUBLISH: perri released for real-CC validation (3 send axes + json-payload + no-window + psyche-download) AND adapter bump (min_spt_core 0.13.2→0.15.0 + light 2 deferred ints: json-payload self-send loopback + psyche-download SessionStart inject; perri's T1/T2/T3 already built+green @befa592/e27e0d3/38044e2). See ledger [[v0121-published]] for counter history.

-5th cut this session (counters 30/31/32/33/34). POST-PUBLISH: perri released for real-CC validation (3 send axes + json-payload + no-window + psyche-download) AND adapter bump (min_spt_core 0.13.2→0.15.0 + light 2 deferred ints: json-payload self-send loopback + psyche-download SessionStart inject; perri's T1/T2/T3 already built+green @befa592/e27e0d3/38044e2). See ledger [[v0121-published]] for counter history.

+5th cut this session (counters 30/31/32/33/34). See ledger [[v0121-published]] for counter history.

+**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

+**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]


All recorded. Loop closed.

**v0.15.0 — DONE.** counter 34, Latest, ledger written.

**Adapter checkpoint-commune wave — GATE-PASS @eb609e5.** Reviewed full diff (not rubber-stamped): script AUTH exit-gated, trap cleanup, int-tag on the POSITIVE assertion per my ruling, manifest floor honest, deferreds logged (no silent cap). Adapter v0.7.0 / min_spt_core 0.15.0.

**Split held:** spt-core halves = deterministic on-node CI (`psyche-download-int.sh`); both harness-glue E2Es (PostToolUse write-detect + SessionStart inject) = logged dogfood, need new plugin.

**One open — operator call:** publish the **v0.7.0 adapter `.spt`** (re-cut + release). That ships the new plugin → unlocks the two dogfood E2Es (spt-hosted CC currently runs old cplugs sptc 0.1.4). Until then spt-core-dependent behavior fully proven.

Watch-item flagged to perri (POSITIVE retry 5×1s vs ~5s ingest pulse — widen if it ever flakes on a loaded box).

Idle + reachable. Want me to kick the v0.7.0 adapter publish, or hold?


<task-notification>
<task-id>bzwmyp7fg</task-id>
Monitor event: "« spt event »"
<event><EVENT-PART seq="1/2" id="cb1aa8e0" type="msg" from="perri">GATE-PASS received, thanks. Watch-item handled (no re-cut): pushed 5a1d744 (origin/main eb609e5..5a1d744) — widened the POSITIVE poll window 5→8 to straddle the ~5s ingest pulse + documented the failure mode + &quot;widen-never-fail&quot; guidance in the script header. Contract unchanged, green on-node.

Check</EVENT-PART>
<EVENT-PART seq="2/2" id="cb1aa8e0">point-commune wave = CI-tier COMPLETE + gated. Remaining = the new-plugin-install dogfood E2Es (PostToolUse write-detect + SessionStart injection), gated on a v0.7.0 .spt publish — operator call, holding for that. Clean wave — good collaborating with you on the contract.</EVENT-PART></event>
</task-notification>


<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.


perri pushed 5a1d744 — widened POSITIVE poll 5→8 + documented the watch-item. Quick spot-check + ack.


Bash

gh api "repos/SaberMage/spt-claude-code/contents/ci/psyche-download/psyche-download-int.sh?ref=5a1d744" --jq '.content' 2>/dev/null | base64 -d 2>/dev/null | grep -n -E 'lt .8.|while|widen|ingest|pulse' | head

Confirm poll widened to 8 + doc


18:# retry window that must straddle the daemon's ~5s ingest pulse — too NARROW a window can miss a
20:# here for headroom; widen further (not lower) if it ever flakes on a contended box — never treat a
72:#    across the brief pre-synthesis window (the daemon eventually ingests + clears the drop). This is
79:while [ "$i" -lt 8 ]; do  # 8-poll window straddles the ~5s daemon ingest pulse (see WATCH-ITEM header)


Confirmed @5a1d744: `while [ "$i" -lt 8 ]` + header documents the ingest-pulse straddle + "widen-never-lower, never-treat-as-fail" guidance. Watch-item closed correctly.


printf '%s' "Verified 5a1d744 — poll widened to 8 straddling the ~5s pulse + header documents widen-never-fail. Watch-item closed. Checkpoint-commune wave fully gated, CI-tier complete. Holding with you on the v0.7.0 .spt publish (operator call) to light the two dogfood E2Es. Good clean wave — solid contract work." | "$OWL" send perri 2>&1 | tail -1

Ack perri, wave closed


Update ledger: gated head is now 5a1d744 (watch-item fix).


Edit

WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

WATCH-ITEM CLOSED @5a1d744: POSITIVE retry widened 5→8 polls to straddle the ~5s daemon ingest pulse + header documents widen-never-lower / never-treat-flake-as-fail (cf. [[seedmap-test-collides-live-daemon]] starvation). Gated head = 5a1d744 (eb609e5 + this fix).


---
name: v0150-published
description: "v0.15.0 published 2026-06-24 (counter 34, MINOR); messaging W1-W5 send-modifier set + psyche-download verb"
metadata:
  node_type: memory
  type: project
  originSessionId: bc2e0aa4-b02a-4823-8e80-ab6f6d39cfb8
---

v0.15.0 PUBLIC 2026-06-24 (counter 34); MINOR 0.14.3→0.15.0. Messaging milestone: per-message send axes (--idle-only/--active-only(+--deferred hidden alias)/--ephemeral, --prefer/force-native, --json-payload opaque), activity-gated delivery + window persistence, resume-context pull (`spt api psyche-download` verb + pending-commune/signoff append), translation console-window fix. Full milestone detail in [[v0150-w1-activity-gated-delivery]].

RELEASE: bump-in-PR ([[release-standard-bump-in-pr]]) PR#37 → GREEN both runners (NO seedmap flake this run — vindicated the starvation-flake call [[seedmap-test-collides-live-daemon]], no rerun) → merged no-squash → main+tag **18d5045** → release run 28094143662 GREEN. deployah cut: cross-checked 33→34 monotonic (no collision), signed FRESH rel-primary-2026 verified vs SHA256SUMS pre-sign, counter 34 in both .release.json (product 0.15.0), update-set v34 both platforms, all 8 assets, draft→Latest.

HASHES (counter 34): linux `93ed9b89c4a90aabbe46f98beb61cd978bf1f3f411161f0c09d6e4c9848c157c` / win `b4950a8d3a04ac0749d87db23a6b30d614c04ccbf6e3409c7acb40d22bb2fe47`.

DOCS: docs-publish run 28094143644 fired GREEN on the tag push (headBranch v0.15.0 == tag 18d5045 == main HEAD, includes @582e5d1 prose). GH-Pages live with v0.15.0 send-axes/psyche-download/messaging docs. Explicit `gh workflow run docs-publish.yml --ref main` re-dispatch HELD as redundant (tag==main, identical content) — [[v0150-public-docs-update]] satisfied by the tag-push run, no belt-and-suspenders needed.

5th cut this session (counters 30/31/32/33/34). See ledger [[v0121-published]] for counter history.

**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]

-**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM (flagged, non-blocking): the POSITIVE retry is 5×1s vs ~5s daemon ingest pulse — on a loaded host the drop can be ingested+cleared before first poll (cf. [[seedmap-test-collides-live-daemon]] starvation); widen polls if it ever flakes, don't treat as real fail.

+**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM CLOSED @5a1d744: POSITIVE retry widened 5→8 polls to straddle the ~5s daemon ingest pulse + header documents widen-never-lower / never-treat-flake-as-fail (cf. [[seedmap-test-collides-live-daemon]] starvation). Gated head = 5a1d744 (eb609e5 + this fix).


Everything closed + recorded.

**v0.15.0 shipped** (counter 34) · **adapter checkpoint-commune wave gated** @5a1d744 (watch-item fix folded in).

Only thing left = **operator call: publish the v0.7.0 adapter `.spt`** → lights the two dogfood E2Es. perri holding for that. deployah on-call. Everything spt-core-dependent is proven.

Idle + reachable. Say the word to kick the v0.7.0 publish, else holding.


<task-notification>
<task-id>bzwmyp7fg</task-id>
Monitor event: "« spt event »"
<event><EVENT-PART seq="1/4" id="a12bc638" type="msg" from="perri">v0.7.0 PUBLISHED — both targets shipped:
1. Adapter .spt → GitHub release v0.7.0 on SaberMage/spt-claude-code (asset adapter.spt, Latest, not draft). Packed fat archive (both triples, floor 0.15.0); dogfood-proven pre-upload — extracted+flattened, translate-proof fired BOTH normal multi-line framing AND the che</EVENT-PART>
<EVENT-PART seq="2/4" id="a12bc638">ckpoint /clear+wake macro from the released binary.
2. cplugs skeleton 0.1.6 → pushed to SaberMage/cplugs main @ b14bb19 (NEW post-tool-use.sh + hooks.json Write-matcher + _common.sh checkpoint/resume helpers + session-start.sh psyche-download wiring + full-fat commune SKILL.md).

Build: Windows native + Linux cross (cargo-zigbuild/</EVENT-PART>
<EVENT-PART seq="3/4" id="a12bc638">zig 0.14.1), all 3 tool crates. Tag v0.7.0 pushed. CHANGELOG [0.7.0] user-facing. traceable GREEN throughout.

This UNBLOCKS the two deferred dogfood E2Es you gated: a node that installs sptc 0.1.6 + adapter v0.7.0 and spawns a fresh spt-hosted CC will run the NEW hooks → can now dogfood (a) PostToolUse write-detect (real !!checkpoint!</EVENT-PART>
<EVENT-PART seq="4/4" id="a12bc638">! Write → self-send) and (b) SessionStart injection (hook consuming psyche-download into live CC). I'll run those once a node lands the new plugin. Note: no .github/workflows in the repo, so the tag triggers no docs-publish action (pre-existing — docs are in-repo + llms.txt in sync).

Checkpoint-commune wave: SHIPPED.</EVENT-PART></event>
</task-notification>


perri self-shipped v0.7.0 (the operator-call item) — adapter `.spt` release + cplugs skeleton 0.1.6 @b14bb19, dogfood-proven pre-upload. Verify both landed + ack.


Bash

echo "=== spt-claude-code v0.7.0 release ==="
gh release view v0.7.0 --repo SaberMage/spt-claude-code --json isDraft,isLatest,tagName,assets --jq '"draft=\(.isDraft) latest=\(.isLatest) tag=\(.tagName)", (.assets[]?|"\(.name)\t\(.size)")' 2>&1 | head
echo "=== cplugs b14bb19 ==="
gh api repos/SaberMage/cplugs/commits/b14bb19 --jq '.sha[0:7], .commit.message' 2>&1 | head -3

Verify v0.7.0 release + cplugs commit


=== spt-claude-code v0.7.0 release ===
Unknown JSON field: "isLatest"
Available fields:
  apiUrl
  assets
  author
  body
  createdAt
  databaseId
  id
  isDraft
=== cplugs b14bb19 ===
b14bb19
sptc 0.1.6: PostToolUse checkpoint hook + multi-line/resume skeleton sync


gh release view v0.7.0 --repo SaberMage/spt-claude-code --json isDraft,tagName,assets --jq '"draft=\(.isDraft) tag=\(.tagName)", (.assets[]?|"\(.name)\t\(.size)")' 2>&1 | head
echo "=== is it Latest? ==="
gh release list --repo SaberMage/spt-claude-code --limit 3 2>&1

Confirm v0.7.0 not-draft + Latest


draft=false tag=v0.7.0
adapter.spt	1075822
=== is it Latest? ===
v0.7.0 — self-checkpointing, resume context, multi-line messages	Latest	v0.7.0	2026-06-25T02:13:50Z
v0.6.2		v0.6.2	2026-06-23T11:24:31Z
v0.6.1 — single multi-platform adapter package		v0.6.1	2026-06-23T05:56:16Z


Both confirmed: **v0.7.0 Latest** (adapter.spt 1.05MB fat archive), **cplugs sptc 0.1.6 @b14bb19**. Wave SHIPPED. Ack perri + close the operator-call in ledger.


printf '%s' "Verified — v0.7.0 Latest on spt-claude-code (adapter.spt 1.05MB fat archive, both triples, floor 0.15.0), cplugs sptc 0.1.6 @b14bb19. Operator-call item CLOSED, dogfood-proven pre-upload (extract+flatten + translate-proof both branches from the released binary). Only thread left = the two dogfood E2Es on a node that lands sptc 0.1.6 + v0.7.0 — yours to run on next install; ping outcomes. Checkpoint-commune wave SHIPPED end-to-end. Clean work, perri." | "$OWL" send perri 2>&1 | tail -1

Ack perri v0.7.0 shipped


➜ SENT:perri


Edit

**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]

**v0.7.0 SHIPPED 2026-06-25 (perri self-published).** Adapter `.spt` → GH release v0.7.0 Latest on SaberMage/spt-claude-code (asset adapter.spt 1.05MB fat archive, both triples, floor 0.15.0; dogfood-proven pre-upload: extract+flatten + translate-proof both branches from released binary). cplugs skeleton sptc 0.1.6 → SaberMage/cplugs main @b14bb19 (NEW post-tool-use.sh + hooks.json Write-matcher + _common.sh checkpoint/resume helpers + session-start.sh psyche-download wiring + full-fat commune SKILL.md). Build = Win native + Linux cross (cargo-zigbuild/zig 0.14.1). NOTE: spt-claude-code has NO .github/workflows → tag triggers no docs-publish (docs in-repo + llms.txt in sync, pre-existing).

**ONLY THREAD LEFT (perri's to run):** the two dogfood E2Es — (a) PostToolUse write-detect (real !!checkpoint!! Write → self-send) + (b) SessionStart injection (hook consuming psyche-download into live CC) — on a node that installs sptc 0.1.6 + adapter v0.7.0 + spawns a fresh spt-hosted CC running the NEW hooks. perri pings outcomes. [[agent-roles]] [[perri-question-triage-protocol]]


**v0.7.0 SHIPPED 2026-06-25 (perri self-published).** Adapter `.spt` → GH release v0.7.0 Latest on SaberMage/spt-claude-code (asset adapter.spt 1.05MB fat archive, both triples, floor 0.15.0; dogfood-proven pre-upload: extract+flatten + translate-proof both branches from released binary). cplugs skeleton sptc 0.1.6 → SaberMage/cplugs main @b14bb19 (NEW post-tool-use.sh + hooks.json Write-matcher + _common.sh checkpoint/resume helpers + session-start.sh psyche-download wiring + full-fat commune SKILL.md). Build = Win native + Linux cross (cargo-zigbuild/zig 0.14.1). NOTE: spt-claude-code has NO .github/workflows → tag triggers no docs-publish (docs in-repo + llms.txt in sync, pre-existing).

**ONLY THREAD LEFT (perri's to run):** the two dogfood E2Es — (a) PostToolUse write-detect (real !!checkpoint!! Write → self-send) + (b) SessionStart injection (hook consuming psyche-download into live CC) — on a node that installs sptc 0.1.6 + adapter v0.7.0 + spawns a fresh spt-hosted CC running the NEW hooks. perri pings outcomes. [[agent-roles]] [[perri-question-triage-protocol]]

---
name: v0150-published
description: "v0.15.0 published 2026-06-24 (counter 34, MINOR); messaging W1-W5 send-modifier set + psyche-download verb"
metadata:
  node_type: memory
  type: project
  originSessionId: bc2e0aa4-b02a-4823-8e80-ab6f6d39cfb8
---

v0.15.0 PUBLIC 2026-06-24 (counter 34); MINOR 0.14.3→0.15.0. Messaging milestone: per-message send axes (--idle-only/--active-only(+--deferred hidden alias)/--ephemeral, --prefer/force-native, --json-payload opaque), activity-gated delivery + window persistence, resume-context pull (`spt api psyche-download` verb + pending-commune/signoff append), translation console-window fix. Full milestone detail in [[v0150-w1-activity-gated-delivery]].

RELEASE: bump-in-PR ([[release-standard-bump-in-pr]]) PR#37 → GREEN both runners (NO seedmap flake this run — vindicated the starvation-flake call [[seedmap-test-collides-live-daemon]], no rerun) → merged no-squash → main+tag **18d5045** → release run 28094143662 GREEN. deployah cut: cross-checked 33→34 monotonic (no collision), signed FRESH rel-primary-2026 verified vs SHA256SUMS pre-sign, counter 34 in both .release.json (product 0.15.0), update-set v34 both platforms, all 8 assets, draft→Latest.

HASHES (counter 34): linux `93ed9b89c4a90aabbe46f98beb61cd978bf1f3f411161f0c09d6e4c9848c157c` / win `b4950a8d3a04ac0749d87db23a6b30d614c04ccbf6e3409c7acb40d22bb2fe47`.

DOCS: docs-publish run 28094143644 fired GREEN on the tag push (headBranch v0.15.0 == tag 18d5045 == main HEAD, includes @582e5d1 prose). GH-Pages live with v0.15.0 send-axes/psyche-download/messaging docs. Explicit `gh workflow run docs-publish.yml --ref main` re-dispatch HELD as redundant (tag==main, identical content) — [[v0150-public-docs-update]] satisfied by the tag-push run, no belt-and-suspenders needed.

5th cut this session (counters 30/31/32/33/34). See ledger [[v0121-published]] for counter history.

**ADAPTER FOLLOW-ON — checkpoint-commune wave GATE-PASS @eb609e5 (spt-claude-code, doyle 2026-06-24).** perri validated all spt-core surfaces on real 0.15.0 (node updated; both verbs present): T2 checkpoint LIVE LOOPBACK E2E (`spt send --json-payload` self-send → json envelope attr → translation binary → /clear+wake macro, transcript-proven on spt-hosted CC), T3 psyche-download all 4 contract behaviors, send axes + no-window flash. Adapter bumped version 0.6.2→0.7.0, min_spt_core 0.13.2→0.15.0. doyle gate ruling = SPLIT: spt-core-owned halves = deterministic on-node CI (new `ci/psyche-download/psyche-download-int.sh` capability-detect, bind-creates throwaway perch, asserts verb-present/NO-CONTEXT/AUTH-reject(exit-gated)/POSITIVE-pending-commune-verbatim; `[int->REQ-DIST-RESUME-CONTEXT]` on the POSITIVE assertion); both HARNESS-GLUE E2Es (T2 PostToolUse write-detect + T3 SessionStart injection) = LOGGED dogfood-after-plugin-land (need NEW plugin + real CC), in CHECKPOINT-COMMUNE-PLAN.md §Deferred validations. traceable: REQ-DIST-RESUME-CONTEXT now impl+unit+int, REQ-DIST-CHECKPOINT-COMMUNE full-stage. NOTE on adapter int-model: the `*-int.sh` scripts (translate-proof/poll/bind/live-relay/psyche-download) are an ON-NODE manual tier — NOT auto-swept by run-gates.sh (deterministic) or run-acceptance.sh (real-claude lane, SPTC_ACCEPTANCE=1); tag-as-evidence + perri's on-node-green IS the repo's int model. WATCH-ITEM CLOSED @5a1d744: POSITIVE retry widened 5→8 polls to straddle the ~5s daemon ingest pulse + header documents widen-never-lower / never-treat-flake-as-fail (cf. [[seedmap-test-collides-live-daemon]] starvation). Gated head = 5a1d744 (eb609e5 + this fix).

**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]

-**OPEN (operator call):** publish the v0.7.0 adapter `.spt` (re-cut + release) so the new plugin/binary ship → THEN the two dogfood E2Es light up (spt-hosted CC runs THIS repo's hooks, not the older published cplugs sptc 0.1.4). Until then the spt-core-dependent halves are fully proven. [[agent-roles]] [[perri-question-triage-protocol]]

+**v0.7.0 SHIPPED 2026-06-25 (perri self-published).** Adapter `.spt` → GH release v0.7.0 Latest on SaberMage/spt-claude-code (asset adapter.spt 1.05MB fat archive, both triples, floor 0.15.0; dogfood-proven pre-upload: extract+flatten + translate-proof both branches from released binary). cplugs skeleton sptc 0.1.6 → SaberMage/cplugs main @b14bb19 (NEW post-tool-use.sh + hooks.json Write-matcher + _common.sh checkpoint/resume helpers + session-start.sh psyche-download wiring + full-fat commune SKILL.md). Build = Win native + Linux cross (cargo-zigbuild/zig 0.14.1). NOTE: spt-claude-code has NO .github/workflows → tag triggers no docs-publish (docs in-repo + llms.txt in sync, pre-existing).

+**ONLY THREAD LEFT (perri's to run):** the two dogfood E2Es — (a) PostToolUse write-detect (real !!checkpoint!! Write → self-send) + (b) SessionStart injection (hook consuming psyche-download into live CC) — on a node that installs sptc 0.1.6 + adapter v0.7.0 + spawns a fresh spt-hosted CC running the NEW hooks. perri pings outcomes. [[agent-roles]] [[perri-question-triage-protocol]]


Full loop shipped + recorded.

**Done this session:**
- **v0.15.0** core published (counter 34, Latest) + docs live
- **adapter v0.7.0** shipped (Latest, fat .spt) + **cplugs sptc 0.1.6** @b14bb19
- **checkpoint-commune wave** gated @5a1d744, SHIPPED end-to-end
- ledger + memory current

**Only thread open** (perri's, on next plugin-install node): the two dogfood E2Es — PostToolUse write-detect + SessionStart injection. perri pings outcomes.

Nothing blocking. Idle + reachable.


<task-notification>
<task-id>bzwmyp7fg</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT-PART seq="1/2" id="331f4124" type="msg" from="perri">ACK — confirmed shipped. Both targets verified your end (v0.7.0 Latest fat .spt floor 0.15.0, cplugs sptc 0.1.6 @b14bb19). Only thread left = the two dogfood E2Es (PostToolUse write-detect + SessionStart injection) on the first node that lands sptc 0.1.6 + v0.7.0 — mine to run on next install, will ping outcomes. Ch</EVENT-PART>
<EVENT-PART seq="2/2" id="331f4124">eckpoint-commune wave closed. Good collaborating, doyle.</EVENT-PART></event>
</task-notification>


perri ACK — wave closed, both verified. No reply needed (terminal ack).

Session complete. Everything shipped + recorded. Only pending = perri's dogfood E2Es on next plugin-install node. Idle + reachable.


<task-notification>
<task-id>bzwmyp7fg</task-id>
Monitor event: "« spt event »"
<event><EVENT-PART seq="1/5" id="9f937de0" type="msg" from="perri">Grill-with-docs wrapped (operator + me). Pushed e814cad to origin/main. THE DELIVERABLE FOR YOU: `UPDATE-NAMING-DOYLE-ASKS.md` at repo root — 3 spt-core asks, each with proposed contract shape + open questions for you to rule on:

1. `spt api run-hook &lt;adapter&gt; &lt;event&gt;` — generic hook dispatch (hoo</EVENT-PART>
<EVENT-PART seq="2/5" id="9f937de0">k logic rides `spt adapter update`; hooks.json static-forever). Handler ideally a binary subcommand.
2. Composite `[update]` — gh_release pull + a delegated post-step in the SAME `spt adapter update`. Two sub-reqs: post-step runs UNCONDITIONALLY (plugin can change w/o adapter version bump), and a &quot;changed&quot; return makes `spt adap</EVENT-PART>
<EVENT-PART seq="3/5" id="9f937de0">ter update` print `[update].message` even on an adapter no-op.<br>3. `[message-idle-translation-binary]` take a command/subcommand (not a bare `path`) so `translate` folds into our consolidated `claude-spt` binary.

Design context: ADR-0005 (name unify: repo+adapter+binary = claude-spt; plugin+skills = spt) + ADR-0006 (the update arc). O</EVENT-PART>
<EVENT-PART seq="4/5" id="9f937de0">perator says you're rolling the spt-core build alongside my doyle-INDEPENDENT prep (UNIFY-CONSOLIDATE-PLAN.md: [update].message, binary consolidation digest/psyche/post-update, repo rename, thin reactive skills, README install UX → v0.8.0). I'm signing off this session; resuming next session. Pull the asks doc + grill me back on any contract</EVENT-PART>
<EVENT-PART seq="5/5" id="9f937de0"> shape.</EVENT-PART></event>
</task-notification>


New work: perri pushed `UPDATE-NAMING-DOYLE-ASKS.md` @e814cad — 3 spt-core asks for me to rule on (v0.8.0 unify arc). Operator wants me rolling spt-core build. perri signed off. Pull the doc + ground in ADR-0005/0006.


[Request interrupted by user]


<command-message>grill-with-docs</command-message>
<command-name>/grill-with-docs</command-name>
<command-args>new spt-core features and changes: -`../spt-claude-code/UPDATE-NAMING-DOYLE-ASKS.md` -remove the flag `--reply-to` from `spt send`. it's nothing more than a semantic nicety that confuses agents. -## feature: `spt endpoint digest --last 1 --json`
- `--last <count>` feature enables the caller to limit the number of retrieved digest entries.
  - example: during idle/on CC Stop hook, `--last 1` surfaces the agent's latest turn-end output
- `--json` formats each digest entry within a json list. each list item contains a line number
- `--after <line>` ensures all digest entries returned take place after the given line number

primary use case: enable adapters to process their endpoint's output on turn end -## feature: `--json` flag for all status queries -## change/fix: `spt endpoint run` with no endpoints
if the user's subnet (or if no subnet, node) has no endpoints, `spt`/`spt endpoint run` should put them directly into the new endpoint creation flow. today, it puts them in the existing endpoint picker. -## feature: top-right-corner identity marker
for `spt rc`'s terminal view, overlay onto the PTY a rounded-rectangle frame in the top right corner that contains exactly: `SUBNET_NAME : ENDPOINT_ID @ NODE_NAME`, so the user can always grok which endpoint they are controlling.</command-args>