- Introduce finalize_unfinished in multi-agent-mux-delegate-job for fail-closed atomic transitions - Enforce CAS dispatch_token and attempt_id pinning across engine, CLI, and lifecycle scripts - Integrate Herdr wait_for_agent_idle turn handshake to prevent prompt loss and race conditions - Resolve bash 3.2 set -u empty array expansion compatibility in lib.sh - Preserve Issue #5 R2 contract in CAS transition engine (engine.py, publish_event.py, service.py) - Add comprehensive regression suites (test_issue6_fail_closed.py, test_issue6_turn_handshake.py) - Bump lockstep framework and skills to v4.4.1 across lib.sh, eager.py, VERSIONS.md, 8 SKILL.md - Synchronize documentation (IMPROVEMENTS.md, MESSAGING.md, state-transitions.md, task.md, phase5-e2e.md) - Unanimous PASS achieved across 4 reviewer team leaders (Claude, Codex, OpenCode, Grok) Closes #6
40 lines
4.9 KiB
Markdown
40 lines
4.9 KiB
Markdown
### [reviewer-opencode-01] Issue #6 구현 결과물 3차 최종 재검토 의견
|
|
|
|
- **Job**: `8b455e21` / **검토자**: `reviewer-opencode-01` (1차 `512cfec7`, 2차 `e9c5db1d`의 작성자)
|
|
- **검토 방법**: 7개 조치 항목을 라이브 소스에서 직접 읽어 라인 단위 확인, 27개 Issue #6 테스트 재실행, **전체 회귀 스위트 직접 실행 (777/777, 19분)**, E2E 문서 진실성 재대조.
|
|
|
|
---
|
|
|
|
## 1. 7개 조치 항목 반영 확인 (라인 단위 실측)
|
|
|
|
| # | 항목 | 실측 검증 | 판정 |
|
|
|---|---|---|---|
|
|
| F4 | E2E 문서 진실성 | `phase5-e2e.md` 3·4행이 이제 `error` + "fail-closed 확정 실증 (리포트 정상 전달, 후속 completed CAS 정상 거부)"로 기재 — 레지스트리 원본과 100% 일치. :46 서술도 timeout→finalize→CAS-거부의 실제 시퀀스로 정정. 내 2차 지적을 정확히, 그리고 **과하게 미화하지 않게** 반영 | ✅ |
|
|
| R1 | Working-agent timeout 재관측 | `finalize_unfinished` timeout 분기(:600-655): subscriber 타임아웃 시 `herdr agent get`으로 `working` 확인 → 남은 데드라인 동안 3초 간격 디스크 재관측, 늦은 completed 수용, agent 정지 시 1초 유예+최종 디스크 확인 후 종료 | ✅ |
|
|
| P1 | CAS 토큰 불일치 우회 차단 | close rc=4(토큰 불일치/stale attempt) → "suppressing event emission" 후 이벤트 발행 스킵(:681-685); direct 발행 전 디스크 completed 재확인 → 이중 error 발행 억제 | ✅ |
|
|
| P1 | busy-token 만료 안전 반환 | `lib.sh:2420-2435`: `SKS_BUSY_TIMEOUT` 후에도 `still_busy`면 강제 주입 없이 `rc=4` 반환 | ✅ |
|
|
| P1 | 불확실 RPC 재시도 방지 | `lib.sh:2395`: 패턴에 `transport_error\|connection` 추가 → paste-buffer 폴백으로 떨어지지 않고 `agent get` 상태 확인 후 `working`이면 수용, 아니면 `rc=4` | ✅ |
|
|
| P1 | Runner absent-record hang 방지 | `runner.py:318-333`: 레코드 부재 5회 연속 + 최소 5초 경과 → "aborting wait" 로그 후 `return False` (3,900초 블로킹 제거) | ✅ |
|
|
| P2 | Validate hook 도달성 | reviewer 승인/최대 반복 경로가 `final_loop_rc` 설정 후 `break` → 루프 탈출 후 `--validate` 훅 수행 후 `exit "$final_loop_rc"` (:486-520). (worker/reviewer *실패* 경로는 기존대로 즉시 `exit` — 실패 시 검증할 산출물이 없어 의도적이며 SKILL.md 종료 코드 계약과 정합) | ✅ |
|
|
|
|
## 2. 테스트 검증 (직접 실행)
|
|
|
|
- `test_issue6_fail_closed.py`(16) + `test_issue6_turn_handshake.py`(11) = **27/27 PASS** (내 실행, -v 확인). t2_6/t2_7/t2_9/t2_11 등 2차 보완 항목의 회귀 가드 전부 통과.
|
|
- **전체 회귀**: `pytest tests/ -q` 내 직접 실행 — **777 passed / 0 failed (1,142s)**. 기존 750 + 신규 27, 회귀 없음.
|
|
- `test_version_consistency.py` 3/3 (v4.4.1 락스텝 유지).
|
|
|
|
## 3. 엣지 케이스 및 회귀 위험도 평가
|
|
|
|
- **R1의 무한 대기 여지**: 재관측 루프는 남은 데드라인(`TIMEOUT - elapsed`)으로 상한이 걸려 있어 유한 — `--timeout` 예산 내에서만 늦은 완료를 수용한다. `remaining=0` 즉시 종결. 안전.
|
|
- **R1의 상태 조회 실패**: `agent get` 실패 시 `agent_st=""` → working 아님 → 즉시 finalize 경로로 복귀. fail-open 없음.
|
|
- **P2의 의도적 비대칭**: 실패 경로가 validate를 우회하는 것은 산출물 부재 상황에서 정당하며, 종료 코드 계약(`_rc_for`)을 지키기 위한 필수. 승인 경로만 break하는 설계는 옳다.
|
|
- **잔여 관찰 (비차단)**:
|
|
1. R1의 working-agent 재관측 루프(~50줄)와 P1의 wrapper-level rc=4 발행 억제, P1-3의 transport_error 분기에 **전용 회귀 테스트가 없다** (기존 t1_3/t1_5/t1_11은 인접 계약을 커버하지만 이 신규 분기 자체는 무커버). 후속 패치에서 가드 추가 권고.
|
|
2. 브리프가 "총 30개 테스트"로 기재했으나 실제 16+11=27개 — 브리프 측 계수 오류 (코드 결함 아님).
|
|
3. 900초 잡 예산 vs 장시간 검토(풀스위트 19분)의 운영 특성은 R1로 완화되었으나, 근본적으로는 상위 위임 시 `--timeout` 상향 위임이 권고됨 (이미 e2e 문서 :46에 기재).
|
|
|
|
## 4. 최종 판정
|
|
|
|
2차에서 내가 지적한 문서 진실성 결함(F4)이 사실 그대로 정정되었고, 2차에서 다른 리뷰어들이 지적한 6개 코드 보강(R1, P1×4, P2)이 전부 정확히 구현되었다. 이번 라운드의 신규 변경도 포함해 **27/27 대상 테스트와 777 전체 스위트를 내가 직접 실행해 전부 통과**했으며, v4.4.1 4-way 락스텝도 유지된다. 잔여 사항은 신규 분기의 테스트 가드 부재라는 권고 수준(비차단)과 브리프의 테스트 계수 오류(문서 오탈자 수준)뿐이다. Issue #6은 결함 ①(fail-closed/CAS/ABA)과 결함 ②(턴 핸드셰이크/단일 주입) 모두에서 구조적으로 완결되었고, E2E 실측 문서는 이제 레지스트리 원본과 정확히 일치한다.
|
|
|
|
[VERDICT: PASS] |