v0.18.0 전체 기능·공유 계층의 커버리지와 소유권 장부 (이슈 #1281, G05)
2026-09-10 Phase 4 배정: 사용자 요청으로 D14 D14 #1533를 DATA / Phase 4-1에 추가했다. 전체 63개·Phase 4 7개·191개 직접 의존이며 D14 선행은 D02/D04/S10/D11, 후속 직접 소비자는 R01이다. 채택 실행계획과 총괄의 최신 목록을 따른다. D11의 기존 차등 발행 인계, R01의 활성 경로 마감, R04의 전체 비용, R05의 populated 전환 검증을 보강했다. 구현·검증 완료 판정은 추가하지 않았다.
D14의 계획 소유 범위는 workout 자식 writer·engine 최소 배선과 관련 저장/원본 보호/복원/경합 검사다. 앱 실행 분류·새 경로 등록은 실제 구현 PR에서 담당자가 확인한다. 아래 생성된 파일 수·서버 객체 수·판정은 역사 스냅샷으로 그대로 보존한다.
한 문장 — 저장소가 추적하는 파일 전부(2026-09-07 main
e749fe66기준 1,923개 — G05 산출물 5개 포함)와 서버 객체(테이블 77·함수 372·cron 잡 7·Edge 함수 3·API 핸들러 4)가 어느 기능·어느 계층에 속하고, v0.18.0 의 어느 계획 ID 가 책임지며, 지금 판정이 무엇인지를 한 곳에서 보여 주는 장부다. 계획(63개 작업 지시서)은 총괄 문서가, 소유 역할·병합 순서는 HQ 운영 정본이, 보존 정책·변경 계약은 ADR이 정본이다. 이 장부는 그 세 문서가 "실제 앱 전부를 덮는지"를 기계로 확인하는 연결 장부다.
- 이슈: #1281 (계획 ID G05, Phase 1 Step 2, 추가 범위 C01)
- 데이터·규칙: 앱 저장소의
scripts/architecture/coverage-inventory.json. §3은 문서 분리 전에 이 파일에서 생성한 역사 스냅샷이며 손으로 수치를 고치지 않는다. 이 문서는 문서 저장소가 소유한다. - 검사: 앱 저장소에서
node scripts/architecture/check-coverage-inventory.mjs(요약·대조),--strict(R01/R05 종료 검사),--json. #1463 이후 앱 검사는 이 문서의 생성·동기화를 요구하지 않으며--render는 제거됐다. - 갱신 책임: 규칙·제외·진입점 등록은 새 경로를 만든 담당 세션이 같은 PR 에서 한 줄 추가한다. 장부 행의 판정과 증거는 그 계층의 구현 담당 이 바꾼다(§1-3). 영역·소유 역할·통합 담당의 변경은 HQ 합의(운영 정본 §3 은 이 장부가 바꾸지 않는다).
- 운영 개정(2026-09-07, #1313): 소유자는 계약·변경 충돌을 조율하는 책임이며 상주 머지 승인자가 아니다. 담당자가 검증 후
npm run landing:request -- --pr <N>으로 자동 큐를 사용한다. HQ 라벨·재승인을 기다리지 않는다(운영 정본 §4). 생성 절의 파일 수는 현재 추적 파일로 갱신하고 기존 판정·증거는 유지한다. G02/G03/D03·auth 후속에서 누락된 14개 경로의 분류도 보충했다.
2026-09-09 #1477 초기 작업 측정: 홍보 랜딩 영역 1개·분류 규칙 12개를 제거하고 §3을 당시 앱 작업본에서 생성했다. 아래 과거 생성부는 기준 84e2d7d의 역사 스냅샷이며, 미분류 29개·미등록 cron 2개가 변경 전후 동일하고 새 누락·장부 행 누락은 0개였다. 랜딩 코드·자산·검사는 Barbelic-landing이, 관련 문서·이력은 이 저장소가 소유한다. 이후 #1463 문서 분리와 함께 통합 PR #1484로 release·staging에 반영됐고 통합 full CI가 통과했다. 이 초기 스냅샷의 문서 동기화·누락 수치를 최종 앱의 검사 결과로 해석하지 않는다. 최신 실행 분류는 앱 코드가 담당하며, 확정된 릴리스 상태와 검증은 #1477 작업 기록에 남긴다.
1. 읽는 법
1-1. 유저 A 의 기록 하나가 지나가는 길 (샘플 추적)
장부의 "계층" 이 무엇인지는 실제 기록 한 건을 따라가면 보인다. 유저 A 가 모바일에서 스쿼트 3세트를 기록하고 완료를 누른다.
| 순서 | 계층 | 실제 파일·객체 | 영역 |
|---|---|---|---|
| ① 화면 | ui | src/react/ui/mobile/screens/WorkoutFlow.tsx → WorkoutFinish.tsx (표현만, 저장 로직 없음) | workout |
| ② 바인딩 | binding | src/react/features/active-workout/WorkoutFlowBinding.tsx → features/completed-workout/completedWorkoutCommands.ts (화면의 의도를 명령으로) | workout |
| ③ 컨트롤러 | controller | src/react/controllers/workoutWriteController.ts (명령을 대기열에 넣고 영수증을 기다림) · pendingWorkoutSavesController.ts (기기 대기열, IndexedDB) | workout · durable |
| ④ 서비스 | service | src/react/services/domains/workoutDomain.ts · completedWorkoutWriteContract.ts · sessionWriteContractV5.ts (payload v5 조립) | workout |
| ⑤ 저장소 | repository | src/react/services/barbelicRepository.ts 의 callMutationRpc(client, "save_session_v5", …) (Supabase 어댑터, 5,485줄 — A01 분리 대상) | shell |
| ⑥ 서버 함수·테이블 | rpc | public.save_session_v5 → session·session_exercise·session_exercise_part·exercise_set·exercise_set_part 다섯 층 + workout_mutation_receipts (영수증) | workout |
| ⑦ 잡 | job | 저장 함수가 enqueue_user_exercise_stats_refresh_job 로 dirty range 를 남김 → pg_cron lift-guild-stats-refresh (매분) → run_user_exercise_stats_refresh_cron → process_user_exercise_stats_refresh_jobs (또는 Edge stats-process-refresh-jobs) → user_exercise_session_rollups·user_exercise_stats·user_calendar_day_summaries·user_training_period_stats·PR 상태 | stats |
| ⑧ 다시 화면 | rpc → ui | get_home_dashboard·get_calendar_day_summary·get_pr_overview 가 ⑦ 의 투영을 읽어 홈·달력·PR 화면에 표시 | home · calendar · pr |
이 길에서 한 계층이라도 담당 없이 빠지면 그 계층의 문제는 아무도 고치지 않는다. 장부는 ①~⑧ 각각에 계획 ID·소유자·계약·검사·판정·증거를 붙인다. 위 추적으로 확인한 것: 여덟 계층 모두 §3 에 행이 있고 담당이 있다(연결 누락 0).
1-2. 영역과 계층
- 영역(area) 은 기능 16개(운동·계획·홈·달력·PR·볼륨·카탈로그·프로필·소셜·그룹·온보딩·인증·인입·관리자·통계·기기 대기열)와 공유 runtime 8개(앱 셸·공통 UI 기반·네이티브·서비스 워커·빌드/CI·DB 플랫폼·검증 기반·문서)다. 기능 16개와 공유 8개는 필수 영역 이며 R01/R05 종료 검사 대상이다. 독립 저장소로 이전한 홍보 랜딩은 앱 장부에 별도 영역으로 유지하지 않는다.
- 계층(layer) 은 진입점·라우트·화면·바인딩·컨트롤러·서비스·저장소·타입·API 핸들러·RPC/테이블·잡·SQL·CSS·네이티브·설정·스크립트·정책·테스트·문서·자원 20개다. 파일이 없는 계층(예: 기능 영역의
rpc)은 서버 객체 이름으로 행을 채운다. - 분류는 디렉터리·파일 이름 규칙 이다(첫 일치가 이김). 같은 디렉터리의 새 파일은 자동 분류되고, 새 디렉터리·새 진입점은 미분류로 드러난다. 세밀함보다 유지 가능성을 택했다 — 함수 단위 장부는 만들지 않는다(이슈 지시).
1-3. 판정의 뜻 — 파일이 연결됐다는 것은 품질이 확인됐다는 뜻이 아니다
| 판정 | 뜻 | 누가 쓰나 |
|---|---|---|
| 유지 근거 | 지금 구조를 그대로 두며, 그 이유가 증거 칸에 있다 | G05(초기) · 구현 담당 |
| 개선 진행 | 계획 ID 가 이 계층을 바꾼다. 아직 끝나지 않았다 | G05(초기) · 구현 담당 |
| 검증 완료 | 구현이 main 에 합쳐졌고 증거(PR·SHA·검사 결과)가 증거 칸에 있다 — 증거 없이는 쓸 수 없다(도구가 거부) | 구현 담당만 |
| 해당 없음 | 이 영역·계층 조합은 v0.18.0 범위 밖이다 | G05 |
| 미확인 | 담당은 있으나 현 상태를 확인하지 못했다 | 누구나 — R01/R05 에서 0 이어야 한다 |
| 미배정 | 담당이 없다 | 누구나 — R01/R05 에서 0 이어야 한다 |
2026-09-07 초기 장부는 G05 가 유지 근거 / 개선 진행 / 해당 없음 만 적었다. "검증 완료" 는 각 계획 ID 담당이 랜딩 뒤 증거와 함께 바꾼다. 필수 영역에 미확인·미배정은 0 이다(도구 출력 "결과: 통과").
D10 구현 증거 — 2026-09-10, v0.18.0 release 반영
통계 영역의 정기 유지 작업은 #1418에서 원본 행 cursor·watermark, catalog pending token, 날짜 due 인덱스로 이식했다. 소유 원천은 앱의 supabase/definitions/stats/{functions,tables}/stats_maintenance_*·scan_stats_maintenance_v1이며 기존 backfill/rollover 이름은 cron/RPC 호환 문이다. D08 lease·D11 publisher 사본을 만들지 않았다.
검증은 pgTAP 51단언, 실제 연결 7회귀, 실제 cron 1회귀와 발견/처리 비용 계측으로 연결한다. 최종 precheck 6분31초·전체 pgTAP 142파일/2,804단언과 Merge Check를 통과해 앱 PR #1521이 release b62a358c에 반영됐다. 재개·실패·old/new scheduler 퇴역 계약이 D11/R04/R05 입력이다. 3,650세션 전체 계산의60초 제한 실패를 기록했고 통계 영역 전체를 검증 완료로 올리지 않으며 staging·Production 반영과 구분한다. 아래 생성 절은 기존 기준 스냅샷을 유지한다.
2. 도구 — 무엇을 잡고 언제 돌리나
| 검사 | 잡는 것 | 실패 조건 |
|---|---|---|
| 분류 | git ls-files 전부를 규칙·제외에 붙인다 | 미분류 파일 ≥ 1 |
| 진입점 대조 | 파일 목록·schema.sql 에서 HTML·부팅·SW·API 핸들러(api/**, _ 접두 제외)·Edge 함수·워크플로·pg_cron 잡을 실측 해 등록 목록과 비교 | 등록 안 된 진입점 또는 사라진 등록 ≥ 1 |
| 장부 감사 | 파일이 있는 (영역, 계층) 에 장부 행이 있는지, 필수 영역에 행이 있는지 | 행 없는 계층 ≥ 1 |
| 문서 동기화 | §3 생성 절이 규칙 파일과 같은지 | 다르면 실패 (--render 로 고침) |
--strict | 위에 더해 필수 영역의 미확인·미배정 | ≥ 1 이면 실패 — R01/R05 종료 검사 |
언제 돌리나:
- 새 경로·새 진입점을 만든 PR — 담당 세션이 PR 전에 한 번 돌려 규칙 한 줄(또는 진입점 등록)을 같은 PR 에 넣는다.
npm run check에는 넣지 않았다(이슈가 정한 대로 종료 검사 도구이며, 다른 트랙의 PR 을 분류 한 줄로 막지 않는다). - 스테이징 통합 점검(운영 정본 §4-3) — 랜딩 담당자가 결과를 확인할 때 돌려 새 미분류·미등록이 쌓이지 않게 한다. HQ가 켜져 있거나 옛
landing:active라벨이 있어야 하는 작업이 아니다. - R01/R05 종료 검사 —
--strict. 필수 영역의 미확인·미배정 0, 미분류 0, 미등록 진입점 0 이어야 종료한다. G05 는 여기까지의 목록·도구 를 완료로 보고, 앱 전체의 품질 검증 완료는 R05/R06 이 판정한다.
R01 현재 분류·소유 경계 (2026-09-11)
앱 기준 0043560d 이후 R01 분류 변경에서 기존 strict 도구를 실행했다. 분류2,880파일·근거 있는 제외41·미분류0·미등록/유령 진입점0·누락 행0·미배정/미확인0이다. 원래 분류됐던 파일의 영역/계층 변경은0이며 새로 넘겨진 경로만 분류했다. 중복/이관 후 미사용 규칙147개를 정리했고 살아 있는 코드의 품질 판정을 일괄 완료로 바꾸지 않았다. 아래 현재 표와 퇴역·호환·63개 PR/시험 대조가 R01 인계 기준이다. 뒤의 생성 절·2026-09-07 실행 목록은 당시 스냅샷이다.
| 영역·담당 | 현재 파일 수 | 계획·검증 근거 | 현재 소비 경로 예시 |
|---|---|---|---|
| 운동 기록(진행 중·완료·수정·삭제) / APP(A02 구현, A01 최종 wiring) | 379 | A02 PR1354, A09 PR1394, A12 PR1378, S03 PR1363, U02 PR1523, U03 PR1520, D14 PR1551 | src/react/contracts/mobileWorkoutEditor.ts · src/react/contracts/mobileWorkoutFlow.ts |
| 계획(계획 세션 편집·계획→완료 전이) / APP(A02 구현, A01 최종 wiring) | 66 | A02 PR1354, A13 PR1375, U02 PR1523, U03 PR1520 | src/react/controllers/planAdoptionController.ts · src/react/controllers/planAdoptionStore.ts |
| 홈 대시보드·출석·연간 활동 / APP | 39 | A10 PR1501 | src/react/contracts/attendancePolicy.ts · src/react/contracts/gamificationPolicy.ts |
| 달력·하루 상세·기록표 / APP | 78 | A10 PR1501, D06 PR1518, U04 PR1553 | src/react/controllers/calendarReadModelController.ts · src/react/controllers/calendarReadModelStore.ts |
| PR·1RM·수동 기록 지표·근력 기준 / APP | 142 | A10 PR1501, A14 PR1503, D07 PR1522 | src/react/controllers/prController.ts · src/react/controllers/prDashboardLoadPolicy.ts |
| 볼륨·리포트 / APP | 44 | A10 PR1501, D06 PR1518 | src/react/controllers/useReportDesignData.ts · src/react/features/volume/DesktopVolumeBinding.tsx |
| 종목 카탈로그·검색·커스텀 종목·별칭 / APP(A03 구현, A01 최종 wiring) | 116 | A03 PR1351, A14 PR1503 | src/react/contracts/exerciseIdentity.ts · src/react/controllers/customExerciseController.ts |
| 프로필·신체 데이터 / APP(A03 구현, A01 최종 wiring) | 40 | A03 PR1351, A11 PR1516 | src/react/contracts/profile/profileBodyValidation.ts · src/react/contracts/profile/trainingStyles.ts |
| 소셜(피드·팔로우·친구 범위·댓글·좋아요·신고·차단) / APP(A04 구현, A01 최종 wiring) | 98 | A04 PR1448, A11 PR1516 | src/react/features/social/MobileFeedBinding.tsx · src/react/features/social/MobileFriendScopeBinding.tsx |
| 그룹·그룹 보드·라운지 / APP(A04 구현, A01 최종 wiring) | 85 | A04 PR1448, A11 PR1516 | src/react/features/group/MobileGroupBinding.tsx · src/react/features/group/MobileNotificationShellBinding.tsx |
| 온보딩·동의 / APP | 26 | A03 PR1351, A11 PR1516, U02 PR1523, U03 PR1520 | src/react/features/onboarding/onboardingBinding.ts · src/react/features/onboarding/onboardingBodyValidation.ts |
| 인증·계정 연결·계정 삭제·약관 / APP | 85 | B01 PR1346, A07 PR1365 | src/react/LegalDocumentOverlay.tsx · src/react/controllers/authBootstrapPolicy.ts |
| 인입(Wodup·Motra·InBody) / APP(A05 구현, A01 최종 wiring) | 112 | I01 PR1498, D09 PR1445, A05 PR1443 | src/react/contracts/ports/importDto.ts · src/react/features/import/importContract.ts |
| 관리자(카탈로그·매핑·인입 대리·운영·신고) / APP(A05 구현, A01 최종 wiring) | 41 | B01 PR1346, A05 PR1443 | src/react/ImpersonationOverlay.tsx · src/react/contracts/ports/adminDto.ts |
| 통계 계산·refresh 잡·정책 / APP(A06 구현, A01 최종 wiring) | 232 | D01 PR1319, D04 PR1454, D05 PR1506, D06 PR1518, D07 PR1522, D08 PR1510, D10 PR1521, D11 PR1547 | src/react/controllers/statsRecoveryController.ts · src/react/controllers/statsRecoveryCoordinator.ts |
| 기기 대기열·초안·사본·복원 / DURABLE(queue 담당) | 182 | S01 PR1320, S02 PR1349, S04 PR1369, S05 PR1374, S06 PR1385, S07 PR1377, S08 PR1350, S09 PR1502, S10 PR1442, S11 PR1499 | src/react/contracts/recovery/descriptor.ts · src/react/contracts/recovery/restoreCommand.ts |
| 앱 셸(부팅·route/overlay·owner·연결·스냅샷·오류·토스트·공용 RPC 전송) / APP / PLATFORM | 277 | A01 PR1316, A06 PR1453, A07 PR1365, A08 PR1372, A15 PR1550, A16 PR1561 | src/react/app.tsx · src/react/app/authSessionRuntime.ts |
| 공통 UI 기반(token·primitive·공용 스타일·아이콘·자원·디자인 전달 계약) / UI | 174 | U01 PR1317, U04 PR1553, U05 PR1565, U06 예정, U07 PR1549 | src/react/barbelicCopy.ts · src/react/contracts/designContract.ts |
| 네이티브(iOS·Android·Capacitor·bridge) / PLATFORM | 65 | N01 PR1441, B02 PR1356 | src/react/contracts/nativeBridge.ts · src/react/vite/nativeSplash.ts |
| 서비스 워커·오프라인·구 청크 복구 / PLATFORM | 7 | N01 PR1441 | src/react/vite/offlineServiceWorker.ts · src/react/vite/staleChunkRecovery.ts |
| 환경·빌드·의존성·배포·CI·게이트 / B02 계약·담당자 검증 → Actions 자동 통합 슬롯(운영 정본 §3·§4-1) | 109 | B02 PR1356, G04 PR1315 | src/react/services/appResourceContract.ts |
| DB 플랫폼(schema·migration·랜딩·권한·원본 보호) / HQ(랜딩) | 380 | D03 PR1312, D12 PR1358, D13 PR1318 | src/react/services/deploymentManifest.ts · src/react/types/supabase.ts |
| 검증 기반(테스트 감사·harness·error-case 지원) / HQ(감사자) | 99 | G02 PR1310, R02 예정, R03 예정, R04 예정, R05 예정, R06 예정 | |
| 문서 사이트·프로세스·총괄·이 장부 / HQ | 4 | G01 PR1296, G05 PR1307, R01 PR1569 |
현재 진입점은 실제 파일과 schema.sql에서 대조했다.
- html:
index.html - boot:
src/react/vite/main.tsx - serviceWorker:
public/sw.js - api:
api/account/delete.js,api/admin/deployment-manifest.ts,api/admin/impersonate.js,api/admin/users.js,api/auth/test-admin/session.js - edgeFunctions:
stats-process-refresh-jobs,wodup-process-import-jobs,wodup-start-import - workflows:
daily-data-backup.yml,deploy-steps.yml,policy-contract.yml,prod-smoke.yml,production-deploy.yml,release-merge-request.yml,social-login-daily-check.yml,staging-deploy.yml - cronJobs:
barbelic-client-error-purge,barbelic-exercise-catalog-changes-prune,barbelic-exercise-usage-stats-refresh,barbelic-stats-backfill-scan,barbelic-stats-cron-history-purge,barbelic-stats-projection-compute,barbelic-stats-projection-publish,barbelic-wodup-failed-staging-purge,barbelic-wodup-import-scheduler,lift-guild-pr-overview-snapshot-rollover,lift-guild-stats-refresh
추가한 barbelic-stats-cron-history-purge는 이미 적용된 예약 작업의 등록 누락 보완이다. 실행 주기·함수·DB 권한은 변경하지 않았다. durable types/binding·본인 export·복구 UI/CSS와 I01/A16 타입의 소유/검증 행도 실제 이식 PR에 연결했다.
3. 과거 장부 스냅샷 (2026-09-09 생성 절)
<!-- coverage-ledger:generated:begin --> 생성: node scripts/architecture/check-coverage-inventory.mjs --render · 규칙 파일 scripts/architecture/coverage-inventory.json (갱신 2026-09-09) · 추적 파일 3059개 = 분류 2670 + 근거 있는 제외 360 + 미분류 29
영역 요약
| 영역 | 종류 | 필수 | 소유 역할 | 계획 ID | 파일 수 | 판정 분포 |
|---|---|---|---|---|---|---|
| 운동 기록(진행 중·완료·수정·삭제) | feature | 예 | APP | A02, A09, A12, S03, U02, U03 | 384 | 개선 진행 11 · 유지 근거 3 |
| 계획(계획 세션 편집·계획→완료 전이) | feature | 예 | APP | A02, A13, U02, U03 | 72 | 개선 진행 10 · 유지 근거 1 |
| 홈 대시보드·출석·연간 활동 | feature | 예 | APP | A10 | 32 | 개선 진행 7 · 유지 근거 2 |
| 달력·하루 상세·기록표 | feature | 예 | APP | A10, D06, U04 | 66 | 개선 진행 9 · 유지 근거 2 |
| PR·1RM·수동 기록 지표·근력 기준 | feature | 예 | APP | A10, A14, D07 | 123 | 개선 진행 7 · 유지 근거 3 |
| 볼륨·리포트 | feature | 예 | APP | A10, D06 | 35 | 개선 진행 6 · 유지 근거 2 |
| 종목 카탈로그·검색·커스텀 종목·별칭 | feature | 예 | APP | A03, A14 | 126 | 개선 진행 10 · 유지 근거 3 |
| 프로필·신체 데이터 | feature | 예 | APP | A03, A11 | 27 | 개선 진행 9 · 유지 근거 2 |
| 소셜(피드·팔로우·친구 범위·댓글·좋아요·신고·차단) | feature | 예 | APP | A04, A11 | 86 | 개선 진행 8 · 유지 근거 2 |
| 그룹·그룹 보드·라운지 | feature | 예 | APP | A04, A11 | 85 | 개선 진행 8 · 유지 근거 2 |
| 온보딩·동의 | feature | 예 | APP | A03, A11, U02, U03 | 29 | 개선 진행 6 · 유지 근거 2 |
| 인증·계정 연결·계정 삭제·약관 | feature | 예 | PLATFORM | B01, A07 | 114 | 개선 진행 10 · 유지 근거 3 |
| 인입(Wodup·Motra·InBody) | feature | 예 | PLATFORM | I01, D09, A05 | 95 | 개선 진행 9 · 유지 근거 4 |
| 관리자(카탈로그·매핑·인입 대리·운영·신고) | feature | 예 | PLATFORM | B01, A05 | 70 | 개선 진행 13 · 유지 근거 2 |
| 통계 계산·refresh 잡·정책 | feature | 예 | DATA | D01, D04, D05, D06, D07, D08, D10, D11 | 173 | 개선 진행 6 · 유지 근거 4 |
| 기기 대기열·초안·사본·복원 | feature | 예 | DURABLE | S01, S02, S04, S05, S06, S07, S08, S09, S10, S11 | 139 | 개선 진행 5 · 유지 근거 2 |
| 앱 셸(부팅·route/overlay·owner·연결·스냅샷·오류·토스트·공용 RPC 전송) | shared | 예 | APP | A01, A06, A07, A08, A15, A16 | 234 | 개선 진행 12 · 유지 근거 2 |
| 공통 UI 기반(token·primitive·공용 스타일·아이콘·자원·디자인 전달 계약) | shared | 예 | UI | U01, U04, U05, U06, U07 | 146 | 개선 진행 4 · 유지 근거 4 |
| 네이티브(iOS·Android·Capacitor·bridge) | shared | 예 | PLATFORM | N01, B02 | 71 | 개선 진행 4 · 유지 근거 2 |
| 서비스 워커·오프라인·구 청크 복구 | shared | 예 | PLATFORM | N01 | 6 | 개선 진행 1 · 유지 근거 2 |
| 환경·빌드·의존성·배포·CI·게이트 | shared | 예 | PLATFORM | B02, G04 | 98 | 개선 진행 1 · 유지 근거 3 |
| DB 플랫폼(schema·migration·랜딩·권한·원본 보호) | shared | 예 | DATA | D03, D12, D13 | 344 | 유지 근거 4 · 개선 진행 3 |
| 검증 기반(테스트 감사·harness·error-case 지원) | shared | 예 | HQ | G02, R02, R03, R04, R05, R06 | 82 | 유지 근거 3 · 개선 진행 1 |
| 문서 사이트·프로세스·총괄·이 장부 | shared | 예 | HQ | G01, G05, R01 | 33 | 유지 근거 4 |
영역별 장부
<a id="workout"></a>
운동 기록(진행 중·완료·수정·삭제) (workout)
라이브 운동 → 완료 저장 → 상세·수정·삭제까지. 쓰기 계약은 docs/contracts/completed-workout-write-pipeline.md, 서버 한 문 save_session_v5/delete_session_v5.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP(A15 최종, 그 전 A01/A07) | 모바일 겹침 층 workout·session, 데스크톱 탭 search(세션 검색) — mobileApp.tsx·desktopApp.tsx | docs/contracts/workout-screen-props.md · session-screen-props.md | tests/react/navigationStore.test.mjs · workoutFlowDraftSafety | 개선 진행 | — |
| 화면(표현) | 25 | U02, U03, A12 | UI(표현) / APP(props·callback 배선) | ui/mobile/screens/Workout*·SessionScreen, ui/desktop/screens/DesktopSearchScreen·DesktopSetProjectionParts, 공용 의미론 ui/shared/setSemantics·compositeSemantics·workoutCalculations | docs/contracts/workout-screen-props.md · session-screen-props.md | tests/react/workoutFlow*·workoutRecord*·compositeSemantics·presentationAtomicMeasurements | 개선 진행 | — |
| 기능 바인딩(features) | 29 | A12, A15 | APP | features/active-workout/*(진입 정책·명령·WorkoutFlowBinding) · features/completed-workout/*(완료 기록 명령·편집 브리지) · features/workout/editor/*(플랫폼 공통 headless editor, A12) · features/workout/queries/*(완료 상세 화면 사본 선택자 — 친구 세션 읽기 전용 판정, A09 #1342) | docs/contracts/completed-workout-write-pipeline.md · docs/contracts/workout-editor.md | tests/react/activeWorkoutCommands·activeWorkoutEntryPolicy·completedWorkoutCommands·completedWorkoutCutover·workoutEditor | 개선 진행 | — |
| 컨트롤러·스토어 | 4 | A02, A12, S03 | APP | workoutWriteController·sessionController·sessionDetailController/Store | docs/contracts/completed-workout-write-pipeline.md · completed-session-write-source.md | tests/react/workoutWriteCommands·sessionDetailStore·completedSessionWriteSource | 개선 진행 | — |
| 서비스·도메인·매퍼 | 19 | A02, S03 | APP | domains/workoutDomain·completedWorkoutWriteContract·sessionWriteContractV5·directWorkoutWrite·sessionModel·compositeExerciseModel·mobileWorkoutViewMappers·setPurposePolicy·kgDisplay | docs/data/session-data-model.md · docs/data/limits-registry.md · rpe-performed-intensity.md | tests/react/sessionWriteContractV5·directWorkoutWrite·completedWorkoutWritePipelineContract·limitsRegistry | 개선 진행 | — |
| 저장소·RPC 어댑터 | 1 | A01, A02 | APP(A02 구현, A01 최종 wiring) | src/react/services/domains/repositories/workoutRepository.ts(완료 기록 create/update/delete·상세 조회·직접 입력 4종) + domains/codecs/{completedWorkoutWriteCodec,workoutReceiptCodec,sessionDetailCodec,manualRecordWriteCodec}.ts → domains/repositoryPorts.ts → workoutDomain | docs/architecture/rpc-transport-domain-extraction.md §3·§4 | tests/react/workoutRepositoryDestination.test.mjs(가짜 transport 독립 실행 10건) · sessionDetailCodec.test.mjs(상세→편집→v5→영수증 왕복 4건) · contracts/fixtures/{sessionDetail,workoutPorts}.fixture.ts · domainRepositoryDestinations · domainPortWiring | 개선 진행 | A02(이슈 #1329): 쓰기·영수증·상세 codec 실제 이전, 공개 이름은 재수출. 남은 것 = 재수출 제거(A01/R01)·codec 기존 any 제거(A16)·통계 재계산 관측 이식(A06) |
| 타입·DTO·계약 코드 | 4 | G03, A02 | HQ(G03 타입 경계) | types/workout·writeContracts·recording·recordingRequirement | docs/contracts/v0-18-0-adr.md §3-2 | tests/react/recordingRequirement·controllerBoundaries | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A02, D02, S06 | DATA(객체) / HQ(랜딩) | save_session_v5·delete_session_v5·retry_save_session_v5·get_session_detail·get_session_search · 테이블 session·session_exercise·session_exercise_part·exercise_set·exercise_set_part·workout_mutation_receipts·daily_conditions | docs/data/rpc-catalog.md §2 · docs/contracts/user-fact-immutability.md | supabase/tests/database/session_write_contract_v5·workout_receipt_children_v1·session_hierarchy_·user_fact_ | 개선 진행 | — |
| SQL 원천·스키마 | 55 | D02, S10 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/workout/** — 함수 46·표 7·뷰 1 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 2 | U01, U07 | UI | ui/mobile/styles/screens/workout.css·session.css | src/react/ui/DELIVERY-CONTRACT.md | tests/react/mobileCssBoundaries·deadCssGate | 개선 진행 | — |
| 스크립트·도구 | 1 | G04 | HQ | scripts/audit-limit-headroom.mjs(상한선 여유 감사) | docs/data/limits-registry.md | tests/react/limitsRegistry | 유지 근거 | 상한선 감사 도구는 계약을 읽기만 한다 — 바꿀 계획 없음 |
| 정책 파일(버전 고정) | 11 | A12, A13 | APP | features/editing/*(운동·계획 편집기 공유 policy — 숫자 입력 셀·무게 단위·분:초·세트 타입 순서·필수 입력 판정; A13 이 만들고 A12 와 공동 소유) | docs/contracts/plan-editor-model.md §2 | tests/react/planEditorModel | 개선 진행 | — |
| 테스트·검증 사례 | 223 | G02, R01 | HQ(감사자) | tests/react 운동 쓰기·라이브·복합·수정 검사, pgTAP 세션 계약, e2e crudRoundtrip·emptyAccountJourney·cardio, error-cases 22건 | tests/audit/manifest.json | npm run check:test-manifest · check:error-cases | 유지 근거 | 행동 검사로 유지; 소스 모양 의존 검사는 G02/R01 이 정리 |
| 문서·계약문 | 10 | G03 | HQ | session-hierarchy.md · session-data-model.md · limits-registry.md · rpe-performed-intensity.md · completed-* 계약 · workout/session 화면 props | — | docs 빌드 | 유지 근거 | 현행 계약문; G03 이 좁은 port 계약을 추가할 때 그 자리에서 개정 |
<a id="plan"></a>
계획(계획 세션 편집·계획→완료 전이) (plan)
계획은 session 테이블의 status = planned 행이다. 같은 save_session_v5 로 저장한다.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP | 데스크톱 계획 편집기(DesktopPlanEditor)·모바일 하루 상세의 계획 카드(달력 영역과 공유) | docs/contracts/day-summary-props.md | tests/react/planRoundTripHarness | 개선 진행 | — |
| 화면(표현) | 4 | U03, A13 | UI / APP | DesktopPlanEditor*(카드·픽커·모델) | docs/contracts/desktop-screens-props.md | tests/react/desktopPlanEditorMinSecDuration·compositePlanWorkoutEntry | 개선 진행 | — |
| 기능 바인딩(features) | 17 | A13 | APP | features/plan/editor/*(계획 편집 모델 — 상태·명령·validation·view model·저장 intent, A13) · features/plan/commands/*(S03 준비) · features/workout-plan/*(계획 명령·편집 브리지) · features/plan/queries/*(계획 카드+캐시된 상세 합치기 선택자, A09 #1342) | docs/contracts/plan-editor-model.md · docs/contracts/save-preparation.md §5 · docs/data/rpc-catalog.md §2 (save_session_v5 planned) | tests/react/planEditorModel · planPrepare · workoutPlanCommands | 개선 진행 | — |
| 컨트롤러·스토어 | 2 | A13 | APP | planAdoptionController/Store(계획 반영은 폐기됐고 친구 계획 열람 데이터층만 남음) | docs/data/rpc-catalog.md (adopt_planned_session_v1 폐기) | tests/react/planAdoptionStore | 개선 진행 | R01 에서 폐기 잔재 제거 여부 판정 |
| 서비스·도메인·매퍼 | 3 | A02 | APP | planAdoptionProjection | — | tests/react/planAdoptionProjection | 개선 진행 | — |
| 저장소·RPC 어댑터 | 1 | A01, A02 | APP(A02 구현, A01 최종 wiring) | src/react/services/domains/repositories/planRepository.ts(계획 저장·삭제·상세 조회) + domains/codecs/{planWriteCodec,planDetailCodec}.ts → domains/repositoryPorts.ts → workoutDomain | docs/architecture/rpc-transport-domain-extraction.md §3·§4 | tests/react/planRepositoryDestination.test.mjs(가짜 transport 독립 실행 8건) · planRoundTripHarness · domainRepositoryDestinations · domainPortWiring | 개선 진행 | A02(이슈 #1329): 계획 쓰기·상세 codec 실제 이전, 새 계획 서버 id 발급·1회 재시도(주입, S05 인계) 현행 유지. 남은 것 = 재수출 제거(A01/R01)·codec 기존 any 제거(A16) |
| RPC·테이블(서버 객체) | 0 | A02, D02 | DATA / HQ | save_session_v5(status planned)·delete_session_v5·get_planned_session_detail · 테이블 session(planned)·뷰 planned_session_v1 | docs/data/rpc-catalog.md §1·§2 | supabase/tests/database/planned_sets_*·session_hierarchy_guards_and_plans_v1 | 개선 진행 | — |
| SQL 원천·스키마 | 14 | D02 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/plan/** — 함수 13·표 0·뷰 1 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/desktop/styles/screens/plan-editor.css | src/react/ui/DELIVERY-CONTRACT.md | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 29 | G02 | HQ(감사자) | tests/react plan*·planned* , pgTAP planned_sets_*, error-cases 계획 전이 3건 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 1 | A13 | APP | docs/contracts/plan-editor-model.md(계획 편집 모델·adapter·플랫폼 동치 fixture·옮긴/남긴 함수·인계, 이슈 #1340) | — | docs 빌드 · tests/react/planEditorModel·planEditorPlatformParity·desktopPlanEditorAdapter | 개선 진행 | A13 이 계획 편집 규칙을 화면 밖 한 벌로 옮긴 계약. U02/U03 화면 이식·A09 dispatcher 합류 때 §9·§12 를 갱신한다 |
<a id="home"></a>
홈 대시보드·출석·연간 활동 (home)
get_home_dashboard·get_home_year_activity 를 읽는 홈 탭. 하루 상세는 달력 영역과 공유한다.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A10, A15 | APP | 모바일 탭 home·데스크톱 탭 home | docs/data/app-screen-rpc-contract.md | tests/react/homeBootLoadingOrder·initialLoadPath | 개선 진행 | — |
| 화면(표현) | 2 | U02, U03 | UI | HomeScreen·DesktopHomeScreen | src/react/ui/DELIVERY-CONTRACT.md | tests/react/mobileGamificationDesignWiring | 개선 진행 | — |
| 컨트롤러·스토어 | 1 | A10 | APP | homeDayDetailCoordinator | — | tests/react/homeDayDetailCoordinator·homeFragmentCoordination | 개선 진행 | — |
| 서비스·도메인·매퍼 | 2 | A10, A08 | APP | mobileHomeViewMappers·homeYearActivityCache | docs/data/app-screen-rpc-contract.md | tests/react/tabDataWarming·prHomeRankHydration | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A06, D06 | DATA / HQ | get_home_dashboard·get_home_year_activity · 테이블 user_calendar_day_summaries·user_training_period_stats | docs/data/rpc-catalog.md §1 | test/appScreenRpcContract · pgTAP home_plan_card_source_ref | 개선 진행 | — |
| SQL 원천·스키마 | 9 | D06 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/home/** — 함수 9·표 0·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/home.css | — | npm run check:dead-css | 개선 진행 | — |
| 정책 파일(버전 고정) | 2 | A10 | 제품 정책(오너) — 코드 소유 APP | contracts/attendancePolicy·gamificationPolicy | docs/product/gamification-policy.md · ADR §2 보존 정책 | tests/react/attendancePolicy·gamificationPolicy · pgTAP attendance_policy_v1 | 유지 근거 | 제품 정책은 이번 릴리스에서 바꾸지 않는다(ADR §2) |
| 테스트·검증 사례 | 15 | G02 | HQ(감사자) | tests/react home*·attendance·gamification·tabDataWarming, pgTAP 2, error-case CASE-004 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
<a id="calendar"></a>
달력·하루 상세·기록표 (calendar)
월·일·범위 요약 RPC 와 데스크톱 기록표(log table)·즐겨찾기 그룹. 읽기 모델 구조는 docs/architecture/calendar-read-model-architecture.md.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A10, A15 | APP | 모바일 탭 calendar + 층 daySummary, 데스크톱 탭 session·calendar·logtable·favgroups | docs/contracts/day-summary-props.md · logtable-props.md | tests/react/navigationStore | 개선 진행 | — |
| 화면(표현) | 11 | U02, U03, U04 | UI | DaySummaryScreen·CalendarCore·DaySheet·DayDetailBody·GrassCal, DesktopSession*·DesktopLogTableScreen·DesktopFavGroupsScreen·rangeView | docs/contracts/day-summary-props.md · logtable-props.md | tests/react/dayDetailPendingSkeleton·daySummarySetPurposeBoundary | 개선 진행 | — |
| 기능 바인딩(features) | 1 | A10 | APP | features/calendar/useCalendarJournalSelection | — | tests/react/calendarViewSelector | 개선 진행 | — |
| 컨트롤러·스토어 | 4 | A10, A08 | APP | calendarReadModelController/Store·logTableController/Store | docs/architecture/calendar-read-model-architecture.md | tests/react/calendarReadModelStore·calendarPendingMutationOverlay·logTableStore·logTableMonthCache | 개선 진행 | — |
| 서비스·도메인·매퍼 | 4 | A10 | APP | calendarReadModelMapper·calendarViewSelector·mobileDayViewMappers·desktopFavoriteGroups | docs/architecture/calendar-read-model-architecture.md | tests/react/calendarReadModelMapper·calendarExactSummaryProjection·desktopFavoriteGroups | 개선 진행 | — |
| 타입·DTO·계약 코드 | 1 | G03 | HQ | types/calendarReadModel | ADR §3-5 | tests/react/calendarReadModelMapper | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A06, D06 | DATA / HQ | get_calendar_month_summary·get_calendar_day_summary·get_calendar_range_summary·get_log_table_month·get_log_table_cell_detail·get_user_exercise_favorites·replace_user_exercise_favorites·set_user_exercise_favorite · 테이블 user_calendar_day_summaries·user_calendar_summary_dirty_dates·user_exercise_favorites·user_exercise_favorite_states | docs/data/rpc-catalog.md §1 · app-screen-rpc-contract.md | pgTAP calendar_top_sets_effective_load · test/appScreenRpcContract | 개선 진행 | — |
| SQL 원천·스키마 | 25 | D06 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/calendar/** — 함수 21·표 4·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 2 | U01, U07 | UI | ui/mobile/styles/screens/day-summary.css·ui/desktop/styles/screens/session.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 15 | G02 | HQ(감사자) | tests/react calendar*·logTable*·dayDetail*, pgTAP calendar_top_sets_effective_load | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 3 | A10 | APP | calendar-read-model-architecture.md · day-summary-props.md · logtable-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="pr"></a>
PR·1RM·수동 기록 지표·근력 기준 (pr)
PR 개요·종목 상세·기록 목록·수동 PR/기록 지표·근력 등급(strength standards).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A10, A15 | APP | 모바일 탭 pr + 층 prDetail, 데스크톱 탭 pr | docs/contracts/records-props.md | tests/react/prSelectedExerciseSplit | 개선 진행 | — |
| 화면(표현) | 12 | U02, U03, U04 | UI | PrTools·RecordsDetail·PrcTierBadge, DesktopPr*·prDetail·DkGrass·clientStrengthFallback | docs/contracts/records-props.md · record-metric.md | tests/react/recordsDetail*·desktopPrDetailEstimatedChart·mobilePrcTierBadgeRelocation | 개선 진행 | — |
| 컨트롤러·스토어 | 3 | A10, A14 | APP | prController·prDashboardLoadPolicy·prExerciseDeferredArchive | — | tests/react/prExerciseFragments·catalogAndPrHotPath | 개선 진행 | — |
| 서비스·도메인·매퍼 | 8 | A10, A14, A06 | APP | prExerciseRpcAdapters·prExerciseCursorContract·prBenchmarkSets·prFavoritesCache/State·strengthStandards·mobileRecordsViewMappers·recordMetric | docs/contracts/record-metric.md · docs/data/measured-pr-state-events.md | tests/react/recordMetric*·strengthStandards·measuredPrFrontendContract · test/pr* | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A06, D07 | DATA / HQ | get_pr_overview·get_exercise_pr_detail(_year)·get_exercise_pr_records·get_exercise_pr_history·save_manual_pr·delete_manual_pr·save/delete_manual_record_metric_v1·get_user_manual_records_v1 · 테이블 user_exercise_pr_events/states·user_exercise_records·user_manual_pr_records·user_manual_record_metrics·user_pr_*·exercise_strength_standards·strength_profession_standards | docs/data/rpc-catalog.md §1·§2 · measured-pr-state-events.md | pgTAP record_metric_*·manual_record_metrics_v1·strength_standard_cutlines_v1 · test/prRecordsContractV5SqlContract | 개선 진행 | — |
| SQL 원천·스키마 | 50 | D07 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/pr/** — 함수 39·표 11·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 2 | U01, U07 | UI | ui/mobile/styles/screens/records.css·ui/desktop/styles/screens/pr.css | — | npm run check:dead-css | 개선 진행 | — |
| 스크립트·도구 | 8 | D07 | DATA | scripts/strength-standards/*·generate-strength-*(근력 기준 참조 데이터 생성기) | supabase/contracts/reference-data-tables.json | tests/react/strengthLevelFullCatalog | 유지 근거 | 참조 데이터 생성기 — 바꿀 계획 없음; 재생성 시 D07 이 결과를 검토 |
| 테스트·검증 사례 | 37 | G02 | HQ(감사자) | tests/react pr*·record*·strength*, test/pr*·measuredPr*, pgTAP 3, error-cases CASE-005·006 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 3 | D07 | DATA | measured-pr-state-events.md · record-metric.md · records-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="volume"></a>
볼륨·리포트 (volume)
get_volume_overview 기반 리포트(기간 버킷·연간·부위 분포·세트 스코어 밴드).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A10, A15 | APP | 모바일 탭 volume/report, 데스크톱 탭 volume | docs/contracts/report-props.md | tests/react/reportScreenImportBoundary | 개선 진행 | — |
| 화면(표현) | 4 | U02, U03 | UI | ReportScreen·DesktopVolumeScreen(Parts)·grassModel | docs/contracts/report-props.md | tests/react/mobileReportHeadings·mobileAnnualReportRendering·desktopVolumeExactStats | 개선 진행 | — |
| 서비스·도메인·매퍼 | 2 | A10, A06 | APP | mobileReportViewMappers·volumeLevel | docs/contracts/report-props.md | tests/react/setScoreReportBands·reportLoadHistogram | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A06, D06 | DATA / HQ | get_volume_overview(v4·v2 오버로드 병존) · 테이블 user_training_period_stats·user_exercise_period_stats | docs/data/rpc-catalog.md §1 | pgTAP volume_overview_internalization·volume_level_policy_v1·report_taxonomy_target_muscles | 개선 진행 | 구버전 v2 오버로드 제거는 R01 |
| SQL 원천·스키마 | 14 | D06 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/volume/** — 함수 7·표 2·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 2 | U01, U07 | UI | ui/mobile/styles/screens/report.css·ui/desktop/styles/screens/volume.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 12 | G02 | HQ(감사자) | tests/react report*·volume*, pgTAP 3, error-case CASE-008 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 1 | A10 | APP | report-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="catalog"></a>
종목 카탈로그·검색·커스텀 종목·별칭 (catalog)
카탈로그 기기 사본(IndexedDB)과 증분 동기화, 검색 규칙(docs/contracts/exercise-search.md), 종목 정체성(exercise-ref.md).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP | 모바일 SetSearch(종목 선택 시트)·데스크톱 픽커 | docs/contracts/setsearch-props.md | tests/react/exerciseSearchListWindow | 개선 진행 | — |
| 화면(표현) | 1 | U02 | UI | SetSearch | docs/contracts/setsearch-props.md · exercise-search.md | tests/react/exerciseSearchSynonyms·aliasSearchRule1140 | 개선 진행 | — |
| 기능 바인딩(features) | 1 | A09, A14 | APP | features/catalog/queries/*(홈 힌트 대비 동기화 필요 판정·순번 선택자, A09 #1342) ← controllers/screenLoadPolicyController.ts(유휴 시 카탈로그 동기화 효과). 카탈로그 자체는 resources/exerciseCatalogResource.ts(owner 범위 store)에 든다 | docs/architecture/owner-scoped-resource-cache.md §9 · docs/contracts/v0-18-0-domain-contracts.md §16 | tests/react/a09VerticalIntegration · exerciseCatalogResource · exerciseCatalogStore(정책 앵커) | 개선 진행 | — |
| 컨트롤러·스토어 | 3 | A03 | APP | customExerciseController/Store·searchController | docs/contracts/exercise-search.md | tests/react/customExerciseArchiveUi·ownedCustomExerciseArchive·exerciseSearchRanking | 개선 진행 | — |
| 서비스·도메인·매퍼 | 8 | A03, A14 | APP | domains/catalogDomain·exerciseCatalogStore(IndexedDB 사본)·exerciseIdentity·exerciseRefAdapter·exerciseSearch(Signals)·exerciseSynonymSearch·mobileSetSearchViewMappers | docs/contracts/exercise-ref.md · exercise-search.md · docs/data/brid.md | tests/react/exerciseCatalogStore·exerciseRefInventory·exerciseIdentityHardCutover·runtimeExerciseIdentity | 개선 진행 | — |
| 저장소·RPC 어댑터 | 2 | A01, A03 | APP(A03 구현, A01 최종 wiring) | src/react/services/domains/repositories/catalogRepository.ts(서버 호출 23: 조회 2·커스텀 3·관리자 카탈로그 5·표기 5·별칭/세부 6·외부 매핑 2) + domains/catalogCodec.ts(순수 검증·변환·응답 해석) → domains/repositoryPorts.ts → catalogDomain | docs/architecture/rpc-transport-domain-extraction.md §3 · docs/contracts/v0-18-0-domain-contracts.md §16 · contracts/ports/catalogDto.ts | tests/react/domainRepositoryDestinations.test.mjs(행동 검사 8) · domainPortWiring.test.mjs(factory import 허용 목록·codec 순수성) | 개선 진행 | A03 #1330(2026-09-07): 옛 barbelicRepository 의 catalog 본문 0, CatalogQueryPort·CatalogWritePort 결과 타입 고정. 남은 것=검색 신호(A06)·관리자 표기 RPC 2개의 types/supabase 인자 map 등재(G03) |
| 타입·DTO·계약 코드 | 2 | G03 | HQ | types/exerciseIdentity·contracts/exerciseIdentity | docs/contracts/exercise-ref.md | tests/react/desktopExerciseIdentity | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A03, D12 | DATA / HQ | get_exercise_catalog·get_exercise_catalog_changes·get_exercise_search_signals_v1·create_custom_exercise·set_own_custom_exercise_active · 테이블 exercises·exercise_synonyms·exercise_archetypes·exercise_catalog_changes·exercise_usage_stats·exercise_business_role_memberships·exercise_external_mappings · cron barbelic-exercise-catalog-changes-prune·barbelic-exercise-usage-stats-refresh | docs/data/rpc-catalog.md §1·§2 · exercise-naming.md | pgTAP exercise_catalog_sync_v1·exercise_search_ranking_v1·exercise_ref_v1·exercise_registration_identity_v2 | 개선 진행 | — |
| SQL 원천·스키마 | 42 | D12 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/catalog/** — 함수 34·표 7·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/set-search.css | — | npm run check:dead-css | 개선 진행 | — |
| 정책 파일(버전 고정) | 10 | A03 | 제품 정책 — 코드 소유 APP | docs/policies/exercise-model/**(버전 고정) | docs/policies/README.md | npm run check:policies · check:policy-snapshots | 유지 근거 | 버전 고정 정책 파일; 변경은 정책 절차 |
| 테스트·검증 사례 | 50 | G02 | HQ(감사자) | tests/react exercise*·catalog*, pgTAP exercise_·catalog_, error-cases CASE-001·037·038 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 6 | A03 | APP | exercise-ref.md · exercise-search.md · setsearch-props.md · brid.md · exercise-identity-hard-cutover.md · exercise-naming.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="profile"></a>
프로필·신체 데이터 (profile)
프로필 워크스페이스·아이디(@handle)·성별·신체 지표 저장.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP | 모바일 탭 profile + 층 menu, 데스크톱 탭 profile | docs/contracts/profile-screen-props.md | tests/react/profilePropsStability | 개선 진행 | — |
| 화면(표현) | 2 | U02, U03 | UI | ProfileScreen·DesktopProfileScreen | docs/contracts/profile-screen-props.md | tests/react/profilePropsStability·profileSex | 개선 진행 | — |
| 컨트롤러·스토어 | 1 | A03, A11 | APP | profileController | — | tests/react/profileSex | 개선 진행 | — |
| 서비스·도메인·매퍼 | 0 | A03, A07 | APP | domains/authProfileDomain(로그인 세션 확인 뒤 factory 호출)·services/currentInputContract(허용 키·달력 날짜·null/누락/0 공통 검사기, 인입·운동 기록 쓰기와 공유) | docs/contracts/v0-18-0-domain-contracts.md §16 | tests/react/domainRepositoryDestinations · providerNeutralOnboardingContract · leanModelHardCut | 개선 진행 | A03 #1330: 검증 로직은 codec·중립 검사기 한 곳, 도메인 서비스는 정책(세션)만 |
| 저장소·RPC 어댑터 | 3 | A01, A03 | APP(A03 구현, A01 최종 wiring) | src/react/services/domains/repositories/profileRepository.ts(현재 프로필·workspace·온보딩 조회/완료·신체 지표·이름·사진·InBody 접점 8) + domains/profileCodec.ts(순수 검증·변환·해석) + domains/profileAvatarSigning.ts(서명 URL 좁은 helper, 소셜·그룹·통계 port 공유) → domains/repositoryPorts.ts → authProfileDomain | docs/architecture/rpc-transport-domain-extraction.md §3 · docs/contracts/v0-18-0-domain-contracts.md §16 · contracts/ports/profileDto.ts | tests/react/domainRepositoryDestinations.test.mjs(행동 검사 7: 다른 owner 거부·null/누락/0 구분·실제 달력 날짜·업로드 롤백·서명·InBody 해시·조회 실패 전파) · domainPortWiring.test.mjs | 개선 진행 | A03 #1330(2026-09-07): 옛 barbelicRepository 의 profile/onboarding 본문 0, ProfilePort 4·OnboardingPort 2 결과 타입 고정. 남은 것=아이디·성별 3개(A04)·camelCase 전환(A09/A12/A13) |
| 타입·DTO·계약 코드 | 0 | G03, A03 | HQ(G03 타입 경계) / APP(A03 DTO) | contracts/ports/profileDto(ProfileRecord·SignedProfileRecord·ProfileWorkspaceRecord·OnboardingStateDto)·types/writeContracts(SaveProfileBodyMetricInput) | docs/contracts/v0-18-0-domain-contracts.md §7·§16·§18 | tests/react/contracts(ports.fixture 컴파일)·domainRepositoryDestinations | 개선 진행 | A03 #1330: 온보딩 상태만 Dto 브랜드, 프로필 행은 서버 컬럼 이름 그대로의 열린 레코드(camelCase 전환은 A09) |
| RPC·테이블(서버 객체) | 0 | A03, B01 | DATA / HQ | get_profile_workspace·save_profile_body_metric·set_profile_handle_v1·set_profile_sex_v1·check_profile_handle_v1·update_profile_display_name·ensure_user_profile · 테이블 profiles·body_metrics | docs/data/rpc-catalog.md §2 | pgTAP profile_handle_v1·profile_sex_v1 | 개선 진행 | — |
| SQL 원천·스키마 | 12 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/profile/** — 함수 9·표 2·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/profile.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 7 | G02 | HQ(감사자) | tests/react profile*, pgTAP profile_* | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 1 | A03 | APP | profile-screen-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="social"></a>
소셜(피드·팔로우·친구 범위·댓글·좋아요·신고·차단) (social)
프로필 피드·팔로우·친구 데이터 열람(docs/contracts/friend-access.md)·UGC 안전(신고·차단·정지).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP | 모바일 탭 feed + 층 friendSession·friendScope | docs/contracts/feed-props.md · friend-access.md | tests/react/feedSessionOverlay·friendScope | 개선 진행 | — |
| 화면(표현) | 4 | U02 | UI | FeedScreen·FeedPost·FeedModeration·FriendScopeBar | docs/contracts/feed-props.md | tests/react/feedReactions·feedPullRefresh·feedCompositeMains | 개선 진행 | — |
| 컨트롤러·스토어 | 8 | A04, A11 | APP | feedSocialController/Store·followingController/Store·friendScopeController/Store·moderationController/Store | docs/contracts/friend-access.md | tests/react/feedSocialStore·followingStore·friendScopeStore·moderationStore | 개선 진행 | — |
| 서비스·도메인·매퍼 | 2 | A04 | APP | domains/socialDomain·mobileFeedViewMappers | docs/contracts/feed-props.md | tests/react/followingFeed | 개선 진행 | — |
| 저장소·RPC 어댑터 | 1 | A01, A04 | APP(A04 구현, A01 최종 wiring) | src/react/services/domains/repositories/socialRepository.ts → domains/repositoryPorts.ts → 해당 domain 서비스 | docs/architecture/rpc-transport-domain-extraction.md | tests/react/domainRepositoryDestinations.test.mjs · domainPortWiring.test.mjs | 개선 진행 | A01 대표 실제 구현 추출·좁은 의존 port 연결. 나머지 구현/codec은 후속 담당 범위 |
| RPC·테이블(서버 객체) | 0 | A04, B01 | DATA / HQ | get_profile_feed·get_following_*_v1·search_user_profiles_v1·follow/unfollow_user_v1·list_following_v1·block/unblock_user_v1·list_blocked_users_v1·report_content_v1·get_my_moderation_state_v1·set_session_like_v1·add/delete/list_session_comment(s)_v1 · 테이블 user_follows·user_blocks·session_likes·session_comments·content_reports·content_takedowns·user_suspensions·moderation_banned_terms | docs/contracts/friend-access.md · docs/data/rpc-catalog.md | pgTAP feed_·following_·ugc_safety_v1·profile_feed_note_entries | 개선 진행 | — |
| SQL 원천·스키마 | 39 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/social/** — 함수 26·표 8·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/feed.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 29 | G02 | HQ(감사자) | tests/react feed*·following*·friend*·moderation*, pgTAP feed_·following_·ugc_safety, error-case CASE-018 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 2 | A04 | APP | friend-access.md · feed-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="group"></a>
그룹·그룹 보드·라운지 (group)
그룹 생성·초대·보드(계획 공유)·공지·채팅·완료 계보.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15 | APP | 모바일 탭 group(보드·라운지·작성기) | docs/contracts/group-props.md | tests/react/groupScreens | 개선 진행 | — |
| 화면(표현) | 3 | U02 | UI | GroupScreen·GroupComposer·groupBoardPrefill | docs/contracts/group-props.md | tests/react/groupBoardPercentPrefill·groupBoardDateNav | 개선 진행 | — |
| 컨트롤러·스토어 | 3 | A04, A11 | APP | groupController/Store | docs/contracts/group-props.md | tests/react/groupInteractionsStore·groupBoard*Roundtrip | 개선 진행 | — |
| 서비스·도메인·매퍼 | 1 | A04 | APP | domains/groupDomain | — | tests/react/groupBoardCustomRegister·groupTextSafety | 개선 진행 | — |
| 저장소·RPC 어댑터 | 1 | A01, A04 | APP(A04 구현, A01 최종 wiring) | src/react/services/domains/repositories/groupRepository.ts → domains/repositoryPorts.ts → 해당 domain 서비스 | docs/architecture/rpc-transport-domain-extraction.md | tests/react/domainRepositoryDestinations.test.mjs · domainPortWiring.test.mjs | 개선 진행 | A01 대표 실제 구현 추출·좁은 의존 port 연결. 나머지 구현/codec은 후속 담당 범위 |
| RPC·테이블(서버 객체) | 0 | A04, B01 | DATA / HQ | create_group_v1·invite_to_group_v1·respond_group_invite_v1·list_my_groups_v1·get_group_board_v1·get_group_board_day_sessions_v1·get_group_lounge_v1·get_group_member_session_v1·add/delete_group_board_comment_v1·set_group_board_like_v1·add_group_notice_v1·add/delete_group_chat_message_v1·save_session_v5(group_id) · 테이블 groups·group_members·group_invites·group_notices·group_chat_messages | docs/contracts/group-props.md · rpc-catalog.md | pgTAP groups_v1·groups_v2_interactions·group_ownership_v1·group_ugc_safety_v1·group_board_completion_lineage | 개선 진행 | — |
| SQL 원천·스키마 | 36 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/group/** — 함수 26·표 5·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/group.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 39 | G02 | HQ(감사자) | tests/react group*, pgTAP group*, error-cases 그룹 보드 6건 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 1 | A04 | APP | group-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="onboarding"></a>
온보딩·동의 (onboarding)
get_onboarding_state·complete_onboarding·동의 요건. 중단하면 처음부터(오너 결정 2026-08-20).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A15, A07 | APP | 셸 게이트(온보딩 미완료 → 온보딩 화면) — sharedShell.tsx·ShellGates | docs/contracts/onboarding-props.md · shell-frames.md | tests/react/desktopOnboarding·profileProvisioning | 개선 진행 | — |
| 화면(표현) | 2 | U02, U03 | UI | OnboardingScreen·DesktopOnboarding | docs/contracts/onboarding-props.md | tests/react/desktopOnboarding | 개선 진행 | — |
| 기능 바인딩(features) | 3 | A03, A11 | APP | features/onboarding/*(명령·프로필 계약·신체 검증) | docs/data/onboarding-data-model.md | tests/react/onboardingCommands·onboardingBodyValidation | 개선 진행 | — |
| RPC·테이블(서버 객체) | 0 | A03, B01 | DATA / HQ | get_onboarding_state·complete_onboarding·withdraw_user_consent · 테이블 profiles·user_consents | docs/data/onboarding-data-model.md · rpc-catalog.md §2 | pgTAP onboarding_profile_contract·barbelic_legal_v4 | 개선 진행 | — |
| SQL 원천·스키마 | 12 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/onboarding/** — 함수 11·표 1·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/onboarding.css | — | npm run check:dead-css | 개선 진행 | — |
| 테스트·검증 사례 | 9 | G02 | HQ(감사자) | tests/react onboarding*·desktopOnboarding·profileProvisioning, pgTAP onboarding_profile_contract, error-case CASE-009 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 2 | A03 | APP | onboarding-data-model.md · onboarding-props.md | — | docs 빌드 | 유지 근거 | 현행 계약문 |
<a id="auth"></a>
인증·계정 연결·계정 삭제·약관 (auth)
소셜 로그인(Apple·Google·Kakao)·네이티브 인증 교환·계정 삭제(Vercel API)·법적 문서 불변 게이트.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A07, A15 | APP | 셸 인증 게이트·OAuth 콜백 경로·층 legal | docs/contracts/shell-frames.md · docs/platform/social-auth.md | tests/react/authDegradedBootstrap·authOAuthCallbackPolicy | 개선 진행 | A07 #1335: 부팅 순서(기기 흔적 → 로컬 채택 → 오류 전송 owner 바인딩)는 app/authSessionRuntime.ts |
| 화면(표현) | 4 | U02, U03 | UI | LegalDocumentOverlay·legalDocuments·AccountDeleteFlow·accountDeletionCopy | docs/contracts/shell-frames.md | tests/react/legalDocumentContent·uiCopy | 개선 진행 | — |
| 컨트롤러·스토어 | 4 | A07 | APP | app/authSessionRuntime(부팅·복원·이벤트 구독·재시도, 이슈 #1335)·authBootstrapPolicy·authSessionRevision(owner runtime 위 변환 어댑터)·authResumePolicy·socialIdentityController | docs/architecture/owner-auth-connectivity-lifecycle.md · docs/platform/social-auth.md | tests/react/authSessionRuntime·authSessionFailurePolicy·authPkceHardCut·authConnectivityCoordination·authDegradedBootstrap·authResume.test·authResume.browser · tests/auth/* | 개선 진행 | A07 #1335: 인증 runtime 을 controller 밖으로(app/authSessionRuntime.ts), 세 사건(만료·로그아웃·삭제) reason, 5xx≠인증 실패 행동 검사 |
| 서비스·도메인·매퍼 | 19 | A07, B01 | APP / PLATFORM | supabaseAuth·auth/providers/{apple,google,kakao}·socialAuthFlow·socialIdentityLinking·nativeAuthSessionPolicy·authSignOutPolicy·accountDeletionClient·auth/{authErrors,nativeAuthTransactions,accountDeletionResult,impersonationSession}·domains/authProfileDomain·legalDocumentContent | docs/contracts/auth-account-api.md · docs/platform/social-auth.md · social-login-rollout-runbook.md | tests/auth/socialOAuthProviders·socialIdentityLinking·androidNativeAuthContract·iosNativeAuthContract·nativeAuthTransactions·nativeAuthCallbackBridge·authErrors·accountDeletionResult·impersonationSession | 개선 진행 | — |
| 타입·DTO·계약 코드 | 1 | G03 | HQ | types/auth | ADR §3-2 | tests/react/controllerBoundaries | 개선 진행 | — |
| 서버 API 핸들러(Vercel) | 5 | B01 | PLATFORM | api/auth/_shared.js(공용 경계: 본문·응답·호출자 검증·시간 제한·로그, 이슈 #1331)·api/account/delete.js(+_apple.js·_kakao.js 공급자 연결 해제)·api/auth/test-admin/session.js(e2e 전용, Production ref 차단) | docs/contracts/auth-account-api.md · app-role-privileges.md · error-cases/CASE-017 | tests/auth/serverApiShared·accountDeleteApi·testAdminSessionApi·accountDeletionProviderDisconnect · tests/react/localAuthAdminE2eSafety | 개선 진행 | B01 계약·테스트 완료(#1331); 실 provider 호출은 R02·R05 |
| RPC·테이블(서버 객체) | 0 | B01 | DATA / HQ | complete_native_social_login·complete_native_social_identity_link·is_lift_guild_admin·auth.users 삭제 cascade · 테이블 lift_guild_admins | docs/contracts/app-role-privileges.md · identity-passing.md | pgTAP auth_user_delete_cascade·account_deletion_residue_scan·app_role_privilege_rules_v1 | 개선 진행 | — |
| SQL 원천·스키마 | 4 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/auth/** — 함수 2·표 1·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/mobile/styles/screens/legal-doc.css | — | npm run check:dead-css | 개선 진행 | — |
| 스크립트·도구 | 3 | B01 | PLATFORM | check-legal-document-immutability·check-social-provider-config·generate-apple-client-secret | docs/platform/social-auth.md | npm run check:legal-documents | 유지 근거 | 게이트·운영 도구; 바꿀 계획 없음 |
| 테스트·검증 사례 | 54 | G02 | HQ(감사자) | tests/auth 6, tests/react auth*, pgTAP auth_user_delete_cascade·account_deletion_residue_scan, error-cases CASE-003·007·012·013·017 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 7 | B01 | PLATFORM | contracts/auth-account-api.md(이슈 #1331 정본) · social-auth.md · social-login-rollout-runbook.md | — | docs 빌드 | 개선 진행 | B01 계약 문서 추가(#1331) |
| 정적 자원 | 12 | B01 | PLATFORM(법적 문서는 오너 승인) | public/legal/*(약관·개인정보 v1~v4, 불변)·public/account/delete.html·icons/barbelic-kakao-icon.png | npm run check:legal-documents(불변 게이트) | scripts/check-legal-document-immutability.mjs | 유지 근거 | 발행된 법적 문서는 불변; 새 버전만 추가 |
<a id="import"></a>
인입(Wodup·Motra·InBody) (import)
Wodup JSONL(비동기 잡·Edge 워커)·Motra xlsx·InBody. 정본 docs/data/import-pipeline.md·wodup-import-async-jobs.md.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 라우트·탭·겹침 층 | 0 | A11, B01 | APP / PLATFORM | 관리자 셸 인입 탭(DesktopAdminImport·DesktopAdminMotraImport, 관리자 영역)과 프로필의 InBody 인입 | docs/data/import-pipeline.md | tests/react/adminImportOnBehalf | 개선 진행 | — |
| 기능 바인딩(features) | 1 | I01 | PLATFORM | features/wodup/wodupImportRunner | docs/data/wodup-import-async-jobs.md | tests/react/wodupImportRunner | 개선 진행 | — |
| 컨트롤러·스토어 | 2 | I01, A05 | PLATFORM | wodupImportController·motraImportController | docs/data/import-pipeline.md | tests/react/wodupImportController·motraImportController·wodupImportPollCadence | 개선 진행 | — |
| 서비스·도메인·매퍼 | 7 | I01, A05 | PLATFORM | domains/importDomain·domains/codecs/wodupImportCodec·domains/codecs/motraImportCodec·wodupJsonlUpload·motraXlsxBlocks·motraNormalizedUpload·inbodyImport | docs/data/import-pipeline.md · docs/policies/wodup-replay | tests/react/wodupJsonlUpload·motraXlsxBlocks·inbodyImport·readImportContractHardCut·importRepositoryDestinations | 개선 진행 | A05 #1406(2026-09-09): 옛 services/wodupImportBatchAdapter.ts 는 domains/codecs/wodupImportCodec.ts 로 이동(사본 0). 파서(wodupJsonlUpload·motraNormalizedUpload·inbodyImport)는 I01 소유로 그대로 |
| 저장소·RPC 어댑터 | 1 | A01, A05 | APP(A05 구현, A01 최종 wiring) | src/react/services/domains/repositories/importRepository.ts(Wodup 업로드·시작·조회 + Motra 기입 4) + domains/codecs/wodupImportCodec.ts(배치 행·엣지 시작 응답 decoder·잡 단계 변환표)·motraImportCodec.ts → importDomain → lazyFeatureDomain → barbelicApi(ImportPort, 결과 contracts/ports/importDto.ts) | docs/architecture/rpc-transport-domain-extraction.md | tests/react/importRepositoryDestinations.test.mjs(행동 검사 14: pending/running/부분 성공/failed/succeeded·불량 응답·전송 오류·다른 owner·재조회 identity·Motra 동기 완료) · domainRepositoryDestinations · domainPortWiring | 개선 진행 | A05 #1406(2026-09-09): 옛 barbelicRepository 의 Wodup/Motra 본문 0, A01 의 옛 Repository 타입 참조 0, ImportPort 결과 unknown 5→0(잡 DTO: phase 가 완료를 말한다·Motra 는 동기 완료). 남은 것=파서·identity 재설계(I01), durable 잡 소비자(D09), 진행 상태 resource 구독(A11) |
| 타입·DTO·계약 코드 | 2 | G03 | HQ | types/import(서버 행 모양) · contracts/ports/importDto(A05 잡·시작·Motra 결과 DTO) | ADR §3-2 | tests/react/readImportContractHardCut | 개선 진행 | A05 #1406(2026-09-09): ImportPort 결과 타입 고정(importDto). 행 모양 types/import 는 G03 유지 |
| RPC·테이블(서버 객체) | 0 | D09, I01 | DATA / HQ | enqueue_wodup_import_batch·stage_wodup_import_batch·import_wodup_batch_to_canonical·mark_wodup_import_batch_{uploaded,failed}_v1·import_motra_workouts_v1·import_inbody_body_metrics · 테이블 wodup_import_batches/rows/sessions/sets/exercises·wodup_exercises·wodup_session_timing_materializations·inbody_import_batches·external_exercise_interpretations(_components) · cron barbelic-wodup-failed-staging-purge | docs/data/wodup-import-async-jobs.md · import-pipeline.md | pgTAP wodup_import_*·wodup_barbelic_coexistence·motra_import_v1·import_readonly_brid_issuance | 개선 진행 | — |
| Edge 함수·cron 잡 | 4 | D09, I01 | DATA(잡) / PLATFORM(Edge 배포) | Edge wodup-start-import(업로드 확정 → 워커 호출)·wodup-process-import-jobs(_shared/wodup-import-worker·wodup-normalizer) | docs/data/wodup-import-async-jobs.md | tests/react/wodupStartImportFunction·wodupNormalizer·wodupComplexImportWorker·wodupImportWorkerProgress | 개선 진행 | — |
| SQL 원천·스키마 | 33 | D09, I01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/import/** — 함수 23·표 10·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스크립트·도구 | 4 | I01 | PLATFORM | scripts/motra-import/*(Motra xlsx 변환 도구·매핑) | scripts/motra-import/README.md | tests/react/motraXlsxBlocks | 유지 근거 | 운영 도구; I01 이 parser 경계를 바꿀 때 함께 검토 |
| 정책 파일(버전 고정) | 6 | I01 | PLATFORM | docs/policies/wodup-replay/** | docs/policies/README.md | npm run check:policies | 유지 근거 | 버전 고정 정책 파일 |
| 테스트·검증 사례 | 36 | G02 | HQ(감사자) | tests/react wodup*·motra*·inbody, test/wodup*, pgTAP wodup_·motra_ | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 2 | I01 | PLATFORM | import-pipeline.md · wodup-import-async-jobs.md | — | docs 빌드 | 유지 근거 | 현행 정본 |
<a id="admin"></a>
관리자(카탈로그·매핑·인입 대리·운영·신고) (admin)
독립 셸 /admin/(barbelic-docs 가 main 푸시마다 배포). 공개 게이트는 운영 정본 §4-5.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 진입점(HTML·부팅·SW 등록) | 5 | B01, B02 | PLATFORM | admin/index.html → vite/admin/main.tsx·AdminStandaloneRoot·adminShellView·adminCatalogStore | docs/process/deployment-pipeline.md 관리자 셸 절 · 운영 정본 §4-5 | tests/react/adminStandaloneShell·adminRoute | 개선 진행 | — |
| 라우트·탭·겹침 층 | 1 | B01 | PLATFORM | desktopAdminTabs(관리자 탭 9) | — | tests/react/adminRoute | 개선 진행 | — |
| 화면(표현) | 14 | U03 | UI | DesktopAdmin*(12)·AdminSidebar·ImpersonationOverlay | docs/contracts/desktop-screens-props.md | tests/react/adminAllExercisesOrder·adminCustomExercisesPage·adminExerciseSynonymPanel | 개선 진행 | — |
| 기능 바인딩(features) | 1 | A05 | APP | features/admin/DesktopAdminFeature | — | tests/react/adminUiWriteContract | 개선 진행 | — |
| 컨트롤러·스토어 | 2 | A05 | APP | adminController·adminMappingPageController | docs/data/admin-health-report.md | tests/react/adminMappingPageController·adminHealthReport | 개선 진행 | — |
| 서비스·도메인·매퍼 | 8 | A05, B01 | APP / PLATFORM | domains/adminComposition(앱 그래프 밖)·adminImpersonationClient/Guard(일반 앱, B01) — 본인 데이터 내보내기는 domains/adminDomain(일반 앱, 내보내기만 남음). 관리자 브라우저 화면·카탈로그 어댑터는 v0.17.7(#1463)부터 Barbelic-docs/admin | docs/contracts/identity-passing.md(임퍼서네이션) | tests/react/adminImpersonationGuard·adminMappingPageService·adminSynonymRepository·adminAtomicCatalogOperations | 개선 진행 | A05 #1406(2026-09-09): 관리자 함수를 일반 파사드에서 제거, 본인 내보내기는 좁은 port(userDataExportRepositoryPort)로. v0.17.7 분리(#1463)와 합쳐 관리자 파사드는 앱에 두지 않음(2026-09-10 main 반영). 임퍼서네이션 client/guard 는 B01 소유 그대로 |
| 저장소·RPC 어댑터 | 2 | A01, A05 | APP(A05 구현, A01 최종 wiring) | src/react/services/domains/repositories/adminRepository.ts(신고 3·유저 검색·운영 점검표+엣지 배포 확인) + domains/codecs/adminModerationCodec.ts, 조립 domains/adminComposition.ts(앱 진입점 그래프 밖; 소비자 e2e CASE-018·Barbelic-docs/admin) — port 계약 contracts/ports/adminPorts.ts·adminDto.ts | docs/architecture/rpc-transport-domain-extraction.md | tests/react/adminRepositoryDestinations.test.mjs(행동 검사 7: 신고 큐 decode·42501 전파·불량 응답 거부·조치/정지 입력·검색 상한·점검표 표본) · adminBundleBoundary.test.mjs(앱 진입점 모듈 그래프에 관리자 모듈 0) · domainPortWiring | 개선 진행 | A05 #1406(2026-09-09): 옛 저장소의 관리자 본문 0, 일반 파사드(barbelicApi)의 관리자 함수 0, 앱 빌드 청크에 관리자 RPC 이름 0(빌드 grep + 모듈 그래프 검사). v0.17.7(#1463) 이후 관리자 브라우저 화면·카탈로그 매핑 읽기는 Barbelic-docs/admin 소유(앱에 관리자 진입점·파사드 없음). 남은 것=Barbelic-docs/admin 이 앱의 adminRepository 를 소비하도록 연결 |
| 타입·DTO·계약 코드 | 3 | G03 | HQ | types/admin(점검표 모양) · contracts/ports/adminDto·adminPorts(A05 관리자 port 3종·본인 내보내기 port) | ADR §3-2 | tests/react/adminUiWriteContract | 개선 진행 | A05 #1406(2026-09-09): AdminPort(신고·운영·유저 검색)·UserDataExportPort 신설 — 앱 쪽 구현은 adminRepository(조립 adminComposition), 관리자 화면 파사드는 Barbelic-docs/admin 몫 |
| 서버 API 핸들러(Vercel) | 3 | B01 | PLATFORM | api/admin/users.js·api/admin/impersonate.js(+_shared.js 관리자 전용 — 공용 경계는 api/auth/_shared.js) | docs/contracts/auth-account-api.md §2-3 · identity-passing.md · app-role-privileges.md | tests/auth/adminApi·impersonationSession · tests/react/adminImpersonationGuard | 개선 진행 | B01 계약·테스트 완료(#1331); 다른 쓰기 경계의 열람 세션 판정은 A05 |
| RPC·테이블(서버 객체) | 0 | B01, A05 | DATA / HQ | 운영 정본 §4-5 의 관리자 함수 15개(admin_*·mark_wodup_import_batch_*_v1)·get_admin_mapping_page·get_admin_operations_checklist·get_admin_content_reports_v1·admin_search_users_v1 · 테이블 lift_guild_admins | 운영 정본 §4-5(관리자 게이트) · admin-health-report.md | pgTAP admin_synonym_editor·admin_wodup_import_on_behalf | 개선 진행 | — |
| SQL 원천·스키마 | 12 | B01 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/admin/** — 함수 12·표 0·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스타일 | 1 | U01, U07 | UI | ui/desktop/styles/desktop-admin.css | — | npm run check:dead-css | 개선 진행 | — |
| 설정·빌드·CI | 1 | B02 | PLATFORM | vite.admin.config.mjs(산출물 dist-admin, docs 사이트가 /admin/ 로 배포) | docs/process/deployment-pipeline.md | npm run build:admin | 개선 진행 | — |
| 테스트·검증 사례 | 23 | G02 | HQ(감사자) | tests/react admin* 17·synonymWriteReference, pgTAP admin_* | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 1 | B01 | PLATFORM | admin-health-report.md | — | docs 빌드 | 유지 근거 | 현행 문서 |
<a id="stats"></a>
통계 계산·refresh 잡·정책 (stats)
세션 rollup → 기간·PR·근력 투영. dirty range 잡·pg_cron·Edge 워커. 정책(e1rm·max-reps·set-purpose)은 버전 고정 파일.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 컨트롤러·스토어 | 2 | D11, A10 | DATA / APP | statsRecoveryController·statsRecoveryCoordinator(통계 반영 대기·복구 UX) | docs/data/stats-refresh-jobs.md | tests/react/statsRecoveryCoordinator | 개선 진행 | — |
| 서비스·도메인·매퍼 | 2 | A06, D11 | APP / DATA | domains/statsDomain·statsReconciliation | docs/data/stats-refresh-dirty-events.md | tests/react/statsReconciliation·statsCentralizationPhase* | 개선 진행 | — |
| 저장소·RPC 어댑터 | 1 | A01, A06 | APP(A06 구현, A01 최종 wiring) | src/react/services/domains/repositories/statsRepository.ts → domains/repositoryPorts.ts → 해당 domain 서비스 | docs/architecture/rpc-transport-domain-extraction.md | tests/react/domainRepositoryDestinations.test.mjs · domainPortWiring.test.mjs | 개선 진행 | A01 대표 실제 구현 추출·좁은 의존 port 연결. 나머지 구현/codec은 후속 담당 범위 |
| RPC·테이블(서버 객체) | 0 | D01, D04, D05, D06, D07, D08, D10, D11 | DATA(객체) / HQ(랜딩) | enqueue/process_user_exercise_stats_refresh_jobs·run_user_exercise_stats_refresh_cron·run_user_exercise_stats_backfill_scan_cron·run_user_pr_overview_snapshot_rollover·refresh_exercise_usage_stats_v1 · 테이블 user_exercise_stats(_refresh_jobs)·user_exercise_session_rollups·user_exercise_strength_*·user_exercise_max_rep_observations·user_exercise_set_score_states·user_stats_refresh_state·stats_refresh_event_types·*_policy_versions·strength_estimation_* · cron lift-guild-stats-refresh·barbelic-stats-backfill-scan·lift-guild-pr-overview-snapshot-rollover | docs/data/stats-refresh-jobs.md · stats-refresh-dirty-events.md · ADR §3-4 | pgTAP stats_refresh_·set_score_·e1rm_*·max_rep_estimation_policy_v1·effective_load_stats_v1 · test/userExerciseStatsIntegrity | 개선 진행 | — |
| Edge 함수·cron 잡 | 1 | D08, D11 | DATA | Edge stats-process-refresh-jobs(잡 처리 워커) + pg_cron 3 | docs/data/stats-refresh-jobs.md | tests/react/statsRefreshJobs·statsRefreshStatementTimeoutContract | 개선 진행 | — |
| SQL 원천·스키마 | 76 | D01, D04, D05, D08, D10, D11 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/stats/** — 함수 46·표 16·뷰 1 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스크립트·도구 | 3 | D07 | DATA | check-policies·check-policy-snapshot-immutability·generate-universal-rep-curve | docs/policies/README.md | npm run check:policies | 유지 근거 | 정책 게이트·생성기 |
| 정책 파일(버전 고정) | 19 | D07 | 제품 정책 — 코드 소유 DATA | docs/policies/{e1rm,max-reps,set-purpose}/**(버전 고정) | docs/policies/README.md · ADR §2 | npm run check:policies · check:policy-snapshots · test/e1rmPolicy | 유지 근거 | 수치 정책은 이번 릴리스에서 바꾸지 않는다(ADR §2) |
| 테스트·검증 사례 | 64 | G02, D01 | HQ(감사자) / DATA(동치 검증) | tests/react stats*·setScore*, test/e1rm*·maxRep*·strength*, pgTAP stats_refresh_·set_score_·e1rm_·volume_ | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | D01 이 동치 검증 계약을 추가한다 |
| 문서·계약문 | 5 | D01 | DATA | stats-refresh-jobs.md · stats-refresh-dirty-events.md · docs/policies/README.md | — | docs 빌드 | 유지 근거 | 현행 정본; D01 이 DAG 계약을 추가 |
<a id="durable"></a>
기기 대기열·초안·사본·복원 (durable)
IndexedDB 대기열(pending saves)·초안 체크포인트·기기 사본(own data replica)·플러시.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 컨트롤러·스토어 | 6 | S04, S05, S08 | DURABLE(queue 담당) | pendingWorkoutSavesController/Store·workoutDraftController/Store·ownDataReplicationController | docs/data/workout-draft-protection.md · ADR §3-1 | tests/react/pendingWorkoutOutboxStates·pendingQueueHeadPoison·workoutDraftStore·ownDataReplicationJob·outboxClaimSuccessor(스토어 포트 배선·의도 행 변환·카드) | 개선 진행 | S04(#1334, 2026-09-08): pendingWorkoutSavesStore 가 prepareSuccessor 포트로 결과 미상 생성 기록의 수정·삭제 의도 행을 준비된 행으로 바꾼 뒤 생성 행을 지운다 — outboxClaimSuccessor 8/8(docs/contracts/outbox-claim-successor.md §5) |
| 서비스·도메인·매퍼 | 35 | S01, S02, S07, S10, S11 | DURABLE | pendingWorkoutSaves·pendingWorkoutMutationFlush·workoutLocalCacheDb·workoutDraftCache/Checkpoint/StorageMarker·ownDataReplica·ownDataReplicationJob·durableMutationIdentity·legacyClientKeyspace | ADR §3-1(outbox 원자 전이·claim·fence) · §3-3(충돌 사본) | tests/react/pendingWorkoutSaves·pendingWorkoutMutationFlush·workoutLocalCacheMigration·workoutDraftCheckpoint·ownDataReplica·outboxAtomicReplace·outboxReplacePlan·outboxAtomicity.browser(실제 Chromium)·idbAdapter·outboxRowIndex·mirrorPlan·outboxTimeout.browser·outboxMirrorRecovery.browser·outboxCost.browser·idbVersionPin.browser(S07)·outboxClaimPlan·outboxClaimSuccessor·outboxClaim.browser(실제 Chromium 두 탭)·e2e CASE-039/040(실제 v0.17.1 번들 탭 공존) | 개선 진행 | S02(#1325, 2026-09-07): 교체·합치기가 IDB 트랜잭션 하나 — 메모리 실패 주입 6/6·실제 Chromium 8 시나리오 8/8(docs/contracts/outbox-atomic-replace.md §5) · S04(#1334, 2026-09-08): 행 단위 claim·fence·ACK 비교 후 교체·후속 행·의도 행 — 순수 계획기 5/5·메모리 두 탭 8/8·실제 Chromium 두 탭 4/4·CASE-040 3/3(옛 v0.17.1 탭 전송 중 + 새 탭 후속)·CASE-039 v0.17.1 재실측 통과(docs/contracts/outbox-claim-successor.md §7) · S07(#1337, 2026-09-08): owner/target 메모리 카탈로그·키 스캔 재검사·미러 v2(행별 키·tombstone·세대)·IDB 공통 adapter — 1000행 드레인 152.8초 → 6.1초, 실제 Chromium 복구 매트릭스 7/7·timeout 3/3(docs/contracts/outbox-storage-index-mirror.md §5·§6) |
| RPC·테이블(서버 객체) | 0 | S08, S06 | DATA / HQ | save/get/clear_workout_draft_checkpoint_v1(v2 호환 래퍼)·*_workout_draft_checkpoint_v2·retire_workout_draft_checkpoint_operation_v1·clear_empty_workout_draft·clear_saved_workout_draft · 테이블 workout_draft_checkpoints·workout_draft_checkpoint_fences(순번·은퇴 펜스, 이슈 #1326)·workout_mutation_receipts(영수증) | docs/data/workout-draft-protection.md | pgTAP workout_draft_checkpoints_v1·workout_draft_checkpoint_commit_guard_v1·workout_draft_checkpoint_fence_v2 | 개선 진행 | — |
| SQL 원천·스키마 | 9 | S08, S06 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/durable/** — 함수 7·표 2·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283; 펜스 표·v2 함수는 이슈 #1326) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 스크립트·도구 | 1 | S11 | DURABLE | scripts/data-copy/user-fact-tables.mjs(매일 사본 워크플로가 부름) | .github/workflows/user-data-copy.yml | workflow 실행 기록 | 개선 진행 | S11 이 completeness·checksum 을 붙인다 |
| 테스트·검증 사례 | 79 | G02, S01 | HQ(감사자) | tests/react pending*·workoutDraft*·ownData*, pgTAP workout_draft_*, error-cases CASE-011·015·029 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | S01 이 재현 fixture 를 추가 |
| 문서·계약문 | 9 | S01 | DURABLE | workout-draft-protection.md | — | docs 빌드 | 유지 근거 | 현행 정본; S01 이 codec 계약을 추가 |
<a id="shell"></a>
앱 셸(부팅·route/overlay·owner·연결·스냅샷·오류·토스트·공용 RPC 전송) (shell)
거대 셸·거대 Repository 가 여기 있다. A01 이 분리 경계를 만들고 A15 가 얇은 셸로 끝낸다(운영 정본 §3).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 진입점(HTML·부팅·SW 등록) | 6 | A15, B02 | APP / PLATFORM | index.html → vite/main.tsx·AppRoot·mobileRoot·desktopRoot·AppErrorBoundary | docs/contracts/shell-frames.md · branch-workflow sentinel(index.html) | tests/react/appErrorBoundary·viteServices·initialLoadPath | 개선 진행 | — |
| 라우트·탭·겹침 층 | 6 | A15, A07 | APP(A15 최종; 그 전 A01/A07) | app.tsx·appController.tsx(2,545줄)·mobileApp.tsx(2,093줄)·desktopApp.tsx(1,175줄)·sharedShell.tsx·hostLoadingContext | docs/contracts/shell-frames.md · 운영 정본 §3(앱 컨트롤러 통합 담당) | tests/react/appContainer·navigationStore·homeFragmentBoundaries·uiBoundaryLeaks | 개선 진행 | — |
| 화면(표현) | 13 | U01, U02, U03 | UI | ui/shared/gates/*(오류·호스트·로딩·임퍼서네이션·셸 게이트)·MobileShell*·bottomChrome·DesktopShellFrames·DesktopSidebar·TabSkeletons·DesktopLoadingOverlay | docs/contracts/shell-frames.md · bottom-chrome-clearance.md | tests/react/bottomChromeClearanceContract·hiddenPaneGateGuards·modalRootPortal | 개선 진행 | — |
| 기능 바인딩(features) | 3 | A07, A15 | APP | features/connectivity/OfflineStatusBinding·features/toast/ToastBinding | — | tests/react/connectivityAppAdapter | 개선 진행 | A07 #1335: 연결 상태는 app/connectivityRuntimeHost 가 owner scope 에 묶어 공급 |
| 컨트롤러·스토어 | 31 | A01, A07, A08 | APP(A01 → A07) | resources/resourceStore(owner 범위 조회 캐시 정본, 이슈 #1338)·resources/useResourceSnapshot·app/ownerRuntime(세대·취소 신호·자원 등록, 이슈 #1335)·app/ownerStoreSetHost·app/connectivityRuntimeHost·remoteDataController.ts(3,503줄)·remoteStatus·navigationController/Store·ownerScopeController·ownerStores(Context)·connectivity*·screenLoadPolicyController·screenPolicyBinding·keyedRequestQueue·toastController/Store | docs/architecture/owner-scoped-resource-cache.md · docs/architecture/owner-auth-connectivity-lifecycle.md · 운영 정본 §3 · ADR §3-5 | tests/react/resourceStore·ownerRuntime·ownerStoreSetHost·ownerStores·ownerSwitchFixture·connectivity*·remoteStatusBootSnapshotGuard·keyedRequestQueue·screenRpcHotPath | 개선 진행 | A07 #1335: owner 세대 정본 하나(4 → 1 카운터), 떠나는 순서(보존 → 폐기 → 무효화 → 새 세트) 계약, 연결 조립을 owner 자원으로. A08 #1338: ResourceCachePort 의 실제 구현 하나(resourceStore, 행동 13건) — 소비자 취소와 요청 취소 분리, owner 떠남 = 캐시 자동 폐기, 세션 상세 경로가 첫 소비자(ref 5개·loading state 손 동기화 제거). 남은 손 리셋(resetRemoteUserData)은 A09~A11 이 각 화면을 resource 로 옮기며 줄인다 |
| 서비스·도메인·매퍼 | 27 | A01, A08, A16 | APP | barbelicApi(파사드)·barbelicShared·barbelicMappers·barbelicViewMappers·barbelicNav·mobileExperienceViewMappers·desktopExperienceViewMappers·bootReadModelCache·appShellSnapshot*·appError*·appPerformanceBudgets·tabSwitchLatencyProbe·userErrorPolicy·runtimeGymData·domains/index·lazyFeatureDomain | docs/architecture/domain-service-boundaries.md · data-loading-strategy.md | tests/react/frontendImportBoundaries·lazyServiceBoundaries·leanPublicApiSurface·appShellSnapshot*·bootReadModelCache | 개선 진행 | — |
| 저장소·RPC 어댑터 | 10 | A01, A06, A02, A03, A04, A05 | APP(A01 최종 export 정리, A16 잔여 제거) | barbelicRepository.ts(5,485줄, Supabase 어댑터·RPC 호출 전부)·screenRpcAdapters/Contracts/Freshness/PayloadMetrics·readModelQueryCache·readModelObservability·runtimeSchemaValidation | docs/architecture/domain-service-boundaries.md · docs/data/app-screen-rpc-contract.md · ADR §3-2 | tests/react/repository·screenRpcContracts·rpcContractsAndConventions·rpcSurfaceHygieneContract·mutationRpcGate · test/rpcContractVersioning | 개선 진행 | — |
| 타입·DTO·계약 코드 | 30 | G03, A16 | HQ(G03) | types/common·controllers·desktopUi·mobileUi·reactComponents·screenRpc·global.d.ts | ADR §3-2·§3-5 | npm run check:ts-boundary-gate · tests/react/controllerBoundaries | 개선 진행 | — |
| RPC·테이블(서버 객체) | 2 | A06, G03 | APP / HQ | 화면 RPC 계약 문서(docs/data/rpc-catalog.md·app-screen-rpc-contract.md)·record_client_error_event · 테이블 client_error_events · cron barbelic-client-error-purge | docs/data/app-screen-rpc-contract.md | test/appScreenRpcContract · pgTAP client_error_events | 개선 진행 | — |
| SQL 원천·스키마 | 3 | A06 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/definitions/shell/** — 함수 2·표 1·뷰 0 (schema.sql 에서 추출한 도메인 원천, 이슈 #1283) | docs/data/sql-definitions.md | tests/react/sqlDefinitionsContract · npm run sql:check | 개선 진행 | — |
| 설정·빌드·CI | 2 | B02 | B02 계약·담당자 검증 → Actions 자동 통합 슬롯 | app-config.js(런타임 환경값)·dual-key-baseline.json | docs/platform/environment-separation-runbook.md | tests/react/appConfigEnv · npm run check:dual-key | 개선 진행 | — |
| 스크립트·도구 | 1 | A16 | APP | scripts/check-dual-key-tolerance.mjs(camel/snake 이중 키 허용 기준선) | dual-key-baseline.json | npm run check:dual-key | 개선 진행 | A16 이 기준선을 0 으로 내린다 |
| 테스트·검증 사례 | 89 | G02 | HQ(감사자) | tests/react app*·connectivity*·screenRpc*·boundary 검사, test/appScreenRpc·onDemand·largeData, pgTAP client_error_events, error-cases CASE-010·014 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 11 | G03, A15 | HQ / APP | domain-service-boundaries.md · data-loading-strategy.md · observability-logging.md · shell-frames.md · bottom-chrome-clearance.md | — | docs 빌드 | 유지 근거 | 현행 정본; A15 완료 시 §Next Extraction 절을 정리 |
<a id="ui-platform"></a>
공통 UI 기반(token·primitive·공용 스타일·아이콘·자원·디자인 전달 계약) (ui-platform)
CSS scope·token 의 소유는 U01 계약 → U07 정리(운영 정본 §3). 디자인 전달 계약은 src/react/ui/DELIVERY-CONTRACT.md.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 화면(표현) | 29 | U01 | UI | ui/shared/icons·useListWindow·useDebouncedSearchQuery·numericInputSelection·ui/mobile/lib(Modal·ListOverlay·SearchField·sheetDrag·slideBack·keyboardInset·pullRefresh·BrandRow)·ui/desktop/lib(DkOverlay·bgThemes·dateTimeInputs·saveNodeAsImage)·DesktopWidgets·barbelicCopy · ui/shared/primitives/*(U01 신규, 기존 화면 이식은 U02/U03) | src/react/ui/DELIVERY-CONTRACT.md · DEGRADED-UX-PRESENTATION-CONTRACT.md · docs/contracts/ui-primitives-props.md | tests/react/designDeliveryPrimitives·modalRootPortal·numericInputEditing · tests/react/uiPrimitives · tests/browser/u01 | 개선 진행 | U01 #1289: 작은 primitive v1·오류 gate 버튼 3개 연결, 신규 Node 10/10·Edge 16/16. 기존 화면 이식은 U02/U03 |
| 타입·DTO·계약 코드 | 2 | U01 | UI / APP(마커 등록은 APP) | contracts/designContract.ts(semantic marker) · contracts/ui-primitives-props.ts(React 독립 ViewModel) | AGENTS.md §8 · ui-primitives-props.md | tests/react/designContract · tests/react/contractsImportBoundaries · check:types | 유지 근거 | 마커 계약은 유지; 새 마커는 그 자리에서 추가 |
| 스타일 | 10 | U01, U07 | UI(U01 계약 → U07 정리) | ui/mobile/styles/base/*(tokens·core·primitives·nav·overlays)·styles.css·ui/desktop/styles/desktop.css·ui/shared/styles/{app-host,shell}.css · ui/shared/styles/ui-primitives.css | 운영 정본 §3(CSS scope·token) · 이 장부 §4 · docs/contracts/ui-visual-foundation.md | tests/react/mobileCssBoundaries·backgroundTokens·viewportTiers · npm run check:dead-css · tests/browser/u07 | 검증 완료 | U07 #1532: intrinsic 소유 화면 통합·미사용 scaffold 제거, 기존 layer/플랫폼 token 유지. U07 Chromium 10/10·U03 29/29·U02 22/22·U01 16/16, 원본 대비 12개 화면/폭 computed style 차이 0. U04 이후 native·safe-area 최종 검증은 U06 |
| 설정·빌드·CI | 2 | U07 | UI | dead-css-baseline.json·src/react/ui/delivery-manifest.json | docs/process/design-codex-transfer-contract.md | npm run check:dead-css · tests/react/deadCssGate | 검증 완료 | U07 #1532: deadByFile은 이미 0, 0→0 유지. baseline 재생성·동적 예외 확대 없음; import와 빌드에 없는 scaffold만 삭제 |
| 스크립트·도구 | 1 | U07 | UI | scripts/check-dead-css.mjs | dead-css-baseline.json | npm run check:dead-css | 유지 근거 | U07 #1532: 기존 dead CSS 양방향 gate 통과·구현 유지. 문자열 사용 검사는 entry 도달성을 증명하지 않으므로 scaffold 삭제는 import/빌드 근거 병행 |
| 테스트·검증 사례 | 26 | G02 | HQ(감사자) | tests/react CSS 경계·디자인 계약·뷰포트, e2e bottom-clearance·dock-geometry·viewport-matrix · tests/react/uiPrimitives · tests/browser/u01 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 7 | U01 | UI | ui/README.md · DELIVERY-CONTRACT.md · DEGRADED-UX-PRESENTATION-CONTRACT.md · desktop-screens-props.md · viewport-tiers.md · ui-primitives-props.md · ui-visual-foundation.md | — | docs 빌드 | 유지 근거 | U01 #1289: props/접근성·token/layer/scope 계약 v1, U02/U03/U07/U06 인계 |
| 정적 자원 | 68 | U05 | UI | ui/shared/assets(종목 그림 png/webp)·ui/desktop/assets(빈 상태·아바타·브랜드)·ui/mobile/assets·public/fonts·public/icons | docs/process/brand-identity.md | tests/react/staticAssetDelivery | 개선 진행 | U05 가 초기 번들 비용에서 자원 로딩을 본다 |
U07 #1532 보충(2026-09-10): 전체 장부 재생성 없이 CSS/config/script 담당 행과 신규 tests/browser/u07 분류를 갱신했다. 현재 ui-platform test 분류는 40개(U01/U03/U07 및 기존 검사)이며 위 26개는 기존 G02 감사 시점 수치다. U07은 3개 테스트/서버 설정 파일·10개 브라우저 사례를 추가했다. 검증·한계·후속 인계. 전체 inventory의 기존 미분류·다른 영역 entry/장부 누락은 전역 통과로 보고하지 않는다.
<a id="native"></a>
네이티브(iOS·Android·Capacitor·bridge) (native)
브리지 계약 docs/contracts/native-bridge.md·src/react/contracts/nativeBridge.ts. 스토어 제출은 docs/platform/app-store-submission.md.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 진입점(HTML·부팅·SW 등록) | 1 | N01 | PLATFORM | vite/nativeSplash.ts(스플래시 해제 시점) | docs/contracts/native-bridge.md | tests/react/nativeSplashOwnership | 개선 진행 | — |
| 타입·DTO·계약 코드 | 1 | N01, G03 | PLATFORM | contracts/nativeBridge.ts | docs/contracts/native-bridge.md | tests/auth/androidNativeAuthContract·iosNativeAuthContract | 개선 진행 | — |
| 네이티브(iOS·Android) | 61 | N01 | PLATFORM(iOS 빌드는 오너 Mac) | android/**(MainActivity·NativeBridge·NativeAuth*·SecureStore·AppEnvironment)·ios/**(AppDelegate·MainViewController·Info.plist·PrivacyInfo) | docs/contracts/native-bridge.md · docs/platform/{android,ios}-setup.md | tests/auth 네이티브 계약 2 · tests/react/iosStoreSubmissionContract | 개선 진행 | — |
| 설정·빌드·CI | 1 | N01, B02 | PLATFORM | capacitor.config.json | docs/platform/ios-setup.md | npm run ios:sync / android:sync | 개선 진행 | — |
| 테스트·검증 사례 | 2 | G02 | HQ(감사자) | tests/react nativeSplashOwnership·iosStoreSubmissionContract | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 5 | N01 | PLATFORM | native-bridge.md · android-setup/release.md · ios-setup.md · app-store-submission.md | — | docs 빌드 | 유지 근거 | 현행 정본 |
<a id="sw"></a>
서비스 워커·오프라인·구 청크 복구 (sw)
public/sw.js(빌드 없는 정적 파일) + 등록 조건 offlineServiceWorker.ts + 지연 청크 복구.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 진입점(HTML·부팅·SW 등록) | 3 | N01 | PLATFORM | public/sw.js(정적, 빌드 없음)·vite/offlineServiceWorker.ts(등록 조건)·vite/staleChunkRecovery.ts(지연 청크 복구) | vercel.json /sw.js no-cache 헤더 | tests/react/offlineServiceWorker·staleChunkRecovery | 개선 진행 | — |
| 테스트·검증 사례 | 2 | G02 | HQ(감사자) | tests/react offlineServiceWorker·staleChunkRecovery, error-case CASE-010 | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 정적 자원 | 1 | N01 | PLATFORM | public/offline.html(Capacitor errorPath) | capacitor.config.json | — | 유지 근거 | 정적 대체 페이지 |
<a id="build"></a>
환경·빌드·의존성·배포·CI·게이트 (build)
Vite·Vercel·package·워크플로·check:* 게이트. 공용 설정은 B02 계약·담당자 검증 후 Actions 자동 통합 슬롯 사용(운영 정본 §3·§4-1).
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 설정·빌드·CI | 29 | B02 | B02 계약·담당자 검증 → Actions 자동 통합 슬롯(운영 정본 §3·§4-1) | vite.config.mjs·vercel.json·package(-lock).json·tsconfig*.json·eslint.config.mjs·기준선 json·.github/workflows/*(6)·composite action 2·PR 템플릿·public/manifest.webmanifest·robots.txt·sitemap.xml | docs/process/deployment-pipeline.md · branch-workflow.md sentinel · environment-separation-runbook.md | npm run check:deployment · check:tsconfig · tests/react/deploymentPipeline·ciScopePolicy·remoteReleaseContract | 개선 진행 | — |
| 스크립트·도구 | 33 | B02, G04 | PLATFORM / HQ | scripts/check-*(utf8·brand·eslint·deployment·typescript 4종·unused)·ci-local·ci-scope-policy·ci-wait·typescript-*-contract | docs/process/ci-local.md · docs/gates/* | tests/react/ciLocal·eslintGate·typescriptTooling·typescriptUnusedGate | 유지 근거 | 게이트 도구는 유지; G04 가 성능 예산 게이트를 추가 |
| 테스트·검증 사례 | 24 | G02, G04 | HQ | tests/react ci*·deploymentPipeline·typescript*, test/performanceBudgets, e2e/profile/*(성능 프로파일), pgTAP ops_observability | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | G04 가 계측 기준선을 고정 |
| 문서·계약문 | 12 | B02 | HQ | docs/gates/*(5) · environment-separation-runbook.md | — | docs 빌드 | 유지 근거 | 현행 정본 |
<a id="db-platform"></a>
DB 플랫폼(schema·migration·랜딩·권한·원본 보호) (db-platform)
테이블 77·함수 372·트리거 99·정책 90·pg_cron 7. 랜딩 절차 docs/process/migration-landing.md, 원본 불변 docs/contracts/user-fact-immutability.md.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 서비스·도메인·매퍼 | 1 | D13 | HQ(랜딩) | services/deploymentManifest.ts(EXPECTED_LATEST_MIGRATION, renumber 가 갱신) | docs/process/migration-landing.md | npm run check:deployment · migrations:check | 유지 근거 | 랜딩 절차의 기계 갱신 대상 |
| 타입·DTO·계약 코드 | 1 | G03, D03 | HQ | types/supabase.ts(생성 타입) | docs/data/supabase-type-strategy.md | tests/react/supabaseTypeStrategy | 개선 진행 | — |
| SQL 원천·스키마 | 244 | D03, D12, D13 | DATA(객체) / HQ(번호·schema.sql·랜딩) | supabase/migrations/*(173, 불변)·schema.sql(39,577줄 실제 상태 덤프)·seed_dummy_account.sql·supabase/definitions/**(도메인 원천 462파일·registry·rules·exceptions, 이슈 #1283) · 테이블 77·함수 372·트리거 99·정책 90·뷰 3·cron 7 | docs/process/migration-landing.md · docs/data/supabase-migration-strategy.md · ADR §5 | npm run check:migrations · schema:snapshot --check · db:preflight · pgTAP 108파일 · npm run sql:check | 개선 진행 | D03 이 도메인 원천·생성기·drift gate 를, D12 가 모델·index·제약을, D13 이 populated DB 안전성을 맡는다 |
| 설정·빌드·CI | 10 | D03, D13 | DATA | supabase/config.toml·supabase/contracts/user-fact-columns.json(원본 등급 목록)·reference-data-tables.json | docs/contracts/user-fact-immutability.md | tests/react/userFactColumnsContract | 유지 근거 | 계약 목록은 새 컬럼마다 같은 PR 에서 등재 |
| 스크립트·도구 | 39 | D13 | DATA(D13) — 운영 정본 §3 | scripts/migrations/*(renumber·landing-lock·db-preflight·loss-audit·schema snapshot·user-fact 보호 생성기)·git-hooks/pre-push·check-supabase-migrations·check-supabase-remote-schema | docs/process/migration-landing.md | tests/react/landingPreflightGate·schemaSnapshotContract·migrationScope | 개선 진행 | — |
| 테스트·검증 사례 | 38 | G02, D13 | HQ(감사자) / DATA | pgTAP 권한·원본 보호·표면 위생, tests/react schema*·appRolePrivileges·userFactColumns, test/runtimeSchemaValidation·supabaseRemoteSchemaFinalState | tests/audit/manifest.json | npm run check:test-manifest | 유지 근거 | 행동 검사로 유지 |
| 문서·계약문 | 11 | D03 | DATA | supabase/README.md · LEGACY_PATCHES.md · supabase-migration-strategy.md · supabase-type-strategy.md · user-fact-immutability.md · app-role-privileges.md · identity-passing.md | — | docs 빌드 | 유지 근거 | 현행 정본 |
<a id="verification"></a>
검증 기반(테스트 감사·harness·error-case 지원) (verification)
테스트 manifest·e2e harness·error-case 정책 파일. 기능별 테스트는 각 영역의 test 계층에 있다. R02~R06(통합 검증·리허설·릴리스)은 파일을 소유하지 않고 이 기반과 각 영역의 증거를 소비한다.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 설정·빌드·CI | 6 | G02 | HQ(감사자) | tests/audit/manifest.json·pending-changes.json·playwright*.config.mjs(3) | docs/gates/test-audit.md · AGENTS.md §9 | npm run check:test-manifest | 유지 근거 | 감사자만 manifest 를 갱신 |
| 스크립트·도구 | 3 | G02 | HQ | check-test-manifest·check-error-case-registry | docs/gates/test-audit.md | npm run check:test-manifest · check:error-cases | 유지 근거 | 게이트 유지 |
| 테스트·검증 사례 | 68 | G02 | HQ | e2e/support/*(harness·설정·오류 감시)·error-cases/support/*(정책·fixture)·tests/support/*·tests/react/support/*·errorCase*/e2eHarness* 검사 | docs/testing/browser-full-stack-e2e.md · e2e-crud-roundtrip.md | npm run ci:local | 개선 진행 | G02 가 clock·UUID·scheduler 재현성을 붙인다 |
| 문서·계약문 | 5 | G02 | HQ | docs/testing/* | — | docs 빌드 | 유지 근거 | 현행 문서 |
<a id="docs"></a>
문서 사이트·프로세스·총괄·이 장부 (docs)
VitePress 사이트(barbelic-docs)·프로세스 정본·이 장부와 검사 도구.
| 계층 | 파일 | 계획 ID | 변경 소유자 | 주요 소비자·객체 | 현행 계약 | 기존 검사 | 판정 | 구현 PR/SHA·검증 증거 |
|---|---|---|---|---|---|---|---|---|
| 설정·빌드·CI | 7 | G01 | HQ | docs/.vitepress/*·docs/package(-lock).json·docs/vercel.json·docs/scripts/build-admin.mjs(관리자 셸을 /admin/ 로 싣는 빌드) | docs/process/deployment-pipeline.md 관리자 셸 절 | docs npm ci && build | 유지 근거 | 문서 사이트 빌드; 관리자 셸 배포 경로는 운영 정본 §4-5 |
| 스크립트·도구 | 2 | G05, R01 | HQ(G05) | scripts/architecture/check-coverage-inventory.mjs·coverage-inventory.json(이 장부의 규칙·데이터) | 이 문서 §2 | node scripts/architecture/check-coverage-inventory.mjs · tests/react/coverageInventory | 유지 근거 | G05 산출물; R01/R05 가 --strict 로 종료 검사 |
| 테스트·검증 사례 | 1 | G05 | HQ | tests/react/coverageInventory.test.mjs | — | npm test | 유지 근거 | 도구 행동 검사 |
| 문서·계약문 | 23 | G01, G05, R01 | HQ | README.md · AGENTS.md · docs/index·README·agents · docs/process/(10) · docs/product/ · ADR · 이 장부 | 운영 정본 §3(총괄·운영 정본·ADR 은 HQ) | docs 빌드 | 유지 근거 | 현행 정본; R01 이 오래된 문장을 정리 |
진입점·잡 등록 대조
| 종류 | 등록(장부) | 실제 발견 | 미등록 | 사라짐 |
|---|---|---|---|---|
| html | 2 | 2 | — | — |
| boot | 2 | 2 | — | — |
| serviceWorker | 1 | 1 | — | — |
| api | 4 | 4 | — | — |
| edgeFunctions | 3 | 3 | — | — |
| workflows | 6 | 6 | — | — |
| cronJobs | 7 | 9 | barbelic-stats-projection-compute, barbelic-stats-projection-publish | — |
근거 있는 제외
| 규칙 | 파일 수 | 근거 | 소유 |
|---|---|---|---|
^docs/updates/ | 192 | 작업 기록·총괄 문서 — 실행되지 않는 역사·계획 자료. 총괄(roadmap)의 갱신은 HQ 가 통합한다 | HQ |
^bug-report/ | 85 | 버그 리포트 — 역사 자료(형식 정본 bug-report/README.md) | HQ |
^docs/(ko/)?archive/ | 19 | 보관 문서 — 현행 계약이 아니다 | HQ |
^docs/ko/ | 20 | 한국어 번역 사본 — 원본 문서가 영역에 연결돼 있다 | HQ |
^supabase/legacy/ | 29 | 옛 patch 파일 — 실행하지 않는 참고 자료(AGENTS.md §5, supabase/LEGACY_PATCHES.md) | DATA |
^supabase/wodup_exercises_mapping_import_20260615/ | 9 | 2026-06 일회성 Wodup 매핑 인입 자료 — 현행 파이프라인이 아니다 | PLATFORM |
| `^src/react/ui/(CHANGE-NOTES(-archive)? | PR-DRAFT | HANDOFF-vite-export).md$` | 4 |
^\.claude/ | 1 | 로컬 개발 도구(Claude 앱) 설정 — 제품·빌드에 쓰이지 않는다 | HQ |
^supabase/\.branches/ | 1 | Supabase CLI 상태 파일 | DATA |
미분류 (규칙 추가 필요)
docs/contracts/button-system.mddocs/contracts/training-style-props.mde2e/group-design-notifications.spec.mjse2e/profile-design-settings.spec.mjse2e/report-design-detail.spec.mjssrc/react/contracts/profile/profileBodyValidation.tssrc/react/contracts/profile/trainingStyles.tssrc/react/controllers/notificationStore.tssrc/react/controllers/notificationTargetStore.tssrc/react/controllers/useReportDesignData.tssrc/react/services/domains/codecs/reportDesignCodec.tssrc/react/services/domains/profileSettingsCodec.tssrc/react/services/domains/reportDesignDomain.tssrc/react/services/domains/repositories/groupDesignRepository.tssrc/react/services/domains/repositories/reportDesignRepository.tssrc/react/ui/mobile/screens/TrainingStyleScreen.tsxsrc/react/ui/mobile/styles/screens/training-style.csssupabase/tests/database/report_design_distributions_v1.test.sqlsupabase/tests/database/stats_isolated_publication_v1.test.sqlsupabase/tests/database/stats_worker_cancellation_progress.test.sqlsupabase/tests/database/strength_projection_dirty_suffix_v1.test.sqltests/react/designBranchWorkoutFeedInteractions.test.mjstests/react/notificationIntegration.test.mjstests/react/prExerciseStaleData.browser.mjstests/react/profileDesignIntegration.test.mjstests/react/profileDocumentLifecycle.test.mjstests/react/promotion.test.mjstests/react/releaseLanding.test.mjstests/react/writeFailureSafariRecovery.test.mjs
<!-- coverage-ledger:generated:end -->
4. 공용 자원의 소유권과 계약 변경 통지 절차
운영 정본 §3 의 "통합 담당(최종 병합자)" 은 여기서 바꾸지 않는다. 이 절은 그 표를 실제 파일·객체 단위 로 정밀화하고, CSS scope 와 native bridge 두 행을 파일까지 내려 적고, 바꾸기 전에 누구에게 알리는지를 절차로 고정한다.
4-1. 공용 파일 (실측 2026-09-07)
| 자원 | 실제 파일 | 분리 경계를 먼저 만드는 담당 | 새 목적지 | 통합 담당(운영 정본 §3 그대로) | 바꾸기 전 통지 대상 |
|---|---|---|---|---|---|
| 앱 컨트롤러·셸 | src/react/appController.tsx(2,545줄; 운영 정본 §3 의 .jsx 표기는 정정 대상) · mobileApp.tsx · desktopApp.tsx · app.tsx · sharedShell.tsx | A01 → A07 | feature 담당(A09~A14)이 features/** 로 | A15 | A01/A07 담당 이슈 + 그 화면 영역 담당 |
| 원격 데이터 컨트롤러 | src/react/controllers/remoteDataController.ts(4,092줄) · remoteStatus.ts | A01 → A07 | A08(resource cache) · A09~A11 | A15 | A07/A08 담당 |
| 거대 Repository | src/react/services/barbelicRepository.ts(5,485줄) · screenRpcAdapters.ts · screenRpcContracts.ts | A01 | A02~A06 도메인 repository | A01(최종 export) → A16(잔여 제거) | A01 담당 + 그 도메인 담당 |
| 파사드·매퍼 | src/react/services/barbelicApi.ts · barbelicMappers.ts · barbelicViewMappers.ts · mobileExperienceViewMappers.ts · desktopExperienceViewMappers.ts | A01 | 도메인별 codec(A02~A06) | A01 | A01 담당 |
| 기기 대기열 | src/react/services/pendingWorkoutSaves.ts · pendingWorkoutMutationFlush.ts · workoutLocalCacheDb.ts · src/react/controllers/pendingWorkoutSavesStore.ts · pendingWorkoutSavesController.ts | S01 | S02 → S04 → S07 같은 담당 계열 | queue 담당(현재 S 순서) | S 계열 담당 + S05/S06 |
| 타입·DTO·계약 코드 | src/react/types/**(16) · src/react/contracts/**(5) | G03 | feature 담당은 좁은 port 만 | G03 | G03 담당(#1282) |
| 배포 manifest | src/react/services/deploymentManifest.ts(EXPECTED_LATEST_MIGRATION) | — | migrations:renumber 가 기계 갱신 | 해당 PR 담당이 생성·검증, 자동 큐에서 통합 | 손으로 고치지 않는다 |
| 웹 부팅·빌드·의존성 sentinel | index.html · app-config.js · vite.config.mjs · vite.admin.config.mjs · package.json · package-lock.json · tsconfig*.json · .github/workflows/** | B02 | 필요한 담당이 PR 본문에 sentinel 사유 | 배정된 소유자 검증 → Actions 자동 통합 슬롯(§4-1 ②) | 소유 역할 담당, 충돌·범위 변경만 HQ(#1279) |
| 테스트 감사 manifest | tests/audit/manifest.json | — | 담당은 pending-changes.json 신고만 | 감사자(G02) | G02 담당(#1280) |
| 총괄·운영 정본·ADR·이 장부의 규칙 | docs/updates/2026-09-07-…roadmap.md · docs/process/v0-18-0-hq-operations.md · docs/contracts/v0-18-0-adr.md · scripts/architecture/coverage-inventory.json | — | 담당은 갱신안을 이슈 댓글로; 규칙 파일은 새 경로 한 줄만 직접 | HQ(규칙 파일은 G05 → HQ) | HQ |
| 관리자 셸 | 운영 정본 §4-5 의 감시 경로 | B01 | A05 | B01 | B01 + 관리자 게이트 라벨 |
4-2. DB object — 영역별 테이블·함수 소유
SQL object(함수·정책·트리거·뷰)는 D03의 supabase/definitions/<domain>/** registry별로 도메인 담당이 바꾼다. 번호·schema.sql은 해당 PR 담당이 생성·검증하고, 랜딩은 Actions 자동 큐가 직렬 실행한다(운영 정본 §3·§4). 같은 object나 공용 파일의 계약·변경 순서가 충돌할 때 HQ가 조율한다. registry 이전에 조사한 아래 도메인 경계와 테이블 77개 소유 분류는 유지한다.
| 영역 | 테이블 | 대표 함수·잡 | object 담당(계획 ID) |
|---|---|---|---|
| workout · plan | session · session_exercise · session_exercise_part · exercise_set · exercise_set_part · workout_mutation_receipts · daily_conditions · 뷰 completed_session_v1 · planned_session_v1 | save_session_v5 · delete_session_v5(_engine) · retry_save_session_v5 · get_session_detail · get_session_search · get_planned_session_detail | D02(영수증 세대) · S10(복구) · A02(codec) |
| home · calendar · volume | user_calendar_day_summaries · user_calendar_summary_dirty_dates · user_training_period_stats · user_exercise_period_stats · user_exercise_favorites · user_exercise_favorite_states | get_home_dashboard · get_home_year_activity · get_calendar_* · get_log_table_* · get_volume_overview · *_user_exercise_favorite(s) | D06(기간·달력 projection) · A06(query codec) |
| pr | user_exercise_pr_events · user_exercise_pr_states · user_exercise_records · user_manual_pr_records · user_manual_record_metrics · user_pr_exercise_summary_snapshots · user_pr_overview_snapshot_headers · user_pr_overview_rollover_state · pr_overview_projection_control · exercise_strength_standards · strength_profession_standards | get_pr_overview · get_exercise_pr_* · save/delete_manual_pr · *_manual_record_metric_v1 · cron lift-guild-pr-overview-snapshot-rollover | D07(PR·e1RM checkpoint) · D10(rollover 탐색) |
| stats | user_exercise_stats · user_exercise_stats_refresh_jobs · user_exercise_session_rollups · user_exercise_strength_daily/observations/states · user_exercise_max_rep_observations · user_exercise_set_score_states · user_stats_refresh_state · stats_refresh_event_types · strength_estimation_curve_points/curve_versions/integer_lookup_snapshots/policy_versions · max_rep_estimation_policy_versions · set_purpose_policy_versions · 뷰 user_exercise_stats_refresh_job_observability | enqueue/process_user_exercise_stats_refresh_jobs · run_*_cron · cron lift-guild-stats-refresh · barbelic-stats-backfill-scan | D01(DAG) · D04(dirty scope) · D05(rollup) · D08(worker·lease) · D11(전환) |
| catalog | exercises · exercise_synonyms · exercise_archetypes · exercise_catalog_changes · exercise_usage_stats · exercise_business_role_memberships · exercise_external_mappings | get_exercise_catalog(_changes) · get_exercise_search_signals_v1 · create_custom_exercise · cron barbelic-exercise-* | A03(codec) · D12(모델·index) |
| profile · onboarding | profiles · body_metrics · user_consents | get_profile_workspace · save_profile_body_metric · set_profile_*_v1 · get_onboarding_state · complete_onboarding · withdraw_user_consent · ensure_user_profile | A03 · B01(계정 생애주기) |
| social | user_follows · user_blocks · session_likes · session_comments · content_reports · content_takedowns · user_suspensions · moderation_banned_terms | get_profile_feed · get_following_*_v1 · follow/unfollow_user_v1 · block/unblock_user_v1 · report_content_v1 · *_session_comment(s)_v1 | A04 · B01(권한) |
| group | groups · group_members · group_invites · group_notices · group_chat_messages | create_group_v1 · invite_to_group_v1 · get_group_*_v1 · *_group_board_comment_v1 · *_group_chat_message_v1 | A04 · B01 |
| auth · admin | lift_guild_admins (+ auth.users cascade) | complete_native_social_login · complete_native_social_identity_link · is_lift_guild_admin · admin_*(15) · get_admin_* | B01 |
| import | wodup_import_batches/rows/sessions/sets/exercises · wodup_exercises · wodup_session_timing_materializations · inbody_import_batches · external_exercise_interpretations · external_exercise_interpretation_components | enqueue/stage/import_wodup_* · mark_wodup_import_batch_*_v1 · import_motra_workouts_v1 · import_inbody_body_metrics · Edge wodup-* · cron barbelic-wodup-failed-staging-purge | D09(durable 소비자) · I01(parser·identity) · A05(codec) |
| durable | workout_draft_checkpoints · workout_draft_checkpoint_fences | *_workout_draft_checkpoint_v1(v2 호환 래퍼) · *_workout_draft_checkpoint_v2 · retire_workout_draft_checkpoint_operation_v1 · clear_*_workout_draft | S08 |
| shell · db-platform | client_error_events · user_fact_history | record_client_error_event · cron barbelic-client-error-purge · 원본 보호 트리거(user_fact_*) | B02(관측) · D13(원본 보호·랜딩 도구) |
바꾸기 전 규칙(ADR §5·원본 불변 계약 그대로): 유저 원본 등급 컬럼을 UPDATE/DELETE 하는 문장은 수리 티켓 없이 쓰지 않는다. 새 컬럼은 같은 PR 에서 supabase/contracts/user-fact-columns.json 에 등급을 등재한다. 같은 함수를 두 트랙이 재발행하면 나중 랜딩이 재조립한다(랜딩 절차).
4-3. CSS scope — 파일 단위 소유
| scope | 파일 | 어디서 실리나 | 소유 | 바꾸기 전 통지 |
|---|---|---|---|---|
| token | src/react/ui/mobile/styles/base/tokens.css(layer(tokens)) | styles.css 매니페스트 → mobileRoot.tsx 즉시 | U01(계약) → U07(정리) | UI 역할 전체 + 그 token 을 쓰는 화면 영역 |
| base(공통 규칙·primitive·nav·overlay) | base/core.css · primitives.css · nav.css · overlays.css(layer(base)) | 위와 같음 | U01 → U07 | UI 역할 전체 |
| shared shell(호스트·프레임) | src/react/ui/shared/styles/shell.css · app-host.css · src/react/vite/vite-scaffold.css | vite/main.tsx 즉시(두 플랫폼 공통) | U01 · A15(프레임 배선) | UI + APP(A15) |
| desktop base | src/react/ui/desktop/styles/desktop.css | desktopRoot.tsx 즉시 | U01 → U03 | UI |
| mobile screen | ui/mobile/styles/home.css(즉시) · screens/{day-summary,feed,group,legal-doc,onboarding,profile,records,report,session,set-search,workout}.css(화면과 같은 suspense 경계에서 지연 로드) | mobileRoot.tsx 지연 import | 그 화면 영역 담당 + U02(표현) | 그 영역 담당 |
| desktop screen | ui/desktop/styles/screens/{plan-editor,pr,session,volume}.css · desktop-admin.css | desktopRoot.tsx 즉시 · 관리자 셸 | 그 화면 영역 담당 + U03 | 그 영역 담당 |
| 문서·법적 | public/legal/legal.css · docs/.vitepress/theme/custom.css | 정적 | B01(법적 문서 불변) · HQ(docs) | — |
지키는 검사: tests/react/mobileCssBoundaries.test.mjs(모바일 루트는 루트 소유·공용·홈 스타일만 즉시 로드, 화면 스타일은 같은 suspense 경계에서), check:dead-css(안 쓰는 선택자 기준선 dead-css-baseline.json, U07 이 0 으로), backgroundTokens. 규칙: 새 화면 CSS 는 screens/ 에 파일을 만들고 지연 import 로 싣는다 — styles.css 매니페스트에 넣지 않는다. token·base 를 바꾸면 U01 담당 이슈에 통지하고 check:dead-css 기준선을 같은 PR 에서 갱신한다.
4-4. native bridge — 메시지 단위 소유
| 방향 | 계약 | 웹 쪽 | Android | iOS | 소유 |
|---|---|---|---|---|---|
| 웹 → 네이티브 (12종) | startSocialLogin · persistNativeAuthSession · restoreNativeAuthSession · clearNativeAuthSession · nativePkceStorage · appleAccountDeletionReauth · workoutActive · splashState · sessionDownloadImage · shareFile (+ 버전 별칭 …V1) | src/react/services/barbelicNav.ts(BarbelicNativeMessage) · src/react/contracts/nativeBridge.ts · vite/nativeSplash.ts · services/auth/providers/* | android/app/src/main/java/com/dekerd/barbelic/NativeBridge.kt(handleMessage) · NativeAuthTransaction.kt · SecureStore.kt | ios/App/App/MainViewController.swift · AppDelegate.swift | N01(PLATFORM) — 계약문 docs/contracts/native-bridge.md |
| 네이티브 → 웹 (이벤트) | barbelic:native-auth · barbelic:native-session-persist · barbelic:native-auth-complete · __barbelicNativeEnvironment(오프라인 페이지) | services/nativeAuthSessionPolicy.ts · authOAuthCallbackPolicy.ts | NativeAuthCallbackMailbox.kt · MainActivity.kt | MainViewController.swift | N01 + A07(인증 lifecycle) |
| 환경 | capacitor.config.json(webDir dist-vite · errorPath offline.html · iOS limitsNavigationsToAppBoundDomains) · android/app/build.gradle · ios/App/App/Info.plist · PrivacyInfo.xcprivacy | — | — | — | N01 · B02(빌드) |
지키는 검사: tests/auth/androidNativeAuthContract.test.mjs · iosNativeAuthContract.test.mjs(두 플랫폼 구현이 계약문의 메시지·콜백 형식을 따르는지) · tests/react/nativeSplashOwnership. 규칙: 메시지를 추가·변경하면 계약문 → 웹 타입 → Android → iOS 네 곳을 한 PR 에서 바꾸고, 못 바꾸는 플랫폼(iOS 빌드는 오너 Mac)이 있으면 옛 메시지를 한 릴리스 동안 함께 받는다(ADR §5 호환 경계). N01 담당 이슈에 통지한다.
4-5. 계약 변경 통지 절차
"계약" 은 §3 각 행의 "현행 계약" 칸에 적힌 문서·타입·RPC 시그니처·CSS token·bridge 메시지다. 바꾸는 쪽이 아래 여섯 단계를 지킨다. 절차의 강제력은 이 장부(미분류·미등록 탐지)·앵커 테스트·랜딩 큐에서 온다.
- 바꾸기 전에 장부에서 소유자와 소비자를 확인한다. §3 의 행(변경 소유자·주요 소비자)과 §4-1~4-4 의 통지 대상을 본다. 소유자가 자기 역할이 아니면 자기 이슈가 아니라 그 소유 역할의 이슈에 먼저 댓글 을 남긴다.
- 통지 댓글 형식(자기 이슈와 소유 역할 이슈 둘 다, 같은 턴):
계약 변경 통지 (YYYY-MM-DD) 자원: <파일·객체·메시지 이름> · 장부 행: <영역>/<계층> 지금 계약: <문서·시그니처·버전> 바뀌는 것: <한 줄> · 이유: <한 줄> 영향 소비자: <§3 주요 소비자 중 실제로 닿는 것> 호환: <한 릴리스 동안 옛 형태도 받음 / 즉시 교체(사유)> PR: #N · 세션: <sessionId> - 공용 파일이면 자동 통합 큐를 사용한다. §4-1의 sentinel·공용 설정·
schema.sql·배포 manifest를 만지는 담당자는 PR 본문에 sentinel 사유를 적고 검증 후npm run landing:request -- --pr <N>으로 요청한다. 실제 계약·소유권 충돌은 HQ 조정 이슈에 알리되 일상적인 랜딩에 HQ 라벨·재승인을 요구하지 않는다. - PR 본문 "호환 영향" 절 에 통지 댓글 링크와 옛 형태의 제거 조건(어느 릴리스 뒤)을 적는다. 관리자 셸 번들에 실리는 공용 코드가 Production 에 없는 함수를 부르게 되면 운영 정본 §4-5 라벨(
admin-hold/admin-compat-confirmed)을 붙인다. - 머지 뒤 장부를 갱신한다. 새 경로·진입점·cron 잡은 규칙 파일에 한 줄(같은 PR). 그 행의 판정·증거는 구현 담당이 바꾼다("검증 완료" 는 PR·SHA·검사 결과와 함께). 현재 앱에서
--strict를 실행하고 이 문서의 현재 분류 표를 문서 PR에서 갱신한다. 앱은 문서를 읽거나 생성하지 않는다. - 통지 없이 바뀐 것을 잡는 방법: 파일을 옮기면 미분류·미사용 규칙으로, 진입점·cron 을 추가하면 미등록으로 도구가 알린다. 함수 시그니처는
rpcSurfaceHygieneContract·rpcContractsAndConventions·pgTAP 이, bridge 는tests/auth계약 검사가, CSS 는mobileCssBoundaries·dead-css가 깨진다. 깨진 검사를 완화해서 지나가지 않는다(AGENTS.md §9).
5. 원 보고서 31개 · 추가 범위 C01–C08 · 63개 ID 와 영역의 대응
5-1. 보고서 항목 → 영역
총괄 문서 §11 의 F01~F30 + F07b(31개)가 어느 영역·계층에 닿는지. 연결 이슈는 총괄 문서가 정본이며 여기서는 영역만 붙인다.
| 보고서 | 개선사항 | 닿는 영역 · 계층 | 실제 구현·시험 근거 |
|---|---|---|---|
| F01 | Outbox 교체 원자성 | durable(controller·service) · native(sw) | S01 PR1320, S02 PR1349, S04 PR1369, N01 PR1441, R02 예정, R05 예정 |
| F02 | 동시 저장 generation 경합 | workout(rpc) · stats(rpc) · db-platform(sql) | D01 PR1319, D02 PR1352, R02 예정, R05 예정 |
| F03 | Dirty scope·증분 통계 | stats(rpc·job) · calendar/home/volume(rpc) | D01 PR1319, D04 PR1454, D05 PR1506, D06 PR1518, D07 PR1522, D11 PR1547, R04 예정, R05 예정 |
| F04 | Projection 다중 작성자 | stats(rpc·job) | D01 PR1319, D05 PR1506, D06 PR1518, D07 PR1522, D11 PR1547 |
| F05 | 전역 worker 의 사용자 간 잠금 | stats(job) | D01 PR1319, D08 PR1510, D11 PR1547, R04 예정, R05 예정 |
| F06 | Wodup 자동 복구·완료 정합 | import(job·rpc) | D01 PR1319, D09 PR1445, D11 PR1547, I01 PR1498, R05 예정 |
| F07 | 충돌 사본·명시 복구와 merge 정책 | durable(service·rpc) · docs(ADR §3-3) | G01 PR1296, S06 PR1385, S09 PR1502, S10 PR1442, R02 예정 |
| F07b | 충돌 재전송 ID 의 비영속성 | durable(service) | S01 PR1320, S06 PR1385, R02 예정 |
| F08 | 실제 domain repository 분리 | shell(repository) → 기능 16개(service·repository) | G03 PR1311, A01 PR1316, A02 PR1354, A03 PR1351, A04 PR1448, A05 PR1443, A06 PR1453, A16 PR1561, B01 PR1346, I01 PR1498, R01 PR1569 |
| F09 | Resource cache·lifecycle 분리 | shell(controller·service) · auth(controller) | G03 PR1311, A07 PR1365, A08 PR1372, A09 PR1394, A10 PR1501, A11 PR1516, A16 PR1561, B01 PR1346, N01 PR1441, R01 PR1569 |
| F10 | 197-field renderCtx·shell | shell(route) | G03 PR1311, A07 PR1365, A09 PR1394, A10 PR1501, A11 PR1516, A15 PR1550, R01 PR1569 |
| F11 | gymData/ref/dataTick 중복 상태 | shell(service runtimeGymData·controller) | G03 PR1311, S08 PR1350, A07 PR1365, A08 PR1372, A09 PR1394, A10 PR1501, A11 PR1516, A15 PR1550, A16 PR1561 |
| F12 | any·범용 타입·DTO 경계 | shell(types) · 기능 영역 types 계층 전부 | G03 PR1311, S01 PR1320, S03 PR1363, A01 PR1316, A02 PR1354, A03 PR1351, A04 PR1448, A05 PR1443, A06 PR1453, A12 PR1378, A13 PR1375, A16 PR1561, B01 PR1346, I01 PR1498, R01 PR1569 |
| F13 | camel/snake·legacy 내부 관용 | shell(script check-dual-key·repository) | G03 PR1311, S01 PR1320, S03 PR1363, A01 PR1316, A02 PR1354, A03 PR1351, A04 PR1448, A05 PR1443, A06 PR1453, A12 PR1378, A13 PR1375, A16 PR1561, I01 PR1498, R01 PR1569 |
| F14 | 공통 headless editor·입력 상태 | workout·plan(binding·controller) · ui-platform(ui) | G03 PR1311, S08 PR1350, A12 PR1378, A13 PR1375, U02 PR1523, U03 PR1520, U06 예정 |
| F15 | 예외 기반 prepare | workout·plan(service) | S03 PR1363, A12 PR1378, A13 PR1375 |
| F16 | Outbox/UI/retry 책임 혼합 | durable(controller) · shell(controller) | G03 PR1311, S04 PR1369, S05 PR1374, A09 PR1394, R02 예정 |
| F17 | 전체 큐 조회·mirror·index | durable(service) | S01 PR1320, S04 PR1369, S07 PR1377, N01 PR1441, R02 예정, R04 예정 |
| F18 | 이름 추정 이력 | pr·catalog(service) | A14 PR1503 |
| F19 | Feed 의존 이력·반복 find | social(controller) · pr(service) | A14 PR1503, U04 PR1553, R04 예정 |
| F20 | 실제 viewport 가상화 | ui-platform(ui useListWindow) · calendar·pr(ui) | U04 PR1553, R04 예정 |
| F21 | 고정 canvas/zoom 대응 구조 | ui-platform(css) · native | U03 PR1520, U06 예정, U07 PR1549, N01 PR1441 |
| F22 | Token·primitive·플랫폼 일관성 | ui-platform(css·ui) | U01 PR1317, U02 PR1523, U03 PR1520, U06 예정, U07 PR1549 |
| F23 | 실제 bundle/초기 실행 비용 | build(config) · ui-platform(asset) · shell(entry) | G04 PR1315, U05 PR1565, B02 PR1356, R04 예정 |
| F24 | SQL 원천·migration·wrapper 구조 | db-platform(sql·script) | G01 PR1296, D03 PR1312, D11 PR1547, D12 PR1358, D13 PR1318, R01 PR1569 |
| F25 | 소스 모양 대신 행동 검사 | verification · 각 영역 test 계층 | G02 PR1310, D03 PR1312, R01 PR1569 |
| F26 | Clock·UUID·scheduler·줄바꿈 재현성 | verification(test) · durable(service) | G02 PR1310, S08 PR1350, R02 예정 |
| F27 | Repair/rollover 전역 탐색 | stats(rpc·job) | D01 PR1319, D10 PR1521, D11 PR1547, D12 PR1358, R04 예정 |
| F28 | 사본 검증·실제 복구 | durable(script data-copy·service) · build(config user-data-copy.yml) | S10 PR1442, S11 PR1499, D13 PR1318, I01 PR1498, R03 예정, R05 예정, R06 예정 |
| F29 | 관측·혼합 부하·운영 증거 | build(test ops_observability·performanceBudgets) · shell(service) | G04 PR1315, S11 PR1499, D08 PR1510, B02 PR1356, R04 예정, R05 예정, R06 예정 |
| F30 | 미사용 코드·잘못된 이름·오래된 문서 | docs · 각 영역 doc 계층 · 제외 목록(§3 근거 있는 제외) | G01 PR1296, U07 PR1549, B02 PR1356, R01 PR1569, R06 예정 |
5-2. 추가 범위 C01–C08 → 영역
| 추가 범위 | 내용 | 책임 | 닿는 영역 | 실제 구현·시험 근거 |
|---|---|---|---|---|
| C01 | 전체 기능·공유 계층 커버리지 | G05 | 이 장부 전체 | G05 PR1307, G01 PR1296, G03 PR1311, R01 PR1569, R05 예정, R06 예정 |
| C02 | 전체 DB 모델·제약·index·대표 쿼리 | D12 | db-platform(sql) + 기능 영역 rpc 행의 테이블 목록 | D12 PR1358, D03 PR1312, D04 PR1454, R04 예정, R05 예정 |
| C03 | populated DB migration·잠금·backfill·재개 | D13 | db-platform(sql·script) | D13 PR1318, D02 PR1352, D03 PR1312, D09 PR1445, R05 예정 |
| C04 | CSS cascade·scope·override·중복 | U07 | ui-platform(css) + 기능 영역 css 행 12개 | U07 PR1549, U01 PR1317, U02 PR1523, U03 PR1520, U04 PR1553, U06 예정, R01 PR1569 |
| C05 | 서버 API·인증·계정·관리자 권한 | B01 | auth(api·rpc) · admin(api·rpc) · profile/social/group/onboarding(rpc) | B01 PR1346, A07 PR1365, A03 PR1351, A05 PR1443, R02 예정, U06 예정 |
| C06 | 네이티브·SW·업데이트 생애주기 | N01 | native · sw | N01 PR1441, S01 PR1320, S07 PR1377, S08 PR1350, U03 PR1520, U06 예정, R02 예정, R05 예정 |
| C07 | 전체 인입·파일 처리 | I01 | import 전 계층 | I01 PR1498, A05 PR1443, A11 PR1516, D09 PR1445, S10 PR1442, R03 예정, R04 예정, U06 예정 |
| C08 | 환경·빌드·의존성·자원 경계 | B02 | build · admin(config) · native(config) · shell(config) | B02 PR1356, G04 PR1315, U05 PR1565, R04 예정, R05 예정, R06 예정 |
5-3. 63개 ID → 영역
R01 현재 registry의 area/ledger planIds 합집합과63개 실행 목록을 대조해 누락0을 확인했다. 각 구현 SHA·담당 시험·예정6개는 최종 대조표를 따른다. 아래2026-09-07 설명의 파일 수는 역사 기록이다.
§3 의 계획 ID 칸을 모으면 63개 ID 전부가 적어도 한 영역에 붙는다(도구로 확인, 2026-09-07). 파일을 소유하지 않는 ID 는 다음과 같이 읽는다.
- R02·R03·R04·R05·R06 — 통합 검증·리허설·릴리스.
verification영역의 계획 ID 로 붙였고, 각 영역 test 행의 증거를 소비한다. - G02·G03·G04 — 검증 기준선·타입 경계·성능 예산. 파일보다 계약을 소유하며
types·test계층 행에 나타난다. - A15·U02·U03·U07 — 여러 영역의 route·ui·css 행에 동시에 나타난다. 통합 담당(운영 정본 §3)은 바뀌지 않는다.
6. 실행 계층 목록 (손으로 적은 부분)
§3 가 파일 수와 판정을 생성한다면, 이 절은 파일 이름만으로는 보이지 않는 라우트·진입점·잡 을 적는다. 실측 2026-09-07, main 3fdefeb3.
6-1. 라우트
| 플랫폼 | 탭 | 겹쳐 뜨는 층 | 정의 위치 |
|---|---|---|---|
| 모바일 | home · feed · calendar · volume(리포트) · pr · search · profile · group | workout · session · prDetail · daySummary · friendSession · friendScope · menu · legal | controllers/navigationStore.ts(초기 탭은 URL 에서) · app.tsx/mobileApp.tsx |
| 데스크톱 | home · session · calendar · logtable · favgroups · pr · volume · search · profile · admin | 오버레이(DkOverlay)·로딩 오버레이 | desktopApp.tsx |
| 관리자(독립 셸) | 종목 전체·커스텀·세부·매핑·인입·Motra 인입·그룹·운영·신고 | 추가 모달 | desktopAdminTabs.ts · vite/admin/adminShellView.ts |
6-2. 진입점
| 종류 | 실제 | 영역 |
|---|---|---|
| HTML | index.html(앱, Vercel dist-vite) · admin/index.html(관리자, docs 사이트 /admin/) | shell · admin |
| 부팅 | src/react/vite/main.tsx → AppRoot → mobileRoot/desktopRoot · vite/admin/main.tsx → AdminStandaloneRoot | shell · admin |
| 서비스 워커 | public/sw.js(정적) — 등록 조건 vite/offlineServiceWorker.ts | sw |
| API 핸들러(Vercel) | api/account/delete.js · api/admin/impersonate.js · api/admin/users.js · api/auth/test-admin/session.js(로컬 e2e 전용) — _ 접두 파일은 공용 모듈 | auth · admin |
| Edge 함수(Supabase) | wodup-start-import · wodup-process-import-jobs · stats-process-refresh-jobs (배포는 deploy.yml functions 잡) | import · stats |
| 워크플로 | deploy.yml(main=staging / production 레인) · policy-contract.yml(PR 검사: verify·migration-smoke·browser-journeys·viewport-matrix) · landing-queue.yml(라벨 병합 큐) · prod-smoke.yml(수동) · external-auth-smoke.yml(매일 Kakao) · user-data-copy.yml(매일 사본) | build |
| 네이티브 | android/app/src/main/java/com/dekerd/barbelic/MainActivity.kt · ios/App/App/AppDelegate.swift (Capacitor webDir: dist-vite) | native |
6-3. pg_cron 잡 (7)
| 잡 | 주기 | 부르는 함수 | 영역 |
|---|---|---|---|
lift-guild-stats-refresh | 매분 | run_user_exercise_stats_refresh_cron(25) | stats |
lift-guild-pr-overview-snapshot-rollover | 매분 | run_user_pr_overview_snapshot_rollover(10) | stats(pr 투영) |
barbelic-stats-backfill-scan | 매시 | run_user_exercise_stats_backfill_scan_cron(50) | stats |
barbelic-exercise-usage-stats-refresh | 매시 23분 | refresh_exercise_usage_stats_v1() | catalog |
barbelic-exercise-catalog-changes-prune | 매일 03:40 | prune_exercise_catalog_changes_v1() | catalog |
barbelic-client-error-purge | 매일 04:17 | purge_client_error_events_v1() | shell |
barbelic-wodup-failed-staging-purge | 매일 04:27 | purge_wodup_import_failed_staging_v1() | import |
cron 잡 이름은 도구가 schema.sql 에서 실측해 등록 목록과 대조한다. 새 잡을 추가한 마이그레이션은 같은 PR 에서 등록 목록에 이름을 넣는다.
6-4. 기존 검사·계약의 재사용 목록
장부는 새 검사를 만들지 않고 아래 기존 게이트를 각 행의 "기존 검사" 칸에 연결했다.
| 게이트 | 명령 | 지키는 것 |
|---|---|---|
| 프런트 import 경계 | tests/react/frontendImportBoundaries.test.mjs | UI → controller → api → domain → repository 흐름, 모바일/데스크톱 분리 |
| 타입 경계 | npm run check:ts-boundary-gate · check:ts-scope | suppression 금지·경계 어댑터 |
| 이중 키 허용 기준선 | npm run check:dual-key | camel/snake 잔재(A16 이 0 으로) |
| 죽은 CSS 기준선 | npm run check:dead-css | 안 쓰는 선택자(U07 이 0 으로) |
| 테스트 감사 manifest | npm run check:test-manifest | 등재 테스트 수정·삭제 신고 |
| error-case 등록 | npm run check:error-cases | 38건의 관찰 요건·정리 격리 |
| 마이그레이션·배포 | check:migrations · check:deployment · schema:snapshot --check · db:preflight | 번호·스냅샷·랜딩 |
| 원본 불변 | tests/react/userFactColumnsContract · pgTAP user_fact_* | 유저 원본 등급 목록·DML 가드 |
| 법적 문서·정책 불변 | check:legal-documents · check:policies · check:policy-snapshots | 발행본 불변 |
| 배포 후 | check:remote-schema · smoke | Production 대조 |
| 화면 RPC 계약 | test/appScreenRpcContract · tests/react/screenRpcContracts | 계약 버전·페이로드 |
7. 인계
7-1. G03 (#1282) — 실제 도메인·공유 계층 목록
- 도메인 경계 입력: §3 의 기능 영역 16개가 곧 도메인 후보다. 각 영역의
types·service·repository·rpc행이 지금 port 가 어디에 흩어져 있는지(대부분shell/repository의barbelicRepository.ts와shell/service의 파사드)와 목적지 담당(A02~A06)을 적는다. G03 은 여기서 feature 별 좁은 port 를 정의하고 generic 하나로 묶지 않는다. - 시간대·정밀도·null/0·외부 provider·native bridge 의 계약 소유자: 시간대·날짜는
calendar·home·stats의 rpc 행(D06·A06), 수치 정밀도·단위는workout(A02·kgDisplay·setPurposePolicy)과stats(D01·정책 파일), 입력 중 문자열/null/0 은workout·plan의 binding·controller 행(A12·A13), 외부 provider 는authservice 행(A07·B01), native bridge 는 §4-4(N01). G03 은 이 담당을 계약문에 명시한다. - 라우트·overlay: §6-1. app shell(A15) 의 route/overlay 계약은
shell/route행. - 읽을 파일 순서: 이 문서 §1-1(샘플 추적) → §3 영역별 표(해당 영역만) →
docs/architecture/domain-service-boundaries.md→docs/data/rpc-catalog.md.
7-2. D12(미게시)·D13 (#1287) — DB 전수 범위
- 테이블 77개의 영역 배정은 §4-2 표. 뷰 3·트리거 99·정책 90·함수 372 는
schema.sql실제 상태 덤프(npm run schema:snapshot --check로 고정)에서 같은 영역 규칙으로 읽는다 — D03 registry 가 생기면 registry 의 도메인 폴더가 §4-2 를 대체하고, 이 장부는 registry 를 가리키도록 갱신한다. - D12: 각 테이블·뷰·공개 RPC 를 "유지 근거 또는 수정·시험 증거" 에 연결하는 작업의 출발점이 §3 의
rpc행(영역 16개)이다. D12 가 판정을 갱신한다(§1-3). - D13: migration 실행·검증 도구(
scripts/migrations/**,supabase/tests/**)는db-platform/script·test행이며 D13 소유(운영 정본 §3). populated DB 위험 분류는 §4-2 의 테이블 목록 전부를 대상으로 한다 — 누락된 DB 영역을 추측하지 않는다.
7-3. R01 · R05 — 종료 검사
- 명령:
node scripts/architecture/check-coverage-inventory.mjs --strict. 종료 조건: 미분류 0 · 미등록 진입점 0 · 사라진 등록 0 · 장부 행 없는 계층 0 · 필수 영역의 미확인·미배정 0 · 문서 동기화 통과. - R01 은 퇴역 코드·테스트·문서를 정리하면서 규칙·제외 목록을 같이 줄인다(안 쓰는 규칙은 도구가 알린다). R05 는 각 필수 영역의 판정이 "유지 근거" 또는 "검증 완료(증거 포함)" 인지 센다 — "개선 진행" 이 남아 있으면 그 계획 ID 가 끝나지 않은 것이다.
- 원 보고서 31개 + C01–C08 대응은 §5. 목록에 이슈가 연결된 사실과 품질 검증 완료를 같은 칸에 적지 않는다.
7-4. HQ 갱신안 (총괄·운영 정본은 HQ 가 통합)
- 총괄 §12 G05 행·Phase 1 집계·§7 장부 행·G05 카드 상태 — G05 PR 에서 적용(HQ 역할). 후속 G03/D12/D13/R01/R05 이슈에는 이 장부 §7 을 댓글로 인계.
- 운영 정본 §3 "앱 컨트롤러" 행의
src/react/appController.jsx→src/react/appController.tsx— G05 PR 에서 한 단어 정정으로 적용하고 HQ 이슈(#1279)에 통지. package.json에 별칭check:coverage-inventory추가 — G05 PR은 당시 HQ 통합 슬롯 규칙에 따라 이 파일을 만지지 않았다. 후속 담당자는 배정된 범위와 검증을 확인하고 자동 큐로 통합한다.npm run check에는 넣지 않는다 — R01/R05 종료 검사와 staging 통합 점검에서 돌린다.
8. 조사 중 확인한 정정 사항
- 운영 정본 §3 의 "앱 컨트롤러" 행이 적은
src/react/appController.jsx는 실제 파일이src/react/appController.tsx다(2026-09-07 실측). G05 PR 에서 한 단어만 정정했다(통합 담당·절차는 손대지 않음). docs/architecture/domain-service-boundaries.md의 "Next Extraction Steps" 가 말하는domains/catalogRepository.ts등은 아직 없다 — A02~A06 의 목적지이며 장부는 존재하는 파일만 센다.get_volume_overview는 v4 와 구버전 v2 오버로드가 병존한다(docs/data/rpc-catalog.md). 제거는 R01.test/(26파일)와tests/react/(338파일) 두 테스트 루트가 병존한다. 장부는 둘 다 영역에 붙였고, 통합 여부는 G02/R01 판단이다.
A11 증거 인계 (2026-09-10, #1419)
이번 기록은 기존 생성 장부의 숫자나 다른 트랙의 완료 판정을 덮어쓰지 않는다. A11 구현·검증 기록의 후보와 병합 상태를 따른다.
| 장부 영역 | 실제 구현 대응 | 증거·잔존 담당 |
|---|---|---|
| profile binding/resource | features/profile/profileFeatureBinding.ts, profileResource.ts | profileFeatureBinding/profileResource 회귀. 온보딩·계정 삭제는 기존 A03/B01 경로 유지. |
| social binding/resource | features/social/{feedResource,followingStore,feedSocialStore,friendScopeStore,moderationStore}.ts 및 React adapter | feedResource/socialResourceLifecycle: 중복 조회·페이지·확정 쓰기·권한·계정 전환. 화면 행 mapper는 A16. |
| group/notification | features/group/*Store.ts, groupController/groupDesignAdapter | groupResourceLifecycle·기존 그룹/알림 회귀. 서버 권한·보드 저장 직렬화 유지. |
| import resource | features/import/{importJobResource,importFeatureBinding}.ts | 공용 job 관찰 6건. 원문/파서/worker는 I01/D09, Wodup 기능 자동 검증은 #1478 제외. |
| 공통 owner 조립 | tests/react/featureResourceAssembly.test.mjs | 3회 반복 계정 전환·dispose 후 listener 잔여 0. |
A16/UI: legacy AnyRecord·행 mapper·props 투영을 리소스 사본으로 오인하여 지우지 않는다. R04: 단위 검사에서 같은 키 두 소비자=1조회, 피드 창 최대200행, 그룹128/친구96/인입8 캐시 항목 상한을 제공한다. 실제 긴 이력·모바일 프레임·메모리·Production 지연은 미측정이다. G05/R01: 경로 이전과 아래 제거 목록만 반영하며 필수 영역 전체를 검증 완료로 올리지 않는다.
D06 기간·달력 구현 증거 (2026-09-10)
#1416, 앱 기준 a1d462a8(D05 #1506 포함), release/v0.18.0 반영 완료(앱 PR #1518, 5b16a162). 작업 기록과 필드·영향 계약을 연결한다. 위 생성 장부의 역사 집계 숫자를 전체 재검증 결과로 바꾸지 않는다.
| 영역·계층 | 소유·현행 변화 | 행동 증거 |
|---|---|---|
| stats/volume/calendar · SQL | 종목 기간·훈련 기간·달력 각 완성 행 assembler와 계산 writer 1개. writer 장부·schema/registry/model·forward migration 동기화 | 동일 canonical full 비교 66행 차이 0, 경계·삭제·복합·평균 검증 |
| stats · 작업/세대 경계 | D04 source 영향 + 완료된 D07 영향. PR/e1RM/checkpoint/applied writer는 소유하지 않음 | 미완료/세대 불일치 거부, 실제 worker 실패 후 기존 applied 유지·재시도 full 수렴 |
| stats/calendar · 테스트 | D06 DB 10건과 별도 writer 장부 검사, 출석·shared-set·시간·신원 pgTAP 재조준 | 작은 append에서 세 표 물리 쓰기 123→11, 이전 연도 ctid 유지, 원본 33,127행 업그레이드 보존 |
브라우저/viewport·staging/Production 검증은 이번 D06의 release 통합과 별개다. D07의 실제 listed 연결은 명시 adapter를 교체하는 계약이며 D06의 새 선행이 아니다.
D07 순차 계산 구현 증거 (2026-09-10)
#1417, 앱 PR #1522 / e2833dee로 release/v0.18.0 반영 완료. D05·D06·U03·D10 포함, 운영 미배포. 작업 기록, 체크포인트 계약에 구현·검증과 release 통합 상태를 기록한다. 위 역사 집계 수치는 변경하지 않는다.
| 영역·계층 | 소유·현행 변화 | 행동 증거 |
|---|---|---|
| stats/pr·strength·score · SQL | 검증된 일자 상태로 PR·e1RM·최대반복수·점수 suffix 재생. full/fallback은 같은 정책 엔진 | 과거 full SQL 5개와 비교, 같은 날·과거 변경·수동 기준·복합·null 상태 동치 |
| stats · D06 영향 | 재생 전후 실제 날짜·종목 변화, 공유 점수의 요청 밖 구성 종목 포함 | 실제 소비 함수 전달·무변경 빈 목록·수동 기준 영향·불완전 결과 거부 |
| stats · 세대/발행 | 일자 캐시 1개 표 추가, 계산 중 비공개·종류별 seed 세대·원자 발행 | 손상·정책/출처/세대 불일치 full 수렴, 대용량 발행·취소 보존, 원본 33,127행 업그레이드 보존 |
| stats · 비용 | 최신 반복수 4세트의 관측 쓰기 범위 축소 | DELETE/INSERT/UPDATE 240/244/488→0/4/8. 과거 수정 전체 시간 1,527→2,326ms 증가도 함께 기록 |
별도 D07/D06 DB 레인을 Precheck와 승격 full CI의 DB 검사에 연결한다. 브라우저·승격 full CI·staging/Production 검증은 이번 release 통합의 완료 근거에 포함하지 않는다.
U03 Desktop editor·intrinsic layout 증거 (2026-09-10)
#1421, 앱 PR #1520 · c1af78e8 release/v0.18.0 통합. Production 미반영. 작업 기록. 기존 생성 장부의 전체 영역 검증 상태·역사 집계를 바꾸지 않는다.
| 영역/계층 | 변경·제거 경로 | 증거 |
|---|---|---|
| workout/plan 화면 | DesktopWorkoutEditorAdapter/useDesktopEditorModel, 계획 A13·완료 A12 분리; backfill extra 상태/조립 제거 | desktopWorkoutEditorParity/Units 및 실제 U02 어댑터 비교 |
| workout 저장·복구 | Desktop save lifecycle, S08 snapshot publication·owner fence, S09 useRecoveryPanel typed 소비 | desktopWorkoutEditorLifecycle, completedWorkoutEditCutover, 실제 지연 저장/복구 browser |
| UI host/CSS | canvas width/height·zoom floor·resize handler 삭제, Grid/container·document scroll | tests/browser/u03: viewport/실제zoom/keyboard, root style mutation 13→0 |
| 입력 초안 | shared formatted/performance raw 왕복 재검증 | workoutEditorFormattedInputs, raw 2분+3.초 보존 |
공유 controller/save/cache·raw parser의 최소 보완은 U02 담당과 커밋 단위로 교환했다. U07은 selector 인계, U06/N01/R04는 미실행 native 조합을 소비한다. 관리자 UI는 독립 저장소이므로 U03 앱 변경에 포함하지 않는다.
U02 — 모바일 운동·계획·복구 연결 증거 (2026-09-10)
#1420, 앱 PR #1523 · b0fa93ec가 release/v0.18.0에 반영됐다. Production 미반영. 작업 기록. 위 workout/plan의 모바일 입력 표면은 모바일 편집 연결 계약에 따라 A12/A13 typed view/command와 S08/A09 저장 수명으로 전환했다. RecoveryScreen은 S09 RecoveryPanelProps를 기존 recordsTool 스택에 연결한다. 이 행은 홈/프로필/리포트 등 다른 모바일 화면 전체를 완료로 바꾸지 않는다.
| 대상 | 현재 경계 | 증거 |
|---|---|---|
| 운동 입력·편집·완료 | mobileWorkoutEditor, mobileWorkoutFlow, mobileInputDraft | mobileWorkoutEditor, mobileEditorInputLifecycle, mobileWorkoutFlowLifecycle 단위 검사 |
| 계획 입력·저장 | mobilePlanEditor, A13 | tests/browser/u02/mobile.spec.mjs: raw/IME/0, kg/lb/%, 분:초/km, 복합, 추가/삭제/재정렬 |
| 초안·지연 응답 | S08 IndexedDB 및 A09 저장 수명 | 실제 모바일 binding으로 새로고침/취소, queued 완료 재진입 뒤 늦은 영수증 |
| 보관·복구 | S09 owner runtime + typed 화면 | 목록/미리보기/확인/충돌 재확인/완료, 320/390/430px 검사 |
검증한 브라우저는 Chromium이며 서버 응답은 통제된 fixture다. Production 쓰기나 native OS 키보드/뒤로가기 전체를 검증했다고 집계하지 않는다. 배포 여부는 앱 PR/작업 기록으로 확인한다.
D11 — 통계 계산·세대 게시 통합 증거 (2026-09-10)
#1422, 앱 PR #1547 · d058cbb7가 release/v0.18.0에 반영됐다. Production 미배포. 작업 기록에서 오너 지시의 추가 precheck 생략·개별 검사·Merge Check·병합 상태를 확인한다. 이 절은 D11 소유 경계의 증거이며 G05 전체 영역의 완료 상태를 바꾸지 않는다.
| 대상 | 현재 경계 | 증거 |
|---|---|---|
| 단계 계산·게시 | D05 → D07 → D06 → snapshot, 공통 engine/publisher. 18개 출력·owner/source/policy/anchor/generation 완료 게이트 | D11 실제 DB의 누락·stale·원자성·실패 backoff 검사 |
| 변경 행 게시 | 계산 행의 출처와 owner 게시 세대 분리, 요약 membership으로 최신·직전 조회 | 안정된 동일 원본의 재사용 16표 I/U/D 0·전체 JSON/ctid 보존, 실제 수정/삭제의 무관 15표 행 보존 |
| full/부분 동치 | 동일 canonical ID·정책·anchor, 실제 full/증분 계산·게시 후 shadow rollback | 12개 원본 상태·11개 실제 incremental, 수치/논리 키/PR 근거/4종 DTO 차이 0·외부 비노출 |
| 이관·첫 계산 | full 기본, owner 첫 full, 구 processing/failed/pending scope·attempts 보존 | 실제 migration 이관·중단·재실행, populated 원본 33,127행 보존 |
| v5/A06/A10/A11 | 저장/조회 공개 서명은 adapter, requested/applied/stale 의미 유지 | 기존 영수증·동시 저장·DTO·freshness 회귀와 660세션 수렴 검사 |
Production cohort 설정·배포·승격 full CI는 R05/R06에서 확인한다. 하위 계산 함수의 privileged 서명은 남아 있으며 활성 worker·유지보수 진입점이 공통 orchestration을 사용한다.
A15 기능별 binding 증거 (2026-09-10)
#1531의 실제 feature/화면/route 소유와 실행 증거는 적용 기록 및 통합 계약 §10에 있다. 실제 206필드 공용 context를 제거했고 신규 미분류 65경로를 앱 실행 목록에 등록했다. 생성 절의 역사 수치·영역 전체 판정은 바꾸지 않았다. runtime 1벌과 feature 구독/해제를 보존하며 A16/U05/R01의 잔여 경계를 연결한다. 앱 PR #1550의 merge 290eadb9가 release/v0.18.0에 포함됨을 확인했다. precheck 3,579 pass/0 fail/88 조건부 skip과 Merge Check 성공을 확인했으며 Production 검증 완료로 올리지 않는다.
D14 — 세션 원본 변경 행 저장 증거 (2026-09-10)
#1533, 앱 PR #1551 · 576dae9b로 release/v0.18.0에 반영됐다. Production 미배포. 저장 계약, 작업 기록·원시 지표. 이 절은 D14 소유 경계의 구현 증거이며 G05 전체 검증이나 R01/R04/R05 완료로 집계하지 않는다.
| 대상 | 현재 경계·제거한 비용 | 행동 증거 |
|---|---|---|
| 세션 원본 writer | typed 후보의 정규화 후 실제 변경만 UPDATE. 무조건 +10000 위치 이동 제거 | 메모/동일 내용 자식 UPDATE 21→0, 무게 한 칸 21→1. 26개 시나리오의 ID별 DML·미변경 JSON/ctid·출처 보존 |
| 단위·파생 계산 | 트리거와 writer가 같은 typed core 사용, 실제 영향 자식만 재투영 | 반올림·null/누락·숨긴 원본·체중/배율·복합 동치. 기존 성공 23개는 과거 writer 최종 값과 동일 |
| 위치·실패·복원 | 실제 이동 행만 빈 양의 위치로 먼저 이동, 원래 검증/보호/영수증/세대 유지 | 앞 삽입/큰 위치값 3개 기존 실패→성공. 중간 실패 전체 롤백·stale/owner/ID/인입 read-only·replay·복원 후 편집 |
| 이관·필수 게이트 | 함수 migration 2개, 새 원본 열·데이터 일괄 수정 없음. 새 D14 DB 검사를 precheck/승격 DB 레인에 연결 | populated 8,854원본 보존·중단/재실행. precheck 3,572 pass·pgTAP 143파일/2,825 assert·큰 이력 수렴 통과, Merge Check 성공 |
R01은 활성 v5 writer/trigger 경계와 남은 전체 payload 검증을, R04는 고정 fixture의 전후 DML/WAL/시간을 전체 workload 비용과 구분해 소비한다. R05는 두 함수 migration의 populated 증거를 실제 전체 release upgrade와 결합한다. D11의 계산·게시와 완료 저장 enqueue는 이 변경에서 생략하지 않았다.