<!-- task=m-large-payload-followup-optimization/04_ws_fixed_latency plan=0 tag=TEST -->

# Plan - TEST

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

`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 이 작업의 필수 마지막 단계다. 검증 명령을 실행하고 실제 stdout/stderr와 결과 record 경로를 붙인 뒤, active 파일은 그대로 두고 리뷰 준비를 보고한다. 최종 판정, 로그 아카이브, `complete.log` 작성, task directory archive 이동은 code-review-skill 전용이다.

구현 중 사용자만 결정할 수 있는 범위 변경, 사용자 소유 외부 환경 prerequisite, 또는 계획 범위 충돌이 있으면 active review stub의 `사용자 리뷰 요청` 섹션에 정확한 결정 사항과 근거를 기록하고 code-review로 넘긴다. 구현 에이전트는 사용자에게 직접 질문하거나, 채팅 선택지를 제시하거나, `request_user_input`을 호출하거나, `USER_REVIEW.md`/`complete.log`를 만들지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 증거 공백은 사용자 리뷰 요청이 아니다.

## 배경

야간 full 성능 record는 전체 PASS였지만, WS 계열에는 서로 다른 모양의 fixed-latency 신호가 남아 있다. Kotlin WS same-language rows는 40ms대 plateau와 일부 queue backlog가 보이고, TypeScript gateway worker_threads path는 TCP/WS 모두 p99 190ms 이상 tail을 보인다. 이 작업은 바로 제품 코드를 고치지 않고, WS 공통 transport 문제인지 언어별 worker/gateway 문제인지 분리해 다음 구현 단위를 정한다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 이 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md`에서 복사된 형식이며, 구현 에이전트의 직접 사용자 질문은 금지된다. code-review가 요청의 타당성을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/large-payload-followup-optimization.md`
- Task ids:
  - `ws-fixed-latency-path`: WS 계열 fixed latency 경로 분리 분석
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/skills/common/update-roadmap/SKILL.md`
- `agent-ops/skills/common/_templates/implementation-user-review-request-section.md`
- `.gitignore`
- `agent-test/local/rules.md`
- `agent-test/local/proto-socket-performance-baseline.md`
- `agent-ops/rules/project/domain/dart/rules.md`
- `agent-roadmap/current.md`
- `agent-roadmap/ROADMAP.md`
- `agent-roadmap/milestones/large-payload-followup-optimization.md`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh`
- `agent-test/runs/20260614-123328-proto-socket-performance-full.md`

### 테스트 환경 규칙

- 선택한 `test_env`: `local`.
- `agent-test/local/rules.md`는 존재하며 읽었다. 성능/latency/payload 판단은 `proto-socket-performance-baseline` profile로 라우팅한다.
- 읽은 profile: `agent-test/local/proto-socket-performance-baseline.md`.
- 적용 명령: 특정 병목 축은 `run_stress.sh --quick --lang <lang> --transport <tcp|ws> --profile <profile>`로 좁힌다. 성능 row의 hard gate는 timeout, nonce mismatch, response type mismatch, FIFO violation, pending leak, queue/gateway backlog leak 0이다.
- full 야간 baseline 재실행은 이 계획의 필수 검증이 아니다. 기존 2026-06-14/15 full record를 원인 분리 근거로 쓰고, 구현 에이전트는 focused quick WS/gateway 검증만 실행한다.

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

- 제품 동작 변경은 없다. 새 단위 테스트를 작성하지 않는다.
- 기존 stress/performance harness는 WS same-language rows와 TypeScript gateway rows를 기록하지만, fixed-latency 원인을 자동 분류하는 pass/fail threshold는 없다. 구현 에이전트가 deterministic awk 출력과 focused quick record를 근거로 분류를 `CODE_REVIEW-cloud-G07.md`에 남긴다.

### 심볼 참조

- 없음. renamed/removed symbol이 없다.

### 분할 판단

- split decision policy를 먼저 평가했다.
- 이 작업은 기존 milestone split group `agent-task/m-large-payload-followup-optimization/`의 네 번째 subtask다.
- 선택한 subtask directory는 `04_ws_fixed_latency`이며 dependency prefix가 없으므로 predecessor `complete.log` 확인이 필요 없다.
- 제품 코드 수정, Kotlin WS 수정, TypeScript gateway 수정은 서로 다른 ownership/risk이므로 이 계획에서 분리한다. 이 subtask는 원인 분리와 후속 plan 후보 지정만 다루는 단일 evidence task라 추가 split 없이 한 plan이 더 안전하다.

### 범위 결정 근거

- Kotlin WS 구현, TypeScript gateway implementation, Dart/Go/Python reference path는 수정하지 않는다.
- `agent-test/runs/20260614-123328-proto-socket-performance-full.md`에서 Dart TCP 1MB와 Dart WS 1MB가 모두 stability PASS라 Dart large-packet guard는 별도 plan으로 만들지 않는다.
- 이 계획의 PASS는 `ws-fixed-latency-path` 분석 완료만 의미한다. 구현이 필요한 구체 경로가 식별되면 새 follow-up plan으로 분리한다.

### 빌드 등급

- `cloud-G07`: cross-language 성능 record, terminal benchmark wrapper, stdout/stderr parsing, gateway tail 분류가 중심이고 제품 코드 변경보다 증거 신뢰도가 중요하다.

## 구현 체크리스트

- [ ] 2026-06-14/15 full 성능 record에서 WS fixed-latency 후보 rows를 deterministic awk 출력으로 재확인하고, Kotlin WS 40ms대 plateau/queue backlog와 TypeScript worker_threads gateway tail을 `주요 설계 결정`에 기록한다.
- [ ] `run_stress.sh --quick --lang dart,go,kotlin,python,typescript --transport ws --profile roundtrip,sustained,parallel,payload`를 실행해 현재 focused WS hard gate가 PASS인지 확인하고 결과 record 경로를 `검증 결과`에 붙인다.
- [ ] `run_stress.sh --quick --lang typescript --transport ws --profile gateway`를 실행해 TypeScript WS gateway worker path가 same-language WS fixed-latency와 별도 후보인지 기록한다.
- [ ] 코드 수정 없이 종료할지, 다음 구현 plan으로 승격할 언어/경로가 있는지 `계획 대비 변경 사항` 또는 `주요 설계 결정`에 명시한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [TEST-1] WS fixed-latency evidence 분리

#### 문제

- Milestone의 `ws-fixed-latency-path`는 WS 계열 fixed latency가 야간에도 유지될 때 transport 공통 경로와 언어별 worker/gateway path를 분리하도록 남아 있다: `agent-roadmap/milestones/large-payload-followup-optimization.md:52`.
- 2026-06-14/15 full record에서 Kotlin WS same-language rows는 roundtrip/sustained/payload에서 p50/p99가 40ms대에 몰리는 구간이 있다: `agent-test/runs/20260614-123328-proto-socket-performance-full.md:130`, `agent-test/runs/20260614-123328-proto-socket-performance-full.md:137`, `agent-test/runs/20260614-123328-proto-socket-performance-full.md:144`.
- 같은 record에서 TypeScript gateway worker_threads path는 TCP/WS 모두 p99 tail이 190ms 이상으로 별도 gateway 후보처럼 보인다: `agent-test/runs/20260614-123328-proto-socket-performance-full.md:482`, `agent-test/runs/20260614-123328-proto-socket-performance-full.md:488`.
- `run_stress.sh`는 focused `--lang`, `--transport`, `--profile` 옵션과 hard gate 정의를 제공한다: `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh:6`, `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh:44`.

#### 해결 방법

제품 코드 변경 없이 evidence task로 완료한다. 구현 에이전트는 기존 full record를 deterministic awk로 재분류하고, quick focused WS 및 TypeScript gateway record를 새로 생성해 다음 구현 후보를 하나 이상으로 좁힌다.

Before:

```text
agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md:77
## 주요 설계 결정

agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md:79
_구현 에이전트가 주요 설계 결정 사항을 기록한다._

agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md:100
## 검증 결과

agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md:102
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
```

After:

```text
agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md
- `주요 설계 결정`: Kotlin WS same-language plateau 여부, TypeScript worker_threads gateway tail 여부, WS 공통 transport 문제인지 언어별 follow-up인지 판정.
- `검증 결과`: awk 출력, focused WS quick record 경로, TypeScript gateway quick record 경로, hard gate 결과.
```

#### 수정 파일 및 체크리스트

- `agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md`
  - [ ] `TEST-1 중간 검증`에 awk 출력 전체를 붙인다.
  - [ ] `최종 검증`에 focused WS quick record와 TypeScript gateway quick record 출력 전체 또는 충분한 stdout/stderr와 record 경로를 붙인다.
  - [ ] `주요 설계 결정`에 다음 follow-up 후보를 기록한다.

#### 테스트 작성

- 새 테스트 작성은 생략한다. 제품 코드 변경이 없고, 기존 stress harness가 같은 row schema로 WS/gateway latency, hard gate counters, record path를 기록한다.

#### 중간 검증

```bash
awk -F'|' 'function trim(s){gsub(/^[[:space:]]+|[[:space:]]+$/,"",s); return s} BEGIN{print "| Profile | Axis | Language | p99(ms) | QueueBacklog | GatewayBacklog | Gateway | Result |"; print "|---|---|---|---:|---:|---:|---|---|"} /^\|/ && $2 !~ /Profile|---/ {profile=trim($2); axis=trim($3); lang=trim($4); transport=trim($5); if (transport=="ws" && (profile=="roundtrip" || profile=="sustained" || profile=="parallel" || profile=="payload" || profile=="gateway")) print "| " profile " | " axis " | " lang " | " trim($12) " | " trim($18) " | " trim($19) " | " trim($20) " | " trim($22) " |"}' agent-test/runs/20260614-123328-proto-socket-performance-full.md
```

Expected: command exits 0 and prints WS same-language/gateway rows from the full record. Kotlin WS plateau rows and TypeScript worker_threads gateway tail must be visible if still present in the record.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-large-payload-followup-optimization/04_ws_fixed_latency/CODE_REVIEW-cloud-G07.md` | TEST-1 |

## 최종 검증

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

Expected: exit 0, overall `PASS`, result record under `agent-test/runs/*-proto-socket-stress-quick.md`.

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --lang typescript --transport ws --profile gateway
```

Expected: exit 0, overall `PASS`, result record under `agent-test/runs/*-proto-socket-stress-quick.md`.

```bash
git diff --check
```

Expected: no output and exit 0.

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