<!-- task=m-performance-hotspot-optimization/16_perf_regression plan=3 tag=REVIEW_REVIEW_REVIEW_TEST -->

# Code Review Reference - REVIEW_REVIEW_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.
> 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.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record the needed decision in `사용자 리뷰 요청` and stop for code-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-06-07
task=m-performance-hotspot-optimization/16_perf_regression, plan=3, tag=REVIEW_REVIEW_REVIEW_TEST

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/performance-hotspot-optimization.md`
- Task ids:
  - `perf-regression`: 개선 후 `run_performance.sh --full --baseline <baseline>`을 실행해 throughput 20% 이상 하락 또는 p99 25% 이상 악화 WARN 후보를 확인한다.
- Completion mode: check-on-pass

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

> **[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/m-performance-hotspot-optimization/16_perf_regression/`으로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
4. PASS이고 task group이 `m-performance-hotspot-optimization`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_REVIEW_REVIEW_TEST-1] Full Performance Result Recovery | [x] run 완료(19:26 KST), 결과 회수·분류 완료. Dart WS burst 회귀 해소 확인. overall=FAIL(유일 원인=환경성 TS parallel tcp 1024 timeout), regression=WARN(59, 환경성). 사용자 리뷰 요청 참조 |

## 구현 체크리스트

- [x] 실행 중인 full performance process(PID 9839 / `.tmp/perf-regression-G07-fix-20260607-041332.log`) 상태를 확인하고, 아직 실행 중이면 완료까지 기다린다. **완료: run이 2026-06-07T10:26:44Z(19:26 KST)에 정상 종료(exit), 재실행 불필요.**
- [x] 완료된 full performance 결과 파일을 찾고, 없거나 실행이 중단됐으면 동일 full baseline 비교 명령을 재실행한다. 결과 파일 `agent-test/runs/20260607-041332-proto-socket-performance-full.md` 생성됨, 재실행 불필요.
- [x] 결과 파일의 `overall_result`, `regression_result`, 구성요소 요약, compared rows, missing baseline rows, warning rows를 기록한다. (overall=FAIL, regression=WARN, same-language=FAIL/cross=PASS/gateway=PASS, compared 336 / missing 0 / warning 59 — 검증 결과 참조)
- [x] hard-gate FAIL 또는 regression WARN row가 있으면 row key, throughput/p99 변화, hard gate 위반 여부, watchlist/후속 처리 판단을 기록한다. (주요 설계 결정·검증 결과에 분류)
- [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_{review_lane}_GNN_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_{build_lane}_GNN_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이면 active task 디렉터리 `agent-task/{task_name}/`를 `agent-task/archive/YYYY/MM/{task_name}/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/{task_group}/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다. (`17+16_compat_matrix` sibling이 남아 parent 유지)
- [ ] 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로 이동한다.

## 계획 대비 변경 사항

- 소스 수정 없음(plan 범위 준수). 이 follow-up은 plan=2에서 시작한 full performance run의 결과 회수 전용이다.
- plan 지시("실행 중이면 완료까지 기다린다")대로 **기존 run(PID 9839, 2026-06-07T04:13:32Z 시작)을 재실행하지 않고 그대로 대기**한다. 새 run을 띄우면 진행분을 버리고 중복되므로. 종료 감지 waiter를 백그라운드로 걸어 완료 시 결과를 회수한다.
- 검증 명령은 계약 그대로(`run_performance.sh --full --baseline 20260605-025842 ... --throughput-drop-pct 20 --p99-worse-pct 25`). 대체 없음.

## 주요 설계 결정

이 항목은 evidence 회수다. 소스 설계 결정은 없고, full 결과 해석/분류만 남긴다.

결과 record `agent-test/runs/20260607-041332-proto-socket-performance-full.md`: **overall_result=FAIL, regression_result=WARN** (compared 336 / missing 0 / warning 59). 구성요소: same-language=FAIL, cross-language=PASS, typescript-gateway=PASS.

1. **Dart WS burst 회귀 = 해소 확인 (full-run 레벨)**: `burst/Dart/ws` 1000·10000·**100000 전부 violations=0 PASS**, 100000 = 149398 rps (baseline 147175보다 오히려 빠름). plan=2의 isolate gateway 소형 frame in-process 디코드 임계치 fix가 full run에서도 유효. Dart ws regression WARN도 11건→2건으로 감소. dart same-language 전체 PASS.

2. **유일하게 남은 hard-gate FAIL = TS parallel tcp clients=1024 timeout 80 (환경성)**:
   - stability hard-gate(timeout) 위반이라 same-language=FAIL → overall=FAIL.
   - **regression 비교로는 PASS**: throughput drop 7.0%(<20%), p99 worse 10.6%(<25%) — baseline 대비 성능 회귀 아님.
   - **환경성 근거**: focused 저부하(load 5.8) 재측정에서 1024 violations=0 PASS(record 20260607-035741). full run은 1024 client stress 자체가 host를 가중해 timeout 80(511920 중 0.0156%) 발생. plan=1 full run에서도 같은 row가 timeout 96으로 FAIL했던, 이 host의 지속적 환경 특성. TS source 회귀 아님(plan=2 범위에서 TS 미수정).

3. **regression WARN 59건 = 환경성 host-contention**: 원인 분해 p99-worse만 25 / throughput-drop만 2 / 둘다 32 (latency 위주). **Go(코드 무변경) 15건 WARN**, cross-language 양방향 WARN → baseline(차분한 host)보다 높았던 run 중 host 부하가 지배적. 절대 수치 비고정(프로젝트 표준). watchlist.

4. **kotlin same-language = INCOMPLETE**(required_skips, TCP parallel≥128 deferred) — 의도된 deferral, 새 위반 아님.

결론: 이 task의 대상이던 **Dart WS burst dispatch 회귀는 수정·검증 완료**. full run의 overall=FAIL은 **환경성 TS parallel tcp 1024 timeout 단 1건**이며 코드 회귀가 아니다(regression 비교 PASS + 저부하 재측정 0). 깨끗한 overall PASS를 만들려면 환경성 수용(이전 idle-baseline INCOMPLETE 수용과 동종 결정) 또는 저부하 host full 재측정이 필요한데, 컨테이너는 상시 load 5–8이라 후자는 비실용적 → 사용자 결정 필요(사용자 리뷰 요청).

## 사용자 리뷰 요청

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

- 상태: 해소됨 (사용자 결정 완료 — 2026-06-07)
- 사유 유형: 환경성 hard-gate FAIL 수용 여부 (user-only 판단) — 결정됨
- 사용자 결정: **환경성 수용 후 완료**. Dart WS burst 회귀는 수정·검증 완료됐고, full run의 overall=FAIL은 환경성 TS parallel tcp 1024 timeout 1건뿐(regression 비교 PASS, 저부하 focused 재측정 0)이므로, 이 환경성 timeout을 수용하고 `perf-regression`을 완료 처리한다. (이전 idle-baseline INCOMPLETE 수용과 동종 기준.) TS source 변경/저부하 full 재측정/별도 Task 분리는 하지 않는다.
- 후속(코드리뷰 에이전트 소관): 이 사용자 결정으로 user-review gate가 해소되었으므로, code-review가 판정을 마감하고 `complete.log` 작성 + active task 디렉터리 archive 이동 + (런타임) `perf-regression` 완료 반영을 진행한다. overall=FAIL의 단일 원인이 수용된 환경성 row임을 evidence(주요 설계 결정·검증 결과)로 확인할 것.
- 실행한 검증/명령: `run_performance.sh --full --baseline 20260605-025842 ...` 완료(record 20260607-041332, overall=FAIL/regression=WARN, dart ws burst PASS); focused `run_stress --full --lang typescript --transport tcp --profile parallel`(record 20260607-035741, 저부하 1024 violations=0 PASS).
- 재개 조건: 없음 (결정 완료, 마감 단계는 code-review 소관).

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

- 기존 PID 9839 또는 재실행한 full performance command의 실제 종료 상태와 stdout/stderr가 기록됐는지 확인한다.
- 결과 파일의 `overall_result`, `regression_result`, 구성요소 요약, compared rows, warning rows가 review 기록과 일치하는지 확인한다.
- hard-gate FAIL이 있으면 PASS 처리하지 않았는지 확인한다.
- WARN row가 있으면 모든 row가 원인/후속 처리와 함께 분류됐는지 확인한다.

## 검증 결과

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

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.

### REVIEW_REVIEW_REVIEW_TEST-1 중간 검증
```
$ ps -p 9839 -o pid,etime,cmd
  PID     ELAPSED CMD
 9839    01:19:05 bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full --baseline agent-test/runs/20260605-025842-proto-socket-performance-full.md --throughput-drop-pct 20 --p99-worse-pct 25

$ # same-language 컴포넌트 진행도 (log_dir /tmp/proto-socket-performance.CJiWwr)
RUN stress lang=dart mode=full transports=tcp,ws profiles=roundtrip,burst,sustained,parallel,payload
DONE dart: PASS (rows=34 skips=0 required_skips=0 violations=0)
RUN stress lang=go mode=full transports=tcp,ws profiles=roundtrip,burst,sustained,parallel,payload

$ ls -t agent-test/runs/*proto-socket-performance-full.md | head -5
agent-test/runs/20260606-200122-proto-socket-performance-full.md   # (fix 전 run, FAIL/WARN)
agent-test/runs/20260605-115943-proto-socket-performance-full.md
agent-test/runs/20260605-025842-proto-socket-performance-full.md   # (baseline)
```
→ 기존 run RUNNING(재실행 불필요). dart same-language 이미 PASS(violations=0) = fix가 full-run에도 반영됨. fix-후 새 `*-performance-full.md` record는 run 완료 시 생성됨.

### 최종 검증
완료 2026-06-07T10:26:44Z(19:26 KST). 결과 record: `agent-test/runs/20260607-041332-proto-socket-performance-full.md` (frontmatter `overall_result: FAIL`, `regression_result: WARN`).
```
$ bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_performance.sh --full --baseline agent-test/runs/20260605-025842-proto-socket-performance-full.md --throughput-drop-pct 20 --p99-worse-pct 25

=== performance 측정 결과 ===
| 구성 | 결과 | exit code | 결과 기록 |
|---|---|---:|---|
| same-language | FAIL | 1 | agent-test/runs/20260607-041332-proto-socket-stress-full.md |
| cross-language | PASS | 0 | agent-test/runs/20260607-101942-proto-socket-stress-full-cross.md |
| typescript-gateway | PASS | 0 | agent-test/runs/20260607-102623-proto-socket-stress-full.md |

전체 결과값: FAIL
Regression 결과값: WARN
결과 기록 파일: `agent-test/runs/20260607-041332-proto-socket-performance-full.md`
```

Regression 비교 요약:
```
- baseline: agent-test/runs/20260605-025842-proto-socket-performance-full.md
- compared rows: 336 / missing baseline rows: 0 / warning rows: 59
```

hard-gate 위반(overall=FAIL 원인) — 측정 결과 표 결과=FAIL row (1건):
```
| parallel | clients=1024 | TypeScript | tcp | 7 | 1024 | 511920 | 21530.0 | 60.199 | 112.817 | 136.534 | Timeout=80 | ... | FAIL |
```
→ regression 비교상으론 PASS(throughput drop 7.0%, p99 worse 10.6%, 둘 다 임계치 미만). stability timeout 80(=511920 중 0.0156%)만 위반 → 환경성(저부하 focused 재측정 0, record 20260607-035741).

Dart WS burst (fix 검증, 측정 결과 표):
```
| burst | count=1000   | Dart | ws | ... | 119990.4 rps | Timeout=0 | ... | PASS |
| burst | count=10000  | Dart | ws | ... | 150109.6 rps | Timeout=0 | ... | PASS |
| burst | count=100000 | Dart | ws | ... | 149398.2 rps | Timeout=0 | ... | PASS |
```
→ 전부 PASS. 직전 fix-전 run(20260606-200122)의 burst 100000 = 1654 rps + Timeout/PendLeak FAIL에서 해소(baseline 147175 rps 수준 회복).

WARN 59건 분해: throughput-drop만 2 / p99-worse만 25 / 둘다 32. transport ws 38 / tcp 21. 언어: TypeScript 17, **Go 15(코드 무변경)**, Python 8, Kotlin 6, cross-lang 양방향 다수, Dart 2(fix 전 11→2). → host-contention 환경성(주요 설계 결정 3번).

---

> **[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.

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Pass
- 발견된 문제: 없음
- 다음 단계: PASS이므로 `complete.log` 작성 후 task directory를 archive로 이동한다. `m-performance-hotspot-optimization` 완료 이벤트 메타데이터를 보고하고 roadmap 수정은 런타임에 맡긴다.

리뷰 근거:
- `dart/lib/src/inbound_gateway_io.dart`의 small-frame in-process decode는 shared `FrameReorderBuffer`로 worker path와 같은 seq ordering을 유지하고, `Communicator.onReceivedFrame`의 gateway backlog release 계약을 그대로 사용한다.
- `dart/lib/src/ws_protobuf_client_io.dart`와 `dart/lib/src/ws_protobuf_client_web.dart`는 reentrant frame을 버리지 않고 queue drain으로 직렬 dispatch한다.
- 리뷰 중 재확인: `cd dart && dart pub get && dart test test/socket_test.dart -r expanded && dart compile js test/browser_ws_import_compile.dart -o /tmp/proto_socket_browser_ws_import_compile_review.js` PASS.
- Full performance record `agent-test/runs/20260607-041332-proto-socket-performance-full.md`는 Dart WS burst 100000을 stability 0 PASS로 기록한다. 남은 `overall_result=FAIL`의 단일 hard-gate 원인은 TypeScript TCP parallel 1024 timeout 80이며, focused rerun `agent-test/runs/20260607-035741-proto-socket-stress-full.md`에서 1024 violations 0 PASS로 확인됐고 active review의 사용자 결정에 따라 환경성 row로 수용 완료됐다.
