fix(s3-followup): enforce V5 rule 4 + mark H3/H4/H5/V5/V6 done
All checks were successful
C++ Tests / test-fast (pull_request) Successful in 8m47s
C++ Tests / quality-gates (pull_request) Has been skipped
C++ Tests / test-cgal (pull_request) Has been skipped

serialization.hpp: `found_dofvector` was set but never checked after
the parse loop, leaving rule 4 of the strict-subset (§doc line 285)
unenforced.  Add the missing post-loop throw so a ConformalResult XML
that omits the <DOFVector> element is rejected with a clear error
instead of silently returning an empty x.  Update the docstring to
remove the misleading "silently returns" note.

finding-orchestration.md: mark H3/H4/H5/V5/V6  and record the S3
session as complete.  Implementation landed in commit 135bcf0 (P1
merge bd613a6); PR #45 code commits were redundant — the only net-new
change in this follow-up is the V5 enforcement fix + tracker update.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tarik Moussa
2026-06-01 14:27:21 +02:00
committed by Tarik Moussa
parent b67854645c
commit d3fc4ae056
2 changed files with 19 additions and 13 deletions

View File

@@ -283,8 +283,8 @@ inline void save_result_xml(
/// 3. A line containing `<DOFVector` must carry the `>` character (tag /// 3. A line containing `<DOFVector` must carry the `>` character (tag
/// open) on the same line. /// open) on the same line.
/// 4. The `<DOFVector` element must be present and must produce a /// 4. The `<DOFVector` element must be present and must produce a
/// non-empty doubles list (a missing DOFVector silently returns an /// non-empty doubles list (a missing DOFVector element causes a
/// empty x, which is incorrect for any mesh with at least one DOF). /// `std::runtime_error` — enforced after the parse loop).
inline std::vector<double> load_result_xml( inline std::vector<double> load_result_xml(
const std::string& path, const std::string& path,
NewtonResult* res = nullptr, NewtonResult* res = nullptr,
@@ -386,6 +386,13 @@ inline std::vector<double> load_result_xml(
" Only the format written by save_result_xml is supported."); " Only the format written by save_result_xml is supported.");
} }
// V5 rule 4: <DOFVector> must be present in every well-formed ConformalResult.
if (found_root && !found_dofvector)
throw std::runtime_error(
"conformallab: XML strict-subset violation in " + path
+ ": <DOFVector> element not found. Only the format written by"
" save_result_xml is supported.");
return x; return x;
} }

View File

@@ -126,19 +126,18 @@ CGAL result types (`Conformal_map_result`, `Hyper_ideal_map_result`,
</details> </details>
### ✅ S3 — Robustness & test-gap closure (DONE, 2026-06-01, Sonnet impl) ### ✅ S3 — Robustness & test-gap closure (DONE, 2026-06-01, Sonnet impl + Opus review)
Branch `fix/s3-robustness-gaps`, 2 commits (`833f9e7`, `2e6c4d7`), 313/313 CGAL tests green. 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: `<DOFVector>` missing now throws instead of silently returning empty `x`).
- **H3** — `enforce_gauss_bonnet` returns `|deficit|` (both overloads); 3 new tests. - **H3** — `enforce_gauss_bonnet` returns `|deficit|` (both overloads); 3 new tests.
- **H4** — `ReduceToFD_ThrowsForRealAxisBoundary` covers `Im(τ)==0.0` exact boundary. - **H4** — `ReduceToFD_ThrowsForRealAxisBoundary` covers `Im(τ)==0.0` exact boundary.
- **H5** — 2 new integration tests: sliver triangle (no crash/NaN, no LinearSolverFailed) - **H5** — 2 integration tests: sliver triangle (no crash/NaN) + exact-degenerate collinear.
and exact-degenerate triangle (no crash, meaningful failure status documented). - **V5** — `load_result_xml` rejects non-conforming XML (3 strict-subset checks); canonical
- **V5** — `load_result_xml` now explicitly rejects non-conforming XML (3 strict-subset round-trip regression test passes. V5 rule 4 (`<DOFVector>` must be present) now enforced.
checks: `geometry=` on same line, `>` on same line as DOFVector, root element present); - **V6** — `check_dof_vector_size(x, expected, context)` throws on mismatch; 3 new tests.
3 new tests (reject reformatted root, reject reformatted DOFVector, canonical still works). - **🔍 Opus review:** CHANGES-REQUESTED resolved — implementation correct; code commits
- **V6** — `check_dof_vector_size(x, expected, context)` helper added to were redundant with `135bcf0` on main; doc follow-up applied on `chore/s3-followup`.
`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.
### ⬜ S4 — Documentation & citations (Haiku → 🔍 Opus) ### ⬜ S4 — Documentation & citations (Haiku → 🔍 Opus)
- **N2** — `doc/math/tolerances.md`: every numerical threshold, its role, and - **N2** — `doc/math/tolerances.md`: every numerical threshold, its role, and