iop/agent-test/dev/iop-thin-agent-model-comparison.md

23 KiB
Raw Blame History

IOP 초경량 Agent 모델 비교

목적

검증을 마친 9개 caller/model/route 조합에 같은 HTML 구현 요청을 정확히 한 번씩 실행한다. 운영 결과와 산출물 품질을 분리하고, 품질은 실행 전에 잠근 공통 100점 기준표로 산출물별 정확히 한 번 깊게 분석한다. 별도 benchmark script, runner, judge, manifest, retry, resume 또는 자동 gate는 사용하지 않는다.

고정 요청

아래 문장을 모든 조합에 그대로 사용한다.

Create a polished single-file responsive landing page in index.html for “Orbit Ops”, a fictional AI operations dashboard. Use no external assets, frameworks, or JavaScript. Include a semantic header, main, and footer; a hero with a title and two calls to action; three feature cards; and a system-status panel with three services and visible status labels. Put all CSS in a <style> element and make the layout adapt at 720px or below. Include exactly once <meta name="iop-bench" content="BENCH_LITE_01">. Write the file, read it back, and then finish with BENCH_LITE_01_DONE on its own line followed by the exact full index.html in one html fenced code block.

입력을 교체할 때는 이 블록과 아래 A. 요청 충족 체크리스트만 실행 전에 함께 바꾸고 고정한다. 나머지 평가 축과 실행 방식은 유지한다.

실행 규칙

  • 재측정은 다른 benchmark·agent producer가 없고 provider queue/in-flight가 비어 있음을 직전에 확인한 뒤 완전 순차로 수행한다. 이 무경합 상태를 증명하지 못한 행은 실행 결과는 보존하되 속도 비교에서 제외한다.
  • 각 조합은 빈 임시 workspace에서 정확히 한 번만 실행한다.
  • 실패도 결과이며 같은 측정에서 retry, resume, recovery 또는 대체 실행을 하지 않는다.
  • 모든 행은 caller 명령 바깥에서 같은 clock으로 request_sent_at, terminal_received_at과 monotonic elapsed를 기록한다. caller 내부 duration, API duration과 TTFT는 별도 보조 지표이며 외부 완료 시간 대신 사용하지 않는다.
  • direct 경로는 caller workspace의 index.html과 terminal marker를 확인한다.
  • execution preset은 request ID와 Plan/Work/Review/Repair stage별 시작·종료, 실제 선택 model, terminal/error, 최종 workspace 및 caller-visible 응답 상태를 기록한다. Edge private workspace cleanup 계약을 유지하므로 caller-visible terminal marker와 최종 응답의 exact HTML code block도 확인한다.
  • usage는 caller가 직접 제공한 값만 기록하고 없으면 미제공으로 둔다.
  • 기존 원격 SOPS token과 command-scoped managed CA만 사용하며 별도 benchmark token이나 전역 CA override를 만들지 않는다.
  • 이 세션의 execution preset Work는 live ornith-fast 바인딩을 사용한다. tracked runtime 설정은 변경하지 않는다.
  • 각 exact HTML source와 SHA-256, 1440×900 desktop 및 390×844 mobile render만 ignored run evidence에 보존한다. render는 품질 분석 입력이지 제품 경로의 pass/fail gate가 아니다.
  • full source를 얻지 못한 실행은 실행 실패와 별개로 채점 불가로 기록하며 0점으로 바꾸지 않는다.
  • scorable source에는 실행 후 opaque 평가 ID를 부여한다. 단일 평가 pass에는 ID, source와 두 render만 제공하고 route·model·시간·usage 매핑은 점수와 evidence가 고정된 뒤 결합한다.

이전 실행 결과 — 시간 비교 무효

아래 결과는 무경합 상태를 증명하지 않았고 외부 요청·완료 시각을 일관되게 기록하지 못했다. 산출물과 caller raw evidence는 참고용으로 보존하지만 경과 시간, 속도 순위와 모델 간 시간 차이는 비교 근거로 사용하지 않는다. 특히 OpenCode → Gemini execution preset의 0초는 요청 전체 시간이 아니라 마지막 내부 이벤트 간격을 잘못 사용한 값이다.

경로 평가 ID 상태 경과 시간 caller usage source SHA-256 / terminal evidence 짧은 관찰
Claude Code → Claude direct E08 성공 83.745초 input 5, cache create 15,062, cache read 10,396, output 11,622 e15fc6f3295438a0a384d41b15e38fe793d842760d505003345cfede56612bf1 / marker 확인 exact workspace source 및 사용자 승인 동일 viewport render 확보
Claude Code → Gemini direct E05 성공 80.363초 input 41,736, output 10,858 7dc4d4d520c28504135ad81c7594599a0aef15f3be4f1e486db0bafd2908fbcd / marker 확인 exact workspace source 및 사용자 승인 동일 viewport render 확보
OpenCode → Gemini direct E01 성공 77초 input 12,285, cache read 24,478, output 4,482, total 41,245 c83a046c9ebe6aa2bdeb4954ecad37312abd362caa30c20041862ca65edd6aeb / marker 확인 exact workspace source 및 사용자 승인 동일 viewport render 확보
Claude Code → GPT direct E09 성공 63.757초 input 31,056, output 12,377 b256b53042b4e4d1bfe49c1a36175c0e1055fe30f6d813995f59dfd98457e6a8 / marker 확인 exact workspace source 및 사용자 승인 동일 viewport render 확보
Codex → GPT direct E03 성공 미제공 input 58,576, cached input 38,245, cache write input 20,106, output 9,007, reasoning output 369 2cf8cd8782e5b10b70c09674b7c2b768ccc96c41e57107df63abfec66b434b01 / terminal marker 확인 exact workspace source 및 사용자 승인 동일 viewport render 확보
Claude Code → Gemini execution preset E04 실행 실패 37.532초 input 0, output 0 source 없음 / API Error: single-request execution failed sole invocation exit 1; 재시도하지 않음
OpenCode → Gemini execution preset E07 성공 0초 input 0, output 0 a9966cac565854c69c56d5c288ae92519e45f9c1686f80df0008559f46cab958 / terminal marker 확인 terminal exact fence 추출 및 사용자 승인 동일 viewport render 확보
Claude Code → GPT execution preset E06 응답 불완전 89.870초 input 0, output 0 source 없음 / terminal marker·exact fence 없음 완료 문구만 반환해 채점 불가; 재시도하지 않음
Codex → GPT execution preset E02 성공 미제공 input 123,280, cached input 39,124, cache write input 83,814, output 7,557, reasoning output 372 c7760fcffe964ffe7189a600d47534bab9731fe158f49b169c6461d83324838c / terminal marker 확인 terminal exact fence 추출 및 사용자 승인 동일 viewport render 확보

무경합 재측정 결과

경로 상태 무경합 snapshot request sent UTC terminal received UTC 외부 elapsed caller duration / API / TTFT usage source / terminal evidence
Claude Code → Claude direct 성공 전·후 전체 provider 0/0 01:52:43.409486Z 01:53:59.498224Z 75.90초 74.903 / 74.749 / 3.095초 input 1,611, cache create 57,891, cache read 143,478, output 10,194 9799165… / workspace·marker·exact fence 확인
Claude Code → Gemini direct 성공 전·후 전체 provider 0/0 01:53:59.616028Z 01:55:08.426345Z 68.70초 68.376 / 68.238 / 2.762초 input 173,200, cache read 105,925, output 9,794 af47386e… / workspace·marker·exact fence 확인
OpenCode → Gemini direct 성공 전·후 전체 provider 0/0 01:55:40.157414Z 01:56:37.319047Z 57.12초 미제공 input 27,715, cache read 40,730, output 8,572 d01d95a9… / workspace·marker·exact fence 확인
Claude Code → GPT direct 응답 성공·workspace 계약 실패 전·후 전체 provider 0/0 01:46:31.303629Z 01:47:48.560195Z 77.21초 76.369 / 76.066 / 8.436초 input 228,616, output 10,447 48ebe9d6… / terminal marker·exact fence 확인, caller workspace 파일 없음
Codex → GPT direct 성공 전·후 전체 provider 0/0 01:49:58.485953Z 01:50:50.862758Z 52.33초 미제공 input 59,604, cached 41,277, cache write 18,312, output 9,306, reasoning 335 d1b84b60… / workspace·marker·exact fence 확인
Claude Code → Gemini execution preset 실행 성공·응답 계약 실패·채점 불가 전·후 전체 provider 0/0 01:19:09.286756Z 01:20:06.283012Z† 56.92초 55.606 / 55.551 / 0.056초 input 0, output 0 source·marker·exact fence 없음; 완료 요약만 반환
OpenCode → Gemini execution preset 성공 전·후 전체 provider 0/0 01:21:25.551427Z 01:22:33.691427Z† 68.14초 미제공 input 0, output 0 08171098… / marker·exact fence 확인
Claude Code → GPT execution preset 실행 성공·응답 계약 실패·채점 불가 전·후 전체 provider 0/0 01:25:53.618193Z 01:26:48.838192Z† 55.22초 54.066 / 102.730 / 0.097초 input 0, output 0 source·marker·exact fence 없음; 승인 요약만 반환
Codex → GPT execution preset 성공 전·후 전체 provider 0/0 01:30:03.418438Z 01:30:57.998437Z† 54.58초 미제공 input 123,197, cached 39,023, cache write 83,832, output 7,772, reasoning 311 bcf6aa0b… / workspace·marker·exact fence 확인

† preset 네 행은 controller 후처리 단절 때문에 request_sent_at + /usr/bin/time real로 종료 시각을 산출했다. OpenCode 행의 terminal event 01:22:33.614Z가 이 산출값과 0.077초 이내로 일치한다. direct 다섯 행은 caller 종료 직후 같은 외부 clock으로 직접 관찰했다. 모든 유효 행은 직전 pre-status와 직후 post-status에서 전체 provider의 in_flight=0, queued=0을 확인했으며 서로 시간 구간이 겹치지 않는다.

Preset 단계 진단

경로 request ID Plan Work Review Repair 실패 소유 stage / 직접 오류 최종 workspace caller-visible terminal
Claude Code → Gemini execution preset caller 미노출 Planning 확인, ID/model/time 미노출 Executing 확인, ID/model/time 미노출 Reviewing 확인, ID/model/time 미노출 실행 증거 없음 stage 오류 없음. 최종 caller projection이 완료 요약만 남겨 exact source 계약 실패 private workspace 미노출·cleanup 계약 marker·fence 없음
OpenCode → Gemini execution preset caller 미노출 stage event 미노출 stage event 미노출 stage event 미노출 stage event 미노출 terminal exact source 반환 성공; 내부 stage별 관찰성은 없음 private workspace 미노출·cleanup 계약 marker·fence 확인
Claude Code → GPT execution preset caller 미노출 Planning 확인, ID/model/time 미노출 Executing 확인, ID/model/time 미노출 Reviewing 확인, ID/model/time 미노출 실행 증거 없음 stage 오류 없음. 최종 caller projection이 승인 요약만 남겨 exact source 계약 실패 private workspace 미노출·cleanup 계약 marker·fence 없음
Codex → GPT execution preset caller 미노출 stage event 미노출 stage event 미노출 stage event 미노출 stage event 미노출 terminal exact source 반환 성공; 내부 stage별 관찰성은 없음 caller workspace source 확인 marker·fence 확인

동일 preset이 OpenCode·Codex에서는 exact source를 반환하고 Claude Code에서만 요약으로 축약됐다. 따라서 두 preset 실패의 현재 소유 후보는 Plan/Work/Review provider가 아니라 Claude-compatible caller 응답 정규화 또는 최종 terminal projection 계층이다. 다만 request ID와 stage별 실제 model/time이 caller evidence에 노출되지 않아 정확한 내부 함수 단위까지는 단정하지 않는다. 이는 별도의 관찰성 공백이다.

공통 평가 기준표 — 100점

평가자는 route, model, 경과 시간과 usage를 보지 않고 opaque 평가 ID, exact source와 두 고정 viewport render만 사용한다. A는 명시된 세부 점수를 합산한다. B~D의 각 5점 항목은 5=명확히 충족, 3=대체로 충족하나 눈에 띄는 결함 1개, 1=일부 흔적만 있거나 결함이 여러 개, 0=없거나 깨짐의 네 anchor만 사용한다. 중간 점수는 쓰지 않는다.

세부 기준 배점 허용 점수
A. 요청 충족 완전한 HTML 문서 4, 내부 <style> 4, 외부 asset/framework 없음 4, JavaScript 없음 4, exact meta 1회 4 20 세부 항목별 0 또는 4
A. 요청 충족 header/main/footer 3, hero title+CTA 2개 4, feature card 3개 4, service 3개+visible label 4, 720px 이하 실제 breakpoint 5 20 명시 세부 점수만 합산
B. 반응형·레이아웃 desktop hierarchy, mobile reflow, overflow/clipping 방지, component/readability consistency 20 각 0/1/3/5
C. 사용성·접근성 heading/landmark 구조, CTA 의미·focus, status의 non-color cue, viewport·대비·가독성 20 각 0/1/3/5
D. 시각 완성도 정보 위계, palette/type/spacing, component/status cohesion, polish/distinctiveness 20 각 0/1/3/5

총점은 A+B+C+D의 단순 합이며 별도 가중·정규화·상대 순위 보정은 없다. 요구 위반은 해당 A 점수에서만 반영하고 같은 결함을 다른 축에서 중복 감점하지 않는다. 단, 그 위반이 실제 레이아웃·사용성·시각 결함을 별도로 만든 경우에는 해당 render 증거를 적고 감점할 수 있다.

이전 단일 평가 기록 — 모바일 렌더 무효

아래 점수는 이전 Chrome 실행이 390px 이미지에 더 넓은 내부 CSS viewport를 잘라 넣은 사실을 뒤늦게 확인했으므로 품질 비교에도 사용하지 않는다. 당시 공통으로 관찰한 horizontal clipping은 산출물 결함이 아니라 render 측정 결함이었다. 표와 evidence는 왜 이전 점수를 폐기했는지 추적하기 위한 참고 기록이다.

각 scorable 산출물마다 아래 한 행과 짧은 evidence block 하나만 작성한다. 모든 산출물 평가가 끝날 때까지 rubric을 바꾸지 않는다.

평가 ID A /40 B /20 C /20 D /20 총점 /100 채점 상태
E01 40 11 14 18 83 완료
E02 40 11 14 20 85 완료
E03 40 11 14 20 85 완료
E04 채점 불가 — source 없음
E05 40 11 14 18 83 완료
E06 채점 불가 — source 없음
E07 40 11 14 18 83 완료
E08 40 11 14 18 83 완료
E09 40 11 14 20 85 완료

E01 — A: 문서·style·무외부자산·무JS·exact meta와 필수 구조를 모두 충족해 40; B: desktop 위계는 명확하지만 mobile에서 제목·본문·카드가 오른쪽으로 잘려 11; C: landmark·CTA·문자 상태표시는 명확하나 mobile 가독성이 깨져 14; D: 일관된 dark palette와 카드 체계는 좋지만 mobile polish 결함으로 18; 감점: 390×844 overflow/clipping.

E02 — A: 모든 요청 selector와 정확한 meta를 충족해 40; B: desktop 구성은 강하지만 mobile의 hero·상태 라벨이 오른쪽에서 잘려 11; C: heading/landmark, 의미 있는 CTA, Operational 문구는 좋으나 mobile 가독성 결함으로 14; D: 강한 타이포·status component·색상 체계와 독자성이 명확해 20; 감점: 390×844 horizontal overflow.

E03 — A: 필수 문서·구조·콘텐츠·breakpoint를 모두 충족해 40; B: desktop hierarchy는 뛰어나지만 mobile hero와 CTA가 viewport 밖으로 잘려 11; C: semantic heading/landmark, CTA, 문자 상태표시는 충족하나 mobile 사용성이 저하돼 14; D: 타이포·lime accent·mission-control card의 결속과 독자성이 명확해 20; 감점: 390×844 clipping.

E05 — A: 모든 명시 요구를 충족해 40; B: desktop은 안정적이나 mobile 제목·본문·section heading이 잘려 11; C: landmark·CTA·상태 label은 갖췄지만 mobile reading flow 결함으로 14; D: palette/type/card 일관성은 좋으나 비교적 일반적이고 mobile polish가 부족해 18; 감점: 390×844 overflow.

E07 — A: 문서·내부 style·무외부자산·무JS·meta와 요청 section을 모두 충족해 40; B: desktop은 균형 잡혔지만 mobile copy와 feature heading/card가 잘려 11; C: 의미 있는 CTA와 non-color status label은 명확하나 mobile 가독성으로 14; D: gradient accent와 component cohesion은 좋지만 mobile 마감 결함으로 18; 감점: 390×844 clipping.

E08 — A: 모든 필수 selector와 exact meta를 충족해 40; B: desktop hierarchy는 안정적이나 mobile navigation wrap과 hero/section text clipping으로 11; C: landmark·CTA·상태 문구는 명확하나 좁은 viewport 가독성으로 14; D: 정돈된 palette·spacing·card 체계는 좋지만 mobile header와 overflow 마감이 부족해 18; 감점: 390×844 header wrap 및 clipping.

E09 — A: 필수 문서·구조·콘텐츠·breakpoint를 모두 충족해 40; B: desktop은 강한 2-column hierarchy지만 mobile hero·CTA·dashboard가 오른쪽으로 잘려 11; C: semantic 구조·CTA·문자 상태표시는 좋으나 mobile 조작·읽기 영역이 손실돼 14; D: typography, blue palette, dashboard/status cohesion과 독자성이 명확해 20; 감점: 390×844 horizontal overflow.

Evidence block 형식: 평가 ID — A: 충족/누락 selector와 점수; B~D: source selector 또는 viewport에서 직접 관찰한 근거; 감점: 기준·anchor·사유. 한 결함당 한 문장으로 제한한다. 평가는 산출물별 한 번만 수행하고, 이후 수정은 합계 산술 오류나 evidence 전사 오류만 허용하며 수정 사유를 같은 block에 남긴다.

이 총점은 고정 rubric과 직접 evidence에 기반한 재검산 가능한 단일 평가 점수다. 반복 표본이나 다중 평가자 합의가 아니므로 통계적 모델 우위나 절대적 품질 척도로 해석하지 않는다.

재수집 render provenance: 최초 로컬 Chromium 실패 뒤 사용자 승인으로 프로세스를 강제 종료·재시작했고, 동일 source·opaque ID·viewport를 유지해 dev runner의 독립 Chrome으로 다시 캡처했다. desktop/mobile SHA-256은 각각 E01 769177e7…/64898950…, E02 63e9bcdb…/1b2e9cd0…, E03 46f255b9…/fff81780…, E05 cf430192…/fef49876…, E07 6d799a75…/ae7be5a4…, E08 fce30317…/b99eaa2b…, E09 d0c7990c…/ccef5b70…이다.

재측정 단일 평가 기록

새 source 일곱 건을 route와 분리해 B01~B07로 한 번만 평가했다. 모바일 render는 Chrome DevTools Emulation.setDeviceMetricsOverride(width=390,height=844,deviceScaleFactor=1) 뒤 캡처해 CSS viewport와 이미지 폭을 일치시켰다.

평가 ID A /40 B /20 C /20 D /20 총점 /100 채점 상태
B01 40 20 18 20 98 완료
B02 40 20 18 18 96 완료
B03 40 20 18 18 96 완료
B04 40 20 18 18 96 완료
B05 40 20 20 20 100 완료
B06 40 20 18 18 96 완료
B07 40 20 20 20 100 완료

B01 — A: 문서·내부 style·무외부자산·무JS·exact meta와 필수 구조를 모두 충족해 40; B: desktop 2-column 위계와 실제 390px single-column reflow, overflow 방지, status readability가 모두 명확해 20; C: landmark·CTA·문자 상태 label·대비는 충족하지만 별도 focus-visible 설계가 없어 18; D: 대형 typography, cyan gradient, status panel의 결속과 독자성이 명확해 20.

B02 — A: 모든 명시 selector와 exact meta를 충족해 40; B: desktop card grid와 390px CTA·card stack이 clipping 없이 재배치돼 20; C: landmark·CTA·문자 상태 label·가독성은 충족하지만 별도 focus-visible 설계가 없어 18; D: palette와 component는 일관되나 비교적 보편적인 dashboard 표현이라 18.

B03 — A: 필수 문서·구조·콘텐츠·breakpoint를 모두 충족해 40; B: desktop hierarchy와 mobile reflow·읽기 폭·component consistency가 모두 안정적이라 20; C: 명시적 landmark/ARIA와 non-color status는 좋지만 별도 focus-visible 설계가 없어 18; D: 정돈된 dark/cyan 체계는 완성도가 높으나 시각 언어가 비교적 일반적이라 18.

B04 — A: 모든 요청 요소와 exact meta를 충족해 40; B: 390px에서 navigation·hero·CTA가 overflow 없이 재배치되고 desktop 위계도 안정적이라 20; C: semantic landmark와 상태 문구는 명확하지만 별도 focus-visible 설계가 없어 18; D: blue/teal palette와 card 체계는 일관되나 독자성은 중간 수준이라 18.

B05 — A: 명시 요구를 모두 충족해 40; B: desktop dashboard composition과 mobile reflow·overflow·가독성이 모두 명확해 20; C: landmark·ARIA·문자 상태·명시적 focus-visible·대비를 모두 충족해 20; D: violet/cyan typography, tilted dashboard, status component가 강하게 결속돼 20.

B06 — A: 필수 문서·구조·콘텐츠·breakpoint를 모두 충족해 40; B: desktop 3-card grid와 mobile stack이 clipping 없이 안정적으로 재배치돼 20; C: landmark·CTA·문자 상태·가독성은 충족하지만 nav label과 별도 focus-visible 설계가 없어 18; D: typography와 purple component 체계는 완성됐지만 전형적인 dashboard 구성이라 18.

B07 — A: 모든 필수 selector와 exact meta를 충족해 40; B: 대형 hero가 desktop과 실제 390px에서 모두 읽히고 CTA·section이 안정적으로 reflow돼 20; C: landmark·ARIA·문자 상태·focus-visible·대비가 명확해 20; D: formation motif, gradient typography, status component의 결속과 독자성이 명확해 20.

점수 고정 뒤 결합한 매핑은 B01=Codex→GPT preset, B02=Claude Code→Gemini direct, B03=OpenCode→Gemini preset, B04=Claude Code→Claude direct, B05=Codex→GPT direct, B06=OpenCode→Gemini direct, B07=Claude Code→GPT direct다. source/desktop/mobile SHA-256은 각각 B01 bcf6aa0b…/4d341fd1…/00e317cc…, B02 af47386e…/79b0daed…/e455c0af…, B03 08171098…/737d09b6…/95f75dbc…, B04 9799165f…/3df7f832…/b5d9b57c…, B05 d1b84b60…/23754e93…/05d14842…, B06 d01d95a9…/998aacf0…/8082de73…, B07 48ebe9d6…/61aacb88…/6004c958…다.

결론

재측정에서 9개 IOP 호출은 모두 process exit 0으로 끝났고 전·후 provider 0/0과 비중첩 실행 구간을 확인했다. 다만 제품·caller-visible 계약까지 완전히 충족한 경로는 6/9다. Claude Code→GPT direct는 terminal exact source는 반환했지만 caller workspace 파일이 없었고, Claude Code의 두 execution preset은 Plan/Work/Review 완료 뒤 요약만 반환해 source 채점이 불가능했다.

따라서 현재 증거는 IOP provider 실행 자체의 실패보다 caller/edge 응답 정규화 경계의 문제가 우세함을 가리킨다. 특히 preset은 OpenCode·Codex 2/2가 exact source를 반환하고 Claude Code 0/2만 최종 source projection에 실패했다. 속도는 단일 표본의 외부 elapsed로만 보고 모델 우위로 일반화하지 않는다. 품질 점수도 고정 rubric의 해당 산출물 점수일 뿐 모델의 통계적 서열이 아니다.

재측정 과정에서 별도로 확인한 benchmark 측 결함은 OpenCode direct의 잘못된 Gemini-native SDK, controller stdin 소비와 잔존 producer, 공용 workspace 재사용, Codex CA 환경 누락, Mac Chrome의 가짜 390px crop이다. 이 실행들은 전부 유효 표본에서 제외하고 ignored agent-test/runs/bench-lite-05/{preflight-failures,invalidated}에 원인별로 보존했다. 별도 하네스는 만들지 않았다.