⑤ 레이어 격리 증거 — 커밋 히스토리 분석
주장: "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-12 | N-body 게임룰(2→4인) + protocol SSOT 추출 + web 모듈 리팩터 |
Epoch × 레이어 커밋 분포
| repo (레이어) | E1 | E2 | E3 | 합 | 분류 |
|---|---|---|---|---|---|
| core (순수 도메인) | 7 | 0 | 2 | 9 | 🟢 동결→게임룰 변경 시만 재개 |
| engine (로컬 게임루프) | 7 | 0 | 1* | 8 | 🟢 동결 (*E3는 chore) |
| auth (Firebase) | 4 | 0 | 0 | 4 | 🟢 완전 동결 |
| quickmatch | 3 | 0 | 0 | 3 | 🟢 완전 동결 |
| network (P2P WebRTC) | 14 | 1† | 1* | 16 | ⚫ 폐기(대체됨) (†주석,*chore) |
| leaderboard | 3 | 5 | 1 | 9 | 🟡 기능 연동 시 변경 |
| online-core (로비 DO) | 0 | 8 | 1 | 9 | 🆕 E2 신규 |
| netcode-core (계약) | 0 | 2 | 2 | 4 | 🆕 E2 신규 |
| netcode-raw | 0 | 5 | 2 | 7 | 🆕 E2 신규 |
| netcode-interpolated | 0 | 3 | 2 | 5 | 🆕 E2 신규 |
| protocol (wire SSOT) | 0 | 0 | 1 | 1 | 🆕 E3 신규 |
| signaling (권위 서버) | 4 | 9 | 2 | 15 | 🔴 온라인 핵심, 지속 진화 |
| web (통합·UI) | 11 | 12 | 2 | 25 | 🔴 최상단, 최다 변경 |
| architecture (docs) | 1 | 9 | 1 | 11 | 📄 온라인 시대 추적 |
색(분류) 기준 — 무엇으로 나눴나
축 = "커밋이 초반에 몰린 뒤 동결되는가(격리·보전)" 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 탄생으로.
30d18f3netcode-core 초기(2026-06-27),f0db4aenetcode-raw(06-27),1436a49netcode-interpolated(06-27),a5917cdonline-core(06-26),e9470f0protocol(07-12).
4) 폐기된 P2P는 in-place 수정이 아니라 격리 후 대체.
- network 실질 마지막
2c636e4(2026-03-27) 이후 사실상 사망. 온라인은 signalinga4cc0ff(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 커밋). 누구나 재현 가능.