# Code review stub: runner heartbeat timeout runtime loop

## Review target

- Plan: `PLAN-cloud-G06.md`
- Status: pending implementation

## Reviewer focus

- Confirm the timeout loop is owned by the core server lifecycle and stops on shutdown.
- Confirm production defaults are not test-tuned magic values.
- Confirm no job/execution state is changed merely because a runner goes offline.
- Confirm tests prove runtime enforcement, not only `Registry.CheckTimeouts` in isolation.

## Required checks

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

## Notes

This review should be completed before using this item as phase-exit evidence.

---

## 코드리뷰 결과

- 종합 판정: FAIL

### 차원별 평가

| 차원 | 평가 | 근거 |
|------|------|------|
| correctness | Pass | `Server.Start`/`StartListener`에서 timeout loop가 시작되고, tick마다 `Registry.CheckTimeouts`를 호출한다. |
| completeness | Fail | active review가 `Status: pending implementation` 상태이며 구현 체크리스트, 구현 증적, 검증 결과가 채워지지 않았다. |
| test coverage | Warn | 서버 런타임 테스트는 추가되었고 `go test -count=1 ./...`도 통과했지만, timeout 전이 테스트가 고정 `time.Sleep`에 의존한다. |
| API contract | Pass | runner protocol, registration, job/execution state contract 변경은 보이지 않는다. |
| code quality | Warn | HTTP server start 실패 경로에서도 timeout loop가 먼저 시작되는 구조라 lifecycle 경계가 더 명확해질 필요가 있다. |
| plan deviation | Fail | review stub이 구현 완료 상태로 갱신되지 않아 phase-exit evidence로 사용할 수 없다. |
| verification trust | Fail | active review 파일에 구현 에이전트의 검증 출력이 없으며, 리뷰어가 별도로 실행한 결과만 존재한다. |

### 발견된 문제

- Required: `agent-task/control_plane_phase_exit_followups/01_heartbeat_timeout_runtime/CODE_REVIEW-cloud-G06.md:5` active review가 `Status: pending implementation`으로 남아 있고 구현 체크리스트/검증 결과가 없다. 다음 구현 라운드에서 실제 구현 상태, 검증 명령, 출력 요약을 review stub에 기록한다.
- Suggested: `services/core/internal/httpserver/server.go:101` `Start`/`StartListener`가 HTTP serving 호출 전에 timeout loop를 시작한다. serving 시작이 즉시 실패하는 경로에서 loop lifecycle이 흐려지므로 실패 경로 정리 또는 기동 성공 이후 loop 시작 구조를 검토한다.
- Suggested: `services/core/internal/httpserver/server_test.go:1446` timeout 전이 검증이 고정 `time.Sleep(120 * time.Millisecond)`에 의존한다. CI 스케줄링 편차를 줄이도록 deadline 기반 polling helper로 바꾼다.

### 리뷰어 검증

- 실행 명령: `cd services/core && go test -count=1 ./...`
- 결과: PASS
- 출력 요약:
  - `ok github.com/toki/oto/services/core/internal/httpserver 0.132s`
  - `ok github.com/toki/oto/services/core/internal/runnerregistry 0.003s`
  - `ok github.com/toki/oto/services/core/internal/cicdstate 0.002s`

### 다음 단계

- FAIL follow-up: active review 증적을 완성하고, timeout loop lifecycle/test 안정성 Suggested 항목을 좁은 범위로 보완하는 다음 `PLAN-cloud-G06.md` / `CODE_REVIEW-cloud-G06.md`를 작성한다.
