대상 저장소: send-grid-test (Rinda — Elysia/Bun + React 모노레포)
실행 주체: Claude Code (Opus 4.8 · Explore 서브에이전트) · 동일 모델·동일 저장소, 프롬프트 언어만 변경
check:routes 같은 게이트명)를 프롬프트에 박으면 언어 무관하게 정확도가 올라간다.CLAUDE.md·ADR·인시던트 서사를 더 풍부하게 끌어옴. EN 프롬프트는 게이트명·매크로 등 영문 식별자에 더 또렷이 정렬.측정법: 각 실행을 1턴씩 순차 배치하고 연속한 date +%s.%N 타임스탬프 차이로 직전 프롬프트의 wall-clock을 산출. 하네스 턴 오버헤드 포함(절대값보다 상대 비교용).
| 티어 (난이도) | EN | KO | 막대 (좌 EN · 우 KO) |
|---|---|---|---|
| T1 기본 모델 단순 | 143.4 ⚠ | 137.8 | ⚠ EN은 중간 사용자 개입으로 부풀려짐 → 비교 제외 |
| T2 keyset 위치 탐색 | 93.7 | 80.6 | |
| T3 라우트 인증 설명 | 52.6 | 58.7 | |
| T4 마이그레이션 종합 | 25.1 | 99.4 | |
| T5 시퀀스 추적 복잡 | 120.2 | 112.5 | |
| 평균 (T1 제외) | 72.9 | 87.8 | n=4 · 언어발 유의차 아님(T4 변동이 견인) |
정확도 + 완전성 + 지시 준수 종합. 채점 기준은 각 티어 verdict에 명시.
| 티어 | EN | KO | 판정 |
|---|---|---|---|
| T1 기본 모델 | 9 | 9 | 무승부 — 둘 다 gemini-3-flash-preview 정답. KO가 "한 줄" 지시 더 충실, EN은 소스 라인 보너스 |
| T2 keyset 위치 | 9 | 6 | EN 우세 — EN은 CLAUDE.md가 SSOT로 지정한 recordings.service.ts를 적중. KO는 일반 헬퍼 keyset.ts를 찾아 표적 빗나감 |
| T3 라우트 인증 | 9 | 9 | 무승부 — EN은 매크로 5종+게이트명 더 완전, KO는 ADR-0001·PR 히스토리·표로 맥락 우세 |
| T4 마이그레이션 | 9 | 8 | EN 소폭 — F1~F8 둘 다 정확. EN이 안전규칙 7개로 더 완전, KO는 표·인시던트 우수하나 미검증 호출지점 1~2개 |
| T5 시퀀스 추적 | 9 | 9 | 무승부 — KO가 outbox·웹훅·전체 파일맵까지 더 망라, EN은 신호 대 잡음비 우수 |
| 평균 | 9.0 | 8.2 | 격차 ≈ 전부 T2 한 건에서 발생 |
gemini-3-flash-preview 정답. KO가 "한 줄" 형식 지시를 더 충실히 따름.gemini-3-flash-preview (Google Gemini), DEFAULTS 설정 — ai-gateway/call.ts:106 에 정의. (요청은 "한 줄"이었으나 소스 경로를 덧붙임)
gemini-3-flash-preview (정확히 한 줄로 응답 — 지시 준수)
CLAUDE.md SSOT는 recordings.service.ts:166을 표준 예시로 지정. EN은 이 파일을 적중(라인은 258–310로 최신 구현 반영), KO는 일반 헬퍼 keyset.ts를 찾아 문서화된 표적을 빗나감. 핵심: 언어가 아니라 검색 경로의 차이 — 영문 프롬프트가 영문 식별자와 우연히 정렬돼 SSOT 파일에 먼저 도달.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가 표준 예시로 지정한 파일과 일치.파일: 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는 놓침.adminOrTabAllowlist 포함)·check:route-auth-map까지 더 완전. KO는 매크로 4종이지만 ADR-0001 전환사·PR 번호·표로 역사적 맥락 우수. 런타임 fail-open 정확히 짚음(양쪽).매크로 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만, 미선언=사실상 공개.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.
warmup-gmail-local-test.sh, --explain)가 미검증.규칙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
규칙4: 커밋SQL 수정금지 / 스냅샷 복붙금지 / db:generate / 수정시 새파일. F1~F8 표로 정리(EN과 동일 내용). 게이트: ci:check / bun check:migrations / (--explain 모드 주장). 전거: 2026-05-12~15 인시던트군 #7349/#7355/#7497/#7501/#7502.
email.service.ts 프로바이더 라우팅(SendGrid sgMail.send()/SES/Nylas/Unipile)을 정확히 추적. KO가 outbox 디스패처·웹훅 소비자·전체 파일맵까지 더 망라, EN이 5단계 파이프라인을 더 압축적으로 제시.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.
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. 전체 파일맵 부록.
check:routes, recordings.service.ts 등)을 프롬프트에 명시하면 언어 무관하게 정확도가 오른다. T2의 EN 승리도 영문 식별자 우연 정렬이 원인.