<!-- task=m-performance-hotspot-optimization/13_kotlin_ws_diagnostics plan=2 tag=REVIEW_REVIEW_TEST -->

# Plan - REVIEW_REVIEW_TEST

## 이 파일을 읽는 구현 에이전트에게

`CODE_REVIEW-local-G09.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수입니다. 구현 후 active 파일은 그대로 두고 리뷰 준비를 보고하세요. 사용자만 결정할 수 있는 범위 변경, 외부 환경, secret, 사용자 소유 장비가 막으면 리뷰 stub의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈추세요. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 마세요. `USER_REVIEW.md`, 로그 아카이브, `complete.log` 작성은 code-review 전용입니다. 명령 재실행이나 산출물 수집으로 닫을 수 있는 증거 공백은 사용자 리뷰 요청이 아닙니다.

## 배경

G08 구현은 `WsClient.getMetricsDiagnostics()` public API leak는 닫았지만, WSS open timeout은 review 재실행에서 다시 실패했다. `java.security.egd` test JVM property와 OkHttp close cleanup 변경만으로는 [TlsWsTest.kt](/config/workspace/proto-socket/kotlin/src/test/kotlin/com/tokilabs/proto_socket/TlsWsTest.kt:87)의 `websocket open timed out`을 안정화하지 못했다. 이 후속은 WSS mandatory test gate 실패 하나만 닫고, 진단 metrics 범위나 Kotlin WS 성능 최적화 범위는 넓히지 않는다.

## 사용자 리뷰 요청 흐름

구현 중 차단은 active review stub의 `사용자 리뷰 요청` 섹션에 기록합니다. 직접 사용자 프롬프트는 금지이며, code-review가 요청 타당성을 검증하고 실제 `USER_REVIEW.md` 작성을 소유합니다.

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-task/m-performance-hotspot-optimization/13_kotlin_ws_diagnostics/plan_local_G07_0.log`
- `agent-task/m-performance-hotspot-optimization/13_kotlin_ws_diagnostics/code_review_local_G07_0.log`
- `agent-task/m-performance-hotspot-optimization/13_kotlin_ws_diagnostics/plan_local_G08_1.log`
- `agent-task/m-performance-hotspot-optimization/13_kotlin_ws_diagnostics/code_review_local_G08_1.log`
- `agent-test/local/rules.md`
- `agent-test/local/kotlin-smoke.md`
- `agent-test/local/proto-socket-performance-baseline.md`
- `agent-ops/rules/project/domain/kotlin/rules.md`
- `kotlin/build.gradle.kts`
- `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsClient.kt`
- `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsServer.kt`
- `kotlin/src/test/kotlin/com/tokilabs/proto_socket/TlsWsTest.kt`
- `kotlin/build/test-results/test/TEST-com.tokilabs.proto_socket.TlsWsTest.xml`

### 테스트 환경 규칙

`test_env=local`을 사용한다. Kotlin 변경이므로 `agent-test/local/kotlin-smoke.md`의 `cd kotlin && ./gradlew test`가 필수다. 이 후속은 WSS test gate만 다루지만, 기존 diagnostics task를 닫으려면 `cd kotlin && ./gradlew compileCrosstestKotlin`과 focused stress `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --lang kotlin --transport ws --profile roundtrip,payload`도 최종 검증에 유지한다.

### 테스트 커버리지 공백

`TlsWsTest.testWssSendReceive`와 `testWssRequestResponse`가 WSS open/handshake/traffic regression test다. 현재 실패는 `testWssSendReceive`에서 `dialWssWithRetry`가 세 번의 20초 open timeout 후 실패하는 형태다. 새 테스트는 원인 분리를 위해 필요할 때만 추가하고, 최종 PASS 기준은 기존 TlsWsTest 단독과 전체 Gradle test다.

### 심볼 참조

renamed/removed public symbol 없음. `getMetricsDiagnostics`는 G08에서 `internal`로 복구됐고 이번 후속의 직접 대상이 아니다.

### 분할 판단

이미 split subtask `13_kotlin_ws_diagnostics` 안의 review loop다. G09는 G08 Required 하나를 닫는 repair loop이므로 새 sibling subtask를 만들지 않는다. `14+13_kotlin_ws_transport_hardening`과 `15+14_kotlin_ws_reference_guard`는 13번 PASS 후 진행해야 하므로 현재 후속은 이 디렉터리 안에 유지한다.

### 범위 결정 근거

수정 범위는 WSS open timeout 안정화와 필요한 최소 Kotlin build/test setup에 한정한다. Kotlin WS 성능 최적화, TCP behavior, protocol schema, roadmap 갱신은 제외한다. `java.security.egd` 설정을 유지하더라도 그 자체를 충분한 해결로 보지 말고 실제 timeout 재현 경로를 닫아야 한다.

### 빌드 등급

`local-G09`: 이전 local-G08 후속이 같은 WSS 검증을 PASS로 기록했지만 review 재실행에서 실패했다. 명확한 repo-owned test failure이나 evidence trust 회복과 handshake 원인 분리가 필요하므로 local grade를 올린다.

## 구현 체크리스트

- [ ] WSS open timeout의 실제 지연 지점을 deterministic하게 분리하고 repo-owned 원인을 수정한다.
- [ ] `TlsWsTest` 단독과 전체 `./gradlew test`를 재실행해 WSS mandatory gate를 PASS로 만든다.
- [ ] `compileCrosstestKotlin`, diagnostics focused stress, `getMetricsDiagnostics` internal boundary를 재확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_TEST-1] Stabilize WSS Open Timeout

문제: G08 review 재실행에서 `cd kotlin && ./gradlew test --tests "com.tokilabs.proto_socket.TlsWsTest"`가 실패했다. 실패 리포트는 [WsClient.kt](/config/workspace/proto-socket/kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsClient.kt:237)의 `opened.await(20, TimeUnit.SECONDS)` timeout이 [TlsWsTest.kt](/config/workspace/proto-socket/kotlin/src/test/kotlin/com/tokilabs/proto_socket/TlsWsTest.kt:87)의 `dialWssWithRetry`까지 전파된다는 것을 보여준다.

해결 방법: WSS open path를 계측 또는 구조적으로 좁혀 다음 후보 중 실제 원인을 찾고 수정한다.

- `WsServer.start()`가 SSL WebSocket server readiness를 `onStart`보다 늦게 만족하는지 확인한다.
- `dialWsUrl`의 `onFailure`/`onOpen` callback이 timeout 전에 호출되지 않는 이유를 확인한다.
- TLS context 생성, Java-WebSocket SSL factory, OkHttp TLS handshake, server/client close cleanup 중 어느 단계가 `testWssSendReceive` 첫 연결에서만 지연되는지 확인한다.
- `build.gradle.kts`의 `java.security.egd` 설정이 실제 test JVM에 적용됐는지 확인하되, 적용 여부만으로 PASS 처리하지 않는다.

수정 파일 및 체크리스트:

- [ ] `kotlin/src/test/kotlin/com/tokilabs/proto_socket/TlsWsTest.kt`: readiness/wait/retry/cleanup이 원인이면 테스트 setup을 최소 수정한다.
- [ ] `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsClient.kt`: open/failure callback 또는 close cleanup이 원인이면 최소 수정한다.
- [ ] `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsServer.kt`: SSL server readiness 또는 stop ordering이 원인이면 최소 수정한다.
- [ ] `kotlin/build.gradle.kts`: test JVM property가 필요하면 적용 여부를 검증 가능한 형태로 유지한다.

테스트 작성: 기존 `TlsWsTest.testWssSendReceive`와 `testWssRequestResponse`를 regression test로 사용한다. 새 테스트는 timeout 원인을 더 좁혀 재현할 때만 추가한다.

중간 검증:

```bash
cd kotlin && ./gradlew test --tests "com.tokilabs.proto_socket.TlsWsTest"
```

기대 결과: `BUILD SUCCESSFUL`.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `kotlin/src/test/kotlin/com/tokilabs/proto_socket/TlsWsTest.kt` | REVIEW_REVIEW_TEST-1 if needed |
| `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsClient.kt` | REVIEW_REVIEW_TEST-1 if needed |
| `kotlin/src/main/kotlin/com/tokilabs/proto_socket/WsServer.kt` | REVIEW_REVIEW_TEST-1 if needed |
| `kotlin/build.gradle.kts` | REVIEW_REVIEW_TEST-1 if needed |

## 최종 검증

```bash
rg --sort path "fun getMetricsDiagnostics|getMetricsDiagnostics" kotlin
```

```bash
cd kotlin && ./gradlew test --tests "com.tokilabs.proto_socket.TlsWsTest"
```

```bash
cd kotlin && ./gradlew test
```

```bash
cd kotlin && ./gradlew compileCrosstestKotlin
```

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --lang kotlin --transport ws --profile roundtrip,payload
```

기대 결과: `getMetricsDiagnostics`가 public API로 노출되지 않고, TlsWsTest/전체 Gradle/crosstest compile은 `BUILD SUCCESSFUL`, focused stress는 Kotlin WS roundtrip/payload rows를 PASS로 기록한다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
