6.4 KiB
🔍 Cross-Review Round 3 — Issue #5 Phase 2a (6ad6f08..0e74aa1, 신규 커밋 cb575fa+0e74aa1) — Job 49171b58
- Reviewer:
planner-reviewer-claude-01(Reviewer role) - 대상: 브리프 첨부 diff =
git diff 6ad6f08..HEAD−.agents/reports/*(2914행, 바이트 동일). HEAD=0e74aa1, working tree clean. Round 2(cb792e91) 대비 신규는 수정 커밋cb575fa(9 files, +317/−52)와 문서 커밋0e74aa1. - 방법: Round 2의 F-C/F-D와 Codex Round 2(
0026165b)의 R1/R4 수정을 실제 CLI·실제 모듈로 재검증(F-C는 래퍼와 같은set -euo pipefail셸에서), Round 1 항목(F-A/F-B)의 회귀 여부 재확인, 신규 테스트 12종 독해, 전체 스위트 실행.
0. 결론 요약
- Round 2 지적 전부 해소 —
[ADJUDICATION: SUSTAINED]. F-C: 멱등 ACK가TransitionResult.idempotent로 구분되어 CLI가 rc 0을 내고, 래퍼 승인 경로가set -e아래에서 끝까지 진행된다(§1). F-D:_operator_write첫 줄에서VALID_STATUSES검증이 두 모드 공통으로 복원돼 rc 1·레코드 불변이다(§2). Round 1의 F-A/F-B도 회귀 없이 유지된다(§3). - Codex R1(관측 증거 부재 시 승인)·R4(감사 mirror의 비원자적 비교-후-쓰기)도 구현·테스트를 확인했다(§4). R4는 내가 Round 2 §2에서 비차단으로 언급한 창(window)을 닫는 것이라 특히 반갑다.
- 신규 결함 없음. 자동완료 3표면·
lib.sh·shim 무변경, 위생 클린, 전체 스위트 통과(§6).[ESCALATE: PLANNER]불필요.
1. F-C 재검증 — 해소
engine.py:83-99TransitionResult.idempotent,:105-113_Decision.idempotent,:164-167에서 같은 terminal 재수신에idempotent=True.registry.py:329-366_operator_write:committed→ 0,idempotent→ 0, 그 외만refused:+ 4.- 셸 수준 재현(Round 2와 동일 스크립트): 이미
completed인 레코드에status --set completed를set -euo pipefail아래에서 실행 →REACHED (CAS=1)/REACHED (CAS=0), bash exit 0. Round 2에서는 exit 4로REACHED가 출력되지 않았다. registry.main반환값 직접 확인(두 모드): 멱등--set completed→ rc 0,cancelledaftercompleted→ rc 4(CAS=1, 진짜 거부는 여전히 non-zero; CAS=0은 레거시 덮어쓰기 유지).test_fc_idempotent_finalize_*(두 모드),test_fc_a_genuine_conflict_is_still_reported(rc 4 유지),test_fc_engine_marks_an_idempotent_result가 고정. 문서:state-transitions.mdRev.5 "멱등 ACK는 거부가 아니다",phase2a-shadow.md§2-1 CLI 종료 코드 표(0/1/4).
2. F-D 재검증 — 해소
_operator_write가 CAS 분기 이전에 status not in VALID_STATUSES면 2a 이전과 같은 문구로 rc 1. 두 모드에서 --set bogus → rc 1, 레코드 불변(직접 확인). test_fd_invalid_status_is_rejected_in_both_modes가 레지스트리 디렉터리 지문까지 단정.
3. Round 1 항목 회귀 확인 — 유지
래퍼 시퀀스 재생: completed → update --status pending --iteration 2 rc 0 · pending/2; completed → status --set error rc 0 · error. 지연 flush 실험: registry=completed, status.json=completed. 두 모드 병행 특성화(X-01~X-04, fa/fb)가 스위트에 남아 있다.
4. Codex Round 2 (R1, R4) 확인
| # | 구현 | 검증 |
|---|---|---|
| R1 증거 부재 시 승인 | policy.py:20-23 ATTRIBUTION_FIELDS; collect_observed_identity(:33-66)는 식별자를 타임라인 항목의 collector_attribution 봉투(및 비-herdr 소스 payload)에서만 읽고 네이티브 Herdr payload 안의 식별자는 증거로 취급하지 않는다(Phase 0의 "네이티브 payload에 MAM 필드 금지"와 정합); decide(:115-135)는 4식별자 전부 존재+일치와 매니페스트 attempt_id 존재+일치를 요구 |
finalized_candidate.json에 봉투 추가(다른 11종은 hold/reject라 무영향, 12벡터 test_g7 유지). test_r1_missing_attribution_evidence_holds(4필드 parametrize), *_missing_report_manifest_holds, *_identifiers_inside_a_native_payload_are_not_evidence. Phase 0 validate_watcher_scenario 41종 통과(봉투는 item 레벨 키라 네이티브 payload 검사와 충돌 없음) |
| R4 비원자적 비교-후-쓰기 | update_logged_status(mqtt_common.py:577-619)가 per-job 전용 락 파일(.status.json.lock, _file_lock) 아래에서 읽기-비교-쓰기, 임시 파일은 mkstemp(공유 .tmp 경로 제거). 레지스트리 락과 별개이며 레지스트리 트랜잭션 밖에서 잡힌다 |
test_r4_overlapping_mirror_flushes_*는 첫 flush의 read_text 직후에 경쟁 flush를 스레드로 띄워 실제로 블록됨(blocked is True)과 최신 상태 생존을 단정 — 진짜 인터리빙 테스트다. *_each_mirror_write_uses_its_own_temp_file |
Grok Round 2(32e936e5)는 PASS + 기존 비차단 잔여로, 이번 수정과 충돌 없음.
5. 기타 확인
git diff --check 6ad6f08..HEAD클린,compileall lib_py클린, 자동완료 3표면·lib.sh·shim 변경 0.test_issue5_phase2a_loop.py+phase0+phase1합계 195 passed in 12.57s.- 락 규율(G-5)·writer 인벤토리(G-6)·shadow 무기록(G-4)·패키지 규칙(G-9)은 이번 수정으로 영향받지 않았고(테스트 유지), R4의 감사 락은 레지스트리 락 밖에서만 잡혀 G-5의 "락 안 블로킹 금지"와 충돌하지 않는다.
- 비차단 메모(2b 인계, 이미 문서화됨):
started의 세션 확인(O-A),stop_session.sh의 무조건cancelled가completed이후 거부되는 동작(O-B).
6. 전체 스위트
HEAD(0e74aa1)에서 직접 실행 (.venv/bin/python -m pytest tests/ -q, 백그라운드): 664 passed in 899.99s (0:14:59), 0 failed, 0 skipped. Round 2의 650 대비 +14 (신규 함수 12개가 parametrize로 14 케이스). 총계는 실행 결과에서 직접 읽은 값이다.
7. 결론
Round 2에서 지적한 두 회귀(멱등 ACK의 거부 분류로 인한 래퍼 성공 경로 중단, 롤백 모드의 상태값 검증 소실)는 제시한 방향 그대로 정확히 고쳐졌고, 래퍼와 같은 셸 조건에서 실제 CLI로 확인했다. Codex의 R1/R4도 구현됐으며, 특히 R4는 감사 mirror의 마지막 경쟁 창을 닫는다. Round 1·2의 모든 항목이 회귀 없이 유지되고 새 결함은 발견되지 않았으므로 통과시킨다.
[ADJUDICATION: SUSTAINED]
[VERDICT: PASS]