Claude Code + Codex 4라운드 교차검증: jidonglab.com 명함화 리디자인 전 과정
Codex 교차검증이 코드 버그를 0개 잡고 카피 오류를 3개 잡았다. “Every commit diff becomes a Korean/English build log.” — 빌드는 통과하고 타입 에러도 없지만 사실이 아닌 문장이다. 이런 건 자동 검증이 잡을 수 없다.
TL;DR jidonglab.com 홈페이지를 포트폴리오 명함으로 전면 재작업했다. 10세션, 164 tool calls, Codex 4라운드 교차검증. 코드 버그보다 카피 오류와 i18n 누락이 더 많이 나왔다.
시작: “어떤 걸 하시는 분이에요?”
지인에게 jidonglab.com 링크를 보냈는데 이 질문이 돌아왔다. AI 뉴스가 매일 올라오고, 프로젝트는 스크롤 아래에, Hero 카피는 모호했다. 사이트가 포트폴리오 역할을 못 하고 있었다.
작업 목표를 하나로 정했다. 낯선 사람이 URL만 받아도 Jidong이 뭘 만드는 사람인지 3초 안에 파악할 수 있을 것. 기술 스택은 건드리지 않고 카피와 섹션 구조만 바꾼다.
Claude는 Hero.tsx, About.astro, Projects.tsx, index.astro, home.css를 Read 12번으로 파악한 뒤 Edit 11번으로 처리했다. 이 세션에서 새로 생긴 파일이 src/components/home/Capabilities.astro다. AI 자동화, 풀스택 개발, 치과 광고 운영, 빌드 로그 작성 네 카드. data-ko/data-en 속성으로 언어 전환을 달고, .do-grid CSS 클래스로 모바일 1열 fallback도 처리했다.
Hermes max_turns 제한으로 세션이 중단되는 일이 반복됐다. 같은 작업 내용이 10개 유효 세션에 분산된 이유다.
Codex 1라운드: self-contained하지 않은 diff
첫 Codex 교차검증이 돌아왔다.
“
src/pages/index.astroimports/usessrc/components/home/Capabilities.astro, but the file is untracked. Do not leave the tracked diff non-self-contained.”
index.astro는 이미 Capabilities.astro를 import하는데, 파일 자체가 커밋에 없었다. max_turns 중단 후 스테이징이 빠진 것. 파일을 추가하면서 Projects.tsx 카피도 같이 잡았다. “지금 운영 중인 것들”이 섹션 제목인데 목록에 개발 중인 프로젝트가 섞여 있었다. 운영 중 / 개발 중을 구분하는 표현으로 교체했다.
Codex 2라운드: 빌드가 통과하는 거짓말
두 번째 라운드에서 더 흥미로운 것이 나왔다.
Capabilities.astro: “Every commit diff becomes a Korean/English build log.” — 이건 사실이 아니다.
모든 커밋에 한영 빌드 로그가 붙지 않는다. 코드 버그도, 타입 에러도 아니다. npm run build는 통과한다. 자동 검증이 구조적으로 잡을 수 없는 영역이다.
수정 전후:
- KO:
"커밋 diff를 한국어·영어 빌드 로그로 매일 쌓는다."→"진행 중인 작업을 한국어·영어 빌드 로그로 꾸준히 남긴다." - EN:
"Every commit diff becomes a Korean/English build log."→"Progress gets documented as bilingual build logs."
절대값(“every”, “매일”)을 방향성(“꾸준히”, “documented”)으로 바꿨다. 의미는 같고, 사실이 된다.
Codex 3라운드: 모순 문장
"혼자 같이 만든다." 혼자인데 같이? 의도는 읽히지만 한국어로 모순처럼 읽힌다.
"AI와 함께, 실제로 혼자 만든다." / "Building alone, but with AI as co-pilot." 으로 교체했다. 같은 의미인데 읽힐 때 선명해진다.
Codex 3라운드 누적: 코드 버그 0개, 카피 사실 오류 2개, 모순 문장 1개.
”한글 맨트 톤이 이상해”
리디자인 직후 피드백이 왔다.
“좋은데 언어별 대응이랑 한글 문구들이 이상해 한글 맨트 톤?”
원인이 두 가지였다. 하나는 카피가 직역체였다. 더 근본적인 문제는 data-ko/data-en 언어 토글 스크립트가 홈페이지에 없었다는 것.
Base.astro를 쓰는 서브페이지에는 토글 스크립트가 있다. 그런데 index.astro는 독립 레이아웃을 쓰기 때문에 스크립트 자체가 로드되지 않았다. 언어 전환 버튼을 눌러도 아무 일이 안 일어나고 있었다.
파악 세션은 Read 13번 + Grep 3번만 쓰고 수정을 못 했다. 실제 수정은 별도 세션에서 Hero.tsx, Capabilities.astro, Projects.tsx, ShipLog.astro 네 파일, Read 7번 Edit 5번.
sitemap 404 버그와 SEO/AEO 인프라
SEO/AEO 작업에서 현황 감사를 먼저 했다.
오래된 버그가 나왔다. Base.astro와 기존 robots.txt가 가리키는 sitemap 경로는 /sitemap-index.xml인데, 실제 Astro 라우트는 /sitemap.xml다. 모든 서브페이지에서 <link rel="sitemap"> 태그가 404를 가리키고 있었다. 언제부터인지 모른다.
JSON-LD도 없었다. 구조화 데이터 없이 개인 사이트는 Google에 맥락 없이 뜬다.
한 세션에서 처리했다.
src/components/Analytics.astro신규 —PUBLIC_GA_MEASUREMENT_ID환경변수 없으면 GA 스니펫을 emit하지 않는다. 로컬 개발에서 빌드가 터지지 않는다.src/pages/index.astro— JSON-LD Person + WebSite + ProfilePage 삽입, OG 태그 강화src/layouts/Base.astro— sitemap 경로/sitemap-index.xml→/sitemap.xml, Analytics 컴포넌트 연결public/robots.txt신규 — AI 크롤러 13개 그룹(GPTBot, ClaudeBot, PerplexityBot 등) 명시public/llms.txt신규 — AEO 엔티티 컨텍스트 작성
도구: Read 14번, Bash 6번, Edit 6번, Grep 3번, Write 3번.
Codex 4라운드: robots.txt 규칙 충돌
User-agent: GPTBot
Allow: /
Disallow: /api/
Disallow: /admin
Allow: /가 있으면 아래 Disallow 규칙이 무효화될 수 있다. robots.txt 명세가 rule 우선순위를 명확히 정하지 않아서, 크롤러 구현마다 해석이 다르기 때문이다.
GPTBot, ClaudeBot, PerplexityBot, GoogleOther, Google-Extended, ChatGPT-User 등 13개 크롤러 블록 각각에 Disallow: /api/와 Disallow: /admin을 명시적으로 추가했다. Allow: /는 콘텐츠 크롤링을 허용한다는 뜻이고, API 엔드포인트 차단은 별개로 처리해야 한다.
전체 통계
유효 세션 10개 (Hermes max_turns로 중복 분산된 것 제외), tool calls 약 164회. Bash 54회, Read 64회, Edit 31회, Write 4회.
수정 파일 9개, 신규 파일 4개(Capabilities.astro, Analytics.astro, robots.txt, llms.txt). Codex 교차검증 4라운드.
Codex가 코드 버그보다 카피 오류를 더 많이 잡았다. 자동 검증이 닿지 않는 영역이 있다.
Comments 0