2026-01-20 13:11:23 -05:00
{
"$schema" : "http://json-schema.org/draft-07/schema#" ,
"$id" : "https://atomizer.io/schemas/atomizer_spec_v2.json" ,
"title" : "AtomizerSpec v2.0" ,
"description" : "Unified configuration schema for Atomizer optimization studies. This is the single source of truth used by Canvas, Backend, Claude, and the Optimization Engine." ,
"type" : "object" ,
"required" : [ "meta" , "model" , "design_variables" , "extractors" , "objectives" , "optimization" ] ,
"properties" : {
"meta" : {
"$ref" : "#/definitions/meta"
} ,
"model" : {
"$ref" : "#/definitions/model"
} ,
"design_variables" : {
"type" : "array" ,
"description" : "Design variables (NX expressions) to optimize" ,
"minItems" : 1 ,
"maxItems" : 50 ,
"items" : {
"$ref" : "#/definitions/design_variable"
}
} ,
"extractors" : {
"type" : "array" ,
"description" : "Physics extractors that compute outputs from FEA results" ,
"minItems" : 1 ,
"items" : {
"$ref" : "#/definitions/extractor"
}
} ,
"objectives" : {
"type" : "array" ,
"description" : "Optimization objectives (minimize/maximize)" ,
"minItems" : 1 ,
"maxItems" : 5 ,
"items" : {
"$ref" : "#/definitions/objective"
}
} ,
"constraints" : {
"type" : "array" ,
"description" : "Hard and soft constraints" ,
"items" : {
"$ref" : "#/definitions/constraint"
}
} ,
"optimization" : {
"$ref" : "#/definitions/optimization"
} ,
"workflow" : {
"$ref" : "#/definitions/workflow"
} ,
"reporting" : {
"$ref" : "#/definitions/reporting"
} ,
"canvas" : {
"$ref" : "#/definitions/canvas"
}
} ,
"definitions" : {
"meta" : {
"type" : "object" ,
"description" : "Metadata about the spec" ,
"required" : [ "version" , "study_name" ] ,
"properties" : {
"version" : {
"type" : "string" ,
"description" : "Schema version" ,
"pattern" : "^2\\.\\d+$" ,
"examples" : [ "2.0" , "2.1" ]
} ,
"created" : {
"type" : "string" ,
"format" : "date-time" ,
"description" : "When the spec was created"
} ,
"modified" : {
"type" : "string" ,
"format" : "date-time" ,
"description" : "When the spec was last modified"
} ,
"created_by" : {
"type" : "string" ,
"description" : "Who/what created the spec" ,
2026-01-27 12:02:30 -05:00
"enum" : [ "canvas" , "claude" , "api" , "migration" , "manual" , "dashboard_intake" ]
2026-01-20 13:11:23 -05:00
} ,
"modified_by" : {
"type" : "string" ,
"description" : "Who/what last modified the spec"
} ,
"study_name" : {
"type" : "string" ,
"description" : "Unique study identifier (snake_case)" ,
"pattern" : "^[a-z0-9_]+$" ,
"minLength" : 3 ,
"maxLength" : 100
} ,
"description" : {
"type" : "string" ,
"description" : "Human-readable description of the study" ,
"maxLength" : 1000
} ,
"tags" : {
"type" : "array" ,
"description" : "Tags for categorization" ,
"items" : {
"type" : "string" ,
"maxLength" : 50
}
} ,
"engineering_context" : {
"type" : "string" ,
"description" : "Real-world engineering scenario"
2026-01-27 12:02:30 -05:00
} ,
"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_]+$"
2026-01-20 13:11:23 -05:00
}
}
} ,
"model" : {
"type" : "object" ,
"description" : "NX model files and configuration" ,
"required" : [ "sim" ] ,
"properties" : {
"nx_part" : {
"type" : "object" ,
"description" : "NX geometry part file" ,
"properties" : {
"path" : {
"type" : "string" ,
"description" : "Path to .prt file"
} ,
"hash" : {
"type" : "string" ,
"description" : "File hash for change detection"
} ,
"idealized_part" : {
"type" : "string" ,
"description" : "Idealized part filename (_i.prt)"
}
}
} ,
"fem" : {
"type" : "object" ,
"description" : "FEM mesh file" ,
"properties" : {
"path" : {
"type" : "string" ,
"description" : "Path to .fem file"
} ,
"element_count" : {
"type" : "integer" ,
"description" : "Number of elements"
} ,
"node_count" : {
"type" : "integer" ,
"description" : "Number of nodes"
}
}
} ,
"sim" : {
"type" : "object" ,
"description" : "Simulation file" ,
"required" : [ "path" , "solver" ] ,
"properties" : {
"path" : {
"type" : "string" ,
"description" : "Path to .sim file"
} ,
"solver" : {
"type" : "string" ,
"description" : "Solver type" ,
"enum" : [ "nastran" , "NX_Nastran" , "abaqus" ]
} ,
"solution_type" : {
"type" : "string" ,
"description" : "Solution type (e.g., SOL101)" ,
"pattern" : "^SOL\\d+$"
} ,
"subcases" : {
"type" : "array" ,
"description" : "Defined subcases" ,
"items" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "integer"
} ,
"name" : {
"type" : "string"
} ,
"type" : {
"type" : "string" ,
"enum" : [ "static" , "modal" , "thermal" , "buckling" ]
}
}
}
}
}
} ,
"nx_settings" : {
"type" : "object" ,
"description" : "NX runtime settings" ,
"properties" : {
"nx_install_path" : {
"type" : "string"
} ,
"simulation_timeout_s" : {
"type" : "integer" ,
"minimum" : 60 ,
"maximum" : 7200
} ,
"auto_start_nx" : {
"type" : "boolean"
}
}
2026-01-27 12:02:30 -05:00
} ,
"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"
2026-01-20 13:11:23 -05:00
}
}
} ,
"design_variable" : {
"type" : "object" ,
"description" : "A design variable to optimize" ,
"required" : [ "id" , "name" , "expression_name" , "type" , "bounds" ] ,
"properties" : {
"id" : {
"type" : "string" ,
"description" : "Unique identifier" ,
"pattern" : "^dv_\\d{3}$"
} ,
"name" : {
"type" : "string" ,
"description" : "Human-readable name"
} ,
"expression_name" : {
"type" : "string" ,
"description" : "NX expression name (must match model)" ,
"pattern" : "^[a-zA-Z_][a-zA-Z0-9_]*$"
} ,
"type" : {
"type" : "string" ,
"description" : "Variable type" ,
"enum" : [ "continuous" , "integer" , "categorical" ]
} ,
"bounds" : {
"type" : "object" ,
"description" : "Value bounds" ,
"required" : [ "min" , "max" ] ,
"properties" : {
"min" : {
"type" : "number"
} ,
"max" : {
"type" : "number"
}
}
} ,
"baseline" : {
"type" : "number" ,
"description" : "Current/initial value"
} ,
"units" : {
"type" : "string" ,
"description" : "Physical units (mm, deg, etc.)"
} ,
"step" : {
"type" : "number" ,
"description" : "Step size for integer/discrete"
} ,
"enabled" : {
"type" : "boolean" ,
"description" : "Whether to include in optimization" ,
"default" : true
} ,
"description" : {
"type" : "string"
} ,
"canvas_position" : {
"$ref" : "#/definitions/position"
}
}
} ,
"extractor" : {
"type" : "object" ,
"description" : "Physics extractor that computes outputs from FEA" ,
"required" : [ "id" , "name" , "type" , "outputs" ] ,
"properties" : {
"id" : {
"type" : "string" ,
"description" : "Unique identifier" ,
"pattern" : "^ext_\\d{3}$"
} ,
"name" : {
"type" : "string" ,
"description" : "Human-readable name"
} ,
"type" : {
"type" : "string" ,
"description" : "Extractor type" ,
"enum" : [
"displacement" ,
"frequency" ,
"stress" ,
"mass" ,
"mass_expression" ,
"zernike_opd" ,
"zernike_csv" ,
"temperature" ,
"custom_function"
]
} ,
"builtin" : {
"type" : "boolean" ,
"description" : "Whether this is a built-in extractor" ,
"default" : true
} ,
"config" : {
"type" : "object" ,
"description" : "Type-specific configuration" ,
"properties" : {
"inner_radius_mm" : {
"type" : "number"
} ,
"outer_radius_mm" : {
"type" : "number"
} ,
"n_modes" : {
"type" : "integer"
} ,
"filter_low_orders" : {
"type" : "integer"
} ,
"displacement_unit" : {
"type" : "string"
} ,
"reference_subcase" : {
"type" : "integer"
} ,
"expression_name" : {
"type" : "string"
} ,
"mode_number" : {
"type" : "integer"
} ,
"element_type" : {
"type" : "string"
} ,
"result_type" : {
"type" : "string"
} ,
"metric" : {
"type" : "string"
}
}
} ,
"function" : {
"type" : "object" ,
"description" : "Custom function definition (for custom_function type)" ,
"properties" : {
"name" : {
"type" : "string" ,
"description" : "Function name"
} ,
"module" : {
"type" : "string" ,
"description" : "Python module path"
} ,
"signature" : {
"type" : "string" ,
"description" : "Function signature"
} ,
"source_code" : {
"type" : "string" ,
"description" : "Python source code"
}
}
} ,
"outputs" : {
"type" : "array" ,
"description" : "Output values this extractor produces" ,
"minItems" : 1 ,
"items" : {
"type" : "object" ,
"required" : [ "name" ] ,
"properties" : {
"name" : {
"type" : "string" ,
"description" : "Output name (used by objectives/constraints)"
} ,
"metric" : {
"type" : "string" ,
"description" : "Specific metric (max, total, rms, etc.)"
} ,
"subcase" : {
"type" : "integer" ,
"description" : "Subcase ID for this output"
} ,
"units" : {
"type" : "string"
}
}
}
} ,
"canvas_position" : {
"$ref" : "#/definitions/position"
}
}
} ,
"objective" : {
"type" : "object" ,
"description" : "Optimization objective" ,
"required" : [ "id" , "name" , "direction" , "source" ] ,
"properties" : {
"id" : {
"type" : "string" ,
"description" : "Unique identifier" ,
"pattern" : "^obj_\\d{3}$"
} ,
"name" : {
"type" : "string" ,
"description" : "Human-readable name"
} ,
"direction" : {
"type" : "string" ,
"description" : "Optimization direction" ,
"enum" : [ "minimize" , "maximize" ]
} ,
"weight" : {
"type" : "number" ,
"description" : "Weight for weighted sum (multi-objective)" ,
"minimum" : 0 ,
"default" : 1.0
} ,
"source" : {
"type" : "object" ,
"description" : "Where the value comes from" ,
"required" : [ "extractor_id" , "output_name" ] ,
"properties" : {
"extractor_id" : {
"type" : "string" ,
"description" : "Reference to extractor"
} ,
"output_name" : {
"type" : "string" ,
"description" : "Which output from the extractor"
}
}
} ,
"target" : {
"type" : "number" ,
"description" : "Target value (for goal programming)"
} ,
"units" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"canvas_position" : {
"$ref" : "#/definitions/position"
}
}
} ,
"constraint" : {
"type" : "object" ,
"description" : "Hard or soft constraint" ,
"required" : [ "id" , "name" , "type" , "operator" , "threshold" , "source" ] ,
"properties" : {
"id" : {
"type" : "string" ,
"description" : "Unique identifier" ,
"pattern" : "^con_\\d{3}$"
} ,
"name" : {
"type" : "string"
} ,
"type" : {
"type" : "string" ,
"description" : "Constraint type" ,
"enum" : [ "hard" , "soft" ]
} ,
"operator" : {
"type" : "string" ,
"description" : "Comparison operator" ,
"enum" : [ "<=" , ">=" , "<" , ">" , "==" ]
} ,
"threshold" : {
"type" : "number" ,
"description" : "Constraint threshold value"
} ,
"source" : {
"type" : "object" ,
"description" : "Where the value comes from" ,
"required" : [ "extractor_id" , "output_name" ] ,
"properties" : {
"extractor_id" : {
"type" : "string"
} ,
"output_name" : {
"type" : "string"
}
}
} ,
"penalty_config" : {
"type" : "object" ,
"description" : "Penalty method configuration" ,
"properties" : {
"method" : {
"type" : "string" ,
"enum" : [ "linear" , "quadratic" , "exponential" ]
} ,
"weight" : {
"type" : "number"
} ,
"margin" : {
"type" : "number" ,
"description" : "Soft margin before penalty kicks in"
}
}
} ,
"description" : {
"type" : "string"
} ,
"canvas_position" : {
"$ref" : "#/definitions/position"
}
}
} ,
"optimization" : {
"type" : "object" ,
"description" : "Optimization algorithm configuration" ,
"required" : [ "algorithm" , "budget" ] ,
"properties" : {
"algorithm" : {
"type" : "object" ,
"required" : [ "type" ] ,
"properties" : {
"type" : {
"type" : "string" ,
"description" : "Algorithm type" ,
"enum" : [ "TPE" , "CMA-ES" , "NSGA-II" , "RandomSearch" , "SAT_v3" , "GP-BO" ]
} ,
"config" : {
"type" : "object" ,
"description" : "Algorithm-specific settings" ,
"properties" : {
"population_size" : {
"type" : "integer"
} ,
"n_generations" : {
"type" : "integer"
} ,
"mutation_prob" : {
"type" : [ "number" , "null" ]
} ,
"crossover_prob" : {
"type" : "number"
} ,
"seed" : {
"type" : "integer"
} ,
"n_startup_trials" : {
"type" : "integer"
} ,
"sigma0" : {
"type" : "number"
}
}
}
}
} ,
"budget" : {
"type" : "object" ,
"description" : "Computational budget" ,
"properties" : {
"max_trials" : {
"type" : "integer" ,
"minimum" : 1 ,
"maximum" : 10000
} ,
"max_time_hours" : {
"type" : "number"
} ,
"convergence_patience" : {
"type" : "integer" ,
"description" : "Stop if no improvement for N trials"
}
}
} ,
"surrogate" : {
"type" : "object" ,
"description" : "Neural surrogate configuration" ,
"properties" : {
"enabled" : {
"type" : "boolean"
} ,
"type" : {
"type" : "string" ,
"enum" : [ "MLP" , "GNN" , "ensemble" ]
} ,
"config" : {
"type" : "object" ,
"properties" : {
"n_models" : {
"type" : "integer"
} ,
"architecture" : {
"type" : "array" ,
"items" : {
"type" : "integer"
}
} ,
"train_every_n_trials" : {
"type" : "integer"
} ,
"min_training_samples" : {
"type" : "integer"
} ,
"acquisition_candidates" : {
"type" : "integer"
} ,
"fea_validations_per_round" : {
"type" : "integer"
}
}
}
}
} ,
"canvas_position" : {
"$ref" : "#/definitions/position"
}
}
} ,
"workflow" : {
"type" : "object" ,
"description" : "Multi-stage optimization workflow" ,
"properties" : {
"stages" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"name" : {
"type" : "string"
} ,
"algorithm" : {
"type" : "string"
} ,
"trials" : {
"type" : "integer"
} ,
"purpose" : {
"type" : "string"
}
}
}
} ,
"transitions" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"properties" : {
"from" : {
"type" : "string"
} ,
"to" : {
"type" : "string"
} ,
"condition" : {
"type" : "string"
}
}
}
}
}
} ,
"reporting" : {
"type" : "object" ,
"description" : "Reporting configuration" ,
"properties" : {
"auto_report" : {
"type" : "boolean"
} ,
"report_triggers" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"insights" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"properties" : {
"type" : {
"type" : "string"
} ,
"for_trials" : {
"type" : "string"
} ,
"config" : {
"type" : "object"
}
}
}
}
}
} ,
"canvas" : {
"type" : "object" ,
"description" : "Canvas UI state (persisted for reconstruction)" ,
"properties" : {
"layout_version" : {
"type" : "string"
} ,
"viewport" : {
"type" : "object" ,
"properties" : {
"x" : {
"type" : "number"
} ,
"y" : {
"type" : "number"
} ,
"zoom" : {
"type" : "number"
}
}
} ,
"edges" : {
"type" : "array" ,
"description" : "Connections between nodes" ,
"items" : {
"type" : "object" ,
"required" : [ "source" , "target" ] ,
"properties" : {
"source" : {
"type" : "string"
} ,
"target" : {
"type" : "string"
} ,
"sourceHandle" : {
"type" : "string"
} ,
"targetHandle" : {
"type" : "string"
}
}
}
} ,
"groups" : {
"type" : "array" ,
"description" : "Node groupings for organization" ,
"items" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"name" : {
"type" : "string"
} ,
"node_ids" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
}
}
}
}
}
} ,
"position" : {
"type" : "object" ,
"description" : "Canvas position" ,
"properties" : {
"x" : {
"type" : "number"
} ,
"y" : {
"type" : "number"
}
}
}
}
}