docs: preserve classifier correction and bounded prep recovery
This commit is contained in:
@@ -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 후 재개 |
|
||||
|
||||
@@ -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`과 원시 이력을 유지한다.
|
||||
|
||||
@@ -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 작업에서 수정하지 않았다.
|
||||
|
||||
Reference in New Issue
Block a user