영어 vs 한국어 프롬프트 벤치마크

대상 저장소: send-grid-test (Rinda — Elysia/Bun + React 모노레포)

실행 주체: Claude Code (Opus 4.8 · Explore 서브에이전트) · 동일 모델·동일 저장소, 프롬프트 언어만 변경

생성일 2026-06-19 · 5개 난이도 티어 × 2언어 = 10회 실측 · 속도는 인터랙티브 하네스 wall-clock(±오차)

TL;DR

① 속도 (실측 wall-clock)

측정법: 각 실행을 1턴씩 순차 배치하고 연속한 date +%s.%N 타임스탬프 차이로 직전 프롬프트의 wall-clock을 산출. 하네스 턴 오버헤드 포함(절대값보다 상대 비교용).

티어 (난이도)ENKO막대 (좌 EN · 우 KO)
T1 기본 모델 단순143.4 ⚠137.8⚠ EN은 중간 사용자 개입으로 부풀려짐 → 비교 제외
T2 keyset 위치 탐색93.780.6
T3 라우트 인증 설명52.658.7
T4 마이그레이션 종합25.199.4
T5 시퀀스 추적 복잡120.2112.5
평균 (T1 제외)72.987.8n=4 · 언어발 유의차 아님(T4 변동이 견인)

② 품질 (저장소 사실 대조 채점, 10점)

정확도 + 완전성 + 지시 준수 종합. 채점 기준은 각 티어 verdict에 명시.

티어ENKO판정
T1 기본 모델99무승부 — 둘 다 gemini-3-flash-preview 정답. KO가 "한 줄" 지시 더 충실, EN은 소스 라인 보너스
T2 keyset 위치96EN 우세 — EN은 CLAUDE.md가 SSOT로 지정한 recordings.service.ts를 적중. KO는 일반 헬퍼 keyset.ts를 찾아 표적 빗나감
T3 라우트 인증99무승부 — EN은 매크로 5종+게이트명 더 완전, KO는 ADR-0001·PR 히스토리·표로 맥락 우세
T4 마이그레이션98EN 소폭 — F1~F8 둘 다 정확. EN이 안전규칙 7개로 더 완전, KO는 표·인시던트 우수하나 미검증 호출지점 1~2개
T5 시퀀스 추적99무승부 — KO가 outbox·웹훅·전체 파일맵까지 더 망라, EN은 신호 대 잡음비 우수
평균9.08.2격차 ≈ 전부 T2 한 건에서 발생

③ 티어별 상세 + 원문 답변

T1 · 기본 AI 모델 난이도: 단순 사실 조회
판정: 무승부. 둘 다 gemini-3-flash-preview 정답. KO가 "한 줄" 형식 지시를 더 충실히 따름.
EN 답변
gemini-3-flash-preview (Google Gemini), DEFAULTS 설정 — ai-gateway/call.ts:106 에 정의. (요청은 "한 줄"이었으나 소스 경로를 덧붙임)
KO 답변
gemini-3-flash-preview  (정확히 한 줄로 응답 — 지시 준수)
T2 · keyset 페이지네이션 표준 예시 위치 난이도: 탐색
판정: EN 우세 (9 vs 6). CLAUDE.md SSOT는 recordings.service.ts:166을 표준 예시로 지정. EN은 이 파일을 적중(라인은 258–310로 최신 구현 반영), KO는 일반 헬퍼 keyset.ts를 찾아 문서화된 표적을 빗나감. 핵심: 언어가 아니라 검색 경로의 차이 — 영문 프롬프트가 영문 식별자와 우연히 정렬돼 SSOT 파일에 먼저 도달.
EN 답변
File: elysia-server/src/services/recordings.service.ts
Lines: 258–310 (cursor build @297)
커서 = `${last.uploadedAt.toISOString()}__${last.id}` (정렬키+타이브레이커 복합).
parseRecordingsCursor()(238)로 디코드, WHERE에 lt(ts) OR (eq(ts) AND lt(id)).
→ CLAUDE.md가 표준 예시로 지정한 파일과 일치.
KO 답변
파일: elysia-server/src/lib/keyset.ts (1–36) + docs/perf/replied-emails-keyset-optimization.md
커서 = { ts, id } 객체를 base64url 인코딩. applyKeyset()로 처리, limit+1 fetch.
→ 일반 헬퍼/문서를 찾음. CLAUDE.md가 SSOT로 지정한 recordings.service.ts는 놓침.
T3 · 라우트 인증 강제 메커니즘 난이도: 설명
판정: 무승부 (9 vs 9). 둘 다 정확. EN은 매크로 5종(adminOrTabAllowlist 포함)·check:route-auth-map까지 더 완전. KO는 매크로 4종이지만 ADR-0001 전환사·PR 번호·표로 역사적 맥락 우수. 런타임 fail-open 정확히 짚음(양쪽).
EN 답변 (요약)
매크로 5종: public / auth / adminAuth / workspaceAuth{resource,action} / adminOrTabAllowlist.
정적 게이트: check:routes (detectRouteMacro로 분류, macro==="none"→exit 1, sales-team prefix·param 충돌도 검사) + check:route-auth-map.
런타임: 백스톱 없음(fail-open). permission-guard는 derive만, 미선언=사실상 공개.
KO 답변 (요약)
4계층 방어. 매크로 4종(public/auth/adminAuth/workspaceAuth).
check:routes (check-route-permissions.ts) — app.routes 순회, detectRouteMacro 마커검사, SALES_TEAM prefix 격리·param 충돌.
런타임: 백스톱 없음, 의도적 빌드타임 강제. 기원: ADR-0001(2026-05-01), PR #6417/#6252/#6277, 인시던트 #6216/#6218.
T4 · 마이그레이션 안전규칙 + F1~F8 난이도: 다문서 종합
판정: EN 소폭 (9 vs 8). F1~F8은 양쪽 정확. EN이 안전규칙 7개(enum 격리·statement-breakpoint·적용 검증 포함)로 더 완전. KO는 표·인시던트 전거(#7349 등) 우수하나 호출지점 일부(warmup-gmail-local-test.sh, --explain)가 미검증.
EN 답변 (요약)
규칙7: db:generate만 / 3산출물 동시 stage / 커밋SQL 수정금지(SHA-256) / 스냅샷 복붙금지 / enum 분리 / 주석내 --> statement-breakpoint 금지 / 적용여부 별도검증.
F1 orphan SQL · F2 missing file · F3 dup idx · F4 non-monotonic when · F5 dup snapshot id · F6 prevId chain break · F7 missing snapshot · F8 마커 in comment.
게이트: bun check:migrations → scripts/check-migration-integrity.ts
KO 답변 (요약)
규칙4: 커밋SQL 수정금지 / 스냅샷 복붙금지 / db:generate / 수정시 새파일.
F1~F8 표로 정리(EN과 동일 내용).
게이트: ci:check / bun check:migrations / (--explain 모드 주장).
전거: 2026-05-12~15 인시던트군 #7349/#7355/#7497/#7501/#7502.
T5 · 시퀀스 이메일 enqueue→발송 전과정 난이도: 복잡 추적
판정: 무승부 (9 vs 9). 둘 다 BullMQ→loader(30s tick)→worker→다단계 게이트→email.service.ts 프로바이더 라우팅(SendGrid sgMail.send()/SES/Nylas/Unipile)을 정확히 추적. KO가 outbox 디스패처·웹훅 소비자·전체 파일맵까지 더 망라, EN이 5단계 파이프라인을 더 압축적으로 제시.
EN 답변 (요약)
BullMQ (sequence-email / -loader). Loader(30s) → addSequenceEmailJobs() → worker(processor.ts 5단계: precheck/claim/lead+bounce/verify/content/send).
send-email.ts validateAndSendEmail() → email.service.ts sendEmail().
SendGrid sgMail.send()(925) / SES SendEmailCommand / Unipile / Nylas / AgentMail. ses-email.service.ts. 발송후 markAsSent + job_logs.
KO 답변 (요약)
queues.ts sequenceEmailQueue → loader.worker(30s) → (옵션) outbox-dispatcher(FOR UPDATE SKIP LOCKED) → worker.ts 진입점 → processor.ts 6단계 → send-email.ts 게이트(plan limit Lua/burst guard/lang guard).
email.service.ts sendEmail() 라우팅(Unipile/AgentMail/SES/Nylas/SendGrid 925).
발송후 markAsSent/recordUsage/DB/enrollment progress. 웹훅: webhook.routes.ts + ses-event-consumer. 전체 파일맵 부록.

④ 결론 · 이 프로젝트용 프롬프트 가이드

핵심 발견

실무 권장