<!-- task=m-large-payload-followup-optimization/05_dart_large_packet_guard plan=1 tag=REVIEW_PERF -->

# Dart 1MB Payload Guard Follow-up Plan

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

이 plan의 구현 완료 조건에는 대응 `CODE_REVIEW-local-G06.md`의 구현 에이전트 소유 섹션 작성이 포함된다. 구현 후 검증 명령을 실행하고 실제 출력, 계획 대비 변경, 주요 설계 결정을 채운 뒤 active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 사용자만 결정할 수 있는 범위 변경, 외부 환경/secret/서비스 준비, 또는 구현을 안전하게 계속할 수 없는 충돌이 있으면 review stub의 `사용자 리뷰 요청` 섹션에 정확한 근거를 기록하고 중단한다. 구현 중 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 재실행으로 닫을 수 있는 검증 증거 공백은 사용자 리뷰 요청이 아니다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/large-payload-followup-optimization.md`
- Task ids:
  - `dart-large-packet-guard`: Dart TCP/WS 1MB guard
- Completion mode: check-on-pass

## 리뷰 실패 근거

`code_review_local_G05_0.log`의 Required issue는 최종 baseline comparison이 `run_performance.sh --quick --no-cross ...`를 사용해 Dart payload 1MB row를 비교하지 못했다는 점이다. `dart/bench/stress.dart`와 `run_stress.sh` 계약상 quick payload는 1KB/64KB만 포함하고 full payload에서만 1MB가 포함된다.

## 범위 결정 근거

- 일반 `run_performance.sh --full`은 전체 full performance wrapper라 follow-up의 즉시 검증 범위를 과도하게 넓힐 수 있다.
- 이번 follow-up은 기존 `run_stress.sh --full --lang dart --transport tcp,ws --profile payload` record와 baseline record의 Dart TCP/WS `payload=1MB` rows를 focused comparator로 비교해 1MB guard evidence를 명시한다.
- 성능 스크립트의 공통 비교 로직 변경은 이번 follow-up 범위가 아니다. focused comparator가 불충분하다고 판단되면 review stub의 계획 대비 변경 사항에 근거를 남긴다.

## 구현 체크리스트

- [ ] [REVIEW_PERF-1] Dart WS 1MB test에 suffix 또는 전체 echo 검증을 추가해 large payload tail corruption까지 잡는다.
- [ ] [REVIEW_PERF-2] Dart TCP/WS 1MB payload row가 포함된 focused baseline comparison evidence를 생성하고, 1MB tcp/ws 각각의 PASS/WARN/FAIL을 기록한다.
- [ ] Dart socket test, Dart full payload stress, focused 1MB comparator를 실행하고 실제 stdout/stderr 또는 record path를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_PERF-1] WS 1MB suffix 검증 보강

문제: `dart/test/socket_test.dart`의 `WS 1MB payload roundtrip`은 길이와 prefix만 검증한다. 기존 plan은 prefix/suffix 검증으로 truncation과 tail corruption을 잡도록 요구했다.

해결 방법:

- `response.message.endsWith('WW')` 또는 `response.message == 'echo: ${testData.message}'` 계열의 assertion을 추가한다.
- 기존 test name과 timeout은 유지한다.

수정 파일:

- `dart/test/socket_test.dart`

중간 검증:

```bash
dart format --output=none --set-exit-if-changed dart/test/socket_test.dart
cd dart && dart test test/socket_test.dart
```

예상 결과: formatter 변경 없음, socket tests exit 0.

### [REVIEW_PERF-2] Dart 1MB focused baseline comparator

문제: `run_performance.sh --quick --no-cross --baseline ...`는 quick payload만 실행하므로 Dart TCP/WS 1MB row를 비교하지 않는다. 기존 G05 evidence의 WARN 예시도 1KB row였다.

해결 방법:

1. Dart full payload stress를 실행하고 결과 record path를 확인한다.

```bash
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full --lang dart --transport tcp,ws --profile payload
```

2. baseline full record와 current full payload record에서 Dart TCP/WS `payload=1MB` rows만 비교한다. `<current-record>`는 1번 명령의 `결과 기록 파일` 값으로 치환한다.

```bash
baseline=agent-test/runs/20260613-141506-proto-socket-performance-full.md
current=<current-record>
awk -F'|' '
function trim(s) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", s); return s }
function wanted() {
  return trim($2) == "payload" && trim($3) == "payload=1MB" && trim($4) == "Dart" && (trim($5) == "tcp" || trim($5) == "ws")
}
function row_key() { return trim($5) }
FNR == NR {
  if (wanted()) {
    k = row_key()
    base_thr[k] = trim($9) + 0
    base_p99[k] = trim($12) + 0
  }
  next
}
{
  if (wanted()) {
    k = row_key()
    cur_thr = trim($9) + 0
    cur_p99 = trim($12) + 0
    seen[k] = 1
    drop = base_thr[k] > 0 ? ((base_thr[k] - cur_thr) / base_thr[k]) * 100 : 0
    worse = base_p99[k] > 0 ? ((cur_p99 - base_p99[k]) / base_p99[k]) * 100 : 0
    status = (drop >= 20 || worse >= 25) ? "WARN" : "PASS"
    if (status == "WARN") warned = 1
    printf "%s 1MB baseline_thr=%.3f current_thr=%.3f drop=%.1f%% baseline_p99=%.3f current_p99=%.3f worse=%.1f%% result=%s\n", k, base_thr[k], cur_thr, drop, base_p99[k], cur_p99, worse, status
  }
}
END {
  missing = 0
  for (k in base_thr) {
    if (!seen[k]) {
      printf "MISSING current Dart 1MB row: %s\n", k
      missing = 1
    }
  }
  if (missing) exit 2
  if (warned) exit 5
}
' "$baseline" "$current"
```

예상 결과: tcp/ws 1MB rows가 각각 출력된다. exit 0은 no regression, exit 5는 regression WARN 검출로 guard 작동 증거다. exit 2 또는 row 누락은 실패다.

## 최종 검증

```bash
dart format --output=none --set-exit-if-changed dart/test/socket_test.dart
cd dart && dart test test/socket_test.dart
bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_stress.sh --full --lang dart --transport tcp,ws --profile payload
# then run the focused 1MB comparator above with the generated current record
```
