iop/agent-test/dev/iop-benchmark-route-minimal-html-smoke.md

6.3 KiB

IOP 벤치 경로 최소 HTML 스모크

목적

벤치 대상 9개 caller/model/route 조합에 같은 최소 index.html 생성 요청을 한 번씩 직접 보내 호출 경로만 빠르게 확인한다. 전용 runner, manifest, 자동 retry, browser gate와 품질 채점은 사용하지 않는다.

고정 요청

외부 asset과 JavaScript 없이 단일 index.html을 구현한다. 문서에는 <!doctype html>, <title>IOP Route Smoke</title>, <h1>IOP_ROUTE_SMOKE_OK</h1>이 정확히 한 번씩 있어야 한다. direct 경로는 빈 caller workspace의 파일을 확인한다. Edge-owned execution preset은 비공개 workspace가 완료 전에 정리되는 제품 계약을 따르므로 caller 로컬 파일이 아니라 terminal decision.output의 완료·marker를 확인한다.

사전 확인 — 2026-08-13

항목 결과
Claude Code 실제 원격 실행기 2.1.177 확인
agy 1.1.12 확인
Codex 실제 원격 실행기 0.146.0 확인
managed CA live Edge CA bundle 확인
principal token 원격 SOPS의 기존 두 token 사용; 별도 benchmark token 미사용
public /v1/models 두 기존 token 모두 HTTP 200, route 9개 확인
ambient CA override 호출 전후 unset 확인

경로 결과

경로 최초 1회 결과 재검증 분류
Claude Code → Claude direct 통과 없음 기존 성공
Claude Code → Gemini direct 통과 없음 기존 성공
agy → Gemini direct 1초, caller login 요구 parser 배포 뒤 19-22초, caller SUCCESS 2회, 파일 없음 IOP parser 결함 해소; agy가 trusted workspace에서도 파일 도구를 호출하지 않은 caller/tool 이슈 분리
Claude Code → GPT direct provider HTTP 400 operation normalization 반영 뒤 9초, caller success, index.html marker 1회 IOP가 tools+effort를 Chat으로 보낸 결함 수정 확인
Codex → GPT direct 30초, turn.failed, 파일 없음 공식 설정대로 임시 CODEX_HOME, Responses 전용 provider, CODEX_CA_CERTIFICATE에 CA bundle을 사용해 10초 통과 측정 환경 결함: 첫 호출은 CA bundle 대신 Edge leaf 인증서를 사용
Claude Code → Gemini execution preset 184초, caller terminal success, caller workspace 파일 없음 새 배포에서 33초 caller 정상 종료; Plan/Work/Review, workspace write/read/list, artifact 3개 cleanup 성공 default-selector dispatch 결함 해소; terminal 문구에 marker가 없는 것은 caller-visible 결과 판정과 분리
agy → Gemini execution preset 미실행 direct parser 수정 배포 대기 선행 결함
Claude Code → GPT execution preset 미실행 selector/Chat 응답 정규화 배포 뒤 최신 Claude 요청이 provider 전 95ms에 messages[1].role 검증 거절 실제 caller가 user → system과 mid-conversation-system beta를 보냄; IOP가 beta만 선언하고 ingress/lineage/Chat/Responses normalize를 구현하지 않은 별도 제품 결함 확인·국소 수정
Codex → GPT execution preset 16초, turn.completed, terminal marker 1회 없음 통과

추가 API 분리에서는 동일 principal의 최소 /v1/responses가 HTTP 200이었다. Codex direct도 사용자 설정과 로그인 상태를 배제한 임시 CODEX_HOME, Responses 전용 custom provider, 원격 SOPS의 기존 token, command-scoped managed CA bundle으로 통과했다. Gemini-native 최소 요청은 canonical caller model id에서 HTTP 200, 공식 표시 label Gemini 3.6 Flash에서 HTTP 400으로 갈려 path parser 결함을 재현했다.

두 preset 최초 실패는 provider 자체 실패가 아니었다. 코드 대조에서 default resource selector가 의도적으로 빈 provider ID를 동결하는 반면 사후 검증은 pool이 정상 선택한 실제 provider ID와 무조건 같아야 한다고 요구한 결함을 확인했다. explicit selector의 provider ID와 profile/model/credential/path fence는 유지하고, default selector만 pool 선택을 인정했다. 재배포 뒤 Gemini preset은 전체 stage와 workspace lifecycle이 통과했다. GPT preset은 다음 경계까지 진행해 실제 OpenAI Chat 응답의 service_tier, system_fingerprint, annotations, null refusal을 private strict decoder가 거부하는 별도 normalize 누락을 드러냈다. 공통 provider-normalization 계층에서 Chat/Responses 결과를 같은 canonical stage envelope로 수렴시키는 국소 회귀가 통과했다.

그 수정 배포 뒤 최신 Claude Code는 첫 task 요청에 messages=[user, system]mid-conversation-system-2026-04-07 beta를 보냈다. IOP는 beta header를 지원 목록에 두었지만 strict ingress와 logical-request lineage는 여전히 user/assistant만 허용했고, Chat/Responses bridge에도 system message 변환이 없었다. system 내용을 user text로 낮추지 않고 ordered privileged message로 보존하도록 공통 Anthropic 입력 normalize 경계를 수정했으며, 첫-position system, assistant 뒤 system, system 뒤 user, non-text system, 미완료 tool 결과 사이 삽입은 fail-closed로 유지했다.

해당 입력 normalize 배포 뒤 단일 재검증은 Plan 성공 후 Work validation으로 종료됐다. preset 구성상 Plan/Review는 GPT지만 Work는 ornith-fast다. RTX Ornith에 같은 forced workspace tool shape를 직접 보낸 결과 native tool_calls가 정상 반환됐고, 응답의 top-level provider timings가 기존 Work codec에서는 허용되지만 새 공통 Chat normalize allowlist에서 빠져 있음을 확인했다. 공통 normalize가 timings를 검증 후 폐기하도록 보완했다.

재개 조건

Anthropic mid-conversation system normalization을 병합·배포한 뒤 Claude Code → GPT preset만 1회 재검증한다. 운영 release capacity gate는 인증 projection의 ornith:35b selector가 기대한 OneX가 아니라 RTX로 바뀐 별도 운영 라우트 불일치를 먼저 해소해야 한다. 이를 통과시키려고 route나 capacity를 임의 변경하지 않는다. 그 뒤 선행 결함이 해소된 agy preset을 1회 수행한다. Claude Code GPT direct와 이미 성공한 경로는 반복하지 않는다.

성공한 경로는 반복하지 않는다. 실패한 경로는 원인이 변경된 경우에만 해당 경로를 1회 재검증한다.