---
name: v0261-hints-never-called
description: "2026-08-04 v0.26.1 SHIPPED — the [[hints]] table was declared in every manifest since v0.2.x and the hook never called `spt api hint`; no keyword hint had EVER fired."
metadata: 
  node_type: memory
  type: project
  originSessionId: b8065eae-268e-4d9c-aecd-6f0d3cf14889
  modified: 2026-08-04T09:02:38.328Z
---

**A declared config table is not a delivered feature.** `[[hints]]` rode every claude-spt
manifest since v0.2.x. spt-core matches it, and `manifest.schema.json` states the adapter's half
in one line — *the user-prompt hook pipes the full user message to `spt api hint`*. Our hook
never made that call. Zero hits for `api hint` in crate/CI/plugin. So NO keyword hint had ever
fired, for any keyword, in any session, for any agent, while the manifest read as shipped.

Surfaced as two field sightings in one night (lia asked in prose for a knock code; ball-b was
pasted an `sptkc_` code). Both looked like knock bugs. Neither was.

**Why:** `REQ-SKILL-KNOCK` listed "Two `[[hints]]`" as satisfied evidence — a DECLARATION counted
as a working path. Same family as [[v02532-verdict-not-catchall]] (an instrument covering less
than you think) and the `.toml` tags that look traceable and are never scanned. **When a
requirement's evidence is a config declaration, find the consumer call or it is not evidence.**

**Diagnostic move that paid:** ran the contract by hand against the INSTALLED manifest before
writing code — positive control (both failing prompts answered correctly), negative control
(non-keyword answered empty), state control (repeat on same session answered empty = core's
seen-set works). That located the defect on our side of the seam in three commands.

Shipped v0.26.1 as `REQ-UPS-KEYWORD-HINTS`; regression test proven RED first. Field-verified on
the installed binary by running `claude-spt.exe hook UserPromptSubmit` with `SPT_ENDPOINT_ID`
UNSET — no perch id means no busy/poll, so a live agent can verify a UPS change without
disturbing its own perch. Reusable.

**Still open — `claude-spt-bs#8`:** a skill invoked by the model through CC's **Skill tool**
(`{"skill":"sptc:knock","args":…}`) never reaches UserPromptSubmit, so the skill BODY is not
injected for any of the 12 `/sptc:*` skills (`commune` included — its body holds the across/wake
mechanics). Degrades gracefully, which is why it hid. Likely seam: PreToolUse (fires unmatched,
can inject, payload carries `tool_input.skill`).
