| name | interview |
| description | Socratic interview to crystallize vague requirements |
| aliases | ["socratic"] |
| mcp_tool | ouroboros_interview |
| mcp_args | {"initial_context":"$1","cwd":"$CWD"} |
/ouroboros:interview
Socratic interview to crystallize vague requirements into clear specifications.
Required Skill Capabilities
ask_user — ask human-judgment questions through the active runtime's user-question surface.
inspect_code — answer repo-local factual questions from exact local files before asking the user.
call_mcp — use Ouroboros MCP tools for persistent interview state and seed generation.
run_lateral_review — invoke lateral thinking subagents before milestone turns and direct-answer synthesis.
web_research — fetch current external facts only when the interview genuinely depends on them.
run_shell — run bounded local commands for version checks and repository inspection.
refine_answer — confirm structured interpretations of free-text answers before forwarding them.
maintain_ledger — keep ambiguity, gates, and unresolved decisions visible in the main session.
run_closure_gate — audit readiness locally even when MCP reports seed-ready.
restate_goal — restate the goal and require explicit approval before seed generation.
Non-Skippable Gates
- Refine free-text answers that carry scope, constraints, or decisions.
- Maintain a visible ambiguity ledger in the main session.
- Treat MCP
seed-ready as permission to audit closure, not as completion.
- Apply Seed Closer criteria before suggesting or running seed generation.
- Run the Restate gate before seed generation.
- Require explicit user approval before suggesting or running seed generation.
Usage
ooo interview [topic]
/ouroboros:interview [topic]
Trigger keywords: "interview me", "clarify requirements"
Instructions
When the user invokes this skill:
Step 0: Version Check (runs before interview)
Before starting the interview, check if a newer version is available:
# Fetch latest release tag from GitHub (timeout 3s to avoid blocking)
curl -s --max-time 3 https://api.github.com/repos/Q00/ouroboros/releases/latest | grep -o '"tag_name": "[^"]*"' | head -1
Compare the result with the current version in the active runtime's local plugin metadata (for Claude installs this is .claude-plugin/plugin.json).
- If a newer version exists, ask the user through the active runtime's
ask_user capability:
{
"questions": [{
"question": "Ouroboros <latest> is available (current: <local>). Update before starting?",
"header": "Update",
"options": [
{"label": "Update now", "description": "Update plugin to latest version (restart required to apply)"},
{"label": "Skip, start interview", "description": "Continue with current version"}
],
"multiSelect": false
}]
}
- If "Update now":
- On Claude-plugin installs only:
- Run
claude plugin marketplace update ouroboros via the active runtime's run_shell capability (refresh marketplace index). If this fails, tell the user "⚠️ Marketplace refresh failed, continuing…" and proceed.
- Run
claude plugin update ouroboros@ouroboros via the active runtime's run_shell capability (update plugin/skills). If this fails, inform the user and stop — do NOT proceed to the package-manager step.
- On non-Claude runtimes, skip Claude plugin commands and proceed directly to the package-manager step for
ouroboros-ai; do not require Claude-only commands or tools.
- Detect the user's Python package manager and upgrade the MCP server:
- Check which tool installed
ouroboros-ai by running these in order:
uv tool list 2>/dev/null | grep "^ouroboros-ai " → if found, use uv tool upgrade ouroboros-ai
pipx list 2>/dev/null | grep "^ ouroboros-ai " → if found, use pipx upgrade ouroboros-ai
- Otherwise, print: "Also upgrade the MCP server:
pip install --upgrade ouroboros-ai" (do NOT run pip automatically)
- Tell the user: "Updated! Restart your session to apply, then run
ooo interview again."
- If "Skip": proceed immediately.
- If versions match, the check fails (network error, timeout, rate limit 403/429), or parsing fails/returns empty: silently skip and proceed.
Then choose the execution path:
Step 0.5: Load MCP Tools (Required before Path A/B decision)
The Ouroboros MCP tools are often registered as deferred tools that must be explicitly loaded before use. You MUST perform this step before deciding between Path A and Path B.
-
Use the active runtime's tool-discovery capability to find and load the interview MCP tool:
tool discovery query: "+ouroboros interview"
This searches for tools with "ouroboros" in the name related to "interview".
-
The tool will typically be named mcp__plugin_ouroboros_ouroboros__ouroboros_interview (with a plugin prefix). After runtime tool discovery returns, the tool becomes callable.
-
If the tool is callable — already exposed, or loaded by discovery — proceed to Path A.
An empty discovery result for an already-exposed tool is expected, not a failure.
Proceed to Path B only if the tool is genuinely absent (no Ouroboros MCP server).
IMPORTANT: Do NOT skip this step. Do NOT assume MCP tools are unavailable just because they don't appear in your immediate tool list. They are almost always available as deferred tools that need to be loaded first.
CRITICAL — deferred-schema guard (prevents "Invalid tool parameters"):
This skill makes ouroboros_* MCP calls across multiple turns, and each turn runs
in a fresh tool context. A deferred tool's schema loaded on one turn is NOT
guaranteed to still be loaded on the next. If you call any ouroboros_* MCP tool
while its schema is not loaded in the current turn, the runtime rejects the
call with "Invalid tool parameters" before it ever reaches the server.
Therefore: immediately before EVERY ouroboros_* MCP call in this skill, re-run
the tool-discovery load query for the specific MCP tool you are about to call
(idempotent — a no-op when the schema is already loaded) so the correct schema is
guaranteed present for that call. Use "+ouroboros interview" before
ouroboros_interview and "+ouroboros lateral" before
ouroboros_lateral_think. If a load ever returns no matching tool (and the tool is not already callable — an empty load for an already-exposed tool is an expected no-op, not absence), switch to the
documented fallback / Path B instead of retrying the failing call.
Path A: MCP Mode (Preferred)
If the ouroboros_interview MCP tool is available (loaded via runtime tool discovery above), use it for persistent, structured interviews.
Architecture: MCP is a pure question generator. You (the main session) are the answerer and router.
MCP (question generator) ←→ You (answerer + router) ←→ User (human judgment only)
Role split:
- MCP: Generates Socratic questions, manages interview state, scores ambiguity. Does NOT read code.
- You (main session): Receives MCP questions, answers them by reading code through the active runtime's
inspect_code capability, or routes to the user when human judgment is needed.
- User: Only answers questions that require human decisions (goals, acceptance criteria, business logic, preferences).
Interview Flow
-
Start a new interview:
Tool: ouroboros_interview
Arguments:
initial_context: <user's topic or idea>
cwd: <current working directory>
confused_terms: <optional explicit terms the user does not understand>
references: <optional [{reference_id, label, origin, url?, excerpt?}]>
Returns a session ID and the first question.
confused_terms and references are structured adapter context, not
requirements. They are queued on the start call and MUST NOT alter the first
question. On later turns, glossary help is limited to explicitly confused
terms and references are used only for contrast questions. Do not infer these
arguments from vocabulary density or fetch referenced URLs/files.
-
For each question from MCP, apply the routing paths below:
Parent-session question handoff:
If an MCP response includes meta.status="parent_question_required" or
meta.ask_user_directly=true, treat it as a normal interview continuation,
not as an MCP/provider/tool failure. Do not tell the user MCP failed, do
not expose reason_code, and do not retry the MCP question generator. Ask
exactly one natural Socratic clarification question yourself, using the same
routing judgement as any other interview turn. Save the exact user-facing
question text. When the user answers, call:
Tool: ouroboros_interview
Arguments:
session_id: <meta.session_id>
answer: <user answer>
last_question: <exact question you asked the user>
last_question is required on this path so MCP can persist the real
transcript even though the parent session generated the question.
Question-first advisory fanout:
If an MCP response includes meta.question_advisory_request, show the
interview question to the user first, then use the advisory request as a
parent-session assist layer. The advisory exists to help the human answer;
it must not hide, replace, or delay the question itself.
Read the stamped dispatch contract before running the lanes. With
dispatch_mode="host_driven", use the declared native parallel mechanism.
With dispatch_mode="host_decides", use native parallel fan-out when the
current host exposes it and otherwise process the same payloads sequentially.
With dispatch_mode="sequential", process payloads in order. For Claude Code
the parallel mechanism is Task/Agent; for Codex, explicitly start one native
subagent per payload in a single fan-out turn. Wait for every result, then
synthesize. The standard lanes are:
Dialectic Rhythm Guard
Track consecutive non-user answers (PATH 1a auto-confirms, PATH 1b code
confirmations, and PATH 4 research confirmations). If 3 consecutive questions
were answered without direct user judgment (PATH 1a, 1b, or PATH 4), the next
question MUST be routed to PATH 2 (directly to user), even if it appears
code- or research-answerable.
This preserves the Socratic dialectic rhythm — the interview is with the human,
not the codebase or external docs. Auto-confirmed answers especially need this
guard: if the AI answers too many questions on its own, the user loses awareness
of what the AI is assuming about their project.
Reset the counter whenever user answers directly (PATH 2 or PATH 3), or when a
PATH 1b / PATH 4 correction is routed through the Refine gate and sent as
[from-user][refined]. Only accepted code/research confirmations advance the
non-user streak.
Retry on Failure
If MCP returns is_error=true with meta.recoverable=true:
- Tell user: "Question generation encountered an issue. Retrying..."
- Call
ouroboros_interview(session_id=...) to resume (max 2 retries).
State (including any recorded answers) is persisted before the error,
so resuming will not lose progress.
- If still failing: "MCP is having trouble. Switching to direct interview mode."
Then switch to Path B and continue from where you left off.
Special case — meta.reason == "initial_context_too_large": When the
response carries this meta.reason (with meta.recoverable=true and
is_error=false — the wire success/failure axis is intentionally not
flipped, to keep existing callers like the auto driver working), the text
body is a meta-directive asking you to re-send a shorter context — it is
NOT an interview question. Do not route it through the active runtime's ask_user capability.
Instead, produce a concise summary of the original initial_context
(≤ meta.max_chars characters; covers goal, constraints, success criteria)
and re-call ouroboros_interview with session_id=<from meta> and the
summary as answer. The next response will contain the real first question.
Advantages of MCP mode: State persists to disk, ambiguity scoring, direct ooo seed integration via session ID. Code-enriched confirmation questions reduce user burden — only human-judgment questions require user input.
Path B: Plugin Fallback (No MCP Server)
If the MCP tool is NOT available, fall back to agent-based interview:
- Read
src/ouroboros/agents/socratic-interviewer.md and adopt that role
- Pre-scan the codebase: Use the active runtime's
inspect_code capability to check for config files (pyproject.toml, package.json, go.mod, etc.). If found, inspect key files and incorporate findings into your questions as confirmation-style ("I see X. Should I assume Y?") rather than open-ended discovery ("Do you have X?")
- Ask clarifying questions based on the user's topic and codebase context
- Present each question using the active runtime's
ask_user capability with contextually relevant suggested answers (same format as Path A step 2)
- Use the active runtime's
inspect_code and web_research capabilities to explore further context if needed
- Maintain the same ambiguity ledger and breadth-check behavior as in Path A:
- Track multiple independent ambiguity threads
- Revisit unresolved threads every few rounds
- Do not let one detailed subtopic crowd out the rest of the original request
- Apply the Refine gate (Path A Step 4) to free-text user answers before
absorbing them into your running understanding. The structure preservation
matters less here than in Path A (no MCP relay), but the "did I miss any
reasoning, constraints, or scope?" check still surfaces gaps.
- Prefer closure only after applying the Seed-ready Acceptance Guard above.
Then apply the Restate gate (Path A Step 9): collapse the agreed answers
into a one-sentence goal and confirm with the user before suggesting
ooo seed.
In fallback mode there is no MCP state to refresh, so if the user picks
"Adjust wording" or "Missing scope", ask the same follow-up questions from
Step 9, apply the correction directly to the local interview ledger and
one-sentence goal, rerun the Seed-ready Acceptance Guard locally, and ask the
Restate gate again with the corrected goal line. Do not try to "send it back
to MCP" in Path B; the conversation context is the source of truth.
- Continue until the user says "done"
- Interview results live in conversation context (not persisted)
- After completion, suggest the next step in
◆ Current state → next: format:
◆ Current state → next: ooo seed to crystallize these requirements into a specification
Interviewer Behavior
MCP (question generator) is ONLY a questioner:
- Always generates a question targeting the biggest source of ambiguity
- Preserves breadth across independent ambiguity tracks
- NEVER writes code, edits files, or runs commands
You (main session) are a Socratic facilitator:
- Read
src/ouroboros/agents/socratic-interviewer.md to understand the interview methodology
- You CAN use the active runtime's
inspect_code capability to scan the codebase for answering MCP questions
- For high-confidence factual questions (PATH 1a), auto-confirm and notify the user
- For all other questions, present to user as confirmation or direct question
- You NEVER make decisions on behalf of the user — auto-confirm is for FACTS only
- You are the final gate on MCP seed-ready signals: apply the canonical Seed
Closer criteria before suggesting
ooo seed
- The Dialectic Rhythm Guard prevents over-automation: after 3 consecutive
non-user answers, the next question MUST go directly to the user
Example Session
User: ooo interview Add payment module to existing project
MCP Q1: "Is this a greenfield or brownfield project?"
→ PATH 1a: exact match in pyproject.toml + src/ directory
→ ℹ️ Auto-confirmed: Brownfield, Python 3.12 / FastAPI (pyproject.toml)
→ [from-code][auto-confirmed] sent to MCP (counter: 1)
MCP Q2: "What payment provider will you use?"
→ PATH 2: human decision — no code can answer this
→ User: "Stripe"
→ [from-user] sent to MCP (counter reset to 0)
MCP Q3: "What authentication method does the project use?"
→ PATH 1b: found src/auth/jwt.py but inferred (not manifest)
→ "I found JWT-based auth in src/auth/jwt.py. Is this correct?"
→ User: "Yes, correct"
→ [from-code] sent to MCP (counter: 1)
MCP Q4: "How should payment failures affect order state?"
→ PATH 2: design decision
→ User: "Saga pattern for rollback"
→ Refine gate structures the answer
→ User: "Add to Out of scope"
→ Follow-up asks for exact missing text
→ User: "Do not build automatic retry scheduling yet"
→ Refine gate runs once more, then [from-user][refined] sent to MCP (counter reset to 0)
MCP Q5: "What are the acceptance criteria for this feature?"
→ PATH 2: requires human judgment
→ User: "Successful Stripe charge, webhook handling, refund support"
→ Refine gate passes; [from-user][refined] sent to MCP
MCP signals seed-ready; Acceptance Guard passes
→ Restate: "Add Stripe payments with charges, webhooks, refunds, and failed-payment rollback."
→ User: "Missing scope"
→ Follow-up asks for exact missing scope
→ User: "Exclude retry scheduling from the seed."
→ Refine gate structures the restate correction
→ [from-user][refined] restate correction sent to MCP; return to Step 7/Seed-ready guard
→ MCP signals seed-ready again; Acceptance Guard still passes
→ Restate again: "Add Stripe payments with charges, webhooks, refunds, failed-payment rollback, and no retry scheduling."
→ User: "Yes, generate seed"
◆ Current state → next: `ooo seed` to crystallize these requirements into a specification
Next Steps
After interview completion, use ooo seed to generate the Seed specification.
RFC #1392 State Breadcrumb Footer
Your final response MUST end with exactly one breadcrumb footer line:
◆ <current state> → next: <recommended action>
Derive <current state> from live session state via ouroboros_session_status when that MCP projection is available; otherwise derive it from this skill's actual outcome. Never use a linear Step N of M footer because Ouroboros is an evolutionary loop. When the next action is genuinely a choice, list 2-3 honest options in the next: clause. The breadcrumb line must be the last line of the response.