feat(nonlinear-static-newton-raphson): step 11 - equilibrium-projection-and-reference-gate

This commit is contained in:
KOKO\Mimi
2026-08-28 09:22:33 +09:00
parent 65b56b1755
commit 6dbf1b2bcf
30 changed files with 13122 additions and 728 deletions
@@ -13,7 +13,7 @@
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않았으므로 현재 Coordinator failure evidence와 Executor의 `step0-output.json` 및 `step1-output.json`을 source failure report로 사용했다.
Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이며 USER-DECISION-002 option A 이후 current correction과 status는 Section 11이 supersede한다.
Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다.
## 2. Failure Triage
@@ -318,3 +318,327 @@ Reference artifact no-change evidence: `git diff --name-only -- reference`는 em
- status: `corrected-for-implementation-rerun`.
- blockers: 이 correction 범위에는 없음. Existing Python `xhigh`/`extra high` mismatch는 명시된 out-of-scope pre-existing failure다.
- prohibited actions not performed: Harness phase rerun, Step 2, `danger-full-access`, push, commit, reference solver/artifact mutation, build cleanup/deletion.
## 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage
### 12.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` REWORK-007 |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
### 12.2 Failure Triage
- classification: `upstream-contract`
- normalized classification: `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`
- attempt: `1`
- first failed command:
```powershell
ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (CTest test 288)
- evidence tail: copied build-local `shellNL.inp` reaches `severity=error`, `code=nonlinear-nonconvergence` after iteration 100. `generated.HasValue()` is false because no authoritative copied-sibling `shellNL_results.h5` is committed.
- correction-agent reproduction: the exact focused test alone failed deterministically in 103.84 seconds with the same diagnostic. The original reference input was not passed to FESA.
### 12.3 Root Cause Summary
This is not an implementation defect in the observed convergence calculation. The implementation in `src/fesa/analysis/nonlinear_static_procedure.cpp` supplies same-trial free rotational residual, internal moment and external moment to `EvaluateNewtonConvergence`. `src/fesa/analysis/nonlinear_static_control.cpp` then implements the approved `NSNR-069` and formulation Section 14.1 literally:
\[
D_M=\max(\|f_{int,f}^{\phi}\|_\infty,
\|f_{ext,f}^{\phi}\|_\infty),\qquad
\eta_M=\frac{\|r_f^{\phi}\|_\infty}{D_M}
\]
for every nonzero \(D_M\), with the typed absolute `1e-3 force-length` branch available only when \(D_M=0\) exactly.
The approved `reference/shellNL/shellNL.inp` contains only `Set-1, 3, -100000.` under `*CLOAD`; it applies no rotational moment component. Therefore the free rotational external vector is exactly zero and
\[
r_f^{\phi}=f_{int,f}^{\phi}-0=f_{int,f}^{\phi},
\qquad
D_M=\|f_{int,f}^{\phi}\|_\infty=\|r_f^{\phi}\|_\infty.
\]
For every nonzero rotational residual, \(\eta_M=1>10^{-2}\). The channel can pass only if floating-point assembly produces the exact zero vector, at which point and only then the exact-zero branch is selected. Thus the current approved denominator structurally prevents practical convergence for a no-applied-moment shell case even when its residual is well below the approved typed absolute threshold.
The reproduced log contains 100/100 parsed iteration records with exact printed equality between `residual_moment_numerator_norm` and `residual_moment_denominator_scale`; all 100 use `branch=relative` and `pass=0`. Representative values are:
| iteration | numerator | denominator | branch | pass |
| ---: | ---: | ---: | --- | ---: |
| 1 | `2.363968570753043e-09` | `2.363968570753043e-09` | `relative` | 0 |
| 2 | `1.4372536725204554e-06` | `1.4372536725204554e-06` | `relative` | 0 |
| 3 | `3.138301877925187e-06` | `3.138301877925187e-06` | `relative` | 0 |
| 99 | `3.8876064110127118e-06` | `3.8876064110127118e-06` | `relative` | 0 |
| 100 | `4.6441010823627948e-06` | `4.6441010823627948e-06` | `relative` | 0 |
Every listed numerator is below `1e-3 force-length`, but the approved exact-zero-denominator predicate forbids use of that absolute branch. Changing the implementation alone would contradict the approved requirement and formulation.
### 12.4 Correction Scope
- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed production source/header/test/CMake files: none
- preserved dirty Step 11 files: `tests/CMakeLists.txt`, `tests/reference/nonlinear_static_reference_cases_test.cpp`, `tests/reference/nonlinear_static_reference_comparison.cpp`, `tests/reference/nonlinear_static_reference_comparison.h`
- excluded upstream files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md`
- excluded workflow/final reports: phase indexes/status, `implementation-report.md`, `build-test.md`, `reference-comparison.md`
- prohibited actions not performed: production/test/CMake change, threshold or denominator relaxation, Step 11 completion, Step 12 advancement, Abaqus/Nastran/reference solver, reference artifact generation/modification, `danger-full-access`, commit, push
No RED test was added because no implementation correction is authorized: a test requiring this case to pass would encode a new convergence contract before user/upstream approval. The existing focused reference test already provides the failing integration evidence.
### 12.5 Verification Evidence
| purpose | exact command/evidence | result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `1`; 0/1 passed; test 288 failed in 103.84 s with 100-iteration `nonlinear-nonconvergence` |
| iteration-log audit | parse latest copied-run `shellNL_log.txt` fields for every iteration | 100 records; numerator equals denominator in 100/100; `relative` in 100/100; `residual_moment_pass=0` in 100/100 |
| implementation trace | `nonlinear_static_procedure.cpp` residual/internal/external channel construction plus `nonlinear_static_control.cpp` denominator evaluation | matches `NSNR-069` and formulation Section 14.1 exactly |
| input trace | `reference/shellNL/shellNL.inp` lines 149-151 | one translational direction-3 force; no applied rotational moment |
| reference preservation | pre/post SHA-256 plus `git diff -- reference` | all eight declared hashes unchanged; reference diff empty |
| full Ninja/MSVC build/CTest | not run | intentionally stopped at decisive `upstream-contract`; no implementation correction exists to verify |
| Stop | not applicable | Correction was not a Harness Step and made no production/test/CMake change |
| Harness Python pytest | not applicable | no Harness/Hook/agent-config behavior changed |
### 12.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-069` | Step 5 `load-boundary-path-and-convergence-gates`; REWORK-007 | `CORR-NSNR-CONTRACT-001` log audit | focused test 288 | report only | no-applied-moment free rotational residual must have a reachable approved convergence decision; not met by current contract |
| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate` | `NSNR-REF-002`, `NSNR-REF-004` via test 288 | focused test 288 | report only | copied shellNL run produces authoritative HDF5 before comparison; blocked by NSNR-069 contract |
### 12.7 Handoff Recommendation
- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun yet.
- narrowest contract alternative: when the matching external residual-channel scale is exactly zero, select the existing typed absolute gate (`||r_f^phi||inf <= 1e-3 force-length`) even if the internal residual is nonzero; retain the current relative denominator when matching external scale is nonzero.
- broader contract alternative: make residual convergence pass when either its typed absolute gate or its current relative gate passes. This is simpler and symmetric across force/moment channels but changes acceptance for all load-scale regimes.
- scale-based contract alternative: define an explicit nonzero model force-length reference scale for moment residual normalization, including its deterministic characteristic-length source. This is more general but expands the numerical contract and needs formulation/numerical review.
- non-solution: changing the reference deck to add an applied moment would not correct the same structural failure for supported no-moment load cases and would also violate immutable reference ownership in this correction.
Any selected alternative requires the owning upstream documents and tests to be revised and approved before production code changes. Correction Agent does not choose among them.
### 12.8 Stop Condition
- upstream ambiguity: the exact approved `max(internal, external)` denominator and exact-zero branch are the demonstrated cause.
- implementation stop: any code-only pass would relax/reinterpret `NSNR-069` and formulation Section 14.1.
- reference artifact gap: none; all declared reference artifacts exist and remain unchanged.
- repeated failure: normalized classification attempt `1`; no automatic second implementation correction is safe before an upstream decision.
- final stop: status `needs-upstream-decision`; Step 11 remains blocked and Step 12 remains pending.
## 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage
### 13.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-25` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 immutable `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`, Coordinator dispatch, current implementation/CTest와 read-only result/reference audit를 source evidence로 사용했다.
### 13.2 Failure Triage
- initial failure classification: `reference-comparison`
- final classification: `upstream-contract`
- normalized classification: `reference-blocking-model-adequacy-conflict`
- attempt: `1` for `REWORK-008`; 이전 `REWORK-007`은 별도 nonlinear convergence classification이다.
- first failed command in Step 11:
```powershell
cmake --build --preset windows-msvc-ninja-debug; ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- correction-agent reproduction:
```powershell
ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (fresh CTest test 293)
- evidence tail: exit `8`, 0/1 passed, 16.88 s. Row identity/schema/nonfinite prechecks passed before the common tolerance gate reported exactly three failed blocking families: in-plane RF RMS `0.11437709952897851`, transverse RF RMS `0.048448360241294064`, physical spatial RM RMS `0.02746412616679237`, each above `0.01`.
### 13.3 Root Cause Summary
Observed reaction computation/storage/mapping path에는 implementation defect evidence가 없다.
1. `nonlinear_static_procedure.cpp`는 같은 accepted state에서 `residual = internal.force - external.generalized_external_force`를 만들고 `trial.reaction = trial.residual`로 저장한다. `nonlinear_analysis_state.cpp`는 모든 DOF에서 이 두 identity를 검증한다.
2. `nonlinear_hdf5_results_writer.cpp`는 translation reaction을 그대로 쓰고 rotational reaction만 승인식 `J_l(phi)^(-T)`로 physical spatial moment에 변환한다. 24 constrained nodes에서 `phi=0`이므로 이 변환은 identity다. Full-precision HDF5 audit에서 constrained translation과 generalized residual의 차이, constrained moment 변환 차이, constrained `phi`가 모두 exact `0`이었다.
3. Comparator는 `/model/nodal_constraint_mask`와 `(case, state, instance, node label, component)` exact key를 사용한다. 이번 실행이 schema/missing/extra/duplicate/nonfinite failure가 아니라 family tolerance report까지 도달했으므로 storage와 row mapping precheck도 통과했다.
4. Dominant RF3/RM1/RM2 mismatch는 nonlinear 전용 경로에서 생기지 않는다. FESA nonlinear-linear 최대 차이는 RF3 `2.9441580409184098e-06`, RM1 `1.3046948879491538e-05`, RM2 `1.2039316061418504e-05`이고, Abaqus nonlinear-linear 차이는 각각 `0`, `5.0022208599999994e-12`, `1.1141310098e-11`이다. 그럼에도 FESA linear와 Abaqus linear 사이에는 nonlinear과 동일한 local RF3/RM mismatch가 이미 존재한다. 예를 들어 node 31 RF3는 FESA `1059.5675655371299`, reference `339.61334199999999`; node 22 RM1은 FESA `-1564.1175318019484`, reference `-515.62542699999995`다.
5. 전체 constrained reaction 합은 FESA nonlinear `[7.9591888635377472e-12, 7.2906680692597092e-12, 100000.00000082512]`, Abaqus nonlinear `[4.5008441418303846e-13, -1.7997131562808022e-12, 99999.999592799955]`로 global balance와 sign이 일치한다. Stored `/global/equilibrium`도 `[-5.2007287365540833e-12, 2.1302730413008675e-11, 99999.999999999985, 1.5669833723712425e-11, 6.4043503405991029e-12, -3.0183203934097235e-11]`다.
6. RF1/RF2는 nonlinear에서 새로 생기는 weak geometric membrane reaction이지만 FESA extrema `±1.3774894254907935`와 Abaqus extrema `±1.9166318200000001`의 차이는 storage/mapping 오류가 아니다. Linear Abaqus reaction은 거의 zero이고, independent FESA MITC4와 Abaqus S4가 서로 다른 local nodal support-force redistribution을 만들 수 있다는 approved formulation/model limitation 안에 있다.
따라서 demonstrated cause는 nonlinear reaction implementation이 아니라 reference blocking quantity의 model-adequacy 전제다. Approved `reference-model.md`는 linear reaction CSV를 review-only로 두면서, 같은 local RF3/RM distribution을 nonlinear에서 blocking으로 승격한다. Project contract는 FESA MITC4의 integration/stabilization/internal behavior가 Abaqus S4와 동등하다고 주장하지 않는다. Global equilibrium은 맞지만 formulation-sensitive local nodal reaction 분포가 1% RMS를 만족해야 한다는 분석적 또는 독립 benchmark 근거는 없다. 이를 code-only로 Abaqus 값에 맞추는 것은 formulation/model adequacy 또는 reference acceptance contract 변경이며 Correction Agent 범위를 벗어난다.
### 13.4 Correction Scope
- changed report file in this rework: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed production source/header/test/CMake files in this rework: none
- preserved pre-existing dirty Step 11 files, including selector/control/log tests, comparator/reference tests, plan/phase/coordination and upstream approval edits
- excluded upstream contract files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md`
- excluded immutable/reference files: `reference/**`, stored Abaqus CSV, HDF5 schema and tolerance policy
- prohibited actions not performed: new RED test without an implementation defect, production/comparator/test/CMake change, tolerance weakening, reference artifact generation/modification, Abaqus/Nastran/reference solver, Harness phase execution, Step 12/Physics/Release advancement, `danger-full-access`, commit, push
No focused RED test was added because the dataflow audit disproved a bounded nonlinear computation/storage/mapping defect. The existing focused integration test is already RED for an upstream blocking/model-adequacy assumption; encoding a replacement expected result before upstream approval would itself change that contract.
### 13.5 Verification Evidence
Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정했고, `.harness/config.json`/preset가 요구한 `FESA_GTEST_SOURCE_DIR=C:/git/googletest`, `MKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl`, `TBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb`, `HDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake`를 사용했다.
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `8`; 0/1 passed; only three reaction-family RMS gates failed |
| reaction dataflow audit | `nonlinear_static_procedure.cpp` residual/reaction assignment, `nonlinear_analysis_state.cpp` identities, `nonlinear_hdf5_results_writer.cpp` physical-moment projection and comparator exact-key prechecks; build-local datasets dumped with `$hdf5Bin='C:\Program Files\HDF_Group\HDF5\2.1.1\bin'; $env:PATH="$hdf5Bin;$env:PATH"; & "$hdf5Bin\h5dump.exe" -m %.17g -d <dataset> <results.h5>` | exit `0`; constrained pipeline differences and constrained rotation were exact zero |
| nonlinear/linear audit | join build-local FESA HDF5 and immutable CSV rows by exact `(instance, node label, component)` in read-only PowerShell | exit `0`; dominant mismatch is already present in both solvers' linear results and survives nonlinear unchanged |
| targeted nonlinear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441332835013800-0/shellNL_results.h5` | SHA-256 `A82349F1AABDC2B042A7DBF643D0D917B04245B64E5D73F9507B83A2D67FDE91` |
| targeted linear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-441349319977100-1/shell_results.h5` | SHA-256 `167248AB523484FB6F515AE6A309C7380B4A1226B74BE03B207F4532C3064B66` |
| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0`; 0.342 s; configure/generate complete |
| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0`; 0.116 s; `ninja: no work to do.` |
| CTest discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 294 tests discovered |
| full MSVC CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `8`; 293/294 passed; only test 293 failed with the same three RMS values; test 294 comparator invalid-HDF5/warning checks passed |
| source failure hash | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256` | exit `0`; `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91` |
| reference preservation | `git diff -- reference` | exit `0`; empty diff |
| repository identity | `git rev-parse HEAD` | exit `0`; `65b56b1755e4537b48b44476375b6235da732648` |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 production/test/CMake를 변경하지 않았다. Full preset build/CTest를 직접 실행했다. |
| Harness Python pytest | not applicable | Harness Python, Hook, agent config behavior를 변경하지 않았다. |
### 13.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-019` | Step 10 reaction/HDF5 path; REWORK-008 | `CORR-NSNR-REACTION-PIPELINE-001` read-only audit | focused test 293 | report only | accepted full residual, constrained reaction and HDF5 physical moment mapping are identical at constrained zero-rotation DOFs; met |
| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate`; REWORK-008 | `NSNR-REF-015`, `NSNR-REF-017` via test 293 | focused test 293 and full CTest | report only | exact keys/prechecks pass, but three local reaction families exceed blocking RMS `0.01`; not met because approved reference quantity assumes unsupported local S4/MITC4 distribution agreement |
| `FESA-REQ-NSNR-034` | Step 11 model-adequacy audit | `CORR-NSNR-LINEAR-CROSSCHECK-001` | read-only HDF5/CSV audit | report only | distinguish nonlinear reaction implementation error from pre-existing formulation-sensitive local redistribution; implementation-error hypothesis rejected |
### 13.7 Handoff Recommendation
- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun and do not advance Step 12 until an upstream alternative is explicitly selected and approved.
- recommended narrow alternative: align nonlinear local nodal RF/RM disposition with the approved linear reference contract—keep local rows as read-only model-adequacy/physics-review evidence, while blocking reaction evidence is global force/moment equilibrium plus free-residual checks. Blocking displacement comparison remains unchanged.
- local-to-global alternative: retain reaction as a blocking external quantity only after projecting it to formulation-independent global resultant force/moment families; keep exact local nodal rows as warning/characterization evidence.
- local-blocking alternative: if exact local RF/RM rows must remain blocking, Numerical Review/Reference Model owners must supply an analytical or independent formulation-appropriate benchmark, or explicitly approve Abaqus S4 local nodal reaction distribution as an FESA MITC4 model-adequacy target after a mesh/formulation study. Implementation must not calibrate reactions to Abaqus without that decision.
- excluded alternative: tolerance relaxation, row averaging/collapse, comparator weakening or reference artifact rewriting is not acceptable.
Each viable alternative changes blocking quantity/model-adequacy ownership in `requirements.md`, `numerical-review.md`, `reference-model.md`, `io.md` and the implementation/reference plan. Correction Agent does not select or edit those contracts.
### 13.8 Stop Condition
- upstream ambiguity: current contracts simultaneously disclaim Abaqus S4 internal equivalence, make linear local reaction review-only, and require the same formulation-sensitive local distribution as nonlinear blocking evidence.
- implementation stop: no nonlinear reaction computation, storage or exact-key mapping defect was reproduced; a code-only pass would alter formulation/reference meaning.
- reference artifact gap: none; required artifacts exist, remained read-only and have empty reference diff.
- environment blocker: none; configure/build/discovery completed and full CTest reproduced only the intended reference failure.
- repeated failure: `REWORK-008` classification attempt `1`; no automatic implementation correction is safe before the upstream decision.
- final stop: status `needs-upstream-decision`; Step 11 remains blocked, Step 12 remains pending, and Physics/Release remain ineligible.
## 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction
### 14.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `corrected-for-implementation-rerun` |
| owner_agent | `correction-agent` |
| date | `2026-08-28` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 current `step11-output.json` SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`, Coordinator dispatch, preserved attempt-1 TDD evidence와 attempt-2 Stop evidence를 source evidence로 사용했다.
### 14.2 Failure Triage
- classification: `harness`
- normalized classification: `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`
- attempt: `2` under `STEP11-EXECUTION-003`; attempt 1은 1,800초 timeout이고 attempt 2는 아래 shell launch failure다.
- first failed command boundary:
```powershell
codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson --disable unified_exec -
```
- failed target: attempt-2 nested Codex의 첫 PowerShell tool launch.
- evidence tail: nested Codex `0.150.1`이 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`를 선택했다. `workspace-write` runner가 `CreateProcessAsUserW failed: 5 (Access denied)`로 이를 거부해 소스 확인, RED/VERIFY 명령과 Step status update가 실행되지 않았다. Codex process 자체는 `exitCode=0`이지만 blocker agent message만 반환했으므로 Step 성공 evidence가 아니다.
- state evidence: `HEAD=65b56b1755e4537b48b44476375b6235da732648`; Step 11 `pending`; Step 12 `pending`.
### 14.3 Root Cause Summary
이번 실패는 solver, comparator 또는 `1e-8` gate defect가 아니라 Harness child launch environment defect다.
1. 이전 launcher filter는 `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` entry만 제거했다.
2. 따라서 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps` entry와 그 아래 `pwsh.exe` execution alias가 PATH에 남았다.
3. Nested Codex shell resolver는 남은 user-local alias를 선택했고, Windows native `workspace-write` sandbox는 그 alias의 child process 생성을 Windows error 5로 거부했다.
4. PATH에서 `\\WindowsApps(?:\\|$)`에 일치하는 모든 entry를 제거하면 현재 환경의 Program Files entry 세 개와 user-local entry 한 개가 함께 제거된다. 이때 `pwsh`는 resolve되지 않고 `powershell`은 `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`로 resolve된다.
5. Root가 같은 Codex CLI `0.150.1`, `gpt-5.6-terra`, `xhigh`, `--disable unified_exec`, `workspace-write`, `CODEX_HOME=C:\Users\baram\.codex` envelope에서 이 filter를 적용한 nested smoke는 위 Windows PowerShell을 선택해 exact `FESA_CODEX_SHELL_SMOKE_OK`를 출력하고 exit `0`으로 끝났다. Correction audit의 독립 direct smoke도 같은 executable, exact output과 exit `0`을 확인했다.
따라서 repository runner나 Step 11 implementation을 고칠 필요가 없다. Rerun launch에서 PATH predicate만 전체 WindowsApps entry를 제거하도록 바로잡으면 된다.
### 14.4 Correction Scope
- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed source/header/test/CMake/runner/phase files: none
- excluded upstream contracts: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `docs/TOLERANCE.md`
- excluded immutable evidence: `reference/**`, stored CSVs and reference inputs
- preserved dirty implementation: all existing Step 11 source, test, comparator, CMake and phase changes
- prohibited actions not performed: Harness phase execution, Step 11 implementation, Step 12, full build/CTest rerun, manual Hook execution, commit, push, `danger-full-access`, reference solver or artifact mutation
Correction은 repository code 변경이 아니라 corrected child-launch envelope와 재실행 경계를 확정한다. Production C++ 변경이 없으므로 새 RED test는 필요하지 않다.
### 14.5 Verification Evidence
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| failure artifact audit | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256`; JSON `exitCode`, `stderr`, blocker message 검사 | exit `0`; SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`; nested process path와 `CreateProcessAsUserW failed: 5` 확인 |
| filter audit | `($env:PATH -split ';') \| Where-Object { $_ -notmatch '\\WindowsApps(?:\\|$)' }`를 child-only PATH로 적용한 뒤 `Get-Command codex,pwsh,powershell` 확인 | four WindowsApps entries removed; Codex `codex-cli 0.150.1`; `pwsh=<none>`; `powershell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` |
| independent direct smoke | filtered PATH에서 `powershell.exe -NoProfile -Command '[Console]::WriteLine($PSHOME); [Console]::WriteLine("FESA_CODEX_SHELL_SMOKE_OK")'` | exit `0`; `$PSHOME=C:\Windows\System32\WindowsPowerShell\v1.0`; exact `FESA_CODEX_SHELL_SMOKE_OK` |
| same-envelope nested Codex smoke | Coordinator/root evidence: Codex `0.150.1`, Terra/xhigh, `--disable unified_exec`, `workspace-write`, aligned `CODEX_HOME`, all-WindowsApps filter | exit `0`; selected system Windows PowerShell and printed exact `FESA_CODEX_SHELL_SMOKE_OK` |
| recovered attempt-1 RED | `ctest --preset windows-msvc-ninja-debug -R 'GlobalForceAndMoment' --output-on-failure` before comparator GREEN | exit `8`; preserved old `<=1e-10` rejected both `5e-9` and exact `1e-8` in `NSNR-REF-024` |
| recovered attempt-1 GREEN | same focused GlobalForceAndMoment CTest after comparator-only shared gate became `1e-8` | exit `0`; 2/2 passed, including inclusive boundary and exact-zero-scale tests |
| focused implementation evidence | attempt-1 focused procedure, HDF5 and global-balance runs; attempt-2 `LastTest.log` named-test audit | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024`, `NSNR-REF-025` all present as passed |
| attempt-2 Stop full CTest | `.harness/build-ninja-msvc-debug/Testing/Temporary/LastTest.log`, SHA-256 `41CA3D4E410F7BFD55E50FC7D40A79D00D26116945C468E74F0E38720E676447` | 302 `Testing` rows, 0 failure markers, final `302/302`; root/Coordinator records full `302/302` pass |
| new full build/CTest | not run | existing evidence was sufficient and dispatch prohibited unnecessary Harness/build/CTest rerun |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 code/test/CMake를 변경하지 않았다. |
| Harness Python pytest | not applicable | runner, Hook 또는 agent config를 변경하지 않았다. |
Attempt-1 RED/GREEN은 recovered immutable execution evidence이며 이 correction에서 재현하거나 새로 주장한 RED가 아니다. Current code를 old threshold로 되돌리지 않았고 reference artifact도 실행·수정하지 않았다.
### 14.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-019` | Step 11 `equilibrium-projection-and-reference-gate`; REWORK-009 | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | Step 11 agent can read/run the preserved current-arm, spatial-moment and distinct global force/moment evidence under `workspace-write` |
| `FESA-REQ-NSNR-034` | Step 11 reference gate; REWORK-009 | `NSNR-REF-020..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | implementation-owned reference checks can complete without changing disposition, reference artifacts or tolerance |
| Harness Step execution contract | `STEP11-EXECUTION-003`; `REWORK-009` | `CORR-HARNESS-SHELL-002` | user-local WindowsApps `pwsh.exe` launch | `corrections.md` | all PATH entries matching `\\WindowsApps(?:\\|$)` are absent; system Windows PowerShell launches and exact smoke exits `0` |
### 14.7 Handoff Recommendation
- recommendation: return `corrected-for-implementation-rerun` to Coordinator Agent and request one bounded Implementation Agent rerun of Step 11 only.
- exact launch correction: reuse the approved `STEP11-EXECUTION-003` Step11-only wrapper and change only the launch PATH filter to the following predicate after VsDevCmd x64/dependency environment setup and before `codex exec`:
```powershell
$step11PathEntries = $env:PATH -split ';' | Where-Object {
$_ -and $_ -notmatch '\\WindowsApps(?:\\|$)'
}
$env:PATH = $step11PathEntries -join ';'
$env:CODEX_HOME = 'C:\Users\baram\.codex'
$env:FESA_HARNESS_CODEX_SANDBOX = 'workspace-write'
```
- preserve exact runtime: Codex CLI `0.150.1`; implementation-agent `gpt-5.6-terra`/`xhigh`; `--disable unified_exec`; project PreToolUse/Stop hooks; VsDevCmd x64; approved `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`.
- preflight must resolve `powershell` to `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`, leave `pwsh` unresolved, and print exact `FESA_CODEX_SHELL_SMOKE_OK` with exit `0`.
- run only Executor-selected Step 11, no `--push`; hard-stop before Step 12. Do not use `danger-full-access`, run a reference solver, mutate reference artifacts or alter runner/source/test/CMake/phase/upstream/tolerance files as part of this launch correction.
### 14.8 Stop Condition
- repeated failure: normalized classification count is already `2`; if the corrected all-WindowsApps filter still produces the same `CreateProcessAsUserW` failure, do not start another automatic retry. Return `needs-environment-fix` to Coordinator with the new output artifact.
- environment blocker: cleared for one bounded Step 11 rerun by the same-envelope smoke; no repository-local code fix is required.
- upstream ambiguity: none introduced by this correction; fixed `1e-8` force/moment gate and all approved contracts remain unchanged.
- reference artifact gap: none examined or changed in this correction.
- final stop: status `corrected-for-implementation-rerun`; Step 11 and Step 12 remain `pending` until Executor/Implementation owner action.