Skip to content

Finalize v5.14.1 and audit VSIM test surface#6

Open
LMSM3 wants to merge 50 commits into
masterfrom
day84t-chemplus-declarative-vsepr
Open

Finalize v5.14.1 and audit VSIM test surface#6
LMSM3 wants to merge 50 commits into
masterfrom
day84t-chemplus-declarative-vsepr

Conversation

@LMSM3

@LMSM3 LMSM3 commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • finalize active release metadata and CLI reporting at v5.14.1
  • audit the VSIM-labelled CTest surface without executing the suite
  • document parser/runtime/artifact/viewer foundation findings
  • retain the viewer-session factory wiring fix

Validation

  • release configure/build passed
  • full release CTest passed before final CLI metadata correction
  • CLI reports v5.14.1 via --version and --build-info
  • VSIM discovery only: ctest -N -L vsim (41 discovered; no VSIM tests executed)

LMSM3 and others added 30 commits April 12, 2026 21:13
…Tier 1 Identity: formula, atom count, composition, canonical ordering Tier 2 Topology: Morgan+FNV-1a graph hash, bond signature, coordination Tier 3 Geometry: pairwise distance hash, geometry/symmetry class, pose-normalized Tests: topo invariance under perturbation, geom invariance under rigid transforms (translate/rotate/reflect), atom-order permutation invariance, near-degenerate sensitivity, 500-molecule scale collision detection, full provenance record audit
…clear domain added to Scale 1->2 (Atomistic->CG) transition so displacement energy and Frenkel pair targets propagate from atomistic through grain. NuclearCore registry: Pu-239 active (Ed=35 eV, fissility=37.03, monoclinic-alpha), U-238 and Th-232 as inactive fertile species. Version lineage updated: 4.0-LB now records Z=94 core active.
…xcel XML Time-limited runner (--minutes 10-20) with Pu-239/UO2/Zircaloy-4 nuclear fuel injection (~20% of cases). Output: master_report.tex (compilable LaTeX with booktabs/siunitx/longtable), data.xml (SpreadsheetML with nuclear row highlighting), summary.csv, and individual .md reports. Tested: 59658 reports in 1 min at 994 reports/sec.
…cture (129/129 tests pass)

- particle_id.hpp: ParticleID enum (-1..-18) with 7 constexpr predicates
  (is_reserved, is_decay_particle, is_transportable, is_bookkeeping_only,
   is_energy_carrier, is_defect_or_virtual, is_ghost) + to_string + helpers
- decay_event.hpp: DecayEvent record (parent/daughter IDs, emitted array[8],
  energy fractions, damage score, overflow-guarded add_emitted)
- decay_event_builder.hpp: make_alpha_decay, make_beta_minus_decay,
  make_gamma_decay with physics-correct default fractions
- kinetic_event_kind.hpp: coarse EventKind enum (11 kinds)
- kinetic_event_record.hpp: KineticEventRecord with std::variant payload
  (DecayEvent | GenericTransportEvent)
- legacy/c_api: C99 particle_ids.h/c + decay_event.h/c (portable C API)
  Fix: malformed block comment in particle_ids.h (-9..-14 range was swallowed)
- gas2_tui.hpp: pure-ANSI interactive TUI (937 lines, 7 screens)
- cmake: vsepr_legacy_c STATIC library + test_particle_id_decay CTest target
- tests/CMakeLists.txt: ParticleIDDecayTest (core nuclear physics quick)
Beta-6 instrumentation release (developed alongside v4.1.x, distinct goals).

New: src/analysis/diffusion_analysis.hpp -- DiffusionRecord, DiffusionTracker, TransportInference, TransportAnalyzer, ActivationTrend, annotate_defect_ratios, annotate_formation_context

New: src/analysis/packing_analysis.hpp -- PackingRecord, PackingTracker, PackingInference, PackingAnalyzer, compute_compressibility

New: tests/test_macro_inference.cpp (Group 24) -- 12 diffusion cases + 4 packing cases. D_eff from MSD slope only. All macro properties analysis-only. Formation-context annotation. Formation codebase survey.

Architecture rule: no inferred property stored in State or xyzFull.
- src/gen/metal_presets.hpp: static DB for Nitinol(B2), W(BCC), Inconel625(FCC), Ti-6Al-4V(HCP)
  with occupancy-cycle support for substitutional disorder
- src/gen/lattice_builder.hpp: BCC/FCC/B2/HCP supercell builder → XYZFrame; 3-frame
  thermal trajectory generator (T=0/300/600 K placeholders)
- src/gen/step_writer.hpp: minimal STEP AP203 writer (ISO-10303-21), CARTESIAN_POINT
  per atom — engineering geometry truth artifact
- src/gen/metal_gen.cpp: driver emitting .xyz .xyza .xyzc .xyzf .step + geometry_map.json
  per material; reuses vsepr::io XYZ writer API throughout

Generates 21 artifacts (5 per material) + geometry_map.json in gen_out/
Branch: v5.0.0-beta.7-step-attempt
- src/gen/.gitignore: suppress exe, gen_out/ from VCS
- src/gen/README.md: full module doc — presets, builder, STEP writer,
  build/run instructions, artifact contract, extension guide
- docs/FILE_FORMATS.md: add STEP AP203 section (structure, role,
  limitations, writer API); update Overview table to include .xyzf
  and .step; add src/gen/ cross-reference at bottom
tests/test_metal_gen.cpp — 15 test categories, 399 checks:
  1.  Preset database integrity
  2.  Atom count correctness (BCC/FCC/B2/HCP, 1^3–8^3 and asymmetric)
  3.  Coordinate bounds (cubic orthorhombic; HCP z-only due to hex cell)
  4.  Species fractions (alloy occupancy cycle verification)
  5.  XYZFrame invariants (N, has_* flags, PBC, T, E)
  6.  Per-atom fields (q, v, e present; build-time v==0)
  7.  Determinism (identical frames from independent calls)
  8.  Thermal trajectory (frame count, T values, T=0 zero velocity)
  9.  STEP AP203 output (header/footer tokens, CARTESIAN_POINT count)
  10. geometry_map.json required keys
  11. Scaling stress — 8x8x8, 2048 atoms, finite coords, valid STEP
  12. Energy accumulation (frame total == N * ref_energy_per_atom)
  13. Zero-velocity at build time
  14. HCP geometry (NN distance using hex convention sqrt(a^2/9+c^2/4))
  15. B2 site ordering (even=Ni corner, odd=Ti body-centre)

src/gen/lattice_builder.hpp — fix HCP box:
  - box.ay is now |a2| = ny*a (lattice vector length), not ny*a*sqrt3
  - lattice[] matrix now stores the actual hex 3x3 vectors correctly

All 399 checks PASS.
Simulates common new-user loop mistakes against the metal_gen pipeline:

  Loop A (for)   — off-by-one: i <= frame.N accesses atoms[N] (UB)
                   Fix: strict i < frame.N

  Loop B (while) — missing ++i increment causes infinite loop
                   Guarded at 100k iters; produces -8.73e6 vs correct -4714.2
                   Fix: add ++i before closing brace

  Loop C (for)   — min_e initialised to 0.0 instead of +inf
                   Masks all all-positive energy blocks (returns 0, not 50.0)
                   Fix: std::numeric_limits<double>::max() as initial value

All 3 bugs demonstrated to produce wrong output; all 3 fixes verified correct.
8/8 checks pass.
VizMode::BATCH_PASSIVE (src/vis/viz_config.hpp)
  - New enum variant: zero overhead preset for extended batch runs
  - Disables outlines, shadows, AA, motion blur, interpolation
  - Adds batch_display_fps, batch_show_status, batch_run_label fields
  - apply_mode_preset() case sets target_fps = batch_display_fps

BatchWindowBridge (src/vis/batch_window_bridge.hpp)
  - Lock-free frame slot: std::atomic<shared_ptr<XYZFrame>> (C++20)
  - Producer API: push_frame(), push_status(), push_progress(), start(), finish()
  - Consumer API: latest_frame(), status_text(), status_snapshot(), display_tick()
  - BatchStatus: run_label, frame/artifact counters, elapsed time, current_op
  - display_tick() throttle: returns true only when 1/target_fps has elapsed
  - Drop-oldest policy: producer never blocks; stale frame silently replaced

ContinuousRunDisplay (src/vis/continuous_run_display.hpp)
  - Top-level wiring: configure() -> open() -> run_event_loop() pattern
  - ConsoleProgressBar fallback for headless / no-GL environments
  - Single-step tick() variant for embedding into existing event loops
  - GL window init deferred to continuous_run_display.cpp (beta.8 GL layer)
  - Does NOT modify existing Window::run_with_ui() interactive path

Deprioritizes interactive UI layer per architecture directive:
  - BATCH_PASSIVE preset strips all interactive rendering features
  - No ImGui panel changes; overlay text injected via existing status path
  - Producer thread and display thread fully decoupled
- xyz_to_snapshot.hpp: XYZFrame -> FrameSnapshot inline converter
- window.hpp/cpp: add run_batch(bridge, fps) -- throttled passive GL loop,
  BATCH_PASSIVE preset, no ImGui, exits when bridge.is_done()
- continuous_run_display.hpp: clean interface (configure/open/close/bridge/
  run_event_loop), pimpl-style GL delegation to .cpp
- continuous_run_display.cpp: open() constructs Window, run_gl_loop()
  delegates to Window::run_batch(), run_console_loop() is headless fallback
- Removed orphaned auto_pilot stanza that was floating outside any function
  in window.cpp
- continuous_run_display.hpp: WindowDeleter with #ifdef guards so the
  non-GL path needs no .cpp linkage; run_gl_loop() is inline no-op when
  VSEPR_HAS_GL not set
- continuous_run_display.cpp: WindowDeleter body + GL loop (GL builds only)
- metal_gen.cpp: wired ContinuousRunDisplay; worker thread owns generation;
  main thread runs display.run_event_loop() (console bar when no GL)
- metal_gen builds clean, runs, shows live progress bar during batch
stress test (src/gen/batch_display_stress.cpp):
  12 tests -- T1 round-trip, T2 10k-frame flood, T3 monotonicity,
  T4 torn-read guard, T5 elapsed monotonic, T6 tick throttle,
  T7 lifecycle FSM, T8 multi-cycle, T9 threaded console loop,
  T10 empty-label guard, T11 late consumer, T12 zero-atom edge case
  result: 12/12 ALL PASS

docs (docs/vis/):
  batch_display_api.md   -- full API reference for all public types
  batch_display_usage.md -- thread model, build variants, integration
                            walkthrough, cadence guide, file map,
                            known limitations / future work
…ocumentation

- Add render_interval (step-count) to VisualSection and VisualExternalSection
- Parse render_interval in vsim_parser.cpp for both visual scopes
- Gate render dispatch in beta10_demo.cpp and kernel_demo.cpp
- Create Group 35 acceptance tests (test_render_interval.cpp)
- Create VSIM_LANGUAGE.md: canonical language guide
- Create VSIM_REFERENCE.md: field reference adjacent to README
- Create VSIM_DEVELOPMENT.md: 5-step add/wire/test/document checklist
- Update STAGE.md and docs/wo/WO_56C.md to mark Day 57 D complete

render_interval is orthogonal to display_fps; it controls simulation-step
emission cadence for render and export layers, defaulting to 1 (render every step).
- Bump version date to 2026-05-07
- Add beta-7 Day 57 progress block with commit ref 142fb5e4
- Add Section 4: render_interval doctrine (orthogonal to display_fps)
- Add Section 7: developer procedure 5-step checklist
- Add Section 8: key reference files table
- Renumber Terminology -> 5, System Layers -> 6
Beta-8 closes the runtime foundation stage for VSEPR-SIM.

Runtime layer:
- PBC wired into FIRE minimiser (wrap_coords after position update)
- Ewald summation for ionic crystals (real + k-space + self-energy)
- render_interval cadence field (WO-VSIM-57D, Group 35)

Export / artifacts:
- Export flushing (flush_exports, flush_pipeline_artifacts)
- Dashboard SVG + PNG raster export (stb / PPM fallback)
- STEP sidecar export foundation (point-cloud; B-Rep deferred)
- Pipeline audit JSONL, report MD + JSON, run manifest

Language / schema (WO-VSIM-03B):
- Intent-based authoring: [material], [run], [environment]
- [excite.*], [observe], [[override.particle]], [[raw.object]]
- resolve_structure_alias(): 70-entry canonical alias map
  (ionic, metals, covalent, oxides, geometry, polymers,
   porous/framework, bead/premacro)
- Group 36 acceptance tests (IntentAuthoringTest)
- VSIM_LANGUAGE.md and VSIM_REFERENCE.md updated

Stage / docs:
- STAGE.md: beta-8 CLOSED, beta-9 promoted
- WO-VSEPR-SIM-58A gate table (all 8 gates closed)
- docs/wo/WO_58A.md work order record
- VSIM_REFERENCE.md: beta-9 owned items table

Deferred to beta-9: registry resolution engine (WO-VSIM-03C)
Deferred to beta-10: installation / consumer packaging
Day 61 | WO-VSIM-61A–61D + WO-VSEPR-SIM-62A

Schema
------
* vsim_document.hpp — added VsimSystemSection, VsimStructureAnalysisSection,
  VsimSamplingSection (RDF/MSD/unwrap_pbc), VsimScaleSamplingSection
  (field_projection / RVE), VsimAnalysisInferenceSection (packing/mobility
  regime), VsimVerifySection + verify sub-sections (structure / rdf / msd /
  mass) for the empirical verification layer (WO-62A)
* VsimDocument gains: pipeline_system, pipeline_structure, pipeline_sampling,
  pipeline_scale_sampling, pipeline_inference, pipeline_output, pipeline_verify

Parser / Runtime
-----------------
* vsim_parser.cpp / vsim_parser.hpp — parse [analysis.structure],
  [analysis.sampling], [analysis.scale_sampling], [analysis.inference],
  [verify], [verify.structure], [verify.rdf], [verify.msd], [verify.mass]
* vsim_runtime.hpp — runtime surface updated for analysis/verify pass

New headers
-----------
* include/vsim/exit.hpp              — exit-code constants
* include/vsim/reaction_bridge.hpp   — ReactionBridge API
* include/vsim/vsim_output_layout.hpp — AppDataPaths + run-folder helpers
* include/vsim/vsim_registry.hpp     — RegistryBundle + RegistryResolver
* include/vsim_override/vsim/        — override copies synced

Examples / scripts
------------------
* examples/wo61c_pipeline_test.vsim + wo61d_*.vsim — pipeline scenario files
* scripts/demo_0[1-7]_*.vsim + val_0[1-8]_*.vsim — beta-11 demo and
  validation scripts for registry, PBC, laser-MD, variance, batch sweep,
  CaF2/ZnS/TiO2/SiO2/MFI/graphite/Ar/S22 empirical targets

Documentation
-------------
* STAGE.md — rebuilt from scratch; eliminated 4448-line corruption blob
* VSIM_REFERENCE.md — appended WO-62A verify-layer section (encoding corruption
  repaired: 10 x U+FFFD and broken surrogate pair removed); WO-62B and WO-62C
  batch-study schema sections added
* VSIM_LANGUAGE_REFERENCE.md — new language quick-reference
* docs/VSIM_LANGUAGE.md — language spec updated
* VSIM_DEVELOPMENT.md — naming-convention note added
* tests/CMakeLists.txt — Day 62 group comment corrected (header vs source file)
* CMakeLists.txt / atomistic/CMakeLists.txt / coarse_grain/CMakeLists.txt —
  build wiring updated

Test groups passing: G39 (WO-62A verify, 19/19)
- Rewrote demo_approach1_defect_diffusion.vsim: [material] B1_NaCl + 4
  batch jobs (vacancy_na, vacancy_cl, schottky_pair, frenkel_na),
  research_report export profile, SVG visual output
- Rewrote demo_approach2_formation_path.vsim: 5 batch jobs for thermal
  protocols (slow_cool, rapid_quench, stepped_cool, reheat_cycle,
  isothermal_anneal), memory overlay for nucleation analysis
- Rewrote demo_approach3_powder_sintering.vsim: [material] premacro_powder_bed
  MgO + 5 batch jobs (loose_drop, compressed, vibrated, bimodal, contaminated)
- All three scripts: registry resolves B1_NaCl / premacro_powder_bed,
  4-5 batch jobs confirmed, BOM-free, validate OK
- Added reports/report_approach1.md (Sections 0-8, 12/12 sigs passed)
- Added reports/report_approach2.md (Sections 0-8, 16/16 sigs passed)
- Added reports/report_approach3.md (Sections 0-8, 17/17 sigs passed)
Leftover template workflow was firing on every branch push and failing
because scripts/labelme_test.sh does not exist in this repo.
VSEPR-SIM does not use labelme.
… routing

- Bump version 2.0.0 -> 5.0.0, publisher LMSM3, URL -> LMSM3/VSEPR-SIM
- Add kernel (vsepr.exe, vsepr-cli.exe, vsepr_batch.exe), vsim parser
  headers (include/vsim/*), scripts/, VSIM_REFERENCE.md to [Files]
- Remove stale references: CHANGELOG.md, vsepr.bat, installer_banner.bmp
- Add installer/bin/open_xyz.cmd: thin pythonw launcher with multi-path
  fallback (PATH -> LOCALAPPDATA -> C:\PythonXXX -> powershell msgbox)
- Wire .xyz and .vsxyz registry associations -> open_xyz.cmd (was vsepr.exe)
- Add .vsim script association -> vsepr-cli.exe
- All associations are optional installer Tasks (opt-in)
- tools/vsepr_xyz_popup.pyw: detect installed layout ({app}/bin/) in
  find_project_root, resolve BUILD_DIR for both dev and installed trees,
  update docstring to cover .xyz + .vsxyz
VSEPR-SIM Dev and others added 20 commits May 11, 2026 17:21
…uild paths

AUDIT FINDINGS
--------------
- Duplicate installer logic: dist/VSEPR-SIM-5.0.0-local/installer/
  register-file-associations.ps1 (beta-10, canonical) was not referenced
  by setup.iss — the Inno Setup [Registry] block re-implemented the same
  associations independently. Removed the duplication.
- build\bin\ does not exist; binaries land in build\ flat.
  Fixed 5 scripts that referenced the non-existent path.
- No filename collisions between archive/legacy/bridge_beta and live source.

INSTALLER CHANGES (setup.iss)
------------------------------
- Removed entire [Registry] block (was duplicating register-file-associations.ps1)
- Added [UninstallRun] to call PS script -Unregister on removal
- File associations now owned exclusively by register-file-associations.ps1
  under HKCU — no admin required, clean uninstall guaranteed
- [Tasks]: collapsed 3 per-ext tasks into one 'fileassoc' task
- [Files]: added vsepr-sim.exe, register-file-associations.ps1;
  renamed open_xyz.cmd -> open_vsim_file.cmd

UNIVERSAL OPENER (open_vsim_file.cmd, replaces open_xyz.cmd)
-------------------------------------------------------------
- Single handler for .xyz .xyza .xyzA .xyzc .xyzf .xyzF .xyzfull .vsxyz .vsim
- Priority: vsepr-sim.exe open -> vsepr.exe open -> pythonw popup
- Python fallback probes PATH then common install locations

ASSOCIATION SCRIPT (installer/register-file-associations.ps1)
--------------------------------------------------------------
- Copied from dist/ (beta-10 canonical) into installer/ so Inno Setup
  can package it and it is tracked in version control
- Added .vsxyz (full takeover) and .xyzfull lowercase mapping
- All XYZ open commands now route through \ = open_vsim_file.cmd
  instead of hardcoded vsepr-sim.exe; preserves priority order

SCRIPT PATH FIXES
-----------------
- scripts/automate_review.ps1: build\bin\vsepr.exe -> build\vsepr.exe
- scripts/random_discovery.ps1: same
- scripts/run_cli_tests.ps1: all build\bin\ -> build\ (bulk replace)
- scripts/create_portable_zip.bat: paths + version 2.0.0 -> 5.0.0
- scripts/build_formula_tests.ps1: build\bin\ -> build"
…taller vsepr.exe path; rewrite QUICKBUILD for v5; add deprecation policy

- bridge_beta/CMakeLists.txt renamed to .disabled (cmake-invisible)
- README stubs added to legacy/, archive/, bridge_beta/, v4/, v5/
- installer/setup.iss [Run]: -BinaryPath now vsepr.exe (was vsepr-sim.exe, missing binary)
- installer/register-file-associations.ps1: fix error message to match vsepr.exe
- QUICKBUILD.md: full v5 rewrite (was v2.4.0 meso-build era, stale binary/script names)
- CONTRIBUTING-DEPRECATION.md: new file documenting deprecation criteria and archive workflow

Closes 3.1 3.2 3.3 4.1 4.2
demo_viz_01_xyz_single — Ar gas cloud (64 atoms, 30 Ang, PBC):
  - emits via vsepr Ar@gas emit --cloud 64
  - validates .vsim (visual section with advanced overlays)
  - opens in vsepr-sim terminal 3D viewer

demo_viz_02_xyzf_anim — OsO4 NVT trajectory (5 frames, 450 atoms):
  - generates .xyzf via gen_xyz_demo
  - validates .vsim (visual.external export_trajectory)
  - opens in vsepr-sim trajectory player ([q]=quit [p]=pause)

File associations re-registered from dev-tree (register-file-associations.ps1)
pointing at build\vsepr.exe. Double-click any .xyzf file to launch the player.
…yback, Qt bridge, docs overhaul

- FormationOutput -> KernelEventLog -> DashboardRecord pipeline wired (WO-57D)
- Gas-mixing MD demo: four-corner N2/O2/H2O/Ar injection at 1200K, N>1200
  - region + velocity_drift schema/parser support in vsim_document/vsim_parser
  - molecule_atoms_from_formula() helper (no hardcoded gas lists)
  - xyzf trajectory writer in cmd_run_vsim.cpp
- Qt workstation: auto-launch with --xyzf on scripted run completion
- EngineAdapter: multi-frame xyzf trajectory import, symbol_to_Z CPK fix
- Organic formula parser added (chem/organic/)
- Peptide formation updates and new test coverage
- node_accessor: VSIM document node traversal helper
- vsim_document_new: extended schema draft
- Gallery VSIM scripts: helium reactor, NaCl PBC, calibration HTGR, room reactor
- Installer: vsepr.cmd launcher, vsepr_xyz_popup.pyw, open_vsim_file.cmd updated
- README: v5.0.0 rewrite — What's New section, vsper Quick Start, beta-gate
  validation status, v5 repo tree, softened closing tone, Python refs removed
- TOUR.md: v5 architecture rewrite, Python/pykernel references removed
- VSIM_LANGUAGE.md, VSIM_REFERENCE.md: schema updates for render_interval,
  velocity_drift, region fields
- cmake/CoreBuild.cmake: build config template wired
- tests: smoke_motd, smoke_tui, test_domain_audit, test_gallery_parse added
- Add pykernel/pillars/empirical_chem.py (Pillar F, v5.1.3)
  Sources: PubChem REST API + PeriodicTableJSON warm fallback
  + NIST SRD-128 polarizability + Alvarez/Bondi/Shannon radii tables
- Generate data/elements.empirical.json (118 elements, schema v1)
  Fields: atomic_weight, en_pauling, IE1, EA, radii (cov/vdW/ionic),
          polarizability, electron_config, melt/boil, density,
          molar_heat, phase — all with per-field _sources tags
- Add docs/audit/chem_audit_empirical.md (field coverage audit)
- Add pykernel/pillars/_verify_v5113.py (30-check verification suite)
  Passes: pillar imports, JSON integrity, EA/IE unit sanity,
          source-tag audit, API smoke test
- Update pykernel/pillars/__init__.py to export empirical_chem

Pre-electron / high-accuracy classical MD baseline checkpoint.
Verification: 30/30 PASS  exit=0
…ocument.hpp - step6 analysis: +7 fields (cutoffs, msd, rmsd, variance/n_evolution probes); step7 export: +10 fields matching ExportSection keys, +new export.visual sub-module (8 fields); step8 visual: +18 fields (7 output_type choices, animation_mode fix, all VisualSection flags, GL/web/pacing options). All sourced from vsim_document.hpp. Demo verified, build clean.
…track WO-MF-01 ledger; add PROGRESS_SUMMARY.md
…ty, formal_charge, orphaned tests registered, reaction engine smoke test

- types.hpp: add Atom::formal_charge (int8_t, default 0)
- chemistry_v2.hpp: replace detect_rings() stub with DFS cycle detection
- chemistry_v2.hpp: replace detect_aromaticity() stub with Hückel 4n+2 impl
- chemistry_v2.hpp: wire formal_charge into validate_atom() (closes TODO)
- chemistry_v2.hpp: switch include to element_data_integrated.hpp (production DB)
- chemistry_universal_test.cpp: fix include + load_from_json_file() call (re-enables)
- tests/CMakeLists.txt: register ElementDBPhase1Full, ChemistryValidation, ChemistryUniversal
- tests/test_reaction_engine.cpp: new 17-check audit (RE-01..RE-17)
- tests/CMakeLists.txt: register ReactionEngineAudit
Chemistry CTest result: 12/12 PASS (was 4/12 before this commit)
- Implement DFS ring detection + Huckel aromaticity (chemistry_v2.hpp)
- Implement simplified CIP tetrahedral R/S chirality (isomer_signature.hpp)
- Fix Molecule::add_atom() mass lookup via chemistry_db().get_mass(Z)
- Fix ReactionEngine element lookup from State::type (engine.cpp)
- Wire evaluate_organic_diagnostics + flush_organic_diagnostics (vsim_runtime.hpp)
- Re-enable ChemistryUniversalV2, Phase2ComplexMolecules, IsomerTest targets
- Add init_chemistry_db() to 14 pre-existing tests that lacked DB init:
  energy_tests, optimizer_tests, angle_tests, vsepr_tests, torsion_tests,
  test_torsion_analysis, torsion_validation_tests, alkane_torsion_tests,
  butane_scan, vsepr_domain_test, basic_molecule_validation, test_ethane_torsion,
  test_thermal_animation, test_formation_event_wiring
- Promote MF-C03 (chirality detection) -> COMPLETE in WO-MF-01
- Update PROGRESS_SUMMARY.md: 95% critical path, 87% overall velocity
MF-F01 (STAGE.md missing — was 🔴):
  - Recreated STAGE.md at repo root from git history (d734759) + current state
  - Updated milestone table: v5.13.4 COMMITTED, v5.13.5 IN PROGRESS
  - Full test group registry Groups 1-89 + ChemistryUniversalV2/Phase2/IsomerTest
  - Day 74 section: WO-74A/B/C all COMPLETE (per WO-74 doc)
  - Day 75 section: WO-75A Part A COMPLETE, B PENDING, C COMPLETE
  - v5.13.5 release gate table with accurate per-criterion status
  - Promoted MF-F01 to COMPLETE in WO-MF-01

WO-75A Part C (IKK Python time-series — was 🟡):
  - Added discover_identity_sidecar(search_dir) to reporting/generate_report.py
  - Added plot_dist_timeseries(sidecar_path, out_path): reads .identity.json,
    dual-axis matplotlib figure (D_rec left / entropy proxy right), amber
    identity-loss band, D=0.5 reference line, ASCII-safe cp1252-compatible caption
  - Updated generate_consolidated_report() to accept optional captions dict
  - Added step 2.5 in main(): scan sidecars, generate PNGs, pass captions
  - Graceful fallback (None, None) when matplotlib unavailable
  - Promoted MF-E02 to COMPLETE in WO-MF-01

Test count unchanged: 167/167 passing
- Calls vsepr classify on H2O, NH3, CO2
- Verifies vsepr_report, conf values, fallback state, automation branch
- Exports dark-mode 3D matplotlib PNG per molecule to out/wo84s/
- 16 PASS / 0 FAIL (Day 84+ PNG export rule satisfied)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant