diff --git a/docs/mitc4-shell-feast-eigen/ADR.md b/docs/mitc4-shell-feast-eigen/ADR.md index 80b6293..a0c5350 100644 --- a/docs/mitc4-shell-feast-eigen/ADR.md +++ b/docs/mitc4-shell-feast-eigen/ADR.md @@ -113,9 +113,10 @@ ## MFE-ADR-012 — Source echo 분류 오탐의 bounded 운영 correction -- 상태: 실제 결함 재현 및 Planning의 최소 TDD·보존/activation 계획 확인; Correction 미실행. +- 상태: 실제 최소 Correction1회와 targeted GREEN37 확인; 전체 prep gate는 환경 차단으로 미완료. - 발견·재현 owner: Root; 계획 owner: implementation-planning-agent; correction dispatch owner: coordinator-agent. - 근거: [실제 raw/순수함수 재현](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json), [복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md). - 결정: 성공한 source-read 출력의 helper marker를 실제 runtime failure로 오인하는 분류 결함만 기존 `scripts/execute.py`/`tests/test_execute.py` 안에서 먼저 수정한다. 진짜 helper 진단, 명시 terminal/history, 실제 wrapper timeout만 허용되는 retry 및 sandbox/ownership 보호를 유지한다. - 순서·이유: 기존 timeout-only AST guard로 현재 blocked/WIP를 먼저 보존하고 별도 Correction 뒤 새 Executor process를 시작한다. 이미 import된 classifier는 child source 수정만으로 바뀌지 않으며 reload/guard override로 성공을 만들지 않는다. 실제 Hook 쓰기 거부는 별도 환경 blocker로 보존한다. - 경계: Physics/schema/tolerance `r2`와 선행6개 기술 계약을 바꾸지 않는다. Correction은 별도 signature의 unused allowance 확인 후 명시 dispatch하며 성공·검증·커밋은 실제 결과 뒤에만 기록한다. Exact-run sandbox 사용자 승인과 full VERIFY는 유지한다. +- 실제 evidence: [Correction owner 보고서](corrections.md)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](coordination.md#현재-bounded-dispatch)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다. diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md index 4e79983..f8a73f2 100644 --- a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -58,6 +58,7 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실 | [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 | actual attempt1 blocked 보고서; 두 실패·마지막 test 수정의 미검증 구분은 coordination raw audit 참조 | +| [corrections.md](corrections.md) | correction-agent | r2 | source echo 최소 교정1회·RED/GREEN37 확인; full Python Hook1실패와 manual build 환경 차단 보존, registered Stop362 pass는 coordination 후속 evidence | | [phases/index.json](../../phases/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | 기존5개 보존; prep blocked/main pending | | [prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | Step0 blocked; actual attempt1/history 보존 | | [prep step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md) | implementation-planning-agent | r2 | 유한 deadline 및 재현 classifier 오탐의 최소 TDD/full VERIFY; 별도 Correction 후 재개 | diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md index a232eb4..3fe3846 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` -- Outcome: `blocked-environment` (execution-prep Step0의 지정 `.codex/hooks.json` 쓰기 거부) -- Next owner: `coordinator-agent` (R2의 실제 Executor WIP checkpoint 할당; 이후 bounded Correction) -- Attempt: `1` (prep native 실행 1회; transport 재시도 없음) +- Stage: `implementation` (실제 Correction source checkpoint·exact-run 준비) +- Outcome: `blocked-environment` (protected Hook 및 manual build 환경 실패 보존) +- Next owner: `coordinator-agent` (Root 문서 checkpoint 뒤 R6의 실제 Executor 보존 호출) +- Attempt: `1` (기존 prep environment attempt 유지; source Correction은 아래 harness key에서 1회 사용) - Completion: 미완료 -- Failure classification: `environment` (별도 focused test 수정의 미검증 상태도 보존) +- Failure classification: `environment` - Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2` - Escalation class: `null` -- Blocker: Native workspace-write가 지정된 Hook 설정 변경을 거부했다. 실제 실패와 부분 구현을 보존하고 권한·재개 조건을 충족하기 전에는 pending reset이나 재실행을 하지 않는다. +- Blocker: source echo 교정과 R6/E6 계획 audit를 완료했다. Root의 정확7문서 checkpoint 뒤 R6 source2 보존을 실행해 clean linked 상태를 확보한다. Protected Hook의 exact-run 승인 전 pending reset/실제 prep 재실행은 금지하며 TEMP/TMP remedy의 native full build는 후속 검증으로 남는다. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md). @@ -35,6 +35,8 @@ | io-definition r2 | [main](io.md), [input](io-input.md), [schema](io-schema.md), [mapping](io-mapping.md) | pass; 4개 owner/r2 문서·27개 requirement·66개 상대 링크 및 원본 grammar/identity·additive schema·failure 보존 확인 | | implementation-planning r2 | [main](implementation-plan.md), [environment](implementation-environment.md), [interfaces](implementation-interfaces.md), [verification](implementation-verification.md), [prep](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [main phase](../../phases/mitc4-shell-feast-eigen/index.json) | pass; 실제 read-only StepExecutor validator·16산출물·1+8 steps·owned128회/고유110·요구27/NR27/I/O11·신규test40·links575/anchor0 확인 | | implementation r2 prep attempt 1 | [작성 시점 보고서](implementation-prep-evidence.md), [실제 terminal 상태](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [원시 Codex 결과](../../phases/mitc4-shell-feast-eigen-execution-prep/step0-output.json) | blocked-environment; Hook 설정 미변경, 마지막 test 수정 미검증, 수동 full VERIFY 및 solver 구현/reference 미실행 | +| correction r2 attempt 1 | [owner 보고서](corrections.md), [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-result.json), [검증 inventory](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json) | blocked-environment; source echo RED 21 fail/16 pass 후 GREEN 37 pass. Full Python 152 pass/Hook assertion1 fail, manual build 접근 거부/CTest 미실행. 별도 registered Stop/CTest는 실제 exit0·362 pass. 전체 prep gate는 미통과 | +| implementation-planning r2 recovery delta | [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건), [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp), [main](implementation-plan.md) | pass; owner 3문서/hash/67 links/기존 AST 보존 확인, Python code AST3·PowerShell9 blocks/errors0. Actual source checkpoint·status reset·DFA·추가 검증은 미실행이며 environment block 유지 | 공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다. 확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다. @@ -43,6 +45,23 @@ Root의 intake 시작 Git 조사에서는 worktree clean을 확인했다. 당시 ## 현재 bounded dispatch +Correction owner가 반환한 source/test/report와 실제 명령·hash·27개 상대 링크를 audit했다(exit `0`, missing link `0`). Native continuation3는 `1914.797`초 뒤 native/wrapper exit `0`으로 끝났고 branch/HEAD와 비소유 bytes가 모두 불변이었다. [등록 process 종료](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-registered-exits.json)의 Stop 두 process 및 CTest exit는 모두 `0`이다. [보존 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-archive.json)의 완료 CTest는 `362 passed/0 failed`, log SHA-256 `58abb8e4ad1c826c796ab2fd274081b6c6e9e8966c27b7d6c9dd69792693bee6`이며 보고서 SHA-256은 `d4ea3fb18accc2b2316eb439f56f5106d8ae6640fe79452cef6cb341b1933ee4`다. 보고서 작성 후 실제 관찰이므로 당시 미관찰 서술을 덮어쓰지 않는다. 이 자동 검증은 owner의 별도 manual build failure/CTest 미실행을 대체하지 않는다. + +Planning은 기존 `implementation-plan.md`, `implementation-environment.md`, `implementation-recovery.md`의 최소 delta를 완료했다. Root가 frozen 관리/계획 문서와 독립 owner의 `corrections.md` 정확7개를 먼저 checkpoint하고, 원래 prep owned_paths의 `scripts/execute.py`, `tests/test_execute.py`만 unchanged Executor `_commit_paths`로 보존하는 [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)를 확정했다. 기존 R2와 blocked/history/raw는 그대로 둔다. [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)는 확인된 workspace Python/pytest cache·고유 basetemp와 process-local UV offline/TEMP/TMP recipe를 실제 후속 invocation 및 복원 경계에 묶었다. Root의 [FileTracker IL 관찰](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/filetracker-initialization-observation.json)은 `Path.GetTempPath()`에서 얻은 경로가 관찰된 `GetLongFilePath` 접근 거부 위치임을 입증했다(SHA-256 `8d47f96ba913a9adc2d89772cef4b27ea2187f613416912d894608be9730c5cc`). 새 TEMP/TMP remedy의 실제 native build 성공은 아직 검증하지 않았다. Source/Hook/phase 제어 수정·status reset·test/Executor 실행은 이번 Planning에서 수행하지 않았다. + +### 이전 실제 보존과 native dispatch 이력 + +Root가 아래 정확8개 문서를 `7dca487da1790c167058cc4fc07b7afc902fe31f`로 checkpoint했다. 이후 Coordinator는 문서 [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 PowerShell block을 그대로 실제 실행했다. Python native exit를 즉시 전파한 managed command exit는 `0`, 약1.90초였다. 실제 Executor `_commit_paths`가 구현8개를 `6e00dba117d836fce02c6918abec06cbae9dbdeb`, blocked control2개를 `5dfbea7e543b64fdefcea292de43237adb790a72`로 각각 보존했다. 모든 owned/control/step/raw bytes, blocked/history1 및 branch가 전후 동일했고 최종 clean/정상 preflight를 확인했다. 변경을 통과 상태로 바꾸지 않았으며 보호된 Hook은 그대로다. +`mitc4-shell-feast-eigen|implementation|harness|r2`의 unused Correction allowance에 대한 첫 bounded dispatch를 요청했다. 그러나 `collaboration.spawn_agent(agent_type=correction-agent, task_name=classifier_correction)`는 `agent thread limit reached`를 반환했고 새 agent/session이 생성되지 않았다. 실제 source/test 수정·RED/GREEN/full 검증은 시작되지 않았으며 allowance를 소비하지 않는다. 현재 root/Coordinator와 완료된 Formulation/Planning thread가 보이고 사용 가능한 tool에는 agent close 기능이 없다. 기존 specialist의 hard role을 대리 Correction으로 바꾸지 않고 Root에 서비스 capacity 문제를 전달했다. +Capacity 해소 후 처음 할당할 정확한 수정 소유는 `scripts/execute.py`, `tests/test_execute.py`, 현재 Feature의 `corrections.md`다. 실제 source-echo reproducer와 prep의 classifier 회귀3개를 RED→최소 GREEN→focused/configured full 검증하며 true helper·terminal/history·실제 timeout retry 보호를 유지한다. Hook/index/status/Git/타 owner 보고서/reference는 읽기 전용이다. 미적용 Hook의 환경 실패도 실제 결과와 미실행을 정확히 분리하며 검사 제외나 성공 대체를 하지 않는다. +현재 Planning task는 종료되었다. Correction 실제 결과를 받은 뒤에만 Planning을 재개해 수정 source/report checkpoint를 구체화하고 사용자 exact-run 승인 준비를 완료한다. 이 Correction의 결과와 후속 Implementation rerun 전에는 main/physics/release를 진행하지 않는다. +Root도 collaboration close 기능이 없음을 확인했고, 기존 Harness와 같은 native `codex exec` 경로로 공식 [Correction profile](../../.codex/agents/correction-agent.toml)을 그대로 주입하는 bounded 대안을 확인했다. Local `codex exec --help`는 exit `0`; 실제 Harness의 profile prompt 주입·xhigh/workspace-write/등록 Hook flags·stdin 전달 경로를 읽었다. 해당 profile은 model을 지정하지 않으므로 CLI의 기존 model 설정을 임의 변경하지 않는다. +별도 one-time native Correction은 유한14400초·재시도0으로 실행하고 stdout/stderr/native exit와 branch/HEAD·비소유 bytes·phase/history/raw 불변을 ignored `.../prep/classifier-correction/`에 보존한다. Phase Executor나 그 transport attempt가 아니며 현재 phase index를 쓰지 않는다. Source/Hook runtime을 이 실행 wrapper에서 고치거나 classifier를 override하지 않는다. Root/Coordinator도 해당 세션 중 non-owned 편집·커밋을 멈춘다. +첫 native thread `01a07476-082e-7863-b5be-3ca71003d70d`, managed session `76065`는 461.218초 뒤 native/wrapper exit `0`으로 종료했다. [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-result.json)는 branch/HEAD와 비소유 bytes 불변, source/test 변경0을 확인한다. Owner [corrections](corrections.md)의 outcome은 `blocked-environment`이며 pytest entry가 collection 전에 uv cache 접근 거부로 exit `2`였다. 따라서 RED/GREEN/전체 검증과 실제 classifier 수정은 모두0이다. 작성 당시 보고서 SHA-256 `6bd03c4336d2958eb668d1bf07ef55059c317e4fc105bed0e16dd5179d3c3263`와 [원본 보고서 복사본](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-entry-blocked-report.md)을 보존한다. +Root가 정상 도구 설정으로 새 workspace ignored `.../classifier-correction/uv-cache`와 실제 절대 `uv.exe`/hermes venv `python.exe`를 지정해 pytest 실행 진입을 준비했다(exit `0`, 4.17초, pytest9.1.1). 기존 거부 cache/Hook/source/test는 변경하지 않았으며 native 접근 가능이나 RED/검증 증거를 대신하지 않는다. 이제 **동일 thread·동일 Correction attempt1**을 이 환경 해소로 이어간다. 새 classifier 수정 회차·새 retry key·추가 allowance를 만들지 않으며 아직 한 번도 수정하지 않은 bounded 결함만 수행한다. 다음 native command는 `codex exec ... resume <해당 thread> -`와 동일 profile/xhigh/workspace-write/유한14400초를 사용하고 첫 진입 실패와 후속 실제 결과를 각각 보존한다. + +### 복구계획 감사와 WIP 실행 이력 + Planning owner의 복구계획 반환4개를 감사했다. [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 unchanged `_commit_paths` 호출은 timeout-only AST·origin 이후 정확8개 문서 경로·linked identity·role·default sandbox·source8/control2 dirty 범위·blocked/history/raw/모든 파일 bytes 불변을 확인한다. 구현 WIP와 blocked metadata를 별도 commit하고 성공 상태를 만들지 않는다. [R3/R4](implementation-recovery.md#r3-승인-후에만-가능한-status-only-checkpoint)는 실제 Correction/후속 checkpoint/해당 실행 직전 사용자 승인 뒤에만 조건부 실행한다. Owner 정적 검증은 Python checkpoint AST2/local links107/EOF·whitespace와 PowerShell block3 syntax errors0, 각 exit `0`이다. Coordinator는 반환4개 owner/r2/hash·links107/AST2를 재확인했고 exit `0`, 실제 read-only Executor constructor/identity/profile/linked/default sandbox 확인도 exit `0`이었다. `implementation-verification.md`, source/tests/index/top/raw는 이 Planning 작업에서 변경하지 않았다. 이 audit는 복구계획만 수용하며 implementation outcome은 `blocked-environment`를 유지한다. 실행 순서는 Root의 정확8문서 checkpoint → Coordinator가 R2의 실제 Executor WIP 두 commit을 할당 → 공식 Correction Agent가 재현된 classifier 결함만 수정·검증 → 실제 결과에 대한 Planning의 후속 checkpoint 감사 → 사용자 exact-run 승인 및 status-only recovery → 새 prep process다. 이미 로드된 classifier를 reload/override하지 않는다. 현재는 Correction 미실행이고 별도 allowance를 아직 사용하지 않았다. R2 실행 중에는 모든 non-owned 문서/코드 편집과 Root Git 작업을 동결한다. @@ -352,3 +371,9 @@ Root는 사용자 승인된 가역적 운영준비 범위 안에서, 실제 repo `mitc4-shell-feast-eigen|implementation|environment|r2`: actual attempt `1`, native terminal `blocked`, transport retry `0`, Correction `0`, Implementation rerun `0`이다. Specialist가 반환한 `focused-verify` 문구를 implementation gate로 정규화했으며 새로운 실패 key를 만들지 않았다. Focused test의 마지막 적용 수정은 미검증으로 남는다. 이를 환경 실패로 통과 처리하거나 새 correction allowance로 취급하지 않는다. 환경 해소 후 같은 Step owner가 해당 test와 전체 필수 검증을 완료해야 한다. +`mitc4-shell-feast-eigen|implementation|harness|r2`: collaboration spawn 요청은 서비스 thread 한도로 거부되어 실행/allowance를 소비하지 않았다. 공식 profile의 첫 native Correction `1회`를 할당하며 같은 key의 추가 Correction은 금지한다. Implementation rerun은 아직 `0회`다. 실제 Hook 환경 key를 문구만 바꾸어 재발급한 것이 아니라 독립 재현된 분류 결함을 분리한 것이다. +동일 native thread의 continuation3에서 실제 최소 source 교정 `1회`와 새 37개 GREEN을 완료했다. 따라서 harness key의 Correction allowance는 사용되었고 두 번째 source correction은 금지한다. 전체 gate의 environment block과 향후 한 번의 Implementation rerun은 별도로 유지한다. Native/등록 Stop 종료 전후 추가 source cycle, phase transport retry 또는 history reset은 없었다. +첫 native는 collection 이전 환경 진입에서 끝나 실제 수정0이었다. Root의 새 local cache/interpreter 준비 뒤 동일 thread를 resume하는 것은 이 한 Correction의 미완료 작업을 계속하는 것이며 두 번째 corrective change나 phase transport retry가 아니다. 첫 결과와 비용·실패 이력은 삭제하지 않는다. +첫 environment continuation도 제공된 hermes interpreter의 metadata 접근 거부로 collection 이전 exit `2`였다. Owner는 source/test 수정0과 미실행 검증을 보고서에 추가했고 [native continuation1 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-result.json)는 native/wrapper exit `0`, 1243.328초, branch/HEAD·비소유 bytes 불변을 확인했다. 별도 등록 Stop/CTest를 실행 중 process handle로 관찰하여 각각 exit `0`을 확보했다([실제 종료 코드](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-registered-exits.json)). 이는 classifier 수정 전 자동 검증이며 수동 full 또는 RED/GREEN 증거가 아니다. [완료 로그·보고서 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-archive.json)에 당시 파일과 hash를 보존했다. +Root가 거부된 interpreter를 복사하거나 다른 방식으로 읽지 않고 Python3.11.15의 독립 배포본을 새 workspace ignored `.../classifier-correction/python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe`에 설치했다(`uv python install --no-bin --no-registry`, exit `0`, 5.42초). 새 `workspace-python-cache`를 이용한 Root 실행 진입도 exit `0`, 2.59초, pytest9.1.1 및 해당 workspace base prefix를 확인했다. 동일 미수정 Correction/thread의 environment continuation2는 uv의 PyPI 재확인에서 network `os10051`, entry exit `2`로 collection 전에 종료했다. [실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-result.json)는 native/wrapper exit `0`, 227.593초, branch/HEAD·비소유 bytes 불변을 확인했다. [당시 owner 보고서](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-blocked-report.md)를 보존했으며 source/test 변경 및 RED 실행은 여전히 없다. +Root는 같은 독립 workspace Python을 base로 영속 `.../classifier-correction/pytest-venv/Scripts/python.exe`를 만들고 cached pytest9.1.1을 offline 설치했다. 생성·설치·직접 import는 exit `0`, 1.49초이며 별도 PowerShell의 직접 import도 exit `0`, 0.89초다. 동일 thread의 environment continuation3는 이 영속 interpreter를 직접 사용한다. 정상적인 대안은 같은 workspace runtime/cache의 `uv run --offline`이며, 필요 시 새 ignored pytest cache 및 고유 `--basetemp` 경로를 사용한다. 두 정상 진입 대안을 같은 작업 안에서 확인하되 거부된 기존 cache/interpreter 접근·network·권한 확대·test skip은 허용하지 않는다. 준비된 Root 환경 성공은 native RED/GREEN 증거가 아니며 실제 실행을 기다린다. 같은 미완료 Correction attempt `1`과 원시 이력을 유지한다. diff --git a/docs/mitc4-shell-feast-eigen/corrections.md b/docs/mitc4-shell-feast-eigen/corrections.md new file mode 100644 index 0000000..be39026 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/corrections.md @@ -0,0 +1,112 @@ +# Source echo classifier 최소 교정 결과 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `correction-agent` +- Input contract revision: `r2` +- Outcome: `blocked-environment`; 다음 owner: `coordinator-agent` +- Dispatched failure_classification: `harness` +- Retry key: `mitc4-shell-feast-eigen|implementation|harness|r2` +- Attempt: `1`; 동일 unfinished assignment에서 ONE minimal correction을 수행했다. 이전 환경 continuation은 추가 allowance 또는 phase transport retry가 아니다. + +기준: [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [MFE-ADR-012](ADR.md#mfe-adr-012--source-echo-분류-오탐의-bounded-운영-correction), +[dispatch](coordination.md), [implementation-plan](implementation-plan.md), [환경](implementation-environment.md), +[복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [verification](implementation-verification.md), +[prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md). +Trace: `FEM-REQ-MITC4-EIGEN-023/025`, `MFE-C27`, `IO-T11`. + +## 핵심 결과 + +**Source echo 오탐은 교정됐고 신규 37개 회귀가 통과했다.** +전체 gate는 MSVC build의 환경 접근 거부와 protected Hook timeout 불일치로 미완료다. +Full pytest는 `152 passed, 1 failed`이며 실패 assertion을 변경하거나 제외하지 않았다. + +Production 변경은 [execute.py](../../scripts/execute.py)의 기존 `_codex_environment_failure`와 +새 private `_stdout_has_helper_failure`뿐이다. Stderr helper 검사를 유지하고 stdout은 +runtime prefix 또는 구조화된 `error/turn.failed`를 판별한다. Failed command의 출력도 +runtime prefix를 확인한다. 성공 command의 source/command payload와 agent의 source 설명을 +runtime failure로 사용하지 않는다. Auth/CLI 진단, terminal/history, retry, sandbox, ownership 함수는 변경하지 않았다. + +[사전 재현](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-baseline.json)은 수정 전 synthetic source excerpt와 archive raw 모두의 잘못된 helper 판정을 기록한다. +[교정 후 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-corrected-audit.json)은 같은 archive에서 helper 판정 `null` 및 +원래 명시적 Hook 쓰기 거부 사유의 `reported-blocked`를 확인한다. Historical phase/history/raw를 수정한 것이 아니다. +AST 비교도 위 두 method만의 변경을 확인했다. + +## RED → GREEN 및 검증 + +실행 Python은 workspace의 +`C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe`이며 +Python `3.11.15` / pytest `9.1.1`이다. Direct entry는 성공했고 uv/network fallback은 사용하지 않았다. +Python 명령은 `-B -X utf8 -m pytest -v -rs`, 허용된 workspace `cache_dir`와 실행별 새 `--basetemp`를 사용했다. +최초 RED만 기본 temp와 UTF-8 옵션 전 명령이었다. 실제 absolute command, stdout/stderr 경로·hash 및 +전체 parameter inventory는 [검증 summary](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json)와 각 실행 JSON에 있다. + +| 실행 / exact command record | Exit | Wall seconds | 실제 결과 | +| --- | ---: | ---: | --- | +| [최초 RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red.json) | 1 | 4.2882233 | 6 failed, 16 passed, 15 setup errors; 기본 `pytest-of-Mimi` temp 접근 거부를 별도 분류 | +| [새 workspace temp RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red-workspace-temp.json) | 1 | 8.1127850 | **21 failed, 16 passed**, 37 selected/36 deselected; setup errors 0 | +| [같은 targeted GREEN](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-green.json) | 0 | 8.8222791 | **37 passed**, 36 deselected; pytest 자체 duration 8.03 s | +| [Step0 전체 focused](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-focused.json) | 1 | 45.3687980 | 135 passed, 1 failed; pytest duration 44.58 s | +| [`cmake -S . -B .harness/build -A x64`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-configure.json) | 0 | 0.8602958 | VS18/MSVC/x64 cache configure 완료 | +| [`cmake --build .harness/build --config Debug`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.json) | 1 | 0.5442108 | FileTracker 초기화 접근 거부 | +| [전체 pytest](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.json) | 1 | 45.8682791 | **152 passed, 1 failed**, skip 0; pytest duration 45.03 s | + +새 필수 tests는 [test_execute.py](../../tests/test_execute.py)의 +`test_environment_classifier_ignores_successful_source_echo` 6 cases, +`test_environment_classifier_retains_runtime_helper_failure` 16 cases, +`test_successful_source_echo_preserves_terminal_and_retry` 15 cases다. +RED에서 6개 echo 오판과 15개 terminal/retry 오판을 관찰한 **뒤** production을 수정했다. +처음부터 통과한 true-runtime 16개를 새 RED로 주장하지 않는다. + +GREEN은 stdout/stderr의 실제 helper failure를 exit0/1에서 유지하고 mixed echo+failure도 차단한다. +Completed/exit0, explicit error/blocked의 원래 reason/history, pending missing-result, +nonzero/124만으로 retry 금지, 실제 wrapper timeout의 최대2회 시도 및 terminal 우선 처리를 확인했다. +Focused는 지정된 timeout/Executor/ownership/Hook scope/preset 전체 targets를 포함한다. +기존 timeout tests의 마지막 `.value` 수정도 focused/full에서 실제 통과했으며 해당 파일은 수정하지 않았다. + +## 남은 환경 blocker와 미실행 gate + +[Build stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.stdout.log)의 결정적 실패는 +`ZERO_CHECK.vcxproj`의 `GetOutOfDateItems` → `Microsoft.Build.Utilities.FileTracker` +type initializer에서 발생한 `MSB4018 / UnauthorizedAccessException / 0x80070005 (E_ACCESSDENIED)`다. +Source compile correctness 실패로 재해석하거나 build guard를 변경하지 않았다. +선행 full build 실패에 따라 아래 CTest 명령은 미실행이며 count/exit/duration을 주장하지 않는다. + +- `ctest --test-dir .harness/build -C Debug --show-only=json-v1` +- `ctest --test-dir .harness/build -C Debug --output-on-failure` + +[Focused/full pytest failure](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.stdout.log)는 +`tests/test_harness_timeouts.py:175 / test_registered_hook_and_one_time_invocation_contract`의 +`assert 1800 == 7500` 한 건이다. Protected `.codex/hooks.json`은 편집하지 않았고 해당 test도 유지했다. +두 환경 blocker 해소 후 승인된 full build/CTest와 전체 pytest 검증이 남아 있다. +기존 registered Stop/CTest의 source 변경 전 `362 tests / exit0` 관찰은 이번 manual full evidence를 대신하지 않는다. +등록 Stop은 활성 상태 그대로이며 수동 호출·state 조작 없이 이번 최종 결과는 보고 시점 미관찰이다. +이 운영 correction에는 별도 eigen/reference comparison이 적용되지 않는다. + +## 이전 환경 진입 이력 + +| Entry | 보존된 결과 | +| --- | --- | +| [최초 기본 uv entry](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906020757Z-red-entry.json) | exit2 / 0.0395046 s; 사용자 cache 접근 거부, collection 전 중단 | +| [continuation1](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906021629Z-continuation-entry-failure.json) | exit2 / managed 0.133794 s; hermes interpreter metadata 접근 거부 | +| [continuation2](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906024054Z-continuation2-entry.json) | exit2 / 11.5178819 s; PyPI network os10051, Python 실행 전 중단 | + +각 환경-only entry와 이전 blocked 보고서/native records는 보존했다. +이번 named venv 및 새 temp 선택은 Coordinator가 허용한 동일 correction의 환경 해소이며 +접근 거부된 cache/interpreter 재접근, network 사용 또는 sandbox 확대는 없었다. + +## 소유 파일과 인계 + +| Changed artifact | SHA-256 | +| --- | --- | +| `scripts/execute.py` | `64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0` | +| `tests/test_execute.py` | `0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6` | + +이 보고서의 hash와 non-owned byte/branch/HEAD/link 검토는 [최종 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-final-audit.json)에 둔다. +정확히 지정된 source/test/report 3개와 허용된 ignored evidence/cache/temp만 변경했다. +Coordinator의 dirty management 2개, upstream, phase/status/history, reference와 native records는 보존한다. +Branch `feat-mitc4-shell-feast-eigen-execution-prep`, HEAD `5dfbea7e543b64fdefcea292de43237adb790a72`를 유지한다. +Root Git writes, phase Executor, peer dispatch, 외부 solver, physics/release 승인 또는 workflow 전이는 없다. + +ONE minimal correction 이후 추가 수정 cycle은 수행하지 않는다. Targeted 교정 성공과 전체 gate의 +`blocked-environment`를 구분하여 Coordinator에 반환한다. 환경 해소·exact-run 조건 감사와 +한 번의 후속 Implementation rerun dispatch는 Coordinator 소유이며 즉시 `retry`로 전이시키지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-environment.md b/docs/mitc4-shell-feast-eigen/implementation-environment.md index f4fa24b..a02c470 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-environment.md +++ b/docs/mitc4-shell-feast-eigen/implementation-environment.md @@ -145,3 +145,115 @@ C++ source 변경 없는 prep의 same-binary 회귀와 새 binary의 fresh eigen evidence다. Final Step7는 직접 solver invocation·unique generated directory·원본 bytes/hash· binary/lib hash·result/log mtime/hash·call count를 남겨 freshness를 증명한다. 기존 helper가 파일 존재/mtime로 cache를 사용한 사실만으로 fresh라고 주장하지 않는다. + +## E6. Correction 후의 Python/pytest와 process TEMP + +[Correction 실제 기록](corrections.md)의 named venv `pytest-venv/Scripts/python.exe`는 +Python3.11.15/pytest9.1.1로 native GREEN37개와 전체153개 collection/실행에 성공했다. +아래 모든 경로의 기준은 workspace의 +`.harness/build/mitc4-eigen-evidence/prep/classifier-correction/`다. + +| 용도 | 확인된 상대 경로 | +| --- | --- | +| 직접 pytest 및 후속 Executor Python | `pytest-venv/Scripts/python.exe` | +| venv의 base runtime | `python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe` | +| uv의 workspace cache | `workspace-python-cache` | +| pytest cache | `pytest-cache` | + +Native에서는 direct venv entry를 사용했다. Root의 uv offline 진입도 별도로 관찰됐지만 +그 사실을 native uv 실행 성공으로 합치지 않는다. 후속 process의 PATH 앞에 named venv와 +base directory를 두고 UV_PYTHON/UV_CACHE_DIR/UV_OFFLINE을 정상 설정하여 child의 기본 +python/uv에도 전파한다. Global config·source·Hook command/guard는 바꾸지 않는다. + +[설치된 FileTracker IL 관찰](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/filetracker-initialization-observation.json)의 +SHA-256은 `8d47f96ba913a9adc2d89772cef4b27ea2187f613416912d894608be9730c5cc`다. +Initializer의 Path.GetTempPath→s_tempPath→GetLongFilePath 유일 호출과 실제 접근 거부 +stack이 대응하므로 새 workspace TEMP/TMP가 정상 운영 개선 후보라는 근거가 있다. +**이 변경으로 native build가 성공한 evidence는 아직 없다.** FileTracker를 끄거나 DFA가 +build 실패까지 해결한다고 추정하지 않는다. + +아래 전체 block은 [R6 source checkpoint](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건), +R3 status-only checkpoint와 **해당 exact prep DFA run 직전 명시 사용자 승인** 후에만 실행한다. +이 turn에는 어느 것도 실행하지 않는다. 새 ignored TEMP 경로는 workspace 안에서 생성하고 +기존 temp/evidence를 지우지 않는다. 기존 finite wrapper14400 및 모든 Executor guard를 유지한다. +Process 환경은 native 종료/오류 때 finally로 원래 값(미설정 포함)으로 복원한다. + +```powershell +$ErrorActionPreference = 'Stop' +$mfeRoot = (Get-Location).Path +$mfeEvidence = Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' +$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' +$mfeBasePython = Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' +$mfeUvCache = Join-Path $mfeEvidence 'workspace-python-cache' +foreach ($mfeFile in @($mfePython, $mfeBasePython)) { + if (-not (Test-Path -LiteralPath $mfeFile -PathType Leaf)) { throw "Missing Python: $mfeFile" } +} +Get-Command uv -ErrorAction Stop | Out-Null +$mfeGitRoot = git rev-parse --show-toplevel +$mfeIdentityExit = $LASTEXITCODE +if ($mfeIdentityExit -ne 0 -or [IO.Path]::GetFullPath($mfeGitRoot) -ne [IO.Path]::GetFullPath($mfeRoot)) { + throw 'Workspace root mismatch' +} +$mfeRunTemp = Join-Path $mfeEvidence ('native-temp-' + [guid]::NewGuid().ToString('N')) +if (-not [IO.Path]::GetFullPath($mfeRunTemp).StartsWith([IO.Path]::GetFullPath($mfeEvidence) + [IO.Path]::DirectorySeparatorChar)) { + throw 'Temp path outside approved workspace evidence' +} +$null = New-Item -ItemType Directory -Path $mfeRunTemp +$mfeEnvNames = @('PATH', 'UV_PYTHON', 'UV_CACHE_DIR', 'UV_OFFLINE', 'TEMP', 'TMP', 'FEM_HARNESS_CODEX_SANDBOX') +$mfeBeforeEnv = @{} +foreach ($mfeName in $mfeEnvNames) { + $mfeBeforeEnv[$mfeName] = [Environment]::GetEnvironmentVariable($mfeName, 'Process') +} +if ($null -ne $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -and $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -ne 'workspace-write') { + throw 'Unexpected pre-existing sandbox environment' +} +$mfeNativeExit = $null +try { + $env:PATH = (Split-Path $mfePython) + ';' + (Split-Path $mfeBasePython) + ';' + $mfeBeforeEnv['PATH'] + $env:UV_PYTHON = $mfePython + $env:UV_CACHE_DIR = $mfeUvCache + $env:UV_OFFLINE = 'true' + $env:TEMP = $mfeRunTemp + $env:TMP = $mfeRunTemp + $env:FEM_HARNESS_CODEX_SANDBOX = 'danger-full-access' + & $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep --approve-danger-full-access + $mfeNativeExit = $LASTEXITCODE + if ($null -eq $mfeNativeExit) { throw 'Native Executor exit unavailable' } +} +finally { + foreach ($mfeName in $mfeEnvNames) { + [Environment]::SetEnvironmentVariable($mfeName, $mfeBeforeEnv[$mfeName], 'Process') + } +} +exit $mfeNativeExit +``` + +재개 Implementation은 inherited 환경을 확인한 뒤 pytest entry를 아래 direct venv 방식으로 +사용한다. 기존 Step0의 대상/모든 assertions를 유지하며 collection에서3개 classifier test의 +6/16/15 parameter inventory를 확인한다. 각 **호출마다 새** basetemp를 만들어 pytest가 기존 +evidence directory를 정리하지 않게 한다. 이전 GREEN은 새 RED가 아니다. + +```powershell +$ErrorActionPreference = 'Stop' +$mfeEvidence = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' +$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' +$mfePytestRuns = @( + @{ label = 'classifier'; targets = @('tests/test_execute.py', '-k', 'environment_classifier or successful_source_echo') }, + @{ label = 'focused'; targets = @('tests/test_harness_timeouts.py', 'tests/test_execute.py', 'tests/test_execute_ownership.py', 'tests/test_hook_validation_scope.py', 'tests/test_harness_preset_contract.py') }, + @{ label = 'full'; targets = @() } +) +foreach ($mfeRun in $mfePytestRuns) { + $mfeFreshBase = Join-Path $mfeEvidence ('pytest-' + $mfeRun.label + '-' + [guid]::NewGuid().ToString('N')) + $mfeCache = Join-Path $mfeEvidence 'pytest-cache' + $mfeTargets = $mfeRun.targets + & $mfePython -B -X utf8 -m pytest -v -rs -o "cache_dir=$mfeCache" "--basetemp=$mfeFreshBase" @mfeTargets + $mfePytestExit = $LASTEXITCODE + Write-Output ("pytest {0}: exit {1}; basetemp {2}" -f $mfeRun.label, $mfePytestExit, $mfeFreshBase) + if ($null -eq $mfePytestExit -or $mfePytestExit -ne 0) { throw 'pytest verification failed' } +} +``` + +CMake/MSVC/x64/Debug configure/build와 전체 CTest discovery/run은 기존 Step0의 정확한 +명령을 같은 inherited TEMP/TMP에서 별도로 실행한다. 실패 시 actual command/exit와 남은 +검증을 기록한다. Registered Stop을 수동 full 검증으로 대체하지 않으며 원 보고서 갱신은 +Implementation owner, 종료 뒤 사후 감사는 Coordinator 소유다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-plan.md b/docs/mitc4-shell-feast-eigen/implementation-plan.md index 8a939b7..e0f2551 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-plan.md +++ b/docs/mitc4-shell-feast-eigen/implementation-plan.md @@ -12,6 +12,12 @@ Prep에는 성공한 source echo를 helper failure로 오판한 재현 결함의 최소 classifier TDD도 포함한다. 기존 scripts/execute.py/tests/test_execute.py 소유 안에서 수행한다. +별도 Correction은 실제 RED21fail/16pass 뒤 GREEN37pass를 확보했다. 전체 pytest의 Hook +불일치와 manual build의 TEMP 접근 거부는 남아 있다. [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)의 +source2 보존 뒤 [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)의 +확인된 Python 및 정상 TEMP/TMP 설정으로 후속 검증을 준비한다. 현재 source checkpoint, +status reset과 DFA 실행은 미실행이며 exact-run 명시 승인도 아직 없다. + [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 bf97ef3..b5161ae 100644 --- a/docs/mitc4-shell-feast-eigen/implementation-recovery.md +++ b/docs/mitc4-shell-feast-eigen/implementation-recovery.md @@ -275,3 +275,125 @@ checkpoint에 사용되는 guard가 변경되지 않았음을 확인했다. Phas 동일하며 상태 blocked/history1이다. 문서 EOF/trailing whitespace·local links와 `git diff --check`도 확인했다. Commit/status edit/DFA/CMake/CTest/pytest는 미실행이다. 최종 scope/link count·hash는 handoff에 기록한다. + +## R6. 실제 Correction source2의 보존과 남은 실행 조건 + +R2는 실제 WIP commit `6e00dba1`과 blocked metadata commit +`5dfbea7e543b64fdefcea292de43237adb790a72`을 만든 **과거 명령**이다. +이후 classifier가 바뀌었으므로 그 timeout-only AST guard를 다시 쓰거나 완화하지 않는다. +[Correction 보고서](corrections.md)와 [검증 summary](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json)는 +실제 RED21fail/16pass 뒤 GREEN37pass, 전체 pytest152pass/1fail을 기록한다. +Manual configure0/build1의 FileTracker TEMP 접근 거부 뒤 manual CTest는 미실행이다. +[실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-result.json)는 +native/wrapper0,1914.797초이며, [등록 process exits](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-registered-exits.json)의 +Stop2개/CTest exit0 및362pass는 별도 자동 검증이다. 이를 manual full 성공으로 합치지 않는다. + +Classifier key의 Correction1회는 사용됐고 추가 source correction은 허용하지 않는다. +재개 Implementation은 확보된 RED/GREEN을 읽고 현재 source의 focused/full을 재검증한다. +GREEN source를 다시 망가뜨려 RED를 만들지 않는다. 과거 timeout RED와 마지막 enum fix의 +당시 미검증 기록은 보존하며, enum fix가 이번 focused/full에서 통과했다는 새 evidence를 구분한다. +Protected Hook1800!=7500과 manual build 환경 문제는 아직 해소되지 않았다. + +Root는 frozen management `FEATURED_AGENTS.md/ADR.md/coordination.md`, Planning의 +`implementation-plan.md/implementation-environment.md/implementation-recovery.md`, +독립 Correction의 `corrections.md` **정확7문서만** 먼저 checkpoint한다. +Correction 보고서는 prep owned_paths 밖이므로 이 선행 문서 commit으로 clean하게 만든다. +Root ack 뒤에만 Coordinator가 아래 실제 unchanged Executor method 호출을 할당한다. +Dirty 경로는 source2만 허용하며 phase/top/raw/Hook/status/history와 report는 불변이다. +아래 AST normalization은 검사에만 사용하고 실행 module/method를 교체하지 않는다. + +```powershell +$ErrorActionPreference = 'Stop' +$mfeCheckpointPython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' +if (-not (Test-Path -LiteralPath $mfeCheckpointPython -PathType Leaf)) { throw 'Named Python missing' } +@' +import ast, hashlib, json +from pathlib import Path +from scripts import execute +phase = "mitc4-shell-feast-eigen-execution-prep" +origin = "5dfbea7e543b64fdefcea292de43237adb790a72" +ex = execute.StepExecutor(phase) +root = Path(ex._root) +assert Path.cwd().resolve() == root +assert Path(ex._run_git_checked("rev-parse", "--show-toplevel").stdout.strip()).resolve() == root +assert ex._is_isolated_worktree() and ex._codex_sandbox_mode() == "workspace-write" +assert ex._implementation_agent_settings() == ("gpt-5.6-terra", "xhigh") +branch, before_head = ex._git_execution_identity() +assert branch == "refs/heads/feat-" + phase +ex._run_git_checked("merge-base", "--is-ancestor", origin, "HEAD") +docs = {"docs/mitc4-shell-feast-eigen/" + p for p in ( + "FEATURED_AGENTS.md", "ADR.md", "coordination.md", "implementation-plan.md", + "implementation-environment.md", "implementation-recovery.md", "corrections.md")} +assert set(ex._run_git_checked("diff", "--name-only", "--no-renames", + origin, "HEAD").stdout.splitlines()) <= docs +assert not ex._run_git_checked("diff", "--cached", "--name-only").stdout.strip() +sources = {"scripts/execute.py": "64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", + "tests/test_execute.py": "0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} +fixed = {".codex/hooks.json": "0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28", + "phases/index.json": "2e4dfef44cd76b7ae447d0e2186a8a949ec29627df9c573646162b92348f1edb", + "phases/" + phase + "/index.json": "e23269a5518a8dbffbbf2e4706431d7f8af67e43706dcc9086aa6c8991d24262", + "phases/" + phase + "/step0-output.json": "0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941", + "docs/mitc4-shell-feast-eigen/corrections.md": "d4ea3fb18accc2b2316eb439f56f5106d8ae6640fe79452cef6cb341b1933ee4"} +def check_hashes(): + for path, expected in {**sources, **fixed}.items(): + assert hashlib.sha256((root / path).read_bytes()).hexdigest() == expected, path +check_hashes() +old_tree = ast.parse(ex._run_git_checked("show", origin + ":scripts/execute.py").stdout) +new_tree = ast.parse((root / "scripts/execute.py").read_text(encoding="utf-8")) +old_cls = next(n for n in old_tree.body if isinstance(n, ast.ClassDef) and n.name == "StepExecutor") +new_cls = next(n for n in new_tree.body if isinstance(n, ast.ClassDef) and n.name == "StepExecutor") +old_methods = {n.name: n for n in old_cls.body if isinstance(n, ast.FunctionDef)} +new_methods = {n.name: n for n in new_cls.body if isinstance(n, ast.FunctionDef)} +assert set(new_methods) - set(old_methods) == {"_stdout_has_helper_failure"} +assert not set(old_methods) - set(new_methods) +assert {n for n in old_methods if ast.dump(old_methods[n]) != ast.dump(new_methods[n])} == {"_codex_environment_failure"} +new_cls.body = [old_methods["_codex_environment_failure"] if isinstance(n, ast.FunctionDef) + and n.name == "_codex_environment_failure" else n for n in new_cls.body + if not (isinstance(n, ast.FunctionDef) and n.name == "_stdout_has_helper_failure")] +assert ast.dump(new_tree) == ast.dump(old_tree) +idx = ex._read_phase_index() +top = ex._read_top_index() +assert len(idx["steps"]) == 1 and idx["steps"][0]["status"] == "blocked" +assert len(idx["steps"][0]["attempt_history"]) == 1 +assert next(p for p in top["phases"] if p["dir"] == phase)["status"] == "blocked" +owned = ex._step_owned_paths(idx["steps"][0]) +assert set(sources) <= set(owned) +assert set(ex._assert_step_scope(owned)) == set(sources) +snapshot = {p: (root / p).read_bytes() for p in + list(owned) + list(fixed) + ["phases/" + phase + "/step0.md", + "phases/mitc4-shell-feast-eigen/index.json"]} +assert ex._commit_paths(list(sources), + "chore(mitc4-shell-feast-eigen-execution-prep): WIP classifier correction with full verification blocked", + owned_paths=owned) +after_branch, after_head = ex._git_execution_identity() +assert after_branch == branch and after_head != before_head +actual = ex._run_git_checked("diff-tree", "--no-commit-id", "--name-only", + "--no-renames", "-r", after_head).stdout.splitlines() +assert set(actual) == set(sources) +assert all((root / p).read_bytes() == value for p, value in snapshot.items()) +check_hashes() +assert ex._read_phase_index() == idx and ex._read_top_index() == top +assert not ex._worktree_paths() +ex._preflight_repository() +print(json.dumps({"commit": after_head, "paths": sorted(actual), "clean": True, + "status": "blocked", "history_count": 1, "branch": branch})) +'@ | & $mfeCheckpointPython -B -X utf8 - +$mfeCorrectionCommitExit = $LASTEXITCODE +if ($null -eq $mfeCorrectionCommitExit) { throw 'Native exit unavailable' } +exit $mfeCorrectionCommitExit +``` + +이 명령은 아직 미실행이다. Native exit와 commit path/hash/clean 결과를 실제 관찰한 뒤 +Coordinator가 감사한다. 실패하면 현재 bytes/index/HEAD를 보존하고 자동 재시도하지 않는다. +새 source commit은 WIP와 전체 검증의 제한을 명시하며 `_commit_step`/completed를 호출하지 않는다. + +성공 뒤에도 R3의 별도 status-only 할당과 해당 실행 직전 exact DFA 사용자 승인이 필요하다. +DFA는 아직 승인되지 않았다. 후속 native process에는 [E6의 실제 환경 recipe](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)를 적용하고, +그 환경에서 R4와 동일한 phase/finite14400/approval flag를 사용한다. 새 process는 corrected +classifier를 로드한다. Protected Hook 권한과 TEMP/TMP 운영 설정의 근거를 혼동하지 않는다. +Prep full gate·등록 Stop 실제 exit·Coordinator 사후 감사 전 main activation은 금지다. + +정적 검증은 command AST/PowerShell syntax, source2/report hash, 변경 method2와 나머지 +Executor AST 불변, local links/EOF/whitespace와 blocked archive 동일성을 대상으로 했다. +정확 결과와 갱신3문서 hash는 handoff에 기록한다. Source/tests/Hook/phase/status/Git과 +Correction 본문은 이번 Planning 작업에서 수정하지 않았다.