From with-me
Asks adaptive, information-maximizing questions to systematically elicit and clarify software requirements until uncertainty is resolved.
npx claudepluginhub h315uk3/symbiosis --plugin with-me# Good Question **Adaptive requirement elicitation using Bayesian belief updating and information theory.** When requirements are unclear, this command systematically reduces uncertainty through targeted questioning. Each question maximizes expected information gain, adapting to your answers in real-time. --- ## LLM Interaction Guidelines When executing this command, maintain a clean separation between internal operations and user-facing communication. ### Principles for User Communication 1. **Focus on Requirements, Not Mechanisms** - Users should think about *what* they want to ...
/good-questionAdaptive requirement elicitation - systematically reduce uncertainty through information-maximizing questions
Adaptive requirement elicitation using Bayesian belief updating and information theory.
When requirements are unclear, this command systematically reduces uncertainty through targeted questioning. Each question maximizes expected information gain, adapting to your answers in real-time.
When executing this command, maintain a clean separation between internal operations and user-facing communication.
Focus on Requirements, Not Mechanisms
Hide Technical Terminology from User View
Minimize Tool Execution Visibility
Present Clean Question Flows
Never Insert Mid-Session Check-ins
next-question returns "converged": trueGood Example:
Let's clarify your requirements. I'll ask a series of questions to understand what you need.
Question 1: What problem are you trying to solve with this software?
• Automate a repetitive task
• Analyze or visualize data
• Build a user-facing application
• Other (please describe)
Bad Example:
Initializing session with ID 2026-01-20T23:51:27.956551
Selecting dimension: purpose (entropy: 2.0, confidence: 0%)
Executing: python3 -m with_me.cli.session next-question...
Output: {"converged": false, "dimension": "purpose"}
Evaluating question clarity: 0.85, importance: 0.72, EIG: 0.68
Reward score: 0.766 (threshold: 0.5) ✓
What problem are you trying to solve with this software?
export CLAUDE_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT}"
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/setup_permissions.py"
If the script reports an error, check that you are in the workspace root, CLAUDE_PLUGIN_ROOT is set, and .claude/ is writable.
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.session init
Store the returned session_id. Use it as both SESSION_ID and FEEDBACK_SESSION_ID — feedback tracking is initialized automatically. Do NOT show output to user.
User-facing message: "Let's clarify your requirements. I'll ask a series of questions to understand what you need."
Repeat until convergence:
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.session next-question --session-id <SESSION_ID>
If "converged": true, skip to step 3. Otherwise, the output contains:
dimension, dimension_name, dimension_description: Dimension metadata (internal use)focus_areas: Key topics to probehypotheses: Possible answers with descriptions and focus areasposterior: Current probability distribution over hypothesessupports_multi_select: Whether multiple selections are allowedepistemic_entropy, aleatoric_entropy, epistemic_ratio: BALD decomposition (internal use — epistemic = reducible uncertainty)importance: Dimension weight (internal use)suggested_secondary_dimensions: Dimensions that would benefit from cross-dimension updates based on presheaf restriction maps. Each entry has dimension, score, hypotheses (list of hypothesis IDs), hypotheses_detail (list of {id, name, description}), and current_posterior.question_phase: Current phase for this dimension: "explore", "discriminate", "specify", "validate", or "clarify".dominant_hypothesis, dominant_probability: Highest-posterior hypothesis and its probability.question_guidelines: Phase-keyed guidance strings from dimension config.uncovered_focus_areas: Focus areas of the dominant hypothesis not yet addressed.suggested_focus_area: First uncovered focus area (null if all covered); fallback target in specify phase.presheaf_free_focus_areas: Uncovered focus areas of the dominant hypothesis that are NOT already constrained by resolved dimensions' restriction maps. Non-empty = safe to probe details; empty = presheaf conflict detected, hypothesis-level discrimination may be needed.clarification_needed: Whether this dimension has a detected contradiction requiring resolution.Phase-based field filter (context efficiency): Read only the fields relevant to question_phase — do not carry unused fields in your working memory:
converged, dimension, dimension_name, question_phase, posterior, hypotheses, supports_multi_select, suggested_secondary_dimensions, clarification_needed, question_guidelines, question_countdiscriminate and later: also read dominant_hypothesis, dominant_probabilityspecify / validate only: also read uncovered_focus_areas, presheaf_free_focus_areas, suggested_focus_areaexplore only: also read focus_areasepistemic_entropy, aleatoric_entropy, epistemic_ratio, importance, dimension_descriptionIMPORTANT: Do NOT mention dimension names or technical terms to the user.
Conversational flow transitions: Before generating the question, check if the dimension has changed from the previous question. If so:
transition_templates from the dimension config. Use "entry" when entering a dimension for the first time, or "from_other" when returning to a previously visited dimension. Adapt the template naturally — do not use it verbatim.max_consecutive_same_dimension (default: 3) questions on the same dimension without switching, force a switch to another accessible dimension even if the current one has higher entropy.If the dimension has NOT changed, still acknowledge the previous answer briefly before asking the next question.
Generate question:
Question strategy by phase (use question_phase from Step 2.1):
"explore": Use dimension-level focus_areas to ask a broad categorical question.
Map the landscape without assuming a direction. Answer options should cover all hypotheses.
"discriminate": Target the top-2 hypotheses by posterior. Generate a question
where different plausible answers map cleanly to different hypotheses.
"specify": The dominant hypothesis (dominant_hypothesis at dominant_probability)
is established. Switch to implementation details:
question_guidelines.specify for dimension-specific guidance.presheaf_free_focus_areas is non-empty: use it as the primary list.
These are focus areas not already constrained by resolved dimensions' restriction maps.
Pick the first uncovered area as the question target.presheaf_free_focus_areas is empty (conflict with restriction map detected):
fall back to uncovered_focus_areas / suggested_focus_area as before.
Consider asking a clarifying cross-dimension question to resolve the conflict."validate": The dominant hypothesis is highly confident. Ask about edge cases,
failure modes, or cross-dimension consistency using question_guidelines.validate.
"clarify": A significant contradiction was detected (negative IG on previous update).
question_guidelines.clarify for dimension-specific guidance.Use question_guidelines[question_phase] from Step 2.1 output as the primary guideline.
CRITICAL: Avoid duplicate questions. Do NOT ask questions that have already been answered or cover the same semantic intent as recent_questions_this_dimension.
Ask user:
QUESTIONING PHASE: Now you ask the actual question. This is NOT evaluation - wait for the user's actual response.
Cognitive load constraints: Check max_options from dimension config (default: 5, never exceed 7 per Miller's 7±2 rule). Adjust by disclosure_layer:
"overview": 2-3 choices"detail": 3-4 choices"edge_case": up to max_optionsGenerate exactly the number of content options allowed by the cognitive load constraint. Do NOT add "Skip" or "End session" as explicit options. These are handled via the built-in free-text input ("Type something"). When the user submits free text, first determine intent before proceeding:
question_count ≥ 5 AND recent_questions_this_dimension is non-emptyupdate-with-computation, return directly to step 2.1question_count ≥ 20Translate all content options to the language specified in your system prompt.
CRITICAL: You MUST invoke the AskUserQuestion tool now. Do NOT skip this step. Do NOT use evaluation templates as answers.
⚠ MANDATORY TOOL CALL — NO EXCEPTIONS: Step 2.2 is ONLY complete when AskUserQuestion has been called and the user has responded.
Multi-select support: Check supports_multi_select from CLI output (Step 2.1):
true: Use "Select all that apply" phrasing with multiSelect: truefalse: Use single-selection phrasing with multiSelect: falseAsk user using AskUserQuestion:
dimension_name from CLIsupports_multi_selectWait for the user's actual response. Do NOT proceed until the user answers.
Handle user response:
Estimate Posterior:
CRITICAL: Handle reference materials properly. If the user provides reference materials (URLs, file paths, documentation links) instead of a direct answer, retrieve and analyze them before estimating.
Multi-select: If multiple options were selected, combine all into a single answer string before estimation.
Based on the user's answer and all previous answers, estimate the current posterior P(h | all evidence) for each hypothesis.
State your confidence in this estimate (0.0-1.0):
Store as POSTERIOR and CONFIDENCE.
Secondary dimension updates (mandatory): Use suggested_secondary_dimensions from Step 2.1. For each entry with score ≥ 0.6, always estimate and update posterior — skip only if the answer explicitly covers a completely unrelated topic with no implied relationship to the secondary dimension. Each entry includes hypotheses_detail (list of {id, name, description}) and current_posterior for the target dimension to aid estimation.
SECONDARY_DIMS (comma-separated) and SECONDARY_POSTERIORS (JSON object mapping dim_id to posterior dict)Posterior format: '{"hyp1": 0.x, "hyp2": 0.y, ...}' (must sum to 1.0)
Update and Persist:
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.session update-with-computation \
--session-id <SESSION_ID> \
--feedback-session-id "$FEEDBACK_SESSION_ID" \
--dimension <DIMENSION> \
--question <QUESTION> \
--answer <ANSWER> \
--posterior "$POSTERIOR" \
--confidence <CONFIDENCE> \
--compact
Additional flags when secondary dimensions identified:
--secondary-dimensions "dim1,dim2"--secondary-posteriors '{"dim1": {"h1": 0.x, ...}, "dim2": {"h1": 0.y, ...}}'If question_phase was "specify" or "validate" and you targeted a specific focus area
from uncovered_focus_areas, add:
--targeted-focus-area "<focus_area_string>"
(Use the exact string from uncovered_focus_areas, not a paraphrase)Notes:
--answer: For multi-select, combine all selected answers into a single string (e.g., "Answer1; Answer2; Answer3")--confidence: 0.8+ for clear answers, 0.5-0.7 for moderate, 0.3-0.5 for ambiguouslow_ig: true in response: next question should more directly distinguish the top-2 posterior hypotheses by namefeedback record separately.From the response JSON, retain information_gain, low_ig, question_count, and converged. Discard all other fields. Do NOT show output to the user.
Negative Information Gain (IG < 0):
If information_gain is negative, uncertainty increased rather than decreased. Two possible causes:
If information_gain is significantly negative (< -0.05):
clarification_needed for this dimension.question_phase: "clarify".If information_gain is slightly negative (≥ -0.05 and < 0):
Only call when question_count is a multiple of 5 (i.e., after questions 5, 10, 15, ...). Skip on all other turns to avoid accumulating status JSON in context.
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.session status --session-id <SESSION_ID> --compact
IMPORTANT: Do NOT show raw JSON. Translate to user-friendly language:
Progress: Question 5 of ~12
✓ Understanding your goals (confident)
→ Exploring technical approach (38% confident)
• Performance requirements (not started)
Return to step 2.1.
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.session complete --session-id <SESSION_ID>
Read the final session beliefs using the Read tool:
.claude/with_me/sessions/<SESSION_ID>.jsonbeliefs field and store as FINAL_BELIEFS (the full JSON object)Complete feedback session with all 7 dimension entropy values and final beliefs:
export PYTHONPATH="${CLAUDE_PLUGIN_ROOT}"
python3 -m with_me.cli.feedback complete <FEEDBACK_SESSION_ID> \
'{"purpose": <E>, "context": <E>, "data": <E>, "behavior": <E>, "stakeholders": <E>, "constraints": <E>, "quality": <E>}' \
"$FINAL_BELIEFS"
Entropy values are available from the session status output. FINAL_BELIEFS is the beliefs object read from the session file.
Do NOT show raw output. Provide a simple completion message.
Read session data from .claude/with_me/sessions/<SESSION_ID>.json, then invoke:
/with-me:requirement-analysis
Provide the session data to the skill. The skill will analyze all collected answers and generate a structured requirement specification.
Adjust thresholds in config/dimensions.json:
Convergence is phase-driven: the session ends when every accessible dimension
(current KST state ∪ outer fringe) has reached "validate" phase AND no dimension
has an unresolved contradiction (clarification_needed = true).
Diminishing returns is tracked for diagnostics but no longer triggers termination.
theory/good-question-theory.md - Mathematical foundation (EIG, entropy, Bayesian methods)with_me/cli/session.py - Session management commandswith_me/lib/session_orchestrator.py - Core logicwith_me/lib/dimension_belief.py - Bayesian updatingskills/requirement-analysis/SKILL.md - Post-session specification