<!-- task=m-inbound-queue-ordering/02+01_receive_thread_model plan=2 tag=REVIEW_REFACTOR_2 -->

# Review Follow-up Plan - REVIEW_REFACTOR_2

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

이 계획은 `code_review_cloud_G08_1.log`의 Required 항목만 해결한다. 구현 후 `CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션에 실제 변경 내용, 검증 명령, stdout/stderr를 채운 뒤 active 파일을 그대로 두고 리뷰를 요청한다. `complete.log` 작성, archive 이동, 최종 판정은 code-review 전용이다.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/inbound-queue-ordering.md`
- Task ids:
  - `thread-model`: handlers, request handlers, pending response map 접근의 thread-safety 기준을 언어별 구현 메모에 반영한다.
- Completion mode: check-on-pass

## 범위 결정 근거

- wire format, proto schema, nonce/responseNonce 의미는 변경하지 않는다.
- direct response dispatch 정책은 유지한다.
- gateway worker 구현은 하지 않는다.
- 후속 범위는 실제 backpressure 전달, graceful close drain, 테스트/검증 신뢰 회복으로 제한한다.

## 구현 체크리스트

- [ ] Dart, TypeScript, Kotlin WS 수신 callback이 `enqueueInbound` 대기를 fire-and-forget으로 잃지 않도록 실제 입력 경계를 직렬화하거나 pause/resume/backpressure 가능한 구조로 수정한다.
- [ ] Python과 TypeScript graceful close가 queued item뿐 아니라 현재 dispatch 중인 in-flight item까지 기다리도록 receive worker idle/done 신호를 추가한다.
- [ ] Kotlin/Python public sync `onReceivedData` path가 queue full 시 packet을 drop하지 않도록 수정하거나 모든 테스트/call site를 backpressure 가능한 enqueue API로 전환한다.
- [ ] 각 언어 테스트에 queue capacity/backpressure와 graceful close in-flight/queued drain 검증을 추가하고, TypeScript의 내부 queue length shutdown 테스트를 계약 검증 테스트로 교체한다.
- [ ] `CODE_REVIEW-cloud-G08.md` 검증 결과를 실제 재실행 stdout/stderr로 교체하고, 존재하지 않는 테스트명이나 요약 재구성을 남기지 않는다.
- [ ] 최종 검증으로 `bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all`을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REFACTOR_2-1] Real Backpressure And Drain Verification

#### 문제

- Dart/TypeScript/Kotlin WS는 async enqueue를 호출하지만 event callback 자체는 기다리지 않아 transport backpressure가 적용되지 않는다.
- Python/TypeScript close는 worker가 이미 item을 꺼내 handler를 실행 중인 상태를 기다리지 않는다.
- Kotlin/Python sync `onReceivedData`는 여전히 포화 시 유실 가능성이 있다.
- 테스트와 검증 출력이 실제 backpressure/drain 계약을 증명하지 못한다.

#### 해결 방법

transport callback이 곧바로 반환되는 런타임은 별도의 직렬 parser/input gate를 두어 다음 frame/message 처리가 이전 `enqueueInbound` 대기 이후에만 진행되게 한다. 가능한 런타임에서는 stream subscription pause/resume 또는 socket pause/resume을 사용한다.

receive coordinator에는 queue length와 별개로 "현재 dispatch 중" 상태 또는 completion future/job을 두고, graceful close가 queue empty와 in-flight dispatch completion을 모두 기다리게 한다. forced shutdown/error disconnect는 기존처럼 discard할 수 있다.

테스트는 private field length 확인보다 관찰 가능한 효과를 검증한다. 예: queue capacity를 채운 뒤 producer task가 unblock되지 않음을 확인하고, slow handler 실행 중 `close()`를 호출해 handler completion 또는 response enqueue 정책이 문서와 일치하는지 확인한다.

#### 중간 검증

```bash
cd dart && dart test
cd go && go test -count=1 ./...
cd kotlin && ./gradlew test
cd python && python3 -m pytest -q
cd typescript && npm run check && npm test
```

기대 결과: 모든 명령 exit code 0. 검증 출력은 실제 stdout/stderr를 붙여 넣고, 생략은 `...` 없이 필요한 핵심 라인을 보존한다.

## 최종 검증

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

기대 결과: exit code 0, matrix 결과 파일의 최종 결과값 PASS.
