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

This commit is contained in:
KOKO\Mimi
2026-08-28 09:22:33 +09:00
parent 65b56b1755
commit 6dbf1b2bcf
30 changed files with 13122 additions and 728 deletions
@@ -6,25 +6,25 @@
- workflow_state: `needs-implementation`
- owner_agent: `coordinator-agent`
- request_date: `2026-08-18`
- last_updated: `2026-08-24` (REWORK-006 passed; Step 1 no-push Harness rerun authorized)
- last_updated: `2026-08-28` (REWORK-009 passed; bounded Step 11 all-WindowsApps-filter rerun package prepared)
- 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: 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.
- current_goal: Run one bounded Step `11` only no-push Harness/Implementation rerun after REWORK-009 proved the all-WindowsApps PATH filter; Step `12`, push, reference mutation, `danger-full-access`, `fesa.env` and runtime/product configuration remain forbidden.
- constraints: 승인된 physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel, thresholds `1e-2`/typed absolute `1e-3`, four-channel AND, Full Newton, fixed stepping, no line search, 100-iteration limit, `docs/TOLERANCE.md`, reference artifact filenames/hashes, stress optional inspection and `RM3` exclusion을 유지한다. USER-DECISION-004 option 1 keeps local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` review-only/nonblocking, with blocking factor-one global applied-plus-reaction resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence; global resultant semantics are global origin `[0,0,0]`, current force arms and spatial physical nodal moments. USER-DECISION-006 supersedes/retire prior moment-only `1e-9` and all `fesa.env`/runtime-config discussion: do not add `fesa.env`, config parsing, runtime API, or product behavior. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Sequential reapproval is delegated to Coordinator without intermediate user approval through Stage 4 Numerical/reference, Stage 5 I/O, Stage 6 Implementation Planning materialization, then Step `11` only no-push Harness/Implementation under Codex CLI `0.150.1` USER-DECISION-005A envelope. No push, no `danger-full-access`, no reference mutation/solver and no Step `12` auto-advance. Any required change beyond the fixed `1e-8` global balance threshold stops as blocker.
- repository_audit: 기존 worktree에는 `.codex/agents/*.toml`과 `AGENTS.md`의 사용자 변경이 있으며 이를 보존한다.
## 2. Eight-Stage Worklist
| stage | owner | status | output paths | acceptance gate | evidence summary | blockers | attempt count |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | `<=400` lines, 24 canonical shall requirements, exact 24-row Matrix, approved semantic loss 0, Stage-1 user question 0 | Approved compact content 395 lines; approval metadata 2 lines, current 397; 24↔24 exact ID sets, duplicate/missing/orphan 0, OQ/questions/trivia/placeholders 0; core semantics and NSNR-083 public precedence retained; forbidden changes 0; user explicitly approved on 2026-08-23. | 없음 | 40 |
| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | USER-DECISION-004 option 1을 requirements/reference acceptance contract에 최소 반영하고 compact requirements contract, existing thresholds, four-channel AND, Full Newton, 100-iteration limit, `docs/TOLERANCE.md`, approved semantic loss 0을 보존함 | Requirement Agent returned revised `requirements.md` status `draft`, ready for Coordinator/user re-approval, SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator audit passed: hash matched, 401 lines, 24 requirement records, 24 Matrix rows, duplicate/missing/orphan IDs 0, USER-DECISION-004 option 1 expressed, local RF/RM review-only, blocking global applied-plus-reaction force/moment plus accepted free residual present, formulation semantics preserved, AUDIT-001 Stage5/6 handoff present, no tolerance/reference/HDF5/public-scope expansion. User explicitly re-approved this hash on 2026-08-27. | 없음 | 43 |
| 2. Research | `research-agent` | `passed` | `docs/nonlinear-static-newton-raphson/research.md` | 필요한 이론·benchmark·source reliability·applicability limit가 충분함 | Owner/Coordinator pass와 2026-08-23 사용자 명시 승인; 10 required sections, S1–S17, 12 benchmark candidates, 11 research-relevant requirement IDs, 14 unique open issues; nonlinear stored reference gap explicit; SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; forbidden changes 0. | 없음 | 1 |
| 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-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 |
| 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | §14.1만 USER-DECISION-003 option 1로 갱신하고 strong/weak form, kinematics, tangent/residual, integration, state/recovery, O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure를 보존함 | Owner returned `ready-for-coordinator-and-user-reapproval`, SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, §14.1-only diff `34` additions/`5` deletions, revised requirements hash matched, 13/13 contract assertions and diff check passed, no other owner file changes. Coordinator audit passed and user explicitly re-approved this hash on 2026-08-24: exact-zero branch selector is matching external residual-channel scale, nonzero external scale retains relative `max(internal, external)` denominator and `1e-2`, typed absolutes remain `1e-3`, correction gates/four-channel AND/lifecycle/reference disposition unchanged. | 없음 | 3 |
| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | USER-DECISION-006 delegated reapproval: both normalized factor-one global FORCE and MOMENT balance gates are fixed `<=1e-8`, with exact formulas, sum-of-contribution scales, zero-scale rule, source identity and USER-DECISION-004 dispositions preserved | Owner returned `pass-for-io-definition`, blockers none. Coordinator audit verified hashes `numerical-review.md` `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; both reports record global force/moment normalized gate `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, 12 reference hashes/length/mtime unchanged, fine primary/coarse companion, U blocking, UR warning-only, local RF/RM review-only and `RM3`/stress excluded. Root independently verified hashes, target occurrences and `git diff --check` with only LF/CRLF warnings. | 없음 | 6 |
| 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | USER-DECISION-006 fixed both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving HDF5 schema/projections/reference paths and `docs/TOLERANCE.md` separation | Owner returned `ready-for-coordinator-review`, blockers none. Coordinator verified raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`; owner/root LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. `io.md` records both coarse/fine global force and moment internal gates as dimension-separated normalized `<=1e-8`, preserves `/global/equilibrium` schema version/path/shape/source identity, constrained reaction/free residual projections, zero-scale rule, NSNR-069, local RF/RM review-only, U blocking, UR warning-only, `RM3`/stress exclusions, reference paths and external-only `docs/TOLERANCE.md`. | 없음 | 7 |
| 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`; `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` | Step `11` only no-push rerun uses Codex CLI `0.150.1`, `workspace-write`, hooks, Terra/`xhigh`, `--disable unified_exec`, VsDevCmd x64/deps, Ninja/MSVC Debug preset and a child launch PATH that removes every entry matching `\\WindowsApps(?:\\|$)`; Step `12` remains outside scope | REWORK-009 owner returned `corrected-for-implementation-rerun`, blockers none, `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator/root audit verified Section 14 records the confirmed all-WindowsApps filter, exact shell smoke, recovered RED->GREEN, focused passes, Stop `302/302`, no runner/source/test/CMake/phase/upstream/reference/tolerance edits, and one bounded Step `11` rerun recommendation. Step `11` and top phase remain `pending`, Step `12` pending, HEAD `65b56b1`, and canonical evidence docs are absent. | Step `11` rerun owner return missing; Step `12` not authorized | 33 |
| 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,46 +33,52 @@
### Active Dispatch Package
- feature_id: `nonlinear-static-newton-raphson`
- 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)
- current_dispatch: `STEP11-EXECUTION-004-all-windowsapps-filter-step11-only-rerun-root-executor-required`
- target_sub_agent: `implementation-agent` via Harness Executor
- required_inputs:
- 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`.
- Use `fesa-cpp-msvc-tdd` and project-local `harness`; execute only Executor-selected Step `11` `equilibrium-projection-and-reference-gate`.
- Read `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.codex/hooks.json`, `docs/nonlinear-static-newton-raphson/coordination.md`, approved Stage 4/5/6 documents, phase indexes, `step11.md`, `step11-output.json`, and `corrections.md` Section 14.
- Preserve USER-DECISION-006: both normalized factor-one global FORCE and MOMENT balance gates are fixed inclusive `<=1e-8`; no `fesa.env`, config parsing, runtime API, CLI option, public API, HDF5 schema change or product solver acceptance behavior.
- Preserve exact formulas, sum-of-contribution scales, exact-zero rule, source identities, NSNR-069 free residual gates, `docs/TOLERANCE.md` separation, reference artifact immutability, local RF/RM review-only, U blocking, UR warning-only, and `RM3`/stress exclusions.
- Launch environment: Codex CLI `0.150.1`, app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, `CODEX_HOME=C:\Users\baram\.codex`, `workspace-write`, hooks retained, implementation-agent `gpt-5.6-terra`/`xhigh`, `--disable unified_exec`, VsDevCmd Hostx64/x64 with approved dependency env vars and Ninja/MSVC Debug preset.
- Before nested Codex execution, after VsDevCmd/dependency setup, filter child PATH exactly with entries satisfying `$_ -and $_ -notmatch '\\WindowsApps(?:\\|$)'`; preflight must leave `pwsh` unresolved, resolve `powershell` to `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`, and print exact `FESA_CODEX_SHELL_SMOKE_OK` with exit `0`.
- Use the previously approved Step `11` only no-push wrapper/private single-step path that hard-stops before Step `12`; if only the public all-pending runner path is available and Step `12` cannot be blocked, stop and return to Coordinator.
- Preserve current dirty Step `11` implementation/test/comparator/CMake work and recovered RED->GREEN evidence; do not fabricate a new RED by reverting code. Run the Step `11` required focused/full VERIFY commands and let automatic hooks run.
- Current workdir: `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson`.
- expected_outputs:
- 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.
- `phases/nonlinear-static-newton-raphson/step11-output.json`
- Executor-owned phase metadata and Step `11` source/test/comparator commit if the Step passes
- No `implementation-report.md`, `build-test.md` or canonical `reference-comparison.md` in this Step
- acceptance_gate: Implementation/Harness returns Step `11` completed with output path/status/evidence/blockers, no push, Stop/focused CTest evidence green under `windows-msvc-ninja-debug`, fixed `<=1e-8` force/moment gates verified, reference artifact hashes/mtimes unchanged and `git diff -- reference` clean; Step `12` remains pending.
- stop_condition: Stop and return classified blocker if the same user-local WindowsApps `pwsh.exe`/`CreateProcessAsUserW` failure recurs after the all-WindowsApps filter, if any change beyond fixed `<=1e-8` is needed, if Step `12` would start, if push/`danger-full-access`/manual hook/reference solver/reference mutation is required, or if runner/source/test/phase/upstream/tolerance edits outside `step11.md` contract are needed.
- missing_evidence: Step `11` rerun owner return and Executor commit/status evidence. This Coordinator runtime has no callable `spawn_agent` tool (`tool_search` found no dispatch tool), so root/Executor launch is required.
### 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`
- status: `corrected-for-implementation-rerun`; Coordinator decision `passed`
- evidence_summary:
- `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`.
- Coordinator/root verified `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A` and scoped `git diff --check` exit `0` with only LF/CRLF warning.
- Section 14 confirms the prior launch filter missed `C:\Users\baram\AppData\Local\Microsoft\WindowsApps`; filtering all entries matching `\\WindowsApps(?:\\|$)` makes `pwsh` unresolved, selects system Windows PowerShell and passes exact `FESA_CODEX_SHELL_SMOKE_OK`.
- Owner recorded recovered old-gate RED, `<=1e-8` GREEN, focused implementation/reference passes, Stop `302/302`, no blockers, no Harness phase/build/full CTest rerun, no commit/push, no reference mutation and no runner/source/test/CMake/phase/upstream/tolerance edits.
- blockers:
- 없음 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.
- 없음
- self_audit_findings: Coordinator accepts REWORK-009 as a report-only environment correction. It does not reopen Stage 4/5/6 semantics and does not itself complete Step `11`.
- return_contract_check: Return includes output path, status, evidence summary and blockers; owner scope was limited to `corrections.md` and root verified the hash.
- acceptance_evidence_check: The next eligible action is one bounded Step `11` only no-push Harness/Implementation rerun under the corrected all-WindowsApps child PATH filter.
### USER-DECISION-004 Selected Path
- selected: User explicitly approved option 1 on `2026-08-26`.
- meaning: exact local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows remain deterministic source-key/schema/finite/inventory/error-reporting evidence but become review-only/nonblocking; `RM3` remains excluded.
- blocking evidence: factor-one global resultant force `[3]`, factor-one global resultant moment `[3]`, and accepted free-DOF residual gates/evidence. Resultant moment uses the existing I/O global-equilibrium contract: global origin `[0,0,0]`, current force arms and spatial physical nodal moments.
- unchanged: displacement comparison remains blocking, `UR1/UR2/UR3` remains warning-only, stress CSVs remain optional inspection/no comparison projection, `docs/TOLERANCE.md` applies where external comparison remains, and exact source-ID prechecks are preserved.
- prohibited: no averaging/collapse/zero clamp, no tolerance relaxation, no comparator weakening, no reference artifact edit, and no Abaqus S4 internal-equivalence claim.
- re-approval path: Stage 1 requirements, Stage 4 Numerical/reference and Stage 5 I/O are re-approved. Stage 6 implementation-planning revision draft is returned, Coordinator-audited, user-approved and materialized by MATERIALIZATION-003. DECISION-042 now supplies the separate explicit Step 11 Harness/Implementation request. Stage 3 formulation has no immediate dispatch because current §11.4 and §13.4 already define full residual/reactions and global resultant identities.
`MESH-REFINEMENT-SPIKE-001` remains diagnostic evidence that option 3 is not met by the current Abaqus S4 coarse/fine pair. `TRANSLATION-REPORT-001` remains translation-only diagnostic evidence and does not authorize final reference-model, tolerance, comparator, HDF5 schema, implementation, Harness, Step 12, Physics or Release changes.
### Compact Migration Evidence
@@ -187,10 +193,56 @@
| 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 |
| 2026-08-24 | Harness Step 11 reference-comparison block and REWORK-007 dispatch | `needs-rework` | Harness Steps 0..10 completed. Step 11 owner added reference comparator/test files but blocked because copied `shellNL.inp` reaches `nonlinear-nonconvergence` after 100 Newton iterations; `shellNL_results.h5` is absent, `git diff -- reference` is clean, and Step 12 remains pending. Log evidence shows force/correction channels passing while residual moment remains failing; approved convergence contract must not be relaxed silently. | `needs-correction` | Root profile dispatch to bounded `correction-agent`: diagnose/fix only implementation-owned nonlinear solver/convergence defect under approved contracts, or return `upstream-contract` / `needs-user-decision` if the approved moment-denominator contract is the blocker |
| 2026-08-24 | REWORK-007 upstream-contract return and Coordinator audit | `blocked` | Correction returned `needs-upstream-decision`, `corrections.md` SHA-256 `63E0FF45AF44F564B276C2400B2D1A9AB5F90FC9E1470F4F8246ED57231B175B`, changed only that report. Proof: shellNL has no external rotational generalized force, so approved `D_M=max(||f_int||inf,||f_ext||inf)` gives `eta_M=1` for every nonzero rotational residual; focused CTest #288 reproduced the failure and 100/100 log records have numerator=denominator, relative branch, pass=0. | `needs-user-decision` | USER-DECISION-003: choose a residual-moment convergence contract path before requirements/formulation/numerical-review/io/planning rework or stop the feature |
| 2026-08-24 | USER-DECISION-003 option 1 and Requirements rework dispatch | `in-progress` | User approved option 1: if the matching external residual-channel scale is exact zero, apply the existing typed absolute residual gate; otherwise retain the current relative denominator. Coordinator recorded required re-approval sequence and bounded Stage 1 rework to NSNR-069 in `requirements.md` only. | `needs-requirements` | Root profile dispatch to `requirement-agent`; await revised `requirements.md` return and Coordinator audit before explicit Stage 1 re-approval |
| 2026-08-24 | Requirements NSNR-069 option 1 return and Coordinator audit | `passed` | Requirement Agent returned `draft`, `ready-for-coordinator-review`, `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator verified hash, `git diff --check`, 397 lines, 24/24 records/Matrix rows, scoped NSNR-069/status/tolerance/matrix/handoff diff, unchanged thresholds/four-channel AND/Full Newton/100 iterations/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch formulation yet |
| 2026-08-24 | Revised Stage 1 approval and Formulation §14.1 dispatch | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator closed the Stage 1 re-approval item and prepared a bounded `formulation-agent` package for `formulation.md` §14.1 only under USER-DECISION-003 option 1. | `needs-formulation` | Root profile dispatch to `formulation-agent`; await §14.1-only return and Coordinator audit; do not start numerical-review/I/O/planning/implementation |
| 2026-08-24 | Formulation §14.1 option 1 return and Coordinator audit | `passed` | Formulation Agent returned `ready-for-coordinator-and-user-reapproval`, `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator verified hash, §14.1-only diff `34` additions/`5` deletions, revised requirements hash alignment, external-scale exact-zero selector, retained nonzero-external relative gate, unchanged thresholds/correction gates/four-channel AND/lifecycle/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `formulation.md`; do not dispatch numerical-review yet |
| 2026-08-24 | Revised Stage 3 approval and Numerical/reference dispatch | `in-progress` | User explicitly approved revised `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator closed REAPPROVAL-002 and prepared a bounded `numerical-review-agent` package to validate USER-DECISION-003 option 1, dimensions/predicates, shellNL readiness and reference disposition. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; await owner return and Coordinator audit; do not start I/O/planning/implementation |
| 2026-08-24 | Numerical/reference option 1 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`; `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, diff `+49/-11`; `reference-model.md` byte-identical SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator verified revised branch coverage, unchanged reference disposition, reference hashes/row counts, no concrete HDF5 dataset paths, no forbidden artifact/execution scope and diff check pass. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch I/O yet |
| 2026-08-24 | Revised Stage 4 approval and I/O dispatch | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153` and unchanged `reference-model.md` SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator closed REAPPROVAL-003 and prepared a bounded `io-definition-agent` package for `io.md` only. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start planning/implementation/Harness |
| 2026-08-24 | I/O option 1 return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`; `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, diff `+37/-20`. Coordinator verified approved source hash alignment, residual matching-external-scale exact-zero/nonzero selector, retained nonzero relative denominator, unchanged 39-field `nsnr-log-v1` labels/order, unchanged HDF5/reference projection and dispositions, stress optional/RM3 excluded, diff check pass and reference diff clean. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not dispatch planning/implementation/Harness |
| 2026-08-24 | Revised Stage 5 approval and Implementation Planning revision-draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`. Coordinator closed REAPPROVAL-004 and prepared a bounded `implementation-planning-agent` package to draft exact plan/phase revisions for USER-DECISION-003 option 1 while preserving Steps 0..10 history and Step 11 blocked comparator work. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; owner returns concise revision draft only; do not materialize planning files or run Harness until user approves the draft |
| 2026-08-25 | Implementation Planning option 1 revision draft return and Coordinator audit | `passed` | Implementation Planning owner returned `draft-ready-for-user-review`, no files changed/executed. Draft proposes minimal updates to `implementation-plan.md`, Step `5/7/10/11/12` and phase indexes; Step 11 owns RED-first `NSNR-CTRL-018..021` and `NSNR-LOG-012`, minimal `nonlinear_static_control.cpp` update, comparator preservation, copied `shellNL` reference comparison and full CTest. Coordinator verified approved upstream semantics and Harness ownership boundaries. | `needs-user-decision` | Ask user to explicitly approve the planning revision draft; do not materialize or run Harness |
| 2026-08-25 | Implementation Planning revision draft approval and materialization dispatch | `in-progress` | User explicitly approved the audited Implementation Planning revision draft and requested materialization. Coordinator closed REAPPROVAL-005 and prepared bounded materialization dispatch limited to `implementation-plan.md`, Step `5/7/10/11/12`, feature index and top index. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; do not run Harness/CTest/code/reference/push |
| 2026-08-25 | Implementation Planning materialization return and Coordinator audit | `passed` | Owner returned `ready-for-implementation`; approved 8 outputs materialized, Step 11 reset to `pending`, top phase reset to `pending`, Steps 0..10 completed history and Step 11 partial comparator files preserved, Step 12 pending, forbidden source/include/reference/tolerance diff empty, HEAD unchanged and no execution/commit/push. | `ready-for-implementation` | Await separate explicit no-push Harness/Implementation execution request; current Executor-selected pending Step is Step 11 |
| 2026-08-25 | Step 11 no-push Harness/Implementation execution authorization | `in-progress` | User explicitly requested no-push Harness/Implementation rerun from Step 11. Coordinator preflight verified isolated linked worktree, branch `feat-nonlinear-static-newton-raphson`, HEAD `65b56b1`, Step 11 `pending` with historical `started_at`, Step 12 `pending`, Codex CLI `0.149.1`, approved `windows-msvc-ninja-debug` preset/config, runner `--disable unified_exec`, and approved dirty state with preserved comparator files. | `needs-implementation` | Launch no-push Harness Executor under DECISION-038/039 envelope; await Step 11 return; no `danger-full-access`, push, reference mutation, reference solver, Step 12, Physics or Release |
| 2026-08-25 | Step 11 reference-comparison return and REWORK-008 dispatch package | `needs-rework` | Harness exit `2`; Step 11 blocked; Step 12 pending; `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`. Selector/control/log fix passed and factor-one HDF5 exists, but reference gate `15/16` failed on blocking reaction RMS. Additional read-only diagnosis shows deterministic key mapping and global equilibrium but local reaction redistribution mismatch already present in linear-limit reactions, so Correction must audit implementation-vs-upstream-contract before any production edit. | `needs-correction` | Root profile dispatch to `correction-agent` for REWORK-008 diagnostic; no tolerance/reference/HDF5 schema contract change, reference solver, reference mutation, `danger-full-access`, push, Step 12, Physics or Release |
| 2026-08-25 | REWORK-008 upstream-contract return and USER-DECISION-004 gate | `blocked` | Correction returned `needs-upstream-decision`, classification `upstream-contract` / `reference-blocking-model-adequacy-conflict`, Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. It found no reaction computation/storage/mapping defect: residual→reaction→HDF5 mapping exact, constrained `phi=0`, global resultant matches, and local RF/RM mismatch already exists in FESA-linear versus Abaqus-linear while each solver NL≈linear. No forbidden files changed by correction; reference diff clean and HEAD unchanged. | `needs-user-decision` | USER-DECISION-004: choose local nodal reactions review-only with global equilibrium blocking, global resultant-only blocking, or independent formulation-appropriate local-reaction benchmark; do not dispatch further work before explicit choice |
| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 numerical-review dispatch | `in-progress` | User added untracked main-checkout `reference/shellNL-meshfine` artifacts and explicitly approved a spike design for USER-DECISION-004 option 3 candidate validation. Coordinator verified read-only hashes/rows and feature-worktree missing state, then recorded a bounded `numerical-review-agent` package for artifact/input-equivalence/row-identity readiness only. | `needs-user-decision` | Root profile dispatch to `numerical-review-agent`; no final option selection, reference solver, artifact mutation, tolerance/comparator/HDF5 schema/implementation/Harness/Step 12/Physics/Release change |
| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 diagnostic return and Coordinator audit | `passed` | Fine artifacts copied byte-identically; required displacement/reaction artifacts are valid, stress is optional inventory only with one malformed optional key. Existing executable run exited `0` and produced H5/log hashes. Translation/rotation pass common tolerance, but local RF/RM rows still fail per-row gates; inplane reaction worsens under refinement. Global resultants and free residuals are sound. The same Abaqus S4 coarse/fine pair is not an independent formulation-appropriate local-reaction benchmark. | `needs-user-decision` | Ask user to choose USER-DECISION-004; Coordinator recommends option 1 review-only local nodal rows plus blocking global equilibrium/resultants; no Harness/Step 11 rerun before approval |
| 2026-08-26 | TRANSLATION-REPORT-001 focused reporting dispatch | `in-progress` | User approved bounded focused report design for `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md`: coarse/fine U1/U2/U3 translation-only comparison with exact artifact/HDF5 identity, source-key prechecks, `docs/TOLERANCE.md`, metrics, worst rows, mesh trend and exclusions. | `needs-user-decision` | Root profile dispatch to `implementation-agent`; only the focused report may be created; do not create canonical `reference-comparison.md`, run solver/Harness/reference solver, edit code/comparator/tolerance/reference artifacts, change USER-DECISION-004, or advance Step 11/12 |
| 2026-08-26 | TRANSLATION-REPORT-001 return and Coordinator audit | `passed` | Implementation Agent returned `translation-diagnostic-pass-not-a-gate` and created only `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`. Coordinator/root audit verified exact artifact hashes, coarse/fine U-key prechecks, `docs/TOLERANCE.md` pass metrics, explicit exclusions, diff check pass, tracked reference diff clean and canonical evidence docs absent. | `needs-user-decision` | Historical pre-decision state; superseded by USER-DECISION-004 option 1 entry below. No Step 11 rerun, Step 12, Physics or Release before required upstream re-approval |
| 2026-08-26 | USER-DECISION-004 option 1 approval and requirements dispatch package | `in-progress` | User explicitly selected option 1. Coordinator recorded local nodal RF/RM as review-only/nonblocking, global resultant force/moment plus accepted free residual as blocking reaction/equilibrium evidence, verified Stage 3 formulation has no immediate semantic rework need because §11.4/§13.4 already define reactions/global resultants, and recorded the Stage 5/6 projection audit item for current-position/spatial-moment global equilibrium versus raw-residual implementation helper. | `needs-requirements` | Root profile dispatch to bounded `requirement-agent` for `requirements.md` only; after owner return, Coordinator audit and explicit user approval are required before Stage 4 |
| 2026-08-27 | REAPPROVAL-006 Requirements return and Coordinator audit | `passed` | Requirement Agent returned revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, status `draft`. Coordinator verified hash, 24/24 requirement and matrix preservation, USER-DECISION-004 option 1 semantics, AUDIT-001 Stage5/6 handoff, preserved formulation meaning, unchanged thresholds/reference immutability and no forbidden gate advancement. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch Stage 4 Numerical/reference until approval |
| 2026-08-27 | Revised Stage 1 approval and Stage 4 Numerical/reference dispatch package | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator closed Stage 1 re-approval and prepared bounded `numerical-review-agent` package requiring `fesa-numerical-review`, USER-DECISION-004 option 1 reaction disposition, coarse/fine reference role review and AUDIT-001 downstream separation. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5 |
| 2026-08-27 | REAPPROVAL-007 Numerical/reference return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator verified requirements/formulation alignment, fine-primary/coarse-companion roles, local RF/RM review-only with `RM3`/stress excluded, U blocking/UR warning-only, internal normalized `1e-10` global balance gate separated from external `docs/TOLERANCE.md`, NSNR-069 free residual gate and AUDIT-001 Stage5/6 handoff. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch Stage 5 I/O yet |
| 2026-08-27 | Revised Stage 4 approval and Stage 5 I/O dispatch package | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091` and `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator closed REAPPROVAL-007 and prepared bounded `io-definition-agent` package requiring `fesa-io-contract`, USER-DECISION-004 option 1 HDF5/reference projection update, AUDIT-001 logical quantity separation and no parser/API/code/reference changes. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; expected output only `io.md`; await owner return and Coordinator audit; do not start Stage 6/Harness |
| 2026-08-27 | REAPPROVAL-008 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`. Coordinator verified approved source hashes, HDF5 schema v1 authority, `/global/equilibrium` applied-plus-reaction current-position/spatial-moment semantics, distinct free-residual/constrained-resultant/balance-error projections, local RF/RM review-only, `RM3`/stress excluded, U blocking/UR warning-only, fine primary/coarse companion and internal `1e-10` versus external `docs/TOLERANCE.md` boundary. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not start Stage 6 planning/materialization/Harness before approval |
| 2026-08-27 | Revised Stage 5 approval and Stage 6 planning re-entry draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`. Coordinator closed REAPPROVAL-008 and prepared bounded DRAFT ONLY `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`; the owner must audit existing Step 11+ plan/phase state and return a chat draft only. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no planning-file materialization, Harness, build, CTest, solver, reference solver, source/test/CMake/reference/tolerance edit, commit or push before draft approval |
| 2026-08-27 | REAPPROVAL-009 Planning draft return and Coordinator audit | `passed` | Planning Agent returned `draft-ready-for-user-review`, blockers none, no files changed/executed. Coordinator verified the draft is a minimal Step 11/12 revision: preserve Steps `0..10`, reset/rename only Step `11` after approval, keep Step `12` pending, cover AUDIT-001 current-arm/spatial-moment projections, no new HDF5 dataset/public header, internal/external tolerance separation, fine primary/coarse companion and approved Ninja/MSVC commands. | `needs-user-decision` | Ask user to approve or reject the Stage 6 revision draft; do not materialize planning files or run Harness until explicit approval |
| 2026-08-27 | REAPPROVAL-009 draft approval and MATERIALIZATION-003 dispatch package | `in-progress` | User explicitly approved the Coordinator-audited 2-Step draft. Coordinator prepared materialization-only dispatch to `implementation-planning-agent`, required `fesa-cpp-msvc-tdd` plus project-local `harness`, fixed current input hashes and allowed only `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md` as outputs. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no Harness/build/CTest/solver/reference solver, code/tests/CMake/upstream/reference/tolerance edit, evidence-doc creation, commit or push |
| 2026-08-27 | MATERIALIZATION-003 return and Coordinator audit | `passed` | Planning Agent materialized exactly the allowed five outputs: `implementation-plan.md` `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, phase index `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, `step12.md` `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator verified JSON parse, 24/24 requirements mapping, clean placeholder scan, scoped `git diff --check` pass, `NSNR-PROC-019` collision handling, Step `11` pending, Step `12` pending, Steps `0..10` preserved, canonical evidence docs absent, tracked reference diff clean, and no execution/commit/push. | `needs-implementation` | Await separate explicit no-push Step 11 Harness/Implementation request; do not run Harness automatically |
| 2026-08-27 | Step 11 no-push Harness/Implementation execution approval | `in-progress` | User explicitly approved `Harness/Implementation 시작`. Coordinator verified current runner CLI takes slug `nonlinear-static-newton-raphson`, current phase has Step `11` pending and Step `12` pending, and prepared a no-push `implementation-agent` via Harness dispatch for Step `11` only under DECISION-038/039. Step `12` is outside this approval; current runner loops over pending steps, so root/Executor must enforce the one-step boundary or stop before Step `12`. | `needs-implementation` | Root may run `python scripts/execute.py nonlinear-static-newton-raphson` only under the recorded no-push Step 11 envelope; await Step `11` return |
| 2026-08-27 | Step 11 execution recurrent runtime block | `blocked` | DECISION-042 Step11-only execution used the approved no-push envelope but timed out after `1800s`; `step11-output.json` SHA-256 `9FCBC5CE10E2C1B931EC16CADFADF7684C45FBB0B11D9A404922D607EB16706D`, exit `124`, stderr `Codex timed out after 1800 seconds.`, stdout nested command executions stuck `in_progress`. Retry was prevented by secondary CP949 `UnicodeEncodeError` printing `↻`. Read-only shell smokes under tested flag/env variants did not complete. Step `11` and Step `12` remain pending; no production/test/reference edits, commit or push. | `needs-user-decision` | No automatic correction dispatch; user must choose a runtime/runner route before any Step `11` rerun |
| 2026-08-28 | USER-DECISION-005 option A and Step 11 runtime-smoke dispatch | `in-progress` | User approved option A: use official current Codex CLI `0.150.1` to restore the runtime/update path, prove same `workspace-write`/filtered WindowsApps PATH/`CODEX_HOME`/VsDevCmd/hooks/Terra-xhigh/`--disable unified_exec` envelope with a bounded nested shell smoke, then rerun only Step `11` no-push if the smoke passes. | `needs-implementation` | Root may perform the Codex `0.150.1` smoke preflight and, only on pass, launch Step `11` Harness/Implementation under the active dispatch; Step `12`, push, `danger-full-access`, reference solver/artifact mutation and manual hooks remain forbidden |
| 2026-08-28 | USER-DECISION-005A smoke pass and Step 11 dispatch confirmation | `passed` | Root supplied smoke success evidence: Codex CLI `0.150.1`, app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, same-envelope smoke `93.621s`, nested exit `0`, command_execution completed, command exit `0`, output `CODEX_SHELL_SMOKE_OK`, stderr empty. Coordinator updated `BLOCKER-002` to smoke-passed and confirmed Step `11` dispatch. | `needs-implementation` | Historical smoke gate pass; superseded by the Step `11` blocked return below |
| 2026-08-28 | USER-DECISION-005A Step 11 blocked return | `blocked` | Step `11` only no-push Harness ran after smoke pass; runner exit `2`; Step `11` blocked at `2026-08-28T02:03:23+09:00`; Step `12` pending. Current-arm/spatial projection reproduced and NSNR-069 free residual accepted, but coarse/fine factor-one global moment balance metrics `1.413750912531167e-10`/`2.7454660159924086e-10` exceed approved `1e-10`; CTest `295` and `299` failed. `step11-output.json` SHA-256 `D56EB816DDD63E71D8880CA5AF39C10A38E2BF562A28207D26417716154F1872`; no commits/push; reference hashes/length/mtimes unchanged and `git diff -- reference` empty. | `needs-user-decision` | USER-DECISION-006: choose an upstream convergence-acceptance/global-balance-gate path before any rework, Step `11` retry, Step `12`, Physics or Release |
| 2026-08-28 | USER-DECISION-006 superseding global balance threshold and Stage 4 dispatch package | `in-progress` | User withdrew the entire `fesa.env`/runtime-config discussion and superseded the prior moment-only `1e-9` decision. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`; all formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation are preserved. User delegated Stage 4/5/6 reapproval and Step `11` completion without intermediate approval waits, bounded to this threshold-only change. | `needs-numerical-review` | Root/profile dispatch to `numerical-review-agent` with `fesa-numerical-review`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5, planning, Harness, Step `11` retry, Step `12`, reference solver, push or `danger-full-access` before owner return and Coordinator audit |
| 2026-08-28 | REAPPROVAL-010 Stage 4 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`, `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`. Coordinator verified required output paths/status, both normalized factor-one global force/moment gates `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, unchanged dispositions and no forbidden Stage 5/6/source/reference advancement. | `needs-io-definition` | Prepare bounded Stage 5 `io-definition-agent` dispatch; expected output only `io.md` |
| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O dispatch package | `in-progress` | Coordinator prepared bounded `io-definition-agent` package requiring `fesa-io-contract` and the passed Stage 4 hashes. Scope is limited to `io.md` global balance gate literals/diagnostics/handoff for force and moment `<=1e-8`; HDF5 schema/projections/reference paths/dispositions and `docs/TOLERANCE.md` separation must be preserved. | `needs-io-definition` | Root/profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start Stage 6 planning/Harness/Step 11 retry |
| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. Coordinator verified both coarse/fine global force and moment internal gates `<=1e-8`, unchanged HDF5 schema/projections/identities/scales/zero-scale/NSNR-069/reference paths and external-only `docs/TOLERANCE.md`, and no `fesa.env`/runtime-config direction. | `needs-implementation-plan` | Prepare bounded Stage 6 `implementation-planning-agent` materialization dispatch; do not run Harness or edit planning files as Coordinator |
| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization dispatch package | `in-progress` | Coordinator prepared bounded `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`. Scope is limited to `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md`; update only obsolete `1e-10` global balance references to force/moment `<=1e-8`, preserve Steps `0..10` and dirty Step `11` implementation work, reset top/Step `11` for rerun only after materialization evidence, and keep Step `12` pending. | `needs-implementation-plan` | Root/profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; no Harness/build/CTest/solver/reference solver, implementation, commit or push |
| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization return and Coordinator audit | `passed` | Planning owner returned `ready-for-implementation`, blockers none; hashes verified for `implementation-plan.md` `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, and `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. Coordinator/root verified JSON parse, top/Step `11` pending, Step `12` pending, Steps `0..10` completed metadata retained, Step `11.started_at` retained, `NSNR-REF-024..025` gate requirements present, and no execution. | `needs-implementation` | Prepare Step `11` only no-push `implementation-agent` Harness package under USER-DECISION-005A; do not start Step `12` |
| 2026-08-28 | STEP11-EXECUTION-003 global balance `1e-8` no-push dispatch package | `in-progress` | Coordinator prepared bounded Step `11` only package for `implementation-agent` via Harness. Runner/Executor owns branch, pending selection, retry, timestamps, commits, advancement and top-level phase status; Implementation Agent owns only Step `11` RED -> observed failure -> minimal GREEN -> VERIFY. Package requires `NSNR-REF-022` old-gate RED plus test-first `NSNR-REF-024..025`, no `fesa.env`/product config, reference immutability, no push and no Step `12` auto-advance. | `needs-implementation` | Root/Executor may launch Step `11` only under USER-DECISION-005A; await owner return and stop before Step `12` |
| 2026-08-28 | STEP11-EXECUTION-003 runtime/environment return and Coordinator audit | `needs-rework` | Step `11` only wrapper attempt 1 timed out and attempt 2 selected user-local WindowsApps `pwsh.exe`, producing `CreateProcessAsUserW failed: 5 (Access denied)` on every exec. Stop-hook CTest evidence nevertheless passed all `302/302`, including the Step `11` global balance/reference tests; Step `11` remains pending because the agent did not update status/summary and Executor did not commit. Root stopped retry 3 and cleaned PIDs `4240`/`12000`/`16924`. | `needs-correction` | Dispatch bounded report-only `correction-agent` for launch PATH filter diagnosis; no Step `11` rerun or Step `12` before correction return |
| 2026-08-28 | REWORK-009 user-local WindowsApps `pwsh.exe` launch filter return and Coordinator audit | `passed` | Correction Agent returned `corrected-for-implementation-rerun`, blockers none, `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator/root verified Section 14: all PATH entries matching `\\WindowsApps(?:\\|$)` filtered, `pwsh` unresolved, system Windows PowerShell selected, exact `FESA_CODEX_SHELL_SMOKE_OK`, recovered RED->GREEN, focused passes, Stop `302/302`, no forbidden edits/execution/commit/push/reference mutation. | `needs-implementation` | Issue one bounded Step `11` only no-push rerun package using corrected launch PATH filter |
| 2026-08-28 | STEP11-EXECUTION-004 all-WindowsApps-filter Step 11 rerun package | `in-progress` | Coordinator prepared bounded `implementation-agent`/Harness package: run only Step `11`, preserve fixed `<=1e-8` force/moment gates and all Stage 4/5/6 contracts, use Codex CLI `0.150.1` with `CODEX_HOME`, `workspace-write`, hooks, Terra/`xhigh`, `--disable unified_exec`, VsDevCmd x64/deps, Ninja/MSVC Debug preset and child PATH filtered by `\\WindowsApps(?:\\|$)`. | `needs-implementation` | Root/Executor may launch Step `11` only; hard-stop before Step `12`; no push, `danger-full-access`, reference mutation/solver or manual hooks |
- current_dispatch: `stage-6-step1-no-push-harness-rerun`
- current_dispatch: `STEP11-EXECUTION-004-all-windowsapps-filter-step11-only-rerun-root-executor-required`
- current_workflow_state: `needs-implementation`
- 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
- next_gate_requires_user_approval: `false` only for the delegated threshold-only Stage 4 -> Stage 5 -> Stage 6 planning/materialization -> Step `11` path; `true` for any change beyond fixed `<=1e-8` global force/moment balance gates, `fesa.env`/runtime config, formula/source identity/zero-scale/NSNR-069/HDF5/reference/TOLERANCE change, Step `12`, Physics or Release.
## 5. Risk, Blocker, and User-Decision Register
@@ -200,12 +252,42 @@
| REWORK-001 | report-contract | Stage 4 returned evidence had a cross-report contradiction on stress CSV and `RM3` comparison disposition. Corrected reports now consistently treat stress CSVs as optional read-only inspection/order evidence only and exclude `RM3` from comparison. | `numerical-review-agent` | closed |
| REWORK-002 | io-contract | Stage 5 `io.md` bounded correction completed: public CLI `--output` substring rejection, Newton iteration log schema, exact `VARIABLE=PRESELECT` ignored-with-warning handling, repository-wide non-Newton log lifecycle, DECISION-028/029/030 path/log lifecycle and collision semantics are now recorded in `io.md`. | `io-definition-agent` | closed |
| REWORK-003 | harness | Stage 6 attempt 1 timeout/no-retry defect is repaired in Harness infrastructure: timeouts now return structured exit `124` through `MAX_RETRIES`, and implementation-agent profile settings are passed to Codex. Same normalized failure attempt count remains 1; attempt 2 is authorized and same-class recurrence stops automatic rework. | `implementation-agent` via Harness Executor | closed |
| 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-002 | harness-runtime | Closed for USER-DECISION-005A route: nested Codex Windows shell tool execution hung under the approved Codex CLI `0.149.1` envelope in DECISION-042, but Codex CLI `0.150.1` same-envelope smoke passed and the Step `11` Harness rerun reached deterministic CTest/reference-gate failures instead of a shell hang. Recurrence of nested command `in_progress` timeout reopens this blocker. | external Codex runtime / user-root decision | closed-smoke-passed-step11-executed |
| 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 |
| REWORK-007 | upstream-contract | Step 11 reference comparison is blocked because the approved residual-moment convergence denominator makes no-applied-moment shellNL structurally nonconvergent for any nonzero rotational residual. Correction changed only `corrections.md` and returned `needs-upstream-decision`. | `correction-agent` | closed-upstream-contract |
| REWORK-008 | upstream-contract | Correction returned `needs-upstream-decision`, classification `reference-blocking-model-adequacy-conflict`: local nodal RF/RM blocking assumes unsupported Abaqus S4 versus FESA MITC4 distribution adequacy, while reaction pipeline/global equilibrium evidence is sound. Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. | `correction-agent` | closed-upstream-contract |
| USER-DECISION-004 | user decision | User explicitly approved option 1 on `2026-08-26`: local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows are review-only/nonblocking with deterministic source-key/schema/finite/inventory/error reporting; `RM3` remains excluded; blocking reaction/equilibrium evidence is factor-one global resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence. No tolerance/comparator/reference relaxation is authorized. | user via Coordinator | closed |
| REAPPROVAL-006 | upstream-reapproval | USER-DECISION-004 option 1 Stage 1 propagation completed: requirements owner/Coordinator audit passed for `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, and the user explicitly re-approved that hash on `2026-08-27`. Stage 3 formulation has no immediate dispatch because §11.4/§13.4 already define residual/reaction/global-resultant semantics. | `requirement-agent` / Coordinator / user | closed |
| REAPPROVAL-007 | upstream-reapproval | USER-DECISION-004 option 1 Stage 4 propagation completed: `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`, owner status `pass-for-io-definition`, Coordinator audit passed, blockers none, and the user explicitly approved both hashes on `2026-08-27`. | `numerical-review-agent` / Coordinator / user | closed |
| REAPPROVAL-008 | upstream-reapproval | USER-DECISION-004 option 1 Stage 5 propagation completed: `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`; owner/Coordinator audit passed and the user explicitly approved the raw hash on `2026-08-27`. | `io-definition-agent` / Coordinator / user | closed |
| REAPPROVAL-009 | planning-reapproval | Stage 6 implementation planning re-entry draft returned `draft-ready-for-user-review`; Coordinator audit passed; user explicitly approved the draft on `2026-08-27`. Draft proposes only Step `11`/`12` replanning for USER-DECISION-004 option 1 and AUDIT-001 while preserving Steps `0..10`, current uncommitted Step 11 work, approved contracts, no-new-dataset semantics and no execution. | `implementation-planning-agent` / Coordinator / user | closed |
| MATERIALIZATION-003 | planning-materialization | Passed: Planning Agent materialized exactly `implementation-plan.md` SHA-256 `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` SHA-256 `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` SHA-256 `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, and `step12.md` SHA-256 `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator audit found JSON parse clean, no placeholders, scoped `git diff --check` pass, changed planning outputs within allowlist, Step `11`/top phase pending, Steps `0..10` preserved, Step `12` pending, reference diff clean and no Harness/build/solver execution. | `implementation-planning-agent` / Coordinator | passed |
| DECISION-042 | user approval | User explicitly approved `Harness/Implementation 시작` for no-push Step `11` execution only. The verified command is `python scripts/execute.py nonlinear-static-newton-raphson`; Step `12` is not authorized and must not start before Coordinator audit. | user via Coordinator | closed |
| USER-DECISION-005 | user decision | User approved option A on `2026-08-28`: use official current Codex CLI `0.150.1` to repair/validate the runtime route, run a bounded same-envelope nested shell smoke, and only if it passes rerun Step `11` no-push. Smoke passed with app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, duration `93.621s`, nested exit `0`, command_execution completed and output `CODEX_SHELL_SMOKE_OK`. This does not authorize `danger-full-access`, reference solver/artifact changes, push, Step `12`, manual hooks or runner/source/test/phase edits outside the Step `11` contract. | user via Coordinator | closed-option-A-smoke-passed |
| USER-DECISION-006 | user decision | Closed/delegated superseding decision on `2026-08-28`: withdraw the entire `fesa.env`/runtime-config discussion; do not add `fesa.env`, config parsing, runtime API or product behavior. Current authoritative contract fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`, preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Coordinator is delegated to run Stage 4/5/6 reapproval and Step `11` no-push completion without intermediate approval waits, but must stop on any change beyond this fixed threshold. | user via Coordinator | closed-delegated |
| REAPPROVAL-010 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 4 owner returned `pass-for-io-definition`, blockers none, `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; Coordinator audit passed against the threshold-only package. | `numerical-review-agent` / Coordinator | passed |
| REAPPROVAL-011 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 5 owner returned `ready-for-coordinator-review`, blockers none, `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; Coordinator audit passed against the threshold-only package with schema/projection/reference/TOLERANCE boundaries preserved. | `io-definition-agent` / Coordinator | passed |
| REAPPROVAL-012 | planning-materialization | Passed under delegated USER-DECISION-006 authority: Planning owner returned `ready-for-implementation`, blockers none; `implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`; Coordinator audit passed. | `implementation-planning-agent` / Coordinator | passed |
| STEP11-EXECUTION-003 | implementation-dispatch | Needs rework: Step `11` only no-push wrapper attempt 1 timed out and attempt 2 hit inaccessible `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe` with `CreateProcessAsUserW failed: 5`; Stop-hook CTest evidence passed `302/302`, but Step `11` status/summary/commit are absent. | `implementation-agent` / Harness Executor / Coordinator | needs-rework |
| REWORK-009 | harness-environment | Passed: Correction Agent diagnosed the user-local WindowsApps `pwsh.exe` launch filter miss and proved an all-`WindowsApps` PATH-filter same-envelope shell smoke. Output `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`; changed `corrections.md` only; no runner/source/test/CMake/phase/upstream/reference/tolerance edits. | `correction-agent` / Coordinator | passed |
| STEP11-EXECUTION-004 | implementation-dispatch | In progress/dispatch-ready: one bounded Step `11` only no-push Harness rerun is authorized under corrected all-WindowsApps child PATH filter. Step `12` is not authorized; same WindowsApps `pwsh.exe` access-denied recurrence must stop without automatic retry. | `implementation-agent` / Harness Executor / Coordinator | in-progress |
| BLOCKER-005 | dispatch-runtime | This Coordinator runtime exposes no callable collaboration `spawn_agent` tool and `tool_search` found no dispatch tool. Root completed Stage 4, Stage 5, Stage 6 planning and REWORK-009 profile dispatches; the current Step `11` rerun package is ready, but root/Executor launch is still required before owner evidence can be produced. | coordinator/root tooling | open-root-executor-required |
| AUDIT-001 | projection-implementation | Stage 5 `io.md` now separates global applied+reaction balance error, constrained reaction resultant and accepted free residual as distinct deterministic HDF5 projections. Stage 6 planning/implementation must still update tests/implementation so `/global/equilibrium` uses current nodal positions and spatial physical nodal moments about global origin instead of raw full residual, initial coordinates or raw rotational residual shortcuts for general supported nonzero prescribed displacement/rotation cases. | `implementation-planning-agent` / `implementation-agent` | open |
| MESH-REFINEMENT-SPIKE-001 | diagnostic-spike | Completed read-only numerical/reference spike for `reference/shellNL-meshfine`: artifacts copied byte-identically, required rows readable, existing executable run successful, primary displacement/rotation passed common tolerance, local RF/RM per-row gates failed, and current coarse/fine Abaqus S4 pair did not meet option 3 independent benchmark condition. | `numerical-review-agent` | passed |
| TRANSLATION-REPORT-001 | focused-report | Completed bounded report for coarse/fine `U1/U2/U3` translation displacement only. Output `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`; diagnostic non-gate, not canonical `reference-comparison.md`, and does not alter reaction/rotation/stress or USER-DECISION-004 disposition. | `implementation-agent` | passed |
| 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 |
| USER-DECISION-003 | user decision | User approved option 1: if the matching external residual-channel scale is exact zero, use the existing typed absolute residual gate; keep current relative denominator when the external scale is nonzero. This starts required upstream re-approval in order: requirements NSNR-069, formulation §14.1, numerical-review, I/O, then implementation-plan/phase steps before implementation rerun. | user via Coordinator | closed |
| REAPPROVAL-001 | upstream-reapproval | USER-DECISION-003 option 1 Stage 1 propagation completed: requirements owner return and Coordinator audit passed for `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`, and the user explicitly re-approved that hash. | `requirement-agent` / user via Coordinator | closed |
| REAPPROVAL-002 | upstream-reapproval | USER-DECISION-003 option 1 Stage 3 propagation completed: formulation owner return and Coordinator audit passed for `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, and the user explicitly re-approved that hash. | `formulation-agent` / user via Coordinator | closed |
| REAPPROVAL-003 | upstream-reapproval | USER-DECISION-003 option 1 Stage 4 propagation completed: Numerical Review owner return and Coordinator audit passed for `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, `reference-model.md` remained byte-identical at SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`, and the user explicitly re-approved both hashes. | `numerical-review-agent` / user via Coordinator | closed |
| REAPPROVAL-004 | upstream-reapproval | USER-DECISION-003 option 1 Stage 5 propagation completed: I/O owner return and Coordinator audit passed for `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, and the user explicitly re-approved both hashes. | `io-definition-agent` / user via Coordinator | closed |
| REAPPROVAL-005 | planning-reapproval | USER-DECISION-003 option 1 Stage 6 planning propagation draft passed Coordinator audit and the user explicitly approved materialization on `2026-08-25`. | `implementation-planning-agent` / user via Coordinator | closed |
| MATERIALIZATION-002 | planning-materialization | User-approved Stage 6 planning revision materialized only in `implementation-plan.md`, `step5.md`, `step7.md`, `step10.md`, `step11.md`, `step12.md`, feature index and top index; Steps 0..10 history/commits and partial Step 11 comparator files are preserved, Step 11/top status reset to `pending`, and Step 12 remains `pending`. | `implementation-planning-agent` | closed |
| DECISION-040 | user approval | User explicitly approved the audited Implementation Planning revision draft and requested materialization. This approval does not authorize Harness, CTest, code/test/CMake/source edits, reference artifact changes, commit, or push. | user via Coordinator | closed |
| DECISION-041 | user approval | User explicitly requested no-push Harness/Implementation rerun from Step 11 under DECISION-038/039: Codex CLI `0.149.1`, aligned `CODEX_HOME`, launch-env WindowsApps PATH filtering, `workspace-write`, hooks retained, `--disable unified_exec`, VsDevCmd x64, dependency env vars, approved Ninja/MSVC Debug preset, no `danger-full-access`, no push, no reference solver and no reference artifact mutation. | 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 |
@@ -254,11 +336,12 @@
## 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; `harness-msbuild-filetracker-eaccessdenied-workspace-write`: 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`: 3; `harness-console-cp949-retry-glyph-unicodeencodeerror`: 1; `harness-msbuild-filetracker-eaccessdenied-workspace-write`: 2; `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`: 1; `reference-blocking-model-adequacy-conflict`: 1; `upstream-global-moment-balance-gate-threshold-conflict`: 1; `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`: 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: 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.
- correction_cycle_authorization: REWORK-008 is closed as `upstream-contract`. MATERIALIZATION-003 and REAPPROVAL-012 are closed as `passed`. USER-DECISION-006 resolves the prior `upstream-global-moment-balance-gate-threshold-conflict` by fixing both normalized global balance gates at `<=1e-8`. STEP11-EXECUTION-003 reached normalized environment failure count `2`, automatic retry was stopped, and REWORK-009 is now passed. STEP11-EXECUTION-004 is the only active implementation dispatch; same WindowsApps `pwsh.exe` access-denied recurrence after the corrected filter stops without another automatic retry.
- upstream_reapproval_sequence: Prior USER-DECISION-003 and USER-DECISION-004 sequences remain closed. USER-DECISION-006 supersedes prior moment-only `1e-9` and withdraws `fesa.env`/runtime-config; Stage 4 Numerical/reference is passed by REAPPROVAL-010, Stage 5 I/O is passed by REAPPROVAL-011, Stage 6 planning materialization is passed by REAPPROVAL-012, and REWORK-009 environment correction is passed. Current delegated order is Step `11` no-push Harness/Implementation rerun with corrected all-WindowsApps filter. No intermediate user approval wait is required within the fixed `<=1e-8` global force/moment threshold scope, but runner/test/source/phase/upstream/reference/tolerance edits require separate approval.
## 7. Final Workflow Closure
@@ -268,11 +351,12 @@
## 8. No-Change Assertion
- 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 없음
- source_code: Steps 0..10 implementation source changes are committed through Harness; current Step 11 uncommitted implementation edits are preserved, including USER-DECISION-005A current-arm/spatial projection and USER-DECISION-006 fixed `<=1e-8` global balance work. Coordinator did not edit source code.
- tests: Current Step 11 uncommitted comparator/test edits are preserved. Recovered rollout evidence shows old-gate RED failure, minimal GREEN for `<=1e-8`, focused procedure/writer/log/reference tests passing, and latest Stop-hook CTest evidence `302/302` passed. Coordinator did not edit tests.
- CMake: Step 11 owner modified `tests/CMakeLists.txt`; REWORK-006 added tracked `CMakePresets.json` for DECISION-039 Ninja/MSVC validation. Coordinator did not edit CMake configuration.
- reference_artifacts: Root copied four `reference/shellNL-meshfine` artifacts byte-identically into the feature worktree for the approved spike; SHA-256 values match the recorded main-checkout hashes and row counts `729/729/5408`. No reference artifact was generated, renamed, normalized, repaired or modified by Coordinator.
- tolerance_policies: 변경 없음
- 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.
- phase_files: REAPPROVAL-012 Planning owner updated `phases/index.json` and `phases/nonlinear-static-newton-raphson/index.json`; top phase is now `pending`, Steps 0..10 remain completed with existing metadata, Step 11 is `pending` as `equilibrium-projection-and-reference-gate` with historical `started_at=2026-08-24T15:49:08+09:00` retained, and Step 12 is pending. Coordinator did not edit phase files.
- Harness: Historical Step `11` executions include DECISION-042 timeout, USER-DECISION-005A `1e-10` global-moment blocker, then REAPPROVAL-012 reset for fixed `<=1e-8`. STEP11-EXECUTION-003 did not complete Harness metadata because nested Codex selected inaccessible `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`; REWORK-009 is now passed and STEP11-EXECUTION-004 is the active Step `11` rerun package with all-WindowsApps child PATH filtering. Step `11` and top phase remain `pending`; Step `12` remains pending and outside the active dispatch. Coordinator did not run Harness/phase/build/test command, advance Step 12, use `danger-full-access`, clean build outputs, commit or push.
- feature_documents: REWORK-008 Correction updated `docs/nonlinear-static-newton-raphson/corrections.md` Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`; Requirement Agent updated only `docs/nonlinear-static-newton-raphson/requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`; Formulation Agent updated only `docs/nonlinear-static-newton-raphson/formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`; REAPPROVAL-010 Numerical Review Agent updated Stage 4 reports to `docs/nonlinear-static-newton-raphson/numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `docs/nonlinear-static-newton-raphson/reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; REAPPROVAL-011 I/O Definition Agent updated only `docs/nonlinear-static-newton-raphson/io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; REAPPROVAL-012 Planning owner materialized `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` SHA-256 `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index SHA-256 `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` SHA-256 `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8` and `step12.md` SHA-256 `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. Implementation Agent created only `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`. This coordinator update changed only isolated `coordination.md`; `implementation-report.md`, `build-test.md`, and canonical `reference-comparison.md` are still absent.
- correction_reports: REWORK-009 Correction Agent updated current `docs/nonlinear-static-newton-raphson/corrections.md` Section 14, SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator did not edit `corrections.md`.
@@ -13,7 +13,7 @@
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않았으므로 현재 Coordinator failure evidence와 Executor의 `step0-output.json` 및 `step1-output.json`을 source failure report로 사용했다.
Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이며 USER-DECISION-002 option A 이후 current correction과 status는 Section 11이 supersede한다.
Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다.
## 2. Failure Triage
@@ -318,3 +318,327 @@ Reference artifact no-change evidence: `git diff --name-only -- reference`는 em
- status: `corrected-for-implementation-rerun`.
- blockers: 이 correction 범위에는 없음. Existing Python `xhigh`/`extra high` mismatch는 명시된 out-of-scope pre-existing failure다.
- prohibited actions not performed: Harness phase rerun, Step 2, `danger-full-access`, push, commit, reference solver/artifact mutation, build cleanup/deletion.
## 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage
### 12.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` REWORK-007 |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
### 12.2 Failure Triage
- classification: `upstream-contract`
- normalized classification: `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`
- attempt: `1`
- first failed command:
```powershell
ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (CTest test 288)
- evidence tail: copied build-local `shellNL.inp` reaches `severity=error`, `code=nonlinear-nonconvergence` after iteration 100. `generated.HasValue()` is false because no authoritative copied-sibling `shellNL_results.h5` is committed.
- correction-agent reproduction: the exact focused test alone failed deterministically in 103.84 seconds with the same diagnostic. The original reference input was not passed to FESA.
### 12.3 Root Cause Summary
This is not an implementation defect in the observed convergence calculation. The implementation in `src/fesa/analysis/nonlinear_static_procedure.cpp` supplies same-trial free rotational residual, internal moment and external moment to `EvaluateNewtonConvergence`. `src/fesa/analysis/nonlinear_static_control.cpp` then implements the approved `NSNR-069` and formulation Section 14.1 literally:
\[
D_M=\max(\|f_{int,f}^{\phi}\|_\infty,
\|f_{ext,f}^{\phi}\|_\infty),\qquad
\eta_M=\frac{\|r_f^{\phi}\|_\infty}{D_M}
\]
for every nonzero \(D_M\), with the typed absolute `1e-3 force-length` branch available only when \(D_M=0\) exactly.
The approved `reference/shellNL/shellNL.inp` contains only `Set-1, 3, -100000.` under `*CLOAD`; it applies no rotational moment component. Therefore the free rotational external vector is exactly zero and
\[
r_f^{\phi}=f_{int,f}^{\phi}-0=f_{int,f}^{\phi},
\qquad
D_M=\|f_{int,f}^{\phi}\|_\infty=\|r_f^{\phi}\|_\infty.
\]
For every nonzero rotational residual, \(\eta_M=1>10^{-2}\). The channel can pass only if floating-point assembly produces the exact zero vector, at which point and only then the exact-zero branch is selected. Thus the current approved denominator structurally prevents practical convergence for a no-applied-moment shell case even when its residual is well below the approved typed absolute threshold.
The reproduced log contains 100/100 parsed iteration records with exact printed equality between `residual_moment_numerator_norm` and `residual_moment_denominator_scale`; all 100 use `branch=relative` and `pass=0`. Representative values are:
| iteration | numerator | denominator | branch | pass |
| ---: | ---: | ---: | --- | ---: |
| 1 | `2.363968570753043e-09` | `2.363968570753043e-09` | `relative` | 0 |
| 2 | `1.4372536725204554e-06` | `1.4372536725204554e-06` | `relative` | 0 |
| 3 | `3.138301877925187e-06` | `3.138301877925187e-06` | `relative` | 0 |
| 99 | `3.8876064110127118e-06` | `3.8876064110127118e-06` | `relative` | 0 |
| 100 | `4.6441010823627948e-06` | `4.6441010823627948e-06` | `relative` | 0 |
Every listed numerator is below `1e-3 force-length`, but the approved exact-zero-denominator predicate forbids use of that absolute branch. Changing the implementation alone would contradict the approved requirement and formulation.
### 12.4 Correction Scope
- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed production source/header/test/CMake files: none
- preserved dirty Step 11 files: `tests/CMakeLists.txt`, `tests/reference/nonlinear_static_reference_cases_test.cpp`, `tests/reference/nonlinear_static_reference_comparison.cpp`, `tests/reference/nonlinear_static_reference_comparison.h`
- excluded upstream files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md`
- excluded workflow/final reports: phase indexes/status, `implementation-report.md`, `build-test.md`, `reference-comparison.md`
- prohibited actions not performed: production/test/CMake change, threshold or denominator relaxation, Step 11 completion, Step 12 advancement, Abaqus/Nastran/reference solver, reference artifact generation/modification, `danger-full-access`, commit, push
No RED test was added because no implementation correction is authorized: a test requiring this case to pass would encode a new convergence contract before user/upstream approval. The existing focused reference test already provides the failing integration evidence.
### 12.5 Verification Evidence
| purpose | exact command/evidence | result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `1`; 0/1 passed; test 288 failed in 103.84 s with 100-iteration `nonlinear-nonconvergence` |
| iteration-log audit | parse latest copied-run `shellNL_log.txt` fields for every iteration | 100 records; numerator equals denominator in 100/100; `relative` in 100/100; `residual_moment_pass=0` in 100/100 |
| implementation trace | `nonlinear_static_procedure.cpp` residual/internal/external channel construction plus `nonlinear_static_control.cpp` denominator evaluation | matches `NSNR-069` and formulation Section 14.1 exactly |
| input trace | `reference/shellNL/shellNL.inp` lines 149-151 | one translational direction-3 force; no applied rotational moment |
| reference preservation | pre/post SHA-256 plus `git diff -- reference` | all eight declared hashes unchanged; reference diff empty |
| full Ninja/MSVC build/CTest | not run | intentionally stopped at decisive `upstream-contract`; no implementation correction exists to verify |
| Stop | not applicable | Correction was not a Harness Step and made no production/test/CMake change |
| Harness Python pytest | not applicable | no Harness/Hook/agent-config behavior changed |
### 12.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-069` | Step 5 `load-boundary-path-and-convergence-gates`; REWORK-007 | `CORR-NSNR-CONTRACT-001` log audit | focused test 288 | report only | no-applied-moment free rotational residual must have a reachable approved convergence decision; not met by current contract |
| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate` | `NSNR-REF-002`, `NSNR-REF-004` via test 288 | focused test 288 | report only | copied shellNL run produces authoritative HDF5 before comparison; blocked by NSNR-069 contract |
### 12.7 Handoff Recommendation
- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun yet.
- narrowest contract alternative: when the matching external residual-channel scale is exactly zero, select the existing typed absolute gate (`||r_f^phi||inf <= 1e-3 force-length`) even if the internal residual is nonzero; retain the current relative denominator when matching external scale is nonzero.
- broader contract alternative: make residual convergence pass when either its typed absolute gate or its current relative gate passes. This is simpler and symmetric across force/moment channels but changes acceptance for all load-scale regimes.
- scale-based contract alternative: define an explicit nonzero model force-length reference scale for moment residual normalization, including its deterministic characteristic-length source. This is more general but expands the numerical contract and needs formulation/numerical review.
- non-solution: changing the reference deck to add an applied moment would not correct the same structural failure for supported no-moment load cases and would also violate immutable reference ownership in this correction.
Any selected alternative requires the owning upstream documents and tests to be revised and approved before production code changes. Correction Agent does not choose among them.
### 12.8 Stop Condition
- upstream ambiguity: the exact approved `max(internal, external)` denominator and exact-zero branch are the demonstrated cause.
- implementation stop: any code-only pass would relax/reinterpret `NSNR-069` and formulation Section 14.1.
- reference artifact gap: none; all declared reference artifacts exist and remain unchanged.
- repeated failure: normalized classification attempt `1`; no automatic second implementation correction is safe before an upstream decision.
- final stop: status `needs-upstream-decision`; Step 11 remains blocked and Step 12 remains pending.
## 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage
### 13.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-25` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 immutable `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`, Coordinator dispatch, current implementation/CTest와 read-only result/reference audit를 source evidence로 사용했다.
### 13.2 Failure Triage
- initial failure classification: `reference-comparison`
- final classification: `upstream-contract`
- normalized classification: `reference-blocking-model-adequacy-conflict`
- attempt: `1` for `REWORK-008`; 이전 `REWORK-007`은 별도 nonlinear convergence classification이다.
- first failed command in Step 11:
```powershell
cmake --build --preset windows-msvc-ninja-debug; ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- correction-agent reproduction:
```powershell
ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (fresh CTest test 293)
- evidence tail: exit `8`, 0/1 passed, 16.88 s. Row identity/schema/nonfinite prechecks passed before the common tolerance gate reported exactly three failed blocking families: in-plane RF RMS `0.11437709952897851`, transverse RF RMS `0.048448360241294064`, physical spatial RM RMS `0.02746412616679237`, each above `0.01`.
### 13.3 Root Cause Summary
Observed reaction computation/storage/mapping path에는 implementation defect evidence가 없다.
1. `nonlinear_static_procedure.cpp`는 같은 accepted state에서 `residual = internal.force - external.generalized_external_force`를 만들고 `trial.reaction = trial.residual`로 저장한다. `nonlinear_analysis_state.cpp`는 모든 DOF에서 이 두 identity를 검증한다.
2. `nonlinear_hdf5_results_writer.cpp`는 translation reaction을 그대로 쓰고 rotational reaction만 승인식 `J_l(phi)^(-T)`로 physical spatial moment에 변환한다. 24 constrained nodes에서 `phi=0`이므로 이 변환은 identity다. Full-precision HDF5 audit에서 constrained translation과 generalized residual의 차이, constrained moment 변환 차이, constrained `phi`가 모두 exact `0`이었다.
3. Comparator는 `/model/nodal_constraint_mask`와 `(case, state, instance, node label, component)` exact key를 사용한다. 이번 실행이 schema/missing/extra/duplicate/nonfinite failure가 아니라 family tolerance report까지 도달했으므로 storage와 row mapping precheck도 통과했다.
4. Dominant RF3/RM1/RM2 mismatch는 nonlinear 전용 경로에서 생기지 않는다. FESA nonlinear-linear 최대 차이는 RF3 `2.9441580409184098e-06`, RM1 `1.3046948879491538e-05`, RM2 `1.2039316061418504e-05`이고, Abaqus nonlinear-linear 차이는 각각 `0`, `5.0022208599999994e-12`, `1.1141310098e-11`이다. 그럼에도 FESA linear와 Abaqus linear 사이에는 nonlinear과 동일한 local RF3/RM mismatch가 이미 존재한다. 예를 들어 node 31 RF3는 FESA `1059.5675655371299`, reference `339.61334199999999`; node 22 RM1은 FESA `-1564.1175318019484`, reference `-515.62542699999995`다.
5. 전체 constrained reaction 합은 FESA nonlinear `[7.9591888635377472e-12, 7.2906680692597092e-12, 100000.00000082512]`, Abaqus nonlinear `[4.5008441418303846e-13, -1.7997131562808022e-12, 99999.999592799955]`로 global balance와 sign이 일치한다. Stored `/global/equilibrium`도 `[-5.2007287365540833e-12, 2.1302730413008675e-11, 99999.999999999985, 1.5669833723712425e-11, 6.4043503405991029e-12, -3.0183203934097235e-11]`다.
6. RF1/RF2는 nonlinear에서 새로 생기는 weak geometric membrane reaction이지만 FESA extrema `±1.3774894254907935`와 Abaqus extrema `±1.9166318200000001`의 차이는 storage/mapping 오류가 아니다. Linear Abaqus reaction은 거의 zero이고, independent FESA MITC4와 Abaqus S4가 서로 다른 local nodal support-force redistribution을 만들 수 있다는 approved formulation/model limitation 안에 있다.
따라서 demonstrated cause는 nonlinear reaction implementation이 아니라 reference blocking quantity의 model-adequacy 전제다. Approved `reference-model.md`는 linear reaction CSV를 review-only로 두면서, 같은 local RF3/RM distribution을 nonlinear에서 blocking으로 승격한다. Project contract는 FESA MITC4의 integration/stabilization/internal behavior가 Abaqus S4와 동등하다고 주장하지 않는다. Global equilibrium은 맞지만 formulation-sensitive local nodal reaction 분포가 1% RMS를 만족해야 한다는 분석적 또는 독립 benchmark 근거는 없다. 이를 code-only로 Abaqus 값에 맞추는 것은 formulation/model adequacy 또는 reference acceptance contract 변경이며 Correction Agent 범위를 벗어난다.
### 13.4 Correction Scope
- changed report file in this rework: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed production source/header/test/CMake files in this rework: none
- preserved pre-existing dirty Step 11 files, including selector/control/log tests, comparator/reference tests, plan/phase/coordination and upstream approval edits
- excluded upstream contract files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md`
- excluded immutable/reference files: `reference/**`, stored Abaqus CSV, HDF5 schema and tolerance policy
- prohibited actions not performed: new RED test without an implementation defect, production/comparator/test/CMake change, tolerance weakening, reference artifact generation/modification, Abaqus/Nastran/reference solver, Harness phase execution, Step 12/Physics/Release advancement, `danger-full-access`, commit, push
No focused RED test was added because the dataflow audit disproved a bounded nonlinear computation/storage/mapping defect. The existing focused integration test is already RED for an upstream blocking/model-adequacy assumption; encoding a replacement expected result before upstream approval would itself change that contract.
### 13.5 Verification Evidence
Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정했고, `.harness/config.json`/preset가 요구한 `FESA_GTEST_SOURCE_DIR=C:/git/googletest`, `MKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl`, `TBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb`, `HDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake`를 사용했다.
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `8`; 0/1 passed; only three reaction-family RMS gates failed |
| reaction dataflow audit | `nonlinear_static_procedure.cpp` residual/reaction assignment, `nonlinear_analysis_state.cpp` identities, `nonlinear_hdf5_results_writer.cpp` physical-moment projection and comparator exact-key prechecks; build-local datasets dumped with `$hdf5Bin='C:\Program Files\HDF_Group\HDF5\2.1.1\bin'; $env:PATH="$hdf5Bin;$env:PATH"; & "$hdf5Bin\h5dump.exe" -m %.17g -d <dataset> <results.h5>` | exit `0`; constrained pipeline differences and constrained rotation were exact zero |
| nonlinear/linear audit | join build-local FESA HDF5 and immutable CSV rows by exact `(instance, node label, component)` in read-only PowerShell | exit `0`; dominant mismatch is already present in both solvers' linear results and survives nonlinear unchanged |
| targeted nonlinear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441332835013800-0/shellNL_results.h5` | SHA-256 `A82349F1AABDC2B042A7DBF643D0D917B04245B64E5D73F9507B83A2D67FDE91` |
| targeted linear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-441349319977100-1/shell_results.h5` | SHA-256 `167248AB523484FB6F515AE6A309C7380B4A1226B74BE03B207F4532C3064B66` |
| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0`; 0.342 s; configure/generate complete |
| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0`; 0.116 s; `ninja: no work to do.` |
| CTest discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 294 tests discovered |
| full MSVC CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `8`; 293/294 passed; only test 293 failed with the same three RMS values; test 294 comparator invalid-HDF5/warning checks passed |
| source failure hash | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256` | exit `0`; `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91` |
| reference preservation | `git diff -- reference` | exit `0`; empty diff |
| repository identity | `git rev-parse HEAD` | exit `0`; `65b56b1755e4537b48b44476375b6235da732648` |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 production/test/CMake를 변경하지 않았다. Full preset build/CTest를 직접 실행했다. |
| Harness Python pytest | not applicable | Harness Python, Hook, agent config behavior를 변경하지 않았다. |
### 13.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-019` | Step 10 reaction/HDF5 path; REWORK-008 | `CORR-NSNR-REACTION-PIPELINE-001` read-only audit | focused test 293 | report only | accepted full residual, constrained reaction and HDF5 physical moment mapping are identical at constrained zero-rotation DOFs; met |
| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate`; REWORK-008 | `NSNR-REF-015`, `NSNR-REF-017` via test 293 | focused test 293 and full CTest | report only | exact keys/prechecks pass, but three local reaction families exceed blocking RMS `0.01`; not met because approved reference quantity assumes unsupported local S4/MITC4 distribution agreement |
| `FESA-REQ-NSNR-034` | Step 11 model-adequacy audit | `CORR-NSNR-LINEAR-CROSSCHECK-001` | read-only HDF5/CSV audit | report only | distinguish nonlinear reaction implementation error from pre-existing formulation-sensitive local redistribution; implementation-error hypothesis rejected |
### 13.7 Handoff Recommendation
- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun and do not advance Step 12 until an upstream alternative is explicitly selected and approved.
- recommended narrow alternative: align nonlinear local nodal RF/RM disposition with the approved linear reference contract—keep local rows as read-only model-adequacy/physics-review evidence, while blocking reaction evidence is global force/moment equilibrium plus free-residual checks. Blocking displacement comparison remains unchanged.
- local-to-global alternative: retain reaction as a blocking external quantity only after projecting it to formulation-independent global resultant force/moment families; keep exact local nodal rows as warning/characterization evidence.
- local-blocking alternative: if exact local RF/RM rows must remain blocking, Numerical Review/Reference Model owners must supply an analytical or independent formulation-appropriate benchmark, or explicitly approve Abaqus S4 local nodal reaction distribution as an FESA MITC4 model-adequacy target after a mesh/formulation study. Implementation must not calibrate reactions to Abaqus without that decision.
- excluded alternative: tolerance relaxation, row averaging/collapse, comparator weakening or reference artifact rewriting is not acceptable.
Each viable alternative changes blocking quantity/model-adequacy ownership in `requirements.md`, `numerical-review.md`, `reference-model.md`, `io.md` and the implementation/reference plan. Correction Agent does not select or edit those contracts.
### 13.8 Stop Condition
- upstream ambiguity: current contracts simultaneously disclaim Abaqus S4 internal equivalence, make linear local reaction review-only, and require the same formulation-sensitive local distribution as nonlinear blocking evidence.
- implementation stop: no nonlinear reaction computation, storage or exact-key mapping defect was reproduced; a code-only pass would alter formulation/reference meaning.
- reference artifact gap: none; required artifacts exist, remained read-only and have empty reference diff.
- environment blocker: none; configure/build/discovery completed and full CTest reproduced only the intended reference failure.
- repeated failure: `REWORK-008` classification attempt `1`; no automatic implementation correction is safe before the upstream decision.
- final stop: status `needs-upstream-decision`; Step 11 remains blocked, Step 12 remains pending, and Physics/Release remain ineligible.
## 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction
### 14.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `corrected-for-implementation-rerun` |
| owner_agent | `correction-agent` |
| date | `2026-08-28` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 current `step11-output.json` SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`, Coordinator dispatch, preserved attempt-1 TDD evidence와 attempt-2 Stop evidence를 source evidence로 사용했다.
### 14.2 Failure Triage
- classification: `harness`
- normalized classification: `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`
- attempt: `2` under `STEP11-EXECUTION-003`; attempt 1은 1,800초 timeout이고 attempt 2는 아래 shell launch failure다.
- first failed command boundary:
```powershell
codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson --disable unified_exec -
```
- failed target: attempt-2 nested Codex의 첫 PowerShell tool launch.
- evidence tail: nested Codex `0.150.1`이 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`를 선택했다. `workspace-write` runner가 `CreateProcessAsUserW failed: 5 (Access denied)`로 이를 거부해 소스 확인, RED/VERIFY 명령과 Step status update가 실행되지 않았다. Codex process 자체는 `exitCode=0`이지만 blocker agent message만 반환했으므로 Step 성공 evidence가 아니다.
- state evidence: `HEAD=65b56b1755e4537b48b44476375b6235da732648`; Step 11 `pending`; Step 12 `pending`.
### 14.3 Root Cause Summary
이번 실패는 solver, comparator 또는 `1e-8` gate defect가 아니라 Harness child launch environment defect다.
1. 이전 launcher filter는 `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` entry만 제거했다.
2. 따라서 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps` entry와 그 아래 `pwsh.exe` execution alias가 PATH에 남았다.
3. Nested Codex shell resolver는 남은 user-local alias를 선택했고, Windows native `workspace-write` sandbox는 그 alias의 child process 생성을 Windows error 5로 거부했다.
4. PATH에서 `\\WindowsApps(?:\\|$)`에 일치하는 모든 entry를 제거하면 현재 환경의 Program Files entry 세 개와 user-local entry 한 개가 함께 제거된다. 이때 `pwsh`는 resolve되지 않고 `powershell`은 `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`로 resolve된다.
5. Root가 같은 Codex CLI `0.150.1`, `gpt-5.6-terra`, `xhigh`, `--disable unified_exec`, `workspace-write`, `CODEX_HOME=C:\Users\baram\.codex` envelope에서 이 filter를 적용한 nested smoke는 위 Windows PowerShell을 선택해 exact `FESA_CODEX_SHELL_SMOKE_OK`를 출력하고 exit `0`으로 끝났다. Correction audit의 독립 direct smoke도 같은 executable, exact output과 exit `0`을 확인했다.
따라서 repository runner나 Step 11 implementation을 고칠 필요가 없다. Rerun launch에서 PATH predicate만 전체 WindowsApps entry를 제거하도록 바로잡으면 된다.
### 14.4 Correction Scope
- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md`
- changed source/header/test/CMake/runner/phase files: none
- excluded upstream contracts: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `docs/TOLERANCE.md`
- excluded immutable evidence: `reference/**`, stored CSVs and reference inputs
- preserved dirty implementation: all existing Step 11 source, test, comparator, CMake and phase changes
- prohibited actions not performed: Harness phase execution, Step 11 implementation, Step 12, full build/CTest rerun, manual Hook execution, commit, push, `danger-full-access`, reference solver or artifact mutation
Correction은 repository code 변경이 아니라 corrected child-launch envelope와 재실행 경계를 확정한다. Production C++ 변경이 없으므로 새 RED test는 필요하지 않다.
### 14.5 Verification Evidence
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| failure artifact audit | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256`; JSON `exitCode`, `stderr`, blocker message 검사 | exit `0`; SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`; nested process path와 `CreateProcessAsUserW failed: 5` 확인 |
| filter audit | `($env:PATH -split ';') \| Where-Object { $_ -notmatch '\\WindowsApps(?:\\|$)' }`를 child-only PATH로 적용한 뒤 `Get-Command codex,pwsh,powershell` 확인 | four WindowsApps entries removed; Codex `codex-cli 0.150.1`; `pwsh=<none>`; `powershell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` |
| independent direct smoke | filtered PATH에서 `powershell.exe -NoProfile -Command '[Console]::WriteLine($PSHOME); [Console]::WriteLine("FESA_CODEX_SHELL_SMOKE_OK")'` | exit `0`; `$PSHOME=C:\Windows\System32\WindowsPowerShell\v1.0`; exact `FESA_CODEX_SHELL_SMOKE_OK` |
| same-envelope nested Codex smoke | Coordinator/root evidence: Codex `0.150.1`, Terra/xhigh, `--disable unified_exec`, `workspace-write`, aligned `CODEX_HOME`, all-WindowsApps filter | exit `0`; selected system Windows PowerShell and printed exact `FESA_CODEX_SHELL_SMOKE_OK` |
| recovered attempt-1 RED | `ctest --preset windows-msvc-ninja-debug -R 'GlobalForceAndMoment' --output-on-failure` before comparator GREEN | exit `8`; preserved old `<=1e-10` rejected both `5e-9` and exact `1e-8` in `NSNR-REF-024` |
| recovered attempt-1 GREEN | same focused GlobalForceAndMoment CTest after comparator-only shared gate became `1e-8` | exit `0`; 2/2 passed, including inclusive boundary and exact-zero-scale tests |
| focused implementation evidence | attempt-1 focused procedure, HDF5 and global-balance runs; attempt-2 `LastTest.log` named-test audit | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024`, `NSNR-REF-025` all present as passed |
| attempt-2 Stop full CTest | `.harness/build-ninja-msvc-debug/Testing/Temporary/LastTest.log`, SHA-256 `41CA3D4E410F7BFD55E50FC7D40A79D00D26116945C468E74F0E38720E676447` | 302 `Testing` rows, 0 failure markers, final `302/302`; root/Coordinator records full `302/302` pass |
| new full build/CTest | not run | existing evidence was sufficient and dispatch prohibited unnecessary Harness/build/CTest rerun |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 code/test/CMake를 변경하지 않았다. |
| Harness Python pytest | not applicable | runner, Hook 또는 agent config를 변경하지 않았다. |
Attempt-1 RED/GREEN은 recovered immutable execution evidence이며 이 correction에서 재현하거나 새로 주장한 RED가 아니다. Current code를 old threshold로 되돌리지 않았고 reference artifact도 실행·수정하지 않았다.
### 14.6 Traceability
| requirement id | task id | test id | failing command | corrected file | acceptance criterion |
| --- | --- | --- | --- | --- | --- |
| `FESA-REQ-NSNR-019` | Step 11 `equilibrium-projection-and-reference-gate`; REWORK-009 | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | Step 11 agent can read/run the preserved current-arm, spatial-moment and distinct global force/moment evidence under `workspace-write` |
| `FESA-REQ-NSNR-034` | Step 11 reference gate; REWORK-009 | `NSNR-REF-020..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | implementation-owned reference checks can complete without changing disposition, reference artifacts or tolerance |
| Harness Step execution contract | `STEP11-EXECUTION-003`; `REWORK-009` | `CORR-HARNESS-SHELL-002` | user-local WindowsApps `pwsh.exe` launch | `corrections.md` | all PATH entries matching `\\WindowsApps(?:\\|$)` are absent; system Windows PowerShell launches and exact smoke exits `0` |
### 14.7 Handoff Recommendation
- recommendation: return `corrected-for-implementation-rerun` to Coordinator Agent and request one bounded Implementation Agent rerun of Step 11 only.
- exact launch correction: reuse the approved `STEP11-EXECUTION-003` Step11-only wrapper and change only the launch PATH filter to the following predicate after VsDevCmd x64/dependency environment setup and before `codex exec`:
```powershell
$step11PathEntries = $env:PATH -split ';' | Where-Object {
$_ -and $_ -notmatch '\\WindowsApps(?:\\|$)'
}
$env:PATH = $step11PathEntries -join ';'
$env:CODEX_HOME = 'C:\Users\baram\.codex'
$env:FESA_HARNESS_CODEX_SANDBOX = 'workspace-write'
```
- preserve exact runtime: Codex CLI `0.150.1`; implementation-agent `gpt-5.6-terra`/`xhigh`; `--disable unified_exec`; project PreToolUse/Stop hooks; VsDevCmd x64; approved `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`.
- preflight must resolve `powershell` to `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`, leave `pwsh` unresolved, and print exact `FESA_CODEX_SHELL_SMOKE_OK` with exit `0`.
- run only Executor-selected Step 11, no `--push`; hard-stop before Step 12. Do not use `danger-full-access`, run a reference solver, mutate reference artifacts or alter runner/source/test/CMake/phase/upstream/tolerance files as part of this launch correction.
### 14.8 Stop Condition
- repeated failure: normalized classification count is already `2`; if the corrected all-WindowsApps filter still produces the same `CreateProcessAsUserW` failure, do not start another automatic retry. Return `needs-environment-fix` to Coordinator with the new output artifact.
- environment blocker: cleared for one bounded Step 11 rerun by the same-envelope smoke; no repository-local code fix is required.
- upstream ambiguity: none introduced by this correction; fixed `1e-8` force/moment gate and all approved contracts remain unchanged.
- reference artifact gap: none examined or changed in this correction.
- final stop: status `corrected-for-implementation-rerun`; Step 11 and Step 12 remain `pending` until Executor/Implementation owner action.
@@ -1599,7 +1599,15 @@ on any increment/recovery/output failure:
### 14.1 Four convergence channels
Let free translation and rotation-coordinate subvectors carry superscripts \(u\)
and \(\phi\). Residual channels use
and \(\phi\). Define the matching external residual-channel scales
\[
S_{ext}^u=\|\mathbf f_{ext,f}^u\|_\infty,
\qquad
S_{ext}^\phi=\|\mathbf f_{ext,f}^\phi\|_\infty.
\]
When the matching external scale is nonzero, residual channels retain
\[
\eta_R^u=
@@ -1615,10 +1623,31 @@ and \(\phi\). Residual channels use
\|\mathbf f_{ext,f}^\phi\|_\infty)}
\]
when the matching denominator is nonzero. They pass iff
\(\eta_R^u\le10^{-2}\) and \(\eta_R^\phi\le10^{-2}\).
An exact-zero denominator instead passes iff the numerator is at most
\(10^{-3}\) model-consistent force or \(10^{-3}\) model-consistent force-length.
for \(S_{ext}^u>0\) and for \(S_{ext}^\phi>0\), respectively. Each nonzero-external-scale
channel passes iff its ratio is \(\le10^{-2}\). An exact-zero matching external
scale instead selects the existing typed absolute residual gate:
\[
\boxed{
S_{ext}^u=0
\ \Longrightarrow
\|\mathbf r_f^u\|_\infty\le10^{-3}
\quad\text{model-consistent force},}
\]
\[
\boxed{
S_{ext}^\phi=0
\ \Longrightarrow
\|\mathbf r_f^\phi\|_\infty\le10^{-3}
\quad\text{model-consistent force-length}.}
\]
The exact-zero branch selector is the matching external scale itself, not
\(\max(\|\mathbf f_{int,f}\|_\infty,
\|\mathbf f_{ext,f}\|_\infty)\). Therefore a nonzero internal residual does not
select the relative branch when its matching external scale is exactly zero. When
the external scale is nonzero, only the retained relative gate applies.
Let
@@ -2,9 +2,9 @@
> For Harness workers: this plan is an approved Stage 6 planning artifact. It authorizes planning files only. It does not authorize `scripts/execute.py`, C++ implementation, build, CTest, reference solver execution, or evidence-document creation.
**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 구현하고, 승인된 nonlinear MITC4 Newton-Raphson 절차, HDF5 schema v1, log lifecycle, shellNL/shell reference comparison을 검증한다.
**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 완결하고, current-position/spatial-moment global equilibrium, accepted free residual, fine-primary/coarse-companion reference gate와 HDF5 schema v1을 검증한다.
**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않고, 기존 linear numerical/HDF5 의미는 repository-wide output name/log lifecycle 변경만 제외하고 보존한다.
**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. Nonlinear accepted state는 current arm과 spatial physical moment로 applied-plus-reaction balance error를 만들고 기존 `/global/equilibrium`에 저장하며, comparator는 existing schema-v1 nodal datasets에서 constrained reaction resultant와 accepted free residual을 별도로 재구성한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않는다.
**Tech Stack:** C++17, MSVC on Windows, CMake, CTest, GoogleTest, Intel oneAPI MKL/TBB, HDF5, Abaqus `.inp` approved subset, Python 3 Harness scripts.
@@ -15,10 +15,10 @@
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| status | `approved-planning-files-materialized` |
| status | `ready-for-implementation` |
| owner_agent | `implementation-planning-agent` |
| date | `2026-08-24` |
| approval | User approved the final 13-Step draft on `2026-08-24`; Coordinator recorded `DECISION-036`. |
| date | `2026-08-28` |
| approval | User approved the original 13-Step draft on `2026-08-24`, USER-DECISION-003 revision, and delegated the Coordinator-audited REAPPROVAL-012 Stage 6 reapproval/materialization with both normalized factor-one global force and moment balance gates fixed at `<=1e-8` on `2026-08-28`. |
| source_requirement | `docs/nonlinear-static-newton-raphson/requirements.md` |
| source_research | `docs/nonlinear-static-newton-raphson/research.md` |
| source_formulation | `docs/nonlinear-static-newton-raphson/formulation.md` |
@@ -30,21 +30,52 @@
| document | SHA-256 |
| --- | --- |
| `requirements.md` | `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2` |
| `research.md` | `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` |
| `formulation.md` | `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` |
| `numerical-review.md` | `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01` |
| `reference-model.md` | `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3` |
| `io.md` | `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` |
| `requirements.md` | `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` |
| `research.md` raw | `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` |
| `formulation.md` | `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` |
| `numerical-review.md` | `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` |
| `reference-model.md` | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` |
| `io.md` raw | `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9` |
| `io.md` LF-normalized | `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB` |
## Readiness Check
- Upstream document status: Stage 1 requirements approved, Stage 2 research passed, Stage 3 formulation ready for numerical review and approved downstream, Stage 4 numerical/reference review passed for I/O definition, Stage 5 I/O definition approved.
- Upstream document status: Stage 1 requirements, Stage 4 numerical/reference review and Stage 5 I/O definition are complete; REAPPROVAL-012 fixes both factor-one normalized global force and moment balance gates at `<=1e-8`. Stage 3 formulation §§11.4/13.4 already supplies the accepted residual/reaction/global-resultant meaning.
- Missing decisions: none.
- Missing required comparison files: none for declared blocking/reference families.
- Missing required comparison files: none. Fine primary, coarse companion and linear-control exact inputs/CSVs are present; stress files are optional inventory only.
- Planning can proceed: yes.
- REWORK-008의 local reaction blocking conflict는 USER-DECISION-004 option 1로 해소되었다. Local nodal RF/RM은 review-only이고 factor-one global force/moment balance와 accepted free residual이 blocking이다. `AUDIT-001` current-arm/spatial-moment implementation seam은 Step 11에서 RED-first로 닫는다.
- Step 11에는 보존해야 할 uncommitted `NSNR-CTRL-018..021`, `NSNR-LOG-012`, `NSNR-PROC-019`,
`NSNR-HDF5-014`, `NSNR-REF-001..023`, residual-selector GREEN과 comparator/CMake 작업이 있다.
새 계획은 이를 reset/replay하지 않는다.
- `implementation-report.md`, `build-test.md`, canonical `reference-comparison.md`는 아직 없고 Step 12가 actual evidence에서만 생성한다.
- `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.
## Implementation Scope
Included behavior:
- Existing schema-v1 `/global/equilibrium [6]`에 global origin `[0,0,0]`, accepted current
position `X+u`, independently spatial-converted applied/reaction moments를 사용하는
applied-plus-reaction balance error를 기록한다.
- Existing schema-v1 nodal datasets와 exact constraint mask에서 accepted free residual,
constrained reaction resultant와 global balance error를 서로 다른 evidence로 재구성한다.
- Fine nonlinear primary, coarse nonlinear companion와 linear control을 exact read-only artifact로
비교한다. U는 blocking, UR은 warning-only, local RF/RM은 review-only, RM3/stress는 excluded다.
- Internal global force/moment는 dimension-separated normalized `1e-8`, accepted free residual은
NSNR-069으로 blocking 검증하고 external families만 `docs/TOLERANCE.md`를 사용한다.
Excluded behavior and non-goals:
- New HDF5 dataset/schema version, public header/API, tolerance, reference artifact 또는 solver scope
추가가 아니다.
- `fesa.env`, runtime configuration, CLI option 또는 product solver acceptance behavior를 추가하지
않는다. `1e-8`은 comparator-owned internal verification gate의 fixed value다.
- Local nodal reaction을 global sum으로 대체하거나 Abaqus S4와 FESA MITC4 내부 정식화
동등성을 주장하지 않는다.
- Steps 0–10 구현/history replay, selector RED 재현, Abaqus/reference solver 실행, Physics/Release
판정은 포함하지 않는다.
## Global Constraints
- Use `RED -> observed failure -> minimal GREEN -> focused VERIFY -> full CTest` in every implementation Step.
@@ -54,8 +85,12 @@
- Do not create `implementation-report.md`, `build-test.md`, or `reference-comparison.md` before Step 12 produces actual command evidence.
- Do not run Harness from this planning approval. `scripts/execute.py` requires a separate explicit request.
- 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.
- Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and `docs/TOLERANCE.md` exactly.
- Residual force/moment channel은 finite-first 검사 뒤 matching external scale 자체로 분기한다. Exact zero이면 denominator output exact `0`과 typed absolute `1.0e-3`; nonzero이면 retained `max(internal,external)` denominator와 dimensionless relative `1.0e-2`만 사용한다. Tolerance band, zero clamp, `max(1,...)`, absolute/relative OR는 금지한다.
- Correction gates, four-channel logical AND, Full Newton, fixed load-factor stepping, maximum 100 iterations와 `nsnr-log-v1` 39-field label/order/TAB schema는 변경하지 않는다.
- Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. Fine/coarse constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` remain review-only with complete deterministic precheck/error reporting; exclude `RM3` and stress from numeric comparison.
- Preserve schema version 1 and all existing HDF5 paths/shapes/components. Do not add a summary dataset or public header.
- Keep internal global balance/free-residual gates separate from external `docs/TOLERANCE.md`; do not add a floor, `max(1,S)`, zero clamp, averaging or collapse.
- 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
@@ -68,11 +103,12 @@
| Domain | `StaticStepDefinition` in `include/fesa/model/model_types.h`; `StepDefinition` in `include/fesa/model/domain.h`. | Store procedure identity, `NLGEOM`, raw four `*STATIC` values and provenance. Do not store derived factor sequence or PRESELECT state. |
| Parser mapping | `src/fesa/io/abaqus/domain_mapping_context.cpp`, `step_definition_mapper.cpp`. | Accept nonlinear static subset, warning no-op PRESELECT, reject unsupported procedure fail-closed. |
| MITC4 | `include/fesa/elements/mitc4_shell.h`, `src/fesa/elements/mitc4_shell.cpp` are linear small-rotation. | Add separate nonlinear MITC4 files with `Create(...)` from four nodes, four initial frames, `ShellSection`, and `LinearElasticMaterial`; element kernels compute internal residual/tangent/recovery only. |
| Loads/control | Current loads are assembled for linear static RHS. | Step 5 owns global-once fixed CLOAD external vector `f_ext` and exact external load tangent `K_ext`, including projected moment `J_l`/map-Hessian terms, with no incident-element multiplication. Step 5 also owns exact convergence constants: relative `1.0e-2`, zero-scale `1.0e-3` with channel-specific units. Step 10 forms `r = f_int - f_ext` and `K_T = K_int - K_ext`. |
| Loads/control | Preserved partial Step 11 work already changes residual selection to matching external scale exact-zero/nonzero and adds `NSNR-CTRL-018..021`/`NSNR-LOG-012`. | Preserve without replay/redesign; run focused regression before the new equilibrium/reference gate. |
| Equilibrium projection | `src/fesa/analysis/nonlinear_static_procedure.cpp` currently sums raw full residual with initial Domain coordinates and raw rotational covectors. | Apply the constraint mask before rotational conversion; use accepted `X+u`; convert applied and constrained-reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`; store applied-plus-reaction balance only. |
| Source identity | `SourceEntityId { instance_name, source_label, source_label_text }` and `EntityIndex` exist in `include/fesa/core/source_identity.h`; nodes are stored in stable Domain order. | Step 8 baseline uses both `EntityIndex` and full `SourceEntityId`, requires one node baseline per Domain node in stable internal order, rejects label-only or mismatched identities, and preserves identity into HDF5/reference mapping. |
| Solver | `MklPardisoSolver` uses SPD `mtype=2` and upper-triangle copy. | Preserve unchanged; add `TangentSolver` and MKL unsymmetric full CSR `mtype=11`. |
| Results writer | `ResultsWriter` is the backend-neutral linear writer; `Hdf5ResultsWriter` writes schema-v0 single-frame linear output. | Add `NonlinearResultsWriter` backend-neutral boundary and `NonlinearHdf5ResultsWriter` schema-v1 implementation with delayed finalization after log close. |
| Tests | `fesa_unit_tests`, `fesa_integration_tests`, `fesa_reference_tests` use executable-wide labels. | Add focused test sources and use `ctest -R` regex; do not globally relabel existing tests as nonlinear. |
| Results writer | `NonlinearHdf5ResultsWriter` already writes schema-v1 `/global/equilibrium`, but its location attribute is `global-origin`. | Preserve dataset path/shape/components and change exact location identity to `global-balance-error`; no new dataset or public writer boundary. |
| Tests | Existing integration/HDF5 tests and partial nonlinear comparator are registered in existing executables. | Add RED to existing sources; preserve the current CMake registration and use focused `ctest -R` regex without a new target or global relabel. |
## Work Breakdown
@@ -89,7 +125,7 @@
| 8 | `nonlinear-state-commit-rollback` | 3-7 | Factor-zero baseline construction with `EntityIndex` plus `SourceEntityId`, trial/committed nonlinear state, accepted frames, rollback/preservation. |
| 9 | `nonlinear-hdf5-schema-v1-writer` | 8 | Nonlinear HDF5 schema v1 writer using `std::vector<Diagnostic>`. |
| 10 | `prepared-analysis-flow-and-full-procedure` | 0-9 | Single parse/map prepared analysis flow, separate linear/nonlinear executors, delayed writer finalization. |
| 11 | `reference-comparison-gate` | 0-10 | shellNL nonlinear and shell linear real-input reference comparison. |
| 11 | `equilibrium-projection-and-reference-gate` | 0-10 | Preserve partial selector/comparator work; add new current-arm/spatial-moment, HDF5 location, fine/coarse disposition/internal-gate RED tests; make minimal procedure/writer/comparator GREEN; run focused/full verification. |
| 12 | `execution-closure-and-evidence-docs` | 0-11 | Fresh MSVC evidence, deterministic repeat/reference audit, actual-output evidence docs. |
## TDD Test Plan
@@ -101,20 +137,21 @@
| `NSNR-ROT-*` | finite rotation invariants, `J_l`, branch margin, director update. | 2 |
| `NSNR-ELEM-KIN-*` | nonlinear MITC4 creation inputs, TL shell kinematics, fixed-size four-GP recovery rows, degeneracy fail-closed, linear limit. | 3 |
| `NSNR-ELEM-TAN-*` | same-trial internal residual/tangent, directional derivative, objectivity, symmetry only for internal/no-external cases. | 4 |
| `NSNR-CTRL-*` | load factor path, absolute boundary path, global-once fixed loads and load tangent, moment admissibility, typed four convergence gates with `relative`/`zero-scale` branches and non-injectable exact thresholds/units. | 5 |
| `NSNR-CTRL-*` | Existing coverage plus preserved partial `NSNR-CTRL-018..021`: matching-external exact-zero absolute boundaries, retained nonzero relative boundaries, nonfinite-first/no-clamp selection, unchanged correction gates/four-channel AND. Do not replay/fabricate selector RED. | 5,11 |
| `NSNR-SOLVER-*` | nonsymmetric tangent solve, 0x0, nonfinite/failure translation, SPD solver unchanged. | 6 |
| `NSNR-LOG-*` | serializer-owned 39-field UTF-8/LF/TAB Newton log from explicit stage/failure/channel records and fail-closed write/flush/close. | 7 |
| `NSNR-LOG-*` | Existing serializer coverage plus preserved partial `NSNR-LOG-012`: evaluator-produced zero/nonzero-external decisions retain exact denominator, branch, threshold, unit and 39 fields. | 7,11 |
| `NSNR-STATE-*` | factor-zero baseline creation with stable node order and full source identity, trial/committed separation, accepted frame order, full schema-v1 state inventory, finite atomic commit, rollback. | 8 |
| `NSNR-HDF5-*` | `NonlinearResultsWriter` boundary, schema v1 metadata/model/frame datasets, factor-zero metadata, atomic finalization. | 9 |
| `NSNR-PROC-*` | full procedure orchestration, single parse/map, log close before HDF5, deterministic repeat. | 10 |
| `NSNR-REF-*` | original artifact snapshot, temp input copy run, HDF5-to-original-CSV identity mapping, tolerance, classification, report data. | 11 |
| `NSNR-EVID-*` | fresh evidence docs and diff/hash/warning audits from actual command outputs. | 12 |
| `NSNR-HDF5-*` | Existing schema-v1 coverage plus `NSNR-HDF5-014` exact `/global/equilibrium` `location=global-balance-error`; path/shape/components/version unchanged. | 9,11 |
| `NSNR-PROC-*` | Existing procedure coverage plus collision-resolved `NSNR-PROC-019` exact test `NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance`. Approved draft label `NSNR-PROC-011` is not reused because completed Step 10 already owns it. | 10,11 |
| `NSNR-REF-*` | Preserve `NSNR-REF-001..023`, including the current-case old-gate RED in `022`; add `024` inclusive `1e-8` force/moment boundary plus approved between-threshold regression and `025` exact-zero-scale force/moment regression before changing the comparator gate. | 11 |
| `NSNR-EVID-*` | `001..007` freshness, disposition, fine/internal inventory, AUDIT-001, command/provenance and actual-output report checks. | 12 |
## CMake And CTest Plan
- 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 --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`.
- Step 11 adds no target or `add_test`: procedure/HDF5 tests use existing executables and current partial `tests/CMakeLists.txt` comparator registration is preserved without unrelated edits.
- 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:
@@ -125,6 +162,17 @@ ctest --preset windows-msvc-ninja-debug --show-only=json-v1
ctest --preset windows-msvc-ninja-debug --output-on-failure
```
## Candidate Files and Ownership
Candidate paths guide the Implementation Agent and do not finalize a new public API.
| Step | candidate files | responsibility boundary |
| --- | --- | --- |
| 11 RED | `tests/integration/analysis/nonlinear_static_procedure_test.cpp`; `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`; existing partial `tests/reference/nonlinear_static_reference_{comparison.h,comparison.cpp,cases_test.cpp}` | New behavior must fail before production edits; comparator extensions remain test-private. |
| 11 GREEN | `src/fesa/analysis/nonlinear_static_procedure.cpp`; `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` | Current-arm/spatial-moment balance and exact dataset location only; no public header/state/schema expansion. |
| 11 preserve | `src/fesa/analysis/nonlinear_static_control.cpp`; `tests/unit/analysis/nonlinear_static_control_test.cpp`; `tests/unit/analysis/newton_iteration_log_test.cpp`; `tests/CMakeLists.txt` | Preserve uncommitted selector/tests/registration and verify them; do not reset, recreate or redesign. |
| 12 evidence | `docs/PRD.md`; `docs/ARCHITECTURE.md`; `docs/ADR.md`; feature `implementation-report.md`, `build-test.md`, `reference-comparison.md` | Directly superseded global statements and actual evidence only; no C++/test/CMake ownership. |
## Data Flow Contract
1. CLI receives `fesa.exe <model.inp>`.
@@ -132,40 +180,55 @@ ctest --preset windows-msvc-ninja-debug --output-on-failure
3. App derives `<stem>_results.h5` and `<stem>_log.txt` beside the lexically normalized user-addressed `.inp`.
4. App acquires move-only `OutputWriteLease` and retains it until all log and HDF5 work ends.
5. App opens/truncates the log, then `PrepareAnalysisInput(input_path)` parses/maps once into `Domain`.
6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated linear or nonlinear state without opening HDF5. Nonlinear assembly forms `r = f_int - f_ext` and `K_T = K_int - K_ext` from Step 4 internal quantities and Step 5 global-once external quantities. Nonlinear state construction preserves each node's stable `EntityIndex` and full `SourceEntityId`; source label alone is never a row identity.
6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated state without opening HDF5. Nonlinear assembly forms `r=f_int-f_ext` and `K_T=K_int-K_ext`, preserves the existing convergence decisions, then computes accepted global balance in stable node order. For each node it sets `x=X+u`, masks constrained residual components before converting reaction rotation, converts applied and reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`, and accumulates `applied+reaction` force and `x cross force + spatial moment` about `[0,0,0]`.
7. App closes the log successfully before invoking injected `ResultsWriter` or `NonlinearResultsWriter`.
8. HDF5 is the authoritative solver output. CSV views are comparison/debug artifacts only.
8. HDF5 is authoritative. Existing schema-v1 `/global/equilibrium [6]` stores only the applied-plus-reaction balance error with `location=global-balance-error`; existing nodal datasets/mask reconstruct accepted free residual and constrained reaction resultant without new datasets.
9. Comparator copies exact inputs to unique build-local directories, runs only the copies, and executes `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. CSV views are comparison/debug artifacts only.
## Reference Inventory
| path | role | rows | SHA-256 |
| --- | --- | ---: | --- |
| `reference/shellNL-meshfine/shellNL-meshfine.inp` | primary nonlinear input | input | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning CSV | 729 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only CSV | 729 | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` |
| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inventory artifact | 5,408 | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` |
| `reference/shellNL/shellNL.inp` | nonlinear input | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | required displacement CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | required reaction CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | nonblocking inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shellNL/shellNL displacements.csv` | required blocking/warning CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | required review-only CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | optional inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shell/shell.inp` | linear input | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | required displacement CSV | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | nonblocking inventory artifact | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | nonblocking inventory artifact | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
Blocking and warning families:
External comparison families:
| family | components | rows | disposition |
| --- | --- | ---: | --- |
| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking |
| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only |
| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking |
| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only |
| `nonlinear.reaction_inplane_force` | `RF1,RF2`, constrained nodes | 48 | blocking |
| `nonlinear.reaction_transverse_force` | `RF3`, constrained nodes | 24 | blocking |
| `nonlinear.reaction_physical_moment` | `RM1,RM2`, constrained nodes | 48 | blocking |
| `coarse.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking |
| `coarse.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only |
| `coarse.local_reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | review-only |
| `coarse.local_reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | review-only |
| `coarse.local_reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | review-only |
| `fine.translation` | `U1,U2,U3`, nodes `1..729` | 2,187 | blocking |
| `fine.rotation` | `UR1,UR2,UR3`, nodes `1..729` | 2,187 | warning-only |
| `fine.local_reaction_inplane_force` | `RF1,RF2`, 104 constrained nodes | 208 | review-only |
| `fine.local_reaction_transverse_force` | `RF3`, 104 constrained nodes | 104 | review-only |
| `fine.local_reaction_physical_moment` | `RM1,RM2`, 104 constrained nodes | 208 | review-only |
Constrained node labels for shellNL reactions: `1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33`.
Internal blocking families for each fine/coarse accepted factor-one state are free force residual,
free moment residual, global force balance and global moment balance. Global force/moment use separate
normalized `<=1e-8` gates; free residual uses NSNR-069. Constrained reaction resultant force `[3]`
and moment `[3]` is a distinct review-only summary.
Exact shellNL `Frame`: `Increment 10: Step Time = 1.000`.
Constrained labels: coarse `1,3..9,14..17,22..33`; fine `1,3..9,34..57,82..153`.
Step 11 must not run original reference input paths directly. It snapshots exact original artifact inventory, copies input bytes unchanged into a unique build-local temp case directory, runs `FesaApplication` on the copied `.inp`, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and then verifies original reference directory inventory, bytes, timestamps, and hashes are unchanged. HDF5 source path identity matches the copied user-addressed input; source content identity matches the approved input hash.
Exact fine and coarse nonlinear `Frame`: `Increment 10: Step Time = 1.000`.
Step 11 must not run original reference input paths directly. It snapshots each exact original artifact inventory, copies input bytes unchanged into a unique build-local case directory, runs `FesaApplication` on the copy, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and verifies original inventory, bytes, timestamps and hashes are unchanged. HDF5 path identity matches the copied input and source content identity matches the approved input hash.
## Acceptance Traceability Matrix
@@ -176,10 +239,10 @@ Step 11 must not run original reference input paths directly. It snapshots exact
| `FESA-REQ-NSNR-041` | 1,3,10 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-074` | 2,8,10 | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-006` | 4,6,10 | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-007` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-069` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-070` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-008` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-007` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*`, `NSNR-REF-019` |
| `FESA-REQ-NSNR-069` | 5,10,11 | `NSNR-CTRL-018..020`, `NSNR-LOG-012`, `NSNR-REF-019` |
| `FESA-REQ-NSNR-070` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-008` | 5,10,11 | `NSNR-CTRL-020`, `NSNR-PROC-*`, `NSNR-REF-019` |
| `FESA-REQ-NSNR-014` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-046` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-048` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
@@ -187,14 +250,14 @@ Step 11 must not run original reference input paths directly. It snapshots exact
| `FESA-REQ-NSNR-063` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-016` | 1,5 | `NSNR-IO-*`, `NSNR-CTRL-*` |
| `FESA-REQ-NSNR-011` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-019` | 4,8,10 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-019` | 4,8,10,11 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` |
| `FESA-REQ-NSNR-020` | 1 | `NSNR-IO-*` |
| `FESA-REQ-NSNR-021` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-024` | 7,10 | `NSNR-LOG-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-021` | 8,9,10,11 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-HDF5-014` |
| `FESA-REQ-NSNR-024` | 7,10,11 | `NSNR-LOG-012`, `NSNR-PROC-*`, `NSNR-REF-019` |
| `FESA-REQ-NSNR-083` | 0,10,12 | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` |
| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-*`, `NSNR-EVID-*` |
| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-REF-*` |
| `FESA-REQ-NSNR-034` | 11 | `NSNR-REF-*` |
| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-020..023`, `NSNR-EVID-*` |
| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-014`, `NSNR-PROC-019`, `NSNR-REF-022`, `NSNR-REF-024..025` |
| `FESA-REQ-NSNR-034` | 11,12 | `NSNR-REF-020..023`, `NSNR-EVID-003..007` |
## Numerical Review Coverage
@@ -208,7 +271,9 @@ Step 11 must not run original reference input paths directly. It snapshots exact
| patch/sign recovery | 3,4 |
| load/boundary path and `rho_M` | 5,10 |
| Newton factor/iteration lifecycle | 5,7,10 |
| four convergence gates | 5,7,10 |
| four convergence gates | 5,7,10,11; preserved partial selector/control/log work is regression-verified in Step 11 |
| global balance/current-arm/spatial moment | 11 |
| review-only local reaction and fine/coarse reference | 11,12 |
| commit/rollback/determinism | 8,10,11,12 |
## Validation Commands
@@ -226,21 +291,51 @@ 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`.
Step 11 focused commands additionally include:
```powershell
ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure
ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure
ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure
ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure
```
Harness Python validation is not in scope unless a Step changes Harness Python behavior, hook behavior, or agent configuration.
## Risks And Downstream Handoff
- Main implementation risk: current `LinearStaticAnalysis` owns parse/map and HDF5 write internally. Step 10 must refactor through prepared analysis flow so log close precedes HDF5 finalization for both linear and nonlinear runs.
- Main numerical risk: nonlinear MITC4 tangent and finite rotation derivatives must pass internal derivative/objectivity tests before reference comparison can be meaningful.
- Main backend risk: nonlinear tangent can be nonsymmetric. Preserve SPD `MklPardisoSolver` unchanged and add separate `TangentSolver`.
- Handoff to Implementation Agent through Coordinator: execute Steps 0..12 in order, one current Step at a time, with RED observed failure evidence before GREEN implementation, then focused/full CTest. Final reference gate is Step 11; evidence-document closure is Step 12.
- Current numerical risk: nonzero prescribed motion exposes the existing raw-residual/initial-arm
shortcut. The minimal fix must preserve same-state, stable-order and mask-before-spatial-conversion
semantics; passing zero-prescribed shellNL cases alone is insufficient evidence.
- Current reference risk: fine/coarse U and internal balance/free-residual are blocking, but local RF/RM
may still show large review-only errors. Do not convert those findings into omitted rows, relaxed
tolerance or a blocking gate.
- Current worktree risk: Step 11 contains partial selector/comparator/CMake edits. Preserve and continue
those files; do not delete, reset, replay selector RED or replace the comparator design wholesale.
- Handoff to Implementation Agent through Coordinator: after a separate explicit Harness request,
resume only Executor-selected Step 11. Preserve existing `NSNR-PROC-019`, `NSNR-HDF5-014` and
`NSNR-REF-020..023`; first re-observe the current-case old-gate RED, then add `NSNR-REF-024..025`
before changing the comparator-only shared force/moment gate to `1e-8`. Verify preserved
selector/log tests, then run focused/full preset validation.
Step 12 remains actual-evidence closure.
## Harness Step Draft
| Step | name | one-module scope | prerequisites | stop condition |
| ---: | --- | --- | --- | --- |
| 11 | `equilibrium-projection-and-reference-gate` | Nonlinear accepted equilibrium projection, exact HDF5 location and test-private reference gate | Steps 0–10 completed; approved upstream hashes; partial Step 11 work preserved; VsDevCmd/preset dependency environment | Stop on unexpected RED, public API/schema/tolerance/reference change, reference mutation, or any focused/full failure. |
| 12 | `execution-closure-and-evidence-docs` | Fresh evidence reports plus directly superseded PRD/ARCH/ADR statements | Step 11 completed with actual command/reference evidence | Stop if Step 11 is incomplete, evidence is stale/untraceable, a code/test/CMake change is needed, or any final command fails. |
Both Step files contain exact commands, file ownership, RED/GREEN/VERIFY order and prohibitions.
Materialization does not select or execute either Step.
## Open Issues
None.
None blocking planning. Revised upstream contracts and exact required artifacts are complete; actual
RED/GREEN/build/reference outcomes remain Step 11/12 evidence and are not pre-claimed.
## Plan Approval Boundary
The user-approved plan and pending phase files do not authorize Harness execution. `scripts/execute.py nonlinear-static-newton-raphson` requires a separate explicit user request.
The Coordinator-audited REAPPROVAL-012 revision authorizes this planning/phase materialization and
blocked-to-pending recovery. It does not itself execute Harness; Executor invocation remains under
the Coordinator's separately audited execution authority.
+217 -105
View File
@@ -4,20 +4,22 @@
- feature_id: `nonlinear-static-newton-raphson`
- source_requirement: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirement_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`
- source_requirement_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`
- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`
- source_formulation_sha256: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`
- source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md`
- source_numerical_review_sha256: `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`
- source_numerical_review_sha256: `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`
- source_reference_model: `docs/nonlinear-static-newton-raphson/reference-model.md`
- source_reference_model_sha256: `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`
- source_reference_model_sha256: `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/PRD.md`,
`docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md`
- status: `ready-for-coordinator-review`
- owner_agent: `io-definition-agent`
- date: `2026-08-23`
- date: `2026-08-28`
- authoritative_output: input sibling `<stem>_results.h5`
- diagnostic_log: input sibling `<stem>_log.txt`
- hdf5_schema_version: `1`
@@ -386,15 +388,15 @@ failure도 entered iteration이 없으면 iteration record가 없는 log file만
| 7 | `failing_stage` | `none` for completed gate records, otherwise failing stage enum |
| 8 | `residual_force_channel` | literal `residual_force` or `not-evaluated(reason)` |
| 9 | `residual_force_numerator_norm` | `||r_f^u||_inf` or `not-evaluated(reason)` |
| 10 | `residual_force_denominator_scale` | `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)` or `not-evaluated(reason)` |
| 11 | `residual_force_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 10 | `residual_force_denominator_scale` | matching `||f_ext,f^u||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)`; 또는 `not-evaluated(reason)` |
| 11 | `residual_force_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `not-evaluated(reason)` |
| 12 | `residual_force_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 13 | `residual_force_threshold_unit` | `1`, `force`, or `not-evaluated(reason)` |
| 14 | `residual_force_pass` | `0`, `1`, or `not-evaluated(reason)` |
| 15 | `residual_moment_channel` | literal `residual_moment` or `not-evaluated(reason)` |
| 16 | `residual_moment_numerator_norm` | `||r_f^phi||_inf` or `not-evaluated(reason)` |
| 17 | `residual_moment_denominator_scale` | `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)` or `not-evaluated(reason)` |
| 18 | `residual_moment_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 17 | `residual_moment_denominator_scale` | matching `||f_ext,f^phi||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)`; 또는 `not-evaluated(reason)` |
| 18 | `residual_moment_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `not-evaluated(reason)` |
| 19 | `residual_moment_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 20 | `residual_moment_threshold_unit` | `1`, `force*length`, or `not-evaluated(reason)` |
| 21 | `residual_moment_pass` | `0`, `1`, or `not-evaluated(reason)` |
@@ -417,13 +419,29 @@ failure도 entered iteration이 없으면 iteration record가 없는 log file만
| 38 | `outcome` | `accepted`, `continue`, `nonconverged`, or `failed` |
| 39 | `diagnostic_code` | `none` or approved diagnostic code |
Completed gate record는 `failing_stage=none`이고 네 channel의 identity, numerator/norm,
denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum value로 노출한다.
Denominator가 exact zero이면 branch는 `zero-scale`이고 typed threshold는 residual force
`1e-3 force`, residual moment `1e-3 force*length`, correction translation `1e-3 length`,
correction rotation `1e-3 dimensionless`다. Denominator가 nonzero이면 branch는 `relative`이고
threshold는 dimensionless `1e-2`다. Empty free channel은 numerator와 denominator가 exact zero인
`zero-scale` branch로 평가한다.
`nsnr-log-v1`의 39개 field label, order와 TAB-separated `label=value` serialization은
변경하지 않는다. Completed gate record는 `failing_stage=none`이고 네 channel의 identity,
numerator/norm, denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum
value로 노출한다.
Residual channel은 required residual/internal/external vector와 그 infinity norm을 모두 finite로
확인한 뒤 matching external scale `S_ext^u=||f_ext,f^u||_inf` 또는
`S_ext^phi=||f_ext,f^phi||_inf` 자체로 branch를 선택한다. Matching external scale이 exact
zero이면 `residual_*_denominator_scale=0`, `residual_*_branch=zero-scale`로 직렬화하고 numerator에
typed absolute `1e-3 force` 또는 `1e-3 force*length`를 inclusive `<=`로 직접 적용한다.
이 exact `0`은 matching external selector를 직렬화하며 divisor 또는 internal-inclusive max가
아니다. Selector predicate는 `S_ext==0`이고 tolerance band, zero clamp, `max(1,...)`를 쓰지 않는다.
Internal scale 또는 residual numerator가 nonzero여도 이 branch를 `relative`로 바꾸지 않는다.
Matching external scale이 nonzero이면 `residual_*_denominator_scale`은 retained
`max(||f_int,f||_inf,||f_ext,f||_inf)`이고 `residual_*_branch=relative`이며, numerator/denominator
ratio에 dimensionless `1e-2`를 inclusive `<=`로 적용한다. 이 branch에 typed absolute gate를
OR로 추가하지 않는다.
Correction channel은 기존 계약 그대로 current-trial incremental-solution denominator가 exact
zero이면 `zero-scale`과 typed `1e-3 length` 또는 `1e-3 dimensionless`를, nonzero이면
`relative`와 dimensionless `1e-2`를 사용한다. Empty free channel은 exact-zero numerator/scale의
typed `zero-scale` branch로 평가한다. 네 channel의 pass는 `combined_pass`에서 logical AND로만
결합한다.
Early failure record는 entered iteration 하나에 대응한다. 이미 계산된 earlier fields는 실제
finite value를 기록하고, 실패 stage 뒤의 모든 later field는 `not-evaluated(reason)`을 기록한다.
@@ -523,19 +541,43 @@ row는 정확히 하나다. Factor zero는 이 dataset에 row를 갖지 않고 `
| generalized internal force | `/steps/Step-1/frames/<frame>/nodal/generalized_internal_force` | `[node_count,6]` float64 | node row; `[FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; nodal |
| generalized external force | `/steps/Step-1/frames/<frame>/nodal/generalized_external_force` | `[node_count,6]` float64 | node row; `[FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; approved physical moment projection 후 fixed-global dead loads; nodal |
| generalized residual | `/steps/Step-1/frames/<frame>/nodal/generalized_residual` | `[node_count,6]` float64 | node row; `[RU1,RU2,RU3,RPHI1,RPHI2,RPHI3]` | `[force x3,force*length x3]`; nonlinear solution coordinate의 full assembled `f_int-f_ext`; nodal |
| reaction / physical residual projection | `/steps/Step-1/frames/<frame>/nodal/reaction` | `[node_count,6]` float64 | node row; `[RF1,RF2,RF3,RM1,RM2,RM3]` | `[force x3,force*length x3]`; global; constrained entry는 physical reaction, free entry는 same-state equilibrium evidence; rotational columns는 `J_l(phi)^(-T)` spatial moment conversion |
| reaction / spatial full-residual projection | `/steps/Step-1/frames/<frame>/nodal/reaction` | `[node_count,6]` float64 | node row; `[RF1,RF2,RF3,RM1,RM2,RM3]` | `[force x3,force*length x3]`; global; translation은 full generalized residual과 같고 rotation은 `J_l(phi)^(-T)` spatial moment conversion. Constrained reaction은 mask를 generalized residual에 먼저 적용한 뒤 변환하며 accepted free residual의 authority는 이 dataset이 아니라 `nodal/generalized_residual`이다. |
| shell local frame | `/steps/Step-1/frames/<frame>/element/shell/local_frame` | `[element_count,4,3,3]` float64 | element row, midsurface location row `GP1..GP4`, axis row `[E1,E2,E3]`, global component column `[X,Y,Z]` | dimensionless; physical recovery용 fixed-initial shell local frame; rotating Abaqus output frame이 아님 |
| generalized strain | `/steps/Step-1/frames/<frame>/element/shell/generalized_strain` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[E11,E22,G12,K11,K22,K12,G13,G23]` | `[1,1,1,1/length,1/length,1/length,1,1]`; fixed-reference shell local; midsurface |
| section resultant | `/steps/Step-1/frames/<frame>/element/shell/section_resultant` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[N11,N22,N12,M11,M22,M12,Q13,Q23]` | `[force/length x3,force x3,force/length x2]`; fixed-reference shell local; midsurface |
| in-plane stress | `/steps/Step-1/frames/<frame>/element/shell/stress` | `[element_count,4,3,3]` float64 | element row, `GP1..GP4`, section position `[BOTTOM,MIDDLE,TOP]`, component `[S11,S22,S12]` | `force/length^2`; fixed-reference shell local; direct bottom/middle/top evaluation |
| physical strain energy | `/steps/Step-1/frames/<frame>/global/energy` | `[1]` float64 | `[PHYSICAL_STRAIN_ENERGY]` | `force*length`; deterministic element reduction; numerical drilling stabilization 제외 |
| global equilibrium | `/steps/Step-1/frames/<frame>/global/equilibrium` | `[6]` float64 | `[FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3]` | `[force x3,force*length x3]`; global Cartesian; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용 |
| global applied-plus-reaction balance error | `/steps/Step-1/frames/<frame>/global/equilibrium` | `[6]` float64 | `[FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3]` | `[force x3,force*length x3]`; global Cartesian; formulation §13.4의 applied-plus-constrained-reaction balance error; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용; `location=global-balance-error` |
Trial Newton state, iteration history, line search, cutback attempt, damping, automatic
stabilization, numerical drilling stress, drilling energy ratio, `S33`, `S13`, `S23`,
nodal stress extrapolation, element-corner stress, averaged stress, Abaqus integration-point
number에 대한 HDF5 dataset은 만들지 않는다.
#### 7.5.1 Equilibrium Projection and Schema Compatibility
Schema version `1`과 기존 `/global/equilibrium` path/shape는 유지한다. 기존 계약이 이미
global origin `[0,0,0]`, current force arm과 spatial physical nodal moment를 지정했으므로 이
dataset의 authoritative meaning은 처음부터 formulation §13.4의 **global
applied-plus-reaction balance error**다. Raw full-residual sum, initial-coordinate arm 또는 raw
rotation-coordinate covector를 이 path에 쓰는 것은 schema-compatible implementation이 아니다.
이 의미 명확화는 path, shape 또는 component를 바꾸지 않으므로 schema version을 올리지 않는다.
같은 accepted frame의 세 equilibrium quantity는 다음처럼 서로 다른 HDF5 projection으로
재구성된다. 별도 중복 summary dataset은 만들지 않는다.
| logical quantity | authoritative HDF5 projection | coordinates / units | disposition |
| --- | --- | --- | --- |
| accepted free residual | `/model/nodal_constraint_mask==0`인 component를 `/nodal/generalized_residual`에서 선택한다. NSNR-069 scale은 같은 free component의 `/nodal/generalized_internal_force`와 `/nodal/generalized_external_force`에서 계산한다. | translation channel은 global force, rotation-coordinate channel은 generalized force-length | `blocking-internal` |
| constrained reaction resultant | `/model/nodal_constraint_mask`를 `/nodal/generalized_residual`에 먼저 적용해 constrained generalized reaction을 만들고, rotation block만 accepted `phi`의 `J_l(phi)^(-T)`로 spatial moment로 변환한다. Current position은 `/model/nodes.coordinates + /nodal/displacement[UX,UY,UZ]`다. Stable node order로 `sum(F_react)`와 `sum(x cross F_react + M_react)`를 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `review-only-summary` |
| applied-plus-reaction balance error | required dataset `/global/equilibrium`; applied contribution은 accepted `/nodal/generalized_external_force`의 translation block과 `J_l(phi)^(-T)`로 변환한 rotational block, reaction contribution은 바로 위 constrained projection을 사용한다. Stable node order로 formulation §13.4의 합을 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `blocking-internal` |
Componentwise constraint selection은 spatial moment 변환보다 먼저 수행한다. 따라서 partial
rotational constraint나 nonzero prescribed rotation에서도 constrained reaction resultant에 free
generalized residual이 섞이지 않는다. Local `/nodal/reaction` display나 full residual sum을 위 세
quantity 중 다른 하나의 substitute로 사용하지 않는다. Nonzero prescribed translation에서는
initial position이 아니라 accepted current position을 force arm으로 사용한다.
### 7.6 Diagnostics Dataset
`/diagnostics`는 mandatory이며 row가 0개일 수 있다.
@@ -568,9 +610,13 @@ CSV는 FESA output이 아니다. HDF5에서 추출한 deterministic CSV view는
| case id | role | exact path | comparison disposition |
| --- | --- | --- | --- |
| `shellnl-s4-final` | nonlinear input | `reference/shellNL/shellNL.inp` | required source input |
| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required comparison |
| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required comparison |
| `shellnl-meshfine-s4-final` | primary nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required source input |
| `shellnl-meshfine-s4-final` | displacement CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning comparison |
| `shellnl-meshfine-s4-final` | reaction CSV | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | constrained nodes/components only required review |
| `shellnl-meshfine-s4-final` | stress CSV | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional read-only inspection/order evidence only |
| `shellnl-s4-final` | companion nonlinear input | `reference/shellNL/shellNL.inp` | required source input |
| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required blocking/warning comparison |
| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required review |
| `shellnl-s4-final` | stress CSV | `reference/shellNL/shellNL stresses.csv` | optional read-only inspection/order evidence only |
| `shell-s4-linear-limit` | linear control input | `reference/shell/shell.inp` | existing linear MITC4 contract의 required regression input |
| `shell-s4-linear-limit` | displacement CSV | `reference/shell/shell displacements.csv` | required regression comparison |
@@ -578,21 +624,22 @@ CSV는 FESA output이 아니다. HDF5에서 추출한 deterministic CSV view는
| `shell-s4-linear-limit` | stress CSV | `reference/shell/shell stresses.csv` | optional read-only inspection/order evidence only |
Reference artifact file은 workflow에서 rename, rewrite, normalize, zero-clamp, repair,
regenerate하지 않는다.
regenerate하지 않는다. Fine과 coarse nonlinear case는 각각 자기 input/CSV에 독립적으로
비교하며 cross-mesh row mapping이나 interpolation을 만들지 않는다.
### 8.2 Accepted-State and Frame Mapping
- `shellnl-s4-final`은 accepted factor-one HDF5 frame만 비교한다. 해당 frame은
`/steps/Step-1/accepted_frames`에서 `is_factor_one=1`이고 `load_factor=1.0`인 unique row다.
그 `frame_index`가 `/steps/Step-1/frames/<frame>`를 선택한다.
- Required `shellNL` CSV row는 exact `Frame` value
`Increment 10: Step Time = 1.000`만 가져야 하며, 이는 accepted factor-one state로
논리 매핑한다. Required row에 다른 `Frame` 값이 있으면 schema mismatch다.
- `shellnl-meshfine-s4-final`과 `shellnl-s4-final`은 각각 accepted factor-one HDF5 frame만
비교한다. 해당 frame은 `/steps/Step-1/accepted_frames`에서 `is_factor_one=1`이고
`load_factor=1.0`인 unique row다. 그 `frame_index`가
`/steps/Step-1/frames/<frame>`를 선택한다.
- 두 nonlinear case의 required CSV row는 exact `Frame` value
`Increment 10: Step Time = 1.000`만 가져야 하며, 이는 각 case의 accepted
factor-one state로 논리 매핑한다. Required row에 다른 `Frame` 값이 있으면 schema mismatch다.
- `shell-s4-linear-limit` CSV에는 `Frame` column이 없으며
`docs/linear-static-mitc4-shell/io.md`의 existing linear MITC4 final frame
`/steps/Step-1/frames/0`에 매핑한다.
- Trial Newton state, iteration log line, optional stress inventory row는 reference row가
아니다.
- Trial Newton state, iteration log line, optional stress inventory row는 reference row가 아니다.
### 8.3 Nodal Displacement Projection
@@ -602,93 +649,141 @@ Required logical key는 다음과 같다.
(case_id, accepted_state, canonical_instance_name, source_node_label, component)
```
두 case 모두 instance `PART-1-1`에서 node label `1..49`가 정확히 한 번씩 필요하다.
Instance matching은 case-insensitive로 수행하되 report에는 raw spelling을 보존한다.
Instance `PART-1-1`에서 linear/coarse case는 node label `1..49`, fine case는 `1..729`를
각각 정확히 한 번 요구한다. Instance matching은 case-insensitive로 수행하되 report에는 raw
spelling을 보존한다. Row order는 identity가 아니다.
| CSV column | comparison component | nonlinear HDF5 source | linear regression HDF5 source |
| --- | --- | --- | --- |
| `U-U1` | `U1` | `nodal/displacement` column `UX` | `nodal/displacement` column `UX` |
| `U-U2` | `U2` | `nodal/displacement` column `UY` | `nodal/displacement` column `UY` |
| `U-U3` | `U3` | `nodal/displacement` column `UZ` | `nodal/displacement` column `UZ` |
| `UR-UR1` | `UR1` | `nodal/displacement` column `URX` | `nodal/displacement` column `URX` |
| `UR-UR2` | `UR2` | `nodal/displacement` column `URY` | `nodal/displacement` column `URY` |
| `UR-UR3` | `UR3` | `nodal/displacement` column `URZ` | `nodal/displacement` column `URZ` |
| `U-U1` | `U1` | factor-one `nodal/displacement` column `UX` | final `nodal/displacement` column `UX` |
| `U-U2` | `U2` | factor-one `nodal/displacement` column `UY` | final `nodal/displacement` column `UY` |
| `U-U3` | `U3` | factor-one `nodal/displacement` column `UZ` | final `nodal/displacement` column `UZ` |
| `UR-UR1` | `UR1` | factor-one `nodal/displacement` column `URX` | final `nodal/displacement` column `URX` |
| `UR-UR2` | `UR2` | factor-one `nodal/displacement` column `URY` | final `nodal/displacement` column `URY` |
| `UR-UR3` | `UR3` | factor-one `nodal/displacement` column `URZ` | final `nodal/displacement` column `URZ` |
`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 두 case 모두 warning-only다. UR warning
`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 모든 case에서 warning-only다. UR warning
exceedance는 blocking verdict를 바꾸지 않는다.
### 8.4 Nonlinear Constrained Reaction Projection
### 8.4 Nonlinear Local Reaction Review Projection
Reaction comparison은 `shellnl-s4-final`에만 적용하며 input boundary mask의 constrained node
중 아래 24개 node에만 적용한다.
Reaction review row는 input boundary mask로 선택한다.
```text
1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33
```
- coarse `shellnl-s4-final`: `1,3..9,14..17,22..33` — 24 nodes;
- fine `shellnl-meshfine-s4-final`: `1,3..9,34..57,82..153` — 104 nodes.
승인 input에서 이 24개 node는 여섯 global DOF가 모두 constrained다. Comparator는 required
HDF5 reaction row eligibility를 CSV zero value가 아니라 `/model/nodal_constraint_mask`와
source node identity에서 도출한다.
승인 input에서 위 node들은 여섯 global DOF가 모두 constrained다. Comparator는 row
eligibility를 CSV zero value나 row position이 아니라 `/model/nodal_constraint_mask`와 source
node identity에서 도출한다. Translation reaction은 factor-one
`nodal/generalized_residual`의 constrained `RU1..RU3`이고, rotational reaction은 constrained
`RPHI1..RPHI3`를 먼저 선택한 뒤 accepted `phi`의 `J_l(phi)^(-T)`로 변환한 spatial physical
moment다. Stored all-six-constrained rows에서는 factor-one `/nodal/reaction`의 대응 column과
동일해야 한다.
| CSV columns | logical family | HDF5 source | disposition |
| CSV columns | coarse family | fine family | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | `nonlinear.reaction_inplane_force` | factor-one `/nodal/reaction` columns `RF1,RF2` | blocking |
| `RF-RF3` | `nonlinear.reaction_transverse_force` | factor-one `/nodal/reaction` column `RF3` | blocking |
| `RM-RM1`, `RM-RM2` | `nonlinear.reaction_physical_moment` | factor-one `/nodal/reaction` columns `RM1,RM2`; `J_l(phi)^(-T)` 변환 뒤 spatial physical moment | blocking |
| `RM-RM3` | excluded | comparison projection 없음 | blocking 및 warning-only family에서 제외 |
| `RF-RF1`, `RF-RF2` | `coarse.local_reaction_inplane_force` | `fine.local_reaction_inplane_force` | `review-only` |
| `RF-RF3` | `coarse.local_reaction_transverse_force` | `fine.local_reaction_transverse_force` | `review-only` |
| `RM-RM1`, `RM-RM2` | `coarse.local_reaction_physical_moment` | `fine.local_reaction_physical_moment` | `review-only` |
| `RM-RM3` | comparison projection 없음 | comparison projection 없음 | `excluded` |
Raw generalized rotation-coordinate residual column은 Abaqus `RM` CSV column과 직접 비교하지
않는다.
Raw generalized rotation-coordinate residual은 Abaqus `RM` CSV column과 직접 비교하지 않는다.
Review-only family도 source key, schema, inventory, finite value와 모든 row/common-policy error를
보고한다. 그 precheck 또는 numerical finding은 blocking verdict를 바꾸지 않는다.
### 8.5 Comparison Families
### 8.5 Internal Factor-One Equilibrium Projection
Internal equilibrium은 Abaqus CSV comparison이 아니다. Fine primary와 coarse companion의
각 accepted factor-one HDF5 frame에서 Section 7.5.1의 projection을 사용한다.
| family id | exact HDF5 rows/components | gate |
| --- | --- | --- |
| `coarse.accepted_free_force_residual` | 75 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel |
| `coarse.accepted_free_moment_residual` | 75 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel |
| `coarse.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` |
| `coarse.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` |
| `fine.accepted_free_force_residual` | 1,875 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel |
| `fine.accepted_free_moment_residual` | 1,875 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel |
| `fine.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` |
| `fine.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` |
Global balance의 force scale은 applied/reaction nodal force contribution의 2-norm 합 중 큰
값, moment scale은 current-arm force moment와 spatial physical nodal moment contribution의
2-norm 합 중 큰 값이다. Force와 moment를 분리해 `norm(balance_error)/scale<=1e-8`을
적용한다. Scale이 exact zero이면 balance error도 exact zero일 때만 pass한다. Absolute floor,
`max(1,S)` 또는 zero clamp는 없다. Accepted free residual은 NSNR-069의 external-channel exact-zero/
nonzero branch를 그대로 재현한다. 이 internal gate에는 `docs/TOLERANCE.md`, Abaqus value 또는
local reaction error를 적용하지 않는다.
Constrained reaction resultant force `[3]`와 moment `[3]`는 Section 7.5.1의 distinct
`review-only-summary`로 함께 계산·보고한다. `/global/equilibrium`, constrained reaction
resultant와 accepted free residual 중 어느 하나를 다른 quantity의 대체 dataset으로 쓰지 않는다.
### 8.6 External Comparison Families
External tolerance source는 정확히 `docs/TOLERANCE.md`다. 별도 absolute floor, `max(1,S)`
clamp, row averaging, source-order matching, component calibration, zero clamp는 허용하지
clamp, row averaging, source-order matching, component calibration 또는 zero clamp는 허용하지
않는다.
| family id | case | components | required row count | units / coordinates | disposition |
| --- | --- | --- | ---: | --- | --- |
| `linear.translation` | `shell-s4-linear-limit` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking regression |
| `linear.rotation` | `shell-s4-linear-limit` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking |
| `nonlinear.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / fixed-initial global plane | blocking |
| `nonlinear.reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / fixed-initial global transverse | blocking |
| `nonlinear.reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | blocking |
| `coarse.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking |
| `coarse.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `coarse.local_reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / global shell plane | review-only |
| `coarse.local_reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / global transverse | review-only |
| `coarse.local_reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | review-only |
| `fine.translation` | `shellnl-meshfine-s4-final` | `U1,U2,U3` on nodes `1..729` | 2,187 | length / global | blocking |
| `fine.rotation` | `shellnl-meshfine-s4-final` | `UR1,UR2,UR3` on nodes `1..729` | 2,187 | dimensionless / fixed-initial global | warning-only |
| `fine.local_reaction_inplane_force` | `shellnl-meshfine-s4-final` | `RF1,RF2` on constrained nodes | 208 | force / global shell plane | review-only |
| `fine.local_reaction_transverse_force` | `shellnl-meshfine-s4-final` | `RF3` on constrained nodes | 104 | force / global transverse | review-only |
| `fine.local_reaction_physical_moment` | `shellnl-meshfine-s4-final` | `RM1,RM2` on constrained nodes | 208 | force*length / global spatial | review-only |
Reference-model read-only scale audit value는 다음과 같다.
Reference-model read-only scale audit value는 다음과 같다. 이 값은 calibration 상수가 아니다.
| family id | `S=max(abs(reference))` | `0.01*S` |
| --- | ---: | ---: |
| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
| `coarse.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `coarse.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.local_reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `coarse.local_reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `coarse.local_reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
| `fine.translation` | `2.57957054e-5` | `2.57957054e-7` |
| `fine.rotation` | `6.58704994e-6` | `6.58704994e-8` |
| `fine.local_reaction_inplane_force` | `5.38827419e-1` | `5.38827419e-3` |
| `fine.local_reaction_transverse_force` | `2.78506128e3` | `2.78506128e1` |
| `fine.local_reaction_physical_moment` | `4.71557520e3` | `4.71557520e1` |
### 8.6 Row Prechecks
### 8.7 Row Prechecks
아래 조건 중 하나라도 거짓이면 comparator는 tolerance 계산 전에 실패한다.
Tolerance 또는 internal metric 전에 다음을 검사한다.
1. Exact declared input path와 required CSV path가 존재하고 readable이다.
1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable이다.
2. Reference CSV header는 surrounding whitespace trim 뒤 필요한 column을 가진다.
3. `shellnl-s4-final` required row는 exact approved `Frame` value만 포함한다.
3. 두 nonlinear case required row는 exact approved `Frame` value만 포함한다.
4. HDF5 metadata, model rows, accepted-frame table, factor-one frame, required result dataset이
문서화된 shape, component name, finite value를 가진다.
5. Wide CSV row는 이 문서의 component mapping으로 component row로 expand한다.
6. Required source wide key와 expanded component key는 unique하다. Duplicate reference 또는
HDF5 key는 실패다.
7. 각 declared family에서 FESA와 reference projected key set은 정확히 같아야 한다. Missing row와
extra row는 모두 실패다.
8. 모든 required numeric value는 finite다. Nonfinite HDF5 또는 CSV value는 tolerance 전 실패다.
9. `shellNL` reaction row는 constrained mask와 exact 24-node list에서 선택한다. Free-node CSV
row는 inventory only이며 zero reaction target으로 해석하지 않는다.
10. Required row를 omit, synthesize, average, substitute identity로 sort, normalize, zero-clamp,
repair하지 않는다.
문서화된 shape, component name, attributes와 finite value를 가진다.
5. Wide CSV row는 이 문서의 component mapping으로 component row로 deterministically expand한다.
6. Source wide key와 expanded component key는 unique하다. Duplicate reference 또는 HDF5 key는
affected family를 tolerance 전에 fail한다.
7. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero value나 row
position으로 reaction identity를 추론하지 않는다.
8. 각 declared external family에서 FESA와 reference projected key set은 exact equal해야 한다.
Missing row와 extra row를 모두 fail한다.
9. Required HDF5/CSV value, derived scale, norm과 metric은 모두 finite여야 한다.
10. Internal free residual은 exact free mask와 force/moment channel을 보존한다. Global balance는 모든
applied source와 constrained reaction을 stable source order로 정확히 한 번 사용한다.
11. Local review row를 global resultant로 collapse하거나 대체하지 않는다. Review-only precheck/error는
deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다.
12. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를
변경하지 않는다. Blocking precheck failure만 전체 external comparison을 fail한다.
13. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를
허용하지 않는다.
### 8.7 Stress CSV Disposition
### 8.8 Stress CSV Disposition
Optional stress CSV identity는 다음과 같다.
@@ -697,13 +792,16 @@ Optional stress CSV identity는 다음과 같다.
element_corner_node_label, section_surface, component)
```
현재 stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`,
`S-S22`, `S-S33`, `S-S12`를 포함하며, 저장된 ascending element-label block `1..36` 순서를
갖는다. FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다.
Stored stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`,
`S-S22`, `S-S33`, `S-S12`를 포함한다. `reference/shell/shell stresses.csv`는 사용자가
변경한 ascending element-label block `1..36` 순서를 갖지만 row order는 identity가 아니다.
Fine stress CSV의 element `1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded artifact
finding으로만 기록한다. Artifact를 수정하지 않는다.
따라서 두 case의 stress CSV는 optional read-only inspection 및 order evidence only다. HDF5
comparison projection, `S33` synthesis, nodal extrapolation, corner averaging, Gauss-to-corner
matching, element-label-order identity는 없다.
FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다.
따라서 모든 stored stress CSV는 optional read-only inspection/order evidence only다. HDF5
numerical-comparison projection, `S33` synthesis, nodal extrapolation, corner averaging,
Gauss-to-corner matching 또는 element-label-order matching은 없다.
## 9. Validation Rules
@@ -723,13 +821,14 @@ matching, element-label-order identity는 없다.
| aggregate moment | exact-zero case 또는 preprocessing 및 모든 entered trial에서 `rho_M<=1e-12` | model/solver, exit `4` 또는 `5` |
| nonlinear static data | 네 positive finite values, endpoint `1.0`, fixed increment sequence with final exact factor one | input, exit `3` |
| Newton iteration | iteration identity `1..100`; iteration `100` acceptance 가능; iteration `101` 없음; line search/cutback/retry/fallback 없음 | solver, exit `5` |
| convergence channels | residual force, residual moment, correction translation, correction rotation이 모두 inclusive `<=` rule 또는 typed zero-scale threshold 통과 | solver, exit `5` |
| convergence channels | finite-first 평가 뒤 residual force/moment는 matching external scale exact-zero이면 typed absolute `1e-3`, nonzero이면 retained `max(internal,external)` relative `1e-2`; correction translation/rotation은 기존 denominator branch; 네 channel 모두 inclusive `<=`이고 logical AND | solver, exit `5` |
| nonfinite data | required residual, tangent, correction, state, load, recovery, output value가 acceptance 전 finite | solver/output, exit `5` 또는 `6` |
| commit/rollback | complete converged candidate만 commit; failure는 prior committed state와 prior authoritative final HDF5 보존 | solver/output, exit `5` 또는 `6` |
| HDF5 schema | exact paths, shapes, attributes, schema version, row identities, finite values, accepted-frame table, diagnostics; final replace는 log close success 뒤에만 허용 | output, exit `6` |
| HDF5 schema | exact paths, shapes, attributes, schema version, row identities, finite values, accepted-frame table, diagnostics; `/global/equilibrium`은 applied-plus-reaction balance error이고 accepted free residual/constrained reaction resultant와 분리됨; final replace는 log close success 뒤에만 허용 | output, exit `6` |
| equilibrium projection | accepted free rows는 generalized residual과 exact free mask, constrained reaction은 mask-before-spatial-conversion, global balance는 applied plus constrained reaction/current arm/origin `[0,0,0]`; factor-one global force와 moment는 각각 dimension-separated normalized `<=1e-8`; 세 quantity가 같은 accepted state를 공유하되 서로 대체되지 않음 | solver/output/reference internal gate |
| log | UTF-8 no BOM, LF, TAB-separated fixed `label=value` schema; entered Newton iteration마다 record 하나; no per-iteration stderr duplication; no-Newton procedure는 zero-byte empty log; open/write/flush/close fail-closed | output, exit `6` |
| reference rows | exact required artifacts, headers, row keys, component keys, finite values, factor-one frame mapping | reference precheck |
| tolerance | exact `docs/TOLERANCE.md` family-scale row/RMS policy; blocking/warning disposition 보존 | reference verification |
| reference rows | fine primary/coarse companion/linear-control exact artifacts, headers, row keys, component keys, finite values, factor-one frame mapping과 disposition별 precheck | reference precheck |
| tolerance | external family에만 exact `docs/TOLERANCE.md` row/RMS policy 적용; U blocking, UR warning-only, local RF/RM review-only 보존; internal global balance/free residual gate와 혼합 금지 | reference/internal verification |
Downstream test가 다뤄야 하는 approved diagnostic code는 다음을 포함한다.
@@ -785,21 +884,34 @@ Downstream handoff to Implementation Planning Agent through Coordinator:
MITC4 contract의 regression으로 남는지 test한다.
- HDF5 schema version `1`을 위 accepted-frame schema 그대로 구현한다. Factor-zero non-frame
handling, unique factor-one frame selection, triad/director projection, no
compression/chunking, no trial-state HDF5 history를 포함한다.
compression/chunking, no trial-state HDF5 history를 포함한다. `/global/equilibrium` path/shape는
유지하되 authoritative meaning을 applied-plus-reaction balance error로 검증한다.
- `AUDIT-001`을 별도 test로 닫는다. Accepted free residual은 generalized residual/internal/external
force와 exact free mask, constrained reaction resultant는 mask-before-`J_l(phi)^(-T)`와 accepted
current arm, global balance는 applied plus constrained reaction을 사용한다. Nonzero prescribed
translation/rotation case에서도 initial arm, raw rotational covector 또는 raw full-residual sum을
세 quantity의 공통 substitute로 쓰지 않는다.
- 비대칭 lifecycle을 보존한다. Log는 usage validation, lexical path derivation, single-writer
lock 뒤 live current-run audit이고, log create/open/truncate는 Analysis 전 abort, write/flush는
즉시 abort, close failure는 HDF5 commit을 block한다. HDF5 final은 log close와 candidate
self-check 성공 뒤에만 replace하며 failure는 prior valid final과 current log를 손상하지 않는다.
- Newton log parser/schema test는 UTF-8 no BOM, LF, physical TAB-separated fixed
`label=value` field order, finite round-trip numerics, escaping, completed-gate four-channel
metrics, early-failure `not-evaluated(reason)`, no-Newton zero-byte log, zero per-iteration
stderr duplication, flush-before-next/return을 포함한다.
- Exact CSV paths, trimmed headers, exact `shellNL` `Frame` value, source node/component
identity, constrained reaction mask, missing/extra/duplicate rows, nonfinite values를
tolerance 전에 precheck한다.
- Declared family에는 `docs/TOLERANCE.md`만 적용한다. `U`는 blocking, `UR`은 warning-only,
`RF1/RF2`, `RF3`, physical spatial `RM1/RM2`는 blocking으로 유지하고 `RM3`와 모든 stress
CSV value는 제외한다.
`label=value` 39-field order, finite round-trip numerics, escaping, completed-gate four-channel
metrics, residual matching-external-scale exact-zero/nonzero branch와 retained nonzero-scale
denominator, typed thresholds, four-channel AND, early-failure `not-evaluated(reason)`, no-Newton
zero-byte log, zero per-iteration stderr duplication, flush-before-next/return을 포함한다.
- Fine primary, coarse companion과 linear control의 exact CSV path, trimmed header, 두 nonlinear
case의 exact factor-one `Frame`, source node/component identity, constrained reaction mask,
missing/extra/duplicate row와 nonfinite value를 tolerance 전에 precheck한다. Row order를 identity로
쓰지 않는다.
- External declared family에는 `docs/TOLERANCE.md`만 적용한다. `U1/U2/U3`는 blocking,
`UR1/UR2/UR3`는 warning-only, local `RF1/RF2/RF3`와 spatial physical `RM1/RM2`는
review-only다. Local `RM3`와 모든 stress CSV value는 제외한다. Review-only row의
schema/inventory/error report를 생략하거나 blocking으로 되돌리지 않는다.
- Fine/coarse factor-one global force/moment balance는 dimension-separated normalized `<=1e-8`,
accepted free force/moment residual은 NSNR-069으로 blocking 검증한다. 이 internal gate에
Abaqus CSV나 `docs/TOLERANCE.md` scale을 사용하지 않는다. Constrained reaction resultant는
distinct review-only summary로 보고한다.
- Optional stress CSV는 read-only inventory/order evidence only로 유지한다. Nodal stress
extrapolation, corner averaging, `S33` synthesis, element-label-order matching을 추가하지
않는다.
@@ -1,188 +1,233 @@
# Nonlinear Static Newton-Raphson 수치 검토
## 1. Metadata and source formulation
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_formulation_status: `ready-for-numerical-review`
- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`
- source_formulation_sha256: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirements_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`
- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`
- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/TOLERANCE.md`
- related_linear_contracts: `docs/linear-static-mitc4-shell/numerical-review.md`,
`docs/linear-static-mitc4-shell/reference-model.md`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- diagnostic_evidence: `docs/nonlinear-static-newton-raphson/corrections.md` §13,
`docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-23`
- date: `2026-08-28`
이 검토는 정식화를 수학 및 수치 알고리즘 계약으로만 검토했다. C++ API, HDF5 schema,
implementation plan, reference solver 실행, reference artifact 생성/수정은 수행하지 않았다.
이 검토는 정식화를 수학·수치 알고리즘 계약으로 검토하고 기존 reference artifact를
읽기 전용으로 조사했다. C++ API, 최종 HDF5 dataset path, implementation plan 또는
reference artifact를 설계·실행·생성·수정하지 않았다.
## 2. Review Verdict
- verdict: `pass-for-io-definition`
- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation
state, nonlinear `24 -> 20` map, objective drilling, fixed-global load work,
same-trial residual/tangent, Full Newton convergence, recovery와 state commit/rollback
의미를 구현 가능한 수치 계약으로 닫고 있다. 차원, 부호, DOF 순서, 적분, reaction
의미 또는 reference identity와 충돌하는 blocking defect는 확인되지 않았다.
- reference readiness: `reference/shellNL` 및 `reference/shell`의 선언 파일과 CSV는
읽을 수 있고 row identity/precheck/tolerance 계약을 정의할 수 있다.
- boundary: 이 verdict는 I/O Definition 진입 허가이며 implementation, reference comparison
pass, physics evaluation 또는 release readiness 승인이 아니다.
`reference/shellNL`은 `nlgeom=YES`와 factor-one final frame을 갖는 저장 reference로 사용할 수
있지만, 주요 `U3`와 stress 값은 선형 `reference/shell`과 거의 같다. 관찰된 nonlinear 신호는
주로 약한 in-plane coupling이다(`RF1/RF2` 최대 약 `1.9166`, `U1/U2` 최대 약
`1.29e-11`). 따라서 이 CSV 세트만으로 finite-rotation objectivity, exact tangent,
rollback 또는 큰 변위 benchmark를 통과했다고 판단하지 않는다. 해당 항목은 아래의
blocking internal tests로 분리한다.
- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation,
nonlinear `24 -> 20` map, objective drilling, same-trial residual/tangent, reaction의
spatial-moment 변환과 current-arm global balance를 구현 가능한 수치 계약으로 정의한다.
Revised requirements와 충돌하는 formulation defect는 없다.
- reaction disposition: local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 exact
source-key/schema/inventory/finite/error evidence를 유지하는 `review-only`다. 이 값은
formulation-sensitive nodal redistribution이므로 blocking verdict를 결정하지 않는다.
Local `RM3`는 계속 제외한다.
- blocking equilibrium: 각 nonlinear case의 factor-one accepted state에서 `(a)` global
applied-plus-reaction force balance, `(b)` global applied-plus-reaction moment balance,
`(c)` accepted free-DOF force/moment residual evidence가 blocking이다. `(d)` constrained
reaction resultant는 별도 quantity로 보존하지만 balance error를 대신하지 않는다.
- reference readiness: `reference/shell`, `reference/shellNL`와
`reference/shellNL-meshfine`의 선언 input 및 필요한 displacement/reaction CSV가 존재하고
읽을 수 있다. Fine case는 사용자가 요청한 mesh-refined nonlinear evidence이며 coarse
case와 서로의 reference에 독립적으로 비교한다.
- boundary: `pass-for-io-definition`은 I/O 계약을 다시 정의할 수 있다는 뜻이며 reference
comparison pass, implementation completion, physics 또는 release 승인이 아니다.
## 3. Critical Findings
### Confirmed defects
### 3.1 Confirmed defects
없음. Formulation Agent 또는 Research Agent로 즉시 되돌릴 confirmed numerical defect는 없다.
Formulation Agent 또는 Research Agent로 반환할 confirmed defect는 없다. Formulation
§11.4는 constrained generalized reaction과 spatial physical moment를 구분하고, §13.4는
global origin `[0,0,0]`, current nodal position과 physical spatial moment를 사용하는
applied-plus-reaction balance를 명시한다.
### Numerical risks requiring downstream evidence
### 3.2 Required downstream correction: `AUDIT-001`
- `shellNL`의 stored reference는 geometric nonlinearity가 켜진 최종 상태 비교에는 충분하지만
response amplitude가 작아 finite-rotation/tangent/objectivity 검증을 대신하지 못한다.
- Abaqus stress CSV는 `(instance, element label, element-corner node label,
section point, component)` identity로 완전하지만 FESA의 approved Gauss-location direct
bottom/middle/top recovery와 location이 다르다. Current stored order는 element label
`1..36` ascending block이며 이를 바꾸지 않는다. Nodal extrapolation/averaging을 만들지
않고 stress CSV는 comparison family에서 제외한다.
- External `UR` comparison은 기존 MITC4 정책에 따라 `warning-only`다. Rotation/director
correctness는 `Q`, `d`, branch, objectivity invariant tests에서 blocking으로 확인해야 한다.
Stage 5/6은 같은 accepted state에서 다음 세 quantity를 서로 바꿔 쓰지 않아야 한다.
### Open questions
1. **Global applied-plus-reaction balance error**: applied와 constrained reaction을 더한
force `[3]`와 moment `[3]`; blocking.
2. **Constrained reaction resultant**: constrained reaction만 합한 force `[3]`와 current-arm
moment `[3]`; distinct nonblocking reaction summary.
3. **Accepted free residual**: stable free-DOF source/component rows와 force/moment channel gate;
blocking.
현재 I/O Definition 진입을 막는 open question은 없다. Large-response public benchmark,
MMS, broader locking/distortion characterization은 유용하지만 승인된 Stage 4 pass 조건은 아니다.
현재 nonlinear implementation helper는 full residual을 합하고 initial Domain coordinates와
raw rotational generalized residual을 사용한다. 현재 `shellNL`/`shellNL-meshfine` support는
prescribed `u=phi=0`이므로 initial/current support arm과 generalized/spatial support moment가
일치하고, 이 helper는 작은 free residual을 제외하면 constrained reaction resultant에
가깝다. 그러나 applied load를 더한 balance error는 아니며 세 quantity 중 어느 것도
일반적으로 대체하지 못한다. 지원 범위의 nonzero prescribed translation/rotation에서는
반드시 current position과 `J_l(phi)^(-T)` spatial-moment conversion을 적용해야 한다.
### 3.3 Numerical risks and nonblocking artifact issue
- Fine stress CSV에는 element `1`, `SNEG`의 `Node Label=ss` 한 행이 있다. Stress는 승인된
FESA Gauss direct recovery와 위치가 다르고 수치 comparison에서 제외되므로 이 optional
inspection artifact의 malformed identity는 I/O 진입 blocker가 아니다. Artifact를 repair,
normalize 또는 rewrite하지 않는다.
- Coarse/fine Abaqus `S4`와 FESA MITC4가 동일한 local support reaction distribution을
만들어야 한다는 formulation evidence는 없다. Global balance와 free residual로 blocking
physics를 검증하고 local rows는 오차를 숨기지 않은 채 review-only로 남긴다.
- Stored cases의 response는 weak geometric-nonlinear regime다. Reference displacement pass가
tangent, objectivity, finite-rotation 또는 rollback 검증을 대신하지 않는다.
### 3.4 Open questions
I/O Definition 진입을 막는 open question은 없다. Public large-response benchmark, shell MMS와
broader locking/distortion portfolio는 useful future evidence지만 이번 gate의 추가 조건이 아니다.
## 4. Numerical Risk Assessment
| risk label | assessment | required control / downstream evidence |
| --- | --- | --- |
| `rigid_body_modes` | 물리/internal/drill energy가 finite rigid motion에서 objective해야 하며 pure drill만 regularized 되어야 한다. | finite rigid translation/rotation superposition에서 strain, stress, physical energy, drill gamma, residual을 blocking invariant로 확인한다. |
| `patch_test` | Green-Lagrange direct strain과 MITC tied shear가 같은 trial geometry와 같은 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch를 linear limit와 finite valid trial perturbation에서 각각 확인한다. |
| `symmetry` | applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric이다. | no-moment case만 scaled symmetry check 대상으로 두고, moment case를 임의 symmetrization하지 않는다. |
| `positive_definiteness` | nonlinear tangent는 load state, compression, near-buckling에서 indefinite일 수 있다. Positive definiteness는 일반 gate가 아니다. | stress-free constrained linear limit의 nonsingular solve와 singular negative case를 분리하고, factorization failure를 숨기지 않는다. |
| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이므로 one-point reduced hourglass path는 승인 범위 밖이다. | source type으로 reduced/selective integration 또는 hourglass stabilization을 선택하지 않는 unit/integration test가 필요하다. |
| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 모든 thin-shell mesh에서 locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로 두고 broader thin/thick convergence는 nonblocking characterization으로 둔다. |
| `volumetric_locking` | approved plane-stress shell, St. Venant-Kirchhoff-type material restriction에서는 `N/A`다. | 3-D incompressible material 또는 `nu >= 0.5` 의미로 확장하지 않는다. |
| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear meshes에서 membrane locking 위험이 남는다. | known limitation으로 기록한다. MITC4+ 성능 또는 Abaqus S4/S4R internal equivalence를 주장하지 않는다. |
| `distortion` | positive Jacobian이라도 severe distortion/warpage는 conditioning과 stress accuracy를 악화할 수 있다. | 모든 Gauss/tying/center/recovery location의 finite, positive predicate를 fail-closed로 적용한다. 추가 quality cutoff는 요구하지 않는다. |
| `singular_jacobian` | `J0 <= 0`, `j <= 0`, invalid reciprocal basis, invalid polar stretch는 residual/tangent를 무효화한다. | failed location을 omit/average/clamp/repair하지 않고 model/trial failure로 처리한다. |
| `conditioning` | thin shells, small fixed drill scale, near-mechanism constraints는 Kff conditioning을 악화시킬 수 있다. | scaled matrix diagnostics만 사용하고 solver regularization/fallback으로 singularity를 숨기지 않는다. |
| `convergence` | Full Newton은 same-trial consistent tangent에 의존한다. No line search/cutback이므로 difficult step은 deterministic nonconvergence가 될 수 있다. | NSNR-069/070 four-channel gates, iteration `1..100`, nonfinite rejection, no hidden retry를 integration tests로 고정한다. |
| `rigid_body_modes` | Physical/internal/drill energy는 finite rigid motion에서 objective하고 pure drill만 regularized 되어야 한다. | finite rigid superposition에서 strain, stress, physical energy, drill gamma/energy와 residual covariance를 blocking invariant로 확인한다. |
| `patch_test` | Green-Lagrange direct strain과 MITC tied shear는 같은 trial 및 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch와 linear limit을 확인한다. |
| `symmetry` | Applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric다. | no-moment case만 scaled symmetry gate를 적용하고 moment case는 derivative consistency로 검증한다. |
| `positive_definiteness` | Nonlinear tangent는 compression/near-buckling에서 indefinite일 수 있다. | positive definiteness를 global gate로 만들지 않고 singular/malformed tangent와 물리적 indefiniteness를 구분한다. |
| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이며 reduced/hourglass path는 범위 밖이다. | source label로 integration 또는 stabilization을 바꾸지 않는 test가 필요하다. |
| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 general locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로, broader thin/thick study를 characterization으로 둔다. |
| `volumetric_locking` | approved plane-stress shell과 `nu < 0.5` 범위에서는 `N/A`다. | 3-D incompressible behavior claim으로 확장하지 않는다. |
| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear mesh에서 membrane locking 위험이 남는다. | known limitation으로 보존하고 MITC4+ 또는 Abaqus 내부 성능을 상속한다고 주장하지 않는다. |
| `distortion` | positive Jacobian만으로 accuracy는 보장되지 않지만 별도 calibrated quality cutoff는 승인되지 않았다. | 모든 Gauss/tying/center/recovery location을 fail-closed 검사한다. |
| `singular_jacobian` | `J0<=0`, `j<=0`, invalid reciprocal basis/polar stretch는 residual/tangent를 무효화한다. | failed point를 omit, average, clamp 또는 repair하지 않는다. |
| `conditioning` | thin geometry, small fixed drill scale와 near mechanism은 conditioning을 악화시킨다. | scale-aware diagnostics를 쓰고 hidden regularization/fallback을 금지한다. |
| `convergence` | Full Newton은 same-trial consistent tangent에 의존하고 line search/cutback이 없다. | NSNR-069/070, four-channel AND, iteration `1..100`, finite-first와 no retry를 고정한다. |
| `reaction_distribution` | local nodal support distribution은 element formulation/mesh/stabilization에 민감하다. | exact local error report는 유지하되 global balance/free residual만 blocking한다. |
## 5. Consistency Checks
| check | result | evidence |
| --- | --- | --- |
| units and dimensions | `pass` | Translation/force, rotation/moment, stress/resultant dimensions are separated. Convergence channels keep force, force-length, length and dimensionless rotation separate. |
| signs and residual convention | `pass` | Global residual is `f_int - f_ext`; constrained full residual is reaction and free residual is equilibrium evidence. Fixed-global dead force has no configuration derivative. |
| DOF ordering and free/constrained assumptions | `pass` | Per-node global order is `[UX, UY, UZ, URX, URY, URZ]`; Newton solve uses stable free coordinates with `Delta q_c = 0`. Valid `0 x 0` free system is trivial success. |
| coordinate transforms | `pass` | `Q=Exp(phi^)Q0`, left-spatial update, `J_l` variation, physical swing map and spatial reaction moment conversion are explicitly defined. |
| kinematic operator / B matrix | `pass` | Green-Lagrange strain, MITC shear projection and both first/second variations use the same trial identity. |
| constitutive contract | `pass` | Constant symmetric `C5` maps engineering Green-Lagrange strain to second Piola-Kirchhoff stress; no material history is introduced. |
| Jacobian rules | `pass` | Fixed reference `J0` is integration measure; current `j` and `det F_c` are validity checks. Failed locations are not skipped. |
| integration policy | `pass` | S4 and S4R share four midsurface Gauss points times two thickness points; reduced/selective integration is prohibited. |
| residual/tangent consistency | `pass` | Complete tangent includes material, geometric, map-Hessian, objective drill Hessian and fixed-spatial moment work derivative terms. |
| tangent symmetry expectation | `pass` | Symmetric only for conservative no-applied-moment case; generally nonsymmetric moment tangent must remain unsymmetrized. |
| output locations | `pass-with-handoff` | Nodal U/UR/RF/RM and shell stress/resultant logical quantities are defined; exact HDF5 projection remains I/O-owned. Current nodal SPOS/SNEG stress CSV는 Gauss direct recovery와 일대일 대응하지 않으므로 external numerical comparison은 N/A다. |
| units and dimensions | `pass` | Translation residual/reaction은 force, rotation residual/reaction moment는 force-length다. Force와 moment family 및 norm scale을 혼합하지 않는다. |
| signs | `pass` | `r=f_int-f_ext`; constrained entry는 reaction, free entry는 equilibrium evidence다. Balance는 `applied+reaction`이고 reaction resultant는 reaction만 합한다. |
| DOF ordering | `pass` | Global node order `[UX,UY,UZ,URX,URY,URZ]`; stable free/constrained partition과 `Delta q_c=0`을 보존한다. |
| coordinates and moment conversion | `pass-with-handoff` | Global origin `[0,0,0]`, current arm `X+u`, spatial moment `J_l(phi)^(-T) r_phi`가 승인 의미다. `AUDIT-001` 구현 projection audit가 남는다. |
| kinematic operator | `pass` | Green-Lagrange strain, MITC shear projection 및 first/second variation은 same-trial identity다. |
| constitutive contract | `pass` | Constant symmetric `C5`가 fixed-reference engineering strain을 second Piola-Kirchhoff stress로 매핑하며 material history가 없다. |
| Jacobian rules | `pass` | Fixed `J0`가 integration measure, current `j`와 `det(Fc)`가 validity predicate다. |
| integration | `pass` | S4/S4R 공통 four midsurface by two thickness points; reduced/selective integration은 금지한다. |
| residual/tangent | `pass` | Material/geometric/map-Hessian/drill/moment-work derivative가 complete same-trial tangent를 이룬다. |
| recovery locations | `pass-with-handoff` | Nodal U/UR/reaction 및 Gauss direct shell recovery logical meaning은 정의되었다. Final dataset projection은 I/O-owned다. |
| reference identity | `pass` | Case/state/instance/source label/component로 match하고 row order를 identity로 쓰지 않는다. |
## 6. Verification Readiness
### Blocking internal numerical tests
### 6.1 Blocking internal numerical tests
Implementation Planning shall carry these as feature-required tests before any reference-comparison success claim:
기존 승인 수치 portfolio를 유지한다.
Mixed translation/rotation 검사는 fixed-reference characteristic length
`L=max(||X_I-X_J||)`와 node block `Dq=diag(L I3,I3)`를 사용한다. Tangent test direction은
`||p_hat||inf=1`, perturbation은 `q +/- h Dq p_hat`으로 두고
`h={1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7}` 전부를 검사한다. Roundoff plateau 전
최소 두 interval에서 centered-difference observed order `>=1.5`이고 한 interior point가
scaled error `<=1e-6`여야 한다. Single-`h` 우연 통과는 허용하지 않는다.
1. Stress-free `q=0` linear MITC4 residual/tangent/recovery와 physical/drill split.
2. `||Q^TQ-I||_F<=1e-12`, `|det(Q)-1|<=1e-12`, `d=Qe3` 및 branch margin.
3. Mixed translation/rotation scaled tangent directional derivative schedule와 interior scaled
error `<=1e-6`; zero analytical direction `<=1e-10`.
4. No-applied-moment scaled tangent symmetry `<=1e-12`; applied moment는 derivative
consistency만 검사한다.
5. Finite rigid objectivity의 scaled physical strain/stress/energy/drill/residual `<=1e-10`.
6. Membrane/bending/twist/shear patch, component order와 bottom/top stress sign.
7. Fixed-global force/moment identity, `rho_M<=1e-12`, absolute prescribed path와 zero
constrained Newton correction.
8. Exact fixed-factor sequence, factor one, iterations `1..100`, pass at 100, no 101/cutback/retry.
9. NSNR-069/070의 finite-first exact-zero/nonzero branches, inclusive thresholds와 four-channel AND.
10. Trial/recovery/solve/output failure rollback과 deterministic assembly/frame/row/diagnostic order.
1. Linear limit: at stress-free `q=0`, nonlinear element residual/tangent/recovery reduce to approved linear MITC4 signs, `2 x 2 x 2` integration and physical/drill split.
2. Rotation state invariants: every committed/trial `Q` satisfies `||Q^T Q-I||_F <= 1e-12`,
`|det(Q)-1| <= 1e-12`, and `d=Q e3`. Global/swing/twist `pi` branch angular margin은
`sqrt(epsilon_double)`, 약 `1.4901161193847656e-8` rad보다 커야 한다.
3. Tangent directional derivative: compare `Dq^T K_T Dq p_hat` with the central
residual derivative under the schedule above in separated force and moment channels.
Zero analytical directions require exact-zero construction and scaled absolute error
`<=1e-10`; nonfinite metric은 허용하지 않는다.
4. No-moment tangent symmetry: after work-conjugate congruence `Dq^T K_T Dq`, no-applied-moment
tangent scaled Frobenius symmetry error `<=1e-12`; applied fixed-spatial moment cases are checked for
exact derivative consistency, not symmetry.
5. Finite rigid objectivity: superposed finite rigid motion leaves physical strain/stress,
physical energy, drill gamma/energy and internal residual at scaled `<=1e-10` levels.
6. Patch/sign recovery: membrane, bending, twist and transverse shear patch states preserve
component order and bottom/top stress signs.
Analytical strain/resultant/stress error is relative `<=1e-9`.
7. Load and boundary path: fixed-global force/moment source identity, `rho_M <= 1e-12`
rejection/projection, absolute factor-one boundary path and zero constrained Newton
correction are tested independently.
8. Newton lifecycle: factor identities use ordinal `j*h` values strictly below one,
followed by one exact assigned `1.0`; cumulative `lambda += h`와 tolerance-based duplicate
endpoint는 금지한다. For `shellNL` the expected intended factors are `0.1, 0.2, ...,
1.0`. Iterations are `1..100`, pass at `100` is allowed, iteration `101` is forbidden.
9. Convergence gates: NSNR-069/070 four-channel inclusive `<=` rules, typed zero-scale
`1e-3` thresholds and nonfinite rejection are tested without adding energy or line-search gates.
10. Commit/rollback and determinism: failed trial, recovery, solve or output does not mutate
the prior committed state or prior authoritative final result; row/diagnostic order is stable.
### 6.2 Factor-one blocking equilibrium contract
### Downstream reference comparisons
각 nonlinear case의 accepted factor-one state에 대해
The required stored-reference cases and logical quantities are defined in
`docs/nonlinear-static-newton-raphson/reference-model.md`.
\[
\mathbf a_{F,I}=\mathbf F_I^{appl},\qquad
\mathbf c_{F,I}=\mathbf F_I^{react},
\]
- `shellnl-s4-final` is the primary nonlinear external reference at accepted factor one.
- `shell-s4-linear-limit` is the read-only linear-limit/reference-identity regression for the
same S4 mesh. Current stress element-label ordering is inventoried without becoming a
comparison quantity.
\[
\mathbf a_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{appl}
+\mathbf M_I^{appl},\qquad
\mathbf c_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{react}
+\mathbf M_I^{react}
\]
External comparison uses only accepted-state quantities and `docs/TOLERANCE.md`. Missing,
extra, duplicate or nonfinite required rows fail before tolerance. The comparison result itself
is Implementation Agent ownership.
를 stable source-node order로 계산한다. `x=X+u`이고 applied physical moment는 formulation
§13.4의 effective physical-work moment다. Define
\[
\mathbf e_F=\sum_I(\mathbf a_{F,I}+\mathbf c_{F,I}),\quad
S_F=\max\left(\sum_I\|\mathbf a_{F,I}\|_2,
\sum_I\|\mathbf c_{F,I}\|_2\right),
\]
\[
\mathbf e_M=\sum_I(\mathbf a_{M,I}+\mathbf c_{M,I}),\quad
S_M=\max\left(\sum_I\|\mathbf a_{M,I}\|_2,
\sum_I\|\mathbf c_{M,I}\|_2\right).
\]
Force와 moment는 각각 `rho_F=||e_F||2/S_F`, `rho_M=||e_M||2/S_M`로 검사하고 둘 다
`<=1e-8`이어야 한다. 이 threshold는 승인된 nonlinear acceptance value이며,
unclamped sum-of-contribution scale과 dimension-separated form은 승인된 linear MITC4
global-equilibrium convention을 유지한다. `S=0`이면 balance도
exact zero일 때만 `0`, 아니면 fail하며 absolute floor, `max(1,S)` 또는 zero clamp를 두지 않는다.
Accepted free residual은 cross-unit combined norm을 만들지 않는다. Factor-one accepted trial의
free translation-force와 free rotation-moment rows가 각각 NSNR-069의 exact gate를 다시
재현해야 한다: matching external scale이 nonzero이면 approved infinity-norm relative gate
`<=1e-2`, exact zero이면 typed absolute `<=1e-3` force 또는 force-length다. 두 channel 모두
finite-first로 통과해야 한다.
### 6.3 Downstream reference comparisons
- `shellnl-meshfine-s4-final`: 사용자가 요청한 mesh-refined primary nonlinear case.
- `shellnl-s4-final`: coarse nonlinear companion regression.
- `shell-s4-linear-limit`: existing linear-limit/source-identity regression.
각 case의 `U1/U2/U3`는 blocking이고 `UR1/UR2/UR3`는 warning-only다. Coarse/fine은 각자의
input/CSV와 독립 family로 비교하며 cross-mesh interpolation, row collapse 또는 observed-order
claim을 만들지 않는다. Local RF/RM family는 common external tolerance로 오차를 전부
기록하지만 review-only다. `RM3`와 stress는 수치 comparison에서 제외한다.
## 7. Required Revisions
### Formulation Agent
None before I/O Definition. The current formulation is numerically sufficient for the I/O
contract. Current source element/node SPOS/SNEG stress CSV에 맞추기 위한 extrapolation,
averaging 또는 새 recovery 의미는 추가하지 않는다.
없음. §11.4/§13.4의 reaction, spatial moment와 global balance 의미는 revised requirements를
충족한다.
### Research Agent
None before I/O Definition. Public large-response benchmarks and shell MMS remain useful future
evidence, but the current Stage 4 gate does not require another research pass.
없음. Stored fine-mesh case와 internal invariant portfolio가 이번 I/O gate에 충분하다.
### I/O Definition Agent
Define parser/semantic/HDF5/log projection for the logical quantities and row identities in
`reference-model.md`. Preserve the split between blocking internal nonlinear tests and external
stored reference comparison; do not claim Abaqus internal equivalence.
`reference-model.md`의 logical quantities와 source identity를 최종 projection으로 연결한다.
`AUDIT-001`의 balance error, constrained reaction resultant, accepted free residual을 별도
quantity로 유지한다. Current-arm/spatial-moment semantics와 factor-one identity를 보존하고
local RF/RM review-only disposition을 blocking으로 되돌리지 않는다.
## 8. Downstream Handoff
For I/O Definition Agent through Coordinator:
Coordinator를 통해 I/O Definition Agent에 전달한다.
- Use accepted factor-one frames only for external reference comparison; trial Newton states are
not reference quantities.
- Preserve required source identity: case, accepted state, instance, node label and component.
Stress artifact의 element/node/section identity와 stored element-label order는 read-only
inventory로 보존하되 FESA comparison row로 합성하지 않는다.
- Keep `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For `shellNL`, compare
constrained `RF1/RF2`, `RF3`, and spatial physical `RM1/RM2` in the separate blocking
families from `reference-model.md`. `RM3`와 stress는 comparison에서 제외한다.
- Apply `docs/TOLERANCE.md` exactly; do not add an independent absolute floor, row averaging,
source-order matching, or calibration gate.
- Treat `shellNL` as weak but valid nonlinear final-state reference evidence; require the
blocking internal tests above for tangent/objectivity/rollback/finite-rotation correctness.
- `pass-for-io-definition`; blockers: 없음.
- External families는 `docs/TOLERANCE.md`를 그대로 사용한다. Independent absolute floor,
averaging, collapse, source-order matching, clamp 또는 calibration gate를 추가하지 않는다.
- Internal factor-one global force/moment balance는 Section 6.2의 dimension-separated normalized
`1e-8` gate, accepted free residual은 NSNR-069 force/moment gate를 사용한다.
- Fine primary와 coarse companion nonlinear cases 모두 U blocking/UR warning-only를 유지한다.
- Local RF1/RF2, RF3, spatial RM1/RM2는 separate review-only families이며 error/precheck를
생략하지 않는다. RM3/stress는 excluded다.
- Fine optional stress identity anomaly는 그대로 기록하고 artifact를 수정하지 않는다.
- Abaqus S4와 FESA MITC4의 formulation, integration, stabilization 또는 내부 알고리즘
동등성을 주장하지 않는다.
@@ -4,234 +4,294 @@
- feature_id: `nonlinear-static-newton-raphson`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-23`
- date: `2026-08-28`
- artifact_policy: `read-only-existing-files`
- tolerance_policy: `docs/TOLERANCE.md`
- external_tolerance_policy: `docs/TOLERANCE.md`
이 문서는 logical reference quantity, source identity, component matching, row precheck와
blocking/warning 분류만 정의한다. 최종 HDF5 dataset projection은 I/O Definition Agent 소유다.
이 문서는 logical quantity, source identity, component matching, row precheck와
blocking/warning-only/review-only 분류를 정의한다. 최종 HDF5 dataset projection은 I/O
Definition Agent 소유이며 이 문서에는 dataset path를 정의하지 않는다.
## 2. Reference Acceptance Scope
Required scope는 두 stored case다.
세 stored case를 사용한다.
- `shellnl-s4-final`: `nlgeom=YES` nonlinear static S4 final accepted state를 비교하는
primary external reference case.
- `shell-s4-linear-limit`: 같은 S4 mesh의 `nlgeom=NO` read-only linear-limit/reference-identity
regression case. 이 case는 nonlinear response evidence가 아니며, 현재 stress CSV의 element-label
ordering을 row-order matching으로 사용하지 않는다.
- `shellnl-meshfine-s4-final`: 사용자가 추가하고 검증을 요청한 729-node/676-element
mesh-refined nonlinear primary case. External `U1/U2/U3`와 factor-one internal equilibrium은
blocking이다.
- `shellnl-s4-final`: 49-node/36-element coarse nonlinear companion regression. Fine case와
별도 reference에 대해 external `U1/U2/U3`와 factor-one internal equilibrium을 blocking으로
검증한다.
- `shell-s4-linear-limit`: 같은 coarse topology의 `NLGEOM=NO` linear-limit/source-identity
regression. Nonlinear response evidence로 부르지 않는다.
`shellNL`은 final-state reference comparison에는 충분하지만 weak nonlinear response다. Dominant
`U3`/stress 값이 linear case와 거의 같으므로 finite-rotation objectivity, consistent tangent,
commit/rollback과 convergence lifecycle은 `numerical-review.md`의 blocking internal tests로 검증한다.
모든 selected case에서 displacement `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는
warning-only다. Coarse/fine local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는
common external policy로 exact error/precheck evidence를 만들되 review-only이고 전체 blocking
verdict를 바꾸지 않는다. Local `RM3`와 stress는 numerical comparison에서 제외한다.
## 3. Reference Case Inventory with exact input and required CSV paths
Coarse와 fine은 각자의 input/CSV에 독립적으로 비교한다. 두 mesh 사이 node interpolation,
row pairing, averaging, collapse, observed convergence order 또는 direct coarse/fine equality
gate를 만들지 않는다. Fine case 추가는 Abaqus S4와 FESA MITC4의 element formulation,
integration, stabilization 또는 internal behavior equivalence를 의미하지 않는다.
| case id | artifact role | required comparison artifact | exact path | observed status |
## 3. Reference Case Inventory
### 3.1 Exact input and CSV paths
| case id | purpose | exact path | required disposition | observed status |
| --- | --- | --- | --- | --- |
| `shellnl-s4-final` | nonlinear input | yes | `reference/shellNL/shellNL.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` |
| `shellnl-s4-final` | displacement reference | yes | `reference/shellNL/shellNL displacements.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | reaction reference | yes | `reference/shellNL/shellNL reactions.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | stress review evidence | no | `reference/shellNL/shellNL stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
| `shell-s4-linear-limit` | linear control input | yes | `reference/shell/shell.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` |
| `shell-s4-linear-limit` | displacement reference | yes | `reference/shell/shell displacements.csv` | 49 finite unique node rows; no `Frame` column |
| `shell-s4-linear-limit` | reaction review evidence | no | `reference/shell/shell reactions.csv` | 49 finite unique node rows |
| `shell-s4-linear-limit` | stress review evidence | no | `reference/shell/shell stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
| `shell-s4-linear-limit` | linear input | `reference/shell/shell.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` |
| `shell-s4-linear-limit` | displacement reference | `reference/shell/shell displacements.csv` | required blocking/warning | 49 unique finite rows; single final static state |
| `shell-s4-linear-limit` | reaction inventory | `reference/shell/shell reactions.csv` | inspection-only | 49 unique finite rows |
| `shell-s4-linear-limit` | stress ordering inventory | `reference/shell/shell stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks |
| `shellnl-s4-final` | coarse nonlinear input | `reference/shellNL/shellNL.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` |
| `shellnl-s4-final` | displacement reference | `reference/shellNL/shellNL displacements.csv` | required blocking/warning | 49 unique finite rows; exact factor-one Frame |
| `shellnl-s4-final` | local reaction reference | `reference/shellNL/shellNL reactions.csv` | required review-only | 49 unique finite inventory rows; exact factor-one Frame |
| `shellnl-s4-final` | stress inventory | `reference/shellNL/shellNL stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks |
| `shellnl-meshfine-s4-final` | fine nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required | readable; S4, 729 nodes, 676 elements, `NLGEOM=YES` |
| `shellnl-meshfine-s4-final` | displacement reference | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning | 729 unique finite rows; exact factor-one Frame |
| `shellnl-meshfine-s4-final` | local reaction reference | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only | 729 unique finite inventory rows; exact factor-one Frame |
| `shellnl-meshfine-s4-final` | stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inspection | 5,408 rows in ascending element blocks; one malformed optional node label `ss` |
`required comparison artifact=no`인 파일도 이번 review에서 읽기 가능성, row identity,
finite values와 current ordering을 확인했다. 그러나 해당 파일은 missing-required-artifact
판정이나 tolerance family를 만들지 않는다.
`reference/shell/shell stresses.csv`는 사용자 변경 후 element label `1..36` 순서로 저장되어
있음을 확인했다. Row order는 matching identity가 아니며 deterministic inspection display에만
사용한다. Fine stress의 `Element Label=1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded
artifact issue다. 이 파일을 rename, repair, normalize 또는 rewrite하지 않는다.
두 `.inp`는 같은 node/element/connectivity, material/section, instance, boundary와 center-node
`CLOAD`를 사용한다. Text 차이는 heading identity, `NLGEOM=NO -> YES`, 그리고 `*STATIC`
data `1.,1.,1e-05,1. -> 0.1,1.,0.001,0.1`이다. 따라서 `shellNL`은 실제 nonlinear
selector와 승인된 fixed increment `0.1`을 갖지만, 두 deck 차이를 오직 `NLGEOM` 하나의
isolated effect라고 표현하지 않는다.
Coarse와 fine nonlinear input은 homogeneous isotropic material `E=2.1e11`, `nu=0.3`,
shell thickness `0.5`, center node-set load `DOF 3 = -100000`, all-six-DOF perimeter support,
`*STATIC 0.1,1.,0.001,0.1`을 사용한다. Fine case는 같은 physical setup의 refined topology다.
Read-only SHA-256 observations:
### 3.2 Read-only artifact hashes
| path | SHA-256 |
| exact path | SHA-256 |
| --- | --- |
| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shellNL-meshfine/shellNL-meshfine.inp` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` |
| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` |
## 4. Source Identity and Component Contract
### 4.1 Accepted-state identity
### 4.1 Case and accepted-state identity
- Abaqus identifiers are case-insensitive semantic identities. Input spelling
`Part-1-1` and CSV spelling `PART-1-1` match as one instance while original text is
retained in artifacts and reports; no file or row is rewritten.
- `shellnl-s4-final` rows require exact CSV `Frame` value
`Increment 10: Step Time = 1.000`, mapped logically to the accepted factor-one state.
- `shell-s4-linear-limit` rows have no `Frame` column and map to the single final static state.
- Row order is never a matching identity. It may only be used for deterministic reporting after
source keys are matched.
- Instance identity는 case-insensitive semantic match다. Artifact spelling `Part-1-1`과
`PART-1-1`은 같은 instance이지만 file text를 rewrite하지 않는다.
- 두 nonlinear case required rows의 exact CSV Frame은
`Increment 10: Step Time = 1.000`이며 accepted factor-one state에 대응한다.
- Linear case에는 `Frame` column이 없고 single final static state로 해석한다.
- Row order는 identity가 아니다. Stable key match 후 deterministic reporting order로만 정렬한다.
### 4.2 Nodal displacement contract
### 4.2 Nodal displacement and rotation
Required mapping is `U-U1/U-U2/U-U3 -> U1/U2/U3` and
`UR-UR1/UR-UR2/UR-UR3 -> UR1/UR2/UR3`. U is global length; UR is the
dimensionless fixed-initial global rotation-vector output. Logical key is
CSV `U-U1/U-U2/U-U3`는 logical `U1/U2/U3`, `UR-UR1/UR-UR2/UR-UR3`는
logical `UR1/UR2/UR3`에 대응한다. Key는
```text
(case_id, accepted_state, canonical_instance_name, source_node_label, component)
```
Both cases require source node labels `1..49` exactly once. U components form one
blocking translation family and UR components form one warning-only rotation family,
preserving the project MITC4 classification.
이다. Coarse/linear은 labels `1..49`, fine은 `1..729`를 각각 정확히 한 번 요구한다.
U는 global length/blocking, UR은 fixed-initial global rotation-vector/warning-only다.
### 4.3 Nonlinear reaction contract
### 4.3 Local reaction review contract
Reaction comparison applies only to `shellnl-s4-final` and only to the input boundary
`Set-2` nodes:
Reaction source rows는 input `Set-2` constraint mask로 선택한다.
```text
1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33
```
- coarse: `1, 3..9, 14..17, 22..33` — 24 nodes, all six DOFs constrained.
- fine: `1, 3..9, 34..57, 82..153` — 104 nodes, all six DOFs constrained.
All six global components are constrained at these 24 nodes. Other CSV node rows remain
part of file/schema/finite inventory but are not numerical reaction rows: FESA free entries
are equilibrium residual evidence, not Abaqus free-node zero reactions.
다른 CSV node rows는 file/schema/finite inventory지만 local reaction numerical rows가 아니다.
Free FESA entries는 reaction이 아니라 accepted free residual evidence다.
| CSV components | logical quantity | FESA meaning | disposition |
| CSV components | logical quantity | matching FESA meaning | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | fixed-initial shell-plane reaction force | constrained translational full residual, global force | blocking family |
| `RF-RF3` | fixed-initial transverse reaction force | constrained translational full residual, global force | blocking family |
| `RM-RM1`, `RM-RM2` | tangent-plane spatial reaction moment | `J_l(phi)^(-T)` conversion of the constrained generalized reaction, global force-length | blocking family |
| `RM-RM3` | director/drilling-axis reaction review value | stabilization-dependent; no physical external equivalence target | excluded |
| `RF-RF1`, `RF-RF2` | in-plane local reaction force | constrained translational full residual, global force | `review-only` |
| `RF-RF3` | transverse local reaction force | constrained translational full residual, global force | `review-only` |
| `RM-RM1`, `RM-RM2` | tangent-plane physical reaction moment | constrained generalized residual converted by `J_l(phi)^(-T)`, global spatial force-length | `review-only` |
| `RM-RM3` | director/drilling-axis row | no approved physical external equivalence target | `excluded` |
In-plane and transverse force are distinct model-fixed logical projections and therefore
use distinct families. Raw generalized rotation-coordinate residual is not matched directly
to the CSV `RM` value.
Raw generalized rotational residual을 CSV RM에 직접 match하지 않는다. Review-only는 row omission을
허용한다는 뜻이 아니다. Exact row precheck와 common-policy error/RMS를 모두 보고하되 그 결과가
blocking verdict를 변경하지 않는다는 뜻이다.
### 4.4 Stress review identity and comparison exclusion
### 4.4 Distinct factor-one equilibrium quantities
Stress rows have read-only identity
각 nonlinear case에서 같은 accepted factor-one state를 사용한다.
| logical quantity | source identity / projection | components | disposition |
| --- | --- | --- | --- |
| accepted free residual | input mask로 결정한 stable free `(instance,node,global DOF component)` rows; force와 moment channel 분리 | free `UX/UY/UZ`; free `URX/URY/URZ` generalized covectors | `blocking-internal` |
| constrained reaction resultant | constrained source rows만 current arm과 spatial physical moment로 합산 | force `[1,2,3]`; moment `[1,2,3]` | `review-only-summary` |
| applied-plus-reaction balance error | all resolved applied sources plus constrained reactions; global origin `[0,0,0]`; `x=X+u`; physical spatial nodal moments | force `[1,2,3]`; moment `[1,2,3]` | `blocking-internal` |
Constrained reaction resultant force is `sum(F_react)`. Its moment is
`sum(x cross F_react + M_react)`. Balance error adds the corresponding applied force and
`x cross F_appl + M_appl`. Accepted free residual is neither sum. 세 quantity는 exact
source/state identity를 공유하지만 interchangeable하지 않다.
현재 stored case의 constrained prescribed `u=phi=0` 때문에 support current arm과 initial arm,
generalized moment와 spatial moment가 수치적으로 일치한다. 이는 supported general nonzero
prescribed translation/rotation에서 initial arm/raw rotational residual을 재사용할 근거가 아니다.
### 4.5 Stress inventory and exclusion
Stress inspection key는
```text
(case_id, accepted_state, instance, element label,
element-corner node label, SPOS/SNEG section surface, component)
```
Every current element has its four connectivity nodes and one `SPOS` plus one `SNEG`
row per node. The files are ordered in contiguous ascending element-label blocks `1..36`;
this exact artifact order is retained and no node/surface secondary reorder is applied.
이다. Stored stress는 element-corner SPOS/SNEG rows이고 FESA 승인 recovery는 midsurface Gauss
locations의 direct bottom/middle/top `[S11,S22,S12]`다. Nodal extrapolation/averaging을 만들지
않으며 `S-S11/S-S22/S-S12/S-S33` 어느 것도 external family에 포함하지 않는다.
The identity is nevertheless not the approved FESA recovery location: FESA emits direct
`[S11,S22,S12]` at four midsurface Gauss locations and bottom/middle/top positions, without
nodal extrapolation or averaging, and does not emit `S33`. Consequently no stress column
forms a blocking or warning-only comparison family. Stress files remain optional read-only
review evidence only.
### 4.6 External comparison families
### 4.5 Comparison families
| family id | components and source set | row count | units / coordinates | disposition |
| family id | components / source rows | rows | units / coordinates | disposition |
| --- | --- | ---: | --- | --- |
| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking regression |
| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking |
| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | force / fixed-initial global plane | blocking |
| `nonlinear.reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | force / fixed-initial global transverse | blocking |
| `nonlinear.reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | force-length / global spatial | blocking |
| `linear.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` |
| `linear.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` |
| `coarse.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` |
| `coarse.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` |
| `coarse.local_reaction_inplane_force` | RF1/RF2; 24 constrained nodes | 48 | force / global shell plane | `review-only` |
| `coarse.local_reaction_transverse_force` | RF3; 24 constrained nodes | 24 | force / global transverse | `review-only` |
| `coarse.local_reaction_physical_moment` | RM1/RM2; 24 constrained nodes | 48 | force-length / global spatial | `review-only` |
| `fine.translation` | U1/U2/U3; nodes `1..729` | 2,187 | length / global | `blocking` |
| `fine.rotation` | UR1/UR2/UR3; nodes `1..729` | 2,187 | dimensionless / fixed-initial global | `warning-only` |
| `fine.local_reaction_inplane_force` | RF1/RF2; 104 constrained nodes | 208 | force / global shell plane | `review-only` |
| `fine.local_reaction_transverse_force` | RF3; 104 constrained nodes | 104 | force / global transverse | `review-only` |
| `fine.local_reaction_physical_moment` | RM1/RM2; 104 constrained nodes | 208 | force-length / global spatial | `review-only` |
### 4.7 Internal blocking verification families
| family id | exact rows/components | gate |
| --- | --- | --- |
| `coarse.accepted_free_force_residual` | 75 free translation DOFs | NSNR-069 force channel, factor one |
| `coarse.accepted_free_moment_residual` | 75 free rotation DOFs | NSNR-069 moment channel, factor one |
| `coarse.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `coarse.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `fine.accepted_free_force_residual` | 1,875 free translation DOFs | NSNR-069 force channel, factor one |
| `fine.accepted_free_moment_residual` | 1,875 free rotation DOFs | NSNR-069 moment channel, factor one |
| `fine.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `fine.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` |
이 internal families에는 Abaqus CSV value 또는 `docs/TOLERANCE.md`를 적용하지 않는다.
Approved analytical/invariant gates이며 exact definitions는 `numerical-review.md` §6.2다.
## 5. Row Prechecks
Before tolerance, the comparator shall fail the affected comparison if any required condition
below is false.
Tolerance 또는 internal metric 전에 다음을 검사한다.
1. Exact declared input path and every `required comparison artifact=yes` CSV path for the
case exist and are readable.
2. Required headers are present after trimming surrounding whitespace from header names.
3. `shellnl-s4-final` contains only the exact required `Frame` value for required rows.
4. Wide CSV rows expand to component rows using the component contract in Section 4.
5. Required source row keys are unique. Duplicate wide keys or duplicate expanded component keys fail.
6. Displacement projection requires all 49 source nodes and declared components. Nonlinear
reaction projection derives the exact 24-node/component set from the input constraint mask;
it does not infer reaction identity from CSV zero values.
7. FESA and reference required projected row-key sets are exactly equal: missing and extra rows
both fail.
8. Every required numeric value is finite. Nonfinite required FESA or CSV value fails before tolerance.
9. Optional stress inventory uses `(instance, element label, node label, section point)` and verifies
the current ascending element-label blocks, connectivity nodes and SPOS/SNEG pair. This inspection
does not create a stress equality gate.
10. Required rows are not omitted, synthesized, normalized, averaged, sorted into a different identity,
zero-clamped, or repaired.
1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable하다.
2. Header는 surrounding whitespace만 trim하고 required names/components가 모두 있어야 한다.
3. Nonlinear required rows의 Frame은 exact factor-one identity여야 한다.
4. Wide CSV는 Section 4 contract로 component rows에 결정적으로 expand한다.
5. Wide key와 expanded key는 unique해야 한다. Duplicate는 affected family를 tolerance 전에 fail한다.
6. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero values 또는
row position에서 reaction identity를 추론하지 않는다.
7. FESA와 reference projected key sets는 exact equal해야 한다. Missing과 extra rows를 모두 fail한다.
8. Required FESA/CSV/internal values와 derived scales/norms는 모두 finite여야 한다.
9. Internal free residual rows는 exact free mask와 force/moment partition을 보존한다. Global balance는
모든 applied source와 constrained reaction을 stable source order로 한 번씩만 사용한다.
10. Local review rows는 global resultant로 collapse하거나 대체하지 않는다. Review precheck failure는
deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다.
11. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를
변경하지 않는다. Blocking precheck failure는 전체 comparison을 fail한다.
12. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를
허용하지 않는다.
Observed read-only inventory used for this contract:
Observed read-only nodal CSV audit:
| CSV | observed wide key columns | duplicate wide keys | nonfinite observed values | observed element labels |
| --- | --- | ---: | ---: | --- |
| `reference/shellNL/shellNL displacements.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL reactions.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL stresses.csv` | `Frame`, `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
| `reference/shell/shell displacements.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell reactions.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell stresses.csv` | `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
| CSV | wide rows | duplicate keys | nonfinite required values | status |
| --- | ---: | ---: | ---: | --- |
| `reference/shell/shell displacements.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL/shellNL displacements.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL/shellNL reactions.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 729 | 0 | 0 | readable |
| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 729 | 0 | 0 | readable |
## 6. Tolerance and Blocking/Warning Policy
Use exactly `docs/TOLERANCE.md` for every external reference family. This report does not invent
or calibrate tolerance values.
### 6.1 External families
For each comparison family:
Section 4.6의 모든 external blocking, warning-only와 review-only error report는
`docs/TOLERANCE.md`를 그대로 사용한다.
- `S = max(abs(reference_value_i))`, using reference values only.
- near-zero band is `0.01*S`.
- if `abs(reference_value_i) <= 0.01*S`, row passes iff `abs(fesa-reference) <= 0.01*S`.
- otherwise row passes iff relative error `<= 0.05`.
- family relative RMS is `RMS(error)/S <= 0.01`.
- no independent absolute-error floor, `max(1, S)` clamp, row omission, averaging, or zero clamp is allowed.
- if `S = 0`, the family passes only when all FESA values are exactly zero; otherwise report
`zero-reference-scale-nonzero-error`.
- Reference-only `S=max(abs(reference_i))`, near-zero band `B=0.01*S`.
- `abs(reference_i)<=B`이면 `abs(fesa-reference)<=B`.
- 그 외 row는 relative error `<=0.05`.
- 모든 row와 `RMS(error)/S<=0.01`이 함께 pass해야 family가 pass한다.
- Independent absolute floor, `max(1,S)`, omission, averaging 또는 zero clamp는 없다.
- `S=0`이면 모든 FESA 값도 exact zero일 때만 pass한다.
Families are separated by the exact case/logical quantities in Section 4.5. Current
reference-only scales provide a reproducible reader/comparator audit:
Observed reference-only scales는 reader/family audit evidence이며 calibration 값이 아니다.
| family | `S` | `B=0.01*S` |
| --- | ---: | ---: |
| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
| family | rows | `S` | `B=0.01*S` |
| --- | ---: | ---: | ---: |
| `linear.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` |
| `coarse.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.local_reaction_inplane_force` | 48 | `1.91663182` | `1.91663182e-2` |
| `coarse.local_reaction_transverse_force` | 24 | `1.17769805e4` | `1.17769805e2` |
| `coarse.local_reaction_physical_moment` | 48 | `1.95418418e4` | `1.95418418e2` |
| `fine.translation` | 2,187 | `2.57957054e-5` | `2.57957054e-7` |
| `fine.rotation` | 2,187 | `6.58704994e-6` | `6.58704994e-8` |
| `fine.local_reaction_inplane_force` | 208 | `5.38827419e-1` | `5.38827419e-3` |
| `fine.local_reaction_transverse_force` | 104 | `2.78506128e3` | `2.78506128e1` |
| `fine.local_reaction_physical_moment` | 208 | `4.71557520e3` | `4.71557520e1` |
Any `blocking` family row or RMS failure fails the reference comparison for the feature.
`warning-only` failures produce deterministic warning evidence but do not change the blocking
verdict. `RM3` and stress artifacts create neither a blocking nor warning-only tolerance family.
Blocking family의 precheck/row/RMS failure만 전체 external-reference verdict를 fail한다.
Warning-only는 warning, review-only는 deterministic review finding/error table을 남기지만
blocking verdict를 바꾸지 않는다. `RM3`와 stress는 family를 만들지 않는다.
### 6.2 Internal equilibrium families
- Accepted free force/moment residual은 factor-one accepted trial에서 NSNR-069을 그대로
재현한다. Nonzero matching external scale이면 infinity-norm relative `<=1e-2`; exact-zero
scale이면 typed absolute `<=1e-3` force 또는 force-length다.
- Global force/moment balance는 `numerical-review.md` §6.2의 sum-of-contribution scale과
dimension-separated normalized metric을 사용하며 각각 `<=1e-8`이다.
- Internal gate에 external family tolerance, absolute floor, reference-derived scale 또는 local
nodal reaction error를 섞지 않는다.
## 7. Open Issues and I/O Handoff
Open issues blocking I/O Definition: 없음.
I/O Definition Agent handoff:
I/O Definition Agent handoff through Coordinator:
- Project only the comparison quantities in Sections 4.2, 4.3 and 4.5 to authoritative FESA
result datasets without changing source identity or final comparison disposition.
- Preserve `Frame` handling for `shellnl-s4-final` as accepted factor-one state identity; do not expose
trial Newton history as reference rows.
- Derive constrained reaction identity from the input mask. Compare `RM1/RM2` with the global
spatial physical reaction moment, not the raw generalized rotation-coordinate covector.
- Preserve approved Gauss direct stress recovery. Do not create element-corner stress,
extrapolation, averaging or a stress CSV projection for the current optional SPOS/SNEG artifacts.
- Keep `RM3`, `S-S33`, `S-S11`, `S-S22` and `S-S12` out of current comparison families.
- Use the common tolerance policy exactly as written above and in `docs/TOLERANCE.md`.
- Fine primary와 coarse companion nonlinear case의 accepted factor-one identity를 보존한다.
- Section 4.4의 `(a)` applied-plus-reaction balance error, `(b)` constrained reaction resultant,
`(c)` accepted free residual을 separate logical quantities로 최종 projection한다.
- Global moment는 origin `[0,0,0]`, current `X+u` force arm과 spatial physical nodal moment를
사용한다. General nonzero prescribed translation/rotation에서도 initial arm/raw rotational
residual을 재사용하지 않는다.
- Local RF/RM은 exact source-key/schema/inventory/finite/error reporting이 있는 review-only다.
Local rows를 global sum으로 대체하거나 blocking으로 되돌리지 않는다.
- Approved Gauss direct stress recovery를 유지한다. Optional element-corner stress artifact에
맞춘 extrapolation/averaging 또는 stress comparison projection을 만들지 않는다.
- Common external tolerance와 exact prechecks를 변경하지 않는다.
Reference artifact status: complete for I/O Definition. No declared required input or required
comparison CSV is missing or unreadable. Optional stress CSVs are present and readable as inventory
evidence only. No reference artifact was generated, renamed, repaired, normalized, or modified.
Reference artifact status: required input/displacement/reaction artifacts are present and readable.
Optional fine stress identity issue는 transparent nonblocking inventory finding이다. 어떤 reference
artifact도 생성, rename, repair, normalize 또는 수정하지 않았다.
@@ -3,11 +3,11 @@
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- title: `Nonlinear Static Analysis Using Newton–Raphson`
- status: `approved`
- status: `draft`
- owner_agent: `requirement-agent`
- date: `2026-08-22`
- approved_by: user
- approval_date: `2026-08-23`
- date: `2026-08-27`
- approved_by: pending user re-approval
- approval_date: pending
- authoritative_scope: materially linear, geometrically nonlinear `S4/S4R -> FESA-MITC4`
- independence: FESA는 독립 solver이며 Abaqus 또는 Midas의 내부 알고리즘 동등성을 주장하지 않는다.
- unit_policy: `.inp` 단위계를 추론하거나 변환하지 않고 사용자가 일관되게 제공한 단위계를 보존한다.
@@ -26,7 +26,7 @@ FESA는 하나의 지원 nonlinear static step을 scalar load factor로 증가
- factor-1 absolute prescribed `*BOUNDARY` targets와 four-value nonlinear `*STATIC`
- four-channel residual/correction convergence, maximum 100 iterations, no line search
- separate trial state, atomic commit/rollback, accepted-frame HDF5와 per-iteration text log
- deterministic assembly, iteration, frame, result, diagnostic order와 stored-reference verification
- deterministic assembly, iteration, frame, result, diagnostic order와 factor-one global reaction/equilibrium 및 stored-reference verification
## 4. Out Of Scope
- material nonlinearity, nonlinear material history, combined material/geometric nonlinearity
@@ -138,16 +138,16 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-069
statement: "The FESA solver shall evaluate translational-force and rotational-moment free-residual convergence with channel-separated infinity-norm gates."
statement: "The FESA solver shall evaluate translational-force and rotational-moment free-residual convergence with channel-separated infinity-norm gates selected by each matching external residual-channel scale."
category: numerical
rationale: "Force and moment dimensions require separate scales."
source: user
priority: must
verification_method: test
acceptance_criteria: "For a nonzero matching-channel denominator max(||internal||inf, ||external||inf), the same-trial residual ratio passes iff <=1e-2; an exact-zero denominator instead passes iff its numerator is <=1e-3 model-consistent force or <=1e-3 model-consistent force-length, respectively."
tolerance: "Relative 1e-2 dimensionless; zero-scale absolute 1e-3 force and 1e-3 force-length."
acceptance_criteria: "For each residual channel, a nonzero matching external-channel scale retains denominator max(||internal||inf, ||external||inf), and the same-trial residual ratio passes iff <=1e-2; an exact-zero matching external-channel scale instead applies the typed absolute gate, which passes iff its numerator is <=1e-3 model-consistent force or <=1e-3 model-consistent force-length, respectively."
tolerance: "Relative 1e-2 dimensionless for nonzero matching external-channel scale; exact-zero matching external-channel absolute 1e-3 force and 1e-3 force-length."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
status: draft
- id: FESA-REQ-NSNR-070
statement: "The FESA solver shall evaluate translational and rotational free-correction convergence with channel-separated infinity-norm gates."
category: numerical
@@ -248,14 +248,14 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-019
statement: "The FESA solver shall preserve stable source identity and stable assembly order and shall derive free residual and constrained reaction from the complete assembled equilibrium at the same state."
statement: "The FESA solver shall preserve stable source identity and stable assembly order and shall keep the accepted free residual, constrained reaction resultant, and global applied-plus-reaction balance error as distinct equilibrium quantities derived at the same accepted state."
category: physics
rationale: "Equilibrium evidence must remain traceable to source entities and DOFs."
rationale: "Reaction and equilibrium evidence must remain traceable without treating physically distinct projections as interchangeable."
source: docs
priority: must
verification_method: test
acceptance_criteria: "Input instance/label/component maps deterministically through assembly, state, diagnostic, result, and comparison; full residual at a trial or accepted state yields free-equilibrium evidence and constrained reactions."
tolerance: "Source/component identity and discrete order exact; equilibrium uses approved numerical tolerances."
acceptance_criteria: "Input instance/label/component maps deterministically through assembly, state, diagnostic, result, and comparison; accepted free entries remain free-equilibrium evidence, constrained entries form physical reactions, and the constrained-reaction resultant remains distinct from the global applied-plus-reaction balance error. Blocking factor-one equilibrium quantities are global applied-plus-reaction force [3] and moment [3] balance errors plus accepted free residual. Every global moment is about global origin [0,0,0] and uses current force arms plus spatial physical nodal moments."
tolerance: "Source/component, quantity identity, origin, and discrete order exact; equilibrium and reference values use their separately approved numerical tolerances."
trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-004", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "I/O Definition Agent"]}
status: approved
- id: FESA-REQ-NSNR-020
@@ -314,25 +314,25 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
trace_to: {parent_need: "NEED-NSNR-003, NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-030
statement: "The FESA solver shall pass an approved verification portfolio covering the materially linear small-displacement limit, tangent consistency, equilibrium/reaction, symmetry or objectivity, and commit/rollback behavior."
statement: "The FESA solver shall pass an approved verification portfolio covering the materially linear small-displacement limit, tangent consistency, factor-one global applied-plus-reaction balance and accepted free residual, symmetry or objectivity, and commit/rollback behavior."
category: verification
rationale: "Convergence alone does not establish nonlinear solver correctness."
source: docs
priority: must
verification_method: analysis
acceptance_criteria: "Numerical Review defines blocking cases and quantities for every listed category, and implementation passes each approved analytical, invariant, physics, or comparison gate."
tolerance: "Case-specific tolerances are owned by Numerical Review; existing linear-limit tolerance remains unchanged."
acceptance_criteria: "Numerical Review defines blocking cases and quantities for every listed category, and implementation passes each approved analytical, invariant, physics, or comparison gate. Reaction/equilibrium acceptance separately blocks on factor-one global applied-plus-reaction force [3] and moment [3] balance errors and accepted free-DOF residual evidence; constrained-reaction resultants retain a distinct identity, and local nodal reaction distribution does not decide the blocking verdict."
tolerance: "Case-specific invariant tolerances are owned by Numerical Review; external comparisons use docs/TOLERANCE.md; existing linear-limit tolerance remains unchanged."
trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-034
statement: "The FESA solver shall compare only approved accepted-state quantities against stored reference artifacts using stable source/component matching and the common docs/TOLERANCE.md policy."
statement: "The FESA solver shall compare only approved accepted-state quantities against stored reference artifacts using stable source/component matching, the approved blocking/warning/review disposition, and the common docs/TOLERANCE.md policy."
category: verification
rationale: "Reference acceptance must be deterministic and independent of solver execution."
source: docs
priority: must
verification_method: reference-comparison
acceptance_criteria: "Numerical Review selects the exact existing input and required CSV quantities; precheck rejects missing, extra, duplicate, or nonfinite required rows before blocking/warning family comparison, without averaging or row-order matching."
tolerance: "docs/TOLERANCE.md family-scale policy; exact artifacts and families are a Numerical Review-owned readiness gap."
acceptance_criteria: "Numerical Review selects the exact existing input and required CSV quantities; precheck rejects missing, extra, duplicate, or nonfinite required rows before numerical comparison, without averaging, collapse, row-order matching, zero clamp, or reference repair. U1/U2/U3 remain blocking and UR1/UR2/UR3 remain warning-only. Local nodal RF1/RF2/RF3 and physical spatial RM1/RM2 retain deterministic source-key/schema/finite/inventory/error reporting but are review-only and never change the blocking verdict; local RM3 and stress remain excluded from numerical comparison."
tolerance: "docs/TOLERANCE.md family-scale policy for external blocking, warning-only, and review-only error reporting; exact artifact roles, local review projection, family membership, and row schema are a Numerical Review-owned readiness gap."
trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]}
status: approved
```
@@ -341,7 +341,10 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
| quantity | dimension / coordinates | role |
| --- | --- | --- |
| nodal displacement and committed rotation/director state | length and dimensionless rotation; global | accepted-state kinematics and rollback |
| full residual and constrained reaction | force or force-length; global DOF | equilibrium and reaction evidence |
| accepted free-DOF residual | force or force-length; global DOF | blocking accepted-state equilibrium evidence |
| local nodal `RF1/RF2/RF3`, physical spatial `RM1/RM2` | force or force-length; global | deterministic review-only/nonblocking distribution evidence; `RM3` excluded |
| constrained-reaction resultant force `[3]` and moment `[3]` | force and force-length; global; moment about `[0,0,0]` with current arms and spatial physical moments | distinct reaction summary; not interchangeable with global balance error |
| applied-plus-reaction balance error force `[3]` and moment `[3]` | force and force-length; global; same origin/arm/moment convention | blocking factor-one reaction/equilibrium evidence |
| MITC4 internal force, stress and strain | model-consistent dimensions; approved element frame/configuration | formulation, physics and reference verification |
| scalar load factor and accepted frame identity | dimensionless | path, commit and output ordering |
| four convergence channels | typed as NSNR-069/070 | internal iteration acceptance only |
@@ -349,13 +352,14 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
## 10. Tolerance Policy
- `.inp` values remain in the user's consistent unit system; FESA performs no unit inference or conversion.
- Only nonzero-scale convergence ratios are dimensionless and pass with `<=1e-2`.
- Exact-zero residual thresholds are `1e-3` force and `1e-3` force-length; correction thresholds are `1e-3` length and `1e-3` dimensionless rotation. Equal literals do not merge their dimensions.
- External comparisons use `docs/TOLERANCE.md`; internal invariant, tangent, endpoint-arithmetic and physics tolerances are fixed by Numerical Review before implementation.
- Residual ratios with nonzero matching external-channel scale and correction ratios with nonzero current-trial incremental-solution denominator are dimensionless and pass with `<=1e-2`.
- Exact-zero matching external-channel residual thresholds are `1e-3` force and `1e-3` force-length; exact-zero correction-denominator thresholds are `1e-3` length and `1e-3` dimensionless rotation. Equal literals do not merge their dimensions.
- External blocking, warning-only, and review-only error reporting use `docs/TOLERANCE.md` without changing their verdict disposition; internal invariant, tangent, endpoint-arithmetic, free-residual and global-balance tolerances are fixed by Numerical Review before implementation.
## 11. Reference Case Requirements
- The current Stage-1 gap is selection of exact stored nonlinear input and only the CSV quantities required for acceptance.
- Numerical Review owns artifact readiness, blocking/warning families, source/component identity and HDF5 projection; this gap does not require another Stage-1 user question.
- Stored nonlinear candidates use exact read-only input/displacement pairs `reference/shellNL/shellNL.inp` with `reference/shellNL/shellNL displacements.csv`, and `reference/shellNL-meshfine/shellNL-meshfine.inp` with `reference/shellNL-meshfine/shellNL-meshfine displacements.csv`. Exact local-reaction review artifacts are `reference/shellNL/shellNL reactions.csv` and `reference/shellNL-meshfine/shellNL-meshfine reactions.csv`; they are not missing-required blocking artifacts. The existing linear-limit pair is `reference/shell/shell.inp` and `reference/shell/shell displacements.csv`.
- Numerical Review shall fix which exact nonlinear candidate case or cases are blocking versus diagnostic, the factor-one HDF5 projection, required source rows/components and comparison families, and the internal tolerances for global balance/free-residual gates. `U1/U2/U3` are blocking, `UR1/UR2/UR3` are warning-only, local nodal RF/RM rows are review-only, and `RM3` and stress have no numerical comparison projection.
- All selected local review rows retain deterministic identity, schema, finite-value, inventory, and error reporting even though they cannot fail the blocking verdict. A physical global resultant sum is not a substitute identity for those local rows, and no row is averaged, collapsed, omitted, zero-clamped, or repaired.
- Agents do not run Abaqus, Nastran or another reference solver and do not create, rename, repair or normalize stored reference artifacts.
## 12. Requirement Verification Matrix
@@ -367,7 +371,7 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
| `NSNR-074` | physics | user | must | analysis | finite committed/trial triad/director state and rollback | invariant tolerance downstream | Formulation; Numerical Review | approved |
| `NSNR-006` | numerical | user | must | test | same-trial residual/tangent and fresh factorization/solve | identity/order exact | Formulation; Numerical Review; Planning | approved |
| `NSNR-007` | numerical | user | must | test | all four free-DOF gates pass; constrained residual is reaction | NSNR-069/070 | Numerical Review; Planning | approved |
| `NSNR-069` | numerical | user | must | test | force/moment residual relative or typed zero-scale gates | `1e-2`; typed `1e-3` | Numerical Review; Planning | approved |
| `NSNR-069` | numerical | user | must | test | force/moment residual relative gate for nonzero external scale; typed absolute gate for exact-zero external scale | `1e-2`; typed `1e-3` | Numerical Review; Planning | draft |
| `NSNR-070` | numerical | user | must | test | translation/rotation correction relative or typed zero-scale gates | `1e-2`; typed `1e-3` | Numerical Review; Planning | approved |
| `NSNR-008` | numerical | user | must | test | finite data, iterations 1..100, pass at 100 allowed | predicates/count exact | Numerical Review; Planning | approved |
| `NSNR-014` | constraint | user | must | test | unchanged full correction; no line search/fallback/energy gate | identity exact | Numerical Review; Planning | approved |
@@ -377,21 +381,21 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det
| `NSNR-063` | physics | user | must | test | absolute factor-one BC target and separate correction | path/source exact | Formulation; Numerical Review | approved |
| `NSNR-016` | input | user | must | test | four-value STATIC mapping and validation | endpoint exact | I/O; Planning | approved |
| `NSNR-011` | functional | user | must | test | separate trial, atomic commit, prior-state preservation | state exact | Formulation; Numerical Review; Planning | approved |
| `NSNR-019` | physics | docs | must | test | stable source/assembly and full-equilibrium residual/reaction | identity/order exact | Formulation; Numerical Review; I/O | approved |
| `NSNR-019` | physics | docs | must | test | distinct free residual, constrained-reaction resultants and applied+reaction balance; current-arm/spatial-moment semantics | quantity/origin/identity/order exact | Formulation; Numerical Review; I/O | approved |
| `NSNR-020` | input | docs | must | test | unsupported meaning fails closed | inventory exact | I/O; Planning | approved |
| `NSNR-021` | output | user | must | test | accepted commit/frame bijection and failure-safe HDF5 final | identity exact | Numerical Review; I/O; Planning | approved |
| `NSNR-024` | output | user | must | test | one ordered diagnostic summary per entered iteration and persistent live log | semantic identity exact | I/O; Planning | approved |
| `NSNR-083` | output | user | must | test | repository names; every literal --output form unrecognized with pre-input/pre-Analysis/pre-output exit 2 and no alias/deprecation; asymmetric lifecycle; linear regression | public identity/precedence exact | I/O; Planning; Numerical Review | approved |
| `NSNR-026` | constraint | docs | must | test | deterministic factor/iteration/assembly/frame/result/log order | discrete order exact | Numerical Review; Planning | approved |
| `NSNR-030` | verification | docs | must | analysis | blocking small-limit/tangent/physics/rollback portfolio | case-specific downstream | Research; Formulation; Numerical Review | approved |
| `NSNR-034` | verification | docs | must | reference-comparison | stored artifacts, deterministic matching and precheck | docs/TOLERANCE.md | Numerical Review; I/O | approved |
| `NSNR-030` | verification | docs | must | analysis | blocking small-limit/tangent/global applied+reaction balance/free-residual/physics/rollback portfolio | case-specific downstream; external policy unchanged | Research; Formulation; Numerical Review | approved |
| `NSNR-034` | verification | docs | must | reference-comparison | U blocking, UR warning-only, local RF/RM review-only, exact matching/precheck | docs/TOLERANCE.md | Numerical Review; I/O | approved |
## 13. Open Questions
없음. Specialist gaps are owned by downstream stages and are escalated only if they would change approved scope, physics, tolerance, authoritative output or public compatibility.
## 14. Downstream Handoff
- Research/Formulation: exact Total Lagrangian MITC4 equations, strain/stress measures, rotation map/side/frame, drilling and consistent derivatives.
- Numerical Review: endpoint arithmetic, tangent/objectivity/state-invariant checks, benchmark portfolio, performance adequacy and exact reference artifacts/quantities.
- I/O Definition: HDF5 schema/projection/chunking/factor-0 handling, log representation/failure presentation and path/collision conventions.
- Implementation Planning: backend adapters, output ownership primitive, candidate filename, performance targets and requirement-traced TDD plan.
- Research/Formulation: exact Total Lagrangian MITC4 equations, strain/stress measures, rotation map/side/frame, drilling and consistent derivatives; Formulation propagates NSNR-069's exact-zero matching external-channel typed absolute branch and retained nonzero external-scale relative denominator.
- Numerical Review: verify the revised NSNR-069 branch and unchanged thresholds/four-channel AND, endpoint arithmetic, tangent/objectivity/state-invariant checks, benchmark portfolio and performance adequacy. Fix exact coarse/fine reference roles, local review projection/families, and factor-one global balance/free-residual tolerances while preserving local RF/RM review-only, `RM3` exclusion, displacement/rotation disposition, exact prechecks, immutable artifacts and common external tolerance.
- I/O Definition: HDF5 schema/projection/chunking/factor-0 handling, log representation/failure presentation and path/collision conventions. Audit and keep separately identifiable `(a)` global applied-plus-reaction balance error, `(b)` constrained-reaction resultant and `(c)` accepted free residual; global moments use current positions and spatial physical nodal moments about `[0,0,0]`, including supported nonzero prescribed translation/rotation cases.
- Implementation Planning: backend adapters, output ownership primitive, candidate filename, performance targets and requirement-traced TDD plan. Stage 6 must test the three equilibrium identities separately and must not reuse one implementation dataset as another without proving its approved projection semantics.
- Coordinator: escalate only a downstream proposal that changes the approved scope, physics, convergence tolerance, authoritative-result meaning or public output contract; do not advance the workflow on this document alone.
@@ -0,0 +1,186 @@
# Translation Displacement Comparison Report
## 1. Metadata and scope
- feature_id: `nonlinear-static-newton-raphson`
- report_id: `TRANSLATION-REPORT-001`
- date: `2026-08-26`
- owner_agent: `implementation-agent` (bounded diagnostic dispatch)
- dispatch coordination SHA-256: `D7CE6264EE3FD20FB6CD74CF1FC28E05EEEEFA67B25AF737D2DF989059A72D6F`
- status: `translation-diagnostic-pass-not-a-gate`
- tolerance source: `docs/TOLERANCE.md`
This focused report recomputes only global translational displacement components
`U1/U2/U3` for the existing coarse `reference/shellNL` case and the added fine
`reference/shellNL-meshfine` case. It is diagnostic evidence for the observed
mesh sensitivity; it does not create or replace the canonical Stage 6
`reference-comparison.md`. In particular, it is not Step 12 implementation
evidence and does not change any workflow gate.
The two meshes are compared separately to their own read-only Abaqus CSV
artifacts. No coarse-to-fine node interpolation, row pairing, averaging, or
direct FESA-to-FESA error was used.
## 2. Artifact inventory and accepted-frame identity
All paths below are relative to the feature worktree. SHA-256 and byte counts
were recomputed before comparison.
| mesh | artifact | path | bytes | SHA-256 |
| --- | --- | --- | ---: | --- |
| coarse | input | `reference/shellNL/shellNL.inp` | 4,778 | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| coarse | translation CSV | `reference/shellNL/shellNL displacements.csv` | 7,542 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| coarse | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441600152250700-0/shellNL_results.h5` | 934,602 | `9744814BEBF33486F526F821EDC7D96F072F34E988D70A00AC7AA063570FFA40` |
| fine | input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| fine | translation CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| fine | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/meshfine-diagnostic/run-1787669003801/shellNL-meshfine_results.h5` | 10,547,651 | `81A3C431E2977D2482D212877C3C306FFBB19CD1F0C47FBF1C936AE06CC93ACA` |
For both HDF5 artifacts, `/steps/Step-1/accepted_frames` has ten accepted rows.
The unique row satisfying `is_factor_one=1` and `load_factor=1.0` is
`frame_index=9`, `increment_index=10`, and `iteration_count=2`. Translation
values were projected only from
`/steps/Step-1/frames/9/nodal/displacement`, columns `[UX, UY, UZ]`:
| mesh | HDF5 node rows | displacement shape | CSV wide rows | exact CSV Frame |
| --- | ---: | --- | ---: | --- |
| coarse | 49 | `[49, 6]` | 49 | `Increment 10: Step Time = 1.000` |
| fine | 729 | `[729, 6]` | 729 | `Increment 10: Step Time = 1.000` |
## 3. Source identity and prechecks
The comparison key is
```text
(accepted_state=factor-one, canonical_instance_name, source_node_label, component)
```
`canonical_instance_name` is matched case-insensitively; the CSV/HDF5 source
spelling itself is not rewritten. CSV columns were selected after trimming only
surrounding header whitespace. The `U-U1/U-U2/U-U3` columns map respectively to
HDF5 `UX/UY/UZ`. Row order is not part of the identity and was not used for
matching.
| mesh | component rows | duplicate CSV wide/component/HDF5 keys | nonfinite CSV/HDF5 values | missing HDF5 keys | extra HDF5 keys | precheck |
| --- | ---: | --- | --- | ---: | ---: | --- |
| coarse | 147 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass |
| fine | 2,187 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass |
Each CSV contains only the exact factor-one `Frame` value shown above. Thus the
row prechecks required before numerical tolerance evaluation pass for the
translation projection in each mesh.
## 4. Applied tolerance policy
`U1/U2/U3` remain one global-length, blocking translation family within each
case. The component rows in Section 6 are diagnostics only: they use the same
case-family scale and near-zero band below and do not introduce a component
scale, component-specific tolerance, or a new approved family.
For the reference values `r_i` and FESA values `f_i`, `docs/TOLERANCE.md` is
applied exactly:
\[
S=\max_i|r_i|,\qquad B=0.01S,\qquad e_i=|f_i-r_i|.
\]
- If `|r_i| <= B`, the row passes iff `e_i <= B`.
- Otherwise, the row passes iff `e_i / |r_i| <= 0.05`.
- The whole family also requires `RMS(e_i) / S <= 0.01`.
- There is no independent absolute-error gate, `max(1,S)` floor, zero clamp,
row omission, or averaging. A zero-scale family would require exact FESA
zero; neither translation family has zero reference scale.
## 5. Translation-family results
| mesh | rows | `S` | `B=0.01S` | near-zero / significant rows | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | relative RMS | verdict |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| coarse | 147 | `2.3740820300000001e-05` | `2.3740820300000003e-07` | 122 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `2.4530813178127803e-08` | `2.9742030342848264e-07` | `1.0332757195473908e-03` | pass |
| fine | 2,187 | `2.5795705400000001e-05` | `2.5795705400000002e-07` | 1,626 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `5.8615647876386634e-09` | `2.7411825664926473e-07` | `2.2723025777921402e-04` | pass |
Both sets have zero row failures and relative RMS values below the common
`0.01` threshold. This is a translation-only diagnostic pass; it is not a
full external-reference verdict for the nonlinear-static feature.
## 6. Component diagnostics under the unchanged family scale
The `near-zero/significant` counts and every row decision below use the Section 5
family band `B`, not a component-derived scale. A dash for maximum relative
error means all rows of that component were near-zero and were therefore judged
only by the approved absolute-band rule.
### 6.1 Coarse mesh
| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| U1 | 49 | 49 / 0 | 0 | `5.9371608358817413e-12` | — | `1.7563955953584068e-12` | `1.2294769167508847e-11` | `12; -8.7994083858817417e-12; -2.8622475500000000e-12; 5.9371608358817413e-12` |
| U2 | 49 | 49 / 0 | 0 | `5.9379769034414602e-12` | — | `1.7566506185832881e-12` | `1.2296554330083018e-11` | `19; 8.7996068934414599e-12; 2.8616299900000001e-12; 5.9379769034414602e-12` |
| U3 | 49 | 24 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `4.2488614702881049e-08` | `2.9742030292016737e-07` | `2; -2.3550441745606457e-05; -2.3740820300000001e-05; 1.9037855439354404e-07` |
### 6.2 Fine mesh
| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| U1 | 729 | 729 / 0 | 0 | `5.6550975712048108e-12` | — | `1.5513648050863109e-12` | `4.1886849737330394e-11` | `27; -1.1143569120481096e-13; 5.5436618799999999e-12; 5.6550975712048108e-12` |
| U2 | 729 | 729 / 0 | 0 | `5.6547834814404039e-12` | — | `1.5512360377367428e-12` | `4.1883373018892053e-11` | `16; -1.1132282144040392e-13; 5.5434606599999999e-12; 5.6547834814404039e-12` |
| U3 | 729 | 168 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `1.0152527787009038e-08` | `2.7411825024924402e-07` | `2; -2.5633767274989038e-05; -2.5795705400000001e-05; 1.6193812501096337e-07` |
## 7. Deterministically ordered largest absolute-error rows
Rows are listed by descending absolute error, then source node label and
component for a deterministic display. `part-1-1` below is the canonical
case-insensitive instance identity.
| mesh | rank | key `(instance, node, component)` | FESA | reference | absolute error | applied rule and metric |
| --- | ---: | --- | ---: | ---: | ---: | --- |
| coarse | 1 | `(part-1-1, 2, U3)` | `-2.3550441745606457e-05` | `-2.3740820300000001e-05` | `1.9037855439354404e-07` | relative; `8.0190386005130586e-03` |
| coarse | 2 | `(part-1-1, 35, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` |
| coarse | 3 | `(part-1-1, 39, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` |
| fine | 1 | `(part-1-1, 2, U3)` | `-2.5633767274989038e-05` | `-2.5795705400000001e-05` | `1.6193812501096337e-07` | relative; `6.2777164841928829e-03` |
| fine | 2 | `(part-1-1, 21, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` |
| fine | 3 | `(part-1-1, 69, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` |
## 8. Mesh trend interpretation
The fine-mesh translation relative RMS divided by the coarse-mesh translation
relative RMS is
\[
\frac{2.2723025777921402\times10^{-4}}
{1.0332757195473908\times10^{-3}}
=0.21991251074664606.
\]
This is a `78.008748925335397%` reduction in the separately measured
reference-normalized translation RMS. It is consistent with the hypothesis
that the coarse-case discrepancy is mesh-sensitive, and the fine case also
passes the same row/RMS policy.
It is not an observed order of convergence, a proof of monotonic convergence,
or a solution-accuracy claim outside these translation rows: the two models have
different meshes and distinct external-reference outputs, and no common-mesh
interpolation or mesh-size-rate study was performed.
## 9. Explicit exclusions and no-change assertion
This report deliberately excludes:
- all reaction quantities;
- `UR1/UR2/UR3` rotations;
- all stress quantities, including the user-noted `reference/shell` element-label
ordering change;
- Newton convergence lifecycle and iteration-log acceptance beyond identifying
the accepted factor-one HDF5 frame;
- `USER-DECISION-004` disposition;
- Step 11 and Step 12 status, Physics Evaluation, and Release readiness.
No source, test, CMake, comparator, tolerance policy, phase file, canonical
reference-comparison report, declared input, or reference artifact was modified
for this report. The report also does not create `implementation-report.md`,
`build-test.md`, or `reference-comparison.md`.
## 10. Handoff
Within this narrow scope there is no artifact, identity, finite-value, or
translation-tolerance blocker. The report is handed to the Coordinator as
translation-only diagnostic evidence; gate ownership and all excluded work remain
unchanged.