### [reviewer-opencode-01] Issue #6 구현 결과물 6차 최종 재검토 의견 - **Job**: `24e28c12` / **검토자**: `reviewer-opencode-01` (4차 `8b455e21`, 5차 `d264ee71`(중단)에 이은 6차) - **검토 방법**: 라운드-6의 모든 클레임을 라이브 소스에서 라인 단위 검증 + 신규 테스트(T1-21, T2-14) 직접 실행 + **브리프 지정 7개 스위트를 환경 변수를 달리한 3가지 조건(앰비언트/핀-데드/파일 단독)에서 각각 실행**해 재현성을 실측. --- ## 1. 라운드-6 클레임 검증 결과 | 클레임 | 검증 | 판정 | |---|---|---| | P1-A: `$pub` 명령에 `--expect-dispatch-token`/`--attempt-id` 고정 바인딩 | wrapper direct(:168-178)·loop(:373-426) 모두 바인딩 확인. **1차 증거: 이번 리뷰를 위해 내가 받은 지시문 자체가 토큰을携带** — 내 `started`/`completed` 발행 명령에 `--expect-dispatch-token f61719bd...`가 실려 있다. publish_event는 와이어 전 rc=4 선차단(:284-290) + sync 측도 토큰 가드. `prepare_event` 디스크 토큰 자동 채택 제거(:145-150, CLI 인자만) 확인 | ✅ | | T1-21 (지연된 attempt-1 completed가 attempt-2 레코드 오염 차단) | 직접 실행 **PASS** — stale 토큰 발행이 rc=4로 차단됨 | ✅ | | P1-B: 빈 RPC 출력 폴백 제거 (`lib.sh:2416`) | `|| [ -z "$p_out" ]` 제거 확인(라운드-4에서 넣었다가 정확히 되돌린 조치 — 단일 주입 계약 강화가 옳음). b19 목 herdr가 명시적 `unknown command: agent prompt` 반환하도록 수정 확인 | ✅ | | T2-14 (빈 RPC 오류 시 paste 0회 + rc=4) | 직접 실행 **PASS** | ✅ | | P2: SKILL.md rc=1/rc=5 표 충돌 제거, VERSIONS.md:16 정렬 | SKILL.md 단일표(0/1/2/3/5)에 preflight=rc=5로 단일화; VERSIONS.md:16이 래퍼 CLI 코드로 정렬되고 rc=4는 "send_keys_safe 헬퍼 수준, 래퍼에서 rc=1로 수용"으로 명시 — **내가 5차에서 지적한 계층 모호성이 정확히 해소됨** | ✅ | | test_x03 갱신 (attempt_id 규약) | 65/65 통과 (내 실행); 단정문이 `attempt_id == 1`로 갱신 확인 | ✅ | ## 2. 발견된 잔여 결함 (차단): fail_closed 스위트의 비밀봉(non-hermetic)성 브리프의 핵심 수용 기준인 "지정 스위트 100% 통과"가 **현재 환경에서 달성 불가**함을 3가지 조건에서 실측했다: 1. **앰비언트 환경 (7스위트)**: `test_t1_20` **결정적 실패** (2회 재실행 모두 동일; 파일 단독 실행에서도 실패). 202+1 fail. 2. **브로커 핀-데드 환경** (`MQTT_HOST=127.0.0.1 MQTT_PORT=65534`, 형제 테스트 T1-4/T1-5가 쓰는 패턴): t1_20은 **통과**하지만 **t1_1, t1_2, t1_15, t1_16이 실패로 뒤집힘** (202+4 fail). 3. **원인 규명 (1차 증거)**: 현재 공개 브로커 `broker.hivemq.com`이 **half-open 상태** (TCP는 열리나 CONNACK 무응답 — 내 이벤트 발행 시도의 "no CONNACK from broker" 경고로 실증). 이로 인해: - t1_20: 구독자가 5초 핸드셰이크 창 내에 rc=2로 사망 → **주입 이전** 조기사망 경로 진입 → R1 유예가 (아직 주입 안 된) idle 에이전트를 보고 정상 스킵 → rc=2 조기 종료. 유예-계속 메시지 없음. - t1_1/2/15/16: 이 테스트들은 구독자가 라이브 브로커에 CONNACK+SUBSCRIBE 후 idle-timeout(rc=2)으로 죽는 흐름을 전제로 작성됨 → 핀-데드에서는 rc=3(broker_unavailable) 경로로 바뀌어 단정 실패. - 즉 **T1-14/15/16/20(라운드-5 B1' 신규)은 실제 구독자를 띄우며 공개 브로커의 가용성·응답성을 암묵 전제**한다. 브로커가 완전히 살아있던 오늘 낮(내 4차 40/40 통과 시점)에는 전부 통과했으나, 브로커가 half-open이 된 지금 t1_20이 뒤집혔다. 스위트는 환경의 인질이다. 4. **부수 관찰 (코드 결함 아님)**: 주입 전 조기사망 경로에서 R1 유예를 스킵하는 것은 **정당한 설계**(주입 안 된 에이전트를 기다릴 대상 없음)다. 결함은 어디까지나 테스트의 격리성에 있다. ## 3. 수정 방향 (구체적) 선택지 2가지 (어느 쪽이든 기계적): 1. **권장 — 세션 스코프 로컬 MQTT 브로커 fixture**: `nats-docker`(이미 O-5로 계획된 사설 MQTT 브로커, 포트 1883) 또는 경량 Python 브로커를 conftest autouse fixture로 기동해 전 fail_closed/turn_handshake 실구독자 테스트가 **결정적 로컬 브로커**를 바라보게 한다. 이는 B-15/O-5 궤도와도 정합. 2. **최소 — 각 테스트의 브로커 기대치 명시+일관화**: t1_1/2/15/20 등이 전부 동일한 (핀-데드 또는 로컬-라이브) 조건을 명시하도록 env를 통일. 단, 핀-데드에서 t1_1류가 기대하는 rc=2 흐름은 broker_unavailable(rc=3) 경로로 바뀌므로 **단정문 재작성**이 필요함 — 로컬 라이브 브로커(선택지 1)가 구독자 타임아웃 흐름을 그대로 보존하므로 파괴가 적다. ## 4. 최종 판정 라운드-6의 코드·문서 클레임(P1-A 토큰 바인딩, P1-B 빈출력 폴백 제거, P2 문서 정렬, test_x03 갱신)은 전부 정확하고, T1-21/T2-14 가드도 실효성 있게 통과했다 — 심지어 이번 검토의 지시문 자체가 P1-A의 실전 적용 사례가 되었다. 그러나 **브리프의 명시적 수용 기준인 "지정 테스트 스위트 100% 통과"가 현재 환경에서 물리적으로 불가능**하다: t1_20은 앰비언트에서 결정적 실패, 핀-데드로 돌리면 4개 형제 테스트가 대신 실패한다. 이는 라운드-5 B1'에서 도입된 실구독자 테스트들이 공개 브로커의 상태에 비밀봉으로 결부되어 있다는 테스트 인프라 결함이며, "재현 불가한 타임아웃"이 아니라 3조건 실측으로 원인까지 특정된 **결정적·환경의존적** 실패다. 본 세션의 일관 기준(검증 가능한 '100% 통과' 주장)상 PASS를 줄 수 없다. 수정은 선택지 1(로컬 브로커 fixture)로 일괄 해결 가능하며 코드 본체는 무수정이다. [VERDICT: NOT PASS]