| name | wr-itil:capture-problem |
| description | Lightweight problem-capture skill for aside-invocation during foreground work — minimal duplicate-check, skeleton ticket file, single commit per capture (covers new ticket + inline README refresh per P094 per P199 Option 2 amendment 2026-06-05). Defers full duplicate analysis to /wr-itil:review-problems. Use this when the user (or agent mid-iter) wants to capture an observation quickly without disrupting current task flow. For full-intake new-problem creation, use /wr-itil:manage-problem. |
| allowed-tools | Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion |
Capture Problem Skill
Capture a problem ticket quickly during foreground work. Lightweight aside-invocation surface that complements the heavyweight /wr-itil:manage-problem flow. See REFERENCE.md in this directory for rationale, edge cases, contract trade-offs, and the ADR-032 foreground-lightweight-capture amendment.
This skill is the foreground-lightweight-capture variant of /wr-itil:manage-problem's new-problem path per ADR-032 (P155 amendment, 2026-05-03). The deferred background-capture variant named in ADR-032's original taxonomy remains deferred per P088 settlement.
Output Formatting
When referencing problem, JTBD, ADR, or RFC IDs in prose output (stderr advisories, capture-report messages), always include the human-readable title or substance on first mention. Use the format JTBD-001 (Enforce Governance Without Slowing Down), not bare JTBD-001.
Brief-before-ID discipline at the Step 1.5b low-confidence interview surface (P350). Per the P401 correction the low-confidence path does NOT surface candidate JTBD-NNN / persona-slug IDs at all — it interviews the human about who hits the problem and what job they are trying to get done, in plain language, so the brief-before-ID discipline is satisfied by construction (no ID is a carrier of meaning). If any option or prose in the interview references an existing job/persona for context, it MUST inline the job statement + the persona's key constraint BEFORE any ID. The user reads the prompt without project filesystem access (mobile clients, accessibility tooling, notification surfaces) and cannot follow links into docs/jtbd/. Mirrors the canonical /wr-architect:create-adr Step 5 § 5a Rule 3 ("No IDs as explainers"). See also session memory feedback_brief_before_id.md.
When to invoke
- Mid-iter sibling-finding: agent observes a tangential ticket-worthy issue while working on a different problem and cannot afford the 10-turn
/wr-itil:manage-problem ceremony.
- User-initiated rapid capture: user says "btw, this is broken too — capture it" during retros, code reviews, or correction conversations.
- AFK orchestrator main turn captures: orchestrator captures user-driven mid-loop observations without breaking the iter cadence.
Use /wr-itil:manage-problem instead when:
- The user wants to walk the full intake flow (priority discussion, multi-concern split, immediate WSJF placement).
- The capture is large enough that deferred-investigation placeholders are unhelpful (the description IS the full ticket body).
- The capture needs to ride alongside an immediate fix (
fix(scope): ... (closes P<NNN>) shape — manage-problem's Step 7 transition + Step 11 commit handles this; capture-problem does not).
Rule 6 audit (per ADR-032 + ADR-013)
This skill has one direction-setting AskUserQuestion surface — the low-confidence persona/JTBD elicitation interview (fired only when derivation is weak; it may span more than one question to elicit who + why), plus the ADR-068/P288 human-ratify surface when the elicited who/why warrants a NEW persona/JTBD. Each potentially-interactive decision is framework-mediated per ADR-044:
| Decision | Resolution |
|---|
| Duplicate-check | Mechanical 3-keyword title-only grep; matches listed in report; capture proceeds regardless. False-positives are cheaper than false-negatives (P155 line 24). |
| Hang-off arbitration (P346 Phase 3) | Mechanical pre-filter (≤5 candidates by shared ADR/RFC/SKILL/file signal) + fresh-context wr-itil:hang-off-check subagent dispatch (ADR-032 5th invocation pattern). Verdict-acts: HANG_OFF: P<NNN> halts capture + routes orchestrator to amend parent; PROCEED_NEW continues + appends rationale to ## Related. AFK safe-default: ambiguous → PROCEED_NEW per subagent Rule 6 contract. JTBD-301 firewall: maintainer-side only. |
| Priority (Impact × Likelihood) | Derived at capture silently from the description per Step 4a (ADR-067 silent-derivation + ADR-026 grounding/sentinel; ADR-076 honest-likelihood). No deferred placeholder, no false-low. Category-4 silent-framework per ADR-044. |
| Effort | Derived at capture silently per Step 4a (ADR-067 t-shirt buckets + ADR-026 grounding/sentinel). No deferred placeholder. |
| Multi-concern split | Out of scope: capture-problem creates one ticket per invocation. Multi-concern observations route to /wr-itil:manage-problem (its Step 4b owns the split). |
Empty $ARGUMENTS | Halt-with-stderr-directive: print "capture-problem requires a description in $ARGUMENTS — invoke /wr-itil:manage-problem instead for the full intake flow" and exit. AFK orchestrators MUST NOT invoke capture-problem with empty arguments — caller-side contract. |
| JTBD-trace + persona derivation (I12 derive → interview-on-low-confidence → classify → ratify-creation-only — ADR-060 Amendment 2026-06-02 as corrected by P401 2026-06-29/2026-07-02) | Derive-first per ADR-044 category 4 (silent-framework); interview + creation-ratify per category 1 (direction-setting). Step 1.5b runs lexical detection (\bJTBD-[0-9]+\b) + flag pre-resolution (--jtbd= / --persona=) + cited-JTBD persona derivation. Derive-success → silent-proceed with derived values + stderr advisory. Low-confidence → INTERVIEW the human to elicit the real who/why (substantive non-leading questions, NOT propose an ID) → the agent classifies: elicited job/persona matches an EXISTING artefact → map + proceed autonomously; NO existing fit → human ratifies the creation of a new persona/JTBD (ADR-068/P288) → map + proceed. A real problem is NEVER discarded over anchoring uncertainty. Scope-rejection (elicited who/why out of scope) is external-report-only at /wr-itil:manage-problem ingestion — never here. |
AFK low-confidence (--no-prompt) — preserve the finding | Create-with-unconfirmed-anchoring + queue the elicitation per P401 never-discard + JTBD-006 save-and-continue. When invoked with --no-prompt (AFK mode marker) AND derivation fails (no JTBD-NNN citations + no --persona= flag + no --jtbd= flag, OR cited-JTBD persona-disagreement) → do NOT fire AskUserQuestion, do NOT shoehorn a best-fit, do NOT auto-create a new artefact. Capture the ticket with the greppable (unconfirmed — elicitation queued) anchoring sentinel + stderr advisory, and queue the elicitation interview for the next interactive session (the AFK orchestrator surfaces it via outstanding_questions). ADR-074 is preserved by the existing downstream oversight gates (ADR-068/P288, ADR-090, ADR-060 I13), not by refusing the capture. AFK orchestrators still SHOULD pre-resolve persona+JTBD via flags to skip the sentinel path entirely. |
P287 / ADR-060 Amendment 2026-06-02 — type-classification retired + I12 hard-block replaced with derive-then-ratify: the maintainer-side type-classification dispatch (technical vs user-business) was REMOVED per twice-confirmed user direction (2026-05-25 P287 base + 2026-06-02 ADR-060 amendment substance — "I12 hard-block was wrong. Replacement: the persona and jtbd should be derived by the LLM. And if a persona/jtbd cannot be found then it should be proposed for User ratification. If the user rejects the persona or job to be done then that is should be treated as a rejection of the problem; corrections to the persona or job to be done are treated as acceptance and acceptance is treated as acceptance. Applies to ALL problems."). The redundant type axis was already covered by RFC/Story persona-anchoring per ADR-060 Phase 4. The original I12 hard-block (type-keyed JTBD-required halt) was REPLACED wholesale in ADR-060 Amendment 2026-06-02 with the derive-then-ratify contract codified in Step 1.5b below. The contract applies to ALL problems (no type-keyed gating; the type axis itself is GONE). P401 supersession (2026-06-29/2026-07-02): the 2026-06-02 amendment's "reject of the proposed persona/JTBD = rejection of the problem; no ticket created" clause (quoted above) is REVERSED — low-confidence now interviews to elicit the real who/why (never proposes an ID), the agent classifies existing-vs-new, the human ratifies only the CREATION of a new persona/JTBD, and a real problem is NEVER discarded over anchoring uncertainty; scope-rejection is external-report-only. See the P401 supersession note in Step 1.5b.
Per ADR-013 Rule 6 fail-safe: every decision above resolves without interactive user input in non-interactive contexts. The low-confidence interview fires only on derivation-failure (interactive surface) AND only when --no-prompt is absent; under --no-prompt the AFK path captures with the unconfirmed-anchoring sentinel + queues the elicitation (P401) — never silently shoehorning a best-fit or discarding the finding.
ADR-013 Rule 6 carve-out audit (P352, 2026-06-06 amendment; corrected by P401 2026-06-29/2026-07-02): the universal AFK default is queue-and-continue (queue the decision, continue the loop). The AFK low-confidence path now conforms to that default rather than carving out from it: it captures the ticket with the (unconfirmed — elicitation queued) anchoring sentinel and queues the elicitation interview — the finding is preserved (P401 never-discard + JTBD-006 "save findings and move to the next problem"), NOT refused. ADR-074 (Confirm decision substance before building dependent work) is still honoured, but by a different tactic than the retired no-ticket halt: the ticket's anchoring is explicitly unconfirmed (a greppable sentinel, never a shoehorned best-fit masquerading as confirmed — that would be the P395 harm), and dependent RFC/story/fix work stays gated on anchoring confirmation via the existing downstream oversight markers — ADR-068/P288 (a new persona/JTBD needs human ratification before it exists), ADR-090 (story maps/stories carry a drift-invalidated oversight marker), and the ADR-060 I13 propose-fix RFC-trace guard. Until the deferred /wr-itil:work-problems caller-side wiring lands (route the queued elicitation into the orchestrator's outstanding_questions batch — tracked on P401), that downstream protection rests on those existing markers, not on refusing the capture. (The Empty $ARGUMENTS halt remains a genuine caller-contract halt — there is no description to capture.)
Steps
0. README reconciliation preflight (P118)
Same as /wr-itil:manage-problem Step 0 — diagnose-only check. Halt-and-route on Exit 1 (committed cross-session drift); INLINE_REFRESH carve-out (P149) preserved. capture-problem itself does NOT refresh README.md (see Step 6); the preflight is purely a fail-fast on pre-existing drift.
wr-itil-reconcile-readme docs/problems > /tmp/wr-itil-drift-$$.txt
reconcile_exit=$?
if [ "$reconcile_exit" -eq 1 ]; then
wr-itil-classify-readme-drift /tmp/wr-itil-drift-$$.txt docs/problems
classify_exit=$?
rm -f /tmp/wr-itil-drift-$$.txt
fi
1. Parse the description and flags from $ARGUMENTS
$ARGUMENTS may carry up to two leading flags before the free-text description (caller-side pre-resolution per ADR-044 silent-proceed shape):
| Flag | Effect on Step 1.5b |
|---|
--jtbd=JTBD-NNN[,JTBD-NNN...] | Pre-resolves the JTBD-trace value. Step 1.5b skips JTBD-trace derivation. Comma-separated list of JTBD IDs (no spaces). |
--persona=<value> | Pre-resolves the persona value. Step 1.5b skips persona derivation. Value MUST be one of the directory names under docs/jtbd/*/ (the adopter's real persona corpus — e.g. maintainer, smb-owner in adopter repos), falling back to the home-repo set {developer, tech-lead, plugin-developer, plugin-user} only when no docs/jtbd/ directories exist. P383 — never hardcode the home-repo enum (P151/P317 adopter-portability). |
--no-prompt | AFK mode marker (REVIVED 2026-06-02 per ADR-060 Amendment 2026-06-02; behaviour corrected by P401 2026-06-29/2026-07-02). Suppresses the low-confidence interview. When set AND derivation fails (no JTBD-NNN citations + no --persona= flag + no --jtbd= flag, OR cited-JTBD persona-disagreement) → capture the ticket with the (unconfirmed — elicitation queued) anchoring sentinel + stderr advisory and queue the elicitation (P401 never-discard) — it no longer halts-refuses. AFK orchestrators (/wr-itil:work-problems capture-on-correction sub-flow, agent-mid-iter capture-problem invocations) SHOULD still pass this flag PLUS pre-resolved --persona + --jtbd flags to skip the sentinel path entirely. |
Strip recognised leading flags from $ARGUMENTS; the remainder (after flags) is the free-text description. Unknown leading flags halt-with-stderr-directive: print "capture-problem: unknown flag '' — recognised flags: --jtbd=JTBD-NNN, --persona=, --no-prompt" and exit.
P287 + ADR-060 Amendment 2026-06-02 note: --type=technical and --type=user-business are RETIRED (P287, 2026-06-02 — type-classification axis removed). --no-prompt was retired in P287 base alongside the type-axis removal AND is now REVIVED 2026-06-02 per the ADR-060 amendment's I12 derive-then-ratify contract — its semantic is now the AFK-mode marker for the persona/JTBD AskUserQuestion fallback, NOT the historical type-classification suppress.
Empty description (post-flag-strip) halts per the Rule 6 audit above.
Derive a kebab-case title slug from the first 8-10 non-stopword tokens of the description (matching the existing manage-problem slug derivation pattern).
1.5b JTBD-trace + persona dispatch — I12 derive → interview-on-low-confidence → classify (ADR-060 Amendment 2026-06-02, corrected by P401)
Per ADR-060 § Phase 3 + Phase 4 in-scope amendment (2026-05-13), as amended by P287 (2026-06-02 base — type-classification retired), by ADR-060 Amendment 2026-06-02 (I12 hard-block REPLACED with derive-then-ratify; applies to ALL problems; no type-keyed gating), AND by the P401 correction (user direction 2026-06-29, sharpened 2026-07-02) — the low-confidence path is now interview-to-elicit-who/why, NOT propose-candidate-IDs-for-ratification; and a real problem is never discarded over anchoring uncertainty. Fires UNCONDITIONALLY. Both jtbd_trace_value and persona_value are REQUIRED on every captured ticket.
The corrected contract (one principle, both fields):
- The agent derives persona + JTBD from the description.
- Confident → map to the existing persona/JTBD and proceed autonomously (no human — ADR-044 category-4 silent-framework).
- Not confident → do NOT shoehorn into the nearest existing ID, and do NOT ask "is it JTBD-XXXX?". Interview the human (
AskUserQuestion, ADR-013 Rule 1 structured form; may be more than one question) with substantive, non-leading questions about who hits this and what they are trying to get done — requirements elicitation of the real persona/job, not ratification of a guessed ID (this is more brief-before-ID-compliant than the old prompt — P350 — since no ID is surfaced at all).
- From the elicited who/why the agent classifies: matches an existing persona/JTBD → map and proceed (autonomous — the ADR-068 boundary applies only to creation, not mapping); no existing fit → a new persona/JTBD is warranted → route the creation to the ADR-068/P288 human-ratify surface (
/wr-jtbd:update-guide then /wr-jtbd:confirm-jobs-and-personas); on ratification, map to the new ID and proceed.
The human is involved only for substance — the interview when derivation is weak, and ratifying the creation of a genuinely new persona/JTBD — never to bless an ID. A real problem is NEVER discarded over anchoring uncertainty; anchoring uncertainty is resolved by elicitation, not by rejecting the problem. Scope-rejection (deciding the elicited who/why is out of scope to support) is an external-report-only decision handled at /wr-itil:manage-problem ingestion — maintainer-side captures here always anchor to an existing or a new job. This is the same covered → agent proceeds / uncovered → human ratifies a new artefact boundary ADR-073 draws for the fix-approach axis, applied to the who/why axis.
P401 supersession note (user direction 2026-06-29 / 2026-07-02). This reverses the 2026-06-02 ADR-060 amendment substance that framed "REJECT of the proposed persona/JTBD = rejection of the problem; no ticket created." That framing shoehorned problems into the nearest ID and discarded legitimate problems over anchoring uncertainty. The reversal is deliberate and user-directed, NOT drift. The corresponding ADR-060 body amendment and the ADR-073 additive symmetric-escalation note are queued on P401 for the interactive ratification drain (per P357 — user direction is not itself ADR-body-substance ratification); until they land, this SKILL leads and the ADR bodies follow — the same governed trade-off as the P287 type-axis retirement (see the ## Related note below). The AFK caller-side wiring in /wr-itil:work-problems (route the queued elicitation into its outstanding_questions batch) is likewise queued on P401.
Resolve jtbd_trace_value (an ORDERED list of JTBD IDs) via the following derive → interview-on-low-confidence → classify dispatch:
- If
--jtbd=JTBD-NNN[,JTBD-NNN...] was set in Step 1: parse comma-separated list; assign to jtbd_trace_value; do NOT run the lexical detector; do NOT fire AskUserQuestion (silent-framework per ADR-044 category 4). Caller pre-resolved.
- Else run the lexical JTBD-trace detector against the description:
grep -oE '\bJTBD-[0-9]+\b' | sort -u. If ≥1 match found, set jtbd_trace_value to the matched IDs (de-duplicated, sorted ascending) and emit stderr advisory: capture-problem: derived jtbd-trace=<id-list> from description JTBD-NNN citations; re-invoke with --jtbd= to override. Do NOT fire AskUserQuestion (silent-framework).
- Else (no flag, no lexical detection — low-confidence path): do NOT shoehorn a best-fit JTBD and do NOT propose candidate
JTBD-NNN IDs for ratification. Interview the human via AskUserQuestion (may span who + why in one dispatch shared with the persona resolution below) with substantive, non-leading questions about what job the affected user is trying to get done. From the elicited answer the agent classifies:
- Elicited job matches an existing JTBD → set
jtbd_trace_value to that ID and proceed (autonomous mapping — no further ratification; the ADR-068 human-oversight boundary applies only to creation).
- No existing JTBD fits → a new JTBD is warranted → route the creation to the ADR-068/P288 human-ratify surface (
/wr-jtbd:update-guide then /wr-jtbd:confirm-jobs-and-personas); on ratification, set jtbd_trace_value to the new ID and proceed.
- The problem is never discarded over anchoring uncertainty. (Scope-rejection — deciding the elicited who/why is out of scope to support — is an external-report-only decision at
/wr-itil:manage-problem ingestion, never here.)
- AFK (the
--no-prompt branch) — preserve the finding, queue the elicitation: if --no-prompt was set in Step 1 AND control reaches step 3 (no flag + no lexical detection) → SKIP the AskUserQuestion, do NOT shoehorn a best-fit ID, and do NOT auto-create a new JTBD. Set jtbd_trace_value to the greppable unconfirmed-anchoring sentinel (unconfirmed — elicitation queued), capture the ticket, and queue the persona/JTBD elicitation interview for the next interactive session (the AFK orchestrator surfaces it via its outstanding_questions batch). Emit stderr advisory capture-problem: JTBD low-confidence under AFK; ticket captured with unconfirmed anchoring; elicitation queued — do not build dependent RFC/story/fix work until anchoring is confirmed. The ticket IS created (P401 never-discard + JTBD-006 save-and-continue); ADR-074's "don't build on unconfirmed substance" is preserved by the existing downstream oversight gates (ADR-068/P288 new-persona/JTBD ratification; ADR-090 story-oversight; ADR-060 I13 propose-fix RFC-trace guard), NOT by refusing the capture.
Resolve persona_value (a scalar persona value — validated against the adopter's persona corpus: the directory names under docs/jtbd/*/, falling back to the home-repo set {developer, tech-lead, plugin-developer, plugin-user} only when no docs/jtbd/ directories exist; P383, never hardcode the home-repo enum — P151/P317 adopter-portability) via the following derive → interview-on-low-confidence → classify dispatch:
- If
--persona=<value> was set in Step 1: validate <value> against the persona corpus (the docs/jtbd/*/ directory names, or the home-repo fallback set when no jtbd dirs exist — e.g. ls -d docs/jtbd/*/ | xargs -n1 basename); halt-with-directive if invalid; otherwise assign and proceed silently. Caller pre-resolved.
- Else if
jtbd_trace_value is non-empty AND cited JTBDs agree on a single persona: derive persona_value from the cited JTBDs' persona: (and optionally secondary-persona:) frontmatter; emit stderr advisory: capture-problem: derived persona=<value> from cited JTBD <id> frontmatter; proceed silently.
- Else (no flag + (no cited JTBDs OR cited-JTBD persona-disagreement) — low-confidence / ambiguity path): do NOT shoehorn a best-fit persona and do NOT propose candidate persona IDs for ratification. Interview the human via
AskUserQuestion (share the dispatch with the JTBD-trace interview above — one elicitation covers who + what job) with substantive, non-leading questions about who actually hits this problem. From the elicited answer the agent classifies:
- Elicited persona matches an existing persona (a
docs/jtbd/*/ directory) → assign persona_value to it and proceed (autonomous mapping — ADR-068 boundary is creation-only).
- No existing persona fits → a new persona is warranted → route the creation to the ADR-068/P288 human-ratify surface (
/wr-jtbd:update-guide then /wr-jtbd:confirm-jobs-and-personas); on ratification assign persona_value to the new persona and proceed.
- The problem is never discarded over persona uncertainty. Scope-rejection remains external-report-only (
/wr-itil:manage-problem ingestion).
- AFK (the
--no-prompt branch) — preserve the finding, queue the elicitation: if --no-prompt was set in Step 1 AND control reaches step 3 → SKIP the AskUserQuestion, do NOT shoehorn a best-fit persona, and do NOT auto-create a new persona. Set persona_value to the greppable unconfirmed-anchoring sentinel (unconfirmed — elicitation queued), capture the ticket, and queue the elicitation interview for the next interactive session. Emit stderr advisory capture-problem: persona low-confidence under AFK; ticket captured with unconfirmed anchoring; elicitation queued — do not build dependent RFC/story/fix work until anchoring is confirmed. The ticket IS created (P401 never-discard); ADR-074 preserved via the existing downstream oversight gates, not by refusing the capture.
JTBD-301 scope preservation: this dispatch fires on the maintainer-side /wr-itil:capture-problem only. Plugin-user-side .github/ISSUE_TEMPLATE/problem-report.yml MUST NOT prompt for JTBD trace or persona — preserves the JTBD-301 firewall per ADR-060 P4.3 maintainer-side / plugin-user-side asymmetry clarifier. Triage during /wr-itil:manage-problem ingestion assigns both fields from the reporter's symptom signals (per the JTBD-301 maintainer-side-complement extension, amended 2026-06-02 to remove the type-axis residue).
ADR-044 authority taxonomy: silent-framework (category 4) on the derive-success paths (flag pre-resolution, lexical detection, cited-JTBD agreement) AND on the agent's existing-vs-new classification of the elicited who/why (mechanical framework resolution — the agent maps the elicited job to an existing artefact without a consent gate); direction-setting (category 1) on the low-confidence interview (requirements elicitation of the real persona/job) and on the human ratification of the creation of a new persona/JTBD (per ADR-068/P288) — NOT a taste preference between equally-valid options, and NOT ratification of a guessed ID (P401).
2. Minimal-grep duplicate check (3-keyword title-only) + hang-off-check subagent dispatch (P346 Phase 3 amendment, 2026-05-31)
Sub-step 2a — title-only grep (pre-existing minimal duplicate check)
Extract up to 3 distinct kebab-cased non-stopword keywords from the description. Grep the filenames of docs/problems/*.md AND docs/problems/<state>/*.md (NOT bodies — title-only is the conservative threshold per architect verdict on Q1; dual-tolerant per RFC-002 migration window):
match_count=$(ls docs/problems/*.md docs/problems/*/*.md 2>/dev/null \
| grep -ciE 'kw1|kw2|kw3' || true)
The 3-keyword cap is a hard-coded constant. Do NOT make it env-overridable — the conservative threshold rationale (P155 line 24) is structural to the design, not a tunable knob.
Title-only: file bodies are intentionally NOT scanned. Body-content matches would either (a) over-prompt (capture-problem has no AskUserQuestion to surface them) or (b) get silently swallowed. Title-only matches preserve the conservative-threshold contract.
If matches are found: list them in the final report. Do NOT halt or branch. Capture proceeds. The user can resolve duplicates at the next /wr-itil:review-problems invocation (or invoke /wr-itil:manage-problem directly if the duplicate-check shape needs a structured branch).
Sub-step 2b — hang-off-check via fresh-context subagent (P346 Phase 3; ADR-032 5th invocation pattern)
The 3-keyword title-only grep at sub-step 2a is conservative: it catches narrow shape-overlap on titles but misses the wider class of hang-off candidates — parent tickets where the new capture's scope belongs as an Investigation Tasks expansion / Phase N section rather than as a sibling ticket. The wrongly-captured P347 sibling of P346 on 2026-05-31 is the canonical regression: the main agent (mid-iter, with rich session context) pattern-matched the existing capture flow and missed that the new spec belonged inside P346 as Phase 3.
Sub-step 2b adds a mechanical pre-filter + fresh-context subagent dispatch that closes this gap without re-introducing the main agent's session-context bias. The subagent runs in isolation (no parent-session context) and emits a structured verdict the SKILL acts on deterministically.
Mechanical pre-filter — grep docs/problems/open/*.md + docs/problems/verifying/*.md BODIES for tokens shared with the description: any ADR-NNN reference, RFC-NNN reference, JTBD-NNN reference, SKILL path (/wr-<plugin>:<skill> or packages/<plugin>/skills/<skill>/), file path (packages/..., docs/..., .github/..., bin/..., scripts/...), or named feature word the description cites. Collect candidates that share ≥1 signal.
adr_refs=$(echo "$description" | grep -oE 'ADR-[0-9]{3}' | sort -u)
rfc_refs=$(echo "$description" | grep -oE 'RFC-[0-9]{3}' | sort -u)
skill_refs=$(echo "$description" | grep -oE '/wr-[a-z-]+:[a-z-]+' | sort -u)
file_refs=$(echo "$description" | grep -oE '(packages|docs|\.github|bin|scripts)/[a-zA-Z0-9_./-]+' | sort -u)
signals="$adr_refs"$'\n'"$rfc_refs"$'\n'"$skill_refs"$'\n'"$file_refs"
signals=$(echo "$signals" | grep -v '^$' | sort -u)
[ -z "$signals" ] && SKIP_HANG_OFF_CHECK=1
candidates=()
if [ -z "$SKIP_HANG_OFF_CHECK" ]; then
for f in docs/problems/open/*.md docs/problems/verifying/*.md; do
[ -f "$f" ] || continue
for sig in $signals; do
if grep -qF "$sig" "$f"; then
candidates+=("$f")
break
fi
done
done
fi
Candidate-cap short-circuit (latency-bound per ADR-032 + JTBD-001's 60s flow budget): if ${#candidates[@]} -gt 5, skip the subagent dispatch and record the candidate list in the captured ticket's ## Related section for review-time re-evaluation by /wr-itil:review-problems. Wide candidate sets blow the lightweight-capture latency budget; the safe default is "skip + defer to cluster pass."
Empty-candidates short-circuit: if ${#candidates[@]} -eq 0 (no shared signals), skip the dispatch and proceed to the marker step. The mechanical pre-filter found nothing to arbitrate.
JTBD-301 firewall — sub-step 2b fires on maintainer-side /wr-itil:capture-problem invocations ONLY. Plugin-user-side .github/ISSUE_TEMPLATE/problem-report.yml MUST NOT carry an equivalent dispatch (plugin-user descriptions do not carry the same authorial intent; a plugin-user describing their friction in maintainer vocabulary could plausibly trigger a wrong-parent HANG_OFF). Triage during /wr-itil:manage-problem ingestion stays user-judgement per JTBD-301. Mirrors the Step 1.5b JTBD-trace firewall above.
AFK safe-default: the hang-off-check subagent verdict is non-interactive by construction (no AskUserQuestion), and ambiguous-multi-parent cases collapse to PROCEED_NEW per the subagent's Rule 6 contract. This satisfies JTBD-006's "Decisions normally requiring my input are resolved using safe defaults" without dependency on the retired --no-prompt flag.
Dispatch — when the candidate set is non-empty and ≤5, delegate to wr-itil:hang-off-check via the Agent tool with a structured input payload:
SURFACE: capture-problem-step-2b
<new-capture>
<description verbatim, post-flag-strip>
</new-capture>
<candidates>
P<NNN1> | <title1> | <path1> | shared-signals: <signal1, signal2, ...>
P<NNN2> | <title2> | <path2> | shared-signals: <signal1, signal3, ...>
...
</candidates>
The subagent reads the candidate ticket bodies in full as needed (via its own Read tool), reasons about absorb-vs-proceed, and returns one of:
HANG_OFF: P<NNN> with Rationale, Signals matched, Where to absorb sections.
PROCEED_NEW with Rationale and Per-candidate explanation for each surfaced candidate.
Act on verdict:
-
HANG_OFF: P: halt capture-problem. Emit a structured halt directive to the calling orchestrator agent naming (a) the parent ticket file path, (b) the new scope to amend in, (c) the Where to absorb directive from the subagent verdict. The orchestrator agent owns the parent-ticket edit + commit per the standard ticket-edit flow (do NOT amend the parent ticket from inside capture-problem — capture-problem creates new tickets; ticket-body amendments are manage-problem's surface). Record the hang-off decision + rationale in stderr for the audit trail.
-
PROCEED_NEW: continue to the marker step below. Capture the subagent's rationale + per-candidate explanation in a transient note (stderr) and append it to the new ticket's ## Related section so the next reviewer sees what was considered. This is the audit-trail contract per ADR-026 grounding + JTBD-201 audit-trail completeness.
After the grep + (optional) hang-off-check completes, write the per-session create-gate marker so the PreToolUse:Write hook (P119) permits the subsequent Write of the new ticket file under docs/problems/open/. Per P260 / ADR-050 Option C, write it under EVERY recent candidate session SID (not just one) so a concurrent orchestrator+subprocess race cannot land the marker under the wrong UUID:
wr-itil-mark-create-gate
wr-itil-mark-create-gate is the ADR-049 $PATH shim that internalises the former inline source packages/itil/hooks/lib/{session-id,create-gate}.sh + get_candidate_session_ids | mark_step2_complete_candidates. It resolves those hooks/lib siblings RELATIVE TO THE SCRIPT, not cwd (P317/RFC-009) — so it works in adopter installs. NEVER source packages/... repo-relative from a SKILL; those paths only resolve in the source monorepo, not where the plugin is installed.
The marker is shared between manage-problem and capture-problem per ADR-032 amendment — same /tmp/manage-problem-grep-${SESSION_ID} path, idempotent across cross-skill ordering. Internally the command enumerates the get_current_session_id pick (P124) plus every recent /tmp/<system>-announced-<UUID> UUID within a 24h mtime window, and writes the marker under each — so whichever SID the hook reads from the Write's stdin, a matching marker exists. This closes the P260 create-gate race that fires when the orchestrator main turn captures a ticket while a backgrounded iter subprocess holds the per-machine runtime-sid marker (last-writer-wins). The candidate set is bounded to recent same-machine markers — not a global fail-open (the P119 audit invariant holds: each marker still records that THIS session ran the duplicate-check grep). See /wr-itil:manage-problem Step 2 substep 7 for the full mechanism.
3. Compute the next ID
Same P056-safe local_max + origin_max formula as /wr-itil:manage-problem Step 3:
local_max=$(ls docs/problems/*.md docs/problems/*/*.md 2>/dev/null | sed 's|.*/||' | grep -oE '^[0-9]+' | sort -n | tail -1)
origin_max=$(git ls-tree -r --name-only origin/main docs/problems/ 2>/dev/null | sed 's|.*/||' | grep -oE '^[0-9]+' | sort -n | tail -1)
next=$(printf '%03d' $(( 10#$(echo -e "${local_max:-0}\n${origin_max:-0}" | sort -n | tail -1) + 1 )))
Log the renumber decision in the operation report if origin and local diverged.
4. Skeleton-fill the ticket
File path: docs/problems/open/<NNN>-<kebab-title>.md (per ADR-031 per-state-subdir layout)
Template (deferred-placeholder pattern — flag every section the capture didn't fill):
# Problem <NNN>: <Title>
**Status**: Open
**Reported**: <YYYY-MM-DD>
**Priority**: <Severity = Impact × Likelihood> (<band>) — Impact: <1-5> × Likelihood: <1-5> — derived at capture from the description per Step 4a
**Origin**: internal
**Effort**: <S|M|L|XL> — derived at capture per Step 4a
**JTBD**: <jtbd_trace_value_as_comma_separated_list_OR_omit_line_when_empty>
**Persona**: <persona_value_OR_omit_line_when_empty>
## Description
<full description from $ARGUMENTS, with leading recognised flags stripped>
## Symptoms
(deferred to investigation)
## Workaround
(deferred to investigation)
## Impact Assessment
- **Who is affected**: (deferred to investigation)
- **Frequency**: (deferred to investigation)
- **Severity**: (deferred to investigation)
- **Analytics**: (deferred to investigation)
## Root Cause Analysis
### Investigation Tasks
- [ ] Investigate root cause
- [ ] Create reproduction test
## Dependencies
- **Blocks**: (none)
- **Blocked by**: (none)
- **Composes with**: (none)
## Related
(captured via /wr-itil:capture-problem; expand at next investigation)
Rate at capture, do not defer (P375 / ADR-032 amendment 2026-06-24). The Priority (Impact × Likelihood) and Effort fields are derived at capture per Step 4a below — a real best-effort rating, ALWAYS. No (deferred — re-rate…) placeholder and no "not estimated" / "no prior data" marker — those are deferrals wearing a different hat (user correction 2026-06-24: "that's just another deferral"). The old deferred-placeholder default was the single largest uncadenced-deferral rot generator (P375): nothing self-fired review-problems, and the Likelihood: 1 false-low buried every capture at the bottom of WSJF. Estimation under uncertainty produces an estimate, not a deferral: a thin description still gets a real number (rough is fine). /wr-itil:review-problems re-rates the whole backlog when it runs — captures need no per-ticket re-rate flag.
4a. Derive the rating at capture (P375 / ADR-032 amendment; ADR-067 + ADR-026 + ADR-076)
Derive Priority and Effort from the description silently — NO AskUserQuestion (ADR-067 item 1 silent-derivation, category-4 silent-framework per ADR-044; preserves the lightweight 3-4-turn capture cost shape). This is one inference over text the agent has already read, NOT the /wr-itil:manage-problem ceremony.
- Impact (1-5) and Likelihood (1-5) — read the description against
RISK-POLICY.md's impact bands and assess how often / how broadly the harm manifests. Severity = Impact × Likelihood; Priority band follows the standard matrix. Likelihood is honest field-risk only — never inflate it to lift WSJF rank (ADR-076).
- Effort (S/M/L/XL) — derive from the described scope (files touched, cross-package, migration-heavy → larger), per ADR-067's t-shirt buckets.
- Always a real value (ADR-026 grounding without deferral) — when a comparable prior ticket informs the estimate, cite it inline (e.g.
— cf. P<NNN>). When no comparable prior exists, still commit to a real best-effort number grounded in the description's own signals — do NOT append "not estimated" / "no prior data" or any other re-rate flag (that is a deferral; user correction 2026-06-24). A rough estimate from a thin description is honest estimation; a marker that says "I didn't really estimate this" is the rot this brick removes.
Write the derived values into the template's **Priority** and **Effort** lines (replacing the <…> placeholders). Every captured ticket leaves Step 4a with a real Impact × Likelihood and a real Effort bucket — never a placeholder, never a deferral marker.
5. Write the file
Single Write to docs/problems/open/<NNN>-<kebab-title>.md (per ADR-031 per-state-subdir layout). The P119 PreToolUse hook permits the Write because Step 2 set the marker.
6. Commit per ADR-014 — single commit, inline README refresh (P094)
P199 / Option 2 amendment (2026-06-05). This step previously skipped the README refresh and emitted a RISK_BYPASS: capture-deferred-readme trailer to clear the P165 README-refresh gate. The user-directed Option 2 resolution (recorded 2026-05-31 on P199) kills the deferred-README-refresh contract: capture-problem now stages docs/problems/README.md inline, mirroring /wr-itil:manage-problem Step 5 P094 (refresh-on-create) + P134 (last-reviewed rotation). The trailer is dropped from the commit; the allow-list entry in packages/itil/hooks/lib/readme-refresh-detect.sh::_README_REFRESH_BYPASS_TRAILERS is retained as inert dead code (minimal-change discipline — future adopters that registered against the token continue to work). Authority: P199 Option 2 user direction + ADR-032 amendment + ADR-014 bypass-token-table amendment (same single coherent commit).
README.md refresh on new ticket (P094)
After writing the new .open.md file at Step 5, regenerate docs/problems/README.md to insert the new ticket's row into the WSJF Rankings, and stage the refreshed README in the same commit as the new ticket. The mechanism is inline at this execution site per P331 — not deferred via cross-reference — so a single-pass agent reading Step 6 does not silently skip the archive step (the canonical P331 silent-skip regression).
Mechanism: use the same rendering rules as /wr-itil:manage-problem Step 5 P094 / Step 7 P062 (glob docs/problems/*.open.md / *.known-error.md / *.verifying.md / *.parked.md AND the per-state-subdir layout docs/problems/open/*.md / docs/problems/known-error/*.md / docs/problems/verifying/*.md / docs/problems/parked/*.md; rank open/known-error by WSJF; list verifyings in the Verification Queue ordered by Released date ASC per P150; list parkeds in the Parked section). The refresh is a render, not a re-rank — existing WSJF values on the other ticket files are trusted per P062's established discipline. Only the new ticket's own (deferred-placeholder) WSJF is consumed from its freshly-written file. WSJF Rankings tier + tie-break sort (P138 + ADR-076) and Verification Queue sort direction (P150) and Likely-verified cell shape (P186) all follow the canonical render rules — see /wr-itil:manage-problem Step 5 P094 block for the full prose; drift here re-opens those tickets.
P134 last-reviewed rotation — inline at this execution site (not deferred to a § subsection) per P331 silent-skip discipline. MUST execute IN ORDER:
- Read line 3 of
docs/problems/README.md: awk 'NR==3' docs/problems/README.md.
- Append-if-non-empty (BEFORE step 3, not after) — if line 3 is non-empty AND not a same-session same-verb near-duplicate of the new fragment, append the existing line 3 verbatim to
docs/problems/README-history.md under a ## YYYY-MM-DD heading (creating the heading on first append for that date; subsequent same-day appends nest under the existing heading). Run this BEFORE the Edit-tool rewrite in step 3 — Edit's replace pattern destroys the displaced content otherwise.
- Rewrite line 3 of
docs/problems/README.md with the new fragment of form > Last reviewed: YYYY-MM-DD **P<NNN> captured** — <one-line title> (lightweight aside via /wr-itil:capture-problem). Soft cap ≤ 1024 bytes per fragment; hard ceiling 5120 bytes per ADR-040 Tier 3 envelope.
- Stage all three —
git add docs/problems/open/<NNN>-<kebab-title>.md docs/problems/README.md docs/problems/README-history.md so the same single commit per ADR-014 captures the new ticket + refreshed README + (when line-3 displaced) history. Omit README-history.md from the stage list when no line-3 displacement occurred (no untracked diff). Canonical rationale anchor: /wr-itil:manage-problem § Last-reviewed line discipline (P134) subsection.
git add docs/problems/open/<NNN>-<kebab-title>.md docs/problems/README.md
git add docs/problems/README-history.md
Satisfy the commit gate per ADR-014 — same two-path pattern as manage-problem Step 11:
- Primary: delegate to subagent type
wr-risk-scorer:pipeline via the Agent tool.
- Fallback: invoke
/wr-risk-scorer:assess-release via the Skill tool when the subagent type is unavailable in the current tool surface.
Land the commit via the wr-risk-scorer-restage-commit helper — atomic re-stage + commit in a single bash call (P326 wrapper). The Agent-tool delegation above can silently clear the index; the helper re-adds the supplied paths, asserts non-empty staging, then runs git commit with the supplied -m args:
wr-risk-scorer-restage-commit \
-m "docs(problems): capture P<NNN> <title>" \
-- docs/problems/open/<NNN>-<kebab-title>.md docs/problems/README.md
The capture verb in the message is the audit signal that this ticket landed via the lightweight aside path (vs. open for manage-problem's full intake). The P165 README-refresh-discipline hook now allows the commit naturally because the README is staged — no RISK_BYPASS trailer needed.
7. Report
After the commit, report:
-
The new ticket file path and ID.
-
The list of duplicate matches found (if any). If matches found, name them and remind the user to merge at next /wr-itil:review-problems if appropriate.
-
Trailing pointer (conditional shape per P271): invoke wr-itil-check-deferred-placeholder-staleness "$PWD" to read the deferred-placeholder + README-cadence staleness signal. The pointer shape switches on the helper's five-outcome enum:
preflight_reason="$(wr-itil-check-deferred-placeholder-staleness "$PWD")"
See /wr-itil:work-problems SKILL.md Step 0c for the canonical contract on the two-axis trigger (count ≥ 3 ungrounded-rating tickets — the ADR-026 not estimated sentinel — AND README age > 7 days); the threshold constants live in the helper.
preflight_reason | Trailing-pointer shape |
|---|
no-deferred-placeholders / below-threshold ... / fresh-readme ... | Default (low-priority) pointer: "Run /wr-itil:review-problems next to re-rate the ungrounded (not estimated — no prior data) ratings." (README is now refreshed inline at Step 6 per P199 Option 2 — the pointer no longer names a README-refresh action in the default shape.) |
no-readme count=<N> | Highlighted (actionable) pointer: "⚠ <N> ungrounded-rating ticket(s) (ADR-026 not estimated sentinel) have accumulated AND docs/problems/README.md is missing/malformed — run /wr-itil:review-problems NOW to rebuild the README and re-rate placeholders." (Fires only when README is genuinely missing/malformed despite this skill's inline refresh — a drift class the helper still surfaces.) |
stale-readme count=<N> age=<X>s threshold=<Y>s | Highlighted (actionable) pointer: "⚠ <N> ungrounded-rating ticket(s) (ADR-026 not estimated sentinel) have accumulated AND the WSJF Rankings cadence is <X> days stale (> 7-day threshold) — run /wr-itil:review-problems NOW to re-rate placeholders." (Inline refresh at Step 6 freshens the README mtime on every capture, so this shape now fires only when captures are absent for > 7 days — a real cadence-stale signal, not capture-driven drift.) |
Why conditional, not auto-dispatch (ADR-032 + JTBD-001): capture-problem is intentionally lightweight per ADR-032 P155 amendment. Auto-dispatching review-problems from capture would re-introduce the ~10-turn ceremony the lightweight aside is engineered to avoid. The conditional pointer surfaces the signal "ungrounded-rating backlog has grown AND the cadence axis hit threshold" when both axes fire. The user picks when to absorb the re-rate cost.
Fail-soft: any error in the helper invocation MUST NOT block the report — fall back to the default pointer shape.
The trailing pointer is not optional — it is the user-visible signal for ungrounded-rating re-rating cadence (P375 re-point: the count is now ADR-026 not estimated sentinels, not blanket deferred placeholders). The conditional highlight (P271) escalates the signal when the ungrounded-rating backlog AND the cadence axis both hit threshold. Drift here re-opens P271.
Composition with manage-problem
| Concern | manage-problem | capture-problem |
|---|
| Duplicate-check | Wide-net grep + AskUserQuestion branch on matches | 3-keyword title-only grep, list-only (no branch) |
| Multi-concern split | Step 4b AskUserQuestion | Out of scope (one ticket per invocation) |
| Skeleton-fill | Full-intake; AskUserQuestion for missing fields | Deferred-placeholder pattern; low-confidence persona/JTBD → interview-to-elicit-who/why (never propose an ID; never discard the problem) |
| Type-tag prompt | RETIRED (P287, 2026-06-02) | RETIRED (P287, 2026-06-02) — the technical/user-business axis was removed as redundant with RFC/Story persona-anchoring per ADR-060 Phase 4 |
| JTBD-trace + persona | Step 4-equivalent ingestion path | Step 1.5b derive → interview → classify dispatch (ADR-060 Amendment 2026-06-02 as corrected by P401) — flag pre-resolution (--jtbd= / --persona=) silent-proceeds; lexical detection of JTBD-NNN citations silent-proceeds; cited-JTBD persona derivation silent-proceeds; low-confidence → INTERVIEW to elicit who/why (not propose an ID) → agent classifies existing:map+proceed / no-fit:human-ratifies-CREATION (ADR-068/P288); problem NEVER discarded over anchoring; AFK --no-prompt → capture with unconfirmed-anchoring sentinel + queue elicitation |
| AskUserQuestion authority | Multiple branches (deviation-approval / direction-setting / taste / mechanical) | Direction-setting (ADR-044 category 1) on the low-confidence interview + on the new-artefact creation-ratify; silent-framework (category 4) on derive-success paths AND on the agent's existing-vs-new classification of the elicited who/why |
| README refresh | P094 inline (regenerate + stage in same commit) | P094 inline (regenerate + stage in same commit) — P199 Option 2 amendment 2026-06-05; previously deferred to next /wr-itil:review-problems |
| Status transitions | Step 7 owns Open → Known Error → Verifying → Closed | Out of scope (creation only) |
| Commit grain | One commit per intake (or per split-concern set) | One commit per capture |
| Use case | Full-intake new problem; user wants to walk the flow | Aside-invocation; capture-and-continue |
The two skills share the /tmp/manage-problem-grep-${SESSION_ID} create-gate marker per P119 — calling either skill's Step 2 grep + mark sequence permits new ticket Writes for the rest of the session, regardless of which skill landed first.
Related
- P155 (
docs/problems/closed/155-ship-capture-problem-skill.md) — driver ticket.
- P014 (
docs/problems/open/014-aside-invocation-for-governance-skills.md) — parent / master tracker.
- P078 — capture-on-correction OFFER pattern; depends on capture-problem shipping.
- P119 — manage-problem create-gate hook; capture-problem composes with the same marker.
- P199 (
docs/problems/verifying/199-...md) — Option 2 amendment 2026-06-05: kill the deferred-README-refresh contract; Step 6 now stages README inline per P094. User direction recorded 2026-05-31 in the ticket. This SKILL change rides with the ADR-032 + ADR-014 amendments in the same coherent commit.
- P262 (closed) — the P165 README-refresh-discipline hook conflicted with this skill's previous deferred-README-refresh contract. The prior workaround was the
RISK_BYPASS: capture-deferred-readme allow-list token. Superseded by P199 Option 2 (2026-06-05) — capture-problem now stages README inline and the trailer is no longer emitted. The allow-list entry in packages/itil/hooks/lib/readme-refresh-detect.sh::_README_REFRESH_BYPASS_TRAILERS is retained as inert dead code (minimal-change discipline; adopter compatibility).
- P265 — the RISK_BYPASS-trailer allow-list mechanism in
readme-refresh-detect.sh. Still in force for the adr-031-migration token; the capture-deferred-readme entry is now inert (no live emitter) but registered for adopter compatibility.
- P170 (
docs/problems/known-error/170-problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-rfc-framework.md) — RFC framework driver; Slice 4 B7.T3 / item 8c historically authored the type-classification prompt at Step 1.5 (RETIRED by P287, 2026-06-02).
- P176 — agent-side I2 (no type-branching) coverage gap on the SKILL.md surface. P287 retires the type axis altogether; the regression guard is preserved under
packages/itil/scripts/test/no-type-regression-guard.bats (asserting the **Type**: field is GONE from skeleton templates).
- P287 (
docs/problems/.../287-remove-technical-user-business-type-classification-from-problems-redundant-with-rfc-persona-anchoring.md) — the user direction (twice-confirmed 2026-05-25 + 2026-06-02) that retired Step 1.5 Type classification; ADR-060 amendment substance (I12 replacement, Phase-4 rework) queued for user re-confirmation per ADR-074.
- ADR-032 (
docs/decisions/032-governance-skill-invocation-patterns.proposed.md) — foreground-lightweight-capture variant amendment (P155); 5th invocation pattern amendment (P346 Phase 3, 2026-05-31) codifies the hang-off-check sub-step 2b dispatch as the canonical fresh-context-subagent-as-decision-arbiter shape.
- P346 (
docs/problems/.../346-...md) — backlog-flow-control master ticket; Phase 3 deliverable lands the hang-off-check dispatch at sub-step 2b above.
- RFC-013 (
docs/rfcs/RFC-013-...proposed.md) — traces P346 Phases 1+2+3 per ADR-071 unconditional Problem→RFC trace.
packages/itil/agents/hang-off-check.md — the fresh-context subagent invoked by sub-step 2b; reads only the structured input payload; emits HANG_OFF: P or PROCEED_NEW with rationale + signals + absorb directive.
- ADR-038 — progressive-disclosure pattern (SKILL.md + REFERENCE.md split).
- ADR-044 — decision-delegation contract. Persona derivation (Step 1.5b) is derive-first: silent-framework per category 4 when cited JTBDs agree on persona; taste per category 5 fallback only on cited-JTBD-persona disagreement. JTBD-trace itself is purely category 4 (lexical detection or
--jtbd= flag pre-resolution). The retired Step 1.5 Type classification was a derive-first dispatch too (RETIRED by P287, 2026-06-02).
- P185 —
/wr-itil:capture-problem historical: asked a classification question (type) it could answer itself; the Step 1.5 derive-first refactor (lexical-signal classifier + stderr advisory) shipped the fix in 2026-05-15. P287 then retired the entire surface in 2026-06-02 as the classification axis itself was redundant with RFC/Story persona-anchoring.
- ADR-049 — bin/ on PATH; capture-problem reuses the existing
wr-itil-reconcile-readme shim.
- ADR-052 — behavioural-tests-default for skill testing; SKILL.md I2 surface coverage gap is named, not silent (P176 + ADR-052 § Surface 2).
- ADR-060 (
docs/decisions/060-...accepted.md) — body currently encodes the type-tag schema (Decision Outcome item 1, I2 type-uniformity, I12 hard-block, Phase-4 persona+jtbd machinery keyed on type:user-business) AND the 2026-06-02 amendment's REJECT=discard clause. P287 retires the SKILL implementation of the type clauses unilaterally per twice-confirmed user direction; P401 (2026-06-29/2026-07-02) reverses the REJECT=discard clause to interview-on-low-confidence + never-discard + ratify-creation-only (see the Step 1.5b supersession note). Both ADR body amendment substances (the P287 type rework; the P401 I12 reshape) plus the ADR-073 additive symmetric covered→agent / uncovered→human-ratifies-new-persona/JTBD escalation note are queued for user re-confirmation per ADR-074/P357. Until they land, ADR-060/ADR-073 bodies and SKILL implementation are intentionally inconsistent — the same governed SKILL-leads-ADR-follows trade-off the user accepted for P287.
- P401 (
docs/problems/open/401-capture-persona-jtbd-shoehorns-or-discards-instead-of-interviewing.md) — the driver: the old propose-candidate-IDs + REJECT=discard flow shoehorned problems into the nearest persona/JTBD and discarded legitimate problems over anchoring uncertainty. This SKILL amendment lands the corrected interview-based shape; the ADR-060/ADR-073 body amendments + the /wr-itil:work-problems AFK caller-side wiring (route the queued elicitation into outstanding_questions) remain tracked on P401's Investigation Tasks.
- JTBD-301 (
docs/jtbd/plugin-user/JTBD-301-...md) — plugin-user no-pre-classification persona constraint; the Step 1.5b maintainer-side scope guard preserves the firewall on the JTBD-trace + persona axis. The type-axis firewall is moot (axis retired).
packages/itil/skills/manage-problem/SKILL.md — heavyweight intake counterpart.
packages/itil/skills/review-problems/SKILL.md — re-rates the deferred placeholders + refreshes README.md.
packages/itil/scripts/test/no-type-regression-guard.bats — pure-bash regression guard that the **Type**: field stays GONE from skeleton templates + ticket bodies. Replaces the historical i2-no-type-branching.bats (which asserted no-control-flow-branch-on-type; with the type axis retired, the branch-protection invariant is vacuous, but the field-absence regression guard preserves the audit trail per architect-review verdict 2026-06-02).
$ARGUMENTS