---
name: v0150-w5-resume-context-pull
description: "v0.15.0 W5 parity wave (operator-directed 2026-06-24): expose `spt api psyche-download` verb + append not-yet-synthesized commune/signoff drop. Tier-1 scope LOCKED; drift-stamp/memformat = Tier-2 deferred."
metadata: 
  node_type: memory
  type: project
  originSessionId: 16842a97-6889-4f10-b3ac-07f857482143
---

**v0.15.0 W5 — resume-context pull verb + pending-drop append (parity gap, operator-directed 2026-06-24).** New REQ-RESUME-CONTEXT-PULL. doyle-designed, todlando builds, perri validates. **STATUS: W1-W4 ✅ GATED+COMPLETE (send-modifier set done); W5 REQ+build-spec COMMITTED @58fd8ac (docs(design) on W4 @c019610); todlando BUILDING. doyle gates → deployah cuts release → perri validates real CC.** Build-spec recap: (1) ApiCmd::PsycheDownload{id,session_id,auth} arm (api/mod.rs + clap + dispatch; handler resolves project from bound cwd, calls download_psyche_context, NO-CONTEXT→stderr, auth-gated via gated()); (2) download_psyche_context gains commune_dir/signoff_dir + <pending-*> append after project slice, presentation-only output-buffer (NOT store-write); (3) activate REQ [doc,impl,unit,int] + xtask gen reference.md; (4) unit (with/without pending + trigger-strip + project-isolation) + int (verb emits brief / pre-pulse→<pending-*> / post-pulse self-clears).

**THE GAP (operator-found, doyle-grounded):** spt-core exposes NO adapter-callable verb to pull resume context. `resume::download_psyche_context` (spt-live/src/resume.rs:88, composes <live-role>+<live-context>+<project-context> from the durable two-tier store) is INTERNAL — zero `spt` callers, no ApiCmd verb (api/mod.rs:55 enum has none). resume.rs:9 documents the intended "adapter pulls it in its SessionStart hook" path but it was NEVER wired. So a harness adapter SessionStart hook cannot inject the agent's durable mind on resume at all — claude-spt today runs only `api boundary` (session rotation) + identity brief; the agent resumes WITHOUT its mind. perri confirmed the verb absence against the full published `spt api` surface.

**WHY CORE-OWNED (not adapter):** an adapter-side raw-drop read RACES spt-core's ingest-delete (TOCTOU — ingest.rs:161 removes the drop on pulse-consume). The fold MUST live in the single composer all resume pulls flow through. (Reverses doyle's initial "build the adapter inject" guidance to perri — see [[commune-ingest-pulse-latency-gap]].)

**LEGACY PAYLOAD IS RICHER than download_psyche_context (operator flag, doyle-grounded vs claude_skill_owl/src/live/context.rs):** legacy `download_payload` (:344) composes IN ORDER: `<memformat>` block + `<psyche-stamp/>`+`<current/>`+same-project-drift-directive (commits_since/unpulled, cross-machine drift) + `<live-context>` (front-matter stripped) + `<project-context-resolved name=..>` + project body + **Pending Commune/Signoff** (mtime-headed `## Pending {Kind} (written {mtime})`, append_pending_sections :483/:506, read-only/sole-deleter discipline — process_file_drop is sole deleter, psyche-download read-only :1257) + a **Pulse Log**. The SessionStart-INJECTION variant `download_payload_for_injection` (:691) = same MINUS the Pulse Log (CLI variant keeps it). So `{psyche_context}` (the [session.psyche_resume] preload key, role/live/project only) ≠ the parity payload.

**SCOPE — operator AGREED 2026-06-24 (2-tier):**
- **TIER 1 (build in W5, the resume-freshness contract):** (1) EXPOSE the verb `spt api psyche-download <id> [--session-id <sid>]` → stdout = composed brief, project_id from the endpoint's bound cwd, auth-gated like sibling id-scoped verbs; adapter SessionStart injects stdout as additionalContext. (2) durable: <live-role>+<live-context>+<project-context>+<project-context-resolved> sentinel. (3) **<pending-commune>/<pending-signoff> append**, gated on NOT-YET-SYNTHESIZED (NOT merely on-disk — current sync-ingest makes them coincide [route_two_slice writes durable THEN deletes @ DEFAULT_PULSE_PERIOD 5s]; contract keys on synthesis-state, forward-compat for async Psyche synthesis via a pending-synthesis staging set), trigger sentinel stripped, PRESENTATION-ONLY (never writes store — REQ-HAZARD-DROP-FILE-SINGLE-WRITER), self-clearing. New public verb → docs-drift gate (xtask gen + reference.md no-internal-codes).
- **TIER 2 (separate tracked parity item, DEFERRED — NOT v0.15.0):** `<psyche-stamp/>`+`<current/>`+drift-directive (distinct cross-machine-drift feature; spt-core HAS the sync/git-stamp machinery — 27 files: sync.rs/syncmerge.rs/identity.rs — but download_psyche_context never composes it); `<memformat>` block (spt-core memformat deliberately deferred per CONTEXT-MEMORY.md, store unpopulated); Pulse Log (legacy echo artifact, injection-variant strips it anyway). Reason: folding all legacy payload into v0.15.0 balloons the wave + memformat genuinely deferred.

**SEQUENCING:** W5 REQ commit lands AFTER W4 (todlando's W4 edits traceable-reqs.toml — hazard-title amend + axis activation — first; doyle rebases the W5 REQ fold on top to avoid re-collision on the SHARED working tree). doyle reverted the thin W5 draft from the tree (git restore) to keep it clean for todlando's W3 commit. W5 build sequenced after W4 (or interleaved). FOLD the ephemeral-partial traceable note (CONTEXT.md §persistence copy exists) into REQ-MSG-DELIVERY-AXES comment when committing the W5 REQ block.

**SHARED-TREE LESSON:** doyle + todlando share ONE working tree on HFENDULEAM. Uncommitted design edits collide with the executor's commit. Protocol: doyle commits design artifacts (REQ/plan) as focused doc commits, sequenced AROUND the executor's wave commits (executor lands traceable edits first, doyle rebases on top); never leave half-baked design uncommitted in the shared tree. Related: [[v0150-w1-activity-gated-delivery]], [[agent-roles]], [[gate-against-documented-design]].
