<!-- task=m-milestone-work-item-creation-sync/09_creation_trigger_gate plan=1 tag=REVIEW_API -->

# Review Follow-up Plan - REVIEW_API

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

`CODE_REVIEW-local-G07.md`의 구현 에이전트 소유 섹션을 반드시 채운다. 구현 후 검증 명령의 실제 stdout/stderr를 붙이고 active 파일은 그대로 둔 채 리뷰 준비를 보고한다. 종결, log rename, `complete.log`, archive 이동은 code-review 스킬 전용이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret, 범위 충돌이 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 정확한 결정, 근거, 실행 명령/출력, 재개 조건을 적고 멈춘다. 직접 사용자에게 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 재실행/증거 수집으로 닫을 수 있는 검증 공백은 사용자 리뷰 요청이 아니다.

## 배경

첫 리뷰(`code_review_local_G06_0.log`)에서 Plane creation trigger gate 구현은 대체로 들어왔지만, ignored trigger가 `ErrCreationTriggerIgnored`로 끝나기 전에 workspace provision/slot reservation side effect를 만들 수 있음이 확인됐다. 또한 계획상 요구된 legacy Plane compatibility route trigger 전달 테스트가 빠져 있다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/agent-ops-mcp-control-plane/milestones/milestone-work-item-creation-sync.md`
- Task ids:
  - `plane-trigger`: Plane Backlog + AGENT assignee trigger gate
- Completion mode: check-on-pass

## 범위 결정 근거

이번 follow-up은 리뷰 Required 이슈만 닫는다. Plane webhook signature, draft authoring, Plane state id 설정 방식, roadmap 문서 상태 갱신은 범위 밖이다. 사용자 결정은 필요하지 않으며 repository-local 코드와 테스트로 닫을 수 있다.

## 빌드 등급

`local-G07`: 실패 원인은 명확하고 deterministic하지만, pipeline side effect ordering을 바꾸므로 기존 workspace provision/slot 예약 테스트와 HTTP route 테스트를 함께 검증한다.

## 구현 체크리스트

- [ ] ignored trigger를 workspace provision/slot reservation 전에서 판정하도록 `workitempipeline.CreateTaskFromWorkItem` ordering을 조정하고, `EvaluateCreationTrigger`가 `Actor`/`SelfActor`를 trim-normalize해 비교하도록 보강한다.
- [ ] ignored trigger 테스트가 `EnsureProjectWorkspace`, `ReserveWorkspaceSlot`, `CreateTask` 미호출을 검증하도록 보강하고 self actor whitespace case를 추가한다.
- [ ] legacy Plane compatibility route가 `trigger_state_id`, `agent_assignee_id`, `actor`, `self_actor`를 `CreateTaskInput.Trigger`로 전달하는 테스트를 추가한다.
- [ ] focused/full Go tests와 `git diff --check`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_API-1] Trigger Gate Before Side Effects

문제: [service.go](/config/workspace/nomadcode/services/core/internal/workitempipeline/service.go:104)는 workspace를 보장하고 [service.go](/config/workspace/nomadcode/services/core/internal/workitempipeline/service.go:107)는 slot을 `in_use`로 예약한 뒤 [service.go](/config/workspace/nomadcode/services/core/internal/workitempipeline/service.go:124)에서 trigger를 평가한다. ignored trigger가 task를 만들지 않더라도 slot을 소비할 수 있다.

해결 방법: project binding resolve와 config validation은 유지하되, provider `FetchWorkItem`과 `EvaluateCreationTrigger`를 `EnsureProjectWorkspace` 및 `ReserveWorkspaceSlot`보다 앞에 둔다. ignored trigger가 반환되면 workspace provision, slot reservation, task creation 모두 발생하지 않아야 한다. `EvaluateCreationTrigger` 내부에서는 `strings.TrimSpace(trigger.Actor)`와 `strings.TrimSpace(trigger.SelfActor)`를 비교해 direct pipeline caller의 공백 값도 self mutation으로 처리한다.

수정 파일 및 체크리스트:

- [ ] `services/core/internal/workitempipeline/service.go`: trigger evaluation ordering과 actor/self normalization 보강.
- [ ] `services/core/internal/workitempipeline/service_test.go`: ignored state/assignee/self actor 경로에서 `ensureCalled == false`, `reserveCalled == false`, `creator.calledWith == nil` 검증.
- [ ] `services/core/internal/workitempipeline/service_test.go`: actor/self actor whitespace normalization 테스트 추가.

중간 검증:

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

### [REVIEW_API-2] Legacy Plane Route Trigger Coverage

문제: [handlers_test.go](/config/workspace/nomadcode/services/core/internal/http/handlers_test.go:190)의 legacy Plane compatibility route 테스트는 `trigger_state_id`, `agent_assignee_id`, `actor`, `self_actor` 전달을 검증하지 않는다. 첫 계획은 generic route뿐 아니라 legacy Plane route도 같은 optional trigger fields를 전달하도록 요구했다.

해결 방법: `TestCreatePlaneTaskCompatibilityRouteUsesRegistry`를 확장하거나 별도 테스트를 추가해 `/api/integrations/plane/tasks` body의 trigger fields가 `workitempipeline.CreateTaskInput.Trigger`에 trim된 값으로 들어가는지 검증한다. 기존 ref/state/comment 호환성 assertion은 유지한다.

수정 파일 및 체크리스트:

- [ ] `services/core/internal/http/handlers_test.go`: legacy Plane route trigger 전달 assertion 추가.

중간 검증:

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

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `services/core/internal/workitempipeline/service.go` | REVIEW_API-1 |
| `services/core/internal/workitempipeline/service_test.go` | REVIEW_API-1 |
| `services/core/internal/http/handlers_test.go` | REVIEW_API-2 |

## 최종 검증

```bash
cd services/core && go test -count=1 ./internal/workitempipeline ./internal/http
cd services/core && go test ./...
git diff --check
```

기대 결과: focused package와 전체 core package가 실패 없이 종료하고 `git diff --check` 출력이 없다.
