부록 E. 결정 기록

프로젝트를 진행하며 실제로 채택한 결정, 그렇게 정한 이유, 함께 검토했으나 채택하지 않은 대안과 그 이유, 그리고 언제 정해졌는지를 한자리에 모은다.

정본은 개발 로그(/devlog/)와 미결 항목(/pending/)이다. 이 페이지는 사람이 훑어보도록 결정과 근거만 추린 것이고, 세부 수치·검증 과정·구현 위치는 링크한 원문에 있다. 결정이 바뀌면 원문을 고치고 이 표를 따라 갱신한다.

읽는 법. 「대안 / 기각」이 있는 항목은 다른 길을 실제로 재보고 접었다는 뜻이다. 「되돌림」·「보류」로 표시된 것도 결정이다 — 왜 그 길로 가지 않는지가 기록으로 남아야 같은 조사를 반복하지 않는다.


한눈에 보기 (시간순)

분석·AI 판정22건백엔드·데이터 모델21건인프라·배포10건팀·협업 방식10건제품 범위12건08-2409-0109-0709-1409-2109-23스프린트 2 시작스프린트 3 시작1) 측정과 판단의 분리 — 08-252) 포즈 추정 스택 — OpenCV 디코딩 + RT-DETR + ViTPose (COCO-17) — 08-253) 판정 모델 — EXAONE 4.0 1.2B (오픈 웨이트, bf16, 양자화 없이) — 08-254) 등급 판정을 언어 모델이 아니라 채점 코드가 내린다 — 08-255) 출력 스키마 문법 강제 + 필드 순서로 사고 순서 고정 — 08-256) 산출물은 점수표가 아니라 칭호 — 08-257) 채점 단위는 (종목, 동작), 동작은 사용자가 선택 — 08-268) 품질 게이트에서 손목을 필수 관절에서 제외 — 08-269) 외부에서 받은 포즈에 우리 임계값을 그대로 적용하지 않는다 — 08-2610) 분석 대상 selector(A / B) 결정 보류 — 08-2811) 결측 프레임 오염 제거(A-1)를 되돌림 — 08-3112) 팔 종목 임팩트 진단 정정 — 08-3113) 프레임레이트 불변성 수정안 두 개를 구현 전에 기각 — 09-0114) 분석 프레임레이트를 15에서 30으로, 단일 상수로 — 09-0215) 바운디드 컨텍스트 구조 + 아키텍처 테스트 — 08-2516) 백엔드 스택 — FastAPI + PostgreSQL + pgvector — 08-2617) 규격을 구현보다 먼저 낸다 — 08-2618) 관리자 구분을 별도 컬럼 없이 이메일 화이트리스트로 — 08-3119) 운영에서 Swagger UI 비활성화 — 09-0220) 팀 탈퇴를 소프트 삭제로 — 09-0221) 클립 업로드를 스토리지 직접 전송으로, 반려도 정상 등록 — 09-0322) 지표 정의에서 종목 필드 제거 — 09-0123) 지원 무르기·거절을 한 경로로, 거절 시 행 삭제 — 09-0424) 분석 워커를 pull 방식으로, 멈춘 작업은 1회만 회수 — 09-0425) 평가·신뢰 도메인 규칙 3건 — 09-0426) 배포는 AWS EC2 단일 인스턴스, DB는 같은 인스턴스에 병설 — 09-0227) 고정 IP 미부착, 외부 공개는 결정하는 날 한꺼번에 — 09-0228) GPU 인스턴스(g4dn.xlarge)는 쓸 때만 켠다 + 자동 종료 — 09-0329) 문서 사이트 테마 — Just the Docs — 08-2430) 사람별 브랜치, Pull Request 미사용 — 08-2431) 역할 재배정 — 08-2632) 미결 항목을 팀 요청·결정의 공통 입구로 — 09-0133) 미결 항목을 브랜치별 구역제로 — 09-0134) 백엔드 미구현을 테이블 수가 아니라 도메인으로 분담 — 09-0335) 지원 종목을 10종에서 3종으로 축소 — 08-2636) 여는 범위는 종목당 한 동작, 나머지는 공개 여부로 닫음 — 08-2637) 챗봇은 이번 스프린트에 모집 등록 흐름만, LLM은 Gemini — 09-0438) 분석 결과 적재 규격을 A안으로 — 지표 정의에서 종목을 뗀다(22번의 확정) — 09-0840) 분석은 임시, 「저장」을 눌러야 남는다 — 안 누른 영상은 나갈 때 지우고 놓친 것은 24시간 뒤 서버가 정리 — 09-0839) 측정하지 못한 것을 「못했다」로 바꾸지 않는다 — 못 잰 값을 0으로 지어내지 않는다 — 09-0841) 오버롤 등급은 영상 하나에 하나 — 선수 단위로 합치지 않고, 검수 전이라 「잠정」을 붙여 보여 준다 — 09-0842) 서버의 빌드·구동은 k3s 로만 — docker-compose 는 쓰지 않는다 — 09-0943) 리포트는 DB 에서 조립해 내보낸다 — 분석 산출물을 그대로 돌려주지 않고, 나갈 필드를 허용목록으로 정한다 — 09-0944) 리포트 봉투(분석 결과 형식)를 버전 붙은 계약으로 고정 — 「정본은 코드」를 정정 — 09-1045) 선수 성향 벡터는 루브릭별 공간으로 — 종목을 넘는 한 공간에 섞지 않는다 — 09-1046) 용병 검색은 임베딩 유사도로(Gemini 임베딩 + pgvector), 챗봇이 그 검색을 부른다 — 09-1047) 업로드 길이 상한을 60초에서 10초로 — 분석 창과 맞춘다. 반영 전에 되돌렸다(75번) — 09-1148) 산출물 이름을 실물에 맞춘다 — 「RAG 검증」 → 「루브릭 기반 실력 검증, 근거 생성」, 추천 정확도 검증은 백엔드로 — 09-1150) 스프린트 3 에서 적합도 판단을 뺀다 — 수준·역할·성향 세 축의 재료가 없다. 포지션→지표 매핑은 검수까지 보류 — 09-1151) 분석을 축구 한 종목으로 — 야구·농구 루브릭을 지웠다(35번을 바꿈). 09-16 에 평가 표본도 축구로 — 09-1149) 지도자 없이 설 수 있는 검증 기준으로 — 사람 일치도(QWK·MAE)는 「골든셋 확보 시」로 낮추고 재현성·fps 불변성·지표 타당성을 1차 지표로 — 09-1152) 「비슷한 팀」은 유사도가 아니라 조건 교집합으로 — 판 크기 같은 하드 조건만 거르고 시간·지역은 순서로. 등급은 매칭 근거로 안 쓴다 — 09-1153) 운영 API 를 systemd 에서 k3s 파드로 전환 — DB 는 서버에 그대로 둔다 — 09-1154) 등급 경계값의 출처를 문헌에서 찾아 붙였다 — 어긋나는 자리 3곳이 나왔지만 값은 옮기지 않는다(사전 등록대로) — 09-1455) 분석 대상 후보 검출을 큐 작업으로 — GPU 가 꺼져 있을 수 있어 동기 호출 대신. 09-17 에 화면은 안 붙이기로 — 09-1556) 워커 폴링 5초 유지 — 요청 9배를 사용자 대기 평균 20초 단축과 맞바꾼다 — 09-1557) 카드의 호칭·한 줄 소개는 사람이 적는다 — 분석은 불릿 두 줄과 리포트 칭호만, 신뢰는 경기 후 리뷰가 받친다 — 09-1658) 용병 조건 두 벌(검색용·일정 매칭용)을 지금은 합치지 않는다 — 질의 방식이 다르다 — 09-1659) main 통합 결과를 남의 브랜치로 되밀지 않는다 — 가져오는 것은 각자 — 09-1660) 미결 항목의 끝난 회차는 접고, 무거워진 닫힌 항목은 세션을 시작할 때 아카이브로 옮긴다 — 09-1661) 지도자 섭외를 그만두고 검수 없이 간다 — 49번의 확정 — 09-1762) 「내 영상 두 편 비교」는 만들지 않는다 — 요청은 이미 있는 「선수와 비교하기」를 가리켰다 — 09-1763) 사이트를 문서 종류(제안·계획·진행)가 아니라 주제로 다시 나눈다 — 멘토 의견 — 09-1764) 판정 모델 가중치 사본을 S3 에도 둔다 — 서버 한 대에만 있었다(28번을 보완) — 09-1765) 마지막 주장의 출구는 팀 해체 — 행을 지우지 않는 해체로, 소유권 이양 화면은 안 붙인다 — 09-1766) GPU 인스턴스 자동 종료를 없앤다 — 켜고 끄기는 사람이 한다(28번을 바꿈) — 09-1867) 사이트 그림·ERD 생성기를 저장소로 — 페이지는 팀 것인데 고칠 수단이 한 사람 PC 에만 있었다 — 09-1868) 업로드 해상도 상한을 없앤다 — 메모리는 분석 쪽 바이트 예산이 지킨다(21번을 바꿈) — 09-1969) 평가와 제품의 전처리를 한 경로로 통일하고 그 위에서 평가 기준선을 다시 선언 — 같은 영상이 두 곳에서 다른 등급을 받던 것 — 09-2170) 드리블 같은 반복 동작의 채점 밴드는 만들지 않는다 — 지금 계기는 터치가 아니라 공이 발치 근처에 있는 구간을 센다(드리블 없는 야구와 구별되지 않았다) — 09-2171) 저장한 영상은 갈래(분석·업로드)마다 3개까지 — 09-2272) 플랫폼 이름에서 「RAG 검증」을 뺀다 — 「멀티모달 용병 스카우팅 플랫폼」(48번이 그대로 둔 이름) — 09-2375) 업로드 길이 상한은 60초로 둔다 — 47번의 10초를 되돌림. 코드·계약은 처음부터 60초라 바뀌는 것은 없고, 분석은 앞 10초만 보되 잘린 사실은 결과에 남는다 — 09-2373) 운영 지표 경로를 바깥에서 막는다 — 지표는 서버 안에서만 수집한다 — 09-2374) 운영 관제는 Prometheus·Grafana 두 벌로, 바깥 포트 없이 — 매니페스트만(서버 미적용) — 09-23본문에 근거·대안까지 적은 결정 37개한 줄 색인의 결정 38개 — 상세는 원문
그림 E-1. 이 부록의 결정 75개를 정한 날(가로)과 분야(세로)로 놓았다. 채운 점은 아래 본문에 근거·대안까지 적은 결정, 빈 점은 「09-05 이후 — 한 줄 색인」의 결정이다. 점에 마우스를 올리면 결정 번호와 제목이 보인다(09-23까지).
정한 날 결정 분류
2026-08-24 문서 사이트에 Just the Docs 테마 채택 팀·협업
2026-08-24 사람별 브랜치 · Pull Request 미사용 팀·협업
2026-08-25 측정과 판단의 분리 (영상을 언어 모델에 직접 넣지 않는다) 분석·AI
2026-08-25 포즈 추정을 OpenCV + RT-DETR + ViTPose로 분석·AI
2026-08-25 판정 모델을 EXAONE 4.0 1.2B로 (오픈 웨이트, 양자화 없이) 분석·AI
2026-08-25 등급 판정을 언어 모델이 아니라 채점 코드가 내린다 분석·AI
2026-08-25 출력 스키마 문법 강제 + 필드 순서로 사고 순서 고정 분석·AI
2026-08-25 산출물은 점수표가 아니라 칭호 분석·AI
2026-08-25 백엔드를 바운디드 컨텍스트 구조로 + 아키텍처 테스트 백엔드·데이터
2026-08-26 역할 재배정 (박민호 PM, 백성검 프론트·웹, 정어진 백엔드·파이프라인) 팀·협업
2026-08-26 지원 종목을 10종에서 축구·야구·농구 3종으로 축소 제품 범위
2026-08-26 채점 단위를 (종목, 동작)으로, 동작은 사용자가 선택 분석·AI
2026-08-26 여는 범위는 종목당 한 동작, 나머지는 공개 여부로 닫음 제품 범위
2026-08-26 백엔드 스택을 FastAPI + PostgreSQL + pgvector로 백엔드·데이터
2026-08-26 규격을 구현보다 먼저 낸다 백엔드·데이터
2026-08-26 품질 게이트에서 손목을 필수 관절에서 제외 분석·AI
2026-08-26 외부에서 받은 포즈에 우리 임계값을 그대로 적용하지 않는다 분석·AI
2026-08-28 분석 대상 selector(A/B) 결정 보류 분석·AI
2026-08-31 관리자 구분을 별도 컬럼 없이 이메일 화이트리스트로 백엔드·데이터
2026-08-31 결측 프레임 오염 제거(A-1) 되돌림 분석·AI
2026-08-31 팔 종목 임팩트 진단 정정 (탐색 범위가 원인) 분석·AI
2026-09-01 미결 항목을 팀 요청·결정의 공통 입구로 팀·협업
2026-09-01 프레임레이트 불변성 수정안 두 개를 구현 전에 기각 분석·AI
2026-09-01 지표 정의에서 종목 필드 제거 (제안, 확인 대기) 백엔드·데이터
2026-09-02 미결 항목을 브랜치별 구역제로 재편 팀·협업
2026-09-02 배포를 AWS EC2 단일 인스턴스로, DB는 같은 인스턴스에 병설 인프라·배포
2026-09-02 운영에서 Swagger UI 비활성화 백엔드·데이터
2026-09-02 고정 IP 미부착, 외부 공개는 결정하는 날 한꺼번에 인프라·배포
2026-09-02 분석 프레임레이트를 15에서 30으로, 단일 상수로 분석·AI
2026-09-02 팀 탈퇴를 행 삭제가 아니라 소프트 삭제로 백엔드·데이터
2026-09-03 GPU 인스턴스(g4dn.xlarge)는 쓸 때만 켠다 + 자동 종료 인프라·배포
2026-09-03 백엔드 미구현을 테이블 수가 아니라 도메인으로 분담 팀·협업
2026-09-03 클립 업로드를 스토리지 직접 전송으로, 반려도 정상 등록 백엔드·데이터
2026-09-04 지원 무르기·거절을 한 경로로, 거절 시 행 삭제 백엔드·데이터
2026-09-04 분석 워커를 pull 방식으로, 멈춘 작업은 1회만 회수 백엔드·데이터
2026-09-04 평가·신뢰 도메인 규칙 3건 확정 백엔드·데이터
2026-09-04 챗봇은 이번 스프린트에 모집 등록 흐름만, LLM은 Gemini 제품 범위

09-05 이후 — 한 줄 색인

09-05 부터는 결정마다 한 줄과 원문 위치만 둔다. 결정이 미결 항목·개발 로그·계약 문서에 흩어져 쓰이면서 이 부록이 09-04 에서 멈췄기 때문이다(2026-09-23 방식 변경). 근거·대안·검증은 원문에 있고, 이 표는 「언제 무엇을 정했나」를 한자리에서 찾는 입구다. 번호는 아래 본문(1~37번)에 이어 붙였고, 앞 결정을 바꾼 것은 「N번을 바꿈」으로 적었다. 미결 번호는 제기자 구역 안의 번호이며, 닫힌 항목은 미결 항목 아카이브에 있다.

# 정한 날 결정 분야 원문
38 2026-09-08 분석 결과 적재 규격을 A안으로 — 지표 정의에서 종목을 뗀다(22번의 확정) 백엔드·데이터 개발 로그 · 미결 jin 1번
39 2026-09-08 측정하지 못한 것을 「못했다」로 바꾸지 않는다 — 못 잰 값을 0으로 지어내지 않는다 분석·AI 개발 로그 · 미결 ho 21번
40 2026-09-08 분석은 임시, 「저장」을 눌러야 남는다 — 안 누른 영상은 나갈 때 지우고 놓친 것은 24시간 뒤 서버가 정리 백엔드·데이터 미결 jin 24번 · ho 27번
41 2026-09-08 오버롤 등급은 영상 하나에 하나 — 선수 단위로 합치지 않고, 검수 전이라 「잠정」을 붙여 보여 준다 분석·AI 개발 로그
42 2026-09-09 서버의 빌드·구동은 k3s 로만 — docker-compose 는 쓰지 않는다 인프라·배포 미결 min 11·14번
43 2026-09-09 리포트는 DB 에서 조립해 내보낸다 — 분석 산출물을 그대로 돌려주지 않고, 나갈 필드를 허용목록으로 정한다 백엔드·데이터 미결 jin 27번
44 2026-09-10 리포트 봉투(분석 결과 형식)를 버전 붙은 계약으로 고정 — 「정본은 코드」를 정정 분석·AI 개발 로그 · 미결 jin 27번
45 2026-09-10 선수 성향 벡터는 루브릭별 공간으로 — 종목을 넘는 한 공간에 섞지 않는다 백엔드·데이터 미결 ho 32번 · jin 28번
46 2026-09-10 용병 검색은 임베딩 유사도로(Gemini 임베딩 + pgvector), 챗봇이 그 검색을 부른다 백엔드·데이터 개발 로그 · 미결 min 16번
47 2026-09-11 업로드 길이 상한을 60초에서 10초로 — 분석 창과 맞춘다. 반영 전에 되돌렸다(75번) 제품 범위 미결 ho 30번 · jin 11번
48 2026-09-11 산출물 이름을 실물에 맞춘다 — 「RAG 검증」 → 「루브릭 기반 실력 검증, 근거 생성」, 추천 정확도 검증은 백엔드로 제품 범위 미결 ho 31번
49 2026-09-11 지도자 없이 설 수 있는 검증 기준으로 — 사람 일치도(QWK·MAE)는 「골든셋 확보 시」로 낮추고 재현성·fps 불변성·지표 타당성을 1차 지표로 분석·AI 미결 ho 34번
50 2026-09-11 스프린트 3 에서 적합도 판단을 뺀다 — 수준·역할·성향 세 축의 재료가 없다. 포지션→지표 매핑은 검수까지 보류 제품 범위 미결 ho 33번
51 2026-09-11 분석을 축구 한 종목으로 — 야구·농구 루브릭을 지웠다(35번을 바꿈). 09-16 에 평가 표본도 축구로 제품 범위 개발 로그 · 미결 ho 39번
52 2026-09-11 「비슷한 팀」은 유사도가 아니라 조건 교집합으로 — 판 크기 같은 하드 조건만 거르고 시간·지역은 순서로. 등급은 매칭 근거로 안 쓴다 백엔드·데이터 미결 paik 20번
53 2026-09-11 운영 API 를 systemd 에서 k3s 파드로 전환 — DB 는 서버에 그대로 둔다 인프라·배포 개발 로그 · 미결 min 14번
54 2026-09-14 등급 경계값의 출처를 문헌에서 찾아 붙였다 — 어긋나는 자리 3곳이 나왔지만 값은 옮기지 않는다(사전 등록대로) 분석·AI 미결 ho 34번
55 2026-09-15 분석 대상 후보 검출을 큐 작업으로 — GPU 가 꺼져 있을 수 있어 동기 호출 대신. 09-17 에 화면은 안 붙이기로 백엔드·데이터 미결 ho 44번
56 2026-09-15 워커 폴링 5초 유지 — 요청 9배를 사용자 대기 평균 20초 단축과 맞바꾼다 인프라·배포 미결 ho 48번
57 2026-09-16 카드의 호칭·한 줄 소개는 사람이 적는다 — 분석은 불릿 두 줄과 리포트 칭호만, 신뢰는 경기 후 리뷰가 받친다 제품 범위 미결 paik 32·36번 · ho 50번
58 2026-09-16 용병 조건 두 벌(검색용·일정 매칭용)을 지금은 합치지 않는다 — 질의 방식이 다르다 백엔드·데이터 미결 min 16번
59 2026-09-16 main 통합 결과를 남의 브랜치로 되밀지 않는다 — 가져오는 것은 각자 팀·협업 루트 CLAUDE.md 「브랜치와 병합」
60 2026-09-16 미결 항목의 끝난 회차는 접고, 무거워진 닫힌 항목은 세션을 시작할 때 아카이브로 옮긴다 팀·협업 미결 ho 51번 · 루트 CLAUDE.md 「미결 항목」
61 2026-09-17 지도자 섭외를 그만두고 검수 없이 간다 — 49번의 확정 분석·AI 미결 ho 2번
62 2026-09-17 「내 영상 두 편 비교」는 만들지 않는다 — 요청은 이미 있는 「선수와 비교하기」를 가리켰다 제품 범위 미결 min 22번
63 2026-09-17 사이트를 문서 종류(제안·계획·진행)가 아니라 주제로 다시 나눈다 — 멘토 의견 팀·협업 미결 jin 40번
64 2026-09-17 판정 모델 가중치 사본을 S3 에도 둔다 — 서버 한 대에만 있었다(28번을 보완) 인프라·배포 미결 ho 54번
65 2026-09-17 마지막 주장의 출구는 팀 해체 — 행을 지우지 않는 해체로, 소유권 이양 화면은 안 붙인다 백엔드·데이터 미결 paik 35번
66 2026-09-18 GPU 인스턴스 자동 종료를 없앤다 — 켜고 끄기는 사람이 한다(28번을 바꿈) 인프라·배포 6장 1절
67 2026-09-18 사이트 그림·ERD 생성기를 저장소로 — 페이지는 팀 것인데 고칠 수단이 한 사람 PC 에만 있었다 팀·협업 미결 jin 41번
68 2026-09-19 업로드 해상도 상한을 없앤다 — 메모리는 분석 쪽 바이트 예산이 지킨다(21번을 바꿈) 백엔드·데이터 미결 jin 43번
69 2026-09-21 평가와 제품의 전처리를 한 경로로 통일하고 그 위에서 평가 기준선을 다시 선언 — 같은 영상이 두 곳에서 다른 등급을 받던 것 분석·AI 미결 ho 47·49번
70 2026-09-21 드리블 같은 반복 동작의 채점 밴드는 만들지 않는다 — 지금 계기는 터치가 아니라 공이 발치 근처에 있는 구간을 센다(드리블 없는 야구와 구별되지 않았다) 분석·AI 미결 ho 43번
71 2026-09-22 저장한 영상은 갈래(분석·업로드)마다 3개까지 제품 범위 미결 jin 44번
72 2026-09-23 플랫폼 이름에서 「RAG 검증」을 뺀다 — 「멀티모달 용병 스카우팅 플랫폼」(48번이 그대로 둔 이름) 제품 범위 표지
73 2026-09-23 운영 지표 경로를 바깥에서 막는다 — 지표는 서버 안에서만 수집한다 인프라·배포 미결 jin 30번
74 2026-09-23 운영 관제는 Prometheus·Grafana 두 벌로, 바깥 포트 없이 — 매니페스트만(서버 미적용) 인프라·배포 미결 jin 30번
75 2026-09-23 업로드 길이 상한은 60초로 둔다 — 47번의 10초를 되돌림. 코드·계약은 처음부터 60초라 바뀌는 것은 없고, 분석은 앞 10초만 보되 잘린 사실은 결과에 남는다 제품 범위 미결 jin 11번

1. 분석·AI 판정

1) 측정과 판단의 분리

  • 채택 — 영상을 언어 모델에 직접 넣어 점수를 매기게 하지 않는다. 관절 각도·각속도 같은 수치는 결정론적 포즈 추정 코드가 산출하고, 언어 모델은 그 수치를 채점 기준과 대조해 판정만 한다. 총점 계산은 애플리케이션 코드가 한다.
  • 이유 — 언어 모델은 픽셀에서 각도를 측정할 수 없다. 측정하지 않은 값을 그럴듯하게 지어내고 같은 영상에서 다른 점수가 나온다. 근거를 댈 수 없는 점수는 실력 검증 산출물이 될 수 없다. 데이터 모델도 측정값과 리포트를 별도 테이블로 나눠 이 구조를 따른다.
  • 정한 날 / 기록 — 2026-08-25 · 3장 3)절, 6장 4)절 · 개발 로그

2) 포즈 추정 스택 — OpenCV 디코딩 + RT-DETR + ViTPose (COCO-17)

  • 채택 — 프레임 디코딩은 OpenCV, 사람 검출은 RT-DETR, 키포인트는 ViTPose. 관절은 COCO-17.
  • 대안 / 기각 — 설계 초안의 MediaPipe Pose(33관절). 필수 투입자원 목록에 MediaPipe가 없고 OpenCV·Transformers가 지정돼 있어 실제 환경에서 접었다.
  • 정한 날 / 기록 — 2026-08-25 · 6장 3)절 · 개발 로그

3) 판정 모델 — EXAONE 4.0 1.2B (오픈 웨이트, bf16, 양자화 없이)

  • 채택 — 개발 GPU가 RTX 3050 8GB라, 8GB에 올라가면서 Transformers에 네이티브로 통합돼(원격 코드 불필요) 상류 변경에 안 깨지는 모델이 EXAONE 4.0 1.2B뿐이었다. bf16으로 상주 약 2.4GB, 재현성 실측은 3회 반복 표준편차 0.00.
  • 대안 / 기각
    • 상용 API 모델 — 초기 전제였으나 오픈 웨이트로 전환. 이때 “파인튜닝 금지, 루브릭·RAG로 해결”과 “샘플링 온도 미지정” 두 결론이 뒤집혔다(자체 서빙은 기본 온도가 0.7이라, 명시하지 않으면 같은 영상에서 점수가 요동친다). 골든셋이 200건 이상 쌓이면 LoRA 미세조정이 유효하나 순서(루브릭 정교화 → 앵커 예시 → 모델 상향 → 미세조정)는 지킨다.
    • EXAONE 3.5 · 4.x 32B~33B — 4비트 양자화로도 19GB 안팎이라 8GB에 적재 불가.
    • EXAONE 3.5 7.8B (GGUF Q4_K_M) — 처음 선정했으나, 자체 모델링 코드를 받는 방식이 특정 Transformers 버전 창에만 맞아, 팀 전원이 재현하는 환경에서 상류 변경에 깨진다.
    • 비전-언어 모델 — 8GB에 불가. 그래서 에이전트는 키프레임 이미지를 보지 못하고, 시선·표정처럼 수치화 못 하는 항목은 루브릭에서 제외했다.
    • 추론 특화 모델(EXAONE Deep) — 추론 토큰 생성으로 지연이 크고 출력 스키마 문법 강제와 충돌.
    • 4비트 양자화 — 1.2B에서는 역양자화 오버헤드로 적재 6배·생성 2배 느려 손해. 작은 모델은 양자화하지 않는다.
  • 비고 — 모델을 바꿔도 루브릭·출력 스키마·파이프라인은 재사용되고 교체 범위는 판정 백엔드 한 곳이다. EXAONE은 상업적 이용에 별도 계약이 필요해(라이선스 NC) 서비스 오픈 전 정리 대상으로 미결에 올려 두었다.
  • 정한 날 / 기록 — 2026-08-25 (같은 날 7.8B → 4.0 1.2B로 재조정) · 6장 4)절 · 모델 선정 · 구현 착수

4) 등급 판정을 언어 모델이 아니라 채점 코드가 내린다

  • 채택 — 루브릭이 등급별 수치 구간을 선언하고, 채점 코드가 측정값을 그 구간과 대조해 등급을 정한다(양끝 포함, 높은 등급 우선). 언어 모델의 몫은 근거 문장 생성만 남기고, 출력 스키마에서 등급 필드를 없애 등급을 뒤집을 경로 자체를 차단했다.
  • 대안 / 기각 — 출력 스키마에 대조 추론 필드를 넣어 언어 모델이 등급을 판정하게 하는 방식. 소형 모델이 경계값 비교(141.7 대 140)를 반복해서 틀렸고, 등급 정의가 이미 수치 구간이라 판정에 추론이 필요 없었다. 산문 기준(“150~170도”)의 경계 겹침도 코드로 내리며 없앴다(경계 29건 검증).
  • 정한 날 / 기록 — 2026-08-25 · 6장 4)절 · 등급 판정을 코드로

5) 출력 스키마 문법 강제 + 필드 순서로 사고 순서 고정

  • 채택 — 제약 디코딩으로 출력 스키마를 강제하고, 스키마 필드 배치를 곧 사고 순서로 삼는다(등급 기준을 하나씩 대조하는 필드를 앞에 둔다).
  • 이유 — 같은 모델이 등급을 먼저 뱉게 하면 틀리고, 대조 필드를 추가하면 맞았다. 필드 구성이 판정 정확도를 바꾼다는 실측.
  • 정한 날 / 기록 — 2026-08-25 · 6장 4)절 · 구현 착수

6) 산출물은 점수표가 아니라 칭호

  • 채택 — 총점·배점표를 화면에서 접고, 항목마다 비유를 하나 잡아 등급에 따라 굴리는 칭호를 산출물로 한다. 칭호 문구는 화면이 아니라 루브릭 정의에 둔다.
  • 이유 — 루브릭이 지도자 검수 전이라 점수 자체가 잠정값이고, 선수에게 보여줄 것은 무엇이 나아지고 나빠졌는지 읽히는 단어다.
  • 정한 날 / 기록 — 2026-08-25 · 3장 4)절 · 등급 판정을 코드로

7) 채점 단위는 (종목, 동작), 동작은 사용자가 선택

  • 채택 — 종목 하나가 아니라 (종목, 동작) 쌍마다 루브릭을 둔다. 업로드할 때 사용자가 (종목, 동작)을 고른다.
  • 이유 — 같은 지표가 동작에 따라 반대로 채점된다(임팩트 시 무릎각 176도: 인스텝 슈팅 1점, 인사이드 패스 0점). 농구는 점프슛과 레이업이 임팩트로 삼는 프레임 자체가 다르다.
  • 대안 / 기각 — 동작 자동 판별. 임팩트를 찾으려면 어느 사지의 어떤 사건을 볼지 먼저 알아야 하는데 그것을 루브릭이 선언하고, 같은 종목의 슛/패스는 각도 분포가 겹쳐 잘못 고르면 점수가 조용히 틀린다.
  • 정한 날 / 기록 — 2026-08-26 · 종목 범위 축소

8) 품질 게이트에서 손목을 필수 관절에서 제외

  • 채택 — 사지마다 요구하는 관절 수를 따로 규정한다 — 팔은 어깨·팔꿈치 2개, 다리는 발목까지 3개. 손목은 통과 판정에서만 빠지고 프레임 단위 유효성 마스크에는 남는다.
  • 이유 — 외부 포즈 3,444클립에서 손목 때문에 79%가 탈락했는데, 팔 루브릭이 손목을 쓰는 곳은 팔꿈치각 하나뿐이었다. 게이트 조정 후 최종 지표 산출률이 야구 21% → 71%, 농구 11% → 40%로 올랐고 통과 클립의 측정값은 100% 동일.
  • 대안 / 기각 — 다리도 같이 면제하는 것. 무릎각은 엉덩이·무릎·발목 세 점으로 계산해 발목이 빠지면 각도가 정의되지 않고 임팩트조차 못 찾는다(축구 17/17 실패). 체인마다 잘라도 되는 자리가 다르다.
  • 정한 날 / 기록 — 2026-08-26 · 6장 3)절 신뢰도 처리 · 포즈 신뢰도 임계값

9) 외부에서 받은 포즈에 우리 임계값을 그대로 적용하지 않는다

  • 채택 — 자체 파이프라인(ViTPose)과 외부 제공 포즈(KAPAO 등)는 신뢰도 분포가 달라 같은 임계값으로 자르지 않는다. 자체 파이프라인의 팔 신뢰도 임계값은 실측으로 정한 값을 유지한다.
  • 이유 — ViTPose는 연속 점수를 주고 KAPAO는 이미 낮은 값이 잘려 온다. 신뢰도 값 25만 개를 전수 조사해 특정 구간에 값이 하나도 없음을 확인.
  • 정한 날 / 기록 — 2026-08-26 · 포즈 신뢰도 임계값

10) 분석 대상 selector(A / B) 결정 보류

  • 보류 — 영상에 여러 사람이 잡힐 때 누구를 분석할지 정하는 selector를 놓고 후보 5종을 비교했으나, 마지막 둘(연속성 가점 유무)을 현재 데이터셋으로는 가릴 수 없다. 격리 판독 60건, 부트스트랩 95% 구간이 [0.40, 0.80]로 0.5를 포함.
  • 이유 — 유의하게 가리려면 판정 가능 340건이 필요한데 이 데이터셋의 상한이 약 49건. 질문을 “어느 selector인가”에서 “연속성 가점을 언제 신뢰할 것인가”로 바꾼다(사람 라벨 없이 측정 가능).
  • 정한 날 / 기록 — 2026-08-28 · selector가 갈리지 않는다

11) 결측 프레임 오염 제거(A-1)를 되돌림

  • 되돌림 — 측정 불가 프레임이 이웃 정상 프레임의 각속도를 부풀리는 문제를 고치는 변경을 만들어 검증한 뒤 되돌렸다.
  • 이유 — 오염 자체는 실재하고 제거도 정당하나(잔차가 자연 변동의 85배, 과잉 제거 1.7%), 야구 임팩트 84.3% 이동의 정당성을 검증할 독립 정답이 없고 확보 경로도 전부 막혔다. 손목을 게이트에서 면제한 결정과 충돌하고, 기존 평가의 기준선이 흔들린다.
  • 재개 조건 — 팔 종목 릴리스 프레임 정답 25~60클립(자체 촬영, 30fps 이상).
  • 정한 날 / 기록 — 2026-08-31 · A-1을 되돌린다

12) 팔 종목 임팩트 진단 정정

  • 정정 — “임팩트가 릴리스보다 이르다”는 전제가 틀렸다. 임팩트가 이른 게 아니라 탐색 범위가 클립 전체라 실제 사건에 고정되지 않는 것이고, 문제없다고 적어 둔 축구에서도 같은 일이 일어난다.
  • 영향 — 이 진단이 놓고 있던 세 수정안(임팩트 사건 추가 / 밴드 재조정 / 프레임레이트 상향)이 모두 “릴리스는 제대로 잡았는데 각도가 안 맞는다”를 전제해 함께 폐기됐다.
  • 정한 날 / 기록 — 2026-08-31 · 임팩트가 이른 게 아니다

13) 프레임레이트 불변성 수정안 두 개를 구현 전에 기각

  • 기각 — 프레임레이트에 따라 등급이 달라지는 문제의 수정안 두 개(미분 스텐실 물리 시간 고정, 공통 시간 격자 리샘플)를 사전 등록 후 400클립으로 offline 산정해 구현 전에 접었다. 파라미터가 나빠서가 아니라 명세 자체가 목표를 달성할 수 없어서 다(선형 보간은 최댓값 위치를 표본점 밖으로 못 옮기고, 정수 격자 위에서 물리 스텐실은 고정되지 않는다).
  • 비고 — 앞선 A-1은 구현·검증 후 되돌렸고, 이번에는 순서를 바꿔 구현 전에 막았다.
  • 정한 날 / 기록 — 2026-09-01 · 수정안은 원리적으로 안 된다 · 원인 규명

14) 분석 프레임레이트를 15에서 30으로, 단일 상수로

  • 채택 — 목표 프레임레이트를 30으로 올리고, 그 값을 한 상수에 두어 평가 코드와 도구가 공유하게 한다.
  • 이유 — 15fps에서는 임팩트가 실제로 일어난 프레임이 후보 격자에 아예 없는 경우가 많았다. 30으로 올려 측정 타당성을 회복한 것이며, 어느 fps가 더 정확한지는 주장하지 않는다(정답 없음).
  • 대안 / 기각 — 상수값을 코드 곳곳에 리터럴로 뿌리는 방식. 지금은 맞지만 다음에 값을 옮길 때 또 갈라진다. 값은 한 곳, 의존은 눈에 보이게.
  • 정한 날 / 기록 — 2026-09-02 · 분석 프레임레이트 30

2. 백엔드·데이터 모델

15) 바운디드 컨텍스트 구조 + 아키텍처 테스트

  • 채택 — 백엔드를 기술 계층이 아니라 바운디드 컨텍스트로 나누고, 폴더 이름을 데이터 모델의 도메인에 맞춘다. 자동 테스트가 컨텍스트 경계를 검사한다(다른 컨텍스트의 내부 모델을 임포트하면 실패).
  • 정한 날 / 기록 — 2026-08-25 · 파이프라인을 API로 감싼다

16) 백엔드 스택 — FastAPI + PostgreSQL + pgvector

  • 채택 — 웹 프레임워크는 FastAPI, DB는 PostgreSQL 하나로 통일(유사 선수 검색을 위한 pgvector 포함), ORM·마이그레이션은 SQLAlchemy + Alembic. 인증은 자체 가입· 로그인(bcrypt 해시 + 서명된 JWT)에 구글 로그인(ID 토큰 검증)을 더한다.
  • 비고 — 초기 스프린트 로그·칸반의 “MySQL 적재” 표기는 오기이며 PostgreSQL + pgvector가 맞다.
  • 정한 날 / 기록 — 2026-08-26 · 6장 2)절, 부록 D · 적재 규격 회람

17) 규격을 구현보다 먼저 낸다

  • 채택 — 백엔드·파이프라인 영역은 구현이 덜 끝나도 API 규격과 장면 색인 스키마를 먼저 확정해 회람한다.
  • 이유 — 이 영역이 한 사람에게 묶여 있고, 프론트(API 소비자)와 에이전트(색인 스키마)가 여기에 걸려 있어 밀리면 세 사람이 동시에 밀린다. 일정이 밀릴 때 PM이 가장 먼저 덜어낼 대상도 이 영역으로 정했다.
  • 정한 날 / 기록 — 2026-08-26 · 역할 재배정

18) 관리자 구분을 별도 컬럼 없이 이메일 화이트리스트로

  • 채택 — 사용자 테이블에 권한 컬럼을 두지 않고 환경변수 화이트리스트로 관리자를 가른다. 다른 컨텍스트의 데이터를 읽어야 하는 조회는 내부 모델을 임포트하지 않고 원시 쿼리로 경계를 지킨다.
  • 이유 — 마이그레이션 없이 시작. 관리자가 늘어 화이트리스트가 아까워지면 그때 권한 컬럼으로 옮긴다.
  • 정한 날 / 기록 — 2026-08-31 · 관리자 화면

19) 운영에서 Swagger UI 비활성화

  • 채택 — 운영 환경에서는 자동 생성되는 대화형 API 문서(Swagger UI)를 등록하지 않는다.
  • 이유 — 스키마 자체가 공격 표면이다.
  • 정한 날 / 기록 — 2026-09-02 · 백엔드가 클라우드에서

20) 팀 탈퇴를 소프트 삭제로

  • 채택 — 팀 탈퇴는 소속 이력 행을 지우지 않고 탈퇴 시각만 남긴다.
  • 이유 — 경기·평가 이력이 그 행을 참조한다.
  • 정한 날 / 기록 — 2026-09-02 · 3장·3-3절 규격 · 파이썬 3.14

21) 클립 업로드를 스토리지 직접 전송으로, 반려도 정상 등록

  • 채택 — 세 단계로 나눈다: 사전 서명 URL을 발급받아 → 클라이언트가 S3로 직접 전송(앱 서버 미경유) → 등록·규격 검사. 규격 미달 클립도 오류가 아니라 정상 등록으로 처리하고 통과 여부와 반려 사유를 응답에 싣는다. 클라이언트는 상태 코드가 아니라 통과 여부 값으로 분기한다. 상한은 200MB · 60초 · 1920x1080.
  • 이유 — 오류로 튕기면 반려 사유가 아무 데도 안 남는데, 요구사항은 “반려 사유를 값으로 기록”이다. 4K를 막는 것은 호스트 메모리가 먼저 터지기 때문(실측). 사전 서명 전송은 크기를 강제하지 못해, 진짜 상한은 등록 시 스토리지에 실제 크기를 물어 건다.
  • 정한 날 / 기록 — 2026-09-03 · 3-6절 규격 · 클립 업로드
  • 🔴 바뀜 — 해상도 상한은 2026-09-19 에 없앴다(68번). 길이는 2026-09-11 에 10초로 정했다가 반영 전에 2026-09-23 60초 유지로 되돌렸다(47·75번).

22) 지표 정의에서 종목 필드 제거

  • 상태 — 제안됨. 에이전트 담당자 확인 대기. 합의 전에는 적재 엔드포인트를 만들지 않는다.
  • 제안 — 지표 정의 테이블에서 종목 필드를 없앤다. 지표는 물리량이고, 어느 종목에서 쓰는지는 루브릭이 안다.
  • 이유 — 루브릭 11개 지표 중 5개가 종목을 넘나든다(상체 기울기 지표는 축구·야구· 농구 전부). 현재 구조는 지표 코드가 기본키라 같은 코드를 두 종목으로 정의할 수 없다 (실측 확인).
  • 대안 / 기각
    • 복합키 (코드 + 종목) — 값 테이블 외래키가 두 컬럼이 되고 제출 시 종목을 항목마다 실어야 한다.
    • 코드에 종목 접두어 — 같은 물리량이 이름 3개가 되어 선수 벡터·유사도 검색에 직접 해롭고 루브릭도 전부 고쳐야 한다.
  • 반대 방향의 결정 — 포지션은 오히려 (종목 + 코드)로 분리한다. 축구의 FW와 농구의 FW는 다른 것이다. 지표는 합치고 포지션은 나누는 방향이 서로 반대인 것이 핵심.
  • 정한 날 / 기록 — 2026-09-01 제안, 2026-09-02 재확인 · 계약 3-1절 · 지표 코드가 종목을 넘나든다 · 적재 규격 결정 요청
  • 🔴 바뀜 — 2026-09-08 에 이 제안(A안)으로 확정됐다(38번).

23) 지원 무르기·거절을 한 경로로, 거절 시 행 삭제

  • 채택 — 지원 취소 경로 하나로, 지원 당사자가 부르면 무르기, 주최 팀 주장이 부르면 거절이고 둘 다 행을 지운다. 지난 경기에서는 막는다.
  • 이유 — 지원이 붙은 경기는 취소가 막혀 있었고 지원을 무를 경로 자체가 없었다. 거절을 컬럼에 기록하면 행이 남아 외래키 제약이 안 풀린다 — 행 삭제가 데이터 모델을 안 고치면서 취소를 푸는 유일한 안이었다. 지난 경기 행은 “누가 그 경기에 뛰었나”의 유일한 근거라 지우면 평가가 대상을 잃는다.
  • 잃은 것 — 거절 이력이 남지 않고 알림도 안 간다. 나중에 필요해지면 컬럼이 아니라 별도 테이블이어야 한다(행이 남으면 같은 막다른 곳이 돌아온다).
  • 정한 날 / 기록 — 2026-09-04 · 3-5절 규격 · 미결 jin 16번 · 지원 무르기·거절

24) 분석 워커를 pull 방식으로, 멈춘 작업은 1회만 회수

  • 채택 — 워커가 대기열에서 가장 오래된 작업을 받아 가 실행하고, 끝나면 성공/실패로 옮긴다. 멈춘 작업은 처음 멈추면 대기 상태로 되돌리고 또 멈추면 실패로 확정한다.
  • 이유 — GPU 인스턴스가 자동 종료되므로 밀어 주는 방식은 대상이 꺼져 있으면 실패한다. 루브릭을 고르려면 종목이 필요한데 그건 스토리지가 아니라 DB에 있다. 1회만 되살리는 것은 워커를 죽이는 클립(4K 메모리 초과)이 큐를 영원히 돌게 되기 때문이다.
  • 정한 날 / 기록 — 2026-09-04 · 3-8절 규격 · 미결 jin 18번 · 워커를 열었습니다

25) 평가·신뢰 도메인 규칙 3건

  • 채택
    • 평가 가능 기간: 경기 후 14일.
    • 불참 기록: 주최 팀 주장만.
    • 선택지 순서: 별도 순서 컬럼.
  • 이유 — 7일이면 격주로 경기하는 사람이 놓치고, 무기한이면 기억이 흐려진 평가를 받는데 그게 신뢰도의 원자료다. 불참은 제재 기록이라 좁혔다(누구나 붙이면 서로에게 붙일 수 있고 기록자 컬럼이 없어 추적도 안 된다). 분류 기준으로만 정렬하면 “주의”가 맨 앞에 온다.
  • 설계가 강제하는 것(그대로 유지) — 점수 없음, 신뢰도 저장 안 함, 리포트·불참 기록을 평가와 잇지 않음.
  • 정한 날 / 기록 — 2026-09-04 · 3-9절 규격 · 미결 jin 14번 · 평가·신뢰를 열었습니다

3. 인프라·배포

26) 배포는 AWS EC2 단일 인스턴스, DB는 같은 인스턴스에 병설

  • 채택 — 백엔드를 AWS EC2(t3.large, 서울 리전)에서 서비스로 상시 구동하고, PostgreSQL 18을 같은 인스턴스에 설치한다. 디스크는 8GB → 30GB로 증설. Python 3.14는 OS 저장소에 없어 uv로 독립 실행형을 받아 /opt에 둔다(홈 디렉터리 권한 때문에 서비스 계정이 못 읽는다).
  • 대안 / 기각 — 관리형 DB(RDS). 비용이 걸린 결정이라 같은 인스턴스로 시작하되, 나중에 옮기더라도 연결 문자열 하나만 바뀐다.
  • 정한 날 / 기록 — 2026-09-02 · 파이썬 3.14 · 클라우드에서 돕니다

27) 고정 IP 미부착, 외부 공개는 결정하는 날 한꺼번에

  • 채택 — 탄력적 IP를 붙이지 않는다. 백엔드 주소·DNS·포트 개방·nginx 리버스 프록시·Let’s Encrypt TLS는 외부 공개를 결정하는 날 그날의 IP로 한꺼번에 한다. 웹은 Vercel에 두고 API만 EC2를 가리킨다. 그 전까지 개발·시연은 SSH 터널.
  • 이유 — 탄력적 IP는 비용 대비 필요가 아직 없고, 인스턴스를 자주 껐다 켜므로 지금 DNS를 걸면 곧 어긋난다. 설정이 빈 채로 포트만 열면 서비스가 막히는 게 아니라 잘못 도는 상태로 노출된다.
  • 정한 날 / 기록 — 2026-09-02 (이후 정정으로 확정) · 미결 8번 · 외부 공개 준비

28) GPU 인스턴스(g4dn.xlarge)는 쓸 때만 켠다 + 자동 종료

  • 채택 — GPU 검증용 g4dn.xlarge(Tesla T4)는 방치하지 않고 쓸 때만 켠다. 유휴 시간 기준의 자동 종료 스크립트를 분석보다 먼저 깔았고, 종료 동작이 “중지”(삭제 아님)인 것을 먼저 확인했다. 모델 가중치는 S3가 아니라 HuggingFace에서 받은 로컬본을 쓴다(쓰기 권한 없음). 인스턴스는 원본 영상을 읽기만 한다.
  • 이유 — 방치 시 월 $490, 하루 2시간이면 월 $53로 9배 차이. 끄는 걸 잊는 것이 이 배포의 가장 큰 비용 위험. GPU 할당량이 계정 기본 0이라 증액 신청했다(작은 인스턴스 하나에 묶이지 않도록 넉넉히).
  • 정한 날 / 기록 — 2026-09-03 · 미결 16번 · GPU 할당량 0 · GPU 검증 한 바퀴
  • 🔴 바뀜 — 자동 종료는 2026-09-18 에 없앴다 — 켜고 끄기는 사람이 한다(66번). 모델 가중치 사본은 2026-09-17 부터 S3 에도 있다(64번).

4. 팀·협업 방식

29) 문서 사이트 테마 — Just the Docs

  • 채택 — 제안서 문서 사이트에 참고 사이트를 본떠 Just the Docs 테마를 쓴다. 좌측 사이드바 트리·검색·”위로” 버튼은 테마가 제공하고, 자체 레이아웃은 두지 않는다. 프로젝트 전용 CSS(ERD 이미지, 칸반)만 별도 스타일시트에 둔다.
  • 정한 날 / 기록 — 2026-08-24 무렵 · 루트 CLAUDE.md 「테마」 절

30) 사람별 브랜치, Pull Request 미사용

  • 채택 — 사람별 브랜치를 쓰고, 브랜치를 푸시해 두면 상대가 병합으로 합친다. PR을 열지 않는다.
  • 이유 — 팀의 실제 관행. 모르고 PR을 열면 헛수고이고 프리뷰 빌드까지 돌아 남의 영역에 노이즈가 된다.
  • 정한 날 / 기록 — 프로젝트 초기 · 루트 CLAUDE.md, CLAUDE.local.md

31) 역할 재배정

  • 채택 — 스프린트 1 도중 담당을 다시 나눴다. 박민호 PM(요구사항·일정, 스프린트 진행, QA 총괄 — 구현 영역 없음), 백성검 프론트·웹, 정어진 백엔드·파이프라인, 정상호 AI 에이전트.
  • 이유 — 이전에는 PM이 앱 화면을 겸해, 시험 항목과 판정 기준을 정하는 사람이 그 기준으로 평가받는 코드를 쓰는 구간이 있었다. 이제 네 영역 모두 만드는 사람과 판정하는 사람이 갈라진다. 대신 PM은 코드로 진척을 볼 수 없으므로 완료는 시연이 아니라 완료 조건 통과로만 판단한다.
  • 정한 날 / 기록 — 2026-08-26 · 팀 구성표 · 역할 재배정

32) 미결 항목을 팀 요청·결정의 공통 입구로

  • 채택 — 다른 사람이 판단·조치해야 하는 것은 자기 폴더 문서에만 두지 않고 미결 항목 페이지에 한 항목으로 올린다(담당·제기·기한). 요청은 “이 파일을 고쳐라”가 아니라 “이 성질을 만족하라”로, 확인 방법과 하지 말아야 할 것을 함께 적는다. 받은 요청은 고치기 전에 이미 됐는지 확인하고, 이미 만족하면 손대지 않는다.
  • 이유 — 커밋은 전달이 아니다(사람별 브랜치라 병합 전에는 상대가 못 받는다). 저장소 문서도 진입점에서 가리키지 않으면 안 읽힌다. 문서는 스냅샷이라 상대가 나중에 읽을 때 이미 다른 방식으로 해결됐을 수 있다.
  • 정한 날 / 기록 — 2026-09-01 · 루트 CLAUDE.md 「미결 항목」 절 · 요청 전달 규칙

33) 미결 항목을 브랜치별 구역제로

  • 채택 — 미결 항목을 제기자의 브랜치별 구역으로 나누고 각 항목은 한 단계 아래 헤딩으로 둔다. 자기 구역에만 추가하고 번호는 구역 안에서만 센다. 다른 파일에서 가리킬 때는 번호가 아니라 제목으로 쓴다.
  • 이유 — 전부 파일 끝에 붙이면 두 사람이 동시에 올릴 때 매번 충돌한다(실제로 겪고 실험으로 확인). 구역 기준을 담당자가 아니라 제기자로 두는 것은, 담당자 기준이면 남의 구역에 쓰게 되어 충돌이 되살아나기 때문.
  • 대안 / 기각 — 평면 목록 유지. 병합 시 평면으로 되돌리면 다음 사람이 또 파일 끝에 붙인다.
  • 정한 날 / 기록 — 2026-09-01 규칙, 2026-09-02 파일 적용 · 구역제로 재편

34) 백엔드 미구현을 테이블 수가 아니라 도메인으로 분담

  • 채택 — 남은 두 도메인을 통째로 넘긴다: 과금 → 백성검, 평가·신뢰 → 박민호. 새 컨텍스트마다 반드시 손대는 공유 파일(라우터 등록·마이그레이션 연결·공용 테스트 픽스처)은 정어진이 배선한다.
  • 이유 — 컨텍스트 폴더 구조를 아키텍처 테스트가 검사하므로 도메인 경계가 곧 폴더 경계다. 도메인으로 자르면 두 사람의 파일이 안 겹친다. 테이블 수로 균등하게 자르면 한 도메인이 둘로 쪼개져 같은 폴더를 둘이 만지게 된다. 마이그레이션 연결점은 자동 병합이 안 되는 자리(분기가 둘이 되면 업그레이드가 죽는다).
  • 정한 날 / 기록 — 2026-09-03 · 분담 문서 · 도메인으로 나눴습니다

5. 제품 범위

35) 지원 종목을 10종에서 3종으로 축소

  • 채택 — 루브릭 10종 중 5종(배드민턴·탁구·태권도·테니스·배구)을 걷어내고 축구·야구·농구만 남긴다.
  • 이유 — 종목을 여는 실제 비용은 루브릭 작성이 아니라 임계값 실측·지도자 검수· 검증 클립 확보이고, 남긴 것도 아직 전부 검수 전이다. 열린 종목이 늘면 미검증 상태도 그만큼 는다.
  • 정한 날 / 기록 — 2026-08-26 (미결 3번 해소) · 종목 범위 축소
  • 🔴 바뀜 — 2026-09-11 에 축구 한 종목으로 줄였다(51번).

36) 여는 범위는 종목당 한 동작, 나머지는 공개 여부로 닫음

  • 채택 — 세분화가 구조상 필요한 것과 지금 몇 개를 여느냐는 다른 문제로 보고, 축구 인스텝 슈팅·야구 투구·농구 점프슛 셋만 연다. 인사이드 패스·레이업은 파일 (임계값·칭호 포함)을 그대로 둔 채 루브릭의 공개 여부 필드로 닫는다. 닫힌 동작도 키를 직접 주면 분석은 되고 목록에서만 빠진다.
  • 이유 — 검수·실측은 목록을 열지 않고 돌려야 하고, 계약 테스트가 초안까지 순회하므로 닫혀 있는 동안 지표 이름이 어긋나면 여는 날이 아니라 그날 걸린다.
  • 정한 날 / 기록 — 2026-08-26 · 여는 범위
  • 🔴 바뀜 — 야구·농구 동작은 2026-09-11 에 루브릭째 지웠다(51번).

37) 챗봇은 이번 스프린트에 모집 등록 흐름만, LLM은 Gemini

  • 채택 — AI 챗봇으로 용병·팀 찾기를 자동화하는 두 흐름 중 이번 스프린트는 대화로 경기 모집 등록을 돕는 흐름만 진행한다. 나머지 흐름은 다음 스프린트. 챗봇 LLM은 Claude에서 Gemini로 바꿨다.
  • 이유 — LLM 교체는 계정 결제 문제 회피.
  • 정한 날 / 기록 — 2026-09-04 · 미결 min 7번

← 목차로