iop/agent-test/dev/long-context-admission-smoke.md

7.7 KiB

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

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/dev/inventory.yaml (GX10 vLLM, OneXPlayer Lemonade, 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: normal 총합 9 (gx10=4, onexplayer=3, mac=2).
  • long slot baseline: 총합 4 (gx10=1, onexplayer=2, mac=1).
  • credential: bearer token은 IOP_LONG_SMOKE_TOKEN 환경 변수로만 주입하고 명령/로그/tracked 파일에 원문을 남기지 않는다.
  • repo override: script를 checkout 밖(/tmp 등)에서 실행하면 IOP_LONG_SMOKE_REPOedge 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: bash scripts/e2e-long-context-admission-smoke.sh --preflight --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke
  • normal-10: 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일 때 예시:

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 사용):
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인지 함께 기록한다.

시나리오

  • normal-10: /v1/chat/completions에 10개 동시 요청(capacity 총합 9 + 1). peak in_flight=9, queued>=1 관측 후 완료 시 in_flight=0, queued=0, long_in_flight=0 회복.
  • mixed: long slot 총합(4)만큼 long 요청으로 long slot을 채우고 그 뒤에 normal 요청 6개를 보낸다. 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(gx10-vllm, onexplayer-lemonade, mac-mlx-vllm), 초기 provider snapshot을 기록한다.
  • 세 시나리오 각각에서 요청 발사 중 status를 poll해 peak in_flight/queued를 저장하고, 완료 후 최종 snapshot에서 in_flight=0, queued=0 회복을 확인한다.
  • mixed에서 normal 요청 6개의 HTTP 성공으로 head-of-line blocking 부재를 확인한다.

판정 기준

  • normal-10: peak in_flight가 capacity 총합(9)에 도달하고 queued>=1, 완료 후 in_flight=0, queued=0 회복.
  • 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 회복.
  • Qwen provider-pool 응답은 thinking/reasoning 텍스트를 포함할 수 있다. HTTP 성공과 counter 회복으로 판정하고 strict exact-match는 쓰지 않는다.

Control Plane status view 관측 한계

  • 현재 Control Plane HTTP status view(apps/control-plane/cmd/control-plane/http_views.goproviderSnapshotView)는 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다.
  • 위 실패는 검증 blocker이며 사용자 리뷰 요청이 아니다. 실패한 정확한 명령을 보고 항목에 남긴다.

보고 항목

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

금지 사항

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