<!-- task=plane_communication_foundation plan=1 tag=REVIEW_PLANE -->

# Plane Communication Foundation Review Fixes

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

이 계획은 `code_review_cloud_G06_0.log`의 FAIL Required 항목만 닫는다. 범위를 넓히지 말고, 수정 완료 전 `CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션에 실제 검증 stdout/stderr를 기록한다. `complete.log` 작성, active 파일 아카이브, 코드리뷰 판정은 code-review skill 전용이다.

## 배경

첫 리뷰에서 core가 빌드되지 않는 문법 오류와 external ref migration ownership 불일치가 Required로 확인되었다. 자동 Plane publish/enqueue 제거 방향은 유지하되, compile/test 신뢰를 복구하고 DB migration 계약을 정리해야 한다.

## 분석 결과

### 읽어야 할 파일

- `agent-task/plane_communication_foundation/code_review_cloud_G06_0.log`
- `agent-task/plane_communication_foundation/plan_cloud_G06_0.log`
- `agent-ops/rules/project/domain/core/rules.md`
- `services/core/internal/notification/service.go`
- `services/core/migrations/00001_create_tasks.sql`
- `services/core/migrations/00002_add_task_external_refs.sql`
- `services/core/queries/tasks.sql`
- `services/core/internal/db/models.go`
- `services/core/internal/db/tasks.sql.go`

### Required 원인

- `services/core/internal/notification/service.go`의 `NotifyTaskCompleted`가 `mattermost.TaskNotificationInput{...}` literal과 `SendTaskNotification` 호출을 닫지 않아 `go test -count=1 ./...`가 syntax error로 실패한다.
- external ref columns가 `00001_create_tasks.sql`과 `00002_add_task_external_refs.sql` 양쪽에 있어, `00002` rollback 후 schema가 남아 있는 migration set과 어긋난다.

### 범위

- 포함: syntax fix, migration ownership 정리, sqlc 재생성 확인, 검증 결과 재기록.
- 제외: Plane 자동 enqueue/publish 재도입, Plane adapter behavior 변경, 새로운 API 필드 추가, roadmap 문서 변경.

## 구현 체크리스트

- [x] `services/core/internal/notification/service.go`의 `NotifyTaskCompleted` Mattermost 호출을 문법적으로 완성하고 필요한 Go 파일에 `gofmt`를 적용한다.
- [x] external ref columns의 migration ownership을 한 곳으로 정리한다. 기존 DB 업그레이드를 위해 `00002_add_task_external_refs.sql`를 유지하고, `00001_create_tasks.sql`의 external ref column 중복 추가분을 제거한다.
- [x] `./bin/sqlc`, `go test -count=1 ./...`, `./bin/test`, `git diff --check`, stale-symbol `rg` 검증을 재실행하고 실제 stdout/stderr를 `CODE_REVIEW-cloud-G06.md`에 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 구현 항목

### [REVIEW_PLANE-1] notification service compile failure 복구

#### 문제

`services/core/internal/notification/service.go:30`의 return statement가 다음 상태로 끝나 현재 Go parser가 파일을 읽지 못한다.

```go
return s.mattermost.SendTaskNotification(ctx, mattermost.TaskNotificationInput{
    TaskID:  input.TaskID,
    Title:   input.Title,
    Status:  input.Status,
    Message: input.Message,
}
```

#### 해결 방법

- `mattermost.TaskNotificationInput{...}` literal and `SendTaskNotification` 호출을 `})`로 닫는다.
- `gofmt`를 적용한다.
- Plane 자동 publish 관련 타입이나 호출은 되살리지 않는다.

#### 중간 검증

```bash
cd services/core && go test -count=1 ./internal/notification ./internal/scheduler ./cmd/server
```

예상 결과: 성공.

### [REVIEW_PLANE-2] external ref migration ownership 정리

#### 문제

`services/core/migrations/00001_create_tasks.sql`과 `services/core/migrations/00002_add_task_external_refs.sql`가 모두 `external_provider`, `external_id`, `external_url`, `external_metadata`를 선언한다. 이 상태에서는 fresh DB의 `00002`는 no-op이 되고, `00002`만 rollback하면 `00001`이 선언한 schema와 실제 DB가 달라진다.

#### 해결 방법

- `00001_create_tasks.sql`은 원래 task 기본 schema만 소유하도록 external ref columns를 제거한다.
- `00002_add_task_external_refs.sql`는 기존 DB 업그레이드용 additive migration으로 유지한다.
- `./bin/sqlc`를 실행해 `services/core/internal/db/models.go`와 `services/core/internal/db/tasks.sql.go`가 최종 migration schema와 일치하는지 확인한다.

#### 중간 검증

```bash
rg --sort path -n "external_provider|external_metadata" services/core/migrations/00001_create_tasks.sql services/core/migrations/00002_add_task_external_refs.sql
```

예상 결과: `00002_add_task_external_refs.sql`에서만 출력된다.

```bash
cd services/core && ./bin/sqlc
```

예상 결과: 성공.

## 최종 검증

```bash
cd services/core && ./bin/sqlc
```

예상 결과: 성공.

```bash
cd services/core && go test -count=1 ./...
```

예상 결과: 성공.

```bash
cd services/core && ./bin/test
```

예상 결과: 성공.

```bash
git diff --check
```

예상 결과: 출력 없음.

```bash
rg --sort path -n "NotifyTaskFailed|notifyPlane|PlaneClient|planeMetadata|CompletedStateID|FailedStateID|completed_state_id|failed_state_id|\"enqueue\"" services/core README.md
```

예상 결과: 출력 없음.

```bash
rg --sort path -n "external_provider|external_metadata" services/core/migrations/00001_create_tasks.sql services/core/migrations/00002_add_task_external_refs.sql
```

예상 결과: `00002_add_task_external_refs.sql`에서만 출력된다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 채운다.
