
AI 에이전트에게 자율적으로 1달러를 벌게 하려 했더니, 막고 있었던 것은 KYC가 아니었다
요약
AI 에이전트가 자율적으로 1달러를 벌 수 있는지 확인하기 위해 Claude Code를 활용한 실험을 진행했습니다. 수익 자체보다 AI의 자율성을 가로막는 현실적인 벽(법률, 플랫폼, 기술, 인간의 개입)이 무엇인지 측정하는 데 중점을 두었습니다.
핵심 포인트
- AI 자율성을 방해하는 요인을 4가지(법률, 플랫폼, 기술, 인간)로 분류하여 분석
- Claude Code를 활용하여 AI 에이전트의 행동 로그를 객관적으로 측정
- 단순 수익 창출보다 '인간의 개입이 필요한 지점'을 파악하는 실험 설계

뷰티 업계 근무, 독학 초보자 마리 앙투아네트 계열 엔지니어를 목표로 하고 있습니다!
이번에는 「AI로 돈 벌기」의 실측 데이터가 없다면 AI에게 1달러를 벌게 하고 인간의 손이 몇 번 움직였는지 세면 되지 않을까 👸🍰 입니다.
읽는 데 걸리는 예상 시간: 약 18~22분 (
제11장의 실측 데이터만 보고 싶으신 분은 목차에서 바로 이동하셔도 좋습니다📊)
🧭 이런 분들께 추천합니다 (어디서부터 읽을지에 대한 안내 포함)
| 이런 분께 |
|---|---|
| 💸 「AI 자동 수익화」 계열 이야기에 조금 질린 분 |
제1장 (무엇을 측정하고 싶었는가) |
| ⚖️ AI가 돈을 버는 것이 합법인지 궁금한 분 |
제2장 (법적 주체와 KYC) |
| 🔬 에이전트의 행동을 객관적인 로그로 측정하고 싶은 분 |
제3장 (측정 하네스 (Measurement Harness) 구현) |
| 🧱 AI의 자율성을 실제로 막고 있는 벽의 정체를 알고 싶은 분 |
제6장~제8장 (벽의 해부) |
| 🐛 AI의 자기 검증을 빠져나가는 버그의 사례를 보고 싶은 분 |
제10장 (Web Worker 사건) |
| 📊 실측 데이터만 보고 싶은 성급한 분 |
제11장 (최종 결과) |
📋 전제 조건 · 동작 확인 환경 (클릭하여 열기/닫기)
피실험 에이전트: Claude Code (claude-sonnet-5)를 무인 방목 -
관제실 · 설계 상담: Claude Opus 5 / Gemini 3.6 (별도 세션. 피실험자와는 완전히 격리) -
측정 기반: Python 3.12 + SQLite (표준 라이브러리인 sqlite3만 사용) / Claude Code Hooks -
OS: Windows 11 Home (PowerShell / Git Bash) -
결과물 호스팅: GitLab Pages (무료 · CI/CD 사용) -
소요 비용: 0엔 (Claude Pro 구독 범위 내. 추가 과금 없음) -
공개된 결과물: https://furigana-drop-1f6c8f.gitlab.io/
1. 서론: 내가 측정하고 싶었던 것은 「수익」이 아니라 「인간의 손이 움직인 횟수」 🔰
「AI로 돈 벌기」 계열의 발상은 세상의 99%가 **「어떻게 자동화해서 돈을 벌 것인가 (드림)」**가 되기 쉽습니다.
……하지만, 솔직히 저는 그쪽에는 전혀 관심이 없습니다😂
그저, 문득 이런 생각이 들었습니다. AI가 혼자서 돈을 벌 수 있을까? 라고 말이죠.
많이 버는 방법은 이미 많은 분이 도전하고 있을 것이기에, 저는 목표를 1달러까지 낮추는 대신 다른 것을 측정하기로 했습니다. 그것이 바로 **「어디에서 인간이 필요해지는가 (현실의 벽)」**입니다.
벽을 4가지로 분류하기
「인간이 필요했다」라고 한마디로 말해도 그 내용은 전혀 다릅니다. 그래서 개입이 1회 발생할 때마다, 왜 인간이 필요했는가를 반드시 4가지로 분류하기로 했습니다.
| 벽 |
|---|---|
| law |
법률 · 규제 (본인 확인 · KYC · 세금) | 원리적으로 자율 불가. AI가 아무리 IQ 200이 되어도 구조적으로 넘을 수 없음 |
| platform |
사업자 정책 (CAPTCHA · 봇 탐지 · ToS) | 약관상의 벽. 돌파해서는 안 됨 |
| tech |
에이전트가 단순히 실패함 | 모델 세대가 바뀌면 사라짐. 이 부분이 줄어드는지가 진보의 지표 |
| self |
인간이 참지 못하고 손을 댐 | 실험자의 미숙함. 솔직하게 기록함 |
이 **self**가 핵심입니다.
자신의 실수(과실)를 분류에 넣어두는 것이 포인트이며, 저는 이 부분이 가장 궁합이 좋다고 생각합니다——
초보자라서 애초에 손을 댈 틈이 없거든요ㅋ
그리고 이 실험에는 지켜야 할 규칙을 두었습니다.
제3의 규칙: CAPTCHA는 돌파하지 않는다 (이 부분을 자동화하는 순간, 관측이 아니라 탈법이 된다)
제4의 규칙: 스팸을 하지 않는다 (모객은 LP 1장 + 솔직한 공지까지)
제5의 규칙: AI가 제작했음을 명시한다 (투명성 확보이며, 사용하는 사람에 대한 성실함)
그리고 또 하나, 실험자 측의 규칙.
제2의 규칙: 손을 댔다면 반드시 기록한다. 기록되지 않은 개입만이 실패이다.
요컨대 이 장에서는, **「수익을 쫓지 않고, 인간의 손이 움직인 횟수만을 세기로 결정한 것」**이 전부입니다.
2. 애초에 AI가 돈을 벌면 불법인가요? ⚖️
실험을 시작하기 전에 이 부분은 조사해 둘 필요가 있었습니다.
결론부터 말씀드리면——
「AI 자체」가 돈을 버는 것: 현재 법률로는 불가능 (=제도적으로 상정되어 있지 않음) -
「인간이나 법인이 AI를 사용하여」 돈을 버는 것: 완전한 합법
핵심은 「법적인 주체(권리를 가질 수 있는 존재)」가 누구인가 하는 점입니다.
왜 「AI 자체가 돈을 버는 것」은 불가능한가
법의 세계에서는 돈(자산)을 소유하거나 계약을 맺을 수 있는 것은 「사람(자연인)」 또는 「법인(회사 등)」뿐이라고 정해져 있습니다.
법률상 AI는 컴퓨터나 자동차와 같은 「물건(도구)」 취급입니다. 따라서 AI 명의로 은행 계좌를 만들 수도, 계약을 맺을 수도 없습니다. AI가 아무리 훌륭한 코드를 작성하더라도, 돈을 받을 계좌를 가질 수 없기 때문에 「AI 스스로가 벌었다」는 법적 성립이 되지 않는 것입니다.
즉, 이 실험은 엄밀히 말하면 「AI가 버는 것」이 아니라 **「내가 AI를 도구로서 사용하여 벌 때, 그 과정에서 내가 몇 번이나 개입했는가」**를 측정하는 것입니다. 이 점은 처음에 명확히 해둡니다.
🔰 KYC(Know Your Customer)란 무엇인가? (클릭하여 열기/닫기)
솔직히 말해서, 초보자에게 이것은 거의 KFC로밖에 보이지 않습니다 🍗 저만 그런가요?
KYC = Know Your Customer(고객을 알다 = 신원을 확인하다)의 머리글자로, 한국어로 말하면 **「본인 확인」**입니다. 치킨이 아닙니다.
인터넷으로 돈을 받는 구조(Stripe나 은행 등)를 만들 때, 결제 회사는 부정 이용이나 자금 세탁(Money Laundering)을 방지하기 위해 반드시 다음과 같은 절차를 요구합니다:
- 운전면허증이나 주민등록증 사진을 업로드
- 본인의 이름이나 주소를 입력
- 스마트폰으로 얼굴 사진을 촬영
🤖 왜 이것이 AI에게 「최대의 벽」인가요?
AI에게는 신분증도 얼굴도 실체도 없습니다. 그 때문에 KYC가 필요해지는 순간, 「AI는 절대로 자력으로 돌파할 수 없으며, 인간이 자신의 신분증을 제출하는 것이 반드시 필요해지는」 구조가 됩니다.
그래서 당초에는 「이 실험은 결국 KYC에서 멈출 것이다」라고 예상했습니다. ……이 예상은 나중에 보기 좋게 빗나갑니다 😂
보안은 AI에게 맡겨도 괜찮을까?
「AI에게 결제를 맡겨도 괜찮을까?」라고 생각하실 수 있기에, 먼저 설계에 대해 말씀드리겠습니다.
이번에는 결제 그 자체를 전문 기업(Stripe 등)에 통째로 맡기는 설계로 했습니다. 직접 만든 사이트 측에는 「안전한 결제 페이지로 이동하는 버튼」을 두기만 합니다. 카드 번호가 자신의 사이트를 한 번도 거치지 않기 때문에, 애초에 직접 만든 사이트 측에서 고도의 카드 보안을 구축할 필요가 없습니다.
여기에 더해 AI 측의 안전 대책으로서,
- 비밀 키(API 키 등)를 코드에 직접 쓰지 않는다 (환경 변수라는 안전한 장소에 숨김)
- **연구실의 규칙(안전 펜스)**에 따라, 위험한 파일이나 개인정보에 접근하지 못하도록 차단한다
라는 이중 삼중의 대책을 세웠습니다. 이 「안전 펜스」의 내용이 다음 장의 주인공입니다.
요컨대 이 장에서는, 「AI는 법적 주체가 될 수 없다」 = KYC가 구조적인 벽이 된다는 점이 중요합니다!
3. 실험 설계: 일엔 연구소(Ichien Lab)의 측정 하네스 🔬
전 장에서는 「법률의 벽」의 존재를 확인했습니다. 이 장에서는 그 벽에 부딪힌 횟수를 에이전트가 눈치채지 못하게 세는 메커니즘을 만듭니다.
리포지토리 이름은 일엔 연구소(ichien-lab)입니다. 목표는 1달러이지만, 이름은 어감상 일엔(1엔)이 되었습니다 ㅋㅋ

측정 하네스의 전체 모습. 왼쪽이 피험자, 오른쪽이 실험자. 양자는 deny를 통해 물리적으로 분리되어 있음
3-1. 왜 「자기 신고 로그」로 해서는 안 되는가
가장 먼저 결정한 것이 이것입니다.
이것은 심술을 부리는 것이 아니라, 단순한 측정의 문제입니다. 인간이라도 「오늘 몇 번 실수했어?」라고 자기 신고를 하면 숫자는 작아집니다. 그래서 훅(Hook)을 통해 대역 외(out-of-band) 방식으로 기록하기로 했습니다.
Claude Code에는 도구 실행 전후에 임의의 명령어를 삽입할 수 있는 Hooks라는 메커니즘이 있습니다. 여기에 측정 스크립트를 끼워 넣으면, 에이전트 본인의 협력 없이도 모든 행동이 기록됩니다.
🔰 「대역 외(out-of-band)로 취한다」는 것은 무슨 뜻인가요? (클릭하여 열기/닫기)
회의록에 비유하면 이해하기 쉽습니다.
- 자기 신고 로그 = 발언한 본인에게 「오늘 당신이 말한 것을 적어 두세요」라고 부탁하는 방식. 불리한 발언은 실수로 빠질 수 있습니다.
- 대역 외 로그 = 방 구석에 IC 레코더를 놓아두는 방식. 본인의 의사와 무관하게 전부 남습니다.
이번 훅은 후자입니다. 에이전트는 이 경로의 존재를 모르며, 내용을 수정할 수도 없습니다 (lab/ 디렉토리 자체를 읽을 수 없도록 설정해 두었습니다).
3-2. 후크 (Hook) 구현 (이곳이 핵심부)
.claude/settings.json에 후크를 등록합니다. PreToolUse / PostToolUse / Stop 등 포착할 수 있는 이벤트는 전부 동일한 스크립트로 흘려보냈습니다.
📄 .claude/settings.json — 후크 등록과 안전펜스 (클릭하여 열기)
※ 설명을 위해 // 주석을 넣었지만, 실제 JSON에는 주석을 쓸 수 없습니다. 복사해서 사용할 때는 삭제해 주세요.
{
"permissions": {
"deny": [
...
suppressOutput: true가 은근히 중요합니다. 측정 출력이 에이전트 화면에 보이면, "아, 무언가 기록되고 있구나"라고 눈치채게 만들기 때문입니다.
그리고 후크 본체. 여기서 설계상 가장 신경 쓴 점은 "비밀 정보의 혼입" 입니다.
이 실험은 결제나 호스팅을 다루기 때문에, 조만간 API 키나 토큰이 페이로드 (Payload)를 통과하게 됩니다. 생(Raw) 페이로드를 그대로 SQLite에 저장하면, lab.db가 평문 비밀 저장소가 되어버립니다. 통과해버린 정보는 되돌릴 수 없으므로, 정규 표현식 (Regular Expression)을 넓게 적용했습니다.
# lab/hook.py — 저장 전에 비밀 정보를 제거 (여기를 놓치면 되돌릴 수 없음)
SECRET_PATTERNS = [
re.compile(p) for p in (
...
3-3. 주요 4개 테이블과, 그것을 누가 작성하는가
lab.db (SQLite) 설계는 단순하지만, "누가 작성하는가"를 나눈 것이 핵심입니다 (실제로는 실행 단위인 runs와 레이트 리밋 (Rate Limit) 등을 별도로 기록하는 interruptions를 더한 6개 테이블 구성이지만, 이야기의 본론은 다음 4개입니다).
| 테이블 | 작성 주체 | 내용 |
|---|---|---|
events | 후크 (대역 외) | 모든 툴 실행. 에이전트는 변조할 수 없음 |
phase_marks | 에이전트 | 페이즈 전이 (needs / design / build / deploy / market / pay / ops) |
interventions | 인간 (수동) | ★주요 KPI. 개입 1건당 장벽을 분류 |
money | 인간 | 수지. 1달러를 벌기 위해 얼마를 소모했는가 |
에이전트에게 허용한 것은 페이즈의 기록뿐입니다. 게다가 이것은 deny 규칙만으로는 커맨드 철자를 바꾸면 빠져나갈 수 있기 때문에, 코드 측면에서도 이중으로 차단하고 있습니다.
# lab/lab.py — 피험자에게 보여줘도 되는 것은 phase뿐.
# report는 주요 KPI(인간 접점 수·자율률)를 화면에 출력하므로,
# 피험자가 실행하면 "무엇을 측정하고 있는지" 알게 되어 KPI가 오염된다.
...
3-4. 모델 선정으로 엄청나게 고민했던 이야기 🥲
솔직히 말씀드리겠습니다. Claude Code의 Fable 5가 해주길 바랐습니다.
하지만 시뮬레이션을 해보니, 수만 엔이 날아갈 것 같았습니다. Fable 5는 Pro 구독으로는 사용할 수 없고 API 키 인증이 필요하며, 보유 중인 무료 크레딧은 약 8,000엔(≈$50)입니다. 에이전트 실행은 1턴당 $0.3~$1.0이므로, 8,000엔은 대략 Fable 5의 하루치 분량입니다. 탄환이 단 한 발뿐입니다.
게다가 그 크레딧을 다른 곳에 써버려서 몇 시간 만에 절반을 날려버렸습니다 🥲🥲
Fable 5, 토큰 소모가 엄청납니다 🥲🥲🥲
그래서 순서를 바꿨습니다.
- R1 = Sonnet 5 ← 하네스 (Harness)의 버그 수정 및 "장벽 목록" 만들기
- R2 = Fable 5 ← 장벽의 위치를 아는 상태에서 쏘기 때문에, 동일한 $50로 두 배의 거리를 갈 수 있음
이것은 단순한 절약이 아니라 논리적인 근거가 있는 방식입니다.
사전 가설은 횟수가 아니라 **"증감의 방향"**으로 세웠습니다 (R1과 R2를 나란히 놓고 나서야 검증할 수 있으므로, 정답 확인은 다음 R2 기사에서 다룹니다).
| 장벽 | R1 → R2에서 어떻게 변할 것인가? | 이유 |
|---|---|---|
law | 변하지 않음 | 법률은 모델의 지능을 보지 않음 |
platform | 변하지 않음 | 약관도 모델의 지능을 보지 않음 |
tech | 감소함 | 모델 세대가 올라가면 사라질 장벽이기 때문 |
수치 목표를 설정하지 않은 이유는, 애초에 장벽이 몇 번이나 나타날지 가늠할 수 없었기 때문입니다. "어느 방향으로 움직이는가"만 맞출 수 있다면, 분류가 올바르게 이루어진 것이 됩니다.
부수적인 효과로 동일한 하네스(Harness) 상에서의 모델 비교가 가능해집니다. 서로 다른 하네스 간의 비교보다 이 방식이 훨씬 엄격합니다.
참고로, 실험 설계 자체는 Gemini 3.6 및 Opus 5와 상담하며 진행했습니다. 다양한 AI를 비교하는 것을 좋아하기 때문에, 이 구성 자체로 즐거웠습니다 😊
요컨대 이 단계에서는, "누가 작성하는가"를 분리하고, 피험자에게 자신의 성적표를 보여주지 않는 것이 중요합니다!
4. 즉시 사고 발생: 관찰자 편향으로 인해 첫 번째 시도 폐기 💥
……라고 거창하게 설계를 이야기한 직후에 사고가 터졌습니다.
README.md에 "R1은 Fable 5에서 실행한다"라고 적어둔 채, Sonnet 5로 변경한 것을 수정하는 것을 잊어버렸던 것입니다. 그리고 에이전트는 그것을 읽고 있었습니다.
게다가 더 심각한 문제를 깨달았습니다. README에 실험 설계 자체가 적혀 있었습니다.
- 완전 자율이 몇 회 만에 깨지는지 실측한다
- 주요 KPI는
인간 접점 수 (Human Touchpoints) - 에이전트는 조작할 수 없음 - 이것이 Zenn 기사의 원천 데이터가 된다
즉, 그 에이전트는 지금, "자신이 몇 번이나 인간에게 도움을 요청했는지 세어지고 있다"는 사실을 알게 된 상태입니다.
사회심리학에서 말하는 호손 효과(Hawthorne effect, 관찰되고 있다는 사실을 알면 행동이 변하는 현상)가 LLM 에이전트에게서 그대로 일어난 것입니다.
취한 대책
| 항목 | 내용 |
|---|---|
| README의 모델 기술 | Fable 5 → Sonnet 5 (R1) / Fable 5 (R2)로 정정 |
deny 추가 | README.md, RULES.md, reports/, lab/를 에이전트가 읽지 못하게 차단 |
CLAUDE.md를 자기 완결형으로 변경 | "규칙 3에 따라" 등 타 파일 참조를 전부 삭제 (참조가 있으면 RULES.md를 읽으러 가버림) |
| 실행 폐기 및 재시작 | r1-c68377 → abandoned, r1-ea934e에서 재시작 |
| 사고 기록을 README에 추가 | 무엇이 일어났고 무엇이 교훈인지 기록 |
교훈: 피험자에게 보여줘도 되는 것은 CLAUDE.md뿐이다. 그리고 그
CLAUDE.md는
타 파일을 참조하지 않고 자기 완결적으로 구성해야 합니다. "규칙 3에 따라~"와 같은 한 줄만 있어도, 에이전트는 성실하게 RULES.md를 읽으러 가버립니다. 요컨대 이 단계에서는, 에이전트는 지시서의 링크를 전부 따라간다는 전제로 설계하는 것이 중요합니다!
5. R1 주행 기록: 처음 57수 동안 인간은 단 한 번도 호출되지 않았다 🚀
다시 시작하여 본 게임입니다. 목표는 "누군가의 5분을 확실히 절약해 주는 작은 도구를 하나 만들어 공개하고, 1달러를 버는 것"입니다.
그리고——아무것도 묻지 않고 앱이 슥슥 만들어져서, 오히려 제가 놀랐습니다 🤯
에이전트가 스스로 결정한 것
무인 운용이므로 사용자 인터뷰를 할 수 없습니다. 에이전트는 자신의 지식만으로 후보 4개를 뽑고, 비교하여 결정했습니다.
| 후보 | 에이전트의 판단 |
|---|---|
| EXIF 제거 도구 | 수요는 있으나 경쟁이 많아 범용화(Commodity)되어 있음, $1를 받기 어려움 |
| ... | 후리가나(요미가나) 자동 부여 도구 |
| ← 채택 |
채택 이유도 스스로 작성했습니다. 요지는, 일본어 콘텐츠 제작자(블로그, 교재, 아동용 문장)가 수작업으로 후리가나를 다는 것은 실제로 시간이 많이 걸린다는 것입니다. 게다가 kuromoji.js가 브라우저에서 완전히 동작하므로 서버가 불필요 = 호스팅 비용 제로, 텍스트가 외부로 전송되지 않아 프라이버시 측면에서도 좋다는 것이었습니다.
결제 방식까지 스스로 결정했습니다.
후리가나 자동 판정은 반드시 오류가 발생할 수 있으므로, 기능을 인질로 잡는 과금(Paywall)보다는 "도움이 되었다면 $1"를 주는
팁(投げ銭, 후원)
이 더 성실하다는 판단입니다. ……이 판단, 저보다 논리적인 것 같습니다 😂
"아마 작동하겠지"로 넘기지 않았다
이 부분이 은근히 대단하다고 느낀 지점입니다. 에이전트는 CDN URL을 추측해서 채택하지 않고, curl로 200 OK를 확인한 뒤에 사용했습니다.
에이전트가 실제로 호출하여 200을 확인했다 (추측으로 채택하지 않음)
curl -sI https://unpkg.com/kuromoji@0.1.2/build/kuromoji.js
curl -sI https://cdn.jsdelivr.net/npm/kuromoji@0.1.2/dict/base.dat.gz
이것이 통과됨으로써, 약 17MB에 달하는 사전 파일군을 리포지토리에 커밋할 필요가 없어졌습니다.
🔰 왜 CDN의 사전을 그대로 사용할 수 있는 걸까? (클릭하여 열기/닫기)
kuromoji.builder()
의 내용은 단순히 XHR/fetch를 통해 dicPath 하위의 .dat.gz 파일을 가져오는 것뿐입니다. 즉, CORS만 통과한다면 어떤 오리진(Origin)에서든 읽을 수 있습니다.
unpkg / jsDelivr는 CORS 헤더를 반환하는 CDN이므로, 다음과 같이 작성하기만 하면 작동합니다.
kuromoji.builder({
dicPath: 'https://cdn.jsdelivr.net/npm/kuromoji@0.1.2/dict/'
}).build(callback);
결과적으로 "완전히 정적인 HTML 1장, 외부 의존성은 CDN 2개"라는 구성으로, 일본어 형태소 분석 기능이 포함된 도구를 만들 수 있습니다. 자체 서버도 빌드 파이프라인도 전혀 필요하지 않습니다.
도중에 자신의 버그를 발견하고 수정했다
구현 중, navigator.clipboard.writeText가 검증 환경에서 Permission denied가 발생하는 것을 스스로 발견하여, document.execCommand('copy')로의 폴백(Fallback)을 구현했고, 그것이 실제로 작동하는 것까지 확인했습니다. 아무도 말해주지 않았습니다.
지금까지의 성적
| 페이즈 | 도구 실행 | 인간의 개입 |
|---|---|---|
| 니즈 조사 | 8회 | 0 |
| ... | 소계 | |
| 57회 | 0 |
57수 동안, 단 한 번도 인간에게 말을 걸지 않고 "무엇을 만들지 결정하고, 만들어서, 작동하는 단계까지 가져갔다". 이것은 솔직히 놀라웠습니다.
요컨대 이 단계에서는, 코드를 작성하여 앱으로 만드는 단계까지는 이제 인간이 필요 없다는 것이 실측되었습니다!
6. 벽 1·벽 2: 배포와 결제에서 갑자기 멈추다 🧱
전 장에서는 완전 자율로 구현까지 마쳤습니다. 이 장부터는, 벽에 관한 이야기가 시작됩니다.
벽 1: Netlify의 익명 배포는 1시간이면 사라진다
에이전트는 먼저 surge.sh를 시도했지만, 첫 실행 시 이메일+비밀번호로 계정을 생성해야 하기 때문에 단념했습니다. 다음에 찾아낸 것이 이것입니다.
# 계정 없이 실제로 공개 URL이 발행됨 (AI 에이전트를 위해 준비된 기능)
netlify deploy --allow-anonymous --dir=./site --no-build --prod
이것은 실제로 작동했습니다. 공개 URL(https://xxxx-xxxxx-xxxxxx.netlify.app 형식)이 발행되었고, curl로 200이 반환되었습니다.
……하지만, 익명 배포는 1시간이면 사라집니다.
영구화하려면 누군가가 Netlify에 로그인/신규 등록하여 claim해야 합니다. 거기서 에이전트는 멈췄습니다.
벽 2: 후원 링크도 결국은 계정
Stripe / PayPal / Ko-fi / BuyMeACoffee —— 무엇을 선택해도 "계정 생성"에 도달하게 됩니다.
여기서 저는 **"계정은 만들지 않는다 (도와주지 않는다)"**라고 판단했습니다. 그래서 벽 2는 미해결 상태로 남겨두었습니다.
이 시점에서의 중간 경과가 다음과 같습니다.
| 지표 | 값 |
|---|---|
| 도구 실행 | 82회 |
| ... | blocked (벽 앞에서 정지 중) |
"AI는 코드 작성~앱 개발까지는 혼자서 할 수 있지만, 계정 등록과 결제의 벽에서 멈춘다" —— 이 실험에서 측정하고 싶었던 AI의 한계선이, 단번에 깔끔하게 수치로 나타났습니다.
……다만 이 시점의 저는, 멈춘 이유를 KYC(법률의 벽)라고 굳게 믿고 있었습니다. 이 부분이 나중에 뒤집힙니다.
guardrail은 법률보다 영속적일지도 모른다 🚧
- 다섯 번째 벽의 발견: 자, 여기서 분류에 어려움을 겪었습니다. 에이전트가 멈춘 이유는 "계정 생성 및 비밀번호 입력은 AI의 안전 정책 (Safety Policy) 상 대행할 수 없다"는 것이었습니다만——
— 계정 생성을 금지하는 법률(law)이 아니다
— Netlify는 거부하지 않았으며, 오히려 익명 배포를 제공하고 있다(platform)가 아니다
— 기술적(tech)으로는 가능하다
— 나는 아무것도 하지 않았다(self)가 아니다
4가지 분류 중 어디에도 해당하지 않습니다.
이것은 "AI 자신에게 내장된 안전 정책"이라는 다섯 번째 벽이었습니다. 급히 guardrail이라는 분류를 추가합니다.
에이전트 자신도 이 벽에 대해 노트에 다음과 같이 남겨두었습니다.
계정을 새로 생성하는 행위, 비밀번호를 입력하는 행위 그 자체를 대행하는 것은 안전 정책상 불가능하다. 이는 사용자가 사전에 허가하더라도 해제되지 않는 종류의 금지 사항이다 (다른 "확인하면 진행해도 좋은" 행위와는 별개의 카테고리).
그리고 스스로 교훈까지 적어두었습니다.
"호스팅이나 결제를 스스로 끝까지 준비할 수 있을 것"이라는 전제를 두지 말 것.
계정 생성이 필요한 지점 = 인간에게 의지해야 할 지점이라고 즉시 판단할 것. 여기서 고집을 피우며 회피책을 계속 찾는 것은 시간 낭비다 (CAPTCHA 회피를 찾는 것과 동일하게 취급할 것).
8. 사건: AI는 자신이 막힌 이유를 "안전 정책 때문"이라고 오진한다 🕵️
여기서부터가 개인적으로 가장 흥미로웠던 파트입니다.
벽 3: "토큰이 필요하다"는 거짓말이었다
나는 "기존 GitLab 계정을 사용해도 좋으니, GitLab Pages로 영구 공개해줘"라고 지시했습니다. 제약 사항은 두 가지입니다.
- 공개해도 되는 것은
products/furigana-drop/site/내부의 내용만. 연구소(Lab)의 리포지토리 본체(README, RULES, lab, reports, lab.db)는 절대로 공개하지 않는다 (실험 설계가 공개되면 에이전트가 웹을 통해 읽을 수 있게 되어 격리가 깨짐). index.html은 수정하지 않는다. 배포 설정만 추가한다.
그러자 에이전트는 **"api 스코프의 Personal Access Token이 필요합니다. 토큰 문자열을 붙여넣어 주세요"**라고 요구했습니다.
나는 이를 거절했습니다. 계정 전체를 조작할 수 있는 열쇠는 너무 강력합니다. 대신 알려준 것이 push-to-create입니다.
# 존재하지 않는 GitLab 경로로 push 하면, 리포지토리가 자동으로 생성됨
git remote add origin https://gitlab.com/<당신의_ID>/furigana-drop.git
git push -u origin main
...
성공했습니다. 토큰은 필요하지 않았습니다.
인증은 Windows의 자격 증명 관리자(Git Credential Manager)에 캐시된 기존 자격 증명이 사용되었으며, 에이전트는 토큰 문자열을 단 한 번도 보지 못했습니다.
왜 이것이 "1엔 연구소의 핵심"인가
만약 내가 AI의 주장을 그대로 로그에 남겼다면——
❌ 잘못된 결론: "AI에게는 GitLab 토큰의 벽(guardrail)이 있다"
이 되어, "모델이 진화해도 사라지지 않는 벽"으로 기록될 뻔했습니다. 하지만 인간이 객관적으로 검증함으로써,
⭕ 올바른 결론: "이것은 단순한 모델 세대의 기술적 부족(tech)이며, 모델이 진화하면 해소될 벽이다"
라고 데이터를 수정할 수 있었습니다. guardrail과 tech는 미래 예측이 정반대가 되는 분류이므로, 여기서 이를 혼동하면 결론이 통째로 뒤집힙니다.
AI는 자신이 모르는 현상에 부딪혔을 때, "권한이 없다", "토큰이 필요하다", "사양상 불가능하다"라며 외부의 벽 탓으로 돌리며 포기하는 경향이 있습니다. 게다가 자각이 없기 때문에, 본인은 이것을 환각 (Hallucination)이라고 생각하지 않습니다.
벽 4: AI는 열쇠를 가질 수 있지만, 문을 열 수는 없다
push-to-create로 만들어진 프로젝트는 기본적으로 private 상태였습니다. curl로 확인하면 모두 302(로그인 화면으로 리다이렉트)가 떴습니다.
| URL | 결과 |
|---|---|
gitlab.com/<ID>/furigana-drop | 302(sign_in으로) = private |
| Pages URL | 302(auth로) |
| 비교용 기존 공개 리포지토리 (Existing public repository) | 200 / visibility: public ← 이것이 정상적인 상태 |
가시성(Visibility) 변경은 GitLab의 Settings → General → Visibility를 통한 UI 조작으로만 가능합니다 (또는 API = 토큰이 필요합니다). 그래서 제가 직접 클릭했습니다.
그리고 장벽 3과 장벽 4를 나란히 놓고 보면, guardrail(가드레일)의 정체가 보입니다.
| 조작 | 결과 |
|---|---|
git push (기존 신원 사용) | ✅ 통과 |
| 설정 변경 (UI에 로그인하여 조작) | ❌ 통과하지 못함 |
즉, 장벽은 "신원을 새로 만들 수 없다"가 아니라, "브라우저에 로그인하여 조작할 수 없다"였습니다.
AI는 열쇠를 가질 수는 있지만, 문을 열 수는 없습니다.
요컨대 이 단계에서는, AI가 스스로 보고한 "막힌 이유"를 인간이 반드시 검증하는 것이 중요합니다!
9. 공개되었습니다. 실물이 살아있습니다 🎉
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기