plugins/clarify/skills/interview/SKILL.md
This skill should be used when the user's request or requirement is ambiguous and needs an iterative interview to become actionable — vague feature requests ("add notifications"), incomplete bug reports ("the export is broken"), underspecified tasks and migrations ("make it faster", "convert this to TypeScript"), or any build request the user hasn't fully thought through. Trigger on "clarify requirements", "refine requirements", "요구사항 명확히", "요구사항 정리", "요구사항 인터뷰", "인터뷰해줘", "interview me", "ask me questions before building", "make this clearer", "spec this out", "scope this", "/clarify:interview". Turns vague inputs into concrete specs and surfaces considerations the user hasn't thought of. For strategy blind spots use unknown; for content-vs-form reframing use metamedium.
npx skillsauth add october-academy/agent-plugins interviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Turn a vague request into a spec the user actually wants built, through a hypothesis-driven interview.
The request the user gives is a map; the codebase and its real constraints are the territory. Every gap between them is an unknown that would otherwise get filled with a guess. Instructions that are too specific get followed even when a pivot is better; instructions that are too vague get patched with industry defaults that may not fit. The interview escapes both failure modes: instead of guessing, put the decision points in front of the user — including the ones they never thought to raise. A few minutes of questions is the cheapest way to find out what nobody knew, before it gets expensive to fix.
For strategy/planning blind spot analysis, use unknown. For content-vs-form reframing, use metamedium. If the user's uncertainty is "I'll know it when I see it" (visual/design taste), offer 2-3 quick prototypes or variants instead of more questions — interviews resolve ambiguities that words can settle.
Parse input:
.claude/clarify-interview.local.md at the project root (the current working directory). The Stop hook resolves the same path from the hook cwd.---
iteration: 1
max_iterations: [MAX_ITERATIONS]
original_requirement: "[REQUIREMENT]"
started_at: "[ISO 8601 timestamp, e.g. 2026-07-10T14:30:00+09:00]"
---
## Original Requirement
"[REQUIREMENT]"
## Clarification Progress
(Append one block per round — see Interview Rounds step 4)
started_at is required: the Stop hook has no session id at skill time, so it binds the loop to the current session on its first fire (adds session_id itself) and uses started_at for a 2-hour TTL. Do not add session_id yourself.
Create the companion guard file .claude/clarify-interview.guard in the same directory, containing one line: [iteration] [max_iterations] _ [current unix epoch] (e.g. 1 3 _ 1783728000 — get the epoch with date +%s). This is the hook's tamper-evidence: it snapshots the loop position so tag validation survives even if the state file goes missing; the epoch anchors its 2-hour TTL to creation time, and the hook rejects guards without one. Never delete it — the hook consumes it.
Confirm activation:
Interview clarification loop activated!
Original Requirement: "[REQUIREMENT]"
Max Iterations: [MAX_ITERATIONS]
Say "cancel" or "stop" anytime to end the loop.
Before designing any question, spend a few minutes in the actual project: the files the request touches, recent related changes, README/config that constrains the answer. Two reasons:
If there is no project context (greenfield conversation), skip the sweep and ground questions in the request's own domain instead.
When the project carries cheap, side-effect-free checks (existing test suite, typecheck, lint), run them during the walk — a currently-red test or broken script is a territory fact the user may not know, and it often becomes a Success Criterion or a scope question.
List candidate unknowns across: scope, behavior, data/interface, constraints/priority, success criteria. An ambiguity is material when different plausible answers lead to different implementations — if every answer lands in the same code, don't ask.
Then look past the user's own framing: what has this user not considered at all? Failure and abuse paths, volume/rate extremes, lifecycle after the happy path (what happens after the third retry fails?), who else is affected. Plan at least one question or option per interview that surfaces such a blind spot — the mark of a good interview is the user saying "oh right, that too." If the territory suggests the request itself may be solving the wrong problem, raise that as a question, not a silent redirect.
Use AskUserQuestion. This section is the single source of truth for question shaping — the Stop hook only re-injects a pointer back here, it does not restate the rules.
Runtime note — capability ladder (every rule below applies at each step):
multiSelect supported.request_user_input where available (it is single-select and may be absent outside plan mode; its app-server contract documents 1–3 questions per call, so keep a round to ≤3 questions there). Ask a would-be multiSelect question as plain text ("해당하는 것 모두"), and when the tool itself is unavailable, drop to the plain-text form below.1) 옵션 / 2) 옵션 / 3) 기타: 직접 설명 — and wait for one reply covering all questions; say explicitly that multiple picks are welcome where choices aren't exclusive. Before ending a turn that prints plain-text questions, set awaiting_user: "true" in the state-file frontmatter (add the key if absent) — the Stop hook lets exactly that turn end so the user can actually reply, then flips the flag back; without it the hook would re-inject the loop over your pending questions.What kind of login do you want?OAuth / Email+Password / SSO / Magic link신규 파일만 + 기존 파일은 손댈 때 전환). End-state-only options force users to smuggle "gradually, please" through Other. On a running system, never label the most invasive end-state (Recommended) unless the territory gave you a concrete reason.(Recommended). Use multiSelect: true when choices aren't mutually exclusive. A delegation option that names its consequence (잘 모르겠어요 — 추천대로 (X로 가정)) beats a bare "모르겠음": the user sees what deferring commits them to.## Clarification Progress. Keep iteration equal to the round you are currently asking — bump it as you start a round, not after the last one — and mirror every iteration bump into the first number of .claude/clarify-interview.guard (never lower it). Sessions get compacted and interrupted; the state file is what lets the loop resume without re-asking, and the guard is what lets the hook validate the terminal tag even if the state file disappears.### Round N
- [axis]: [outcome] — decided | assumed (recommended default) | still open
owner 미확인. Never present a deferred axis as decided, and never let it become a plain assumption without the pending-owner marker.
계속 다듬기 / 여기까지 — 현재 이해로 진행, localized) — never as an extra option stuffed into a domain question, which merges two axes into one question. If the round's payload already needs all 4 slots for real hypotheses, skip the exit question and rely on Phase 4 judgment instead. When material ambiguities clearly remain, don't offer a premature exit; when none remain, don't ask another round at all — summarize.Summarize when any of these holds:
max_iterations is reachedHitting max_iterations with material axes still unasked is triage, not completion: spend the final round on correctness-critical axes first. Each unasked material axis goes under Still Open labeled un-asked (e.g. 미질문 — 라운드 예산 소진) with how it gets resolved — not as an assumption carrying a concrete default you invented, and never as something the user delegated. A capped interview ends with <promise>CLARIFICATION CAPPED</promise> instead of the COMPLETE tag (Phase 5); ending this way is a legitimate, expected exit — emit the summary without hesitation.
A fully-consumed budget always ends CAPPED — even when every axis you thought of was asked and resolved. You can only triage axes you conceived of; a burned budget left no room to probe for the ones you didn't, so "no material axis remains" is a claim you cannot make from a spent budget (that exact claim has been measured false: interviews that declared it were missing a spec-changing axis the requester never volunteered). COMPLETE is reserved for interviews that end themselves with budget to spare. In the all-axes-resolved capped case, Still Open carries one honest line — 라운드 예산 소진 — 미탐지 축 잔존 가능성, 구현 첫 리뷰에서 재확인 — instead of invented un-asked topics.
If the user signals they want to cancel or stop the loop (e.g. "cancel", "stop", "그만", "중단"), delete .claude/clarify-interview.local.md and .claude/clarify-interview.guard, then end the loop without a summary.
Every line of the After spec must trace to a user answer, a fact you verified in the territory, or a listed assumption — a spec line with no source is fabrication. Before emitting the promise, audit the After spec claim by claim — parentheticals included (volumes, thresholds, counts, quotes) and motivation/state claims ("팀 보고가 막혀 있어", "X가 매주 쓴다"-류) — and write the audit down: append a ### Claim audit block under ## Clarification Progress in the state file, mapping each factual claim to its source (R2.Q1 답변 | territory src/db.js:12 | 가정 #2). A claim you cannot give a source line gets rewritten as an assumption or dropped. The label or description of an option the user did NOT select is context, never a source — a value that exists only in unselected option text (a date boundary, a threshold, a gloss like "KST 기준") enters the spec as a recorded assumption or not at all. Context can carry facts nobody said (an earlier plan, a pasted doc, your own hypothesis options); the written ledger is what keeps them out of the spec.
## Requirement Clarification Summary
### Before (Original)
"{original requirement verbatim}"
### After (Clarified)
**Goal**: [precise description]
**Reason**: [why this matters]
**Scope**: [included and excluded]
**Constraints**: [limitations and preferences]
**Success Criteria**: [how completion is verified — push for a measurable threshold]
**Decisions Made** (user-selected):
| Question | Decision |
|----------|----------|
**Assumptions** (recommended defaults the user deferred — flag before building on them; omit if none):
| Topic | Assumed |
|-------|---------|
**Surfaced Along the Way**: [considerations the user hadn't raised, now decided or assumed — omit if none]
**Still Open**: [residual unknowns + how each gets resolved (experiment, measurement, later decision) — omit if none]
The user should leave with a better map, not just answered questions — the last two sections are where the interview pays for itself.
Write all content (activation message, questions, summary values) in the conversation's language; keep the structural headings and the promise tag verbatim so hooks and tooling can parse them.
Then output the terminal promise:
<promise>CLARIFICATION COMPLETE</promise> — clarification is genuinely complete and the interview ended itself with round budget to spare.<promise>CLARIFICATION CAPPED</promise> — the round budget was fully consumed (whether or not material axes remain unasked — Phase 4 triage). Same terminal effect, honest label; Still Open carries the un-asked axes, or the single budget-exhausted line. The Stop hook enforces this: a COMPLETE emitted at the cap is rejected once with a request to re-emit as CAPPED.After emitting either tag, leave .claude/clarify-interview.local.md and .claude/clarify-interview.guard in place — the plugin's Stop hook validates the tag against the loop state (a fully-consumed budget must not end COMPLETE) and deletes both files itself; deleting them in the same turn would blind that check. Only in a hookless runtime (no Stop hook installed — e.g., this SKILL.md executed standalone by a harness that says it owns the lifecycle) do you delete them after the promise. Cancellation deletes both files directly in both runtimes.
AskUserQuestion returns answers mid-turn, so all rounds normally happen inside one turn and end with the summary + promise. The Stop hook is the safety net, not the driver: if a turn ends without a terminal promise tag, it re-injects the loop (re-read ## Clarification Progress first, then ask only what's still open) and enforces the 2h TTL; at max_iterations it demands the final summary once instead of asking further rounds; it deletes the state file when it sees either terminal tag. You own iteration while interviewing (step 4 above); the hook bumps it only on re-entry after an interrupted turn.
Now begin: create the state file, walk the territory, identify the material ambiguities and at least one blind-spot probe, and ask the first batch.
data-ai
블로그 초안/최종 원고를 빠르게 보수 윤문하는 병렬 strict 워크플로. humanize-korean --strict의 검증 분리(fidelity, naturalness, 잔존 S1/S2 탐지)는 유지하면서 청크 병렬화로 속도를 줄인다. 트리거: "블로그 최종 윤문", "윤문 빠르게", "blog-humanize-fast", "humanize-korean strict 너무 느려", "병렬 strict 윤문", "AI 티 줄이되 의미는 건드리지 마", "최종 교열 후 윤문". 아닌 것(negative scope): 초안 대필·내용 추가/삭제·사실 수정이 아니다 — 문체·리듬·표현만 의미 불변으로 손본다. 라우팅: 새 글 집필은 blog-prep, 더 깊은 검증·낮은 등급 재검증이 필요하면 humanize-korean --strict, 맞춤법·오탈자만이면 직접 교정으로 보낸다.
tools
Reddit, HN, GitHub, RSS, npm, Bluesky, Mastodon, 한국 커뮤니티까지 어제~오늘 뜨는 빌더/AI/오픈소스 시그널을 수집하고 Threads 포스트용으로 큐레이션. GitHub는 gh CLI 우선, 없으면 공개 REST API로 폴백. '지금 뜨는 것'을 넓게 스캔해 후보를 뽑는 큐레이션 전용 스킬이다. 특정 주제를 다각도로 파고드는 심층 리서치는 이 스킬이 아니라 deep-research(다중 소스 fact-check 리포트)·last30days(한 주제의 최근 30일 여론) 영역이다. 트리거: '트렌드', '인기글', 'trend scout', '쓰레드 리서치', 'threads 소재', '오늘 뭐 올리지', '콘텐츠 소재', 'reddit 인기글', 'HN 인기글', '깃허브 트렌드', '오픈소스 소재', '해커뉴스', '트렌드 스카우트', 'github trending', 'what is hot on hacker news', 'open source radar', 'reddit trending', 'trending packages', 'daily tech digest', 'tech news today', 'developer trends'. /trend-scout로 실행.
tools
Commit and push in one step. Use when user says "/cp", "commit and push", "커밋하고 푸시", "커밋 푸시", "변경사항 올려줘", or wants to stage, commit, and push changes in a single action. Optionally accepts a commit message as argument. Not for creating, reviewing, or merging pull requests — commit and push only.
content-media
This skill should be used when the user's request or requirement is ambiguous and needs iterative questioning to become actionable. Trigger on "clarify requirements", "refine requirements", "요구사항 명확히", "요구사항 정리", "make this clearer", "spec this out", "scope this", "/clarify". Turns vague inputs into concrete specs. For strategy blind spots use unknown; for content-vs-form reframing use metamedium.