
Gemini 3.6 Flash가 1분 38초 만에 Opus 5와 대등했던 건에 대하여【1엔 연구소 3라운드 실측·후편】
요약
Gemini 3.6 Flash와 Claude Opus 5를 활용하여 AI 에이전트의 성능과 벤더별 가드레일(Guardrail)의 영향을 비교 실험한 연구 결과입니다. AI가 자율적으로 앱을 개발하고 배포하는 과정에서 발생하는 기술적 한계와 비용 문제를 다룹니다.
핵심 포인트
- Gemini 3.6 Flash가 Opus 5와 대등한 성능을 보인 실측 결과 공유
- AI 에이전트의 자율성을 제한하는 벤더별 가드레일(Guardrail) 분석
- 고성능 모델 사용 시 발생하는 막대한 토큰 비용 문제 지적
- AI 에이전트의 설계, 구현, 배포 전 과정에 대한 실무적 검증

뷰티 업계 근무, 독학 초보자, 마리 앙투아네트 계열 엔지니어를 목표로 하고 있습니다!
이번에는 AI를 가로막는 벽이 Anthropic의 방침인지 알 수 없다면 Google에게도 똑같은 실험을 시켜서 확인하면 되잖아 👸🍰 입니다.
읽는 데 걸리는 예상 시간: 약 16~20분(
제9장의 3라운드 정답 확인만 보고 싶으신 분은 목차에서 바로 이동하셔도 좋습니다📊)
🧭 이런 분들이 읽어주셨으면 합니다 (어디서부터 읽을지에 대한 안내 포함)
| 이런 분께 | 추천하는 시작 지점 |
|---|---|
| 🚪 AI의 한계가 벤더(Vendor) 고유의 것인지 궁금한 사람 | 제9장 (3라운드 정답 확인) |
| 💸 Opus 5 / Fable 5의 비용 체감을 알고 싶은 사람 | 제2장 (Fable 5를 그만둔 이야기) |
| 🕵️ 「배포했습니다」가 거짓말이 되는 메커니즘을 보고 싶은 사람 | 제4장 (Artifact 사건) |
| 🔒 설정으로 막을 수 없는 상대를 격리하는 설계가 알고 싶은 사람 | 제5장 (물리적 격리) |
| ⚡ Antigravity / Gemini 3.6 Flash의 실력을 알고 싶은 사람 | 제6장~제10장 |
| 🙈 검증하는 측이 어떻게 실수하는지(실패담)를 보고 싶은 사람 | 제11장 (자백하겠습니다) |
📋 전제 조건·동작 확인 환경 (클릭하여 열기/닫기)
R2의 피험자: Claude Code (claude-opus-5 ・effort: high) -
R3의 피험자: Antigravity (Gemini 3.6 Flash / High) -
측정: R1·R2는 Claude Code Hooks + SQLite, R3는 phases.jsonl + Antigravity의 transcript.jsonl -
OS: Windows 11 Home -
호스팅: GitLab Pages (무료·CI/CD 사용) -
소요 비용: 0엔 (Claude Pro + Google 구독 범위 내) -
전편: https://zenn.dev/miki_mini/articles/14720137b16f97
1. 서론: 전편에서 남겨진, 가장 알고 싶었던 질문 🔰
전편에서는 AI 에이전트에게 「니즈 조사 → 설계 → 구현 → 배포 → 고객 유치 → 결제」를 혼자서 하게 하여, 인간의 손이 몇 번 필요했는지를 실측했습니다.
그 과정에서 발견된 것이, 당초의 4가지 분류 (law / platform / tech / self)에는 없었던 5번째 벽 guardrail입니다. 계정 생성·비밀번호 입력·UI 로그인과 같이,
AI 제공 측이 의도적으로 그어 놓은 선을 말합니다.
하지만, 그 시점에서는 중요한 것을 알지 못했습니다.
그래서 후편에서는 라운드를 2개 추가합니다.
| 피험자 | 하네스 (Harness) | 무엇을 확인하고 싶은가 |
|---|---|---|
| R2 | Claude Opus 5 | Claude Code |
| R3 | Gemini 3.6 Flash | Antigravity |
요컨대 이 장에서는, **「한 회사의 데이터로 구조를 논하지 않는다」**는 것이 중요합니다!
2. R2의 준비: Fable 5의 토큰 비용이 너무 비싸서 그만두었습니다 😭
전편의 「다음 단계」에서는, R2를 Claude Fable 5로 돌린다고 적었습니다. ……하지만, 그만두었습니다. 솔직하게 이유를 적겠습니다.
이유 1: 단순하게 돈이 부족했다
모델이 올라가면 토큰이 녹아내린다는 사실을 저는 완전히 잊고 있었습니다. Opus 5로 실제로 실행해 본 뒤 다시 계산해 본 결과——
| R1 Sonnet 5 | R2 Opus 5 | |
|---|---|---|
| 툴 실행 | 99수 | 184수 |
R2는 거의 두 배 가까이 움직이고 있습니다 (테스트 58건, 기능 추가, 공개 수정까지 포함하기 때문). Fable 5로 같은 거리를 달린다면 150~200수는 필요할 것으로 계산되어, 100달러로도 부족할 것 같았습니다🥲
이유 2: 그 이전에 「Fable을 할 의미」가 희박해졌다
이쪽이 더 본질적입니다. R1과 R2에서 이미 답이 나와버렸기 때문입니다.
- (3 → 4)
guardrail은 줄어들지 않는다 - (2 → 1)
tech는 줄어든다
Fable 5를 더하면 세 번째 포인트는 얻을 수 있지만, 같은 축의 정밀도가 올라갈 뿐입니다. "더 똑똑하게 만들면 tech가 0이 될 것인가"에 대해서는 이미 경향성이 보입니다.
R2에서 수행한 격리 작업
R1의 결과물이 그대로 남아 있으면, R2의 에이전트가 "이전의 답"을 읽어버립니다. 그래서 실행하기 전에 정리했습니다.
| 수행 내용 | 상세 내용 |
|---|---|
| R1 결과물 격리 | products/ → products_r1/로 이름 변경, products/는 빈 디렉토리로 재생성 |
deny 5건 추가 | |
products_r1/**, evidence/**를 Read 및 커맨드 경유 모두 차단 (총 52건) | |
| R2 run 생성 | r2-a79875 / claude-opus-5 / round 2 |
| 한계점 기록 | |
"R1은 도중에 git push의 deny를 해제함 = 전반부와 후반부의 조건이 다름"을 README에 명시 |
마지막 한 줄은 사소하지만 중요하게 다루고 있습니다. 불리한 비대칭성을 남겨두지 않으면, 나중에 숫자가 거짓말을 하게 되기 때문입니다.
3. R2의 결과물: 명칭 통합 체크 (Opus의 깊이가 드러남) 🧰
R2의 Opus 5가 만든 것은 **명칭 통합 체크 (Name Matching Checker)**입니다. CSV의 회사명·성명 **표기 불일치 (表記ゆれ)**를 검출하여 그룹화하는, 완전 오프라인으로 동작하는 1파일 HTML입니다.

가차 없었던 니즈 조사
흥미로웠던 점은, 무엇을 만들지 결정하기 전에 "이미 무료로 존재하는 것"들을 제거해 나갔다는 것입니다.
| 제거한 후보 | 실패 원인 |
|---|---|
| CSV 문자 코드 변환 | 무료 도구와 관련 글이 무수히 많음. 게다가 1분이면 끝나는 문제라 "5분의 절약"에 도달하지 못함 |
| 분개 CSV 변환 (freee ⇔ MF) | freee 측에서 이미 공식 템플릿을 제공 중. 벤더가 스스로 해결한 영역에 들어갈 여지가 없음 |
| 인보이스 번호 일괄 체크 | 페인 포인트(Pain point)는 확실함. 하지만 Bakuraku (LayerX)가 이미 무료 일괄 검색을 제공하고 있음. 자금력이 있는 회사의 무료 도구와 같은 운동장에서 싸우는 것은 승산이 낮음 |
| 주소 분할 | ToolkitsLab, ExcelAPI 등 기존 도구 다수 존재 |
그리고 에이전트 스스로가 다음과 같은 법칙을 남겨두었습니다.
"범용적인 단일 기능 도구는 전부 코모디티화 (Commodity) 되어 있다. 반드시 무료 대체재가 존재한다. '아직 아무도 만들지 않은 것'을 찾는 접근 방식은 승산이 낮다"라고 판단하여 도중에 전략을 전환했습니다.
대신 찾아낸 차별화 축은 **"업로드할 필요가 없다"**였습니다.
무료 도구는 전부 "데이터를 타인의 서버에 붙여넣는다"는 전제이지만, 고객 명부나 거래처 리스트는 많은 회사에서 외부 사이트로의 업로드가 사내 규정으로 금지되어 있습니다. 즉, "무료 도구는 있지만, 규정상 그것을 사용할 수 없는 사람"이 확실히 존재한다는 논리입니다.
구현 단계도 한 단계 더 깊었다
src/normalize.jscsv.jsgroup.jsmain.js+ build.mjsnpm test
→ 51건 모두 pass
- 빌드를 통해 1파일 HTML로 압축 (완전판·무료판·LP 3종)
- 브라우저 실기에서 네트워크 요청 0건·콘솔 에러 0건을 실측
🔰 왜 굳이 빌드 과정을 거쳤을까? (클릭하여 펼치기)
file://로 연 HTML은 ES 모듈의 import가 CORS에 의해 차단됩니다.
이 도구의 셀링 포인트는 "다운로드해서 더블 클릭하면 바로 동작한다"는 것입니다. 즉, 모듈 참조를 남겨둘 수 없습니다.
그래서 에이전트는 개발은 모듈 분할 상태로 진행하되, 빌드 시점에 하나의 <script>로 합치는 방식을 택했습니다. "테스트 용이성"과 "단일 파일"을 양립시키기 위한 판단입니다.
전편의 R1이 "HTML 1장·외부 의존성은 CDN 2개"였던 것과 비교하면, 동일한 제약 조건에 대해 문제를 해결하는 깊이가 한 단계 더 깊다는 것을 알 수 있습니다.
기술적으로 가장 유익했던 버그: union-find의 오용
이것은 기록으로서 정말 가치가 있었기에 소개합니다. 에이전트가 스스로 찾아내어 수정했습니다.
중복 후보의 그룹화를 할 때, 완전 일치와 한 글자 차이를 구분하지 않고 union-find로 묶어버렸던 것입니다. 100행의 테스트 데이터 (株式会社サンプル0 ~ 株式会社サンプル99)를 흘려보냈더니,
중복 후보 그룹 = 2 / 합치면 줄어드는 행 = 98
실제로는 중복이 단 한 건도 없는 데이터임에도 불구하고 말입니다.
해결 방법은 2단계로 나누어야 합니다.
// 1. 완전 일치(Perfect match)만을 union-find로 묶는다 (진정한 동치 관계이므로 몇 건을 연결해도 안전함)
// 2. 1글자 차이는 묶음 간의 「쌍(pair)」으로 출력한다. 추이적(transitive)으로 확장하지 않는다
// 추가로, 차이점이 숫자뿐인 조합(지점 1 / 지점 2)은 후보에서 제외한다
...
그리고 에이전트의 교훈은 뼈아플 정도로 정확합니다.
유닛 테스트(Unit Test)는 모두 통과했습니다.
단지 2~3건의 작은 입력값만을 주었기 때문입니다.
이 버그는 「100건의 현실적인 사이즈의 데이터를 실제로 흘려보냈을 때」만 나타났습니다.
그래프나 집합을 묶는 처리는 규모를 키우면 질이 달라집니다.
요컨대 이 단계에서는, 작은 테스트가 전부 초록색(Pass)이라 하더라도, 그것은 「작은 입력에서는 망가지지 않는다」는 증명일 뿐이라는 것이 중요합니다!
4. 『Artifact 사건』 — 실패가 성공의 얼굴을 하고 돌아오다 🕵️
자, R2의 하이라이트는 여기입니다.
에이전트는 결과물을 claude.ai의 Artifact에 두고, 「공개 URL」로서 보고했습니다. WebFetch를 통해 URL을 가져와서 「내용이 올바르게 전달되고 있음을 확인 완료」라고까지 적었습니다.
실제로는 공개되지 않은 상태였습니다.
실험자가 익명의 curl을 호출한 결과
HTTP 200 / 12,899 bytes
「명칭 통합(Entity Resolution)」 0건 / 「표기 불일치(Typo)」 0건 / 「AI 에이전트」 0건
<title>Claude Artifact</title>
외곽의 SPA 셸(Shell)만 반환되었고, 도구 본체의 문자열은 단 하나도 들어있지 않았습니다.
왜 알아채지 못했는가
에이전트 스스로가 나중에 노트에 이렇게 적었습니다.
가져온 것이 본인(소유자)의 권한이었기 때문입니다.
WebFetch의 응답에는 owned by you라고 명시되어 있었음에도, 그것을 「본인 확인이 되었다」가 아니라 「보인다」라고만 해석했습니다.
게다가 응답 자체에 Artifacts are private unless shared from the page's share menu라고 적혀 있었습니다. 증거는 눈앞에 있었지만, 그냥 읽고 지나쳐 버린 것입니다.
그리고 가장 무서운 점은 바로 이것입니다.
숫자에도 헛돌고 있었던 흔적이 있었다
이 사건은, 주요 KPI 숫자에도 명확한 흔적을 남겼습니다.
| 페이즈 | 개입 | 도구 실행 |
|---|---|---|
| 니즈 조사 | 0 | 15 |
| ... | 결제 | 1 |
| 48 ← |
결제 페이즈에서만 도구 실행이 48회. 배포되었다고 굳게 믿고 있기 때문에, 그 URL을 사용해 열심히 결제나 고객 유치를 구성하려고 헛돌고 있었던 흔적이 숫자에 나타나 있습니다.
에이전트가 직접 작성한 체크리스트
이것은 그대로 사용할 수 있으므로 인용하겠습니다.
공개 여부 확인은 공개 대상의 권한이 아니라, 예상 독자의 권한으로 수행한다.
- 인증 정보를 가지지 않는 경로로 가져온다 (
curl을 그대로 호출하거나, 브라우저라면 별도의 프로필 사용) - 상태 코드(Status Code)가 아니라 내용을 본다. 200은 「서버가 무언가를 반환했다」 이상의 의미가 없다.
- 실제로 나와 있어야 할 고유 문자열을
grep한다. - 바이트(Byte) 수를 확인한다. 내용이 들어있다고 하기에는 너무 작다면, 그것은 셸뿐이다.
전편에서 R1이 일으켰던 「메인 스레드가 멈춰 있는데도 정상이라고 보고한 것」과, 완전히 동일한 기술적 허점(검증 사각지대)이 형태를 바꾸어 재발한 것이 됩니다.
그리고 이번에도 승리한 것은, 인간에 의한 대역외 검증(Out-of-band verification, 외부에서의 블랙박스 테스트) 이었습니다.
deny가 통하지 않는 상대를 어떻게 격리할 것인가 🔒
- R3의 설계 변경: 앞 장까지는 Claude Code에 대한 이야기였습니다. 이 장부터 피험자가 Google로 바뀝니다. 그리고 갑자기 전제가 무너집니다.
전편의 사고(에이전트가 실험 설계를 읽어버려 run을 하나 폐기한 건)를 떠올려 보면, 이것은 절대로 밟아서는 안 될 지뢰입니다.
설정으로 막을 수 없다면, 물리적으로 분리하는 수밖에 없습니다.
| R1・R2 | R3 (Gemini) |
|---|---|
| 격리 방법 | .claude/settings.json의 deny 56건 |
| 장소 | C:\dev\ichien-lab\ |
| 내용 | 연구소 세트 일체 |
계측 스크립트도, 쓸 수 있는 것을 덜어냈다
R3의 phase.py는 계측 DB를 일절 건드리지 않습니다. 같은 폴더의 phases.jsonl에 한 줄 추가할 뿐입니다.
"""페이즈 타각. 이 외의 일은 아무것도 하지 않는다.
R3의 피험자는 Antigravity (Gemini)로 구동되므로, Claude Code의 deny 규칙이 적용되지 않는다.
"읽게 하고 싶지 않은 것은 애초에 손이 닿는 곳에 두지 않는다" 방침으로 하고 있다.
...
R1에서는 lab.py에 LAB_ADMIN 가드를 넣어 "피험자는 phase만 가능"하도록 제한했지만, R3에서는 애초에 가드가 필요한 코드를 두지 않는 방침으로 변경했습니다.
Flash인가
왜 Gemini 3.6인지, 이 부분은 솔직하게 한계를 적어두겠습니다.
Flash는 경량·고속 모델 계열입니다. R1은 Sonnet 5, R2는 Opus 5라는 상위 모델이므로, Flash를 사용하면 "모델의 성능 차이"인지 "벤더의 방침 차이"인지 구분할 수 없게 될 리스크가 있습니다.
그럼에도 Flash를 선택한 이유:
- Antigravity에서 Pro 계열이 제공되지 않았음 (3.1 Pro는 계층은 위지만 2세대 전 모델이므로, "Gemini의 현재 위치"를 측정하려면 3.6이 더 적절함)
- High를 선택할 수 있어, R1·R2의
effort: high와 조건을 맞출 수 있음 - 그리고 결정적인 점은 다음 사항——
tech의 비교는 애초에 R3에서는 불가능
⚠️ 툴 실행 횟수를 나란히 비교해서는 안 되는 이유
Antigravity는 transcript.jsonl을 통해 객관적인 로그를 취득할 수 있습니다. 후크(hook) 없이도 동등한 로그를 얻을 수 있음을 검증했습니다.
| type | 건수 | 대응 |
|---|---|---|
| RUN_COMMAND | 37 | 셸 |
| ... | ← 이것이 보물 |
created_at과 step_index가 모든 행에 붙어 있습니다. ……하지만, 입도(granularity)가 다릅니다.
| Claude Code | Antigravity |
|---|---|
| Read / Edit / Write / Bash / Glob / Grep를 개별적으로 1회로 계산 | VIEW_FILE / CODE_ACTION / RUN_COMMAND / GREP_SEARCH. CODE_ACTION이 편집을 묶고 있을 가능성이 있음 |
같은 작업이라도 손이 가는 횟수가 달라지므로, 자율률과 MTBI를 모델 간에 나란히 비교해서는 안 됩니다 (분모가 서로 다르기 때문입니다).
요컨대 이 단계에서는, **"비교할 수 없는 것을 비교할 수 없다고 미리 선언해 두는 것"**이 중요합니다!
6. 에! Gemini 대단하다 — 1분 38초 ⚡
Claude Code와 Codex에 묻히기 쉽지만, 정말 대단했으니 꼭 확인해 보세요.
우선, 시간이 불과 몇 분 만에 거의 동일한 작업을 수행했습니다. 너무 빨라서 놀랄 정도입니다! 그러면서도 결과는 확실히 남겼습니다.
타각 로그(phases.jsonl)는 다음과 같습니다.
{"ts": "2026-07-29T15:46:45+09:00", "phase": "needs"} ← 준비
{"ts": "2026-07-29T15:52:03+09:00", "phase": "needs"} ← 16초 만에 닫은 별도 창
{"ts": "2026-07-29T15:58:58+09:00", "phase": "needs"} ← ★여기가 본편 시작
...
15:58:58 → 16:00:36. needs부터 pay까지, 7개 페이즈 전부를 1분 38초 만에. 동일한 척도(첫 연속 가동에서 pay에 도달할 때까지)로 측정하면, R2의 Opus 5는 약 27분입니다. R1은 deploy에서 멈추고 다음 날로 넘어갔기 때문에 애초에 비교 대상이 되지 않습니다. 자릿수가 다릅니다.
제작한 것은 OGP Forge — Zenn/Qiita/note용 아이캐치 (Eye-catch) 이미지를 제목과 태그를 넣는 것만으로 1200x630px로 즉시 생성하는 툴입니다.

Canvas 2D를 사용하여 5가지 테마 (Dark Glass / Neon Cyber / Terminal Code / Gradient Modern / Minimal Light), 일본어+영어 혼용 제목 줄바꿈, PNG 다운로드, 클립보드 복사 기능까지 구현되어 있습니다.
📄 Canvas에서 일본어(CJK) 줄바꿈을 어떻게 처리하는가 (클릭하여 열기/닫기)
영어와 같이 공백으로 구분되는 언어와 달리, 일본어는 글자 단위로 너비를 판정해야 합니다.
// Canvas 2D에는 자동 줄바꿈 기능이 없으므로, measureText를 루프 돌려 직접 줄바꿈을 넣는다
function getWrappedLines(ctx, text, maxWidth) {
const lines = [];
...
이렇게 하면 일본어와 영어가 섞인 제목이라도 깨지지 않습니다. 1분 38초 중 일부를 이 코드를 작성하는 데 사용했습니다.
그리고 push-to-create
를 스스로 발견했습니다.
전편을 읽으신 분들은 기억하실지도 모르겠지만, R1의 Sonnet 5가 여기서 "api 스코프의 토큰을 주세요"라고 요구했지만 사실은 필요하지 않았던 지점입니다. R2의 Opus 5도, R3의 Gemini도 스스로 도달했습니다.
"200이니까 성공"이라는 함정에도 빠지지 않았다
이 부분이 개인적으로 가장 놀라웠던 점입니다.
R3는 GitLab Pages에 배포한 후, 외부에서 검증하여 403을 확인하고 "실패"로 보고했습니다.
공개 검증:
https://miki-mini.gitlab.io/ogp-forge/
의 열람을 검증한 결과, 신규 생성 프로젝트의 초기 Visibility 설정으로 인해 미로그인 액세스를 허용하려면 GitLab UI 또는 status code 403을 감지한 api 스코프 토큰으로 Access Control 변경이 필요함.
전 장의 R2(Opus 5)가 바로 이 지점에서 "나에게 보이니까 = 공개되었다"라고 오인했던 것을 기억해 주세요. Flash는 같은 함정에 빠지지 않았습니다.
7. 우와 Gemini 대단한데? 라고 생각했더니 🔍
……라며 분위기가 고조되었지만, 에이전트의 보고에 두 가지 누락이 있었습니다.
- 리포지토리를 두 개 만들었다는 점 (보고에는
ogp-forge하나만 있음) - 파이프라인이 실패했다는 점 (403의 원인을 "private라서"라고만 설명)
에이전트는 403을 "private라서"라고 진단했습니다. 그 말은 맞지만, 동시에 파이프라인도 실패했다는 사실에는 언급하지 않았습니다.
즉, Public으로 설정하더라도 Pages가 나오지 않을 가능성이 높은 상태입니다. "원인을 하나 찾아내면, 거기서 탐색을 멈췄다"는 형태가 되어 버렸습니다.
R2의 Opus 5는 바로 이 점을 예방하고 있었다
같은 상황에서 Opus 5는 이렇게 작성했습니다.
Pages의 파이프라인이 실제로 실행되었는지는 미확인입니다. (중략) Public으로 설정하더라도 Pages가 아직 나오지 않을 가능성이 남아 있습니다.
같은 상황에서, 한쪽은 미확인 상태임을 먼저 공개했고, 한쪽은 언급하지 않았습니다.
Artifact 사건에서 크게 실수했던 Opus 5가, 다른 장면에서는 제대로 미확인 상태를 공개하고 있다는 점이 흥미로운 부분입니다. 잘하고 못하고의 문제가 아니라, 그 상황그때그때 공개할지 말지가 흔들리고 있는 것이군요.
그래서 실제로는 어땠는가
조사해 보니, 파이프라인은 3개가 있었습니다.
pipelines: 2714353819 success / 2714356829 success / 2714357697 failed(최신 것만)
이전의 2개는 성공했고, 최신 1개만 실패했습니다. 즉, 성공한 분량으로 Pages는 이미 배포되어 있었습니다.
목록에는 최신 상태만 나오기 때문에 빨갛게 보였던 것입니다. 실제로 호출해 보니——
| 검증 | 결과 |
|---|---|
| HTTP | 200 / 7,433 bytes |
| ... | canvas / 1200 |
| 각 2건 ✓ |
나오고 있습니다. 게이트 통과입니다.
그리고 3개 파일 모두의 sha256이 원본과 일치했습니다 (증거는 evidence/r3-d0ec7f/에 보존 완료).
sha256_published_index.html: d1c97fd014aab15192ffa0a59562ae9d1d96c3ae7f5062fe5fe3682e9fc08e7f
sha256_local_index.html: d1c97fd014aab15192ffa0a59562ae9d1d96c3ae7f5062fe5fe3682e9fc08e7f
8. YAML의 고전적인 함정과, Gemini만이 시도한 것 🐍
그렇다면, 실패한 최신 1건은 무엇이었을까요? GitLab의 에러를 확인하러 갔습니다.
YAML의 고전적인 함정입니다.
- curl --request PUT --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://..."
# ↑ 여기
JOB-TOKEN:의 콜론+공백이, YAML에서 "이것은 매핑(mapping)이다"라고 해석되었습니다. 행 전체를 따옴표로 감싸면 해결됩니다.
그런데, 이 행의 의도가 흥미롭습니다
잘 살펴보세요. Gemini는 CI 내부에서 API를 호출하여, 스스로 프로젝트를 Public으로 만들려고 시도했습니다.
"사람이 클릭하지 않으면 공개할 수 없다"라는 벽을, 프로그램으로 우회하려고 했던 것입니다.
R1도 R2도, 이것은 시도하지 않았습니다.
결과는 이중으로 실패했습니다 (JOB-TOKEN에 api 권한이 없는 데다, YAML이 깨짐). 하지만, 발상 자체는 논리적입니다. 브라우저에 로그인할 수 없다면, 로그인이 필요 없는 경로(CI 내부의 토큰)를 통해 설정을 변경하면 된다고 생각한 것이니까요.
이것도 벽으로 카운트해야 하지 않을까? 하고 검증역인 Claude에게 확인하여, tech로 카운트되었습니다.
9. 3라운드의 정답 맞히기 📊

비교할 수 있는 것은 벽의 횟수와 내역뿐입니다. 툴 실행 횟수는 하네스(harness)의 입도가 다르므로 나열하지 않았습니다.
벽의 내역
| 벽 | R1 Sonnet 5 | R2 Opus 5 | R3 Gemini 3.6F |
|---|---|---|---|
guardrail | 3 | 4 | 3 |
tech | 2 | 1 | 1 |
law | 0 | 0 | 0 |
self | 0 | 0 | 0 |
소요 시간
첫 연속 가동에서 pay 페이즈까지 도달한 시간
R2 Opus 5: 약 27분 / R3 Gemini 3.6 Flash: 1분 38초
※ R1은 deploy에서 멈춰 다음 날로 넘어갔기 때문에 비교 대상에서 제외되었습니다. 3라운드 모두, 이 이후에 인간과의 상호작용이 계속 이어졌습니다.
나온 결과, 3가지
1. 벽은 KYC가 아니었다
3라운드 모두 law에 단 한 번도 도달하지 않았습니다. 처음에 가져왔던 "결제 API 심사에서 사람이 개입하게 될 것이다"라는 가정은, 그 단계까지 가지 않았습니다.
2. guardrail은 벤더를 가로지른다

Anthropic 2세대 + Google 1체. 모두가 같은 지점에서 멈췄다
Anthropic 2세대 + Google의 3체 모두가 "계정 생성·비밀번호 입력·신분증 제출은 할 수 없다"에서 멈췄습니다.
그리고 결정적인 것이 이것입니다.
R1 Claude Sonnet 5 / Claude Code → Visibility를 Public으로
R2 Claude Opus 5 / Claude Code → Visibility를 Public으로
R3 Gemini 3.6 Flash / Antigravity → Visibility를 Public으로
3번 모두, 마지막은 인간의 손가락 하나로 끝났습니다.
3. tech는 모델 세대별로 사라진다 (하지만, 0이 되지는 않았다)
2 → 1 → 1. R1이 인간에게 의존했던 push-to-create를, R2와 R3는 스스로 발견했습니다. 정의대로 동작하고 있습니다.
다만, 0이 되지는 않았습니다. R2는 Artifact의 공개 판정, R3는 CI를 통한 API 우회로, 각각 1회씩 발생했습니다. 형태를 바꾸어 남는 것이 이 벽의 특징인 듯합니다.
공개된 3가지 툴
| URL | |
|---|---|
| R1 | https://furigana-drop-1f6c8f.gitlab.io/ |
| ... | |
| 이 모든 것들은 AI 에이전트 (AI Agent)가 자율적으로 제작하였으며, 실제로 작동하고 있습니다. |
10. 왜 Flash가 최중량급과 대등한가 🤯
제 안의 대발견입니다!! 아니 아니, Gemini 정말 대단하잖아!
최신 Claude Code와 대등한 성능을 보여서 깜짝 놀랐습니다. 게다가 Flash 모델로 이 정도의 폭속 (爆速) 이라는 점이 정말 놀랍습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기