---
name: adapter-glue-model-boundary
description: "Adapters (harness AND shell) interface with spt-core via manifest + binary ONLY — never add adapter-aware source to spt-core, never place real adapters in-tree"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 82459163-f234-40c3-8afa-90e074af5065
---

User stopped D8 work (2026-06-04) when I (a) placed the real notify shell adapter in-tree and (b) hardcoded its "notify" capability name in the daemon. Both reverted same day: adapter moved to standalone SaberMage/spt-shell-notify (public, self-contained, hand-decoded wire format); daemon-side render became the [session.notif] manifest template seam generalized to shell adapters (vocabulary-agnostic).

**Why:** The adapter model's entire point is zero source integration — the manifest declares everything, the binary speaks only the public `spt api` surface + documented wire format. The mock stays the only adapter-shaped artifact in-tree (PRD R-DOCS-2). spt-core knowing a shell vocabulary verb = a privileged capability baked into core = the model broken.

**How to apply:** Before any adapter-touching work: real adapters get their own repo (spt-core CI may add a thin cross-repo hook for E2E); any daemon-side behavior keyed to an adapter must be driven by a manifest declaration spt-core honors generically, never by a name/verb spt-core knows. When a plan says "via the template/manifest", build the manifest seam — don't drift to whatever machinery is freshest in context.
