<!-- task=m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple plan=1 tag=REVIEW_REFACTOR -->

# Code Review Reference - REVIEW_REFACTOR

> **[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.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, keep the active files in place, then end the implementation execution. The filled review-without-verdict state plus agent completion is the `review-ready` signal; do not create a handoff file/message, invoke code-review, or switch to the review role in place.
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and use the same file-state handoff; only a distinct review-agent instance may materialize `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps become normal follow-ups with blocker evidence, a deterministic release condition, and revalidation commands; they are not user-facing stopping states.
> Do not ask the user directly, present choices in chat, call `request_user_input`, report review readiness, or wait for another user instruction. The runtime immediately assigns a distinct review-agent instance; a new turn, resume, compaction, or role change of this implementing agent is not distinct.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, follow-up pair creation, `코드리뷰 전용 체크리스트`) belongs only to that distinct review agent. The implementing agent must never perform it, even after compaction or resume.
> `USER_REVIEW.md` and `complete.log` are the only terminal states. A filled stub, verdict, archive, or WARN/FAIL follow-up pair is transitional and the loop must continue automatically.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-07-21
task=m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple, plan=1, tag=REVIEW_REFACTOR

## Archive Evidence Snapshot

- Prior task: `agent-task/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple`
- Prior verdict: FAIL
- Archived plan: `agent-task/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple/plan_local_G06_0.log`
- Archived review: `agent-task/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple/code_review_local_G06_0.log`
- Findings: Required 1, Suggested 0, Nit 0. `TestProviderSnapshotReconnectRestoresCapacityAndAdmission`이 lease/admission 없이 counter를 직접 주입하고 authoritative disconnect를 우회한 뒤 이전 `inflight=2`, `long_inflight=1`을 새 generation 정상값으로 기대한다.
- Affected files: `apps/edge/internal/service/status_provider_test.go`; 구현 검증이 드러내는 최소 필요가 있을 때만 관련 `apps/edge/internal/service/model_queue_snapshot.go`를 변경한다.
- Verification evidence: format/diff check, snapshot regex, service race는 PASS. Edge race는 병렬 자원 경합 중 heartbeat test가 1회 timeout했으나 해당 test 단독과 순차 `go test -race -count=1 ./apps/edge/...` 재실행은 PASS. `scripts/e2e-long-context-admission-smoke.sh --preflight`는 provider/status endpoint 미가용으로 rc=3 BLOCKED였으며 재검증 해제 조건은 두 endpoint reachability다.
- Roadmap carryover: 이 split child는 `offline-snapshot`의 부분 evidence이며 `Roadmap Targets`를 갖지 않는다. Milestone SDD S14의 이전 generation orphan 제거, 새 generation configured capacity와 admission 수렴만 검증한다.

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

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
> 리뷰 에이전트는 구현 에이전트와 별도 agent instance여야 하며 product source/test를 수정하거나 현재·후속 plan을 구현하거나 구현 에이전트 소유 섹션을 채우지 않는다. WARN/FAIL follow-up pair를 만든 뒤 review 실행을 종료하면 archived current pair와 fresh pair가 runtime의 `implementation-ready` 신호가 된다. 별도 handoff 파일·사용자 메시지를 만들지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-local-G05.md` → `code_review_local_G05_1.log`, `PLAN-local-G04.md` → `plan_local_G04_1.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 plan skill로 fresh-routed pair를 메모리에 준비하고, current pair를 archive한 후 code-review가 다음 active pair를 byte-for-byte materialize하거나 `USER_REVIEW.md`를 작성한다. 미해결 Required는 별도 후속 지시가 없어도 반드시 FAIL과 정확히 하나의 next state를 만든다. 기본 next state는 follow-up pair이며, 유효한 Milestone-lock gate만 그 pair 대신 `USER_REVIEW.md`를 만든다. 유효한 gate는 Required/FAIL로 분류한다. Suggested는 WARN follow-up을 만들고, Nit-only는 모든 차원이 Pass이면 PASS할 수 있다. `USER_REVIEW.md`의 연결 결정이 완료/PASS로 해소되면 code-review가 이를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다. 해소된 결정이 새 구현을 요구하면 plan이 `USER_REVIEW.md`를 archive하고 fresh pair를 쓴 뒤 reviewer가 종료하며 runtime이 별도 구현-agent instance를 배정한다.
4. PASS이고 task group이 `m-provider-resource-admission-ownership-alignment`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한다. 사용자-facing 보고는 `USER_REVIEW.md` 또는 `complete.log`가 생성된 뒤에만 한다.
6. WARN/FAIL follow-up pair가 생성된 경우 사용자에게 보고하거나 묻지 않고 review 실행을 종료한다. archived current pair와 fresh pair 및 reviewer 실행 종료가 runtime의 `implementation-ready` 신호다. runtime은 별도 구현 에이전트 instance를 배정하고, 그 구현자가 stub을 채운 뒤 다시 별도 review 에이전트 instance를 배정한다. 어느 단계에서도 같은 agent의 새 turn/resume/역할 전환으로 대체하지 않는다. 사용자에게 종료 보고할 수 있는 상태는 `USER_REVIEW.md` 또는 `complete.log`뿐이다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| REVIEW_REFACTOR-1 Authoritative reconnect admission fixture | [x] |

## 구현 체크리스트

- [x] `TestProviderSnapshotReconnectRestoresCapacityAndAdmission`을 실제 first-generation lease → authoritative generation disconnect settlement → offline zero tuple → higher-generation reconnect → 신규 admission 순서로 교체하고, reconnect 전 old counter가 0이며 신규 lease만 in-flight/long counter에 반영되고 release 뒤 다시 0인지 검증한다.
- [x] 변경 파일 format/diff, targeted snapshot, service race, Edge race와 long-admission preflight를 실행하고 실제 stdout/stderr 및 외부 blocker의 해제 조건을 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우고 active pair를 유지한 채 구현 실행을 종료한다. 이 저장 상태가 runtime의 review-ready 신호이며 별도 handoff 파일·사용자 메시지를 만들지 않는다. 구현 에이전트는 code-review를 실행하거나 review 전용 작업을 수행하지 않는다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G05_1.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G04_1.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이면 active task 디렉터리 `agent-task/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple/`를 `agent-task/archive/YYYY/MM/m-provider-resource-admission-ownership-alignment/14+10_offline_provider_tuple/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-provider-resource-admission-ownership-alignment`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-provider-resource-admission-ownership-alignment/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 plan skill을 실행하고 `finalize-task-routing`의 fresh 결과와 일치하는 다음 active `PLAN-local-G04.md`와 `CODE_REVIEW-local-G05.md`를 작성하며 `complete.log`를 작성하지 않는다.
- [ ] `USER_REVIEW.md` 또는 `complete.log`가 아직 없으면 사용자에게 질문·준비 완료 보고·종료 응답을 하지 않고 review 실행을 종료한다. archived current pair와 fresh pair가 `implementation-ready` 상태이며 리뷰 에이전트가 직접 구현하거나 별도 handoff artifact를 만들지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
- [ ] USER_REVIEW의 해소 결정이 새 구현을 요구하면 plan이 `USER_REVIEW.md`를 archive하고 fresh pair를 쓴 뒤 review 실행을 종료한다. 이 상태가 `implementation-ready`이며 runtime이 별도 구현-agent instance를 배정한다.

## 계획 대비 변경 사항

- 계획한 기본 write set인 `apps/edge/internal/service/status_provider_test.go`만 수정했다.
- `apps/edge/internal/service/model_queue_snapshot.go`는 정정된 회귀가 기존 구현에서 통과해 source defect가 재현되지 않았으므로 수정하지 않았다. 이는 PLAN의 조건부 source 수정 범위와 일치한다.
- long-admission preflight는 rc=3으로 종료됐다. provider `/models`와 Control Plane status endpoint가 모두 reachable해지는 것이 결정적 해제 조건이며, 해제 후 같은 preflight를 재실행하고 통과하면 live scenario를 실행해야 한다. 이번 실행에서는 scenario가 시작되지 않았다.

## 주요 설계 결정

1. 수동 `resources` counter 주입을 제거하고 `SetRuntimeConfig`의 실제 Node/provider/model catalog, `resolveQueueCandidates`, `modelQueueManager.admit`을 사용해 각 accepted connection generation에 lease를 발급한다.
2. 첫 long-context lease를 `trackLease`로 tracked 상태에 둔 뒤 registry에서 current owner를 제거하고, 제거 전에 보존한 exact generation으로 `Service.HandleNodeDisconnect`를 호출한다. lease 삭제, resource orphan generation, 일반/long counter 0을 함께 검증한다.
3. 같은 Node/provider identity의 reconnect가 더 높은 generation을 받는지 확인하고, 신규 admission 전에는 configured capacity만 복구되고 counter는 0인지 검증한다. 이후 새 generation lease 하나만 일반/long counter에 반영되고 `releaseLease` 뒤 다시 0이 되는지 검증한다.
4. snapshot assertion은 catalog identity, status/health, configured/effective capacity, 일반·long in-flight와 queue pressure를 각 lifecycle stage에서 함께 확인한다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 채운 뒤 구현 에이전트는 code-review를 실행하거나 역할을 바꾸지 않고 active pair를 유지한 채 구현 실행을 종료한다. 이 저장 상태가 runtime의 `review-ready` 신호이므로 별도 handoff 파일·사용자 메시지를 만들지 않는다. runtime은 사용자에게 묻지 않고 별도 review 에이전트 instance를 즉시 배정하며, review 에이전트가 `USER_REVIEW.md`를 실제로 만들기 전에는 terminal 상태가 아니다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 blocker evidence·결정적 해제 조건·재검증 명령을 `검증 결과`나 `계획 대비 변경 사항`에 기록한 뒤 code-review의 일반 follow-up plan으로 처리한다._

- 상태: 없음
- 사유 유형: 없음
- 연결 대상: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

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

- manual `resources` counter injection이 제거되고 첫 generation의 실제 lease가 존재하는가.
- registry에서 제거한 exact generation으로 `Service.HandleNodeDisconnect`를 호출해 lease가 settle되고 resource가 orphan fence되는가.
- offline과 reconnect 직후에는 capacity/long capacity만 설정대로 복구되고 old in-flight/long counter가 0인가.
- higher generation의 실제 신규 admission 뒤 counter가 새 lease 수만 반영되며 release 뒤 0으로 돌아오는가.
- format, targeted, service/Edge race 출력과 long-admission preflight blocker가 실제 명령 결과와 일치하는가.

## 검증 결과

아래 각 명령을 정확히 실행하고 stdout/stderr를 코드블록에 기록한다. 명령을 바꾸면 `계획 대비 변경 사항`에 대체 명령과 이유를 기록한다.

### format

`gofmt -d apps/edge/internal/service/status_provider_test.go apps/edge/internal/service/model_queue_snapshot.go`

```text
출력 없음 (exit code 0)
```

### diff check

`git diff --check -- apps/edge/internal/service/status_provider_test.go apps/edge/internal/service/model_queue_snapshot.go`

```text
출력 없음 (exit code 0)
```

### authoritative reconnect test

`go test -count=1 -v ./apps/edge/internal/service -run '^TestProviderSnapshotReconnectRestoresCapacityAndAdmission$'`

```text
=== RUN   TestProviderSnapshotReconnectRestoresCapacityAndAdmission
    status_provider_test.go:2145: first-generation-admitted: generation status=available health=available capacity=5 in_flight=1 long_capacity=2 long_in_flight=1
    status_provider_test.go:2176: offline-after-settlement: generation status=unavailable health=offline capacity=0 in_flight=0 long_capacity=0 long_in_flight=0
    status_provider_test.go:2185: reconnected-before-admission: generation status=available health=available capacity=5 in_flight=0 long_capacity=2 long_in_flight=0
    status_provider_test.go:2190: reconnected-after-admission: generation status=available health=available capacity=5 in_flight=1 long_capacity=2 long_in_flight=1
    status_provider_test.go:2192: reconnected-after-release: generation status=available health=available capacity=5 in_flight=0 long_capacity=2 long_in_flight=0
--- PASS: TestProviderSnapshotReconnectRestoresCapacityAndAdmission (0.00s)
PASS
ok  	iop/apps/edge/internal/service	0.015s
```

### snapshot regression

`go test -count=1 ./apps/edge/internal/service -run 'Snapshot|Offline|Reconnect'`

```text
ok  	iop/apps/edge/internal/service	0.351s
```

### service race

`go test -race -count=1 ./apps/edge/internal/service`

```text
ok  	iop/apps/edge/internal/service	7.854s
```

### Edge race

`go test -race -count=1 ./apps/edge/...`

```text
ok  	iop/apps/edge/cmd/edge	1.446s
ok  	iop/apps/edge/internal/bootstrap	1.997s
ok  	iop/apps/edge/internal/configrefresh	1.392s
ok  	iop/apps/edge/internal/controlplane	5.660s
ok  	iop/apps/edge/internal/edgecmd	1.225s
ok  	iop/apps/edge/internal/edgevalidate	1.115s
ok  	iop/apps/edge/internal/events	1.078s
ok  	iop/apps/edge/internal/input	1.038s
ok  	iop/apps/edge/internal/input/a2a	1.030s
ok  	iop/apps/edge/internal/node	1.070s
ok  	iop/apps/edge/internal/openai	8.635s
ok  	iop/apps/edge/internal/opsconsole	1.055s
ok  	iop/apps/edge/internal/service	7.525s
ok  	iop/apps/edge/internal/transport	5.585s
```

### long-admission preflight

`bash scripts/e2e-long-context-admission-smoke.sh --preflight`

```text
[long-admission-smoke] out-dir=/tmp/iop-long-admission-smoke run=20260721T124201Z base_url=http://toki-labs.com:18083/v1
[long-admission-smoke] === PREFLIGHT ===
run=20260721T124201Z
workdir=/config/workspace/iop
base_url=http://toki-labs.com:18083/v1
status_url=http://127.0.0.1:18001/edges/edge-toki-labs-dev/status status_ssh=<direct>
config=configs/edge.yaml

## source state
$ git -C /config/workspace/iop rev-parse HEAD
56767f8a35dced3681f1a46ab7b8e86204de6363
$ git -C /config/workspace/iop status --short
 M AGENTS.md
 M agent-ops/rules/common/rules.md
 M agent-ops/rules/project/rules.md
 M agent-ops/skills/common/_templates/implementation-user-review-request-section.md
 M agent-ops/skills/common/code-review/SKILL.md
 M agent-ops/skills/common/code-review/agents/openai.yaml
 M agent-ops/skills/common/finalize-task-routing/SKILL.md
 M agent-ops/skills/common/plan/SKILL.md
 M agent-ops/skills/common/plan/templates/review-stub-template.md
 M agent-ops/skills/common/router.md
 M apps/edge/internal/node/registry.go
 M apps/edge/internal/node/registry_test.go
 M apps/edge/internal/node/store.go
 M apps/edge/internal/service/model_queue_admission.go
 M apps/edge/internal/service/model_queue_admission_test.go
 M apps/edge/internal/service/model_queue_release.go
 M apps/edge/internal/service/model_queue_snapshot.go
 M apps/edge/internal/service/model_queue_types.go
 M apps/edge/internal/service/provider_pool.go
 M apps/edge/internal/service/provider_resolution.go
 M apps/edge/internal/service/provider_scheduling_advanced_test.go
 M apps/edge/internal/service/provider_tunnel.go
 M apps/edge/internal/service/queue_dispatch_test.go
 M apps/edge/internal/service/queue_reservation_test.go
 M apps/edge/internal/service/run_dispatch_internal_test.go
 M apps/edge/internal/service/run_submit.go
 M apps/edge/internal/service/service.go
 M apps/edge/internal/service/service_internal_test.go
 M apps/edge/internal/service/status_provider.go
 M apps/edge/internal/service/status_provider_test.go
 M apps/edge/internal/transport/connection_handlers.go
 M apps/edge/internal/transport/integration_test.go
 M apps/edge/internal/transport/server.go
 M apps/node/internal/bootstrap/module_test.go
 M apps/node/internal/bootstrap/runtime_supervisor.go
 M apps/node/internal/transport/client.go
 M apps/node/internal/transport/client_test.go
 M go.mod
 M packages/go/config/load.go
 M packages/go/config/node_config_test.go
 M packages/go/config/node_types.go
 M scripts/e2e-smoke.sh
?? agent-ops/skills/project/refine-local-plans/
?? agent-roadmap/phase/control-plane-portal-ops/
?? agent-task/archive/2026/07/m-provider-resource-admission-ownership-alignment/08_disconnect_exclusion/
?? agent-task/archive/2026/07/m-provider-resource-admission-ownership-alignment/09+08_terminal_unavailable_outcome/
?? agent-task/archive/2026/07/m-provider-resource-admission-ownership-alignment/10+08_configured_snapshot_catalog/
?? agent-task/archive/2026/07/m-provider-resource-admission-ownership-alignment/12_node_connectivity_supervision/
?? agent-task/archive/2026/07/m-provider-resource-admission-ownership-alignment/13+09_disconnect_queue_settlement/
?? agent-task/m-provider-resource-admission-ownership-alignment/

## config check
$ go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
OK configs/edge.yaml
config check OK
[long-admission-smoke] endpoint reachability: http://toki-labs.com:18083/v1/models
[long-admission-smoke]   BLOCKER: /models unreachable. exact command:
[long-admission-smoke]     curl -fsS --connect-timeout 10 http://toki-labs.com:18083/v1/models
[long-admission-smoke] status reachability: http://127.0.0.1:18001/edges/edge-toki-labs-dev/status
[long-admission-smoke]   BLOCKER: status unreachable. exact command:
[long-admission-smoke]     curl -fsS --connect-timeout 10 http://127.0.0.1:18001/edges/edge-toki-labs-dev/status
[long-admission-smoke] expected baseline: normal_capacity_total=9 long_slot_total=4
[long-admission-smoke] === PREFLIGHT BLOCKED (see out-dir; blockers are verification blockers, not user-review) ===
[long-admission-smoke] done rc=3 evidence=/tmp/iop-long-admission-smoke

exit code 3. Provider `/models`와 Control Plane status endpoint가 모두 unreachable하여 scenario는 실행되지 않았다. 두 endpoint가 동시에 reachable해지면 같은 preflight를 재실행하고 통과 후 live scenario를 실행한다.
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged and end the implementation execution. This filled file plus agent completion is the `review-ready` signal; do not create a separate handoff artifact, execute code-review, or switch roles in place.

## 섹션 소유권

| Section | Owner | Note |
|---------|-------|------|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify them; after filling its sections it ends its execution and runtime assigns a distinct review-agent instance, not a new turn/resume/role of the implementer; reviewer owns verdict, archive, complete.log, follow-up routing/materialization, and task-directory archive move |
| Roadmap Targets | Fixed at stub creation from plan when present | Implementing agent must not modify; code-review copies it into `complete.log` as `Roadmap Completion` only on PASS |
| Archive Evidence Snapshot | Fixed at stub creation from plan when present | Implementing agent uses it as default prior-loop context; read only the specific archive files cited there when more detail is required |
| Agent UI Completion | Mixed | Present only for plan-required agent-ui code work; implementing agent fills actual evidence, review agent applies `구현됨` status/evidence update on PASS and copies the section into `complete.log` |
| 구현 항목별 완료 여부 (item names) | Fixed at stub creation | Implementing agent checks `[ ]` → `[x]` only |
| 구현 체크리스트 (item text/order) | Fixed at stub creation from plan | Implementing agent checks `[ ]` → `[x]` only; final checkbox is mandatory before saving |
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify or check this section |
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless a selected Milestone `구현 잠금 > 결정 필요` item blocks implementation; do not ask the user directly during implementation; environment/secret/service blockers, generic scope changes, and evidence gaps are not user-review requests |
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Pre-filled from plan |
| 검증 결과 (section headings + commands) | Fixed at stub creation | Implementing agent fills in command output only; command changes require a `계획 대비 변경 사항` entry |
| 코드리뷰 결과 | Review agent appends | Not included in stub |

## 코드리뷰 결과

### 종합 판정

PASS

### 차원별 평가

| 차원 | 판정 | 근거 |
|------|------|------|
| correctness | Pass | 실제 first-generation long lease를 track한 뒤 exact generation으로 authoritative disconnect settlement를 수행하고, higher generation reconnect의 신규 lease만 counter에 반영되는 전이를 검증한다. |
| completeness | Pass | 계획의 lease → disconnect settlement → offline zero → reconnect → new admission/release 체크리스트와 구현 소유 섹션이 모두 완료됐다. |
| test coverage | Pass | targeted lifecycle regression, snapshot/offline/reconnect 묶음, service race, 전체 Edge race가 fresh `-count=1`로 통과했다. |
| API contract | Pass | wire/config schema를 변경하지 않고 기존 Service, Registry, provider-pool admission/release 경계를 사용한다. |
| code quality | Pass | 대상 회귀에 수동 resource counter 주입, debug-only branch, 미해결 TODO가 남지 않았고 lifecycle stage assertion이 분명하다. |
| implementation deviation | Pass | 기본 write set인 `status_provider_test.go`만 보강했고 corrected regression이 통과해 조건부 production source 수정을 추가하지 않았다. |
| verification trust | Pass | 리뷰어가 구현 기록과 동일한 targeted/snapshot/race 명령을 재실행해 성공 출력을 재현했다. long-admission preflight rc=3은 외부 endpoint 미가용 blocker로 정확히 기록됐으며 S14의 deterministic evidence를 대체하지 않는다. |

### 발견된 문제

없음

### 다음 단계

- PASS: `complete.log`를 작성하고 현재 pair와 split task directory를 2026/07 archive로 이동한다.
