460 lines
20 KiB
Markdown
460 lines
20 KiB
Markdown
# FESA Session Handoff
|
|
|
|
## 1. 문서 목적
|
|
|
|
이 문서는 results-and-pipeline과 abaqus-subset-completion 완료 후 새 세션에서
|
|
deterministic-parallel-assembly Phase를 바로 시작하기 위한 인수인계 기록이다.
|
|
요구사항과 설계의 기준은 이 문서가 아니라 다음 파일이다.
|
|
|
|
- /AGENTS.md
|
|
- /docs/PRD.md
|
|
- /docs/ARCHITECTURE.md
|
|
- /docs/ADR.md
|
|
- /docs/HARNESS.md
|
|
- /docs/ABAQUS_INPUT_SUBSET.md
|
|
- /docs/HDF5_SCHEMA.md
|
|
- /phases/deterministic-parallel-assembly/index.json
|
|
- /phases/deterministic-parallel-assembly/step0.md부터 step2.md
|
|
|
|
내용이 충돌하면 AGENTS.md, 제품·아키텍처 문서와 phases/의 현재 상태를 우선한다.
|
|
이 문서는 현재 구현, 검증 baseline과 실행환경에서 특히 놓치기 쉬운 계약을
|
|
보충한다.
|
|
|
|
## 2. 현재 저장소 상태
|
|
|
|
2026-08-01 확인 기준:
|
|
|
|
- 기준 브랜치: dev
|
|
- 이 HANDOFF 작성 직전 구현 HEAD: cbb621bb282a301b6708d95ff697b40644188e46
|
|
- cbb621b는 abaqus-subset-completion의 최종 보완 commit이다.
|
|
- 이 문서는 cbb621b 다음 commit으로 dev에 기록하고 origin/dev에 함께 push한다.
|
|
새 세션에서는 아래 명령으로 실제 동기화 상태를 다시 확인한다.
|
|
- 완료 Phase:
|
|
- solver-bootstrap
|
|
- domain-and-input-skeleton
|
|
- fem-and-beam-kernel
|
|
- equation-and-linear-solve
|
|
- results-and-pipeline
|
|
- abaqus-subset-completion
|
|
- 다음 Phase: deterministic-parallel-assembly
|
|
- 다음 Step: 0 - canonical-contribution-order
|
|
- deterministic-parallel-assembly의 Step 0~2는 모두 pending이다.
|
|
- 후속 Phase인 result-contract-completion, beam-reference-qualification,
|
|
internal-release도 아직 pending이다.
|
|
- feat-abaqus-subset-completion은 dev에 fast-forward 병합된 뒤 삭제되었다.
|
|
- 이 문서 갱신 전 작업 트리는 clean이었다.
|
|
|
|
새 세션에서 원격에 맞추기 위한 reset, rebase, force push를 수행하지 않는다.
|
|
먼저 다음 상태를 확인하고 dev와 origin/dev가 다르면 원인을 조사한다.
|
|
|
|
git switch dev
|
|
git status --short --branch
|
|
git rev-parse HEAD
|
|
git rev-parse origin/dev
|
|
git rev-list --left-right --count origin/dev...dev
|
|
|
|
## 3. 완료된 results-and-pipeline
|
|
|
|
Phase metadata는 /phases/results-and-pipeline/index.json에 기록되어 있으며 Step
|
|
0~3이 모두 completed다.
|
|
|
|
주요 결과:
|
|
|
|
- HDF5 API에 의존하지 않는 ResultDatabase, ResultStep, ResultFrame, NodalFrame
|
|
semantic model과 results-stage validation
|
|
- /docs/HDF5_SCHEMA.md의 schema 1.0.0 계약
|
|
- move-only HDF5 RAII writer와 public reader round trip
|
|
- serial assembly, essential BC, PARDISO, full reconstruction과 reaction recovery를
|
|
조율하는 LinearStaticAnalysis
|
|
- free equation이 0인 all-constrained 해석의 PARDISO 우회
|
|
- parser부터 HDF5 writer까지 연결하는 run_solver와 solve CLI
|
|
- fesa solve <model.inp> --output <results.h5> 수직 파이프라인
|
|
|
|
관련 파일:
|
|
|
|
- /include/fesa/results/
|
|
- /src/fesa/results/
|
|
- /include/fesa/io/hdf5/
|
|
- /src/fesa/io/hdf5/
|
|
- /include/fesa/analysis/
|
|
- /src/fesa/analysis/
|
|
- /include/fesa/analysis/run_solver.hpp
|
|
- /src/fesa/analysis/run_solver.cpp
|
|
- /docs/HDF5_SCHEMA.md
|
|
- /tests/integration/pipeline/minimal_cantilever_test.cpp
|
|
|
|
핵심 계약:
|
|
|
|
- results semantic model은 HDF5 타입이나 handle을 노출하지 않는다.
|
|
- 모든 HDF5 resource는 adapter 내부의 move-only RAII wrapper가 소유한다.
|
|
- nodal result의 node ID와 6성분 displacement/reaction 배열 순서는 DofManager의
|
|
full-vector 순서와 일치한다.
|
|
- 반력은 reduced system이 아니라 원래 full system의 r=Ku-f에서 계산한다.
|
|
- all-constrained system은 유효한 analysis case이며 PARDISO order 0 입력으로
|
|
전달하지 않는다.
|
|
- CLI와 run_solver는 parser, semantic mapper, analysis와 writer를 조율하는
|
|
application orchestration 경계다. LinearStaticAnalysis 자체는 parser나 HDF5를
|
|
호출하지 않는다.
|
|
- CTest의 CLI test에는 설치된 oneAPI/HDF5 runtime PATH가 test property로
|
|
전달된다. 기본 셸 PATH에 해당 디렉터리가 없어도 CTest가 성공해야 한다.
|
|
|
|
이 vertical slice 완료는 요소 결과 계약, Abaqus reference 자격 또는 내부 배포
|
|
완료를 의미하지 않는다.
|
|
|
|
## 4. 완료된 abaqus-subset-completion
|
|
|
|
Phase metadata는 /phases/abaqus-subset-completion/index.json에 기록되어 있으며
|
|
Step 0~4가 모두 completed다.
|
|
|
|
주요 결과:
|
|
|
|
- /docs/ABAQUS_INPUT_SUBSET.md에 Phase 1 입력 계약을 명문화
|
|
- public parser/mapper fixture matrix를 74 cases로 확대
|
|
- strict keyword scope, parameter form, data ownership과 정확한 source diagnostic
|
|
- Part/Assembly의 명시적, GENERATE, nested, forward set resolution
|
|
- flat mesh 또는 좌표변환 없는 단일 Part/Assembly/Instance 선택
|
|
- 전역 material, Part-local Beam section과 ELSET assignment
|
|
- 명시적 transverse shear와 Phase 1 기본값 Asy=Asz=5A/6, SCF=0
|
|
- 단일 Step/Static, Boundary, Cload와 명시적 no-op directive
|
|
- active Part뿐 아니라 inactive Part의 NODE, ELEMENT, section record와 reference
|
|
유효성 검증
|
|
|
|
관련 파일:
|
|
|
|
- /docs/ABAQUS_INPUT_SUBSET.md
|
|
- /include/fesa/io/abaqus/active_input.hpp
|
|
- /include/fesa/io/abaqus/set_resolver.hpp
|
|
- /src/fesa/io/abaqus/parser.cpp
|
|
- /src/fesa/io/abaqus/active_input.cpp
|
|
- /src/fesa/io/abaqus/set_resolver.cpp
|
|
- /src/fesa/io/abaqus/semantic_mapper.cpp
|
|
- /tests/fixtures/abaqus/contract.tsv
|
|
- /tests/unit/io/abaqus/
|
|
- /tests/integration/io/minimal_deck_to_domain_test.cpp
|
|
|
|
특히 유지할 계약:
|
|
|
|
- 사용되지 않는 Part는 파싱·record/reference validation하지만 Domain에는 넣지 않는다.
|
|
- NODE와 ELEMENT data row의 field 수는 정확해야 한다.
|
|
- enum 값 B31과 GENERAL은 대소문자를 구분하지 않는다.
|
|
- 계층형 Step의 Boundary/Cload target은 Assembly node set으로 해석한다.
|
|
- 모든 active B31 element만 정확히 하나의 section assignment를 가져야 한다.
|
|
inactive Part의 완전한 해석 가능성을 요구하도록 범위를 넓히지 않는다.
|
|
- missing_section diagnostic은 element keyword가 아니라 해당 element data row를
|
|
source로 사용한다.
|
|
- unsupported keyword/parameter를 일반 ignore 경로로 숨기지 않는다.
|
|
- Heading, Preprint, Restart, Output만 문서화된 조건에서 no-op으로 허용한다.
|
|
|
|
최종 독립 review에서 Critical, Important, Minor finding은 모두 0건이었다.
|
|
|
|
## 5. 현재 serial assembly oracle
|
|
|
|
다음 Phase가 변경할 핵심 코드는 현재 /src/fesa/assembly/serial_assembler.cpp 한
|
|
파일에 private helper로 모여 있다.
|
|
|
|
현재 흐름:
|
|
|
|
1. 모든 full DOF의 diagonal을 포함하는 upper-triangle CSR sparsity pattern 생성
|
|
2. 각 Beam 요소의 compute_beam3d2 호출
|
|
3. local upper triangle 78개를 NumericContribution으로 수집
|
|
4. row, column, EntityOrigin, local_order 순으로 정렬
|
|
5. 같은 row/column을 고정된 순서로 합산
|
|
6. nodal load를 full force vector로 조립
|
|
|
|
관련 public 계약:
|
|
|
|
- /include/fesa/assembly/symmetric_csr.hpp
|
|
- /include/fesa/assembly/equation_system.hpp
|
|
- /include/fesa/assembly/serial_assembler.hpp
|
|
- /src/fesa/assembly/serial_assembler.cpp
|
|
- /tests/unit/assembly/serial_assembler_test.cpp
|
|
|
|
현재 테스트가 고정하는 oracle:
|
|
|
|
- SymmetricCsr는 0-based upper triangle만 저장한다.
|
|
- row_offsets와 column_indices는 유효하며 각 row의 column이 strictly increasing이다.
|
|
- 연결되지 않은 node DOF도 값 0의 diagonal entry를 갖는다.
|
|
- element storage order와 external label 순열이 결과를 바꾸지 않는다.
|
|
- 1 + 1 + 1e16 규모의 contribution은 EntityOrigin 순으로 합산한 bit pattern을
|
|
고정한다.
|
|
- Beam kernel failure를 0 contribution으로 바꾸지 않고 assembly failure로
|
|
전달한다.
|
|
- full force vector의 load accumulation도 기존 결과와 같아야 한다.
|
|
|
|
parallel 구현을 이유로 이 serial oracle을 먼저 변경하거나 tolerance 비교로
|
|
약화하지 않는다.
|
|
|
|
## 6. 검증된 baseline과 개발환경
|
|
|
|
2026-08-01 현재 확인한 도구:
|
|
|
|
- CMake 4.4.0
|
|
- MSBuild 18.8.2.30814
|
|
- Visual Studio 2026 MSVC v145, Windows x64
|
|
- codex-cli 0.146.0
|
|
- Intel oneAPI MKL/TBB 2026.1
|
|
- HDF5 2.1.1
|
|
- GoogleTest 1.17.0, v145 x64 CRT build
|
|
|
|
새 PowerShell 세션에서 configure 또는 Harness 실행 전에 다음 환경 변수를 설정한다.
|
|
절대경로를 tracked CMake 파일이나 Preset에 넣지 않는다.
|
|
|
|
$env:MKL_DIR = "C:\Program Files (x86)\Intel\oneAPI\2026.1\lib\cmake\mkl"
|
|
$env:TBB_DIR = "C:\Program Files (x86)\Intel\oneAPI\2026.1\lib\cmake\tbb"
|
|
$env:HDF5_DIR = "C:\Program Files\HDF_Group\HDF5\2.1.1\cmake"
|
|
$env:GTest_DIR = "C:\Users\baram\AppData\Local\FESA\dependencies\googletest-1.17.0-v145-x64-crt\lib\cmake\GTest"
|
|
|
|
Test-Path "$env:MKL_DIR\MKLConfig.cmake"
|
|
Test-Path "$env:TBB_DIR\TBBConfig.cmake"
|
|
Test-Path "$env:HDF5_DIR\hdf5-config.cmake"
|
|
Test-Path "$env:GTest_DIR\GTestConfig.cmake"
|
|
|
|
네 package config와 다음 h5ls 경로가 존재함을 확인했다.
|
|
|
|
C:\Program Files\HDF_Group\HDF5\2.1.1\bin\h5ls.exe
|
|
|
|
검증 명령:
|
|
|
|
cmake --build --preset windows-debug
|
|
ctest --preset windows-debug --output-on-failure
|
|
uv run --with pytest python -m pytest -v -rs
|
|
|
|
현재 baseline:
|
|
|
|
- MSVC Debug build 성공, 새 warning 없음
|
|
- CTest 49개 중 49개 성공
|
|
- Harness pytest 20개 중 20개 성공
|
|
- pytest가 실제 20개를 수집했으므로 0-test 성공이 아님
|
|
- 최소 cantilever CLI solve와 HDF5 public schema inspection 성공
|
|
|
|
CMake cache가 없거나 package 경로가 바뀐 경우에만 같은 환경 변수 세션에서 먼저
|
|
다음을 실행한다.
|
|
|
|
cmake --fresh --preset windows-debug
|
|
|
|
h5ls를 직접 실행할 때는 HDF5 DLL 외에 Intel libmmd.dll이 필요하다. HDF5 bin만
|
|
PATH에 추가하면 Windows exit 0xC0000135가 발생할 수 있으므로 두 runtime
|
|
디렉터리를 현재 세션 PATH에 추가한다. 시스템 PATH는 영구 변경하지 않는다.
|
|
|
|
$env:PATH = @(
|
|
"C:\Program Files\HDF_Group\HDF5\2.1.1\bin",
|
|
"C:\Program Files (x86)\Intel\oneAPI\2026.1\bin",
|
|
$env:PATH
|
|
) -join ";"
|
|
h5ls --version
|
|
|
|
## 7. 다음 Phase 목표와 Step 순서
|
|
|
|
deterministic-parallel-assembly의 목표는 oneTBB로 요소 계산을 병렬화하면서
|
|
serial oracle과 thread count 사이의 CSR, RHS와 최종 해석 결과를 bit-for-bit
|
|
동일하게 유지하는 것이다.
|
|
|
|
### Step 0 - canonical-contribution-order
|
|
|
|
- serial assembly를 변경하지 않은 상태에서 병렬 경로가 공유할
|
|
MatrixContribution과 canonical merge contract를 분리한다.
|
|
- 입력 순열, 같은 row/column의 여러 element, cancellation과 signed zero를 포함한
|
|
실패 테스트를 먼저 작성한다.
|
|
- 정렬 key는 row, column, stable element identity, local_order다.
|
|
- canonicalize_contributions와 merge_contributions는 하나의 고정 total order와
|
|
하나의 merge 구현만 가져야 한다.
|
|
- 아직 TBB code를 추가하지 않는다.
|
|
|
|
Focused acceptance:
|
|
|
|
cmake --build --preset windows-debug
|
|
ctest --preset windows-debug -R "CanonicalContribution|DeterministicMerge" --output-on-failure
|
|
ctest --preset windows-debug --output-on-failure
|
|
|
|
### Step 1 - tbb-element-evaluation
|
|
|
|
- oneTBB는 독립적인 Beam element evaluation에만 사용한다.
|
|
- worker는 thread-local contribution을 만들며 공유 CSR values에 쓰지 않는다.
|
|
- merge는 Step 0의 canonical serial 순서를 그대로 사용한다.
|
|
- AssemblyOptions의 max_threads와 grain_size로 실행을 제한한다.
|
|
- max_threads=1과 2 이상에서 serial/parallel CSR와 force를 bit-for-bit 비교한다.
|
|
- PARDISO를 TBB task 안에서 호출하지 않는다.
|
|
|
|
Focused acceptance:
|
|
|
|
cmake --build --preset windows-debug
|
|
ctest --preset windows-debug -R "ParallelAssembly|TbbElementEvaluation" --output-on-failure
|
|
ctest --preset windows-debug --output-on-failure
|
|
|
|
### Step 2 - thread-count-determinism
|
|
|
|
- thread count 1, 2, available concurrency에서 CSR, RHS, displacement와 reaction을
|
|
bit-for-bit 비교한다.
|
|
- 최소 10회 반복해 scheduling 변화 회귀를 검사한다.
|
|
- 측정용 fesa_assembly_benchmark를 추가해 serial/parallel 시간과 element count를
|
|
출력한다.
|
|
- benchmark speedup은 환경 의존적이므로 pass 조건으로 만들지 않는다.
|
|
- assembly test 동안 MKL thread 수를 중첩해 키우지 않는다.
|
|
|
|
Focused acceptance:
|
|
|
|
cmake --build --preset windows-debug
|
|
ctest --preset windows-debug -R ThreadCountDeterminism --output-on-failure
|
|
.\out\build\windows-debug\Debug\fesa_assembly_benchmark.exe
|
|
ctest --preset windows-debug --output-on-failure
|
|
|
|
## 8. 구현 전에 정렬할 설계점
|
|
|
|
아래 항목은 범위를 늘리라는 의미가 아니다. Step 계약과 현재 serial oracle 사이에서
|
|
구현 전에 결정하고 테스트로 고정할 최소 질문이다.
|
|
|
|
1. Stable element identity
|
|
- Step 0 초안의 MatrixContribution은 ElementId를 제시한다.
|
|
- 현재 oracle은 EntityOrigin의 instance_name, local_label, part_name 순으로
|
|
정렬한다.
|
|
- ElementId만으로 기존 bit pattern과 storage-order 독립성을 보존할 수 있는지
|
|
먼저 확인한다. 확인 없이 oracle의 정렬 key를 바꾸지 않는다.
|
|
|
|
2. Canonical API와 serial 경로
|
|
- Step 0은 serial assembly를 변경하지 말라고 요구하면서 공통 merge contract를
|
|
분리한다.
|
|
- 먼저 public/internal 경계를 최소화하고, 기존 assemble_serial의 관찰 가능한
|
|
결과가 bit-for-bit 유지되는 테스트를 둔다.
|
|
- 실제 두 번째 사용처가 생기기 전에 범용 registry나 backend hierarchy를 만들지
|
|
않는다.
|
|
|
|
3. Parallel failure ordering
|
|
- worker에서 여러 Beam kernel failure가 발생해도 scheduling 순서로 어느 오류를
|
|
반환할지 결정하면 재현성이 깨진다.
|
|
- shared CSR write나 first-writer-wins exception 상태를 만들지 말고 canonical
|
|
element identity 기준으로 deterministic하게 처리한다.
|
|
|
|
4. AssemblyOptions validation
|
|
- max_threads와 grain_size의 0 의미를 묵시적으로 정하지 않는다.
|
|
- automatic 또는 invalid 중 가장 단순한 계약을 선택하고 focused test로 고정한다.
|
|
|
|
5. Force assembly
|
|
- 현재 RHS는 nodal load를 serial full-vector 순서로 누적한다.
|
|
- 이번 Phase는 element evaluation 병렬화가 목적이다. force accumulation을 별도
|
|
병렬 기능으로 확장하지 말고 serial oracle과 bitwise equality를 유지한다.
|
|
|
|
6. Benchmark 격리
|
|
- benchmark는 제품 correctness test를 우회하는 별도 assembly를 사용하지 않는다.
|
|
- fixed Domain과 production serial/parallel API를 호출한다.
|
|
- speedup이나 release 성능 목표를 임의 assertion으로 추가하지 않는다.
|
|
|
|
## 9. 아키텍처와 범위 경계
|
|
|
|
- oneTBB 의존성은 assembly adapter/implementation 경계에 가둔다.
|
|
- core, model, fem, elements의 public contract에 TBB type을 노출하지 않는다.
|
|
- Beam kernel은 element-local contribution만 계산하고 전역 CSR을 알지 않는다.
|
|
- DofManager가 DOF와 equation mapping을 계속 단독 소유한다.
|
|
- worker는 공유 CSR values에 atomic add하지 않는다.
|
|
- contribution의 부동소수점 합산 순서를 thread scheduling과 분리한다.
|
|
- TBB element work가 모두 끝난 후에만 PARDISO를 호출한다.
|
|
- 기존 assemble_serial은 oracle로 유지한다.
|
|
- tolerance 비교를 bitwise 재현성의 대체물로 사용하지 않는다.
|
|
- result-contract-completion의 element result, HDF5 확장, CSV adapter를 선행하지
|
|
않는다.
|
|
- beam-reference-qualification의 Abaqus 골든 비교와 tolerance 작업을 선행하지
|
|
않는다.
|
|
- internal-release의 installer, Release package와 validation report를 선행하지
|
|
않는다.
|
|
|
|
## 10. Harness child 환경
|
|
|
|
이전 Harness 실행에서 WindowsApps PowerShell을 child process로 시작할 때 access
|
|
denied가 발생했다. 확인된 구성:
|
|
|
|
- standalone Codex release:
|
|
C:\Users\baram\.codex\packages\standalone\releases\0.146.0-x86_64-pc-windows-msvc
|
|
- WindowsApps가 제거된 PATH
|
|
- Windows PowerShell 5.1
|
|
- Harness 실행 동안만 [windows] sandbox = "unelevated"
|
|
|
|
현재 C:\Users\baram\.codex\config.toml은 원래 값인
|
|
[windows] sandbox = "elevated"로 복원되어 있음을 2026-08-01에 확인했다.
|
|
|
|
같은 문제가 재현될 때만 다음 순서를 사용한다.
|
|
|
|
1. 다른 Codex 작업에 미칠 영향을 확인하고 config 원래 값을 기록한다.
|
|
2. Harness 실행 동안만 sandbox를 unelevated로 바꾼다.
|
|
3. 현재 PowerShell 세션 PATH 앞에 standalone bin과 Windows PowerShell 5.1을
|
|
두고 모든 WindowsApps entry를 제거한다.
|
|
4. package 환경 변수와 baseline을 확인한 뒤 같은 세션에서 Harness를 실행한다.
|
|
5. 성공·실패와 무관하게 finally에 해당하는 정리 단계에서 global config를 즉시
|
|
elevated로 복원하고 실제 값을 다시 읽는다.
|
|
|
|
$codexReleaseBin = "C:\Users\baram\.codex\packages\standalone\releases\0.146.0-x86_64-pc-windows-msvc\bin"
|
|
$windowsPowerShell = "$env:SystemRoot\System32\WindowsPowerShell\v1.0"
|
|
$filteredPath = $env:PATH -split ";" | Where-Object {
|
|
$_ -and
|
|
$_ -ne $codexReleaseBin -and
|
|
$_ -ne $windowsPowerShell -and
|
|
$_ -notmatch "WindowsApps" -and
|
|
$_ -notmatch "\\OpenAI\\Codex\\bin$"
|
|
}
|
|
$env:PATH = (@($codexReleaseBin, $windowsPowerShell) + $filteredPath) -join ";"
|
|
|
|
(Get-Command codex).Source
|
|
(Get-Command powershell).Source
|
|
|
|
사용자 profile 전체나 drive root를 --codex-add-dir로 허용하지 않는다. 설치 버전이나
|
|
경로가 달라졌다면 위 절대경로를 그대로 사용하지 말고 실제 standalone release와
|
|
codex-resources 존재를 먼저 확인한다.
|
|
|
|
Harness가 모든 Step과 phase commit을 완료한 뒤 stderr reader의 CP949/UTF-8 decode
|
|
예외를 출력할 수 있다. exit code만 보지 말고 phase metadata, output JSON, Git
|
|
commit과 전체 검증 결과를 함께 확인한다.
|
|
|
|
## 11. 새 세션 시작 절차
|
|
|
|
먼저 이 문서와 다음 파일을 모두 읽는다.
|
|
|
|
/phases/deterministic-parallel-assembly/index.json
|
|
/phases/deterministic-parallel-assembly/step0.md
|
|
/phases/deterministic-parallel-assembly/step1.md
|
|
/phases/deterministic-parallel-assembly/step2.md
|
|
/src/fesa/assembly/serial_assembler.cpp
|
|
/tests/unit/assembly/serial_assembler_test.cpp
|
|
|
|
그 다음 Git과 package 상태를 재검증하고 6절의 baseline 명령을 실행한다. 필요하면
|
|
10절의 child sandbox 조건을 적용한 뒤 다음을 실행한다.
|
|
|
|
python scripts/execute.py deterministic-parallel-assembly
|
|
|
|
executor는 feat-deterministic-parallel-assembly 브랜치를 생성하거나 checkout하고
|
|
Step 상태와 output metadata를 기록한다. 사용자가 명시적으로 요청하지 않은 한
|
|
--push를 사용하지 않는다.
|
|
|
|
각 Step은 다음 순서를 지킨다.
|
|
|
|
1. Step 파일의 필수 문서와 선행 구현을 모두 읽는다.
|
|
2. 성공 기준과 canonical ordering/threading invariant를 명시한다.
|
|
3. 8절의 모호한 계약을 구현 전에 정렬한다.
|
|
4. 실패 테스트를 먼저 작성하고 예상한 이유로 실패함을 확인한다.
|
|
5. 테스트를 통과시키는 최소 production code만 구현한다.
|
|
6. focused test, 전체 CTest와 Harness pytest를 실행한다.
|
|
7. Step summary와 output metadata가 실제 결과와 일치하는지 확인한다.
|
|
8. Phase 종료 전 전체 diff를 determinism, race avoidance, TBB 경계와 기존 serial
|
|
oracle 기준으로 review한다.
|
|
|
|
## 12. 다음 Phase 완료 조건
|
|
|
|
- /phases/deterministic-parallel-assembly/index.json의 Step 0~2가 모두 completed
|
|
- /phases/index.json에서 deterministic-parallel-assembly가 completed
|
|
- shuffled/cancellation/signed-zero contribution의 canonical 결과가 bit-for-bit 동일
|
|
- serial과 parallel의 CSR row offsets, column indices, values와 force가 동일
|
|
- thread count 1, 2, available concurrency와 최소 10회 반복에서 결과가 동일
|
|
- 최종 linear static displacement와 reaction이 thread count에 무관하게 동일
|
|
- worker가 thread-local contribution만 생성하고 공유 CSR에 atomic add하지 않음
|
|
- TBB task와 PARDISO 실행이 중첩되지 않음
|
|
- deterministic Beam kernel failure propagation 검증
|
|
- benchmark가 production API를 사용하고 speedup을 pass 조건으로 만들지 않음
|
|
- focused test와 전체 CTest 통과
|
|
- Harness pytest가 0개가 아닌 상태로 전체 통과
|
|
- 새 MSVC warning 없음
|
|
- 독립 review의 Critical/Important finding 해결
|
|
- 사용자 선택 전 원격 push나 dev 병합을 수행하지 않음
|
|
|
|
새 세션의 권장 첫 요청:
|
|
|
|
> docs/HANDOFF.md와 deterministic-parallel-assembly의 index/step0~2를 읽고 현재
|
|
> dev baseline, oneTBB 환경과 Harness child 실행 조건을 확인한 뒤
|
|
> deterministic-parallel-assembly Phase를 시작해주세요.
|