1292 lines
117 KiB
Markdown
1292 lines
117 KiB
Markdown
# Linear Static 3D Euler Beam Implementation Report
|
|
|
|
## Metadata
|
|
|
|
- feature_id: `linear-static-3d-euler-beam`
|
|
- source_plan: `docs/implementation-plans/linear-static-3d-euler-beam.md`
|
|
- source_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md`
|
|
- status: `in-progress`
|
|
- owner_agent: `implementation-agent`
|
|
- validation_environment: `Windows, MSVC 19.51.36252, Visual Studio 18 2026, x64 Debug`
|
|
- report_started: `2026-08-09`
|
|
|
|
## Step 7 — cmake-test-foundation
|
|
|
|
- task_id: `TASK-07`
|
|
- status: `completed`
|
|
- changed_files: `CMakeLists.txt`, `cmake/FesaDependencies.cmake`,
|
|
`include/fesa/build_info.hpp`, `src/fesa/build_info.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`tests/unit/build_info_test.cpp`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T07-BUILD-001`, `T07-BUILD-002`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | Temporarily move `include/fesa/build_info.hpp` to `.harness/build_info.hpp.red-backup`; run `cmake --build .harness/build --config Debug --target fesa_unit_tests`; restore the header in `finally` | 1 | Build fails because the public API is unavailable | `build_info.cpp(1,10): error C1083: 'fesa/build_info.hpp': No such file or directory` |
|
|
| GREEN | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R BuildInfo --output-on-failure` | 0 | Foundation target builds and both named BuildInfo tests pass | `BuildInfo.VersionIsStableAndNonEmpty` and `BuildInfo.PublicHeaderHasNoBackendDependency`: 2/2 passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | MSVC x64 Debug build tree generated and dependencies resolved | Visual Studio 18 2026; MSVC 19.51.36252; MKL 2026.1; TBB and HDF5 CONFIG packages resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | FESA and GoogleTest targets build without FESA warnings | `fesa_solver.lib` and `fesa_unit_tests.exe` built; no warning emitted under FESA `/W4 /WX` |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers at least one test | 2 tests discovered, both carrying `linear-static-3d-euler-beam` and `unit` labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full suite has zero failures | 2/2 tests passed |
|
|
|
|
- contract_checks: GoogleTest revision
|
|
`04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4`; no default
|
|
`C:/git/googletest` path in production CMake; `/W4 /WX` is private to
|
|
`fesa_solver`; public BuildInfo header exposes only `std::string_view`.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- environment_note: Native Codex Windows workspace sandboxes stalled in the
|
|
CMake compiler-id `cl.exe` child process. The identical approved configure,
|
|
build, and CTest commands were therefore executed by the root session's
|
|
authorized unrestricted shell; the same configure completed in 7.9 seconds.
|
|
- reference_diff: unchanged
|
|
- handoff: `fesa_solver`, `fesa_unit_tests`, `fesa_tests`, normalized
|
|
`Fesa::MKL`, `Fesa::TBB`, `Fesa::HDF5`, and `solverVersion()` are available
|
|
to Step 8.
|
|
|
|
## Step 8 — core-diagnostics
|
|
|
|
- task_id: `TASK-08`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/core/source_identity.hpp`,
|
|
`include/fesa/core/diagnostic.hpp`, `include/fesa/core/status.hpp`,
|
|
`src/fesa/core/diagnostic.cpp`, `src/fesa/core/status.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`tests/unit/core/source_identity_test.cpp`,
|
|
`tests/unit/core/diagnostic_test.cpp`, `tests/unit/core/status_test.cpp`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-033`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T08-CORE-001`, `T08-CORE-002`, `T08-CORE-003`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Tests are registered before production and fail for the three missing core headers | MSVC C1083 for `fesa/core/diagnostic.hpp`, `fesa/core/source_identity.hpp`, and `fesa/core/status.hpp` |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal core implementation and all test translation units build | `diagnostic.cpp`, `status.cpp`, and three core tests compile; `fesa_unit_tests.exe` links |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure` | 0 | Identity, deterministic ordering, and Result exclusivity pass | 3/3 `CoreDiagnostics` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved MSVC x64 build tree regenerates with normalized dependencies | Configure and generate completed; MKL 2026.1 resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure` | 0 | Focused Step 8 suite remains green | 3/3 tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the existing and new named tests | 5 tests discovered with feature and unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 5/5 tests passed |
|
|
| VERIFY-harness | `uv run --with pytest python -m pytest -v -rs` | 0 | Harness regression suite remains green | 4/4 tests passed |
|
|
|
|
- contract_checks: `SourceEntityId` preserves numeric and raw label forms;
|
|
`sortDiagnostics()` applies the fixed file/line/keyword/entity/code tuple with
|
|
stable discovery-order ties; `Status` owns sorted diagnostics and optional
|
|
failure category; `Result<T>` owns either a value or failed status and rejects
|
|
both failed value access and construction from an OK status. Core public
|
|
headers include only FESA core or C++ standard-library headers; no
|
|
MKL/TBB/HDF5 names are present.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged
|
|
- handoff: `SourceLocation`, `SourceEntityId`, `Diagnostic`, deterministic
|
|
diagnostic sorting, `FailureCategory`, `Status`, and `Result<T>` are available
|
|
to Step 9 and later parser/model/solver tasks.
|
|
|
|
## Step 9 — dense-math-adapters
|
|
|
|
- task_id: `TASK-09`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/math/vector.hpp`,
|
|
`include/fesa/math/matrix.hpp`, `src/fesa/math/vector.cpp`,
|
|
`src/fesa/math/matrix.cpp`, `tests/unit/math/vector_test.cpp`,
|
|
`tests/unit/math/matrix_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-025`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T09-DENSE-001`, `T09-DENSE-002`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 1 | Both planned tests are registered before production and the build fails for the missing dense-math API | MSVC C1083 for `fesa/math/matrix.hpp` and `fesa/math/vector.hpp`; DenseMath discovery is unavailable until the test executable builds |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal dense adapters, tests, and runtime staging compile, link, and complete GoogleTest discovery | `matrix.cpp`, `vector.cpp`, both math tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built; no FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 0 | Storage/ownership/checking and row-major BLAS contracts pass | 2/2 DenseMath tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved MSVC x64 build tree regenerates with explicit dependencies | Configure/generate completed; oneMKL 2026.1 dynamic ILP64 backend resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 0 | Focused dense-math suite remains green | 2/2 tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated tests and both exact DenseMath names | 7 tests discovered with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 7/7 tests passed |
|
|
| VERIFY-public-header | `$leaks = rg -n "mkl\.h\|MKL_INT\|CBLAS_" include/fesa; if ($LASTEXITCODE -eq 0) { throw "MKL API leaked into public headers:`n$leaks" }; if ($LASTEXITCODE -ne 1) { throw 'Public-header dependency scan failed' }` | 0 | Public headers remain independent of oneMKL API and types | `rg` returned the required no-match exit 1; wrapper scan completed with zero leaks |
|
|
|
|
- contract_checks: `Vector` accepts zero size, owns contiguous doubles, deep-copies,
|
|
leaves moved-from objects empty and usable, checks every index, and rejects dot/axpy
|
|
mismatches; `Matrix` accepts zero dimensions, owns row-major contiguous doubles,
|
|
deep-copies, leaves moved-from objects empty and usable, checks every index, and
|
|
rejects GEMV/GEMM mismatches. Hand-derived nonsquare GEMV `[50,122]` and GEMM
|
|
`[[58,64],[139,154]]` pass. All copy, dot, norm, scale, axpy, GEMV, and GEMM calls
|
|
cross CBLAS only inside `.cpp` files. Windows tests stage the package-resolved
|
|
oneMKL/OpenMP runtime before post-build discovery because the exact shell does not
|
|
assume oneAPI in `PATH`.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: backend-free `fesa::Vector` and `fesa::Matrix` public APIs, with owning
|
|
dense storage and checked BLAS operations, are available to Step 10 and later
|
|
DOF/element/assembly tasks.
|
|
|
|
### Review Fix Round 1 — matrix-storage-size-overflow
|
|
|
|
- regression_test: `tests/unit/math/matrix_test.cpp` now constructs
|
|
`Matrix{SIZE_MAX / 2 + 1, 2}` and requires `std::length_error`.
|
|
- RED: `cmake --build .harness/build --config Debug --target fesa_tests` exited 0;
|
|
`ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure`
|
|
exited 8 with 1/2 failures because the wraparound constructor threw nothing.
|
|
- fix: `Matrix` computes its storage size through a checked helper before vector
|
|
construction and rejects exactly `columns != 0 && rows > SIZE_MAX / columns`.
|
|
- GREEN: the same targeted build and DenseMath CTest commands exited 0; 2/2 passed.
|
|
- VERIFY: approved MSVC x64 configure and full Debug build exited 0; targeted
|
|
DenseMath passed 2/2, discovery found 7 tests, and the full suite passed 7/7.
|
|
The public-header MKL scan had zero matches, `git diff --check` exited 0, and
|
|
`git diff --exit-code -- reference/` exited 0.
|
|
- scope: the deferred empty-dot review minor was not changed, reference artifacts
|
|
remain untouched, and phase Step 9 status/timestamps were not modified.
|
|
|
|
## Step 10 — domain-model
|
|
|
|
- task_id: `TASK-10`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/model/model_types.hpp`,
|
|
`include/fesa/model/domain.hpp`, `src/fesa/model/domain.cpp`,
|
|
`tests/unit/model/model_types_test.cpp`, `tests/unit/model/domain_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-10-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-015`, `FESA-REQ-LS3DEB-016`,
|
|
`FESA-REQ-LS3DEB-021`, `FESA-REQ-LS3DEB-030`,
|
|
`FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T10-DOM-001`, `T10-DOM-002`, `T10-DOM-003`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Both planned test translation units are registered before production and fail for the missing model API | MSVC C1083 for `fesa/model/domain.hpp` and `fesa/model/model_types.hpp`; the subsequent `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` exited 0 with `No tests were found` because the new test executable could not build |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal model records, immutable Domain ownership, and both tests compile and link | `domain.cpp`, `domain_test.cpp`, and `model_types_test.cpp` built; `fesa_solver.lib` and `fesa_unit_tests.exe` linked without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` | 0 | Source/internal identity, stable immutable ownership, and multiple-instance distinction pass | 3/3 exact `DomainModel` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved MSVC x64 build tree regenerates with explicit dependencies | Configure and generate completed; oneMKL 2026.1 and the existing dependency targets resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` | 0 | Focused Step 10 suite remains green | 3/3 `DomainModel` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all exact DomainModel names | 10 tests discovered with `linear-static-3d-euler-beam` and `unit` labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 10/10 tests passed |
|
|
| VERIFY-dependency-direction | Backend scan over `include/fesa`; upward-include scan from `include/fesa/model`; core-to-model include scan from `include/fesa/core` using `rg -n` and fail-on-match wrappers | 0 | Public headers expose no MKL/PARDISO/TBB/HDF5 API and preserve `core -> model` dependency direction | backend leaks 0; model upward dependencies 0; core-to-model dependencies 0 |
|
|
| VERIFY-diff | `git diff --check` | 0 | Patch has no whitespace errors | Exit 0; only Git LF-to-CRLF working-copy notices were emitted |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/` | 0 | Approved reference artifacts remain unchanged | Exit 0 and `git status --short -- reference/` produced no entries |
|
|
|
|
- contract_checks: every ledger record preserves `SourceLocation`; the static
|
|
step retains all four timing values; `PartDefinition`, `InstanceDefinition`,
|
|
and `SourceIndexMapping` retain source-to-internal identity; `ModelDefinition`
|
|
retains source path/content identity, heading, warnings, and all semantic
|
|
vectors. `Domain` owns the complete definition and returns const references;
|
|
declaration-order vector positions remain stable internal indices. Node and
|
|
beam definitions contain no equation-numbering state, and same-part identity
|
|
instances retain distinct source identities and connectivity.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: backend-free `EntityIndex`, semantic model records,
|
|
`ModelDefinition`, and immutable `Domain::create`/const accessors are
|
|
available to Step 11 syntax parsing and Step 12 semantic mapping.
|
|
|
|
## Step 11 — inp-syntax-parser
|
|
|
|
- task_id: `TASK-11`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/io/abaqus/input_syntax.hpp`,
|
|
`include/fesa/io/abaqus/input_reader.hpp`,
|
|
`src/fesa/io/abaqus/input_reader.cpp`,
|
|
`tests/unit/io/abaqus/input_syntax_test.cpp`,
|
|
`tests/unit/io/abaqus/input_reader_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-11-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-010`, `FESA-REQ-LS3DEB-034`,
|
|
`FESA-REQ-LS3DEB-040`
|
|
- test_ids: `T11-SYN-001`, `T11-SYN-002`, `T11-SYN-003`, `T11-SYN-004`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 1 | Both planned test files are registered before production and fail for the missing reader API | MSVC C1083 for `fesa/io/abaqus/input_reader.hpp` in both new test translation units; CTest subsequently reported `No tests were found` because the executable could not build |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal syntax records, binary reader, and four tests compile and link | `input_reader.cpp`, both parser test files, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 0 | All exact syntax parsing behaviors pass | 4/4 `InpSyntax` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved MSVC x64 build tree regenerates with explicit dependencies | Visual Studio 18 2026/MSVC environment selected; configure and generate completed; oneMKL 2026.1 resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 0 | Focused Step 11 suite remains green | 4/4 exact `InpSyntax` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact syntax tests | 14 tests discovered with all four `InpSyntax` names and feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 14/14 tests passed |
|
|
| VERIFY-dependency-direction | Backend, upward I/O, core-to-I/O, and semantic-policy scans over the Step 11 public/production files using `rg -n` fail-on-match wrappers | 0 | Public headers retain backend-free `core -> io/abaqus` direction and syntax parsing contains no Step 12 policy | backend leaks 0; upward I/O dependencies 0; core-to-I/O dependencies 0; semantic-policy matches 0; exactly four `InpSyntax` tests found |
|
|
| VERIFY-diff | `git diff --check` | 0 | Patch has no whitespace errors | Exit 0; only informational Git LF-to-CRLF working-copy notices were emitted |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain unchanged | Diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: `ParsedInput` records the absolute lexically normalized
|
|
source path and exact binary-byte FNV-1a identity formatted as
|
|
`fnv1a64:` plus 16 lowercase hexadecimal digits. Keyword and parameter names
|
|
alone become ASCII uppercase; parameter values, data label lexemes, empty
|
|
and trailing data fields, and each keyword `originalLine` preserve source
|
|
spelling. Comments and blanks remain excluded while physical 1-based file
|
|
line accounting is retained. Unreadable file, empty keyword, and orphan data
|
|
return categorized input diagnostics. No keyword allowlist, wrapper/nesting,
|
|
numeric conversion, B31/B33, or output-request decision exists in this Step.
|
|
The read-only legacy input parses as 30 keyword blocks with exact identity
|
|
`fnv1a64:04543464cc970405`, unchanged bytes, and unchanged modification time.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: backend-free `KeywordParameter`, `DataLine`, `KeywordBlock`,
|
|
`ParsedInput`, and `AbaqusInputReader::read` with syntax/source provenance are
|
|
available to Step 12 semantic mapping.
|
|
|
|
|
|
## Step 12 — inp-domain-mapping
|
|
|
|
- task_id: `TASK-12`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/io/abaqus/domain_mapper.hpp`,
|
|
`src/fesa/io/abaqus/domain_mapper.cpp`,
|
|
`tests/unit/io/abaqus/domain_mapper_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-12-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-002`,
|
|
`FESA-REQ-LS3DEB-005` through `FESA-REQ-LS3DEB-020`,
|
|
`FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-044`
|
|
- test_ids: `T12-MAP-001`, `T12-MAP-002`, `T12-MAP-003`,
|
|
`T12-MAP-004`, `T12-MAP-005`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 1 | All five planned tests were registered before production and the implementation-owned mapper API was absent | MSVC C1083 reported missing `fesa/io/abaqus/domain_mapper.hpp`; CTest then found no runnable mapper tests because the executable did not build |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | The mapper, five semantic tests, solver library, and unit executable compile and link | `domain_mapper.cpp` and `domain_mapper_test.cpp` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 0 | Exact supported inventory, deterministic expansion, no-op policy, negative portfolio, and DLOAD exclusion pass | 5/5 exact `InpDomainMapping` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved MSVC x64 build tree regenerates with explicit dependencies | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under the existing `/W4 /WX` policy |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 0 | Focused Step 12 suite remains green after review corrections | 5/5 `InpDomainMapping` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact mapper tests | 19 tests discovered with all five planned `InpDomainMapping` names and feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 19/19 tests passed |
|
|
| VERIFY-dependency-direction | Backend, upward-I/O, core-upward, distributed-load-object, unapproved-`nu`-gate, and exact-test-count scans over Step 12 files | 0 | Public dependencies and approved scope remain intact | backend leaks 0; upward dependencies 0; core upward dependencies 0; distributed-load objects 0; unapproved `nu` gates 0; mapper tests 5 |
|
|
| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 12 files have no whitespace errors | Git reported informational LF-to-CRLF notices only; new-file trailing whitespace matches 0 |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: the mapper consumes syntax-only `ParsedInput` and returns
|
|
one complete immutable `Domain` or a categorized diagnostic. It enforces the
|
|
monotonic top-level/part/assembly/step grammar, B33 only, identity instances
|
|
only, exact inclusive set generation, case-insensitive references, stable
|
|
declaration/instance-order internal IDs, and `SourceEntityId
|
|
{instance_name, source_label}`. Direct node labels, part and assembly sets,
|
|
ambiguous multi-instance labels/sets, and direct-versus-set constraint
|
|
overlap are resolved before Domain success.
|
|
- contract_checks: material and section mapping uses exact `E,nu`,
|
|
`G=E/(2*(1+nu))`, `A,I11,I12,I22,J`, exact `I12=0`,
|
|
`Iy=I11`, `Iz=I22`, and `n1 -> local y`. It requires positive
|
|
`E,G,A,I11,I22,J` without adding a `nu < 0.5` gate. Nonfinite material,
|
|
section, and guide data are model failures. Overflow-safe scaled norms apply
|
|
the exact length and guide-vector inequalities; equality fails, values above
|
|
pass, and valid finite geometry near `1e308` is accepted without a fallback
|
|
axis.
|
|
- contract_checks: model-level and step-level boundaries and sole-step CLOAD
|
|
targets are validated, conflicting expanded node/DOF prescriptions fail, the
|
|
exact four positive finite `*STATIC` fields are retained, and the sole
|
|
canonical result identity is `Step-1`, frame 0. The exact warning no-op
|
|
allowlist produces stable `ignored-input-keyword` diagnostics without
|
|
changing semantic objects. B31, transforms, nested/dependent assembly
|
|
semantics, second step, NLGEOM, unknown keywords, and `*DLOAD` fail; no
|
|
distributed-load Domain object, B31 alias, multi-step path, or transform
|
|
fallback exists.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; the legacy cantilever input maps successfully
|
|
while exact bytes and modification time remain unchanged, and
|
|
`git diff --exit-code -- reference/` exits 0
|
|
- handoff: `AbaqusDomainMapper::map(const ParsedInput&)`, complete immutable
|
|
Domain objects, stable expanded node/element/set identities, validated
|
|
material/section indices, and the sole `StaticStepDefinition` are available
|
|
to Step 13 `AnalysisModel`.
|
|
|
|
### Step 12 Review Corrections
|
|
|
|
- A duplicate-`*ELASTIC` regression test first failed because a second
|
|
consecutive elasticity record lost the owning-material state. Preserving the
|
|
immediate material eligibility produced the exact `duplicate-entity`
|
|
diagnostic and restored targeted 5/5.
|
|
- Ten monotonic-order regressions first failed at the accepted late-`*PART`
|
|
case. Explicit phase state now rejects late model data, assembly sets before
|
|
or followed by instances, element-before-node, incomplete block closure, and
|
|
pre-`*STATIC` or out-of-order history data with
|
|
`invalid-keyword-location`.
|
|
- Review edge tests then failed for valid `1e308` geometry and for nonfinite
|
|
elasticity being classified as input. Context-specific model parsing,
|
|
overflow-safe scaled geometry comparisons, active beam-section context,
|
|
exact GENERATE landing, direct/ambiguous target resolution, and exact
|
|
threshold cases were added. The corrected focused suite passes 5/5 and the
|
|
full accumulated suite passes 19/19.
|
|
- Focused re-review returned Critical 0 and Important 0. Its sole remaining
|
|
minor requested an explicit negative transverse-shear context assertion;
|
|
that table case was added and passes without a production change.
|
|
|
|
### Step 12 Root Review Fix Round 1 — same-token target ambiguity
|
|
|
|
- finding: `resolveNodeTarget` returned one matching node set before computing
|
|
the direct numeric source-label candidates. A token such as `1` therefore
|
|
silently selected `NSET=1` even when node source label `1` was also a valid
|
|
interpretation.
|
|
- regression_scope: `RejectsUnsupportedAndInvalidPortfolio` now constructs an
|
|
`NSET` named `1` containing node `2` while node label `1` also exists, and
|
|
exercises the same token independently through both `*BOUNDARY` and
|
|
`*CLOAD`. It requires input-category `unresolved-reference` with exact
|
|
keyword, entity identity `1`, and original data-row file/line location.
|
|
- RED-build: `cmake --build .harness/build --config Debug --target fesa_tests`
|
|
exited 0 after registering the two regression paths.
|
|
- RED-test: `ctest --test-dir .harness/build -C Debug -R "InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio" --output-on-failure`
|
|
exited 8. The test failed at `same-token-boundary`
|
|
because `result.hasValue()` was true instead of the required structured
|
|
failure.
|
|
- fix: target resolution computes both name-matched node sets and numeric
|
|
direct-node candidates before returning either. Multiple candidates within
|
|
an interpretation or one valid candidate from each interpretation use the
|
|
existing input/`unresolved-reference` ambiguity contract; unique set-only
|
|
and direct-only paths remain unchanged.
|
|
- GREEN: the targeted build exited 0 and `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure`
|
|
exited 0 with 5/5 passed.
|
|
- VERIFY: approved explicit-dependency MSVC x64 configure and full Debug build
|
|
exited 0; discovery found 19 tests including all five mapper names; full
|
|
CTest passed 19/19. Backend/upward/core-upward/distributed-load/unapproved
|
|
`nu` scans were 0, exactly five mapper tests remained, `git diff --check`
|
|
exited 0, and reference diff/status were clean.
|
|
- deferred_scope: the separate known-but-misplaced keyword diagnostic Minor was
|
|
deliberately not changed in this fix round. No phase-index change and no
|
|
commit were made.
|
|
|
|
## Step 13 — analysis-model
|
|
|
|
- task_id: `TASK-13`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/analysis/analysis_model.hpp`,
|
|
`src/fesa/analysis/analysis_model.cpp`,
|
|
`tests/unit/analysis/analysis_model_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-13-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-021`,
|
|
`FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T13-MODEL-001`, `T13-MODEL-002`, `T13-MODEL-003`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the AnalysisModel API was absent | MSVC C1083 reported missing `fesa/analysis/analysis_model.hpp` from `analysis_model_test.cpp` |
|
|
| RED-test | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | No focused test was runnable because the test executable could not rebuild | CTest reported `No tests were found` after the implementation-owned compile RED |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal non-owning active view and all three tests compile and link | `analysis_model.cpp`, `analysis_model_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | Active classification, address identity/immutability, and cardinality diagnostics pass | 3/3 exact `AnalysisModel` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | Focused Step 13 suite remains green | 3/3 exact `AnalysisModel` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact AnalysisModel names | 22 tests discovered with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 22/22 tests passed |
|
|
| VERIFY-dependency-direction | Backend public-header, upward-analysis dependency, DOF/numeric-state, exact-test-count, registration, and trailing-whitespace scans using fail-on-match `rg` wrappers | 0 | AnalysisModel stays backend-free and below later solver layers, with no DOF/state ownership | backend leaks 0; upward dependencies 0; DOF/numeric-state leaks 0; tests 3; CMake registrations 1/1; new-file trailing whitespace 0 |
|
|
| VERIFY-diff | `git diff --check` | 0 | Tracked patch has no whitespace errors | Exit 0; only informational Git LF-to-CRLF working-copy notices were emitted |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: `AnalysisModel` stores one non-owning `const Domain*` plus
|
|
stable `EntityIndex` vectors only. All Domain elements are active in stable
|
|
internal order; reachable material and section IDs are deduplicated by an
|
|
ascending internal-index scan; boundary/load IDs are the sole step's vector
|
|
positions. `domain()` and `step()` preserve exact address identity, and the
|
|
tests verify semantic storage addresses and values remain unchanged. Missing
|
|
and multiple steps return categorized `invalid-model-cardinality` and
|
|
`unsupported-multiple-step` diagnostics. No equation numbering, constraint
|
|
propagation, multi-step activation, or numeric analysis state was added.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: the exact AnalysisModel ledger API, sole-step reference, and stable
|
|
active element/material/section/boundary/load IDs are available to Step 14
|
|
`DofManager` without copying or mutating Domain entities.
|
|
|
|
## Step 14 — dof-manager
|
|
|
|
- task_id: `TASK-14`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/fem/dof_manager.hpp`,
|
|
`src/fesa/fem/dof_manager.cpp`, `tests/unit/fem/dof_manager_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-14-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-007`,
|
|
`FESA-REQ-LS3DEB-011`, `FESA-REQ-LS3DEB-022`,
|
|
`FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T14-DOF-001`, `T14-DOF-002`, `T14-DOF-003`,
|
|
`T14-DOF-004`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly four planned tests are registered before production and fail for the missing DofManager API | MSVC C1083 reported missing `fesa/fem/dof_manager.hpp` from `dof_manager_test.cpp` after successful CMake regeneration |
|
|
| RED-test | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | No focused test is runnable because the test executable cannot rebuild | CTest reported `No tests were found` after the implementation-owned compile RED |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal DofManager, its four tests, solver library, and unit executable compile and link | `dof_manager.cpp`, `dof_manager_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | Numbering, constraints, scatter/pattern, and mapping-owned round-trip pass | 4/4 exact `DofManager` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | Focused Step 14 suite remains green | 4/4 exact `DofManager` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact DofManager names | 26 tests discovered, including 4 `DofManager` tests, with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 26/26 tests passed |
|
|
| VERIFY-contract-scans | Backend public-header, upward-FEM dependency, model/analysis equation-state, out-of-scope feature, unledgered API, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | DofManager remains the sole equation/scatter/pattern owner and implements only the exact public ledger | backend leaks 0; upward dependencies 0; model/analysis equation state 0; penalty/MPC/RBE/numeric sparse storage 0; unledgered APIs 0; tests 4; registrations 1/1 |
|
|
| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 14 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: full DOFs follow stable node index and exact component order
|
|
`[UX,UY,UZ,URX,URY,URZ]`; free equations and constrained DOFs are ascending
|
|
full-index mappings. Case-insensitive node-set and direct source-label targets
|
|
expand deterministically; equal overlap is retained once, while different
|
|
values return `conflicting-boundary-condition` at the conflicting row's
|
|
source location. `prescribedValues()` has the same size/order as
|
|
`constrainedDofs()` and preserves zero and nonzero values.
|
|
- contract_checks: each active B33 definition has one 12-entry scatter in
|
|
endpoint/component order. The full-space CSR pattern has 19 row offsets and
|
|
252 sorted-unique structural columns for the two-element chain fixture.
|
|
Stable free/constrained maps reconstruct the full vector without adding an
|
|
API absent from the exact ledger. Node and element records remain unchanged
|
|
and contain no equation IDs; no penalty, MPC, RBE, or sparse numeric storage
|
|
was added.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`,
|
|
`.harness/build/step14-ctest-discovery.json`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: backend-free `DofComponent`, `SparsePattern`, and the exact
|
|
`DofManager` ledger API provide deterministic full/free/constrained maps,
|
|
prescribed `dc`, active-element scatter, and full structural CSR pattern to
|
|
Step 15 and later assembly/constraint tasks.
|
|
|
|
## Step 15 — analysis-state
|
|
|
|
- task_id: `TASK-15`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/results/result_records.hpp`,
|
|
`include/fesa/analysis/analysis_state.hpp`,
|
|
`src/fesa/analysis/analysis_state.cpp`,
|
|
`tests/unit/results/result_records_test.cpp`,
|
|
`tests/unit/analysis/analysis_state_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-15-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-023`,
|
|
`FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T15-STATE-001`, `T15-STATE-002`, `T15-STATE-003`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the result-record/state API was absent | MSVC C1083 reported missing `fesa/analysis/analysis_state.hpp` from both new test translation units after successful CMake regeneration |
|
|
| RED-test | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | No focused test was runnable because the unit test executable could not rebuild | CTest reported `No tests were found` after the implementation-owned compile RED |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal records/state implementation and all three tests compile and link | `analysis_state.cpp`, both test files, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | Allocation, identity/order, and copy/move ownership tests pass | 3/3 exact `AnalysisState` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | Focused Step 15 suite remains green | 3/3 exact `AnalysisState` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact AnalysisState names | 29 tests discovered with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 29/29 tests passed |
|
|
| VERIFY-contract-scans | Backend public-header, forbidden V0 state/API, Domain/AnalysisModel ownership, result-record upward dependency, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | State and row records implement only the exact backend-free V0 ledger | backend leaks 0; forbidden state/API 0; Domain/AnalysisModel ownership 0; result upward dependencies 0; tests 3; registrations 1/1/1 |
|
|
| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the five new files | 0 | Tracked and untracked Step 15 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: displacement, external force, internal force, residual, and
|
|
reaction are five independently owned `Vector` values sized to
|
|
`DofManager::fullDofCount()` and zero-initialized. Reaction remains in full
|
|
DOF index space even when only a subset is constrained, leaving free
|
|
components available for residual sanity checks. Mutable and const accessors
|
|
return the same owned vector storage.
|
|
- contract_checks: `StepFrameIdentity`, `EndpointResultRow`, `GaussResultRow`,
|
|
and `StressS11Row` match the public ledger field order. Owned endpoint,
|
|
Gauss, and stress vectors preserve append order and expose stable mutable and
|
|
const collections. Default copy/move operations follow the ledger: copies
|
|
deep-own vector/row storage, and moved-to state retains identity and values
|
|
without aliasing another live state.
|
|
- contract_checks: no velocity, acceleration, temperature, iteration history,
|
|
nonlinear element state, Domain copy/reference, equation numbering, HDF5,
|
|
MKL, or oneTBB API/storage was added.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: the exact backend-free result records and `AnalysisState` ledger API
|
|
provide full-space mutable solution vectors, step/frame identity, and stable
|
|
recovery-row collections to Step 16 and later result recovery/output tasks.
|
|
|
|
## Step 16 — euler-beam-element
|
|
|
|
- task_id: `TASK-16`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/elements/euler_beam_3d.hpp`,
|
|
`src/fesa/elements/euler_beam_3d.cpp`,
|
|
`tests/unit/elements/euler_beam_3d_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-16-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-002`, `FESA-REQ-LS3DEB-004`,
|
|
`FESA-REQ-LS3DEB-008`, `FESA-REQ-LS3DEB-012`,
|
|
`FESA-REQ-LS3DEB-013`, `FESA-REQ-LS3DEB-014`,
|
|
`FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-032`,
|
|
`FESA-REQ-LS3DEB-035`, `FESA-REQ-LS3DEB-044`
|
|
- test_ids: `T16-BEAM-001`, `T16-BEAM-002`, `T16-BEAM-003`,
|
|
`T16-BEAM-004`, `T16-BEAM-005`, `T16-BEAM-006`, `T16-BEAM-007`,
|
|
`T16-BEAM-008`, `T16-BEAM-009`, `T16-BEAM-010`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly ten planned tests were registered before production and the EulerBeam3D public API was absent | MSVC C1083 reported missing `fesa/elements/euler_beam_3d.hpp` from `euler_beam_3d_test.cpp` after successful CMake regeneration |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | The minimum beam kernel, ten tests, solver library, and unit executable compile and link | `euler_beam_3d.cpp`, `euler_beam_3d_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | Reviewed signs, Gauss integration, rank, transform, loads, analytical modes, validation, recovery, patches, and negative control pass | 10/10 exact `EulerBeam3D` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | Focused Step 16 suite remains green | 10/10 exact `EulerBeam3D` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all ten exact EulerBeam3D names | 39 tests discovered, including 10 `EulerBeam3D` tests, with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 39/39 tests passed |
|
|
| VERIFY-contract-scans | Backend public-header, upward-dependency, out-of-scope formulation, production one-point path, two-point Gauss/invariant, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | The kernel implements only the approved exact ledger and numerical integration contract | backend leaks 0; upward dependencies 0; out-of-scope couplings 0; production one-point paths 0; two-point Gauss consumers 3; normalized closed-form invariant `1e-12`; tests 10; registrations 1/1 |
|
|
| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 16 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- green_triage: the first implementation build passed and the first focused
|
|
run was 9/10. The single failure was isolated to a large-coordinate test
|
|
fixture whose requested equality rounded to a represented length above the
|
|
threshold. The test fixture was replaced by an exactly representable unit
|
|
threshold equality plus below/above large-coordinate cases; the production
|
|
strict `>` comparison and formulation were unchanged before the 10/10 run.
|
|
- contract_checks: local DOF order is exactly
|
|
`[u1,v1,w1,rx1,ry1,rz1,u2,v2,w2,rx2,ry2,rz2]`. Rotation rows are
|
|
`(ex,ey,ez)`, `dl=T*dg`, and `Kg=T^T*Kl*T`. The B-matrix follows the reviewed
|
|
`theta_y=-w'`, `theta_z=v'` signs; two-point Gauss `B^T D B` is the sole
|
|
production stiffness path and is checked against the independent closed
|
|
matrix with normalized tolerance `1e-12`. The test-only one-point rule has
|
|
rank four while the production rule has rank six and six rigid modes.
|
|
- contract_checks: length and guide-vector tests use the exact scale-aware
|
|
strict thresholds with no fallback axis. `E`, derived `G`, `A`, `Iy`, `Iz`,
|
|
and `J` must be finite and positive and `I12` must be exactly zero. Constant
|
|
local `px,py,pz,mx` receives the consistent signed load only; no parser,
|
|
`*DLOAD`, B31, Timoshenko, shear correction, or transverse/torsional stress
|
|
support was added.
|
|
- contract_checks: recovery keeps local outward equilibrium end actions,
|
|
endpoint section resultants, and two-Gauss generalized strain/resultants
|
|
distinct. Axial stress is
|
|
`S11=E(epsilon0+x2*kappa_y-x1*kappa_z)` in input section-point order; absent
|
|
input points produce section point 0 at the centroid with source
|
|
`fesa-default`.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: the exact backend-free `EulerBeam3D` ledger API supplies global and
|
|
local stiffness, constant local equivalent load, and distinct recovery data
|
|
to Step 18 sparse assembly and Step 22 result recovery without owning element
|
|
identity, equation numbering, parser coupling, or result persistence.
|
|
|
|
### Root numerical review — Fix Round 1
|
|
|
|
- scope: all three `Important` findings addressed in
|
|
`src/fesa/elements/euler_beam_3d.cpp` and the existing exact T16 tests; the
|
|
two `Minor` findings were intentionally not changed in this round.
|
|
- defect_RED: after adding finite-positive derived-overflow,
|
|
derived-underflow, and length-scaled-underflow fixtures to existing
|
|
`T16-BEAM-007`,
|
|
`ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure`
|
|
exited 8. All three invalid fixtures were accepted; the diagnostic path
|
|
observed respectively a nonfinite stiffness with maximum `inf`, an all-zero
|
|
stiffness, and a stiffness with a required bending coefficient underflowed
|
|
to zero.
|
|
- defect_GREEN: `cmake --build .harness/build --config Debug --target fesa_tests`
|
|
exited 0 and the same focused CTest exited 0 with 1/1 passed. `create()` now
|
|
requires derived `EA`, `GJ`, `EIy`, `EIz` and all ten distinct positive
|
|
length-scaled axial/torsion/bending block magnitudes to be finite and
|
|
strictly positive. This rejects arithmetic overflow/underflow as
|
|
`invalid-beam-property` without a conditioning threshold.
|
|
- invariant_hardening: production `normalizedMatrixError` now returns infinite
|
|
error for any nonfinite operand, difference, scale, or quotient, so the
|
|
two-point/closed-form `1e-12` invariant fails closed.
|
|
- analytical_hardening: every nonzero reference in existing `T16-BEAM-006`
|
|
now checks `abs(actual-reference)/abs(reference) <= 1e-9`; only the explicitly
|
|
zero free-end resultants retain an absolute check. This evidence-only change
|
|
was expected to remain GREEN and its focused test passed without a production
|
|
correction.
|
|
- convergence_hardening: existing `T16-BEAM-005` directly assembles aligned
|
|
1/2/4-element `[v,rz]` cantilever systems from public `localStiffness()` and
|
|
`localEquivalentLoad()` only. It checks each exact signed constant transverse
|
|
element load, solves a test-only dense reduced system, and uses independent
|
|
five-point integration of interior cubic-Hermite displacement error against
|
|
the quartic uniform-load solution. Both refinements are monotone and each
|
|
observed order is 4 within `1e-8`. No `DLOAD`, parser, Domain, or production
|
|
assembly support was introduced. This evidence-only change was expected to
|
|
remain GREEN and the T16-005/T16-006 focused run passed 2/2.
|
|
|
|
| stage | exact command | exit_code | observed_result |
|
|
| --- | --- | ---: | --- |
|
|
| FIX1-RED | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 8 | 0/1 passed; unexpected acceptance exposed nonfinite and zero stiffness outcomes |
|
|
| FIX1-GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | corrected source and unchanged ten test names compiled under `/W4 /WX` without a warning |
|
|
| FIX1-GREEN-defect | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 0 | 1/1 passed |
|
|
| FIX1-GREEN-evidence | `ctest --test-dir .harness/build -C Debug -R 'EulerBeam3D.(ConstantLineLoadMatchesAllSignedComponents|AnalyticalAxialTorsionAndTwoPlaneBendingRecover)' --output-on-failure` | 0 | 2/2 analytical/convergence hardening tests passed without another production change |
|
|
| FIX1-VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | exact MSVC x64 Debug tree configured and generated |
|
|
| FIX1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | full Debug build completed without a new warning |
|
|
| FIX1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | exact 10/10 passed |
|
|
| FIX1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 39 total tests discovered, including the same ten EulerBeam3D names |
|
|
| FIX1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 39/39 passed |
|
|
| FIX1-VERIFY-scans | fail-on-match numerical invariant, dependency, scope, exact-test-count, reference, phase-index, and diff/whitespace scans | 0 | derived rigidity/coefficient and fail-closed checks present; tests 10; leaks 0; reference and phase index unchanged; diff clean |
|
|
|
|
## Step 17 — parallel-for-tbb
|
|
|
|
- task_id: `TASK-17`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/assembly/parallel_for.hpp`,
|
|
`src/fesa/assembly/parallel_for.cpp`,
|
|
`tests/unit/assembly/parallel_for_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`,
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-17-report.md`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-024`, `FESA-REQ-LS3DEB-025`,
|
|
`FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T17-PFOR-001`, `T17-PFOR-002`, `T17-PFOR-003`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the ParallelFor public API was absent | MSVC C1083 reported missing `fesa/assembly/parallel_for.hpp` from `parallel_for_test.cpp` after successful CMake regeneration |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal serial/oneTBB adapters, three tests, solver library, and unit executable compile and link | `parallel_for.cpp`, `parallel_for_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX`; oneTBB runtime staged for discovery |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | Zero/one/many exact-once, stable indexed output, and exception propagation pass | 3/3 exact `ParallelFor` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | Focused Step 17 suite remains green | 3/3 exact `ParallelFor` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact ParallelFor names | 42 tests discovered, including 3 `ParallelFor` tests, with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 42/42 tests passed |
|
|
| VERIFY-contract-scans | Public oneTBB leak, private include, forbidden scheduler/assembly scope, exact-test-count, and CMake-registration scans using fail-on-match/count `rg` wrappers | 0 | The backend-free adapter implements only independent indexed work and retains the default caller-scoped scheduler policy | public TBB leaks 0; forbidden global/sparse/reduction policy 0; private TBB includes 1; tests 3; registrations 1/1/1 |
|
|
| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 17 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: `ParallelFor`, `SerialParallelFor`, and `TbbParallelFor`
|
|
expose only `std::size_t` and `std::function` in the public header. oneTBB
|
|
headers/types remain private to `parallel_for.cpp`, and the normalized
|
|
`Fesa::TBB` dependency is private to `fesa_solver`.
|
|
- contract_checks: both implementations execute `[0,count)` exactly once and
|
|
make `count==0` a no-op. Deterministic result ordering is caller-owned:
|
|
bodies write only their index-addressed slot, and this adapter performs no
|
|
global sparse write, COO/CSR reduction, mutex, or atomic accumulation.
|
|
- contract_checks: serial and oneTBB execution preserve the original body
|
|
exception type and message. oneTBB cancellation may allow already-running
|
|
indexed work to finish; callers receive the rethrown exception and must not
|
|
infer a deterministic partial-completion count.
|
|
- contract_checks: the adapter uses oneTBB's default caller-scoped scheduler;
|
|
it creates no process-wide thread setting, `global_control`, or task arena,
|
|
and does not override later MKL/TBB oversubscription coordination.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 18 can inject either backend for independent element-local
|
|
computation into caller-owned stable element-order slots before its separate
|
|
deterministic COO-to-CSR reduction.
|
|
|
|
### Step 17 Review Fix Round 1 — atomic test evidence
|
|
|
|
- classification: test-evidence reliability hardening; no production defect
|
|
was observed or corrected.
|
|
- baseline_GREEN: before changing the test,
|
|
`ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure`
|
|
exited 0 with the existing production adapter passing 3/3. Because the
|
|
review changes only how a test observes duplicate callbacks, no
|
|
implementation-owned RED was expected or manufactured.
|
|
- reliability_issue: the prior `std::vector` scalar writes were race-free only
|
|
if the exact-once contract was already true. A duplicate concurrent callback
|
|
for one index could write the same non-atomic scalar concurrently, making the
|
|
negative case undefined instead of a deterministic test failure.
|
|
- correction: T17-PFOR-001 now uses an explicitly initialized atomic zero-count
|
|
counter and explicitly initialized per-index atomic visit counters.
|
|
T17-PFOR-002 uses explicitly initialized atomic serial/TBB output slots plus
|
|
per-index atomic visit counters. All callback increments use
|
|
`fetch_add(1, memory_order_relaxed)` and post-execution assertions require
|
|
every count to equal one, so duplicate same-index callbacks are observed
|
|
without a data race. Output stores/loads are relaxed atomics because only
|
|
per-slot observation is required after the blocking adapter returns.
|
|
- scope: only `tests/unit/assembly/parallel_for_test.cpp`, this cumulative
|
|
Step 17 section, and the ignored `task-17-report.md` changed. Production,
|
|
CMake, the phase index, upstream contracts, and reference artifacts were not
|
|
modified in this review round; the exact three test names remain unchanged.
|
|
|
|
| stage | exact command | exit_code | observed_result |
|
|
| --- | --- | ---: | --- |
|
|
| REVIEW1-baseline-GREEN | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | existing correct production passed 3/3 before test hardening; no implementation RED expected |
|
|
| REVIEW1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | C++17 atomic test evidence compiled and linked under MSVC `/W4 /WX` without a warning |
|
|
| REVIEW1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | hardened exact three ParallelFor tests passed 3/3 |
|
|
| REVIEW1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 42 tests discovered, including the unchanged three exact ParallelFor names |
|
|
| REVIEW1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | full accumulated suite passed 42/42 |
|
|
| REVIEW1-VERIFY-scans | public TBB leak, production scope, atomic reliability, reference, and diff/whitespace scans | 0 | public leaks 0; forbidden production scope 0; atomic vectors 5; relaxed duplicate counters 4; legacy non-atomic visit/output paths 0; reference unchanged; diff clean |
|
|
|
|
## Step 18 — sparse-assembly
|
|
|
|
- task_id: `TASK-18`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/math/sparse_matrix.hpp`,
|
|
`src/fesa/math/sparse_matrix.cpp`,
|
|
`include/fesa/assembly/sparse_assembler.hpp`,
|
|
`src/fesa/assembly/sparse_assembler.cpp`,
|
|
`tests/unit/math/sparse_matrix_test.cpp`,
|
|
`tests/unit/assembly/sparse_assembler_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-024`, `FESA-REQ-LS3DEB-025`,
|
|
`FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035`
|
|
- test_ids: `T18-SPARSE-001`, `T18-SPARSE-002`, `T18-SPARSE-003`,
|
|
`T18-SPARSE-004`, `T18-SPARSE-005`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly five planned tests were registered before production and both sparse public APIs were absent | CMake regenerated, then MSVC C1083 reported missing `fesa/assembly/sparse_assembler.hpp` and `fesa/math/sparse_matrix.hpp` from the two new test files |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum CSR owner, deterministic assembler, five tests, solver library, and unit executable compile and link | `sparse_assembler.cpp`, `sparse_matrix.cpp`, both tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | CSR validation/reduction/zero policy and serial/TBB deterministic beam assembly pass | 5/5 exact `SparseAssembly` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | Focused Step 18 suite remains green | 5/5 exact `SparseAssembly` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact SparseAssembly names | 47 tests discovered, including 5 `SparseAssembly` tests, with feature/unit labels |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 47/47 tests passed |
|
|
| VERIFY-contract-scans | Public backend/upward-dependency/PARDISO, assembler shared-CSR-member, dense inheritance, exact-test-count, and CMake registration scans using fail-on-match/count `rg` wrappers | 0 | Sparse storage and reduction remain behind the exact approved boundaries | public backend leaks 0; math-header upward dependencies 0; PARDISO matches 0; assembler CSR-member writes 0; dense inheritance 0; tests 5; registrations 2/2 |
|
|
| VERIFY-determinism | Exact bytes, reversed completion, serial/TBB, repeated TBB, tuple-cancellation, structural-zero, empty-row, multiply, validation, and symmetry assertions in the targeted suite | 0 | NR-O02 fixed-order reduction and NR-T11 scheduler independence are observable | one serial, one TBB, one reverse-order, and eight repeated TBB assemblies produced byte-identical row/column/value vectors; duplicate cancellation produced the tuple-ordered literal `1.0` |
|
|
| VERIFY-diff | `git diff --check 59da6c6` | 0 | The combined base-to-current-worktree Step 18 tracked range has no whitespace errors | Exact tracked scope is 10 files; generated discovery JSON and ignored scratch report are absent from the range |
|
|
| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty |
|
|
|
|
- contract_checks: `SparseMatrix` is a separate owning CSR type with 0-based
|
|
row offsets and sorted-unique columns. It validates row-offset shape/range,
|
|
column range/order/uniqueness, COO dimensions, expected-pattern membership,
|
|
finite inputs, finite ordered sums, and multiply dimensions. Empty rows and
|
|
rectangular/zero structural layouts remain valid; every expected slot is
|
|
emitted even when its exact stored value is zero.
|
|
- contract_checks: COO contributions are stable-sorted by exactly
|
|
`(row,column,elementOrder,localOrder)` and duplicates are accumulated in
|
|
that sequence. The cancellation fixture distinguishes tuple order from
|
|
incoming vector order, and input permutation retains the same result.
|
|
- contract_checks: `SparseAssembler` validates model/DOF dimensions,
|
|
element references, and scatter ownership before work. It invokes the
|
|
injected `ParallelFor` once over stable active-element order; each worker
|
|
writes only its caller-indexed 144-entry row-major local buffer and failure
|
|
slot. CSR allocation and reduction occur only after the parallel call.
|
|
- contract_checks: the public headers expose no oneTBB, MKL, HDF5, or PARDISO
|
|
type. `SparseMatrix` neither includes nor inherits dense `Matrix`; the math
|
|
header forward-declares DofManager-owned `SparsePattern` to avoid a public
|
|
upward include.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 19 can consume canonical full CSR arrays and deterministic
|
|
matrix-vector multiplication without depending on dense storage, oneTBB,
|
|
or a solver backend. Step 20 remains solely responsible for PARDISO
|
|
descriptors, indexing conversion, factorization, and substitution.
|
|
- concerns: none; no implementation, environment, backend, or upstream
|
|
contract conflict was found.
|
|
|
|
### Step 18 Review Fix Round 1 — evidence artifact scope
|
|
|
|
- classification: evidence/artifact-integrity correction only. Production,
|
|
public headers, tests, CMake, upstream contracts, and phase-index content
|
|
were not changed by this review fix.
|
|
- reproduced_finding: before correction,
|
|
`git diff --check 59da6c6..HEAD` exited 2 with
|
|
191 findings (382 output lines), all for trailing whitespace in tracked file
|
|
`.harness/step18-discovery.json`. The cumulative `changed_files` list omitted
|
|
that tracked file while listing ignored scratch file
|
|
`.superpowers/sdd/linear-static-3d-euler-beam/task-18-report.md` as though it
|
|
were tracked.
|
|
- correction: deleted the generated discovery JSON with `apply_patch` and
|
|
reconciled `changed_files` to the exact 10-file combined tracked scope. The
|
|
ignored scratch report remains supplementary evidence and is not listed as
|
|
a tracked Step 18 file.
|
|
- phase_index_guard: `git hash-object
|
|
phases/linear-static-3d-euler-beam/index.json` was
|
|
`6808d3a8101f656e978b7e00df6cf1a4ad5f1711` before and after correction.
|
|
|
|
| stage | exact command | exit_code | observed_result |
|
|
| --- | --- | ---: | --- |
|
|
| REVIEW1-reproduce | `git diff --check 59da6c6..HEAD` | 2 | 191 findings (382 output lines), all for trailing whitespace, were isolated to the accidental tracked discovery JSON |
|
|
| REVIEW1-scope | `git diff --name-status 59da6c6` | 0 | Combined base-to-worktree scope contains exactly 10 tracked Step 18 files; discovery JSON and ignored scratch report are absent |
|
|
| REVIEW1-diff | `git diff --check 59da6c6` | 0 | Combined committed plus worktree Step 18 range is whitespace-clean after artifact deletion |
|
|
| REVIEW1-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Exact MSVC x64 dependency-resolved configuration completed |
|
|
| REVIEW1-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build completed under `/W4 /WX` without a new warning |
|
|
| REVIEW1-targeted | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | Exact SparseAssembly suite passed 5/5 |
|
|
| REVIEW1-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated suite passed 47/47 |
|
|
| REVIEW1-reference | `git diff --exit-code 59da6c6 -- reference/`; `git status --short -- reference/` | 0 | Approved reference artifacts remain unchanged and reference status is empty |
|
|
|
|
## Step 19 — essential-constraints
|
|
|
|
- task_id: `TASK-19`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/constraints/essential_constraints.hpp`,
|
|
`src/fesa/constraints/essential_constraints.cpp`,
|
|
`tests/unit/constraints/essential_constraints_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-007`, `FESA-REQ-LS3DEB-022`,
|
|
`FESA-REQ-LS3DEB-027`, `FESA-REQ-LS3DEB-034`,
|
|
`FESA-REQ-LS3DEB-035`
|
|
- test_ids: `T19-CONSTRAINT-001`, `T19-CONSTRAINT-002`,
|
|
`T19-CONSTRAINT-003`, `T19-CONSTRAINT-004`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly four planned tests were registered before production and the public constraint API was absent | MSVC C1083 reported missing `fesa/constraints/essential_constraints.hpp` from `essential_constraints_test.cpp` |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum partition/mapping implementation and all four tests compiled and linked | `essential_constraints.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure` | 0 | Hand-computed blocks, no/all/mixed constraints, nonzero reconstruction, and invalid dimensions passed | 4/4 exact `EssentialConstraints` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure/generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure` | 0 | Focused Step 19 suite remains green | 4/4 exact `EssentialConstraints` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact names | 51 tests discovered, including 4 `EssentialConstraints` tests |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 51/51 tests passed |
|
|
| VERIFY-contract-scans | Public backend and forbidden load/RHS/penalty/MPC scans, exact-test-count scan, `git diff --check`, and reference status/diff checks | 0 | Essential partition remains isolated behind backend-free public types | backend leaks 0; forbidden scope 0; exact tests 4; whitespace clean; reference unchanged |
|
|
|
|
- contract_checks: `partition` validates the input CSR, exact square/full-DOF
|
|
dimensions, stable increasing free/constrained order, disjoint complete
|
|
coverage, free-equation correspondence, and prescribed-vector size before
|
|
extracting any block.
|
|
- contract_checks: each full CSR slot maps at most once into
|
|
`Kff/Kfc/Kcf/Kcc`. Filtering the stable full rows and sorted columns retains
|
|
numeric values, local row/column order, and exact structural zeros; every
|
|
returned block revalidates through the canonical 0-based CSR constructor.
|
|
- contract_checks: no/all/mixed constraint cases include valid zero-sized
|
|
rectangular blocks. `gatherFree`, `gatherConstrained`, and
|
|
`reconstructFull` reject vector-size mismatch and preserve caller-supplied
|
|
constrained values exactly, including nonzero prescribed displacement.
|
|
- contract_checks: the module does not assemble loads, form an effective RHS,
|
|
implement penalty/MPC behavior, or expose MKL/oneTBB/HDF5/PARDISO types.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 20 may factorize the validated `kff`; Step 21 may use `kfc`
|
|
with `DofManager::prescribedValues()` to form the nonzero prescribed
|
|
effective RHS without changing this module's mapping responsibility.
|
|
- concerns: none; no critical implementation or upstream contract conflict
|
|
was found.
|
|
|
|
## Step 20 — mkl-pardiso-solver
|
|
|
|
- task_id: `TASK-20`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/solvers/linear/linear_solver.hpp`,
|
|
`include/fesa/solvers/linear/mkl_pardiso_solver.hpp`,
|
|
`src/fesa/solvers/linear/mkl_pardiso_solver.cpp`,
|
|
`tests/unit/solvers/linear/linear_solver_test.cpp`,
|
|
`tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-025`, `FESA-REQ-LS3DEB-026`,
|
|
`FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035`
|
|
- test_ids: `T20-PARDISO-001`, `T20-PARDISO-002`,
|
|
`T20-PARDISO-003`, `T20-PARDISO-004`, `T20-PARDISO-005`,
|
|
`T20-PARDISO-006`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly six planned tests were registered before production and both solver public APIs were absent | CMake regenerated with all dependencies resolved; MSVC C1083 reported missing `fesa/solvers/linear/linear_solver.hpp` and `fesa/solvers/linear/mkl_pardiso_solver.hpp` from the two new test files |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum backend boundary, private PARDISO state, six tests, solver library, and unit executable compile and link | `mkl_pardiso_solver.cpp`, both tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure` | 0 | SPD solution, repeated RHS, refactorization, validation/failures, and conditioning behavior pass | 6/6 exact `MklPardisoSolver` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure` | 0 | Focused Step 20 suite remains green | 6/6 exact `MklPardisoSolver` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all six exact names | 57 tests discovered, including 6 `MklPardisoSolver` tests |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 57/57 tests passed |
|
|
| VERIFY-contract-scans | Fail-on-match public-header scan for `mkl.h`, `MKL_INT`, `pardiso`, oneTBB, and HDF5 symbols; exact-test-count, `git diff --check`, and reference diff/status checks | 0 | The solver backend remains private and Step scope/artifact invariants hold | public PARDISO leaks 0; solver-header backend leaks 0; exact tests 6; whitespace clean; reference unchanged |
|
|
|
|
- contract_checks: `LinearSolver` exposes only the exact separate
|
|
`factorize(SparseMatrix)` and const `solve(rhs,solution)` boundary.
|
|
`MklPardisoSolver` exposes only its constructor, virtual destructor,
|
|
overrides, and `unique_ptr<Impl>`; every MKL header/type/handle is confined
|
|
to the `.cpp` and private `Impl`.
|
|
- contract_checks: factorization first validates the full square, nonempty,
|
|
finite, sorted-unique public CSR, full symmetric structure/value tolerance,
|
|
every diagonal slot, and all `size_t` to `MKL_INT` conversions. It then
|
|
copies only the sorted upper triangle while retaining exact structural-zero
|
|
diagonals.
|
|
- contract_checks: the private adapter uses real SPD `mtype=2`, explicit
|
|
phases `11`, `22`, `33`, and `-1`, `iparm[26]=1` matrix checking, and
|
|
`iparm[34]=1` zero-based indexing. A successful factorization is retained
|
|
for repeated RHS; refactorization and destruction release the previous
|
|
PARDISO state through the same RAII path. No regularization or fallback is
|
|
present.
|
|
- contract_checks: solve-before-factorize, RHS/solution dimension mismatch,
|
|
nonfinite RHS/solution, nonsquare/empty/asymmetric/missing-diagonal input,
|
|
singular or indefinite SPD failure, checker/integer/backend errors, and
|
|
phase-specific `-4`/`-7` failures return one deterministic
|
|
`FailureCategory::solver` diagnostic. The known SPD system meets normalized
|
|
residual `1e-10` and relative analytical error `1e-9`; common-scale and
|
|
stiffness-ratio sweeps either meet both limits or return the structured
|
|
solver failure without adding a conditioning threshold.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 21 can form the effective free RHS after this adapter has
|
|
factorized `Kff`, then call `solve` repeatedly without refactorization or
|
|
depending on MKL types.
|
|
- concerns: none; no critical implementation, environment, backend, or
|
|
upstream-contract conflict was found.
|
|
|
|
### Step 20 Review Fix Round 1 — fully constrained lifecycle and normalized validation
|
|
|
|
- review_classification: Important integration/correctness fixes. Step 19
|
|
intentionally produces a valid `0x0 Kff` for an all-constrained model, so
|
|
rejecting that matrix contradicted the accumulated solver workflow.
|
|
- test_scope: the existing six `MklPardisoSolver` test names were retained.
|
|
The invalid-state test now covers trivial factorize/solve followed by a
|
|
nonempty refactor, unchanged caller output on failed solves, and a
|
|
small-scale asymmetric matrix. Numerical helpers now divide by the actual
|
|
nonzero RHS/expected norm and fail closed for zero or nonfinite norms.
|
|
|
|
| stage | exact command | exit_code | observed_result |
|
|
| --- | --- | ---: | --- |
|
|
| RED-zero-equation | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and `RejectsInvalidCsrStateAndDimensions` failed because valid `0x0 Kff` factorization returned failure |
|
|
| TEST-hardening | same targeted command after replacing unit-floor norm helpers | 1 | The same zero-equation production defect remained the only failure; no artificial RED was claimed for already-correct numerical results |
|
|
| GREEN-zero-equation | same targeted command after the minimum production change | 0 | 6/6 passed; empty factorize/solve avoids PARDISO and a following nonempty refactor solves correctly |
|
|
| RED-scaled-symmetry | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and the existing invalid-state test showed that a scaled asymmetric matrix was incorrectly accepted |
|
|
| GREEN-scaled-symmetry | same targeted command after the minimum production change | 0 | 6/6 passed with symmetry normalized by the matrix's actual maximum absolute entry and no unit-size floor |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Explicit MSVC x64 dependencies configured and generated successfully |
|
|
| VERIFY-build/targeted | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 0 | Debug build completed without a new warning; exact Step 20 suite passed 6/6 |
|
|
| VERIFY-discovery/full | `ctest --test-dir .harness/build -C Debug --show-only=json-v1; ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 57 tests discovered and 57/57 passed |
|
|
| VERIFY-contract | backend API leak scan, exact-test count, forbidden fallback/regularization scan, `git diff --check`, and reference diff/status | 0 | backend API leaks 0; exact tests 6; forbidden implementation matches 0; whitespace clean; `reference/` unchanged |
|
|
|
|
- production_fix: a successful zero-equation factorization is represented as
|
|
trivial private state without allocating or calling PARDISO; empty solve
|
|
succeeds only after that observable factorization. The ordinary `release()`
|
|
path safely clears this state before later refactorization or destruction.
|
|
- production_fix: symmetry requires every reverse structural pair and compares
|
|
`abs(aij-aji)` to `1e-12 * max(abs(A))`. An exactly zero matrix uses an exact
|
|
zero difference check; SparseMatrix validation remains responsible for
|
|
rejecting nonfinite values.
|
|
- failure_atomicity: solve-before-factorize, dimension mismatch, and nonfinite
|
|
RHS failures are asserted to leave the caller's solution values unchanged;
|
|
successful backend output is still copied from a private candidate only
|
|
after phase 33 and finite-result validation.
|
|
- evidence_hygiene: two intermediate symmetry RED attempts were discarded
|
|
because a concurrent clean build locked MSBuild files. The uncontended RED
|
|
above reproduced the production defect deterministically and is the recorded
|
|
evidence.
|
|
- phase_index: intentionally unchanged during this review fix; hash
|
|
`2cfb6ee5e0c49fbf6b06d27cb33ec9ac2c34dbc4`.
|
|
- supersession: this review section supersedes the original Step 20 statements
|
|
that the factorized CSR must be nonempty or that empty input is rejected.
|
|
- concerns: none; the transient build contention was resolved before recorded
|
|
RED/GREEN/VERIFY runs and no critical or upstream blocker remains.
|
|
|
|
## Step 21 — load-assembly
|
|
|
|
- task_id: `TASK-21`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/assembly/load_assembler.hpp`,
|
|
`src/fesa/assembly/load_assembler.cpp`,
|
|
`tests/unit/assembly/load_assembler_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-007`, `FESA-REQ-LS3DEB-011`,
|
|
`FESA-REQ-LS3DEB-027`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T21-LOAD-001`, `T21-LOAD-002`, `T21-LOAD-003`,
|
|
`T21-LOAD-004`, `T21-LOAD-005`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly five planned tests were registered before production and the public load API was absent | MSVC C1083 reported missing `fesa/assembly/load_assembler.hpp` from `load_assembler_test.cpp` |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum nodal load/effective RHS implementation and all five tests compiled and linked | `load_assembler.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure` | 0 | Node/set loads, source-order accumulation, nonzero prescribed RHS, rejection, and zero cases pass | 5/5 exact `LoadAssembly` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure` | 0 | Focused Step 21 suite remains green | 5/5 exact `LoadAssembly` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact names | 62 tests discovered, including 5 `LoadAssembly` tests |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 62/62 tests passed |
|
|
| VERIFY-contract-scans | Exact-test-count, public-backend, factorization/solve/distributed-load, whitespace, and reference diff/status scans | 0 | Load/RHS scope and backend boundary remain isolated | exact tests 5; public backend leaks 0; forbidden scope 0; whitespace clean; reference unchanged |
|
|
|
|
- contract_checks: semantic node label/node-set targets resolve case-insensitively
|
|
to unique stable node indices. All six global components use DofManager full
|
|
order, constrained loads remain in the full vector, and duplicate CLOAD rows
|
|
accumulate strictly in active source order; a cancellation fixture proves
|
|
that the implementation does not reorder floating-point additions.
|
|
- contract_checks: model/full/free/constrained/prescribed dimensions, stable
|
|
DOF partition/equation order, active-load order, target indices, component
|
|
range, and finite individual inputs are validated before use. Nonfinite
|
|
source-order load sums, `Kfc*dc` products/row sums, and final subtraction fail
|
|
closed with one structured model diagnostic.
|
|
- contract_checks: effective RHS is exactly the stable gather of `Ff` minus
|
|
CSR row-order `Kfc*dc`; hand-computed nonzero `dc`, zero-load, zero-free, and
|
|
zero-constrained cases pass. No factorization/substitution call, distributed
|
|
load object, `*DLOAD`, or line-load behavior was added.
|
|
- contract_checks: the public header exposes only the two approved static
|
|
`LoadAssembler` functions and no MKL, oneTBB, HDF5, or PARDISO type.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 22 can consume the full external force and effective free RHS;
|
|
Step 24 retains ownership of factorize-before-load orchestration,
|
|
substitution, reconstruction, recovery, and output sequencing.
|
|
- concerns: none; no critical implementation, environment, backend, or
|
|
upstream-contract conflict was found.
|
|
|
|
## Step 22 — result-recovery
|
|
|
|
- task_id: `TASK-22`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/results/result_recovery.hpp`,
|
|
`src/fesa/results/result_recovery.cpp`,
|
|
`tests/unit/results/result_recovery_test.cpp`, `src/fesa/CMakeLists.txt`,
|
|
`tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-004`, `FESA-REQ-LS3DEB-027`,
|
|
`FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-032`,
|
|
`FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035`,
|
|
`FESA-REQ-LS3DEB-042`
|
|
- test_ids: `T22-RECOVERY-001`, `T22-RECOVERY-002`,
|
|
`T22-RECOVERY-003`, `T22-RECOVERY-004`, `T22-RECOVERY-005`,
|
|
`T22-RECOVERY-006`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly six planned tests were registered before production and the recovery public API was absent | MSVC C1083 reported missing `fesa/results/result_recovery.hpp` from `result_recovery_test.cpp` |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Recovery, station normalization, six tests, solver library, and unit executable compile and link | `result_recovery.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure` | 0 | Residual reaction, residual criterion, distinct result types, signs, stress order, and station policy pass | 6/6 exact `ResultRecovery` tests passed |
|
|
| RED-state-consistency | `cmake --build .harness/build --config Debug --target fesa_tests; ctest --test-dir .harness/build -C Debug -R ResultRecovery.EnforcesNormalizedFreeResidual --output-on-failure` | 1 | A constrained displacement inconsistent with prescribed `dc` must fail before residual evaluation | Test expected `invalid-recovery-state` but observed later `free-residual-tolerance-failure`, proving missing prevalidation |
|
|
| GREEN-state-consistency | same focused build/test command after the minimum validation change | 0 | Prescribed-order/state consistency fails before recovery and the exact zero-load/zero-displacement equilibrium remains valid | Focused test passed; subsequent exact suite passed 6/6 |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure` | 0 | Focused Step 22 suite remains green | 6/6 exact `ResultRecovery` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all six exact names | 68 tests discovered, including 6 `ResultRecovery` tests |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 68/68 tests passed |
|
|
| VERIFY-contract-scans | Exact-test-count, public-backend, forbidden shear/averaging, whitespace, and reference diff/status scans | 0 | Recovery scope and adapter/reference boundaries remain isolated | exact tests 6; public backend leaks 0; forbidden scope 0; whitespace clean; reference unchanged |
|
|
|
|
- contract_checks: full `internalForce=K*d` and
|
|
`residual=internalForce-externalForce` are computed as private candidates;
|
|
the full residual is preserved in reaction so free residual evidence remains
|
|
visible and constrained entries are the physical support reactions. No
|
|
endpoint-action summation participates in reaction recovery.
|
|
- contract_checks: the free residual uses
|
|
`||r_f||/max(||Fint_f||,||Fext_f||)` with no unit floor. A positive physical
|
|
denominator must meet `1e-10`; exact zero numerator/denominator is accepted
|
|
as zero-load equilibrium, while nonfinite arithmetic fails closed.
|
|
- contract_checks: dimensions, finite input, stable free/constrained order,
|
|
exact prescribed displacement, active entity references, and twelve-DOF
|
|
scatters are checked before computing candidates. Internal/residual/reaction
|
|
vectors and endpoint/Gauss/stress rows replace AnalysisState only after all
|
|
elements recover finite results, so failure is atomic.
|
|
- contract_checks: active element order produces endpoint `0,1`, Gauss `1,2`,
|
|
and element/Gauss/section stress order. Equilibrium end action
|
|
`[FX,FY,FZ,MX,MY,MZ]`, endpoint `[N,T,My,Mz]`, Gauss strain/resultant, and
|
|
section-point/default-centroid `S11` remain distinct.
|
|
- contract_checks: node-station projection requires exact endpoint row
|
|
identity, a two-endpoint unloaded interior chain, identical section and
|
|
local axes, finite component tolerances `[N,T,My,Mz]`, and agreement before
|
|
selecting the smaller stable element ID. Positive-local-x section-cut rows
|
|
compare directly and are never averaged; reversed, branched, loaded,
|
|
section-jump, nonfinite, and mismatch cases fail structurally.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0
|
|
- handoff: Step 23 can serialize the stable nodal vectors and distinct
|
|
endpoint/Gauss/stress rows; Step 24 reference tooling can reuse
|
|
`normalizeSectionResultantsToNodeStations` without backend or HDF5 types.
|
|
- concerns: none; no critical implementation, environment, numerical, or
|
|
upstream-contract conflict was found.
|
|
|
|
### Step 22 Review Fix Round 1 — full-space free-residual visibility
|
|
|
|
- review_trigger: the approved I/O contract requires Reaction at every node
|
|
and component, including the accepted free-DOF residual; the AnalysisState
|
|
storage comment likewise makes reaction a full-index residual view.
|
|
- RED-test: `cmake --build .harness/build --config Debug --target fesa_tests;
|
|
ctest --test-dir .harness/build -C Debug -R
|
|
'^ResultRecovery.EnforcesNormalizedFreeResidual$' --output-on-failure`
|
|
built successfully and exited 1 in CTest. The accepted below-tolerance free
|
|
residual was `-1.000000082740371e-09`, while its reaction entry was `0`.
|
|
- production_fix: the private reaction candidate is now a full copy of
|
|
`residual=K*d-F`. Constrained entries remain the physical reactions, free
|
|
entries retain residual evidence, and element end actions are still never
|
|
summed into reaction.
|
|
- GREEN-focused: the same focused build/test command exited 0 and passed 1/1
|
|
after the minimum production change.
|
|
- VERIFY-build: `cmake --build .harness/build --config Debug` exited 0 under
|
|
MSVC x64 Debug with no new FESA warning.
|
|
- VERIFY-targeted: `ctest --test-dir .harness/build -C Debug -R
|
|
ResultRecovery --output-on-failure` exited 0 and passed the unchanged exact
|
|
six names 6/6.
|
|
- VERIFY-discovery-full: `ctest --test-dir .harness/build -C Debug
|
|
--show-only=json-v1` discovered 68 tests, exactly six ResultRecovery tests;
|
|
full `ctest --test-dir .harness/build -C Debug --output-on-failure` exited 0
|
|
and passed 68/68.
|
|
- failure_atomicity: the existing tolerance-failure branch in
|
|
`ResultRecovery.EnforcesNormalizedFreeResidual` still proves prior internal,
|
|
residual, reaction, and endpoint state remains unchanged on failure.
|
|
- supersession: this review section records the historical pre-fix finding
|
|
that implementation and report originally kept only constrained residual
|
|
entries. The final Step 22 contract above now states that reaction is the
|
|
full residual dataset; only constrained entries are physical reactions.
|
|
- phase_index: the review-fix worker intentionally left phase metadata
|
|
unchanged. After independent root verification, finalization preserved exact
|
|
`started_at=2026-08-09T20:42:15+0900`, added
|
|
`completed_at=2026-08-09T21:14:47+0900`, and updated the summary to state
|
|
the corrected full-residual reaction contract.
|
|
- evidence_hygiene: an initial parallel VERIFY/audit wrapper terminated before
|
|
product commands because its PowerShell count expression was malformed. It
|
|
is excluded from TDD and product VERIFY evidence; the recorded evidence is
|
|
the subsequent uncontended serial build, targeted, discovery, full sequence
|
|
followed by a separate successful audit command.
|
|
- concerns: none; no upstream-contract conflict or critical blocker remains.
|
|
|
|
## Step 23 — hdf5-results-writer
|
|
|
|
- task_id: `TASK-23`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/results/results_writer.hpp`,
|
|
`include/fesa/io/hdf5/hdf5_results_writer.hpp`,
|
|
`src/fesa/io/hdf5/hdf5_results_writer.cpp`,
|
|
`tests/unit/results/results_writer_test.cpp`,
|
|
`tests/unit/io/hdf5/hdf5_results_writer_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`cmake/FesaDependencies.cmake`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-015`,
|
|
`FESA-REQ-LS3DEB-019`, `FESA-REQ-LS3DEB-020`,
|
|
`FESA-REQ-LS3DEB-023`, `FESA-REQ-LS3DEB-025`,
|
|
`FESA-REQ-LS3DEB-028`, `FESA-REQ-LS3DEB-029`,
|
|
`FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-031`,
|
|
`FESA-REQ-LS3DEB-032`, `FESA-REQ-LS3DEB-034`
|
|
- test_ids: `T23-HDF5-001`, `T23-HDF5-002`, `T23-HDF5-003`,
|
|
`T23-HDF5-004`, `T23-HDF5-005`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | All five ledger tests were registered before either public production header existed | MSVC C1083 reported missing `fesa/results/results_writer.hpp` and `fesa/io/hdf5/hdf5_results_writer.hpp` |
|
|
| INFRA-link | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Production and tests compiled, but the packaged static HDF5 target could not link in this environment | LNK1104 reported missing `libircmt.lib`; this is infrastructure evidence, not the feature RED |
|
|
| INFRA-runtime-discovery | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Shared HDF5 linked after normalized-target repair, but post-build GoogleTest discovery could not load a transitive runtime | discovery exited `0xc0000135`; `dumpbin /dependents hdf5.dll` identified `libmmd.dll` |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum schema-v0 writer, tests, solver library, and unit executable compile/link after the approved runtime repair | `hdf5_results_writer.cpp` and both tests built under `/W4 /WX`; required runtime DLLs were staged before discovery |
|
|
| GREEN-test | `ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure` | 0 | Exact schema, mandatory outputs, diagnostics/centroid, failure preservation, and successful replacement pass | 5/5 exact `Hdf5ResultsWriter` tests passed |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Visual Studio 18/MSVC x64, Windows SDK 10.0.26100.0, oneMKL, oneTBB, and shared HDF5 resolved; configure/generate completed |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure` | 0 | Focused Step 23 suite remains green | 5/5 exact `Hdf5ResultsWriter` tests passed |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact ledger names | 73 tests discovered, including exactly 5 `Hdf5ResultsWriter` tests |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 73/73 tests passed in 2.75 seconds |
|
|
| VERIFY-runtime | `& 'C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.51.36231\bin\Hostx64\x64\dumpbin.exe' /dependents 'C:\Program Files\HDF_Group\HDF5\2.1.1\bin\hdf5.dll'` | 0 | The package DLL's undeclared Intel runtime requirement is traceable | dependencies include `libmmd.dll`; the WIN32 staging guard copies `${OMP_DLL_DIR}/libmmd.dll` |
|
|
| VERIFY-contract-scans | Public HDF5/Win32 type scan, exact-test count, finalizer/RAII scope scan, forbidden shear/averaging/filter scan, `git diff --check`, and reference diff/status | 0 | Backend boundary, exact mandatory-output scope, atomic finalization, and reference immutability remain isolated | public backend leaks 0; exact tests 5; checked file closes and exact Replace/Move split present; forbidden scope 0; whitespace clean; reference unchanged |
|
|
|
|
- contract_checks: `ResultsWriter` and `Hdf5ResultsWriter` expose only the
|
|
approved backend-free signatures. HDF5, Win32 handles, macros, RAII wrappers,
|
|
schema construction, self-check, and atomic finalization stay private to the
|
|
implementation; `Fesa::HDF5` is linked privately.
|
|
- contract_checks: schema v0 writes every literal metadata, model, and
|
|
`/steps/Step-1/frames/0` path, including `generalized_resultant`. Numeric
|
|
fields use IEEE little-endian float64, stable identities use little-endian
|
|
uint64 compound members, text uses UTF-8 variable-length strings, and exact
|
|
component/unit/coordinate/location/step/frame attributes are pinned.
|
|
- contract_checks: non-axis-aligned element axes, node/element identity,
|
|
connectivity, and representative first/last nonzero values for displacement,
|
|
reaction, end action, section resultant, generalized strain, and generalized
|
|
resultant prove solved state is connected to output. Output requests do not
|
|
filter any mandatory field; shear/averaged stress was not added.
|
|
- contract_checks: diagnostics are stable-sorted and preserved, an empty input
|
|
produces an exact zero-row compound dataset, and the default centroid stress
|
|
row serializes axial `S11` only. Dimensions, row identity/order, source
|
|
identity, and all numeric values are validated before finalization.
|
|
- atomicity: a unique same-directory temporary file is fully written, flushed,
|
|
checked-closed, reopened read-only for exact schema self-check, and
|
|
checked-closed before finalization. Existing finals use only
|
|
`ReplaceFileW(final,temp,nullptr,...)`; new finals use only
|
|
`MoveFileExW(temp,final,MOVEFILE_WRITE_THROUGH)`. Failure removes the temp,
|
|
leaves no partial new final, and preserves pre-existing final bytes.
|
|
- infrastructure_resolution: the approved normalized HDF5 dependency now
|
|
prefers the package shared target, with static and `HDF5::HDF5` fallbacks.
|
|
Tests stage `$<TARGET_RUNTIME_DLLS:fesa_unit_tests>` plus the package DLL's
|
|
verified `${OMP_DLL_DIR}/libmmd.dll` dependency without directly naming an
|
|
HDF5 package target or hardcoding an Intel installation path.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`,
|
|
`.harness/build/tests/Debug/fesa_unit_tests.exe`; all test HDF5/temp artifacts
|
|
are confined to build-tree temporary directories and cleaned by their owners.
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` and
|
|
`git status --short -- reference/` both report no change.
|
|
- handoff: Step 24 can construct the backend-free writer and rely on mandatory
|
|
schema-v0 output and fail-atomic replacement. Its production executable must
|
|
stage the selected HDF5 target runtime DLLs and `${OMP_DLL_DIR}/libmmd.dll`
|
|
with the same portable target-expression/runtime-guard policy used by tests.
|
|
- concerns: no remaining critical implementation or upstream-contract blocker.
|
|
The HDF5 static-link and shared-runtime environment blockers were resolved
|
|
and are recorded separately from the valid missing-API RED.
|
|
|
|
## Step 24 — linear-static-cli
|
|
|
|
- task_id: `TASK-24`
|
|
- status: `completed`
|
|
- changed_files: `include/fesa/analysis/linear_static_analysis.hpp`,
|
|
`src/fesa/analysis/linear_static_analysis.cpp`,
|
|
`include/fesa/app/fesa_application.hpp`,
|
|
`src/fesa/app/fesa_application.cpp`, `src/fesa/app/main.cpp`,
|
|
`tests/integration/analysis/linear_static_analysis_test.cpp`,
|
|
`tests/integration/app/fesa_application_test.cpp`,
|
|
`tests/reference/reference_comparison.hpp`,
|
|
`tests/reference/reference_comparison.cpp`,
|
|
`tests/reference/reference_comparison_test.cpp`,
|
|
`tests/reference/b33_reference_comparison_test.cpp`,
|
|
`src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`,
|
|
`docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`,
|
|
`phases/linear-static-3d-euler-beam/index.json`
|
|
- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-002`,
|
|
`FESA-REQ-LS3DEB-005`, `FESA-REQ-LS3DEB-020`,
|
|
`FESA-REQ-LS3DEB-026`, `FESA-REQ-LS3DEB-028`,
|
|
`FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-032`,
|
|
`FESA-REQ-LS3DEB-033`, `FESA-REQ-LS3DEB-034`,
|
|
`FESA-REQ-LS3DEB-036` through `FESA-REQ-LS3DEB-044`
|
|
- test_ids: `T24-ORCH-001`, `T24-ORCH-002`, `T24-CLI-001`,
|
|
`T24-CLI-002`, `T24-CLI-003`, `T24-REF-001`, `T24-REF-002`,
|
|
`T24-REF-003`, `T24-REF-004`, `T24-B33-001`
|
|
|
|
| stage | exact command | exit_code | expected_or_observed_result | evidence_tail |
|
|
| --- | --- | ---: | --- | --- |
|
|
| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exact ten tests were registered while orchestration, CLI, and comparator APIs were absent | MSVC C1083 reported only missing `fesa/analysis/linear_static_analysis.hpp`, `fesa/app/fesa_application.hpp`, and `reference_comparison.hpp`; the pre-existing unit target still built |
|
|
| RED-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Missing executables leave no runnable Step 24 tests after the valid compile RED | CTest reported `No tests were found`; this is secondary evidence, not the RED acceptance result |
|
|
| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal production lifecycle, application boundary, test-only comparator, and all three test executables compile/link | `fesa_solver.lib`, `fesa_unit_tests.exe`, `fesa_integration_tests.exe`, and `fesa_reference_tests.exe` built without a FESA warning under `/W4 /WX` |
|
|
| GREEN-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Exact lifecycle/CLI/reference contract is green | Exact Step 24 suite passed 10/10: integration 5 and reference 5 |
|
|
| VERIFY-configure | `cmake -S . -B .harness/build -A x64 -DFESA_GTEST_SOURCE_DIR=C:/git/googletest "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"` | 0 | Approved explicit-dependency MSVC x64 build tree generates | Visual Studio 18/MSVC x64, Windows SDK 10.0.26100.0, oneMKL 2026.1, oneTBB, and shared HDF5 resolved |
|
|
| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build includes the actual CLI and all test executables | `.harness/build/src/fesa/Debug/fesa.exe` built under `/W4 /WX`; selected MKL/TBB/HDF5/Intel runtime DLLs were staged beside it |
|
|
| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Focused Step 24 suite remains green after the full build | Exact tests passed 10/10 |
|
|
| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` plus JSON count audit | 0 | All accumulated and exact Step 24 tests are discovered | 83 total tests, exactly 10 Step 24 names |
|
|
| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 83/83 tests passed |
|
|
| VERIFY-cli | `.harness/build/src/fesa/Debug/fesa.exe "reference/cantilever beam/cantilever beam.inp" --output .harness/build/cli-smoke-step24/results.h5` | 0 | The actual executable strips argv[0], runs the approved pipeline, and writes HDF5 | Process exit 0; `results.h5` exists and is 25,336 bytes; an empty-argument process smoke test returned exact usage exit 2 |
|
|
| VERIFY-determinism | Run exact `B33ReferenceComparison` twice and hash `comparison.json` after each run | 0 | Build-local comparison evidence is byte deterministic | Both runs passed 1/1 and produced SHA-256 `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` |
|
|
| VERIFY-contract-scans | Exact-test count, public-backend, forbidden-scope, reference-write, whitespace, and reference diff/status scans | 0 | Approved module and artifact boundaries remain isolated | exact tests 10; public backend leaks 0; B31/DLOAD/fallback/averaging scope 0; comparator has only its JSON output writer; diff clean; reference unchanged |
|
|
|
|
- contract_checks: `Analysis::run` invokes the exact eight hook stages and
|
|
returns immediately on failure. `LinearStaticAnalysis` keeps the immutable
|
|
Domain alive under the non-owning AnalysisModel, owns the DOF/state/matrix
|
|
handoff, and calls `factorize(Kff)` before any nodal load assembly. Solve is
|
|
substitution-only, followed by full reconstruction, recovery, and the
|
|
injected ResultsWriter.
|
|
- contract_checks: `FesaApplication::run` receives argv[0]-excluded operands,
|
|
accepts only `<input>` or `<input> --output <output>`, defaults to the current
|
|
directory `results.h5`, constructs TBB/MKL/HDF5 adapters behind their public
|
|
boundaries, emits seven deterministic diagnostic fields, and returns exact
|
|
process codes 0/2/3/4/5/6. Domain warnings remain in the HDF5 diagnostics and
|
|
output requests do not filter mandatory result datasets.
|
|
- contract_checks: the test-only comparator opens the exact legacy four-file
|
|
bundle and authoritative HDF5 read-only, requires B33/schema/source/row
|
|
identity/finite values before comparison, and produces exactly 176 stable
|
|
decisions plus 16 component metrics. It uses Abaqus-only component scales,
|
|
exact SI floors, no zero clamp/drop, and Step 22 endpoint consistency before
|
|
selecting the smaller element identity without averaging.
|
|
- generated_evidence: `.harness/build/src/fesa/Debug/fesa.exe`,
|
|
`.harness/build/reference/cantilever-beam-b33/results.h5` (25,336 bytes),
|
|
`.harness/build/reference/cantilever-beam-b33/comparison.json` (128,118
|
|
bytes). The report has `passed=true`, 0 failed rows, 176 matched rows, 16
|
|
metrics, stress comparison N/A, and worst normalized error
|
|
`0.026602795021994977` (`UZ`).
|
|
- physics_evidence: free residual norm `9.356339321107032e-7`; applied force
|
|
`[0,0,-1000000]`; reaction force `[0,0,999999.9999998808]`; applied moment
|
|
about origin `[0,10000000,0]`; reaction moment about origin
|
|
`[0,-9999999.999997258,0]`; endpoint consistency passed.
|
|
- reference_diff: unchanged; `git diff --exit-code -- reference/` and
|
|
`git status --short -- reference/` both report no change. Contract-fixture
|
|
mutations occur only under `.harness/build/reference/contract-fixtures/`.
|
|
- handoff: Step 25 can independently rebuild and execute all 83 tests. Step 26
|
|
can rerun the already-built exact B33 CTest and consume the deterministic
|
|
`comparison.json` without changing source, tests, tolerances, or references;
|
|
Step 27 can consume only its `physics_evidence` after Step 26 passes.
|
|
- concerns: none; no critical implementation, environment, numerical, or
|
|
upstream-contract blocker remains.
|