feat(cpp-object-oriented-modular-refactoring): step 24 - final-quality-reference-gate

This commit is contained in:
KOKO\Mimi
2026-08-16 13:54:51 +09:00
parent f84ebb541f
commit 35866d3d4f
3 changed files with 385 additions and 0 deletions
@@ -0,0 +1,165 @@
# C++ Object-Oriented Modular Refactoring Reference Comparison Report
## Metadata
- owner_agent: `implementation-agent`
- feature_id: `cpp-object-oriented-modular-refactoring`
- report_status: `passed`
- date: `2026-08-16`
- reference_baseline: `1e5758f3e482fae4c3d58cac680abe0aac02e549`
- command_order: `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`
- authoritative FESA output: generated `results.h5`
- reference artifacts: read-only existing files under `reference/`
## ARTIFACT CHECK
Exact declared artifact inventory:
| Artifact | Bytes | Lines | Data rows | SHA-256 |
| --- | ---: | ---: | ---: | --- |
| `reference/cantilever beam/cantilever beam.inp` | 2330 | 106 | N/A | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` |
| `reference/cantilever beam/cantilever beam displacements.csv` | 1790 | 12 | 11 | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` |
| `reference/cantilever beam/cantilever beam elemental forces.csv` | 1396 | 12 | 11 | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` |
| `reference/cantilever beam/cantilever beam reactions.csv` | 1780 | 12 | 11 | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` |
| `reference/shell/shell.inp` | 4770 | 164 | N/A | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | 5592 | 50 | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
Read-only schema precheck:
| Check | Result |
| --- | --- |
| B33 input contains `TYPE=B33` | Pass |
| MITC4 S4 input contains `TYPE=S4` | Pass |
| B33 displacement CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values |
| B33 reaction CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values |
| B33 elemental-force CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values |
| MITC4 S4 displacement CSV header/key/finite precheck | Pass: 49 rows, 49 unique keys, 0 duplicate keys, 0 nonfinite values |
| Reference tree diff before compare | Pass: `git diff --exit-code 1e5758f -- reference`, exit 0 |
## COMPARE
Command:
```powershell
ctest --test-dir .harness/build -C Debug `
-R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure
```
Result: exit 0 in 1.260s, 3/3 tests passed.
Generated artifacts:
| Artifact | Bytes | SHA-256 |
| --- | ---: | --- |
| `.harness/build/reference/cantilever-beam-b33/results.h5` | 25336 | `58CD358F68D8094079E9E525C35EE88AE0575A2962D93472BF0678D78A785247` |
| `.harness/build/reference/cantilever-beam-b33/comparison.json` | 128118 | `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` |
| `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | 95024 | `A8D2E12886E87BAA5D895B7E96278EA4B462718D13B985CA2688B505480F0195` |
| `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` |
| `.harness/build/reference/mitc4-shell-s4-metadata/results.h5` | 95024 | `8FD6609A2D3758365A2AC2E34692CC0EC982D8E67396BDFF03FAAF2539EF483C` |
| `.harness/build/reference/mitc4-shell-s4-metadata/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` |
The generated `comparison.json` files are the deterministic machine-readable
per-row decision records. The summaries below preserve row counts, worst rows,
precheck/tolerance decisions, and artifact hashes for audit.
## HDF5-to-CSV projection and tolerance contracts
### B33
- Model: `cantilever-beam-b33`
- HDF5 datasets:
- `/steps/Step-1/frames/0/nodal/displacement`
- `/steps/Step-1/frames/0/nodal/reaction`
- `/steps/Step-1/frames/0/element/section_resultant`
- Row identity: model, `Step-1`, frame `0`, instance `PART-1_1-1`, source node label, quantity, component.
- Components:
- displacement `UX/UY/UZ/URX/URY/URZ`
- reaction `RF1/RF2/RF3/RM1/RM2/RM3`
- section resultant `N/T/My/Mz`
- Tolerance: `absolute_floor + 1.0e-6 * reference_scale`, with reference scale from read-only Abaqus rows only; displacement/rotation floor `1.0e-9`, force/moment floor `1.0e-3`.
- Pre-tolerance policy: missing, extra, duplicate, nonfinite, schema-mismatched, or identity-mismatched rows fail before tolerance.
### MITC4 S4
- Case: `shell-s4`
- Source element type: `S4`
- Internal formulation: `FESA-MITC4`
- Integration rule: `2x2x2-gauss; mitc4-edge-midpoint-shear`
- HDF5 dataset: `/steps/Step-1/frames/0/nodal/displacement`
- Row identity: case, instance, source node label, component.
- Components: `U1/U2/U3` blocking; `UR1/UR2/UR3` warning-only.
- Tolerance: fixed absolute `1.0e-5` for every U/UR row; no component scale, row denominator, zero clamp, omission, or averaging affects the decision.
- Pre-tolerance policy: missing, extra, duplicate, nonfinite, header-mismatched, or identity-mismatched projected rows fail before tolerance.
## CLASSIFY
Blocking classification: `pass`.
No missing, extra, duplicate, nonfinite, schema-mismatched, identity-mismatched, or
tolerance-failed blocking row was reported by either generated comparison.
### B33 row and metric decisions
Overall: `passed=true`; row decisions: 176/176 passed; failed rows: 0; nonfinite row
metrics: 0; stress comparison applicable: `false` with N/A reason
`Abaqus beam stress comparison is N/A; analytical/unit and HDF5 schema tests provide stress evidence.`
Physics evidence: endpoint consistency passed; free residual norm
`9.356339321107032e-07`.
| Quantity | Component | Rows | Reference scale | Max abs error | Max normalized error | RMS error | Norm error | Worst row decision |
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| displacement | UX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass |
| displacement | UY | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass |
| displacement | UZ | 11 | 0.0190476272 | 5.33322917078971e-10 | 0.026602795021995 | 2.79095304685767e-10 | 9.25654406392607e-10 | node 11, FESA -0.019047626666677083, reference -0.0190476272, tol `2.00476272e-08`, pass |
| displacement | URX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass |
| displacement | URY | 11 | 0.00285714399 | 1.00001394318094e-10 | 0.0259262798011579 | 5.80165854051178e-11 | 1.92419245406385e-10 | node 9, FESA 0.002742858240001394, reference 0.00274285814, tol `3.85714399e-09`, pass |
| displacement | URZ | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass |
| reaction | RF1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| reaction | RF2 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| reaction | RF3 | 11 | 1000000 | 8.19563865661621e-07 | 8.1874512054108e-07 | 3.62393833938394e-07 | 1.20192437351202e-06 | node 1, FESA 1000000.0000008196, reference 1000000, tol `1.001`, pass |
| reaction | RM1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| reaction | RM2 | 11 | 10000000 | 5.05149364471436e-06 | 5.05098854585977e-07 | 1.52613777609191e-06 | 5.06162638168429e-06 | node 1, FESA -10000000.000005051, reference -10000000, tol `10.001`, pass |
| reaction | RM3 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| section_resultant | N | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| section_resultant | T | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
| section_resultant | My | 11 | 10000000 | 0.0156002428611895 | 0.00155986829928902 | 0.00470365086790684 | 0.0156002450736765 | node 11, FESA 2.4286118949223834e-07, reference -0.0156, tol `10.001`, pass |
| section_resultant | Mz | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass |
### MITC4 S4 row and metric decisions
Overall: `passed=true`; rows: 294/294 within tolerance; blocking U rows: 147/147
passed; warning-only UR rows: 147/147 within tolerance; warning count: 0; vector
metrics: 49.
| Component | Rows | Blocking rows | Reference scale | Tolerance | Max abs error | Max normalized error | RMS error | Vector norm error | Worst row decision |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| U1 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 12, FESA 0, reference 3.11730945e-23, pass |
| U2 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 11, FESA 0, reference 3.11730945e-23, pass |
| U3 | 49 | 49 | 2.37408203e-05 | 1e-05 | 1.90378534915144e-07 | 0.0190378534915144 | 4.24886125341252e-08 | 2.97420287738877e-07 | node 2, FESA -2.3550441765084857e-05, reference -2.37408203e-05, pass |
| UR1 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.88285496274043e-08 | 0.00688285496274043 | 2.7737837921291e-08 | 1.94164865449037e-07 | node 44, FESA 1.3985063203725957e-06, reference 1.46733487e-06, pass warning-only |
| UR2 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.8828549627399e-08 | 0.0068828549627399 | 2.77378379212909e-08 | 1.94164865449036e-07 | node 34, FESA 1.398506320372601e-06, reference 1.46733487e-06, pass warning-only |
| UR3 | 49 | 0 | 5.27113701e-25 | 1e-05 | 5.27113701e-25 | 5.27113701e-20 | 2.12986098533393e-25 | 1.49090268973375e-24 | node 34, FESA 0, reference -5.27113701e-25, pass warning-only |
Overall worst MITC4 row: node 2, component U3, FESA
`-2.3550441765084857e-05`, reference `-2.37408203e-05`, absolute error
`1.903785349151439e-07`, tolerance `1e-05`, normalized error
`0.01903785349151439`, blocking pass.
## Reference no-change assertion
Post-compare command:
```powershell
git diff --exit-code 1e5758f -- reference
```
Result: exit 0, `<no reference diff>`.
No reference input, CSV, tolerance, comparator contract, or generated reference
artifact was modified. Generated FESA outputs are confined to `.harness/build/`.
## Open issues
None blocking. Passing comparison is only an implementation handoff to physics
evaluation; it is not release readiness or physics approval.