---
test_env: dev
test_profile: long-context-admission-smoke
domain: edge
verification_type: smoke
last_rule_updated_at: 2026-07-24
---

# long-context-admission dev capacity smoke

## 읽기 조건

- Milestone `model-group-long-context-admission`의 SDD S09(`capacity-smoke`) evidence를 수집할 때
- long-context admission(입력 토큰 추정 기반 long slot 예약/해제, queue-skip, long slot full 회복)을 live dev provider pool로 확인할 때

## 적용 범위

- `scripts/e2e-long-context-admission-smoke.sh`
- Edge OpenAI-compatible 입력 표면(`/v1/chat/completions`) provider-pool dispatch
- Control Plane status `provider_snapshots` 회복 관측

## 분류

- domain: edge
- verification_type: smoke
- scope: dev provider pool long-context admission 시나리오와 최종 회복 근거

## 환경

- runner/workdir: 로컬 checkout 또는 원격 runner `ssh toki@toki-labs.com`의 `/Users/toki/agent-work/iop-dev`.
- provider pool 인벤토리: `agent-test/inventory-dev.yaml` (GX10 vLLM, OneXPlayer Lemonade, RTX 5090 vLLM, mac-mlx-vllm).
- Edge OpenAI-compatible base URL 후보: `http://toki-labs.com:18083/v1` (runner-local `http://127.0.0.1:18083/v1`).
- Control Plane status URL: `http://127.0.0.1:18001/edges/edge-toki-labs-dev/status` (runner-local; 다른 host에서는 `IOP_LONG_SMOKE_STATUS_SSH`로 ssh curl).
- 현재 모델 그룹별 capacity baseline:
  - `laguna-s:2.1`: `4` (`gx10-vllm=4`)
  - `ornith:35b`: `2` (`onexplayer-lemonade=1`, `rtx5090-lemonade=1`)
  - `qwen3.6:35b`: `2` (`mac-mlx-vllm=2`)
- 현재 모델 그룹별 long slot baseline:
  - `laguna-s:2.1`: `1` (`gx10-vllm=1`)
  - `ornith:35b`: `2` (`onexplayer-lemonade=1`, `rtx5090-lemonade=1`)
  - `qwen3.6:35b`: `1` (`mac-mlx-vllm=1`)
- `scripts/e2e-long-context-admission-smoke.sh`는 아직 이전 `qwen3.6:35b` 공용 풀(`gx10-vllm`, `onexplayer-lemonade`, `mac-mlx-vllm`)과 총 capacity `9`를 전제로 한다. 현재 dev에서 이 스크립트의 `normal-10`/`mixed`/`all-long-slot-full` 결과를 최신 Laguna-S 모델 그룹 evidence로 사용하지 않는다.
- credential: bearer token은 `IOP_LONG_SMOKE_TOKEN` 환경 변수로만 주입하고 명령/로그/tracked 파일에 원문을 남기지 않는다.
- repo override: script를 checkout 밖(`/tmp` 등)에서 실행하면 `IOP_LONG_SMOKE_REPO`로 `edge config check` 기준 repo root를 지정한다. 미지정 시 script 위치의 상위 디렉터리를 repo root로 본다.
- Edge binary override: runner에 `go` toolchain이 없으면 `IOP_LONG_SMOKE_EDGE_BIN`(예: `/Users/toki/agent-work/iop-dev/build/dev-runtime/bin/edge`)으로 prebuilt Edge binary를 지정해 `config check`를 수행한다. 미지정 시 `go run ./apps/edge/cmd/edge`를 사용한다.

## 명령

- syntax: `bash -n scripts/e2e-long-context-admission-smoke.sh`
- 아래 preflight 및 시나리오 명령은 스크립트를 모델 그룹별 provider/capacity projection을 받도록 갱신한 뒤 실행한다.
- preflight: `bash scripts/e2e-long-context-admission-smoke.sh --preflight --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
- normal capacity+1: `bash scripts/e2e-long-context-admission-smoke.sh --scenario normal-10 --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
- mixed: `bash scripts/e2e-long-context-admission-smoke.sh --scenario mixed --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
- all-long-slot-full: `bash scripts/e2e-long-context-admission-smoke.sh --scenario all-long-slot-full --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`

원격 runner에서 status가 runner-local일 때 예시:

```bash
IOP_LONG_SMOKE_BASE_URL=http://127.0.0.1:18083/v1 \
  bash scripts/e2e-long-context-admission-smoke.sh --scenario normal-10 --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke
```

## Runner temp-copy evidence 흐름

- local uncommitted/untracked script 변경은 clean runner checkout에 존재하지 않는다. 현재 변경분을 evidence로 쓰려면 실행 전 script를 runner temp 경로로 복사하거나 source를 먼저 sync한다. sync/복사 없이 runner checkout의 옛 script 출력을 현재 변경 evidence로 쓰지 않는다.
- temp-copy 예시 (runner에 `go`가 없으므로 prebuilt Edge binary override 사용):

```bash
ssh toki@toki-labs.com 'mkdir -p /tmp/iop-long-admission-smoke-runner'
scp scripts/e2e-long-context-admission-smoke.sh toki@toki-labs.com:/tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && \
  IOP_LONG_SMOKE_REPO=/Users/toki/agent-work/iop-dev \
  IOP_LONG_SMOKE_EDGE_BIN=/Users/toki/agent-work/iop-dev/build/dev-runtime/bin/edge \
  IOP_LONG_SMOKE_BASE_URL=http://127.0.0.1:18083/v1 \
  bash /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh --preflight --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke'
```

- preflight 출력의 `## source state`(runner HEAD/dirty)와 `## config check` 실제 명령 줄로 어느 source/binary 기준 evidence인지 함께 기록한다.

## 시나리오

- 선택한 단일 모델 그룹을 기준으로 실행한다. 모델 그룹이 다른 provider의 capacity를 합산하지 않는다.
- `normal capacity+1`: 선택 모델 그룹의 capacity보다 1개 많은 동시 요청을 보낸다. Laguna-S 기준 5개 요청에서 peak `in_flight=4`, `queued>=1` 관측 후 완료 시 `in_flight=0`, `queued=0`, `long_in_flight=0` 회복.
- `mixed`: 선택 모델 그룹의 long slot 총합만큼 long 요청으로 slot을 채운 뒤 normal 요청을 보낸다. Laguna-S 기준 long slot은 GX10의 `1`이다. long slot full 중에도 normal 요청이 head-of-line blocking 없이 dispatch/완료되고, 최종 counters가 0으로 회복.
- `all-long-slot-full`: 선택 모델 그룹의 long slot 총합보다 많은 long 요청(`slot_total + 2`)을 보내 일부가 queue 대기한 뒤 long slot 회복 시 dispatch되고, 최종 counters가 0으로 회복.

## 필수 검증

- preflight가 source state(`git rev-parse HEAD`, `git status --short`), config check(`edge config check`), base URL `/models` reachability, Control Plane status reachability, 선택 모델 그룹의 provider identity, 초기 provider snapshot을 기록한다. Laguna-S 선택 시 provider identity는 `gx10-vllm`만 포함해야 한다.
- 세 시나리오 각각에서 요청 발사 중 status를 poll해 peak `in_flight`/`queued`를 저장하고, 완료 후 최종 snapshot에서 `in_flight=0`, `queued=0` 회복을 확인한다.
- `mixed`에서 normal 요청 6개의 HTTP 성공으로 head-of-line blocking 부재를 확인한다.

## 판정 기준

- `normal capacity+1`: peak `in_flight`가 선택 모델 그룹의 capacity 총합에 도달하고 `queued>=1`, 완료 후 `in_flight=0`, `queued=0` 회복. Laguna-S 기준 capacity 총합은 `4`다.
- `mixed`: long slot이 찬 동안 normal 요청이 완료되고(HTTP 200), 최종 `in_flight=0`, `queued=0`, `long_in_flight=0` 회복.
- `all-long-slot-full`: long 요청 일부가 queue 대기(`long_queued>=1` 또는 dispatch log queue_reason=`long_context_capacity_full`) 후 slot 회복 시 dispatch되고 최종 counters 0 회복.
- Laguna-S 응답은 provider-native `reasoning` 필드를 포함할 수 있다. 현재 GX10 `<think>\n` template에서는 thinking-enabled 요청이 non-empty reasoning을 내보내므로 HTTP 성공과 counter 회복을 우선 판정하되, 별도 think smoke에서 `high`/`off` event 대조를 확인하고 strict exact-match는 쓰지 않는다.

## Control Plane status view 관측 한계

- 현재 Control Plane HTTP status view(`apps/control-plane/cmd/control-plane/http_views.go`의 `providerSnapshotView`)는 `in_flight`, `queued`, `capacity`, `health`만 노출하고 `long_in_flight`, `long_queued`, `long_context_capacity`는 제외한다. proto `ProviderSnapshot`과 Edge relay에는 값이 존재한다.
- 따라서 `long_in_flight`/`long_queued` 회복은 status view만으로 직접 관측되지 않을 수 있다. 이때는 Edge dispatch log의 `context_class`, `queue_reason`(`long_context_capacity_full`)로 long-slot 예약/대기/회복을 재구성한다.
- script는 status JSON에 long 필드가 있으면 자동 사용하고, 없으면 `n/a`로 표시하며 log 기반 확인을 안내한다. Control Plane status view에 long 필드를 노출하는 것은 별도 follow-up 후보다.

## 차단 기준

- dev host, Edge OpenAI-compatible endpoint, Control Plane status URL 접근이 불가능하다.
- provider pool node 중 하나 이상이 미연결/unhealthy다.
- smoke script가 선택 모델 그룹과 provider/capacity projection을 지원하지 않는다. 현재 script의 이전 Qwen 공용 풀 가정은 Laguna-S evidence 수집 blocker다.
- 위 실패는 검증 blocker이며 사용자 리뷰 요청이 아니다. 실패한 정확한 명령을 보고 항목에 남긴다.

## 보고 항목

- 실행한 명령:
- 성공한 검증:
- 실패/차단된 검증(정확한 명령 포함):
- 생략 사유:
- 남은 위험:

## 금지 사항

- secret, token, 개인 endpoint 원문은 tracked 파일에 기록하지 않는다.
- 대용량 long prompt fixture를 repo에 커밋하지 않는다. synthetic prompt는 `--out-dir`(`/tmp` 등)에만 생성한다.
- 기본 `configs/*.yaml`을 검증용 임시값으로 오염시키지 않는다.
