# Complete - m-workflow-core/05+02,03,04_notification_model

## 완료 일시

2026-06-01

## 요약

Workflow notification event model과 proto-socket `task.status.changed` additive context fields를 3회 리뷰 루프로 완료했다. 최종 판정은 PASS다.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_cloud_G07_0.log` | `code_review_cloud_G07_0.log` | FAIL | `status_reason`이 event type과 무관하게 `Reason`으로 복사되어 retry success running/completed event에 이전 실패 사유가 노출될 수 있어 후속 보강이 필요했다. |
| `plan_cloud_G07_1.log` | `code_review_cloud_G07_1.log` | FAIL | stale reason 보강 코드는 충족했지만 review stub에 실제 검증 stdout/stderr가 없어 verification trust 회복이 필요했다. |
| `plan_cloud_G07_2.log` | `code_review_cloud_G07_2.log` | PASS | 필수 검증 stdout/stderr가 기록됐고 stale reason 회귀 테스트와 proto-socket payload 검증이 통과했다. |

## 구현/정리 내용

- `notification.TaskEvent`에 `Attempt`, `Reason`, `OccurredAt` additive context fields를 추가했다.
- scheduler의 running/completed/failed notification event 발행 지점에서 attempt와 occurred_at을 채우고, failed event에만 failure reason을 싣도록 stale `status_reason` 유출을 차단했다.
- proto-socket `task.status.changed` payload에 `attempt`, optional `reason`, optional `occurred_at`을 반영하고 contracts note를 additive shape로 갱신했다.
- notification fanout, proto-socket envelope, scheduler retry/failure event tests를 보강했다.

## 최종 검증

- `cd services/core && go test -count=1 ./internal/scheduler ./internal/protosocket` - PASS; `code_review_cloud_G07_2.log`에 scheduler/proto-socket focused test 성공 출력 기록.
- `cd services/core && go test -count=1 ./internal/scheduler ./internal/protosocket ./internal/notification` - PASS; `code_review_cloud_G07_2.log`에 focused package test 성공 출력 기록.
- `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` - PASS; `code_review_cloud_G07_2.log`에 deterministic grep 출력 기록.
- `cd services/core && go test ./...` - PASS; `code_review_cloud_G07_2.log`에 core 전체 Go test 성공 출력 기록.
- Code-review rerun: BLOCKED; `agent-test/local/rules.md`가 현재 환경에서 새 Go test 실행을 금지해 리뷰어는 테스트를 재실행하지 않고 기록된 stdout/stderr와 실제 소스/테스트를 대조했다.

## Roadmap Completion

- Milestone: `agent-roadmap/phase/workflow-core/milestones/workflow-core.md`
- Completed task ids:
  - `notification-model`: PASS; evidence=`agent-task/archive/2026/06/m-workflow-core/05+02,03,04_notification_model/plan_cloud_G07_2.log`, `agent-task/archive/2026/06/m-workflow-core/05+02,03,04_notification_model/code_review_cloud_G07_2.log`; verification=`cd services/core && go test -count=1 ./internal/scheduler ./internal/protosocket`, `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 ./...`
- Not completed task ids: 없음

## 잔여 Nit

- 없음

## 후속 작업

- 없음
