383 Commits

Author SHA1 Message Date
239e2f01a9 tune(brain): uniform triangulation + bigger spacing for r_f=6mm fillets
- Switched to uniform triangulation (no density-adaptive refinement for
  initial pass — saves that for stress-informed iterations)
- s_min=45mm, s_max=55mm (was 12/35) — larger triangles fit 6mm fillets
- Boss keepout circles: 12 segments (was 32) — less boundary clutter
- Fillet must be >= 80% of r_f at every corner or pocket is skipped
- Result: 75 pockets, 481 NX entities, min fillet 4.85mm, mass 4066g
- adaptive_density=True param enables density refinement for future stress iterations
2026-02-16 20:51:20 +00:00
30981fa066 fix(brain): enforce r_f=6mm minimum, reject pockets that can't fit fillets
- Default r_f raised from 1.5mm to 6mm (machining constraint)
- Default min_pocket_radius raised to 6mm
- Pockets that can't fit r_f at any corner (within 80% tolerance) are
  skipped entirely — left solid for more stiffness in tight areas
- Result: 26 pockets (was 432), 187 NX entities (was 13,061)
- Min fillet radius: 4.88mm, all >= 4.8mm (80% of 6mm)
- Mass: 4,601g (was 3,480g — more solid = heavier but manufacturable)
2026-02-16 20:42:46 +00:00
da9b579bcf refactor(brain): structured pocket output — 3 lines + 3 arcs per pocket
Replaced Shapely buffer-based fillet (59-pt polylines) with exact geometric
fillet computation. Each pocket now outputs:
- 3 straight edges (line start/end pairs)
- 3 fillet arcs (center, radius, tangent points, angles)

NX import updated to use SketchLineBuilder + SketchArcBuilder (3-point).
Total NX entities: ~2,600 (was ~13,000). Includes arc fallback to 2-line
segments if SketchArcBuilder fails.

Also outputs circular hole definitions for future NX circle creation.
2026-02-16 20:17:49 +00:00
fdcafe96a9 fix(import): use SketchLineBuilder instead of model curves + AddGeometry
Model curves (part.Curves.CreateLine) are SmartObjects that can't be added
to a sketch via AddGeometry. Switch to SketchLineBuilder which creates
native sketch geometry directly (SetStartPoint/SetEndPoint/Commit).
2026-02-16 20:02:11 +00:00
fbdbf6b362 fix(import): use Sketch.InferConstraintsOption enum (nested under NXOpen.Sketch, not NXOpen) 2026-02-16 19:56:31 +00:00
4e0c9cd24d fix: correct enum names from MCP - InferNoConstraints, TreatAsEllipse, UpdateLevel.Model runtime resolve 2026-02-16 19:50:24 +00:00
c93239c9c6 fix: strip closing duplicate points in triangulation (segfault fix), batch line creation for NX speed, 6mm endmill params 2026-02-16 19:29:41 +00:00
61dcefb5ea fix: resolve ViewReorient/UpdateLevel enum at runtime with multiple fallback paths 2026-02-16 19:15:57 +00:00
8143da96e9 fix: correct enum names - ViewReorient.FalseValue, UpdateLevel.Model (verified from MCP) 2026-02-16 19:14:22 +00:00
9534ba9ed9 fix: Builder.Commit() not CommitFeature(), correct AddGeometry signature, verbose commit logging 2026-02-16 19:11:28 +00:00
4fc129e35b fix: try setattr/SetX/method patterns for SketchInPlaceBuilder properties (NXOpen Python getter/setter naming collision) 2026-02-16 19:08:06 +00:00
bf1f461e2b fix: use Plane (SmartObject) not DatumPlane, method calls not property setters (verified from MCP stubs) 2026-02-16 19:05:12 +00:00
7a2c002672 fix: use Matrix3x3 for datum plane, property assignment for SketchInPlaceBuilder2 2026-02-16 18:57:31 +00:00
bf4e84d45a fix: use Planes.CreatePlane + Points.CreatePoint + Directions.CreateDirection for sketch creation 2026-02-16 18:54:21 +00:00
ef8801a5cd test: add sandbox1 rib profile output for import testing 2026-02-16 18:49:21 +00:00
f4cfc9b1b7 feat(adaptive-isogrid): import_profile.py - push rib profile as NX sketch, sandbox1 brain input test file 2026-02-16 18:45:24 +00:00
23b6fe855b fix: handle closed circular edges (holes) - UF.Eval + GetLength circle fallback + debug logging 2026-02-16 17:57:06 +00:00
98d510154d fix: rewrite edge sampling + loop building using verified NXOpen API (GetVertices, GetEdges, GetLength, UF.Eval) 2026-02-16 17:46:52 +00:00
851a8d3df0 fix: replace face.GetLoops() with compatible API (GetEdgeLoops / UF layer / GetEdges fallback) 2026-02-16 17:42:08 +00:00
1166741ffd fix: add try/except + debug logging around sandbox extraction 2026-02-16 17:31:33 +00:00
afaa925da8 fix: search features + feature names for ISOGRID_SANDBOX attribute (Promote Body stores attrs on feature, not body) 2026-02-16 17:26:31 +00:00
6251787ca5 merge: take remote extract_sandbox.py v2 2026-02-16 12:22:56 -05:00
40213578ad merge: recover Gitea state - HQ docs, cluster setup, isogrid work
Merge recovery/gitea-before-force-push to restore:
- hq/ directory (cluster setup, docker-compose, configs)
- docs/hq/ (12+ HQ planning docs)
- docs/guides/ (documentation boundaries, PKM standard)
- docs/plans/ (model introspection master plan)
- Isogrid extraction work
- Hydrotech-beam: keep local DOE results, remove Syncthing conflicts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:22:33 -05:00
26100a9624 feat(adaptive-isogrid): extract_sandbox.py v2 - NX journal compatible, no argparse, sim→idealized navigation, listing window output 2026-02-16 17:20:28 +00:00
ed6874092f chore: clean hydrotech-beam syncthing conflicts and add new docs
- Remove all .sync-conflict-* files
- Remove temp _temp_part_properties.json files
- Add USER_GUIDE.md
- Add dashboard docs (Executive, Technical, Operations, Master Plan)
- Add playbooks (DOE, NX_REAL_RUN, SYNCTHING_RECOVERY)
- Update iteration results

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 12:11:16 -05:00
bb83bb9cab feat(adaptive-isogrid): rewrite extract_sandbox.py - start from .sim, navigate to idealized part, find sandbox solid bodies by ISOGRID_SANDBOX attribute, inner loops as boundary constraints 2026-02-16 17:07:26 +00:00
fa9193b809 chore(hq): daily sync 2026-02-16 2026-02-16 10:00:29 +00:00
3184eb0d0e Add doc 12: Context lifecycle management — condensation, threads, staleness 2026-02-16 02:26:19 +00:00
85d40898f0 Revise spec to reserved-region FEM and add Phase 2 NX sandbox scripts 2026-02-16 02:04:19 +00:00
7086f9fbdf Add doc 11: HQ improvements plan from Bhanu video analysis 2026-02-16 01:19:27 +00:00
e4651c9a40 Adaptive isogrid: min triangle area filtering and circular hole bosses 2026-02-16 01:11:53 +00:00
9d4c37234a Add standalone brain CLI, test geometries, and robustness sweep outputs 2026-02-16 00:12:12 +00:00
4bec4063a5 feat: add adaptive isogrid tool — project foundations
- Python Brain: density field, constrained Delaunay triangulation,
  pocket profiles, profile assembly, validation modules
- NX Hands: skeleton scripts for geometry extraction, AFEM setup,
  per-iteration solve (require NX environment to develop)
- Atomizer integration: 15-param space definition, objective function
- Technical spec, README, sample test geometry, requirements.txt
- Architecture: Python Brain + NX Hands + Atomizer Manager
2026-02-16 00:01:35 +00:00
cf82de4f06 docs: add HQ multi-agent framework documentation from PKM
- Project plan, agent roster, architecture, roadmap
- Decision log, full system plan, Discord setup/migration guides
- System implementation status (as-built)
- Cluster pivot history
- Orchestration engine plan (Phases 1-4)
- Webster and Auditor reviews
2026-02-15 21:44:07 +00:00
3289a76e19 feat: add Atomizer HQ multi-agent cluster infrastructure
- 8-agent OpenClaw cluster (Manager, Tech-Lead, Secretary, Auditor,
  Optimizer, Study-Builder, NX-Expert, Webster)
- Orchestration engine: orchestrate.py (sync delegation + handoffs)
- Workflow engine: YAML-defined multi-step pipelines
- Agent workspaces: SOUL.md, AGENTS.md, MEMORY.md per agent
- Shared skills: delegate, orchestrate, atomizer-protocols
- Capability registry (AGENTS_REGISTRY.json)
- Cluster management: cluster.sh, systemd template
- All secrets replaced with env var references
2026-02-15 21:18:18 +00:00
d6a1d6eee1 auto: daily sync 2026-02-15 08:00:21 +00:00
6218355dbf auto: daily sync 2026-02-14 08:00:22 +00:00
0795cccc97 auto: daily sync 2026-02-13 08:00:19 +00:00
580ed65a26 fix: generic mass extraction in solve_simulation.py (beam + bracket)
- Extract mass RIGHT AFTER geometry rebuild while part is work part
- Replace unreliable p173 expression lookup with MeasureManager
- Skip re-extraction if mass already captured during rebuild
- Relax displacement constraint to 20mm (DEC-HB-012, CEO approved)

Root cause: journal hardcoded M1_Blank for bracket, failed silently on Beam.prt
Fix by: NX Expert + Manager diagnosis
2026-02-13 02:16:39 +00:00
57130ccfbc docs: add nightly memory digestion methodology 2026-02-12 14:20:57 +00:00
6f3325d86f fix: mass extraction NaN in Hydrotech Beam DOE — two bugs
Bug 1 — Journal (solve_simulation.py simple workflow):
  Expression lookup for p173 fails silently for derived/measurement
  expressions, so _temp_mass.txt was never written. Added MeasureManager
  fallback via extract_part_mass() (already used in assembly workflow).

Bug 2 — Extractor (extract_mass_from_expression.py):
  Journal writes 'p173=<value>' format but extractor tried float() on
  the whole content including 'p173='. Added key=value parsing.

Defense in depth — nx_interface.py:
  Added stdout parsing fallback: if _temp_mass.txt still missing, parse
  mass from journal output captured via solver.py stdout passthrough.

Files changed:
  - optimization_engine/nx/solve_simulation.py — MeasureManager fallback
  - optimization_engine/extractors/extract_mass_from_expression.py — key=value parse
  - optimization_engine/nx/solver.py — include stdout in result dict
  - projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py — stdout fallback

Tags: hydrotech-beam, mass-extraction
2026-02-11 19:02:43 +00:00
04f06766a0 docs: Atomizer HQ Dashboard — full plan (CEO-requested)
Five-pane architecture:
- Project Blueprint (CONTEXT.md → live view)
- Study Tracker (enhanced real-time monitoring)
- Command Center (remote NX execution from browser)
- Agent Console (interact with HQ agents)
- Reports & Export (PDF/HTML generation)

Phased implementation: D1-D5 (7-12 weeks total, MVP at D3)
Extends existing atomizer-dashboard (no rewrite)
Progressive: file-based bridge → WebSocket → NX MCP
2026-02-11 18:32:54 +00:00
b419510b1a feat: add Hydrotech Beam DOE landscape results (39 iterations)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 13:25:21 -05:00
2fde08daab docs: update KB and project docs with 2026-02-11 progress
- KB Gen 003: NX version (DesigncenterNX 2512), first real results
- sol101-static.md: path resolution lessons, in-place solving, result extraction confirmed
- CONTEXT.md: solver pipeline operational, first results (disp=17.93mm, stress=111.9MPa)
- DECISIONS.md: DEC-HB-008 to DEC-HB-011 (backup/restore, iteration arch, history DB, git workflow)
- optimization_engine/README.md: created (DesigncenterNX support, path resolution, NX file refs)
- studies/01_doe_landscape/README.md: updated architecture, iteration folders, history DB
- _index.md: closed gaps G3,G4,G6,G10-G14, updated generation to 003
2026-02-11 16:39:21 +00:00
93a5508c07 Fix mass extraction + db close order + nan handling
- Journal now extracts p173 mass expression and writes _temp_mass.txt
- history.get_study_summary() called before history.close()
- Optuna nan rejection: fallback to INFEASIBLE_MASS penalty
- pyNastran warning 'nx 2512 not supported' is harmless (reads fine)
2026-02-11 16:29:45 +00:00
0229ce53bb Fix NX version: DesigncenterNX2512 (was looking for NX2412)
- Add DesigncenterNX{version} to install path search
- Update default version to 2512
- Root cause of 'Part file is from a newer version' error
2026-02-11 15:54:32 +00:00
80104d2467 FIX: Resolve all paths to absolute before passing to NX
Root cause: Path.absolute() on Windows does NOT resolve '..' components.
sim_file_path was reaching NX as '...\studies\01_doe_landscape\..\..\models\Beam_sim1.sim'
NX likely can't resolve referenced parts from a path with '..' in it.

Fixes:
- nx_interface.py: glob from self.model_dir (resolved) not model_dir (raw)
- solver.py: sim_file.resolve() instead of sim_file.absolute()
- solve_simulation.py: os.path.abspath(sim_file_path) at entry point
- Diagnostic logging still in place for next run
2026-02-11 15:24:20 +00:00
55f0f917c7 Add NX diagnostic logging: OpenActiveDisplay result, load status, Parts.Open details
Need to see why Parts.Open returns None even from the master model folder.
Logs: basePart1 type/name/path, unloaded parts status, file existence checks.
2026-02-11 15:16:26 +00:00
3718a8d5c8 Fix NX solve: backup/restore master model, archive outputs to iterations
NX .sim files store absolute internal references to .fem/.prt files.
Copying them to iteration folders breaks these references (Parts.Open
returns None). Instead:

1. Backup master model once at study start
2. Restore from backup before each trial (isolation)
3. Solve on master model in-place (NX references intact)
4. Archive solver outputs (OP2/F06) + params.exp to iterations/iterNNN/
5. params.exp in each iteration: import into NX to recreate any trial

iteration_manager.py kept for future use but not wired in.
2026-02-11 15:05:18 +00:00
815db0fb8d Add persistent trial history DB (append-only, survives --clean)
- history.db: SQLite append-only, never deleted by --clean
- history.csv: Auto-exported after each trial (live updates)
- Logs: DVs, results, feasibility, status, solve time, iter path
- Cross-study queries: full lineage across all runs/phases
- --clean only resets Optuna DB, history preserved
2026-02-11 14:59:52 +00:00