feat: Add Studio UI, intake system, and extractor improvements

Dashboard:
- Add Studio page with drag-drop model upload and Claude chat
- Add intake system for study creation workflow
- Improve session manager and context builder
- Add intake API routes and frontend components

Optimization Engine:
- Add CLI module for command-line operations
- Add intake module for study preprocessing
- Add validation module with gate checks
- Improve Zernike extractor documentation
- Update spec models with better validation
- Enhance solve_simulation robustness

Documentation:
- Add ATOMIZER_STUDIO.md planning doc
- Add ATOMIZER_UX_SYSTEM.md for UX patterns
- Update extractor library docs
- Add study-readme-generator skill

Tools:
- Add test scripts for extraction validation
- Add Zernike recentering test

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-27 12:02:30 -05:00
parent 3193831340
commit a26914bbe8
56 changed files with 14173 additions and 646 deletions

View File

@@ -85,7 +85,7 @@
"created_by": {
"type": "string",
"description": "Who/what created the spec",
"enum": ["canvas", "claude", "api", "migration", "manual"]
"enum": ["canvas", "claude", "api", "migration", "manual", "dashboard_intake"]
},
"modified_by": {
"type": "string",
@@ -114,6 +114,17 @@
"engineering_context": {
"type": "string",
"description": "Real-world engineering scenario"
},
"status": {
"type": "string",
"description": "Study lifecycle status",
"enum": ["draft", "introspected", "configured", "validated", "ready", "running", "completed", "failed"],
"default": "draft"
},
"topic": {
"type": "string",
"description": "Topic folder for grouping related studies",
"pattern": "^[A-Za-z0-9_]+$"
}
}
},
@@ -215,6 +226,124 @@
"type": "boolean"
}
}
},
"introspection": {
"$ref": "#/definitions/introspection_data",
"description": "Model introspection results from intake workflow"
}
}
},
"introspection_data": {
"type": "object",
"description": "Model introspection results stored in the spec",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When introspection was run"
},
"solver_type": {
"type": "string",
"description": "Detected solver type"
},
"mass_kg": {
"type": "number",
"description": "Mass from expressions or mass properties"
},
"volume_mm3": {
"type": "number",
"description": "Volume from mass properties"
},
"expressions": {
"type": "array",
"description": "Discovered NX expressions",
"items": {
"$ref": "#/definitions/expression_info"
}
},
"baseline": {
"$ref": "#/definitions/baseline_data",
"description": "Baseline FEA solve results"
},
"warnings": {
"type": "array",
"description": "Warnings from introspection",
"items": {
"type": "string"
}
}
}
},
"expression_info": {
"type": "object",
"description": "Information about an NX expression from introspection",
"required": ["name"],
"properties": {
"name": {
"type": "string",
"description": "Expression name in NX"
},
"value": {
"type": "number",
"description": "Current value"
},
"units": {
"type": "string",
"description": "Physical units"
},
"formula": {
"type": "string",
"description": "Expression formula if any"
},
"is_candidate": {
"type": "boolean",
"description": "Whether this is a design variable candidate",
"default": false
},
"confidence": {
"type": "number",
"description": "Confidence that this is a design variable (0.0 to 1.0)",
"minimum": 0,
"maximum": 1
}
}
},
"baseline_data": {
"type": "object",
"description": "Results from baseline FEA solve",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When baseline was run"
},
"solve_time_seconds": {
"type": "number",
"description": "How long the solve took"
},
"mass_kg": {
"type": "number",
"description": "Computed mass from BDF/FEM"
},
"max_displacement_mm": {
"type": "number",
"description": "Max displacement result"
},
"max_stress_mpa": {
"type": "number",
"description": "Max von Mises stress"
},
"success": {
"type": "boolean",
"description": "Whether baseline solve succeeded",
"default": true
},
"error": {
"type": "string",
"description": "Error message if failed"
}
}
},