diff --git a/code/include/serialization.hpp b/code/include/serialization.hpp index 7c31c4e..da69890 100644 --- a/code/include/serialization.hpp +++ b/code/include/serialization.hpp @@ -283,8 +283,8 @@ inline void save_result_xml( /// 3. A line containing `` character (tag /// open) on the same line. /// 4. The ` load_result_xml( const std::string& path, NewtonResult* res = nullptr, @@ -386,6 +386,13 @@ inline std::vector load_result_xml( " Only the format written by save_result_xml is supported."); } + // V5 rule 4: must be present in every well-formed ConformalResult. + if (found_root && !found_dofvector) + throw std::runtime_error( + "conformallab: XML strict-subset violation in " + path + + ": element not found. Only the format written by" + " save_result_xml is supported."); + return x; } diff --git a/doc/reviewer/finding-orchestration.md b/doc/reviewer/finding-orchestration.md index 705c6a3..94ee977 100644 --- a/doc/reviewer/finding-orchestration.md +++ b/doc/reviewer/finding-orchestration.md @@ -126,19 +126,18 @@ CGAL result types (`Conformal_map_result`, `Hyper_ideal_map_result`, -### ✅ S3 — Robustness & test-gap closure (DONE, 2026-06-01, Sonnet impl) -Branch `fix/s3-robustness-gaps`, 2 commits (`833f9e7`, `2e6c4d7`), 313/313 CGAL tests green. +### ✅ S3 — Robustness & test-gap closure (DONE, 2026-06-01, Sonnet impl + Opus review) +Implementation shipped in commit `135bcf0` (included in P1 merge `bd613a6`). +Follow-up commit closes the doc-tracker gap and fixes dead `found_dofvector` variable +(V5 rule 4: `` missing now throws instead of silently returning empty `x`). - **H3** — `enforce_gauss_bonnet` returns `|deficit|` (both overloads); 3 new tests. - **H4** — `ReduceToFD_ThrowsForRealAxisBoundary` covers `Im(τ)==0.0` exact boundary. -- **H5** — 2 new integration tests: sliver triangle (no crash/NaN, no LinearSolverFailed) - and exact-degenerate triangle (no crash, meaningful failure status documented). -- **V5** — `load_result_xml` now explicitly rejects non-conforming XML (3 strict-subset - checks: `geometry=` on same line, `>` on same line as DOFVector, root element present); - 3 new tests (reject reformatted root, reject reformatted DOFVector, canonical still works). -- **V6** — `check_dof_vector_size(x, expected, context)` helper added to - `serialization.hpp`; 3 new tests (throws on mismatch, passes on match, message content). -- **PR:** https://git.eulernest.eu/conformallab/ConformalLabpp/pulls/45 -- **🔍 Opus review:** pending. +- **H5** — 2 integration tests: sliver triangle (no crash/NaN) + exact-degenerate collinear. +- **V5** — `load_result_xml` rejects non-conforming XML (3 strict-subset checks); canonical + round-trip regression test passes. V5 rule 4 (`` must be present) now enforced. +- **V6** — `check_dof_vector_size(x, expected, context)` throws on mismatch; 3 new tests. +- **🔍 Opus review:** CHANGES-REQUESTED resolved — implementation correct; code commits + were redundant with `135bcf0` on main; doc follow-up applied on `chore/s3-followup`. ### ⬜ S4 — Documentation & citations (Haiku → 🔍 Opus) - **N2** — `doc/math/tolerances.md`: every numerical threshold, its role, and