<!-- task=m-high-performance-parallel-operations/04+01_load_profile_scales plan=0 tag=TEST -->

# Plan - TEST

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

`CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션을 실제 구현 내용, 검증 명령, stdout/stderr로 채우는 것이 구현의 마지막 단계다. 구현 중 사용자 결정, 사용자 소유 외부 환경, 또는 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청`을 증거와 함께 채우고 중단한다. 단순 검증 증거 공백은 후속 에이전트가 재실행으로 해소할 수 있으므로 사용자 리뷰 요청으로 올리지 않는다. archive, `complete.log`, 최종 판정은 code-review 전용이다.

## 배경

현재 `load-profile` Epic의 `burst-100k`, `parallel-1k`, `soak-load`는 기존 stress profile이 있으나 full 축이 10k burst, 16 clients, 30초 sustained에 머물러 있다. 마일스톤은 100k burst, 128/512/1024 clients 후보, 5분 smoke와 30분 full 후보를 요구한다. 이 계획은 새 프로파일을 만들기보다 기존 `burst`, `parallel`, `sustained` 축을 mode별 scale 후보로 확장하고, unsupported/deferred 축은 PASS로 둔갑하지 않게 기록한다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-cloud-G08.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 그 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 판단한다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/high-performance-parallel-operations.md`
- Task ids:
  - `burst-100k`: burst inbound 기준선 확장
  - `parallel-1k`: 다중 connection 기준선 확장
  - `soak-load`: sustained load 기준선 확장
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-ops/skills/common/router.md`
- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/skills/common/_templates/implementation-user-review-request-section.md`
- `agent-roadmap/current.md`
- `agent-roadmap/milestones/high-performance-parallel-operations.md`
- `agent-test/local/rules.md`
- `agent-test/local/proto-socket-full-matrix.md`
- `agent-test/local/typescript-smoke.md`
- `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh`
- `typescript/bench/stress.ts`
- `dart/bench/stress.dart`
- `go/bench/stress.go`
- `python/bench/stress.py`
- `kotlin/crosstest/stress.kt`
- `agent-task/archive/2026/06/m-high-performance-parallel-operations/01_lang_baseline/complete.log`
- `agent-task/archive/2026/06/m-high-performance-parallel-operations/02+01_cross_baseline/complete.log`
- `agent-task/archive/2026/06/m-high-performance-parallel-operations/03+01_payload_matrix/complete.log`

### 테스트 환경 규칙

`test_env=local`. `agent-test/local/rules.md`를 읽었고 project-wide/full-cycle은 `agent-test/local/proto-socket-full-matrix.md`, TypeScript 변경은 `agent-test/local/typescript-smoke.md`가 매칭된다. 적용 명령은 focused stress quick/full profile, `cd typescript && npm run check && npm test`, 최종 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all`이다. stress 확장 검증은 기존 local rules에 별도 profile 문서가 없으므로 `run_stress.sh` 자체 사용법과 마일스톤 검증 문구를 fallback verification source로 사용한다.

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

- `burst-100k`: 기존 harness는 full에서도 1k/10k만 실행한다. 100k count row와 queue drain/pending cleanup 근거가 없다.
- `parallel-1k`: 기존 harness는 full 16 clients만 실행한다. 128/512/1024 client 후보 row가 없다.
- `soak-load`: 기존 harness는 full 30초 sustained만 실행한다. 5분 smoke/30분 full 후보와 trend axis가 없다.
- 기존 tests는 stress harness 실행 결과를 검증 산출물로 쓰며, 별도 unit assertion은 없다. 구현 후 focused stress run과 full matrix가 회귀 검증이다.

### 심볼 참조

renamed/removed symbol 없음. 새 helper 또는 constants를 추가할 수 있으나 기존 public API 변경은 없다.

### 분할 판단

split policy를 먼저 평가했다. shared task group은 `m-high-performance-parallel-operations`다. 이 plan은 `04+01_load_profile_scales`이며 predecessor `01`은 archive complete log `agent-task/archive/2026/06/m-high-performance-parallel-operations/01_lang_baseline/complete.log`로 충족된다. sibling plan `05+04_slow_mix`는 이 plan의 scale/profile 정리 후 새 profile을 추가하도록 `04`에 의존한다. `burst`, `parallel`, `sustained`는 같은 harness scale 정책과 result row schema를 공유하므로 하나의 review unit으로 묶고, 새 `slow-mix` profile은 별도 risk/profile 추가라 분리한다.

### 범위 결정 근거

wire format, proto schema, nonce 의미, package release, CI/CD runner, C#/Swift 포팅은 제외한다. Kotlin TCP/WS deferred bottleneck 자체 수정도 제외한다. 이번 범위는 stress runner/harness의 load-profile 축 확장과 기록 정책에 한정한다.

### 빌드 등급

cloud-G08. 다중 언어 harness, shell orchestrator, long-running benchmark contract, concurrency/load behavior가 결합되어 verification trust와 timeout 정책 판단이 중요하다.

## 구현 체크리스트

- [ ] [TEST-1] `run_stress.sh` usage/result text가 load-profile full 후보를 정확히 설명하고, focused 실행 명령이 재현 가능하게 기록되도록 정리한다.
- [ ] [TEST-2] Dart/Go/Kotlin/Python/TypeScript의 `burst` full 축에 100k 후보를 추가한다. 검증: 입력 순서, dispatch 순서, pending cleanup, queue drain 결과가 기록되고 hard gate 위반이 0이다.
- [ ] [TEST-3] Dart/Go/Kotlin/Python/TypeScript의 `parallel` full 축에 128/512/1024 clients 후보를 추가하거나 언어별 안전 한계는 required SKIP으로 기록한다. 검증: connection별 FIFO와 nonce matching이 독립적으로 유지되고, 한 connection의 지연/포화가 다른 connection의 pending map을 오염시키지 않는다.
- [ ] [TEST-4] Dart/Go/Kotlin/Python/TypeScript의 `sustained` 축을 quick smoke, 5분 smoke, 30분 full 후보로 확장하고 latency/throughput/memory trend axis를 결과 파일에 남긴다.
- [ ] [TEST-5] focused stress, TypeScript smoke, 전체 matrix를 실행하고 결과 파일 경로를 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [TEST-1] Runner Contract

### 문제

[run_stress.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh:14)는 `--full`을 "1k/10k burst, 30s sustained, 16 parallel clients"로 설명한다. `load-profile` 목표와 맞지 않으므로 구현 후 사용법과 결과 기록이 실제 축을 반영해야 한다.

### 해결 방법

Before:

```bash
# agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh:14
  --full    Milestone baseline sizes (1k/10k burst, 30s sustained, 16 parallel clients)
```

After:

```bash
  --full    Load baseline candidates including 100k burst, 5m/30m sustained, 128/512/1024 client candidates where supported
```

필요하면 `Profiles` 설명에도 large candidates와 required SKIP 정책을 덧붙인다. 결과 row schema는 유지한다.

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

- [ ] `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh` usage와 결과 기록 문구를 수정한다.
- [ ] invalid profile/transport behavior는 바꾸지 않는다.

### 테스트 작성

별도 test file은 작성하지 않는다. shell usage/record contract 변경은 focused `run_stress.sh` 실행으로 검증한다.

### 중간 검증

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --help
```

기대: exit 0, load-profile scale 설명 포함.

## [TEST-2] Burst 100k

### 문제

[typescript/bench/stress.ts](/config/workspace/proto-socket/typescript/bench/stress.ts:411), [dart/bench/stress.dart](/config/workspace/proto-socket/dart/bench/stress.dart:354), [go/bench/stress.go](/config/workspace/proto-socket/go/bench/stress.go:416), [python/bench/stress.py](/config/workspace/proto-socket/python/bench/stress.py:344), [kotlin/crosstest/stress.kt](/config/workspace/proto-socket/kotlin/crosstest/stress.kt:361)의 `burst` full counts가 1k/10k에 머문다.

### 해결 방법

Before:

```ts
// typescript/bench/stress.ts:411
const counts = mode === "quick" ? [200] : [1_000, 10_000];
```

After:

```ts
const counts = mode === "quick" ? [200] : [1_000, 10_000, 100_000];
```

동일한 축을 Dart/Go/Python/Kotlin에도 추가한다. Kotlin은 기존 `deferredBottleneck("ws", "burst")`와 TCP deferred 정책을 유지하므로 해당 축은 required SKIP으로 남을 수 있다.

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

- [ ] `typescript/bench/stress.ts` full burst counts에 100k를 추가한다.
- [ ] `dart/bench/stress.dart` full burst counts에 100k를 추가한다.
- [ ] `go/bench/stress.go` full burst counts에 100k를 추가한다.
- [ ] `python/bench/stress.py` full burst counts에 100k를 추가한다.
- [ ] `kotlin/crosstest/stress.kt` full burst counts에 100k를 추가하되 deferred 정책은 유지한다.

### 테스트 작성

별도 unit test는 작성하지 않는다. stress result row가 test artifact다.

### 중간 검증

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

기대: TypeScript quick burst PASS.

## [TEST-3] Parallel Client Candidates

### 문제

기존 `parallel` full은 [TypeScript](/config/workspace/proto-socket/typescript/bench/stress.ts:535)와 각 언어에서 16 clients만 기록한다. 마일스톤은 128/512/1024 client 후보를 요구한다.

### 해결 방법

Before:

```ts
// typescript/bench/stress.ts:535
const clientCount = mode === "quick" ? 4 : 16;
```

After:

```ts
const clientCounts = mode === "quick" ? [4] : [16, 128, 512, 1_024];
for (const clientCount of clientCounts) {
  // existing parallel body
}
```

언어별 runtime 한계가 명확하면 해당 client count row는 `SKIP|required/deferred`로 기록하고 전체 PASS로 오인되지 않게 한다. 측정 가능한 축은 row를 남긴다.

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

- [ ] `typescript/bench/stress.ts` parallel을 clientCounts loop로 바꾼다.
- [ ] `dart/bench/stress.dart` parallel을 clientCounts loop로 바꾼다.
- [ ] `go/bench/stress.go` parallel을 clientCounts loop로 바꾼다.
- [ ] `python/bench/stress.py` parallel을 clientCounts loop로 바꾼다.
- [ ] `kotlin/crosstest/stress.kt` parallel을 clientCounts loop로 바꾸고 기존 deferred bottleneck 정책을 보존한다.

### 테스트 작성

별도 unit test는 작성하지 않는다. large candidate는 focused stress run으로 검증한다.

### 중간 검증

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

기대: quick row PASS, no required SKIP.

## [TEST-4] Sustained Soak Candidates

### 문제

기존 `sustained` full은 [run_stress.sh](/config/workspace/proto-socket/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh:26) 설명과 [TypeScript](/config/workspace/proto-socket/typescript/bench/stress.ts:475), Dart/Go/Python/Kotlin 구현 모두 30초 단일 duration만 기록한다. 마일스톤은 5분 smoke와 30분 full 후보, p95/p99/throughput/memory trend 기록을 요구한다.

### 해결 방법

Before:

```ts
// typescript/bench/stress.ts:475
const durationMs = mode === "quick" ? 2_000 : 30_000;
```

After:

```ts
const durationsMs = mode === "quick" ? [2_000] : [30_000, 300_000, 1_800_000];
for (const durationMs of durationsMs) {
  // existing sustained body
}
```

full 30분은 시간이 긴 후보라 focused verification에서는 필요시 `--quick`과 single-language `--full --profile sustained --lang typescript --transport tcp`를 우선 실행하고, 전체 장시간 full은 결과 기록/차단 사유를 명확히 남긴다. row axis는 `duration=<ms>`를 유지한다.

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

- [ ] `typescript/bench/stress.ts` sustained를 durations loop로 바꾼다.
- [ ] `dart/bench/stress.dart` sustained를 durations loop로 바꾼다.
- [ ] `go/bench/stress.go` sustained를 durations loop로 바꾼다.
- [ ] `python/bench/stress.py` sustained를 durations loop로 바꾼다.
- [ ] `kotlin/crosstest/stress.kt` sustained를 durations loop로 바꾸고 existing deferred policy를 보존한다.

### 테스트 작성

별도 unit test는 작성하지 않는다. long-running benchmark profile 자체가 검증이다.

### 중간 검증

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

기대: quick sustained PASS, result record 생성.

## [TEST-5] Verification

### 문제

benchmark runner 변경은 source compile만으로 충분하지 않다. stress rows와 full protocol matrix가 모두 깨지지 않아야 한다.

### 해결 방법

focused stress, TypeScript smoke, full matrix 순서로 검증한다. 장시간 full 후보 실행이 환경 시간 한계에 걸리면 실행한 명령과 생성된 result file, 차단 사유를 review stub에 남긴다.

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

- [ ] focused quick stress 결과 파일을 기록한다.
- [ ] TypeScript smoke를 실행한다.
- [ ] full matrix를 실행한다.

### 테스트 작성

추가 test file 없음.

### 중간 검증

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

기대: 출력 없음.

## 의존 관계 및 구현 순서

1. `04+01_load_profile_scales`는 archived predecessor `01_lang_baseline` complete log가 있어 시작 가능하다.
2. TEST-1 runner contract를 먼저 정리한다.
3. TEST-2/3/4를 언어별로 같은 pattern으로 구현한다.
4. TEST-5 검증 후 review stub을 채운다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh` | TEST-1, TEST-5 |
| `typescript/bench/stress.ts` | TEST-2, TEST-3, TEST-4 |
| `dart/bench/stress.dart` | TEST-2, TEST-3, TEST-4 |
| `go/bench/stress.go` | TEST-2, TEST-3, TEST-4 |
| `python/bench/stress.py` | TEST-2, TEST-3, TEST-4 |
| `kotlin/crosstest/stress.kt` | TEST-2, TEST-3, TEST-4 |

## 최종 검증

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --profile burst,parallel,sustained --lang typescript --transport tcp
cd typescript && npm run check && npm test
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full --profile burst,parallel,sustained --lang typescript --transport tcp
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all
git diff --check
```

기대: focused quick PASS, TypeScript smoke PASS, full TypeScript TCP rows 기록, full matrix PASS, whitespace 오류 없음. 장시간 full 후보가 시간 한계로 끝나지 않으면 실제 stdout/stderr와 result file 또는 차단 사유를 `검증 결과`에 남긴다.

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