docs: preserve classifier correction and bounded prep recovery

This commit is contained in:
KOKO\Mimi
2026-09-06 12:42:15 +09:00
parent 5dfbea7e54
commit 0a98b2c4fa
7 changed files with 386 additions and 7 deletions
+2 -1
View File
@@ -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에서 고정한다.
@@ -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 후 재개 |
+31 -6
View File
@@ -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`과 원시 이력을 유지한다.
+112
View File
@@ -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`로 전이시키지 않는다.
@@ -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 소유다.
@@ -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를 적용한다.
@@ -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 작업에서 수정하지 않았다.