<!-- task=m-workflow-core/05+02,03,04_notification_model plan=2 tag=REVIEW_REVIEW_WFC-EVENTS -->

# Workflow Core Notification Event Model Verification Follow-up Plan

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

이 계획은 `code_review_cloud_G07_1.log`의 Required 이슈만 해결한다. 소스 변경은 원칙적으로 필요하지 않으며, 핵심 작업은 필수 검증 명령의 실제 stdout/stderr를 active `CODE_REVIEW-cloud-G07.md`에 기록하는 것이다. 명령 실패가 실제 코드 문제를 드러내면 최소 수정 후 같은 검증 증거를 기록한다. 사용자 결정이나 외부 환경 준비가 필요한 blocker만 `사용자 리뷰 요청`으로 기록한다.

## 배경

두 번째 리뷰에서 stale reason 관련 코드와 테스트 구조는 계획 방향에 맞는 것으로 확인됐지만, review stub의 `검증 결과`가 모든 명령에서 `(output)` placeholder로 남아 verification trust를 만족하지 못했다. 자동 루프는 PASS 전 실제 검증 출력이 필요하다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 USER_REVIEW 작성 여부를 판단한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/workflow-core/milestones/workflow-core.md`
- Task ids:
  - `notification-model`: notification event 모델과 발행 지점
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-task/m-workflow-core/05+02,03,04_notification_model/plan_cloud_G07_1.log`
- `agent-task/m-workflow-core/05+02,03,04_notification_model/code_review_cloud_G07_1.log`
- `agent-test/local/rules.md`
- `agent-test/local/core-smoke.md`
- `agent-test/local/contracts-smoke.md`
- `services/core/internal/scheduler/jobs.go`
- `services/core/internal/scheduler/jobs_test.go`
- `services/core/internal/protosocket/events.go`
- `services/core/internal/protosocket/tasks_test.go`
- `services/core/internal/notification/service_test.go`

### 테스트 환경 규칙

- test_env: `local`
- 읽은 규칙: `agent-test/local/rules.md`, `agent-test/local/core-smoke.md`, `agent-test/local/contracts-smoke.md`
- 주의: 현재 리뷰 환경에서는 테스트 실행이 금지되어 리뷰어가 `go test`를 재실행하지 않는다. 구현 에이전트는 허용된 검증 환경에서 실제 stdout/stderr를 수집해 review stub에 기록해야 한다.

### 테스트 커버리지 공백

- 테스트 코드는 stale reason regression을 검증하도록 보강됐지만, 해당 테스트가 실제로 통과했다는 stdout/stderr가 없다.

### 심볼 참조

- Verification gap: [code_review_cloud_G07_1.log](/config/workspace/nomadcode/agent-task/m-workflow-core/05+02,03,04_notification_model/code_review_cloud_G07_1.log:104)
- Follow-up code paths:
  - [services/core/internal/scheduler/jobs.go](/config/workspace/nomadcode/services/core/internal/scheduler/jobs.go:377)
  - [services/core/internal/scheduler/jobs_test.go](/config/workspace/nomadcode/services/core/internal/scheduler/jobs_test.go:300)
  - [services/core/internal/protosocket/events.go](/config/workspace/nomadcode/services/core/internal/protosocket/events.go:61)
  - [services/core/internal/protosocket/tasks_test.go](/config/workspace/nomadcode/services/core/internal/protosocket/tasks_test.go:210)

### 범위 결정 근거

- 후속 범위는 검증 증거 복구에 한정한다.
- 코드가 이미 계획을 충족하는 한 source files는 수정하지 않는다.
- 검증 명령이 실패하면 실패 원인을 최소 범위로 고치고 같은 명령 출력으로 증명한다.

### 빌드 등급

- build: `cloud-G07`, review: `cloud-G07`
- 근거: 이전 실패가 verification trust Fail이며, 필수 명령의 실제 stdout/stderr 수집이 PASS 조건이다.

## 구현 체크리스트

- [ ] [REVIEW_REVIEW_WFC-EVENTS-1] 필수 검증 명령을 허용된 검증 환경에서 실행하고 실제 stdout/stderr를 review stub에 기록한다.
- [ ] 명령 실패가 있으면 원인을 최소 수정으로 해결하고 실패/수정/재실행 출력을 모두 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_REVIEW_WFC-EVENTS-1] Verification Evidence Recovery

### 문제

- `code_review_cloud_G07_1.log`의 `검증 결과`는 필수 명령 네 개 모두에서 `(output)` placeholder를 남겼다.
- review loop 규칙상 실제 stdout/stderr 없는 체크박스 완료는 completeness 및 verification trust 실패다.

### 해결 방법

- active `CODE_REVIEW-cloud-G07.md`의 검증 결과에 아래 명령의 실제 stdout/stderr를 붙인다.
- 출력은 요약하지 말고 명령 프롬프트와 결과 원문을 기록한다.
- 현재 환경에서 명령 실행이 금지되거나 외부 prerequisite 때문에 불가능하면, 실행한 확인 명령, 실제 차단 출력, 자동 후속 불가 이유, 재개 조건을 `사용자 리뷰 요청`에 기록한다.
- 명령이 실패하면 실패 stdout/stderr를 남긴 뒤 원인을 최소 수정하고 재실행 출력까지 기록한다.

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

- [ ] `agent-task/m-workflow-core/05+02,03,04_notification_model/CODE_REVIEW-cloud-G07.md`: 필수 검증 명령의 실제 stdout/stderr를 기록한다.
- [ ] 필요 시 `services/core/internal/**`: 검증 실패가 실제 코드 문제를 드러낸 경우에만 최소 수정한다.

### 테스트 작성

- 새 테스트 작성은 기본적으로 필요 없다. 기존 보강 테스트 실행 증거를 수집한다.

### 중간 검증

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

Expected: focused scheduler/proto-socket tests pass with stdout/stderr recorded.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-workflow-core/05+02,03,04_notification_model/CODE_REVIEW-cloud-G07.md` | REVIEW_REVIEW_WFC-EVENTS-1 |
| `services/core/internal/**` | only if verification failure exposes a code issue |

## 최종 검증

```bash
cd services/core && go test -count=1 ./internal/scheduler ./internal/protosocket ./internal/notification
rg --sort path -n 'reason|status_reason|task.status.changed' services/core/internal/scheduler services/core/internal/protosocket packages/contracts/notes/flutter-core-api-candidates.md
cd services/core && go test ./...
```

Expected: focused tests pass, deterministic `rg` output is recorded, full core tests pass. Fresh stdout/stderr must appear in `CODE_REVIEW-cloud-G07.md`.

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