<!-- task=cli_real_e2e_failures/02_opencode_second_run plan=0 tag=OCODE -->

# CODE_REVIEW-cloud-G07 - opencode second message real e2e failure

## 리뷰 대상

- Plan: `PLAN-cloud-G07.md`
- Scope: `opencode` 실제 e2e 동일 session 두 번째 메시지 실패 수정
- Date: 2026-05-22

## 구현 체크리스트 확인

- [x] fake OpenCode server로 동일 session `Execute` 2회를 재현하는 blackbox test가 있다.
  - `TestCLIExecuteOpencodeSSE_ConsecutiveExecutesReuseSession` 추가
  - createCalls == 1, promptCalls == 2, 두 run 모두 complete, sink 오염 없음 검증
- [x] 두 번째 실행에서 SSE 이벤트를 놓치거나 잘못 filter하는 경로가 수정되어 있다.
  - `opencodeMessagePartDeltaText`: `message.part.updated`를 놓쳤을 때 unknown part의 `field="text"` delta를 허용하도록 수정. 알려진 non-text 타입만 drop.
- [x] timeout/cancelled 경로에 최근 SSE event type/sessionID trace가 bounded diagnostic으로 남는다.
  - `sseEvtTrace` 타입 + 8-entry ring buffer 추가, `finalize` 시 `c.logger.Warn`으로 출력
  - 필드: `t` (event type), `sid` (ok/mm/empty), `out` (delta/idle/error/skip/filtered)
  - prompt/body 원문은 포함하지 않음
- [ ] 실제 `bin/edge.sh` + `bin/node.sh` 흐름에서 `opencode` 메시지 2회가 통과한다.
  - G07 등급: 실제 e2e는 외부 opencode 서버가 필요, 별도 재검증 필요

## 리뷰 포인트

- session reuse를 유지하면서 첫 run의 event가 두 번째 sink에 섞이지 않는가.
  - **OK**: `driveOpencodeSSE`는 호출별 독립 `partTypes` 맵과 `events` 채널을 사용. 첫 run이 `sess.mu` 해제 후 두 번째 run이 새 SSE stream을 연다.
- `/global/event` stream을 prompt 전에 여는 기존 보장이 유지되는가.
  - **OK**: `executeOpencodeSSE` 구조 변경 없음. SSE open → sessionID 확보 → prompt 순서 유지.
- sessionID mismatch filter 확장이 다른 session의 event leakage를 만들지 않는가.
  - **OK**: filter 로직 변경 없음. trace 기록만 추가.
- timeout/cancel diagnostic이 민감한 prompt/body 전체를 노출하지 않는가.
  - **OK**: event type, sessionID 일치 여부, 처리 결과만 기록. delta 본문 미포함.
- cancel 시 abort 호출과 `TerminateSession` cleanup이 기존처럼 동작하는가.
  - **OK**: `finalize` 내부 로직 변경 없음. warn log가 abort 전에 실행될 뿐.

## 테스트 기록

- [x] `go test ./apps/node/internal/adapters/cli -run 'OpencodeSSE|Opencode'` — PASS (22 tests)
- [x] `go test ./apps/node/internal/adapters/cli` — PASS (41.3s)
- [ ] 실제 `opencode` e2e 사용자 흐름 2회 메시지 — 외부 서버 필요, 미검증

## 리뷰 결과

- Status: 코드 변경 완료, 실제 e2e 재검증 미완
- 수정 파일:
  - `apps/node/internal/adapters/cli/opencode_sse.go` — `sseEvtTrace` 타입 + ring buffer trace, `finalize` warn log, `opencodeMessagePartDeltaText` unknown part 허용
  - `apps/node/internal/adapters/cli/opencode_sse_blackbox_test.go` — `TestCLIExecuteOpencodeSSE_ConsecutiveExecutesReuseSession`
  - `apps/node/internal/adapters/cli/opencode_sse_internal_test.go` — unknown part 허용 반영, `empty partID field=text allowed` 케이스 추가

## 남은 위험

- 실제 opencode 서버의 두 번째 run SSE event shape이 테스트와 다를 수 있음. trace log가 원인 파악에 사용된다.
- `message.part.updated` 없이 `message.part.delta`가 오는 경우 reasoning 토큰이 출력에 섞일 수 있음. 실제 환경에서 확인 필요.
- 실제 e2e는 외부 opencode 서버(`ollama-dgx/qwen3.6:35b-a3b-bf16`)가 필요하므로 CI에서 자동 검증 불가. G07 등급 판정 유지.

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Pass
  - completeness: Fail
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Fail
  - verification trust: Fail
- 발견된 문제:
  - Required: `agent-task/cli_real_e2e_failures/02_opencode_second_run/CODE_REVIEW-cloud-G07.md:22`에서 실제 `bin/edge.sh` + `bin/node.sh` opencode 2회 메시지 검증이 미완으로 남아 있다. `PLAN-cloud-G07.md:153`의 최종 검증 조건이므로, 외부 opencode 서버 또는 실제 profile을 붙인 임시 config로 동일 session 2회 메시지를 실행하고 non-empty `[node0-msg]`와 complete 출력, 로그 경로를 review 파일에 기록해야 한다.
  - Required: `agent-task/cli_real_e2e_failures/02_opencode_second_run/CODE_REVIEW-cloud-G07.md:11`의 구현 체크리스트가 `PLAN-cloud-G07.md:74`의 체크리스트와 일치하지 않는다. 특히 `PLAN-cloud-G07.md:80`의 `CODE_REVIEW-cloud-G07.md` 갱신 항목이 빠져 있고, `검증 결과`에 실제 stdout/stderr가 없다. 다음 review 파일은 plan 체크리스트와 동일한 항목/순서를 갖고 실제 검증 출력을 포함해야 한다.
- 다음 단계: FAIL이므로 active plan/review를 archive log로 이동하고, 실제 opencode e2e 검증 및 review 파일 계약 복구를 위한 `PLAN-cloud-G07.md` / `CODE_REVIEW-cloud-G07.md` follow-up을 작성한다.

## 코드리뷰 전용 체크리스트

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_0.log`로 아카이브한다.
- [x] active `PLAN-cloud-G07.md`를 `plan_cloud_G07_0.log`로 아카이브한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/cli_real_e2e_failures/02_opencode_second_run/`를 `agent-task/archive/YYYY/MM/cli_real_e2e_failures/02_opencode_second_run/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/cli_real_e2e_failures/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이면 다음 active `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성하고 `complete.log`를 작성하지 않는다.
