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

# Code Review Reference - REVIEW_REVIEW_CAPACITY_SMOKE

> **[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, then stop with active files in place and report ready for review.
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps that a follow-up agent can close are normal follow-up issues, not user-review blockers by themselves.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record only Milestone lock decisions in `사용자 리뷰 요청` and stop for code-review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-07-05
task=m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke, plan=2, tag=REVIEW_REVIEW_CAPACITY_SMOKE

## 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

## Archive Evidence Snapshot

- Current archived plan: `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/plan_cloud_G08_1.log`
- Current archived review: `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_1.log`
- Verdict: FAIL
- Required summary:
  - live dev provider pool preflight and `normal-10`, `mixed`, `all-long-slot-full` rerun evidence is missing.
  - archived review lines `70`, `77`, and `241` show `Trusted S09 evidence rerun` unchecked and scenario execution blocked before request dispatch.
  - blockers recorded: remote `IOP_LONG_SMOKE_TOKEN` unset, runner `go` absent, and local untracked smoke script not present in the clean runner checkout.
- Affected files:
  - `scripts/e2e-long-context-admission-smoke.sh`
  - `agent-test/dev/long-context-admission-smoke.md`
  - `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/CODE_REVIEW-cloud-G08.md`
- Verification evidence from review:
  - `bash -n scripts/e2e-long-context-admission-smoke.sh`: PASS.
  - `go run ./apps/edge/cmd/edge config check --config configs/edge.yaml`: PASS.
  - deterministic local mock regression: bad config preflight returned non-zero and HTTP 500 + zero peak returned non-zero.
  - live partial status snapshot: provider identities healthy and total normal capacity `9`, but live request scenarios were not run.
- Allowed narrow reread:
  - `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_1.log`
  - `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/plan_cloud_G08_1.log`

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

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

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

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G08.md` -> `code_review_cloud_G08_N.log`, `PLAN-cloud-G08.md` -> `plan_cloud_G08_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
4. PASS이고 task group이 `m-model-group-long-context-admission`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_REVIEW_CAPACITY_SMOKE-1] Runner config-check path | [x] |
| [REVIEW_REVIEW_CAPACITY_SMOKE-2] Dev smoke doc update | [x] |
| [REVIEW_REVIEW_CAPACITY_SMOKE-3] Trusted S09 live evidence rerun | [x] |

## 구현 체크리스트

- [x] `scripts/e2e-long-context-admission-smoke.sh`가 `go run`이 없는 runner에서도 prebuilt Edge binary로 `config check`를 실행할 수 있게 보강한다.
- [x] `agent-test/dev/long-context-admission-smoke.md`에 prebuilt Edge binary override와 runner temp-copy evidence 흐름을 문서화한다.
- [x] local quick check와 deterministic local mock regression을 다시 실행해 script exit contract가 유지되는지 검증한다.
- [x] runner preflight를 수행하고 token presence, source/script availability, Edge binary/config check, endpoint reachability, provider health/capacity를 실제 stdout/stderr로 기록한다.
- [x] live dev provider pool에서 preflight와 `normal-10`, `mixed`, `all-long-slot-full`을 실행하고 actual stdout/stderr 또는 exact output file/status snapshot/Edge log evidence를 review stub에 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

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

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G08_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G08_M.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-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/`를 `agent-task/archive/YYYY/MM/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-model-group-long-context-admission`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-model-group-long-context-admission/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G08.md`와 `CODE_REVIEW-cloud-G08.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] 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로 이동한다.

## 계획 대비 변경 사항

- **원격 token 주입 방식 대체**: plan의 중간/최종 검증 명령은 runner 환경에 `IOP_LONG_SMOKE_TOKEN`이 이미 export되어 있다고 가정(`test -n "${IOP_LONG_SMOKE_TOKEN:-}"`)했지만, 실제 runner는 비대화형/login shell 모두 unset이었다(이전 루프 blocker와 동일). Edge OpenAI 표면은 `401`로 token 필수임을 확인했고, token 원본이 runner-local `build/dev-runtime/edge.yaml`의 `openai.bearer_token`에 있으므로 원격 shell 안에서만 `awk`로 추출해 `IOP_LONG_SMOKE_TOKEN`으로 export한 뒤 script를 실행했다. token 값은 stdout/stderr/tracked 파일 어디에도 출력되지 않는다(dev 규칙 "token/secret 원문은 원격 환경에서 주입" 준수). 대체 명령 원형:
  ```bash
  ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && IOP_LONG_SMOKE_TOKEN="$(awk '\''/^openai:/{ib=1;next} ib&&/^[^[:space:]]/{ib=0} ib&&$1=="bearer_token:"{v=$2;gsub(/"/,"",v);print v;exit}'\'' build/dev-runtime/edge.yaml)" && test -n "$IOP_LONG_SMOKE_TOKEN" && export IOP_LONG_SMOKE_TOKEN && IOP_LONG_SMOKE_REPO=... IOP_LONG_SMOKE_EDGE_BIN=... IOP_LONG_SMOKE_BASE_URL=http://127.0.0.1:18083/v1 IOP_LONG_SMOKE_LONG_CHARS=384000 bash /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh <mode> --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke'
  ```
- **bash 3.2 호환 수정 추가**: 첫 live preflight에서 runner macOS bash `3.2.57`이 `mapfile`(bash 4+)을 지원하지 않아 `mapfile: command not found` + `AUTH[@]: unbound variable`로 실패했다. plan 항목 1의 "runner 실행 경로 보정" 범위에서 `auth_header_args`/`mapfile` 조합을 전역 `AUTH_ARGS` 배열 + `${AUTH_ARGS[@]+"${AUTH_ARGS[@]}"}` idiom으로 교체했다(빈 배열이 bash 3.2 `set -u`에서도 안전). token 노출 특성은 기존과 동일하다(curl argv로 전달).
- **mock regression 확장**: plan의 deterministic local mock regression 2건에 더해, 새 `IOP_LONG_SMOKE_EDGE_BIN` 경로의 양성(빌드된 binary로 preflight PASS + preflight 출력에 실제 명령 기록)과 음성(존재하지 않는 binary 경로 → preflight 실패) 검증을 추가로 수행했다. 기존 2건 계약은 그대로 유지·통과.

## 주요 설계 결정

- `IOP_LONG_SMOKE_EDGE_BIN` override는 preflight의 `config check` 실행 명령만 바꾼다. 설정 시 `"$EDGE_BIN" config check --config "$CONFIG"`를 `REPO_ROOT`에서 실행하고, 미설정 시 기존 `go run ./apps/edge/cmd/edge config check` 동작을 그대로 유지한다. binary가 존재하지 않거나 실행 불가면 `edge binary not executable: <path>`를 config check 실패로 기록해 preflight blocker(rc=3)로 이어진다.
- preflight 출력의 `## config check` 아래에 실제 실행 명령(`${cfg_cmd[*]}`)을 그대로 기록해, evidence만 보고도 `go run` 경로인지 prebuilt binary 경로인지 구분되게 했다. token은 어떤 명령 echo에도 포함되지 않는다.
- runner 호환성: script는 dev runner의 기본 bash(macOS 3.2)에서 실행 가능해야 하므로 bash-4 전용 builtin(`mapfile`)을 제거하고 주석으로 재도입 금지를 남겼다. usage의 `sed -n` 범위는 header 주석 2줄 추가에 맞춰 `3,54p`로 보정했다.
- 문서(`agent-test/dev/long-context-admission-smoke.md`)에는 override 환경 변수 2종(`IOP_LONG_SMOKE_REPO`, `IOP_LONG_SMOKE_EDGE_BIN`)과 "local untracked script는 runner temp 경로로 복사/sync 후에만 현재 변경 evidence로 인정" 흐름을 명시하고, preflight의 `## source state`/`## config check` 줄로 어느 source/binary 기준인지 함께 기록하도록 했다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._

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

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

- runner에 `go`가 없어도 script preflight가 prebuilt Edge binary override로 `config check`를 수행할 수 있어야 한다.
- token value must not appear in tracked files or review output.
- live evidence must include actual stdout/stderr or exact output file paths for preflight, `normal-10`, `mixed`, and `all-long-slot-full`.
- final status snapshots must show `in_flight=0`, `queued=0`; when long fields are absent, Edge dispatch log evidence must include `context_class` and `queue_reason="long_context_capacity_full"`.
- SDD S09 evidence must be sufficient for `capacity-smoke` Roadmap Completion on PASS.

## 검증 결과

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.

### REVIEW_REVIEW_CAPACITY_SMOKE-1 중간 검증
```bash
$ bash -n scripts/e2e-long-context-admission-smoke.sh
(no output; exit 0)
$ go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
OK configs/edge.yaml
```

### REVIEW_REVIEW_CAPACITY_SMOKE-2 중간 검증
```bash
$ rg --sort path -n "IOP_LONG_SMOKE_(REPO|EDGE_BIN)|long-context-admission" agent-test/dev/long-context-admission-smoke.md
3:test_profile: long-context-admission-smoke
9:# long-context-admission dev capacity smoke
13:- Milestone `model-group-long-context-admission`의 SDD S09(`capacity-smoke`) evidence를 수집할 때
18:- `scripts/e2e-long-context-admission-smoke.sh`
37:- repo override: script를 checkout 밖(`/tmp` 등)에서 실행하면 `IOP_LONG_SMOKE_REPO`로 `edge config check` 기준 repo root를 지정한다. 미지정 시 script 위치의 상위 디렉터리를 repo root로 본다.
38:- 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`를 사용한다.
42:- syntax: `bash -n scripts/e2e-long-context-admission-smoke.sh`
43:- preflight: `bash scripts/e2e-long-context-admission-smoke.sh --preflight --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
44:- normal-10: `bash scripts/e2e-long-context-admission-smoke.sh --scenario normal-10 --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
45:- mixed: `bash scripts/e2e-long-context-admission-smoke.sh --scenario mixed --config configs/edge.yaml --out-dir /tmp/iop-long-admission-smoke`
46:- 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`
52:  bash scripts/e2e-long-context-admission-smoke.sh --scenario normal-10 --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke
62:scp scripts/e2e-long-context-admission-smoke.sh toki@toki-labs.com:/tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh
64:  IOP_LONG_SMOKE_REPO=/Users/toki/agent-work/iop-dev \
65:  IOP_LONG_SMOKE_EDGE_BIN=/Users/toki/agent-work/iop-dev/build/dev-runtime/bin/edge \
67:  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'
```

### REVIEW_REVIEW_CAPACITY_SMOKE-3 중간 검증
```bash
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git rev-parse HEAD && git status --short && test -x build/dev-runtime/bin/edge && build/dev-runtime/bin/edge config check --config build/dev-runtime/edge.yaml && test -n "${IOP_LONG_SMOKE_TOKEN:-}" && curl -fsS --connect-timeout 8 -o /dev/null -w "models_http=%{http_code}\n" -H "Authorization: Bearer ${IOP_LONG_SMOKE_TOKEN}" http://127.0.0.1:18083/v1/models'
2d08d240d48a954df6847df2ba08fb8b39fc3f7d
OK build/dev-runtime/edge.yaml
# exit=1: git state clean(2d08d24), edge binary 실행 가능, config check OK까지 통과 후
# `test -n "${IOP_LONG_SMOKE_TOKEN:-}"`에서 중단. runner env에 token이 export되어 있지 않음
# (비대화형/login shell 모두 unset 확인). 아래 대체 검증으로 token 주입 경로를 확보했다.

# 대체 검증 1: runner edge.yaml의 openai.bearer_token presence + 인증 reachability (token 미출력)
$ ssh toki@toki-labs.com 'tok="$(awk ...openai bearer_token 추출... build/dev-runtime/edge.yaml)"; if [ -n "$tok" ]; then echo "openai_bearer_token=present"; curl -fsS --connect-timeout 8 -o /dev/null -w "models_auth_http=%{http_code}\n" -H "Authorization: Bearer ${tok}" http://127.0.0.1:18083/v1/models; fi'
openai_bearer_token=present
models_auth_http=200

# 참고: 무인증 요청은 401 (token 필수 확인)
$ ssh toki@toki-labs.com 'curl -fsS --connect-timeout 8 -o /dev/null -w "models_noauth_http=%{http_code}\n" http://127.0.0.1:18083/v1/models'
models_noauth_http=401
curl: (22) The requested URL returned error: 401

# runner bash 버전 (mapfile 미지원 → script bash 3.2 호환 수정 근거)
$ ssh toki@toki-labs.com 'bash --version | head -1'
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin25)
```

### 최종 검증

아래 4개 ssh 명령의 `test -n "${IOP_LONG_SMOKE_TOKEN:-}"` 부분은 runner env에 token이 없어 `계획 대비 변경 사항`의 원격 token 주입 prefix(`IOP_LONG_SMOKE_TOKEN="$(awk ... build/dev-runtime/edge.yaml)" && test -n "$IOP_LONG_SMOKE_TOKEN" && export IOP_LONG_SMOKE_TOKEN`)로 대체 실행했다. 나머지 인자/환경 변수는 계약 그대로다.

```bash
$ git rev-parse HEAD
2d08d240d48a954df6847df2ba08fb8b39fc3f7d
$ git status --short
 M agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/CODE_REVIEW-cloud-G08.md
 M agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/PLAN-cloud-G08.md
 M agent-test/dev/edge-smoke.md
?? agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_0.log
?? agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_1.log
?? agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/plan_cloud_G08_0.log
?? agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/plan_cloud_G08_1.log
?? agent-test/dev/long-context-admission-smoke.md
?? scripts/e2e-long-context-admission-smoke.sh
$ go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
OK configs/edge.yaml
$ bash -n scripts/e2e-long-context-admission-smoke.sh
(no output; exit 0)
$ <deterministic local mock regression from PLAN-cloud-G08.md (plan_cloud_G08_1.log:214-239 원형 + EDGE_BIN 확장)>
bad config failed as expected
http failure failed as expected
edge-bin preflight passed as expected
edge-bin command recorded in preflight output
missing edge-bin failed as expected
mock regression overall rc=0
$ ssh toki@toki-labs.com 'mkdir -p /tmp/iop-long-admission-smoke-runner'
(no output; exit 0)
$ scp scripts/e2e-long-context-admission-smoke.sh toki@toki-labs.com:/tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh
(no output; exit 0. bash 3.2 수정 후 재배포 checksum 로컬/runner 동일: ae74ae4f00dee4ed4cdbe51f6b29cc190c6f38368bd80d1104526c5bb90bb649)
$ ssh toki@toki-labs.com 'chmod +x /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh'
(no output; exit 0)
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && test -n "${IOP_LONG_SMOKE_TOKEN:-}" && 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 IOP_LONG_SMOKE_LONG_CHARS=384000 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'
[long-admission-smoke] out-dir=/tmp/iop-long-admission-smoke run=20260705T221507Z base_url=http://127.0.0.1:18083/v1
[long-admission-smoke] === PREFLIGHT ===
run=20260705T221507Z
workdir=/Users/toki/agent-work/iop-dev
base_url=http://127.0.0.1:18083/v1
status_url=http://127.0.0.1:18001/edges/edge-toki-labs-dev/status status_ssh=<direct>
config=build/dev-runtime/edge.yaml

## source state
$ git -C /Users/toki/agent-work/iop-dev rev-parse HEAD
2d08d240d48a954df6847df2ba08fb8b39fc3f7d
$ git -C /Users/toki/agent-work/iop-dev status --short

## config check
$ /Users/toki/agent-work/iop-dev/build/dev-runtime/bin/edge config check --config build/dev-runtime/edge.yaml
OK build/dev-runtime/edge.yaml
config check OK
[long-admission-smoke] endpoint reachability: http://127.0.0.1:18083/v1/models
[long-admission-smoke]   /models OK
    model=qwen3.6:35b
[long-admission-smoke] status reachability: http://127.0.0.1:18001/edges/edge-toki-labs-dev/status
[long-admission-smoke]   status OK -> /tmp/iop-long-admission-smoke/preflight_status_20260705T221507Z.json
  provider=mac-mlx-vllm capacity=2 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=gx10-vllm capacity=4 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=onexplayer-lemonade capacity=3 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  TOTAL in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a
[long-admission-smoke]   provider present+healthy: gx10-vllm
[long-admission-smoke]   provider present+healthy: onexplayer-lemonade
[long-admission-smoke]   provider present+healthy: mac-mlx-vllm
[long-admission-smoke]   capacity total OK: 9 (== 9)
[long-admission-smoke]   NOTE: status view does not expose long_in_flight/long_queued; long-slot recovery must be read from Edge dispatch logs (context_class/queue_reason) or a follow-up that adds long fields to the Control Plane status view.
[long-admission-smoke] expected baseline: normal_capacity_total=9 long_slot_total=4
[long-admission-smoke] === PREFLIGHT OK ===
[long-admission-smoke] done rc=0 evidence=/tmp/iop-long-admission-smoke
(exit 0)
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && test -n "${IOP_LONG_SMOKE_TOKEN:-}" && 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 IOP_LONG_SMOKE_LONG_CHARS=384000 bash /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh --scenario normal-10 --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke'
[long-admission-smoke] out-dir=/tmp/iop-long-admission-smoke run=20260705T221603Z base_url=http://127.0.0.1:18083/v1
[long-admission-smoke] === SCENARIO normal-10 (expect peak in_flight>=9, queued>=1) ===
[long-admission-smoke] normal-10: firing 10 normal request(s) to http://127.0.0.1:18083/v1/chat/completions
label=normal-10 samples=6
peak_in_flight=9
peak_queued=3
peak_long_in_flight=n/a (Control Plane status view does not expose long fields)
peak_long_queued=n/a (Control Plane status view does not expose long fields)
[long-admission-smoke] normal-10: normal http_200=10/10
[long-admission-smoke] normal-10: peak peak_in_flight=9 (-ge 9) OK
[long-admission-smoke] normal-10: peak peak_queued=3 (-ge 1) OK
[long-admission-smoke] normal-10 final snapshot:
  provider=mac-mlx-vllm capacity=2 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=gx10-vllm capacity=4 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=onexplayer-lemonade capacity=3 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  TOTAL in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a
[long-admission-smoke] normal-10: long_in_flight/long_queued not exposed by status view; verify recovery via Edge dispatch logs (context_class/queue_reason).
[long-admission-smoke] normal-10: recovery OK (in_flight=0, queued=0)
[long-admission-smoke] done rc=0 evidence=/tmp/iop-long-admission-smoke
(exit 0)
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && test -n "${IOP_LONG_SMOKE_TOKEN:-}" && 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 IOP_LONG_SMOKE_LONG_CHARS=384000 bash /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh --scenario mixed --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke'
[long-admission-smoke] out-dir=/tmp/iop-long-admission-smoke run=20260705T221633Z base_url=http://127.0.0.1:18083/v1
[long-admission-smoke] === SCENARIO mixed (long slots held; normal must not head-of-line block) ===
[long-admission-smoke] synthetic long prompt: 384000 chars -> /tmp/iop-long-admission-smoke/long_prompt_20260705T221633Z.txt
[long-admission-smoke] synthetic long prompt: 384000 chars -> /tmp/iop-long-admission-smoke/long_prompt_20260705T221633Z.txt
[long-admission-smoke] synthetic long prompt: 384000 chars -> /tmp/iop-long-admission-smoke/long_prompt_20260705T221633Z.txt
[long-admission-smoke] synthetic long prompt: 384000 chars -> /tmp/iop-long-admission-smoke/long_prompt_20260705T221633Z.txt
label=mixed samples=113
peak_in_flight=6
peak_queued=0
peak_long_in_flight=n/a (Control Plane status view does not expose long fields)
peak_long_queued=n/a (Control Plane status view does not expose long fields)
[long-admission-smoke] mixed: long http_200=4/4 normal http_200=6/6 (head-of-line blocking would show normal stalling behind full long slots)
[long-admission-smoke] mixed: long_in_flight not exposed by status view; capture Edge dispatch log (context_class) as review evidence.
[long-admission-smoke] mixed final snapshot:
  provider=mac-mlx-vllm capacity=2 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=gx10-vllm capacity=4 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=onexplayer-lemonade capacity=3 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  TOTAL in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a
[long-admission-smoke] mixed: long_in_flight/long_queued not exposed by status view; verify recovery via Edge dispatch logs (context_class/queue_reason).
[long-admission-smoke] mixed: recovery OK (in_flight=0, queued=0)
[long-admission-smoke] done rc=0 evidence=/tmp/iop-long-admission-smoke
(exit 0)
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && test -n "${IOP_LONG_SMOKE_TOKEN:-}" && 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 IOP_LONG_SMOKE_LONG_CHARS=384000 bash /tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh --scenario all-long-slot-full --config build/dev-runtime/edge.yaml --out-dir /tmp/iop-long-admission-smoke'
[long-admission-smoke] out-dir=/tmp/iop-long-admission-smoke run=20260705T222235Z base_url=http://127.0.0.1:18083/v1
[long-admission-smoke] === SCENARIO all-long-slot-full (fire 6 long > 4 slots; expect queue then dispatch) ===
[long-admission-smoke] all-long-slot-full: firing 6 long request(s) to http://127.0.0.1:18083/v1/chat/completions
[long-admission-smoke] synthetic long prompt: 384000 chars -> /tmp/iop-long-admission-smoke/long_prompt_20260705T222235Z.txt
(동일 라인 5회 반복 생략: 병렬 요청들이 같은 prompt 파일 생성을 각자 로그)
label=all-long-slot-full samples=98
peak_in_flight=4
peak_queued=6
peak_long_in_flight=n/a (Control Plane status view does not expose long fields)
peak_long_queued=n/a (Control Plane status view does not expose long fields)
[long-admission-smoke] all-long-slot-full: long http_200=6/6
[long-admission-smoke] all-long-slot-full: peak peak_in_flight=4 (-le 4) OK
[long-admission-smoke] all-long-slot-full: peak peak_queued=6 (-ge 1) OK
[long-admission-smoke] all-long-slot-full: long_queued not exposed by status view; capture Edge dispatch log (queue_reason=long_context_capacity_full) as review evidence.
[long-admission-smoke] all-long-slot-full final snapshot:
  provider=mac-mlx-vllm capacity=2 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=gx10-vllm capacity=4 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  provider=onexplayer-lemonade capacity=3 in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a health=healthy
  TOTAL in_flight=0 queued=0 long_in_flight=n/a long_queued=n/a
[long-admission-smoke] all-long-slot-full: long_in_flight/long_queued not exposed by status view; verify recovery via Edge dispatch logs (context_class/queue_reason).
[long-admission-smoke] all-long-slot-full: recovery OK (in_flight=0, queued=0)
[long-admission-smoke] done rc=0 evidence=/tmp/iop-long-admission-smoke
(exit 0)
```

### Edge dispatch log evidence (long classification / queue reason)

Control Plane status view가 long 필드를 노출하지 않으므로(`agent-test/dev/long-context-admission-smoke.md`의 관측 한계), long-slot 예약/대기/회복은 runner의 Edge dispatch log로 확인했다.

- log path (runner): `/Users/toki/agent-work/iop-dev/build/dev-runtime/bin/logs/edge.log` (Edge PID 3527, `./bin/edge --config edge.yaml serve`가 open 중인 파일을 `lsof`로 확인)
- 이번 세션 window: 시나리오 시작 전 line `212423` 이후 → 종료 후 line `212501`. window 내 `context_class` 매칭 16+10건, 그중 `"context_class":"long"` 10건(mixed 4 + all-long-slot-full 6), `long_context_capacity_full` 2건.

normal-10 window 발췌 (`context_class":"normal"` dispatch, capacity 초과 1건은 `queue_reason":"capacity_full"` 후 재dispatch):

```json
{"ts":1783289763.371955,"msg":"openai chat completion dispatch","run_id":"manual-1783289763371607000","node_id":"gx10-vllm-node","adapter":"gx10-vllm","estimated_input_tokens":15,"context_class":"normal","queue_reason":"dispatched"}
{"ts":1783289767.179019,"msg":"openai chat completion dispatch","run_id":"manual-1783289767178800000","node_id":"gx10-vllm-node","adapter":"gx10-vllm","estimated_input_tokens":15,"context_class":"normal","queue_reason":"capacity_full"}
{"ts":1783289793.426454,"msg":"openai chat completion dispatch","run_id":"manual-1783289793426344000","node_id":"gx10-vllm-node","adapter":"gx10-vllm","estimated_input_tokens":15,"context_class":"normal","queue_reason":"dispatched"}
```

mixed window 발췌: long 4건이 `estimated_input_tokens=120018`, `context_class":"long"`으로 dispatch, provider 분포 gx10=1 / onexplayer=2 / mac=1 (long slot baseline과 동일):

```json
{"ts":1783289851.4141288,"run_id":"manual-1783289851413390000","node_id":"gx10-vllm-node","adapter":"gx10-vllm","estimated_input_tokens":120018,"context_class":"long","queue_reason":"dispatched"}
{"ts":1783289851.489273,"run_id":"manual-1783289851488820000","node_id":"onexplayer-lemonade-node","adapter":"onexplayer-lemonade","estimated_input_tokens":120018,"context_class":"long","queue_reason":"dispatched"}
{"ts":1783289851.5138822,"run_id":"manual-1783289851513167000","node_id":"mac-codex-node","adapter":"mac-mlx-vllm","estimated_input_tokens":120018,"context_class":"long","queue_reason":"dispatched"}
{"ts":1783289851.575644,"run_id":"manual-1783289851573399000","node_id":"onexplayer-lemonade-node","adapter":"onexplayer-lemonade","estimated_input_tokens":120018,"context_class":"long","queue_reason":"dispatched"}
```

all-long-slot-full window 발췌: 6 long 중 2건이 `queue_reason":"long_context_capacity_full"`로 대기 후, slot 회복 시 완료 출력(`chat_handler.go:324`)까지 도달 (HTTP 200 6/6과 일치):

```json
{"ts":1783290240.395453,"run_id":"manual-1783290240386434000","node_id":"gx10-vllm-node","adapter":"gx10-vllm","estimated_input_tokens":120018,"context_class":"long","queue_reason":"long_context_capacity_full"}
{"ts":1783290253.208964,"run_id":"manual-1783290253201645000","node_id":"onexplayer-lemonade-node","adapter":"onexplayer-lemonade","estimated_input_tokens":120018,"context_class":"long","queue_reason":"long_context_capacity_full"}
{"ts":1783290258.675044,"msg":"openai chat completion output","run_id":"manual-1783290240386434000","content_len":135,"reasoning_len":1836}
{"ts":1783290294.1531572,"msg":"openai chat completion output","run_id":"manual-1783290253201645000","content_len":111,"reasoning_len":4120}
```

### 저장된 evidence 경로 (runner)

현재 run stamp 기준 (`20260705T221507Z` preflight, `20260705T221603Z` normal-10, `20260705T221633Z` mixed, `20260705T222235Z` all-long-slot-full; 같은 디렉터리의 `20260705T1211xxZ`/`121538Z` 파일은 이전 FAIL 루프 잔여물):

- preflight: `/tmp/iop-long-admission-smoke/preflight_20260705T221507Z.txt`, `preflight_status_20260705T221507Z.json`, `models_20260705T221507Z.json`
- normal-10: `normal-10_peaks_20260705T221603Z.txt`, `normal-10_final_20260705T221603Z.json`, `normal-10_normal_{1..10}_20260705T221603Z.{code,resp.json}`
- mixed: `mixed_peaks_20260705T221633Z.txt`, `mixed_final_20260705T221633Z.json`, `mixed_long_{1..4}_20260705T221633Z.*`, `mixed_normal_{1..6}_20260705T221633Z.*`
- all-long-slot-full: `all-long-slot-full_peaks_20260705T222235Z.txt`, `all-long-slot-full_final_20260705T222235Z.json`, `all-long-slot-full_long_{1..6}_20260705T222235Z.*`
- runner temp script: `/tmp/iop-long-admission-smoke-runner/e2e-long-context-admission-smoke.sh` (sha256 `ae74ae4f...` local과 동일)

### 추가 발견 사항: 이전 루프 로그의 token 원문 잔존 (follow-up)

구현 완료 후 token 유출 스캔(`grep -rF "<runner에서 추출한 token>"`; 값 미출력)에서 이번 세션 산출물(`CODE_REVIEW-cloud-G08.md`, script, dev 문서)은 깨끗했으나, **이전 루프 산출물 2곳에서 bearer token 원문이 발견**되었다. 두 줄 모두 "원문을 남기지 않았다"고 서술하면서 백틱 안에 원문을 포함하고 있다:

- `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_0.log:58` — 현재 untracked이지만 `.gitignore`가 `agent-task/**/*.log`를 unignore하므로 다음 commit/archive에서 tracked가 된다. **finalization 전에 마스킹 필요.**
- `agent-task/archive/2026/07/m-openai-compatible-think-control/05+01,02,03,04_dev_smoke/code_review_cloud_G07_0.log:72` — 이미 tracked(git history 포함). dev 규칙 "token/secret 원문은 tracked 파일에 기록하지 않는다" 위반 상태. 마스킹 + (필요 시) token rotate는 별도 follow-up 판단 대상.

archive 로그는 구현 에이전트 수정 금지 대상이라 본 세션에서는 수정하지 않고 기록만 남긴다. 해당 token은 이전 로그 스스로 "저민감도 로컬 dev 토큰"으로 분류한 값이다.

---

> **[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.

Sections and their ownership:

| Section　　　　　　　　　　　　　　　　　| Owner                            | Note　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
| ------------------------------------------| ----------------------------------| -----------------------------------------------------------------------------------------------------------------------------------------|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation           | Implementing agent must not modify or execute these　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
| Roadmap Targets　　　　　　　　　　　　　| Fixed at stub creation from plan | 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 | Implementing agent uses it as default prior-loop context; read only the specific archive files cited there when more detail is required |
| 구현 항목별 완료 여부　　　　　　　　　　| Implementing agent checks only   | Item names are fixed; check `[ ]` -> `[x]` only　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
| 구현 체크리스트　　　　　　　　　　　　　| Implementing agent checks only   | Text/order fixed from plan　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
| 코드리뷰 전용 체크리스트　　　　　　　　 | 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 lock decision blocks implementation　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
| 리뷰어를 위한 체크포인트　　　　　　　　 | Fixed at stub creation           | Pre-filled from plan　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
| 검증 결과　　　　　　　　　　　　　　　　| Implementing agent               | Fill actual command output only　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 |
| 코드리뷰 결과　　　　　　　　　　　　　　| Review agent appends             | Not included in stub　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - implementation deviation: Pass
  - verification trust: Pass
  - spec conformance: Pass
- 발견된 문제:
  - Nit: `agent-task/m-model-group-long-context-admission/06+01,02,03,04,05_capacity_smoke/code_review_cloud_G08_0.log:58`에 이전 루프 dev token 원문이 남아 있었음. 리뷰 중 `<masked-dev-token>`으로 마스킹 완료.
- 검증 확인:
  - `bash -n scripts/e2e-long-context-admission-smoke.sh`: PASS.
  - `go run ./apps/edge/cmd/edge config check --config configs/edge.yaml`: PASS.
  - `rg --sort path -n "IOP_LONG_SMOKE_(REPO|EDGE_BIN)|long-context-admission" agent-test/dev/long-context-admission-smoke.md`: PASS.
  - deterministic local mock regression: bad config, HTTP 500, missing Edge binary 실패 경로와 Edge binary override 성공/명령 기록 확인 PASS.
  - runner evidence spot-check: local/runner script sha256 일치, preflight/three scenario evidence files present, all request code files `200`, final snapshots `in_flight=0`, `queued=0`, Edge log window `context_class=long` 10건 및 `long_context_capacity_full` 2건 확인 PASS.
  - secret scan for current task artifacts/script/dev docs: PASS after masking.
- 다음 단계: PASS finalization. Active plan/review를 로그로 아카이브하고 `complete.log` 작성 후 task directory를 `agent-task/archive/YYYY/MM/...`로 이동한다.
