<!-- task=dart_web_e2e/02+01_multilang_matrix plan=1 tag=REVIEW_TEST -->

# Code Review Reference - REVIEW_TEST

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-05-24
task=dart_web_e2e/02+01_multilang_matrix, plan=1, tag=REVIEW_TEST

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G07.md` → `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` → `plan_cloud_G07_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/dart_web_e2e/02+01_multilang_matrix/`로 이동한다. WARN/FAIL이면 다음 active plan/review 파일을 즉시 작성한다.
4. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_TEST-1] SSH 원격 환경에서 Dart.web 서버별 runner 5개를 실행하고 실제 stdout/stderr를 기록한다. | [x] |
| [REVIEW_TEST-2] SSH 원격 환경에서 `--unit`과 `--cross` 최종 matrix를 실행하고 완료 표시를 증거와 일치시킨다. | [x] |

## 구현 체크리스트

- [x] [REVIEW_TEST-1] SSH 원격 환경에서 Dart.web 서버별 runner 5개를 실행하고 실제 stdout/stderr를 기록한다.
- [x] [REVIEW_TEST-2] SSH 원격 환경에서 `--unit`과 `--cross` 최종 matrix를 실행하고 완료 표시를 증거와 일치시킨다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

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

## 계획 대비 변경 사항

- 원격 `ssh toki@toki-labs.com`에는 계획의 `/config/workspace/proto-socket` 경로가 없었다. 현재 작업트리를 `/tmp/proto-socket-dart-web-e2e/repo-20260524234117`로 복제해 같은 원격 호스트에서 검증했다.
- 원격 검증 환경 준비가 필요했다. `/tmp/proto-socket-dart-web-e2e/go-toolchain`에 Go 1.26.3을 설치했고, macOS 기본 bash 3.2가 matrix 스크립트의 associative array를 실행하지 못해 Homebrew bash 5.3.9를 설치했다. Dart는 `/Users/toki/SDK/flutter/bin/dart`, Chrome은 `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`을 PATH/환경 변수로 연결했다.
- 임시 복제 환경에서 Dart pub cache, Python deps, TypeScript deps가 원래 플랫폼/경로와 달라 `dart pub get`, Python venv, `npm ci`를 수행했다. setup 로그는 `/tmp/proto-socket-dart-web-e2e/logs/`에 남겼다.
- 검증 중 드러난 코드 실패를 최소 수정했다. matrix 하위 명령은 login shell 대신 현재 환경을 보존하는 shell로 실행하게 했고, Dart TLS/WSS 테스트와 Dart crosstest 클라이언트는 테스트 인증서 PEM이 일치할 때만 `onBadCertificate`를 허용하게 했다. TypeScript WSS 클라이언트는 Kotlin Java-WebSocket WSS 서버와 호환되도록 `ws` 패키지 기반 연결을 사용한다.

## 주요 설계 결정

- 원격 검증 자체를 통과시키기 위한 임시 환경 준비와, 검증에서 실제로 실패한 TLS/WSS/entrypoint 문제만 수정했다.
- Dart 테스트 호스트는 인증서 SAN과 browser runner 기준선에 맞춰 `127.0.0.1`로 통일했다.
- 자체 서명 테스트 인증서는 무조건 허용하지 않고, 서버가 제시한 PEM이 repo의 테스트 인증서와 동일할 때만 허용했다.
- TypeScript plain WS의 raw client는 유지하고, WSS만 `ws` 패키지에 위임해 Kotlin WSS handshake 호환성 문제를 줄였다.

## 리뷰어를 위한 체크포인트

- `ssh toki@toki-labs.com` 원격 환경에서 실행한 증거인지 확인한다.
- 원격 repo에 현재 작업트리 변경이 존재한다는 확인 출력이 있는지 확인한다.
- Chrome 실행 파일 확인 출력이 있는지 확인한다.
- 서버별 runner 5개가 각각 `PASS scenario=send-push`와 `PASS scenario=request-response`를 출력했는지 확인한다.
- `--unit`과 `--cross`가 실제 실행되어 종료 코드 0과 PASS 표를 남겼는지 확인한다.
- 검증 출력에 이전 placeholder성 생략/미실행 문구가 남지 않았는지 확인한다.

## 검증 결과

아래 결과는 `ssh toki@toki-labs.com` 원격 호스트에서 실행했다. 원격의 계획 경로가 없어 `/tmp/proto-socket-dart-web-e2e/repo-20260524234117` 임시 작업트리에서 대체 실행했고, 원문 로그는 `/tmp/proto-socket-dart-web-e2e/logs/`에 남겼다.

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.

### REVIEW_TEST-1 중간 검증

```
$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket && command -v google-chrome || command -v chromium || command -v chromium-browser'
zsh:cd:1: no such file or directory: /config/workspace/proto-socket

Replacement remote repo:
/tmp/proto-socket-dart-web-e2e/repo-20260524234117

Environment evidence log:
/tmp/proto-socket-dart-web-e2e/logs/env_check.log

Key evidence:
/tmp/proto-socket-dart-web-e2e/bin/google-chrome
/tmp/proto-socket-dart-web-e2e/bin/dart
Dart SDK version: 3.10.0-290.4.beta (beta) (Thu Oct 30 11:12:42 2025 -0700) on "macos_arm64"
/tmp/proto-socket-dart-web-e2e/go-toolchain/go/bin/go
go version go1.26.3 darwin/arm64

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket/dart && dart run crosstest/dart_web.dart'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/runner_dart_io.log /opt/homebrew/bin/bash -lc 'cd \"$REPO/dart\" && dart run crosstest/dart_web.dart 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/runner_dart_io.log
PASS scenario=send-push
PASS scenario=request-response
PASS all dart-server/dart-web-client crosstests passed

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket/go && go run ./crosstest/go_dart_web.go'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/runner_go.log /opt/homebrew/bin/bash -lc 'cd \"$REPO/go\" && go run ./crosstest/go_dart_web.go 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/runner_go.log
PASS scenario=send-push
PASS scenario=request-response
PASS all go-server/dart-web-client crosstests passed

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket/kotlin && ./gradlew run -PmainClass=com.tokilabs.proto_socket.crosstest.KotlinDartWebKt'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/runner_kotlin.log /opt/homebrew/bin/bash -lc 'cd \"$REPO/kotlin\" && ./gradlew run -PmainClass=com.tokilabs.proto_socket.crosstest.KotlinDartWebKt 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/runner_kotlin.log
PASS scenario=send-push
PASS scenario=request-response
PASS all kotlin-server/dart-web-client crosstests passed

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket/python && python3 crosstest/python_dart_web.py'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/runner_python.log /opt/homebrew/bin/bash -lc 'cd \"$REPO/python\" && python3 crosstest/python_dart_web.py 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/runner_python.log
PASS scenario=send-push
PASS scenario=request-response
PASS all python-server/dart-web-client crosstests passed

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket/typescript && ./node_modules/.bin/tsx crosstest/typescript_dart_web.ts'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/runner_typescript.log /opt/homebrew/bin/bash -lc 'cd \"$REPO/typescript\" && ./node_modules/.bin/tsx crosstest/typescript_dart_web.ts 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/runner_typescript.log
PASS scenario=send-push
PASS scenario=request-response
PASS all typescript-server/dart-web-client crosstests passed
```

### REVIEW_TEST-2 중간 검증

```
$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --unit'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/matrix_unit.log /opt/homebrew/bin/bash -lc 'cd \"$REPO\" && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --unit 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/matrix_unit.log

**동일언어**
| 언어 | 명령 | 결과 |
|---|---|---|
| Dart | `dart pub get && dart test && dart compile js test/browser_ws_import_compile.dart -o /tmp/proto_socket_browser_ws_import_compile.js` | PASS |
| Go | `go test ./...` | PASS |
| Kotlin | `./gradlew test` | PASS |
| Python | `python3 -m pytest -q` | PASS |
| TypeScript | `npm run check && npm test` | PASS |

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --cross'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/matrix_cross.log /opt/homebrew/bin/bash -lc 'cd \"$REPO\" && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --cross 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/matrix_cross.log

**언어간 통신**
| 서버 \ 클라이언트 | Dart | Go | Kotlin | Python | TypeScript |
|---|---|---|---|---|---|
| Dart | - | PASS | PASS | PASS | PASS |
| Go | PASS | - | PASS | PASS | PASS |
| Kotlin | PASS | PASS | - | PASS | PASS |
| Python | PASS | PASS | PASS | - | PASS |
| TypeScript | PASS | PASS | PASS | PASS | - |

**Dart.web 클라이언트 통신**
| 서버 | Dart.web (WS) | PASS scenarios | Expected | FAIL lines |
|---|---:|---:|---:|---:|
| Dart.io | PASS | 2 | 2 | 0 |
| Go | PASS | 2 | 2 | 0 |
| Kotlin | PASS | 2 | 2 | 0 |
| Python | PASS | 2 | 2 | 0 |
| TypeScript | PASS | 2 | 2 | 0 |

$ rg --sort path "Compiled \\.\\.\\.|# 로컬 미실""행|cloud-G07에서 재실""행|\\(out""put\\)" agent-task/dart_web_e2e/02+01_multilang_matrix/CODE_REVIEW-cloud-G07.md
Executed after filling this file.
exit=1
stdout/stderr: empty
```

### 최종 검증

```
$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --unit'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/matrix_unit.log /opt/homebrew/bin/bash -lc 'cd \"$REPO\" && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --unit 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/matrix_unit.log
All five same-language rows PASS.

$ ssh toki@toki-labs.com 'cd /config/workspace/proto-socket && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --cross'
Replacement command used:
ssh toki@toki-labs.com "REPO=/tmp/proto-socket-dart-web-e2e/repo-20260524234117 LOG=/tmp/proto-socket-dart-web-e2e/logs/matrix_cross.log /opt/homebrew/bin/bash -lc 'cd \"$REPO\" && bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --cross 2>&1 | tee \"$LOG\"'"

exit=0
log=/tmp/proto-socket-dart-web-e2e/logs/matrix_cross.log
All 20 cross-language rows PASS. Dart.web rows: Dart.io, Go, Kotlin, Python, TypeScript all PASS with 2/2 scenarios and 0 FAIL lines.

$ rg --sort path "Compiled \\.\\.\\.|# 로컬 미실""행|cloud-G07에서 재실""행|\\(out""put\\)" agent-task/dart_web_e2e/02+01_multilang_matrix/CODE_REVIEW-cloud-G07.md
Executed after filling this file.
exit=1
stdout/stderr: empty
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

## Ownership

| Section | Owner | Note |
|---------|-------|------|
| Header comment, 개요(date/task/plan/tag), 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute these |
| 구현 항목별 완료 여부 | Implementing agent | Check only after implementation |
| 구현 체크리스트 | Implementing agent | Final checkbox is mandatory |
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify |
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text |
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Review focus areas |
| 검증 결과 | Implementing agent | Paste actual stdout/stderr or exact `/tmp` log path with command |
| 코드리뷰 결과 | Review agent | Append only during review |

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가
  - Correctness: Pass
  - Completeness: Pass
  - Test coverage: Pass
  - API contract: Pass
  - Code quality: Pass
  - Plan deviation: Pass
  - Verification trust: Pass
- 발견된 문제: 없음
- 다음 단계
  - PASS: `complete.log`를 작성하고 active task 디렉터리를 archive로 이동한다.
