<!-- task=m-node-resource-model-unification/02+01_node_admission plan=2 tag=REVIEW_REVIEW_REFACTOR -->

# Node Admission CLI Capability Evidence Follow-up Plan

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

이 계획은 code-review FAIL 후속이다. 구현 뒤에는 반드시 `CODE_REVIEW-local-G02.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다. 구현 중 직접 사용자에게 질문하지 말고, 선택된 Milestone lock 결정만 review stub의 `사용자 리뷰 요청`에 기록한다. 이번 이슈는 사용자 리뷰 gate 대상이 아니며 repo-local test evidence 보강으로 해결한다. finalization, 로그 아카이브, `complete.log` 작성은 code-review-skill 전용이다.

## 배경

이 subtask는 Milestone `node-admission`의 SDD `S04` evidence를 닫아야 한다. 현재 CLI adapter 구현은 `MaxConcurrency: 0`으로 맞지만, 실제 CLI capability test가 그 값을 고정하지 않아 regression evidence로 신뢰하기 어렵다. 후속 범위는 CLI capability test assertion 추가와 검증 출력 갱신으로 제한한다.

## 사용자 리뷰 요청 흐름

선택된 Milestone의 구현 잠금은 해제되어 있으므로 사용자 리뷰 요청 기본값은 `없음`이다. 구현 중 selected Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 active review stub의 `사용자 리뷰 요청` 섹션을 채운다. 환경/secret/service 문제, 일반 범위 조정, 검증 증거 공백은 사용자 리뷰 요청이 아니며, 직접 질문이나 `request_user_input` 호출은 금지된다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/node-resource-model-unification.md`
- Task ids:
  - `node-admission`: Node admission global gate removal and resource capacity preservation
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-node-resource-model-unification/02+01_node_admission/plan_local_G04_1.log`
- Archived review: `agent-task/m-node-resource-model-unification/02+01_node_admission/code_review_local_G04_1.log`
- Prior archived plan: `agent-task/m-node-resource-model-unification/02+01_node_admission/plan_local_G06_0.log`
- Prior archived review: `agent-task/m-node-resource-model-unification/02+01_node_admission/code_review_local_G06_0.log`
- Verdict: FAIL
- Required summary: `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:761` calls actual CLI `Capabilities()` but does not assert `caps.MaxConcurrency == 0`, so SDD `S04` CLI unlimited evidence is not regression-protected.
- Affected files: `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go`
- Reviewer direct repairs already applied: stale adapter admission comments were updated in `apps/node/internal/node/run_manager.go` and `apps/node/internal/node/node_test.go`.
- Verification evidence: reviewer reran `go test -count=1 -run TestConfigRefreshFailedAdapterStartDoesNotRollbackConfig ./apps/node/internal/node` and `go test -count=1 -timeout 120s ./apps/node/...`; both passed, but SDD `S04` verification trust remains failed until actual CLI `MaxConcurrency=0` is asserted by test output.
- Roadmap carryover: `node-admission` Roadmap Completion still applies and must not be claimed until this follow-up provides CLI unlimited capability evidence plus existing provider capacity evidence.
- Allowed archive reread: if more context is needed, read only the four archived files listed in this snapshot.

## 분석 결과

### 읽은 파일

- `agent-task/m-node-resource-model-unification/02+01_node_admission/plan_local_G04_1.log`
- `agent-task/m-node-resource-model-unification/02+01_node_admission/code_review_local_G04_1.log`
- `agent-task/m-node-resource-model-unification/02+01_node_admission/plan_local_G06_0.log`
- `agent-task/m-node-resource-model-unification/02+01_node_admission/code_review_local_G06_0.log`
- `agent-roadmap/phase/operational-observability-provider-management/milestones/node-resource-model-unification.md`
- `agent-roadmap/sdd/operational-observability-provider-management/node-resource-model-unification/SDD.md`
- `agent-contract/inner/edge-node-runtime-wire.md`
- `agent-contract/inner/edge-config-runtime-refresh.md`
- `agent-test/local/rules.md`
- `agent-test/local/node-smoke.md`
- `apps/node/internal/adapters/cli/cli.go`
- `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go`
- `apps/node/internal/adapters/adapters_blackbox_test.go`
- `apps/node/internal/node/node.go`
- `apps/node/internal/node/run_manager.go`
- `apps/node/internal/node/node_test.go`
- `apps/node/internal/node/node_concurrency_integration_test.go`

### SDD 기준

- SDD: `agent-roadmap/sdd/operational-observability-provider-management/node-resource-model-unification/SDD.md`
- 상태: `[승인됨]`, SDD 잠금 `해제`, 사용자 리뷰 없음
- Targeted scenario: `S04` / Milestone Task `node-admission`
- Evidence Map: `CLI capability and provider capacity tests`, expected completion evidence is `node-admission` Roadmap Completion plus CLI unlimited/provider gate output.
- 이번 후속은 `S04` 중 CLI unlimited capability test evidence만 보강한다. Provider capacity evidence는 기존 node/openai/vllm/ollama capacity tests와 전체 `./apps/node/...` 검증으로 유지한다.

### 테스트 환경 규칙

- test_env: `local`
- Read: `agent-test/local/rules.md`
- Matched profile: `agent-test/local/node-smoke.md`
- Applied command baseline: changed node packages or `go test ./apps/node/...`
- Required commands for this narrow follow-up:
  - `go test -count=1 -run TestCapabilities_OnlyConfiguredProfiles ./apps/node/internal/adapters/cli`
  - `go test -count=1 -timeout 120s ./apps/node/...`
- No remote runner, Docker, field/bootstrap, or external provider preflight is needed.

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

- CLI adapter now returns `MaxConcurrency: 0`, but `TestCapabilities_OnlyConfiguredProfiles` only asserts configured targets. Existing tests would pass if CLI `MaxConcurrency` regressed to `4`.
- Provider adapter capacity tests exist in node/openai/vllm/ollama paths and are outside this follow-up.

### 심볼 참조

- No symbol rename or removal is required.
- Relevant search confirmed current implementation at `apps/node/internal/adapters/cli/cli.go:213` returns `MaxConcurrency: 0`.

### 분할 판단

이 task는 기존 split subtask `02+01_node_admission`의 후속 루프다. 새 sibling subtask를 만들지 않는다. 수정 범위는 단일 test assertion이므로 추가 split gate가 적용되지 않는다.

### 범위 결정 근거

`apps/node/internal/adapters/cli/cli.go` 동작은 현재 맞으므로 변경하지 않는다. Node admission runtime code와 provider adapter capacity tests도 다시 열지 않는다. 후속 범위는 CLI capability regression assertion과 해당 검증 출력 기록뿐이다.

### 빌드 등급

`local-G02`: 단일 테스트 파일에 assertion을 추가하는 bounded repo-local follow-up이며 deterministic Go tests로 검증 가능하다.

## 구현 체크리스트

- [ ] `TestCapabilities_OnlyConfiguredProfiles`에 실제 CLI `Capabilities()`의 `MaxConcurrency == 0` assertion을 추가한다.
- [ ] `go test -count=1 -run TestCapabilities_OnlyConfiguredProfiles ./apps/node/internal/adapters/cli`와 `go test -count=1 -timeout 120s ./apps/node/...`를 실행하고 실제 stdout/stderr를 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REFACTOR-1] Add CLI Unlimited Capability Assertion

**문제:** `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go:761`에서 actual CLI adapter `Capabilities()`를 호출하지만 `MaxConcurrency`를 검증하지 않는다. SDD `S04`는 CLI unlimited capability evidence를 요구하므로, `MaxConcurrency`가 `4`로 회귀해도 테스트가 통과하는 상태는 완료 evidence로 부족하다.

**해결 방법:** `TestCapabilities_OnlyConfiguredProfiles`에 `caps.MaxConcurrency == 0` assertion을 추가한다.

Before:

```go
caps, err := c.Capabilities(context.Background())
if err != nil {
    t.Fatalf("unexpected error: %v", err)
}
want := []string{"bar", "foo"}
```

After:

```go
caps, err := c.Capabilities(context.Background())
if err != nil {
    t.Fatalf("unexpected error: %v", err)
}
if caps.MaxConcurrency != 0 {
    t.Fatalf("expected unlimited MaxConcurrency 0, got %d", caps.MaxConcurrency)
}
want := []string{"bar", "foo"}
```

**수정 파일 및 체크리스트:**

- [ ] `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go` — `TestCapabilities_OnlyConfiguredProfiles`에 `MaxConcurrency == 0` assertion 추가

**테스트 작성:** 새 테스트 파일은 만들지 않는다. 기존 actual CLI `Capabilities()` test에 SDD `S04` assertion을 추가한다.

**중간 검증:**

```bash
go test -count=1 -run TestCapabilities_OnlyConfiguredProfiles ./apps/node/internal/adapters/cli
```

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go` | REVIEW_REVIEW_REFACTOR-1 |

## 최종 검증

```bash
go test -count=1 -run TestCapabilities_OnlyConfiguredProfiles ./apps/node/internal/adapters/cli
go test -count=1 -timeout 120s ./apps/node/...
```

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