<!-- task=m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke plan=0 tag=CAPACITY_SMOKE -->

# Plan - CAPACITY_SMOKE

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

이 task는 `01_input_estimator`, `02+01_long_capacity`, `03+02_queue_skip`, `04+01,02_status_logs`, `05+02_dev_runtime_policy`가 모두 PASS 완료된 뒤 시작한다. Dev smoke는 외부 provider pool 상태에 의존하므로 preflight, 실제 command, stdout/stderr, status snapshot evidence를 review stub에 남긴다. 외부 환경 blocker는 사용자 리뷰 요청이 아니다.

## 배경

Milestone의 마지막 evidence는 GX10, OneXPlayer, mac-mlx-vllm provider pool에서 normal 10-way, mixed long/normal, all-long-slot-full smoke를 수행하고 모든 counter가 0으로 회복되는 것을 확인하는 것이다. 이 작업은 그 smoke를 자동화하거나 문서화하고 실제 dev evidence를 남긴다.

## 사용자 리뷰 요청 흐름

사용자 리뷰 요청은 selected Milestone lock decision blocker만 active review stub에 기록한다. dev host 미접속, runtime down, port mismatch, secret 부재, smoke 실패는 검증 결과와 follow-up 대상이다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/model-group-long-context-admission.md`
- Task ids:
  - `capacity-smoke`: dev 환경 normal 10-way, mixed long/normal, all-long-slot-full queue 시나리오와 최종 회복 근거
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-roadmap/phase/operational-observability-provider-management/milestones/model-group-long-context-admission.md`
- `agent-roadmap/sdd/operational-observability-provider-management/model-group-long-context-admission/SDD.md`
- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/dev/rules.md`
- `agent-test/dev/edge-smoke.md`
- `agent-test/dev/node-smoke.md`
- `agent-test/dev/platform-common-smoke.md`
- `agent-test/dev/inventory.yaml`
- `agent-ops/skills/common/plan/SKILL.md`
- `configs/edge.yaml`
- `Makefile`

### SDD 기준

- SDD: `agent-roadmap/sdd/operational-observability-provider-management/model-group-long-context-admission/SDD.md`, 상태 `[승인됨]`.
- 대상 Acceptance: S09 / Milestone Task `capacity-smoke`.
- Evidence Map: dev smoke script/output and final recovery snapshot.
- 적용: smoke는 scenario별 stdout과 status snapshot 파일 경로를 review stub에 붙이는 것을 완료 조건으로 둔다.

### 테스트 환경 규칙

- 기본 local rules를 읽었고, dev provider pool smoke 때문에 `agent-test/dev/*`도 읽었다.
- 테스트 환경 프리플라이트:
  - runner/workdir: `/config/workspace/iop`.
  - source sync: 구현 시 `git status --short`, `git rev-parse HEAD` 기록.
  - config: `configs/edge.yaml`.
  - provider identities: `gx10-vllm`, `onexplayer-lemonade`, `mac-mlx-vllm`.
  - expected total general capacity from current dev docs: 9 (`gx10=4`, `onexplayer=3`, `mac=2`).
  - required status: Edge OpenAI-compatible endpoint and Control Plane/status endpoint reachable as documented by dev profiles.
  - if any host/process/port is unavailable, record exact failed command and do not turn it into user review.

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

- local unit tests cover estimator/admission/queue/status after predecessor tasks. They do not prove provider pool behavior with live runtimes.
- existing dev smoke documents normal capacity+1 but not mixed long/normal or all-long-slot-full. New smoke scenario script/profile needed.

### 심볼 참조

- renamed/removed symbol: none.
- new script/profile candidates: `scripts/e2e-long-context-admission-smoke.sh`, `agent-test/dev/long-context-admission-smoke.md`.

### 분할 판단

- shared task group: `agent-task/m-model-group-long-context-admission`.
- current subtask `06+01,02,03,04,05_capacity_smoke` depends on indices `01`, `02`, `03`, `04`, `05`.
- 작성 시점에 all predecessor `complete.log` files are missing. 구현 시작 전 active 또는 archived predecessor completions가 모두 필요하다.
- 이 plan은 evidence recovery가 외부 환경에 묶이므로 source implementation plans와 분리했다.

### 범위 결정 근거

- admission source bug fixing은 predecessor scope다. 이 task에서 smoke 실패가 source bug를 드러내면 review 결과에 follow-up plan을 남긴다.
- billing/usage ledger/quality routing은 범위 제외다.
- long prompt fixture는 synthetic text로 충분하며 tokenizer-perfect fixture는 만들지 않는다.

### 빌드 등급

- `cloud-G08`: live dev provider pool, concurrent requests, status polling, external runtime recovery evidence가 중심이다.

## 의존 관계 및 구현 순서

- `01_input_estimator` complete 필요.
- `02+01_long_capacity` complete 필요.
- `03+02_queue_skip` complete 필요.
- `04+01,02_status_logs` complete 필요.
- `05+02_dev_runtime_policy` complete 필요.

## 구현 체크리스트

- [ ] dev smoke profile/script를 추가하거나 기존 dev edge smoke에 long-context admission scenarios를 확장한다.
- [ ] preflight가 source state, config check, endpoint reachability, provider identities, current provider snapshots를 기록하게 한다.
- [ ] normal 10-way scenario를 실행하고 총 `in_flight=9`, `queued>=1` 관측 후 완료 시 `in_flight=0`, `queued=0`, `long_in_flight=0` 회복을 저장한다.
- [ ] mixed long/normal scenario를 실행해 long slot full 중 normal이 head-of-line blocking 없이 완료되는 evidence를 저장한다.
- [ ] all-long-slot-full scenario를 실행해 long requests가 queue 대기 후 slot 회복 시 dispatch되고 최종 counters가 0으로 회복되는 evidence를 저장한다.
- [ ] smoke stdout/stderr와 status snapshot 파일 경로를 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [CAPACITY_SMOKE-1] Long-context admission dev smoke

### 문제

- [agent-test/dev/edge-smoke.md](/config/workspace/iop/agent-test/dev/edge-smoke.md:126)는 provider capacity 총합+1 smoke를 기록하지만 S09의 mixed long/normal, all-long-slot-full 회복 evidence는 없다.
- live provider pool에서 `long_in_flight` 회복과 queue skip이 실제 status로 보이는지 확인해야 Milestone을 닫을 수 있다.

### 해결 방법

- `scripts/e2e-long-context-admission-smoke.sh`를 추가한다. 옵션은 `--preflight`, `--scenario normal-10`, `--scenario mixed`, `--scenario all-long-slot-full`, `--out-dir`.
- synthetic prompt fixtures는 script 내부에서 생성하거나 `/tmp`에 만들고 repo에 큰 fixture를 남기지 않는다.
- status polling은 Control Plane/Edge status endpoint에서 provider snapshots를 저장한다. unavailable이면 exact command/output을 blocker로 기록한다.
- `agent-test/dev/edge-smoke.md` 또는 새 `agent-test/dev/long-context-admission-smoke.md`에 command, expected counters, recovery criteria를 문서화한다.

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

- [ ] `scripts/e2e-long-context-admission-smoke.sh`
- [ ] `agent-test/dev/edge-smoke.md` 또는 `agent-test/dev/long-context-admission-smoke.md`
- [ ] 필요 시 `agent-test/dev/inventory.yaml`에 smoke endpoint/status selector 보강.

### 테스트 작성

- smoke script 자체는 shell syntax/preflight command로 검증한다.
- live scenario output이 required evidence다. unit test가 아니라 dev smoke로 완료한다.

### 중간 검증

```bash
bash -n scripts/e2e-long-context-admission-smoke.sh
bash scripts/e2e-long-context-admission-smoke.sh --preflight --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `scripts/e2e-long-context-admission-smoke.sh` | CAPACITY_SMOKE-1 |
| `agent-test/dev/edge-smoke.md` | CAPACITY_SMOKE-1 |
| `agent-test/dev/long-context-admission-smoke.md` | CAPACITY_SMOKE-1 |
| `agent-test/dev/inventory.yaml` | CAPACITY_SMOKE-1 |

## 최종 검증

```bash
git rev-parse HEAD
git status --short
go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
bash -n scripts/e2e-long-context-admission-smoke.sh
bash scripts/e2e-long-context-admission-smoke.sh --preflight --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
bash scripts/e2e-long-context-admission-smoke.sh --scenario normal-10 --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
bash scripts/e2e-long-context-admission-smoke.sh --scenario mixed --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
bash scripts/e2e-long-context-admission-smoke.sh --scenario all-long-slot-full --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
```

기대 결과: 모든 smoke command PASS. 각 scenario의 최종 snapshot은 `in_flight=0`, `queued=0`, `long_in_flight=0`을 보여야 한다. 출력과 snapshot 파일 경로를 review stub에 붙인다.

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