H3: enforce_gauss_bonnet now returns |deficit| (total absolute correction
applied) so callers can detect pathological input without a separate
check_gauss_bonnet call. Both overloads (raw property-map and Maps
template) now return double instead of void. API comment updated.
V5: load_result_xml now implements strict-subset XML rejection instead of
silently mis-reading reformatted-but-valid XML into zeros. The
function documents itself as accepting only the one-element-per-line
format written by save_result_xml. Three strict-subset checks added:
1. <ConformalResult geometry=...> attribute must be on its opening line.
2. <Solver> required attributes must be on the same line.
3. <DOFVector> tag '>' must be on the same line as the tag name.
Non-conforming files throw std::runtime_error immediately.
V6: new helper check_dof_vector_size(x, expected_dofs, context) added to
serialization.hpp. Throws std::runtime_error with a clear message when
the loaded DOF-vector size does not match the mesh's expected DOF count.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>