{
  "summary": "Installed adapter is active pointer install `claude-spt` v0.25.5. Automatic compact does not replace or rearm the resident listener: `SessionStart(source=compact)` selects the proofed `boundary` registration verb and rebinds the existing perch to the new Claude session id. The lifecycle gap is that only fresh `bind` and `source=clear` explicitly assert `state idle`; the compact boundary path does not. Therefore, if compact occurs while the endpoint remains ACTIVE and Claude emits neither Stop nor `Notification(idle_prompt)`, inbound delivery is queued/spooled despite a healthy listener. The next user turn fires UserPromptSubmit, which drains adapter msg-park on every prompt and calls `api poll --include-deferred`; that is the observed wake mechanism. PreToolUse is the mid-turn equivalent. Falsifiable ownership conclusion: adapter compact lifecycle owns the delay if transport evidence shows Doyle's message reached/spooled at the live perch, boundary rotation succeeded, and no idle transition occurred before the user turn. Refute this by showing a successful Stop/idle_prompt idle assertion after compact but before Doyle's send; that would move ownership to core idle-drain/translation delivery. Automatic /compact itself does not kill or recreate the listener.",
  "files": [
    {
      "path": "C:/Users/decid/AppData/Local/spt-core/adapters/claude-spt/record.toml",
      "description": "Installed adapter record: pointer mode to the SaberMage-claude-spt install directory, active=true, registered_at_ms=1784584806969."
    },
    {
      "path": "C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-claude-spt/manifest.toml",
      "description": "Installed manifest version 0.25.5. Declares SessionStart as non-listening registration and documents UserPromptSubmit/PreToolUse poll delivery. Historical notes identify idle_prompt self-heal and stub/park delivery."
    },
    {
      "path": "C:/Users/decid/AppData/Local/spt-core/adapters/_github/SaberMage-claude-spt/hook-trace.log",
      "description": "Live hook evidence. Recent entries repeatedly show `TRACE UserPromptSubmit ... park-drain ... busy ... poll ...` and `NOTIFICATION type=\"idle_prompt\" (idle-heal fires only on idle_prompt)`. Trace does not normally log successful SessionStart/Stop, only errors or trace-gated Stop, so absence is not proof those hooks did not fire."
    },
    {
      "path": "C:/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt/src/hook.rs",
      "description": "Relevant symbols: `register_verb` lines 373-383 maps clear|compact to boundary; `handle_session_start` 897+ rotates/persists session ownership but explicit idle handling is fresh bind and `if src == \"clear\"` only (comment: no wake variant leverages compact); `handle_user_prompt_submit` 1221+ drains msg park on every prompt then marks busy and polls include-deferred; `handle_pre_tool_use` 1557+ drains park/poll mid-turn; `handle_stop` 1606+ marks idle; `handle_notification` 1662+ marks idle only for idle_prompt."
    },
    {
      "path": "C:/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt/src/translate.rs",
      "description": "`park_envelope` and message-like dispatch implement idle resident-listener behavior: full envelope is parked atomically and a compact `<msg from=\"…\"/>` stub is injected. A failed park falls back to full typing, preventing loss."
    },
    {
      "path": "C:/Users/decid/Documents/projects/spt-claude-code/tools/claude-spt/src/stub.rs",
      "description": "Defines HOME-anchored ordered msg-park custody shared by the resident translation binary writer and fresh hook reader."
    },
    {
      "path": "C:/Users/decid/.claude/plugins/cache/cplugs/sptc/0.1.16/hooks/hooks.json",
      "description": "Installed plugin wiring includes SessionStart, UserPromptSubmit, PreToolUse, Stop, Notification, StopFailure, and PostToolUseFailure. It provides the lifecycle events needed for self-heal; no PreCompact hook exists."
    },
    {
      "path": "C:/Users/decid/.claude/plugins/cache/cplugs/sptc/0.1.16/hooks/dispatch.sh",
      "description": "Thin hook dispatcher resolves and caches the installed `claude-spt hook` binary at SessionStart, then forwards hook stdin unchanged. It does not own listener lifetime."
    }
  ],
  "architecture": "Delivery has two cooperating planes. spt-core owns transport, perch state, spool, and idle-edge drain into the already-running translation listener. The claude-spt resident translation binary converts an idle event into a tiny submitted stub while atomically parking the full envelope. Fresh Claude hooks own session lifecycle and prompt-context injection: SessionStart rebinds boundary identity; Stop or idle_prompt marks the perch idle; UserPromptSubmit and PreToolUse stage/read parked bodies plus poll deferred core messages and inject them as additionalContext. Compact rotates the Claude session but, unlike clear, has no explicit adapter idle assertion. Thus a compact-time ACTIVE state can survive the rotation and suppress the core idle path until idle_prompt or a subsequent user/tool hook drains the queue."
}