Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill should be used when running an interactive interview before a spec phase, gathering requirements through dialogue, asking the user clarifying questions before delegating to a subagent, or when any Ralph phase command (research, requirements, design, tasks) needs adaptive brainstorming dialogue. Covers the 3-phase algorithm (Understand, Propose Approaches, Confirm and Store).
.claude/skills/tzachbon-interview-framework/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-23 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 238% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -2% | 0% |
Adaptive brainstorming dialogue algorithm for all spec phases. Each phase command provides its own exploration territory (phase-specific areas to probe).
Each question must have 2-4 options (max 4). Keep the most relevant options, combine similar ones.
Every question asked via AskUserQuestion in Phase 1 leads with the recommended option (except when options are symmetric, in which case [Recommended] may be omitted):
yamlAskUserQuestion: question: "[Context-aware question referencing prior answers]. [One sentence rationale for the recommendation.]" options: - "[Recommended] [Option text -- the AI's suggested answer]" - "[Alternative 1]" - "[Alternative 2 if needed]" - "Other"
Rules:
[Recommended] is a label prefix on the first option only.[Recommended] label rather than placing it arbitrarily.Example:
yamlAskUserQuestion: question: "Where should the spec live? You only have one specs directory configured, so the default is fine unless you want to reorganize." options: - "[Recommended] ./specs/ (default)" - "Let me configure a different path" - "Other"
Before asking any question, determine whether the answer is a codebase fact or a user decision:
Only ask what you cannot discover yourself.
After each response, check for early completion signals using token-based matching:
textcompletionSignals = ["done", "proceed", "skip", "enough", "that's all", "continue", "next"] tokens = tokenize(userResponse.lower()) # split on whitespace/punctuation for signal in completionSignals: if signal in tokens: # exact token match, not substring -> SKIP remaining questions, move to PROPOSE APPROACHES
Read all available context (.progress.md, prior artifacts, goal text). Build a question tree from the exploration territory with dependency ordering. Traverse the tree: auto-resolve codebase facts via exploration, ask user only about decisions. Each question leads with [Recommended] answer. No fixed question caps. Exit when all nodes resolved or user signals completion.
See references/algorithm.md for full pseudocode.
Synthesize dialogue into 2-3 distinct approaches. Each includes: name, description, trade-offs. Lead with recommendation. Present via AskUserQuestion. Maximum 3 approaches (more causes decision fatigue). Trade-offs must be honest. No straw-man alternatives.
See references/algorithm.md for full pseudocode.
Brief recap to user of key decisions and chosen approach. If user corrects something, update before storing. Store in .progress.md under Context Accumulator pattern.
See references/algorithm.md for full pseudocode.
When user selects "Other": ask a context-specific follow-up (never generic "elaborate"). Reference what the user typed. Continue until clarity or 5 rounds. Do not increment askedCount for follow-ups.
See references/examples.md for example follow-up patterns.
After each interview, update .progress.md: read existing content, append new section under "## Interview Responses" with descriptive keys reflecting what was discussed. Include the chosen approach.
See references/examples.md for storage format.
references/algorithm.md -- Full 3-phase pseudocode (UNDERSTAND decision-tree, PROPOSE APPROACHES, CONFIRM & STORE)references/examples.md -- Example interview questions, "Other" response handling, context storage format| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-23 | fail→pass | 12,382 | 4,883 | -61% | 1 | 1 | 0% | 1,864 | 1,785 | -4% | 0 | 0 | — |
case-05 | fail→pass | 7,051 | 4,704 | -33% | 1 | 1 | 0% | 905 | 1,734 | +92% | 0 | 0 | — |
case-06 | fail→fail | 7,661 | 2,755 | -64% | 1 | 1 | 0% | 1,066 | 1,430 | +34% | 0 | 0 | — |
case-01 | fail→fail | 16,649 | 5,390 | -68% | 1 | 1 | 0% | 2,377 | 1,247 | -48% | 0 | 0 | — |
case-02 | fail→pass | 4,871 | 9,172 | +88% | 1 | 1 | 0% | 688 | 2,322 | +238% | 0 | 0 | — |
case-03 | pass→fail | 2,651 | 4,441 | +68% | 1 | 1 | 0% | 338 | 1,247 | +269% | 0 | 0 | — |
case-04 | fail→fail | 13,595 | 17,009 | +25% | 1 | 1 | 0% | 2,078 | 2,030 | -2% | 0 | 0 | — |
case-07 | fail→pass | 6,795 | 2,989 | -56% | 1 | 1 | 0% | 1,083 | 1,474 | +36% | 0 | 0 | — |
case-08 | pass→pass | 4,309 | 2,850 | -34% | 1 | 1 | 0% | 712 | 1,438 | +102% | 0 | 0 | — |
case-09 | fail→pass | 22,926 | 14,011 | -39% | 1 | 1 | 0% | 3,246 | 3,176 | -2% | 0 | 0 | — |
case-10 | fail→fail | 13,804 | 5,096 | -63% | 1 | 1 | 0% | 2,042 | 1,750 | -14% | 0 | 0 | — |
case-11 | pass→pass | 14,208 | 5,897 | -58% | 1 | 1 | 0% | 2,030 | 1,902 | -6% | 0 | 0 | — |
case-22 | fail→pass | 13,242 | 5,844 | -56% | 1 | 1 | 0% | 2,067 | 1,857 | -10% | 0 | 0 | — |
case-12 | pass→pass | 5,891 | 2,860 | -51% | 1 | 1 | 0% | 925 | 1,414 | +53% | 0 | 0 | — |
case-13 | pass→fail | 18,373 | 4,532 | -75% | 1 | 1 | 0% | 2,663 | 1,211 | -55% | 0 | 0 | — |
case-14 | pass→pass | 11,206 | 3,961 | -65% | 1 | 1 | 0% | 1,644 | 1,642 | -0% | 0 | 0 | — |
case-15 | fail→pass | 9,175 | 3,176 | -65% | 1 | 1 | 0% | 1,387 | 1,480 | +7% | 0 | 0 | — |
case-16 | fail→fail | 6,741 | 15,649 | +132% | 1 | 1 | 0% | 1,145 | 2,072 | +81% | 0 | 0 | — |
case-17 | fail→pass | 7,950 | 3,273 | -59% | 1 | 1 | 0% | 1,132 | 1,476 | +30% | 0 | 0 | — |
case-18 | fail→fail | 8,373 | 2,840 | -66% | 1 | 1 | 0% | 1,128 | 1,461 | +30% | 0 | 0 | — |
case-19 | pass→fail | 19,147 | 3,070 | -84% | 1 | 1 | 0% | 3,481 | 1,140 | -67% | 0 | 0 | — |
case-20 | pass→fail | 9,530 | 5,001 | -48% | 1 | 1 | 0% | 1,436 | 1,178 | -18% | 0 | 0 | — |
case-21 | pass→fail | 17,964 | 3,153 | -82% | 1 | 1 | 0% | 3,402 | 1,164 | -66% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 15 counted toward the lift figure. The other 8 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +13 percentage points is the difference between those two pass rates over the 15 comparable cases. 6 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.