Files
Atomizer/optimization_engine/interview/schemas/interview_questions.json
Anto01 32caa5d05c feat: Implement Study Interview Mode as default study creation method
Study Interview Mode is now the DEFAULT for all study creation requests.
This intelligent Q&A system guides users through optimization setup with:

- 7-phase interview flow: introspection → objectives → constraints → design_variables → validation → review → complete
- Material-aware validation with 12 materials and fuzzy name matching
- Anti-pattern detection for 12 common mistakes (mass-no-constraint, stress-over-yield, etc.)
- Auto extractor mapping E1-E24 based on goal keywords
- State persistence with JSON serialization and backup rotation
- StudyBlueprint generation with full validation

Triggers: "create a study", "new study", "optimize this", any study creation intent
Skip with: "skip interview", "quick setup", "manual config"

Components:
- StudyInterviewEngine: Main orchestrator
- QuestionEngine: Conditional logic evaluation
- EngineeringValidator: MaterialsDatabase + AntiPatternDetector
- InterviewPresenter: Markdown formatting for Claude
- StudyBlueprint: Validated configuration output
- InterviewState: Persistent state management

All 129 tests passing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 11:06:07 -05:00

467 lines
16 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"version": "1.0",
"description": "Interview questions for Atomizer study creation",
"categories": [
{
"id": "problem_definition",
"name": "Problem Definition",
"phase": "problem_definition",
"order": 1,
"always_ask": true
},
{
"id": "objectives",
"name": "Optimization Objectives",
"phase": "objectives",
"order": 2,
"always_ask": true
},
{
"id": "constraints",
"name": "Constraints & Limits",
"phase": "constraints",
"order": 3,
"always_ask": true
},
{
"id": "design_variables",
"name": "Design Variables",
"phase": "design_variables",
"order": 4,
"always_ask": true
},
{
"id": "physics_config",
"name": "Physics Configuration",
"phase": "design_variables",
"order": 5,
"condition": {
"type": "complexity_is",
"value": ["moderate", "complex"]
}
},
{
"id": "optimization_settings",
"name": "Optimization Settings",
"phase": "validation",
"order": 6,
"condition": {
"type": "complexity_is",
"value": ["moderate", "complex"]
}
},
{
"id": "validation",
"name": "Validation",
"phase": "validation",
"order": 7,
"always_ask": false
}
],
"questions": [
{
"id": "pd_01",
"category": "problem_definition",
"text": "What engineering problem are you trying to solve with this optimization?",
"help_text": "Describe the goal in engineering terms. For example: 'Reduce the weight of a bracket while maintaining structural integrity' or 'Tune the natural frequency to avoid resonance'.",
"question_type": "text",
"options": null,
"default": null,
"validation": {
"required": true,
"min_length": 10
},
"condition": null,
"maps_to": "problem_description",
"engineering_guidance": "A clear problem statement helps ensure the optimization setup matches your actual goals."
},
{
"id": "pd_02",
"category": "problem_definition",
"text": "What is the physical context of this component?",
"help_text": "Describe how this part is used. For example: 'Mounting bracket for an aircraft wing' or 'Support structure for a telescope mirror'.",
"question_type": "text",
"options": null,
"default": null,
"validation": {
"required": false
},
"condition": {
"type": "complexity_is",
"value": ["moderate", "complex"]
},
"maps_to": "physical_context",
"engineering_guidance": "Understanding the physical context helps validate constraint choices."
},
{
"id": "pd_03",
"category": "problem_definition",
"text": "What type of analysis does your model use?",
"help_text": "Select all analysis types that are set up in your simulation.",
"question_type": "multi_choice",
"options": [
{"value": "static", "label": "Static structural analysis"},
{"value": "modal", "label": "Modal/frequency analysis"},
{"value": "thermal", "label": "Thermal analysis"},
{"value": "coupled_thermal_structural", "label": "Coupled thermal-structural"},
{"value": "buckling", "label": "Buckling analysis"},
{"value": "nonlinear", "label": "Nonlinear analysis"}
],
"default": ["static"],
"validation": {
"required": true,
"min_selections": 1
},
"condition": null,
"maps_to": "analysis_types",
"engineering_guidance": "The analysis type determines which extractors and solution strategies are available."
},
{
"id": "obj_01",
"category": "objectives",
"text": "What is your primary optimization goal?",
"help_text": "Choose the main thing you want to optimize for.",
"question_type": "choice",
"options": [
{"value": "minimize_mass", "label": "Minimize mass/weight"},
{"value": "minimize_displacement", "label": "Minimize displacement (maximize stiffness)"},
{"value": "maximize_frequency", "label": "Maximize natural frequency"},
{"value": "minimize_stress", "label": "Minimize peak stress"},
{"value": "target_frequency", "label": "Target a specific frequency"},
{"value": "minimize_wavefront_error", "label": "Minimize wavefront error (optical)"},
{"value": "custom", "label": "Custom objective (I'll specify)"}
],
"default": null,
"validation": {
"required": true
},
"condition": null,
"maps_to": "objectives[0].goal",
"engineering_guidance": "Mass minimization requires at least one constraint (stress, displacement, or frequency) to avoid degenerating to zero-thickness designs."
},
{
"id": "obj_02",
"category": "objectives",
"text": "Do you have any secondary objectives?",
"help_text": "Select additional objectives if this is a multi-objective optimization. Leave empty for single-objective.",
"question_type": "multi_choice",
"options": [
{"value": "minimize_mass", "label": "Minimize mass/weight"},
{"value": "minimize_displacement", "label": "Minimize displacement"},
{"value": "maximize_frequency", "label": "Maximize frequency"},
{"value": "minimize_stress", "label": "Minimize stress"},
{"value": "none", "label": "No secondary objectives (single-objective)"}
],
"default": ["none"],
"validation": {
"required": true
},
"condition": null,
"maps_to": "objectives_secondary",
"engineering_guidance": "Multi-objective optimization produces a Pareto front of trade-off solutions. More than 3 objectives can make interpretation difficult."
},
{
"id": "obj_03",
"category": "objectives",
"text": "I've selected the following extractors for your objectives. Does this look correct?",
"help_text": "The extractor is the code that reads the physics results from the simulation. I've automatically selected based on your goals.",
"question_type": "confirm",
"options": null,
"default": true,
"validation": {
"required": true
},
"condition": null,
"maps_to": "extractors_confirmed",
"engineering_guidance": null,
"dynamic_content": {
"type": "extractor_summary",
"source": "inferred_config.extractors"
}
},
{
"id": "con_01",
"category": "constraints",
"text": "What is the maximum allowable stress?",
"help_text": "Enter the stress limit in MPa. This is typically based on material yield stress with a safety factor.",
"question_type": "numeric",
"options": null,
"default": null,
"validation": {
"required": true,
"min": 1,
"max": 10000,
"units": "MPa"
},
"condition": {
"type": "or",
"conditions": [
{"type": "contains", "field": "analysis_types", "value": "static"},
{"type": "equals", "field": "objectives[0].goal", "value": "minimize_mass"}
]
},
"maps_to": "constraints.max_stress",
"engineering_guidance": "For aluminum 6061-T6, yield stress is 276 MPa. A safety factor of 1.5 gives ~180 MPa limit."
},
{
"id": "con_02",
"category": "constraints",
"text": "What is the maximum allowable displacement?",
"help_text": "Enter the displacement limit. Include units (mm or in).",
"question_type": "numeric",
"options": null,
"default": null,
"validation": {
"required": false,
"min": 0,
"units": "mm"
},
"condition": {
"type": "or",
"conditions": [
{"type": "contains", "field": "analysis_types", "value": "static"},
{"type": "equals", "field": "objectives[0].goal", "value": "minimize_mass"}
]
},
"maps_to": "constraints.max_displacement",
"engineering_guidance": "Displacement limits often come from functional requirements - clearance, alignment, etc."
},
{
"id": "con_03",
"category": "constraints",
"text": "What is the minimum acceptable natural frequency?",
"help_text": "Enter the frequency limit in Hz.",
"question_type": "numeric",
"options": null,
"default": null,
"validation": {
"required": true,
"min": 0.1,
"units": "Hz"
},
"condition": {
"type": "contains",
"field": "analysis_types",
"value": "modal"
},
"maps_to": "constraints.min_frequency",
"engineering_guidance": "Typically set to avoid resonance with known excitation frequencies (motors, vibration sources)."
},
{
"id": "con_04",
"category": "constraints",
"text": "Do you have a mass budget (maximum allowed mass)?",
"help_text": "Enter the mass limit in kg, or skip if not applicable.",
"question_type": "numeric",
"options": null,
"default": null,
"validation": {
"required": false,
"min": 0,
"units": "kg"
},
"condition": {
"type": "not",
"condition": {
"type": "equals",
"field": "objectives[0].goal",
"value": "minimize_mass"
}
},
"maps_to": "constraints.max_mass",
"engineering_guidance": "A mass budget is often required when mass is not the primary objective."
},
{
"id": "con_05",
"category": "constraints",
"text": "How should constraints be handled?",
"help_text": "Hard constraints reject any design that violates them. Soft constraints allow violations but penalize the objective.",
"question_type": "choice",
"options": [
{"value": "hard", "label": "Hard constraints (reject violations)"},
{"value": "soft", "label": "Soft constraints (penalize violations)"},
{"value": "mixed", "label": "Mixed (I'll specify per constraint)"}
],
"default": "hard",
"validation": {
"required": true
},
"condition": null,
"maps_to": "constraint_handling",
"engineering_guidance": "Hard constraints are more conservative. Soft constraints allow exploration but may produce infeasible final designs."
},
{
"id": "dv_01",
"category": "design_variables",
"text": "Which parameters should be varied during optimization?",
"help_text": "Select from the detected expressions in your model, or type custom names.",
"question_type": "parameter_select",
"options": null,
"default": null,
"validation": {
"required": true,
"min_selections": 1,
"max_selections": 20
},
"condition": null,
"maps_to": "design_variables",
"engineering_guidance": "More design variables = larger search space. 3-6 is typical for efficient optimization.",
"dynamic_options": {
"type": "expressions",
"source": "introspection.expressions",
"filter": "design_variable_heuristics"
}
},
{
"id": "dv_02",
"category": "design_variables",
"text": "Please confirm or adjust the bounds for each design variable.",
"help_text": "For each parameter, verify the min and max values are appropriate.",
"question_type": "bounds",
"options": null,
"default": null,
"validation": {
"required": true
},
"condition": null,
"maps_to": "design_variable_bounds",
"engineering_guidance": "Bounds should be physically meaningful. Too wide (>10x range) may slow convergence.",
"dynamic_content": {
"type": "bounds_table",
"source": "answers.design_variables"
}
},
{
"id": "dv_03",
"category": "design_variables",
"text": "Are there any parameters that should remain fixed (not optimized)?",
"help_text": "Select parameters that should keep their current values.",
"question_type": "parameter_select",
"options": null,
"default": null,
"validation": {
"required": false
},
"condition": {
"type": "complexity_is",
"value": ["complex"]
},
"maps_to": "fixed_parameters",
"engineering_guidance": "Fix parameters that have regulatory or interface constraints.",
"dynamic_options": {
"type": "expressions",
"source": "introspection.expressions",
"filter": "exclude_selected_dvs"
}
},
{
"id": "phys_01",
"category": "physics_config",
"text": "What element type does your mesh use for stress extraction?",
"help_text": "This affects which stress extractor is used.",
"question_type": "choice",
"options": [
{"value": "solid", "label": "Solid elements (CTETRA, CHEXA, CPENTA)"},
{"value": "shell", "label": "Shell elements (CQUAD4, CTRIA3)"},
{"value": "beam", "label": "Beam elements (CBAR, CBEAM)"},
{"value": "mixed", "label": "Mixed element types"},
{"value": "auto", "label": "Auto-detect from model"}
],
"default": "auto",
"validation": {
"required": true
},
"condition": {
"type": "or",
"conditions": [
{"type": "equals", "field": "objectives[0].goal", "value": "minimize_stress"},
{"type": "exists", "field": "constraints.max_stress"}
]
},
"maps_to": "element_type",
"engineering_guidance": null
},
{
"id": "phys_02",
"category": "physics_config",
"text": "Your model has multiple solution steps. Should all solutions be evaluated?",
"help_text": "Some models have static + modal, or multiple load cases.",
"question_type": "confirm",
"options": null,
"default": true,
"validation": {
"required": true
},
"condition": {
"type": "introspection_has",
"field": "multiple_solutions"
},
"maps_to": "solve_all_solutions",
"engineering_guidance": "If you have both static and modal analysis, both should typically be solved to get all required outputs."
},
{
"id": "opt_01",
"category": "optimization_settings",
"text": "How many trials should be run?",
"help_text": "More trials = better exploration but longer runtime.",
"question_type": "choice",
"options": [
{"value": 50, "label": "50 trials (~quick exploration)"},
{"value": 100, "label": "100 trials (standard)"},
{"value": 200, "label": "200 trials (thorough)"},
{"value": 500, "label": "500 trials (comprehensive)"},
{"value": "custom", "label": "Custom number"}
],
"default": 100,
"validation": {
"required": true
},
"condition": {
"type": "complexity_is",
"value": ["moderate", "complex"]
},
"maps_to": "n_trials",
"engineering_guidance": "Rule of thumb: 10-20 trials per design variable minimum. Complex multi-objective needs more."
},
{
"id": "opt_02",
"category": "optimization_settings",
"text": "Would you like to enable neural acceleration?",
"help_text": "Neural surrogates can speed up optimization by reducing FEA calls. Requires initial training trials.",
"question_type": "confirm",
"options": null,
"default": false,
"validation": {
"required": true
},
"condition": {
"type": "and",
"conditions": [
{"type": "greater_than", "field": "n_trials", "value": 100},
{"type": "complexity_is", "value": ["moderate", "complex"]}
]
},
"maps_to": "use_neural_acceleration",
"engineering_guidance": "Neural acceleration is most effective for expensive simulations (>30 sec/eval) with 100+ trials."
},
{
"id": "val_01",
"category": "validation",
"text": "Would you like to run a baseline validation before starting?",
"help_text": "This runs a single FEA solve to verify extractors work correctly with nominal parameters.",
"question_type": "confirm",
"options": null,
"default": true,
"validation": {
"required": true
},
"condition": null,
"maps_to": "run_baseline_validation",
"engineering_guidance": "Highly recommended. Catches configuration errors before wasting optimization time."
}
]
}