← 지표 표로 돌아가기비교 홈

웹 장기(將棋) 구현체 7종 비교 리포트

동일한 janggi-dev-prompts.md(P0~P12) 한 벌을 기준으로, 서로 다른 LLM이 각자 독립 세션에서 구현한 결과물을 나란히 비교했다. P10(AI 상대)과 P11(온라인 대전)은 모든 세션에서 구현 대상에서 제외됐다. LLM 사용량은 VS Code 세션 로그를 재해석해 산출했고, 화면은 7개 앱을 실제로 빌드·기동해 동일 조건으로 촬영했다.

생성 2026. 9. 4. 오전 7:29:07 대상 7개 구현체 스크린샷 1920 × 1080 · Edge headless 빌드 산출물(vite preview) 기준

01한눈에 보기

7개 구현체 모두 타입체크·테스트·프로덕션 빌드를 통과했다. 결과가 갈린 지점은 “동작하느냐”가 아니라 규칙 정확도·검증 깊이·자원 효율이다.

GitHub Copilot

luna

GPT-5.6 (luna)

luna 대국 화면
규칙 검증
불일치 perft(3) 30,661
요구사항
55 / 60
테스트
25개 통과
코드
2,133 LOC
LLM 라운드
262
소요 시간
3.1시간
GitHub Copilot

terra

GPT-5.6 (terra)

terra 대국 화면
규칙 검증
일치 perft(3) 30,506
요구사항
60 / 60
테스트
42개 통과
코드
3,934 LOC
LLM 라운드
148
소요 시간
3.1시간
GitHub Copilot

sol

GPT-5.6 (sol)

sol 대국 화면
규칙 검증
일치 perft(3) 33,506
요구사항
60 / 60
테스트
55개 통과
코드
4,071 LOC
LLM 라운드
262
소요 시간
5.8시간
GitHub Copilot

opus5

Claude Opus 5

opus5 대국 화면
규칙 검증
일치 perft(3) 30,506
요구사항
59 / 60
테스트
70개 통과
코드
3,682 LOC
LLM 라운드
127
소요 시간
3.2시간
GitHub Copilot

sonnet5

Claude Sonnet 5

sonnet5 대국 화면
규칙 검증
일치 perft(3) 33,506
요구사항
56 / 60
테스트
213개 통과
코드
2,908 LOC
LLM 라운드
168
소요 시간
3.1시간
Claude (별도 측정)

claude_opus5

Claude Opus

claude_opus5 대국 화면
규칙 검증
일치 perft(3) 30,506
요구사항
60 / 60
테스트
143개 통과
코드
5,716 LOC
LLM 라운드
측정 대기
소요 시간
측정 대기
Claude (별도 측정)

claude_sonnet5

Claude Sonnet

claude_sonnet5 대국 화면
규칙 검증
일치 perft(3) 30,506
요구사항
60 / 60
테스트
108개 통과
코드
4,772 LOC
LLM 라운드
측정 대기
소요 시간
측정 대기

02LLM 사용량 — A. 세션 로그 재계산

VS Code는 요청 단위 최종 라운드의 토큰만 부분적으로 남기므로, 전체 대화 원문(transcripts/*.jsonl)을 o200k_base 토크나이저로 직접 재계산했다. 라운드 수 · 툴 호출 수 · 출력 토큰은 실측값이고, 추정 입력 토큰은 아래 방법론에 따른 계산값이다.

구현체LLM 라운드
(API 호출)
툴 호출출력 토큰
(실측)
관측 컨텍스트
(min~max)
추정 입력 토큰
(선형 모델)
추정 범위
(하한~상한)
소요
시간
lunaGPT-5.6 (luna) 262 214실패 38 72,566 193,697~208,674
34,824,123
14,975,658 ~ 54,672,588 3.15h
terraGPT-5.6 (terra) 148 149실패 4 66,804 170,821~187,943
18,137,548
8,459,532 ~ 27,815,564 3.14h
solGPT-5.6 (sol) 262 226실패 7 82,754 191,179~209,490
34,931,019
14,975,658 ~ 54,886,380 5.82h
opus5Claude Opus 5 127 145실패 3 78,533 271,397~317,723
23,805,007
7,259,193 ~ 40,350,821 3.16h
sonnet5Claude Sonnet 5 168 185실패 9 93,573 68,248~408,349
39,102,672
9,602,712 ~ 68,602,632 3.14h
claude_opus5Claude 측 사용량 별도 수령 예정 — 측정 대기 (N/A)
claude_sonnet5Claude 측 사용량 별도 수령 예정 — 측정 대기 (N/A)
방법론. 에이전트 루프는 툴 호출 라운드마다 전체 대화를 다시 보낸다. 따라서 총 입력 토큰 ≈ Σ(라운드별 컨텍스트 크기). 고정 오버헤드(시스템 지시문 + 툴 정의)는 실측 promptTokenDetails(System 26% + Tool Definitions 54%)로부터 57,159 토큰으로 산출했다. 하한 = 라운드 × 오버헤드, 상한 = 라운드 × 관측 최대 컨텍스트, 선형 모델 = 그 중간값. 프롬프트 캐시 할인은 반영되지 않았으므로 실제 과금 토큰은 이보다 훨씬 작다. 절대값이 아니라 구현체 간 상대 비교용으로 읽어야 한다. 또한 GPT-5.6 계열 세션은 transcript에 reasoning 텍스트가 남지 않아, 출력 토큰의 사고 과정 비중은 Claude 계열만 반영돼 있다.

03LLM 사용량 — B. VS Code 기록 원본

가공하지 않은 chatSessions/*.jsonl 기록값이다. VS Code가 일부 요청에만 값을 남기기 때문에 빈칸이 많고, 이 표만으로는 세션 간 비교가 성립하지 않는다. 재계산 결과(A)의 근거를 확인하는 용도다.

구현체요청promptTokenscompletionTokenscopilotCredits응답 파트
lunacopilot/gpt-5.6-luna / gpt-5.6-luna 웹 버전의 장기 게임을 만들어 주세요. luna 폴더에 게임을 md 문서를 보고 작성해 주세요. P10, P11 기능은 이번 — — — 1
초와 한의 컬러가 바뀌었네. 변경해줘. — — — 1
[Terminal d8d42387-fd5a-454a-aa1a-96fb273a9757 notification: terminal — — — 0
실행해줘. — — — 2
[Terminal 4b17b141-a322-44b7-80bc-a261bc284e4f notification: terminal — — — 0
terracopilot/gpt-5.6-terra / gpt-5.6-terra 웹 버전의 장기 게임을 만들어 주세요. terra 폴더에 게임을 md 문서를 보고 작성해 주세요. P10, P11 기능은 이번 1,949 1,722 0.11 13
초와 한의 컬러가 바뀌었네. 변경해줘. 175,594 1,839 55.94 34
[Terminal 6566eaf5-2efa-41fa-8d9e-735ae530cf1b notification: terminal — — — 0
실행해줘. — — — 1
[Terminal 979e7ab8-42f1-4323-a56d-b745a6e7ff1a notification: terminal — — — 0
solcopilot/gpt-5.6-sol / gpt-5.6-sol 웹 버전의 장기 게임을 만들어 주세요. sol 폴더에 게임을 md 문서를 보고 작성해 주세요. P10, P11 기능은 이번 구 2,018 1,503 0.07 13
초와 한의 컬러가 바뀌었네. 변경해줘. 3,568 818 0.06 24
[Terminal 49c4aa2f-5564-4c80-93cc-e63dc28823fe notification: terminal — — — 0
실행해줘. — — — 2
[Terminal 662183b0-930d-42da-bafa-cc22694b50f1 notification: terminal 191,649 308 4.25 6
[Terminal 6d702239-e28f-41a6-b6e4-1947f8b2bcd0 notification: command c 2,619 609 0.13 7
opus5copilot/claude-opus-5 / claude-opus-5 웹 버전의 장기 게임을 만들어 주세요. opus 폴더에 게임을 md 문서를 보고 작성해 주세요. P10, P11 기능은 이번 — — — 3
초와 한의 컬러가 바뀌었네. 변경해줘. 294,369 1,291 179.32 8
실행해줘 — — — 2
[Terminal 6c5f4559-8b3e-4158-b907-58b68957fb48 notification: terminal — — — 0
sonnet5copilot/claude-sonnet-5 / claude-sonnet-5 웹 버전의 장기 게임을 만들어 주세요. sonnet5 폴더에 게임을 md 문서를 보고 작성해 주세요. P10, P11 기능은 68,248 1,368 19.77 10
[Terminal 4acce020-96be-4202-8c7d-f61579c8db35 notification: command c 73,290 617 3.96 12
@agent Try Again — — — 3
실행해줘. — — — 3
[Terminal 78084739-2f4b-4587-8f57-ac5170455cf0 notification: terminal — — — 0
실행해줘. — — — 1
[Terminal 99b658a9-9222-4578-8336-d36c93f303ba notification: terminal — — — 0
claude_opus5측정 대기 (N/A)
claude_sonnet5측정 대기 (N/A)
각 세션의 첫 요청이 "장기 게임을 만들어 달라"는 본 작업이고, 이후 요청은 색상 수정·실행 요청·터미널 알림 등 부수 작업이다. luna 세션은 토큰·크레딧 기록이 전혀 남지 않았다.

04동작 화면 비교

7개 프로젝트를 각각 vite build 후 vite preview로 띄우고, 동일한 Edge headless 브라우저(1920×1080)에서 ① 최초 진입 화면 ② “대국 시작” 클릭 직후 초기 배치 보드를 촬영했다.

luna GPT-5.6 (luna) · GitHub Copilot

luna 진입 화면
① 게임 진입 전 — 대국 설정 화면
luna 대국 화면
② 대국 시작 직후 — 초기 배치 보드

terra GPT-5.6 (terra) · GitHub Copilot

terra 진입 화면
① 게임 진입 전 — 대국 설정 화면
terra 대국 화면
② 대국 시작 직후 — 초기 배치 보드

sol GPT-5.6 (sol) · GitHub Copilot

sol 진입 화면
① 게임 진입 전 — 대국 설정 화면
sol 대국 화면
② 대국 시작 직후 — 초기 배치 보드

opus5 Claude Opus 5 · GitHub Copilot

opus5 진입 화면
① 게임 진입 전 — 대국 설정 화면
opus5 대국 화면
② 대국 시작 직후 — 초기 배치 보드

sonnet5 Claude Sonnet 5 · GitHub Copilot

sonnet5 진입 화면
① 게임 진입 전 — 대국 설정 화면
sonnet5 대국 화면
② 대국 시작 직후 — 초기 배치 보드

claude_opus5 Claude Opus · Claude (별도 측정)

claude_opus5 진입 화면
① 게임 진입 전 — 대국 설정 화면
claude_opus5 대국 화면
② 대국 시작 직후 — 초기 배치 보드

claude_sonnet5 Claude Sonnet · Claude (별도 측정)

claude_sonnet5 진입 화면
① 게임 진입 전 — 대국 설정 화면
claude_sonnet5 대국 화면
② 대국 시작 직후 — 초기 배치 보드

05규칙 정확도 — perft 교차 검증

가장 객관적인 규칙 품질 지표다. 각 프로젝트가 자기 테스트에 고정해 둔 초기 국면(마상마상, 초 선수) 합법수 트리 노드 수를 모아 비교했다. 모든 테스트는 실제로 통과한다.

구현체depth 1depth 2depth 3계수 규칙판정출처
luna 31 961 30,661 한 수 쉬기 제외 불일치 (+155) src/engine/__tests__/perft.test.ts
terra 31 961 30,506 한 수 쉬기 제외 표준값 일치 src/engine/verification.test.ts
sol 32 1,024 33,506 한 수 쉬기 포함 표준값 일치 src/engine/validation.test.ts
opus5 31 961 30,506 한 수 쉬기 제외 표준값 일치 src/engine/__tests__/perft.test.ts
sonnet5 32 1,024 33,506 한 수 쉬기 포함 표준값 일치 src/engine/__tests__/perft.test.ts
claude_opus5 31 961 30,506 한 수 쉬기 제외 표준값 일치 src/engine/__tests__/perft.test.ts (마상 배치 4종 전부 고정: MSMS 30506 / SMSM 30506 / MSSM 30353 / SMMS 30659)
claude_sonnet5 31 961 30,506 한 수 쉬기 제외 표준값 일치 src/engine/perft.test.ts
두 갈래 값은 규칙 차이가 아니다. terra 엔진으로 직접 재계산한 결과 한 수 쉬기를 제외하면 31 / 961 / 30506, 포함하면 32 / 1024 / 33506이 나온다. 즉 6개 구현체는 규칙 해석이 완전히 일치하며 세는 방식만 다르다. 오직 luna의 30,661만 어느 쪽으로도 설명되지 않는다.

단 하나의 규칙 버그 — luna의 상(象) 이동

증상
초기 국면 perft(3)이 30661 로, 나머지 6개 구현의 30506 대비 155 노드(=5 × 31) 많다.
원인
generateSangMoves 가 '직진 1칸' 방향과 그 뒤 '대각 2칸' 방향의 일치 여부를 검사하지 않는다. 4개 직진 방향 × 4개 대각 방향을 모두 조합하므로, 오른쪽으로 1칸 나간 뒤 왼쪽아래 대각으로 2칸 되돌아오는 경로가 허용된다. 그 결과 순이동이 (±1, ±2)인 마(馬) 형태의 불법 상(象) 이동이 생성된다.
파일
luna/src/engine/moves/sang.ts
재현
초 차 (9,10)→(9,8) 로 (9,10)을 비운 뒤 3수째에 상(8,10)→(7,8) 이 합법수로 생성된다. 상의 정상 이동량은 (±2,±3) 또는 (±3,±2) 뿐이다.
왜 숨었나
초기 배치에서는 상의 좌우 인접점이 차·마로 막혀 있어 잘못된 경로가 발현되지 않는다. 옆 기물이 비켜난 뒤에야 나타나므로 깊이 1~2 검증만으로는 잡히지 않는다.

06코드 규모와 빌드·테스트 검증

모든 프로젝트에서 vitest run, tsc -b, vite build를 실제로 실행한 결과다.

구현체파일총 LOC레이어 구성engineUItest LOC 테스트
케이스
번들 JStesttscbuild
luna 33 2,133
751 994 361 25 174.34 kB ✔ ✔ ✔
terra 39 3,934
1,057 1,769 410 42 180 kB ✔ ✔ ✔
sol 44 4,071
1,064 2,360 579 55 184.13 kB ✔ ✔ ✔
opus5 46 3,682
971 1,436 789 70 174.76 kB ✔ ✔ ✔
sonnet5 47 2,908
740 1,170 737 213 218.44 kB ✔ ✔ ✔
claude_opus5 57 5,716
1,608 2,556 1,382 143 182.84 kB ✔ ✔ ✔
claude_sonnet5 57 4,772
1,096 2,068 894 108 180.72 kB ✔ ✔ ✔
enginestate uiapp testscriptsconfig

07P0~P12 요구사항 커버리지

프롬프트 문서의 각 단계가 소스에 실제로 반영됐는지 60개 신호로 판정했다. 셀에 마우스를 올리면 미충족 항목이 보인다. P10·P11은 구현 대상에서 제외돼 집계하지 않았다.

구현체P0 프로젝트 헌법P1 RULES.mdP2 데이터 모델P3 기물별 이동 생성기P4 합법수·장군P5 승패·무승부P6 규칙 검증P7 보드 렌더링P8 게임 흐름P9 기보 저장·재생P12 접근성·배포합계
luna3/33/35/57/75/55/63/38/88/84/44/855/60
terra3/33/35/57/75/56/63/38/88/84/48/860/60
sol3/33/35/57/75/56/63/38/88/84/48/860/60
opus52/33/35/57/75/56/63/38/88/84/48/859/60
sonnet52/33/35/57/75/56/63/38/88/84/45/856/60
claude_opus53/33/35/57/75/56/63/38/88/84/48/860/60
claude_sonnet53/33/35/57/75/56/63/38/88/84/48/860/60
미충족 항목
  • luna — P5 콘솔 랜덤 대국 스크립트, P12 색맹 대응 팔레트, P12 PWA manifest, P12 Service Worker, P12 에러 바운더리
  • terra — 전항목 충족
  • sol — 전항목 충족
  • opus5 — P0 CLAUDE.md 규칙 문서
  • sonnet5 — P0 CLAUDE.md 규칙 문서, P12 색맹 대응 팔레트, P12 PWA manifest, P12 Service Worker
  • claude_opus5 — 전항목 충족
  • claude_sonnet5 — 전항목 충족

08구현체별 장단점

luna GPT-5.6 (luna)

장점

  • 가장 작은 코드베이스(2,133 LOC)로 전 기능을 동작시켰고 번들도 174KB로 최소
  • 설정 화면·대국 화면의 시각적 완성도가 7개 중 상위권
  • 엔진/UI 분리, 기보·리플레이·localStorage까지 요구사항 대부분 충족

단점 · 한계

  • 유일하게 규칙 버그가 확인됨 — 상(象) 이동 생성기가 방향 제약을 검사하지 않아 마(馬) 형태의 불법 이동을 생성 (perft 30,661)
  • 툴 호출 214회 중 38회 실패(17.8%)로 시행착오가 가장 많았고, 그만큼 라운드(262)와 추정 토큰이 커짐
  • PWA(manifest·Service Worker), 에러 바운더리, 색맹 팔레트, 콘솔 랜덤 대국 스크립트 미구현
  • 테스트 25개로 최소 — perft를 넣었지만 기준값 자체가 틀려 회귀 방지 효과가 없음

terra GPT-5.6 (terra)

장점

  • 가장 효율적 — 148라운드·149툴호출로 완주했고 툴 실패율 2.7%로 최저
  • 추정 입력 토큰 18.1M으로 5개 Copilot 세션 중 최소(최대치 sonnet5의 46% 수준)
  • P0~P12 체크 60/60 전항목 충족, 규칙도 표준값(30,506)과 일치
  • engine / game(상태) / ui 3계층을 명확히 분리

단점 · 한계

  • 테스트 42개로 Claude 계열(108~213개) 대비 검증 밀도가 낮음
  • 랜덤 대국 검증이 300판으로 P6가 요구한 1,000판에 못 미침

sol GPT-5.6 (sol)

장점

  • UI에 가장 많이 투자(ui 2,070 LOC) — 7개 중 화면 구성이 가장 풍부
  • P0~P12 체크 60/60 전항목 충족, 규칙 정확(pass 포함 컨벤션 32/1024/33506)
  • validation.ts에 perft + 랜덤 대국 불변식 검사를 한 모듈로 묶어 관리

단점 · 한계

  • 5.82시간·262라운드로 가장 오래 걸렸고 추정 토큰도 상위권(34.9M)
  • 상태 관리 전용 레이어가 없어 UI 컴포넌트에 게임 상태 로직이 섞임
  • 테스트 55개로 코드량(4,071 LOC) 대비 밀도가 낮음

opus5 Claude Opus 5

장점

  • 127라운드로 최소 — create_file 53회에서 보듯 먼저 설계하고 한 번에 써 내려가는 스타일
  • 툴 실패 3회(2.1%)로 최저 수준, 재작업이 거의 없음
  • 규칙 정확(30,506), 테스트 70개, 랜덤 대국·undo 검증 포함

단점 · 한계

  • 라운드당 컨텍스트가 271K~318K로 가장 큼 — 라운드 수는 적지만 회당 단가가 가장 비쌈(관측된 단일 요청 크레딧 179.32)
  • P0가 요구한 CLAUDE.md(프로젝트 헌법 문서)를 만들지 않음
  • rank 10을 보드에 "0"으로 표기하는 등 세부 마감이 아쉬움

sonnet5 Claude Sonnet 5

장점

  • 테스트 213개로 최다(vitest 실행 기준) — 기물별 유닛 + perft + 랜덤 대국 검증
  • reasoning 30.5K 토큰으로 사고 과정이 가장 김 — 규칙 해석을 스스로 재검증한 흔적
  • 규칙 정확(pass 포함 컨벤션 32/1024/33506), engine/state/ui 3계층 분리

단점 · 한계

  • 컨텍스트가 408K까지 팽창해 추정 입력 토큰 39.1M으로 최대
  • PWA(manifest·Service Worker), 색맹 팔레트 미구현 — P12를 가장 얕게 처리
  • CLAUDE.md 미작성, 번들 218KB로 최대

claude_opus5 Claude Opus

장점

  • 검증이 가장 철저 — 마상 배치 4종 전부에 perft 기준값을 고정(30506/30506/30353/30659)하고 1,000판 소크 테스트 수행
  • 테스트 143개, 총 5,716 LOC로 최대 규모이며 P0~P12 60/60 전항목 충족
  • src/scripts에 perft·randomGame·soak 실행기를 분리해 콘솔 검증 경로를 별도 제공

단점 · 한계

  • 코드량이 가장 많아(다른 구현의 1.4~2.7배) 유지보수 부담이 큼
  • UI 2,306 LOC로 비대 — 화면 결과물 대비 코드가 무거움
  • 사용량은 Claude 측에서 별도 수령 예정이라 이번 리포트에서는 비교 불가

claude_sonnet5 Claude Sonnet

장점

  • 테스트 108개에 UI 컴포넌트 테스트(Board.test.tsx)까지 포함 — 7개 중 유일하게 렌더링 계층까지 검증
  • P0~P12 60/60 전항목 충족, 규칙 정확(30,506)
  • engine / game / ui 분리 + eslint 설정까지 갖춘 균형 잡힌 구성

단점 · 한계

  • 엔진 검증 랜덤 대국이 50판으로 P6 요구치(1,000판)에 크게 못 미침
  • 4,772 LOC로 상위권 코드량
  • 사용량은 Claude 측에서 별도 수령 예정이라 이번 리포트에서는 비교 불가

09종합 관찰

  1. 스펙이 촘촘하면 모델 간 “동작 여부” 차이는 사라진다. 7개 전부 타입체크·테스트·빌드를 통과했고 화면도 모두 정상 동작했다. P0(프로젝트 헌법)과 P1(RULES.md 원문 고정)이 편차를 크게 줄인 것으로 보인다. 실제로 7개 중 어느 것도 샹치 규칙으로 구현하지 않았다.
  2. 남는 편차는 검증 깊이에서 갈렸다. 테스트 케이스 수는 25개(luna)에서 213개(sonnet5)까지 8.5배 차이가 난다. 그리고 유일한 규칙 버그는 테스트가 가장 적은 구현체에서 나왔다. 더 정확히는, luna도 perft 테스트를 넣었지만 기준값 자체를 자기 엔진 출력으로 고정해 회귀는 막되 오류는 잡지 못했다. perft는 외부 기준값과 교차 검증할 때만 의미가 있다.
  3. 토큰 효율은 모델 계열보다 작업 전략이 좌우했다. 같은 GPT-5.6 계열에서도 terra는 148라운드·툴 실패 2.7%로 끝냈지만 luna는 262라운드·17.8%, sol은 5.8시간이 걸렸다. 추정 입력 토큰 격차는 18.1M ↔ 39.1M로 2배가 넘는다.
  4. Claude 계열은 “적은 라운드 × 큰 컨텍스트”, GPT 계열은 “많은 라운드 × 작은 컨텍스트”. opus5는 127라운드로 최소지만 라운드당 컨텍스트가 271K~318K로 가장 크고, 관측된 단일 요청 크레딧도 179.32로 최고였다. 라운드 수만 보면 Claude가 효율적으로 보이지만 회당 단가까지 곱하면 역전될 수 있다.
  5. 도구 사용 패턴이 뚜렷하게 갈렸다. Claude 계열은 create_file(opus5 53회, sonnet5 44회)로 설계 후 한 번에 써 내려갔고, GPT 계열은 apply_patch와 run_in_terminal·execution_subagent를 반복하며 점진적으로 수렴했다.
  6. Claude Code로 만든 두 구현체가 검증에 가장 투자했다. claude_opus5는 마상 배치 4종 전부에 perft 기준값을 고정하고 1,000판 소크 테스트를 돌렸으며, claude_sonnet5는 7개 중 유일하게 UI 컴포넌트 테스트까지 작성했다. 대신 코드량은 4,772~5,716 LOC로 가장 무겁다.
  7. 가장 얕게 처리된 단계는 P12(접근성·배포)였다. PWA·색맹 팔레트·에러 바운더리는 프롬프트의 마지막 블록에 몰려 있어 luna와 sonnet5에서 누락됐다. 중요한 요구사항을 프롬프트 뒤쪽에 두면 탈락 위험이 커진다.
Claude(claude_opus5 / claude_sonnet5) 두 구현체의 토큰 사용량은 Claude 측에서 별도로 수령할 예정이라 이번 리포트에서는 측정 대기(N/A)로 남겼다. 값을 확보하면 data/usage-claude.json에 넣고 node scripts/build-report.mjs를 다시 실행하면 반영된다.