본문으로 건너뛰기

⑤ 레이어 격리 증거 — 커밋 히스토리 분석

주장: "AI가 아키텍처 규율(레이어 격리·안정화)을 실제로 지키며 개발했다" 를 커밋 데이터로 입증. 데이터 출처: cscan -g (snake-game-2p 루트, 14개 독립 repo, 총 126 커밋, 2026-07-31 기준 E1–E3 코어 빌드). 누구나 재현 가능. 방법: 커밋을 3개 개발 시대(epoch)로 분류 → 레이어(repo)별 분포 확인.

ℹ️ 이후 E4 — 🤖 AI 상대(DL-AI) 트랙(2026-08) 이 추가되어 저장소는 총 20개로 늘었다(자세히는 AI 상대·저장소 지도). 아래 정량 분석은 그 확장 이전의 코어 빌드 스냅샷을 대상으로 하므로 14 repo·126 커밋 수치를 그대로 둔다.

개발 시대 (epoch) 정의

Epoch기간내용
E1 기반2026-03-26 ~ 03-27로컬 게임(1P/2P) 완성 + 1차 온라인 시도(P2P WebRTC)
E2 온라인 재구축2026-06-25 ~ 06-27권위 서버(GameDO)·로비·플러그블 네트코드·유저네임/리더보드
E3 2~4P 확장2026-07-12N-body 게임룰(2→4인) + protocol SSOT 추출 + web 모듈 리팩터

Epoch × 레이어 커밋 분포

repo (레이어)E1E2E3분류
core (순수 도메인)7029🟢 동결→게임룰 변경 시만 재개
engine (로컬 게임루프)701*8🟢 동결 (*E3는 chore)
auth (Firebase)4004🟢 완전 동결
quickmatch3003🟢 완전 동결
network (P2P WebRTC)141†1*16⚫ 폐기(대체됨) (†주석,*chore)
leaderboard3519🟡 기능 연동 시 변경
online-core (로비 DO)0819🆕 E2 신규
netcode-core (계약)0224🆕 E2 신규
netcode-raw0527🆕 E2 신규
netcode-interpolated0325🆕 E2 신규
protocol (wire SSOT)0011🆕 E3 신규
signaling (권위 서버)49215🔴 온라인 핵심, 지속 진화
web (통합·UI)1112225🔴 최상단, 최다 변경
architecture (docs)19111📄 온라인 시대 추적

색(분류) 기준 — 무엇으로 나눴나

축 = "커밋이 초반에 몰린 뒤 동결되는가(격리·보전)" vs "매 시대마다 계속 변경되는가(churn)". 단순 커밋 수가 아니라 시대별 분포 + 후기 커밋의 성격(실로직 vs chore) 으로 판정.

  • 🟢 동결 기반(frozen foundation): 커밋이 E1에 집중, 이후 로직 변경 ≈0. → 하위/안정 레이어. (core·engine·auth·quickmatch)
  • 🔴 지속 진화(hot): 모든 시대에 커밋 존재. 의존성 최상단(조합/UI)이라 모든 기능을 흡수. (signaling·web)
  • 🟡 기능 결합(feature-coupled): 특정 기능이 닿을 때만 변경. (leaderboard)
  • 폐기(superseded): 초반 집중 후 방치. (network — 권위 서버 전환으로 대체)
  • 🆕 후기 가산(additive): E2/E3에 신규 생성 → 기존 레이어를 건드리지 않고 능력 추가. (online-core·netcode-*·protocol)

핵심 증거 커밋 (해시 인용, 검증용)

1) core: 온라인 재구축(E2) 전체를 커밋 0으로 통과.

  • E1 마지막: bd0096c (2026-03-26, release 0.2.1)
  • 다음 커밋: 32f8491 (2026-07-12, N-body advance) — 3/26 → 7/12 사이 커밋 없음. E2 전체(6월 온라인 대장정) 동안 도메인 미변경.

2) engine: 3월 이후 로직 변경 0.

  • E1 마지막 로직: 5ebb4ce (2026-03-26, level/speed) → 다음은 3836c4d (2026-07-12, .npmrc 정리 chore).

3) 새 능력은 core 해킹이 아니라 신규 repo 탄생으로.

  • 30d18f3 netcode-core 초기(2026-06-27), f0db4ae netcode-raw(06-27), 1436a49 netcode-interpolated(06-27), a5917cd online-core(06-26), e9470f0 protocol(07-12).

4) 폐기된 P2P는 in-place 수정이 아니라 격리 후 대체.

  • network 실질 마지막 2c636e4(2026-03-27) 이후 사실상 사망. 온라인은 signaling a4cc0ff(2026-06-25, authoritative GameDO 신설)로 새 경로 구축. buggy 접근이 core를 오염시키지 않음.

5) AI 매니저의 원자적 다중 repo 릴리즈.

  • 동일 타임스탬프가 여러 repo에 동시: 2026-07-12 18:01:44 → core·engine·leaderboard·netcode-·network·online-core·signaling·web / 18:32:45 → core·protocol·signaling·web·netcode- (protocol SSOT 추출 파도). 다중 패키지를 조율해 한 번에 배포한 흔적.

판정

가설("하위 레이어일수록 초반에 굳고 이후 안 건드려진다") = 데이터로 확인.

  • 결정적 증거: core·engine이 E2 온라인 재구축 전체를 커밋 0으로 통과. 순수 도메인/로컬 루프가 온라인 배관과 실제로 분리돼 있었음.
  • 가산적 레이어링: 후기 능력은 전부 신규 repo로 추가.
  • 폐기 격리: P2P는 core 오염 없이 대체.

정직한 단서 (약점 명시)

  • E3(2~4P 확장)은 cross-cutting이었다: core·protocol·netcode·signaling·web를 한 파도에 동시 변경. "영구 동결"은 아니며, 게임 스코프(2→4인)가 커질 때 도메인이 정당하게 재개됨. 단, 이는 온라인 배관 때문이 아니라 진짜 게임규칙 변경이라 레이어 위반 아님.
  • 즉 격리는 "온라인 축"에 대해선 완벽(core 불변), "게임규칙 축(플레이어 수)"에 대해선 core가 변경점이 되는 것이 설계상 정상.

설계 선택의 근거 — 왜 MWD인가 (모노레포 대비)

논리적 디커플링 수준 자체는 설계(DDD·플러그블 네트코드)의 문제이므로 모노레포로도 도달 가능하다. 그럼에도 MWD를 택한 이유는, 격리가 "설계 의도"에 그치지 않고 실제로 강제·증명되기 때문이다.

  • 경계가 물리적으로 강제된다. core를 쓰려면 glpkg publish 후 버전 의존으로만 소비 가능 — 내부 파일 침범이 원천 불가. publish 경계가 casual 결합을 막는 포싱 펑션으로 작동한다. (본 프로젝트에서 core가 E2 전체를 커밋 0으로 통과한 건 이 강제의 결과다.)
  • 격리가 감사 가능한 증거로 남는다. repo별 독립 커밋 히스토리 덕에 "core는 온라인 재구축 내내 미변경"이 cscan 한 번으로 드러난다 — 위 "핵심 증거 커밋"이 그 산물.
  • 독립 버전·배포가 네이티브다. core 0.3.0 / web 1.2.1처럼 레이어별 릴리즈 케이던스가 자연스럽게 분리된다.
  • cross-cutting 변경(E3 다중 repo 릴리즈)의 조율 비용은 전용 도구가 흡수한다. glpkg(원자적 배포)·git-nested(전체 상태)·mwd-deps(영향도)·cscan(히스토리) 등 MWD 도구 체계가 이미 갖춰져 있어, 다중 repo를 한 흐름으로 다룬다. (도구 상세: MWD 도구 & AI 자동화 프롬프트)

요지: AI가 MWD를 택한 덕에 레이어 격리가 publish 경계로 강제됐고, 그 결과가 각 repo 커밋 히스토리에 검증 가능한 증거로 남았다.


근거 데이터: cscan -g /…/snake-game-2p (2026-07-31 기준, 14개 독립 repo · 126 커밋). 누구나 재현 가능.