docs: preserve Ninja failure and bound environment recovery
This commit is contained in:
@@ -53,11 +53,12 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실
|
|||||||
| [io-schema.md](io-schema.md) | io-definition-agent | r2 | 기존 static 보존·eigen discriminant·N vectors/all-c evidence·self-check |
|
| [io-schema.md](io-schema.md) | io-definition-agent | r2 | 기존 static 보존·eigen discriminant·N vectors/all-c evidence·self-check |
|
||||||
| [io-mapping.md](io-mapping.md) | io-definition-agent | r2 | 책임·candidate 보존·TXT Value-only·27개 요구/11개 I/O 검증 obligation |
|
| [io-mapping.md](io-mapping.md) | io-definition-agent | r2 | 책임·candidate 보존·TXT Value-only·27개 요구/11개 I/O 검증 obligation |
|
||||||
| [implementation-plan.md](implementation-plan.md) | implementation-planning-agent | r2 | Prep 1/main 8개 step 및 실행 계획 gate pass |
|
| [implementation-plan.md](implementation-plan.md) | implementation-planning-agent | r2 | Prep 1/main 8개 step 및 실행 계획 gate pass |
|
||||||
| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E8 기존 Ninja preset의 exact Root setup/native·registered same graph 명령 감사 완료; actual native 성공은 미검증 |
|
| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E9 병렬도1·실제 clean-first discovery 검증 계획 감사 완료; canonical Hook 적용 경계로 activation 미확정 |
|
||||||
| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R8 실패 보존 실제 완료; R9 별도 status-only/Executor checkpoint 계획 감사 완료, 실행 상태는 coordination |
|
| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R10 attempt4 report1/control2 실패 보존 계획 감사 완료; 실제 WIP/조건부 R11 실행은 coordination 참조 |
|
||||||
| [implementation-interfaces.md](implementation-interfaces.md) | implementation-planning-agent | r2 | 기존 확장점·API/source-test·vendor/state/transaction 책임 |
|
| [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-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 | attempt1/2 역사와 attempt3 classifier37/focused136 pass·manual build 환경 차단; 별도 registered362 pass와 terminal 판정은 coordination 참조 |
|
| [implementation-prep-evidence.md](implementation-prep-evidence.md) | implementation-agent | r2 | attempt4 classifier37/focused136 pass·manual Ninja discovery failure; 전체 gate 미통과 및 raw/registered 경계는 coordination 참조 |
|
||||||
|
| [msvc-build-access-error.md](msvc-build-access-error.md) | Root (사용자 요청 설명문서) | r2 | 실제 접근 오류·정상 Ninja 전환·남은 discovery/Hook 경계를 기록한 독립 설명; exact1 docs commit 완료 |
|
||||||
| [corrections.md](corrections.md) | correction-agent | r2 | source echo 최소 교정1회·RED/GREEN37 확인; full Python Hook1실패와 manual build 환경 차단 보존, registered Stop362 pass는 coordination 후속 evidence |
|
| [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 |
|
| [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 | actual attempt3 blocked/history3 보존·R9 pending 복구 완료; 재개 원본은 coordination |
|
| [prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | actual attempt3 blocked/history3 보존·R9 pending 복구 완료; 재개 원본은 coordination |
|
||||||
|
|||||||
@@ -3,15 +3,15 @@
|
|||||||
- Feature ID: `mitc4-shell-feast-eigen`
|
- Feature ID: `mitc4-shell-feast-eigen`
|
||||||
- Owner: `coordinator-agent`
|
- Owner: `coordinator-agent`
|
||||||
- Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위)
|
- Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위)
|
||||||
- Stage: `implementation` (E8.1 setup/R9 완료; 정상 Ninja prep 재개)
|
- Stage: `implementation` (E8.2 actual terminal 보존; 최소 정상 환경 복구 계획)
|
||||||
- Outcome: `retry`
|
- Outcome: `blocked-environment`
|
||||||
- Next owner: `implementation-agent` (actual Executor의 E8.2 prep Step0; 기본 workspace-write)
|
- Next owner: `coordinator-agent` (동결 문서 checkpoint 뒤 unchanged Executor R10 실패 WIP 보존)
|
||||||
- Attempt: `4` (이번 정상 Ninja 환경 재개 할당; 실제 기존 history3 보존)
|
- Attempt: `4` (actual Step0 error/history4; 이전 history3 보존)
|
||||||
- Completion: 미완료
|
- Completion: 미완료
|
||||||
- Failure classification: `environment`
|
- Failure classification: `environment`
|
||||||
- Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2`
|
- Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2`
|
||||||
- Escalation class: `null`
|
- Escalation class: `null`
|
||||||
- Blocker: `null` (정상 Ninja configure와 R9 control checkpoint/clean 완료; native build/full VERIFY는 실제 재개에서 확인)
|
- Blocker: Ninja 병렬 GoogleTest discovery의 공유 JSON 실패로 manual full VERIFY 미완료. 현재 Hook resolver는 canonical Stop1800을 선택하며 정상 설정 적용 방법도 미확정이다.
|
||||||
|
|
||||||
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
|
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
|
||||||
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md).
|
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md).
|
||||||
@@ -45,12 +45,39 @@ Root의 intake 시작 Git 조사에서는 worktree clean을 확인했다. 당시
|
|||||||
|
|
||||||
## 현재 bounded dispatch
|
## 현재 bounded dispatch
|
||||||
|
|
||||||
|
E8.2 native는 자연 종료했다. Planning은 소유 세 문서의 [R10 실패 보존](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)과 [E9 조건부 직렬 환경](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)을 반환했다. R10은 기존 unchanged guarded Executor의 report1/control2 WIP 보존을 current exact hash/history4로 고정하고 Root [MSVC 접근 오류 설명](msvc-build-access-error.md)의 exact1 선행 문서 commit을 허용 경로에 포함한다. E9는 `CMAKE_BUILD_PARALLEL_LEVEL=1`의 parent/manual/registered 공통 적용과 한 번의 정상 clean-first/verbose build에서 실제 세 discovery 및 등록 identity 검증을 정의한다. Installed module, source/test, discovery guard, timeout 또는 sandbox 정책은 수정하지 않는다. Planning 정적 감사는 PowerShell24 오류0/Python AST9/local links101 누락0/보호11hash·Executor AST·HEAD/error-history4 보존과 diff-check exit0이며, Coordinator는 R10 명령·소유·현재 hash와 조건부 activation 경계를 대조해 문서 delta를 pass로 수용했다. 이는 prep gate 통과가 아니다. 다음은 Root exact5 문서 checkpoint와 Coordinator의 R10 actual preservation이며 status-only recovery/추가 native는 아직 할당하지 않는다.
|
||||||
|
|
||||||
|
Root의 [현재 Hook 설정 해석](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json)은 설치 CLI0.153.2의 config-only `hooks/list`에서 현재 worktree cwd의 enabled/trusted Stop source를 canonical checkout `.codex/hooks.json`, `timeoutSec=1800`으로 확인했다(exit0). Linked 파일7500과 달라 실제 wrapper 수명 약1802.6초를 설명하는 근거이며, 과거 native raw에 설정 로드 경로 event가 없다는 한계는 유지한다. Inline Hook 추가는 additive라 기존1800을 대체한다고 가정하지 않는다. Root는 정상 per-invocation/worktree 설정 지원 여부만 마지막 bounded read-only로 확인하며 canonical/Hook/trust 파일을 변경하지 않는다. 이 확인은 실패 WIP 보존과 독립적으로 진행한다. 현재 추가 native, status reset, main8steps 또는 downstream gate 전이는 없다.
|
||||||
|
|
||||||
|
Root의 [최종 bounded 설정 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-source-audit.json)는 공식 지원 `project_root_markers`를 이용한 strict-config 목록조회도 같은 canonical1800을 선택함을 확인했다(server exit0). 조사한 문서/schema에서는 기존 sourcePath/timeout을 대체하는 정상 per-invocation 방법을 찾지 못했다. 두 Hook 파일은 Stop timeout 외 의미가 같지만 canonical 파일은 현재 exact ownership 밖이다. 남은 실제 적용의 권한 해석은 Root에 요청했으며 이를 이유로 임의 변경·새 DFA 실행·Hook 생략을 하지 않는다. 실패 보존은 이 판단에 의존하지 않는다.
|
||||||
|
|
||||||
|
### E8.2 이전 dispatch와 activation 경계
|
||||||
|
|
||||||
Root exact5문서 commit `7d714c2713bf945f07fc78f85e49ec27e3184134` 뒤 [E8.1 실제 setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json)은 native exit `0`, `7.446`초로 완료했다. Tracked 변경0/HEAD·clean·기존 VS cache 불변이다. [설정 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json)은 새 Ninja/Debug/MSVC Hostx64/x64, 승인된 dependency4, 실제 archive 경로와 config=example 동일성을 확인한다. 이는 configure-only이며 library/build/CTest는 아직 미실행이다. 이어 별도 Planning이 status 한 값만 `blocked`→`pending`으로 바꾸고 나머지 bytes/JSON/history3·보호10hash 보존을 확인했다(exit `0`, phase SHA-256 `6d0bfcfe89ebaee0f76d27c8917da91085069c92a55e1088dc05bd3053e37e32`). [R9 actual Executor checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r9-status-checkpoint-result.json)는 native/managed exit `0`, `1.531`초이며 commit `9766724a5d363fc9ff8800a99726a63bdba55314`의 exact index1·pending/history3·protected bytes·clean을 검증했다. Top blocked/history3는 보존했다.
|
Root exact5문서 commit `7d714c2713bf945f07fc78f85e49ec27e3184134` 뒤 [E8.1 실제 setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json)은 native exit `0`, `7.446`초로 완료했다. Tracked 변경0/HEAD·clean·기존 VS cache 불변이다. [설정 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json)은 새 Ninja/Debug/MSVC Hostx64/x64, 승인된 dependency4, 실제 archive 경로와 config=example 동일성을 확인한다. 이는 configure-only이며 library/build/CTest는 아직 미실행이다. 이어 별도 Planning이 status 한 값만 `blocked`→`pending`으로 바꾸고 나머지 bytes/JSON/history3·보호10hash 보존을 확인했다(exit `0`, phase SHA-256 `6d0bfcfe89ebaee0f76d27c8917da91085069c92a55e1088dc05bd3053e37e32`). [R9 actual Executor checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r9-status-checkpoint-result.json)는 native/managed exit `0`, `1.531`초이며 commit `9766724a5d363fc9ff8800a99726a63bdba55314`의 exact index1·pending/history3·protected bytes·clean을 검증했다. Top blocked/history3는 보존했다.
|
||||||
|
|
||||||
현재 actual dispatch는 **E8.2 첫 PowerShell block 그대로의 prep1회**다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 prep Step0 및 E8/R9와 attempt3 evidence다. Official implementation-agent profile, 원래 owned9, 기본 workspace-write와 finite14400/Stop7500/shared7200 및 existing terminal/retry/ownership guards를 유지한다. E8.3의 정확한 Ninja preset mapping이 과거 VS 고정 명령을 명시 대체한다. 이미 GREEN인 source를 되돌리지 않고 classifier37/focused/full Python, native MSVC/x64/Debug configure/build/discovery/full CTest, 실제 library 위치/hash/mtime·fresh reference 및 registered same graph를 검증한다. 과거 manual 실패·미실행/automatic pass와 report reference 문구 정정은 Implementation owner가 맡는다. Native error/blocked 또는 guard/contract 실패 시 실제 terminal을 보존하며 두 번째 source Correction이나 무단 transport retry를 하지 않는다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집/Git을 동결한다. Actual prep pass 전 main/physics/release 전이는 없다.
|
현재 actual dispatch는 **E8.2 첫 PowerShell block 그대로의 prep1회**다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 prep Step0 및 E8/R9와 attempt3 evidence다. Official implementation-agent profile, 원래 owned9, 기본 workspace-write와 finite14400/Stop7500/shared7200 및 existing terminal/retry/ownership guards를 유지한다. E8.3의 정확한 Ninja preset mapping이 과거 VS 고정 명령을 명시 대체한다. 이미 GREEN인 source를 되돌리지 않고 classifier37/focused/full Python, native MSVC/x64/Debug configure/build/discovery/full CTest, 실제 library 위치/hash/mtime·fresh reference 및 registered same graph를 검증한다. 과거 manual 실패·미실행/automatic pass와 report reference 문구 정정은 Implementation owner가 맡는다. Native error/blocked 또는 guard/contract 실패 시 실제 terminal을 보존하며 두 번째 source Correction이나 무단 transport retry를 하지 않는다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집/Git을 동결한다. Actual prep pass 전 main/physics/release 전이는 없다.
|
||||||
|
|
||||||
Root outer Stop/일반 후속 사용 환경에는 이 process-local setup이 지속된다고 가정하지 않는다. 이번 native와 그 registered Stop의 명시 환경은 E8.2로 고정하며, feature closure에서 local 설정 수명과 일반 사용 환경을 별도로 대조한다. 전역 env 또는 Hook state를 변경하지 않는다.
|
Root outer Stop/일반 후속 사용 환경에는 이 process-local setup이 지속된다고 가정하지 않는다. 이번 native와 그 registered Stop의 명시 환경은 E8.2로 고정하며, feature closure에서 local 설정 수명과 일반 사용 환경을 별도로 대조한다. 전역 env 또는 Hook state를 변경하지 않는다.
|
||||||
|
|
||||||
|
### E8.2 attempt4 실제 terminal 감사
|
||||||
|
|
||||||
|
[Actual Executor 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/executor-result.json)는 PowerShell exit `1`, `2833.812`초, 시작/종료 HEAD `23c4ebe526260d584247804d8cbe2f7aa8cc60ac` 및 branch 불변, 비소유 tracked/config/기존 VS cache 변경0을 확인했다. [원시·상태·보고서·CTest archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/terminal-archive.json)에 raw SHA-256 `c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61`, Step0 `error`/history4, top 및 owner report를 보존했다. Raw Codex exit `0`, `transportFailure=null`이며 explicit error는 transport retry가 아니다. 이 시점 dirty는 report1/control2뿐이다.
|
||||||
|
|
||||||
|
[Coordinator terminal audit](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/coordinator-terminal-audit.json)는 exit0으로 이전 history3의 JSON 동일성, source/test/Hook 8개 불변 및 관리문서 local links 191개/누락0을 확인했다.
|
||||||
|
|
||||||
|
| 실제 검증 경계 | 판정과 한계 |
|
||||||
|
| --- | --- |
|
||||||
|
| 현재 Python regression | classifier37 exit0; focused136은 raw상 3회 모두 exit0, `45.510/45.390/45.635`초. 다음 실행에서 이미 통과한 같은 대상을 근거 없이 반복할 필요는 없다. |
|
||||||
|
| Manual Ninja full VERIFY | configure0/build1. MSVC x64 compile/link 뒤 integration GoogleTest JSON parse failure. 순차 CTest/full pytest는 미실행이며 후속 diagnostic으로 대체하지 않는다. |
|
||||||
|
| Registered validation | incremental Ninja build0, 실제 CTest21912 exit0/362 pass. LastTest SHA-256 `4d9c71b7caa4ca58f81ee5670f6a0c5af323a0fe20b6ac0195a0420a7a8784d9`, 616282 bytes. 실제 pwsh23560은 약1802.6초 후 exit1, Python3492/24968은 각각0이므로 registered wrapper 전체 성공으로 보고하지 않는다. |
|
||||||
|
| Solver feature gate | prep와 별개인 MITC4 mass/FEAST 본 구현·고유치 reference comparison·physics/release는 미실행이다. |
|
||||||
|
|
||||||
|
[선택 raw events](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/raw-audit-selected-events.json)와 [실제 process exits](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json)를 대조했다. Parent DevShell 성공 뒤 child tool-shell의 script 실행은 policy로 거부됐지만 상속된 MSVC x64 환경을 확인하고 compile/link를 실행했다. `integration-discovery-rerun.log`는 stdout이 없었던 native cmake exit0을 나중에 쓴 관찰 메모다. 원시 item67은 cmake0 뒤 로그 조회 실패로 shell1, item68은 메모 작성/hash0이며 메모를 원시 stdout으로 취급하지 않는다. 역사상 reference를 "읽지 않았다"는 owner 표현은 full CTest 내부 기존 reference 읽기와 구분해 다음 owner가 정정한다.
|
||||||
|
|
||||||
|
[Root의 installed/generated module 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json)은 `TEST_TARGET` 누락으로 세 discovery가 같은 empty-target hash JSON을 REMOVE/run/READ하는 구조를 확인했다. 이는 병렬 경합을 강하게 뒷받침하지만 최초 race를 재현한 실험은 아니다. Owner의 `test`/`harness` 라벨과 반환 attempt2는 그대로 보존하고, Coordinator는 실제 실행 history4와 환경 근거를 기준으로 기존 `environment|r2`에 정규화한다. 새 source Correction 또는 tolerance/계약 revision 변경은 허용하지 않는다.
|
||||||
|
|
||||||
|
사용자 요청 설명문서는 Root가 exact1 commit `b81f7cf636e890d7c144a8b1857e58d7d0a5d4c3`으로 추가했다. SHA-256 `0722dff075e706977d55eb1ac2514d4318b1341adab30a51fc82c744315f1c9f`이며 정적 links/whitespace/fences와 staged diff-check는 exit0이다. 이 문서 commit은 Solver/Hook/source gate 통과를 뜻하지 않는다.
|
||||||
|
|
||||||
### E8 설정 및 계획 감사 이력
|
### E8 설정 및 계획 감사 이력
|
||||||
|
|
||||||
Owner의 [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)·[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint) 상세를 owner/r2/현재 hash와 대조해 계획 gate `pass`로 수락했다. 실제 adapter의 preset 명령4/7200 cap·기존 guard, PowerShell18 blocks/errors0, Python AST7, local links91/missing0, 고정 hash7·Executor AST·blocked/history3 보존과 diffcheck가 exit `0`이다. Root는 설치 DevShell의 실제 인수, config.example/preset의 `.harness/build-ninja-msvc-debug`, load_config 필드 및 process 환경 전체 finally 복원을 read-only 확인했다. Native Ninja 성공은 아직 미검증이다.
|
Owner의 [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)·[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint) 상세를 owner/r2/현재 hash와 대조해 계획 gate `pass`로 수락했다. 실제 adapter의 preset 명령4/7200 cap·기존 guard, PowerShell18 blocks/errors0, Python AST7, local links91/missing0, 고정 hash7·Executor AST·blocked/history3 보존과 diffcheck가 exit `0`이다. Root는 설치 DevShell의 실제 인수, config.example/preset의 `.harness/build-ninja-msvc-debug`, load_config 필드 및 process 환경 전체 finally 복원을 read-only 확인했다. Native Ninja 성공은 아직 미검증이다.
|
||||||
|
|||||||
@@ -624,3 +624,112 @@ Implementation은 보고서의 광범위한 reference 미사용 문장을 정정
|
|||||||
Source·수식·schema·tolerance·reference를 이 환경 준비에서 변경하지 않는다.
|
Source·수식·schema·tolerance·reference를 이 환경 준비에서 변경하지 않는다.
|
||||||
정상 native 대안이 실제 실패하면 결과를 보존해 Coordinator에 반환하며, 새 exact-run DFA
|
정상 native 대안이 실제 실패하면 결과를 보존해 Coordinator에 반환하며, 새 exact-run DFA
|
||||||
결정이 필요한지는 그 evidence로 판단한다. 지금 main까지 권한을 확대하지 않는다.
|
결정이 필요한지는 그 evidence로 판단한다. 지금 main까지 권한을 확대하지 않는다.
|
||||||
|
|
||||||
|
## E9. Attempt4 후의 직렬 Ninja 검증
|
||||||
|
|
||||||
|
[R10](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)이 우선이다.
|
||||||
|
[설치 모듈·생성 경로 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json)
|
||||||
|
SHA256 `9d383f04a347df95b742403ceca4732b331ddf4ec96437993f0ceffaa060bf59`에서
|
||||||
|
세 POST_BUILD discovery가 누락된 TEST_TARGET 때문에 같은 JSON을 REMOVE/run/READ한다.
|
||||||
|
이는 병렬 공유 파일 경쟁을 뒷받침하며 최초 interleaving을 재현한 것은 아니다.
|
||||||
|
정상 환경 변수 `CMAKE_BUILD_PARALLEL_LEVEL=1`로 같은 Ninja build의 discovery를 직렬화한다.
|
||||||
|
CMake 설치 모듈, generated discovery, source/test/Hook/config와 timeout은 수정하지 않는다.
|
||||||
|
|
||||||
|
**Activation 미확정:** Root의 config-only [현재 resolver 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json)은
|
||||||
|
canonical Stop1800 해석을 확인했다(server exit0, SHA256
|
||||||
|
`5deb9a701388605a14868198276993af3884f0cc76c48928831968b272f46de4`).
|
||||||
|
실제 native raw의 source event는 없으며 현재 resolver 결과와 외부 pwsh 약1802초 관찰을 구분한다.
|
||||||
|
남은 쟁점은 정상 override 지원·적용 방법이다. 이를 Coordinator가 검토하기 전 status reset/다음
|
||||||
|
실행을 할당하지 않는다. Canonical Hook 쓰기나 DFA·추가 timeout을 승인으로 추정하지 않는다.
|
||||||
|
아래는 이 조건 해소 후의 실행 계약이며 현재 실행 준비 완료 또는 실제 성공이 아니다.
|
||||||
|
|
||||||
|
부모 Coordinator invocation은 E8.2 block 전체를 사용하되
|
||||||
|
`$env:FEM_HARNESS_CODEX_SANDBOX = 'workspace-write'` 바로 다음에 다음 한 줄을 추가한다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:CMAKE_BUILD_PARALLEL_LEVEL = '1'
|
||||||
|
```
|
||||||
|
|
||||||
|
나머지 named Python/UVoffline/cache, dependency4, 새 짧은 TEMP/TMP와 E7 pytest basetemp,
|
||||||
|
Root에서 실제 성공한 installed x64 DevShell, 유한14400 module invocation과 finally의
|
||||||
|
전체 process 환경 복원은 그대로다. 따라서 registered Stop에도 같은 병렬도1과 graph가
|
||||||
|
상속된다. Actual configured outer Stop7500/shared·command7200 계약은 유지하지만 실제
|
||||||
|
설정 출처·종료 evidence를 확인해야 하며 새 cap을 만들지 않는다.
|
||||||
|
원래 invocation line은 그대로다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
& $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase
|
||||||
|
$mfeExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeExit) { throw 'Native Executor exit unavailable' }
|
||||||
|
```
|
||||||
|
|
||||||
|
Native child tool shell에서는 E8.2 manual composition의 DevShell script 호출 한 줄을
|
||||||
|
아래 **상속 환경 검사**로 대체한다. 나머지 dependency/Python/짧은 TEMP·병렬도1 설정과
|
||||||
|
finally는 그대로 적용한다. 실행 정책 변경이나 우회 인수를 사용하지 않는다.
|
||||||
|
부모가 제공한 x64 환경이 없으면 검증 명령을 시작하지 않고 blocked-environment로 반환한다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64') -or
|
||||||
|
[string]::IsNullOrWhiteSpace($env:VSINSTALLDIR) -or
|
||||||
|
[string]::IsNullOrWhiteSpace($env:INCLUDE) -or
|
||||||
|
[string]::IsNullOrWhiteSpace($env:LIB)) { throw 'Inherited MSVC x64 environment missing' }
|
||||||
|
$mfeCl = (Get-Command cl.exe -ErrorAction Stop).Source
|
||||||
|
$mfeNinjaExe = (Get-Command ninja.exe -ErrorAction Stop).Source
|
||||||
|
if ($mfeCl -notmatch '[\\/]Hostx64[\\/]x64[\\/]cl.exe$') { throw 'Unexpected compiler architecture' }
|
||||||
|
Write-Output ("Inherited compiler={0}; Ninja={1}" -f $mfeCl, $mfeNinjaExe)
|
||||||
|
$env:CMAKE_BUILD_PARALLEL_LEVEL = '1'
|
||||||
|
```
|
||||||
|
|
||||||
|
새 prep의 첫 manual build는 아래 **한 번의 clean-first full build**다. 새 Ninja graph의
|
||||||
|
기존 성공 후 no-op build를 경쟁 해소 evidence로 보고하지 않도록, 실제 세 executable
|
||||||
|
link와 POST_BUILD discovery를 같은 직렬 build에서 다시 실행한다. CMake의 기존
|
||||||
|
clean-first만 사용하며 기존 VS cache나 reference/evidence를 삭제하지 않는다.
|
||||||
|
Registered Stop과 후속 통상 build는 E8의 일반 build 명령에 병렬도1을 상속한다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive"
|
||||||
|
$mfeVerifyExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeVerifyExit) { throw 'Configure exit unavailable' }
|
||||||
|
if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit }
|
||||||
|
cmake --build --preset windows-msvc-ninja-debug --clean-first --verbose
|
||||||
|
$mfeVerifyExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeVerifyExit) { throw 'Build exit unavailable' }
|
||||||
|
if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit }
|
||||||
|
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
|
||||||
|
$mfeVerifyExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeVerifyExit) { throw 'Discovery exit unavailable' }
|
||||||
|
if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit }
|
||||||
|
ctest --preset windows-msvc-ninja-debug --output-on-failure
|
||||||
|
$mfeVerifyExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeVerifyExit) { throw 'CTest exit unavailable' }
|
||||||
|
if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit }
|
||||||
|
```
|
||||||
|
|
||||||
|
Verbose log에는 `fesa_unit_tests_576e7e9d_discovery.cmake`,
|
||||||
|
`fesa_integration_tests_d537bc73_discovery.cmake`,
|
||||||
|
`fesa_reference_tests_ac7cf2f0_discovery.cmake`의 실제 세 호출과 성공을 보존한다.
|
||||||
|
세 `*_tests.cmake`의 새 mtime/hash·등록 identity와 full discovery JSON을 대조한다.
|
||||||
|
현재 prep inventory는 unit289/integration34/reference39, 총362다. 명령이 실제 각 target의
|
||||||
|
올바른 tests를 등록했는지 확인하며 합계나 leftover JSON의 존재만으로 통과하지 않는다.
|
||||||
|
Generated suffix가 바뀌면 actual build graph의 각 target 매핑을 기록하고 임의 파일을 만들지 않는다.
|
||||||
|
|
||||||
|
새 `src/fesa/Debug/fesa_solver.lib`와 세 executable의 hash/mtime를 기록한다.
|
||||||
|
이 새 binary에 대한 required manual full CTest의 fresh reference solve, 입력 복사/hash와
|
||||||
|
결과 생성 시각을 확인하고 그 뒤 registered same-binary full의 정상 cache 재사용과 구분한다.
|
||||||
|
Manual fresh solve를 cached-only 자동 실행으로 대체하지 않는다. 각 raw log를 덮어쓰기 전에
|
||||||
|
새 attempt evidence로 보존한다. No-op 관찰·단독 진단·합산 duration은 full gate가 아니다.
|
||||||
|
|
||||||
|
E7의 classifier37/focused136/full pytest 대상과 모든 assertion은 유지한다. 새 invocation에서
|
||||||
|
각 필수 검증을 수행하되 현재 code에서 한 번 통과한 focused136을 근거 없이 반복하지 않는다.
|
||||||
|
과거 attempt4의 focused136 실제 세 반복이 모두 exit0이었다는 사실도 보존한다.
|
||||||
|
이미 GREEN인 source를 RED로 되돌리지 않으며 두 번째 source Correction을 시작하지 않는다.
|
||||||
|
기존 전체 Python, native configure/build/discovery/CTest와 실제 registered Stop 성공이 모두
|
||||||
|
필수다. Full pytest/CTest의 미실행 상태를 다음 owner가 실제 evidence로 해소한다.
|
||||||
|
|
||||||
|
Implementation owner는 보고서의 역사적 reference 미사용 문장을 정정해 full CTest의 기존
|
||||||
|
static reference 읽기·비교, 원본 직접 수정 없음과 새 eigen 비교 미실행을 구분한다.
|
||||||
|
과거 manual failure와 registered pwsh1/Python0/CTest0도 각각 보존한다.
|
||||||
|
Result payload는 manual 결과와 아직 미관찰인 Stop을 구분하며 Coordinator가 실제 종료 후
|
||||||
|
검토한다. Active Executor 동안 Root/Coordinator는 non-owned edits/commits를 멈춘다.
|
||||||
|
Main은 prep 전체 gate 뒤 별도 workspace-write invocation만 허용하며 E9의 병렬도1을
|
||||||
|
같이 사용한다. 새로운 동일 실패는 원시 evidence와 기존 retry key로 반환한다.
|
||||||
|
|||||||
@@ -35,6 +35,12 @@ Coordinator의 별도 정상 Ninja invocation, 기존 Step 명령 대응을 확
|
|||||||
[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint)의 status-only 변경·checkpoint는
|
[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint)의 status-only 변경·checkpoint는
|
||||||
후속 할당으로 남는다. 이번 delta는 문서/정적 확인이며 native Ninja 성공은 아직 미검증이다.
|
후속 할당으로 남는다. 이번 delta는 문서/정적 확인이며 native Ninja 성공은 아직 미검증이다.
|
||||||
|
|
||||||
|
Attempt4의 최초 manual Ninja build는 GoogleTest discovery JSON 오류로 실패했다.
|
||||||
|
[R10](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)이 report1/controls2의
|
||||||
|
error/history4 보존을 고정한다. [E9](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)는
|
||||||
|
정상 병렬도1·실제 clean-first 검증을 계획한다. 현재 resolver의 canonical Stop1800 해석은
|
||||||
|
확인됐지만 정상 override 지원·적용 방법은 미확정이다. R11 status-only 변경과 재실행은 별도 할당 전 수행하지 않는다.
|
||||||
|
|
||||||
[FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)와
|
[FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)와
|
||||||
[coordination](coordination.md), 승인된 [requirements](requirements.md), [research](research.md),
|
[coordination](coordination.md), 승인된 [requirements](requirements.md), [research](research.md),
|
||||||
[formulation](formulation.md), [NR](numerical-review.md), [I/O](io.md) 및 각 상세 r2를 적용한다.
|
[formulation](formulation.md), [NR](numerical-review.md), [I/O](io.md) 및 각 상세 r2를 적용한다.
|
||||||
|
|||||||
@@ -716,3 +716,168 @@ report/top/raw의 현재 hash를 확인한다. Phase control 한 경로만 commi
|
|||||||
Native exit를 즉시 전파하고 commit 전후 snapshot 및 clean preflight를 감사한다.
|
Native exit를 즉시 전파하고 commit 전후 snapshot 및 clean preflight를 감사한다.
|
||||||
실패하면 bytes/원시 로그/이미 생성된 commit을 보존하고 다음 invocation을 시작하지 않는다.
|
실패하면 bytes/원시 로그/이미 생성된 commit을 보존하고 다음 invocation을 시작하지 않는다.
|
||||||
E8 setup 또는 native 성공을 이 status checkpoint 성공에서 추론하지 않는다.
|
E8 setup 또는 native 성공을 이 status checkpoint 성공에서 추론하지 않는다.
|
||||||
|
|
||||||
|
## R10. Attempt4의 error/history4 보존
|
||||||
|
|
||||||
|
[Executor 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/executor-result.json)와
|
||||||
|
[terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/terminal-archive.json)는
|
||||||
|
native PowerShell1, Codex0, transportFailure null과 report1/controls2만의 변경을 기록한다.
|
||||||
|
현재 Step0/top은 error/history4다. Classifier37/focused136은 통과했지만 required manual
|
||||||
|
build는 GoogleTest JSON parsing에서 실패했고 manual CTest/full pytest는 미실행이다.
|
||||||
|
후속 단독 discovery와 등록 CTest 성공으로 최초 실패를 대체하지 않는다.
|
||||||
|
|
||||||
|
[프로세스 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json)의
|
||||||
|
registered Ninja build/CTest0·362pass 및 Python 두 개0과 외부 pwsh1은 별개의 실제 결과다.
|
||||||
|
Whole Stop0으로 합치지 않는다. [원시 선택 이벤트](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/raw-audit-selected-events.json)의
|
||||||
|
item67 direct discovery0은 뒤의 빈 log 조회 때문에 전체 shell1이고 item68은 memo/hash0이다.
|
||||||
|
176-byte log는 후속 관찰 메모이며 해당 direct 실행 stdout 원본으로 치환하지 않는다.
|
||||||
|
|
||||||
|
Root가 frozen 관리/Planning 문서만 exact checkpoint한 뒤 Coordinator가 아래 unchanged
|
||||||
|
Executor method invocation으로 report1 WIP와 controls2 error 보존을 분리 commit한다.
|
||||||
|
사용자 요청 [Root 설명문서](msvc-build-access-error.md)의 기존 commit도 origin 이후
|
||||||
|
허용 문서에 포함하며 현재 bytes/hash를 보존한다. Source/Hook/config/cache 변경,
|
||||||
|
`_commit_step`, 상태 성공·reset, guard override와 직접 Git commit은 없다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe'
|
||||||
|
if (-not (Test-Path -LiteralPath $mfePython -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="23c4ebe526260d584247804d8cbe2f7aa8cc60ac"
|
||||||
|
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,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/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.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()
|
||||||
|
expected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4",
|
||||||
|
"docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"fc88f1c943f7f25d7eeece87dbbd967a6007b14b0adce342ced9aa78f4cd20b2",
|
||||||
|
"phases/index.json":"33d911587305cc96148a3e60f9ca32f9ec114ce75e49118391bcc1ef3a6692c3",
|
||||||
|
"phases/"+phase+"/index.json":"3f4ce6178172819f3e1ab4310db61bc318348aeea822b806d4dcca676b53a60f",
|
||||||
|
"phases/"+phase+"/step0-output.json":"c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61",
|
||||||
|
"scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0",
|
||||||
|
"tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"}
|
||||||
|
expected.update({
|
||||||
|
"docs/mitc4-shell-feast-eigen/msvc-build-access-error.md":"0722dff075e706977d55eb1ac2514d4318b1341adab30a51fc82c744315f1c9f",
|
||||||
|
".harness/config.json":"3ebdfa80124f1eb96909b2738d6f2a96fecd55cce61150a9cd7ef27d7c5fd892",
|
||||||
|
".harness/build-ninja-msvc-debug/CMakeCache.txt":"bf024961a7469672d1fd4f9e8b6606fc1ccaac3fa40dea25709ec4c00ddd5d0e",
|
||||||
|
".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"})
|
||||||
|
for p,h in expected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p
|
||||||
|
assert ast.dump(ast.parse((root/"scripts/execute.py").read_text(encoding="utf-8")))==ast.dump(ast.parse(ex._run_git_checked("show",origin+":scripts/execute.py").stdout))
|
||||||
|
old_hook=json.loads(ex._run_git_checked("show",origin+":.codex/hooks.json").stdout)
|
||||||
|
assert json.loads((root/".codex/hooks.json").read_bytes())==old_hook
|
||||||
|
idx=ex._read_phase_index();top=ex._read_top_index()
|
||||||
|
assert idx["steps"][0]["status"]=="error" and len(idx["steps"][0]["attempt_history"])==4
|
||||||
|
assert next(p for p in top["phases"] if p["dir"]==phase)["status"]=="error"
|
||||||
|
owned=ex._step_owned_paths(idx["steps"][0]);assert len(owned)==9
|
||||||
|
code=["docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"]
|
||||||
|
control=["phases/index.json","phases/"+phase+"/index.json"]
|
||||||
|
assert set(ex._assert_step_scope(owned))==set(code+control)
|
||||||
|
frozen={p:(root/p).read_bytes() for p in list(owned)+list(expected)+["phases/"+phase+"/step0.md","phases/mitc4-shell-feast-eigen/index.json"]}
|
||||||
|
for paths,message in (
|
||||||
|
(code,"chore(mitc4-shell-feast-eigen-execution-prep): WIP prep report with discovery build failure"),
|
||||||
|
(control,"chore(mitc4-shell-feast-eigen-execution-prep): preserve attempt 4 error metadata")):
|
||||||
|
assert all((root/p).read_bytes()==v for p,v in frozen.items())
|
||||||
|
assert ex._git_execution_identity()==(branch,head)
|
||||||
|
assert ex._commit_paths(paths,message,owned_paths=owned)
|
||||||
|
new_branch,new_head=ex._git_execution_identity()
|
||||||
|
assert new_branch==branch and new_head!=head
|
||||||
|
actual=ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",new_head).stdout.splitlines()
|
||||||
|
assert set(actual)==set(paths)
|
||||||
|
assert all((root/p).read_bytes()==v for p,v in frozen.items())
|
||||||
|
assert ex._read_phase_index()==idx and ex._read_top_index()==top
|
||||||
|
print(json.dumps({"commit":new_head,"paths":actual,"status":"error","history_count":4}))
|
||||||
|
head=new_head
|
||||||
|
assert not ex._worktree_paths()
|
||||||
|
ex._preflight_repository()
|
||||||
|
print(json.dumps({"head":head,"branch":branch,"clean":True}))
|
||||||
|
'@ | & $mfePython -B -X utf8 -
|
||||||
|
$mfeWipExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeWipExit) { throw 'Native exit unavailable' }
|
||||||
|
exit $mfeWipExit
|
||||||
|
```
|
||||||
|
|
||||||
|
검사 실패 시 이미 생성된 commit, 남은 dirty 파일과 원시 기록을 보존하고 반환한다.
|
||||||
|
이 명령 성공은 실패의 안전한 보존일 뿐 prep gate 통과가 아니다.
|
||||||
|
R11 status edit와 E9 실행은 별도 할당 전 미실행이다. 현재 resolver의 canonical Stop1800
|
||||||
|
해석은 확인됐지만 정상 override 지원·적용 방법이 미확정이므로 현재는 보존만 진행한다.
|
||||||
|
기존 exact owned9와 r2 source Correction1회 소진을 유지한다.
|
||||||
|
|
||||||
|
## R11. R10 뒤의 별도 status-only 복구
|
||||||
|
|
||||||
|
R10 실제 두 commit/clean 감사와 [E9 환경 진입 조건](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)이
|
||||||
|
해소된 뒤 Coordinator가 별도 할당할 때만 Planning이 Step0의 `status` 한 값을
|
||||||
|
`error -> pending`으로 바꾼다. 나머지 모든 JSON/bytes, error_message/failed_at/started_at,
|
||||||
|
created_at, history4, owned_paths, top/raw는 보존한다. 이번 문서 작업에서는 바꾸지 않는다.
|
||||||
|
그 한 값 diff/HEAD/staging/hash 감사를 받은 Coordinator만 아래 control checkpoint를 실행한다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe'
|
||||||
|
if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' }
|
||||||
|
@'
|
||||||
|
import hashlib,json
|
||||||
|
from pathlib import Path
|
||||||
|
from scripts import execute
|
||||||
|
phase="mitc4-shell-feast-eigen-execution-prep"
|
||||||
|
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"
|
||||||
|
branch,head=ex._git_execution_identity();assert branch=="refs/heads/feat-"+phase
|
||||||
|
origin="23c4ebe526260d584247804d8cbe2f7aa8cc60ac"
|
||||||
|
ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD")
|
||||||
|
report="docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"
|
||||||
|
controls={"phases/index.json","phases/"+phase+"/index.json"}
|
||||||
|
docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md",
|
||||||
|
"coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")}
|
||||||
|
assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs|controls|{report}
|
||||||
|
for paths,probe in ((controls,"phases/"+phase+"/index.json"),({report},report)):
|
||||||
|
commit=ex._run_git_checked("log","-1","--format=%H","--",probe).stdout.strip()
|
||||||
|
actual=set(ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",commit).stdout.splitlines())
|
||||||
|
assert actual==paths
|
||||||
|
protected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4",
|
||||||
|
"scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0",
|
||||||
|
"tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6",
|
||||||
|
report:"fc88f1c943f7f25d7eeece87dbbd967a6007b14b0adce342ced9aa78f4cd20b2",
|
||||||
|
"phases/index.json":"33d911587305cc96148a3e60f9ca32f9ec114ce75e49118391bcc1ef3a6692c3",
|
||||||
|
"phases/"+phase+"/step0-output.json":"c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61",
|
||||||
|
".harness/config.json":"3ebdfa80124f1eb96909b2738d6f2a96fecd55cce61150a9cd7ef27d7c5fd892",
|
||||||
|
".harness/build-ninja-msvc-debug/CMakeCache.txt":"bf024961a7469672d1fd4f9e8b6606fc1ccaac3fa40dea25709ec4c00ddd5d0e",
|
||||||
|
".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"}
|
||||||
|
for p,h in protected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p
|
||||||
|
path="phases/"+phase+"/index.json"
|
||||||
|
before=json.loads(ex._run_git_checked("show","HEAD:"+path).stdout)
|
||||||
|
assert before["steps"][0]["status"]=="error" and len(before["steps"][0]["attempt_history"])==4
|
||||||
|
expected=json.loads(json.dumps(before));expected["steps"][0]["status"]="pending"
|
||||||
|
assert ex._read_phase_index()==expected
|
||||||
|
assert set(ex._assert_step_scope(()))=={path}
|
||||||
|
assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip()
|
||||||
|
frozen={p:(root/p).read_bytes() for p in [path,*protected]}
|
||||||
|
assert ex._commit_paths([path],"chore(mitc4-shell-feast-eigen-execution-prep): queue serial Ninja environment recovery")
|
||||||
|
new_branch,new_head=ex._git_execution_identity()
|
||||||
|
assert new_branch==branch and new_head!=head
|
||||||
|
assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",new_head).stdout.splitlines()==[path]
|
||||||
|
assert all((root/p).read_bytes()==v for p,v in frozen.items())
|
||||||
|
assert ex._read_phase_index()==expected and not ex._worktree_paths()
|
||||||
|
ex._preflight_repository()
|
||||||
|
print(json.dumps({"commit":new_head,"status":"pending","history_count":4,"clean":True}))
|
||||||
|
'@ | & $mfePython -B -X utf8 -
|
||||||
|
$mfeStatusExit = $LASTEXITCODE
|
||||||
|
if ($null -eq $mfeStatusExit) { throw 'Native exit unavailable' }
|
||||||
|
exit $mfeStatusExit
|
||||||
|
```
|
||||||
|
|
||||||
|
R10 report1/controls2 commit 경로와 HEAD의 error/history4를 검사하므로 미보존 상태에서
|
||||||
|
pending 재실행을 시작하지 않는다. 실제 source/Hook/config 및 기존 cache는 그대로다.
|
||||||
|
각 native exit와 clean을 확인하고, 다음 E9 invocation은 Coordinator가 새 process로
|
||||||
|
별도 할당한다. 실패를 재분류해 새 Correction budget을 만들거나 자동 재시도하지 않는다.
|
||||||
|
|||||||
Reference in New Issue
Block a user