diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md index abb2c0f..eef564e 100644 --- a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -53,8 +53,8 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실 | [io-schema.md](io-schema.md) | io-definition-agent | r2 | 기존 static 보존·eigen discriminant·N vectors/all-c evidence·self-check | | [io-mapping.md](io-mapping.md) | io-definition-agent | r2 | 책임·candidate 보존·TXT Value-only·27개 요구/11개 I/O 검증 obligation | | [implementation-plan.md](implementation-plan.md) | implementation-planning-agent | r2 | Prep 1/main 8개 step 및 실행 계획 gate pass | -| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E9 병렬도1·실제 clean-first discovery 검증 계획 감사 완료; canonical Hook 적용 경계로 activation 미확정 | -| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R10 report1/control2 실제 WIP commit·clean 완료; R11은 공유 Hook 중요 결정 뒤의 조건부 준비 | +| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E10 Root exact user-preset setup/configure-only·환경/TEMP 수명·전체명령 대응 감사 완료, 실제 적용은 다음 Root 할당 | +| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R10 실제 보존 완료; R12는 actual local setup 뒤 별도 R11 hash/선행 ignore 경로 갱신을 요구, status 미변경 | | [implementation-interfaces.md](implementation-interfaces.md) | implementation-planning-agent | r2 | 기존 확장점·API/source-test·vendor/state/transaction 책임 | | [implementation-verification.md](implementation-verification.md) | implementation-planning-agent | r2 | 요구27/NR27/I/O11·신규 test40·독립 oracle·fresh evidence·실제 validator | | [implementation-prep-evidence.md](implementation-prep-evidence.md) | implementation-agent | r2 | attempt4 classifier37/focused136 pass·manual Ninja discovery failure; 전체 gate 미통과 및 raw/registered 경계는 coordination 참조 | diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md index de7a084..53c13cb 100644 --- a/docs/mitc4-shell-feast-eigen/coordination.md +++ b/docs/mitc4-shell-feast-eigen/coordination.md @@ -3,15 +3,15 @@ - Feature ID: `mitc4-shell-feast-eigen` - Owner: `coordinator-agent` - Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위) -- Stage: `implementation` (R10 실제 실패 보존 완료; 공유 Hook 설정·신뢰 경계 결정 대기) +- Stage: `implementation` (공유 Hook 결정 대기와 독립적인 E10 workspace 설정 준비) - Outcome: `needs-user-decision` -- Next owner: `user` (Root가 MFE-OQ-004 중요 결정 요청) +- Next owner: `Root` (E10.1 exact local setup/configure-only; MFE-OQ-004는 별도 대기) - Attempt: `4` (actual Step0 error/history4; 이전 history3 보존) - Completion: 미완료 - Failure classification: `environment` - Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2` - Escalation class: `security-trust-boundary` -- Blocker: 현재 exact ownership 밖의 canonical 공유 Hook1800→7500 변경과 변경된 Hook 재신뢰는 아직 사용자 미승인이다. Manual full VERIFY 및 다음 native도 미완료다. +- Blocker: canonical 공유 Hook1800→7500/재신뢰 미승인. 별도 Root outer Stop의 빈 dependency4 configure 실패로 workspace 환경 복구와 현재 R11 cache guard 재검토도 필요하다. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md). @@ -45,7 +45,13 @@ Root의 intake 시작 Git 조사에서는 worktree clean을 확인했다. 당시 ## 현재 bounded dispatch -현재는 **MFE-OQ-004 사용자 결정 요청 준비**이며 답변은 아직 없다. 이전 E6의 한 번 승인된 workspace 실행은 소비됐고 canonical checkout의 공유 Hook 수정·재신뢰를 승인한 것으로 확대하지 않는다. 세부 검토 대상과 영향은 Root 소유 [MSVC 접근 오류와 설정 경계](msvc-build-access-error.md)에 기록한다. +현재는 **MFE-OQ-004 사용자 결정 대기**이며 승인 답변은 아직 없다. 새 사용자 메시지는 Root outer registered Stop의 configure 실패 Hook prompt이므로 승인으로 해석하지 않는다. 이전 E6의 한 번 승인된 workspace 실행은 소비됐고 canonical checkout의 공유 Hook 수정·재신뢰를 승인한 것으로 확대하지 않는다. 세부 검토 대상과 영향은 Root 소유 [MSVC 접근 오류와 설정 경계](msvc-build-access-error.md)에 기록한다. + +이 결정과 독립적으로 Planning은 소유 세 문서의 [E10 정상 local setup](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)과 [R12 stale hash 경계](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)를 반환했다. Coordinator는 owner/revision/명령·수명·소유를 대조하고 이 문서 delta를 pass로 수용했다. Owner 정적 감사는 PowerShell25 오류0/Python AST9/local links110 누락0/보호11hash·HEAD·error-history4 불변 및 actual adapter4 명령·7200 cap 대조 exit0이다. 기존 preset-contract test가 tracked public/example만 검사한다는 read-only 대조도 완료했으며 test 실행 증거로 취급하지 않는다. + +다음 bounded assignment는 Root의 **E10.1 첫 PowerShell block 그대로의 local setup/configure-only**다. 선행 exact5 문서 checkpoint/clean과 활성 build/test 부재를 확인한 뒤 원본 bytes/hash를 backup한다. Root 소유 tracked 변경은 `.gitignore`의 `/CMakeUserPresets.json` 한 줄이고, ignored UserPresets/local config·새 짧은 TEMP·Ninja cache만 정확히 준비한다. Public preset/source/test/Hook/trust/reference/phase/기존 VS cache는 보존하며 parent 전체 환경은 finally에서 복원한다. 이후 env4 unset 상태로 CMake preset listing/실제 config parser/configure를 확인하고 보호 bytes·새 cache와 actual adapter graph를 기록한다. Build/test/Hook/nativephase 실행은 이 assignment에 포함하지 않는다. 성공 후 actual evidence/최소 문서 갱신과 Root exact ignore commit을 수행하며 실패하면 원시/변경 bytes를 보존해 반환한다. Root 실행 동안 Coordinator와 Planning은 tracked 편집/Git을 동결한다. + +Root의 [별도 outer Stop 실패 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)은 실제 `cmake --preset windows-msvc-ninja-debug` configure exit1과 parent dependency4 unset을 기록했다. Preset의 env cache 치환으로 새 Ninja cache의 dependency4가 모두 빈 값이 됐으며 [당시 cache](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/CMakeCache.txt) SHA-256은 `125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e`다. 이는 phase attempt5가 아니며 history4와 미승인 상태를 유지한다. 이전 R11 cache hash는 stale이므로 정상 local setup의 실제 결과 전 재사용하지 않는다. `CMakeUserPresets.json`은 현재 없고 ignore되지 않았다는 Root 관찰도 계획 입력이다. 최소 MSVC 환경과 짧은 workspace TEMP의 지속 적용을 구성하되 pytest basetemp의 새 경로, test 자체의 고유 하위 경로와 기존 evidence 보존을 유지한다. | 결정 가능한 경로 | 영향 | | --- | --- | diff --git a/docs/mitc4-shell-feast-eigen/implementation-environment.md b/docs/mitc4-shell-feast-eigen/implementation-environment.md index 112c1c8..2946f42 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-environment.md +++ b/docs/mitc4-shell-feast-eigen/implementation-environment.md @@ -733,3 +733,197 @@ Result payload는 manual 결과와 아직 미관찰인 Stop을 구분하며 Coor 검토한다. Active Executor 동안 Root/Coordinator는 non-owned edits/commits를 멈춘다. Main은 prep 전체 gate 뒤 별도 workspace-write invocation만 허용하며 E9의 병렬도1을 같이 사용한다. 새로운 동일 실패는 원시 evidence와 기존 retry key로 반환한다. + +## E10. 부모 환경과 독립적인 workspace user preset + +[Root Stop 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)는 +parent env4 미설정과 public preset의 cache4 빈 값 overwrite/configure1을 보존한다. +현재 실패 cache hash는 `125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e`다. +이는 MFE-OQ-004 승인 답변이 아니다. Canonical Hook·재신뢰는 계속 미승인이고 새 native/ +status reset도 미할당이다. 아래는 별도 Root 실행을 위한 문서 계획이며 현재 setup은 미실행이다. + +[Toolchain](../../scripts/msvc_harness/toolchain.py)은 executable 경로만 찾으며 +[Stop](../../scripts/hooks/stop_validation.py)은 parent env를 복사한다. 따라서 root +`CMakeUserPresets.json`의 `mfe-workspace-msvc-ninja-debug`가 public preset을 상속하고 +dependency4 literal cache와 최소 MSVC INCLUDE/LIB/tool PATH를 제공하도록 한다. +Installed CMake4.4 `Help/manual/cmake-presets.7.rst`의 user/common 자동 include, +`$penv{PATH}`, build/test `inheritConfigureEnvironment`를 사용한다. Public preset, +Harness API/config schema와 source/test/Hook은 바꾸지 않는다. + +Build/test는 configure 환경을 상속한다. 같은 Ninja binaryDir·MSVC Hostx64/x64·Debug, +실제 Debug archive 경로와 직렬 병렬도1을 유지한다. Root의 정상 DevShell에서 INCLUDE/LIB, +cl/rc/mt/Ninja directory만 capture하고 전체 env·비밀값은 preset에 저장하지 않는다. +Parent process는 finally에서 복원한다. 이후 arbitrary Root process에도 CMake child가 +자체 preset 환경을 적용하므로 parent env4/DevShell 지속성을 전제로 삼지 않는다. + +Preset TEMP/TMP는 setup에서 만든 새80자 이하 ignored 디렉터리를 **설정 수명 동안** +사용한다. CMake child에서는 이 값이 E7/E9의 매회 parent TEMP를 대체한다. 기존 model/test의 +고유 child directory 생성은 유지하고 동시 build/test가 없는지 Root가 setup 전에 실제 확인한다. +Python/pytest는 기존 per-invocation 새 짧은 TEMP와 basetemp를 유지한다. 기존 디렉터리/ +evidence 삭제, 권한·실행 정책 변경이나 Hook 우회는 없다. + +### E10.1. Root의 exact setup과 configure-only 확인 + +순서는 Planning3 동결 → Root docs checkpoint → 아래 setup → 실제 observation/최소 문서 +갱신과 Root exact commit이다. 현재 UserPresets는 미존재·미ignore다. Root가 별도 소유하는 +tracked 변경은 [.gitignore](../../.gitignore)의 `/CMakeUserPresets.json` 한 줄뿐이다. +그 줄을 Root가 검토·commit하며 public preset과 Implementation owned9/phase 범위는 유지한다. +UserPresets/local config/TEMP/backup/Ninja configure output은 ignored로 둔다. + +```powershell +$ErrorActionPreference = 'Stop' +$mfeRoot=(Get-Location).Path +$mfePython=Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' +$mfeCmake=(Get-Command cmake.exe -ErrorAction Stop).Source +$mfePreset='mfe-workspace-msvc-ninja-debug' +$mfeGitRoot=git rev-parse --show-toplevel +if ($LASTEXITCODE -ne 0 -or [IO.Path]::GetFullPath($mfeGitRoot) -ne [IO.Path]::GetFullPath($mfeRoot)) { throw 'Repository mismatch' } +$mfeDirty=git status --porcelain +if ($LASTEXITCODE -ne 0 -or $mfeDirty) { throw 'Root docs checkpoint and clean required' } +if (Test-Path -LiteralPath 'CMakeUserPresets.json') { throw 'Preserve existing UserPresets' } +$mfeInputs=@{ + '.gitignore'='b81d422ee0185f16714e3218369689b808701e5e398a6f687a22784da2290842' + '.harness/config.json'='3ebdfa80124f1eb96909b2738d6f2a96fecd55cce61150a9cd7ef27d7c5fd892' + '.harness/build-ninja-msvc-debug/CMakeCache.txt'='125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e' +} +foreach ($mfePath in $mfeInputs.Keys) { + if ((Get-FileHash -LiteralPath $mfePath).Hash.ToLower() -ne $mfeInputs[$mfePath]) { throw "Changed input: $mfePath" } +} +$mfeBackup=Join-Path $mfeRoot ('.harness/build/mfe-preset-'+[guid]::NewGuid().ToString('N').Substring(0,8)) +$mfeTemp=Join-Path $mfeRoot ('.harness/build/t-'+[guid]::NewGuid().ToString('N').Substring(0,8)) +if ($mfeTemp.Length -gt 80 -or (Test-Path -LiteralPath $mfeTemp) -or (Test-Path -LiteralPath $mfeBackup)) { throw 'Fresh short paths required' } +$null=New-Item -ItemType Directory -Path $mfeBackup +$null=New-Item -ItemType Directory -Path $mfeTemp +Copy-Item -LiteralPath '.gitignore' -Destination (Join-Path $mfeBackup 'gitignore.before') +Copy-Item -LiteralPath '.harness/config.json' -Destination (Join-Path $mfeBackup 'config.before.json') +Copy-Item -LiteralPath '.harness/build-ninja-msvc-debug/CMakeCache.txt' -Destination (Join-Path $mfeBackup 'CMakeCache.before.txt') +$mfeUtf8=[Text.UTF8Encoding]::new($false) +[IO.File]::WriteAllText((Join-Path $mfeBackup 'before.json'),(@{hashes=$mfeInputs; userPresetsExisted=$false; temp=$mfeTemp}|ConvertTo-Json -Depth 6),$mfeUtf8) +$mfeProtected=@('CMakePresets.json','.codex/hooks.json','scripts/execute.py','tests/test_execute.py','phases/index.json','phases/mitc4-shell-feast-eigen-execution-prep/index.json','phases/mitc4-shell-feast-eigen-execution-prep/step0-output.json','.harness/build/CMakeCache.txt') +$mfeHashes=@{} +foreach ($mfePath in $mfeProtected) { $mfeHashes[$mfePath]=(Get-FileHash -LiteralPath $mfePath).Hash } +$mfeBeforeEnv=[Environment]::GetEnvironmentVariables('Process') +try { + $mfeVs='C:/Program Files/Microsoft Visual Studio/18/Community' + & (Join-Path $mfeVs 'Common7/Tools/Launch-VsDevShell.ps1') -VsInstallationPath $mfeVs -Arch amd64 -HostArch amd64 -SkipAutomaticLocation -NoLogo + $mfeCl=(Get-Command cl.exe -ErrorAction Stop).Source + $mfeRc=(Get-Command rc.exe -ErrorAction Stop).Source + $mfeMt=(Get-Command mt.exe -ErrorAction Stop).Source + $mfeNinja=Join-Path $mfeVs 'Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe' + if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64') -or $mfeCl -notmatch '[\\/]Hostx64[\\/]x64[\\/]cl\.exe$') { throw 'MSVC x64 required' } + if (-not(Test-Path -LiteralPath $mfeNinja) -or [string]::IsNullOrWhiteSpace($env:INCLUDE) -or [string]::IsNullOrWhiteSpace($env:LIB)) { throw 'Toolchain incomplete' } + $mfeDirs=@((Split-Path $mfeCl),(Split-Path $mfeNinja),(Split-Path $mfeRc),(Split-Path $mfeMt))|Select-Object -Unique + $mfeEnv=@{INCLUDE=$env:INCLUDE; LIB=$env:LIB; PATH=($mfeDirs -join ';')+';$penv{PATH}'; TEMP=$mfeTemp.Replace('\','/'); TMP=$mfeTemp.Replace('\','/'); CMAKE_BUILD_PARALLEL_LEVEL='1'} + $mfeCache=@{ + FESA_GTEST_SOURCE_DIR='C:/git/googletest' + MKL_DIR='C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl' + TBB_DIR='C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb' + HDF5_DIR='C:/Program Files/HDF_Group/HDF5/2.1.1/cmake' + CMAKE_CXX_COMPILER=$mfeCl.Replace('\','/') + CMAKE_MAKE_PROGRAM=$mfeNinja.Replace('\','/') + CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=('$'+'{sourceDir}/.harness/build-ninja-msvc-debug/src/fesa/Debug') + } + $mfeUser=@{ + version=3 + configurePresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; cacheVariables=$mfeCache; environment=$mfeEnv}) + buildPresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; configurePreset=$mfePreset; inheritConfigureEnvironment=$true}) + testPresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; configurePreset=$mfePreset; inheritConfigureEnvironment=$true}) + } +} +finally { + foreach ($mfeName in @([Environment]::GetEnvironmentVariables('Process').Keys)) { + if (-not $mfeBeforeEnv.Contains($mfeName)) { [Environment]::SetEnvironmentVariable($mfeName,$null,'Process') } + } + foreach ($mfeName in $mfeBeforeEnv.Keys) { [Environment]::SetEnvironmentVariable($mfeName,$mfeBeforeEnv[$mfeName],'Process') } +} +$mfeOriginalIgnore=[IO.File]::ReadAllBytes((Join-Path $mfeRoot '.gitignore')) +if ($mfeOriginalIgnore[-1] -ne 10) { throw 'Unexpected ignore EOF' } +$mfeSuffix=$mfeUtf8.GetBytes('/CMakeUserPresets.json'+[Environment]::NewLine) +[IO.File]::WriteAllBytes((Join-Path $mfeRoot '.gitignore'),[byte[]]($mfeOriginalIgnore+$mfeSuffix)) +git check-ignore --quiet CMakeUserPresets.json +if ($LASTEXITCODE -ne 0) { throw 'UserPresets must be ignored' } +[IO.File]::WriteAllText((Join-Path $mfeRoot 'CMakeUserPresets.json'),($mfeUser|ConvertTo-Json -Depth 10)+[Environment]::NewLine,$mfeUtf8) +$mfeConfig=Get-Content -LiteralPath '.harness/config.json' -Raw|ConvertFrom-Json +$mfeConfig.cmake.configurePreset=$mfePreset +$mfeConfig.cmake.buildPreset=$mfePreset +$mfeConfig.cmake.testPreset=$mfePreset +[IO.File]::WriteAllText((Join-Path $mfeRoot '.harness/config.json'),($mfeConfig|ConvertTo-Json -Depth 10)+[Environment]::NewLine,$mfeUtf8) +foreach ($mfeName in @('FESA_GTEST_SOURCE_DIR','MKL_DIR','TBB_DIR','HDF5_DIR')) { + if (-not [string]::IsNullOrEmpty([Environment]::GetEnvironmentVariable($mfeName,'Process'))) { throw 'Separate env4-unset configure verification required' } +} +$mfeExit=$null +try { + & $mfeCmake --list-presets=all + $mfeExit=$LASTEXITCODE + if ($null -eq $mfeExit) { throw 'Preset validation exit unavailable' } + if ($mfeExit -ne 0) { exit $mfeExit } + & $mfePython -B -X utf8 -c "from pathlib import Path; from scripts.msvc_harness.config import load_config; c=load_config(Path.cwd()); assert c.cmake.configure_preset==c.cmake.build_preset==c.cmake.test_preset=='mfe-workspace-msvc-ninja-debug'; assert c.cmake.binary_dir==Path.cwd()/'.harness/build-ninja-msvc-debug'; print('Local config valid')" + $mfeExit=$LASTEXITCODE + if ($null -eq $mfeExit) { throw 'Config validation exit unavailable' } + if ($mfeExit -ne 0) { exit $mfeExit } + & $mfeCmake --preset mfe-workspace-msvc-ninja-debug + $mfeExit=$LASTEXITCODE + if ($null -eq $mfeExit) { throw 'Configure exit unavailable' } +} +finally { + $mfeAfter=@{} + foreach ($mfePath in @('.gitignore','CMakeUserPresets.json','.harness/config.json','.harness/build-ninja-msvc-debug/CMakeCache.txt')) { + $mfeAfter[$mfePath]=(Get-FileHash -LiteralPath $mfePath).Hash.ToLower() + } + [IO.File]::WriteAllText((Join-Path $mfeBackup 'after.json'),(@{hashes=$mfeAfter; lastNativeExit=$mfeExit}|ConvertTo-Json -Depth 6),$mfeUtf8) + foreach ($mfePath in $mfeProtected) { + if ((Get-FileHash -LiteralPath $mfePath).Hash -ne $mfeHashes[$mfePath]) { throw "Non-owned change: $mfePath" } + } +} +$mfeFinalDirty=git status --porcelain +if ($LASTEXITCODE -ne 0 -or @($mfeFinalDirty).Count -ne 1 -or $mfeFinalDirty -ne ' M .gitignore') { throw 'Unexpected tracked changes' } +git diff --check -- .gitignore +if ($LASTEXITCODE -ne 0) { throw 'Ignore whitespace check failed' } +Write-Output ("Setup evidence: {0}; configure exit {1}" -f $mfeBackup,$mfeExit) +exit $mfeExit +``` + +Original3파일 bytes/hash와 UserPresets 부재를 mutation 전에 backup하고, 실제 CMake +`--list-presets=all` schema/inheritance 해석 및 `load_config` 뒤 **env4 unset 상태의 +configure만** 수행한다. Root는 after cache의 dependency4, Ninja/Debug, compiler 경로· +pointer size8, archive 경로와 새 user/config/cache hash를 기록한다. Actual adapter plan의 +configure/build/discovery/test 네 명령도 같은 local preset으로 대조한다. +Library/build/CTest 성공은 configure evidence가 아니다. HEAD/phase history4/source/ +reference/old VS cache 불변, tracked diff가 ignore1줄뿐인지 감사한 뒤 Root가 exact commit한다. +자동 Root outer Stop이 발생하면 실제 결과를 따로 관찰하며 manual Hook으로 대체하지 않는다. + +### E10.2. 기존 명령의 명시 대체와 수명 + +Setup 성공을 별도 감사한 뒤 E8/E9 및 모든 prep/main 명령의 preset 인수를 아래로 대체한다. +Configure의 archive는 user cache가 고정하므로 예전 추가 `-D`가 필요 없다. + +| 목적 | 정확한 새 명령 | +| --- | --- | +| Configure | `cmake --preset mfe-workspace-msvc-ninja-debug` | +| E9 최초 실제 직렬 재검증 build | `cmake --build --preset mfe-workspace-msvc-ninja-debug --clean-first --verbose` | +| 일반 full/registered build | `cmake --build --preset mfe-workspace-msvc-ninja-debug` | +| Main focused target build | `cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests` | +| Discovery | `ctest --preset mfe-workspace-msvc-ninja-debug --show-only=json-v1` | +| Full CTest | `ctest --preset mfe-workspace-msvc-ninja-debug --output-on-failure` | + +Focused CTest는 원 Step의 `-R` 문자열을 그대로 유지하고 preset 인수만 위 이름으로 바꾼다. +E9 세 discovery의 실제 실행/등록 identity·새 binary hash/mtime·fresh manual solve 및 +registered same-binary full 구분, 전체 Python/CTest, 수치/reference 계약은 유지한다. +CMake 검증에 한해 E8/E9의 외부 shell DevShell 재호출·cl/Ninja 사전 검색 조건을 user preset과 +actual compiler/cache evidence로 대체한다. Python/UV recipe와 finite14400/7500/7200 +계약, workspace-write 및 모든 Hook/retry/ownership guard는 그대로다. +실제 canonical outer1800·재신뢰 문제는 이 local setup으로 해결됐다고 주장하지 않는다. + +[Preset contract test](../../tests/test_harness_preset_contract.py)는 tracked public preset/ +config.example과 tmp_path에 복사한 example을 검사하며 실제 local config/UserPresets를 +읽지 않는다. Public/example 불변과 기존 ignore 항목 보존 시 이 선택과 모순되지 않는다. +테스트 소스/대상/assertions는 수정하지 않았고 이 Planning에서 테스트를 실행하지 않았다. + +Rollback은 active 실행이 없고 after hash와 현재 파일이 동일한 경우에 Root가 수행한다. +`.gitignore`와 local config는 backup bytes로 복원하고, 원래 없었던 정확한 +`CMakeUserPresets.json`만 `Remove-Item -LiteralPath`로 비재귀 제거한다. +필요 시 `CMakeCache.before.txt`를 원래 exact cache 경로에 복사하되 **기존 실패 cache +복원**임을 기록한다. Generated outputs/TEMP/evidence는 삭제하지 않고 graph 유효성이나 +검증 성공을 주장하지 않는다. 이미 ignore1줄을 commit했다면 Root의 exact inverse commit을 +사용하고 history reset은 하지 않는다. 타 owner 변경이 있으면 덮어쓰지 않고 반환한다. +설정은 해당 workspace에 유지하며 feature 종료·설치 경로 변경 때 Root가 수명을 검토한다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-plan.md b/docs/mitc4-shell-feast-eigen/implementation-plan.md index 6e02a4a..271e513 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-plan.md +++ b/docs/mitc4-shell-feast-eigen/implementation-plan.md @@ -41,6 +41,12 @@ error/history4 보존을 고정한다. [E9](implementation-environment.md#e9-att 정상 병렬도1·실제 clean-first 검증을 계획한다. 현재 resolver의 canonical Stop1800 해석은 확인됐지만 정상 override 지원·적용 방법은 미확정이다. R11 status-only 변경과 재실행은 별도 할당 전 수행하지 않는다. +새 Root configure 실패는 parent env4에 의존한 cache overwrite다. +[E10](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)은 Root 소유의 +ignore1줄·ignored UserPresets/local config를 계획한다. 실제 setup은 아직 미실행이고 +[R12](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)의 R11 hash 갱신은 +actual setup 뒤 별도 할당한다. MFE-OQ-004 공유 Hook·재신뢰 결정은 계속 별도 미승인이다. + [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)와 [coordination](coordination.md), 승인된 [requirements](requirements.md), [research](research.md), [formulation](formulation.md), [NR](numerical-review.md), [I/O](io.md) 및 각 상세 r2를 적용한다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-recovery.md b/docs/mitc4-shell-feast-eigen/implementation-recovery.md index 25ea7dc..9e89296 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-recovery.md +++ b/docs/mitc4-shell-feast-eigen/implementation-recovery.md @@ -881,3 +881,20 @@ R10 report1/controls2 commit 경로와 HEAD의 error/history4를 검사하므로 pending 재실행을 시작하지 않는다. 실제 source/Hook/config 및 기존 cache는 그대로다. 각 native exit와 clean을 확인하고, 다음 E9 invocation은 Coordinator가 새 process로 별도 할당한다. 실패를 재분류해 새 Correction budget을 만들거나 자동 재시도하지 않는다. + +## R12. User preset setup 이후의 stale hash 경계 + +R10은 실제 report `fc032212f75b9008f0a46e0f2d9f3736f184b05f`/controls +`aa03fc3d049b82f519db1962b5da592524a1c496`로 완료됐다. 과거 R10 명령을 다시 실행하지 않는다. +새 Root configure 실패와 [E10](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)은 +error/history4 및 MFE-OQ-004 미승인 상태를 바꾸지 않는다. + +기존 R11의 Ninja cache `bf0249...` hash는 이미 stale이며 **현재 R11 실행은 보류**한다. +별도 Root setup/audit 뒤 Coordinator가 Planning delta를 할당할 때만 실제 관찰된 +local config/UserPresets/cache hash를 반영하고 Root 소유 `.gitignore` 한 경로의 +선행 commit을 허용 경로에 추가한다. Source/Hook/control/history/raw와 unchanged +`_commit_paths` guard는 유지한다. 별도 canonical Hook 승인/실제 변경이 없으면 +Hook hash도 바꾸지 않는다. 새 hash나 configure 성공을 계획 시점에 예측하지 않는다. + +해당 audit·필요한 MFE-OQ-004 실제 결정/조치 뒤에만 status-only와 새 native를 별도 할당한다. +이번 task는 Planning3문서뿐이며 Root setup/ignore commit, phase 수정 또는 실행 권한이 아니다.