diff --git a/.gitignore b/.gitignore index 03c4805..960854a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ __pycache__/ # local Harness configuration and build outputs .harness/config.json .harness/build/ +.harness/build-ninja-msvc-debug/ .harness/doxygen/ # phase execution outputs diff --git a/.harness/config.example.json b/.harness/config.example.json index 51d1846..b8853ea 100644 --- a/.harness/config.example.json +++ b/.harness/config.example.json @@ -1,16 +1,11 @@ { "version": 1, - "projectType": "auto", - "tdd": { - "testRoots": [ - "tests", - "test" - ], - "testPatterns": [ - "{stem}_test.cpp", - "{stem}_tests.cpp", - "test_{stem}.cpp", - "{stem}.test.cpp" - ] + "projectType": "cmake", + "cmake": { + "sourceDir": ".", + "binaryDir": ".harness/build-ninja-msvc-debug", + "configurePreset": "windows-msvc-ninja-debug", + "buildPreset": "windows-msvc-ninja-debug", + "testPreset": "windows-msvc-ninja-debug" } } diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..3e9acbc --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,30 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "windows-msvc-ninja-debug", + "displayName": "Windows MSVC x64 Debug (Ninja)", + "generator": "Ninja", + "binaryDir": "${sourceDir}/.harness/build-ninja-msvc-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", + "MKL_DIR": "$env{MKL_DIR}", + "TBB_DIR": "$env{TBB_DIR}", + "HDF5_DIR": "$env{HDF5_DIR}" + } + } + ], + "buildPresets": [ + { + "name": "windows-msvc-ninja-debug", + "configurePreset": "windows-msvc-ninja-debug" + } + ], + "testPresets": [ + { + "name": "windows-msvc-ninja-debug", + "configurePreset": "windows-msvc-ninja-debug" + } + ] +} diff --git a/docs/nonlinear-static-newton-raphson/coordination.md b/docs/nonlinear-static-newton-raphson/coordination.md index f5b52a4..1d4a6b6 100644 --- a/docs/nonlinear-static-newton-raphson/coordination.md +++ b/docs/nonlinear-static-newton-raphson/coordination.md @@ -6,13 +6,13 @@ - workflow_state: `needs-implementation` - owner_agent: `coordinator-agent` - request_date: `2026-08-18` -- last_updated: `2026-08-24` (REWORK-004 corrected; no-push Harness rerun authorized) +- last_updated: `2026-08-24` (REWORK-006 passed; Step 1 no-push Harness rerun authorized) - process_classification: `architectural` - requested_capability: Newton–Raphson 방법을 사용하는 새 nonlinear static analysis procedure - proposed_scope_boundary: 첫 release는 initial configuration 기준 Total Lagrangian, materially linear + geometrically nonlinear MITC4로 제한한다. 요구조건 인터뷰와 8단계 evidence gate를 먼저 완료하며, 승인 전에는 상세 수치·I/O·구현 범위를 확정하거나 기존 linear-static lifecycle을 변경하지 않는다. - naming_note: 사용자 표현 `Newton-Rhapson`은 표준 명칭 `Newton–Raphson`으로 정규화했다. -- current_goal: Stage 6 no-push Harness/Implementation rerun is authorized for Executor-selected Step 0 and subsequent approved phase progression under the corrected `codex exec --disable unified_exec` runner envelope. -- constraints: 승인된 Stage 1-5 hashes, physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel과 Stage 6 materialization evidence를 보존한다. The authorized rerun envelope is Codex CLI `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, child launch PATH filtering of `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` and `C:\Users\baram\AppData\Local\Microsoft\WindowsApps`, `workspace-write`, implementation-agent `gpt-5.6-terra`/`xhigh`, hooks retained, no-push, no `danger-full-access`, and runner-retained `--disable unified_exec`. Do not edit feature contracts/reference artifacts/tolerance policies, run Abaqus/Nastran/reference solvers, or advance Physics/Release until `implementation-report.md`, `build-test.md`, `reference-comparison.md` and passing implementation evidence exist. +- current_goal: REWORK-006 passed and Step 1 is reset to `pending`; authorize no-push Harness rerun from Step 1 under the approved Ninja/MSVC workspace-write envelope. +- constraints: 승인된 Stage 1-5 hashes, physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel과 Stage 6 materialization evidence를 보존한다. Step 0 commits `fc16ef6` and `e7c6932`, Step 1 uncommitted implementation changes, phase block evidence and no-reference-artifact-change evidence must be preserved. The approved continuation envelope is MSVC/x64/Debug with Ninja generator, full CTest, `workspace-write`, Codex CLI `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, child launch PATH filtering of `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` and `C:\Users\baram\AppData\Local\Microsoft\WindowsApps`, implementation-agent `gpt-5.6-terra`/`xhigh`, hooks retained, no-push, no `danger-full-access`, and runner-retained `--disable unified_exec`. Do not edit feature contracts/reference artifacts/tolerance policies, run Abaqus/Nastran/reference solvers, clean/delete build artifacts, or advance Step 2/Physics/Release until `implementation-report.md`, `build-test.md`, `reference-comparison.md` and passing implementation evidence exist. - repository_audit: 기존 worktree에는 `.codex/agents/*.toml`과 `AGENTS.md`의 사용자 변경이 있으며 이를 보존한다. ## 2. Eight-Stage Worklist @@ -24,7 +24,7 @@ | 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | strong/weak form, kinematics, tangent/residual, integration, state/recovery가 구현 가능한 계약이며 O-ROT/O-MAP/O-DRILL/O-MOM/O-BC가 승인 scope 안에서 해소됨 | Rework attempt 2 owner/Coordinator pass와 사용자 명시 승인: reaction force/generalized moment/spatial moment symbols와 dimensions가 rotation matrix `R_I`와 분리됨; immutable fixed-global source, `rho_M <= 1e-12` admissibility, exact projected physical-work covector, `DP`/`DJ_l`/map-Hessian residual-tangent identity가 §§4.4/5/11.2–11.3/13.1/13.4/17에서 일치함; 18 sections와 7 closures 보존; SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`. | 없음 | 2 | | 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | 두 문서가 함께 `pass-for-io-definition`이며 수치 안정성과 exact reference contract가 준비됨 | Corrected owner return, Coordinator audit pass and user explicit approval: status `pass-for-io-definition`; approved formulation hash matched; shellNL/shell artifacts inspected read-only with row counts `49/49/288`, duplicate required wide keys 0 and nonfinite required values 0; stress CSVs are optional read-only inspection/order evidence only; `RM3` excluded; required external comparison uses displacement, reaction force and physical spatial `RM1/RM2`; exact prechecks and `docs/TOLERANCE.md` policy retained. Current hashes: numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`, reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`. | 없음 | 2 | | 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | Abaqus subset, semantic mapping, HDF5 schema, diagnostics, CSV projection이 승인됨 | Bounded rework owner status `ready-for-coordinator-review`, SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`; Coordinator audit passed and user explicitly approved the same hash. REWORK-002 defects are corrected: every argv token containing literal `--output` fails pre-input/pre-log/pre-output with one `cli-usage` diagnostic; `nsnr-log-v1` uses UTF-8 no BOM/LF/TAB fixed fields with four-channel gates, typed thresholds, branch identity, early-failure `not-evaluated(reason)`, round-trip numerics and escaping; log open/write/flush/close is fail-closed with zero-byte non-Newton success logs; exact `VARIABLE=PRESELECT` output requests are ignored-with-warning; lexical path/stem derivation, single-writer/candidate collision rules, HDF5 schema v1, reference projection, stress/RM3 exclusions and `docs/TOLERANCE.md` policy are preserved. | 없음 | 2 | -| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `in-progress` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md`; `docs/nonlinear-static-newton-raphson/corrections.md` | 상세 인터뷰와 계획 승인 후 TDD, MSVC/x64/Debug CMake/CTest, blocking reference comparison이 통과함 | REWORK-004 Correction Agent returned `corrected-for-implementation-rerun`; `scripts/execute.py` now invokes `codex exec --disable unified_exec --json ...`, `tests/test_execute.py` asserts adjacent `("--disable", "unified_exec")` while preserving `gpt-5.6-terra`/`xhigh`, and `corrections.md` SHA-256 is `82572437689B41323B6533C2361F2F12BF07B5ED305825AA84C56AEEDC729930`. Owner/root evidence: RED targeted missing-pair assertion exit 1, GREEN targeted 1 passed, focused `tests/test_execute.py` 10/10, full pytest 23 passed/1 pre-existing `xhigh` vs `extra high`, MSVC Debug build exit 0, discovery 214, full CTest 214/214. | Stage 6 implementation evidence docs still absent; await no-push Harness rerun | 10 | +| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `in-progress` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md`; `docs/nonlinear-static-newton-raphson/corrections.md` | 상세 인터뷰와 계획 승인 후 TDD, MSVC/x64/Debug CMake/CTest, blocking reference comparison이 통과함 | REWORK-006 Correction returned `corrected-for-implementation-rerun`; `corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`. Evidence: nested `workspace-write` launched from VsDevCmd x64 plus dependency env; Ninja/Debug/MSVC Hostx64-x64 configure/build/discovery/full CTest all exit 0; 228 discovered/228 passed; Stop-hook `codex exec` exit 0; focused contract test 1/1; full Python 24 passed plus one pre-existing `xhigh`/`extra high` mismatch; reference hashes unchanged; top phase and Step 1 reset to `pending` only after pass, Step 2 remains pending. | Stage 6 implementation evidence docs still absent; no-push Harness rerun from Step 1 is authorized | 14 | | 7. Physics evaluation | `physics-evaluation-agent` | `pending` | `docs/nonlinear-static-newton-raphson/physics-evaluation.md` | equilibrium, reaction, direction, path/history, energy, symmetry, model coverage가 `pass-for-release-agent`임 | 없음 | Stage 6 passing evidence 필요 | 0 | | 8. Release readiness | `release-agent` | `pending` | `docs/nonlinear-static-newton-raphson/release.md` | `ready-for-release` recommendation과 acceptance traceability가 완전함 | 없음 | Stage 7 passing evidence 필요 | 0 | @@ -33,55 +33,46 @@ ### Active Dispatch Package - feature_id: `nonlinear-static-newton-raphson` -- current_dispatch: `stage-6-no-push-harness-implementation-rerun` +- current_dispatch: `stage-6-step1-no-push-harness-rerun` - target_sub_agent: `implementation-agent` via Harness Executor (`python scripts/execute.py nonlinear-static-newton-raphson`; root launch required) - required_inputs: - - User explicit execution request on `2026-08-24`: `Harness/Implementation를 실행해주세요.` - - Attempt 1 failure evidence: no-push Harness command `python scripts/execute.py nonlinear-static-newton-raphson`; `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no Step 0 source/test edits, no `step0-output.json`, no `MAX_RETRIES` handling. - - Bounded Harness repair evidence: Implementation Agent changed only `scripts/execute.py` and `tests/test_execute.py`; TDD RED 3 expected failures, GREEN 3 passed; focused `tests/test_execute.py` 10/10 passed; full pytest 23 passed/1 pre-existing HEAD contract failure `xhigh` actual vs `extra high` expected. - - Repair behavior now required: Codex timeout returns structured exit `124` and reaches `MAX_RETRIES`; runner reads `.codex/agents/implementation-agent.toml` and passes `gpt-5.6-terra` plus `xhigh` settings to `codex exec`. - - Root independent review evidence: no new defect found; focused `tests/test_execute.py` 10/10 reproduced; full suite reproduced the same single pre-existing `xhigh` vs `extra high` mismatch. - - Attempt 2 failure evidence: repaired Executor wrote `phases/nonlinear-static-newton-raphson/step0-output.json` with `exitCode` 124 and stderr `Codex timed out after 1800 seconds.`; stdout shows the Implementation Agent completed a turn but every nested command execution remained `status=in_progress`. - - Runtime blocker evidence: nested commands hung for skill file reads, `Get-Date`, `cmd.exe /d /c echo test`, and `exit 0`; root classifies the cause as nested Codex Windows shell tool execution hang, not model delay, build, source, sandbox/auth, or the repaired Executor timeout/no-retry path. - - Active process evidence from root: Executor auto-started another internal retry at `2026-08-24T02:58:35+09:00` under `python execute.py` PID 13820 / `codex` PID 7704; root terminated those unauthorized retry PIDs and verified none remain. - - Root decision after blocked-no-auto-retry: authorize one bounded Correction Agent diagnostic/rework cycle because the repeated implementation failure is infrastructure/runtime, not physics/source/build. - - Correction Agent return: status `blocked`, output `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `C9F93AC99225725C88BB7F0BABC8F7D75D3E05082070090328203DB3776BEFE6`, no runner/test edits from correction, no safe documented CLI flag workaround proven. - - User/root runtime update evidence: standalone Codex CLI updated `0.147.0 -> 0.149.1` under `CODEX_HOME=C:\Users\baram\.codex`; `codex doctor --json` reported current/consistent installation. - - User/root bounded smoke evidence: baseline still fails through inaccessible WindowsApps `pwsh`, direct `codex sandbox` elevated/unelevated `cmd echo` exits 0, and nested smoke passes only when launch env filters `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` plus `C:\Users\baram\AppData\Local\Microsoft\WindowsApps`, aligns `CODEX_HOME`, retains `workspace-write` and hooks, uses implementation-agent `gpt-5.6-terra`/`xhigh`, and passes `--disable unified_exec`; output was exactly `CODEX_SHELL_SMOKE_OK\r\n`. - - REWORK-004 Correction Agent return: status `corrected-for-implementation-rerun`; changed only `scripts/execute.py`, `tests/test_execute.py`, `docs/nonlinear-static-newton-raphson/corrections.md`; no Harness phase, C++ source, CMake, reference solver, commit or push. - - Coordinator audit: current `scripts/execute.py` lines 300-315 pass exact adjacent args `--disable`, `unified_exec` immediately after `codex exec`; current test `test_invoke_codex_uses_implementation_agent_command_contract` asserts the pair while preserving `gpt-5.6-terra` and `model_reasoning_effort="xhigh"`. - - `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.agents/skills/harness/SKILL.md`, `.codex/hooks.json` - - `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `BF4FC7A5CFDEEC19D62A36E1DF7CC34C0B9F614FA0A0FD8D0A321ADC73E69580` - - `phases/index.json` SHA-256 `F8BE89D579C303410BD1D2CD17AF33FCAD72BF68D9E10C3F644A39D1AA7331FB` - - `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `439B67E1DED442D828EB5C31DAB35D28F32DBA6F66537512CAFFB5616956C137` - - Executor-selected initial current Step: `phases/nonlinear-static-newton-raphson/step0.md`, Step 0 `cli-output-lease-and-derived-names`, status `pending` - - Approved Stage 1-5 hashes: requirements `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`; research `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; formulation `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`; numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`; reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`; io `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`. - - Preserved materialization evidence: exactly one pending phase entry, 13/13 pending steps, Step 0 remains pending, no implementation evidence docs yet. + - REWORK-006 Correction return: status `corrected-for-implementation-rerun`, `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`. + - User explicitly approved USER-DECISION-002 option A / DECISION-039: Ninja/MSVC is the accepted Stage 6 validation contract for continuation. + - Current isolated worktree: `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson`; no push. + - Step 0 evidence: completed and committed as feature commit `fc16ef6` plus metadata commit `e7c6932`. + - Current Step 1 state: `pending` with historical `started_at`; existing uncommitted Domain/Abaqus mapping production and C++ test changes are preserved; Step 2..12 remain pending. + - Current hashes: `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`; phase index `D3F30298EB728F4DECA948827900CF35989F47F009872B43DC4BD997B30C3950`. + - Correction files/evidence: tracked `CMakePresets.json` SHA-256 `900EEE9EC564CEA09F2A73B8AC59865A7233E9480FAACD3CFEF60F2ABCDFFD43`; ignored `.harness/config.json` byte-identical to `.harness/config.example.json` SHA-256 `D07429860D472AE37D02D6CD638900FA46175085AF47F179E98601227F8D3C43`; contract test `tests/test_harness_preset_contract.py` SHA-256 `94433B65E155C90837724810A1E773BB990779AFB217268E557AE4E7662B8396`. + - Correction validation: nested `workspace-write`/VsDevCmd x64/dependency env; Ninja/Debug/MSVC Hostx64-x64 configure/build/discovery/full all exit 0; 228 discovered/228 passed; Stop-hook `codex exec` exit 0; focused contract test 1/1; full Python 24 passed plus pre-existing `xhigh`/`extra high` mismatch 1. + - Root independent review: no blocking finding; read AGENTS/ARCHITECTURE/ADR; focused contract test fresh pass 1/1; `cmake --list-presets` exposes only approved preset; `cmake --preset ... -N` exit 0; `git diff --check` pass; local config/build ignored as intended; `git diff -- reference` clean; no old VS/`.harness/build` commands remain in `implementation-plan.md` or `step0.md`..`step12.md`. + - Approved Stage 1-5 hashes remain unchanged: requirements `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`; research `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; formulation `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`; numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`; reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`; io `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`. - expected_outputs: - - Executor-managed no-push phase execution from Step 0, with branch/pending selection/retry/timestamps/commits/advancement owned only by `scripts/execute.py`. - - Each Implementation Agent session performs only its Executor-selected current Step `RED -> observed failure -> minimal GREEN -> VERIFY`, updates only that Step status payload, and stops. - - Final Stage 6 evidence remains `docs/nonlinear-static-newton-raphson/implementation-report.md`, `docs/nonlinear-static-newton-raphson/build-test.md`, and `docs/nonlinear-static-newton-raphson/reference-comparison.md` after the approved phase reaches its final verification Step. -- acceptance_gate: Root is explicitly authorized to run no-push `python scripts/execute.py nonlinear-static-newton-raphson` in the isolated worktree using Codex `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, a child PATH filtered of `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` and `C:\Users\baram\AppData\Local\Microsoft\WindowsApps`, `workspace-write`, hooks retained, implementation-agent `gpt-5.6-terra`/`xhigh`, and no `danger-full-access`. Passing Stage 6 still requires successful Implementation phase execution plus Coordinator audit of `implementation-report.md`, `build-test.md`, `reference-comparison.md`, full MSVC x64 Debug build/CTest, blocking reference comparison and no forbidden reference/upstream/tolerance mutation. -- stop_condition: If nested shell execution hangs or cannot complete under the exact corrected runner and approved launch envelope, stop as `blocked` with the new evidence; do not broaden to `danger-full-access`, do not run Abaqus/Nastran/reference solvers, do not generate/modify reference CSVs, and do not advance Physics/Release. -- missing_evidence: No-push Harness rerun result and Stage 6 implementation evidence docs remain absent. + - Executor-managed no-push Harness rerun beginning at Step 1. Executor owns branch state, pending selection, retries, timestamps, commits and advancement. + - Implementation Agent owns only Executor-selected Step 1 `RED -> observed failure -> minimal GREEN -> VERIFY`, then Step 1 status/summary or blocker payload. + - Final Stage 6 evidence remains `implementation-report.md`, `build-test.md`, and `reference-comparison.md` only after the approved phase reaches final verification. +- acceptance_gate: Root is authorized to rerun no-push `python scripts/execute.py nonlinear-static-newton-raphson` from the isolated worktree, launched from VsDevCmd x64 with `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`, Codex `0.149.1`, aligned `CODEX_HOME`, filtered WindowsApps PATH, `workspace-write`, hooks retained, `gpt-5.6-terra`/`xhigh`, `--disable unified_exec`, Ninja/MSVC presets, and no `danger-full-access`. Passing Stage 6 still requires successful Harness execution, MSVC/x64/Debug full CTest, required reference comparison, and Coordinator audit of implementation evidence docs. +- stop_condition: Stop and report if Step 1 rerun blocks/errors, if the old Visual Studio/FileTracker path recurs, if the nested Codex shell hang recurs, if Ninja/MSVC validation fails, or if any unauthorized `danger-full-access`, push, reference solver/artifact mutation or Step 2 advance is attempted before Step 1 completion. +- missing_evidence: no-push Harness Step 1 rerun result and Stage 6 implementation evidence docs. ### Latest Sub-Agent Return - target_sub_agent: `correction-agent` - output_paths: - `docs/nonlinear-static-newton-raphson/corrections.md` -- status: `corrected-for-implementation-rerun` (owner); Coordinator decision `passed-for-implementation-rerun` +- status: `corrected-for-implementation-rerun` (owner); Coordinator decision `passed` - evidence_summary: - - `corrections.md` SHA-256 is `82572437689B41323B6533C2361F2F12BF07B5ED305825AA84C56AEEDC729930`. - - `scripts/execute.py` SHA-256 is `E36A78E5C0AE7E91361B1AB6B995D2E8CF51569C0E0804D57F54711AFEFFB806`; `tests/test_execute.py` SHA-256 is `1E368382ABA21F5FBAC344E15E1E600B6BDAF4C4528431E4D1A757AA09D54CDE`. - - Runner command contract now starts `codex exec --disable unified_exec --json ...` and still passes `--model gpt-5.6-terra`, `--config model_reasoning_effort="xhigh"`, `--sandbox workspace-write`, `--dangerously-bypass-hook-trust`, `--cd `. - - TDD evidence: targeted RED failed on missing adjacent pair with exit 1; targeted GREEN passed; focused `tests/test_execute.py` 10/10; full pytest remains 23 passed/1 pre-existing `xhigh` vs `extra high`; MSVC Debug build exit 0; CTest discovery 214; full CTest 214/214. - - Correction did not run Harness phase, edit C++/CMake/reference artifacts, run reference solvers, commit or push. + - `corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`. + - Correction expressed DECISION-039 through tracked `CMakePresets.json`, ignored `.harness/config.json`, updated `.harness/config.example.json`, `.gitignore`, `implementation-plan.md`, and `step0.md`..`step12.md`, and added `tests/test_harness_preset_contract.py`; no Harness Python production change was required. + - Nested `workspace-write` with VsDevCmd x64 and dependency environment passed Ninja/Debug/MSVC Hostx64-x64 configure/build/discovery/full CTest, 228 discovered/228 passed, and Stop-hook `codex exec` exit 0. + - Focused contract test passed 1/1; full Python was 24 passed plus one pre-existing `xhigh`/`extra high` mismatch. + - Top phase and Step 1 were reset to `pending` only after blocker-clear evidence; Step 2 remains pending. + - Reference artifact hashes match the approved inventory and `git diff -- reference` is clean. + - Correction did not run Harness phase, Step 2, reference solvers, cleanup, commit, push, or `danger-full-access`. - blockers: - - 없음 for runner-option correction; Stage 6 implementation evidence is still pending. -- self_audit_findings: Coordinator verified the correction report hash, audited current runner args and regression assertion, checked phase index pending statuses, did not run phase/build/tests/reference solvers, and updated only this isolated worktree `coordination.md`. -- return_contract_check: output path, corrected status, evidence summary, blockers and changed-file assertion are present. -- acceptance_evidence_check: REWORK-004 is closed; Stage 6 is eligible for no-push Harness rerun, but no implementation pass evidence exists yet. + - 없음 for REWORK-006; Stage 6 implementation evidence docs remain absent. +- self_audit_findings: Coordinator accepted the Correction return, independently checked hashes, preset/config content, phase pending state, no reference/upstream contract diff, root independent review, and did not run Harness/build/tests/reference solvers. +- return_contract_check: output path, corrected status, evidence summary, blockers, no-change assertion and cleanup evidence are present. +- acceptance_evidence_check: REWORK-006 is closed; no-push Harness rerun from Step 1 is eligible under the approved envelope. ### Compact Migration Evidence @@ -192,10 +183,14 @@ | 2026-08-24 | Correction Agent return and Coordinator audit | `blocked` | Correction Agent returned `blocked` and created only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `C9F93AC99225725C88BB7F0BABC8F7D75D3E05082070090328203DB3776BEFE6`. Baseline smoke reproduced no nested shell completion; `--disable code_mode_host` failed closed; `--enable unified_exec` hung; combined flags failed closed. Root verified no nonlinear Harness/Codex processes remain, all 13 steps pending, Python 23 passed/1 pre-existing failure, MSVC build exit 0, discovery 214 and CTest 214/214. | `blocked` | No further Harness retry until external Codex runtime update/repair plus bounded shell smoke success | | 2026-08-24 | Codex `0.149.1` smoke pass and runner preflight | `needs-rework` | User/root authorized Codex CLI update, bounded smoke and Harness rerun. Smoke passed only with aligned `CODEX_HOME`, filtered WindowsApps PATH entries and `--disable unified_exec`; current `scripts/execute.py` does not pass that flag to nested `codex exec`, while local `codex exec --help` confirms `--disable ` support. | `needs-correction` | Dispatch bounded runner-option correction before any no-push Harness phase rerun | | 2026-08-24 | REWORK-004 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; runner now passes adjacent `--disable`, `unified_exec` after `codex exec`; regression test asserts the command contract; `corrections.md` SHA-256 `82572437689B41323B6533C2361F2F12BF07B5ED305825AA84C56AEEDC729930`; focused tests 10/10, full pytest only known pre-existing mismatch, MSVC build and 214/214 CTest pass per owner/root evidence. | `needs-implementation` | Root is authorized to run no-push `python scripts/execute.py nonlinear-static-newton-raphson` with Codex `0.149.1`, aligned `CODEX_HOME`, filtered child PATH, `workspace-write`, hooks retained and no `danger-full-access` | +| 2026-08-24 | Harness rerun Step 1 safe block | `needs-rework` | No-push Harness rerun under the approved Codex `0.149.1` envelope exited 2 safely, not by nested shell hang. Step 0 completed and committed (`fc16ef6`, metadata `e7c6932`). Step 1 is `blocked` because Visual Studio 18 CMake configure hit MSBuild `FileTracker` `E_ACCESSDENIED` in `workspace-write`; root reports clean Ninja/MSVC build and all 228 CTest cases passed. Top phase hash `E5AB831A326AA361B1C3491DA2DA09AC2CA8D66D9A3BCEE8E771D78C6352EC45`, phase index hash `5CD3B4E2BD50BF03A105CAC645F7F48F5A1360414E085B08C9D75BF6D46317A8`, Step 1 output hash `B04B25E8C2D1E0CD54E712B086623E1741FC563A70F0582FD6DC813F660CD6D7`. | `needs-correction` | Root profile dispatch to bounded `correction-agent` for FileTracker diagnosis under `workspace-write`; `danger-full-access` requires explicit new user approval and is not authorized | +| 2026-08-24 | REWORK-005 FileTracker Correction return and Coordinator audit | `blocked` | Correction returned `blocked` / `needs-user-decision`, changed only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `BCA9DEE6F6F262A70FB5C7A49B2BF06CA3FF8BC6C6838FB20A8B48071CF9D420`. VS18/MSBuild `18.8.2` fails in FESA and gtest at `FileTracker..cctor()` -> `GetLongFilePath` with `E_ACCESSDENIED`; inherited `TEMP`/`TMP` is outside workspace; `/p:TrackFileAccess=false` and `:workspace` echo were not proven; exact process trees were cleaned; Ninja/MSVC 27/27 focused and 228/228 full evidence is preserved but not an approved substitute. | `needs-user-decision` | User must choose A Ninja/MSVC evidence substitution, B isolated `danger-full-access` fallback, or C stop pending external Codex sandbox Temp/FileTracker repair | +| 2026-08-24 | USER-DECISION-002 option A and REWORK-006 dispatch | `in-progress` | User explicitly approved option A: Ninja/MSVC is the accepted Stage 6 validation contract. Coordinator/root audit found `.harness/config.json` ignored/absent, CMake presets absent, and adapter preset triplets sufficient to route Stop hook to Ninja without Harness Python production changes. Root dispatched `correction-agent` for preset/config plumbing, preset-contract RED test, planning/phase command rewrite, blocker-clear evidence, and phase reset only after evidence. | `needs-correction` | Await REWORK-006 Correction return; no Harness rerun, Step 2, `danger-full-access`, push, reference solver or reference artifact change | +| 2026-08-24 | REWORK-006 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; `corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`; Ninja/MSVC Debug configure/build/discovery/full CTest passed with 228/228, Stop-hook `codex exec` exit 0, focused contract test 1/1, full Python 24 passed plus pre-existing `xhigh`/`extra high`; reference hashes unchanged; top phase and Step 1 reset to `pending` only after evidence; root independent review found no blocking issue. | `needs-implementation` | Root is authorized to rerun no-push `python scripts/execute.py nonlinear-static-newton-raphson` from Step 1 under approved Ninja/MSVC workspace-write envelope | -- current_dispatch: `stage-6-no-push-harness-implementation-rerun` +- current_dispatch: `stage-6-step1-no-push-harness-rerun` - current_workflow_state: `needs-implementation` -- next_gate_requires_user_approval: `false` (user/root already authorized Codex update, bounded smoke and Harness rerun) +- next_gate_requires_user_approval: `false` for Step 1 no-push Harness rerun; `true` before any `danger-full-access`, Visual Studio fallback, reference solver, push, or manual Step 2 advancement ## 5. Risk, Blocker, and User-Decision Register @@ -208,6 +203,9 @@ | BLOCKER-002 | harness-runtime | Nested Codex Windows shell tool execution hung inside Implementation/Correction Codex sessions. It is mitigated for the authorized rerun by Codex CLI `0.149.1`, aligned `CODEX_HOME`, filtered WindowsApps PATH entries, smoke success with exact `CODEX_SHELL_SMOKE_OK` output, and REWORK-004 runner retention of `--disable unified_exec`. Reopen only if the same hang recurs under the exact approved envelope. | external Codex runtime / user-root decision | mitigated | | BLOCKER-003 | dispatch-runtime | This Coordinator runtime exposed no callable `spawn_agent` tool, but root successfully performed the required Correction Agent profile dispatch. | coordinator/root tooling | closed | | REWORK-004 | harness | Corrected: `scripts/execute.py` now passes adjacent `--disable`, `unified_exec` immediately after `codex exec`; `tests/test_execute.py` asserts this while preserving terra/xhigh routing; `corrections.md` records RED/GREEN/VERIFY and no Harness phase/source C++/CMake/reference edits. | `correction-agent` | closed | +| REWORK-005 | harness | FileTracker Correction returned `blocked`: VS18/MSBuild `FileTracker` `E_ACCESSDENIED` is classified as environment-owned sandbox/MSBuild interaction; no safe Visual Studio `workspace-write` workaround was proven. User resolved the route by approving option A Ninja/MSVC validation. | `correction-agent` | closed-by-USER-DECISION-002A | +| REWORK-006 | harness | Corrected: approved option A is expressed through tracked `CMakePresets.json`, ignored `.harness/config.json`, preset-based implementation-plan/step verification commands, RED-first contract test, workspace-write Ninja/MSVC blocker-clear evidence, and blocked-to-pending phase reset only after pass. | `correction-agent` | closed | +| USER-DECISION-002 | user decision | User explicitly chose option A: approve Ninja/MSVC evidence contract for Stage 6 continuation. Option B `danger-full-access` and option C external sandbox wait are not selected. | user via Coordinator | closed | | RISK-001 | architecture | 기존 `LinearStaticAnalysis` private lifecycle은 단일 factorization/substitution과 final frame만 소유하므로 nonlinear increment/iteration/state commit을 삽입하면 ADR 경계를 위반한다. | `coordinator-agent` routing | open | | RISK-002 | scope | `Newton–Raphson`은 solution algorithm이고 geometric/material/contact nonlinearity 범위를 단독으로 결정하지 않는다. | `requirement-agent` | mitigated by DECISION-001 | | RISK-003 | contract | 현재 `Element`는 displacement-dependent residual/consistent tangent/trial state 계약이 없고 `AnalysisState`는 nonlinear history를 소유하지 않는다. | downstream formulation/architecture gates | open | @@ -251,15 +249,16 @@ | DECISION-036 | user approval | User explicitly approved the Stage 6 Implementation Planning 13-Step draft on `2026-08-24` and authorized creation of `implementation-plan.md` plus pending Harness phase files. | user via Coordinator | closed | | DECISION-037 | user approval | User explicitly requested no-push Harness/Implementation execution for materialized phase `nonlinear-static-newton-raphson` on `2026-08-24`. | user via Coordinator | closed | | DECISION-038 | user/root runtime approval | User/root authorized Codex CLI update, shell smoke and no-push Harness rerun. Accepted runtime envelope is Codex CLI `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, launch-env-only WindowsApps PATH filtering, `workspace-write`, hooks retained, implementation-agent `gpt-5.6-terra`/`xhigh`, no `danger-full-access`, and `--disable unified_exec`. | user/root via Coordinator | closed | +| DECISION-039 | user decision | Stage 6 FileTracker blocker route: user approved option A, making Ninja/MSVC x64 Debug with full CTest the accepted validation contract for continuation. `danger-full-access`, Visual Studio fallback, reference solver activity, push and Step 2 advancement remain unauthorized. | user via Coordinator | closed | | USER-DECISION-001 | user decision | Stage 6 Implementation Planning draft Steps `0..12` were approved on `2026-08-24`; materialization is authorized for `implementation-planning-agent`. | user via Coordinator | closed | ## 6. Rework-Loop Control and Stop Condition -- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-nested-codex-windows-shell-tool-execution-hang`: 2 +- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-nested-codex-windows-shell-tool-execution-hang`: 2; `harness-msbuild-filetracker-eaccessdenied-workspace-write`: 2 - automatic_rework_limit: 동일 normalized failure classification `2`회 - correction_agent_policy: 명확한 implementation failure는 먼저 `implementation-agent`에 반환하고, 반복되거나 원인이 불명확할 때만 `correction-agent`를 dispatch한다. - stop_condition: 동일 classification이 두 번이면 자동 rework를 중단하고 workflow를 `needs-user-decision` 또는 `blocked`로 전환한다. -- correction_cycle_authorization: Root-authorized REWORK-004 correction returned `corrected-for-implementation-rerun`; no further correction is active. If the same nested shell hang recurs under the exact corrected runner and approved launch envelope, stop as `blocked` rather than broadening privileges. +- correction_cycle_authorization: REWORK-006 is closed and no correction dispatch is active. Step 1 no-push Harness rerun is authorized under the approved Ninja/MSVC workspace-write envelope; no Step 2 advancement, push, `danger-full-access`, Visual Studio fallback, or reference solver/artifact action is authorized outside Executor-owned progression. ## 7. Final Workflow Closure @@ -269,11 +268,11 @@ ## 8. No-Change Assertion -- source_code: production solver source 변경 없음; earlier Harness repair and REWORK-004 owners modified only `scripts/execute.py` within runner scope. -- tests: production C++ tests 변경 없음; earlier Harness repair and REWORK-004 owners modified only `tests/test_execute.py` within Harness Python test scope. -- CMake: 변경 없음 +- source_code: Step 1 Implementation Agent left uncommitted production changes in `include/fesa/model/domain.h`, `include/fesa/model/model_types.h`, `src/fesa/io/abaqus/domain_mapping_context.cpp`, and `src/fesa/model/domain.cpp`; Coordinator did not edit source code. +- tests: Step 1 Implementation Agent left uncommitted C++ test changes in `tests/unit/io/abaqus/domain_mapper_test.cpp`, `tests/unit/io/abaqus/domain_mapping_components_test.cpp`, `tests/unit/model/domain_test.cpp`, and `tests/unit/model/model_types_test.cpp`; Coordinator did not edit tests. +- CMake: `CMakeLists.txt` 변경 없음; REWORK-006 Correction added tracked `CMakePresets.json` for DECISION-039 Ninja/MSVC validation; Coordinator did not edit CMake configuration. - reference_artifacts: 생성·수정·rename 없음 - tolerance_policies: 변경 없음 -- phase_files: user-approved planning owner가 `phases/index.json` pending entry와 `phases/nonlinear-static-newton-raphson/index.json`, `step0.md`..`step12.md`를 materialize함; Executor attempt 2 generated `phases/nonlinear-static-newton-raphson/step0-output.json`; Step 0 remains pending and Coordinator did not edit phase files. -- Harness: Implementation Agent bounded repair와 REWORK-004는 `scripts/execute.py`와 `tests/test_execute.py`에 한정됨; REWORK-004 did not run nonlinear Harness phase, commit or push. Coordinator did not run Harness/phase/build/test; root no-push rerun is now authorized under the approved corrected envelope. -- feature_documents: 이번 coordinator update에서는 isolated worktree의 `coordination.md`만 갱신함; Correction Agent가 `docs/nonlinear-static-newton-raphson/corrections.md`를 갱신했고 `implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않음 +- phase_files: Executor/Correction updated `phases/index.json` and `phases/nonlinear-static-newton-raphson/index.json`; Step 0 is completed and committed, Step 1 is reset to `pending` after REWORK-006 blocker-clear evidence, and Steps 2..12 are pending. Coordinator did not edit phase files. +- Harness: REWORK-006 Correction updated `.gitignore`, `.harness/config.example.json`, and created ignored `.harness/config.json` for Ninja/MSVC preset selection; no Harness Python production change was required. Coordinator did not run Harness/phase/build/test, advance Step 2, use `danger-full-access`, clean build outputs, commit or push. +- feature_documents: REWORK-006 Correction updated `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81` and `implementation-plan.md`; this coordinator update changed only isolated `coordination.md`; `implementation-report.md`, `build-test.md`, `reference-comparison.md` are still absent. diff --git a/docs/nonlinear-static-newton-raphson/corrections.md b/docs/nonlinear-static-newton-raphson/corrections.md index 73c8e5a..58d6ddb 100644 --- a/docs/nonlinear-static-newton-raphson/corrections.md +++ b/docs/nonlinear-static-newton-raphson/corrections.md @@ -5,15 +5,15 @@ | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `docs/nonlinear-static-newton-raphson/coordination.md`; `phases/nonlinear-static-newton-raphson/step0-output.json` | +| source failure report | `docs/nonlinear-static-newton-raphson/coordination.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/implementation-plan.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`을 source failure report로 사용했다. +`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이며, current REWORK-004 status와 증거는 Sections 7-9가 supersede한다. +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한다. ## 2. Failure Triage @@ -129,3 +129,192 @@ Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_ar | requirement id | task id | test id | corrected files | acceptance criterion | | --- | --- | --- | --- | --- | | `FESA-REQ-NSNR-083` | Harness runner correction `REWORK-004`; blocks Step 0 `cli-output-lease-and-derived-names` | `test_invoke_codex_uses_implementation_agent_command_contract` | `scripts/execute.py`; `tests/test_execute.py` | nested Codex argv가 adjacent `--disable`, `unified_exec`를 포함하면서 Terra/xhigh routing을 보존함; passed | + +## 10. FileTracker Workspace-Write Diagnosis + +### 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/coordination.md` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step1.md` | +| status | `blocked` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +### 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 단계가 실패했다. + +### 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` + +### 10.4 Correction Scope + +- changed report files: `docs/nonlinear-static-newton-raphson/corrections.md` +- changed source/header/test/CMake/runner files: 없음 +- preserved dirty Step 1 files: `include/fesa/model/domain.h`, `include/fesa/model/model_types.h`, `src/fesa/io/abaqus/domain_mapping_context.cpp`, `src/fesa/model/domain.cpp`와 관련 unit tests +- preserved workflow files: `docs/nonlinear-static-newton-raphson/coordination.md`, `phases/index.json`, `phases/nonlinear-static-newton-raphson/index.json` +- excluded files: C++/CMake, phase definition/index, coordination, runner, upstream contracts, reference/tolerance artifacts +- prohibited actions not performed: Harness phase rerun, Step 2, build cleanup/deletion, Abaqus/Nastran/reference solver, `danger-full-access`, commit, push + +### 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`는 지시대로 실행하거나 시험하지 않았다. + +### 10.6 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | Step 1 `nonlinear-static-domain-contract`; FileTracker correction attempt 1 | `CORR-HARNESS-FILETRACKER-001` | `cmake --build .harness/build --config Debug` | report only | approved `workspace-write`에서 Visual Studio 18/MSBuild build completion; not met | +| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-FILETRACKER-002` | same build with `/p:TrackFileAccess=false` | 없음 | vendor-defined property가 FileTracker denial을 제거하고 build를 완료함; completion evidence 없음 | + +### 10.7 Handoff Recommendation + +- recommendation: `needs-user-decision`; Coordinator Agent에 `blocked` 반환. +- safe automatic correction: 없음. Runner/CMake/Step 1 source를 변경하지 않는다. +- decision option 1: approved implementation plan/phase owner가 Ninja+MSVC를 Visual Studio generator 대체 evidence로 명시적으로 승인한다. 이는 correction-agent 범위 밖의 upstream acceptance 변경이다. +- decision option 2: 사용자가 `docs/HARNESS.md`의 isolated clean-worktree `danger-full-access` fallback을 명시적으로 승인한다. 이번 진단에서는 broader privilege를 사용하거나 시험하지 않았다. +- decision option 3: Codex/Windows sandbox 환경 소유자가 direct `:workspace` launcher와 user Temp long-path access 문제를 수정한 뒤 동일 Visual Studio build를 재검증한다. + +### 10.8 Stop Condition + +- repeated failure: normalized classification attempt `1`; 같은 classification의 두 번째 자동 rework는 아직 수행하지 않았다. +- environment blocker: direct `:workspace` no-op도 bounded completion을 내지 않아 workspace-only workaround를 신뢰성 있게 검증할 수 없다. +- upstream ambiguity: Ninja acceptance 또는 broader sandbox 권한은 사용자/Coordinator 결정이 필요하다. +- reference artifact gap: 없음; reference artifact는 읽기/수정/생성하지 않았다. +- final stop: safe, vendor-supported, contract-preserving `workspace-write` workaround가 입증되지 않아 code change 없이 `blocked`로 중단한다. + +## 11. REWORK-006 Ninja/MSVC Validation Contract Correction + +### 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/coordination.md` USER-DECISION-002 option A / REWORK-006 | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` | +| status | `corrected-for-implementation-rerun` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +### 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가 모두 통과해야 한다. + +### 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 변경은 필요하지 않았다. + +### 11.4 Correction Scope + +- validation plumbing: `CMakePresets.json`, `.harness/config.example.json`, `.gitignore`, ignored local `.harness/config.json`, `tests/test_harness_preset_contract.py` +- approved validation commands: `docs/nonlinear-static-newton-raphson/implementation-plan.md`, `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` +- report/status: `docs/nonlinear-static-newton-raphson/corrections.md`, `phases/nonlinear-static-newton-raphson/index.json`; top `phases/index.json`은 blocked payload 제거 후 HEAD와 같은 `pending` 의미로 복원됨 +- generated/ignored build output: `.harness/build-ninja-msvc-debug/`; 삭제하거나 cleanup하지 않았다. +- production Harness Python, runner, C++, CMakeLists, upstream physics/I/O/reference/tolerance contract: 변경 없음 +- preserved others' dirty files: Step 1 C++/unit tests와 Coordinator-owned `coordination.md`를 되돌리거나 덮어쓰지 않았다. + +### 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. + +### 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 +``` + +`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는 실행하지 않았다. + +### 11.7 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | `REWORK-006`; Steps 0..12 validation contract | `CORR-HARNESS-PRESET-001` | Visual Studio/MSBuild build | `CMakePresets.json`; `.harness/config.example.json`; `.gitignore`; `tests/test_harness_preset_contract.py` | tracked Ninja/MSVC preset and Harness plan select MSVC/x64/Debug under `workspace-write` | +| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-PRESET-VERIFY-001` | preset configure/build/discovery/full CTest | implementation plan and `step0.md`..`step12.md` | nested env preflight plus 228/228 CTest pass | + +### 11.8 Handoff Recommendation And Stop Condition + +- recommendation: Coordinator를 통해 Implementation Agent에 Step 1 no-push rerun을 요청한다; Step 2로 advance하지 않는다. +- phase state after evidence: top phase `pending`; Step 1 `pending`, historical `started_at` 보존; `blocked_reason`과 `blocked_at`만 제거; Steps 2..12 remain `pending`. +- 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. diff --git a/docs/nonlinear-static-newton-raphson/implementation-plan.md b/docs/nonlinear-static-newton-raphson/implementation-plan.md index fa1c14b..5463299 100644 --- a/docs/nonlinear-static-newton-raphson/implementation-plan.md +++ b/docs/nonlinear-static-newton-raphson/implementation-plan.md @@ -43,7 +43,7 @@ - Missing decisions: none. - Missing required comparison files: none for declared blocking/reference families. - Planning can proceed: yes. -- `.harness/config.json`: absent during planning inspection. Each Step must recheck at execution time and use it first if it appears. +- `CMakePresets.json` tracks the approved `windows-msvc-ninja-debug` contract. The ignored `.harness/config.json` selects the matching configure/build/test presets and `.harness/build-ninja-msvc-debug` binary directory. ## Global Constraints @@ -56,6 +56,7 @@ - Implementation and Harness execution remain unauthorized by this materialized plan until the user separately requests Executor execution. - Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and docs/TOLERANCE.md exactly. - Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For shellNL, preserve constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` blocking, and exclude `RM3` plus stress from numeric comparison. +- Launch every Harness process from VsDevCmd with `-arch=x64 -host_arch=x64` and inherit `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. The tracked preset selects Ninja and MSVC Debug without hard-coding machine-local dependency paths. ## Repository Seam Map @@ -113,19 +114,15 @@ - Add C++ sources to `src/fesa/CMakeLists.txt` under existing `fesa_solver`. - Add unit tests to `fesa_unit_tests`, integration tests to `fesa_integration_tests`, reference tests to `fesa_reference_tests`. -- Preserve current executable-wide labels. Use focused regex such as `ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`. +- Preserve current executable-wide labels. Use focused regex such as `ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`. - If scoped per-test labels are introduced, the Step that introduces the mechanism must test it and avoid changing labels for unrelated discovered tests. - Configure/build/test commands: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` ## Data Flow Contract @@ -218,18 +215,15 @@ Step 11 must not run original reference input paths directly. It snapshots exact Each Step must: -1. Recheck `.harness/config.json`. If present, use the configured Harness build/test commands. -2. If absent, use: +1. Use the ignored `.harness/config.json` preset contract and tracked `CMakePresets.json`. +2. Confirm the Harness parent environment was initialized by VsDevCmd x64 and contains `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. +3. Run: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` Focused CTest commands are written explicitly in each `stepN.md`. diff --git a/include/fesa/model/domain.h b/include/fesa/model/domain.h index d86ce24..a338f3b 100644 --- a/include/fesa/model/domain.h +++ b/include/fesa/model/domain.h @@ -74,6 +74,12 @@ class StepDefinition { const DomainCollectionView& ConcentratedLoads() const noexcept; + /// @brief Returns the approved static procedure identity. + StaticProcedureKind ProcedureKind() const noexcept; + + /// @brief Reports whether this step uses the nonlinear static procedure. + bool IsNonlinearStatic() const noexcept; + /// @brief Returns the static initial increment provenance value. double InitialIncrement() const noexcept; @@ -103,6 +109,8 @@ class StepDefinition { std::vector> loads_; LoadView loads_view_; DomainCollectionView concentrated_loads_view_; + StaticProcedureKind procedure_kind_; + bool nlgeom_; double initial_increment_; double time_period_; double minimum_increment_; diff --git a/include/fesa/model/model_types.h b/include/fesa/model/model_types.h index fc8bc22..0f8558b 100644 --- a/include/fesa/model/model_types.h +++ b/include/fesa/model/model_types.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "fesa/core/diagnostic.h" @@ -52,11 +53,59 @@ struct NodalLoad { SourceLocation location; }; -/// @brief Stores the approved single linear-static step definition. +/// @brief Identifies the approved static procedure semantics for one step. +enum class StaticProcedureKind { + kLinearSmallDisplacement, + kNonlinearFullNewton +}; + +/// @brief Stores the approved single static step definition. struct StaticStepDefinition { + /// @brief Creates a static step with its mapped procedure identity. + StaticStepDefinition( + std::string step_name, + std::vector step_boundaries, + std::vector step_loads, + StaticProcedureKind step_procedure_kind, + bool step_nlgeom, + double step_initial_increment, + double step_time_period, + double step_minimum_increment, + double step_maximum_increment, + SourceLocation step_location) + : name{std::move(step_name)}, + boundaries{std::move(step_boundaries)}, + loads{std::move(step_loads)}, + procedure_kind{step_procedure_kind}, + nlgeom{step_nlgeom}, + initial_increment{step_initial_increment}, + time_period{step_time_period}, + minimum_increment{step_minimum_increment}, + maximum_increment{step_maximum_increment}, + location{std::move(step_location)} {} + + /// @brief Creates a legacy linear static step definition. + StaticStepDefinition( + std::string step_name, + std::vector step_boundaries, + std::vector step_loads, + double step_initial_increment, + double step_time_period, + double step_minimum_increment, + double step_maximum_increment, + SourceLocation step_location) + : StaticStepDefinition( + std::move(step_name), std::move(step_boundaries), + std::move(step_loads), + StaticProcedureKind::kLinearSmallDisplacement, false, + step_initial_increment, step_time_period, step_minimum_increment, + step_maximum_increment, std::move(step_location)) {} + std::string name; std::vector boundaries; std::vector loads; + StaticProcedureKind procedure_kind; + bool nlgeom; double initial_increment; double time_period; double minimum_increment; diff --git a/phases/nonlinear-static-newton-raphson/step0.md b/phases/nonlinear-static-newton-raphson/step0.md index 46afd04..470a55c 100644 --- a/phases/nonlinear-static-newton-raphson/step0.md +++ b/phases/nonlinear-static-newton-raphson/step0.md @@ -95,8 +95,8 @@ struct AnalysisRequest { 실행: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure ``` 기대: 새 테스트가 컴파일 실패 또는 assertion 실패로 실패한다. 새 테스트가 예상 없이 통과하면 구현을 중단하고 Coordinator에게 보고한다. @@ -110,18 +110,14 @@ ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --outpu ## VERIFY -실행 전 `Test-Path .harness\config.json`으로 Harness config를 재확인한다. 있으면 그 설정을 우선한다. 없으면 다음 순서로 실행한다. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. Run: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step1.md b/phases/nonlinear-static-newton-raphson/step1.md index b5ecc7a..73f9b0d 100644 --- a/phases/nonlinear-static-newton-raphson/step1.md +++ b/phases/nonlinear-static-newton-raphson/step1.md @@ -95,8 +95,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "Domain|DomainMapping|Abaqus" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops the Step. @@ -111,18 +111,14 @@ Expected: new tests fail. Unexpected pass stops the Step. ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "Domain|DomainMapping|Abaqus" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before using these defaults. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step10.md b/phases/nonlinear-static-newton-raphson/step10.md index b165923..c282519 100644 --- a/phases/nonlinear-static-newton-raphson/step10.md +++ b/phases/nonlinear-static-newton-raphson/step10.md @@ -137,8 +137,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -150,18 +150,14 @@ Refactor current parse/map and linear compute/recovery out of `LinearStaticAnaly ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step11.md b/phases/nonlinear-static-newton-raphson/step11.md index 1bfc07e..7c73004 100644 --- a/phases/nonlinear-static-newton-raphson/step11.md +++ b/phases/nonlinear-static-newton-raphson/step11.md @@ -139,8 +139,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -165,18 +165,14 @@ Use docs/TOLERANCE.md exactly: family scale `S=max(abs(reference))`, near-zero b ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step12.md b/phases/nonlinear-static-newton-raphson/step12.md index cb953e7..f1a00b1 100644 --- a/phases/nonlinear-static-newton-raphson/step12.md +++ b/phases/nonlinear-static-newton-raphson/step12.md @@ -66,18 +66,14 @@ Expected: evidence freshness audit fails before this Step writes docs. If it une ## VERIFY -Recheck `.harness/config.json`. If absent, use: +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. Run: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference" --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference" --output-on-failure git diff --check git status --short ``` diff --git a/phases/nonlinear-static-newton-raphson/step2.md b/phases/nonlinear-static-newton-raphson/step2.md index 8324ed3..6db7f0d 100644 --- a/phases/nonlinear-static-newton-raphson/step2.md +++ b/phases/nonlinear-static-newton-raphson/step2.md @@ -64,8 +64,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FiniteRotation" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure ``` Expected: tests fail because the rotation module does not exist. Unexpected pass stops. @@ -77,18 +77,14 @@ Implement the SO(3) helper functions with finite checks and principal-branch val ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FiniteRotation" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before using default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step3.md b/phases/nonlinear-static-newton-raphson/step3.md index 004bee2..77647fd 100644 --- a/phases/nonlinear-static-newton-raphson/step3.md +++ b/phases/nonlinear-static-newton-raphson/step3.md @@ -87,8 +87,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure ``` Expected: compile or test failure because nonlinear MITC4 files do not exist. Unexpected pass stops. @@ -100,18 +100,14 @@ Implement nonlinear MITC4 creation, kinematics, and recovery using approved 2x2x ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step4.md b/phases/nonlinear-static-newton-raphson/step4.md index d050874..e494133 100644 --- a/phases/nonlinear-static-newton-raphson/step4.md +++ b/phases/nonlinear-static-newton-raphson/step4.md @@ -61,8 +61,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -74,18 +74,14 @@ Implement same-trial internal residual/tangent, exact rotation derivative terms ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step5.md b/phases/nonlinear-static-newton-raphson/step5.md index 1fc2b2e..8bec44c 100644 --- a/phases/nonlinear-static-newton-raphson/step5.md +++ b/phases/nonlinear-static-newton-raphson/step5.md @@ -139,8 +139,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -152,18 +152,14 @@ Implement factor sequence derivation, load/BC scaling, global-once fixed-load ex ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step6.md b/phases/nonlinear-static-newton-raphson/step6.md index 72a8ed9..d96916b 100644 --- a/phases/nonlinear-static-newton-raphson/step6.md +++ b/phases/nonlinear-static-newton-raphson/step6.md @@ -68,8 +68,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "TangentSolver|MklPardiso" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -81,18 +81,14 @@ Implement backend-neutral tangent solver boundary and MKL full-CSR adapter. Fact ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "TangentSolver|MklPardiso" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step7.md b/phases/nonlinear-static-newton-raphson/step7.md index 273b24d..3c53a61 100644 --- a/phases/nonlinear-static-newton-raphson/step7.md +++ b/phases/nonlinear-static-newton-raphson/step7.md @@ -94,8 +94,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NewtonIterationLog" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -107,18 +107,14 @@ Implement a small log writer with explicit open/write/flush/close state, seriali ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NewtonIterationLog" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step8.md b/phases/nonlinear-static-newton-raphson/step8.md index d612d11..f543ae0 100644 --- a/phases/nonlinear-static-newton-raphson/step8.md +++ b/phases/nonlinear-static-newton-raphson/step8.md @@ -130,8 +130,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -143,18 +143,14 @@ Implement `NonlinearAnalysisState::Create` as the only construction seam for a v ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step9.md b/phases/nonlinear-static-newton-raphson/step9.md index 44f224a..6231257 100644 --- a/phases/nonlinear-static-newton-raphson/step9.md +++ b/phases/nonlinear-static-newton-raphson/step9.md @@ -80,8 +80,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -93,18 +93,14 @@ Implement `include/fesa/results/nonlinear_results_writer.h` as the backend-neutr ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/src/fesa/io/abaqus/domain_mapping_context.cpp b/src/fesa/io/abaqus/domain_mapping_context.cpp index c60519e..87984a3 100644 --- a/src/fesa/io/abaqus/domain_mapping_context.cpp +++ b/src/fesa/io/abaqus/domain_mapping_context.cpp @@ -107,6 +107,9 @@ struct RawMaterial { struct RawStep { SourceLocation location; bool has_static{false}; + StaticProcedureKind procedure_kind{ + StaticProcedureKind::kLinearSmallDisplacement}; + bool nlgeom{false}; std::array static_values{}; std::vector boundaries; std::vector loads; @@ -343,6 +346,27 @@ class DomainMappingContext::Impl { return true; } + bool ParseNonlinearStaticDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword) { + if (text.empty()) { + return InputFailure("invalid-nonlinear-static-data", location, keyword, + text, + "A nonlinear STATIC field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (errno == ERANGE || end != text.c_str() + text.size() || + !std::isfinite(parsed)) { + return InputFailure("invalid-nonlinear-static-data", location, keyword, + text, + "All four nonlinear STATIC fields must be finite."); + } + value = parsed; + return true; + } + bool ParseModelDouble(const std::string& text, double& value, const SourceLocation& location, const std::string& keyword, @@ -1367,9 +1391,20 @@ class DomainMappingContext::Impl { void ParseStepStart(const KeywordBlock& block) { if (step_seen_) { - InputFailure("unsupported-multiple-step", block.location, - block.canonical_name, "", - "V0 accepts exactly one analysis step."); + const auto* nlgeom = Parameter(block, "NLGEOM"); + const bool nonlinear_second_step = + nlgeom != nullptr && nlgeom->value && + AsciiCaseInsensitiveEquals(*nlgeom->value, "YES"); + if (step_.nlgeom || nonlinear_second_step) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear static subset accepts exactly one " + "procedure step."); + } else { + InputFailure("unsupported-multiple-step", block.location, + block.canonical_name, "", + "V0 accepts exactly one analysis step."); + } return; } if (!assembly_seen_ || materials_.empty()) { @@ -1382,30 +1417,37 @@ class DomainMappingContext::Impl { !RequireNoData(block)) { return; } - const auto* nlgeom = Parameter(block, "NLGEOM"); - if (nlgeom != nullptr) { - if (!nlgeom->value || nlgeom->value->empty()) { + StaticProcedureKind procedure_kind = + StaticProcedureKind::kLinearSmallDisplacement; + bool nlgeom = false; + const auto* nlgeom_parameter = Parameter(block, "NLGEOM"); + if (nlgeom_parameter != nullptr) { + if (!nlgeom_parameter->value || nlgeom_parameter->value->empty()) { InputFailure("invalid-keyword-parameter", block.location, block.canonical_name, "NLGEOM", - "NLGEOM requires NO in the approved subset."); + "NLGEOM requires YES or NO in the approved subset."); return; } - if (!AsciiCaseInsensitiveEquals(*nlgeom->value, "NO")) { - if (model_element_family_ == ElementFamily::kShell) { - InputFailure("unsupported-nonlinear-geometry", block.location, - block.canonical_name, *nlgeom->value, - "Only absent NLGEOM or NLGEOM=NO is supported."); - } else { - ModelFailure("unsupported-nonlinear-geometry", block.location, - block.canonical_name, *nlgeom->value, - "Only absent NLGEOM or NLGEOM=NO is supported."); + if (AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "YES")) { + if (model_element_family_ != ElementFamily::kShell) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, *nlgeom_parameter->value, + "NLGEOM=YES requires an S4 or S4R shell model."); + return; } + procedure_kind = StaticProcedureKind::kNonlinearFullNewton; + nlgeom = true; + } else if (!AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "NO")) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, *nlgeom_parameter->value, + "NLGEOM must select YES or NO."); return; } } step_seen_ = true; in_step_ = true; - step_ = RawStep{block.location, false, {}, {}, {}}; + step_ = RawStep{block.location, false, procedure_kind, nlgeom, {}, {}, + {}}; step_load_seen_ = false; step_no_op_seen_ = false; } @@ -1485,6 +1527,14 @@ class DomainMappingContext::Impl { ParseOutputChild(block); } else { active_output_ = false; + if (step_.procedure_kind == + StaticProcedureKind::kNonlinearFullNewton && + !step_.has_static) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear step supports only the STATIC procedure."); + return; + } RejectUnknown(block); } } @@ -1493,41 +1543,75 @@ class DomainMappingContext::Impl { if (step_.has_static || !ValidateParameters(block, {}) || block.data.size() != 1U || block.data[0].fields.size() != 4U) { if (!failure_) { - InputFailure("invalid-static-data", block.location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.location, block.canonical_name, "", "STATIC requires exactly one row of four values."); } return; } for (std::size_t field = 0U; field < 4U; ++field) { - if (!ParseDouble(block.data[0].fields[field], step_.static_values[field], - block.data[0].location, block.canonical_name)) { + const std::string& text = block.data[0].fields[field]; + const bool parsed = step_.nlgeom + ? ParseNonlinearStaticDouble( + text, step_.static_values[field], + block.data[0].location, + block.canonical_name) + : ParseDouble(text, step_.static_values[field], + block.data[0].location, + block.canonical_name); + if (!parsed) { return; } if (step_.static_values[field] <= 0.0) { - InputFailure("invalid-static-data", block.data[0].location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.data[0].location, block.canonical_name, "", "All four STATIC fields must be positive."); return; } } if (step_.static_values[2] > step_.static_values[3]) { - InputFailure("invalid-static-data", block.data[0].location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.data[0].location, block.canonical_name, "", "STATIC minimum increment cannot exceed maximum increment."); return; } + if (step_.nlgeom && step_.static_values[1] != 1.0) { + InputFailure("invalid-nonlinear-static-data", block.data[0].location, + block.canonical_name, "", + "The nonlinear STATIC time period must be exactly 1.0."); + return; + } step_.has_static = true; } void ParseOutputRoot(const KeywordBlock& block) { + if (!ValidateParameters(block, {"FIELD", "HISTORY", "VARIABLE"})) { + return; + } const auto* field = Parameter(block, "FIELD"); const auto* history = Parameter(block, "HISTORY"); + const auto* variable = Parameter(block, "VARIABLE"); if ((field == nullptr) == (history == nullptr) || (field != nullptr && field->value) || (history != nullptr && history->value)) { - InputFailure("unsupported-keyword", block.location, block.canonical_name, - "", "OUTPUT must select exactly FIELD or HISTORY."); + InputFailure(step_.nlgeom ? "invalid-keyword-parameter" + : "unsupported-keyword", + block.location, block.canonical_name, "", + "OUTPUT must select exactly FIELD or HISTORY."); + return; + } + if (step_.nlgeom && + (variable == nullptr || !variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) { + InputFailure("invalid-keyword-parameter", block.location, + block.canonical_name, "VARIABLE", + "Nonlinear OUTPUT requires VARIABLE=PRESELECT."); return; } active_output_ = true; @@ -2176,10 +2260,10 @@ class DomainMappingContext::Impl { // Static time-control values are provenance only: V0 creates exactly // the canonical final frame 0 and performs no increment loop here. - definition_.steps.push_back({"Step-1", std::move(boundaries), step_.loads, - step_.static_values[0], step_.static_values[1], - step_.static_values[2], step_.static_values[3], - step_.location}); + definition_.steps.push_back( + {"Step-1", std::move(boundaries), step_.loads, step_.procedure_kind, + step_.nlgeom, step_.static_values[0], step_.static_values[1], + step_.static_values[2], step_.static_values[3], step_.location}); } const ParsedInput& input_; diff --git a/src/fesa/model/domain.cpp b/src/fesa/model/domain.cpp index 60f2c5a..b9d97f1 100644 --- a/src/fesa/model/domain.cpp +++ b/src/fesa/model/domain.cpp @@ -9,6 +9,8 @@ namespace fesa { StepDefinition::StepDefinition(StaticStepDefinition definition) : name_{std::move(definition.name)}, + procedure_kind_{definition.procedure_kind}, + nlgeom_{definition.nlgeom}, initial_increment_{definition.initial_increment}, time_period_{definition.time_period}, minimum_increment_{definition.minimum_increment}, @@ -60,6 +62,14 @@ StepDefinition::ConcentratedLoads() const noexcept { return concentrated_loads_view_; } +StaticProcedureKind StepDefinition::ProcedureKind() const noexcept { + return procedure_kind_; +} + +bool StepDefinition::IsNonlinearStatic() const noexcept { + return procedure_kind_ == StaticProcedureKind::kNonlinearFullNewton; +} + double StepDefinition::InitialIncrement() const noexcept { return initial_increment_; } diff --git a/tests/test_harness_preset_contract.py b/tests/test_harness_preset_contract.py new file mode 100644 index 0000000..185fda8 --- /dev/null +++ b/tests/test_harness_preset_contract.py @@ -0,0 +1,80 @@ +import json +from pathlib import Path +import sys + + +ROOT = Path(__file__).resolve().parents[1] +SCRIPTS = ROOT / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +from msvc_harness.adapters.cmake import CMakeAdapter +from msvc_harness.config import load_config +from msvc_harness.models import ProjectKind, ProjectSelection, Toolchain + + +PRESET_NAME = "windows-msvc-ninja-debug" +BINARY_DIR = ".harness/build-ninja-msvc-debug" + + +def test_harness_uses_tracked_ninja_msvc_presets(tmp_path): + presets = json.loads((ROOT / "CMakePresets.json").read_text(encoding="utf-8")) + configure = presets["configurePresets"][0] + assert configure == { + "name": PRESET_NAME, + "displayName": "Windows MSVC x64 Debug (Ninja)", + "generator": "Ninja", + "binaryDir": f"${{sourceDir}}/{BINARY_DIR}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", + "MKL_DIR": "$env{MKL_DIR}", + "TBB_DIR": "$env{TBB_DIR}", + "HDF5_DIR": "$env{HDF5_DIR}", + }, + } + assert presets["buildPresets"] == [ + {"name": PRESET_NAME, "configurePreset": PRESET_NAME} + ] + assert presets["testPresets"] == [ + {"name": PRESET_NAME, "configurePreset": PRESET_NAME} + ] + + example = json.loads( + (ROOT / ".harness" / "config.example.json").read_text(encoding="utf-8") + ) + assert example == { + "version": 1, + "projectType": "cmake", + "cmake": { + "sourceDir": ".", + "binaryDir": BINARY_DIR, + "configurePreset": PRESET_NAME, + "buildPreset": PRESET_NAME, + "testPreset": PRESET_NAME, + }, + } + assert ".harness/build-ninja-msvc-debug/" in ( + ROOT / ".gitignore" + ).read_text(encoding="utf-8").splitlines() + + harness_dir = tmp_path / ".harness" + harness_dir.mkdir() + (harness_dir / "config.json").write_text( + json.dumps(example), encoding="utf-8" + ) + config = load_config(tmp_path) + tools = Toolchain( + installation=tmp_path / "vs", + msbuild=tmp_path / "msbuild.exe", + cmake=tmp_path / "cmake.exe", + ctest=tmp_path / "ctest.exe", + ) + selection = ProjectSelection(ProjectKind.CMAKE, ROOT / "CMakePresets.json") + plan = CMakeAdapter().create_plan(tmp_path, selection, config, tools) + + assert [step.command.argv[1:] for step in plan.steps] == [ + ("--preset", PRESET_NAME), + ("--build", "--preset", PRESET_NAME), + ("--preset", PRESET_NAME, "--show-only=json-v1"), + ("--preset", PRESET_NAME, "--output-on-failure"), + ] diff --git a/tests/unit/io/abaqus/domain_mapper_test.cpp b/tests/unit/io/abaqus/domain_mapper_test.cpp index a022b41..89f0c73 100644 --- a/tests/unit/io/abaqus/domain_mapper_test.cpp +++ b/tests/unit/io/abaqus/domain_mapper_test.cpp @@ -174,6 +174,12 @@ TipSecond, 6, 1. )inp"; } +std::string NonlinearShellDeck() { + return ReplaceOnce( + ReplaceOnce(ShellDeck(), "nlgeom=NO", "nlgeom=YES"), + "0.1, 1., 0.01, 1.", "0.1, 1., 0.001, 0.1"); +} + std::string SupportedInventoryDeck(bool include_no_ops) { const std::string preprint = include_no_ops ? "*Preprint, echo=NO, model=NO, history=NO, contact=NO\n" @@ -570,6 +576,142 @@ TEST(InpDomainMapping, NoOpAllowlistWarnsWithoutSemanticEffect) { plain.Value().Steps()[0].Loads().size()); } +// NSNR-IO-001, NSNR-IO-005, NSNR-IO-007 +TEST(InpDomainMapping, MapsNonlinearStaticShellProcedureAndRawControls) { + auto result = MapText("nonlinear-static-shell", NonlinearShellDeck()); + + ASSERT_TRUE(result.HasValue()); + const fesa::Domain& domain = result.Value(); + ASSERT_EQ(domain.Steps().Size(), 1U); + const auto& step = domain.Steps()[0U]; + EXPECT_EQ(step.ProcedureKind(), + fesa::StaticProcedureKind::kNonlinearFullNewton); + EXPECT_TRUE(step.IsNonlinearStatic()); + EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1); + EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0); + EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001); + EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1); + EXPECT_TRUE(domain.BeamElements().Empty()); + ASSERT_EQ(domain.ShellElements().Size(), 4U); + EXPECT_EQ(domain.ShellElements()[0U].source_type, + fesa::ShellSourceElementType::kS4); + EXPECT_EQ(domain.ShellElements()[1U].source_type, + fesa::ShellSourceElementType::kS4r); +} + +// NSNR-IO-002, NSNR-IO-003 +TEST(InpDomainMapping, KeepsExplicitAndImplicitLinearStaticProcedures) { + const std::vector decks{ + ShellDeck(), ReplaceOnce(ShellDeck(), ", nlgeom=NO", "")}; + + for (std::size_t index = 0U; index < decks.size(); ++index) { + SCOPED_TRACE(index); + auto result = MapText("linear-static-procedure-" + std::to_string(index), + decks[index]); + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().Steps().Size(), 1U); + EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()); + } +} + +// NSNR-IO-004 +TEST(InpDomainMapping, RejectsInvalidNonlinearStaticControlValues) { + struct InvalidCase { + std::string name; + std::string controls; + }; + const std::vector cases{ + {"zero", "0., 1., 0.001, 0.1"}, + {"nonfinite", "nan, 1., 0.001, 0.1"}, + {"nonunit-period", "0.1, 0.5, 0.001, 0.1"}, + {"reversed-bounds", "0.1, 1., 0.2, 0.1"}}; + + for (const auto& test_case : cases) { + SCOPED_TRACE(test_case.name); + auto result = MapText( + "invalid-nonlinear-static-" + test_case.name, + ReplaceOnce(NonlinearShellDeck(), "0.1, 1., 0.001, 0.1", + test_case.controls)); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "invalid-nonlinear-static-data"), + nullptr); + } +} + +// NSNR-IO-006, NSNR-IO-008 +TEST(InpDomainMapping, RejectsUnsupportedNonlinearProceduresAndMixedModels) { + const std::string nonlinear = NonlinearShellDeck(); + const std::vector> procedure_cases{ + {"dynamic", + ReplaceOnce(nonlinear, "*Static\n0.1, 1., 0.001, 0.1", + "*Dynamic\n0.1, 1., 0.001, 0.1")}, + {"mixed-steps", + nonlinear + "*Step, name=Linear, nlgeom=NO\n*Static\n0.1, 1., 0.01, " + "1.\n*End Step\n"}, + {"beam-nlgeom", + ReplaceOnce(MinimalDeck(), "nlgeom=NO", "nlgeom=YES")}}; + + for (const auto& test_case : procedure_cases) { + SCOPED_TRACE(test_case.first); + auto result = MapText("unsupported-nonlinear-" + test_case.first, + test_case.second); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "unsupported-analysis-procedure"), + nullptr); + } + + const std::string mixed_model = ReplaceOnce( + nonlinear, "0020, 2, 5, 6, 3\n*Elset", + "0020, 2, 5, 6, 3\n*Element, type=B33\n30, 1, 2\n*Elset"); + auto mixed_result = MapText("mixed-nonlinear-model", mixed_model); + ASSERT_FALSE(mixed_result.HasValue()); + EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), + "unsupported-mixed-element-model"), + nullptr); +} + +// NSNR-IO-009, NSNR-IO-010, NSNR-IO-011 +TEST(InpDomainMapping, AcceptsOnlyNonlinearPreselectOutputNoOps) { + auto plain = MapText("nonlinear-output-plain", NonlinearShellDeck()); + ASSERT_TRUE(plain.HasValue()); + + for (const std::string_view request : {"field", "history"}) { + const std::string deck = ReplaceOnce( + NonlinearShellDeck(), "*End Step\n", + "*Output, " + std::string{request} + ", variable=PRESELECT\n*End Step\n"); + auto result = MapText("nonlinear-output-" + std::string{request}, deck); + ASSERT_TRUE(result.HasValue()); + EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()); + EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()); + EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), + plain.Value().Steps()[0U].BoundaryConditions().size()); + EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), + plain.Value().Steps()[0U].Loads().size()); + ASSERT_EQ(result.Value().Warnings().size(), 1U); + EXPECT_EQ(result.Value().Warnings()[0U].keyword, "OUTPUT"); + } + + const std::vector malformed_requests{ + "*Output, field\n", "*Output, field, history, variable=PRESELECT\n", + "*Output, field, variable=ALL\n"}; + for (std::size_t index = 0U; index < malformed_requests.size(); ++index) { + SCOPED_TRACE(index); + auto result = MapText( + "malformed-nonlinear-output-" + std::to_string(index), + ReplaceOnce(NonlinearShellDeck(), "*End Step\n", + malformed_requests[index] + "*End Step\n")); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "invalid-keyword-parameter"), + nullptr); + } +} + // MITC4-MAP-001 // C-MODEL-002 TEST(InpDomainMapping, MapsS4AndS4rThroughOneMitc4Identity) { @@ -738,8 +880,6 @@ TEST(InpDomainMapping, const std::vector cases{ {"second-step", base + "*Step\n*Static\n1., 1., 1., 1.\n*End Step\n", "unsupported-multiple-step"}, - {"nonlinear-step", ReplaceOnce(base, "nlgeom=NO", "nlgeom=YES"), - "unsupported-nonlinear-geometry"}, {"other-procedure", ReplaceOnce(base, "*Static\n0.1, 1., 0.01, 1.", "*Dynamic\n0.1, 1., 0.01, 1."), @@ -898,7 +1038,7 @@ TEST(InpDomainMapping, RejectsUnsupportedAndInvalidPortfolio) { {"malformed-node-arity", ReplaceOnce(base, "1, 0., 0., 0.", "1, 0., 0."), "invalid-data-arity", fesa::FailureCategory::kInput}, {"nlgeom", ReplaceOnce(base, "nlgeom=NO", "nlgeom=YES"), - "unsupported-nonlinear-geometry", fesa::FailureCategory::kModel}, + "unsupported-analysis-procedure", fesa::FailureCategory::kInput}, {"unknown-keyword", ReplaceOnce(base, "*Assembly, name=Assembly", "*Density\n1.\n*Assembly, name=Assembly"), diff --git a/tests/unit/io/abaqus/domain_mapping_components_test.cpp b/tests/unit/io/abaqus/domain_mapping_components_test.cpp index b9ffbde..3524551 100644 --- a/tests/unit/io/abaqus/domain_mapping_components_test.cpp +++ b/tests/unit/io/abaqus/domain_mapping_components_test.cpp @@ -150,6 +150,9 @@ TEST(DomainMappingComponents, EXPECT_EQ(domain.Materials().Size(), 1U); EXPECT_EQ(domain.Properties().Size(), 1U); ASSERT_EQ(domain.Steps().Size(), 1U); + EXPECT_EQ(domain.Steps()[0].ProcedureKind(), + StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()); EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U); EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U); ASSERT_EQ(domain.Warnings().size(), 3U); diff --git a/tests/unit/model/domain_test.cpp b/tests/unit/model/domain_test.cpp index f4c79e5..93425f4 100644 --- a/tests/unit/model/domain_test.cpp +++ b/tests/unit/model/domain_test.cpp @@ -49,6 +49,8 @@ fesa::ModelDefinition MakeOwnedDefinition() { definition.steps = {{"Step-1", {{"Root", 1, 6, 0.0, {"models/owned.inp", 60U}}}, {{"Tip", 3, -1000.0, {"models/owned.inp", 61U}}}, + fesa::StaticProcedureKind::kLinearSmallDisplacement, + false, 0.1, 1.0, 1.0e-5, @@ -197,6 +199,9 @@ TEST(DomainModel, ImmutableOwnershipPreservesStableOrder) { EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0); EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5); EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0); + EXPECT_EQ(domain.Steps()[0].ProcedureKind(), + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()); ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U); ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U); ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U); diff --git a/tests/unit/model/model_types_test.cpp b/tests/unit/model/model_types_test.cpp index 994cb4c..0237d69 100644 --- a/tests/unit/model/model_types_test.cpp +++ b/tests/unit/model/model_types_test.cpp @@ -70,8 +70,9 @@ TEST(DomainModel, SourceAndInternalIdentityRemainDistinct) { "Root", 1, 6, 0.0, {"models/beam.inp", 60U}}; const fesa::NodalLoad load{"Tip", 3, -1000.0, {"models/beam.inp", 70U}}; const fesa::StaticStepDefinition step{ - "Step-1", {boundary}, {load}, 0.1, - 1.0, 1.0e-5, 1.0, {"models/beam.inp", 50U}}; + "Step-1", {boundary}, {load}, + fesa::StaticProcedureKind::kLinearSmallDisplacement, false, 0.1, + 1.0, 1.0e-5, 1.0, {"models/beam.inp", 50U}}; const fesa::NodeSet node_set{ "Root", std::string{"Instance-A"}, {5U}, {"models/beam.inp", 25U}}; const fesa::ElementSet element_set{ @@ -118,6 +119,9 @@ TEST(DomainModel, SourceAndInternalIdentityRemainDistinct) { EXPECT_EQ(definition.steps[0].time_period, 1.0); EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5); EXPECT_EQ(definition.steps[0].maximum_increment, 1.0); + EXPECT_EQ(definition.steps[0].procedure_kind, + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(definition.steps[0].nlgeom); ASSERT_EQ(definition.warnings.size(), 1U); EXPECT_EQ(definition.warnings[0].location.line, 75U);