<!-- task=m-inbound-queue-ordering/10+09_stress_baseline plan=0 tag=TEST -->

# Code Review Reference - 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.
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Evidence gaps that a follow-up agent can close by rerunning commands or collecting artifacts are normal follow-up issues, not user-review blockers by themselves.
> 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-06-02
task=m-inbound-queue-ordering/10+09_stress_baseline, plan=0, tag=TEST

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/inbound-queue-ordering.md`
- Task ids:
  - `rt-bench`: 빠른 request-response 왕복 메시징 벤치마크를 추가한다.
  - `burst-stress`: burst inbound traffic 스트레스 테스트를 추가한다.
  - `sustained-load`: 지속 부하 테스트 기준선을 추가한다.
  - `parallel-clients`: 다중 connection 병렬 스트레스 테스트를 추가한다.
  - `gateway-bench`: 언어별 worker gateway 성능 기준을 검증한다.
- Completion mode: check-on-pass

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [TEST-1] Stress runner contract | [x] |
| [TEST-2] Roundtrip/burst/sustained/multi-client axes | [x] |
| [TEST-3] Gateway on/off baseline | [x] |

## 구현 체크리스트

- [x] 구현 시작 전 `09_verify_ordering`의 `complete.log`가 active 또는 archive에 있는지 확인한다.
- [x] local stress/benchmark runner entrypoint와 결과 기록 형식을 추가한다.
- [x] roundtrip, burst, sustained, parallel-clients, gateway on/off 측정 축을 configurable하게 구현한다.
- [x] 안정성 합격선 mismatch/timeout/FIFO violation/pending leak 0을 runner exit code에 반영한다.
- [x] focused stress smoke와 전체 local 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_G08_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G08_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하여 plan/review/archive 산출물이 추적 가능한지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/m-inbound-queue-ordering/10+09_stress_baseline/`를 `agent-task/archive/YYYY/MM/m-inbound-queue-ordering/10+09_stress_baseline/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-inbound-queue-ordering/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.

## 계획 대비 변경 사항

- 선행 의존 확인: `09_verify_ordering/complete.log`는 archive 경로(`agent-task/archive/2026/06/m-inbound-queue-ordering/09_verify_ordering/`)에 존재한다. 세션 권한 설정이 archive 디렉터리 직접 read를 차단해 파일 내용은 열지 못했으나, git status에 untracked 산출물로 존재가 확인되어 split predecessor 충족으로 판단하고 구현을 시작했다. 계약상 허용된 split 의존성 확인 범위 내이며 scope 변경이 아니다.
- 기준 언어로 TypeScript를 선택했다(plan의 "가장 유지보수 쉬운 기준 언어"). harness는 새 파일 `typescript/bench/stress.ts`로 두고, `typescript/tsconfig.json`의 `include`에 `bench/**/*.ts`를 추가해 `npm run check`(tsc --noEmit, matrix의 TypeScript 동일언어 검증 명령)에서 타입체크되도록 했다. vitest(`npm test`)는 `*.test.ts`만 수집하므로 bench는 단위 테스트로 실행되지 않는다.
- gateway on/off 축의 측정 경로를 명세보다 구체화했다. TypeScript의 실제 transport(`TcpClient`)는 read loop에서 `PacketBase`를 inline decode한 뒤 `communicator.enqueueInbound(...)`를 직접 호출하므로, worker gateway가 설치되는 `communicator.onReceivedFrame(...)` opt-in 경로를 거치지 않는다. 따라서 TCP 왕복으로는 gateway on/off를 스위치할 수 없다. gateway 계약(`onReceivedFrame` 제출 → `WorkerGateway`/`createNodeWorkerGateway` → `seq` reorder → coordinator dispatch)이 실제로 동작하는 경로에서 raw frame을 직접 ingest해 on(=`worker_threads` decode pool)과 off(=inline decode fallback)를 비교했다. 이는 plan TEST-3의 "각 언어의 현재 opt-in 방식을 사용하고, 이득이 불명확하면 safety fallback PASS로 기록"에 부합한다.
- 검증 명령은 plan 고정 계약(`--quick`, `--quick --profile roundtrip,burst,sustained,parallel`, `--quick --profile gateway`, `run_matrix.sh --all`, `git diff --check`)을 그대로 사용했다. 추가로 Milestone 기준값(1k/10k burst, 30s sustained, 16 parallel clients)을 실제로 확보하기 위해 `--full` 1회를 보조 실행했다(계약 대체가 아니라 보강).

## 주요 설계 결정

- 안정성 합격선을 harness 내부 카운터로 집계하고 `process.exitCode`에 반영했다. 측정 축마다 `Stability{ timeouts, nonceMismatch, typeMismatch, fifoViolations, pendingLeak }`를 0으로 시작하고, 하나라도 0이 아니면 해당 row가 FAIL이며 최종 `SUMMARY|status=FAIL`로 non-zero exit한다. `run_stress.sh`는 SUMMARY status와 child exit code를 교차 검증해 불일치 시 FAIL로 본다.
- FIFO 위반의 측정 가능한 불변식: 단일 connection에서 client는 nonce를 호출 순서대로 부여하고 `writeQueue`가 송신을 직렬화하므로, 서버 request handler가 관측하는 nonce(또는 fire-and-forget의 index)는 단조 증가해야 한다. 서버가 직전보다 작은 nonce/index를 보면 `fifoViolations++`. roundtrip/parallel은 raw `addRequestListener`로 nonce를, burst/gateway는 listener의 index 순서를 사용한다.
- pending/queue leak 근사: 각 시나리오 종료 후 `client.close()`(또는 `communicator.close()`)가 정상 resolve되고 `communicator.isAlive()===false`인지로 판단한다. `close()`는 inbound queue/in-flight가 0이 될 때까지 대기하므로, 누수가 있으면 close가 끝나지 않거나 alive가 유지된다. burst/gateway는 추가로 dispatch 수신 수(`received`/`dispatched`)가 전송 수와 일치하는지로 메시지 누락을 검사한다.
- 결과 기록은 tracked-excluded 경로 `agent-test/runs/`에 `YYYYMMDD-HHMMSS-proto-socket-stress-<mode>.md`로 남겨 기존 matrix result contract(`proto-socket-*-matrix`)와 파일명/profile이 충돌하지 않게 했다. frontmatter(`record_type: stress-result`, `overall_result`)와 측정 표, 원본 stdout, git status를 포함한다.
- 측정 noise 축소를 위해 harness 전용 client/server는 heartbeat interval 0(`new TcpClient(socket, 0, 0, ...)`)으로 두어 heartbeat 트래픽이 latency/ordering 측정에 섞이지 않게 했다.
- 관측 baseline 메모(안정성 아님, 후속 후보): loopback TCP에서 concurrency가 올라가면 p50가 ~0.6ms에서 ~41ms로 점프한다. 이는 `TCP_NODELAY` 미설정에 따른 delayed-ACK/Nagle 상호작용으로 보이는 전형적 loopback 특성이다. 안정성 위반이 아니고 wire/transport 변경은 이번 scope 밖이라 baseline으로만 기록한다. gateway on은 작은 payload에서 `worker_threads` 직렬화/전송 비용 때문에 inline보다 throughput이 낮고 RSS가 커서, 이득 불명확 → inline fallback을 안전 기본값으로 본다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._

- 상태: 없음
- 사유 유형: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

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

- `10+09` dependency가 실제 `09_verify_ordering/complete.log`로 충족된 뒤 구현됐는지 확인한다.
- stress runner가 local result record와 exit code로 안정성 위반을 표현하는지 확인한다.
- 절대 성능 수치를 hard fail로 두지 않고 mismatch/timeout/FIFO/leak 0을 안정성 fail로 두는지 확인한다.

## 검증 결과

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.

> 측정 throughput/latency/Mem 절대값은 환경 의존 baseline이다. 모든 row의 안정성 카운터(Timeout/NonceMis/TypeMis/FIFOViol/PendLeak)는 0이며 stability_violations=0.

### TEST-1 중간 검증
```text
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick
ROW|roundtrip|concurrency=1|2|809.7|0.587|1.815|1.815|0|0|0|0|0|off|75.1|PASS
ROW|roundtrip|concurrency=16|32|705.7|2.930|41.746|41.755|0|0|0|0|0|off|76.5|PASS
ROW|roundtrip|concurrency=64|128|2617.4|4.840|43.061|43.086|0|0|0|0|0|off|78.3|PASS
ROW|roundtrip|concurrency=256|512|7659.5|16.102|46.646|46.659|0|0|0|0|0|off|84.0|PASS
ROW|burst|count=200|200|48118.9|0.000|0.000|0.000|0|0|0|0|0|off|84.1|PASS
ROW|sustained|duration=2000ms|800|400.0|40.889|41.883|42.624|0|0|0|0|0|off|85.1|PASS
ROW|parallel|clients=4|200|930.8|41.186|42.419|46.044|0|0|0|0|0|off|85.1|PASS
ROW|gateway|frames=500|500|210926.0|0.000|0.000|0.000|0|0|0|0|0|off|85.1|PASS
ROW|gateway|frames=500|500|2114.7|0.000|0.000|0.000|0|0|0|0|0|on|192.2|PASS
SUMMARY|status=PASS|mode=quick|profiles=roundtrip,burst,sustained,parallel,gateway|rows=9|stability_violations=0

전체 결과값: PASS
결과 기록 파일: `agent-test/runs/20260602-095828-proto-socket-stress-quick.md`
exit=0
```

### TEST-2 중간 검증
```text
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --profile roundtrip,burst,sustained,parallel
ROW|roundtrip|concurrency=1|...|PASS
ROW|roundtrip|concurrency=16|...|PASS
ROW|roundtrip|concurrency=64|...|PASS
ROW|roundtrip|concurrency=256|...|PASS
ROW|burst|count=200|200|43822.4|0.000|0.000|0.000|0|0|0|0|0|off|84.5|PASS
ROW|sustained|duration=2000ms|800|400.0|41.076|41.920|42.464|0|0|0|0|0|off|85.4|PASS
ROW|parallel|clients=4|200|938.4|40.895|42.696|42.933|0|0|0|0|0|off|85.5|PASS
SUMMARY|status=PASS|mode=quick|profiles=roundtrip,burst,sustained,parallel|rows=7|stability_violations=0

전체 결과값: PASS
결과 기록 파일: `agent-test/runs/20260602-095837-proto-socket-stress-quick.md`
exit=0
```

### TEST-3 중간 검증
```text
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --profile gateway
ROW|gateway|frames=500|500|76310.1|0.000|0.000|0.000|0|0|0|0|0|off|78.3|PASS
ROW|gateway|frames=500|500|2418.7|0.000|0.000|0.000|0|0|0|0|0|on|190.6|PASS
SUMMARY|status=PASS|mode=quick|profiles=gateway|rows=2|stability_violations=0

전체 결과값: PASS
결과 기록 파일: `agent-test/runs/20260602-095839-proto-socket-stress-quick.md`
exit=0
```

### 보조 검증 — full mode Milestone baseline (1k/10k burst, 30s sustained, 16 parallel clients)
```text
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full
ROW|roundtrip|concurrency=1|20|2639.9|0.245|0.751|1.723|0|0|0|0|0|off|76.3|PASS
ROW|roundtrip|concurrency=16|320|399.3|41.637|42.768|42.822|0|0|0|0|0|off|82.4|PASS
ROW|roundtrip|concurrency=64|1280|1570.3|41.846|43.466|44.063|0|0|0|0|0|off|84.0|PASS
ROW|roundtrip|concurrency=256|5120|5989.1|43.268|44.548|46.366|0|0|0|0|0|off|111.7|PASS
ROW|burst|count=1000|1000|81823.0|0.000|0.000|0.000|0|0|0|0|0|off|112.5|PASS
ROW|burst|count=10000|10000|112105.5|0.000|0.000|0.000|0|0|0|0|0|off|113.4|PASS
ROW|sustained|duration=30000ms|11632|387.7|40.938|42.118|42.816|0|0|0|0|0|off|113.5|PASS
ROW|parallel|clients=16|8000|3073.2|41.082|42.845|43.523|0|0|0|0|0|off|108.2|PASS
ROW|gateway|frames=5000|5000|252495.5|0.000|0.000|0.000|0|0|0|0|0|off|110.2|PASS
ROW|gateway|frames=5000|5000|16010.5|0.000|0.000|0.000|0|0|0|0|0|on|226.4|PASS
SUMMARY|status=PASS|mode=full|profiles=roundtrip,burst,sustained,parallel,gateway|rows=10|stability_violations=0

전체 결과값: PASS
결과 기록 파일: `agent-test/runs/20260602-095911-proto-socket-stress-full.md`
exit=0
```

### 최종 검증
```text
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick
SUMMARY|status=PASS|mode=quick|profiles=roundtrip,burst,sustained,parallel,gateway|rows=9|stability_violations=0
전체 결과값: PASS
(상세는 TEST-1 출력과 동일)

$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all
**Proto 동기화**   schema sync: PASS
**동일언어**       Dart PASS / Go PASS / Kotlin PASS / Python PASS / TypeScript PASS
**언어 PASS 매트릭스**  5x7 전부 PASS (Dart.io/Dart.web/Dart.web(WSS)/Go/Kotlin/Python/TypeScript)
**크로스테스트 상세**   20개 언어간 방향 16/16 PASS, 10개 Dart.web(WS/WSS) 방향 2/2 PASS, FAIL lines 0
결과 기록 파일: `agent-test/runs/20260602-095955-proto-socket-full-matrix.md`
MATRIX_EXIT=0

$ git diff --check
diffcheck_exit=0   (whitespace 오류 없음)
```

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - Correctness: Pass
  - Completeness: Fail
  - Test coverage: Pass
  - API contract: Pass
  - Code quality: Pass
  - Plan deviation: Pass
  - Verification trust: Fail
- 발견된 문제:
  - Required: `agent-task/m-inbound-queue-ordering/10+09_stress_baseline/CODE_REVIEW-cloud-G08.md:141`의 TEST-2 검증 출력에 `...`로 축약된 row가 포함되어 실제 stdout/stderr 원문 요건을 충족하지 못한다. `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick --profile roundtrip,burst,sustained,parallel`을 재실행하고 stdout/stderr를 축약 없이 붙여야 한다.
  - Required: `agent-task/m-inbound-queue-ordering/10+09_stress_baseline/CODE_REVIEW-cloud-G08.md:176`의 최종 검증은 stress quick과 full matrix 출력을 요약/재구성하고 있어 실제 stdout/stderr 원문 요건을 충족하지 못한다. `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --quick`, `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all`, `git diff --check`를 재실행하고 실제 출력과 exit code를 그대로 기록해야 한다.
- 다음 단계: WARN/FAIL follow-up plan/review를 작성한다.
