# Milestone: [bench-route-01] 벤치 경로 최소 HTML 스모크

## 위치

- Roadmap: [ROADMAP.md](../../../../ROADMAP.md)
- Phase: [PHASE.md](../../../../phase/knowledge-tool-optimization-extension/PHASE.md)

## 목표

벤치마크에 사용할 caller/model/route 조합만 고정된 최소 HTML 생성 요청으로 빠르게 확인한다.
IOP 전체 안정성을 처음부터 재검증하지 않고, 실패가 재현된 경로만 제품·caller·provider·환경 중 한 경계에 귀속해 국소 수정한 뒤 그 경로만 다시 확인한다.

## 상태

[완료]

## 구현 잠금

- 상태: 해제
- SDD: 필요
- SDD 문서: [SDD.md](../../../sdd/knowledge-tool-optimization-extension/benchmark-route-minimal-html-smoke/SDD.md)
- 잠금 해제 조건:
  - [x] SDD 잠금이 해제되어 있다
  - [x] SDD 사용자 리뷰가 없거나 승인/해결되었다
  - [x] Acceptance Scenario가 Milestone 기능 Task와 연결되어 있다
  - [x] Evidence Map이 완료 시 `complete.log` 첫 줄의 `milestone-task` id별 집계와 최종 검증 evidence로 검증 가능하게 연결되어 있다
- SDD 사유: OpenCode direct 실측이 Gemini Chat thought-signature 왕복 결함을 재현했고, 이를 caller 예외가 아닌 operation-scoped protocol profile config와 외부 Chat tool-call 계약으로 고정해야 한다.
- 결정 필요: 없음

## 범위

- 아래 9개 기존 벤치 대상 조합을 순서와 무관하게 한 경로씩 직접 실행한다.
  - Claude Code → Claude direct
  - Claude Code → Gemini direct
  - OpenCode → Gemini direct
  - Claude Code → GPT direct
  - Codex → GPT direct
  - Claude Code → Gemini execution preset
  - OpenCode → Gemini execution preset
  - Claude Code → GPT execution preset
  - Codex → GPT execution preset
- 모든 경로에 같은 구현 요구를 사용한다: 외부 asset과 JavaScript 없이 exact marker가 있는 단일 `index.html`을 구현하고 종료한다.
- 각 경로는 최초 1회만 실행하고 120초 안에 terminal을 확인한다. direct 경로는 caller workspace의 `index.html`, Edge-owned execution preset은 비공개 workspace 정리 계약 때문에 caller 로컬 파일이 아니라 caller-visible `decision.output`의 완료·marker를 판정한다.
- 실패하면 자동 retry나 전체 재실행을 하지 않는다. sanitized terminal/error와 IOP request stage만 확인해 소유 경계를 정하고, 변경된 원인이 있을 때 실패 경로만 1회 재검증한다.
- 제품 코드를 수정한 결함에는 해당 소유 package의 focused regression test를 추가하고 관련 Go test를 실행한다.

## 기능

### Epic: [route-smoke] 벤치 경로 초경량 확인

- [x] [minimal-html-calls] 9개 조합에 동일한 최소 HTML 구현 요청을 한 번씩 직접 실행하고, 경로별 caller/model/route, terminal, 경과 시간, marker 확인 결과를 한 개의 Markdown 표에 기록한다. direct는 caller workspace 파일, Edge-owned execution preset은 caller-visible terminal output을 확인한다. 사설 dev CA가 필요한 호출은 caller가 공식 지원하는 command-scoped CA 변수에 managed CA bundle을 전달한다. Codex는 `CODEX_CA_CERTIFICATE`, Node 기반 caller는 필요한 경우 `NODE_EXTRA_CA_CERTS`를 사용한다. 검증: 새 runner/manifest 없이 각 행에 실제 호출 결과가 하나만 있어야 하며, 호출 전후 ambient Codex/IDE/shell 환경에는 CA 변수가 없어야 한다.
- [x] [failed-path-fixes] 실패한 조합마다 제품·caller·provider·환경 중 소유 경계를 기록하고, IOP 제품 결함이 재현된 경우에만 국소 수정과 focused regression을 수행한 뒤 해당 조합만 다시 호출한다. 검증: 성공한 조합의 반복 실행이 없고, 재실행 행에는 변경된 원인과 연결된 수정·테스트 근거가 있어야 한다.
- [x] [thin-bench-handoff] 9개 조합의 통과 또는 구체적 외부 차단 상태를 짧게 정리해 `[bench-lite-01]` 실행 가능 여부를 남긴다. 검증: 비교 점수나 순위가 아니라 호출 가능 여부와 남은 소유자만 기록한다.

## 완료 리뷰

- 상태: 통과
- 요청일: 2026-08-14
- 완료 근거: 동일한 최소 HTML 요청으로 9개 caller/model/route 경로가 모두 통과했다. 실패 경로는 제품·provider·환경 경계로 귀속해 원인 변경 뒤에만 재검증했고, IOP 결함은 provider normalization과 focused regression으로 한정해 수정했다.
- 검토 항목:
  - [x] 새 benchmark script, runner, manifest, state store가 생성되지 않았다.
  - [x] 성공 경로는 한 번만 실행했고 실패 경로만 변경된 원인 뒤 재검증했다. 단, 사용자 지시의 세션 한정 hybrid Work 모델 전환 확인은 경로 복구 검증과 분리해 기록했다.
  - [x] 제품 수정은 재현된 결함과 focused regression으로 한정됐다.
- agent-ui 상태 반영: 해당 없음
- Spec sync: [OpenAI-Compatible 입력 표면](../../../../../agent-spec/input/openai-compatible-surface.md)에 operation-scoped normalization, nearest-lower effort, Gemini Chat signature 왕복과 관련 코드·테스트 evidence가 이미 반영되어 추가 갱신이 필요하지 않다.
- 리뷰 코멘트: 2026-08-14 종료 감사를 통과했다. 관련 config/OpenAI/service 회귀 테스트와 9/9 dev 실호출 evidence를 확인했으며 제품·호출 경로 차단은 남지 않았다. `[bench-lite-01]`의 단일 시도 비교를 시작할 수 있다. 표준 release tag finish는 다른 active release와 충돌하므로 배포 성공 판정과 분리해 남겨 둔다.

## 범위 제외

- IOP ingress/provider/preset 전체 전수 안정화
- benchmark runner, manifest/schema, resume/recovery store, 자동 retry
- browser/CDP, screenshot, accessibility/network gate, 자동 품질 채점
- 반복 측정, 통계, 순위, token 정규화
- benchmark 성공을 다른 제품 Milestone이나 프로젝트의 완료 gate로 사용하는 것

## 작업 컨텍스트

- 계획 범위: 짧은 단일 test plan으로 즉시 실행할 수 있게 유지한다. 별도 설계·SDD·다단계 복구 계획으로 확장하지 않는다.
- 실행 방식: 기존 공식 caller 명령을 한 번씩 직접 실행한다. 공통화가 필요해 보여도 이 Milestone에서는 script로 승격하지 않는다.
- TLS 환경 경계: 개발 Edge용 사설 CA는 Edge leaf 인증서가 아니라 managed CA bundle을 해당 벤치 caller process에만 전달한다. Codex에는 공식 변수 `CODEX_CA_CERTIFICATE`, Node 기반 caller에는 필요한 경우 `NODE_EXTRA_CA_CERTS`를 사용하며 Codex/IDE 시작 환경이나 셸 전역에 `export`하지 않는다. 그렇지 않으면 공개 TLS 연결에도 같은 CA override가 적용될 수 있다.
- evidence 위치: `agent-test/dev/iop-benchmark-route-minimal-html-smoke.md`
- 현재 사전 확인: 2026-08-13 실제 원격 실행기에서 Claude Code 2.1.177과 Codex 0.146.0을 확인했고, 현재 workspace의 OpenCode 1.18.3을 별도 사용자 설정 변경 없이 command-scoped provider config로 준비했다. 원격 SOPS에 보관된 기존 IOP principal token으로 token 원문을 출력하지 않은 `/v1/models`가 HTTP 200임을 확인했다. 새 벤치 전용 token은 발급하거나 사용하지 않는다.
- 현재 경로 결과: 9개가 모두 통과했다. Claude Code → GPT direct는 caller-neutral operation normalization 반영 뒤 9초, Codex → GPT direct와 Codex → GPT execution preset은 각각 10초/16초에 통과했다. OpenCode → Gemini execution preset은 `ornith-fast` Node 복구 뒤 19초에 통과했다. 이후 사용자 지시로 이 세션의 hybrid Work 바인딩만 `ornith:35b`로 임시 전환했고, Claude Code → GPT execution preset은 71초, OpenCode → Gemini execution preset은 51초에 terminal success·caller marker·오류 0으로 통과했다. 마지막 OpenCode → Gemini direct는 normalization 포함 dev 배포 뒤 11초에 `glob`/`write`/`read`, terminal marker, exact `index.html`을 확인했다.
- 추가 분리 결과: agy는 text completion은 가능하지만 trusted workspace에서도 파일 도구를 호출하지 않아 구현 Agent 벤치 대상에서 제외했다. 대체한 OpenCode → Gemini direct는 첫 tool 호출 뒤 `extra_content.google.thought_signature`를 일반 Chat history로 보존하지 못해 두 번째 provider 호출이 HTTP 400으로 닫혔다. IOP가 선택된 `gemini_openai_chat` tool-call wire에서만 opaque id로 캡슐화·복원하도록 공통 provider normalization을 추가했고 focused HTTP 연속 호출 회귀와 live tool continuation이 통과했다. Codex → GPT direct의 최초 실패는 CA bundle 대신 Edge leaf 인증서를 전달한 측정 환경 결함이었다. Claude Code → Gemini/GPT preset의 이전 default-selector 및 profile operation normalization 결함도 국소 수정과 회귀 검증이 완료됐다.
- 배포 경계: source `de35e6d4`로 Edge와 네 Node를 다시 빌드·배포했고 빌드 전후 Go package 49개, Node/provider health, managed-capacity Chat·Responses 네 건을 통과했다. 배포 source는 `archive/release-dev-1019-de35e6d`에 보존했다. 이후 별도 framework sync와 다른 active release가 생겨 표준 release tag finish만 fail-closed로 남았으며 live dev 배포·9개 경로 판정과 분리한다.
- 세션 한정 override: tracked 설정은 변경하지 않고 live runtime config의 Gemini/GPT hybrid Work 바인딩 네 곳만 `ornith:35b`로 바꾸었다. 원본 백업, config check, refresh dry-run/apply 통과 근거를 확인했으며 세션 종료 시 원래 `ornith-fast`로 복구한다.
- 후속 측정: [초경량 Agent 모델 비교](../../../../phase/knowledge-tool-optimization-extension/milestones/thin-agent-model-comparison-benchmark.md)
