286 lines
33 KiB
Markdown
286 lines
33 KiB
Markdown
# 구현 검증과 계약 traceability
|
||
|
||
- Feature ID: `mitc4-shell-feast-eigen`
|
||
- Owner: `implementation-planning-agent`
|
||
- Input contract revision: `r2`
|
||
- 기본 보고서: [implementation-plan](implementation-plan.md)
|
||
- 권위: [requirements](requirements.md), [NR cases](numerical-review-cases.md),
|
||
[NR controls](numerical-review-controls.md), [I/O obligations](io-mapping.md#m5-구현test-obligations와-requirement-연결).
|
||
- 아래 테스트는 계획 이름이다. 실제 discovery/실행 전 통과 또는 구현 완료를 뜻하지 않는다.
|
||
|
||
## V1. 의미 있는 RED와 전체 suite
|
||
|
||
각 Step은 소단위별 test-first RED/expected failure 기록→최소 GREEN→focused VERIFY 뒤
|
||
full CMake/MSVC/x64/Debug CTest 및 Python regression을 완료한다. 기존 회귀가 이미 통과한
|
||
사실은 새 RED가 아니다. 부재 API로 인한 정확한 compile/link error는 RED로 기록할 수 있으나
|
||
환경/import/dependency failure와 구분한다. Mutations는 test-local data/fixture/injected
|
||
backend에서 수행하며 stored reference나 production을 임시로 오염시키지 않는다.
|
||
|
||
아래 mandatory test names는 해당 Step이 완성될 때 CTest discovery inventory에 **각각 존재**해야
|
||
한다. 같은 combined regex가 기존 tests 몇 개만 선택했다고 성공시키지 않는다. New production
|
||
basename의 대응 test 파일과 등록된 해당 behavior assertion도 함께 대조한다. 실제 test를
|
||
parameterized tests로 쪼갠 경우 원 named obligation→실제 discovered names의 일대일/일대다
|
||
대응을 step evidence에 기록한다. Case를 test 이름만 등록하고 assertions를 비워 두지 않는다.
|
||
|
||
## V2. NR cases의 구체 실행 대응
|
||
|
||
Threshold와 전체 fixture inventory는 NR 원문이다. 표의 요약을 이유로 그 inventory를 축소하지 않는다.
|
||
각 row의 primary test 외 관련 단계의 preprocessing/injection/schema tests를 함께 수행한다.
|
||
|
||
| Case ID | Steps | Mandatory primary test / file | 독립 oracle·오류 검출 |
|
||
| --- | --- | --- | --- |
|
||
| MFE-C01 | 2 | `Mitc4ShellMass.MfeC01FlatMomentOracle`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | 4x2, rho3,t1/2의 exact C0/C1/C2; node m3,j1/16; direct energy/physical20 Cholesky/null; rho4/t2 powers. Wrong shear factor/rotary scaling을 검출. |
|
||
| MFE-C02 | 2 | `Mitc4ShellMass.MfeC02CurvedParticleOracle`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational X/d의 independent polynomial 또는 고차 direct particle integral. C1 zero/2-point/flat C2 mutation의 error가 기준을 넘는지 확인. |
|
||
| MFE-C03 | 2 | `Mitc4ShellMass.MfeC03DerivedSnapshotAndJensen`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | C1/C2 symmetric perturbation→moment snapshot/consistent/derived block을 각각 대조. Independent nodal integral, central variance, spatial first moment, four velocity families의 Jensen work. |
|
||
| MFE-C04 | 2 | `ShellMassAssembler.MfeC04RefinementEnergy`<br>`tests/unit/assembly/shell_mass_assembler_test.cpp` | m1/2/4 square mesh, velocity(x,0,0); direct MC work4/3, ML-MC8/(3m²), constant velocity total4. Spectrum convergence 주장은 하지 않음. |
|
||
| MFE-C05 | 2 | `Mitc4ShellMass.MfeC05RotatedMassAndCentroid`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational proper Q+shift(7,-3,5), geometry/directors 새 생성; two mass congruence/centroid/null. d=(1,1,1)/sqrt3에서 global scalar-row lump mutation 검출. |
|
||
| MFE-C06 | 0, 2, 5 | `ShellMassAssembler.MfeC06SourceAndParallelOrder`<br>`tests/unit/assembly/shell_mass_assembler_test.cpp` | Shared nodes와 두 rho/t, 선언/label permutation, independent source/scatter mapping. Fixed input sequential/TBB 재실행의 CSR/reduction exact order와 source-renumbered 대응 결과를 구분. |
|
||
| MFE-C07 | 0, 2 | `FrequencyDomain.MfeC07DensityFailures`<br>`tests/unit/io/abaqus/frequency_domain_test.cpp` | Density scope/arity/duplicate/unresolved/missing/zero/negative/NaN/Inf/temperature/dependencies. Kernel 27-point invalid·geometry/t/material 거부는 Mitc4ShellMass에서 별도; density 없는 static 유지. |
|
||
| MFE-C08 | 1, 3, 5 | `Mitc4Covariance.MfeC08PartialBcCovariance`<br>`tests/integration/analysis/mitc4_covariance_test.cpp` | NR001 rectangle/Z45에서 새 K/kd와 two mass, actual BC URZ-only. kd19/4800,Kff10369/7500,Mff3/50; Step5 actual FEAST lambda10369/450/full residual. Old min mutation 실패. |
|
||
| MFE-C09 | 1, 7 | `Mitc4Covariance.MfeC09StaticReactionCovariance`<br>`tests/integration/analysis/mitc4_covariance_test.cpp` | Admissible physical moment (5/3)b, thetaZ7500/10369. Fresh geometry/load 재생성 후 full Kq-F의 모든 reaction component와 physical projection 기준 확인. |
|
||
| MFE-C10 | 1 | `Mitc4DrillingScale.MfeC10TraceInventory`<br>`tests/unit/elements/mitc4_drilling_scale_test.cpp` | [0,0,2,4,0,6,0,4]→kref2, zero/negative/nonfinite/large/subnormal; node별 독립 tangent rotation angles. Positive-only mean/min/floor mutation 검출. |
|
||
| MFE-C11 | 1, 2, 3, 5 | `LinearFrequencyProcedure.MfeC11SixPhysicalRigidModes`<br>`tests/integration/analysis/linear_frequency_procedure_test.cpp` | Free element/patch six tangent-projected rigid fields vs four massless drills. PhysicalK20 rank14/MC20PD/K24rank18, finite20·six near-zero actual modes와 mass Gram; preprocessing tests도 포함. |
|
||
| MFE-C12 | 1, 7 | `NonlinearMitc4Tangent.MfeC12FrozenCovariantScale`<br>`tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp` | Initial S1 scale의 trial/commit/rollback 불변, existing gamma의 full FD schedule/index3/tangent/objectivity/physical linear limit/recovery. 기존 tests는 회귀이며 새 RED로 가장하지 않음. |
|
||
| MFE-C13 | 0, 3, 5 | `EigenReduction.MfeC13ExactBoundaryNullIntersection`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | NR 세 director와 supported mask 조합, drill-only는 axis-aligned URZ만; per-node rank0를 global failure로 오인하지 않음. Global n0/N>n, source constraint exact0. |
|
||
| MFE-C14 | 3, 5 | `EigenReduction.MfeC14NearNullConditioning`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | p1/2000 analytic5 pass, p1e-8 analytic5 conditioning/Cholesky fail, p0 null1. rcond2^-32 equality/nextafter tests; tiny positive를 삭제하면 failure. |
|
||
| MFE-C15 | 3 | `EigenReduction.MfeC15RejectsInvalidDecoupling`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | Test-local K[[6,2],[2,4]],Mdiag2,0 finite2.5/z=-p/2. Production Kpz nonzero/Kzz nonpositive injected rejection; 삭제3 또는 general Schur fallback 금지. |
|
||
| MFE-C16 | 3, 5 | `EigenValidation.MfeC16OriginalMassAndPairing`<br>`tests/unit/analysis/eigen_validation_test.cpp` | M[[2,1],[1,2]],K[[6,4],[4,6]]→2,10/3; triangular whitening/restoration. Wrong M/lambda/vector/null/constraint corruption을 full original-space 검사로 탐지. |
|
||
| MFE-C17 | 4, 5 | `MklFeastEigenSolver.MfeC17KnownLowestSpectra`<br>`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual API+production search: n1; [0,0,0,2,5,9] N1/4/6; [1,2,4,8] N1/2/4; allzero n4 N1/4. Matrix-derived enclosure/count history와 independent ordered spectrum. |
|
||
| MFE-C18 | 4, 5 | `MklFeastEigenSolver.MfeC18RepeatedAndTightClusters`<br>`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual n64 fortyfold1+2..25 N1/41; tight[1,1+2^-28,1+2^-27,8] N2; fixed Givens dense CSR. c>N/all-c Gram와 gap/8, repeated projector 기준. 개별 repeated vector equality 아님. |
|
||
| MFE-C19 | 4, 5, 6 | `EigenValidation.MfeC19RawSignedEigenvalues`<br>`tests/unit/analysis/eigen_validation_test.cpp` | Actual [-2,0,3],[-1e-12,0,1] backend raw; procedure significant negative failure. ±tauzero 및 nextafter, frequency ID subset/finite/underflow. Small positive도 N에 포함. |
|
||
| MFE-C20 | 2, 3, 5 | `LinearFrequencyProcedure.MfeC20DensityAndUnits`<br>`tests/integration/analysis/linear_frequency_procedure_test.cpp` | TwoM×4,lambda/4,amplitude1/2; repeated projector; length1024/rho1024^-3/E1024^-1/t1024의 lambda invariance. Baseline s와 동일 물리 BC. |
|
||
| MFE-C21 | 4, 5, 6 | `FeastSearch.MfeC21StatusAndHistoryFailures`<br>`tests/unit/solvers/eigen/feast_search_test.cpp` | C21 전체 raw status inventory, endpoint/zero count/nonmonotonicity/total!=n/m!=c, invalidCSR/fpm/SPD/QR/pair/residual. c>N의 뒤 column 손상과 false-lowest success를 검출; 허용 retry 외 즉시 실패. |
|
||
| MFE-C22 | 4, 6 | `FeastSearch.MfeC22FiniteBudgetsAndCapacity`<br>`tests/unit/solvers/eigen/feast_search_test.cpp` | 512count/3solve inclusive와 초과,384 optimization+128reserve, certified fallback. n²/n*m0/nnz+1/byte overflow 및 allocation injected failure; 큰 allocation 실제 고갈을 유발하지 않음. |
|
||
| MFE-C23 | 0, 5, 6, 7 | `FrequencyDomain.MfeC23ExactReferenceSubset`<br>`tests/unit/io/abaqus/frequency_domain_test.cpp` | 원본729/676/Step-2/N10, density/t/S4R/warnings/source records. N invalid·fields2~7 nonempty0/eighth empty·unsupported enum/procedure/load/acoustic/mixed/nonzero BC; I1~I6 전 inventory. |
|
||
| MFE-C24 | 5, 6, 7 | `EigenHdf5Schema.MfeC24RoundTripAndRejection`<br>`tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp` | O1~O5 independent reader/mutation, N/c/source/units/backend/ML/flags/types/ranks. FrequencyApplication failure matrix는 이전 final/state hash와 최초final부재를 각각 확인. |
|
||
| MFE-C25 | 7 | `EigenReferenceCases.MfeC25FreshTenValueFamilies`<br>`tests/reference/eigen_reference_cases_test.cpp` | 원본TXT full grammar+source join/10singleton 실제fresh eigen 비교. EigenReferenceComparison 음성/1%RMS·5%row·near-zero·S0 boundaries, Freq mutation 판정불변. |
|
||
| MFE-C26 | 1, 6, 7 | `Mitc4EigenStaticRegression.MfeC26FreshApprovedPortfolio`<br>`tests/reference/mitc4_eigen_static_regression_test.cpp` | shell/shellNL/shellNL-meshfine와 linear-limit 역할. 원본copy→actualrun→기존 Ublocking/URwarning/localreactionreview+factor1 internalbalance. Existing meshfine-02 post-closure·pressure fullsuite 유지. |
|
||
| MFE-C27 | 0, 1, 2, 3, 4, 5, 6, 7 | `EigenReferenceCases.MfeC27FreshAndRepeatedEvidence`<br>`tests/reference/eigen_reference_cases_test.cpp` | 모든 Step RED/GREEN/full 실제exits/warnings/identity; 같은 binary/runtime/thread/input3회 CSR/row/diagnostic exact와 scalar/projector. Fresh binary/source/result evidence·canonical reports, 독립Physics/Release는 후속gate. |
|
||
|
||
C07은 추가 `Mitc4ShellMass.MfeC07InvalidMassGeometry`, C08은
|
||
`LinearFrequencyProcedure.MfeC08PartialBcEigenvalue`, C24는
|
||
`FrequencyApplication.MfeC24PreservesFinalAndState`, comparator 음성/경계는
|
||
`EigenReferenceComparison.MfeC25PrechecksAndToleranceBoundaries`를 mandatory로 둔다.
|
||
각 companion은 해당 Step의 discovery에서 확인하고 record한다.
|
||
|
||
## V3. 전체 must requirement 대응
|
||
|
||
전27개 requirement의 NR case mapping을 그대로 옮겨 실행 Step에 연결했다. Requirement025의
|
||
Implementation evidence는 여기서 준비하되 독립 Physics/Release gate는 후속 owner가 수행한다.
|
||
|
||
| Requirement ID | Required NR cases | Implementation steps |
|
||
| --- | --- | --- |
|
||
| FEM-REQ-MITC4-EIGEN-001 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-003 | MFE-C06, MFE-C07, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-004 | MFE-C01, MFE-C02, MFE-C07 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
|
||
| FEM-REQ-MITC4-EIGEN-005 | MFE-C01, MFE-C02, MFE-C03 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
|
||
| FEM-REQ-MITC4-EIGEN-006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
|
||
| FEM-REQ-MITC4-EIGEN-007 | MFE-C06, MFE-C13, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
|
||
| FEM-REQ-MITC4-EIGEN-009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 | [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md) |
|
||
| FEM-REQ-MITC4-EIGEN-014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
|
||
| FEM-REQ-MITC4-EIGEN-015 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-016 | MFE-C07, MFE-C21, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-017 | MFE-C24, MFE-C25 | [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-019 | MFE-C21, MFE-C22, MFE-C24 | [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-020 | MFE-C25, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-021 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-022 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-023 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-025 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
| FEM-REQ-MITC4-EIGEN-026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
|
||
| FEM-REQ-MITC4-EIGEN-027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
|
||
|
||
## V4. I/O obligation 대응
|
||
|
||
| Obligation ID | Steps | Positive/negative evidence |
|
||
| --- | --- | --- |
|
||
| IO-T01 | 0, 5, 6, 7 | C23; 원본 unchanged semantic snapshot/source warnings→actual backend→HDF5. |
|
||
| IO-T02 | 0, 2 | C01/02/06/07; material/section/rho/t 관계와 semantic/kernel negative inventory. |
|
||
| IO-T03 | 0, 6 | C07/13/23; exact parameter/slot/count/procedure/BC 실패와 exit category. |
|
||
| IO-T04 | 0, 2, 3, 5 | C06/13/14/24; source renumbering/ambiguity와 actual BC의 rank/복원. |
|
||
| IO-T05 | 3, 5, 6, 7 | C16/19/24; O1~O5/Nvectors/all-c raw metrics, source identity와 sameML replay. |
|
||
| IO-T06 | 4, 5, 6 | C17/18/19/21/22; actual API와 injected failure/budget/availability history. |
|
||
| IO-T07 | 5, 6 | C24; solve/validation/log/lease/write/flush/close/reopen/selfcheck/replace 전 failure matrix. |
|
||
| IO-T08 | 7 | C25; all-row parser/schema/identity finite prechecks, Freq structure-only mutation. |
|
||
| IO-T09 | 7 | C25; existing policy inclusive boundaries/near-zero/S0·singleton RMS independently checked. |
|
||
| IO-T10 | 0, 1, 6, 7 | C26/27; density없는static/parser/schema 보존·fresh portfolio·mode-shape reference 미요구. |
|
||
| IO-T11 | 0, 1, 2, 3, 4, 5, 6, 7 | C27; step별 meaningfulRED/실제fullcounts/새warning0/3repeat·freshhash. |
|
||
|
||
## V5. 수학·backend·schema의 누락 방지
|
||
|
||
| Upstream item | Implementation / independent evidence |
|
||
| --- | --- |
|
||
| Mass M1~M10 | Step2 C01~07; sign S=-[d]x, exact quadrature order, original moments, two matrix energy/centroid/Jensen, no artificial drill |
|
||
| Stabilization S1~S8 | Step1 C08~12, Step3/5 partial-BC original pencil, Step7 static fresh portfolio; old formula만 대체 |
|
||
| Eigen E1~E5 | Step3 C13~16; D,C,P,Z,L과 DOF pattern owner, exact ranks/rcond/zero branches/original residual 보존 |
|
||
| Eigen E6/E7 + C5/C6 | Step4 actual FEAST·all count/status history, per-call fpm128·seed/QR·thread restore·index/allocation/capacity·유한 budgets |
|
||
| V1~V5 + C1~C4 | Step5 all-c original ML residual/Gram/energy/rhoB/rigid/scale/projector; Step7 N persistent replay |
|
||
| Eigen E8 + IO-M2 | Step5 candidate, Step6 final replacement 후 noexcept swap, all failure matrix/oldfinal hash; zero-byte log 독립 |
|
||
| I1~I6 | Step0 grammar/source/semantic positives+negatives, Step6 actual CLI exits/stable warnings; sourceN와 internalc 분리 |
|
||
| O1/O2 | Step6 discriminant/types/mandatory metadata/model identities/source_records/densities; Step7 input-byte identity |
|
||
| O3 | Step5 raw paired N/cluster/classification/frequency subset/sign, Step6 N×nn×6 persistence/units/constraint0 |
|
||
| O4/O5 | Step4/5 all-c evidence source, Step6 exact schema/fpm128/available flags/readback/relations/self-check |
|
||
| IO-M3/M4 + common tolerance | Step7 full-row TXT/source join10singleton/Value only; external Freq/vector gate 없음; static roles 보존 |
|
||
|
||
원 full K/M 및 independent particle/polynomial 기대값은 solve의 reduced A나 serializer 자기
|
||
복사에서 생성하지 않는다. Self-check는 저장 일관성 검사이며 independent physics를 대신하지 않는다.
|
||
FEAST의 documented count는 무조건 completeness theorem이 아니다. Count/empty-prefix/guard/
|
||
solve-count/전체 c residual·Gram 및 known spectra를 함께 확보한다.
|
||
|
||
## V6. Fresh reference 실행과 보고서
|
||
|
||
새 eigen 원본은 [reference-model](reference-model.md)의 input/TXT를 그대로 사용한다.
|
||
Step7의 unique generated execution directories 아래 bytes를 복사하고 FesaApplication을 실제
|
||
호출한다. Reference 전후 SHA-256/byte size/mtime, copied input exact bytes, actual binary/lib
|
||
SHA-256, start/end/exit, final h5/log hash를 기록한다. Metadata source path는 실제 copied lexical
|
||
input path와 맞아야 하며 원본과는 byte identity를 따로 확인한다.
|
||
|
||
Fresh eigen 세 run은 같은 input bytes/runtime/thread/settings를 사용한다. 각 run10modes,
|
||
nf3750/nz625/n3125와 all-c checks/call histories, N persistent vectors의 sameML 원 residual을
|
||
확인한다. Same-input deterministic replay는 각 run을 같은 lexical input path에서 직접 solver로
|
||
재실행한 뒤 run별 결과를 고유 evidence directory로 복사해 비교할 수 있다. 복사본 schema의
|
||
source path는 원 실행 path 그대로 보존한다. 모드 벡터 외부 reference는 요구하지 않는다.
|
||
|
||
Count x의3125²×8=78,125,000bytes는 한 scratch allocation 크기다. 실제 reference test process의
|
||
peak working set/private memory를 관찰해 peak 측정 범위와 PID/command를 기록한다.
|
||
이 수를 전체 peak나 sparse shifted fill로 대체하지 않는다. Process 전체 peak는 solver-only
|
||
allocation peak의 upper bound임을 구분한다. 관찰은 managed test process의 actual exit까지
|
||
연결하고 unobserved detached 실행은 하지 않는다.
|
||
|
||
Static portfolio는 [기존 요구](requirements-evidence.md#필수-회귀-포트폴리오와-identity)의
|
||
8개 required/review-only artifacts와 같은 input/source identity를 사용한다. Existing comparator의
|
||
artifact disposition을 적용하여 제외 stress/RM3를 새 mandatory로 만들지 않는다.
|
||
`shell-s4`/`shell-s4-linear-limit`는 같은 fresh solve를 두 역할에 쓸 수 있으나 보고서는
|
||
분리한다. Nonlinear final factor1 accepted-state/U blocking/UR warning/RF1..3와 spatial RM1..2
|
||
review-only, internal force/moment balance blocking은 보존한다. Registered
|
||
`shellnl-meshfine-02-s4-final`는 별도 post-closure 역할이며 pressure를 포함한 기존 full suite도
|
||
실행한다. 기존 reports는 수정하지 않고 현재 r2 새 evidence를 남긴다.
|
||
|
||
Future outputs는 Step7의 `implementation-report.md`, `build-test.md`,
|
||
`reference-comparison.md`, `reference-comparison-detail.md`다. Step별
|
||
`implementation-stepN-evidence.md`와 prep evidence는 실제 실행 때만 생성한다.
|
||
Final canonical3 보고서는 같은 r2의 실제 command/exit/count/수치·원본보존·실제 미실행 내역·전체
|
||
requirement trace를 연결한다. 마지막 registered Stop/actual exit가 아직 미관찰이면 확인 대기로
|
||
구분하며 Executor 종료 뒤 Coordinator의 management 사후 감사를 받는다. Physics/Release
|
||
판정과 외부 release 권한을 대신하지 않는다.
|
||
|
||
## V7. 계획 정적 감사
|
||
|
||
정적 감사에서 actual `StepExecutor`의 read/validation methods만 호출했다. Executor 실행,
|
||
CMake/CTest/Python tests, 실제 FEAST 또는 reference solve는 호출하지 않았다.
|
||
첫 감사는 Step2의 `mitc4_shell.h`에 대응하는 기존 C++ test의 owned 목록 누락을 찾아 exit1이었다.
|
||
`mitc4_shell_test.cpp`를 같은 Step index/Markdown에 추가한 뒤 전체 audit exit0을 확인했다.
|
||
Local link target 검사에서 발견한 I/O M1 anchor 두 곳도 실제 heading으로 수정했다.
|
||
|
||
최종 read-only command의 actual exit0 결과: prep1/main8, 계획 산출물16, owned path128회
|
||
(고유110), 모든 Step의 upstream22 입력, must27/NR27/I/O11, 필수 신규 test 이름40개,
|
||
local Markdown links575개, 누락/anchor warning0. 기존 top index의5개 entry/status/history는
|
||
HEAD와 deep equality다. 모든 새 Step은 pending이며 JSON/Markdown owned 목록이 동일하다.
|
||
최초 `git diff --check` exit0은 unstaged diff만 검사하여 당시 untracked 신규 파일을
|
||
포함하지 않았다. 별도 line trailing whitespace 검사도 여분 EOF blank를 검출하지 못했다.
|
||
Root의 checkpoint staged 검사에서 EOF blank3개를 발견하여 지정된3파일만 정리했다.
|
||
아래 전체 산출물 검사는 EOF newline/여분 blank 검사까지 보완한 뒤 actual exit0을 확인했다.
|
||
Root의 재staging과 staged 검사는 별도 소유 작업이며 여기서 그 성공을 선기록하지 않는다.
|
||
Hash는 아래 command가 산출한 SHA-256을 handoff에 기록한다. Bundle digest는 sorted path,
|
||
NUL, raw bytes를 이어 hash하며 자기 digest를 이 문서에 삽입하지 않는다.
|
||
|
||
아래는 workspace root에서 수행한 정확한 read-only 감사 command다. Test 이름 검사는
|
||
**계획 inventory/regex/등록 target의 정적 일관성**이며 아직 존재하지 않는 C++ test의 실제
|
||
discovery/실행 성공을 주장하지 않는다. 해당 실제 검증은 각 Implementation Step의 AC다.
|
||
|
||
```powershell
|
||
@'
|
||
import hashlib,json,re,subprocess
|
||
from pathlib import Path
|
||
from urllib.parse import unquote
|
||
from scripts.execute import StepExecutor
|
||
root=Path.cwd(); feature="mitc4-shell-feast-eigen"; doc=root/"docs"/feature
|
||
phases=[feature+"-execution-prep",feature]
|
||
artifacts=[doc/n for n in ("implementation-plan.md","implementation-environment.md","implementation-interfaces.md","implementation-verification.md")]
|
||
artifacts += [root/"phases"/"index.json"]
|
||
counts=[]; owners=[]; names=[]; steps=[]
|
||
required=["FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","requirements.md","requirements-evidence.md","research.md","research-evidence.md","formulation.md","formulation-mass.md","formulation-eigen.md","formulation-verification.md","formulation-stabilization.md","numerical-review.md","numerical-review-evidence.md","numerical-review-controls.md","numerical-review-cases.md","reference-model.md","io.md","io-input.md","io-schema.md","io-mapping.md"]
|
||
assert all((doc/n).is_file() for n in required)
|
||
for phase in phases:
|
||
ex=StepExecutor(phase); ex._read_top_index(); data=ex._read_phase_index()
|
||
assert all(s["status"]=="pending" for s in data["steps"])
|
||
artifacts.append(root/"phases"/phase/"index.json"); counts.append(len(data["steps"]))
|
||
for step in data["steps"]:
|
||
path=root/"phases"/phase/f'step{step["step"]}.md'
|
||
artifacts.append(path); steps.append((phase,step,path))
|
||
body=path.read_text(encoding="utf-8"); owned=ex._step_owned_paths(step)
|
||
for p in owned: ex._validate_owned_file(p)
|
||
assert list(owned)==json.loads(re.search(r"\x60{3}json\n(.*?)\n\x60{3}",body,re.S)[1]),path
|
||
assert all(f"docs/{feature}/{p}" in body for p in required),path
|
||
assert all(x in body for x in ("Input contract revision:","implementation-interfaces.md","RED","GREEN","Full VERIFY","error_message","blocked_reason","actual exit","사후 감사")),path
|
||
assert len(owned)>0
|
||
owners.extend(owned)
|
||
if phase==feature:
|
||
inv=body.split("### 필수 신규 test discovery inventory\n",1)[1].split("## Full VERIFY",1)[0]
|
||
planned=re.findall(r"^- \x60([^\x60]+)\x60",inv,re.M)
|
||
regex=re.search(r"-R '([^']+)'",body)[1]
|
||
assert planned and all(re.search(regex,n) for n in planned),(path,planned,regex)
|
||
names.extend(planned); assert "--target fesa_tests" in body
|
||
for p in owned:
|
||
if p.startswith(("src/fesa/","include/fesa/")) and Path(p).suffix in (".cpp",".h"):
|
||
stem=Path(p).stem+"_test.cpp"
|
||
assert any(Path(t).name==stem and t.startswith("tests/") for t in owned),(path,p)
|
||
base=json.loads(subprocess.check_output(["git","show","HEAD:phases/index.json"],text=True))
|
||
top=json.loads((root/"phases/index.json").read_text(encoding="utf-8"))
|
||
assert top["phases"][:-2]==base["phases"]
|
||
assert [p["dir"] for p in top["phases"][-2:]]==phases
|
||
assert counts==[1,8] and len(artifacts)==16
|
||
v=(doc/"implementation-verification.md").read_text(encoding="utf-8")
|
||
nr=(doc/"numerical-review-cases.md").read_text(encoding="utf-8")
|
||
reqmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| (\d{3}) \| ([^|]+) \|",nr,re.M)}
|
||
planmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| FEM-REQ-MITC4-EIGEN-(\d{3}) \| ([^|]+) \|",v,re.M)}
|
||
assert reqmap==planmap and len(planmap)==27
|
||
assert len(re.findall(r"^\| MFE-C\d{2} \|",v,re.M))==27
|
||
assert len(re.findall(r"^\| IO-T\d{2} \|",v,re.M))==11
|
||
primary=re.findall(r"^\| MFE-C\d{2} \| [^|]+\| \x60([^\x60]+)\x60",v,re.M)
|
||
assert len(primary)==27 and set(primary)<=set(names)
|
||
links=0; anchor_warnings=[]
|
||
def slug(s):
|
||
s=s.replace(chr(96),"").strip().lower()
|
||
s=re.sub(r"[^\w\- ]","",s)
|
||
return s.replace(" ","-")
|
||
for p in artifacts:
|
||
body=p.read_text(encoding="utf-8")
|
||
assert body.endswith("\n") and not body.endswith("\n\n"),p
|
||
assert not any(line.rstrip()!=line for line in body.splitlines()),p
|
||
if p.suffix!=".md": continue
|
||
for target in re.findall(r"\[[^\]]+\]\(([^)]+)\)",body):
|
||
if re.match(r"^[a-z]+://",target): continue
|
||
pathpart,_,anchor=unquote(target.strip("<>")).partition("#")
|
||
linked=(p.parent/pathpart).resolve() if pathpart else p
|
||
assert linked.is_file(),(p,target)
|
||
links+=1
|
||
if anchor and linked.suffix==".md":
|
||
headings=[slug(h) for h in re.findall(r"^#+ (.+)$",linked.read_text(encoding="utf-8"),re.M)]
|
||
if anchor not in headings: anchor_warnings.append((p.relative_to(root).as_posix(),target))
|
||
for p in ("implementation-report.md","build-test.md","reference-comparison.md","physics-evaluation.md","release.md"):
|
||
assert not (doc/p).exists(),p
|
||
cm=(root/"tests/CMakeLists.txt").read_text(encoding="utf-8")
|
||
assert re.search(r"add_custom_target\(\s*fesa_tests\s+DEPENDS\s+fesa_unit_tests\s+fesa_integration_tests\s+fesa_reference_tests",cm)
|
||
diff=subprocess.run(["git","diff","--check","--"]+[p.relative_to(root).as_posix() for p in artifacts],capture_output=True,text=True)
|
||
assert diff.returncode==0,diff.stdout+diff.stderr
|
||
digest=hashlib.sha256()
|
||
for p in sorted(artifacts):
|
||
digest.update(p.relative_to(root).as_posix().encode());digest.update(b"\0");digest.update(p.read_bytes())
|
||
print(json.dumps({"phase_steps":counts,"artifacts":len(artifacts),"owned_path_occurrences":len(owners),"unique_owned_paths":len(set(owners)),"required_inputs":len(required),"requirement_rows":len(planmap),"nr_cases":len(primary),"io_obligations":11,"mandatory_test_names":len(names),"local_links":links,"anchor_warnings":anchor_warnings,"git_diff_check":diff.returncode,"bundle_sha256":digest.hexdigest()},ensure_ascii=False))
|
||
for p in artifacts[:4]: print(p.name,hashlib.sha256(p.read_bytes()).hexdigest())
|
||
'@ | python -B -
|
||
```
|
||
|
||
관리 문서 `coordination.md`의 동시 owner 변경은 이 계획 patch에 포함하지 않았다.
|
||
현재 실행 준비 완료는 계획 materialization을 뜻한다. Native transport, prep 실제 full VERIFY/
|
||
등록 Stop 및 새 main invocation의 구현·FEAST/reference 성공은 후속 execution evidence가 필요하다.
|