<!-- task=02_dart_crosstest_process_cleanup plan=1 tag=TEST -->

# Dart Crosstest Process Cleanup - Rework

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

이 plan은 `code_review_cloud_G07_0.log`의 FAIL 판정을 반영한 재작업 plan이다. `agent-task/archive/**`는 읽지 않는다.

구현 완료의 마지막 단계는 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 모두 채우는 것이다. 리뷰 파일의 아카이브 지시와 `코드리뷰 전용 체크리스트`는 리뷰 에이전트 전용이다.

## 배경

Dart 서버 크로스테스트 중 Go/Python/Kotlin 클라이언트 subprocess를 띄우는 runner가 timeout 이후 stdout/stderr stream completion을 무제한 대기한다. `dart_typescript.dart`에는 이미 `_streamTimeout`과 bounded stream wait가 있으므로 같은 패턴을 나머지 세 Dart runner에 적용한다.

## 이전 리뷰 결과 요약

plan=0 리뷰 판정은 FAIL이다.

- `dart_go.dart`, `dart_python.dart`, `dart_kotlin.dart`에 `_streamTimeout`이 없었다.
- 세 파일의 `Future.wait([stdoutDone, stderrDone])`가 timeout 없이 남아 있었다.
- 구현 체크리스트와 검증 결과가 채워지지 않았다.

## 구현 체크리스트

- [ ] `dart/crosstest/dart_go.dart`, `dart/crosstest/dart_python.dart`, `dart/crosstest/dart_kotlin.dart`에 `const _streamTimeout = Duration(seconds: 5);`를 추가한다.
- [ ] 세 파일의 `Future.wait([stdoutDone, stderrDone])`에 `.timeout(_streamTimeout, onTimeout: ...)`을 적용한다.
- [ ] timeout error message에는 상대 client label, mode, phase가 포함되어야 한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 stdout/stderr를 `CODE_REVIEW-cloud-G07.md`에 기록한다.
- [ ] `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 모두 채운다.

### [TEST-1] Harden Dart subprocess stream cleanup

#### 수정 대상

- `dart/crosstest/dart_go.dart`
- `dart/crosstest/dart_python.dart`
- `dart/crosstest/dart_kotlin.dart`

#### 기준 패턴

`dart/crosstest/dart_typescript.dart`의 구조를 따른다.

```dart
const _processTimeout = Duration(seconds: 20);
const _streamTimeout = Duration(seconds: 5);

final code = await process.exitCode.timeout(_processTimeout, onTimeout: () {
  process.kill(ProcessSignal.sigkill);
  return -1;
});
await Future.wait([stdoutDone, stderrDone])
    .timeout(_streamTimeout, onTimeout: () {
  throw StateError('go-client $mode/$phase streams did not finish');
});
```

각 파일의 client label은 `go-client`, `python-client`, `kotlin-client`로 맞춘다.

## 테스트 작성

별도 unit test는 작성하지 않는다. 이 파일들은 실제 subprocess를 실행하는 crosstest runner이므로 지정된 command 실행과 `rg` 정적 확인으로 검증한다.

## 중간 검증

```bash
cd dart && dart test
```

## 최종 검증

```bash
cd dart && dart test
cd dart && dart run crosstest/dart_go.dart
cd dart && dart run crosstest/dart_python.dart
cd dart && dart run crosstest/dart_kotlin.dart
rg --sort path -n "_streamTimeout|streams did not finish|Future\\.wait\\(\\[stdoutDone, stderrDone\\]\\)" dart/crosstest/dart_go.dart dart/crosstest/dart_python.dart dart/crosstest/dart_kotlin.dart dart/crosstest/dart_typescript.dart
```

기대 결과: 모든 실행 명령 exit code 0. `rg` 결과에서 수정 대상 세 파일과 reference 파일 모두 `_streamTimeout` 및 `streams did not finish` 패턴이 확인된다.
