---
name: v0253-0254-shortname-and-live-cap
description: 2026-07-19 SHIPPED — v0.25.3 bare-shortname skill injection (/ready was silently injecting nothing) + v0.25.4 per-substrate /sptc:live composition (was overflowing the 9000B cap every time); plugin 0.1.15/0.1.16.
metadata: 
  node_type: memory
  type: project
  originSessionId: 5327083b-be0b-4d72-8796-780ec5f26dcb
  modified: 2026-07-20T06:56:49.286Z
---

Two adapter releases + two cplugs skeleton bumps, both published and field-verified on HFENDULEAM.

**v0.25.3 / plugin 0.1.15 — bare shortnames.** Operator typed `/ready terminus`; the hook injected
NOTHING (`skill=0ms` in hook-trace.log = no get-string subprocess ran at all; a real resolve is
~20ms). CC resolves an unqualified `/<name>` to the plugin skill when unambiguous, then records the
CANONICAL `<command-name>/sptc:ready</command-name>` in the transcript — **so the transcript reads
healthy at the exact moment delivery failed.** `skill_key` matched only the qualified form. Bare
`/live` was the sole shortname ever handled (`is_live_invocation`) and only for the roster, never the
body. Fixed: bare arm gated on `SPTC_SKILLS` (whole-token; `/review`, `/readyish` never resolve),
drift-tested against `plugin/sptc/skills/`. Skeleton fallbacks rewritten — each stub now carries its
own one operative call instead of routing to `sptc:setup` (that routing WAS the 5-tool-call hunt).
`SKILL_KEY_MISS` now logs leading bytes on a `/sptc:`-mentioning miss.

**v0.25.4 / plugin 0.1.16 — /sptc:live cap overflow.** Body was 9445B vs the 9000B additionalContext
cap, so EVERY go-live spilled to a file the agent had to stop and Read. Two causes: it shipped BOTH
substrates' instructions (the hook already knows which — `$SPT_ENDPOINT_ID`), and the durable CLI-free
prose sat in the capped channel. Now composed: `skills.live` (head) + ONE arm (`live-normal` = relay
chain + wake marker, or `live-hosted` = do-NOT-arm) + `live-resume` (tail). Hosted arm also drops
commune/signoff — `perch_brief` already delivered `briefs.live-ops` at SessionStart. Verified live:
normal 8343B, hosted 5796B, **0 overflow blocks**, no relay-chain leakage into the hosted path.

**REQ-DIST-SKELETON-THIN amended, not breached** (operator-ruled): a skeleton MAY carry its skill's
durable half, because additionalContext is a hard limit and overflow = file-spill, strictly worse
delivery than the skeleton (free, always present). **The split line is CLI COUPLING, not length** —
every command, flag, marker (`!!wake!!`), fault token and injected runtime block stays adapter-side so
it rides `spt adapter update` and a stale cached plugin can never teach it stale. U4 assertions were
retargeted to that contract, incl. a new test asserting the skeleton does NOT teach the wake marker.

Hazard: `REQ-HAZARD-SKILL-INJECTION-SILENT-NOOP` (KNOWN-HAZARDS §4.1) — covers the shortname arm, the
all-whitespace trim, and the one-call skeleton rule. See [[skill-injection-noop-signature]].

**Open follow-up (mine):** adopt `after_predates_window` in `interrupt_watch.rs` — I have no
"I missed rows" signal today, I re-scan a fixed window and hope. Learned from the digest --json
blind read; the field lands in the published page at spt-core v0.39.0.
