467 lines
41 KiB
Markdown
467 lines
41 KiB
Markdown
# MITC4 비선형 정적 해석 수정과 시행착오
|
|
|
|
아래는 당시 실패 재현·원인·수정·검증 기록이다. 임시 shell/Hook/phase 복구 명령은 현재 실행 절차가 아니다.
|
|
|
|
<a id="corrections"></a>
|
|
|
|
<a id="corrections--nonlinear-static-newton-raphson-correction-report"></a>
|
|
## Nonlinear Static Newton-Raphson Correction Report
|
|
|
|
<a id="corrections--1-metadata"></a>
|
|
### 1. Metadata
|
|
|
|
| key | value |
|
|
| --- | --- |
|
|
| feature_id | `nonlinear-static-newton-raphson` |
|
|
| source failure report | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0-output.json`; `phases/nonlinear-static-newton-raphson/step1-output.json` |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md` |
|
|
| status | `corrected-for-implementation-rerun` |
|
|
| owner_agent | `correction-agent` |
|
|
| date | `2026-08-24` |
|
|
|
|
`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이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다.
|
|
|
|
<a id="corrections--2-failure-triage"></a>
|
|
### 2. Failure Triage
|
|
|
|
- classification: `harness`
|
|
- normalized classification: `harness-nested-codex-windows-shell-tool-execution-hang`
|
|
- first failed command:
|
|
|
|
```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 -
|
|
```
|
|
|
|
- failed target or test: nested shell smoke `cmd.exe /d /c echo CODEX_SHELL_SMOKE_OK`
|
|
- evidence tail: baseline diagnostic는 45초 안에 종료되지 않았다. JSONL에는 `item.started`, `type=command_execution`, `status=in_progress`가 기록됐지만 대응하는 completion event와 `CODEX_SHELL_SMOKE_OK` 출력이 없었다. 진단 root PID `11292`와 관찰된 descendant PID tree를 `taskkill /PID 11292 /T /F`로 종료한 뒤 `remainingPids=[]`를 확인했다.
|
|
- historical evidence: `step0-output.json`도 exit code `124`, stderr `Codex timed out after 1800 seconds.`를 기록했고 `Get-Date`, `cmd.exe /d /c echo test`, `exit 0` 등의 nested command가 `status=in_progress`에 머물렀다.
|
|
|
|
<a id="corrections--3-root-cause-summary"></a>
|
|
### 3. Root Cause Summary
|
|
|
|
실패 경계는 repaired Python Executor의 timeout/retry 처리나 FESA C++ 구현이 아니라 local `codex-cli 0.147.0`의 nested command execution runtime이다. 같은 worktree에서 direct PowerShell과 `cmd.exe`는 정상 실행되고, focused Harness Python test도 통과하며, runner-equivalent Codex baseline만 nested shell completion을 반환하지 않았다.
|
|
|
|
Local CLI help는 `--disable <FEATURE>`와 `--enable <FEATURE>`를 문서화하고, `codex features list`는 `code_mode_host`를 `stable true`, `shell_tool`을 `stable true`, `unified_exec`를 `stable false`, `hooks`를 `stable true`로 보고했다. 다음 좁은 가설을 한 변수씩 검사했다.
|
|
|
|
| variant | result | command completion evidence |
|
|
| --- | --- | --- |
|
|
| baseline | 45.318초 timeout 후 exact PID tree cleanup | `item.started/status=in_progress`; completion 및 echo output 없음 |
|
|
| `--disable code_mode_host` | exit `0`, 33.322초 | shell 미실행; stderr `code-mode host is disabled`; completion event 없음 |
|
|
| `--enable unified_exec` | 45.299초 timeout 후 exact PID tree cleanup | completion event 및 echo output 없음 |
|
|
| `--disable code_mode_host --enable unified_exec` | exit `0`, 25.922초 | shell 미실행; 동일한 fail-closed host-disabled error |
|
|
|
|
따라서 `--disable code_mode_host`는 shell execution을 복구하지 않고 tool host를 fail-closed로 제거한다. `unified_exec`도 단독 또는 조합에서 실제 shell completion을 만들지 못했다. Codex 내부 결함의 더 세부 원인은 repository evidence로 확정할 수 없으며, 안전한 documented runner flag workaround는 입증되지 않았다. 이는 implementation defect, test defect 또는 CMake registration issue가 아니라 external Codex runtime blocker다.
|
|
|
|
<a id="corrections--5-verification-evidence"></a>
|
|
### 5. Verification Evidence
|
|
|
|
| purpose | command | result |
|
|
| --- | --- | --- |
|
|
| installed CLI | `codex --version` | exit `0`; `codex-cli 0.147.0` |
|
|
| documented options | `codex exec --help`; `codex features list` | exit `0`; `--enable/--disable`, `code_mode_host`, `unified_exec`, `shell_tool`, `hooks` 확인 |
|
|
| targeted reproduction | runner-equivalent `codex exec ... --sandbox workspace-write ...` + one echo tool request | 45초 timeout; command started, completion/output 없음; exact tree cleanup 후 remaining PID 0 |
|
|
| focused Harness Python | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | exit `0`; 10 passed |
|
|
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | exit `1`; 23 passed, 1 failed |
|
|
| MSVC Debug build | `cmake --build .harness/build --config Debug` | exit `0`; solver/CLI/unit/integration/reference targets built |
|
|
| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | exit `0`; 214 tests discovered |
|
|
| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | exit `0`; 214/214 passed |
|
|
|
|
`.harness/config.json`은 없었다. Existing `.harness/build/CMakeCache.txt`는 `Visual Studio 18 2026`, `x64`, approved local GoogleTest/MKL/TBB/HDF5 paths를 사용하므로 Harness auto-detected build tree를 재사용했다.
|
|
|
|
Full Python failure는 pre-existing out-of-scope contract mismatch다: `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`가 actual `xhigh`와 expected `extra high`를 비교한다. Dispatch 지시에 따라 이 test, `AGENTS.md`, agent profile을 변경하지 않았다.
|
|
|
|
Stop hook은 Harness Step 실행을 금지한 이번 correction session에서 별도 Codex Step 종료 evidence를 생성하지 않았다. Hook entry point의 수동 실행은 project contract가 금지하므로 대신 config-resolved full MSVC build와 full CTest를 직접 실행해 결과를 위에 기록했다.
|
|
|
|
<a id="corrections--9-rework-004-tdd-and-verification-evidence"></a>
|
|
### 9. REWORK-004 TDD And Verification Evidence
|
|
|
|
<a id="corrections--failure-and-minimal-correction"></a>
|
|
#### Failure and Minimal Correction
|
|
|
|
- classification: `harness`
|
|
- implementation defect: Codex `0.149.1`에서 통과한 runtime envelope의 `--disable unified_exec` option을 `scripts/execute.py`가 nested `codex exec`에 전달하지 않았다.
|
|
- RED test: `test_invoke_codex_uses_implementation_agent_command_contract`
|
|
- minimal GREEN: command vector에서 `"codex", "exec"` 바로 뒤에 `"--disable", "unified_exec"` 두 argument만 추가했다.
|
|
- preserved behavior: `workspace-write` default/validated override, `--dangerously-bypass-hook-trust`, `gpt-5.6-terra`, `model_reasoning_effort="xhigh"`, 1800-second structured timeout, no-push default, `danger-full-access` 비사용 정책은 변경하지 않았다.
|
|
|
|
<a id="corrections--red--green--verify"></a>
|
|
#### RED / GREEN / VERIFY
|
|
|
|
| stage | command | exit | duration | evidence tail |
|
|
| --- | --- | ---: | ---: | --- |
|
|
| RED | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py::test_invoke_codex_uses_implementation_agent_command_contract` | `1` | 1.2초 | `assert ('--disable', 'unified_exec') in adjacent_arguments`; 1 failed |
|
|
| GREEN | same targeted command | `0` | 1.1초 | 1 passed |
|
|
| focused VERIFY | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | `0` | 1.1초 | 10 passed |
|
|
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | `1` | 1.3초 | 23 passed, 1 pre-existing failure |
|
|
| MSVC Debug build | `cmake --build .harness/build --config Debug` | `0` | 3.8초 | solver/CLI/unit/integration/reference targets built |
|
|
| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `0` | 0.7초 | 214 tests discovered |
|
|
| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `0` | 10.2초 | 214/214 passed |
|
|
|
|
Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`의 `assert 'xhigh' == 'extra high'` 한 건이다. REWORK-004의 command-contract test를 포함한 `tests/test_execute.py`는 10/10 통과하며, dispatch 경계에 따라 pre-existing mismatch를 수정하지 않았다.
|
|
|
|
<a id="corrections--10-filetracker-workspace-write-diagnosis"></a>
|
|
### 10. FileTracker Workspace-Write Diagnosis
|
|
|
|
<a id="corrections--101-metadata"></a>
|
|
#### 10.1 Metadata
|
|
|
|
| key | value |
|
|
| --- | --- |
|
|
| feature_id | `nonlinear-static-newton-raphson` |
|
|
| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step1.md` |
|
|
| status | `blocked` |
|
|
| owner_agent | `correction-agent` |
|
|
| date | `2026-08-24` |
|
|
|
|
<a id="corrections--102-failure-triage"></a>
|
|
#### 10.2 Failure Triage
|
|
|
|
- classification: `harness`
|
|
- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write`
|
|
- attempt: `1`
|
|
- first failed stage command:
|
|
|
|
```powershell
|
|
cmake --build .harness/build --config Debug
|
|
```
|
|
|
|
- failed target or test: Visual Studio 18 generator의 `fesa_solver.vcxproj`와 GoogleTest `gtest.vcxproj` CL task
|
|
- evidence tail: MSBuild `18.8.2`가 `Microsoft.CppCommon.targets(790,5)`에서 `MSB4018`을 냈다. Inner exception은 `System.UnauthorizedAccessException`, HRESULT `0x80070005 (E_ACCESSDENIED)`이며 stack은 `NativeMethods.GetLongFilePath` -> `FileTracker..cctor()` -> `FileTracker.FileIsExcludedFromDependencies` -> `CanonicalTrackedInputFiles.ConstructDependencyTable` -> `CL.ComputeOutOfDateSources`다.
|
|
- command-result caveat: `step1-output.json`의 item 25는 build와 CTest를 세미콜론으로 연결해 aggregate exit `0`을 기록했지만, 그 내부 `cmake --build`는 exit `1`로 실패했다. 뒤따른 stale-build CTest 성공은 Visual Studio build 성공 evidence가 아니다.
|
|
- configure boundary: 보존된 `.harness/build/CMakeCache.txt`는 `CMAKE_GENERATOR=Visual Studio 18 2026`, platform `x64`다. CMake generation 자체가 아니라 생성된 MSBuild project의 CL dependency-tracking 단계가 실패했다.
|
|
|
|
<a id="corrections--103-root-cause-summary"></a>
|
|
#### 10.3 Root Cause Summary
|
|
|
|
FESA source, Step 1 test 또는 CMake registration이 원인이 아니다. 서로 독립적인 FESA와 GoogleTest project가 동일한 `FileTracker` static initializer에서 실패하므로 project-local input보다 sandbox/environment boundary다.
|
|
|
|
Microsoft의 `FileTracker.cs`는 static initialization에서 `Path.GetTempPath()`를 구한 뒤 그 경로에 `GetShortFilePath`와 `GetLongFilePath`를 적용한다. 관찰 stack의 첫 failing native call과 정확히 일치한다. 현재 inherited `TEMP`/`TMP`는 `C:\Users\baram\AppData\Local\Temp`이고 runner는 이를 재지정하지 않는다. 따라서 Codex Windows `workspace-write` restricted token이 workspace 밖 user Temp의 long-path normalization을 거부한 것이 가장 좁은 root-cause inference다.
|
|
|
|
- boundary confidence: `high` — 두 project에서 같은 FileTracker initializer/`E_ACCESSDENIED`가 재현됨.
|
|
- exact denied-path confidence: `medium-high` — Microsoft source의 static field order와 inherited Temp가 일치하지만 failing API가 path argument를 log하지는 않음.
|
|
- implementation classification: environment-owned sandbox/MSBuild interaction; implementation defect, test defect, CMake registration issue가 아님.
|
|
|
|
검토한 primary vendor evidence:
|
|
|
|
- Microsoft MSBuild source: `https://github.com/dotnet/msbuild/blob/main/src/Utilities/TrackedDependencies/FileTracker.cs`
|
|
- Microsoft CL task documentation: `https://learn.microsoft.com/en-us/visualstudio/msbuild/cl-task?view=visualstudio`
|
|
- installed Visual Studio target: `C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\Microsoft.CppCommon.targets` lines 48-49 and 764-771
|
|
- OpenAI Codex sandbox CLI source: `https://github.com/openai/codex/blob/main/codex-rs/cli/src/lib.rs`; built-in writable profile name은 `:workspace`
|
|
|
|
<a id="corrections--105-workaround-evaluation-and-verification-evidence"></a>
|
|
#### 10.5 Workaround Evaluation And Verification Evidence
|
|
|
|
| purpose | exact command/evidence | result |
|
|
| --- | --- | --- |
|
|
| preserved failure | `cmake --build .harness/build --config Debug` in `step1-output.json` | internal build exit `1`; `FileTracker..cctor()` `E_ACCESSDENIED` in both FESA and gtest |
|
|
| supported property inspection | installed `Microsoft.CppCommon.targets`; Microsoft CL task docs | `TrackFileAccess` defaults to `true` and is passed to CL; property is vendor-defined for incremental file-access tracking |
|
|
| narrow property smoke | nested `codex exec --sandbox workspace-write ...` requesting exactly `cmake --build .harness/build --config Debug -- /p:TrackFileAccess=false` | 60-second diagnostic timeout before a command completion event; no pass/fail conclusion; exact root PID `13720` and descendants cleaned, then absent |
|
|
| direct sandbox launcher check | `codex sandbox -P :workspace -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson cmd.exe /d /c echo SANDBOX_OK` | 10-second timeout; no `SANDBOX_OK`; exact root PID `16708` tree cleaned, then absent |
|
|
| workspace-write alternative evidence | Visual Studio-bundled Ninja/MSVC build in `step1-output.json` | focused CTest 27/27 and full CTest 228/228 passed |
|
|
|
|
`/p:TrackFileAccess=false`는 vendor-defined 후보지만 동일 `workspace-write`에서 build completion이 관찰되지 않아 safe workaround로 채택할 수 없다. `TEMP`/`TMP`를 worktree로 재지정하는 후보도 FileTracker가 system-wide Temp를 dependency exclusion 기준으로 사용한다는 Microsoft source comment 때문에 tracking semantics 보존을 입증하지 않고 자동 적용하지 않았다.
|
|
|
|
Ninja/MSVC는 같은 sandbox에서 implementation/test 건전성을 입증하지만 Step 1 VERIFY가 명시한 `Visual Studio 18 2026` generator acceptance criterion을 대체하지 않는다. 따라서 correction-agent가 phase/upstream contract 변경 없이 자동 채택할 수 없다. `danger-full-access`는 지시대로 실행하거나 시험하지 않았다.
|
|
|
|
<a id="corrections--11-rework-006-ninjamsvc-validation-contract-correction"></a>
|
|
### 11. REWORK-006 Ninja/MSVC Validation Contract Correction
|
|
|
|
<a id="corrections--111-metadata"></a>
|
|
#### 11.1 Metadata
|
|
|
|
| key | value |
|
|
| --- | --- |
|
|
| feature_id | `nonlinear-static-newton-raphson` |
|
|
| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` USER-DECISION-002 option A / REWORK-006 |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` |
|
|
| status | `corrected-for-implementation-rerun` |
|
|
| owner_agent | `correction-agent` |
|
|
| date | `2026-08-24` |
|
|
|
|
<a id="corrections--112-failure-triage"></a>
|
|
#### 11.2 Failure Triage
|
|
|
|
- classification: `harness`
|
|
- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write`
|
|
- attempt: `2`, resolved by USER-DECISION-002 option A의 approved validation-contract change
|
|
- first failed command: `cmake --build .harness/build --config Debug`
|
|
- failed target: Visual Studio generator/MSBuild `FileTracker..cctor()`; Section 10의 `E_ACCESSDENIED`
|
|
- replacement acceptance: `workspace-write` 안에서 VsDevCmd x64를 상속한 Ninja/MSVC Debug configure/build, CTest discovery, full CTest가 모두 통과해야 한다.
|
|
|
|
<a id="corrections--113-root-cause-summary"></a>
|
|
#### 11.3 Root Cause Summary
|
|
|
|
FESA C++/test/CMake target defect가 아니라 Visual Studio generator의 MSBuild FileTracker와 `workspace-write` sandbox 사이 environment failure였다. User가 option A를 승인했으므로 tracked root `CMakePresets.json`과 existing Harness preset adapter를 사용해 동일 MSVC x64 Debug compiler를 Ninja로 구동한다. Harness Python은 이미 complete preset triplet과 parent environment copy를 지원하므로 production Python 변경은 필요하지 않았다.
|
|
|
|
<a id="corrections--115-red---green-evidence"></a>
|
|
#### 11.5 RED -> GREEN Evidence
|
|
|
|
| stage | command | result |
|
|
| --- | --- | --- |
|
|
| RED-1 | `uv run --with pytest python -m pytest -v -rs tests/test_harness_preset_contract.py` | exit `1`; `CMakePresets.json` `FileNotFoundError` |
|
|
| GREEN-1 | same focused command after preset/example/local config | exit `0`; 1 passed |
|
|
| RED-2 | `uv run --with pytest python -m pytest -q tests/test_harness_preset_contract.py` after adding generated-build ignore assertion | exit `1`; `.harness/build-ninja-msvc-debug/` rule absent |
|
|
| GREEN-2 | focused verbose command after `.gitignore` update | exit `0`; 1 passed; `git check-ignore` confirms config and build output |
|
|
|
|
Contract details:
|
|
|
|
- preset: `windows-msvc-ninja-debug`
|
|
- generator/configuration: `Ninja`, `CMAKE_BUILD_TYPE=Debug`
|
|
- binary directory: `.harness/build-ninja-msvc-debug`
|
|
- cache variables: `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR` use `$env{...}` and therefore fail closed when the parent launch envelope is incomplete.
|
|
- `.harness/config.json` is ignored and byte-identical to `.harness/config.example.json`; both SHA-256 `D07429860D472AE37D02D6CD638900FA46175085AF47F179E98601227F8D3C43` at verification.
|
|
|
|
<a id="corrections--116-verification-evidence"></a>
|
|
#### 11.6 Verification Evidence
|
|
|
|
Exact nested launch envelope:
|
|
|
|
```powershell
|
|
VsDevCmd.bat -arch=x64 -host_arch=x64
|
|
$env:FESA_GTEST_SOURCE_DIR='C:/git/googletest'
|
|
$env:MKL_DIR='C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl'
|
|
$env:TBB_DIR='C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb'
|
|
$env:HDF5_DIR='C:/Program Files/HDF_Group/HDF5/2.1.1/cmake'
|
|
codex exec --ephemeral --json --sandbox workspace-write --disable unified_exec --dangerously-bypass-hook-trust -m gpt-5.6-terra -c 'model_reasoning_effort="xhigh"' -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson <bounded-validation-prompt>
|
|
```
|
|
|
|
`CODEX_HOME=C:\Users\baram\.codex`를 상속하고 approved WindowsApps PATH entries를 child launch에서만 제거했다. `danger-full-access`와 sandbox bypass option은 사용하지 않았고 project hooks는 유지했다.
|
|
|
|
| verify item | exact command/evidence | result |
|
|
| --- | --- | --- |
|
|
| environment preflight | nested shell prints architecture, four variables, `cl.exe`, `ninja.exe` | exit `0`; target/host `x64`; `cl.exe` Hostx64/x64; VS-bundled Ninja; all dependency paths exist |
|
|
| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0` |
|
|
| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0` |
|
|
| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 228 tests |
|
|
| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `0`; 228/228 passed; 10.69초 |
|
|
| generated metadata | `.harness/build-ninja-msvc-debug/CMakeCache.txt`와 `CMakeCXXCompiler.cmake` | `Ninja`; `Debug`; compiler ID `MSVC`; Hostx64/x64 `cl.exe` |
|
|
| Stop | hooks-retained nested `codex exec` completion | overall exit `0`; no Stop blocking response; automatic Stop uses ignored config's same preset plan |
|
|
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | 24 passed, 1 pre-existing out-of-scope failure: actual `xhigh` vs expected `extra high` |
|
|
|
|
첫 cold workspace run은 full CTest에서 temporary `fesa_reference_tests_NOT_BUILT`로 207/208만 통과해 blocker-clear로 사용하지 않았고 phase도 reset하지 않았다. Automatic hooks가 missing target build를 완료한 뒤 두 번째 independent nested `workspace-write` run에서 위 228/228 evidence를 확보한 다음에만 phase를 reset했다.
|
|
|
|
Reference artifact no-change evidence: `git diff --name-only -- reference`는 empty였다. `shellNL.inp`, shellNL displacement/reaction/stress CSV와 shell input/displacement/reaction/stress CSV의 SHA-256은 implementation-plan inventory와 모두 일치한다. Reference solver와 feature Harness phase는 실행하지 않았다.
|
|
|
|
<a id="corrections--12-rework-007-step-11-nonlinear-nonconvergence-contract-triage"></a>
|
|
### 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage
|
|
|
|
<a id="corrections--121-metadata"></a>
|
|
#### 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/README.md` REWORK-007 |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
|
|
| status | `needs-upstream-decision` |
|
|
| owner_agent | `correction-agent` |
|
|
| date | `2026-08-24` |
|
|
|
|
<a id="corrections--122-failure-triage"></a>
|
|
#### 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.
|
|
|
|
<a id="corrections--123-root-cause-summary"></a>
|
|
#### 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.
|
|
|
|
<a id="corrections--125-verification-evidence"></a>
|
|
#### 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 |
|
|
|
|
<a id="corrections--13-rework-008-nonlinear-reaction-reference-mismatch-triage"></a>
|
|
### 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage
|
|
|
|
<a id="corrections--131-metadata"></a>
|
|
#### 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/README.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.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로 사용했다.
|
|
|
|
<a id="corrections--132-failure-triage"></a>
|
|
#### 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`.
|
|
|
|
<a id="corrections--133-root-cause-summary"></a>
|
|
#### 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 범위를 벗어난다.
|
|
|
|
<a id="corrections--135-verification-evidence"></a>
|
|
#### 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를 변경하지 않았다. |
|
|
|
|
<a id="corrections--14-rework-009-user-local-windowsapps-powershell-launch-correction"></a>
|
|
### 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction
|
|
|
|
<a id="corrections--141-metadata"></a>
|
|
#### 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/README.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` |
|
|
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.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로 사용했다.
|
|
|
|
<a id="corrections--142-failure-triage"></a>
|
|
#### 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`.
|
|
|
|
<a id="corrections--143-root-cause-summary"></a>
|
|
#### 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를 제거하도록 바로잡으면 된다.
|
|
|
|
<a id="corrections--145-verification-evidence"></a>
|
|
#### 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도 실행·수정하지 않았다.
|