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>
467 lines
16 KiB
JSON
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."
|
|
}
|
|
]
|
|
}
|