<!-- task=m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize plan=1 tag=REVIEW_TEST -->

# Plan - REVIEW_TEST

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

이 follow-up은 이전 리뷰 FAIL의 Required 항목만 닫는다. 사용자에게 직접 질문하거나 선택지를 제시하지 않는다. 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실제로 실구현을 차단할 때만 `CODE_REVIEW-cloud-G06.md`의 `사용자 리뷰 요청`을 채우고 멈춘다. 환경, secret, 서비스 상태, 검증 증거 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 일반 후속 문제로 기록한다.

## 배경

이전 루프는 scheduler/authoring focused tests는 통과했지만, S16 `slot-finalize` completion evidence가 live task metadata와 workspace slot state를 같은 cycle로 묶지 못했다. 또한 live DB에 `completed` + `authoring_run_state=succeeded` + stale `authoring_failure_category=bridge_failed` 조합이 관찰되어 terminal metadata consistency를 흐린다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/agent-ops-mcp-control-plane/milestones/plane-origin-authoring-roundtrip-sync.md`
- Task ids:
  - `slot-finalize`: projected/failed/timeout/queue timeout/push failed/identity missing map consistently to task metadata and workspace slot state
- Completion mode: check-on-pass

## Spec Targets

- SDD: `agent-roadmap/sdd/agent-ops-mcp-control-plane/plane-origin-authoring-roundtrip-sync/SDD.md`
- Acceptance scenarios:
  - `S16`: task=`slot-finalize`; evidence=`terminal task metadata and slot state evidence recorded`
- Completion mode: spec-check-on-pass

## Archive Evidence Snapshot

- Current archived plan: `agent-task/m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize/plan_cloud_G06_0.log`
- Current archived review: `agent-task/m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize/code_review_cloud_G06_0.log`
- Verdict: FAIL
- Required summary:
  - Live evidence omitted `authoring_run_updated_at`, task `updated_at`, checkout `slot_id`, and same-cycle slot linkage. The slot query showed only latest slot `error`, so success `available` evidence was not proven.
  - `services/core/internal/workflow/lifecycle.go` completion metadata does not clear stale `authoring_failure_category`/`authoring_failure_type`; live DB showed a completed/succeeded row with `bridge_failed`.
- Affected files:
  - `services/core/internal/workflow/lifecycle.go`
  - `services/core/internal/workflow/service_test.go`
  - `agent-task/m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize/CODE_REVIEW-cloud-G06.md`
- Prior verification evidence:
  - Reviewer reran `ssh toki@toki-labs.com 'zsh -lc '\''cd "$HOME/agent-work/nomadcode/services/core" && go test -count=1 ./internal/scheduler ./internal/authoring'\'''` and it passed.
  - Reviewer reran DB evidence with checkout `slot_id` and `authoring_run_updated_at`; latest failed row and slot `error` shared slot 1 and matching timestamp, but success `available` was not live-proven.
- Allowed narrow archive rereads:
  - `agent-task/archive/2026/06/m-plane-origin-authoring-roundtrip-sync/10+09_plane_todo/complete.log`
  - `agent-task/m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize/plan_cloud_G06_0.log`
  - `agent-task/m-plane-origin-authoring-roundtrip-sync/11+10_slot_finalize/code_review_cloud_G06_0.log`

## 범위 결정 근거

- 포함: successful completion의 stale authoring failure metadata 제거, regression test, S16 evidence 재수집.
- 제외: Plane projection 로직, Gito delivery, active reconcile enqueue, full-cycle smoke 전체. 이 follow-up은 `slot-finalize` 증거와 metadata consistency만 닫는다.
- 라우팅: live DB evidence와 verification-trust 회복이 포함되어 `cloud-G06`으로 유지한다.

## 구현 체크리스트

- [ ] `services/core/internal/workflow/lifecycle.go`에서 successful completion이 `authoring_failure_category`와 `authoring_failure_type` 같은 stale authoring failure metadata를 제거하도록 수정한다.
- [ ] `services/core/internal/workflow/service_test.go`에 기존 failure metadata가 있는 Plane task를 `CompleteTaskByExternalRef`로 성공 완료했을 때 failure metadata가 제거되는 regression assertion을 추가한다.
- [ ] Remote runner에서 focused test와 core full test를 실행하고 실제 stdout/stderr를 기록한다.
- [ ] Remote DB/API에서 task metadata와 workspace slot state를 같은 cycle로 묶는 evidence를 다시 수집해 `authoring_run_updated_at`, checkout `slot_id`, task `updated_at`, slot `state`, slot `updated_at`, success summary 또는 failure category를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] Clear Stale Success Failure Metadata

#### 문제

`workflow.Lifecycle.CompleteTask`는 completion result에서 authoring success metadata를 승격하지만 기존 failure category/type을 삭제하지 않는다. 실패 후 재실행되어 성공한 task는 `completed/succeeded`와 이전 failure category가 함께 남을 수 있고, 이는 S16 terminal metadata evidence를 불신하게 만든다.

#### 해결 방법

- completion `updates`에 `MetadataKeyAuthoringFailureCategory: nil`과 `MetadataKeyAuthoringFailureType: nil`를 추가한다.
- 기존 `TestServiceCompleteTaskByExternalRefPromotesAuthoringMetadata` fixture metadata에 stale failure fields를 넣고, 성공 완료 후 해당 키가 없는지 확인한다.

#### 수정 파일 및 체크리스트

- [ ] `services/core/internal/workflow/lifecycle.go`: successful completion에서 stale failure metadata 제거.
- [ ] `services/core/internal/workflow/service_test.go`: regression assertion 추가.

#### 테스트 작성

- 기존 workflow service test를 확장한다.

#### 중간 검증

```sh
ssh toki@toki-labs.com 'zsh -lc '\''cd "$HOME/agent-work/nomadcode/services/core" && go test -count=1 ./internal/workflow'\'''
```

Expected: package passes.

### [REVIEW_TEST-2] Recollect Same-Cycle Slot Finalize Evidence

#### 문제

이전 review evidence는 task rows와 slot row를 연결하지 않았고, success `available` evidence를 현재 slot state로 확인하지 못했다. S16은 terminal task metadata와 slot state evidence가 필요하다.

#### 해결 방법

- DB query에 task `updated_at`, `metadata.checkout.slot_id`, `authoring_run_updated_at`, `wait_type`, `authoring_failure_category`, `summary`를 포함한다.
- slot query에 `id`, `state`, `updated_at`을 포함하고 task `checkout.slot_id`와 같은 slot임을 기록한다.
- 현재 dev DB가 후속 실패로 slot state를 덮어쓴 상태라 success `available` live evidence를 회수할 수 없으면, 그 사실을 timestamp와 함께 기록하고 success path는 `RoadmapCreationSyncWorker`/workflow focused test evidence로 대체했음을 명시한다. 단, failure/error live evidence는 같은 slot/timestamp로 보여야 한다.

#### 수정 파일 및 체크리스트

- [ ] `CODE_REVIEW-cloud-G06.md`: focused/full test output과 DB/API evidence 기록.

#### 테스트 작성

- 새 테스트는 필요하지 않다. TEST-1 코드 수정 regression test가 source coverage를 담당한다.

#### 중간 검증

```sh
ssh toki@toki-labs.com 'zsh -lc '\''cd "$HOME/agent-work/nomadcode/services/core" && go test -count=1 ./internal/workflow ./internal/scheduler ./internal/authoring'\'''
```

Expected: packages pass.

## 의존 관계 및 구현 순서

1. Metadata cleanup fix와 regression test를 먼저 작성한다.
2. Remote focused tests와 full core tests를 실행한다.
3. DB/API evidence를 다시 수집해 review stub에 붙인다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `services/core/internal/workflow/lifecycle.go` | REVIEW_TEST-1 stale failure metadata cleanup |
| `services/core/internal/workflow/service_test.go` | REVIEW_TEST-1 regression assertion |
| `CODE_REVIEW-cloud-G06.md` | REVIEW_TEST-2 evidence |

## 최종 검증

```sh
ssh toki@toki-labs.com 'zsh -lc '\''cd "$HOME/agent-work/nomadcode/services/core" && go test -count=1 ./internal/workflow ./internal/scheduler ./internal/authoring'\'''
```

Expected: all listed packages pass.

```sh
ssh toki@toki-labs.com 'zsh -lc '\''cd "$HOME/agent-work/nomadcode/services/core" && go test -count=1 ./...'\'''
```

Expected: all core packages pass.

```sh
ssh toki@toki-labs.com 'zsh -lc '\''docker exec code-server-postgres psql -U nomadcode -d nomad-core-dev -c "select t.id, t.status, t.updated_at, t.external_id, t.metadata->'\''checkout'\''->>'\''slot_id'\'' as slot_id, t.metadata->>'\''authoring_run_state'\'' as run_state, t.metadata->>'\''authoring_run_updated_at'\'' as run_updated_at, t.metadata->>'\''wait_type'\'' as wait_type, t.metadata->>'\''authoring_failure_category'\'' as failure_category, t.metadata->>'\''summary'\'' as summary from tasks t where t.source = '\''plane'\'' order by t.updated_at desc limit 10;"'\'''
```

Expected: terminal task rows expose run state, run updated timestamp, slot id, and success summary or failure category.

```sh
ssh toki@toki-labs.com 'zsh -lc '\''docker exec code-server-postgres psql -U nomadcode -d nomad-core-dev -c "select id, project_sync_setting_id, slot_index, state, path, updated_at from workspace_slots order by updated_at desc limit 10;"'\'''
```

Expected: slot rows can be matched to task checkout slot ids and terminal mapping is explained without secrets.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
