<!-- task=m-protocol-evolution-compatibility/03+01,02_fullname_tests plan=2 tag=FIX -->

# Plan - FIX

## 개요

date=2026-06-16
task=m-protocol-evolution-compatibility/03+01,02_fullname_tests, plan=2, tag=FIX
이전 리뷰: code_review_cloud_G07_1.log (WARN)

plan=1 코드리뷰에서 WARN 판정. Suggested 1건 + Nit 1건 수정.

## Roadmap Targets

- Milestone: `agent-roadmap/milestones/protocol-evolution-compatibility.md`
- Task ids:
  - `fullname-tests`: full name 송수신, simple name legacy 수신, request/response alias 호환, alias 충돌 감지 동일 언어 및 크로스 언어 테스트
- Completion mode: check-on-pass

## 선행 의존성

- `plan_cloud_G07_1.log`, `code_review_cloud_G07_1.log` 존재 (이 파일과 같은 디렉터리)

## 수정 항목

### FIX-1 [Suggested] Go client 4개 파일: `QueuePacket` 에러 묵살 수정

**대상 파일 (4개):**
- `go/crosstest/dart_go_client/main.go`
- `go/crosstest/kotlin_go_client/main.go`
- `go/crosstest/python_go_client/main.go`
- `go/crosstest/typescript_go_client/main.go`

**현재 패턴:**
```go
func runLegacyReceive(communicator *toki.Communicator) {
    data, _ := proto.Marshal(...)
    _ = communicator.QueuePacket(&packets.PacketBase{...})
    time.Sleep(150 * time.Millisecond)
}

case "legacy-receive":
    runLegacyReceive(client.communicator)
    ok = true
```

**수정 패턴:**
```go
func runLegacyReceive(communicator *toki.Communicator) error {
    data, _ := proto.Marshal(...)
    if err := communicator.QueuePacket(&packets.PacketBase{...}); err != nil {
        return err
    }
    time.Sleep(150 * time.Millisecond)
    return nil
}

case "legacy-receive":
    if err := runLegacyReceive(client.communicator); err != nil {
        fail("legacy-receive", err.Error())
        ok = false
    } else {
        ok = true
    }
```

`fail()` 헬퍼 함수가 각 파일에 존재하는지 Read로 확인 후 없으면 `fmt.Fprintf(os.Stderr, ...)` 사용.

### FIX-2 [Nit] Dart 서버 4개 파일: timeout과 wrong-data 에러 메시지 분리

**대상 파일 (4개):**
- `dart/crosstest/dart_go.dart`
- `dart/crosstest/dart_kotlin.dart`
- `dart/crosstest/dart_python.dart`
- `dart/crosstest/dart_typescript.dart`

**현재 패턴:**
```dart
final ok = await received.future
    .timeout(_serverObservationWindow, onTimeout: () => false);
if (!ok) {
  throw StateError('TCP legacy simple-name server received unexpected data');
}
```

**수정 패턴:**
```dart
bool ok;
try {
  ok = await received.future.timeout(_serverObservationWindow);
} on TimeoutException {
  throw StateError('TCP legacy simple-name server did not receive packet');
}
if (!ok) {
  throw StateError('TCP legacy simple-name server received unexpected data');
}
```

`TimeoutException`은 `dart:async`에서 export됨. 각 파일의 기존 import 확인 후 없으면 추가.

## 수정 범위 요약

| 항목 | 파일 수 | 분류 |
|------|---------|------|
| FIX-1: Go client QueuePacket 에러 전파 | 4 | Suggested |
| FIX-2: Dart 서버 timeout 메시지 분리 | 4 | Nit |
| TypeScript if (!ok) 브랜치 | drop | 재검토: wrong-data 케이스를 처리하는 유효 브랜치 |
| "TestData" 하드코딩 | 이번 외 | Nit, complete.log 잔여 항목 |

## 구현 지침

1. FIX-1 4개 Go 파일 수정 후 `go build ./crosstest/...` 확인
2. FIX-2 4개 Dart 파일 수정 후 `dart analyze dart/crosstest/` 확인
3. full matrix 재실행 (`bash agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_matrix.sh --all`)
4. CODE_REVIEW-cloud-G07.md 구현 에이전트 소유 섹션 작성

## 완료 기준

- [ ] FIX-1: 4개 Go 파일 `runLegacyReceive`가 `error` 반환 + 호출부 처리
- [ ] FIX-2: 4개 Dart 파일 timeout 분기가 `TimeoutException`으로 분리
- [ ] `go build ./crosstest/...` 성공
- [ ] `dart analyze dart/crosstest/` clean (또는 기존 수준)
- [ ] full matrix 전체 PASS (expected_cross_pass_lines=17 유지)
