<!-- task=m-milestone-work-item-creation-sync/14+12,13_live_cycle_smoke plan=0 tag=TEST -->

# Code Review Reference - TEST

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Use `사용자 리뷰 요청` for external secret/runtime blockers; do not ask the user directly.
> Finalization is review-agent-only.

## 개요

date=2026-06-15
task=m-milestone-work-item-creation-sync/14+12,13_live_cycle_smoke, plan=0, tag=TEST

## Roadmap Targets

- Milestone: `agent-roadmap/phase/agent-ops-mcp-control-plane/milestones/milestone-work-item-creation-sync.md`
- Task ids:
  - `live-webhook-task`: 원격 dev Plane에서 `Backlog + AGENT assignee` 상위 티켓을 만들거나 갱신하면 webhook만으로 Core task가 생성되고 checkout metadata가 남는다.
  - `webhook-auto-enqueue`: webhook-dispatched creation task가 별도 수동 API 호출 없이 authoring queue로 이어진다.
  - `live-creation-projection`: matched develop scan/job 입력이 `roadmapsyncpipeline.Service`와 `RoadmapCreationSyncWorker`를 통해 실제 Plane 원문 댓글 보존, 본문/제목 갱신, `Todo` 이동으로 수렴한다.
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다.

검증 출력이 secret-free redacted evidence인지 확인하세요.

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [TEST-1] Build or document the smoke runner | [x] |
| [TEST-2] Collect live or runtime-equivalent evidence | [x] |

## 구현 체크리스트

- [x] Decide whether live smoke can run against the reviewed commit; if not, write a runtime-equivalent smoke that states exactly which live evidence is unavailable and why.
- [x] Capture redacted evidence for webhook 202, Core task external ref, checkout metadata, slot reservation, and queued/running authoring state without printing secrets.
- [ ] Capture redacted evidence for roadmap sync ledger steps `develop_matched`, `original_comment_preserved`, `plane_body_updated`, `plane_todo_moved` and Plane Todo/title state.
- [ ] Capture evidence that a second smoke can reserve a slot without manual DB reset after terminal outcome.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 코드리뷰 전용 체크리스트

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] active review/plan 파일을 `.log`로 아카이브한다.
- [ ] PASS이면 `complete.log`를 작성하고 active task 디렉터리를 archive로 이동한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고하고 roadmap을 직접 수정하지 않는다.

## 계획 대비 변경 사항

- `services/core/cmd/plane-smoke/main.go` 확장을 검토했으나 비파괴적 유지가 어렵고 live-cycle 절차가 별도 scope이라 `agent-test/live-cycle-smoke.md`로 분리했다.
- 항목 3·4 (`roadmap sync ledger steps`, `second smoke slot reuse`)는 reviewed commit이 배포되지 않아 수집 불가; `사용자 리뷰 요청`에 근거와 재개 조건을 기록했다.

## 주요 설계 결정

- smoke runner 형태: `agent-test/live-cycle-smoke.md` (절차 문서 + shell-safe command sequence). Go command 추가는 redaction/config 단위 테스트 대상이 없어 justification 부족; 절차 문서가 충분하다.
- runtime-equivalent 경계: unit test가 dispatch seam·projection seam·slot policy를 커버한다. prior smoke baseline (commit 55e0139, 2026-06-15)이 `live-webhook-task`·`webhook-auto-enqueue` evidence를 부분적으로 커버한다.
- 리뷰된 커밋 배포 없이 수집 불가한 증거: `live-creation-projection` (Plane comment preserved + body updated + Todo moved), slot terminal state release, second-smoke slot reuse.

## 사용자 리뷰 요청

- 상태: 차단됨
- 사유 유형: user-owned-external-environment
- 결정 필요: `live-creation-projection` (Plane comment/body/Todo 검증)과 slot terminal state 회수·second-smoke slot reuse 증거를 수집하려면 reviewed commit(`ef4c219`)을 원격 runner의 Core server에 배포해야 한다. 이 배포는 사용자 소유 인프라 액션(push → remote pull → docker build → restart)이며 agent가 단독으로 실행할 수 없다.
- 차단 근거:
  - 현재 실행 중인 Core server는 commit `55e0139` 기반이며 `slot_finalizer.go`와 develop gate 변경이 없다.
  - 원격 runner checkout (`$HOME/agent-work/nomadcode`)에 tracked 파일 44개, 5368줄 uncommitted 변경이 있어 agent가 임의로 pull/build하면 in-progress work를 덮어쓸 위험이 있다.
  - 리뷰된 커밋을 remote에 push하는 것도 사용자 승인이 필요하다.
- 실행한 검증/명령:
  - `ssh toki@toki-labs.com "git rev-parse HEAD"` → `55e0139cca82d9c88308207bcece0c151d4c2da9` (reviewed commit `ef4c219`과 다름)
  - `docker ps` → `nomadcode-core-nomadcode-core-1` Up 11 hours (55e0139 기반)
  - `curl http://127.0.0.1:18010/api/tasks/e3c92411-4056-4b76-a879-66f7904125d0` → `status:completed, checkout.slot_id:1, authoring_run_state:in_progress` (prior baseline, projection 미완료)
  - `go test -count=1 ./cmd/plane-smoke/... ./internal/http/... ./internal/scheduler/... ./internal/roadmapsyncpipeline/...` → all PASS (unit-level evidence)
- 자동 후속 불가 이유: `live-creation-projection`·slot reuse 증거는 reviewed commit 배포 없이는 어떤 follow-up agent도 수집할 수 없다. 이는 코드 변경이나 명령 재실행으로 해소되지 않는 외부 인프라 선행 조건이다.
- 재개 조건:
  1. 사용자가 reviewed commit을 remote에 push한다.
  2. `ssh toki@toki-labs.com "zsh -lc 'cd $HOME/agent-work/nomadcode && git pull && cd services/core && docker compose build && docker compose up -d'"` (또는 동등한 배포 절차)로 Core server를 재시작한다.
  3. `git rev-parse HEAD`가 `ef4c219` 또는 이후 커밋을 가리키는지 확인한다.
  4. 재개 후 agent는 `agent-test/live-cycle-smoke.md`의 4→9 단계와 TEST-2 항목 3·4를 실행한다.

## 리뷰어를 위한 체크포인트

- smoke evidence가 reviewed commit 또는 명시된 runtime-equivalent 범위에 묶여 있는지 확인한다.
- secret/token/webhook signature 원문이 없는지 확인한다.
- `live-webhook-task`, `webhook-auto-enqueue`, `live-creation-projection`의 증거가 각각 분리되어 있는지 확인한다.

## 검증 결과

### TEST-1 중간 검증
```text
$ cd services/core && go test -count=1 ./cmd/plane-smoke/... ./internal/http/... ./internal/scheduler/...
ok  	github.com/nomadcode/nomadcode-core/cmd/plane-smoke	0.007s
ok  	github.com/nomadcode/nomadcode-core/internal/http	0.010s
ok  	github.com/nomadcode/nomadcode-core/internal/scheduler	2.017s
```

### TEST-2 중간 검증
```text
# Prior smoke baseline evidence (commit 55e0139 server, 2026-06-15)
$ curl -s http://127.0.0.1:18010/api/tasks/e3c92411-4056-4b76-a879-66f7904125d0 | \
    python3 -c "import sys,json; d=json.loads(sys.stdin.read()); m=d.get('task',d).get('metadata',{}); c=m.get('checkout',{}); print('status:',d.get('task',d).get('status')); print('source:',d.get('task',d).get('source')); print('external_id:[REDACTED-UUID]'); print('slot_id:',c.get('slot_id')); print('slot_path:',c.get('slot_path')); print('authoring_run_state:',m.get('authoring_run_state'))"
status: completed
source: plane
external_id: [REDACTED-UUID]
slot_id: 1
slot_path: /Users/toki/agent-work/nomadcode-smoke-workspaces/nomadcode/slots/000
authoring_run_state: in_progress

# Remote runner commit check
$ ssh toki@toki-labs.com "git rev-parse HEAD"
55e0139cca82d9c88308207bcece0c151d4c2da9
# → NOT reviewed commit ef4c219; live-creation-projection 및 slot reuse 증거 수집 불가

# roadmapsyncpipeline ledger unit evidence
$ cd services/core && go test -count=1 -v ./internal/roadmapsyncpipeline/... 2>&1 | grep -E "PASS|FAIL|RUN"
=== RUN   TestSyncCreationNotReadyDoesNotCallProvider
--- PASS: TestSyncCreationNotReadyDoesNotCallProvider (0.00s)
=== RUN   TestSyncCreationReadyRunsStepsAndMarksLedger
--- PASS: TestSyncCreationReadyRunsStepsAndMarksLedger (0.00s)
=== RUN   TestSyncCreationRetrySkipsCompletedSteps
--- PASS: TestSyncCreationRetrySkipsCompletedSteps (0.00s)
=== RUN   TestSyncCreationStopsBeforeLaterStepOnProviderError
--- PASS: TestSyncCreationStopsBeforeLaterStepOnProviderError (0.00s)
=== RUN   TestSyncCreationSkipsSelfMutation
--- PASS: TestSyncCreationSkipsSelfMutation (0.00s)
PASS
ok  	github.com/nomadcode/nomadcode-core/internal/roadmapsyncpipeline	0.003s
```

### 최종 검증
```text
$ cd services/core && go test -count=1 ./cmd/plane-smoke/... ./internal/http/... ./internal/scheduler/... ./internal/roadmapsyncpipeline/...
ok  	github.com/nomadcode/nomadcode-core/cmd/plane-smoke	0.004s
ok  	github.com/nomadcode/nomadcode-core/internal/http	0.015s
ok  	github.com/nomadcode/nomadcode-core/internal/scheduler	2.015s
ok  	github.com/nomadcode/nomadcode-core/internal/roadmapsyncpipeline	0.004s

$ cd services/core && go test ./...
ok  	github.com/nomadcode/nomadcode-core/cmd/plane-smoke
ok  	github.com/nomadcode/nomadcode-core/internal/adapters/openai
ok  	github.com/nomadcode/nomadcode-core/internal/adapters/plane
ok  	github.com/nomadcode/nomadcode-core/internal/authoring
ok  	github.com/nomadcode/nomadcode-core/internal/config
ok  	github.com/nomadcode/nomadcode-core/internal/gitoevents
ok  	github.com/nomadcode/nomadcode-core/internal/gitosync
ok  	github.com/nomadcode/nomadcode-core/internal/http
ok  	github.com/nomadcode/nomadcode-core/internal/notification
ok  	github.com/nomadcode/nomadcode-core/internal/projectsync
ok  	github.com/nomadcode/nomadcode-core/internal/protosocket
ok  	github.com/nomadcode/nomadcode-core/internal/roadmapsync
ok  	github.com/nomadcode/nomadcode-core/internal/roadmapsyncpipeline
ok  	github.com/nomadcode/nomadcode-core/internal/scheduler
ok  	github.com/nomadcode/nomadcode-core/internal/storage
ok  	github.com/nomadcode/nomadcode-core/internal/workflow
ok  	github.com/nomadcode/nomadcode-core/internal/workitem
ok  	github.com/nomadcode/nomadcode-core/internal/workitempipeline
PASS; all services/core packages passed.

$ git diff --check
PASS; no output.
```

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - Correctness: Pass
  - Completeness: Fail
  - Test coverage: Fail
  - API contract: Pass
  - Code quality: Pass
  - Plan deviation: Pass
  - Verification trust: Fail
- 발견된 문제:
  - Required: `agent-task/m-milestone-work-item-creation-sync/14+12,13_live_cycle_smoke/CODE_REVIEW-cloud-G07.md:41` 및 `agent-task/m-milestone-work-item-creation-sync/14+12,13_live_cycle_smoke/CODE_REVIEW-cloud-G07.md:42`의 필수 live/runtime-equivalent 증거가 미완료입니다. reviewed commit이 원격 Core server에 배포되지 않아 `develop_matched`, `original_comment_preserved`, `plane_body_updated`, `plane_todo_moved`, Plane Todo/title 상태, terminal outcome 이후 second-smoke slot reuse를 확인하지 못했습니다. 수정은 reviewed commit을 remote에 배포한 뒤 `agent-test/live-cycle-smoke.md` 4→9 단계를 실행하고 secret-free redacted 출력으로 두 체크리스트를 완료하는 것입니다.
- 다음 단계: USER_REVIEW.md stop state를 작성한다. 차단 사유는 사용자 소유 원격 runner 배포 선행 조건이며, 자동 follow-up plan으로는 증거를 수집할 수 없다.
