Files
FESADev/phases/mitc4-shell-feast-eigen/step6.md
T

186 lines
17 KiB
Markdown

# Step 6: Additive HDF5와 CLI candidate transaction
> **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다.
> MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다.
> 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다.
> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다.
> 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고,
> functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다.
> `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다.
> Executor가 이미 만든 top/current control dirty 상태는 보호 snapshot이며 구현 소유권 위반으로 단정하지 않는다.
> 선택 Step의 result fields만 반환하고 timestamps/history/다른 metadata는 변경하지 않는다.
> 이미 GREEN인 source를 RED를 만들기 위해 되돌리지 않는다. 새로운 production 변경에는 원래 test-first 계약을 적용한다.
- Feature ID: `mitc4-shell-feast-eigen`
- Plan owner: `implementation-planning-agent`
- Execution owner: `implementation-agent`
- Input contract revision: `r2`
- Phase: `mitc4-shell-feast-eigen`
- Dependency: 동일 phase의 Step 5 completed
- Requirement IDs: `FEM-REQ-MITC4-EIGEN-001`, `FEM-REQ-MITC4-EIGEN-015`, `FEM-REQ-MITC4-EIGEN-016`, `FEM-REQ-MITC4-EIGEN-017`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-019`, `FEM-REQ-MITC4-EIGEN-021`, `FEM-REQ-MITC4-EIGEN-024`
- Logical cases: `MFE-C19`, `MFE-C23`, `MFE-C24`, `MFE-C26`
- I/O obligations: `IO-T01`, `IO-T03`, `IO-T05`, `IO-T07`, `IO-T08`, `IO-T10`
## 필수 입력과 계약
Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다.
- [AGENTS.md](../../AGENTS.md)
- [docs/SOLVER_AGENT_DESIGN.md](../../docs/SOLVER_AGENT_DESIGN.md)
- [docs/FEATURE_DOCUMENTATION.md](../../docs/FEATURE_DOCUMENTATION.md)
- [docs/PRD.md](../../docs/PRD.md)
- [docs/ARCHITECTURE.md](../../docs/ARCHITECTURE.md)
- [docs/ADR.md](../../docs/ADR.md)
- [docs/CODINGSTYLE.md](../../docs/CODINGSTYLE.md)
- [docs/TOLERANCE.md](../../docs/TOLERANCE.md)
- [.codex/skills/fem-implementation-tdd/SKILL.md](../../.codex/skills/fem-implementation-tdd/SKILL.md)
- [.agents/skills/harness/SKILL.md](../../.agents/skills/harness/SKILL.md)
- [.codex/agents/implementation-agent.toml](../../.codex/agents/implementation-agent.toml)
- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md)
- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md)
- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md)
- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md)
- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md)
- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md)
- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md)
- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md)
- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md)
- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md)
- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md)
- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md)
- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md)
- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md)
- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md)
- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md)
- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md)
- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md)
- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md)
- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md)
- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md)
- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md)
- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md)
- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md)
- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md)
- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)
이 Step의 직접 계약: [io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m2-backend와-failure-lifecycle), [io-input.md#i6-fail-closed-validation과-diagnostics](../../docs/mitc4-shell-feast-eigen/io-input.md#i6-fail-closed-validation과-diagnostics), [formulation-eigen.md#e8-mode-identity-normalization과-상태](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e8-mode-identity-normalization과-상태).
논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다.
## Owned paths
다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다.
```json
[
"include/fesa/results/eigen_results_writer.h",
"include/fesa/io/hdf5/eigen_hdf5_results_writer.h",
"src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp",
"src/fesa/io/hdf5/eigen_hdf5_schema.h",
"src/fesa/io/hdf5/eigen_hdf5_schema.cpp",
"src/fesa/io/hdf5/hdf5_model_writer.h",
"src/fesa/io/hdf5/hdf5_model_writer.cpp",
"tests/unit/results/eigen_results_writer_test.cpp",
"tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp",
"tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp",
"tests/unit/io/hdf5/hdf5_model_writer_test.cpp",
"src/fesa/CMakeLists.txt",
"tests/CMakeLists.txt",
"include/fesa/analysis/prepared_analysis.h",
"src/fesa/analysis/prepared_analysis.cpp",
"src/fesa/app/fesa_application.cpp",
"tests/unit/analysis/prepared_analysis_test.cpp",
"tests/integration/app/fesa_application_test.cpp",
"tests/integration/app/frequency_application_test.cpp",
"tests/integration/analysis/linear_frequency_procedure_test.cpp",
"docs/mitc4-shell-feast-eigen/implementation-step6-evidence.md"
]
```
## 같은 session의 behavior별 TDD
각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다.
### 1. Additive eigen HDF5 write/self-check
Symbols: `EigenResultsWriter::Write; EigenHdf5ResultsWriter::Write; hdf5_internal::WriteEigenSchema/SelfCheckEigen; model-only WriteModelData`.
**RED:** 독립 HDF5 C API reader test에서 O1~O5 inventory의 exact types/compound fields/shapes/attributes를 기대해 missing writer/schema failure를 관찰한다. N/c/request/source Step-2 vs group Step-1, negative/zero/positive frequencies, flags/units/source records/128 fpm를 검증한다. Missing/duplicate/extra mode/nonfinite/wrong procedure/mass/backend/dimension 및 reopen/self-check failure를 각각 주입한다. 기존 static schema0/1 reader test도 실행한다.
**Minimal GREEN:** 새 eigen serializer/self-check를 별도 private module로 구현한다. 기존 model writer에서 metadata-free model dataset 작성 seam만 분리해 공유하며 static WriteModel의 output은 보존한다. N persistent vectors, all-c scalar metrics/call history와 exact source identity를 쓴다. Candidate write/flush/close/reopen/self-check 후 기존 AtomicFinalizeValidatedCandidate를 사용한다. HDF5/Win32 types는 private이고 official final path 계약은 그대로다. Static result/reaction/accepted_frames를 eigen에 만들지 않는다.
**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다.
### 2. CLI dispatch, log/lock와 final-state transaction
Symbols: `PreparedAnalysisOutcome frequency variant; ExecutePreparedAnalysis/FinalizePreparedAnalysisResult frequency overload; FesaApplication::Run`.
**RED:** FesaApplication의 유일 CLI 입력으로 small frequency file을 실행해 lexical sibling h5/log와 exit0를 기대한다. 원본 no-op provenance와 stable source diagnostics, input/model/solver/output exit3/4/5/6를 검사한다. 기존 final/state hash를 준비하고 solve, validation, log open/close, lease, write/flush/close/reopen/self-check/replace failure를 각각 주입한다. First-run failure는 final 부재를 검사한다.
**Minimal GREEN:** Prepared boundary에 별도 frequency executor/result/writer를 선택하는 overload를 추가하며 static 호출부 호환성을 유지한다. 기존 exclusive lease→log open/truncate→prepare/execute→log close→candidate finalization 순서에 연결한다. Eigen 정상 log는0bytes. Final replacement 성공 뒤 이미 준비된 EigenAnalysisState의 noexcept swap만 수행한다. 실패 state/final 보존을 generic 성공 bool로 숨기지 않는다. 테스트 주입 seam은 기존 private/injected interfaces 안에 두며 public CLI 옵션은 추가하지 않는다.
**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다.
## Focused 명령
Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다.
```powershell
$env:CMAKE_BUILD_PARALLEL_LEVEL = '1'
cmake --preset mfe-workspace-msvc-ninja-debug
cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests
ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenResultsWriter|EigenHdf5ResultsWriter|EigenHdf5Schema|Hdf5ModelWriter|Hdf5ResultsWriter|NonlinearHdf5ResultsWriter|Hdf5WriterComponents|PreparedAnalysis|FrequencyApplication|FesaApplication|LinearFrequencyProcedure|ShellSurfacePressureApplication)\.' --show-only=json-v1
ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenResultsWriter|EigenHdf5ResultsWriter|EigenHdf5Schema|Hdf5ModelWriter|Hdf5ResultsWriter|NonlinearHdf5ResultsWriter|Hdf5WriterComponents|PreparedAnalysis|FrequencyApplication|FesaApplication|LinearFrequencyProcedure|ShellSurfacePressureApplication)\.' --output-on-failure
```
Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다.
### 필수 신규 test discovery inventory
- `EigenHdf5Schema.MfeC24RoundTripAndRejection`
- `FrequencyApplication.MfeC24PreservesFinalAndState`
- `EigenHdf5ResultsWriter.MfeC24AtomicCandidateFailures`
- `PreparedAnalysis.MfeC23DispatchesFrequency`
- `Hdf5ModelWriter.MfeC26StaticInventoryPreserved`
위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다.
## Full VERIFY
현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다.
```powershell
$env:CMAKE_BUILD_PARALLEL_LEVEL = '1'
cmake --preset mfe-workspace-msvc-ninja-debug
if ($LASTEXITCODE -ne 0) { throw 'configure failed' }
cmake --build --preset mfe-workspace-msvc-ninja-debug
if ($LASTEXITCODE -ne 0) { throw 'build failed' }
ctest --preset mfe-workspace-msvc-ninja-debug --show-only=json-v1
if ($LASTEXITCODE -ne 0) { throw 'discovery failed' }
ctest --preset mfe-workspace-msvc-ninja-debug --output-on-failure
if ($LASTEXITCODE -ne 0) { throw 'full CTest failed' }
$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe'
$mfePytestCache = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-cache'
$mfePytestBase = Join-Path (Get-Location).Path ('.harness/build/p-' + [guid]::NewGuid().ToString('N').Substring(0,8))
if ($mfePytestBase.Length -gt 80 -or (Test-Path -LiteralPath $mfePytestBase)) { throw 'Fresh short pytest basetemp required' }
& $mfePython -B -X utf8 -m pytest -v -rs -o "cache_dir=$mfePytestCache" "--basetemp=$mfePytestBase"
if ($LASTEXITCODE -ne 0) { throw 'full pytest failed' }
```
전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 6에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다.
## Evidence와 종료
- `docs/mitc4-shell-feast-eigen/implementation-step6-evidence.md`
이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored `.harness/build/mitc4-eigen-evidence/step6/`에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다.
보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다.
Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 6만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step6-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다.
## 제외와 중단 조건
Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다.