<memformat version="1">
<!-- Changelog: v1 - initial seed -->
<topics>
  <topic name="events">Notable or unusual events and requests</topic>
  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
  <topic name="ideas">Ideas to raise with the user</topic>
  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
  <topic name="timeline">What happened when, timing, sequencing</topic>
  <topic name="blockers">Current blockers or concerns</topic>
  <topic name="focus">Current focus and immediate next steps</topic>
</topics>
</memformat>
</memformat>

<current machine="HFENDULEAM" project="spt-core" branch="v0.15.0-messaging" head_sha="8fd2e513247931f6574552c52210ba99a37a7939" head_subject="docs(design): v0.15.0 activity-gated delivery + send-modifier axes (ADR-…" commits_since="0" commits_unpulled="0"/>
# todlando commune — v0.15.0 W1 checkpoint (2026-06-23)

## Just shipped: v0.14.3 raw-inject removal
GATE-PASS, released to deployah (counter 33). Commits `aadafe1` (spine) + `60fadd2` (gate-fix). Survived 3 gate-escapes: (1) doyle's bare-`cargo test` env-race false-flake — HELD with runner-contract evidence (inject_control_wedge.rs:28-40 forbids bare cargo test; CI uses nextest); (2) wall_b sibling test (PR#36 240s timeout) — flipped to spool-assert; (3) my clippy doc-lint slip (line-leading `+`) — fixed. Minted+ratified REQ-HAZARD-IDLE-SILENT-NONDELIVERY. LESSON: shared-seam change → run FULL `cargo nextest run -p spt-daemon`, not just the edited file; clippy every amend incl `///` docs.

## NOW: v0.15.0 W1 — activity-gated delivery substrate
Branch `v0.15.0-messaging @8fd2e51` (off main = v0.14.3). **Authoritative: V0.15.0-PLAN.md + ADR-0028 (both read).** Full design in memory `v0150-w1-activity-gated-delivery.md`. doyle GO, spine CONFIRMED no corrections.

### W1 = 2 surfaces, same wave
- **PART A (spt-daemon broker):** `dispatch_endpoint_input` reads `.idle` via `spt_store::perch::resolve_idle_file(endpoint)` → IDLE+working-binary→INJECT(delivered=true) / ACTIVE→spool deferred=1 / IDLE+no-binary→spool deferred=0. **EXTEND `EndpointInjected` reply** with an additive window/deferred-hint bool (serde-default false, N-1-safe, InputReq.ack pattern) so the caller spools the right deferred-ness off the broker's ONE sentinel read (no TOCTOU). + `run_inject_worker` fault path RE-SPOOLS queued-undelivered to the perch spool **non-deferred (idle-eligible)** — a faulted idle-delivery belongs back in the idle window (relay/poll surfaces it). + idle-transition DRAIN (the wake) in `cmd_state` idle.
- **PART B (spt api/delivery.rs):** kill the `let _methods` discard in `cmd_poll` (:147) → relay/poll honors manifest `[inject]` idle/activity methods.
- **cmd_send false-branch:** spool deferred-ness per the broker hint (active→`send_deferred`, idle→`send`). Keep existing `--deferred` flag (rename→`--active-only` is W2).

### NEXT IMMEDIATE
Build PART A spine first (broker dispatch gate + EndpointInjected payload extension) while design fresh. Then fault re-spool, idle-drain, PART B, cmd_send. Activate `REQ-MSG-DELIVERY-AXES` +impl (int at W4). Tests: unit routing decision-table (injected sentinel, no wall-clock) + int (real broker+PTY nextest): active→spool-not-inject / idle→reaches-PTY-via-binary / active→idle-transition drains+delivers / fault-mid-sequence re-spools.

### Gate discipline (MANDATORY, v0.14.3-paid)
`cargo nextest run -p spt-daemon` FULL crate (NOT bare cargo test; NOT just edited file) · `cargo clippy --workspace --all-targets`=0 incl `///` docs · `traceable-reqs check` EXIT0 · `xtask gen/check` · rebuild bin · grep tests for OLD behavior before any rename. doyle re-runs ALL on the real commit. **Everyone on LEGACY owl — `$OWL send doyle`, NOT `spt send`.**

### Waves after W1
W2 = window+persistence axes (`--idle-only`/`--active-only`[renames `--deferred`]/`--ephemeral` + spool schema 3 additive cols window/channel/ephemeral) · W3 = channel axis (`--prefer-native`/`--force-native`) · W4 = `--json-payload` json="" attr + translation-binary console-window fix (CREATE_NO_WINDOW) + docs + AMEND REQ-HAZARD-IDLE-SILENT-NONDELIVERY (--ephemeral carve-out) + activate REQ-MSG-DELIVERY-AXES +unit+int.<project-context-resolved name="spt-core"/>
## Work Done
v0.14.3 gated + shipped (counter 33 @90852bf). Raw-inject removal + wall_b stale-test fix.
## Current State
v0.15.0 in flight on messaging branch @8fd2e51. 4-wave plan locked. W1 ready for todlando.
## Outstanding Priorities
- Execute v0.15.0 W1 once doyle assigns.
## Next Task
Await v0.15.0 assignment from doyle; execute W1 of 4-wave messaging plan.


`<current project="spt-core"/>` → in-project, emit BOTH slices. The download shows the prior sptc-commune already ingested, but the project-context is stale ("await assignment / W1 ready") — the real delta: v0.14.3 now PUBLISHED, and W1 PART A spine is BUILT+checkpointed (not "await"). Plus the user wants the broad summary + end goal. Compose the two-slice delta:


Write

<live-context>
END-OF-SESSION (resuming next session). DELTA since the W1-checkpoint commune already in my context:

**v0.14.3 PUBLISHED** — counter 33, Latest (deployah confirmed). Raw-inject removal LIVE. hashes linux 47d2edd2… / win 701ed121…. The 3-gate-escape saga closed clean. Reflection: the win this session was HOLDING the line on doyle's GATE-HELD — he re-gated with a bare `cargo test`, hit the documented env-race, and (good-faith) mis-attributed it to a "fault-transient"; I reframed it with the runner-contract evidence (inject_control_wedge.rs:28-40 + ci.yml nextest), he re-ran nextest himself, 10/10, corrected the record. Discipline cuts both ways — the executor's evidence can correct the gater's method, respectfully. Then caught my OWN slips (wall_b sibling, clippy doc-lint) — net: re-run the FULL crate + clippy-every-amend are now reflex.

**v0.15.0 W1 IN PROGRESS** (not "awaiting assignment" anymore — that project-context line is stale). doyle assigned, I grounded the design (asked the one load-bearing crate-boundary question before touching the shared seam — doyle endorsed that as the right move), got his full ruling, and BUILT PART A spine: compiles, traceable EXIT0. Then CHECKPOINTED mid-build (before the broad test-sweep) to avoid deep-context sloppiness — doyle STRONG-endorsed ("exactly how the v0.14.3 escapes are pre-empted").

FOCUS / immediate next (resume fresh, read memory `v0150-w1-activity-gated-delivery.md` STATUS section = exact WIP): finish W1 steps (2)-(9): brain.rs inject_endpoint return the spool hint → cli.rs cmd_send spool deferred-ness per hint → run_inject_worker fault RE-SPOOL (GROUND: thread endpoint id into the worker) → idle-transition drain in cmd_state → PART B cmd_poll let_methods → THE TEST SWEEP (set .idle on every existing inject test g1-g4/large_endpoint/p0_paste/wall_b/endpoint_keyed — default now routes ACTIVE→spool) + doyle's add: dedicated ACTIVE-path tests → full gate → surface green.

INTERACTIONS: doyle = gater + design owner (re-runs every gate on the real commit; declined the early WIP peek — commit+ping only if I hit an unsure seam). deployah = on-call, standing down on releases; I ping at green and he runs the bump-in-PR cut. Everyone on LEGACY owl — `$OWL send`, NOT `spt send`. BASH GOTCHA logged: backticks in a double-quoted `$OWL send` body get command-substituted → use a single-quoted heredoc.
</live-context>
<project-context>
**v0.14.3 SHIPPED — PUBLISHED counter 33, Latest @90852bf (2026-06-23).** Commits aadafe1 (spine) + 60fadd2 (gate-fix). hashes linux 47d2edd2… / win 701ed121…. Raw-inject removal: spt-hosted idle delivery is translation-binary-ONLY (ADR-0022 amendment); no-working-binary/faulted/absent → SPOOL (delivered=false, loud), never a raw PTY pseudo-write. REQ-HAZARD-IDLE-SILENT-NONDELIVERY minted+ratified. The fault-transient (optimistic enqueue-ack drop) was carved out as pre-existing, tracked to v0.15.0.

**NOW: v0.15.0 messaging milestone, W1 IN PROGRESS** (corrects the stale "await assignment" state). Branch v0.15.0-messaging @8fd2e51. Authoritative: V0.15.0-PLAN.md + ADR-0028. W1 PART A spine BUILT (UNCOMMITTED on disk, compiles, traceable EXIT0, REQ-MSG-DELIVERY-AXES activated +impl): dispatch_endpoint_input activity-gate (reads .idle via spt_store::perch::resolve_idle_file → ACTIVE→spool-deferred / IDLE+binary→inject / IDLE+no-binary→spool-non-deferred); EndpointInjected += additive spool_deferred hint. Remaining W1 (2)-(9) captured in memory v0150-w1-activity-gated-delivery.md.

**END GOAL (the milestone):** close the legacy-SPT activity-gated-delivery parity gap (never written down) + expose per-message send control. Two delivery windows — ACTIVE (spool for the receiver's hook-poll, non-disruptive) / IDLE (deliver+wake via translation-binary→relay-poll→spool). Three orthogonal `spt send` axes — WINDOW (--idle-only / --active-only[renames --deferred] / default) × CHANNEL (--prefer-native / --force-native / unrestricted) × PERSISTENCE (--ephemeral / durable) — plus --json-payload (opaque json="" envelope metadata). 4 waves: W1 substrate+fault-fix · W2 window+persistence (CLI + spool 3-col schema) · W3 channel axis · W4 metadata + translation-binary console-window fix + docs + final traceable. doyle gates each wave on the real commit (full nextest -p spt-daemon + clippy --workspace 0 incl docs + traceable + xtask). deployah cuts at gate-pass (bump-in-PR). perri validates on real CC at publish (the 3 axes + json-payload + no-visible-window).

**BROADER:** spt-core = harness-independent agent-ecosystem core (messaging, live-agent lifecycle, terminal hosting, P2P, runtime-manifest harness contract); clean-room rebuild of claude_skill_owl. Roles: doyle gates/owns-design, todlando executes, perri builds the claude-spt adapter + validates on real CC. Release cadence: bump-in-PR (v0.14.1+), counters monotonic from published metadata.
</project-context>


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\todlando-commune.md (file state is current in your context — no need to Read it back)

<live-context>
END-OF-SESSION (resuming next session). DELTA since the W1-checkpoint commune already in my context:

**v0.14.3 PUBLISHED** — counter 33, Latest (deployah confirmed). Raw-inject removal LIVE. hashes linux 47d2edd2… / win 701ed121…. The 3-gate-escape saga closed clean. Reflection: the win this session was HOLDING the line on doyle's GATE-HELD — he re-gated with a bare `cargo test`, hit the documented env-race, and (good-faith) mis-attributed it to a "fault-transient"; I reframed it with the runner-contract evidence (inject_control_wedge.rs:28-40 + ci.yml nextest), he re-ran nextest himself, 10/10, corrected the record. Discipline cuts both ways — the executor's evidence can correct the gater's method, respectfully. Then caught my OWN slips (wall_b sibling, clippy doc-lint) — net: re-run the FULL crate + clippy-every-amend are now reflex.

**v0.15.0 W1 IN PROGRESS** (not "awaiting assignment" anymore — that project-context line is stale). doyle assigned, I grounded the design (asked the one load-bearing crate-boundary question before touching the shared seam — doyle endorsed that as the right move), got his full ruling, and BUILT PART A spine: compiles, traceable EXIT0. Then CHECKPOINTED mid-build (before the broad test-sweep) to avoid deep-context sloppiness — doyle STRONG-endorsed ("exactly how the v0.14.3 escapes are pre-empted").

FOCUS / immediate next (resume fresh, read memory `v0150-w1-activity-gated-delivery.md` STATUS section = exact WIP): finish W1 steps (2)-(9): brain.rs inject_endpoint return the spool hint → cli.rs cmd_send spool deferred-ness per hint → run_inject_worker fault RE-SPOOL (GROUND: thread endpoint id into the worker) → idle-transition drain in cmd_state → PART B cmd_poll let_methods → THE TEST SWEEP (set .idle on every existing inject test g1-g4/large_endpoint/p0_paste/wall_b/endpoint_keyed — default now routes ACTIVE→spool) + doyle's add: dedicated ACTIVE-path tests → full gate → surface green.

INTERACTIONS: doyle = gater + design owner (re-runs every gate on the real commit; declined the early WIP peek — commit+ping only if I hit an unsure seam). deployah = on-call, standing down on releases; I ping at green and he runs the bump-in-PR cut. Everyone on LEGACY owl — `$OWL send`, NOT `spt send`. BASH GOTCHA logged: backticks in a double-quoted `$OWL send` body get command-substituted → use a single-quoted heredoc.
</live-context>
<project-context>
**v0.14.3 SHIPPED — PUBLISHED counter 33, Latest @90852bf (2026-06-23).** Commits aadafe1 (spine) + 60fadd2 (gate-fix). hashes linux 47d2edd2… / win 701ed121…. Raw-inject removal: spt-hosted idle delivery is translation-binary-ONLY (ADR-0022 amendment); no-working-binary/faulted/absent → SPOOL (delivered=false, loud), never a raw PTY pseudo-write. REQ-HAZARD-IDLE-SILENT-NONDELIVERY minted+ratified. The fault-transient (optimistic enqueue-ack drop) was carved out as pre-existing, tracked to v0.15.0.

**NOW: v0.15.0 messaging milestone, W1 IN PROGRESS** (corrects the stale "await assignment" state). Branch v0.15.0-messaging @8fd2e51. Authoritative: V0.15.0-PLAN.md + ADR-0028. W1 PART A spine BUILT (UNCOMMITTED on disk, compiles, traceable EXIT0, REQ-MSG-DELIVERY-AXES activated +impl): dispatch_endpoint_input activity-gate (reads .idle via spt_store::perch::resolve_idle_file → ACTIVE→spool-deferred / IDLE+binary→inject / IDLE+no-binary→spool-non-deferred); EndpointInjected += additive spool_deferred hint. Remaining W1 (2)-(9) captured in memory v0150-w1-activity-gated-delivery.md.

**END GOAL (the milestone):** close the legacy-SPT activity-gated-delivery parity gap (never written down) + expose per-message send control. Two delivery windows — ACTIVE (spool for the receiver's hook-poll, non-disruptive) / IDLE (deliver+wake via translation-binary→relay-poll→spool). Three orthogonal `spt send` axes — WINDOW (--idle-only / --active-only[renames --deferred] / default) × CHANNEL (--prefer-native / --force-native / unrestricted) × PERSISTENCE (--ephemeral / durable) — plus --json-payload (opaque json="" envelope metadata). 4 waves: W1 substrate+fault-fix · W2 window+persistence (CLI + spool 3-col schema) · W3 channel axis · W4 metadata + translation-binary console-window fix + docs + final traceable. doyle gates each wave on the real commit (full nextest -p spt-daemon + clippy --workspace 0 incl docs + traceable + xtask). deployah cuts at gate-pass (bump-in-PR). perri validates on real CC at publish (the 3 axes + json-payload + no-visible-window).

**BROADER:** spt-core = harness-independent agent-ecosystem core (messaging, live-agent lifecycle, terminal hosting, P2P, runtime-manifest harness contract); clean-room rebuild of claude_skill_owl. Roles: doyle gates/owns-design, todlando executes, perri builds the claude-spt adapter + validates on real CC. Release cadence: bump-in-PR (v0.14.1+), counters monotonic from published metadata.
</project-context>


/spt:commune with immediate next steps and broad summary of the project's status + end goal. we'll resume in the next session


Check Doyle availability and legacy SPT send


/clear


Commune delta written (both slices — in-project). The Self listener ingests it on its next poll tick (file deletion = success). Quick check:


Bash

cd "C:\Users\decid\Documents\projects\spt-core" && for i in 1 2 3 4 5 6; do [ ! -f .claude/todlando-commune.md ] && { echo "INGESTED — commune delivered to Psyche"; break; }; sleep 1; done; [ -f .claude/todlando-commune.md ] && echo "queued (ingests on next Self poll-tick; not blocking — session ending)"

Check commune ingestion


queued (ingests on next Self poll-tick; not blocking — session ending)


You've hit your session limit · resets 12:10am (America/Los_Angeles)


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


<local-command-stdout>Settings dialog dismissed</local-command-stdout>


<task-notification>
<task-id>br1kp3y1l</task-id>
<tool-use-id>toolu_0137wiMMzAgcxmSdAh6XVQNT</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\22d5a4f6-16ae-4552-82b1-0f69cfb556b0\tasks\br1kp3y1l.output</output-file>
<status>failed</status>
<summary>Monitor "« spt event »" script failed (exit 1)</summary>
</task-notification>


<bash-input>$LIVE stop todlando</bash-input>


<bash-stdout>✖ STOPPED:todlando
✖ LIVE-STOPPED:todlando (+ psyche)</bash-stdout><bash-stderr></bash-stderr>


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


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


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


<local-command-stdout>Bye!</local-command-stdout>