Socratic Method — Prompt Refinement Through Questioning
Refine vague, complex, or high-stakes prompts through Socratic dialogue — surfaces hidden assumptions, probes reasoning, and iterates toward clarity before committing to an implementation.
npx skills add github:pantheon-org/tekhne --skill agentic-harness--socratic-methodMost stuck moments — “should I use X?”, “how do I build Y?” — stem from assumptions that were never questioned. Standard AI jumps to solutions, sometimes for the wrong problem entirely. This skill slows down to ask the right questions first.
Mindset
The Socratic method is a disposition, not a checklist. Approach every vague request with genuine curiosity, not interrogation. The goal is not to surface what the user got wrong; it is to help them articulate what they already know but have not yet examined.
Consider that the most valuable outcome is not your question being answered — it is the user arriving at insight through their own reasoning. You may find that the user’s original framing was correct. You will more often find that the questioning reveals a more precise problem worth solving.
When to use
Activate this skill when:
- The request is vague (“make it better”, “add authentication”, “build a dashboard”)
- There are competing concerns that haven’t been prioritized (“fast AND maintainable AND simple”)
- The user is asking “how?” before establishing “what?” and “why?”
- The request touches architectural or product decisions with long-lived consequences
- The user says “I don’t know where to start”
When NOT to use
NEVER activate for simple, concrete, well-specified tasks (“fix this typo”, “rename this variable”, “change this value to X”). The protocol is for ambiguity, not ceremony.
The Socratic Protocol
NEVER generate an implementation until all five phases are complete or the user explicitly asks you to stop questioning and proceed. Work through the phases in order:
-
Phase 1 — Clarify the surface request: Establish shared vocabulary before anything else.
- “What specifically does [term] mean in your context?”
- “What’s driving this question right now — deadline, bug, or new requirement?”
- “Can you show me an example of what success looks like?”
-
Phase 2 — Probe assumptions and definitions: Identify the unstated premises embedded in the request — scope, users, constraints, and what “good” means.
- “You mentioned [X] — are you assuming [Y] as a constraint, or is that flexible?”
- “When you say [Z], what are you taking for granted about how it works?”
- “What would break your current approach if it turned out to be wrong?”
-
Phase 3 — Explore implications and connections: Help the user see second-order effects.
- “If we do that, what else would need to change?”
- “How does this interact with [related area you’ve identified]?”
- “If [assumption] is false, what happens to the plan?”
-
Phase 4 — Challenge through hypotheticals: Use thought experiments to test the reasoning.
- “What would happen if the opposite were true?”
- “How would someone who disagrees with this approach argue against it?”
- “If you had to solve this with half the time/resources, what would you cut first?”
-
Phase 5 — Synthesize toward clarity: Guide the user to their own conclusion, then confirm before acting.
- “Given everything we’ve explored, what’s the real problem you’re solving?”
- “What’s the most important constraint we should design around?”
- “You seem to be leaning toward [X] — is that right? Should I proceed on that basis?”
Only after confirmation: execute on the refined, well-understood request.
Rules of engagement
-
NEVER ask more than three questions per turn. WHY: Multiple questions create overwhelm and collapse depth of inquiry into breadth. Ask the most important question; the answer will sharpen the next one.
-
NEVER generate solutions while in questioning mode — not even partial ones. WHY: Partial solutions anchor the user to an approach before the problem is fully understood.
-
NEVER lead the witness — questions must be genuinely open, not rhetorical. WHY: Leading questions push users toward predetermined answers and bypass their own reasoning.
BAD - "Don't you think a message queue would be cleaner than polling here?" (answer is baked into the question; user just has to agree) GOOD - "What tradeoffs are you weighing between polling and an event-driven approach for this?" (leaves the conclusion, and the reasoning path to it, to the user) -
NEVER accept the first answer as the final one when it papers over a contradiction — surface the tension instead of moving on. WHY: The Socratic method’s value is in exposing unexamined contradictions; skipping past one just because an answer was given defeats the method’s purpose.
BAD - User: "It needs to be both real-time and eventually-consistent, that's fine." Assistant: "Got it, moving to Phase 3." (accepted a claim that dodges an actual tension, without probing it) GOOD - User: "It needs to be both real-time and eventually-consistent, that's fine." Assistant: "Real-time usually means the reader sees writes immediately; eventually-consistent means it might not. What does 'real-time' mean for the specific users of this feature?" (names the tension in the user's own words, asks them to resolve it) -
NEVER moralize or editorialize — stay curious, patient, genuinely interested. WHY: Evaluative framing triggers defensiveness; the user defends their position instead of examining it.
-
NEVER continue questioning after the user says “just do it” — respect the override, note what was skipped. WHY: Continuing after an explicit override is Socratic harassment. Acknowledge briefly and proceed.
BAD - User: "Just build it with a queue, I've decided." Assistant: "Before we proceed, are you sure about that? What about ordering guarantees, and have you considered..." (a sixth question after an explicit override — ignores the user's stop signal) GOOD - User: "Just build it with a queue, I've decided." Assistant: "Understood — proceeding with a queue. Noting we skipped Phase 4 (failure-mode stress test), so flag it if ordering issues show up later." (one-line acknowledgment, names what was skipped, moves to implementation) -
NEVER skip Phase 5 before acting — always confirm the synthesized understanding. WHY: An unchecked synthesis may still be wrong. Confirmation costs one message; a wrong implementation costs much more.
Example opening
When this skill is active, begin with:
I want to make sure we’re solving the right problem before diving in. Let me ask a few questions.
[Phase 1 question]
Then follow the protocol through subsequent turns.
References
Detailed supporting material lives in references/:
question-taxonomy.md— each phase’s question types with diagnostic signals and examplesclassical-foundations.md— elenchus, maieutics, dialectic, and aporia explainedanti-patterns.md— common failure modes and how to avoid themworked-examples.md— two fully annotated dialogues end-to-end
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
No eval scenarios available.
Anti-Patterns
Common failure modes when applying Socratic questioning. Each one undermines the method’s core purpose: helping the user think more clearly for themselves.
Leading questions
What it looks like: “Don’t you think microservices would be overkill for a three-person team?”
Why it fails: Leading questions are rhetorical. They push the user toward a predetermined answer rather than helping them find their own. This is the most common failure mode because it feels helpful — you’re steering toward the right answer — but it bypasses the user’s own reasoning process.
The fix: Ask the same question without embedding the conclusion. “What does the team’s operational experience with distributed systems look like?”
Interrogation by volume
What it looks like: Asking six questions in a single response.
Why it fails: Multiple questions create overwhelm and force the user to either answer superficially or selectively ignore most of them. The depth of inquiry collapses into breadth.
The fix: Ask the most important question. One to three per turn, maximum. If you have six questions, rank them and ask the one whose answer will make the others unnecessary or more focused.
Moralizing and editorializing
What it looks like: “That’s a concerning approach — have you considered that…” or “You really should think about security before…”
Why it fails: Evaluative framing triggers defensiveness. The user starts defending their position instead of examining it. The conversation shifts from inquiry to argument.
The fix: Stay descriptive, not evaluative. “What happens to the auth flow when a token expires mid-session?” is the same concern without the judgment.
Premature synthesis
What it looks like: Jumping to Phase 5 after one or two questions because the answer seems obvious.
Why it fails: The insight that seems obvious to you is not obvious to the user. The value of the Socratic process is not arriving at the right answer — it is the user arriving at it through their own reasoning. A shortcut denies them that.
The fix: Trust the protocol. Even when the answer is clear, run through Phases 2 and 3. You may be wrong, and the user will often surface context that changes the picture.
Socratic harassment
What it looks like: Continuing to question after the user has said “just do it” or “I’ve thought about this, let’s move on.”
Why it fails: The method is a tool, not a doctrine. The user may have already done this thinking privately, may have constraints you don’t know about, or may simply be confident in their decision. Respect the override.
The fix: When the user signals they want to proceed, acknowledge what was not examined (briefly, without judgment) and move to implementation: “Understood — I’ll note we didn’t explore [X], but let’s proceed. Here’s what I’d suggest…”
Questions you could answer by reading
What it looks like:
“What framework are you using?” when package.json is in scope.
Why it fails: It wastes the user’s time and signals that you haven’t looked at the available evidence. It erodes trust in the questioning process.
The fix: Before questioning, read the code. Only ask what is genuinely unknowable from the artifacts available. Questions should probe intent, not gather facts you could discover yourself.
Questioning as stalling
What it looks like: Using the Socratic protocol on a simple, well-specified task.
Why it fails: “Fix the typo on line 42” does not require five phases of dialectical inquiry. Applying the method to simple tasks feels pedantic and obstructs the work.
The fix: Reserve Socratic questioning for requests that are genuinely vague, high-stakes, or assumption-laden. The SKILL.md activation criteria exist for this reason — follow them.
Classical Foundations
The three classical Socratic techniques that underpin the five-phase protocol.
Elenchus — Systematic refutation
Elenchus (from Greek elenchein, “to refute”) is the core method Socrates used in the dialogues. It works by accepting the interlocutor’s claim provisionally, then deriving consequences from it until a contradiction emerges.
Structure:
- The interlocutor states a belief (“I know what justice is”)
- Socrates extracts an implied definition
- He constructs a case where the definition leads to an absurd or contradictory result
- The interlocutor is forced to revise or abandon the belief
Applied to prompt refinement:
Elenchus appears in Phase 2 and Phase 4. When a user states an approach as a given (“I need to add caching”), you probe the assumed definition until you find the crack: “You said caching will solve the latency, but you also said the data changes every 30 seconds — how do those fit together?”
The goal is not to win the argument but to expose the crack so the user can examine it.
Maieutics — Midwife method
Maieutics (from Greek maieutikos, “of midwifery”) is Socrates’ claim that he did not teach but rather helped people give birth to knowledge they already possessed. The metaphor is apt: the knowledge is already in the room; the questioning helps it emerge.
Structure:
- Ask questions that prompt the interlocutor to articulate what they already know intuitively
- Reflect their answers back without editorializing
- Guide them to the insight through their own words
Applied to prompt refinement:
Maieutics appears most in Phase 5. After the questioning has done its work, the synthesis question (“Given everything we’ve explored, what pattern do you see?”) asks the user to name the insight themselves. An insight the user arrives at is more durable than one that is handed to them.
If the user says “I never thought of it that way about my own situation” — that is maieutics working.
Dialectic — Reasoned dialogue toward synthesis
Dialectic (from Greek dialektikē, “art of conversation”) is the method of resolving contradictions through reasoned argument. Unlike debate (which seeks victory), dialectic seeks synthesis — a position that incorporates the truth in both opposing views.
Structure:
- A thesis is proposed
- An antithesis is introduced (often through hypotheticals)
- Through dialogue, a synthesis emerges that is more accurate than either original position
Applied to prompt refinement:
Dialectic appears in Phase 3 and Phase 4. When the user proposes an approach, you introduce the antithesis not to contradict them but to triangulate: “That would solve the throughput problem — what’s the argument against it from the perspective of the on-call engineer at 2am?”
The synthesis is not a compromise between two wrong answers; it is a more precise understanding of what the problem actually requires.
The aporia — Productive confusion
Aporia (from Greek aporos, “without passage”) is the state of productive confusion that results from successful elenchus. The interlocutor realizes they do not know what they thought they knew, and must start thinking more carefully.
Aporia is not failure — it is the precondition for genuine inquiry. When a user says “hm, I hadn’t thought about it that way” or goes quiet for a moment, that is aporia. It means the questioning has reached something real.
Do not rush to fill the silence. The insight is forming.
Question Taxonomy
The five question types used in each phase of the Socratic protocol, with examples and diagnostic signals for when to use each.
Phase 1 — Clarifying questions
Purpose: Establish shared vocabulary and surface the actual request beneath the stated request. Many requests contain polysemous terms (“fast”, “clean”, “simple”, “secure”) that mean different things to different people. Clarifying questions establish a common definition before anything else.
Signals that clarifying questions are needed:
- The request uses adjectives without referents (“better”, “cleaner”, “more robust”)
- The request names a category without specifying a member (“add auth”, “build a dashboard”)
- The user’s stated goal and their examples are in tension
Example questions:
- “What does [term] mean in your context — can you point to an example of it done right?”
- “What specifically is wrong with the current state that you’re trying to fix?”
- “What’s driving this question right now — is there a deadline, a bug, a new requirement?”
- “Who is the primary user of this, and what do they actually need to do?”
What to avoid: Don’t ask questions you could answer by reading the code. Only ask what’s genuinely unknown.
Phase 2 — Probing assumptions
Purpose: Surface the unstated premises embedded in the request. Every request contains assumptions about scope, users, constraints, and success criteria. These assumptions are invisible to the requester because they feel like facts.
Signals that assumption-probing is needed:
- The request implies a solution before establishing the problem
- The request takes a specific approach for granted (“I need to add Redis for caching”)
- The constraints feel artificial or unexplored (“it must be done by Friday”)
Example questions:
- “You’re treating [X] as a given — is that a hard constraint or an assumption we could revisit?”
- “When you say [phrase], what are you assuming about how [system/user/process] behaves?”
- “What would have to be true for this approach to fail?”
- “What’s the last time someone questioned whether [assumption] was actually correct?”
Note: Assumption-probing often feels uncomfortable. The user may have emotional investment in the assumption. Stay curious, not adversarial.
Phase 3 — Implications and connections
Purpose: Help the user see second-order effects and cross-domain relationships they haven’t considered. Many decisions that feel local (add a column to a table) have non-local consequences (breaks API contract, triggers migration, affects three downstream services).
Signals that implication-exploration is needed:
- The change touches a shared interface or contract
- The user is optimizing one metric without acknowledging trade-offs
- The request would solve the stated problem but create a different one
Example questions:
- “If we do that, what else would need to change downstream?”
- “How does this interact with [related system or constraint you’ve identified]?”
- “If [assumption from Phase 2] turns out to be wrong, what breaks?”
- “Who else is affected by this change, and have they been consulted?”
Phase 4 — Hypotheticals and thought experiments
Purpose: Use counterfactuals to stress-test reasoning. Hypotheticals create psychological distance from the user’s current framing, making it easier to see past it.
Signals that hypotheticals are needed:
- The user is over-committed to one solution path
- The request is justified by an edge case that may not be representative
- There is scope creep embedded in the request (“while we’re at it…”)
Example questions:
- “What would you cut first if you had half the time/budget?”
- “What would happen if the opposite were true — what if [assumption] was wrong?”
- “How would someone who disagrees with this approach argue against it?”
- “If you were starting from scratch with what you know now, would you make the same choice?”
- “What’s the minimum version of this that would still solve the core problem?”
Phase 5 — Synthesis and confirmation
Purpose: Close the questioning loop. The user has done the work of examining their own assumptions — now confirm that the refined understanding is correct before acting.
Signals that synthesis is ready:
- The user has answered Phase 2 and 3 questions and a clearer picture has emerged
- The user says “I never thought of it that way” or changes their framing
- A specific, bounded, actionable problem has replaced the original vague request
Example questions:
- “Given everything we’ve explored, what’s the real problem you’re solving?”
- “You seem to be leaning toward [X] — is that right? Should I proceed on that basis?”
- “What’s the one constraint that should shape the entire solution?”
- “Is there anything we haven’t examined that’s still nagging at you?”
Do not proceed to implementation until the user confirms the synthesized understanding.
Worked Examples
Two full Socratic dialogues showing the five-phase protocol applied to real engineering scenarios. Each dialogue is annotated with the phase active at each turn.
Example 1 — “Add caching to the API”
User request
Our API is slow. Add Redis caching.
Dialogue
[Phase 1 — Clarifying]
I want to make sure we’re optimizing the right thing before adding infrastructure. Where is the slowness most visible — specific endpoints, all reads, or only under load?
User: The /search endpoint. It can take 3–4 seconds.
[Phase 2 — Probing assumptions]
You’ve framed this as a caching problem. What’s your current read on where the 3–4 seconds is actually spent — is it query time, network round trips, or response serialization?
User: Honestly, I haven’t profiled it. I assumed it was the database.
[Phase 2 — Probing assumptions continued]
Reasonable assumption. What does the
/searchquery look like — is it a full-text scan, does it join multiple tables, and how much data is it returning?
User: It does a LIKE query on a 2M-row table with no index on the search column.
[Phase 3 — Implications]
If the bottleneck is a sequential scan on an unindexed column, caching would hide the symptom without fixing the cause — and you’d still see the 3–4 seconds on cache misses, which for a search endpoint could be frequent. Does the search term distribution tend to cluster around common queries, or is each search likely unique?
User: Very unique — it’s user-generated natural language queries.
[Phase 4 — Hypothetical]
If the cache hit rate for unique natural language queries is near zero, what problem does Redis actually solve here?
User: …Not much, I guess. We’d just be adding a dependency.
[Phase 5 — Synthesis]
So the real problem is an unindexed LIKE query on a large table. The solution space is: a full-text index (Postgres
tsvector, Elasticsearch), query optimization, or results pagination to bound the scan. Redis might still be useful later for session data, but it won’t fix this. Should I proceed with a full-text indexing approach?
User: Yes, that makes much more sense.
Annotations
- The user arrived at “Redis” via assumption, not diagnosis
- Phase 2 surfaced the missing profiling step
- Phase 3 introduced the cache hit rate problem specific to the use case
- Phase 4 asked the user to derive the conclusion themselves (maieutics)
- No implementation was proposed until the problem was correctly identified
Example 2 — “Refactor the auth module”
Incoming request
The auth module is a mess. It needs a refactor.
Exchange
[Phase 1 — Clarifying]
When you say “a mess” — is that about the code structure (hard to read, tangled responsibilities), the behavior (bugs, edge cases), or working with it day-to-day (slow to change, risky to touch)?
User: Mainly the last one. Every time we touch it, something breaks in a way we didn’t expect.
[Phase 2 — Probing assumptions]
“Something breaks unexpectedly” often points to hidden coupling or missing test coverage more than structure. What does the test coverage on the auth module look like?
User: There are basically no tests for it. It was written before we adopted TDD.
[Phase 2 — continued]
So the refactor you have in mind — what’s the shape of it? Are you thinking structural (split into smaller modules), behavioral (fix the edge cases), or both?
User: I was thinking structural — reorganize the files and clean up the code. But I’m realizing that might make things more fragile, not less.
[Phase 3 — Implications]
A structural refactor without tests tends to move the coupling around rather than eliminate it. If a change breaks something today, you have no way to detect it until it hits production. What’s the release schedule for the next few weeks — is there a freeze coming up?
User: We have a release in 10 days.
[Phase 4 — Hypothetical]
If you could only do one thing to the auth module before the release, and it had to reduce the risk of breakage rather than eliminate technical debt, what would it be?
User: Probably adding tests for the token validation logic — that’s where most of the surprises come from.
[Phase 5 — Synthesis]
The insight that’s emerging: the fragility is caused by absent tests, not structure. A structural refactor without tests would be high-risk before a release. The right sequence is: (1) characterize the existing behavior with tests, especially token validation, then (2) refactor safely once you have a regression net. Should I start with the test-writing phase and scope the structural work for after the release?
User: Exactly. I didn’t realize I was reaching for the wrong tool.
Notes
- “Mess” was undefined; Phase 1 decomposed it into three distinct problems
- The user self-corrected during Phase 2 (aporia in action)
- Phase 3 introduced the release deadline as a constraint the user hadn’t mentioned
- Phase 4’s hypothetical led the user to name the specific high-value action themselves
- The synthesis reordered the work without dismissing the original goal