docs: approve MITC4 implementation handoff

This commit is contained in:
KOKO\Mimi
2026-08-12 17:49:42 +09:00
parent a058ef7674
commit b8937ba66f
18 changed files with 2351 additions and 271 deletions
@@ -0,0 +1,921 @@
# Linear Static MITC4 Shell Implementation Plan
> **For agentic implementation workers:** 이 문서는 사용자 승인 전 `draft`다. 승인 후
> Implementation Planning Agent가 같은 내용으로 Harness phase planning files만
> materialize한다. Implementation Agent는 승인된 phase의 pending Step을
> `docs/HARNESS.md`와 `docs/HARNESS_WORKFLOW.md`에 따라 하나씩 실행해야 하며,
> Harness hook/runner lifecycle을 우회해서는 안 된다.
## 1. Metadata
- feature_id: `linear-static-mitc4-shell`
- document_type: `implementation-plan`
- status: `ready-for-implementation`
- approval_state: `harness-step-draft-approved-2026-08-12`
- owner_agent: `implementation-planning-agent`
- date: `2026-08-12`
- source_requirement: `docs/requirements/linear-static-mitc4-shell.md`
- source_research: `docs/research/linear-static-mitc4-shell-research.md`
- source_formulation: `docs/formulations/mitc4-shell-formulation.md`
- source_numerical_review:
`docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- source_io_definition:
`docs/io-definitions/linear-static-mitc4-shell-io.md`
- source_reference_models:
`docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- target_platform: `Windows x64 / MSVC / C++17`
- build_system: `CMake + CTest`
- execution_infrastructure: `Python Harness`
- current_numerical_verdict: `pass-for-implementation-planning`
- harness_task_name_candidate: `linear-static-mitc4-shell`
- implementation_authorized: `true-user-requested-2026-08-12`
- harness_execution_authorized: `true-user-requested-2026-08-12`
- phase_files_authorized: `true-user-approved-2026-08-12`
### Goal
승인된 Abaqus `.inp` subset의 `S4``S4R` source element를 하나의 FESA
`FESA-MITC4` 선형 정적 shell formulation으로 해석하고, 물리적으로 분리된 fixed
drilling stabilization, deterministic sparse assembly, mandatory HDF5 shell results,
두 declared displacement reference case를 end-to-end로 연결한다.
### Architecture
기존 B33 경로를 파괴하거나 speculative common element hierarchy를 만들지 않는다.
Domain에 shell semantic records를 추가하고, 별도 concrete `Mitc4Shell` kernel과
shell-specific recovery를 만든다. 기존 `Analysis` lifecycle, six-DOF nodal
load/constraint, sparse COO reduction, `LinearSolver`, generic `ResultsWriter` 경계,
HDF5 temporary/self-check/atomic replacement는 재사용한다.
### Tech Stack
- C++17, MSVC `/W4 /WX`
- CMake 3.25+, Visual Studio 18 2026 generator, x64 Debug
- GoogleTest/CTest
- Intel oneAPI MKL and TBB
- HDF5 schema version 0
- Python 3 Harness runner and repository hooks
### Global Constraints
1. 모든 production behavior는 같은 Step 안에서 `RED -> observed failure ->
minimal GREEN -> focused VERIFY -> full VERIFY`를 닫는다.
2. production C++ 파일 변경은 관련 C++ test와 함께 수행한다.
3. public solver headers에 MKL, TBB, HDF5, Win32/vendor type을 노출하지 않는다.
4. Node/Element에 equation ID를 저장하지 않고 `DofManager`만 numbering, scatter,
constrained/free mapping 및 sparse pattern을 소유한다.
5. `S4`와 `S4R`은 같은 FESA numerical path를 사용하며 source metadata만 다르다.
6. physical 20-DOF kernel과 four numerical drilling coordinates를 recovery/output에서
분리한다.
7. reference files를 생성, 수정, rename, repair, normalize하지 않으며 Abaqus를
실행하지 않는다.
8. future geometrically nonlinear residual/tangent, distributed loads, mixed beam-shell
models, reduced integration/hourglass, drilling calibration/energy output,
`NR-O03`/`NR-O04`는 구현 범위 밖이다.
9. 이 `draft`의 승인은 phase planning files 작성만 허용한다. Harness 실행은 별도의
명시적 사용자 요청이 있어야 한다.
## 2. Readiness Check
| gate | evidence | status | planning consequence |
| --- | --- | --- | --- |
| Requirements | `docs/requirements/linear-static-mitc4-shell.md`, 001-072 approved | pass | 모든 must를 task/test에 추적 |
| Research | `docs/research/linear-static-mitc4-shell-research.md` | pass | source-backed MITC4 tying/director/drilling 경계 유지 |
| Formulation | `docs/formulations/mitc4-shell-formulation.md`, `approved-for-implementation-planning` | pass | linear sections만 구현; Section 15 future nonlinear 제외 |
| Numerical Review | `docs/numerical-reviews/linear-static-mitc4-shell-review.md` | pass | critical blocker 없음; planning authorized |
| I/O | `docs/io-definitions/linear-static-mitc4-shell-io.md`, `approved-for-implementation-planning` | pass | keyword, diagnostic, HDF5 schema를 그대로 구현 |
| Reference Model | `docs/reference-models/linear-static-mitc4-shell-reference-models.md` | pass | 두 input/CSV pair만 read-only 사용 |
| Repository seams | parser/model, element/analysis, result/reference 영역 read-only 조사 | pass | candidate files와 current signatures 확인 |
| Toolchain paths | GoogleTest/MKL/TBB/HDF5 config directories 존재 | pass | Section 10의 exact configure command 사용 가능 |
Toolchain path evidence was resolved in this workspace on `2026-08-12`with
`Test-Path -LiteralPath`returning `True`for all four literal directories used in
Sections 10 and 12. They are environment-resolved paths, not placeholders. Each Step
copies the fail-fast path precheck before CMake so a changed machine configuration
stops before RED/GREEN evidence is recorded.
Declared read-only reference inventory:
| case | source | displacement CSV | SHA-256 |
| --- | --- | --- | --- |
| S4 | `reference/shell/shell.inp` | `reference/shell/shell displacements.csv` | input `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`; CSV `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| S4R | `reference/shellR/shellR.inp` | `reference/shellR/shellR displacements.csv` | input `1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4`; CSV `8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB` |
README, `metadata.json`, Abaqus provenance/version, canonical naming 및 추가 portfolio는
readiness gate가 아니다. 현재 열린 product/numerical 결정은 없다. 남은 승인 항목은
Section 12의 multi-Step Harness draft뿐이다.
## 3. Implementation Scope
### Included behavior
- exactly one `*STEP, *STATIC`, small displacement/small rotation
- four-node `S4`/`S4R` parsing and one internal `FESA-MITC4` identity
- stable source instance/label/type and four-node source ordering
- homogeneous isotropic `E,nu` and centered single-layer constant `t`
- deterministic positive-thickness nodal directors and right-handed frames
- six global nodal DOFs; 24-entry shell scatter
- physical membrane, bending, transverse shear with MITC edge-midpoint tying
- common `2x2x2` Gauss integration for S4 and S4R
- fixed `k_d=10^-3 min(R+)` drilling stabilization from the eight physical
tangent-rotation diagonals only
- nodal BC and global CLOAD; aggregate director-parallel moment rejection
- deterministic global stiffness, constrained partition, factorize-before-load,
effective RHS, solve, full residual/reaction
- physical-only shell recovery, energy/equilibrium/verification metrics
- exact mandatory HDF5 model/result schema and failure-atomic finalization
- direct HDF5-to-Abaqus-displacement comparison: U blocking, UR warning-only
### Non-goals
- Abaqus `S4`/`S4R` algorithm equivalence
- B31 mapping, mixed B33/MITC4 model execution or common public element hierarchy
- `*DLOAD`, pressure, gravity, body/edge/follower load
- composite, offsets, variable thickness, explicit normal/orientation
- reduced integration, hourglass control, MITC4+
- nonlinear state, finite director update, nonlinear residual/tangent execution
- drilling physical strain/load/result/stress/energy, coefficient sweep or calibration
- `NR-O03` smooth-angle and `NR-O04` warp/distortion threshold sweeps
- extra shell benchmarks as a completion gate
- Abaqus execution or reference artifact mutation
## 4. Work Breakdown
Tasks are ordered by implementation dependency. Harness executes Steps 0-13 in strict
order even when the minimal dependency set below is smaller.
| task | depends on |
| --- | --- |
| TASK-00 | none |
| TASK-01 | TASK-00 |
| TASK-02 | TASK-01 |
| TASK-03 | TASK-02 |
| TASK-04 | TASK-03 |
| TASK-05 | TASK-04 |
| TASK-06 | TASK-00; executed after TASK-05 |
| TASK-07 | TASK-04, TASK-06 |
| TASK-08 | TASK-02, TASK-07 |
| TASK-09 | TASK-05, TASK-08 |
| TASK-10 | TASK-05, TASK-09 |
| TASK-11 | TASK-09, TASK-10 |
| TASK-12 | TASK-01, TASK-07, TASK-08, TASK-10, TASK-11 |
| TASK-13 | TASK-11, TASK-12 |
| TASK-14 | TASK-13 |
| TASK-15 | TASK-13 |
| TASK-16 | TASK-00 through TASK-15 |
### TASK-00: `shell-semantic-model`
- Own only model semantic records and immutable Domain access.
- Candidate additions: `Mitc4ShellDefinition`, `ShellSection`, source type enum/value,
internal formulation identity, four-node indices, material/section indices, node
director/frame storage.
- Preserve current B33 records and stable source/internal identity; reject mixed models
at mapping rather than designing a heterogeneous solver hierarchy.
- Tests: `MITC4-MODEL-001`, `MITC4-MODEL-002`.
### TASK-01: `shell-domain-mapping`
- Extend `AbaqusDomainMapper::map(const ParsedInput&)`; keep `AbaqusInputReader`
syntax-only.
- Accept exact S4/S4R and single-layer SHELL SECTION grammar, resolve ELSET/material,
identity wrappers and six-DOF BC/CLOAD.
- Fail closed with exact I/O diagnostic classes for connectivity, assignment,
unsupported option/procedure/mixed model/distributed load.
- Tests: `MITC4-MAP-001` through `MITC4-MAP-004`.
### TASK-02: `shell-director-geometry`
- Add deterministic geometry preprocessing after instance expansion: element normal
candidates, area-weighted nodal director, pairwise orientation validation and nodal
frame tie-break.
- Validate center, eight stiffness points, four tying points and committed recovery
points for finite bases, nonzero surface measure and positive finite Jacobian.
- Do not introduce calibrated angle, warp or distortion thresholds.
- Tests: `MITC4-GEO-001` through `MITC4-GEO-004`.
### TASK-03: `mitc4-kinematics-constitutive`
- Create concrete candidate `Mitc4Shell` without a public base hierarchy.
- Implement shape identities, local frames, `T_p`/`T_d` channel maps, direct
membrane/bending terms, all four covariant MITC tying samples/interpolation,
engineering-shear factors, `C_ps/C_5/A/D/A_s` and fixed point order.
- Keep all intermediate physical coordinates at 20 DOFs.
- Tests: `MITC4-KIN-001` through `MITC4-KIN-005`.
### TASK-04: `mitc4-stiffness-drilling`
- Form physical `K20` with common `2x2x2` integration and embed by congruence.
- Build `R+` only from the eight physical tangent-rotation diagonals, use exact
`k_d=10^-3 min(R+)` and `T_d^T(k_d I4)T_d`; fail empty/nonfinite `R+`.
- Tests: `MITC4-KERNEL-001` through `MITC4-KERNEL-006`.
### TASK-05: `mitc4-physical-recovery`
- Add only the element-kernel physical recovery seam for generalized strain/resultant,
bottom/middle/top stress and physical element energy.
- Prove pure numerical drill action contributes zero to every physical recovery value.
- Tests: `MITC4-KERNEL-007`, `MITC4-PHYSREC-001`.
### TASK-06: `shell-dof-scatter`
- Retain six per-node full DOFs and add typed 24-entry shell scatter/pattern access;
preserve existing 12-entry B33 behavior.
- Preserve stable full/free/constrained numbering and all-constrained `0x0 Kff`.
- Tests: `MITC4-DOF-001` through `MITC4-DOF-003`.
### TASK-07: `shell-sparse-assembly`
- Dispatch shell topology to `Mitc4Shell::globalStiffness()`.
- Emit 576 element-local COO entries with stable `elementOrder`/`localOrder` into
worker-owned buffers; preserve canonical fixed reduction and diagonal slots.
- Tests: `MITC4-ASM-001` through `MITC4-ASM-003`.
### TASK-08: `shell-load-validation`
- Reuse global six-DOF `LoadAssembler` and existing constraint partition.
- Aggregate CLOAD deterministically before testing exact-zero or
`rho_M=abs(dot(d,M))/norm(M)<=1e-12`; rejected moments never reach stabilization.
- Preserve force/moment units and factorization-before-load lifecycle.
- Tests: `MITC4-LOAD-001` through `MITC4-LOAD-004`.
### TASK-09: `shell-analysis-state`
- Add shell result rows to `AnalysisState` and `result_records.hpp`: four fixed
midsurface locations, local frames, eight generalized strains/resultants,
bottom/middle/top stress, physical energy, equilibrium and verification metrics.
- Preserve stable row order and expose candidate-owned containers only; perform no
element calculation in this task.
- Tests: `MITC4-STATE-001` through `MITC4-STATE-003`.
### TASK-10: `shell-result-recovery`
- Recover full residual `K*d-F` for nodal reaction/equilibrium evidence but call the
kernel physical-only recovery for shell quantities.
- Validate candidates fully before committing state; keep stable row order.
- Tests: `MITC4-REC-001` through `MITC4-REC-005`.
### TASK-11: `shell-hdf5-output`
- Extend `Hdf5ResultsWriter` behind the unchanged generic `ResultsWriter::write`
boundary.
- Add exact schema paths/shapes/component attributes from the I/O contract without
changing B33 dataset meaning.
- Reuse temporary write, finite/schema self-check, close/reopen and atomic replace.
- Tests: `MITC4-H5-001` through `MITC4-H5-004`.
### TASK-12: `shell-linear-static-flow`
- Route a shell Domain through the existing eight-hook `Analysis::run()` lifecycle.
- Preserve assemble/partition, factorize, load/effective RHS, substitute,
reconstruct, full residual/recover, atomic write order and single factorization.
- Validate nonzero prescribed values, singular support and valid all-constrained solve.
- Tests: `MITC4-FLOW-001` through `MITC4-FLOW-004`.
### TASK-13: `shell-reference-comparison`
- Add a test-only MITC4 comparator rather than widening beam-specific assumptions.
- Consume exactly one declared input and displacement CSV per case; map instance,
source node and six displacement components directly to HDF5.
- Precheck header/row set/duplicates/nonfinite/schema/identity before numeric work.
- Apply `1e-9+1e-6*reference_scale_c`; U blocks, UR only emits deterministic warning;
record all required metrics and worst row.
- Tests: `MITC4-REF-001` through `MITC4-REF-006`.
### TASK-14: `shell-s4-end-to-end`
- This is declared-case sub-work owned by TASK-13/Step 13's test-only reference module,
not an independent production-module Step.
- Run the declared S4 deck through CLI, authoritative HDF5, schema checks and
read-only comparator.
- Assert source type `S4`, internal `FESA-MITC4` and U pass/UR report behavior.
- Tests: `MITC4-E2E-S4-001`, `MITC4-E2E-S4-002`.
### TASK-15: `shell-s4r-end-to-end`
- This is declared-case sub-work owned by TASK-13/Step 13's test-only reference module,
not an independent production-module Step.
- Run the declared S4R deck through the identical numerical route.
- Assert only source metadata differs from an otherwise identical S4 semantic fixture;
no reduced integration/hourglass branch exists.
- Tests: `MITC4-E2E-S4R-001`, `MITC4-E2E-S4R-002`.
### TASK-16: `mitc4-full-verification`
- Run MSVC x64 Debug full build, CTest discovery, focused feature suites and full CTest.
- Audit warnings, deterministic repeat evidence, required HDF5 inventory, reference
immutability and git diff scope.
- Produce only downstream implementation evidence; do not claim reference verification,
physics sanity or release readiness.
- Tests/audits: `MITC4-VERIFY-001` through `MITC4-VERIFY-004`.
## 5. TDD Test Plan
| test id | initial RED assertion | minimal GREEN behavior | focused verification |
| --- | --- | --- | --- |
| MITC4-MODEL-001 | four-node S4/S4R records/director/source identity do not exist | immutable shell records preserve source and internal identity | `DomainModel.*` |
| MITC4-MODEL-002 | shell section/material/thickness ownership unavailable | one resolved centered homogeneous assignment per element | `DomainModel.*` |
| MITC4-MAP-001 | valid S4/S4R and SHELL SECTION reject | both source types map to FESA-MITC4 | `InpDomainMapping.*` |
| MITC4-MAP-002 | duplicate/unresolved/conflicting section cases lack exact errors | exact assignment/material validation | `InpDomainMapping.*` |
| MITC4-MAP-003 | excluded shell options/mixed models may be ignored | exact fail-closed diagnostics | `InpDomainMapping.*` |
| MITC4-MAP-004 | second/nonstatic/NLGEOM/DLOAD cases lack shell boundary tests | exact procedure/load rejection; no-op output unchanged | `InpDomainMapping.*` |
| MITC4-GEO-001 | planar/rotated/warped directors unavailable | deterministic unit director and right-handed frame | `Mitc4Geometry.*` |
| MITC4-GEO-002 | incident orientation/tie-break is untested | stable area-weighted result across repeated order | `Mitc4Geometry.*` |
| MITC4-GEO-003 | duplicate/bow-tie/zero/reversed/nonfinite geometry may pass | exact geometry failures | `Mitc4Geometry.*` |
| MITC4-GEO-004 | required-point Jacobian inventory absent | every required point finite and positive | `Mitc4Geometry.*` |
| MITC4-KIN-001 | shape/derivative identities unavailable | partition/unity/derivative identities | `Mitc4ShellKinematics.*` |
| MITC4-KIN-002 | frame/T transforms unavailable | orthonormal/right-handed frames and channel selection | `Mitc4ShellKinematics.*` |
| MITC4-KIN-003 | tying values/weights unavailable | four hand-computed covariant tying values | `Mitc4ShellKinematics.*` |
| MITC4-KIN-004 | constitutive/section matrices unavailable | exact coefficients, symmetry, positivity, unit rescaling | `Mitc4ShellConstitutive.*` |
| MITC4-KIN-005 | quadrature order not fixed | exact common 2x2x2 points/weights | `Mitc4ShellKinematics.*` |
| MITC4-KERNEL-001 | no 24x24 shell stiffness | finite symmetric 24x24 stiffness | `Mitc4ShellKernel.*` |
| MITC4-KERNEL-002 | energy congruence unavailable | 20/24 virtual work and energy equal within 1e-12 | `Mitc4ShellKernel.*` |
| MITC4-KERNEL-003 | rigid/rank checks fail | six physical rigid modes, physical rank 14, stabilized rank 18 | `Mitc4ShellKernel.*` |
| MITC4-KERNEL-004 | deformation energy/patch fields unavailable | positive membrane/bending/shear/twist modes | `Mitc4ShellPatch.*` |
| MITC4-KERNEL-005 | R+ membership/coefficient not implemented | exact rotational-only min and 1e-3 factor | `Mitc4ShellDrilling.*` |
| MITC4-KERNEL-006 | empty R+ and pure drill behavior unspecified | deterministic failure; pure drill stabilized | `Mitc4ShellDrilling.*` |
| MITC4-KERNEL-007 | drilling contaminates recovery/energy | physical recovery/energy exact zero for pure drill | `Mitc4ShellDrilling.*` |
| MITC4-PHYSREC-001 | kernel recovery contract is not independently callable | exact physical strain/resultant/stress/energy for hand field | `Mitc4ShellPhysicalRecovery.*` |
| MITC4-DOF-001 | shell scatter fixed at 12 | stable 24-entry scatter in node/component order | `DofManager.*` |
| MITC4-DOF-002 | shell pattern unavailable | sorted unique pattern with all diagonals | `DofManager.*` |
| MITC4-DOF-003 | constraint roundtrip lacks shell-sized system | no/mixed/all constraints and nonzero values roundtrip | `DofManager.*; EssentialConstraints.*` |
| MITC4-ASM-001 | assembler rejects four-node element | 576 stable local contributions assemble | `SparseAssembly.*` |
| MITC4-ASM-002 | thread/repetition may reorder | serial/TBB/repeated CSR bytes and values match | `SparseAssembly.*` |
| MITC4-ASM-003 | S4/S4R could branch numerically | identical semantic fixtures produce identical K | `SparseAssembly.*` |
| MITC4-LOAD-001 | shell force/moment fixture unavailable | six global components aggregate stably | `LoadAssembly.*` |
| MITC4-LOAD-002 | director-parallel exact-zero branch untested | zero aggregate moment accepted | `LoadAssembly.*` |
| MITC4-LOAD-003 | rho boundary/rejection untested | <=1e-12 accepted; >1e-12 exact diagnostic | `LoadAssembly.*` |
| MITC4-LOAD-004 | rejected moment might enter drill channel | failure occurs before RHS/substitution | `LoadAssembly.*` |
| MITC4-STATE-001 | AnalysisState has no shell row containers | exact shell row/component/location types are owned | `AnalysisState.*` |
| MITC4-STATE-002 | physical energy/equilibrium/metrics are absent | finite candidate global evidence is stored | `AnalysisState.*` |
| MITC4-STATE-003 | shell candidate rollback is unavailable | invalid candidate leaves prior state unchanged | `AnalysisState.*` |
| MITC4-REC-001 | shell row types absent | four ordered location/frame/strain/resultant rows | `ResultRecovery.*` |
| MITC4-REC-002 | bottom/middle/top stress absent | direct S11/S22/S12 recovery in fixed order | `ResultRecovery.*` |
| MITC4-REC-003 | energy may include drilling | physical strain energy excludes stabilization | `ResultRecovery.*` |
| MITC4-REC-004 | reaction/equilibrium semantics may diverge | full residual, force/moment balance, normalized metrics | `ResultRecovery.*` |
| MITC4-REC-005 | invalid partial rows may commit | nonfinite/inventory failure preserves old state | `ResultRecovery.*` |
| MITC4-H5-001 | shell metadata/model schema missing | exact metadata, elements, director/frame, material/section | `Hdf5ResultsWriter.*` |
| MITC4-H5-002 | mandatory shell result paths missing | exact displacement/reaction/frame/strain/resultant/stress/global rows | `Hdf5ResultsWriter.*` |
| MITC4-H5-003 | output request could filter or drilling paths appear | inventory unconditional; forbidden paths absent | `Hdf5ResultsWriter.*` |
| MITC4-H5-004 | invalid shell candidate may replace final file | self-check failure preserves prior final | `Hdf5ResultsWriter.*` |
| MITC4-FLOW-001 | shell cannot traverse Analysis lifecycle | exact hook order and one factorization | `LinearStaticCli.*` |
| MITC4-FLOW-002 | prescribed shell RHS/reconstruction absent | Ff-Kfc*dc and full displacement correct | `LinearStaticCli.*` |
| MITC4-FLOW-003 | singular/all-constrained behavior unproven | singular fails; 0x0 Kff succeeds | `LinearStaticCli.*` |
| MITC4-FLOW-004 | failed output may commit state | candidate state/output commits only after validation | `LinearStaticCli.*` |
| MITC4-REF-001 | six-column CSV header unsupported | exact MITC4 header maps instance/node/U/UR | `Mitc4ReferenceComparison.*` |
| MITC4-REF-002 | invalid row inventory may be ignored | missing/extra/duplicate/nonfinite/schema mismatch fails first | `Mitc4ReferenceComparison.*` |
| MITC4-REF-003 | tolerance could clamp/row-normalize | exact component group scale and mixed tolerance | `Mitc4ReferenceComparison.*` |
| MITC4-REF-004 | UR may block verdict | U blocks; UR only warns | `Mitc4ReferenceComparison.*` |
| MITC4-REF-005 | report metrics/order incomplete | row decisions, max, normalized, RMS, vector, worst row deterministic | `Mitc4ReferenceComparison.*` |
| MITC4-REF-006 | comparator may require administrative files | only declared input/CSV/HDF5 required | `Mitc4ReferenceComparison.*` |
| MITC4-E2E-S4-001 | S4 deck cannot produce valid shell HDF5 | CLI succeeds with exact S4 metadata/schema | `Mitc4S4Reference.*` |
| MITC4-E2E-S4-002 | S4 U comparison unavailable | all U rows pass; UR fully reported | `Mitc4S4Reference.*` |
| MITC4-E2E-S4R-001 | S4R deck selects no/other path | same FESA-MITC4 integration rule | `Mitc4S4RReference.*` |
| MITC4-E2E-S4R-002 | S4R U comparison unavailable | all U rows pass; UR fully reported | `Mitc4S4RReference.*` |
| MITC4-VERIFY-001 | feature tests not discoverable | all planned suites discovered/labeled | CTest JSON inventory |
| MITC4-VERIFY-002 | warnings/regressions unknown | MSVC Debug full build passes /W4 /WX | full build |
| MITC4-VERIFY-003 | nondeterminism unknown | repeated focused/full tests pass | full CTest |
| MITC4-VERIFY-004 | artifact governance unknown | reference hashes/path and git diff unchanged | read-only audit |
Numerical thresholds are fixed: frame/symmetry/transformation-energy `<=1e-12`;
rigid action, linear residual and global equilibrium `<=1e-10`. Patch tests compare
against independently hand-computed analytical fields and signs, not the production
routine itself.
## 6. CMake/CTest Plan
### Existing topology to preserve
- production library: `fesa_solver`
- CLI: `fesa_cli`
- unit: `fesa_unit_tests`
- integration: `fesa_integration_tests`
- reference: `fesa_reference_tests`
- aggregate: `fesa_tests`
No new executable target is required. New kernel/test/comparator source files are
explicitly registered in existing source lists. Add `linear-static-mitc4-shell` as an
additive CTest label without removing the B33 label. Because
`gtest_discover_tests()` currently applies target-wide labels, focused Step
verification uses exact suite regexes; label-based MITC4 filtering is enabled only
if per-test labeling can be added without relabeling unrelated B33 tests.
Candidate registrations:
- `src/fesa/CMakeLists.txt`: candidate `model/shell_geometry.cpp`,
`elements/mitc4_shell.cpp` and any separate shell recovery implementation.
- `tests/CMakeLists.txt`: candidate `shell_geometry_test.cpp`,
`mitc4_shell_test.cpp`, optional focused shell recovery/HDF5 tests, and MITC4
reference comparator/test sources.
- Preserve existing runtime staging for MKL/TBB/HDF5 on all three test executables.
CTest discovery must show every suite named in Section 5 before implementation is
considered verified.
## 7. Candidate Files and Ownership
All signatures in this section are candidates for the Implementation Agent to confirm
against the approved contracts during the owning Step; they are not new approved APIs.
| owner/module | candidate files | candidate interface/direction |
| --- | --- | --- |
| model | `include/fesa/model/model_types.hpp`, `include/fesa/model/domain.hpp`, `src/fesa/model/domain.cpp` | separate shell records/accessors; no equation IDs |
| shell semantic geometry | candidate new `include/fesa/model/shell_geometry.hpp`, `src/fesa/model/shell_geometry.cpp` | director/frame and required-point geometry validation without parser/kernel dependency |
| Abaqus semantic map | `include/fesa/io/abaqus/domain_mapper.hpp`, `src/fesa/io/abaqus/domain_mapper.cpp` | keep `map(const ParsedInput&) -> Result<Domain>` |
| analysis view | `include/fesa/analysis/analysis_model.hpp`, `src/fesa/analysis/analysis_model.cpp` | non-owning active shell view only if record representation requires |
| shell kernel | new `include/fesa/elements/mitc4_shell.hpp`, `src/fesa/elements/mitc4_shell.cpp` | concrete create/stiffness/physical-recover API |
| DOF | `include/fesa/fem/dof_manager.hpp`, `src/fesa/fem/dof_manager.cpp` | typed `array<size_t,24>` shell scatter beside B33 scatter |
| sparse assembly | `src/fesa/assembly/sparse_assembler.cpp` | topology dispatch; unchanged public assemble signature |
| load | `src/fesa/assembly/load_assembler.cpp` only if aggregate director projection cannot live in semantic validation | reuse full six-DOF assembly |
| state/results | `include/fesa/analysis/analysis_state.hpp`, `src/fesa/analysis/analysis_state.cpp`, `include/fesa/results/result_records.hpp` | additive shell rows/global metrics |
| recovery | `include/fesa/results/result_recovery.hpp`, `src/fesa/results/result_recovery.cpp` or new shell-specific cpp | candidate-then-commit; physical/drill split |
| HDF5 | `src/fesa/io/hdf5/hdf5_results_writer.cpp` | generic public writer unchanged |
| lifecycle | `src/fesa/analysis/linear_static_analysis.cpp` | preserve existing hook order |
| app | `tests/integration/app/fesa_application_test.cpp`; production app only if feature dispatch needs it | CLI syntax unchanged |
| reference tests | new `tests/reference/mitc4_reference_comparison.hpp/.cpp` and tests | test-only direct HDF5/CSV comparator |
| build graph | `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt` | explicit additive source/test registration |
Candidate kernel seam:
```cpp
class Mitc4Shell {
public:
static Result<Mitc4Shell> create(
std::array<const Node*, 4> nodes,
std::array<Vector3, 4> initialDirectors,
const ShellSection& section,
const LinearElasticMaterial& material);
[[nodiscard]] Matrix physicalLocalStiffness20() const;
[[nodiscard]] Matrix globalStiffness24() const;
[[nodiscard]] Result<ShellRecovery> recoverPhysical(
const Vector& globalElementDisplacement24) const;
};
```
This candidate explicitly avoids returning drill energy/results and avoids a common
public `Element` hierarchy. Exact value/reference ownership and math types are decided
inside TASK-03 after compiling the first RED test.
## 8. Data Flow Contract
```text
.inp bytes
-> AbaqusInputReader (syntax/source locations only)
-> AbaqusDomainMapper (approved semantics, S4/S4R provenance, section/material)
-> geometry/director preprocessing
-> immutable Domain
-> non-owning AnalysisModel
-> DofManager (6 DOF/node, 24-entry shell scatter, free/constrained maps)
-> Mitc4Shell physical K20 + fixed drill embedding -> global K24
-> worker-local COO -> stable SparseMatrix reduction
-> Kff/Kfc/Kcf/Kcc partition -> Kff factorize
-> aggregate CLOAD/director check -> Ff-Kfc*dc
-> substitute -> full displacement
-> full residual K*d-F
-> physical-only shell recovery + global evidence
-> validated candidate AnalysisState
-> temporary results.h5 -> schema self-check -> atomic finalization
authoritative results.h5
-> test-only MITC4 HDF5 projection
-> exact source instance/node/component row-set precheck
-> read-only declared Abaqus displacement CSV
-> U blocking / UR warning-only deterministic report
```
Invariants:
- Domain outlives AnalysisModel; no Domain copying.
- Source labels/instances/types never become equation indices.
- `S4`/`S4R` source type is metadata; both call the same kernel/quadrature.
- full residual uses stabilized global K; shell strain/resultant/stress/physical energy
use physical recovery only.
- HDF5 `nodal/reaction` is full residual; constraint mask decides reaction versus free
residual evidence.
- result rows use fixed GP1..GP4 and BOTTOM/MIDDLE/TOP identity; no averaging or Abaqus
integration-point relabeling.
- state/output mutation occurs only after complete validation.
## 9. Acceptance Traceability Matrix
The inclusive ranges below cover every must requirement `001` through `072` exactly
once without gap or overlapping requirement range.
| requirement range | owning tasks | test/evidence id | reference model id | acceptance |
| --- | --- | --- | --- | --- |
| 001 | TASK-01, TASK-12 | MAP-004, FLOW-001 | N/A | one static step only; deterministic rejection otherwise |
| 002-004 | TASK-00, TASK-01, TASK-11, TASK-14, TASK-15 | MODEL-001, MAP-001, H5-001, both E2E suites | `shell-s4`, `shell-s4r` | S4/S4R one kernel; distinct stable source identity |
| 005 | TASK-00, TASK-06, TASK-11 | MODEL-001, DOF-001/003, H5-001/002 | N/A | exact six-component order; no distributed equation ownership |
| 006-010 | TASK-00, TASK-01 | MODEL-002, MAP-002/003 | N/A | finite E,nu,t; one assignment; unsupported meanings fail |
| 011-016 | TASK-02, TASK-03 | GEO-001..004, KIN-002 | N/A | deterministic unit directors; exact geometry predicates |
| 017-020 | TASK-01, TASK-08 | MAP-004, LOAD-001..004 | N/A | six-DOF BC/CLOAD; drilling/distributed load fails |
| 021-023 | TASK-01 | MAP-001..004 and existing no-op regression | N/A | approved parser subset/identity wrappers/no-op policy |
| 024-030 | TASK-00, TASK-06, TASK-07, TASK-09, TASK-10, TASK-12, TASK-16 | MODEL, DOF, ASM, STATE, REC, FLOW, VERIFY suites | N/A | ownership, deterministic assembly, lifecycle, residual reaction |
| 031-038 | TASK-03, TASK-04, TASK-05, TASK-07, TASK-10 | KIN, KERNEL, PHYSREC, ASM-003, REC-003 | N/A | physical 5-DOF embedding, exact drilling, same quadrature, invariants |
| 039-048 | TASK-09, TASK-10, TASK-11, TASK-12 | STATE-001..003, REC-001..005, H5-001..004, FLOW-004 | N/A | mandatory finite schema/results and atomic commit |
| 049 | TASK-00 through TASK-16 | every production Task records RED/failure/GREEN/focused/full VERIFY; VERIFY-001..003 | `shell-s4`, `shell-s4r` where reference-dependent | TDD evidence, related C++ tests, MSVC Debug no-warning build and full CTest |
| 050 | TASK-02 through TASK-05, TASK-07 | GEO-001/002, KIN-001/002, KERNEL-001..004, ASM-002 | N/A | frames, Jacobian, symmetry, transformation, six modes, positivity and repeatability |
| 051 | TASK-02 through TASK-05, TASK-10, TASK-12 | GEO-001, KERNEL-001..003, REC-004, FLOW-002 | N/A | exact normalized 1e-12 and 1e-10 algebraic thresholds |
| 052 | TASK-03 through TASK-05, TASK-10 | KIN-003/004, KERNEL-004, PHYSREC-001, REC-001/002 | N/A | independent membrane, bending, shear, twist fields and recovery signs/order |
| 053 | TASK-04, TASK-05, TASK-14, TASK-15 | KERNEL-001..007, PHYSREC-001, both declared E2E suites | `shell-s4`, `shell-s4r` | formulation invariants/patches and both reference cases pass |
| 054 | TASK-02 | GEO-001..004 | N/A | exact valid/rejected geometry inventory; no NR-O03/O04 |
| 055 | TASK-16 | VERIFY scope audit | N/A | extra benchmark portfolio is explicitly nonblocking and absent from completion gate |
| 056 | TASK-04, TASK-05, TASK-07, TASK-10 | KERNEL-005..007, PHYSREC-001, ASM-001/002, REC-003 | N/A | exact fixed drilling, deterministic rank/action and physical-output exclusion |
| 057 | TASK-10, TASK-12, downstream Physics Evaluation | REC-002..004, FLOW-002, later physics report | `shell-s4`, `shell-s4r` | implementation exposes equilibrium/sign/energy evidence; physical plausibility verdict is downstream |
| 058-060 | TASK-13, TASK-14, TASK-15 | REF-003, both E2E comparison tests | `shell-s4`, `shell-s4r` | exact U mixed tolerance without clamp |
| 061-062 | TASK-13, TASK-14, TASK-15 | REF-004/005, both E2E tests | `shell-s4`, `shell-s4r` | UR same tolerance, deterministic warning only |
| 063-064 | TASK-13 | REF-001/002/005 | `shell-s4`, `shell-s4r` | schema/row failure before numeric comparison; full metrics |
| 065-068 | TASK-13, TASK-14, TASK-15 | REF-001/002/006, both case prechecks | `shell-s4`, `shell-s4r` | exact four read-only paths; unique finite mapped rows |
| 069-071 | TASK-14, TASK-15 | both E2E suites | `shell-s4`, `shell-s4r` | declared S4/S4R; U blocks and UR warns; no other equality gate |
| 072 | TASK-13 through TASK-16 | REF-006, VERIFY-004 and git/hash audit | `shell-s4`, `shell-s4r` | no reference solver run or artifact mutation |
## 10. Validation Commands
These commands are the environment-resolved Windows x64 Debug baseline. Planning does
not execute build/tests. Each approved Harness Step first runs this literal path
precheck and then repeats the relevant build/test subset after its RED and GREEN
changes.
```powershell
$requiredBuildPaths = @(
"C:/git/googletest",
"C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl",
"C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb",
"C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
)
foreach ($requiredBuildPath in $requiredBuildPaths) {
if (-not (Test-Path -LiteralPath $requiredBuildPath)) {
throw "Required configured build path is absent: $requiredBuildPath"
}
}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
Focused commands:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure
cmake --build .harness/build --config Debug --target fesa_integration_tests
ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure
cmake --build .harness/build --config Debug --target fesa_reference_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure
```
Planning-document verification:
```powershell
git diff --check -- docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md
git status --short
git diff --name-only
```
Reference immutability audit is read-only and fails on any mismatch:
```powershell
$expectedReferenceHashes = [ordered]@{
"reference/shell/shell.inp" = "4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"
"reference/shell/shell displacements.csv" = "C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B"
"reference/shellR/shellR.inp" = "1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4"
"reference/shellR/shellR displacements.csv" = "8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB"
}
foreach ($referencePath in $expectedReferenceHashes.Keys) {
$actualHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $referencePath).Hash
if ($actualHash -ne $expectedReferenceHashes[$referencePath]) {
throw "Reference artifact changed: $referencePath"
}
}
```
Do not invoke `scripts/hooks/*.py` manually. Harness runner installs/uses the configured
PreToolUse and Stop hooks automatically. Do not invoke `scripts/execute.py` until the
user separately authorizes execution.
## 11. Risks and Downstream Handoff
| risk | controlling plan decision | stop condition |
| --- | --- | --- |
| beam-only ModelDefinition leaks through every layer | add shell semantic records first; preserve B33 access | stop if a Step requires unapproved mixed-model hierarchy |
| fixed 12-DOF scatter breaks B33 | typed beam/shell scatter paths and B33 regressions | stop on any B33 focused/full regression |
| drilling contaminates physical output | separate physical recovery from stabilized full K | stop if pure-drill recovery/energy is nonzero |
| director/frame sign nondeterminism | source-order, area-weight and tie-break tests | stop on repeat/order/thread difference |
| S4R accidentally selects reduced integration | one internal formulation and ASM/E2E equality tests | stop if source type reaches quadrature dispatch |
| full residual confused with element resultants | keep reaction from Kd-F, physical recovery separately | stop if reaction is reconstructed from shell resultants |
| writer expansion changes B33 schema | additive shell branches plus full B33 CTest | stop on B33 schema regression |
| comparator inherits B33 four-file/Frame assumptions | dedicated test-only MITC4 comparator | stop if administrative files become required |
| reference artifacts staged by Harness | clean isolated worktree, hash/diff audit | stop immediately on any reference path change |
| future nonlinear equations enter production | scope and code review prohibition | stop if nonlinear state/tangent is allocated or called |
### Implementation Agent
- Read the approved implementation plan, `docs/HARNESS.md` and
`docs/HARNESS_WORKFLOW.md` before every Step.
- Execute only the Harness-selected pending Step and use the repository hooks/scripts
through the documented runner lifecycle.
- Never choose the next Step, edit executor-owned timestamps/statuses, batch multiple
Steps, or implement outside the Step's file ownership.
- Record the RED command and observed failure before GREEN.
### Build/Test Executor Agent
- Use Section 10 exact CMake/MSVC/CTest baseline after implementation Steps finish.
- Report new warnings, discovery gaps and exact failing test names without changing
upstream contracts.
### Correction Agent
- Apply only minimal failure-driven corrections inside approved file ownership.
- Do not reinterpret MITC4 mathematics, I/O schema or tolerance.
### Reference Verification Agent
- Consume authoritative HDF5 and declared read-only CSV directly.
- Create the separate reference-verification report; only U affects pass/fail and every
UR warning remains visible.
### Physics Evaluation and Release Agents
- Physics evaluates equilibrium, directions, symmetry, energy and result signs after
reference verification.
- Release readiness remains blocked until implementation, build/test, reference and
physics gates all provide evidence.
## 12. Harness Step Draft
This approved draft is materialized under `phases/linear-static-mitc4-shell/`.
Every Step is zero-based, kebab-case and closes RED/GREEN/VERIFY before the
Executor advances it. TASK-14/TASK-15 are declared-case sub-work inside Step 13's
single test-only reference module; TASK-16 is downstream Build/Test Executor evidence,
not an Implementation Agent phase Step. During materialization, the exact required-reading
paths, configure block, focused command and full VERIFY block shown here are copied
verbatim into every `stepN.md`; a materialized Step never refers back to this draft or
to an external conversation.
Every materialized Step copies this mandatory reading inventory before its
Step-specific paths:
- `AGENTS.md`
- `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`
- `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`
- this approved implementation plan and all source contracts listed in Metadata
- `.codex/hooks.json`
- `phases/index.json`, `phases/linear-static-mitc4-shell/index.json` and its own
`phases/linear-static-mitc4-shell/stepN.md`
- every path created/modified by prerequisite Steps and their step output/status
If any mandatory or Step-specific path is missing or contradicts the approved plan,
the Implementation Agent records `blocked` for the Executor-selected current Step and
stops; it does not invent the missing contract.
Step-specific path ledger copied into the corresponding materialized Step:
| Step | exact source/prerequisite paths |
| ---: | --- |
| 0 | `include/fesa/model/model_types.hpp`; `include/fesa/model/domain.hpp`; `src/fesa/model/domain.cpp`; `tests/unit/model/model_types_test.cpp`; `tests/unit/model/domain_test.cpp` |
| 1 | Step 0 paths; `include/fesa/io/abaqus/domain_mapper.hpp`; `src/fesa/io/abaqus/domain_mapper.cpp`; `tests/unit/io/abaqus/domain_mapper_test.cpp` |
| 2 | Step 0-1 paths; candidate new `include/fesa/model/shell_geometry.hpp`; `src/fesa/model/shell_geometry.cpp`; `tests/unit/model/shell_geometry_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` |
| 3 | Step 2 paths; candidate new `include/fesa/elements/mitc4_shell.hpp`; `src/fesa/elements/mitc4_shell.cpp`; `tests/unit/elements/mitc4_shell_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` |
| 4 | Step 3 MITC4 kernel/header/test paths |
| 5 | Step 3-4 MITC4 kernel/header/test paths |
| 6 | Step 0 paths; `include/fesa/fem/dof_manager.hpp`; `src/fesa/fem/dof_manager.cpp`; `tests/unit/fem/dof_manager_test.cpp`; `tests/unit/constraints/essential_constraints_test.cpp` |
| 7 | Steps 4/6 paths; `include/fesa/assembly/sparse_assembler.hpp`; `src/fesa/assembly/sparse_assembler.cpp`; `tests/unit/assembly/sparse_assembler_test.cpp` |
| 8 | Steps 2/7 paths; `include/fesa/assembly/load_assembler.hpp`; `src/fesa/assembly/load_assembler.cpp`; `tests/unit/assembly/load_assembler_test.cpp` |
| 9 | Step 5 paths; `include/fesa/results/result_records.hpp`; `include/fesa/analysis/analysis_state.hpp`; `src/fesa/analysis/analysis_state.cpp`; `tests/unit/results/result_records_test.cpp` |
| 10 | Steps 5/9 paths; `include/fesa/results/result_recovery.hpp`; `src/fesa/results/result_recovery.cpp`; `tests/unit/results/result_recovery_test.cpp` |
| 11 | Steps 9/10 paths; `include/fesa/io/hdf5/hdf5_results_writer.hpp`; `src/fesa/io/hdf5/hdf5_results_writer.cpp`; `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` |
| 12 | Steps 7-11 paths; `include/fesa/analysis/linear_static_analysis.hpp`; `src/fesa/analysis/linear_static_analysis.cpp`; `tests/integration/analysis/linear_static_analysis_test.cpp`; `tests/integration/app/fesa_application_test.cpp` |
| 13 | Steps 11/12 paths; candidate new `tests/reference/mitc4_reference_comparison.hpp`, `tests/reference/mitc4_reference_comparison.cpp`, `tests/reference/mitc4_reference_comparison_test.cpp`, `tests/reference/mitc4_reference_cases_test.cpp`; `tests/CMakeLists.txt`; the four exact read-only reference paths in Section 2 |
The configure command copied before each Step's RED build is:
```powershell
$requiredBuildPaths = @(
"C:/git/googletest",
"C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl",
"C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb",
"C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
)
foreach ($requiredBuildPath in $requiredBuildPaths) {
if (-not (Test-Path -LiteralPath $requiredBuildPath)) {
throw "Required configured build path is absent: $requiredBuildPath"
}
}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
```
The full VERIFY block copied at the end of every Step is:
```powershell
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
### Step 0 — `shell-semantic-model`
- Required reading: requirements 002-016/024, I/O Sections 3/5, architecture model
ownership, current `model_types.hpp`/`domain.*` and their tests.
- Prerequisite: approved plan only; no production dependency on a prior Step.
- RED: add MODEL-001/002 tests and CMake registration if needed; run:
`cmake --build .harness/build --config Debug --target fesa_unit_tests` then
`ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure`.
Record the missing shell type/accessor failure. Unexpected pass is a stop.
- GREEN: minimally add shell semantic records/Domain const access; no parser/kernel.
- VERIFY: rerun the focused commands and common full VERIFY.
- Prohibitions: no equation IDs, element hierarchy, mixed-model execution, parser edits.
### Step 1 — `shell-domain-mapping`
- Required reading: Step 0 outputs, requirements 001-010/017-023, I/O Sections 1-3/8-9,
current `domain_mapper.*` and parser/model tests.
- Prerequisite: Step 0 `completed`.
- RED: add MAP-001..004; build `fesa_unit_tests` and run
`ctest --test-dir .harness/build -C Debug -R "InpDomainMapping" --output-on-failure`.
Record valid S4/S4R rejection and exact negative diagnostic failures.
- GREEN: minimally extend semantic mapping; keep `input_reader` syntax-only.
- VERIFY: focused parser/model tests, then common full VERIFY.
- Prohibitions: no element math, no silent unsupported keyword, no reference edits.
### Step 2 — `shell-director-geometry`
- Required reading: requirements 011-016, formulation Sections 4/9/17, Numerical Review
5.2/5.5/6.1, I/O 3.3/9, completed semantic model/mapping.
- Prerequisite: Step 1 `completed`.
- RED: add GEO-001..004; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry" --output-on-failure`.
- GREEN: implement deterministic director/frame and exact geometry inventory validation.
- VERIFY: focused geometry/mapping tests, then common full VERIFY.
- Prohibitions: no calibrated angle/warp/distortion threshold; no NR-O03/O04.
### Step 3 — `mitc4-kinematics-constitutive`
- Required reading: formulation Sections 3-11/17, Numerical Review 5.1-5.6/6.1,
current math adapters and Euler kernel style.
- Prerequisite: Step 2 `completed`.
- RED: add KIN-001..005 in new `mitc4_shell_test.cpp`, register it, build unit target,
run `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive" --output-on-failure`.
- GREEN: minimally add concrete shell kernel kinematics/constitutive seams; no global
assembly or drilling.
- VERIFY: focused kernel tests, then common full VERIFY.
- Prohibitions: no public base hierarchy, no S4R branch, no nonlinear tangent code.
### Step 4 — `mitc4-stiffness-drilling`
- Required reading: formulation Sections 10-14/17, requirements 031-038/050-056,
Numerical Review 5.7/6.1-6.2, completed Step 3 kernel.
- Prerequisite: Step 3 `completed`.
- RED: add KERNEL-001..006; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling" --output-on-failure`.
- GREEN: implement K20, 20-to-24 congruence and exact fixed drilling only.
- VERIFY: focused kernel suite, then common full VERIFY.
- Prohibitions: translations in R+, coefficient sweep, recovery/result output, future nonlinear.
### Step 5 — `mitc4-physical-recovery`
- Required reading: formulation Sections 14/16, requirements 035/042-046/052/056,
I/O result component/location order, completed Step 4 kernel.
- Prerequisite: Step 4 `completed`.
- RED: add KERNEL-007 and PHYSREC-001; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery" --output-on-failure`.
- GREEN: minimally add kernel-local physical recovery and physical energy API only.
- VERIFY: focused physical recovery/drilling tests, then common full VERIFY.
- Prohibitions: no AnalysisState/global result rows, no drilling contribution or HDF5.
### Step 6 — `shell-dof-scatter`
- Required reading: requirements 005/025, architecture DofManager ownership, current
`dof_manager.*` and constraint tests, completed shell model.
- Prerequisite: Step 5 `completed`.
- RED: add DOF-001..003; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints" --output-on-failure`.
- GREEN: minimally add typed 24-entry scatter/pattern while preserving 12-entry B33.
- VERIFY: focused DOF/constraint tests, then common full VERIFY.
- Prohibitions: no equation IDs in model, no constraint/load ownership move.
### Step 7 — `shell-sparse-assembly`
- Required reading: requirements 027/030/037, architecture deterministic COO rule,
current `sparse_assembler.cpp`/`sparse_matrix.cpp` tests, completed kernel/scatter.
- Prerequisite: Step 6 `completed`.
- RED: add ASM-001..003; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "SparseAssembly" --output-on-failure`.
- GREEN: minimally dispatch shell and emit stable 576-entry local buffers.
- VERIFY: focused assembly tests, then common full VERIFY.
- Prohibitions: no worker global CSR mutation, unordered reduction or S4R integration branch.
### Step 8 — `shell-load-validation`
- Required reading: requirements 017-020/028, formulation 8/13, I/O 4.2-4.3,
current `load_assembler.*` and constraint lifecycle.
- Prerequisite: Step 7 `completed`.
- RED: add LOAD-001..004; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints" --output-on-failure`.
- GREEN: minimally add aggregate nodal moment/director validation and reuse full DOF load.
- VERIFY: focused load/constraint tests, then common full VERIFY.
- Prohibitions: no distributed/equivalent/follower load; no drill load channel.
### Step 9 — `shell-analysis-state`
- Required reading: requirements 026/041-046/048, I/O 6.3-6.5,
current `analysis_state.*`/`result_records.hpp` and completed physical recovery types.
- Prerequisite: Step 8 `completed`.
- RED: add STATE-001..003; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "AnalysisState" --output-on-failure`.
- GREEN: minimally add candidate-owned shell row/global evidence containers and
validation/commit mechanics.
- VERIFY: focused AnalysisState tests, then common full VERIFY.
- Prohibitions: no element calculation, ResultRecovery orchestration or HDF5 writing.
### Step 10 — `shell-result-recovery`
- Required reading: requirements 029/035/041-046/048, formulation 14/16, I/O 6.3-6.5,
current `result_recovery.*` and completed Steps 5/9.
- Prerequisite: Step 9 `completed`.
- RED: add REC-001..005; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "ResultRecovery" --output-on-failure`.
- GREEN: minimally orchestrate full-residual evidence and physical shell recovery into
a fully validated candidate, then commit it.
- VERIFY: focused recovery tests, then common full VERIFY.
- Prohibitions: no new result record type, location averaging, drill recovery or writer edit.
### Step 11 — `shell-hdf5-output`
- Required reading: requirements 039-048, I/O Section 6 exact schema, ADR atomic output,
current HDF5 writer/self-check tests, completed recovery records.
- Prerequisite: Step 10 `completed`.
- RED: add H5-001..004; build unit target and run
`ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter" --output-on-failure`.
- GREEN: add exact additive shell schema behind unchanged ResultsWriter boundary.
- VERIFY: focused HDF5 tests, then common full VERIFY.
- Prohibitions: no B33 schema reinterpretation, CSV solver output, partial final file.
### Step 12 — `shell-linear-static-flow`
- Required reading: requirements 024-030, architecture eight-hook lifecycle, I/O CLI
contract, current `linear_static_analysis.*`/application integration tests.
- Prerequisite: Step 11 `completed`.
- RED: add FLOW-001..004; build integration target and run
`ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure`.
- GREEN: minimally route shell through existing lifecycle; preserve one factorization.
- VERIFY: focused integration tests, then common full VERIFY.
- Prohibitions: no analysis lifecycle reorder, no 0x0 singular conversion, no early state commit.
### Step 13 — `shell-reference-comparison`
- Required reading: requirements 058-072, I/O Section 7, Reference Model contract,
both declared S4/S4R paths and hashes, and current B33 comparator only as reusable
identity/report precedent.
- Scope ownership: this one test-only reference module owns TASK-13 comparator behavior
plus TASK-14/TASK-15 declared-case tests; it owns no solver production module.
- Prerequisite: Step 12 `completed` and valid MITC4 HDF5 fixture.
- RED: add REF-001..006 plus E2E-S4-001/002 and E2E-S4R-001/002 before the comparator
implementation; build the reference target and run
`ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure`.
Record the missing comparator/declared-case failure.
- GREEN: minimally add test-only comparator for exact shell CSV/HDF5 contract.
- If a declared case exposes a production defect outside this reference-test module,
stop the Step and route a focused correction to the owning prior module; do not patch
unrelated production layers inside this Step.
- VERIFY: focused comparator and both declared-case tests, then common full VERIFY.
- Prohibitions: no reference artifact writes/Abaqus run, no metadata/README gate, no UR blocking.
After explicit approval, planning may create only:
- `phases/index.json` with task status `pending` and no creation timestamp;
- `phases/linear-static-mitc4-shell/index.json` with Steps 0-13 initially `pending` and
no executor-owned timestamps;
- `phases/linear-static-mitc4-shell/stepN.md` containing the approved self-contained
directions.
Approval does not authorize `python scripts/execute.py linear-static-mitc4-shell` or
`--push`.
## 13. Open Issues
| id | item | blocking now | resolution owner |
| --- | --- | --- | --- |
| OI-001 | Section 12 multi-Step Harness draft was explicitly approved on 2026-08-12 and materialized. | resolved | user |
| OI-002 | Candidate shell semantic representation and exact C++ value/reference types are not public API decisions. | no | owning RED test in Steps 0/3 |
| OI-003 | Per-test MITC4 CTest label can be added without relabeling B33 tests인지 확인한다. Exact suite regex remains sufficient. | no | Step 0 and downstream TASK-14 CMake verification |
No mathematical, I/O, reference-inventory or tolerance decision remains open for
implementation planning. The user separately authorized implementation and Harness
execution on 2026-08-12; the Executor still owns branch, Step selection, timestamps,
commits and advancement.
@@ -1,6 +1,6 @@
# Linear Static MITC4 Shell Numerical Review
## Metadata
## 1. Metadata
- feature_id: `linear-static-mitc4-shell`
- source_formulation: `docs/formulations/mitc4-shell-formulation.md`
@@ -8,339 +8,357 @@
- source_research: `docs/research/linear-static-mitc4-shell-research.md`
- source_io_definition: `docs/io-definitions/linear-static-mitc4-shell-io.md`
- source_reference_inventory: `docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- repository_policy: `AGENTS.md`, `docs/ADR.md`, `docs/ARCHITECTURE.md`,
`docs/SOLVER_AGENT_DESIGN.md`
- reviewed_revisions: `73df844`, `22a3238`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`,
`docs/numerical-reviews/README.md`
- reviewed_head: `a058ef7`
- prior_pass_commit: `60b42f4` (`context-only; verdict not inherited`)
- status: `pass-for-implementation-planning`
- owner_agent: `numerical-review-agent`
- date: `2026-08-12`
- implementation_planning_authorized: `true`
- implementation_complete: `false`
- build_test_complete: `false`
- reference_comparison_complete: `false`
- physics_evaluation_complete: `false`
- release_ready: `false`
## Review Verdict
이번 재검토는 현재 HEAD의 요구조건, 연구, 정식화, I/O 및 reference-case 계약을
처음부터 상호 대조했다. 기존 review의 판정과 artifact 관찰 결과는 결론의 전제로
사용하지 않았고, 이전 finding은 현 문서의 수식으로 다시 검산한 뒤 disposition만
기록했다. 원 MITC4 local paper는 tying 위치와 covariant shear 보간을 확인하는 데
read-only로 사용했다.
이 단계에서는 Abaqus, Harness, C++ build/test, FESA 실행 및 reference comparison을
수행하지 않았다. Reference artifact를 생성, 수정, 복원 또는 정규화하지 않았다.
## 2. Review Verdict
- verdict: `pass-for-implementation-planning`
- reason: The current linear-static formulation closes the physical 20-DOF MITC4
kernel, its global 24-DOF embedding, fixed drilling regularization, Jacobian and
quadrature rules, residual/stiffness equations, recovery signs, and verification
invariants without a mathematical inconsistency in the approved feature scope.
- critical_blockers: `none`
- remaining_formulation_revisions: `none for the current linear-static scope`
- downstream_boundary: Implementation Planning may begin. This verdict does not
claim implementation, build/test, reference-comparison, physics-sanity, or release
completion.
- confirmed_defects: `none in the approved current linear-static scope`
- open_blocking_questions: `none`
- reason: 현재 정식화는 24 global DOF와 20 physical DOF의 관계, MITC4 shear
tying, plane-stress section law, 공통 `2 x 2 x 2` quadrature, residual/stiffness,
고정 drilling 안정화, 물리 recovery 및 검증 불변식을 구현계획으로 옮길 수 있을
만큼 명시한다. 요구조건, I/O 및 reference 계약과 모순되는 차원, 부호, 위치 또는
pass/fail 의미도 발견되지 않았다.
- downstream_boundary: 이 판정은 Implementation Planning 진입만 허용한다. 구현,
MSVC build/CTest, reference comparison, physics sanity 또는 release를 승인하지 않는다.
The future geometrically nonlinear material in Formulation Section 15 remains
explicitly non-executable. Its unresolved global finite-rotation map and objective
drilling potential do not block the current linear-static implementation plan.
정식화 Section 15의 geometrically nonlinear residual/tangent는 future-only다. 완전한
`Phi: R24 -> R20`, map Hessian, objective drilling potential 및 finite-rotation load work가
미정인 사실은 미래 nonlinear 구현을 막지만 현재 linear-static 판정은 막지 않는다.
## Critical Findings
## 3. Critical Findings
No confirmed mathematical defect remains in the approved linear-static formulation.
The previous review's `needs-reference-model` verdict is not a valid current
formulation verdict: the current numerical-review gate is based on numerical and
formulation consistency, while downstream artifact administration and comparison
execution are separate gates.
### 3.1 Confirmed defects
### 1. Previous finding disposition
현재 승인된 선형 정적 범위에서 구현계획 전에 Formulation 또는 Research로 돌려보낼
confirmed mathematical defect는 없다.
| previous item | current disposition | evidence and strict consequence |
`K20`의 exact-arithmetic 대칭/positive-semidefinite 구조와 20-to-24 congruence
일관된다. 다만 실제 구현의 rank, rigid action, patch field와 reference error는 문서
검토만으로 통과했다고 볼 수 없으며 Section 6의 downstream test evidence가 필요하다.
### 3.2 Previous finding disposition
| previous item | rerun disposition | current independent basis |
| --- | --- | --- |
| `NR-C01` Jacobian/geometry inventory | resolved | Formulation Sections 9.2-9.3 enumerate center, stiffness, tying, and recovery locations and require finite bases, nonzero area, and `J>0`; Requirements 014/016 intentionally define no calibrated smooth-angle, distortion, or warp threshold. |
| `NR-C02` drilling normalization | resolved | Formulation Section 12.2 and Requirements 033-036 now define one exact dimensional rule using only positive physical tangent-rotation diagonals. No calibration decision remains. |
| `NR-C03` mixed-DOF algebraic scaling | resolved | Formulation Sections 12.3 and 12.5 define physical length scaling separately from the physical/drilling stiffness split and provide normalized rank, symmetry, and rigid-action evidence. |
| `NR-C04` 20/24-DOF weak-form mismatch | resolved | Formulation Sections 5.2-5.3 and 7.1-7.2 place physical, drilling, and external work in the common global 24-DOF test space using the required transpose maps. |
| `NR-C05` nonlinear global tangent closure | resolved for current scope | Formulation Section 15 now labels the nonlinear equations non-executable and identifies the missing nonlinear `Phi` map, map Hessian, and objective drilling potential. Those items block only a future nonlinear feature. |
| `NR-D01` drilling-direction nodal moment | retained/resolved | The exact-zero branch and `rho_M=|d dot M|/||M|| <= 1e-12` rule are consistent in Formulation Section 6.2 and I/O Section 4.3. |
| `NR-D02` normalized algebraic checks | retained/resolved | Formulation Section 17.1 defines scale-aware symmetry, rigid-action, frame, transformation-energy, residual, and equilibrium checks without a denominator clamp. |
| `NR-O01` drilling coefficient/plateau | resolved by approved fixed rule | `k_d=10^-3 min(R+)` replaces the former coefficient-family/sweep question. A sweep, plateau, response sensitivity, or condition-number calibration is not an acceptance gate. |
| `NR-O02` drilling-energy warning | removed from approved scope | Drilling is an internal numerical potential only. No drilling-energy ratio, warning threshold, or drilling-specific output is required. |
| `NR-O03` smooth-director angle | removed from approved scope | Requirements 014/054 and Formulation Sections 4.2 and 9.3 use exact orientation/finite/nonzero predicates and explicitly remove `NR-O03`. It is not an open numerical decision. |
| `NR-O04` distortion/warp calibration | removed from approved scope | Requirements 016/054 and Formulation Sections 9.2-9.3 require exact finite/positive validity checks and explicitly remove `NR-O04`. It is not an open numerical decision. |
| `NR-O05` U/UR tolerance | resolved | Requirements 058-062, Formulation Section 17.5, I/O Section 7.6, and Reference Case Section 5 all use the exact approved B33 component-scale formula. |
| `NR-C01` Jacobian/geometry inventory | `resolved` | Formulation 9.2-9.3은 center, eight stiffness points, four tying points 및 committed recovery points를 공통 fail-closed inventory로 두고 finite bases, nonzero surface measure와 `J>0`를 요구한다. 승인 범위는 calibrated distortion/warp cutoff를 요구하지 않는다. |
| `NR-C02` drilling normalization | `resolved` | Formulation 12.2는 `R+`를 오직 8 physical tangent-rotation diagonals의 finite positive 값으로 제한하므로 모든 후보의 단위가 `force*length`로 같다. |
| `NR-C03` mixed-DOF spectrum scaling | `resolved` | Formulation 12.5의 `(L_e I3,I2)``(L_e I3,I3)` congruence는 rank/condition evidence에서 translation/rotation 단위 혼합을 제거한다. Raw mixed-unit spectrum은 금지된다. |
| `NR-C04` 20/24 weak-form mismatch | `resolved` | Formulation 5.2-5.3 7.1-7.2 physical, drilling, external work를 모두 `V24`에서 `T_p^T``T_d^T`로 결합한다. |
| `NR-C05` nonlinear 20-to-24 closure | `resolved for current scope` | Section 15는 physical chart tangent와 conditional global pullback을 분리하고 map-curvature 항을 보존하며, 미정인 global map/objective drill을 future-only blocker로 명시한다. |
| `NR-D01` drilling-direction moment | `retained and consistent` | Exact-zero moment는 별도 처리하고 nonzero moment에 `rho_M=abs(d dot M)/norm(M)<=1e-12`를 적용한다. Numerical drilling은 거부된 moment를 운반하지 않는다. |
| `NR-D02` normalized algebraic checks | `retained and consistent` | `1e-12` symmetry/frame/energy와 `1e-10` rigid/residual/equilibrium 기준은 scaled matrices와 unclamped denominators에 적용된다. |
| `NR-O01` coefficient sweep/plateau | `closed by product decision` | `k_d=1e-3 min(R+)`가 고정 계약이다. Sweep, plateau 및 coefficient optimality는 구현 gate가 아니다. |
| `NR-O02` drilling-energy ratio | `removed from scope` | Drilling energy는 내부 quadratic identity일 뿐 physical energy나 mandatory output이 아니며 ratio/warning threshold도 요구하지 않는다. |
| `NR-O03` smooth-director calibration | `removed from scope` | Pairwise positive incident-normal orientation, finite/nonzero averaging 및 duplicate-node fold modeling이 승인된 exact predicate다. 별도 angle calibration은 gate가 아니다. |
| `NR-O04` distortion/warp calibration | `removed from scope` | Basic topology, finite/nonzero surface measure 및 required-point `J>0`가 승인된 predicate다. Quality sweep이나 cutoff는 gate가 아니다. |
| `NR-O05` U/UR tolerance | `resolved` | 모든 관련 문서가 `1e-9+1e-6*reference_scale_c`, U blocking, UR warning-only를 동일하게 정의한다. |
### 2. Required policy classifications
이전의 `needs-reference-model` 판정에 포함됐던 canonical naming, README,
`metadata.json`, provenance, expanded portfolio 및 아직 없는 comparison result는 현재
프로젝트 정책상 formulation verdict의 blocker가 아니다. 현 Reference Model 문서는
정확한 기존 input/displacement path와 row/tolerance 계약을 제공한다.
#### 2.1 Fixed drilling rule — resolved and implementation-ready
### 3.3 Open questions
Let `R+` contain only the finite, strictly positive diagonal entries of the physical
local stiffness `K20` associated with the eight director-tangent rotational DOFs.
The formulation fixes
- current_linear_scope: `none blocking`
- future_geometric_nonlinearity: finite global rotation coordinate, `Phi`와 그 1/2차
미분, chart recentering, objective drilling, nodal-moment work 및 nonlinear output/state
계약이 미정이다. 이는 별도 future formulation/review가 소유한다.
- optional_characterization: near-singular positive-J geometry의 conditioning과 original
MITC4의 distorted-curved membrane locking을 더 넓게 정량화할 수 있으나 현재 승인된
planning/completion gate는 아니다.
- downstream_results: implementation rank/patch evidence와 S4/S4R comparison 결과는
아직 없으며 해당 후속 Agent가 판정한다. 부재 자체는 pre-implementation review의
결함이 아니다.
```text
k_ref = min(R+)
k_d = 1e-3 * k_ref
K_drill_local = k_d * I4
K_drill_24 = T_d^T * K_drill_local * T_d
```
## 4. Numerical Risk Assessment
All entries in `R+` have rotational-stiffness dimension `force*length`; translations,
off-diagonals, nonpositive values, and nonfinite values are excluded. Therefore
`k_d` has the correct dimension, `K_drill_24` is symmetric positive on the four pure
drilling coordinates, and the physical and drilling channels are algebraically
separate. An empty `R+` is a deterministic numerical-validation failure. This is a
complete algorithm contract, not a calibration placeholder.
The deterministic nodal frames fix the local-coordinate representation, and
Formulation Section 5.3 supplies the virtual-work/energy congruence used by the
coordinate-transformation check. No unselected drilling coefficient or family
remains for Implementation Planning.
#### 2.2 No drilling outputs — resolved and consistent
Formulation Sections 7.2, 12.3, 12.5, 14, and 17.4 keep drilling out of physical
strain, resultant, stress, and reported physical shell energy. The internal identity
`E_drill = 0.5 gamma^T K_drill_local gamma` is permissible verification algebra; it
does not create an external result quantity. Requirements 035/036/046 and I/O
Sections 6.1/6.4/6.5 consistently require no drilling coefficient, stiffness, ratio,
or energy dataset. There is no output-contract defect.
#### 2.3 Exact B33 U/UR tolerance — resolved
For each case and component `c`, using only finite Abaqus rows,
```text
reference_scale_c = max(abs(reference_value_i))
tolerance_c = 1e-9 + 1e-6 * reference_scale_c
```
The `1e-9` floor is in the model's user-consistent length unit for `U1/U2/U3` and is
dimensionless for `UR1/UR2/UR3`. No row is zero-clamped and no row-specific relative
denominator replaces the component scale. `U1/U2/U3` exceedance is blocking at the
later Reference Verification gate; `UR1/UR2/UR3` uses the same formula but is
warning-only. The formula is exact and needs no MITC4-specific calibration.
#### 2.4 Removed and administrative items — nonblocking
`NR-O03`, `NR-O04`, drilling sweeps, drilling-energy criteria, and expanded flat,
thin/thick, distorted, warped, curved-shell, or mesh-convergence portfolios are not
part of the approved implementation-planning gate. They may remain future research
or release evidence but shall not be reintroduced as missing numerical evidence.
Canonical reference naming, a bundle README, `metadata.json`, provenance, an Abaqus
version, duplicated units/coordinates/model/step/frame descriptions, or a schema
version are administrative information and cannot block this formulation verdict.
The absence of optional `metadata.json` is therefore not a defect. If such a file is
added later, it remains read-only context and cannot override the approved exact
paths, row mapping, or tolerance.
## Numerical Risk Assessment
| risk | current assessment | required in-scope control |
| risk label | assessment | required in-scope control |
| --- | --- | --- |
| Transverse-shear locking | controlled for the original MITC4 scope, not claimed eliminated for every mesh | Use the exact edge-midpoint covariant shear projection of Sections 10.2-10.4 and pass transverse-shear patch/reference checks. |
| Curved/distorted-mesh membrane locking | known limitation of the original MITC4 family | Preserve the documented limitation. An expanded convergence portfolio is nonblocking and does not authorize MITC4+. |
| Volumetric locking | not applicable to the approved plane-stress shell contract | Do not reinterpret `C5` as a full 3D nearly incompressible material law. |
| Hourglass modes | no reduced-integration/hourglass path is approved | Both source `S4` and `S4R` use the same full `2x2x2` FESA integration and MITC tying path. |
| Degenerate, inverted, or self-intersecting geometry | fail-closed contract is present | Enforce distinct connectivity, non-self-intersection, finite nonzero surface measure, finite reciprocal bases, and `J>0` at every required location. |
| Near-singular but still positive geometry | conditioning may degrade because no calibrated quality threshold is in scope | Preserve finite checks and deterministic solver failure diagnostics; do not invent `NR-O04` thresholds. |
| Opposed or invalid nodal directors | would corrupt frames, signs, and tying | Reject nonfinite/zero candidates, nonpositive incident-normal agreement, and nonfinite/zero averages; use duplicate source nodes for folds. |
| Drilling singularity | four nonphysical modes would remain without regularization | Apply the exact fixed `R+` rule and verify stabilized nullity six. |
| Drilling contamination of physics | possible if drill enters the physical operator or recovery | Keep `T_p` and `T_d` separate and verify pure drill has zero physical strain/resultant/stress and no physical energy contribution. |
| Rigid-mode test contamination | a full spatial rotation vector can contain director-parallel rotation | Construct physical rigid rotation with `u_I=omega x X_I`, `delta d_I=omega x d_I`, and `gamma_I=0` as specified in Section 8.3. |
| Wrong shear component/factor | would cause patch failure or incorrect shear energy | Keep the `xi-zeta`/`eta-zeta` tying pairs and engineering factor `gamma_ij=2 epsilon_ij` explicit. |
| Recovery sign/location drift | could hide a correct stiffness behind wrong outputs | Reuse stiffness frames, tying, material, and thickness quadrature; preserve four Gauss identities and bottom/middle/top positions without averaging. |
| Future nonlinear misuse | current Section 15 does not define a complete global nonlinear element | Keep it non-executable until a separate approved nonlinear formulation closes `Phi`, map curvature, objective drill, load work, and state. |
| `rigid_body_modes` | Physical `K20`은 six rigid modes와 expected rank 14를 가져야 한다. 24-DOF embedding은 네 drill null coordinates를 더하고 fixed drill block 뒤 expected rank 18/nullity 6이다. | 세 translation과 세 rotation을 명시적으로 구성한다. Rotation mode는 `u_I=omega x X_I`, `theta_I=omega-(omega dot d_I)d_I`, `gamma_I=0`를 사용한다. |
| `patch_test` | Bilinear membrane/bending field와 MITC tied shear는 required patch states를 표현할 계약을 갖는다. | `E11/E22/G12`, `K11/K22/K12`, `G13/G23`를 독립 시험하고 signs/component order/resultants/stress를 함께 확인한다. |
| `symmetry` | `B^T C B`, `T_p^T K20 T_p`, `T_d^T(k_d I)T_d`는 exact arithmetic에서 symmetric이다. | Scaled Frobenius check `<=1e-12`; deterministic assembly가 대칭을 깨지 않는지 확인한다. |
| `positive_definiteness` | Free element는 six-mode semidefinite이고, 충분히 구속된 nonsingular `Kff`는 positive definite가 기대된다. Geometry 또는 supports가 부적절하면 singularity가 정당하다. | Scaled spectrum/rank, non-rigid positive physical energy, constrained solve 및 singular negative cases를 분리한다. |
| `hourglass` | `1 x 1` reduced integration을 쓰지 않으므로 Abaqus-style hourglass path는 `N/A`다. | Full `2 x 2` midsurface rank test는 유지한다. S4R source label로 reduced rule을 선택하지 않는다. |
| `shear_locking` | Edge-midpoint MITC projection이 transverse-shear locking을 다루지만 모든 mesh/thickness에서 완전 제거를 주장할 수 없다. | Required shear/bending patch와 declared references를 통과한다. Broader thin/thick convergence는 nonblocking characterization이다. |
| `membrane_locking` | Original MITC4는 membrane strain을 수정하지 않아 distorted curved meshes에서 알려진 locking 위험이 남는다. | Known limitation을 유지하고 MITC4+ 성능을 주장하지 않는다. Expanded curved/distorted portfolio는 optional이다. |
| `volumetric_locking` | 승인된 homogeneous plane-stress shell에는 `N/A`다. | `C5`를 3D nearly-incompressible law로 확장하지 않는다. |
| `distortion` | 양의 `J`를 유지하는 심한 distortion/warpage는 정확도와 rank/conditioning을 악화할 수 있다. | 모든 required location의 exact predicates와 rank/finite-result checks를 시행한다. 승인되지 않은 quality cutoff를 추가하지 않는다. |
| `singular_jacobian` | Nonfinite/nonpositive `J`, zero surface measure, invalid reciprocal basis는 mapping을 무효화한다. | Center, stiffness, tying 및 recovery inventory 전체를 omission/clamp 없이 fail closed한다. |
| `conditioning` | Thin shells, near-degenerate positive-J geometry 및 작은 fixed drill scale에서 `Kff` conditioning이 나빠질 수 있다. | Spectrum/condition evidence는 오직 length-scaled matrix를 사용한다. Threshold calibration은 gate가 아니지만 factorization failure는 결정적으로 진단한다. |
| `convergence` | Current solve는 direct linear solve라 Newton convergence는 `N/A`; spatial convergence와 locking trend는 모델 의존이다. | Free residual/global equilibrium `<=1e-10`과 declared reference cases를 확인한다. Broader mesh sequences는 optional이다. |
| `drilling_contamination` | Numerical drill이 physical strain/recovery에 들어가면 비물리 결과가 생긴다. | `T_p`/`T_d`를 분리하고 pure drill에서 physical strain/resultant/stress/energy가 zero임을 시험한다. Full residual은 의도대로 stabilized system 전체를 포함한다. |
| `future_nonlinear_misuse` | Section 15만으로 global nonlinear element를 만들면 nonobjective drill 또는 inconsistent tangent가 된다. | Current plan에서 완전히 제외하고 별도 승인 전 실행하지 않는다. |
## Consistency Checks
## 5. Consistency Checks
### 1. DOF order, director sign, and coordinate transforms — pass
### 5.1 Units, dimensions, DOF order, and constrained/free system`pass`
- Global order is exactly `[UX,UY,UZ,URX,URY,URZ]` per node.
- `R_I=[a_I b_I d_I]` is right-handed and orthonormal, with
`[alpha,beta,gamma]^T=R_I^T theta_I^g`.
- The director variation `delta d_I=beta_I a_I-alpha_I b_I` has the correct sign for
`theta_I x d_I`.
- `T_p` is `20x24`; `T_d` is `4x24`. The physical operator receives only `q20`, and
the drilling potential receives only `gamma`.
- The transpose maps in Formulation Sections 5.3 and 7.2 preserve virtual work and
energy in the common 24-DOF space.
- Per-node global order is exactly `[UX,UY,UZ,URX,URY,URZ]`; element order is 24
global coordinates and 20 physical coordinates
`[uX,uY,uZ,alpha,beta]` per node plus four separately selected `gamma` coordinates.
- `T_p` is `20 x 24`, `T_d` is `4 x 24`, `K20` is `20 x 20`, and both global
stiffness contributions are `24 x 24`.
- Translation-translation, translation-rotation, and rotation-rotation stiffness
blocks have units `force/length`, `force`, and `force*length`; `R+` therefore
excludes every translational diagonal.
- The constrained/free equation is `Kff*df=Ff-Kfc*dc`. Stiffness partition and
factorization precede load assembly, and an all-constrained valid `0 x 0 Kff` is
not reclassified as singular.
- `r=K*d-F` fixes the internal-minus-external sign. Constrained entries are the
required reaction rows and free entries remain residual evidence.
### 2. Shape functions, geometry, and B operator — pass
### 5.2 Local/global transforms, congruence, and energy`pass`
- The bilinear shape functions satisfy partition of unity, nodal interpolation, and
derivative-sum identities.
- The degenerated geometry uses a dimensionless unit director and separate thickness
factor `t*zeta/2`, avoiding thickness double-counting.
- The direct covariant strain column is the symmetric gradient written in covariant
bases. The two transverse covariant shear components alone are replaced by the
canonical MITC4 edge-midpoint interpolation.
- Reconstructing with reciprocal bases before local projection preserves the tensor
meaning. Engineering shear factors are applied once in the local five-component
vector.
- The same projected `B_bar` is used in strain, residual, stiffness, and recovery;
no direct/tied shear mismatch remains.
- `(a_I,b_I,d_I)` and `(e1,e2,e3)` are deterministic right-handed orthonormal frames.
The least-aligned-axis nodal rule avoids a fixed-axis parallel singularity.
- `[alpha,beta,gamma]^T=R_I^T theta_I^g` gives
`delta d=beta*a-alpha*b=theta x d` with the required sign.
- `q20=T_p qg` and `gamma=T_d qg` preserve virtual work. Congruence gives
`Kphys24=T_p^T K20 T_p` and `Kdrill24=T_d^T(k_d I4)T_d`; the corresponding local and
global quadratic energies are identical.
- A physical rigid rotation uses only the tangent projection of `omega`, so `gamma=0`
and drilling does not destroy the six physical rigid modes.
### 3. Constitutive matrix and dimensional consistency — pass
### 5.3 Kinematic operators and MITC tying`pass`
- For finite `E>0` and `-1<nu<0.5`, the plane-stress block and
`kappa_s G I2`, with `kappa_s=5/6`, are symmetric positive definite.
- `B_bar^T C5 B_bar J dxi deta dzeta` has stiffness-consistent dimensions because
the geometry Jacobian contains the through-thickness scale.
- Membrane/shear strain is dimensionless, curvature is `1/length`, `N/Q` is
`force/length`, `M` is `force`, stress is `force/length^2`, and physical energy is
- Bilinear `N_I` satisfies partition, Kronecker and derivative-sum identities.
- Membrane and bending content comes from the direct covariant small-strain operator.
Only `epsilon_xi-zeta` and `epsilon_eta-zeta` are replaced.
- `epsilon_xi-zeta` is tied at `(0,-1,0)` and `(0,+1,0)` and interpolated in `eta`;
`epsilon_eta-zeta` is tied at `(-1,0,0)` and `(+1,0,0)` and interpolated in `xi`.
Each interpolation reproduces its own edge value and is constant along the edge
direction, matching the original MITC4 construction.
- The assumed covariant tensor is reconstructed through reciprocal bases, projected
into the stored local Cartesian frame, and converted once to engineering shear
`gamma_ij=2 epsilon_ij`. The same projected `B_bar` drives strain, internal force,
stiffness and recovery.
### 5.4 Constitutive and section matrices — `pass`
- `Cps=E/(1-nu^2)[[1,nu,0],[nu,1,0],[0,0,(1-nu)/2]]` uses engineering `G12`; its
shear coefficient is exactly `G=E/[2(1+nu)]`.
- `C5=diag(Cps,(5/6)G I2)` is symmetric positive definite for `E>0` and
`-1<nu<0.5`. `sigma33=0` and absent thickness stretch remain assumptions.
- `A=t Cps`, `B=0`, `D=t^3 Cps/12`, and `As=(5/6)Gt I2` have consistent dimensions.
Membrane/shear strains are dimensionless, curvature is `1/length`, `N/Q` is
`force/length`, `M` is `force`, stress is `force/length^2`, and energy is
`force*length`.
- The drilling reference uses rotational stiffness only, so no translation/rotation
unit mixing occurs.
### 4. Integration, residual, stiffness, and modes — pass
### 5.5 Jacobian, derivative transform, and integration`pass`
- Stiffness uses deterministic two-point Gauss quadrature in each of `xi`, `eta`, and
`zeta`, with points `+-1/sqrt(3)` and unit weights.
- Both source types select this one rule; FESA does not emulate Abaqus S4/S4R internal
integration or hourglass behavior.
- `K20 = integral(B_bar^T C5 B_bar dV)` is symmetric positive semidefinite. The
expected physical rank is 14: 20 physical coordinates minus six rigid modes.
- `Kphys24=T_p^T K20 T_p` adds four drilling null coordinates. The fixed positive
drilling block removes those four, leaving exactly six physical rigid modes.
- `f_int=K_e q_g` and `r=K d-F` use a consistent linear sign. Partitioning uses
`Kff df=Ff-Kfc dc`, including the valid `0x0 Kff` all-constrained case.
- The three-dimensional degenerated mapping uses
`X=sum(N X_I)+(t*zeta/2)sum(N d_I)` with a unit nodal director and separate
thickness, preventing nodal thickness double counting.
- `J=det[G_xi,G_eta,G_zeta]` and finite covariant/reciprocal bases are checked at all
eight stiffness points, all four midsurface tying points, center, and every
committed bottom/middle/top recovery evaluation. Failed points are not skipped,
averaged, clamped or repaired.
- Direct natural derivatives are converted covariantly and then to the local
Cartesian tensor through contravariant bases; no flat-element derivative shortcut
is substituted for curved/warped accepted geometry.
- Both S4 and S4R use the common in-plane `2 x 2` points
`+-1/sqrt(3)` with unit weights and two identical thickness points, for eight
volume evaluations. Tied shear is evaluated at `zeta=0` and reused at both
thickness points while the remaining mapping and direct components use the actual
thickness point.
### 5. Recovery and external result meaning — pass
### 5.6 Internal force, residual, stiffness, and future tangent`pass`
- Nodal reactions are constrained entries of the assembled full residual; free
entries remain equilibrium evidence.
- Generalized strains are thickness moments with order
`[E11,E22,G12,K11,K22,K12,G13,G23]`.
- Resultants use `[N11,N22,N12,M11,M22,M12,Q13,Q23]` and the stated centered-layer
`A/D/A_s` cross-check.
- Bottom/middle/top `[S11,S22,S12]` are direct section-position evaluations. `S33=0`
is documented but not emitted, and `S13/S23` point stress is outside the output
contract.
- Physical shell energy excludes numerical drilling stabilization, matching the I/O
schema.
- Current `K20=integral(B_bar^T C5 B_bar dV)` and `f_int20=K20 q20` are mutually
consistent and symmetric positive semidefinite in exact arithmetic.
- The complete current weak form is in `V24` and adds the numerical drilling
gradient before subtracting the global nodal `CLOAD` vector.
- No geometric stiffness or nonlinear state enters the current product path.
Future Section 15 correctly separates `Kmat` and the stress-dependent `Kgeo` and,
conditionally on a future `Phi`, includes both `A^T K20 A` and the
residual-weighted map-Hessian term.
### 6. Architecture and deterministic lifecycle — pass for planning
### 5.7 Fixed drilling contract`pass`
The formulation and I/O handoff match ADR-007/008/009/016/017 and the architecture:
stable element-local computation, deterministic COO/reduction, stiffness assembly
and partition before load assembly, factorization before substitution, full residual
recovery, stable row identity, and failure-atomic HDF5 commit. These are planning and
later implementation-test obligations, not unresolved equations.
- `R+` contains only finite strictly positive diagonals of the eight physical
tangent-rotation coordinates. `k_ref=min(R+)`, `k_d=1e-3 k_ref`, and
`Kd_local=k_d I4` are dimensionally consistent and deterministic; empty `R+`
fails validation.
- `T_d^T(k_d I4)T_d` is symmetric and positive on the four pure drilling
coordinates. It must remove those four nonphysical null modes without changing
the physical rank/null modes.
- Drilling is excluded from generalized strain/resultant/stress and reported
physical strain energy. A director-parallel applied nodal moment is rejected as
`unsupported-drilling-load`; no numerical drill load channel exists.
## Verification Readiness
### 5.8 Recovery, signs, locations, units, and external comparison — `pass`
### Required element and algebraic tests
- Nodal `[U1,U2,U3,UR1,UR2,UR3]` and full-residual
`[RF1,RF2,RF3,RM1,RM2,RM3]` are global and source-node ordered.
- Four midsurface Gauss rows recover
`[E11,E22,G12,K11,K22,K12,G13,G23]` and
`[N11,N22,N12,M11,M22,M12,Q13,Q23]` in the stored local frame. The definition
`e_m(z)=epsilon0+z*kappa` fixes curvature, moment, and bottom/top stress signs.
- `[S11,S22,S12]` is evaluated directly at `zeta=-1,0,+1`; `S33=0` is documented but
not emitted, and `S13/S23` point stress is not synthesized. Different natural or
section locations are never averaged.
- Reference comparison first rejects missing, extra, duplicate, nonfinite or
identity-mismatched rows. For each case/component,
`reference_scale_c=max(abs(finite Abaqus values))` and
`tolerance_c=1e-9+1e-6*reference_scale_c`; no zero clamp or row denominator is
introduced. U1/U2/U3 is blocking and UR1/UR2/UR3 is warning-only.
- Source S4 and S4R select the same FESA MITC4 kernel/quadrature/recovery path while
preserving source type. This is an input mapping, not an Abaqus formulation,
integration, stabilization or recovery equivalence claim.
Implementation Planning shall trace RED/GREEN/VERIFY tests for:
## 6. Verification Readiness
1. shape-function identities and deterministic right-handed nodal/integration frames;
2. valid and invalid geometry at every center, Gauss, tying, and recovery location;
3. `T_p`/`T_d` dimensions, virtual-work equality, and transformation-energy equality;
4. direct versus tied shear component construction and engineering-shear factors;
5. constitutive symmetry/positive definiteness and exact `2x2x2` quadrature;
6. normalized symmetry at `1e-12`, rigid action at `1e-10`, physical rank 14, and
stabilized rank 18/nullity six;
7. exact `R+`, `k_ref`, `k_d`, and `K_drill_local` construction, including empty-`R+`
failure and exclusion of translational diagonals;
8. pure drilling: positive drill action, zero physical strain/resultant/stress, and
no drilling-specific output;
9. deterministic assembly/recovery ordering and thread-count repeatability;
10. partition/effective-RHS/full-residual reaction behavior, including all-constrained
`0x0 Kff` handling.
### 6.1 Downstream unit and invariant tests
For a nonzero scaled stiffness, use the formulation's normalized metrics without a
fallback denominator. Exactly zero constructed energy cases are classified by their
separate rigid/null action tests rather than clamped to pass.
Implementation Planning shall convert the following to `RED -> GREEN -> VERIFY`:
### Required patch and sign tests
1. Shape identities; nodal/integration frame orthonormality, handedness and axis
tie-break determinism.
2. `T_p`/`T_d` dimensions, orthogonal channel selection, virtual-work equality and
nonzero transformation-energy equality.
3. Hand-calculated direct membrane/bending columns, all four covariant tying values,
interpolation weights and engineering-shear factors.
4. `Cps/C5/A/D/As` coefficients, symmetry, positive definiteness, dimensions and
force/length unit-rescaling invariance.
5. Common `2 x 2 x 2` point/weight order and an independent analytical or
higher-order flat-element stiffness/recovery cross-check.
6. Required-location geometry validation: valid planar/rotated/warped cases and
duplicate, bow-tie/self-intersecting, zero-area, reversed, nonfinite,
nonpositive-J and opposed-normal negative cases.
7. Scaled symmetry `<=1e-12`, physical rigid action `<=1e-10`, expected physical
rank 14, stabilized rank 18/nullity six, and positive non-rigid physical energy.
8. Exact `R+` membership, exclusion of translations, fixed coefficient, empty-`R+`
failure, pure drill action and zero physical recovery/energy.
9. Stable COO/reduction, source/result/diagnostic order and thread-count
repeatability.
10. `Kff/Kfc` effective RHS, nonzero prescribed values, full-residual reaction,
singular-support negative case, and valid all-constrained `0 x 0 Kff` case.
11. Exact-zero and accepted/rejected `rho_M` moment projections, including proof
that rejected drilling moments never reach stabilization.
12. Mandatory HDF5 locations/components/units, physical-only energy, nonfinite
recovery failure and atomic finalization.
- constant membrane strain/stress and `N` sign;
- pure bending about both local axes, curvature/moment order, and bottom/top stress sign;
- constant transverse shear and `Q13/Q23` order;
- pure twist and `K12/M12` convention;
- zero physical recovery from a pure drilling vector.
### 6.2 Required patch and sign tests
### Declared reference readiness
- independent constant `E11`, `E22`, and `G12` membrane fields with `N` and
middle-stress signs;
- pure `K11` and `K22` bending with `M` order and bottom/top stress reversal;
- pure `K12` twist with `M12` sign;
- constant `G13` and `G23` transverse shear with `Q13/Q23` order;
- six physical rigid states and four pure drilling states;
- source-type-only S4/S4R variants producing identical FESA numeric rows and
different preserved source metadata.
The lightweight inventory identifies these read-only required pairs:
### 6.3 Reference and physics handoff readiness
- `reference/shell/shell.inp` and
`reference/shell/shell displacements.csv` for source `S4`;
- `reference/shellR/shellR.inp` and
`reference/shellR/shellR displacements.csv` for source `S4R`.
The declared read-only pairs are:
Read-only inspection confirmed that all four declared files exist, their SHA-256
values match the Reference Case inventory, and each required displacement CSV has
49 data rows. This is inventory evidence only. No FESA output exists yet in this
review, and no reference-comparison pass/fail decision was made.
- `reference/shell/shell.inp` with
`reference/shell/shell displacements.csv` for S4;
- `reference/shellR/shellR.inp` with
`reference/shellR/shellR displacements.csv` for S4R.
The later comparator must require exact normalized source-row/component sets,
finite/unique values, U blocking, UR warning-only, and the approved mixed tolerance.
The two Abaqus cases are not expected to equal one another, while identical supported
FESA models labeled S4 or S4R must take the same internal numerical path.
The Reference Model and I/O documents define deterministic HDF5-to-CSV identity,
precheck and tolerance sufficiently for later comparison. This review did not assert
that `results.h5` exists or that any row passes. Reference Verification owns numeric
U/UR outcome; Physics Evaluation owns force/moment balance, displacement direction,
symmetry, result signs, recovered-resultant consistency and physical plausibility.
### Nonblocking evidence
### 6.4 Missing evidence classification
The following cannot change this formulation verdict:
- blocking_for_current_formulation: `none`
- required_after_implementation: invariant, patch, MSVC build/CTest, declared
reference comparison and physics evidence above
- nonblocking_optional: drilling coefficient sweep/energy ratio, `NR-O03`, `NR-O04`,
canonical naming, README/metadata/provenance, expanded benchmark portfolio and
broader mesh convergence studies
- future_only: nonlinear directional-derivative/objectivity/Newton evidence after
its missing formulation decisions are separately approved
- absent README, `metadata.json`, provenance, canonical name, schema-version record,
or duplicated bundle descriptions;
- no coefficient sweep, drilling-energy ratio, smooth-angle calibration, or
distortion/warp threshold sweep;
- no expanded flat/thin/thick/distorted/warped/curved/convergence benchmark portfolio;
- no implementation result, build/test result, Abaqus run, or completed comparison
at this pre-implementation gate.
## Required Revisions
## 7. Required Revisions
### Formulation Agent
- None for the approved current linear-static implementation scope.
- Keep Formulation Section 15 non-executable until a separately approved nonlinear
feature closes its global coordinate map, consistent tangent, objective drilling,
and load-work decisions.
- Do not promote Section 15 to executable status until a separate formulation closes
the nonlinear global coordinate map, objective drilling and load-work contracts.
### Research Agent
- None before current Implementation Planning.
- Broader original-MITC4 locking and convergence studies remain optional future
characterization and must not silently widen the implementation gate.
### Reference Model Agent
- None for this formulation verdict. Preserve the four declared artifacts read-only.
- Optional administrative metadata, if later added by an authorized phase, does not
replace the approved exact paths, matching, and tolerance contract.
## Downstream Handoff
### Implementation Planning Agent
Implementation Planning is authorized. The plan shall:
- cover the deterministic director/frame preprocessing, `24 -> 20 + 4` transforms,
covariant MITC tying, full `2x2x2` integration, fixed drilling split, and recovery;
- trace every approved must-requirement to TDD tests, including the invariant, patch,
fixed-drilling, failure, schema, row-matching, and U/UR decision behaviors above;
- preserve one internal `FESA-MITC4` numerical path for source S4 and S4R while keeping
source metadata distinct;
- keep drilling out of physical recovery and HDF5 results;
- exclude future nonlinear execution, calibration sweeps, removed `NR-O03/NR-O04`,
expanded portfolios, and administrative reference requirements.
This handoff authorizes planning only. It does not authorize Harness execution,
production-code changes, reference-artifact mutation, or a claim of implementation
completion.
- Optional locking/convergence characterization must remain clearly outside the
approved implementation gate and must not imply MITC4+ or Abaqus equivalence.
### I/O Definition Agent
The current I/O contract is numerically consistent with the formulation. Planning
shall preserve its exact source identity, load projection, output units/locations,
physical-energy meaning, reference row mapping, and U/UR decision rule.
- None for the current numerical verdict. Preserve exact physical/full-residual
distinction, source identity, locations, units and U-versus-UR decision rule.
### Reference Verification and Physics Evaluation Agents
### Reference Model Agent
These remain downstream of implementation and build/test. Reference Verification
will decide U/UR comparison outcomes; Physics Evaluation will independently assess
equilibrium, signs, symmetry, and physical plausibility. Neither result is asserted
by this review.
- None for the current numerical verdict. Preserve the four declared files read-only
and do not add administrative or portfolio gates.
## Review Evidence
## 8. Downstream Handoff
This review used the repository policy/design files, the approved requirements,
research, formulation, I/O definition and reference-case inventory listed in
Metadata, plus read-only inspection of the four declared artifacts. Local FEM wiki
material cross-checked MITC4 kinematics, edge-midpoint assumed shear and known locking
risks; the approved repository documents remain the feature source of truth.
### Implementation Planning Agent
Implementation Planning is authorized and shall:
- trace the required tests in Section 6 to the approved requirement IDs before
production work;
- keep `24 global -> 20 physical + 4 drilling` transforms, covariant MITC tying,
common `2 x 2 x 2` integration, fixed drilling and physical recovery as explicit
independent test seams;
- preserve stiffness assembly/partition/factorization-before-load, stable reduction,
full-residual reaction and failure-atomic HDF5 lifecycle;
- keep future nonlinear execution, coefficient calibration, drilling output,
`NR-O03/NR-O04`, reference-artifact mutation and Abaqus-equivalence claims outside
the plan.
This handoff authorizes planning only. It does not authorize Harness execution,
production implementation, reference artifact changes, or completion claims.
### Reference Verification Agent
- Compare authoritative FESA HDF5 rows directly with the matching declared Abaqus
displacement CSV after exact row-set precheck.
- Let only U1/U2/U3 affect pass/fail; report every UR1/UR2/UR3 warning without
changing the verdict.
### Physics Evaluation Agent
- After reference verification, independently evaluate force and global moment
balance, free residual, reaction sign, displacement direction, symmetry, positive
physical energy and consistency of local resultants/stresses.
### Coordinator and Release Agents
- Record the Numerical Review gate as passed for planning at HEAD `a058ef7`.
- Do not infer implementation or release completion. Build/test, reference,
physics-sanity and release-readiness gates remain pending.
+4
View File
@@ -3,6 +3,10 @@
{
"dir": "linear-static-3d-euler-beam",
"status": "pending"
},
{
"dir": "linear-static-mitc4-shell",
"status": "pending"
}
]
}
@@ -0,0 +1,76 @@
{
"project": "FESA Structural Solver",
"phase": "linear-static-mitc4-shell",
"steps": [
{
"step": 0,
"name": "shell-semantic-model",
"status": "pending"
},
{
"step": 1,
"name": "shell-domain-mapping",
"status": "pending"
},
{
"step": 2,
"name": "shell-director-geometry",
"status": "pending"
},
{
"step": 3,
"name": "mitc4-kinematics-constitutive",
"status": "pending"
},
{
"step": 4,
"name": "mitc4-stiffness-drilling",
"status": "pending"
},
{
"step": 5,
"name": "mitc4-physical-recovery",
"status": "pending"
},
{
"step": 6,
"name": "shell-dof-scatter",
"status": "pending"
},
{
"step": 7,
"name": "shell-sparse-assembly",
"status": "pending"
},
{
"step": 8,
"name": "shell-load-validation",
"status": "pending"
},
{
"step": 9,
"name": "shell-analysis-state",
"status": "pending"
},
{
"step": 10,
"name": "shell-result-recovery",
"status": "pending"
},
{
"step": 11,
"name": "shell-hdf5-output",
"status": "pending"
},
{
"step": 12,
"name": "shell-linear-static-flow",
"status": "pending"
},
{
"step": 13,
"name": "shell-reference-comparison",
"status": "pending"
}
]
}
+106
View File
@@ -0,0 +1,106 @@
# Step 0: Shell Semantic Model
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
- 이 Step만 `RED -> observed failure -> minimal GREEN -> focused/full VERIFY`로 수행한다.
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`
- `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/HARNESS.md`
- `/docs/HARNESS_WORKFLOW.md`
- `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md`
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- `/phases/index.json`
- `/phases/linear-static-mitc4-shell/index.json`
- `/phases/linear-static-mitc4-shell/step0.md`
- `/include/fesa/model/model_types.hpp`
- `/include/fesa/model/domain.hpp`
- `/src/fesa/model/domain.cpp`
- `/tests/unit/model/model_types_test.cpp`
- `/tests/unit/model/domain_test.cpp`
필수 파일이 없거나 승인 계약과 충돌하면 현재 Step을 `blocked`로 기록하고 중단한다.
## 작업
Requirements 002-016, 024의 semantic ownership만 구현한다.
1. 먼저 `MITC4-MODEL-001``MITC4-MODEL-002`를 기존 model tests에 추가한다.
2. Tests는 four-node connectivity, stable `SourceEntityId`, source type `S4|S4R`
internal `FESA-MITC4` identity 분리, finite positive thickness와 material/section
indices, optional initial nodal director/frame storage, declaration order를 검증한다.
3. Production은 `model_types.hpp`와 필요한 `Domain` const accessor에만 최소 추가한다.
Candidate records are `ShellSourceElementType`, `ShellSection`,
`Mitc4ShellDefinition` and a shell-only node director/frame record.
4. 기존 `EulerBeam3DDefinition`, `GeneralBeamSection`, B33 accessors를 보존한다.
5. Node/Element에 equation id를 넣지 않는다. Director는 dimensionless unit vector이고
thickness와 별도다.
## Acceptance Criteria
먼저 다음 configure를 실행한다.
```powershell
$requiredBuildPaths = @(
"C:/git/googletest",
"C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl",
"C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb",
"C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
)
foreach ($requiredBuildPath in $requiredBuildPaths) {
if (-not (Test-Path -LiteralPath $requiredBuildPath)) { throw "Missing $requiredBuildPath" }
}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
```
RED test를 작성한 뒤 아래 build/test가 missing shell semantic behavior 때문에 실패함을
기록한다. Compile failure면 그 expected failure를 기록하고 CTest는 GREEN 뒤 실행한다.
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure
```
GREEN 뒤 focused와 full VERIFY:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
- RED command와 예상 failure, GREEN/focused/full 결과를 다음 Step summary에 남긴다.
- 성공 시 현재 Step만 `completed`와 한 줄 `summary`로 갱신한다.
- 3회 후 실패면 `error`/`error_message`, 사용자 결정이 필요하면
`blocked`/`blocked_reason`을 기록한다.
- timestamp, retry, commit, 다음 Step 선택은 Executor 소유다.
## 금지사항
- Parser, element kernel, DOF, assembly를 수정하지 마라. 이유: Step 0은 model layer만 소유한다.
- 공통 public Element hierarchy를 만들지 마라. 이유: 승인된 아키텍처 범위가 아니다.
- 기존 B33 record를 제거하거나 의미를 바꾸지 마라. 이유: V0 회귀를 막는다.
- 직접 commit하거나 hook script를 수동 실행하지 마라. 이유: Executor/hook 소유권이다.
- `reference/` 파일을 수정하거나 Abaqus를 실행하지 마라.
+78
View File
@@ -0,0 +1,78 @@
# Step 1: Shell Domain Mapping
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 001-010, 017-023
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 1-5, 8-9
- `/phases/index.json`, task index, `/phases/linear-static-mitc4-shell/step1.md`
- Step 0에서 수정한 model/Domain paths와 Step 0 summary
- `/include/fesa/io/abaqus/domain_mapper.hpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/tests/unit/io/abaqus/domain_mapper_test.cpp`
- `/include/fesa/io/abaqus/input_syntax.hpp``input_reader.hpp`는 경계 확인용으로만 읽는다.
## 작업
1. `MITC4-MAP-001..004`를 먼저 작성한다.
2. `AbaqusDomainMapper::map(const ParsedInput&) -> Result<Domain>` signature를 유지하고
exact `TYPE=S4|S4R` four-node connectivity와 single-row centered
`*SHELL SECTION, MATERIAL=...`를 semantic model로 mapping한다.
3. ELSET/material을 element마다 exactly once resolve하고 source type과
`FESA-MITC4` identity를 분리한다.
4. identity PART/ASSEMBLY/INSTANCE 및 multiple identity instances의 stable mapping을
유지한다. Mixed beam-shell은 `unsupported-mixed-element-model`로 거부한다.
5. Invalid connectivity/section/material/unsupported option/second or nonlinear step/
DLOAD를 I/O 계약의 exact diagnostic class로 fail closed 한다.
6. Existing six-DOF BOUNDARY/CLOAD grammar와 output-request no-op behavior를 재사용한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "InpDomainMapping" --output-on-failure
```
Valid S4/S4R mapping 또는 negative diagnostic assertion의 expected RED를 기록한 뒤
minimal GREEN만 작성한다. GREEN 뒤:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "InpSyntax|InpDomainMapping|DomainModel" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/focused/full evidence를 기록하고 현재 Step만 `completed`/`summary` 또는
`error`/`error_message`, `blocked`/`blocked_reason`으로 갱신한다. Timestamp,
commit, advancement는 Executor 소유다.
## 금지사항
- `AbaqusInputReader`에 semantic policy를 넣지 마라.
- Element math, geometry calibration, equation numbering을 구현하지 마라.
- Unsupported 의미를 무시하거나 S4R reduced integration을 암시하지 마라.
- Reference artifact, tolerance, upstream 문서를 수정하지 마라.
- 직접 commit/hook 실행을 하지 마라.
@@ -0,0 +1,69 @@
# Step 10: Shell Result Recovery
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 029/035/041-046/048/057
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 14, 16
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 6.3-6.5
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step10.md`, completed Steps 5/9 paths and summaries
- `/include/fesa/results/result_recovery.hpp`
- `/src/fesa/results/result_recovery.cpp`
- `/tests/unit/results/result_recovery_test.cpp`
## 작업
1. `MITC4-REC-001..005`를 먼저 작성한다.
2. Existing full `K*d-F` residual을 nodal reaction/free residual evidence로 유지한다.
3. Shell element displacement는 24-entry scatter로 추출하고 Step 5
physical-only recovery를 호출해 stable source-element/GP/section order로 candidate를 채운다.
4. Deterministic element reduction으로 physical energy를 합산한다. Applied CLOAD와
constrained reaction으로 global origin about force/moment balance와 normalized
metrics를 계산한다.
5. 모든 row/component/location/finite validation 뒤 AnalysisState에 원자적으로 commit한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "ResultRecovery" --output-on-failure
```
Beam-only recovery/absent shell rows의 expected RED 후 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "ResultRecovery|AnalysisState|Mitc4ShellPhysicalRecovery" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED와 focused/full result evidence를 기록하고 current Step만 갱신한다.
## 금지사항
- Result record type 또는 HDF5 schema를 이 Step에서 새로 만들지 마라.
- Location averaging, Abaqus point relabeling, drilling recovery/energy를 추가하지 마라.
- Reaction을 shell resultants의 별도 합으로 정의하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
@@ -0,0 +1,72 @@
# Step 11: Shell HDF5 Output
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 039-048
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Section 6 exact schema
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step11.md`, completed Steps 9/10 paths and summaries
- `/include/fesa/results/results_writer.hpp`
- `/include/fesa/io/hdf5/hdf5_results_writer.hpp`
- `/src/fesa/io/hdf5/hdf5_results_writer.cpp`
- `/tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
## 작업
1. `MITC4-H5-001..004`를 먼저 작성한다.
2. Generic `ResultsWriter::write(path,Domain,AnalysisState,diagnostics)` 경계를 유지한다.
3. I/O contract exact metadata, four-node element identity, director/frame,
materials/sections, masks/prescribed values, fixed locations와 all mandatory shell
result/global datasets를 schema v0에 additive하게 기록한다.
4. Exact shapes/dtypes/component attributes/unit dimensions/coordinate/location/step/frame
identity와 finite/order를 self-check한다.
5. Output request와 무관하게 mandatory inventory를 기록하고 drilling paths/S33/S13/S23를
만들지 않는다.
6. Existing same-directory temp, flush/close, read-only reopen/self-check, atomic replace를 재사용한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter" --output-on-failure
```
Missing shell schema/atomic validation RED 후 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter|ResultRecovery|AnalysisState" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/schema/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- B33 dataset 의미를 migrate/reinterpret하지 마라.
- CSV를 solver output으로 만들거나 partial final HDF5를 남기지 마라.
- Drilling/calibration output을 추가하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
@@ -0,0 +1,72 @@
# Step 12: Shell Linear Static Flow
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 024-030/051/057
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` CLI/diagnostic contract
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step12.md`, completed Steps 7-11 paths and summaries
- `/include/fesa/analysis/linear_static_analysis.hpp`
- `/src/fesa/analysis/linear_static_analysis.cpp`
- `/tests/integration/analysis/linear_static_analysis_test.cpp`
- `/tests/integration/app/fesa_application_test.cpp`
- `/include/fesa/app/fesa_application.hpp`와 implementation은 dispatch 확인용
## 작업
1. `MITC4-FLOW-001..004` integration tests를 먼저 작성한다.
2. Shell Domain을 existing eight-hook `Analysis::run()` lifecycle에 연결한다.
3. Stiffness assemble/partition, `Kff` factorize, load/effective RHS, substitute,
full displacement reconstruct, full residual/physical recovery, validated state/output
commit 순서를 유지하고 factorization은 exactly once다.
4. Nonzero prescribed displacement의 `Ff-Kfc*dc`, singular support failure,
all-constrained `0x0 Kff` success를 검증한다.
5. CLI syntax와 exit 0/2/3/4/5/6 semantics를 유지하며 shell input도 같은
`fesa.exe <model.inp> --output <results.h5>` route를 사용한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_integration_tests
ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure
```
Shell pipeline RED를 확인하고 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_integration_tests
ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/lifecycle/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- Analysis lifecycle을 재정렬하거나 0x0 Kff를 singular로 바꾸지 마라.
- Nonlinear procedure, distributed load, mixed beam-shell execution을 추가하지 마라.
- Candidate validation 전 state/output을 commit하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
+107
View File
@@ -0,0 +1,107 @@
# Step 13: Shell Reference Comparison
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
- 이 Step은 test-only reference module을 소유하며 solver production module을 소유하지 않는다.
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 053/058-072
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Section 7
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step13.md`, completed Steps 11/12 paths and summaries
- `/tests/reference/reference_comparison.hpp`와 cpp/test는 B33 identity/report precedent
- Candidate new `/tests/reference/mitc4_reference_comparison.hpp`
- Candidate new `/tests/reference/mitc4_reference_comparison.cpp`
- Candidate new `/tests/reference/mitc4_reference_comparison_test.cpp`
- Candidate new `/tests/reference/mitc4_reference_cases_test.cpp`
- `/tests/CMakeLists.txt`
- Read-only:
`/reference/shell/shell.inp`,
`/reference/shell/shell displacements.csv`,
`/reference/shellR/shellR.inp`,
`/reference/shellR/shellR displacements.csv`
## 작업
1. `MITC4-REF-001..006`, `MITC4-E2E-S4-001/002`,
`MITC4-E2E-S4R-001/002`를 comparator 구현 전에 작성한다.
2. Test-only comparator는 각 case의 exact input/displacement CSV와 FESA HDF5만 요구한다.
`Part Instance Name``Node Label`을 HDF5 node identity에 match하고 CSV
`U-U1..U-U3, UR-UR1..UR-UR3`를 displacement columns 0..5에 match한다.
3. Header/schema/row set/missing/extra/duplicate/nonfinite/source identity를 numeric
comparison 전에 fail한다.
4. Component group의 finite Abaqus scale로
`tol_c=1e-9+1e-6*reference_scale_c`를 clamp/row denominator 없이 적용한다.
U1/U2/U3만 blocking이고 UR1/UR2/UR3 exceedance는 deterministic warning-only다.
5. 모든 row decision, max absolute, normalized, RMS, vector norm, worst source row/component를
deterministic report/JSON에 남긴다.
6. S4/S4R HDF5가 source type만 보존하고 동일 `FESA-MITC4` integration rule을 기록하는지
검증한다.
7. Declared case가 solver production defect를 드러내면 current Step을 중단하고
Correction/Coordinator에 owning prior module로 handoff한다. 이 Step에서 그 production
file을 수정하지 않는다.
## Acceptance Criteria
먼저 exact expected hashes를 검증한다.
```powershell
$expectedReferenceHashes=[ordered]@{
"reference/shell/shell.inp"="4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"
"reference/shell/shell displacements.csv"="C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B"
"reference/shellR/shellR.inp"="1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4"
"reference/shellR/shellR displacements.csv"="8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB"
}
foreach($p in $expectedReferenceHashes.Keys){
if((Get-FileHash -Algorithm SHA256 -LiteralPath $p).Hash -ne $expectedReferenceHashes[$p]){
throw "Reference artifact changed: $p"
}
}
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_reference_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure
```
Missing comparator/case RED를 확인하고 test-only minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_reference_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
foreach($p in $expectedReferenceHashes.Keys){
if((Get-FileHash -Algorithm SHA256 -LiteralPath $p).Hash -ne $expectedReferenceHashes[$p]){
throw "Reference artifact changed: $p"
}
}
git diff --check
```
## 검증 및 상태 갱신
RED/comparator/E2E/full/hash evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- Abaqus/reference solver를 실행하거나 reference 파일을 생성·수정·rename·repair하지 마라.
- README, metadata.json, provenance, Abaqus version을 gate로 만들지 마라.
- UR warning을 blocking으로 바꾸거나 tolerance를 calibration/clamp하지 마라.
- Reaction/stress equality gate나 Abaqus formulation equivalence를 추가하지 마라.
- Solver production file을 수정하거나 직접 commit/hook 실행을 하지 마라.
+71
View File
@@ -0,0 +1,71 @@
# Step 2: Shell Director Geometry
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 011-016/050/051/054
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 4, 9, 17
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.2, 5.5, 6.1
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 3.3, 8-9
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step2.md`, Step 0-1 modified paths/summaries
- Candidate new `/include/fesa/model/shell_geometry.hpp`
- Candidate new `/src/fesa/model/shell_geometry.cpp`
- Candidate new `/tests/unit/model/shell_geometry_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
## 작업
1. `MITC4-GEO-001..004`를 먼저 작성하고 CMake에 test source를 등록한다.
2. Backend-neutral model geometry module에 element normal candidate, deterministic
area-weighted nodal director, pairwise positive orientation, right-handed nodal
tangent frame with documented axis tie-break, structured validation seam을 만든다.
3. Center, eight stiffness points, four tying points, four committed recovery points에서
finite bases, nonzero surface measure, positive finite Jacobian을 검사한다.
4. Valid planar/rotated/warped cases와 duplicate, bow-tie, zero-area, reversed,
nonfinite, nonpositive-J, opposed-normal cases를 검증한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry" --output-on-failure
```
Expected missing geometry API/behavior RED를 확인한 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry|DomainModel|InpDomainMapping" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/VERIFY evidence를 summary에 남기고 현재 Step 상태만 갱신한다. Executor-owned
timestamp/retry/commit/advancement를 쓰지 않는다.
## 금지사항
- Calibrated smooth angle, warp/distortion threshold, NR-O03/NR-O04를 추가하지 마라.
- Parser keyword policy나 element stiffness를 구현하지 마라.
- Invalid geometry를 clamp/repair하지 마라.
- Reference/upstream 문서를 수정하거나 직접 commit/hook 실행을 하지 마라.
+74
View File
@@ -0,0 +1,74 @@
# Step 3: MITC4 Kinematics and Constitutive Law
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 031-038/050-052
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 3-11, 17
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.1-5.6, 6.1-6.2
- `/docs/io-definitions/linear-static-mitc4-shell-io.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step3.md`, Step 2 geometry paths/summary
- `/include/fesa/elements/euler_beam_3d.hpp`와 cpp는 concrete value-kernel style 참고용
- Candidate new `/include/fesa/elements/mitc4_shell.hpp`
- Candidate new `/src/fesa/elements/mitc4_shell.cpp`
- Candidate new `/tests/unit/elements/mitc4_shell_test.cpp`
- source/test CMakeLists
## 작업
1. `MITC4-KIN-001..005` tests를 먼저 작성한다.
2. Public common Element hierarchy 없이 concrete `Mitc4Shell` value type을 만든다.
3. Candidate creation seam은 four nodes, four initial directors, `ShellSection`,
`LinearElasticMaterial`을 받아 validated `Result<Mitc4Shell>`을 반환한다.
4. Shape/derivative identities, local frames, `T_p`/`T_d` channel maps, direct
membrane/bending columns, four covariant MITC edge-midpoint tying samples와
interpolation weights, engineering shear factors를 구현한다.
5. `C_ps`, `C_5`, `A`, `D`, `A_s`의 exact coefficients, dimensions, symmetry,
positive definiteness와 unit rescaling을 구현한다.
6. `2x2x2` Gauss point/weight order를 고정하고 intermediate physical matrices는
20 DOF contract를 유지한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive" --output-on-failure
```
Expected missing kernel/kinematics RED를 기록한 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive|Mitc4Geometry" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
현재 Step의 RED와 focused/full evidence만 기록하고 상태 payload만 갱신한다.
## 금지사항
- Global assembly, drilling stiffness, recovery/HDF5를 구현하지 마라.
- S4R source type으로 quadrature를 분기하지 마라.
- Nonlinear state/residual/tangent를 구현하지 마라.
- Vendor type을 public header에 노출하거나 직접 commit/hook 실행을 하지 마라.
+68
View File
@@ -0,0 +1,68 @@
# Step 4: MITC4 Stiffness and Drilling Stabilization
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 031-038/050-056
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 10-14, 17
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.7, 6.1-6.2
- `/docs/io-definitions/linear-static-mitc4-shell-io.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step4.md`, completed Step 3 kernel/header/test and summary
## 작업
1. `MITC4-KERNEL-001..006`를 production edit 전에 작성한다.
2. Common `2x2x2` integration으로 physical `K20`을 만들고 deterministic
20-to-24 congruence로 global-coordinate `K24 physical`을 만든다.
3. `R+`는 eight physical tangent-rotation diagonal의 finite positive values만
사용하고 `k_ref=min(R+)`, `k_d=1e-3*k_ref`,
`K_drill=T_d^T(k_d I4)T_d`를 정확히 구현한다.
4. Empty/nonfinite `R+`는 structured deterministic failure다.
5. Scaled symmetry <=1e-12, transform energy <=1e-12, physical rigid action <=1e-10,
physical rank 14, stabilized rank 18/nullity 6, positive non-rigid energy,
membrane/bending/shear/twist patch fields를 독립 test로 검증한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling" --output-on-failure
```
Expected missing stiffness/drilling RED를 확인한 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling|Mitc4ShellKinematics" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/VERIFY evidence와 exact formula를 summary에 기록하고 현재 Step 상태만 갱신한다.
## 금지사항
- Translational diagonal을 `R+`에 넣지 마라.
- Coefficient sweep, calibration, drill energy/result, physical recovery를 구현하지 마라.
- S4R reduced integration/hourglass와 future nonlinear tangent를 구현하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
+67
View File
@@ -0,0 +1,67 @@
# Step 5: MITC4 Physical Recovery
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 035/042-046/052/056
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 14, 16
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` result component/location order
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step5.md`, completed Steps 3-4 kernel/header/test and summaries
## 작업
1. `MITC4-KERNEL-007``MITC4-PHYSREC-001`을 먼저 작성한다.
2. `Mitc4Shell` 내부에 global element displacement 24개를 받아 physical-only
shell recovery를 반환하는 candidate seam을 최소 구현한다.
3. Fixed GP1..GP4에서 local frame, eight generalized strain/resultant를 계산하고
BOTTOM/MIDDLE/TOP에서 direct `[S11,S22,S12]`를 계산한다.
4. Physical element strain energy만 반환하며 drilling stiffness/action은 모든
physical recovery와 energy에서 제외한다.
5. Pure drill vector가 stabilized action은 가지지만 모든 physical recovery/energy가
zero임을 검증한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery" --output-on-failure
```
Expected missing recovery seam/pure-drill exclusion RED 후 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery|Mitc4ShellPatch" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
현재 Step만 status/summary payload를 갱신하고 RED/GREEN/VERIFY를 기록한다.
## 금지사항
- AnalysisState/global result rows, ResultRecovery orchestration, HDF5를 수정하지 마라.
- Drilling output/stress/resultant/energy를 추가하지 마라.
- Location averaging 또는 Abaqus integration-point identity를 만들지 마라.
- 직접 commit/hook 실행이나 reference/upstream 변경을 하지 마라.
+68
View File
@@ -0,0 +1,68 @@
# Step 6: Shell DOF Scatter
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 005/025
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step6.md`, Step 0 shell model and Step 5 summary
- `/include/fesa/fem/dof_manager.hpp`, `/src/fesa/fem/dof_manager.cpp`
- `/tests/unit/fem/dof_manager_test.cpp`
- `/tests/unit/constraints/essential_constraints_test.cpp`
## 작업
1. `MITC4-DOF-001..003` tests를 먼저 작성한다.
2. 기존 node DOF order `[ux,uy,uz,urx,ury,urz]`를 유지한다.
3. B33 12-entry scatter를 보존하면서 shell four-node/source-order 24-entry typed
scatter와 sorted unique sparse pattern을 `DofManager` 단독 소유로 추가한다.
4. Free/constrained numbering과 no/mixed/all constraint, nonzero prescribed value
round trip을 shell-sized system에서 검증한다.
5. All-constrained `0x0 Kff`가 valid하도록 existing constraint behavior를 보존한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints" --output-on-failure
```
Current 12-entry-only behavior의 expected RED 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints|DomainModel" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/VERIFY evidence를 기록하고 current Step의 Codex-owned fields만 갱신한다.
## 금지사항
- Node/Element에 equation id를 저장하지 마라.
- Load/constraint ownership이나 sparse reduction을 이동하지 마라.
- 기존 B33 scatter behavior를 제거하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
+70
View File
@@ -0,0 +1,70 @@
# Step 7: Shell Sparse Assembly
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 027/030/037/050/056
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md`
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step7.md`, completed Steps 4/6 paths and summaries
- `/include/fesa/assembly/sparse_assembler.hpp`
- `/src/fesa/assembly/sparse_assembler.cpp`
- `/src/fesa/math/sparse_matrix.cpp`
- `/tests/unit/assembly/sparse_assembler_test.cpp`
## 작업
1. `MITC4-ASM-001..003` tests를 먼저 작성한다.
2. Shell topology를 concrete MITC4 global 24x24 stiffness에 dispatch한다.
3. Active source-element order로 worker-owned local buffers를 만들고 element당
576 COO entries에 stable `elementOrder``localOrder`를 부여한다.
4. Existing `SparseMatrix::fromCoo` canonical reduction과 every diagonal slot을
보존하며 worker가 global CSR을 직접 수정하지 않게 한다.
5. Serial/TBB/repeated run CSR bytes/values를 비교하고 identical semantic S4/S4R
fixtures가 identical K를 만드는지 검증한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "SparseAssembly" --output-on-failure
```
Four-node/24-DOF RED를 확인하고 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "SparseAssembly|DofManager|Mitc4ShellKernel" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED와 deterministic focused/full evidence를 summary에 기록하고 current Step만 갱신한다.
## 금지사항
- Worker가 global CSR을 직접 갱신하거나 unordered reduction을 사용하지 마라.
- Source type으로 quadrature/hourglass를 분기하지 마라.
- Load, solve, recovery를 구현하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
+69
View File
@@ -0,0 +1,69 @@
# Step 8: Shell Load Validation
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 017-020/028
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md` Sections 8, 13
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 4.2-4.3
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step8.md`, completed Steps 2/7 paths and summaries
- `/include/fesa/assembly/load_assembler.hpp`
- `/src/fesa/assembly/load_assembler.cpp`
- `/tests/unit/assembly/load_assembler_test.cpp`
- `/tests/unit/constraints/essential_constraints_test.cpp`
## 작업
1. `MITC4-LOAD-001..004`를 먼저 작성한다.
2. Existing global six-DOF full-space CLOAD assembly와 constraint partition을 재사용한다.
3. Node별 global force/moment를 stable source order로 먼저 aggregate한다.
4. Moment가 exact zero면 별도 나눗셈 없이 accept한다. Nonzero면 approved director로
`rho_M=abs(dot(d,M))/norm(M)`을 계산해 `rho_M<=1e-12`만 accept한다.
5. Rejected moment는 `unsupported-drilling-load`로 RHS/substitution/drill stabilization
이전에 실패해야 한다. Existing `Ff-Kfc*dc`와 factorization-before-load를 보존한다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints" --output-on-failure
```
Moment projection/diagnostic RED 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints|InpDomainMapping" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
현재 Step의 RED/GREEN/VERIFY evidence와 exact threshold를 summary에 기록한다.
## 금지사항
- DLOAD/equivalent/follower/distributed load를 구현하지 마라.
- Numerical drilling을 load channel로 사용하지 마라.
- Factorization/load lifecycle을 재정렬하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
+70
View File
@@ -0,0 +1,70 @@
# Step 9: Shell Analysis State
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd`
## 읽어야 할 파일
- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`
- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md`
- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json`
- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md`
- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 026/041-046/048
- `/docs/research/linear-static-mitc4-shell-research.md`
- `/docs/formulations/mitc4-shell-formulation.md`
- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md`
- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 6.3-6.5
- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md`
- phase indexes, `step9.md`, Step 5 recovery types and Step 8 summary
- `/include/fesa/results/result_records.hpp`
- `/include/fesa/analysis/analysis_state.hpp`
- `/src/fesa/analysis/analysis_state.cpp`
- `/tests/unit/results/result_records_test.cpp`
## 작업
1. `MITC4-STATE-001..003`을 먼저 작성한다.
2. Additive shell record types를 정의한다: stable element, GP1..GP4 natural location,
local 3x3 frame, eight generalized strain/resultant, three section positions의
`[S11,S22,S12]`.
3. AnalysisState에 shell rows, physical strain energy, six equilibrium components,
three normalized verification metrics를 candidate-owned storage로 추가한다.
4. Validated candidate가 완성된 뒤에만 state로 commit하며 invalid/nonfinite/
inventory mismatch가 기존 state를 바꾸지 않게 한다.
5. Nonlinear director history, iteration, velocity, acceleration을 할당하지 않는다.
## Acceptance Criteria
```powershell
$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake")
foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}}
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "AnalysisState" --output-on-failure
```
Missing shell state/rollback RED 뒤 minimal GREEN. 이후:
```powershell
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug -R "AnalysisState|DomainModel" --output-on-failure
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
```
## 검증 및 상태 갱신
RED/VERIFY evidence를 기록하고 현재 Step 상태 payload만 갱신한다.
## 금지사항
- Element calculation, ResultRecovery orchestration, HDF5를 구현하지 마라.
- Nonlinear/dynamic state나 drilling-specific row를 추가하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.