---
name: perri-question-triage-protocol
description: Every perri impl question = a diagnostic; classify into 1 of 3 with SOLID EVIDENCE before guiding/amending
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 7f5a5890-9c8c-4043-bcb6-647b6f7a36d7
---

perri builds spt-claude-code (claude-spt harness adapter) ENTIRELY independently of spt-core source — from the PUBLISHED docs (docs-site / GH-Pages) + spt-releases binary only. So any impl question she raises is a diagnostic signal. My job (doyle): identify WHICH of three it is, with solid evidence, THEN guide her and/or orchestrate the spt-core fix.

The three (must pick one, evidence-backed):
1. **Docs not read closely enough** → the answer IS in the published docs; point her to the exact section. Evidence = the doc passage that answers it.
2. **Doc gap** → answerable from spt-core SOURCE but absent/unclear in the PUBLISHED docs. Fix the DOCS (what she consumes), verify against source. Evidence = source has it, published docs don't. (Method already proven: perri's impl Qs = doc-gap detectors — fix docs, use source only to verify.)
3. **Missing feature** (worst case) → spt-core genuinely lacks a primitive the adapter needs for LEGACY-OWL PARITY. Orchestrate a codebase amendment (mint REQ → dispatch todlando → gate). Evidence = legacy owl provides it + no spt-core primitive does (grep REQ tags / DEFERRED.md / CONTEXT).

**Why:** operator 2026-06-15 — codifies the triage. Never hand-wave perri's question or answer from memory; ground the classification in evidence first. spt-core NEVER caters to a specific harness, so case 3 fixes must be agnostic primitives, not CC-specifics.

**How to apply:** on each perri impl Q — grep/read to classify, then act per bucket. new-alarm was a clean case-3 (DEFERRED.md:43, operator kept deferred). **F-031 was a clean case-1 (2026-07-08) I first BOTCHED — reflexively ruled 'doc gap → doc it' WITHOUT checking published docs; the send stream+exit-code contract was ALREADY in api.md rule 3 AND messaging/overview.md:60. LESSON: the DEFAULT hypothesis is case-1 (perri missed a published doc) — grep docs-site FIRST; only escalate to case-2/3 after proving the doc is absent/insufficient. Never 'doc it' before confirming it isn't already documented.** See [[agent-roles]] (perri finds gap → doyle triages/dispatches), [[spt-core-harness-boundary-and-grounding]] (ground in CONTEXT; apparent gaps usually already specified), [[grep-req-tags-to-find-impl]] (REQ tags locate impl fast), [[alarm-port-deferred-arrangement]].

**Operator reinforcement 2026-07-02 (F-024D):** guidance alone is NOT closure — every case-2/3 verdict must ALSO land the published-docs amendment (api.md/checklist/CONTEXT/ADR as fits) so future adapter devs never re-meet the issue; check EVERY design decision against CONTEXT.md (the design source of truth) BEFORE ruling — the F-024D boundary catch-22 looked like an adapter-pattern problem until CONTEXT.md:186 showed the impl deviated from the designed rotation anchor (a case-2 AND case-3 verdict can coexist: docs gap + core design gap). Reference execution: ADR-0032 + boundary-rotation-credential branch.

**Operator reinforcement 2026-07-16 ([update.post] fresh-install Q):** I answered perri's 4-leg question straight from cli.rs with line cites — WRONG FRAME twice over: (a) perri cannot act on source cites; if the answer needed cli.rs, that fact itself IS the case-2 verdict — run the classification FIRST, answer FROM the published surface, cite doc paths not code lines; (b) I proposed a core "masking bug" without checking CONTEXT.md — the behavior (fallback notice on failed post-step) is documented-deliberate there, so the correct output was adapter guidance within design, not a core finding. Also caught: a published page can link to a reference section that doesn't exist — link-resolution gates don't catch content absence; verify the TARGET CONTENT when classifying case-1. Reference execution: PR #11 docs/update-post-contract + the two perri messages (wrong then corrected) 2026-07-16.
