Barbelic 문서 인덱스
docs/ 전체의 진입 페이지다. 목적별로 어떤 문서를 읽어야 하는지부터 찾고, 전부 읽으려 하지 않는다. 문서를 추가·이동·아카이브할 때는 이 인덱스도 같은 PR에서 갱신한다.
모든 작업의 착수·재개 전: 설계·작업 완료 원칙을 먼저 읽는다. SOLID 다섯 원칙, 대량 처리의 한계·정확성, 요청 전체를 완료했는지 대조하는 기준이다.
- ⚙ 표시는 분리 전 문서 문자열 검사 대상이었다는 역사 표기다. #1463 이후 앱 CI는 문서 원문에 의존하지 않는다. 실제 정책 변경은 앱 코드·동작 검사와 이 저장소의 문서를 함께 갱신한다.
- 에이전트 작업 규범의 최상위 요약은 루트
AGENTS.md다. 이 인덱스는 그 아래 상세 문서들의 지도다. - 이 트리는 독립 VitePress 사이트로 렌더링된다. Vercel Root Directory는 문서 저장소 루트다.
npm ci --prefix docs,npm run check,npm run build:docs로 검사·빌드한다. 관리자·앱 빌드를 실행하지 않는다. 사이트 설정은.vitepress/config.mts, 홈은index.md다. - 영어 문서의 한국어 번역본은
ko/에 있다 (원문과 같은 상대경로). 아래 표의 링크는 전부 원문을 가리키며, 번역본은 사이트 사이드바에서 열린다. 원문을 고치면 같은 PR에서ko/의 짝도 갱신한다.
처음 온 사람의 추천 경로
../AGENTS.md— 작업 규범 전체 요약 (역할 분리, 경계, 게이트)domain-service-boundaries.md— 코드 계층 경계session-hierarchy.md— 데이터 위계 (하루 > 세션 > 종목 > 세부 종목 > 세트 > 세부 세트; 정본은data/session-data-model.md)app-screen-rpc-contract.md— 화면이 데이터를 받는 방식
아키텍처와 데이터 흐름
| 문서 | 언제 읽나 |
|---|---|
domain-service-boundaries.md | 컨트롤러·서비스·도메인 코드를 수정하거나 새 데이터 경로를 추가하기 전. barbelicApi → domains → repository 계층과 금지 import 규칙 |
session-hierarchy.md | 세션/계획 데이터 구조, 세션 3상태(completed/missed/planned), 다섯 층 테이블(2026-09-04 이슈 #1215 개정). 정본 데이터 모델은 data/session-data-model.md |
data-loading-strategy.md | 부트스트랩·화면별 로딩 경로를 바꿀 때. "summary 우선 + detail on demand" 원칙은 현행, "현재 문제"/"구현 순서" 절은 완료된 과거 기록 |
calendar-read-model-architecture.md | 달력 월/일 조회, 파생 캐시 무효화, 클라이언트 캐시(stale 기준·상한)를 다룰 때 |
observability-logging.md | 장애 진단, 클라이언트 에러 적재(record_client_error_event), 로그에 넣으면 안 되는 것 확인 |
v0-18-0-coverage-ledger.md | v0.18.0 동안 새 파일·새 진입점(API 핸들러·Edge 함수·워크플로·cron 잡)을 만들거나 공용 자원(공용 파일·DB object·CSS scope·native bridge)의 계약을 바꾸기 전. 영역 25×계층 20 장부(생성), 소유권 표, 계약 변경 통지 절차, R01/R05 종료 검사 node scripts/architecture/check-coverage-inventory.mjs --strict |
v0-18-0-layer-dependency-table.md | v0.18.0 동안 새 import 를 추가하거나 파일을 옮기기 전. 계층 10개의 허용/금지 import 와 지키는 검사(frontendImportBoundaries·contractsImportBoundaries), DB 행 → DTO → 화면 모델 변환 지점 3곳의 소유자, DB 행 타입 import 기준선 3파일, 새 조회 라이브러리 미도입(ADR-5) 근거 |
owner-auth-connectivity-lifecycle.md | 계정 전환·로그아웃·만료·삭제 때 "누가 세대를 세고 어떤 순서로 정리하며 늦은 응답을 누가 거르는가". OwnerRuntime(세대·취소 신호·자원 등록)·AuthSessionRuntime·ConnectivityRuntime host 의 책임, 떠나는 순서(보존 → 폐기 → 무효화 → 새 세트), 세 사건 보존 정책, 변환 어댑터 제거 조건, A08 인계 지점 (이슈 #1335) |
DB·쓰기 계약
| 문서 | 언제 읽나 |
|---|---|
session-data-model.md | 운동 기록 다섯 층 데이터 모델 정본(이슈 #1215, 2026-09-04) — 용어·테이블 대응표·단수 규칙·세션 종류·세는 규칙·저장 계약 v5 이름 |
rpc-catalog.md | DB 함수 전수 카탈로그(스냅샷). 어떤 RPC가 있는지 훑을 때 — 계약의 정본은 아래 문서들과 schema.sql |
workout-recovery-receipt-contract.md | 저장 여부가 불명확한 요청의 owner 전용 immutable receipt 조회·권한·불변성 계약 |
⚙ app-screen-rpc-contract.md | 화면 RPC 추가·변경 전 필수. JSONB 응답 계약·상한·금지 필드. 테스트 2종이 원문 검증 |
⚙ measured-pr-state-events.md | 실측 PR 이벤트/상태 투영, 온보딩 기준선, replay 정정 규칙 |
⚙ exercise-identity-hard-cutover.md | 종목 UUID 단일 식별자 결정(ADR). slug/별칭 우회 금지의 근거. 의미론 정본은 policies/exercise-model/ |
⚙ brid.md | BRID(Barbelic Resource ID) 통일 식별 문자열 명세 — 문법·lineage·UUID 파생·동결 경계. 종목 정체성을 새로 발급하는 모든 작업의 정본 |
exercise-naming.md | 종목 표시명·작명 오너 결정 4건(음차 사전 훅·승격 제안-승인·커스텀 가드·name_en 하이픈). 이름은 식별자가 아니다 — 정체성은 brid.md |
⚙ stats-refresh-jobs.md | 통계 갱신 큐·워커·Cron, PR overview snapshot 세대 계약 |
stats-refresh-dirty-events.md | 어떤 쓰기가 통계를 dirty로 만드는지 — 이벤트 11종과 payload 계약 |
import-pipeline.md | 외부 인입의 현행 형상(4대 불변식: 단일 오디언스·일회성·read-only·스토리지 소유권)과 오너 수동 런북 2건(전량 제거·재인입). 인입 데이터를 지우거나 다시 넣을 때 |
wodup-import-async-jobs.md | WodUp 가져오기 비동기 job 흐름(업로드→상태 기계 RPC→enqueue→202→워커→폴링), 일회성 게이트와 status 계약, Edge Function 경계 |
onboarding-data-model.md | 온보딩 상태 필드, 닉네임 정책, 약관 동의 버전, 온보딩 RPC 4종 |
workout-draft-protection.md | 운동 초안 자동저장·복원(소유자 스코프, 7일 보존). ⚠ "v3" 서술은 구식 — 실제 DRAFT_STORAGE_VERSION=4, DB v6 |
supabase-migration-strategy.md | DB 마이그레이션 추가 규칙(idempotent DDL·권한·RPC). 중반의 baseline 복구 로그는 완료된 기록 |
sql-definitions.md | SQL 도메인 원천 정본(D03, #1283) — supabase/definitions/<도메인>/**(객체 하나 = 파일 하나, 덤프 형태 그대로)·rules.json 도메인 분류·registry.json·층 규칙(door → engine → core)과 예외 목록·sql:extract/sql:check/sql:candidate 절차·소유 분할. 원천 == 스냅샷은 npm test 가 문장 단위로 단언 |
populated-db-upgrade.md | 데이터가 있는 DB 의 migration·잠금·backfill 안전성 정본(D13, #1287) — 문장별 위험 분류(잠금·재작성·스캔·WAL·재실행·공존)와 -- migration-risk: 헤더, populated upgrade harness(db:upgrade: 직전 릴리스 + fixture → 파일별 시간·WAL·잠금 대기·옛 앱 프로브·중단/재실행·사실 digest·공존 diff → -- upgrade-evidence:), 배치 백필 primitive(db:backfill), 게이트 연결·예산·공존 지원 조건·forward repair·R05 리허설 템플릿 |
v0171-projection-rollout.md | v0.17.1 첫 반복수 투영의 CLI 실행·고정 manifest·설정 격리·실제 잠금 및 중단/재개 검증 |
db-model-ledger.md | DB object 장부 정본(D12, #1328) — public 표 77·뷰 3 전부의 도메인·등급(fact/projection/reference/system)·owner 연결·PK/FK/UNIQUE/CHECK·인덱스·RLS/정책·트리거·작성자·읽는 곳을 schema.sql 에서 기계로 뽑고(db-objects.json), 보존·삭제·결론·상태는 정책 파일(db-objects-policy.json)에 사람이 적는다. 중복 인덱스·참조 열 인덱스 없는 FK·RLS 판정을 npm test 가 고정 |
⚙ supabase-type-strategy.md | 프론트가 읽는 table row·RPC의 수동 최소 타입 규칙, ScreenRpcPayloadMap |
admin-health-report.md | 관리자 운영 점검 RPC와 8개 헬스 체크 항목, 배포 버전 프로브 |
rpe-performed-intensity.md | RPE 입력(정본 왕복)과 세트 스코어(구 수행 강도: 세트 추정 1RM ÷ 세션 전 최근 수행 1RM × 10, 반복수판은 추정 최대 반복수 ÷ 최근 수행 최대 반복수)의 2층 분리 — 최근 수행 1RM 갱신 규칙 7개·상한·자리수·저장 답장 동봉 (이슈 #885 → #1164) |
법률문서와 운영 안내
| 문서 | 언제 읽나 |
|---|---|
| 가입 법률문서 검토와 부분 반영 | v0.17.1 운영자·책임자·문의처·팔로우 공개 안내의 적용 범위와 전체 v5 문안 활성화 전 남은 작업. 전체 검토 문서는 저장소에서만 보관하며 가입 동의 대상으로 게시하지 않음 |
| 유료 플랜 법률문서 검토 | #1640 — 앱 내 결제만(D1). 약관 v6(제5조·제5조의2·제5조의3)·처리방침 v6(구독·결제 정보, 앱 마켓 결제 처리자, 거래 기록 5년)를 2026-09-15 게시(시행 2026-10-15). 검토본·결제 전 고지문 초안 보관 |
| 출시판 법률문서 v1 대조표 | #1640 — 출시 전 초안 v1~v6를 이용약관 v1·처리방침 v1 한 판으로 통합(유료 플랜·사업자 표시·전화·호스팅 제공자·분쟁 처리 포함). 전자상거래법·개인정보 보호법 제30조·약관규제법·앱 마켓 정책 항목별 대조, 사람이 판단할 것 4건, 앱 등록 때 같이 바꿀 곳 |
제품 정책 — policies/
통계·원천 사실의 의미를 코드와 독립적으로 고정한 버전 관리 정책. 사람용 README + 기계용 policy.json + 불변 스냅샷 + changelog가 한 세트이며 npm run check가 위반을 막는다. 계산 의미를 바꾸려면 policies/README.md의 절차부터.
| 패밀리 | 내용 |
|---|---|
e1rm/ | 추정 1RM 계산식·RIR 표·confidence 등급. 가장 강하게 시행됨(생성 스크립트+SQL 계약 테스트) |
exercise-model/ | 종목 정체성/연속 동작 세트/표시 묶음의 목표 모델 + 구현 격차 감사표 (의도적으로 목표≠현재) |
max-reps/ | 맨몸/횟수 종목의 추정 최대 반복수 산출 규칙 |
set-purpose/ | 세트 목적(지구력/비대/스트렝스) 분류 — UI까지 가장 넓게 소비되는 정책 |
wodup-replay/ | 폐기(2026-08-21) — 일회성 인입·read-only 전환으로 replay 상황 소멸. 대체 규범은 data/import-pipeline.md, 문서·스냅샷은 동결 역사 |
화면 props 계약 — contracts/
Claude Design(순수 프레젠테이션)과 Codex(컨테이너·영속화) 사이의 props-in/콜백-out 경계. 화면을 고치기 전에 해당 계약부터 확인한다.
| 문서 | 화면 |
|---|---|
⚙ desktop-screens-props.md | 데스크톱 전 화면 12섹션 마스터 (계약 테스트 연결) |
ui-primitives-props.md | U01 v1 — 공통 버튼·입력·다이얼로그·상태·저장 단계의 props·접근성 계약 |
ui-visual-foundation.md | U01 v1 — semantic token·CSS layer/scope·overlay·예외·후속 소유권 |
session-screen-props.md | 일지 탭 달력 + SessionFull 타입 정본. ⚠ Component 절 경로 표기는 구식, 계약은 유효 |
workout-screen-props.md | 운동 플로우 — 진행 중 드래프트는 전부 UI-local. ⚠ 경로 표기 구식, 계약 유효 |
⚙ records-props.md | 종목 상세 + PR 도구 2종, hasRecords 빈 상태 판정 |
bottom-chrome-clearance.md | 하단 크롬(탭바·바·도크) 존재·높이는 채널 하나, 스크롤 컨테이너 바닥 여백은 유도식 하나 — 손 여백 금지·도달 게이트 (이슈 #1250) |
paid-plan-consent.md | #1640 — 유료 플랜 최소 계약: 결제 버튼 위 고지 한 화면(가격·기간·자동 갱신·해지·약관 링크, 확인 체크)과 설정의 구독 관리 링크. 기록은 구매 기록에 약관 버전·확인 시각 두 열. 별도 표·서버 문 없음(오너 지시 "꼭 필요한 것만") |
navigation-stack.md | 깊이 화면의 열림 상태는 화면 스택 하나 — push/pop/unwind, 뒤로가기 4경로 = 같은 pop, 탭바 = 스택 초기화, 교차 탭 push, "열기 = 적재" (이슈 #1393) |
⚙ completed-session-write-source.md | 완료 세션 수정 저장의 쓰기 원천 — 개정번호·줄 번호표는 서버 응답 하나의 사본에서, writeSource 꼬리표('detail'/'receipt'/'display'), 영수증 children 채택 (이슈 #1143) |
v0-18-0-adr.md | v0.18.0 ADR — 보존하는 제품 정책 P1~P10(쓰기 capability·수치·identity·저장 UX·충돌 기본·복구 UX·초안 TTL·사본·원본 불변·권한)과 바꾸는 기술 계약 5종(outbox 행별 원자 전이·claim·fence / typed 경계 / 사본+명시 복구 / 통계 단일 작성자·generation / 기존 store typed 완성), 적용 시점·구형 writer 공존 조건, 쓰기 파이프라인 §3·§11 개정 (이슈 #1279 G01) |
v0-18-0-domain-contracts.md | v0.18.0 도메인 계약 — 브랜드 식별자(서버 id·멱등 키·임시 키)·달력 날짜/절대 시각·단위 정밀도·입력 중 상태 union, 명령/PreparedMutation/영수증/실패 분류/충돌 사본, 저장 단계 3+1(기기 보관·서버 확정·통계 반영·결과 미상), owner 세대·조회 스냅샷(표시용 사본은 쓰기 원천 불가)·통계 세대, 명령별 online/durable 정책표, feature 별 좁은 port 16·runtime port 4, 저장물 형식·버전 decoder, 계약 소유자 표·DTO 확장 절차. 코드 src/react/contracts/** (이슈 #1282 G03) |
⚙ stats-projection-dag.md | 통계 투영 계산 DAG·단일 작성자 계약 — 현행 worker 10단계 입력·출력·잠금, 표 20개의 현재/목표 작성자·논리 키·비교 제외 열(기계 판독 장부 supabase/contracts/stats-projection-writers.json + schema.sql 정적 분석 검사), 목표 6단계·작성자 14·단계 간 DTO, 화면 RPC 가 읽는 투영/원본 표, 동치 판정 정의 (이슈 #1286 D01) |
⚙ stats-projection-policy.md | 통계 투영 정책·세대 계약 — 정책 9종 id@version·정본·DB 고정·행에 새겨지는 곳, 반올림 자리(e1RM 저장은 1kg), null/0 구분, 같은 날·동률 규칙, 세대 규칙 G-1~G-8·control 불변식, 비교 제외 사유 7종, 정책 불변식 16, 정책 문장 ↔ 근거 함수 ↔ 기존 테스트 매핑 (이슈 #1286 D01) |
⚙ completed-workout-write-pipeline.md | 완료 기록 저장·수정·삭제의 한 갈래 — 대기열 먼저 적재·즉시 반영·즉시 전송·답장 처리, 행 상태 4종(대기·전송 중·보류·격리), 동작별 기다림 정책표, 합치기·실패 표시·여러 탭 규칙. 2026-07-30 workout-write-path.md를 대체 (이슈 #1199) |
session-child-delta-write.md | D14 — 정규화한 실제 자식 변경만 저장, 순서·원본 이력·revision·영수증·통계 세대 보존 |
⚙ record-metric.md | 종목 대표 기록 지표 — 필수 입력 조합 → 1RM·최고 반복수·최고 버티기·거리별 최단 시간, PR은 실측만 (이슈 #1100) |
⚙ user-fact-immutability.md | 유저 기록 원본 불변 원칙 P0 — 컬럼 등급(원본/투영/시스템)·원본은 유저 본인만·이력 필수·규칙 변경은 투영만·수리 티켓 (이슈 #1236, 계약 테스트 연결) |
⚙ app-role-privileges.md | 앱 계정(anon·authenticated) 권한 규칙 R1~R3 — 기본 권한 닫힘·표 권한은 RLS 정책에서 유도·함수는 RPC 문과 정책·제약 참조만, pgTAP 전수 검사(허용 목록 없음) (이슈 #1258·#1259) |
⚙ auth-account-api.md | 인증·계정·관리자 서버 API 계약 — Vercel 함수 4개(계정 삭제·관리자 열람 2·시험 관리자 로그인)의 입력·행위자·출력·오류·시간 제한, 계정 삭제 단계와 재개 지점(410 = 완료), 로그인·연결·네이티브 콜백 거래 대조·토큰 갱신·로그아웃 상태 전이, 로그아웃/만료/삭제 보존 정책 표, 인증 오류 분류·공개 오류 코드 (이슈 #1331 B01) |
report-props.md | 리포트 탭 A~F 섹션과 pending 스켈레톤 규약 |
day-summary-props.md | 하루 종합 화면과 집계 포함 규칙 |
feed-props.md | 피드 탭·소셜 시트 (팔로잉 RPC 미배선 상태 명시) |
group-props.md | 그룹 탭 — 목록·커피라운지·화이트보드·작성/만들기 (2026-08-26 신설, 배선 완료 상태 명시) |
onboarding-props.md | 온보딩 5스텝 플로우 |
setsearch-props.md | 세션 검색 탭(종목별 세트 조회) |
profile-screen-props.md | 내 정보 탭 — 프로필 카드·로그인 연결·데이터 도구 (2026-08-19 재작성, 공통 profile 형태 정의) |
logtable-props.md | 데스크톱 기록표 월/셀 RPC 규칙과 로딩 예산 |
native-bridge.md | 웹↔iOS/Android WebView 브리지 v1 메시지 프로토콜 |
render-invariants.md | 렌더 불변식 — 규칙 하나(상태는 오너 범위 스토어에, 화면은 자기 조각만 구독, 루트는 조립만)·계측 경계 id·입력 21종별 다시 그려도 되는 경계와 루트 재실행 허용 횟수·판정 규칙(러너→게이트)·완료 기준 (이슈 #1610) |
디자인 협업·릴리스 프로세스
| 문서 | 언제 읽나 |
|---|---|
design-codex-transfer-contract.md | Design 딜리버리 반입·배선 시 최우선 규범(2026-08-19 확정). 전달 채널에 한해 아래 두 문서보다 우선 |
claude-free-design-contract.md | Design↔Codex R&R, data-lg-* 마커 인벤토리의 정본 |
claude-handoff-rules.md | Design에 작업을 넘기고 받는 워크플로, 컨테이너 머지 규칙 |
release-process.md | 브랜치·CI·승격·배포 정본. 작업 → release → staging → main, 두 승격 full CI, 후보 고정·실패 복구·실제 설정 전환 여부 |
agent-shared-rules.md | Claude·Codex 어느 에이전트가 작업해도 똑같이 적용되는 오너 지시 요약 — 코딩 원칙, 이슈 절차(분석→계획→go, Phase 보고), 결정 요청 기준, 쉬운 말, 검증 명령(ci:precheck-local·큐 전용 ci:full-local·merge:request·ci:wait), 큐 밖 병합·보호 규칙 완화 금지, 다른 에이전트 PR 불간섭, 워크플로 이름, 기록 형식 (2026-09-09) |
release-landing-queue.md | release별 GitHub 대기열에서 self-hosted full CI·검증 commit 병합, 요청·실패 복구·Windows runner·권한/보호 적용 상태 |
stats-worker-runbook.md | 통계 worker(claim→compute→publish) 운영 — 예산 표 한 곳에서 바꾸기, 일시정지·재개, 시도 소진 잡 재개, 대기·실패·임대 상태 읽기 (D08 #1412) |
⚙ branch-workflow.md | 브랜치별 파일 소유권과 머지 게이트. 테스트가 소유권 규칙을 원문에서 읽음 |
⚙ brand-identity.md | 제품명 Barbelic·도메인·iOS 식별자의 정본. 소문자 강제 규칙과 브랜드 표기 검사 게이트는 2026-09-08 폐지 |
⚙ deployment-pipeline.md | DB 먼저 적용하는 배포 기술 절차와 전환 전 실제 연결. 새 브랜치 경로는 release-process.md. check:deployment가 원문 검증 |
v0-18-0-hq-operations.md | v0.18.0 운영 정본 — G01 기준선·62개 소유 역할, 담당자 요청과 Actions 자동 직렬 랜딩·staging 확인, 관리자 호환·Production 오너 승인, Ready·인계. main 보호 규칙 적용 이후 상태와 #1313의 HQ 상주·라벨 승인 폐지를 반영 |
품질 게이트 (CI가 막아설 때)
| 문서 | 대응하는 게이트 |
|---|---|
test-audit.md | check:test-manifest — 테스트 수정·삭제 신고제 |
test-baseline-inventory.md | 테스트 기준선 장부 — 비결정성 분류, 소스 모양 검사 전환/유지 목록, native·API·provider·CSS·브라우저 검사 자산(G05 장부 입력), 결정성·실패 주입·두 DB 연결·oracle 도구 명령 (이슈 #1280) |
⚙ typescript-migration-scope.md | check:ts-scope — TS 전환 경계·import 정책 (스크립트가 원문 검증) |
typescript-boundary-gate.md | check:ts-boundary-gate — suppression 금지·any 경계 인벤토리 |
performance-diagnostics.md | 성능·보존 진단 규격 — 저장 한 건을 클라·대기열·잡·세대·릴리스로 잇는 열쇠 7종, 릴리스 식별(주입 SHA 우선), 금지 필드, 채널 대응표 11행, 증거 JSON schema v1, 측정 경로 비용 규칙 (이슈 #1284 G04) |
performance-baseline.md | 성능·보존 기준선 — 기준 SHA 16b8e996 에서 잰 Production(읽기 전용 프로브)·샌드박스 6프로필(1·4·10년·기기 2대·owner 10·혼합 인입)·브라우저 cold/warm 숫자, 조건 표, 미측정·결함 표, 재실행 절차 (이슈 #1284 G04) |
performance-budgets.md | 릴리스 성능·보존 예산 — 항목 18개 상한(기준선 p95 × 배율), 증가 추세 허용, 과부하 회복 기준, 관찰 기간 7일, RPO/RTO 평가법(사본 존재 ≠ 달성), 변경 절차(넓히려면 오너 결정). 코드 RELEASE_PERFORMANCE_BUDGETS 와 대조 테스트 (이슈 #1284 G04) |
resource-budgets.md | 자원 예산 계약 — DB 연결 수·역할별 statement_timeout·cron 배치·Edge/Vercel 함수 한도·API 본문·인입 파일 크기 45항목을 실측/코드 상수/문서 인용/목표/미측정으로 구분. 코드 RELEASE_RESOURCE_CONTRACT 와 대조 테스트, Production 읽기 전용 프로브 증거 (이슈 #1332 B02) |
⚙ typescript-unused-gate.md | check:unused — unused 부채 ratchet |
eslint-hook-gate.md | check:lint — React Hooks lint baseline |
render-ledger-1610.md | 렌더 장부 — 화면·바인딩 70 · 조립 루트 갱신원 60 · 입력 21종별 팬아웃 기준선 · 세 빌드 같은 날 판정 (이슈 #1610 Phase 1) |
테스트·E2E
| 문서 | 언제 읽나 |
|---|---|
qa1-repository.md | 기존 Full CI 테스트의 QA1 이관, 앱·테스트 버전 고정, 실행용 파일 준비와 검사 결과 식별, 이관 상태 (#1591) |
test-case-quality-standards.md | 개별 CASE의 필수 품질 조건 15개, 증거가 없으면 거절하는 판정 방식, 정적·실행·집계 강제 명세와 실제 적용 상태 |
test-case-quality-scope-1478.md | 최신 결정 후 필수75건·1,125조건 적합, 와드업·관리자 전 계층 자동 검사 제외 |
test-case-quality-audit-1478.md | #1478 유저 실사용 시뮬레이션 57건·화면 정합성 22건의 15개 기준 판정, 개별 위반·미검증 근거와 기존 실행 결과 |
test-case-quality-audit-1478-v0179.md | 제외 전 v0.17.9 변경 후보79건·1,185조건의 소스/실행/대표 결함/정리 근거와 적합78건·미검증1건 판정 |
e2e-crud-roundtrip.md | CRUD 왕복·빈 계정 여정 E2E 실행법, 운영 post-deploy smoke 운영 |
browser-full-stack-e2e.md | 브라우저 풀스택 CASE 실행 프로파일 3종, 새 CASE 추가 9단계 |
e2e-master-plan.md | E2E 마스터플랜 — 핵심 UX·복구·성능·실기기·CI·출시 기준과 기존 시스템 정비 (계획) |
e2e-system-renovation-plan.md | 기존 CASE 39개·공통 시스템 19항목의 유지·수리·보완·공통화·이동·퇴역 계획 |
번호 붙은 행동 케이스(CASE-001~)의 정본은 루트 /error-cases/다. (과거 docs/error-cases/ 포인터는 archive/error-cases/로 이동.)
iOS·Android·인증
| 문서 | 언제 읽나 |
|---|---|
ios-setup.md | iOS 셸 빌드·실기기 검증 runbook |
app-store-submission.md | App Store 제출 준비물(#665 Phase 5·6) — 영문 심사 노트(SiwA 가입 안내·계정 삭제 경로·UGC 신고/차단 경로·4.2 네이티브 통합 소명), App Privacy 라벨 표(PrivacyInfo.xcprivacy와 동일), 연령 등급 답, 스크린샷·메타데이터, Mac 빌드·업로드 순서, 반려 시 대응 |
android-setup.md | Android 셸(Capacitor + Kotlin) 빌드·실기기 검증 runbook, iOS와 다른 점 |
android-release.md | Android 서명(업로드 키·Play App Signing)·AAB·Play Console 등록 runbook, 데이터 안전 답변, 스토어 설명 |
build-targets.md | 빌드·배포 대상 표 — web/관리자/docs/API/Edge/iOS/Android/Node 별 진입점·환경 값(공개/비밀)·읽는 코드·runtime·toolchain·버전 원천, 배포 대상 원천 deployment-targets.json 과 경계 검사(대상 없음·값 어긋남·비밀 유입 → 빌드 실패), 관리자·웹·서버·설치본 호환 표, Android release 빌드 실측·iOS 미실행 인계 (이슈 #1332 B02) |
social-auth.md | 소셜 로그인 provider 구조, 계정 연결, 출시 게이트 |
viewport-tiers.md | 뷰포트 계층 계약 — compact·phone(전폭, 상한 없음)·wide-touch(600)·narrow-pointer·pointer-mockup(390×844)·desktop(1913×1063 zoom) 6계층의 경계·소유 파일·검증 뷰포트, 호스트 바깥 var(--bg) 투명 함정, 안전영역 4변, 방향 잠금(D4), 새 기기 절차. viewportTiers.test.mjs가 문서 숫자 = 코드 상수를 잠근다 |
contracts/native-bridge.md | 웹↔iOS/Android 브리지 메시지 계약 |
제품
| 문서 | 언제 읽나 |
|---|---|
prd.md | 제품 요구사항(PRD) — 현재 구현에서 역추출한 스냅샷. 제품 전체 그림·기능 영역별 상태를 훑을 때 |
gamification-policy.md | 레벨 곡선·직업·9티어 컷의 정본 (gamificationPolicy.ts/volumeLevel.ts와 동행) |
작업 기록 — updates/
끝난 작업의 사후 기록. 무엇이 문제였고, 무엇을 어떻게 고쳤고, 그래서 무엇이 나아졌는지를 한 편에 담는다. 현행 규범은 아니지만 archive와 달리 인용해도 되는 사실 기록이다. 규범이 필요하면 여기서 가리키는 문서를 볼 것. 새 기록은 updates/README.md의 형식을 따른다 (머리 블록 → Phase 현황 → 1. 배경 / 2. 문제 제기 / 3. 해결 방안 / 4. 적용한 내용 / 5. 적용 결과 / 6. 향상된 것 / 남은 것, 사이드바·이 표 2곳 등록). 버그는 bug-report/README.md 형식으로.
| 문서 | 내용 |
|---|---|
2026-08-20-rpc-surface-cleanup.md | RPC 전수 감사 45건 처리 — 은퇴 함수 8종 드롭·기본 실행 권한 차단·카탈로그 지뢰 제거·운영 관측 회복·종목 드리프트 108행 정정. 마이그레이션 6건 Production 적용 |
2026-08-21-brid-identity-system.md | BRID 정체성 체계 구축 — 통일 식별 문자열 설계·발급 배선·전면 재발급·일회성 인입 전환의 전체 작업 기록 |
2026-08-21-debt-repayment.md | 오너 위임 부채 상환 — 자산 단일본화·클라이언트 키스페이스 개명·exhaustive-deps 소각·컨트롤러 분해 |
2026-08-21-baseline-squash-v2.md | 2차 베이스라인 스쿼시 — 마이그레이션 125개→한 벌, Production 장부 repair, 파리티 실측(diff 2/1,968), 내부 엔진 4종 service_role 구멍 상환, 드리프트 10건 목록화 |
2026-08-21-appcontroller-refactor.md | appController 리팩토링 — 1차 분해→(c) 군집 경계→(a) 스토어 확산, 4,123줄→1,856줄(-55%), 군집 컨트롤러 8 + 스토어/조율자 10, React-free 행동 테스트 44계약, 억제 14→11 |
2026-08-21-catalog-synonym-cutover.md | 카탈로그 synonym 컷오버 — 종목 이름 3층 트리(종목→synonym→교정 별칭) 전면 컷오버 Phase 0~3 + 후속 병합 6쌍·매핑 점검 2건, 마이그레이션 6건 Production 적용, exercises.aliases 은퇴, 정책 exercise-model 2.0.0 |
2026-08-21-exercise-catalog-curation.md | 오피셜 운동종목 정비 — WodUp 대조 확장(배치 1~3)·분류 축 병합(Phase 0~4, equipment→exercise_category 8값·와이어 키 개명)·기록 필드 전수 조사와 오너 결정 반영, 마이그레이션 11건 Production 적용 |
2026-08-21-social-login-rollout.md | 소셜 로그인 3종 완주 — 법률 v3 게시·동의 전환(마이그레이션 1건)·Google/Apple 콘솔·Supabase 활성화·gate 3종 전환 + 스모크 불변식 편입, Phase 5 실계정 발견 3건(미확인 Kakao identity 제거 엣지·iOS 연결 후 리셋 수정·Apple 이메일 가리기/자동 연결 규칙)과 rotation 운영 절차 |
2026-08-21-wodup-import-repair.md | wodup 인입 수리 — 유령 "처리 중"(#543)·실패 4연타 수리(synonym 바이트 상한·폴링 무대기 / 스테이징 O(n²) / row_id 인덱스·service_role 120s)·진행률 실제값, 08-22 오너 재인입 완주(620세션·8,054세트·오류 0), 후속 계측으로 "50초"의 진범(set-purpose O(n²), 38.5s→1.2s)과 실패 배치 스테이징 7일 보존 정책, 마이그레이션 6건 Production 적용 |
2026-08-22-fold-touch-viewport-dark-optout.md | 폴드·태블릿 터치 화면 수리(#583) — 데스크톱 루트 선택에 pointer: fine 조건(터치는 폭 무관 모바일 루트)·터치 넓은 화면 600px 컬럼·color-scheme: only light로 브라우저 강제 다크 opt-out, 폴드 5뷰포트·강제 다크 A/B 실측 |
2026-08-22-admin-page-docs-migration.md | 관리자 페이지 barbelic-docs 이관 — 독립 React 셸(/admin) 동봉(#551)·관리자 대리 인입(#560, 마이그레이션 1건)·카탈로그 정규화/Wodup 매핑 단방향/상세 라벨 정리(#569)·로드 실패 원인 표시(#571)·external placeholder owner 어댑터 수리(#575)·데스크톱 관리자 제거 Phase 3(#577) |
2026-08-22-stats-centralization.md | 통계 중앙화 — 전수 감사·오너 결정 D1~D6 → Phase 1~4-4(리포트 summary 전달·Epley 제거·합산 공식 1벌·읽기 경로 정리·죽은 프로젝션 3종 드롭·범위 합계 RPC·PR 상세 서버 필드·볼륨 레벨 DB 정책·근력 컷라인 사전 계산·출석 저장값·스트릭 제거), 마이그레이션 7건 Production 적용, 화면은 서버 값 없으면 비움(D1) |
2026-08-22-profile-feed-note-entries.md | 피드 자유 기록 카드 — 자유 기록만 있는 세션이 피드에서 "0kg · 0세트 · 0종목" 한 줄로만 보이던 문제: get_profile_feed 카드에 notes[] 추가(마이그레이션 20260821440000, 추가 전용) + 모바일·데스크톱 피드 카드가 제목·메모 앞 2줄을 표시 |
2026-08-22-plan-save-hotfix.md | 계획 저장 사고 수리 — 첫 실사용 저장이 밟은 잠복 결함 2건: 홈 계획 카드 source_ref 부재로 홈 차단(마이그레이션 20260821430000) + 생성 저장 로컬 카드 source 부재로 데스크톱 렌더 크래시(클라이언트 한 줄), pgTAP·행동 테스트로 봉인 |
2026-08-22-feed-friend-follow.md | 피드 친구 검색·팔로우 v1 — UI 계약만 있던 "친구 추가" 시트에 서버(user_follows + RPC 4종, 마이그레이션 20260821460000)와 컨테이너 배선(followingStore/followingController)을 처음 세움. 아이디 = 닉네임(display_name) 부분일치 검색, 팔로우/언팔로우 토글, pgTAP 22·행동 테스트 8 |
2026-08-23-profile-handle-friend-avatar.md | 프로필 아이디(@handle) 저장·검색 + 친구 프로필 사진 — 온보딩이 버리던 handle을 profiles.handle(유일·정규화, 마이그레이션 20260821470000)로 저장하고 내 정보 탭에서 설정/변경, 친구 검색이 아이디·닉네임 모두 매칭, profile-images 읽기 정책 + 서명 URL로 친구 행 사진 표시. pgTAP 20·행동 테스트 7 |
2026-08-23-following-feed.md | 팔로잉 포스트 — get_profile_feed가 본인 + 팔로우한 사용자의 완료 세션을 한 정렬로 싣고 친구 카드에 author(마이그레이션 20260821480000, 표시 함수는 팔로워 허용), 모바일·데스크톱 포스트 헤더가 친구 아바타/이름, 팔로우/언팔로우 직후 피드 재조회. pgTAP 19·행동 테스트 4 |
2026-08-23-feed-friend-report.md | 친구 리포트 — 피드 친구 포스트의 아이디/아바타 탭 → 그 친구의 리포트 페이지. get_following_volume_overview_v1(마이그레이션 20260821520000, 팔로우 게이트 뒤 sub 클레임 스왑으로 기존 get_volume_overview 체인 재사용), friendReportStore·히스토리 레이어·UiReportScreen 돌아가기 행. pgTAP 14·행동 테스트 6 |
2026-08-23-plan-adoption.md | 계획 반영(공유) v1 — 팔로우한 사람의 달력에서 계획을 골라 내 달력에 링크로 반영(planned_session_adoptions + RPC 3종, 마이그레이션 20260821490000), 읽기 전용(만든 사람만 수정·전파), 달력 월/일·홈·계획 상세에 plan_owner 합류, 그 계획으로 운동 시작 → 드래프트 복사본 → save_workout_v4 저장 시 본인 세션 + 반영 완료 처리. 클라이언트 데이터층(planAdoptionStore·어댑터·읽기 전용 가드·삭제=반영 취소)까지, UI 미배선. pgTAP 44·행동 테스트 15 |
2026-08-23-viewport-tiers.md | 화면(뷰포트) 대응 트랙 — iPhone 16/17 Pro Max(440px) 양옆 5px 거터 = .gym-app-device 430 상한 + 스코프 밖 var(--bg) 투명 함정. Phase 1: 폰 구간 상한 제거(전폭)·거터 배경을 데스크톱 호스트/목업 규칙으로 격리·계약 테스트 불변식, V1~V9 실측(오너 D1~D4) |
2026-08-23-android-app.md | Android 앱 트랙 — 조사·오너 결정 D1~D5(Capacitor+Kotlin 동등·조직 계정·Studio 설치·원격 origin·이미지 저장 2차) → Phase 0~4(#605·#610·#611·#612): 셸·브리지 v1 동등(WebMessageListener·Custom Tabs·Keystore)·시스템바/뒤로가기/키보드·서명 AAB + Play 런북. 에뮬레이터 CDP 프로브·Production 웹 실동작·full lane 검증, 오너 잔여(Play Console·실기기·계정 삭제·키스토어 백업), 함정 8건 |
2026-08-23-splash-ownership.md | 스플래시 소유권 — iOS 앱 부팅 화면 두 번 깜빡임: 스플래시 주체 셋(LaunchScreen·빈 WKWebView·웹)을 환경당 하나로. 셸 splashOwnerV1 → 웹 스플래시 비표시 + splashState: ready/stalled, iOS 부팅 커버(런치 화면 동일 뷰·재로드 공통·20초 타임아웃), 로그인 전환 스냅샷 커버 통합, 컨트롤러 중복 스플래시 제거 |
2026-08-24-render-granularity.md | 렌더 입자성 캠페인 — 조립 루트 한 곳에 몰린 스토어 구독을 화면으로 내려보냄. Phase 0 계측기(dev Profiler·3 시나리오) → 1 핫패스 격리(세트 입력당 루트 커밋 2→0) → 2 오너 스토어 세트(ownerStores·adoptOwnerStores, 생성 지점 12→1) → 3 WorkoutFlowBinding(renderCtx 11키 은퇴) → 4-1 토스트(1→0)·4-3 로그테이블(2→0) 바인딩. renderCtx 176→159, 오너 D1~D4, 달력은 별도 트랙. 통지 계약·핫 키 규칙·바인딩 템플릿 |
2026-08-24-calendar-render-structure.md | 달력 렌더 구조 정리 — Phase 1 calendarViewSelector(루트의 원천 분기 4·병합 2·폴백 1 → 결정 1 calendarSource, derived→bootstrap), 2 주/월 저널 선택 훅, 3 키별 발행(구조 공유·무변화 무통지) + 달 단위 memo 투영(바뀐 달만), 4 월 로딩 신호 맵 1개. 미적재 월 이동 커밋 시간 ≈300→200ms, 행동 계약 10, 디자인·동작 불변 |
2026-08-24-strengthlevel-full-catalog.md | Strength Level 전종목 근력 등급 — 프론트 스쿼트 등급 공백(기준표 12종목·RPC limit 16) → 290종목 재수집, 정규 종목 201 매핑(정확 일치·SL 공식 별칭)·76 신설·기준표 554행, get_pr_overview 기준표를 유저 관련 종목으로 한정(상한 288), 생성기·바인딩 정본·계약 테스트 (#631, 540000 Production) |
2026-08-24-exercise-region-shares.md | 종목 부위·기능 분류 완결 — 리포트 부위별/기능별 비중에서 빠지던 미분류 267종목(외부 164·커스텀 103) 전수 분류 + 두-주동근 132종목 부위 % 지분(딥스 가슴/팔 50/50·데드 하체/등 60/40 등), 부위 벡터 지분 가중 집계, create_custom_exercise 분류 파생 (#643, 580000 Production) |
2026-08-24-empty-session-exit.md | 빈 세션 종료 — 기록한 종목 0개면 세션 완료(요약) 화면·빈 세션 저장 없이 종료: 종목 0개=즉시 폐기+표면별 토스트(운동 진행을 종료합니다·기록 작성을 취소했습니다·계획 작성을 취소했습니다), 라이브 입력만 있고 기록 0개=확인 1회 뒤 폐기, mobileWorkoutExerciseRecorded 판정 단일화·discard cause 채널 (#649) |
2026-08-24-exercise-synonym-search.md | 종목 검색 synonym 계약 — 밀리터리 프레스 미검색(이슈 #673)에서 출발해 검색 계약 확정(합집합·synonym별 독립 행·default 무특권·alias 소유 귀속·BRID+synonymId 표기 보존) 후 전 표면 적용: 공용 엔진 + 데스크톱/모바일 피커 + 카탈로그 RPC v6(alias 16·64B, 상한 10, 680000) + planned_sets.synonym_id(710000) + 리포트/필터 6표면. Production 왕복 실증 (#690·#692·#694·#699·#710) |
2026-08-24-mobile-tab-render-restructure.md | 모바일 탭 렌더 개편 — 운동하기 탭 0.5~1초 지연(루트 전체 재렌더×memo 오염×홈 재마운트) → Phase 0 계측·1 profileProps 참조 안정화·2 탭 전환의 루트 탈출(정책 바인딩·activateFor*)·3 방문 탭 keep-alive 판(요소 정체성 bailout, :has() 게이트 한정)·4 프로필 사진 무소음 서명 실패 복구+onError 폴백. 운동하기 복귀 36.9→3.3ms·루트 커밋 1→0(dev 계측), 오너 D1~D3 (#653·#657, BUG-011·012) |
2026-08-24-motra-import.md | Motra 인입 트랙 — 1년치 export(331세션·세트 2,720) 인입: 판정 매니페스트·변환기(Phase 0~3, 팔로업 세션) + 관리자 "모트라 인입" 탭·import_motra_workouts_v1(Phase 4, #645 620000 Production). 유산소 시간 단독 세트·custom 5종 유저 실체화·read-only·one-shot, 실데이터 종단 검증 전 수치 일치 |
2026-08-24-composite-custom-exercise.md | 복합 빌더 커스텀 종목 등록 + 커스텀 중복 표시 제거 — 복합 빌더 안 등록 경로(정확 일치 없으면 등록 버튼·즐시 슬롯 선택, 생성·수정 양 경로) + 카탈로그·customs 병합점 id dedupe(서버 멱등이라 DB는 1행, 표시만 4중복) + 모바일 게이트 완화 (#682, 이슈 #674, BUG-015) |
2026-08-24-retire-session-condition.md | 운동 전후 컨디션 기능 전면 제거 — 폐기 기능의 유령 표시(세션 상세 타일·backfill 입력)와 '보통' 조작 기입(클라 8곳·save_workout_v4_engine coalesce·컬럼 default)을 UI·배관·데이터 세 층에서 종결: 읽기/쓰기/파생 파이프라인 삭제, 스냅샷 v3, 과거 '보통' 1,994행→0(그 외 값 보존), 부팅 질의 −1 (#686, 이슈 #668, 670000 Production) |
2026-08-24-error-observability.md | 에러 관측성 재설계 — 계획 수정 21일 무음(BUG-014 sourceRef 소실)에서 "문구가 그려졌다 = 기록됐다"까지: 수리+왕복 게이트(#680), client_contract_error kind·보고-1회 마커·reportedUserError 관문(660000, #684), 미보고 표면 54곳 전면 이관+직접 사용 금지 봉인(#693), 쓰기 관문 callMutationRpc 27곳·admin 실명·오기록 3건(#695), 왕복 하네스 8케이스·진입 fail-fast·계획 풀스택 e2e(#697), admin 에러 요약 24h/7d·신규 유형(690000, #698) + D5 별건 4건(#689·#700) + 후속 유령 "진행중 운동"(이슈 #705: BUG-020 초안 정리 no-op → operationId 펜스 #716, BUG-022 세션 date 이동 → Production 응급복구+부팅 낡은 봉투 폐기 #724, 실모듈 게이트 5케이스). 오너 D1~D6, 이슈 #664 |
2026-08-25-admin-exercise-target-muscles.md | 관리자 종목 정보 최신화 — 부위 2필드(primary_region+region_shares) → target_muscles 단일 정본(730000, 순서 배열·선두=주동·NOT NULL, 인입 미분류 누수 BUG-023 봉쇄) + 관리자 전체 종목을 유저 스코프 RPC에서 전량·전 컬럼 직접 읽기로 교체(1,070행, AdminExercise 어댑터), 상세 BRID·타겟 부위 %·기능, 목록 배지·검색·필터 (#720·#729, 이슈 #661) |
2026-08-25-account-deletion.md | 계정/데이터 삭제 — 스토어 출시 요건(Play 삭제 경로+웹 URL, App Store 5.1.1(v)) 해소: api/account/delete(본인 JWT 전용·확인 센티널·스토리지 3버킷 정리·비가역 맨 뒤) + 앱·웹 2단 확인 UI + Kakao unlink·Apple 재인증 revoke + /account/delete.html, CASE-017 UI 왕복·동적 잔존 스캔 pgTAP·Production 실주행 잔존 0 (#721·#727·#731·#732, 이슈 #663) |
2026-08-25-ugc-safety.md | UGC 안전 v1 — App Store 1.2 요건 0/5 → 5/5: profile_feed_can_view_v1 단일 게이트에 차단·정지 응집(740000, 우회 5 RPC 완전 필터 1회 재발행) + 신고 3경로·즉시 숨김·관리자 신고 큐(내리기 원본 불변·정지/해제) + 금칙어 서버 검사 + 약관 v4 무관용 조항·요구 버전 전환(760000), CASE-018 왕복 (#725·#735·#737·#738·#740, 이슈 #670) |
2026-08-25-percent-base-exercise.md | 타 종목 1RM 기준 세트 % — Jerk Dip+Rack Jerk 70%(C&J 기준) 표현 불가 → planned_sets.load_percent_base_exercise_id(750000, null=자기 종목·백필 0) provenance 영속 + 기준 1RM 선택을 복합 동작 한정에서 1RM 보유 전 종목 검색으로 일반화(데스크톱·모바일, 모바일 복합 % 신설), 스크럽 단일 관문·pgTAP 12단언·왕복 하네스, Production 프로브·Vercel 마커 실측 (#734, 이슈 #676) |
2026-08-25-ui-surface-migration.md | 화면 표현 전량 ui 이사 — 클로드 디자인 불가시 5계열(부팅·에러/유저 열람 오버레이/관리자 셸 chrome/셸 골격 DOM/정적 표면) → 코드 이사 4계열 + shell-frames.md 계약 1계열, 셸 골격을 ui 프레임 12종으로 추출(오너 D1(a))·keep-alive 계약 명문화, 탭 전환 계측 전→후 회귀 0 (#754·#755·#757·#759, 이슈 #753) |
2026-08-25-search-input-latency.md | 검색 입력 반응성 — synonym 배포 직후 입력 불가 버벅임에서 자모 단위 안정 검색까지: 사전 계산 접기·스페이스/엔터/100ms 렌더 게이트·60행 창·자모 분해(3계 합류)·공백 토큰 AND(어순 자유)·전 표면 확산, 키당 27→0.5~1.6ms·IME 중간 상태 번쩍임 0 (#717~#770, BUG-021, 이슈 #771) |
2026-08-25-feed-pull-refresh.md | 피드 당겨서 새로고침 — 최신 피드를 받을 앱 내 수단 0개 → 당김 제스처 1개: createPullRefreshGesture DOM 무의존 상태 기계 + DOM 직접 조작 훅(제스처 중 React 커밋 0), 기존 retryProfileFeed 재사용(서버 신설 0), feed-props.md onRefresh 계약·판정 테스트 8건, 실기기 확인 대기 (#776, 이슈 #774) |
2026-08-25-feed-comment-tabbar.md | 피드 댓글 입력창 소실 — iOS WKWebView 페인트 순서 역전(탭바가 스크림 위)이 입력 행을 지움 → 댓글 시트 열림 중 탭바 숨김(:has 게이트 1줄, 오너 D1=A)으로 겹침 자체 제거 + 겹침 게이트 2종(매 CI 계약·full-ci 기하 판정), #623 키보드 인셋 오진 정정, 실기기 확인 대기 (#779, BUG-026, 이슈 #775) |
2026-08-25-friend-scope-design-v76.md | 친구 프로필 스코프 — 친구 열람 리포트 1화면 스왑 → 4화면 스코프(랜딩·일지·리포트·피드)+FriendScopeBar 도크: 디자인 v76 반입(패키징 사고 상호 검증·#779 스테일 리버트 복원)+.fscope 판 전환 배선(기존 RPC만 재사용, 서버 신설 0), 스플래시→로그인 연속, 테스트 7건, 오너 실기기 확인 대기 (#785, 이슈 #784) |
2026-08-25-friend-scope-data-v1.md | 친구 스코프 데이터 v1 — 친구 랜딩 빈 상태 카드 3장 → 실데이터(종합 카드·티커·보유 기록 상위 보드): get_following_pr_overview_v1 클레임 스왑 래퍼 3례째 + friendScopeStore 통합(3곳 분산·타 기능 차용 → 1 스토어) + 리로드 전송 취소 소음 수리(CASE-010), pgTAP 13·테스트 1991, 오너 실기기 확인 대기 (#795, 이슈 #792) |
2026-08-25-friend-scope-data-v2.md | 친구 스코프 데이터 v2 — 레벨·바벨리지 0 고정(HOME_DASHBOARD 친구용 부재)·보드 임의 선정·피드 1개 → following_* 래퍼 3종(대시보드·즐겨찾기(오너 결정: 팔로워 공개)·프로필 피드=본인 글 전체) + 슬라이스 6종·피드 무한 스크롤, pgTAP 15·Production push 검증, 오너 실기기 확인 대기 (#807, 이슈 #803) |
2026-08-25-cardio-minsec-input.md | 유산소 세트 시간·거리 입력 — 초·m 단일 필드 → 종목별 분|초·km|m 토글(기본값=60초·1km 이상 기록 보유 시, unitOv 패턴) + [분]:[초] 분리 입력(콜론 고정·자동 0 없음·탭 시 전체 선택)·km 입력으로 3표면 배선, 옵션 행 필드 게이트(러닝에 무게 단위 비노출)·거리→시간 구분자 in(입력·표시행 공통, 단위 라벨과 글씨 통일), 저장은 durationSeconds·distanceMeters 정본 그대로·마커 유지, 회귀 10건, 종결(오너 실기기 확인 08-26) (#790·#793·#796·#804, 이슈 #788) |
2026-08-25-dock-safe-bottom.md | 운동 도크 하단 기하 — safe 소실(내려앉음) → 가산 → finish·리뷰 과부양 → 도크 기하 구조 계약(--dock-inset 단일 정본·빈 보정 마진 폐지) → 리뷰 고정 높이 폐지(계약 C2 확장: 고정 height로 총높이 흉내 금지, 입력창 플로우 48px·절대 앵커 소멸), 실측 finish 78→46·리뷰 198→169(둘 다 진행중과 동급)·브라우저 회귀 0, 정본=BUG-028+계약 주석, 종결(오너 실기기 확인 08-26) (#802·#808·#815, 이슈 #801) |
2026-08-26-groups-v1.md | 그룹(화이트보드·커피라운지) 신설 — delivery-20260826(v77) 반입(탭바 리포트→그룹·지면 순백 전환·홈→리포트 슬라이드)에서 백엔드 v1(20260821800000: 멤버십 단일 관문·canWrite·차단 존중)·컨테이너 배선(시작 바 프리필 exerciseId 정규화·멤버 딥링크·마커 11종)·Production push+프로브+Vercel 청크 실측까지, pgTAP 47·유닛 2004, 오너 실기기 확인 대기 (#823·#824·#825, 이슈 #822) |
2026-08-26-v78-composer-wiring.md | v78 반입·후속 배선 — 화이트보드 작성 = 계획 편집기(WfRecord planMode+picker 재사용)·%(기준 1RM) 센터 모달 반입에서, 서버 자유 기록 수용(20260826100000: kind:"note" 에코·세트 0 허용, Production push+프로브)·프런트 배선 ①~⑤(exerciseCatalog 직결·workout.css 동반·탭바 .tab-pane.off 가드·kind 왕복·uuid 가드)·나눔스퀘어라운드 셀프호스팅(B·EB, CDN @import 제거)·Vercel 마커 실측까지, pgTAP 13·유닛 3+계약 갱신, 오너 실기기 확인 대기 (#832~#835, 이슈 #831) |
2026-08-26-pct-base-e1rm-fallback.md | % 기준 1RM 폴백 — 실측 1RM만 보던 기준 조회에 오너 결정 D1(실측→추정 e1RM 최고값→기록 없음 팝업+kg 유지)을 공용 조회 함수 한 곳에 명문화(모바일·데스크톱·그룹 컴포저 상속), 슬림 투영 estimated1RM 동반·% 탭 상시 노출+클릭 게이트, 유닛 6·회귀 27·Vercel 마커 실측, 오너 실기기 확인 대기·#676 ad-hoc 교차 기준 축소는 오너 판단 대기 (#838, 이슈 #837) |
2026-08-26-groups-v2-interactions.md | 그룹 v2 상호작용 — v79 배송(delivery-20260826c 재싱크판) 반입에서 서버 전원 개방·공지 교체·보드 좋아요·완료 멤버 세션·그룹 스코프 세션 상세(sub 스왑)·사후 초대(20260826120000, Production 적용)·컨테이너 배선 ①~⑧(형제 렌더·세션 오버레이·종목 기록 뷰·초대 시트)까지, pgTAP 38 신설·전체 스위트 2026 테스트 0 실패, 오너 실기기 확인 대기 (#848·#849·#850, 이슈 #847) |
2026-08-27-chrome-geometry-ownership.md | 화면 크롬 기하 소유권 — 도크 4상태 항등(--dock-stage-h 스테이지, 164×4 실측)·탭바 height 토큰 소유·워드마크 단일 렌더러(UiBrandRow 9사이트)에서 크롬 상태 단일 채널(data-bottom-chrome + 높이 사상표)·클리어런스 유도식 1규칙·탭바 숨김 단채널화·통합 셸 프레임(D3=B)까지, 상설 기하 게이트 2겹(safe 0/34 실측 + 정적 계약·스위치 잠금)·훼손 시뮬 발화 확인·풀 CI×8, 종결(오너 확인 08-27, 이슈 닫음) (#858~#870, 이슈 #855) |
2026-08-27-desktop-cardio-minsec.md | 데스크톱 유산소 시간 [분]:[초] 입력 — 초 단일 필드 → 편집 옵션 분|초 세그(기본값=60초 이상 기록 보유 시 분)+콜론 고정 분·초 분리 입력(DkpMinSecInput, 자동 0 없음·탭 전체 선택), 확정 뷰 초 단일→mm:ss·거리→시간 in(세션 상세 표시 정본과 정합), 모바일 #788 포맷을 데스크톱 문법으로 재구현·저장 durationSeconds 정본 그대로·마커 유지, 회귀 6건·기하 실측, 종결(오너 실화면 확인 08-27) (#866, 이슈 #864) |
2026-08-27-group-board-done-skeleton.md | 화이트보드 완료 인원·날짜 이동 수리 — 완료 행·배지 세션 단위→사람 단위(gpDoneByMember, Production 프로브로 3행 2명 실측 확정), 날짜 전환 즉시 스켈레톤(이전 날짜 잔상 0초)+보드·완료 세션 RPC 독립 도착 표시+재진입 상시 재검증(swr), 아바타 서명 캐시·(그룹,날짜) 보드 캐시 30건, 신규 앵커 9건·전체 스위트 2051 pass, 오너 실기기 확인 대기 (#876, 이슈 #875, BUG-033) |
2026-08-27-day-detail-redesign.md | 하루 상세 재설계 — 일지 하루/주/월 상세를 타임 레일→세션 카드(카드 전체 진입·상태 칩)·8항→3항 스탯박스·세트 표기 피드/화이트보드 동일 축약(formatSetRuns)·날짜 헤더 스텝퍼로 재설계, 오버레이 내비 워드마크 행 통일(상단 44→15px), 리포트 레이더 세트 수 기준·상대 스케일, 그룹 3표면 좌→우 스와이프 뒤로가기, 커스텀 종목 관리 = 드로어 직결 독립 화면(진입 배선·마커·카피·CSS 로드 동반), 탭바 68→55(토큰 1곳 개정), 배송 zip이 상류 #872·#876을 되덮는 상태를 머지 전 감사로 차단(Production 무영향), 반입 직후 오너 지시로 하루 상세의 원 그래프(도넛 3종)·탑세트까지 주/월 범위 드로어 전용으로 축소(하루 = 3항 요약 + 세션 카드), 테스트 앵커 19건 이전(체중 태그 탑세트는 데스크톱 패널이 소유)·삭제 0·전체 스위트 2052 pass·Production 청크 마커 10종 실측, 오너 실기기 확인 대기 (#881·#883, delivery-20260827b) |
2026-08-29-report-hexagon-set-counts.md | 리포트 육각형 단위 중량 → 세트수 — 부위별·운동패턴별 레이더를 kg 비중(하체≫팔 왜곡)에서 세트 비중으로 전환: 서버 taxonomy_set_counts 정밀 벡터(20260828100000, 부위=target_muscles 지분 가중·패턴=전량, 동치 3층 검증)+클라 배선(축별 반올림)+중량 폴백 폐지(오너 지시 — sets 없으면 빈 그리드), Production payload·배포 청크 실측, 별건 = v81이 깨뜨린 풀 레인 전용 게이트 2종(CASE-004·dock-geometry 탭바 55) 재동조, 오너 실기기 확인 대기 (#893·#895, 이슈 #890) |
2026-08-29-session-brid-cutover.md | 세션 id BRID 체계 통합 — 무작위 uuid 이중 체계를 자연키 파생 단일 정체성으로: 계보 barbelic·external(오너 설계 D3) + 발급 트리거 단일 지점(20260829100000) + 전 2,006행 컷오버·참조 재작성·not null 봉인(20260829110000), Production 전문 드라이런·실측 완료, 오너 실기기 확인 08-29 — 종결 (#889·#897, 이슈 #879) |
2026-08-29-group-board-composite.md | 그룹 보드 복합종목 격하 수리 — 보드 저장 후 복합이 첫 구성 종목 일반 엔트리로 격하되던 왕복 소실(#831 kind·#837 pct_base와 같은 병, 3번째)을 4층+프리필 전면 배선으로 수리: 서버 검증기 composite?(2..5 구성)·세트 scheme?(동작별 반복) 수용+에코(20260829120000, 복합 이름 200자 완화)+컴포저 draft out·groupStore 왕복·프리필 복합 드래프트(전원 매칭 게이트)·GbSeq "10+10" 표기, 왕복 계약 테스트 6건 상주(note·%·composite 3부작) + CASE-020 e2e 번호 저니(#907, 레인 2연속 green), 같은 날 번호 선점 3회 재번호·Production 적용·청크 3곳 실측, 오너 실기기 확인 08-29 — 종결 (#891·#892·#907, 이슈 #888, BUG-034) |
2026-08-29-group-board-completion-lineage.md | 화이트보드 완료 BRID 기반 — 완료 판정을 "그날 아무 완료 세션"에서 "그 보드에서 시작해 완료한 세션만"으로 컷오버(오너 a안): 보드 프리필 드래프트의 source_ref를 group-board:<그룹>:<날짜>:<op>로 발급해 출처를 세션 BRID에 내장(brid.md 계보 규약 절)+읽기 RPC 계보 접두 매칭·보드 없는 날 빈 목록·세션 date 무관(20260829130000, DDL 0·엔진 무수정), 포이즌 필 드라이런 before=5 → after=0 실측·per-board 프로브(마블오후반 3→0·필앤주 1→0)·pgTAP 7 신설+38 계보 패치·배포 청크 마커 실측, 오너 실기기 확인 대기 (#908·#911, 이슈 #880·#875 묶음) |
2026-08-29-ui-v82-delivery.md | 디자인 배송 v82 — 세션 수정 복귀가 원래 보던 오버레이 스택(하루 상세 층 포함)으로 복원(sessionAsOverlay, PR 점프 복귀는 풀페이지 유지)·복귀 무애니(pg-restore·quiet 캡처)·세션 상세 스탯 3항·시간 수정 모달(영속화 어댑터 updateUiSessionTimes, duration 재계산)·일지 달력 완료 잉크/오늘 필 원, 헝크 감사 1:1·앵커 이전 0삭제·마커 4종, 오너 실기기 확인 대기 (#914, 이슈 #909) |
2026-08-29-day-detail-card-skeleton.md | 일지 하루 상세 세션 카드 로딩 성장 제거 — 하루 RPC 도착 전 카드가 헤더만 떴다가 커지던 레이아웃 점프를, 매퍼의 상세 대기 신호(_calendarDetailPending)+월 행 exercise_ids 실명 플레이스홀더+세트열 자리 셔머(pend-reveal 300ms)로 최종 높이 선확보: 실 CSS 레이어 맵 프로브 실측 +156px 점프 → 0(카드 307px 항등), 계약 테스트 5건 상주, 저장 직후 스칼라 보존 회귀는 폴백 범위 축소로 해소, 오너 실기기 확인 대기 (#913, 이슈 #905, BUG-036) |
2026-08-29-workout-draft-loss.md | 진행중 세션 소실(#887) — 오너 운동 2회 통째 소실 사고의 원인 판정(무계측+1슬롯 증거 인멸, 단일 확정 불가 자체가 구조적 결론: S1 선탭 봉쇄·S2 실값 오염·S3 저장소 계층)과 4층 봉인: 파기 대신 격리(보관함 5세대·7일)+계측 10종·hidden 즉시 저장·부팅 확인 팝업(이어서/삭제 소프트/닫기)·서버 임시 체크포인트(20260829140000, 유저 1행·TTL 3일·op 펜스), 재발 1회=원인 특정, Production db push·프로브·청크 실측, 오너 실기기 확인 대기 (#898·#906, 이슈 #887, BUG-037) |
2026-08-30-group-board-cardio-sets.md | 유산소·요가 종목 화이트보드 저장 수리 — reps 입력칸이 없는 프로필(시간/거리 전용)의 세트를 컴포저 reps>0 필터가 전멸시켜 sets:[] → 서버 22023으로 보드 전체 저장이 100% 실패하던 #831 명문화 미결(출시 감사 발견)을 2층 수리: 세트 필터를 planMode 추가 게이트와 동일식(exMeasures.some(mHasValue))으로 교체 + 보드 세트 계약에 duration_seconds/distance_meters 편입(20260830100000, 상한 = 세션 검증기 동일)+GbSeq 5000m in 30:00 표시+프리필 기록 프로필 동반+수정 재진입 catalog 재수화, 왕복 테스트 6건(관통 1건)+pgTAP 8건 상주(note·%·composite·cardio 4부작 완결), Production db push·배포 청크 고유 마커 실측, 종결(08-31 실기기 확인 게이트 폐지 — 이슈 #926 [반영완료] 닫음) (#935, 이슈 #926, BUG-040) |
2026-08-30-cardio-min-one-atom.md | 유산소 운동에서 측정단위를 1개만 입력해도 되도록 허용 — 08-30 실 사용자 완료 저장 7회 전멸 사고(원인 ①, BUG-041)의 수리: PR #646이 "4층 동시 완화"에서 빠뜨린 저장 직전 최종 검사 층이 공용 규칙(isCardioOnlyProfile)을 재사용하도록 수리(유산소=하나 이상·값 있을 때만 범위 검사, 신규·수정 동시 해소), 보존된 성근 draft 실물이 저장 경로 전체를 통과하는 것까지 실측 + 보드 완료 인원 뷰 세트 투영에 시간·거리 편입(20260830110000, #935가 "범위 밖"으로 남긴 잔여 구멍) + 오너 지시 e2e cardioMinOneField 5경로(계획/완료 신규·수정/진행중 체크포인트/보드 작성/보드 운동) CI 상주, 실경로 관통 테스트 RED→GREEN·Production db push·배포 청크 마커 실측, 성근 재저장 성공 실측(08-31, 세션 a4ff670b)·오너 확인 — 종결 (#944, 이슈 #936, BUG-041 해결) |
2026-08-31-limits-retune-938.md | 상한선 전면 재조정 — '서비스 전 단계' 전제(#252 명문)로 잡힌 한도가 저장 금지 규칙으로 굳어 08-30 실 사용자 계획 저장 8회 거부의 한 축이 된 것을 Phase 0~4로 전면 개정: 오너 결정 D1~D9(계획 240세트·완료 48/64·reps 2,000·휴식 3,600 절삭·검색 keyset 페이지네이션·즐겨찾기 분할 병합·기록방식 2 통일·월로그 900KB/카탈로그 4,096/볼륨 3MB 재예산) + 거부 시 원인 문구 4종 + 한도 정본 장부(limits-registry.md)·3층 드리프트 게이트 11건·여유폭 감사 스크립트 신설, 마이그레이션 4본(130000~160000) Production db push·배포 청크 마커 실측·pgTAP 실경로 23건, 오너 확인 완료·이슈 [반영완료] 닫음(08-31) (#952·#955, 이슈 #938) |
2026-08-31-record-input-logic-restructure.md | 기록 입력 구조 재설계 — 복합종목의 "무게 없는 세트 실행 에러"(#927) 분석이 드러낸 구조 병소를 오너 지시로 전면 전환: 복합종목을 측정단위 무관 임의 조합(parts 동작별 원자 묶음, "10회 + 30초")으로 확장하고 종목별 필수 입력 논리식(required_inputs 트리)을 정본화해 계획·라이브·보드·서버 검증이 한 식으로 판정, 카탈로그 v7 반출 + 관리자 편집 + 완료·보드 검증기 소비까지 3묶음(PR #956·#958·#959, 마이그레이션 170000·31100000·31110000) 랜딩, e2e CASE-021/022·pgTAP 38케이스, 오너 실기기 확인 완료·이슈 [반영완료] 종결 (이슈 #947, 소급은 #953) |
2026-08-31-checkpoint-ghost-revival.md | 체크포인트 유령 부활 수리 — 저장·삭제한 운동이 다음 부팅에 "진행중 운동" 팝업으로 부활하던 결함(#887 서버 백업의 60초 예약 타이머 미취소, 출시 전 감사 발견): 저장·삭제 시 예약 취소+삭제 순서 보장(PR #930) + 부팅 조회에서 이미 저장 완료된 운동의 백업 자동 소멸·오프라인 대기 큐 중복 차단(PR #933, 마이그레이션 20260831130000), 회귀 테스트 클라 4건+pgTAP 8건, Production 반영 실측, 오너 실기기 확인 대기 (이슈 #923, BUG-044) |
2026-08-31-board-custom-register.md | 보드 시작 시 없는 종목 자동 등록 — A의 커스텀 종목이 든 보드를 B가 "이 운동으로 시작"하면 그 종목만 빠지고 안내 한 줄만 뜨던 공유 공백(#831 정규화 후속 ⑤)을 오너 결정 D1~D3로 종결: 미매칭 이름을 같은 이름의 커스텀 종목으로 자동 등록(기록 항목은 보드 세트 값으로 추정 inferRecordingFieldsFromSets, 복합 구성 동작 포함, 별도 안내 없음)하고 세트까지 채워 시작 — 서버의 같은 이름 재등록=기존 행 반환으로 반복 시작 중복 생성 없음, 추정 단위 7케이스+소스 앵커 상주, 배포 청크 마커 실측, 종결(08-31 실기기 확인 게이트 폐지 — 이슈 #945 [반영완료] 닫음) (#949, 이슈 #945) |
2026-08-31-group-board-input-limits.md | 입력 상한·단위 보존 정비 — 보드 제목 41자+·% 이상값이 "입력값을 확인해 주세요"만 남기고 죽던 원인 미지목 실패 계열(#926 무늬)과 lb→kg 격하를 오너 확정 상한으로 소거: 제목 50자·자유기록 제목 50자·본문/메모 1000자(서버·입력칸 동시)+보드 용량 128KB·반복 0..2000(#938 정합)·% 입력 1~150 게이트+지정 문구·load_lb 왕복(20260831120000 — #947의 검증기 2중 재발행을 되덮는 자리라 재번호+최신 본문 재합성, 포스트체크에 이전 기능 생존 단언), react 5건+pgTAP 9건, Production db push·배포 마커 2종 실측, 종결(08-31 실기기 확인 게이트 폐지 — 이슈 #950 [반영완료] 닫음) (#951, 이슈 #950, BUG-043) |
2026-08-31-migration-landing-serialization.md | 마이그레이션 랜딩 직렬화 — 병렬 세션들의 번호 충돌 → 재번호 → CI 재실행 반복(8/20 2연속 선점, 8/21~22 사다리 실패, 8/31 하루 3회 재번호)으로 Actions 한도를 태우던 구조를 종결: 번호는 랜딩 직전 기계 확정(migrations:renumber 한 명령 — 파일명·자기 주석·접촉 파일 토큰·schema.sql 재생성·EXPECTED_LATEST_MIGRATION 동기화)+검사 로컬 조기화(migrations:check 수 초)+CI 오름차순 단언(MIGRATION_BASE_REF)+PC 전역 랜딩 잠금(landing:lock, 15분 침묵 죽음 판정·원자적 넘겨받기·인계 기록·머지 직전 verify)+pre-push 훅(꼬리 이하 번호 거부), 절차 정본 process/migration-landing.md, 픽스처 36단언 검증, 실전 병렬 랜딩 효과는 실측 대기 (#971, 이슈 #966) |
2026-08-31-admin-synonym-editor.md | 관리자 표기 편집 — "'숄더프레스' 검색에 바벨 숄더프레스가 안 나온다"(병합으로 별칭 강등 × 별칭 앞부분-일치 규칙의 교차 구멍)를 계기로 관리자 상세를 실제 표기 구조대로 개편: 표기 단위 카드(대표 배지·표기별 별칭)+검색 확인 상자(앱 검색 엔진 그대로 판정·원인 문구, diagnoseExerciseSynonymSearch)+표기 편집 6종(추가·이름 수정·대표 변경·삭제·별칭 편집·별칭→표기 원클릭 승격, 20260831140000 — 삭제는 기록/계획 참조 개수로 거부, 대표 변경은 종목명 이양까지 원자), 신규 테스트 17건+pgTAP 9건·Production 함수 실측, 승격 실행·'숄더프레스' 검색 HIT 실측, 종결(이슈 #963 [반영완료] 닫음) (#970, 이슈 #963, BUG-045) |
2026-08-31-feed-session-overlay.md | 피드 세션 상세 오버레이 — 피드 "자세히"가 바텀시트로 뜨던 것을 일지·그룹과 동일한 슬라이드 오버레이(우→좌 진입·좌→우 스와이프 퇴장·탭바 덮음, 탭 이동 없이 피드 안에서 독립)로 통일: 스와이프 판정 훅 useSlideBack lib 승격(3표면 공유)+수정 복귀 pg-restore, 홈탭의 8/11 비노출 피드 카드 잔존 코드(블록·배선·투영 키·CSS 5클래스·마커 2종) 전면 철거, 신규 계약 5건·전체 2,224건 통과, eslint는 Actions 결제 블로커로 미검증(오너 지시 admin 머지), 종결(이슈 #985 [반영완료] 닫음) (#989, 이슈 #985) |
2026-08-31-kg-display-rounding.md | kg 표기 최소단위 1kg — 일지 월 헤더 "총 62,667.86kg" 같은 소수 노출(체중 계수·lb 환산 유래)을 오너 D1 "무게의 최소단위는 무조건 1kg"(입력 원본 포함 예외 없음, 저장·합산은 원값)으로 전면 정리: 정본 헬퍼 kgDisplay.ts(roundKg·kgNum·unitNum — kg 단위만, 회·cal 통과)로 모바일 12·데스크톱 15·공용 3·매퍼 관통(roundPrValue 0.1→1kg), 신규 지점 방지 스윕 가드 상주(감사 누락 1지점 실적발), main 경계 게이트 오탐 파손(#996 주석 유래) 동반 원복, 2,229건 통과·eslint는 Actions 결제 블로커로 미검증(admin 머지), 종결(이슈 #994 [반영완료] 닫음) (#998, 이슈 #994) |
2026-08-31-tab-data-warming.md | 탭 첫 진입 데이터 워밍 — "캐시 없으면 탭 전환이 느리다"(일지 3왕복·그룹 1왕복·리포트 716kB~ 지연 로드, Production RPC 실측)를 코드 워밍과 짝인 유휴 데이터 선요청으로 종결: ready 후 유휴에 일지 이번달·오늘→그룹→볼륨 순차 선발사(모바일 전용·오너당 1회·실패 조용히·기존 래치가 중복 차단·일지 활성 중 생략), 원계획 Phase 2는 큐 우회 실측으로 기각·카탈로그는 D2 편입, 계약 6건·2,246건 통과, 종결(이슈 #1013 [반영완료], D2 지속 캐시는 후속 이슈) (#1014, 이슈 #1013) |
2026-08-31-boot-read-model-cache.md | 부팅 즉시 그리기 — 재부팅 간 지속 캐시(#1013 D2 후속): 홈 PR 섹션이 매 부팅 287kB 재수신 쉬머이던 것과 일지·그룹의 부팅~워밍 사이 콜드 구간을, 카탈로그 캐시 패턴 일반화(서버 원문 owner+슬롯 저장 → 다음 부팅에 같은 화면 어댑터로 재검증 시드, 계약 불일치·오염=자동 축출)로 종결 — PR 시드는 셸 스냅샷 재수화 단계 편입(보존 규칙 재사용·프리페치가 덮음), 일지=월 캐시 stale 시드, 그룹=ready 시드+래치 불변(refresh가 덮음), 볼륨(3MB)은 제외, 오너 전환 2지점 소거, 계약 5건·2,251건 통과, 종결(이슈 #1016 [반영완료] 닫음) (#1018, 이슈 #1016) |
2026-08-31-input-validation-guidance.md | 입력 필드 범위 검증·안내 문구 전면 정비 — 전 입력창(온보딩 포함) 125곳 전수 조사가 드러낸 관통 원인 2가지(원인 문구 전달 단절·"조용한 처리" 표준화)를 오너 결정 D1~D5로 Phase 1~5 정비: 1RM·신체 지표·관리자 폼 원인 코드+관문 ① 경유(저장 성공 시에만 화면 닫기), 모바일 온보딩 검증 공유 정본화(키 1750 즉시 안내·아이디 오류 단계 복귀·닉네임 24자), 무효 시각("99:99"·13시/75분) 통과·소실 수리+자정 넘김 안내+PR 날짜 UTC 수리, 세트 64/240·종목 48 추가 시점 안내(UI 거울 writeLimitsCopy.ts)+텍스트 상한 4곳+% 150 통일+노트 1,000자 통일, 그룹 금칙어(피드 판정기 재사용)+parts reps 2,000 정렬(20260831160000)+22023 원인별 문구 12종+잘림 신호 배선+Enter 전송, 신규 게이트 20여 건, CI 미실행(Actions 결제 차단 — 로컬 check 전 체인으로 대체)·오너 사후검수 대기 (#981·#986, 이슈 #975) |
2026-08-31-note-stat-lines.md | 자유 기록 통계 줄 — 세트를 적지 않는 운동(크로스핏 클래스 등)의 볼륨이 통계에 0으로 남던 공백을 오너 확정 입력형(종목 지정 + 무게×총횟수, 21-15-9면 그냥 "40kg × 45회")으로 종결: 세트 타입 4종째 '총계'(total) 신설로 저장 = 종목 행+총계 세트 1줄 — 기존 산식의 타입 필터 실측(볼륨=전 세트 합·세트 수/PR/e1RM=main 계열)으로 집계 RPC 재발행 0, e1RM 관측 추출의 타입 무필터 함정(total이 관측 CHECK에 걸려 통계 갱신 전체 실패) 동반 봉합(20260831180000), 모바일·데스크톱 자유 기록 카드 입력·완료 기록 전용·타입 변경 잠금, noteStatLines 게이트 5건, Production 적용·종결(이슈 #1003 [반영완료] 닫음, CI는 결제 차단으로 로컬 전 체인 대체) (#1008, 이슈 #1003) |
2026-08-31-pending-queue-head-poison.md | 오프라인 대기 큐 머리 포이즌 수리 — 출시 전 감사 확정 결함(real/high): 오프라인 저장 큐 첫 행이 영구 실패(계획 이미 완료 40001·원본 삭제 LG001)로 변하면 플러시가 첫 실패 전체 중단+savedAt 정렬 머리 고정으로 뒤의 모든 기록이 무기한·무통보 차단(탈출구=삭제뿐)되던 것을 3축으로 종결: 격리+continue(전송성 실패만 종전 중단 — 오분류 위험을 영구 코드 집합으로 한정), 무통보 금지(격리 시 토스트 1회+'동기화 실패' 상태 sync_blocked 신설·6표면), 소실 없는 탈출구([새 기록으로 다시 올리기] — 계획 연결·source_ref만 끊는 새 식별자 재대기→즉시 플러시), 회귀 8건('머리 실패에도 꼬리 업로드' 고정), 클라 전용·종결(이슈 #924 [반영완료] 닫음, Actions 결제 복구로 CI 실검증 재개) (#1022, 이슈 #924) |
2026-08-31-calories-atom.md | 칼로리(cal) 측정 단위 신설 — 어썰트바이크류 컨디셔닝을 횟수로 우겨넣던 공백(#932 분석)을 다섯 번째 기록 원자로 종결: 원자 어휘·유연 판정(any = 거리·시간·칼로리)·세트 컬럼 2본·정본 함수 21종 재발행(완료 v4·계획 v3·보드·카탈로그 생성·읽기 5종)·클라 전층(직렬화·복합 parts·입력·표시 12cal·D2 500m·1:30)을 묶음 1 PR로, Production 드라이런 원자 롤백 4회+배포 청크 마커 실측, 관통 테스트 2건·pgTAP plan 26→30, 랜딩 직렬화 절차(#966) 첫 실전(선점 2회 재번호 15만 랜딩), 후속으로 폭 상한 2→3 확장+유산소 기계 5종 {거리,시간,칼로리} 지정까지 이행(D3, #990·170000) — 잔여 = Actions 결제 차단(오너 조치) (#973·#990, 이슈 #932) |
2026-08-31-exercise-history-drawer.md | 세트 입력 '기록 보기' 훈련 기록 — 종목 기록이 2건만 뜨던 원인(전용 조회 없이 피드용 최근 세션 20건 재활용)을 세션 검색 데이터 병합(오너 제안: 같은 모듈로)으로 전체 기간 커버: 드로어 열 때 검색 로드(1회 공유)·같은 세션은 피드 우선·검색 절삭(종목당 5세트)은 말줄임·"n세트+"로 명시, 세트 나열은 연속 동일 세트 묶음 "80kg × 10회 × 5세트", 서버 변경 0, 매퍼·묶음 회귀 상주, 전체 2,231건·배포 청크 실측(Actions 결제 차단 — 로컬 게이트 admin 머지), 종결(이슈 #1002 [반영완료] 닫음) (#1000·#1005, 이슈 #1002, BUG-048) |
2026-08-31-group-board-calories-regression-1024.md | 그룹 보드 칼로리 회귀 수리 — 금칙어 트랙(#975)의 함수 재발행이 칼로리 지원(#932)이 들어가기 전 본문을 되덮어 보드 세트·복합 동작별 칼로리가 조용히 소실되던 Production 회귀를 병합 본문 재발행+동시 생존 postcheck로 수리, 이 회귀로 적색이던 CI smoke(→ 전 PR 브라우저 e2e skipped)를 CI 차단기 낡은 테스트 4건(pgTAP 3: 폭 상한 2→3 #932 D3, e2e 1: kg 표시 1kg #994) 갱신과 함께 해소 — §15 직렬화 랜딩·Production 적용, 종결(이슈 #1024 [반영완료] 닫음) (#1026, 이슈 #1024, BUG-050) |
2026-09-01-finish-autosave-1017.md | 세션 완료 화면 즉시 저장 전환(오너 방식 A) — 종료 확인 팝업 1회 → 완료 화면 진입과 동시에 자동 저장·"한 세트만 더" 되돌아가기 제거·메모/시간 변경분만 반영 저장·오프라인은 안내 배너+수동 저장 폴백. 랜딩 국면에서 CI 차단기 잠복 e2e 실패 3원인 수리(시작 시각 0시·0분 falsy 오염 — main에도 있던 표시 버그, 오프라인 자동 저장 오류 이중 기록, CASE-015 3회 장애 계약) + 서버 잠복 버그(반복수 종목 세션은 통계 반영 후 수정 영구 거부 23514) 이슈 #1034 분리, e2e 21/21 (#1021, 이슈 #1017) |
2026-09-01-rollup-source-set-clear-1034.md | 완료 세션 수정 영구 실패 수리 — 반복수 기록 종목 세션은 통계가 근거 세트 연결을 채운 뒤 그 세트를 지우거나 교체하는 수정이 FK(ON DELETE SET NULL)×CHECK 모순으로 23514 영구 거부되던 잠복 버그(재현 순서=저장→통계 처리→수정, 이 순서를 잡는 테스트 0건이라 잠복)를 세트 BEFORE DELETE 트리거(관측 묶음 11열 정리)+근거 세트 부분 인덱스(기존 FK 풀스캔 해소)로 수리 — 함수 재발행 0·동종 결합 전수 확인 1건뿐, pgTAP 재현 6단언 신설, 종결(이슈 #1034 [반영완료] 닫음) (#1038, 이슈 #1034, BUG-053) |
2026-09-01-identity-passing-1033.md | 명시적 신원 전달 전면 적용 — 친구 접근점 분리(#1028)에서 드러난 "계정인 척(JWT 클레임 스왑)·역할인 척(role 셋업)·몰래 다시 읽기(내부 auth.uid)" 패턴을 오너 지시로 전면 제거: 신원은 문에서 딱 한 번 읽고 내부는 명시 인자(p_actor/p_viewer/p_user_id)만 — 신원 전환 11→0·내부 직독 38→0·role 셋업 3→0·인자 기본값 auth.uid 2→0·2회 읽기 8→0, Phase 1~5(통계→저장→인입→읽기→청소) 마이그레이션 4본, definer 체인에서 세션 지표가 호출 문맥에 좌우되던 이상 구조 해소, pgTAP 상시 게이트(전환 0·기본값 무신원·최대 1회·내부 장부 43종) + 신원 전달 계약 정본화, Production 원자 드라이런·행위 프로브·적용 후 실측, 종결(이슈 #1033 [반영완료] 닫음) (#1035·#1037, 이슈 #1033) |
2026-09-01-ui-v83-delivery.md | 디자인 배송 v83 — 관리자 전체 종목 화면을 표 문법(분류·타겟 부위 % 칩·기능 분류·필수 입력 4열)+"필터 설정" 모달(3행·파셋 카운트·타겟 부위 축 신설)로, 종목 상세를 "종목 이름 및 동의어" 카드(우상단 액션·페리윙클 별칭 칩·토스트)+식별자 BRID/UUID 복사 행으로 개편(delivery-20260901 verbatim, 교집합 0). 배송 Codex 후속 4건 중 3건은 실측으로 "이미 충족" 판정(mv.id=DB PK UUID·Production 1,073종목 전부 대표 동의어 행·목록 페이로드 기공급) — 마커 3종 등록만 배선. 함정=unused 베이스라인 갱신 시 게이트 문서 래칫 기록 동조 필수(1차 CI RED), Production 청크 마커 실측, 종결(이슈 #1040 [반영완료] 닫음). 같은 날 후속(이슈 #1044)=동의어 이름을 대표 이름과 동등한 검색 결과 행으로(클릭 시 동일 상세, #1045→정정 #1047)+비대표 표기 별칭 매칭 수리 (#1041, 이슈 #1040) |
2026-08-31-friend-access-split.md | 친구 데이터 전용 접근점 분리 — 오너 보고 "친구 일지 월 총중량 전부 0kg"(서버 응답에 중량 부재 + 클라 volume: 0 하드코딩, BUG-052)를 계기로 오너 결정(계정 전환 금지·전용 접근점·엔진 공유, A안=입구 2개·엔진 1개)에 따라 친구/그룹 데이터 공급을 전면 재구성: 월 총중량 수리(summary.volume = 본인 일지 정본 합) + 접근점 5개(리포트·PR·대시보드·피드·그룹 세션)의 JWT sub 클레임 전환 전면 제거(대상 명시 인자 엔진 직결, 피드는 열람자/작성자 2인자 분리로 8/26 제3자 노출 사고 구조 원천 제거·liked_by_me 열람자 관점 교정) + 전환 재유입 상시 게이트(friendAccessSqlContract 이름 스윕)와 친구·그룹 접근 계약 정본화, 본인 RPC 시그니처·payload 불변, Production 스키마/행동 드라이런 8종 실측(0kg→49,032kg 등), 종결 (#1031, 이슈 #1028, BUG-052) |
2026-08-31-group-board-completion-backfill.md | 화이트보드 완료 소급 링크 — #880 컷오버(완료=보드에서 시작한 계보 세션만)가 만든 소급 공백(계보 세션 0건 실측·현존 보드 3장 완료 행 전부 빈 상태, 오너 재보고)을 정체성 무변경 소급으로 종결: group_board_session_links 신설(definer RPC 전용·새 쓰기 경로 없음)+규칙 백필(컷오버 전 보드×멤버×같은 날짜×종목 exercise_id 겹침 — 오집계 2종은 규칙이 배제)+완료 행 RPC 계보∪링크(20260831220000, 클라 무변경), 전문 DO-raise 드라이런으로 3건 랜딩 전 확정·적용 후 per-board 실측(마블오후반 2명·마블 역도반 1명·필앤주 0명), 종결(이슈 #875 [반영완료] 닫음) (#1027, 이슈 #875, BUG-051) |
2026-09-01-issue-928-cleanup.md | 출시 전후 정리 묶음 — 출시 전 전면 감사(08-30)가 확정한 중·저위험 결함 11건을 전수 재조사(기수리 3건 판별 — #975·#950)한 뒤 유효 8건을 한 PR로 일괄 수리: 그룹 목록 실패 오류 화면+재시도(래치 수리), 미니 달력 월 이동 마크 병합(서버 변경 0), 좋아요 낙관 반영 swr 경합 차단(스탬프), 타인 세션 시간 수정 버튼 비노출, 복합 세트 수정 모달 동작별 입력(합계 무반영 해소), 드래그 pointercancel 정리, 오프라인 동기화 통계 재확인 배선(#902 동종), 계정 삭제 시 기기 운동 초안·보관함·대기 큐 삭제(D1, 개인정보) — 신규 회귀 테스트 10건, 전체 테스트 2,281건 green, 종결(이슈 #928 [반영완료] 닫음) (#1049, 이슈 #928) |
2026-09-01-group-ownership-1061.md | 그룹 소유 구조 정합화 — 죽은 groups.owner_user_id 컬럼에 걸린 cascade 때문에 그룹장 계정 삭제가 그룹·보드·댓글·공지·채팅을 통째로 지우던 구조를 해체(오너 결정 G1~G3): 그룹장 진실 = group_members.role='owner' 단일 + 그룹당 owner 정확히 1 유니크 인덱스, 멤버 이탈 단일 관문 트리거(마지막 멤버 이탈 시 그룹 소멸·그룹장 부재 시 자동 승계 — writer 우선·가입 오래된 순), 그룹장 명시 해산 RPC(이름 재입력 확인). pgTAP 28건 신설(실제 계정 삭제 cascade 경로로 승계 4단계 검증)·Production raise-롤백 리허설 후 적용. 잔여=해산 UI 노출·보드 작성자 연쇄 삭제(오너 결정 대기) (#1065, 이슈 #1061) |
2026-09-01-legacy-exercise-columns-drop-1074.md | 종목 구 컬럼 4종 퇴역 마무리 — 부위·측정 단위·식별자가 두 벌씩 적히던 구조(slug·primary_part·secondary_parts·measurement_type)를 진실 2축(타겟 부위 비율·기록 필드)으로 물리 통합. Phase 1·2(#1075)에서 사본을 파생 정규화 트리거로 묶고 클라 직접 조회를 끊은 뒤, Phase 3(#1079)에서 참조 함수 20종 재발행(파생식·동결 해시)과 함께 컬럼 drop — 구 번들은 RPC 응답의 구 키(파생값/'')로 무파손. CI 8차가 층층이 적발(트리거 행 변수 참조·update of 컬럼 드롭의 트리거 연쇄 삭제·치환식의 암묵 컬럼명 소실 등)을 전부 수리, Production 사후 실측 구 컬럼 0·빈 프로필 0 — 종결(#1075·#1079, 이슈 #1074 [반영완료]) |
2026-09-01-environment-separation-cutover.md | production/staging 환경 분리 트랙 전환 완결 — main 머지가 staging에 자동 반영되고, 실서비스 배포는 main → production 릴리스 PR 머지 1건이 DB → 서버 함수 → 화면 → smoke 순서를 기계로 집행한다. 08-21 설계·Phase 0~1 랜딩 후 오너 콘솔 작업 앞에서 멈춰 있던 트랙을 09-01에 재개: Phase 0 콘솔 6종 마무리(Required reviewers 부재 확인 → ruleset production-protection으로 D1 대체), #553 리프레시 랜딩(충돌 0, staging에 밀린 마이그레이션 84건 일괄 적용), 게이트 forward-fix 2건(#1080·#1081 — CI linux와 로컬 Windows의 CLI JSON 출력 형식 차이), 첫 릴리스 PR #1082 완주로 D5 발효, 버전 체계 SemVer 채택 + 배포 성공 시 자동 태그(#1083, v0.9.0). 미리보기는 이제 staging DB를 본다(번들·로그인 요청 2중 실측). 잔여=Phase 4 파생 정리·네이티브 staging 빌드 스위치 |
2026-09-01-search-detail-back-lag.md | 메인 검색·종목 상세 복귀 렉 수리 — 홈 검색 창의 950행 통마운트·비메모 필터(BUG-021 수리 유일 누락 표면)를 synonym 엔진+60행 창 렌더로 통일(검색 표면 5곳 완성)하고, 선택 종목(prExerciseId)이 전체 카탈로그 memo 의존성이라 상세 진입/이탈마다 950종목 병합·정렬·보드 생성이 재실행되던 것을 경량 경로 buildPrSelectedExercise 분리로 차단(12.32ms → 진입 0.14ms·뒤로가기 ~0ms 실측, 검색 자모 색인 재구축 13.7ms×매회 → 0회). 동등성 테스트 5종+드로어 배선 회귀 그물, 잔여=keep-alive 전 화면 동시 재렌더 구조(잔여 렉 보고 시 별도 상신) — 종결(#1077, 이슈 #1076 [반영완료], BUG-054) |
2026-09-01-exercise-registration-identity-1060.md | 종목 등록 프로시저 확립·정체성 체계 재설계 — 등록이 타겟 부위 비율·움직임 패턴·기록 필드를 못 받아 무음 전신 강등되던 구조를 필수 6항목 직접 수신으로 교체(3원자 유산소 등록 가능·한글명만으로 등록), 정체성을 이름 해시에서 무작위 UUID 직발급으로 분리(이름 유일성 = 압축 키 전담), 세션 유입 경위(보드 시작)를 정체성 문자열에서 출처 컬럼으로 이관(보드 완료 매칭 컬럼화), BRID = 분류 라벨 헌법(고정 5조각, 정규화 트리거 + 전 행 일제 전환 — UUID 불변). 세션 정체성 직발급까지 완결(D9 발급 통일 철학 — 외부 인입은 무작위 발행 간주 D11), 잔여=구 컬럼 4종 드롭(read 호환 창) — 종결(#1068·#1070·#1072, 이슈 #1060 [반영완료]) |
2026-09-01-resume-bar-home-tab-1088.md | 하단 복귀 바를 메인 탭으로 — 일지 탭에서 지난 기록을 고치다 앱을 끄면, 다시 켠 첫 화면(메인)에는 아무 표시가 없고 일지 탭으로 옮겨 가야 마저 기록 작성하기 바가 보이던 구조를 교체. 노출 조건을 "작성을 시작한 탭"(2026-07-31 디자인 계약)에서 메인 탭 전용으로 바꿔(오너 결정 D1) 어느 탭에서 쓰다 나왔든 복귀 지점이 한 곳으로 고정되고, 완료 기록 수정 초안이면 문구를 마저 수정하기로 분기(D2 — 메인 탭에는 무엇을 하다 나왔는지 문맥이 없다). 하단 크롬 높이는 시작 바와 같은 109px라 여백 계약 불변 (#1092, 이슈 #1088 [반영완료]) |
2026-09-01-friend-journal-day-detail-1095.md | 친구 일지 하루 상세 수리 — 친구의 일지 탭에서 날짜를 눌러도 합계가 0kg·0분·0세트로 나오고, 세션 카드에 종목 줄이 없고, 카드를 눌러도 아무 일도 일어나지 않던 것을 고침. 원인은 둘 — ① 친구 일지 달력이 받는 한 달 응답이 세션마다 id·날짜·상태·제목만 실어(응답 크기 때문에 원래 그런 설계) 세트·무게가 화면까지 오지 않았고 ② 화면에 세션 클릭 콜백 3종이 배선돼 있지 않았다. 날짜를 누를 때 그날 완료 세션 상세를 이미 팔로우에 열려 있던 get_session_detail로 받아 채우고(서버 무변경·마이그레이션 없음), 세션 상세는 내 일지 상태를 오염시키지 않도록 친구 스코프 전용 슬롯 + 전용 뒤로가기 레이어로 연다(그룹 화이트보드 선례). 하루 조회분을 재사용해 세션 열기 요청은 0회 (#1096, 이슈 #1095, BUG-055) |
2026-09-01-ui-v84-delivery.md | 디자인 배송 v84 반입 — 모바일 종목 상세를 두 숫자(최고 기록 1RM·총 누적 볼륨) 중심으로 재편하고 세션 상세 타이포·정렬을 재설계, 전체 보기 화면을 우측 슬라이드 오버레이 하나로 통일. 반입 감사가 배송에 섞여 온 회귀 3건(복합 세트 수정 되돌림·과거 입력 1RM 안내 소실·세션 정보 수정 창이 안 닫혀 화면이 막힘)을 잡아 복원한 기록 |
2026-09-02-admin-exercise-trait-inline-edit-1069.md | 관리자 종목 특성 한 줄 편집 — v83 배송이 상단 연필을 없애 종목 특성(분류·타겟 부위·기능 분류·기록 필드·필수 입력·체중 반영 계수)을 화면에서 고칠 수 없던 것을, 행마다 연필 → 선택지 모달 → 즉시 저장 구조로 복원(오너 지시: 한 줄씩 인라인, 옵션은 모달). 체중 반영 계수는 맨몸 종목의 속성으로 고정 — 다른 분류는 없음으로 보이고 편집 진입점이 없으며 컨트롤러가 0으로 저장(Production 실측: 계수>0 187개 전부 맨몸). 측정 단위 행은 기록 필드 파생값이라 삭제, 필수 입력은 JSON 대신 기본값/모두/하나만 선택형. 서버 무변경 (#1104, 이슈 #1069) |
2026-09-02-admin-recording-field-filter.md | 관리자 전체 종목 필터에 기록 필드(무게·횟수·거리·시간·칼로리) 행 추가 — "거리를 기록하는 종목만" 같은 점검을 표를 훑지 않고 한 번에. 다른 필터 행과 같은 파셋 카운트·초기화·배지, 서버 무변경 (#1128) |
2026-09-02-alias-search-rule-1140.md | 별칭 검색 규칙 통일 — 유저가 푸시업을 쳐도 푸쉬업 하나만 나오던 것을, 별칭도 표기처럼 단어 부분 일치(어순 무관)로 바꾸고(08-25 "별칭은 앞부분만" 규칙 폐지, 오너 결정) 정식 종목 41개에 푸쉬→푸시 별칭을 마이그레이션으로 추가해 푸쉬업 계열 25개가 전부 나오게 함. 검색·매처·검색 확인 상자 3곳 통일, Production 예행 40건 (#1141, 이슈 #1140, 릴리스 대기) |
2026-09-02-admin-custom-exercises-1130.md | 관리자 커스텀 종목 전용 페이지 — 유저가 만든 종목을 보려면 전체 종목 표에서 소유자 ID 앞 8자리를 눈으로 대조해야 하던 것을, 새 탭에서 소유 유저 목록(이름 @핸들·이메일·활성/전체 수) → 그 유저의 커스텀 종목(최근 등록순, 비활성 기본 숨김+토글) → 기존 상세 패널(편집·삭제)로 바꿈. 유저 이름은 관리자 전용 검색 함수에 handle 열을 더해 대응(마이그레이션 1건, 릴리스 전엔 이름만) (#1148, 이슈 #1130, 릴리스 대기) |
2026-09-02-record-metric-1100.md | 횟수 기반 종목의 기록 지표 — 모바일 종목 상세가 연도 목록을 추정 1RM 연도로만 만들어 맨몸 종목이 올해만 보이던 결함 수리(Phase 0) + 대표 기록 지표 계약 신설(필수 입력 조합 → 1RM·최대 반복수·최대 버티기·거리별 최단 시간, PR=실측만)과 맨몸 종목 최고 반복수 연결(상세 히어로·변화 그래프·PR 목록·리포트 기록 성장, Phase 1) + 풀업=스트릭트 풀업 정체성 병합(스트릭트 풀업은 synonym 유지, Phase 2). Production 롤백 리허설 3회로 마이그레이션 2본 실검증, 오너 풀업 상세 연도 1→5·최고 반복수 30회 (#1110, 이슈 #1100, BUG-057) |
2026-09-02-exercise-search-ranking-1101.md | 종목 검색 결과 정렬 — 매칭만 하고 줄을 세우지 않던 엔진에 "완전 일치 → 점수(0.5×내 마지막 수행일 30일 반감 + 0.3×인기 등급 1~5 + 0.2×실제 사용자 수 로그) → 카탈로그 순" 정렬을 넣은 기록. 서버는 exercises.popularity_tier(795종 등급표 백필)·종목별 사용자 수 집계(pg_cron 매시)·검색 신호 RPC 하나, 앱은 로그인 후 1회 적재해 모바일·데스크톱 종목 피커와 관리자 전체 종목 페이지에 배선. "짧은 이름이 더 딱 맞는다" 비율 정렬은 실측(핀 프레스·L풀업이 위로)으로 기각 (#1115, 이슈 #1101) |
2026-09-02-record-metric-hold-cardio-1102.md | 대표 기록 지표 Phase 3·4 — 버티기(시간) 종목 = 실측 최고 버티기 시간, 유산소 종목 = 최장 거리 + 종목군별 기준 거리(가정 D4, SQL 함수 한 곳)마다 "기준 거리 이상 ~ 103% 이하" 세트의 최단 시간(환산 없음, 기록 거리 병기). 실측 세트 후보 함수 하나 위에 시간선·표·리포트 성장(초·km 행) 파생, 새 테이블 없음. 종목 상세 히어로·그래프·PR 목록을 지표 종류 하나로 일반화 + 거리별 최고 기록 표. pgTAP 24건·Production 롤백 리허설(pgTAP 시나리오 일치·오너 러닝 1/3/5km 칸) (#1131, 이슈 #1102·#1103) |
2026-09-02-group-ugc-safety-922.md | 그룹 레인 UGC 안전 편입 — 피드에만 있던 신고·차단·정지·금칙어·내리기를 라운지 채팅·화이트보드 댓글·공지·초대에 편입한 기록(#665 Phase 7, 오너 D5 그룹 탭 첫 제출 포함). 그룹 RPC 단일 관문에 정지 게이트, 가시성에 정지 작성자, 내려짐/내가 신고한 글 판정기 하나, 신고 대상 3종(target_group_content_id), 차단 시 대기 초대 양방향 삭제, 그룹 화면 신고·차단 진입점. pgTAP 32단언 (#1137, 이슈 #922, BUG-060) |
2026-09-02-reps-grade-profile-sex-1142.md | 반복수 종목(풀업·딥스·푸시업 등 61종) 등급이 즐겨찾기 표에만 보이고 종목 상세에는 비어 있던 것을 수리한 기록 — 조립 코드의 "중량 기준 등급만 상세 칸에 넣는다" 규칙(#221 시절)을 없애고 등급표 팝업을 '회' 단위로. 같이 프로필 성별 설정(set_profile_sex_v1 + 내 정보 남성/여성 1탭, 저장 뒤 기준표 재적재)을 추가 — 온보딩 뒤 바꿀 길이 없어 성별 미설정 계정이 남성 기준으로만 판정되던 문제 (#1145, 이슈 #1142, BUG-061) |
2026-09-02-composite-session-detail-reps-1151.md | 복합세트 세션 상세 횟수 — 표시 수리 — 하이 클린 + 저크 같은 복합세트를 모바일 세션 상세에서 열면 50kg × —로 보이고 합계·요약이 0으로 세던 것을, 복합 세트 한 줄 표기·횟수 합 공용 함수(50kg × (3+1)·10회 + 10회·10회 + 30초)를 두고 세션 상세 3곳과 일지 하루 상세 축약(50kg(3+1)x2)에 적용해 수리. 읽기 모델 계약(횟수 칸 비움)·서버 무변경, Production 실측으로 데이터 온전 확인 (#1153, 이슈 #1151, BUG-062, 릴리스 대기) |
2026-09-02-tab-instant-response-1152.md | 모바일 하단 탭을 눌러도 0.7~1.0초 뒤에야 바뀌던 것(오너 보고, 특히 메인 탭)을 다룬 기록 — 브라우저 쪽 시간까지 재는 리그로 실측(실험실 20~70ms, 미재현·골격 CSS 원인 기각), 탭바 강조는 누른 즉시·판 전환은 한 렌더 뒤로 분리(useDeferredValue, 누름→강조 31~66→17~20ms), 판 사진 decoding="async". 실기기 원인 확정은 Production 계측(D3) 대기 (#1156, 이슈 #1152, BUG-064) |
2026-09-03-completed-session-write-source-1143.md | 성근 회원 완료 운동 수정 저장 4회 거부(서버 22023 "이 기록에 없는 줄")를 계기로 수정 저장 요청의 조립 규칙을 세운 기록 — 개정번호와 종목 줄 번호표를 서로 다른 보관 사본에서 가져오던 도우미 2개를 "서버 응답 하나의 사본에서만" 꺼내는 도우미 1개로, 사본 역할 꼬리표 writeSource('detail'/'receipt'/'display')로 표시용 사본의 가짜 번호표 차단, 저장 영수증에 실제 줄 번호표 children 추가 키, 완료 화면 후속 수정은 필요 시 상세 강제 조회 1회, 저장 5경로 브라우저 e2e CASE-023~027 + 오류 표면 감시 헬퍼, 쓰기 원천 계약 문서·소스 경계 게이트·pgTAP 14단언 (#1154, 이슈 #1143, BUG-064) |
2026-09-03-tab-switch-latency-probe-1160.md | 모바일 탭 전환 지연(#1152)의 실기기 원인을 잡기 위한 Production 계측 — client_error_events에 kind perf_tab_switch 추가(마이그레이션 1개, 계약 v1 유지)와 300ms 초과 전환만 보고하는 클라이언트 계측(누름 큐 대기·막힌 구간·직전 응답을 contract_path 압축 요약으로, 범례 수록). 데이터는 릴리스 뒤 수집 (#1161, 이슈 #1160, 오너 D3) |
2026-09-03-group-board-percent-prefill-1150.md | 그룹 보드에 %로 올린 세트를 다른 회원이 "이 운동으로 시작"하면 작성자 기준 환산 kg가 그대로 채워지던 것(9/2 성근 회원 40kg, 본인 기준 27kg)을, 프리필이 %·기준 종목을 동반하고 kg는 시작하는 사람 자신의 1RM(실측→추정)으로 다시 계산하도록 수리(오너 D1 a: 기준 없으면 % 유지·kg 빈 값). 작성자가 켠 5kg 반올림 설정을 보드로 공유(마이그레이션 1건, D2), 기준 1RM 없음 즉시 안내(D3), e2e CASE-019를 별도 사용자 보드로 개정 (#1163, 이슈 #1150, BUG-065, 릴리스 대기) |
2026-09-03-ui-v85-delivery.md | 디자인 배송 v85 반입 — 풀업·플랭크·러닝처럼 1RM이 없는 종목의 상세를 디자인대로(등급 행·기록일·연도별 누적 팝업·거리별 표 팝업) 그리되 데이터는 main이 이미 연결한 서버 계약을 쓰고, 세션 상세에 수행 강도 칼럼·가이드 팝업, 종료 확인 카드 하나로 저장까지, 완료 화면 "한 세트만 더할게요", 내 정보 사진·이름·아이디 변경 행, 그룹 목록에서 보드 직행. 옛 본문이 지운 #1049 수리 4건 복원. |
2026-09-03-ui-v86-delivery.md | 디자인 배송 v86 반입 — 패키징 전 디자인 환경 원본에서 델타를 직접 뽑아 메뉴 드로어 재편(REPORT 연간·월간 2행 / RECORDS / ACCOUNT, 닫기 ›, 열린 화면 하나만 강조), 드로어 진입 화면은 메뉴 탭 강조, 나의 주요 종목·운동 기록 검색·커스텀 종목 관리 워드마크 라벨, 내 1RM 기록 관리는 직접 입력 목록 + 수정·삭제 + 입력 모달(서버 변경 0). 반입 감사 3건(보관/복원 유지·모달 헤더 자체 규칙·CSS 이관). |
2026-09-03-manual-record-metrics-1194.md | 종목별 핵심 기록 지표 직접 입력 — 무게 1RM만 받던 직접 입력을 최대 반복수(회)·최고 버티기(초)·유산소 거리+시간으로 넓혔다. 1RM 표는 그대로 두고 별도 표에 넣어 읽을 때 세션 기록과 같은 규칙으로 합친다(서버 지표 판정·시간선 합류·모바일/데스크톱 지표별 폼). |
2026-09-03-landing-page.md | 바벨릭 랜딩 페이지 — 레포 최상위 landing-page/ 에 본 앱과 독립된 Vite 프로젝트(/landing 경로, / 비움). Framer 템플릿 Plantap 실측 → design.md+토큰 CSS(Wanted Sans·기울임 금지), 제품 한 장 설명 draft.md·검토·기획서 landing-prd.md(9섹션·최종 카피·오너 확인 10), 섹션 9개 CSS 폰 목업 구현, 세트 스코어 새 정의(#1174)·사실 검증 83항목 반영, 레포 게이트 영향 0 (#1179) |
2026-09-03-set-score-recent-performed-1164.md | 수행 강도를 "세트 스코어"로 바꾸고 RPE 없는 세트(관측 행의 94%)에도 점수를 붙인 기록 — 나누는 값을 직전세션 추정 1RM에서 "최근 수행 1RM"(RPE 10·실패 세트로만 바뀌고 내려갈 수 있으며 추정으로 올릴 때는 역대 최고 1RM 상한, 첫 세션은 세션 끝 값)으로, 풀업·딥스는 최대 반복수판, 운동 종료 화면에는 저장 답장으로 즉시 표시. 연구 Phase 0~2(후보 28종·나누는 값 대안 11종·반박 검증 35건)와 오너 결정 13건 → 마이그레이션 1개(규칙 순수 함수·상태 테이블·투영 재발행·저장 문 동봉·전원 재계산) + 화면 (#1174, 이슈 #1164, 릴리스 대기) |
2026-09-03-offline-support-1173.md | 비행기 모드에서 앱이 20초 뒤 검은 화면이 되던 것(원격 로드 껍데기·메모리 세션)을, 서비스 워커 화면 캐시(iOS 앱 전용 도메인 선언)·로그인 때 남긴 계정 id로 오프라인 계정 판정·RPC 관문 응답 사본(IndexedDB)과 유휴 복제 작업·쓰기 큐 확장(수정·삭제·계획, 합치기 규칙, 충돌은 나중 저장 우선 D1)·오프라인 상태 줄로 "내 기록 기능 전체 오프라인" 수준까지 올림. 서버 무변경, iOS는 오너 Mac 빌드 1회 필요 (이슈 #1173, BUG-068) |
2026-09-03-feed-composite-mains-1182.md | 복합 종목(하이 클린 + 저크)이 피드·친구 피드·데스크톱 홈/검색 카드에서 동작 두 줄로 쪼개지고 세트 수가 2배로 잡히던 것을, 카드 서버 응답에 묶음 정보(composite_meta)·순서를 싣고(마이그레이션 1개, 계약 버전 불변) 앱이 세션 상세와 같은 합치기 함수로 한 종목·"100kg (1+1)x1" 표기·합쳐진 기준 세트 수로 그리게 함 (#1185, 이슈 #1182, BUG-069, 릴리스 대기) |
2026-09-03-exercise-identity-uuid-1175.md | 종목 정체 컬럼 9개 중 겹치던 4개(origin·external_payload·is_external_placeholder·client_request_id) 드롭 — 정식=소유자 없음·내 종목=소유자 있음·외부 인입만 source_ref 한 줄 규칙, 외부 인입 종목 169개가 "내 커스텀 종목"에 노출(0→169)·WodUp 중복 보호 인덱스 수리(0→164/164), 앱 발급 id(D3), exercises.id와 참조 29컬럼 text→uuid(함수 48개 재서명·88개 재발행, plpgsql_check 오라클), 문서 9종 (#1190, 이슈 #1175, 릴리스 대기) |
2026-09-03-composite-parts-cutover-1188.md | 복합 세트의 동작별 값 저장 형식을 parts 하나로 통일하고 옛 형식 scheme(횟수 숫자 목록)과 기본 횟수 계보를 클라이언트·서버에서 전부 제거(#953 반려 → #1188, 오너 D1-a 즉시 전부 제거) — 그룹 보드 검증 함수 재발행(공유 무게 판정 보강)·default_reps 제거 마이그레이션·pgTAP 6·e2e CASE-020 parts 단언·단위 17파일 개정. |
2026-09-03-note-dock-statlines-1198.md | 자유 기록 — 본문 보기 화면에 뜨던 일반 종목용 "빠른 세트 추가" 버튼 비노출(BUG-070), 통계 반영 종목 추가를 편집기에서 종목 완료 도크 위 패널로 이동(오너 D1-a). 도크 기하 계약 불변(도크 루트 기준 absolute 패널), 빈 줄은 안내+종료 잠금+종료 시 해당 종목 복귀. |
2026-09-03-set-score-report-bands-1180.md | 리포트 탭 도넛·막대와 주/월 하루 상세 도넛이 세트 스코어(#1164)와 다른 잣대(무게 ÷ 직전세션 추정 1RM)로 같은 세트를 세던 것을 세트 스코어 4구간 도넛·1.0 간격 히스토그램 8칸으로 교체(기간 통계·일 요약 집계 열 8개, 상위 평균 = 점수 합 ÷ 세트 수, 오너 D1~D7). 중량 풀업·중량 딥스는 스쿼트와 같은 1RM판으로(구 예외 삭제). 데스크톱은 후속, 복합종목은 #1189. |
2026-09-03-composite-set-score-1189.md | 복합종목("1 클린 + 1 저크")의 세트 스코어가 세션 상세·완료 화면·리포트에서 항상 —였던 것을 구성 동작별 점수의 단순 평균으로(오너 D1~D6). 복합으로만 하는 동작도 나누는 값(최근 수행 1RM)이 생기되 추정 1RM·PR 기록은 종전대로 복합 제외, 리포트·하루 상세 집계는 복합세트 1개 = 1세트(첫 동작 종목 귀속). 마이그레이션 20260908005900, pgTAP 29단언·단위 4건. 일반 세트 수 통계의 복합 처리는 오너 결정 D7로 남김. (#1211, 이슈 #1189) |
2026-09-03-hidden-pane-gate-guards-1195.md | 숨은 탭 판 표식 누수 전수 가드 — 그룹 보드 작성창을 열어 둔 채 다른 탭으로 가면 그 탭의 바닥 여백이 사라지고(BUG-071) 홈 위 레이어 지면이 뒤 탭에 따라 달라지던 것을, .app/.screen 레벨 :has() 규칙 56건에 :not(.tab-pane.off *):not(.tab-keep.off *) 가드 한 문법으로 통일(허용 목록 없음 — :not() 특정도 때문에 섞이면 우선순위가 뒤바뀜)·정적 게이트·일 요약 레이어는 하단 크롬 채널 none으로 승격·탭 전환 프로브와 스크롤 위치 읽기에서 숨은 판 제외 (#1213, 이슈 #1195, #1184 D3, 릴리스 대기) |
2026-09-03-modal-root-portal-1214.md | 세션 상세에서 스크롤한 뒤 세트 스코어 가이드 팝업이 위쪽에 잘려 뜨던 것(BUG-072)의 구조적 수리 — 팝업 배경이 스크롤 상자에 붙는 오버레이 껍데기(세션 상세·기록 상세·그룹) 9곳이 같은 병이라, 가운데 팝업 공용 껍데기 UiModal이 앱 루트에서 그리도록 하고 33곳 전부 교체, 직접 사용을 막는 게이트 신설, PrTools 달력을 폼 모달 안으로 (#1217, 이슈 #1214, 릴리스 v0.16.0 대기) |
2026-09-04-effective-load-1200.md | 덤벨 2개 종목 볼륨이 한 개 무게로만 잡히고 어시스트 종목은 보조를 늘릴수록 기록이 좋아지던 것(BUG-074)을 종목별 무게 배수(1/2)·보조 무게 기록 항목·유효 무게 = max(0, 든 무게×배수 + 체중×체중계수 − 보조 무게) 한 공식으로 정본화, 카탈로그 배정(배수 2 81종·보조+횟수 7종·스텝업/다운 체중계수 0), 밴드 굵기 칩·보조 20kg × 8회 표시·관리자 배수 편집칸 (#1219, 이슈 #1200, 릴리스 v0.16.0 대기; 통계 이전·재계산·계획 볼륨·커스텀 등록 선택지는 #1202) |
2026-09-04-effective-load-stats-1202.md | 중량 풀업 추정 1RM이 추가 무게에만 공식을 적용해 낮게 나오고 어시스트 종목은 보조가 클수록 기록이 좋아지던 것을, 추정 1RM·세트 스코어·세트 강도는 유효 무게로 계산하고 유저가 보는 값만 추가 무게 프레임으로 환산(strength_display_frame_kg_v1)하도록 이전 + 과거 기록 재계산(어시스트 보조 칸 이동·덤벨 배수 2 전 출처·스텝업 계수 0·잘못된 PR 이벤트 제거) + 계획 예상 볼륨 배수(D10)·커스텀 종목 등록 "덤벨·케틀벨 2개" 선택지(D11)·탑세트 "체중−Nkg"·완료 화면 볼륨 폴백 (#1223, 이슈 #1202, 릴리스 v0.17.0 대기) |
2026-09-04-landing-preflight-gate-1224.md | 랜딩 잠금 획득 시 로컬 pgTAP 통과 기록이 없으면 거부 — #1200·#1202 두 트랙이 서버 테스트를 로컬에서 안 돌리고 PR을 열어 CI 8회 중 7회가 로컬에서 잡을 수 있던 문제로 빨간불이던 것을, npm run db:preflight(샌드박스 리셋 → pgTAP 전 파일 → 통과 시에만 워크트리 .git에 브랜치·내용 해시·파일 수·assert 수 기록)와 landing:lock -- acquire 게이트(기록 없음·브랜치 불일치·해시 불일치·24시간 초과 거부, LANDING_PREFLIGHT_BYPASS 우회는 잠금 기록에 표시)로 종결. 절차 문서 0-1 단계·PR 템플릿·작업 기록 게이트 줄, 테스트 7건, 실측 100파일·1,601 assert (#1228, 이슈 #1224) |
2026-09-04-exercise-catalog-sync-1238.md | 앱을 켜면 홈 주요 종목 보드에 종목 이름 대신 UUID가 2~3초 보이던 것(BUG-079)과 누구의 커스텀 종목 한 건에도 전 사용자가 카탈로그 0.9MB를 다시 받던 것을, 서버 읽기 모델이 종목 참조(이름)를 직접 싣고 앱의 카탈로그 조인·id 폴백을 게이트로 금지(14/22 → 0/0) + 카탈로그를 "기기 사본(IndexedDB) + 유저별 변경 로그 순번 이후 변경분(get_exercise_catalog_changes)"으로 바꿔 전역 버전 트리거·열 폐기로 종결. 즐겨찾기 v2 items·get_user_manual_records_v1·e2e CASE-037/038 (#1271, 이슈 #1238, 릴리스 v0.17.0 대기) |
2026-09-04-ci-local-1225.md | PR 전 CI 로컬 선실행 — 최근 두 PR에서 CI가 합쳐 9번 빨간불(앱 결함 0건, 전부 pgTAP·e2e)인데 로컬 재현 명령이 없어 CI를 첫 실행으로 쓰던 것을, CI와 같은 판정(ci-scope-policy.mjs)·같은 순서·같은 환경변수로 도는 npm run ci:local 한 명령(레포 밖 샌드박스 자동 구성·pgTAP·e2e 5묶음·PR 본문용 요약 줄)으로 대체. #1223 첫 실패(pgTAP 무결성 검사)를 로컬에서 재현 확인. CI 생략 머지 (#1230, 이슈 #1225) |
2026-09-04-postgres-image-pin-1233.md | 로컬·CI Postgres 이미지를 Production 버전에 고정 — 같은 pgTAP·e2e가 Production 17.6.1.127·CI .156·로컬 .158 세 빌드에서 돌던 것을 package.json supabaseToolchain 상수 하나(CLI 2.113.0 + 이미지 태그 = Production)로 통일. CI·ci:local이 supabase start 전에 .temp/postgres-version을 써 Production 이미지로 띄우고 태그가 다르면 실패, 설치 CLI가 핀과 다르면 종료 코드 3. CI 1회 (#1234, 이슈 #1233) |
2026-09-04-ci-browser-shards-1239.md | CI 브라우저 저니 병렬화 — full 레인 한 잡 11분(브라우저 저니 5분 48초·뷰포트 1분 26초가 직렬)을 공용 composite action local-supabase-stack(도구 버전·CLI·이미지 핀·기동·검사) 위에서 migration-smoke(DB 핵심)·browser-journeys 2샤드·viewport-matrix 네 잡 동시 실행으로 나눠 벽시계 약 절반, Actions 사용량 약 1.8배(오너 수용). CI 1회 (#1240, 이슈 #1239) |
2026-09-04-completed-workout-write-pipeline-1199.md | 완료 화면 [기록 삭제]→[삭제]가 1~5초 무반응이다 닫히던 것(BUG-075, 상세 재조회 + 삭제 답장 대기의 직렬 2왕복)을 계기로, 완료 기록의 저장·수정·삭제를 "기기 대기열에 먼저 적고 → 화면은 즉시 → 서버 전송은 뒤에서" 한 갈래로 통일(계약 contracts/completed-workout-write-pipeline.md, 행 상태 4종·동작별 기다림 정책표·합치기·실패 표시 규칙, 2026-07-30 문서 퇴역). 삭제·수정은 즉시 닫히고, 생성은 대기열 경유 답장 대기(자동 저장 실패 = 자동 보관 + "동기화 후 점수 반영"), 편집기 오프라인 열림, 무음 잠금 3곳 제거, 서버 변경 0. 단위 신설 32건·앵커 12파일 재조준, e2e CASE-032 신설·CASE-029(장애 주입 프로필)·015 개정, 로컬 샌드박스 e2e 13케이스 사전 통과 (#1231, 이슈 #1199) |
2026-09-04-reps-set-score-cap-1241.md | 횟수 종목 세트 스코어 기준 상한 정정 — 풀업·레그레이즈처럼 횟수만 세는 종목에서 난이도 버튼을 누른 세트의 점수가 거의 항상 10을 넘던 것(턱걸이 첫날 6개 @ 가뿐함 = 18.3, 버튼 없이 = 10.0; Production 버튼 세트 45개 중 25개 10 초과)을, 나누는 값을 추정치로 올릴 때의 상한을 "아무 세트의 역대 최고 횟수"에서 "한계 세트(최대 노력 버튼·실패 세트)로 확인한 횟수"만으로 한정해 무게 종목과 같은 원칙으로. 투영 함수·저장 답장 미리보기 각 1곳 + 전원 재계산, pgTAP 28 → 36단언, Production 드라이런 25/45 → 0/45 (#1249, 이슈 #1241, 릴리스 v0.17.0 대기) |
2026-09-04-session-hierarchy-1215.md | 운동 기록 계층 리모델링 — 클린+저크 5세트가 하루 합계에서 10세트로 부풀고 완료·계획·보드가 테이블도 저장 함수도 따로(6종)였던 것을, 다섯 층 한 구조(session → session_exercise → session_exercise_part → exercise_set → exercise_set_part, 종류는 status·group_id) + 저장 함수 한 쌍(save_session_v5/delete_session_v5) + 세는 규칙 하나(세트 수 = 세트 행, 종목별 = 세부 세트, 횟수·볼륨 = 세부 종목)로. 계획 완료 = 같은 행 전이, 옛 저장 함수 8개는 업데이트 안내(LG426), composite_meta·옛 테이블 8개 삭제. 마이그레이션 8본, pgTAP 4파일·e2e 4케이스 신설. CI 1회(3회 실행, 2회는 main 변동) (#1248, 이슈 #1215) |
2026-09-04-user-fact-immutability-1236.md | 유저 기록 원본 불변(#1236) — 원본/투영 등급 계약, 원본 보호 트리거·이력·복원, 규칙 변경은 투영만, 시스템 쓰기 경로 재분류, 스키마 변경 보호, 매일 데이터 사본 |
2026-09-04-rpe-single-scale-1237.md | 세트 난이도 버튼을 RPE 체계로 완전 편입(#1237) — 세트마다 5단계 번호와 RPE 두 벌을 저장하고 통계는 5단계를 읽던 것(같은 세트가 모바일 "어려움(RPE 8)"·데스크톱 리포트 "적당함", 옛 세트 108개 RPE 빈칸, 6~7월 옛 난이도 119세트가 RPE처럼 보임)을 RPE 숫자 하나(1.0~10.0)로: 5단계·옛 난이도 컬럼 삭제, 정책 3종 major(RIR = 10 − RPE), 세트 변환 227행·전량 재계산, 카드 "SET N RPE" 숫자 입력칸 + 단축 버튼, 도넛 6칸/4칸 통일. 실데이터 사본 드라이런이 #1202의 최대 반복수 검사 누락을 잡아 함께 수리, #1236 보호 층 재발행. BUG-076 |
2026-09-04-bottom-chrome-clearance-1250.md | 하단 탭바가 내용을 가리는 문제 원천 차단(#1250) — 일지 하루 상세를 끝까지 내려도 마지막 "완료한 운동 기록 추가하기" 버튼이 탭바 밑에 28px 깔려 누를 수 없던 것(월 상세도 같은 여백, 채널 tabbar인데 실제 탭바 없는 불일치 4곳)을, "탭바가 보이는가"(채널 3값 + CSS :has() 4건)와 "바닥 여백"(손 지정 17곳)이 따로 결정되던 구조에서 하단 크롬 신고 채널 하나(useBottomChromeClaim, 9값) + 여백 유도식 하나(core.css --bottom-clearance)로: 손 여백 17 → 0, :has() 4 → 0, 정적 검사 5건, e2e 도달 게이트 표면 17 × safe 0/34(끝까지 스크롤 후 마지막 버튼이 크롬 위·hit-test). 마이그레이션 없음. BUG-077 (#1262, 릴리스 v0.17.0 대기) |
2026-09-04-composite-layer-fields-1244.md | #1215 후속 3건 묶음(#1246·#1245·#1244) — 앱 오류·관제 라벨이 옛 저장 함수 이름(save_workout_v4)을 찍고, 세부 세트 소속 열 이름이 담긴 값(세부 종목 id)과 다르고, 복합 종목을 서버는 관계로 저장하면서 읽기 함수는 옛 JSON 메모(composite_meta)를 합성해 앱이 그 메모로 묶던 이중 구조를, 라벨은 실제 함수 이름·열 이름은 session_exercise_part_id(rename 만, 함수 41개·보호 트리거 재발행)·읽기 함수 4개는 층 필드(소속 종목 id·이름·순서·동작 순서·수행 상세) 그대로 싣고 앱은 그 필드로 묶게 정리(합성 함수 2개 삭제, compositeMeta 80참조 → 0). 마이그레이션 3본, pgTAP 104/1776·e2e 72/72, CI 1회(재실행 1회 — 러너 일시 네트워크 실패) (#1266, 이슈 #1244·#1245·#1246, 릴리스 v0.17.0 대기) |
2026-09-04-app-role-privileges-1258.md | 앱 계정 권한 계약(#1258·#1259) — 로그인 없이 앱 공개 키만으로 남의 PR 달성 횟수를 읽을 수 있던 것을 계기로, 앱 계정이 실제 DB 에서 선언보다 많이 갖고 있던 권한(표 33개 TRUNCATE 류 248건·anon 실행 함수 26개·정책 없는 쓰기 41건·죽은 정책 27개)을 이름 목록이 아니라 규칙 R1~R3(기본 권한 닫힘·표 권한은 RLS 정책에서 유도·함수는 RPC 문과 정책·제약 참조만)으로 회수하고 pgTAP 전수 검사(허용 목록 없음)·마이그레이션 정적 검사로 고정. BUG-078 (#1268, 릴리스 v0.17.0 대기) |
2026-09-04-custom-exercise-load-profile-repair-1235.md | 8/12 푸시 저크 무게 소실·수정 화면 휴식 NaN 표시(#1235) — 8/11~12 "새 종목 추가"로 만든 커스텀 종목 3개가 "반복수만" 유형으로 등록된 채 무게가 저장됐다가 8/13 마이그레이션(#407)이 16세트의 무게를 지운 사고(복구 불가). 종목 3개·세션 세부 종목 3개의 기록 유형을 "무게+반복수"로 정정하는 마이그레이션(#1236 수리 티켓 issue#1235 첫 사례, 실데이터 사본 드라이런 파괴 0·이력 6행)으로 수정 화면에 kg 칸이 돌아오고, 완료 세션 수정 화면의 휴식 NaN:NaN(전체 사용자)은 수정 초안이 휴식 원본(초)만 읽도록 수리. BUG-078 |
2026-09-05-schema-snapshot-1252.md | supabase/schema.sql이 "현재 상태"라는 이름과 달리 마이그레이션을 순서대로 이어 붙인 이력 사본(10.9 MB·212,940줄, 함수 정의 문장 1,137개 중 대부분이 옛 정의)이라 죽은 텍스트에 초록이 나던 단위 테스트가 있던 것을, 빈 DB에 마이그레이션 전체를 재생한 뒤 뽑은 실제 상태 덤프(3.37 MB·39,577줄, 참조 데이터 19표 포함)로 전환 — 생성기 npm run schema:snapshot(2회 생성 바이트 동일일 때만 씀, 재생 시점에 DB가 정하는 열 제외), 지문 계약·CI migration-smoke --check·ci:local/db:preflight --check 3중 검사, renumber는 지문만, 테스트 42파일 재앵커(파일 전체 문자열 단언 18곳 → 0), 덤프가 드러낸 권한 결함은 #1258·#1259로 (#1263, 이슈 #1252, 릴리스 무관) |
2026-09-07-v0-18-0-architecture-roadmap.md | v0.18.0 진행형 총괄 — 목표 구조·63개 작업 지시서·6개 분야·5개 Phase·의존성·검증/릴리즈 조건과 개별 중요 업데이트 기록 연결. Phase 1 실행 이슈 11개 게시, 전체 완료 조건 검증 전. |
2026-09-07-v0-18-0-g01-hq-contracts.md | v0.18.0 G01 — 배포 문서가 한 파일 안에서 "main 머지 = 운영 배포"(옛)와 "main = staging"(현행)을 같이 말하고, 역할 문서가 옛 모델 이름을 권한처럼 전제하고, 쓰기 계약이 목표 구조(outbox claim·fence)와 충돌하고, 랜딩 잠금이 한 PC 전제이던 것을: 실측 기준선(main 보호 규칙 없음·Production 승인자 없음·merge queue 미제공)과 함께 HQ 운영 정본(62개 소유 역할·공용 자원 통합 담당·라벨 병합 큐·스테이징 슬롯·릴리스 게이트·관리자 게이트·Ready 판정)과 ADR(보존 정책 P1~P10·변경 계약 5종·양자택일 근거·새 writer 활성 조건)으로 정본을 하나로 묶고, 옛 문장은 그 자리에서 정정, landing-queue 워크플로 검사·라벨 4개. CI 생략 머지 (#1296, 이슈 #1279) |
2026-09-07-v0-18-0-g02-test-baseline.md | v0.18.0 G02 — 날짜가 지나면 저절로 깨지던 테스트(CI 34042079441, #1278 수리)와 한 PC 의 로컬 파일에만 있던 줄바꿈 정책(Windows 체크아웃 CRLF 1,536개)을: 고정 시계·순번 UUID·수동 스케줄러·격리 저장소 도구와 ±400일 날짜 독립성 증명, 루트 .gitattributes + check-utf8 CRLF 게이트 + 정규화 스크립트, 저장 실패 주입(quota/abort/hang·답장 유실), psql 두 세션 barrier(tests/db), 출처 강제 통계 oracle 코퍼스, owner 전환·브라우저 시각 픽스처, 소스 모양 검사 72파일 유지/전환 장부와 G05 검사 자산표로. 제품 코드 무변경 (PR #1310, 이슈 #1280) |
2026-09-07-reps-stats-projection-1256.md | 반복수 투영 정본화(#1256) — 세부 종목의 기록 유형에서 반복수를 빼면 세션 상세는 숨기지만 통계 함수 14개(합계·볼륨·최대 반복수·추정 1RM·세트 스코어·무결성 검사)와 표시 함수 6개(피드 카드 v2·PR 히스토리·일지 표·그룹 보드·계획 상세)는 원본 reps를 직접 읽어 섞던 구조(#1236 잔여 위험)를, 무게와 같은 투영 열 stats_reps(기록 유형을 아는 트리거 계산, 숨김이면 null)를 두고 함수 20개를 schema.sql 마지막 정의에서 기계 조립해 투영을 읽게 교체 — 마이그레이션 2본, pgTAP 28+20단언, 원본 reps를 읽는 함수 허용 목록 게이트, Production 실측 잘못 섞인 값 0(구조 수리) (PR #1294, 이슈 #1256, 릴리스 v0.17.1 반영·프로브 확인) |
2026-09-07-v0-18-0-g05-coverage-ledger.md | v0.18.0 G05 — 추적 파일 1,934개와 서버 객체(테이블 77·함수 372·cron 7·Edge 3·API 4)가 어느 기능·계층·담당에 속하는지 아무 검사도 묻지 않던 것을: 분류 규칙 파일(영역 25·계층 20·규칙 302·근거 있는 제외 9·진입점 등록 25)과 검사 도구(미분류·미등록 진입점·장부 행 누락·미배정/미확인·문서 동기화, --strict 가 R01/R05 종료 검사)로 미분류 0·미등록 0 을 만들고, 장부 문서에 샘플 추적·생성 장부·보고서 31개/C01–C08/62개 대응·공용 파일/DB object(테이블 77)/CSS scope/native bridge 소유권·통지 절차·G03/D12/D13/R01/R05 인계를 고정. 행동 테스트 7건. CI 생략 머지 (#1307, 이슈 #1281) |
2026-09-07-v0-18-0-d03-sql-definitions.md | v0.18.0 D03 — 현재 SQL 정의(함수 376·표 77·정책 81·권한 문장 967)가 편집 불가능한 3.4 MB 스냅샷 한 파일에만 있고 편집 가능한 형식은 불변 이력(마이그레이션)뿐이어서, 62개 작업이 갈라져 SQL 을 고칠 자리·소유·오버로드 구분이 없던 것을: 도메인 18개 폴더의 객체 파일 462개(덤프 형태 그대로, 오버로드는 인자 타입 파일명) + qualified signature registry + 도메인 분류 규칙·층 규칙 예외(24건, 전부 호출 방향) 닫힌 목록 + 원천 diff 로 후보 마이그레이션을 만드는 생성기(함수·정책·트리거·뷰·권한만, DDL 은 명시 입력) + 원천 == 스냅샷 문장 단위 drift 검사(npm test, Docker 불필요, fixture 9종 탐지) 로. 마이그레이션·앱 변경 없음 (PR #1312, 이슈 #1283) |
2026-09-07-v0171-release-readiness.md | v0.17.1 출시 준비 — 첫 투영 이관 잠금 예산과 동시 저장 세대·영수증 경합 수리, 실제 CLI/DB 회귀 및 배포 경로 연결 (#1324) |
2026-09-07-ios-resume-surface-1344.md | 앱 복귀의 중복 인증 갱신·조회 취소 제거, 네이티브 WebView/부팅 표면 분리와 iOS 관측 (#1344, 실기기 시각 결과 미확인) |
2026-09-07-auth-session-ready-gate-1277.md | iOS 앱을 다시 열 때마다 홈 즐겨찾기·정지 여부·관리자 여부 조회 3건이 로그인 토큰 없이(익명 키로) 나가 42501로 거부되던 것(BUG-080, 9/3~9/6 13건)을, 서버 클라이언트 관문 getClient()의 Keychain 복원 대기 + SDK global.fetch 전수 가드(계정이 기억된 동안 데이터 요청은 익명 키로 나가지 않는다 — 세션 준비 뒤 토큰 교체, 준비 안 되면 LG_AUTH_SESSION_NOT_READY로 사본 대체·재시도)로 종결. iOS 재시작 재현·가드/웹 흐름 테스트 2파일 (#1308, 이슈 #1277, 릴리스 v0.17.1 반영·프로브 확인) |
2026-09-07-v0-18-0-g03-domain-contracts.md | v0.18.0 G03 — 식별자·시각·단위가 전부 string/number 별칭(341곳)이고 저장 단계(기기 보관·서버 확정·통계 반영)·owner 세대·조회 스냅샷·저장물 decoder 결과에 이름이 없어 층마다 필드로 추측하던 것을: 공유 계약 층 src/react/contracts/{core,commands,resources,ports,persistence}(브랜드 식별자 12·입력 중 상태 union·명령 종류 통일+wire 대응표·PreparedMutation 불변/가변·영수증·실패 분류 참조 구현·충돌 사본·저장 단계 3+1·owner 세대·표시용 사본 쓰기 금지·통계 세대·명령별 정책표 durable 5/online 18/auth 4/upload 2·port 16+4·형식 버전 decoder)와 계층 의존 허용표·래칫 테스트(DB 행 타입 import 기준선 3파일)로. 행동 테스트 35건·컴파일 fixture 3파일(금지 조합 16줄), 앱 동작 변화 0, 제품 정책 P1~P10 값 불변 (#1311, 이슈 #1282) |
2026-09-07-v0171-legal-service-information.md | v0.17.1 운영·공개 안내, 공식 문의 경로, 미확정 법률문안 공개 제외와 최신 main 통합 (#1297) |
2026-09-07-v0-18-0-u01-ui-foundation.md | v0.18.0 U01 — 입력·포커스·저장 단계의 공통 계약, 작은 primitive와 오류 gate 버튼 연결, 플랫폼별 Edge 행동 검사 (#1289) |
2026-09-07-v0-18-0-a01-rpc-transport.md | A01: 단일 RPC 전송·도메인 목적지 9개·G03 port 연결·DB 행 타입 import 0개 |
2026-09-07-v0-18-0-a03-catalog-profile-repository.md | v0.18.0 A03 — 종목 카탈로그·프로필의 검증·변환·응답 해석과 서버 호출이 5,325줄 barbelicRepository.ts 안에 다른 도메인과 섞여 있고 계약 port 결과가 unknown 이던 것을: 순수 codec(catalogCodec·profileCodec, any 0)·factory(catalogRepository 23·profileRepository 8)·좁은 서명 helper·중립 입력 검사기로 나누고(옛 파일 −1,203줄, 반환 모양·공개 이름 불변), ports/catalogDto·profileDto 로 카탈로그·프로필·온보딩 port 결과를 타입으로 고정, G03 §16 담당 표기 정정. 행동 검사 15건, DB·UI 변경 0 (이슈 #1330) |
2026-09-07-self-service-landing-1313.md | HQ 수동 랜딩 승인 제거 — 담당자의 한 번 요청 뒤 Actions가 검증·머지·staging 확인을 직렬 실행하고 중단 후 재개 (#1313) |
2026-09-07-v0-18-0-g04-performance-baseline.md | v0.18.0 G04 — 저장 시간·통계 반영 시간·릴리스 비교를 아무도 답할 수 없던 것(계측 세 곳 분산·잇는 열쇠 없음·잡 처리 시간 항상 0·부하 조건 미기록)을: 진단 규격(열쇠 7·채널 11·금지 필드·증거 schema), 조건이 적힌 workload 6프로필(결정적 생성·샌드박스 적재), 측정 러너 3·Production 읽기 전용 프로브, 기준 SHA 실측(볼륨 리포트 10년 3,104ms·통계 소진 10년 128초·cron WAL 46GB/20일·브라우저 cold 홈 965ms), 릴리스 예산(상한 18·추세·회복·관찰·RPO/RTO 평가법)과 RELEASE_PERFORMANCE_BUDGETS 대조 테스트로. 테스트 22건, 앱 동작 변화 0, SQL 변경 0 (#1315, 이슈 #1284) |
2026-09-07-v0-18-0-d01-stats-projection-contracts.md | v0.18.0 D01 — 통계 함수 10개가 같은 투영 표에 겹쳐 쓰고(세션 합계 6·기간 통계 5·훈련 기간 4·종목 통계 3 작성자) "같은 결과" 의 정의도 없어 계산 구조를 못 바꾸던 것을: 계산 DAG·작성자 계약(현행 10단계·표 20개 현재/목표 작성자 장부 stats-projection-writers.json + schema.sql 정적 분석 검사 7건), 정책·세대 계약(정책 9종·반올림·null/0·동률·세대 G-1~G-8·비교 제외 사유·불변식 16), oracle 코퍼스 15사례(손 계산 기대값 120개, 앱 출력 복사 0), 샌드박스 동치 검사(oracle 적재 대조·전체 재계산 결정성·불변식 12·workload 1년/4년 기준 요약)로. 앱·SQL 변경 0, 수치 정책 불변. 드러난 것: e1RM 저장은 1kg 정수·user_exercise_records 는 화면이 안 읽는 표·롤오버가 발행된 세대를 재작성 (#1319, 이슈 #1286) |
2026-09-07-v0-18-0-s01-pending-save-codec.md | v0.18.0 S01 — 기기 대기열(미전송 기록) 행의 저장 형식이 "지금 코드의 타입" 과 같아 두 버전의 코드(배포 직후 옛 탭 + 새 탭, 옛 앱 설치본 + 새 웹)가 같은 저장소에서 서로의 필드를 어떻게 다루는지 규칙이 없고, 읽기 보정이 3곳에 흩어지고, 깨진 행을 원문 보존할 자리가 없고, 요청 지문 정의가 둘이던 것을: 버전 있는 형식 계약(kind 5종·전송 메타·추가 전용 메타·불변 묶음) + codec 한 곳(너그러운 읽기·원문 참조 보존·모르는 버전/깨진 행 분리) + 스토어 update 의 모르는 필드 보존 병합 + 통합 지문 정의 하나 + 실제 v0.17.0 릴리스 번들 탭과 새 번들 탭을 같은 origin 에 띄운 공존 실측(CASE-039: 옛 탭은 새 필드를 보존하되 claim 은 무시, 서버 반영 정확히 1회) + 새 writer 활성화·rollback 조건 문서로. 서버·저장 형식·쓰는 필드 무변경 (PR #1320, 이슈 #1285) |
2026-09-08-v0-18-0-s04-claim-successor.md | v0.18.0 S04 — 기기 대기열에서 서버로 보내는 중인 수정 위에 같은 기록을 다시 고치면 전송 중 행이 지워지고 늦은 실패 답장이 옛 요청을 되살리며, 탭 두 개가 같은 행을 함께 보내고, 서버 id 없는 새 기록의 수정·삭제가 메모리에만 남아 탭 종료 시 사라지던 것을: 행 단위 claim(탭 id·만료 10초·fence)을 S02 원자 교체의 재검사로 적고 전송기의 상태 변경 전부(전송 시작·성공 삭제·실패 되돌림·보류·격리)를 "내 claim 이 그대로일 때만" 으로 + 전송 중 행은 보존하고 새 편집을 후속 행(successorOf, 선행 확정 뒤 전송)으로 + 새 기록의 후속은 의도 행으로 저장했다가 생성 영수증 뒤 서버 id 요청으로 변환 + 실제 Chromium 두 탭 4 시나리오·실제 v0.17.1 번들 탭 공존 e2e(CASE-040 신설·CASE-039 재실측)로 검증하고 새 writer 를 켰다(계약). 저장 형식 v1·추가 필드만·서버 무변경 (PR #1369, 이슈 #1334) |
2026-09-08-v0-18-0-s05-dispatch-reconcile.md | v0.18.0 S05 — 기기 대기열의 전송이 한 파일에서 화면 함수 17개를 직접 잡고 영수증을 대조 없이 채택하며(같은 영수증 두 번이면 갱신·안내도 두 번) 실패 판정이 세 벌·sender 가 두 겹이던 것을, 기기 행만 보내는 dispatcher(단일 sender·단일 분류기·재시도 정책 소유) + 보낸 요청과 영수증을 대조하는 reconciler(멱등 키·지문·종류·개정번호·세대, 채택 장부로 중복 1회, 미달이면 격리 보존 + 결과 미상) + typed 결과 하나를 받는 화면 binding 으로 나눴다. 그 과정에서 S04 의도 행 변환 포트가 S03 이 지운 함수를 부르고 있어 새 기록 전송 중 수정이 항상 격리되던 결함을 발견·수리했다(계약). 서버·저장 형식 무변경 (PR #1374, 이슈 #1336) |
2026-09-08-v0-18-0-s04-claim-successor.md | v0.18.0 S04 — 기기 대기열에서 서버로 보내는 중인 수정 위에 같은 기록을 다시 고치면 전송 중 행이 지워지고 늦은 실패 답장이 옛 요청을 되살리며, 탭 두 개가 같은 행을 함께 보내고, 서버 id 없는 새 기록의 수정·삭제가 메모리에만 남아 탭 종료 시 사라지던 것을: 행 단위 claim(탭 id·만료 10초·fence)을 S02 원자 교체의 재검사로 적고 전송기의 상태 변경 전부(전송 시작·성공 삭제·실패 되돌림·보류·격리)를 "내 claim 이 그대로일 때만" 으로 + 전송 중 행은 보존하고 새 편집을 후속 행(successorOf, 선행 확정 뒤 전송)으로 + 새 기록의 후속은 의도 행으로 저장했다가 생성 영수증 뒤 서버 id 요청으로 변환 + 실제 Chromium 두 탭 4 시나리오·실제 v0.17.1 번들 탭 공존 e2e(CASE-040 신설·CASE-039 재실측)로 검증하고 새 writer 를 켰다(계약). 저장 형식 v1·추가 필드만·서버 무변경 (PR 1377, 이슈 #1334) |
2026-09-08-v0-18-0-s07-owner-index-mirror-timeout.md | v0.18.0 S07 — 기기 대기열(IndexedDB pendingSaves)이 행 하나를 보낼 때마다 전체를 여섯 번 다시 읽고 localStorage 사본 전체를 두 번 다시 적어 1000행 드레인이 152.8초(O(N²))였고, 사본 갱신 전에 탭이 죽으면 서버에 올라간 기록이 되살아나던 것을: 행의 불변 묶음(owner·target·savedAt)에 기댄 메모리 카탈로그(IDB 버전 6 고정 — 올리면 옛 탭이 VersionError, 실측) + 커밋 재검사를 키 스캔 + 필요한 id 만 읽기로 + 미러 v2(행별 키·본문/메타 분리·tombstone·세대, 성공 ACK 는 tombstone 먼저, 옛 배열은 묶어 쓰기, DB 가 새로 만들어졌을 때만 복구·어긋나면 격리) + IDB 공통 adapter(열기·트랜잭션 8초 상한, 시간 초과를 "안 썼음 / 결과 미상 → 재조회" 로) 로. 1000행 6.1초(25배), 실제 Chromium 복구 매트릭스 7/7·timeout 3/3·기존 두 탭·원자성 전부 통과, 저장 형식 v1·추가 필드 recovery 만·서버 무변경(계약) (PR 1377, 이슈 #1337) |
2026-09-08-v0-18-0-s06-conflict-successor.md | v0.18.0 S06 — 두 기기가 같은 기록을 고쳐 개정번호 충돌이 나면 앱은 서버 최신 개정번호로 새 요청(새 멱등 키·지문)을 만들어 다시 보내는데, 그 요청이 메모리에만 있어 서버가 저장한 뒤 답장이 유실되면 재시작 때 원 요청이 또 나가 같은 수정이 두 번 반영되고 충돌 근거는 어디에도 남지 않던 것을: 재조립한 요청을 보내기 전에 기기 대기열의 후속 행으로(원 행 제거 + 후속 행 + 근거 conflict 를 S04 원자 교체 하나로) 적고 전송 루프가 종전 규칙대로 보내게 해 재시작 뒤 같은 id·지문이 나가 서버 재생 영수증으로 수렴(수정·삭제·계획 저장·계획 삭제 4종), 못 적으면 원 요청 유지·미전송, 연속 충돌은 전송당 3개 상한, 근거는 행 필드(확정 전)+localStorage 요약 장부(확정 뒤, S09 입력)로. 실제 Chromium IndexedDB 재시작 실측, 서버·저장 형식 무변경(계약) (PR #1385, 이슈 #1341) |
2026-09-07-v0-18-0-s08-draft-lifecycle.md | v0.18.0 S08 — 유저가 지운 운동·이전 운동의 서버 백업 업로드가 늦게 닿으면 지운 백업이 되살아나거나 새 운동의 백업을 덮고(서버 저장이 조건 없는 덮어쓰기), 계정 전환 보존 저장이 끝나기 전 같은 계정 복원이 "초안 없음" 으로 판정하고, 만료·보관·스로틀이 벽시계에 묶여 경계를 검증할 수 없던 것을: 초안 상태를 typed 하나로(workoutDraftLifecycle.ts, 전이 함수·호환 ref) + 서버 백업 요청 직렬 줄(삭제는 줄 끝, 응답 시간 초과 15초 포기, 순번 학습·stale 1회 재시도) + 계정별 보존 꼬리 대기 + ClockPort 주입 + 서버 펜스 표 workout_draft_checkpoint_fences·v2 함수 3(순번 불일치 stale·지운 운동 retired 거부)·v1 호환 재발행·pgTAP 23 로. 정책 P7(7일·5개·3일·owner 하나) 불변, 마이그레이션 1(위험 low, 기존 행 변경 없음) (PR #1350, 이슈 #1326) |
2026-09-07-v0-18-0-s02-outbox-atomic-replace.md | v0.18.0 S02 — 기기 대기열에서 같은 기록의 수정 위에 수정·삭제를 얹을 때 "옛 행 삭제 → 새 행 쓰기" 두 번의 저장이라 두 번째가 실패하면(저장 공간 초과·중단·탭 닫힘) 이전 미전송 수정이 사라지고, 읽은 뒤 바뀐 행 위에 모른 채 덮어쓰고, 답을 못 받은 생성 기록을 삭제로 지워 버리던 것을: 스토어의 원자 연산 replace 하나(계약 — 순수 계획기 + IndexedDB readwrite 트랜잭션 하나 안 재검사 → 보존 병합 put → delete, stale 이면 다시 계획, 커밋 뒤에만 화면 반영, 같은 계약의 메모리 adapter) + 생성→삭제 상쇄를 "한 번도 보내지 않은 행" 으로 축소 + 실제 Chromium IndexedDB 8 시나리오(abort 3지점·quota·탭 종료·동시 교체·owner 분리·거부 뒤 보존) 검증으로. 저장 형식·서버 무변경 (PR 1377, 이슈 #1325) |
2026-09-07-v0-18-0-d13-populated-db-upgrade.md | v0.18.0 D13 — 빈 DB 재생만 있고 데이터가 쌓인 DB 에서 마이그레이션이 얼마나 잠그고·걸리고·중간에 죽으면 어떻게 되고·옛 앱이 살아 있는지 재는 도구·증거 형식이 없던 것을: 문장별 위험 분류(잠금·재작성·스캔·WAL·재실행·공존, 헤더 -- migration-risk:), populated upgrade harness(직전 릴리스 스키마 + 데이터 사본/workload → 파일별 시간·WAL·잠금 대기·옛 앱 프로브·중단/재실행·사실 digest·공존 diff → -- upgrade-evidence:), 배치 백필 primitive(키셋 커서·checkpoint·재개·advisory lock, DB 객체 0), check:migrations·db:preflight·landing:lock 게이트 연결로. 실측: v0.17.0→main 의 #1256 투영 백필이 3,120세트 fixture 에서 1.95초·WAL 4MB·옛 앱 프로브 최대 1,893ms 대기(오류 0). 단위 테스트 21건 + 실 Postgres 6건, 마이그레이션·앱 변경 없음 (이슈 #1287) |
2026-09-07-v0-18-0-d12-db-model-quality.md | v0.18.0 D12 — 표·인덱스·FK·RLS 장부가 없어 기능 PR 마다 인덱스가 제각각 쌓이고 세트 하나를 지울 때 투영 표 5개를 전체 읽던 것을, 기계가 뽑는 DB object 장부(표 77·뷰 3 전부 등급·작성자·보존·결론·증거)·닫힌 인덱스 판정(npm test)·도메인 6개 제약/권한 pgTAP(98)·대표 조회 34개 실행계획 전후·인덱스 29 drop + FK 참조 열 인덱스 25 + staging owner 연쇄 FK 4 로 바꾼 기록. 세트 삭제 버퍼 45배·계정 삭제 36초 → 8초, WAL +32%(전량 재계산) 실측 (이슈 #1328) |
2026-09-07-v0-18-0-b01-auth-account-api.md | v0.18.0 B01 — 서버 API(계정 삭제·관리자 열람·시험 관리자 로그인)의 공용 도우미 자리가 없어 본문 상한 초과가 응답 없이 매달리고 외부 호출에 시간 제한이 없던 것, 삭제가 끝났는데 응답이 유실되면 재시도가 401 실패로 보이던 것, 삭제 행위자 검증이 앱에만 있던 것, Production 을 가리키는 서버의 시험 관리자 로그인이 환경변수 하나에 달려 있던 것, 열람 종료 뒤 대상 세션이 서버에 살아 있던 것, 네이티브 콜백 거래 대조가 네이티브 한쪽에만 있던 것을: 서버 공용 경계 api/auth/_shared.js(413/400/504/503 명시 결과·시간 제한·로그 키 차단) + 410 account_already_deleted 완료 처리 + amr 행위자 판정(403) + Production ref 차단·상수 시간 비교 + 열람 세션 서버 폐기 + 앱 거래 장부(늦은·중복·뒤바뀐 콜백) + 인증 오류 분류 모듈 + 계약 문서로. 로컬 Supabase 실측(200→410, magic link 세션 403, logout 204→refresh 400), 새 테스트 9파일 54건, 마이그레이션 없음 (이슈 #1331) |
2026-09-07-v0-18-0-phase1-closeout.md | Phase 1 종료 보완 — S01 미러 원문 보존과 준비 상태 계약, D01 고정 입력·기준일 통계 재적재, D13 실제 소유자 probe와 실패 증거 거부, CASE-039 현재 RPC 완료 대기 및 전체 로드맵 상태 동기화. 4년 upgrade의 잠금 예산 초과와 저장·cron 경합을 후속 입력으로 남긴다 |
2026-09-07-v0-18-0-s03-pure-command-builder.md | v0.18.0 S03 — 서버에 보낼 완료 기록·계획 요청을 전송 함수를 일부러 실패시켜 오류에서 꺼내던 것(예외 기반 prepare, 브라우저 온라인 상태 읽기, 입력 오류와 기기 저장 실패 구분 없음, 지문 정의 둘, 계획 행은 지문 없이 적재)을: 입력 + 주입된 identity·시계만 받는 순수 조립기 6종(features/workout/commands·features/plan/commands) + typed 준비 오류 5종(적재 오류와 다른 union, 컴파일 fixture) + S01 통합 지문 하나(저장된 행 재계산 0) + 수정 원천 writeSource: detail|receipt 타입·validator + 새 계획 행 identity 4필드(옛 행은 base 없으면 준비 미완료) + 컨트롤러 호출 6곳 이식·예외 기반 prepare·identity Map 제거로. 새 테스트 10건, npm run check 3,040건, 서버 변경 0 (이슈 #1333) |
2026-09-07-v0-18-0-a02-workout-plan-repository.md | v0.18.0 A02 — 완료 기록·계획의 쓰기·검증·영수증·상세 변환이 거대 저장소(5,325줄)·매퍼(4,100줄)에 흩어져 있고 서버 응답을 세 층이 각자 snake/camel 두 이름으로 읽던 것을: domains/repositories/{workout,plan}Repository.ts + domains/codecs/ 6파일로 실제 이동(저장소 −1,523줄·매퍼 −976줄, 복사본 0, 공개 이름은 재수출), 상세 codec 만 서버 키를 읽고 결과를 WritableCopy 로 표시(이중 읽기 41→0, 표시용 사본으로 수정 요청은 타입·runtime 둘 다 거부), port 반환 unknown 10→4(결과 DTO 5종), 가짜 transport 로 factory 를 혼자 실행하는 행동 테스트 22건으로. 앱 동작·서버 변경 0 (이슈 #1329) |
2026-09-07-v0-18-0-d02-generation-atomic.md | v0.18.0 D02 — 정각 cron 과 겹친 정상 저장이 거절되던 세대 경합(#1345 선행 수리) 위에서, 계획 저장·삭제 영수증이 계약(0)과 달리 잠금 밖에서 읽은 유저 전체 세대를 적던 것을 엔진 2개 재발행으로 계약에 맞추고(잠금 밖 세대 읽기 0곳), 같은 세션 수정 vs 삭제·계획→완료 전이 vs 별도 enqueue·계획 삭제·세 단계 실패 주입을 실제 두 DB 연결 회귀 13건으로 고정. populated 4년 DB 증거·S05/A09·D04/D08/D11 인계 (이슈 #1327) |
2026-09-07-v0-18-0-b02-build-environment-boundaries.md | v0.18.0 B02 — 변수를 빠뜨린 스테이징 빌드가 조용히 Production DB 를 바라보고, 비밀값이 없어도 배포가 초록으로 끝나고, 환경 값이 여덟 곳에 손으로 적혀 있던 것을: 배포 대상 원천 deployment-targets.json + 빌드 대상 선언·대조(어긋나면 빌드 실패)·index.html 도장·배포 직전 산출물 검사·복사본 12곳 대조, 도구 버전 원천(.nvmrc·Vercel CLI 핀·setup-cli SHA)·docs-build 잡·Production 카나리 trace 끄기, 자원 예산 계약 45항목(RELEASE_RESOURCE_CONTRACT), 관리자·웹·서버·설치본 호환 표와 Android release 빌드 실측(iOS 미실행 명시)으로 (PR #1356, 이슈 #1332) |
2026-09-07-v0-18-0-a07-owner-auth-connectivity-lifecycle.md | v0.18.0 A07 — 계정 전환 때 "이 응답은 지금 주인 것인가" 의 기준값이 같은 뜻의 카운터 4개에 흩어져 있고, 떠나는 순서가 두 곳에 나뉘어 무효화가 초안 보존보다 먼저였으며, 자원 정리가 등록/폐기가 아니라 ref 60여 개 손 목록이고, 인증·연결 조립이 4,091줄 controller 의 effect 두 개에 갇혀 있던 것을: src/react/app/ownerRuntime.ts(G03 OwnerScope{userId, epoch} 구현 — 세대 정본 하나·owner 별 취소 신호·자원 등록/폐기·awaitLeave) + store 세트 host(보존 → 폐기 → 무효화 → 새 세트를 렌더 전 동기로) + authSessionRuntime.ts(인증 부팅·복원·이벤트·재시도 408줄 이동, 세 사건 signed_out/expired/deleted) + connectivityRuntimeHost.ts(연결 조립 278줄 이동, 폐기를 owner 자원으로) + 계약 문서로. 행동 테스트 22건(A 늦은 응답 → B 0건 적용, A→A 재로그인 새 세대, 5xx≠인증 실패), controller 4,091 → 3,503줄, 마이그레이션·서버 변경 없음 (이슈 #1335) |
2026-09-08-v0-18-0-a08-resource-cache.md | v0.18.0 A08 — 조회 캐시가 "문자열 키 → 값" 저장소일 뿐이라 owner·요청 수명·구독이 호출자 몫으로 남아 캐시 규칙이 4벌(달력 쿼리 캐시·계획/PR 상세 coordinator 5개·세션 상세 손 캐시·최소 버전 단일 비행)로 복제되고, 첫 소비자의 취소 신호가 요청 자체를 끊어 합류한 소비자가 깨지며, 캐시 변화를 dataTick·loading state 손 동기화로 React 에 알리던 것을: src/react/resources/resourceStore.ts(G03 ResourceCachePort 의 실제 구현 — 명시적 키, owner epoch 채택 울타리 넷, 소비자 취소와 요청 취소 분리("요청은 소비자가 있는 동안만 산다"), owner 떠남 = 항목·요청 자동 폐기, 5상태 불변 스냅샷 + 참조 안정 + 구독, LRU) + React 구독 훅 + 문자열 키 어댑터(달력, 옛 테스트 8건 그대로) + 첫 적용 경로 세션 상세(sessionDetailResource.ts: ref 5개·loading 손 동기화 state 제거, 대체된 옛 응답은 null 로 쓰기 원천 보호) + 계약 문서로. 행동 테스트 18건, controller 3,503 → 3,432줄, 마이그레이션·서버 변경 없음 (이슈 #1338) |
2026-09-08-v0-18-0-a13-plan-headless-editor.md | v0.18.0 A13 — 계획 편집의 판단(기록 항목·세트 완성·kg/lb/% 변환·% 기준·분:초·세트 타입·복합 값·저장 가능)이 데스크톱 DesktopPlanEditorModel+카드 핸들러와 모바일 WorkoutRecord 에 두 벌로 있고 값 모양(숫자·null / 문자열·"")이 플랫폼마다 달라 저장 직전까지 추측하던 것을: 순수 계획 모델 features/plan/editor/**(확정값+입력 중 원문 InputCell, 명령 27종·거부 사유, planReadiness, view model, 저장 행 port, 저장 intent union create=online/edit=durable, 저장 시도 순서) + 운동·계획 공유 policy features/editing/**(A12 공동) + 데스크톱 편집기를 얇은 adapter 로(판단 사본 0, JSX·CSS 불변) + 컨트롤러 저장 경로 연결 + 모바일 adapter(화면 미이식) + 플랫폼 동치 테스트(같은 입력 → 같은 S03 requestHash)로. 계약, 새 테스트 22건, 마이그레이션·서버 변경 없음 (이슈 #1340) |
2026-09-08-v0-18-0-a12-workout-headless-editor.md | v0.18.0 A12 — 운동 입력의 뜻(빈 값·0·입력 중·틀린 값 판정, 단위 환산, 완료 판정, 복합 동작, 빈 세션 종료, 저장 payload)이 모바일 기록 화면 1,640줄과 데스크톱 작성기 모델에 각자 있어 화면마다 결과가 달라질 수 있던 것을: 공통 순수 정책 contracts/workout/** 6파일(종전 ui/shared 는 재수출) + headless editor features/workout/editor/**(G03 InputCell 첫 소비자 — IME 조합 중 원문 보존·저장 금지, lb/%/분:초/km 정규값·표시값 분리, LocalRowKey, command 26종 순수 reducer, 완료·종료·저장 판정 한 벌, 초안 왕복, 저장 intent → S03 조립기) + 모바일·데스크톱 얇은 adapter(같은 DTO·sequence → 같은 저장 입력·요청 지문 테스트) + 실제 저장 콜백 앞 관문(LG_EDITOR_INPUT_INCOMPLETE, payload 원문 불변)으로. 새 테스트 21건, 서버 변경 없음 (이슈 #1339) |
2026-09-07-e2e-master-plan.md | E2E 전면 정비 계획 문서화 — 예상 산출물, 기존 39개 + 핵심 8개 + 전체 대표 여정 10개 = 약 57 CASE의 증감 근거와 미검증 범위 |
2026-09-07-e2e-pr-gate-v0.17.2.md | v0.17.2 E2E 구현 — S04 통합 후 58개 패키지·PR 필수 57개 여정·14개 viewport, 실제 복구 오류 수정, CI 결과 검증과 배포 준비 |
2026-09-08-exercise-detail-hero-fit-1381.md | 종목 상세 누적 숫자가 단위 위로 겹치고 그 넘침으로 화면이 좌우 스크롤되던 것을, 글자 수 추정 대신 실제 폭 측정으로 숫자를 맞추고 덮는 페이지 전부를 세로 스크롤 전용 계약으로 고정해 수리. 브라우저 폰 목업은 배경 한 겹·상태바 여백으로 정리 (이슈 #1381, BUG-081·082) |
2026-09-08-v0-18-0-phase2-closeout.md | Phase 2 종료 보완: 18개 원 구현 병합·실제 배포 장부, 고아 후속/미확인 미러의 영수증 확인, owner resource 재조회·계획 카드 수렴. 별도 브랜치 검증과 운영/실기기 인계를 구분 |
2026-09-08-navigation-stack-1393.md | 오른쪽 슬라이드 화면 12종(친구 안 일지 포함 15종)에서 뒤로가기가 경로마다 다르던 것(Android 뒤로 버튼이 앱을 내림·iOS 가장자리 스와이프 무반응·탭바를 눌러도 깊이 화면이 남음·닫을 때 탭이 바뀜)을, 열림 상태의 소유자 5곳·히스토리 등록 3/12·스와이프 판정 5벌·원점 복귀 4종을 내비게이션 저장소의 화면 스택 하나(push/pop/unwind, 등록표 19종 + 게이트, 공용 슬라이드 셸, 스와이프 훅 한 벌)로 통일해 뒤로가기 4경로 = 같은 pop·탭바 = 전체 초기화로 정리. 도구 화면 3종도 편입(D1=a). 새 테스트 26건, 서버·네이티브 변경 없음 (이슈 #1393, BUG-083) |
2026-09-08-v0-18-0-a09-vertical-integration.md | v0.18.0 A09 — 저장→기기 보관→서버 영수증→무효화→재조회가 새 경계만으로 도는 첫 완성 경로: 계획 저장·삭제만 "온라인 RPC 먼저, 실패하면 대기열" 두 갈래였고, 완료 상세·계획 상세·카탈로그가 캐시 규칙 세 벌(A08 store·옛 조정자·단일 비행)을 갖고, 저장 규칙이 편집기와 컨트롤러 두 벌이었으며, 답장 뒤 재조회가 결과 종류와 무관하게 일괄(계획 영수증까지 통계 폴링 + 경고)이던 것을: 계획 상세·카탈로그 resource 신설 + 완료 상세 열기 resource 경로 하나 + feature 선택자(features/*/queries), 계획 수정·삭제를 intent.capability 값이 정하는 한 갈래(S03 조립 → 대기열 → dispatcher, features/plan/commands/planWriteCommand.ts), 컨트롤러 4단계 정규화 → 편집기 exercisesForSave(동치 검사: 같은 payload → 같은 S03 지문), 영수증 → "무엇을 다시 읽을지" 순수 표(결과 6종 × 행 5종, 계획은 세대 0 이라 통계 대기 없음)로. 새 테스트 43건·앵커 8파일 재조준, 서버 변경 없음(계약) (PR #1394, 이슈 #1342) |
2026-09-09-e2e-fixed-pr-snapshot-date.md | 고정 E2E 날짜와 PR 스냅샷 기준을 일치시켜 빈 계정·화면 검사의 날짜 표류를 수리. 기존 bootstrap·worker 발행 검사를 보존 (#1446·#1447) |
2026-09-09-v0-17-5-stats-convergence-hotfix.md | #1432 최신 통계 서버 복구: 계산·게시 분리, 점수 배치·strength 증분, 두 운영 계정 수렴과 원본 보존 확인. 운영 게시6초 override 및 남은 D08·휴대폰 확인을 구분 |
2026-09-09-validated-tree-reuse-1476.md | #1476 · v0.17.7: 성공 tree 장부와 큐·승격의 전체 검증 재사용. 로컬 검증·release 병합·main 활성화 상태를 구분 |
2026-09-09-release-queue-commands.md | 릴리스 큐 구조(작업→release→staging→main)에 맞춰 명령 4개(ci:precheck-local·ci:full-local·merge:request·ci:wait)와 워크플로 7개 이름(1-Production Deploy·2-Staging Deploy·3-Release Merge Request·GitHub Full CI·Production smoke (manual)·Social login daily check·Daily data backup)을 정리하고, PR 전 검증을 사전 검증(최신 release 합치기 → verify → 서버 변경 시 DB)으로 줄여 전체 검증은 큐 runner 안에서만 돌게(포트 4173 고정, 재현은 워크트리별 포트) 했으며, 배포 워크플로를 환경별 파일로 분리하고 Production smoke 를 배포에 통합, 소셜 로그인 매일 점검을 카카오·구글·애플 3종으로 넓혔다(이슈 #1456·#1457·#1458, 목표 v0.17.6) |
2026-09-09-app-main-document-sync-1463.md | 초기 이관 84e2d7d35 이후 앱 main df394f77a의 문서 27개를 docs main과 3-way 통합. #1460 개명·날짜/통계 수리·CASE-059/060 기록과 docs PR #1·#10을 보존. 큐 호환 main 반영·독립 관리자 staging 검증·아직 남은 운영 연결 전환을 구분 |
2026-09-09-stats-publish-cadence.md | #1465 v0.17.7 후보: 통계 worker 예약 5초→1초, 운영 제한시간 보존·로그 보관, 실제 저장 전후 측정과 출시 상태 |
2026-09-09-post-deploy-browser-checks.md | #1485 v0.17.7 후보: smoke 직후 태그·비차단 사후 점검·실패 알림과 CASE-011 조사 정정 |
2026-09-10-v0.17.7-release.md | v0.17.7 통합 범위·실패 수리·검증 예외와 실제 배포 상태를 구분한 HQ 기록 |
2026-09-09-ci-display-names-1470.md | #1470 유저 실사용 시뮬레이션·화면 정합성 검사로 Actions·로컬 요약·증거·문서 이름 통일. 실행 식별자와 검사 내용 유지, v0.17.7 적용 상태 구분 |
2026-09-10-deploy-permissions-v0177.md | #1480 배포 호출자 권한 수정의 v0.17.7 포함, 최초 큐 실패와 통합 CI 성공·release 병합 증거 |
2026-09-10-app-landing-removal-1477.md | #1477 앱의 홍보 랜딩 복사본·분류·문서 참조 제거, 독립 코드·문서 정본 보존과 v0.17.7 release·staging 반영 및 통합 full CI 성공 |
2026-09-10-local-ci-parallelization.md | #1464 병렬 기본 4·사용 후 종료·유휴 정리, 긴 구버전 경로 수리와 최종 full 7분 32초 통과. release·staging 병합과 아직 남은 Production을 구분 |
2026-09-10-test-time-budgets.md | #1468 케이스 60초·브라우저 대기 10초·자동 재시도 0회, 반복 복구 검사 보완과 최종 브라우저 56·화면 22건 통과. release/staging 병합·Production 확인 전 |
2026-09-09-v0-18-0-a05-import-admin-repository.md | v0.18.0 A05 — Wodup 업로드·시작·조회, Motra 기입, 관리자 신고·정지·유저 검색·운영 점검표가 5천 줄 barbelicRepository.ts 안에 통계·소셜과 섞여 있고 결과가 전부 unknown/any, "접수됨"과 "끝남"을 배치 행 하나로 돌려줘 화면 세 곳이 status 문자열로 완료를 판정하며, 관리자 전용 함수가 일반 앱 파사드에 실려 앱 청크에 관리자 RPC 이름이 들어가던 것을: importRepository·adminRepository factory + domains/codecs/{wodupImport,motraImport,adminModeration}Codec 으로 이전(옛 파일 −360줄, 본문 0), 잡 DTO(서버 status → pending/running/succeeded/failed 변환표 1곳, 시작 결과 accepted/already_running/already_terminal, Motra 는 동기 완료)로 ImportPort 결과 unknown 5→0, 관리자 함수를 일반 파사드에서 제거해 앱 빌드 청크의 관리자 RPC 이름 0(모듈 그래프 검사 + 빌드 grep; 관리자 화면은 v0.17.7 부터 Barbelic-docs/admin), 본인 데이터 내보내기 port 분리. 행동 검사 24건, DB·UI 변경 0, 2026-09-10 main(v0.17.7) 반영 (이슈 #1406) |
2026-09-10-release-precheck-only.md | #1491 작업 precheck·release Merge Check·최종 staging 후보 full·main 동일 tree 재사용으로 반복 검사 축소. v0.17.8 구현·실제 적용 확인 중 |
2026-09-10-v0-18-0-a14-exercise-history.md | v0.18.0 A14 — "기록 보기"가 친구 세션·비슷한 이름 종목을 섞던 것을 서버 이력 RPC 한 곳·canonical 종목 id·Map 색인 병합·연도 창(15행 페이지)으로. 세트 원자 4종 RPC 추가(v4 유지), 문(v4) 3.6초·워커 60초 예산 인계 |
2026-09-10-v0-18-0-d08-stats-worker-lease.md | v0.18.0 D08 — 통계 worker 가 한 호출에 여러 유저를 한 트랜잭션에 묶어 느린 B 가 A 의 저장을 막고, 죽었다 돌아온 작업자가 새 임대를 덮어쓰고, Production 게시 6초가 손 편집 cron 명령에만 있던 것을: 한 트랜잭션 = 한 유저(동기 문 has_more·Edge 는 격리 3단계·인입은 enqueue 만), 임대 토큰 울타리(55P03)·단계 경계 heartbeat·backoff·문맥 초기화, 설정 표 stats_projection_worker_settings 한 곳(기본 게시 6초), 계산 중 저장은 자기 세대 게시, 관측 함수. 실제 DB 연결 4개 회귀·pgTAP 48. 마이그레이션 1건 |
2026-09-10-isolated-probe-state.md | #1495 격리 수렴 probe의 원본 큐·세대·임대 복사 제외와 실제 PostgreSQL 회귀. 사전검증 5분 33초·Merge Check 잡 52초 각 1회 통과, v0.17.9 release 반영·Production 전 |
2026-09-10-test-case-quality-1478.md | #1478의 품질15조건 강제·실제78건/7SQL결함 검증·현재75/75적합·와드업/관리자 전 계층 제외 결정과v0.17.9 release통합 |
2026-09-10-v0-18-0-i01-import-boundaries.md | v0.18.0 I01 — Wodup·InBody·Motra 세 인입 경로가 실패를 각자 Error("문구")·null 로 말해 화면이 "파일을 가져오지 못했어요"로 뭉개고, 같은 파일 재업로드가 서버까지 가서 실패하고, InBody 건너뛴 행·이미 넣은 파일이 "N개 가져왔어요"로 숨고, 서버 정규화가 날짜·숫자를 조용히 추정하던 것을: 인입 계약 1벌(features/import/importContract.ts — 단계·코드·줄/행·원문 가용성·경로 등록표·A11 화면 상태)로 통일, 브라우저 SHA-256 으로 완료된 파일은 already_imported·진행 중은 붙기·실패는 새 배치, InBody 건너뜀·중복·already_imported 정직 보고, Motra typed 오류 5종·statsPending, 서버 WodupNormalizeError(코드·줄)·경고 3종, 죽은 Motra 파서 사본 −791줄, npm run perf:import 실측(1만 세션 24MB: 사전검사 0.3초·정지 47ms, 정규화 0.94초·힙 226MB = Edge 한도 88%), replay fixture 3종. DB 변경 0 (이슈 #1415) |
2026-09-10-stats-health-monitor.md | #1432 PM-08: 미반영 세대·정체·임대·저장 잠금 대기 감지와 과거 실패 오보 제외. precheck7분37초·Merge Check67초 통과, v0.17.9 release 반영·운영 활성화 전 |
2026-09-10-v0179-promotion.md | #1511 v0.17.9 승격: 같은 날짜 조회 취소·집계 의존성 수리와 CI·배포 검증 |
2026-09-10-v0-18-0-a11-feature-resources.md | A11 프로필·소셜·그룹·인입 resource 이전, 공유 조회·owner/권한·관찰 복원. precheck·Merge Check 성공, PR1516 v0.18.0 반영 및 G05/A16/R04 인계 |
2026-09-10-d06-period-calendar.md | D06 종목·훈련 기간·달력 완성 행, 11개 계산 작성자→3개, D04/D07 영향·미완료 발행 거부·실제 DB/쓰기/재시도 증거. v0.18.0 release 통합과 운영 배포 구분 |
2026-09-10-d07-sequential-checkpoints.md | D07 PR·e1RM·최대반복수·점수의 검증된 일자 상태와 suffix 재생, D06 실제 영향, 동치·발행·비용 증거와 과거 수정 시간 증가 한계 |
| 2026-09-10-u03-desktop-editor-responsive.md | U03 #1421 — A12/A13 Desktop 연결·S08 최신 입력·S09 복구·고정 canvas 제거·실제 200% 확대 검증 (v0.18.0, Production 미반영) | | 2026-09-10-v0-18-0-d10-maintenance.md | #1418 D10: repair 행 페이지·cursor/watermark·retry, catalog token·날짜 새 세대, 발견/처리 비용 분리와 D08 연결. v0.18.0 release 반영·Production 미배포 | | 2026-09-10-u02-mobile-editor.md | U02 #1420 — 실제 A12/A13 모바일 입력·S08/A09 저장 수명·S09 복구, 브라우저·공통 fixture 검증 | | 2026-09-10-d11-orchestration.md | D11 #1422 — 공통 통계 계산·18개 출력 원자 게시, full 우선 이관과 shadow 동치 검증 | | 2026-09-10-desktop-logout.md | #1530 데스크톱 고정 메뉴에서 바로 로그아웃, 기존 공통 인증 종료·로그인 화면 복귀 유지 | | 2026-09-10-v0-18-0-phase4-plan.md | Phase 4 7개 실행 이슈·D14 원본 변경행 저장 추가·63개 로드맵·D11/R01/R04/R05 쓰기 효율 인계 (계획 게시, 구현 미착수) | | 2026-09-10-journal-date-boundary.md | #1529 일지 선택일의 영향을 일지 조회로 한정하고 운동 시작일을 저장·복원에 보존 — CASE-011 실제 경로 통과, PR #1539로 v0.17.10 release 반영·Production 미적용 | | 2026-09-10-d14-session-child-delta.md | D14 — 메모/동일 내용의 자식 UPDATE 21→0, 필요한 재정렬·원본 보존·실제 DB 검증 | | 2026-09-10-a15-feature-bindings.md | A15 기능별 binding·공용 context 제거·실제 수명주기와 편집 검증 |
| 2026-09-10-u07-css-ownership.md | U07 #1532 — intrinsic 소유 화면 통합·중복/미사용 CSS 정리, 탐색 순서·32속성 비교·U04/U06/R01 인계 | | 2026-09-10-records-hero-volume-layout.md | #1552 — 종목 상세 누적 숫자·단위 넘침 수리, 실제 브라우저 경계 검증 | | 2026-09-10-u04-viewport-lists.md | U04 #1535 — 실제 viewport DOM 제한·canonical identity·위치/포커스 복원·동일 workload 비용 | | 2026-09-10-screen-transitions.md | #1554 — 공용 로딩 표시·편집 복귀·리포트 기간 전환 개선, 모바일 7탭·화면 스택 19종 코드 대조와 실제 검증 범위 | | 2026-09-11-home-complete-reveal.md | #1554 후속 — 메인 요약·종목 기록·등급·최초 목록 준비까지 전체 스켈레톤 유지 후 본문 공개 | | 2026-09-11-v01710-promotion.md | #1557 — 두 승격 full·main 병합·Production 배포·CRUD12/12·v0.17.10 태그 성공, 실행 제한과 CI 재사용 판정 경위 기록 |
| 2026-09-11-v0-18-0-a16-type-boundaries.md | A16 #1534 — 활성 any·내부 이중 해석 정리, 실제 feature/domain 소유와 호환 decoder 보존 | | 2026-09-11-disable-post-deploy-browser.md | #1564 — 오너 승인 hotfix로 staging·main에 사후 브라우저·경고 잡 중단 반영. Full CI·기본 smoke 유지, 이번 원격 CI·배포 미실행 |
| 2026-09-11-u05-feature-loading.md | U05 #1536 — 미방문 화면 요청 감소·초안 보존 복구·동일 환경 비용, precheck·Merge Check·release 반영 완료, Production 전 |
| 2026-09-11-r01-retirement.md | R01 #1537 — 미사용 경로 퇴역·실제 저장 경로 검증·미분류 168→0·63개 계획 근거와 후속 검증 조건 | | 2026-09-11-r02-compatibility.md | R02 #1541 — 실제배포 네조합·IDB/응답유실·owner/SW 검증, 변경없는추가저장 수리·구서버undo미지원안내·R05인계 | | 2026-09-11-review-account-fixtures.md | #1568 — 숨김 심사 로그인·새 계정 시드·18개 타입 fixture를 v0.17.11에 반영, 실제 로컬 데이터·precheck·통합 충돌 수리와 Merge Check 기록 |
| 2026-09-11-stats-number-readiness.md | #1563 — 리포트·종목 상세 숫자를 첫 렌더부터 스켈레톤으로 표시하고 최신 응답 확인 후 공개, v0.17.11 release 반영·Production 미출시 |
| 2026-09-11-r03-copy-rehearsal.md | R03 #1542 — 실제 사본 선택 복구·삭제된 owner 사전 거절·독립 반복과 인입 원문 한계 | | 2026-09-11-u06-ux-verification.md | U06 #1540 — 실제 사용자 여정·InBody·확대 범례 수리 release 반영, 실제 v0.18 staging Phase4 대기 |
| 2026-09-12-r04-integrated-performance.md | R04 #1543 — 장기 통계 시간 초과·상세 조회 수리, 전후 혼합/기기 측정과 미입증 판정, precheck·Merge Check·release 반영 | | 2026-09-12-r05-integrated-rehearsal.md | R05 #1544 — 실제 전체 이관·복구·구/신 공존, release 반영과 최종 staging 검증 장부(진행 중) | | 2026-09-14-statistics-batches.md | #1590·BUG-144 — 다종목 통계의 공유 잠금 메모리 오류를 비공개 종목 배치·별도 커밋·재개로 수리. main·Production 배포 성공, stale 1→0·세대 639 수렴·DB 화면 RPC 3개 최신 확인. 브라우저 검증·미측정 상한과 구분 |
| 2026-09-14-design-principles.md | 23개 일반화된 설계·작업 원칙과 앱 AGENTS 원문·작업 전 필독 | | 2026-09-14-qa1-repository-split.md | #1591 — 기존 Full CI 테스트 1,210개를 QA1로 이관, 앱·테스트 버전 고정과 로컬 검증, 이번 이관의 관리자 직접 반영 승인 및 실제 반영 상태 | | 2026-09-14-report-feedback-design.md | #1593 — 월간 요약·리포트 복귀와 완료 토스트 통합, 기능 연결·계약 갱신, 테스트 미실행 및 main 반영 상태 | | 2026-09-14-responsive-publication.md | 반응성 재설계 — 앱 전체에서 입력 즉시 반응, 필요한 영역만 스켈레톤, 필수 데이터·세대가 갖춰진 완성본만 공개(리포트 상단 숫자의 무효화 직후 이전 값 노출 수리 포함). 공통 공개 계약 pending/ready/error·DataPublicationBoundary·신규 화면 게이트, 실제 store→binding→UI 브라우저 검사 16개, 1/4/10년 fixture 성능 계측 (이슈 #1592) | | 2026-09-14-desktop-onboarding-dark-card.md | #1600·BUG-145 — 데스크톱 로그인·온보딩이 토큰 상자(.dk-app) 밖에서 그려져 카드·체크·버튼이 사라지던 구조를 진입점 래핑으로 수리하고, 검정 지면 위 가운데 흰 카드 구조로 통일. release/v0.19.0 병합, staging·Production 승격 대기 | | 2026-09-15-render-structure-1596.md | #1596 — 모바일에서 응답이 올 때마다 조립 루트·화면이 통째로 다시 계산되던 구조를 그리기 비용 계약 3개(파생 데이터는 원천당 1회·섹션은 자기 입력만·비교는 계산을 유발하지 않음)로 고치고 QA1 게이트로 잠금. 4배 CPU 계측 리포트 자연 cold 첫 반응 625→71ms·완성 1,225→867ms, 실험 6개의 채택·기각 근거, release/v0.19.0 반영 상태 | | 2026-09-14-design-delivery-followups.md | #1598 — 디자인 전달 3건(월간 카드·일지 월 리포트·피드 범위/내 피드·세션 사진) 반입과 후속 배선, 세션 사진 서버(표·비공개 버킷·RPC)와 QA1 검증, release/v0.19.0 반영 상태 | | 2026-09-15-qa2-promotion-gate.md | #1604 — QA2를 GitHub Full CI의 필수 검사 job으로 추가해 release→staging·staging→main 승격에 적용. QA2에 후보 커밋 입력·컨테이너 네트워크·한 명령 실행기, 앱에 qa2.lock.json·prepare-qa2·qa2-product-contracts job, QA1 계약 테스트 갱신. 로컬 검증과 main 직접 반영 상태 | | 2026-09-15-qa2-reinforcement.md | QA2#2 — QA1 장치를 옮기지 않고 QA2 단위로 보강: 대상 DB에서 열거한 공개 경계 208개 기준 커버리지(의무 있음 11·범위 밖 25·미배정 172), 새 의무 4개(계정 삭제 잔여·시스템 쓰기 보호·단절 뒤 정확히 한 번·예상치 못한 오류 0), revision 교정(v0.18.0에서 BUG-144 재현 실패·main 통과). 앱 qa2.lock.json은 release/v0.19.3 큐 | | 2026-09-15-qa2-reinforcement-2.md | QA2#4 — 1차 커버리지 위에서 미배정 공개 경계 172개를 모두 배정(미배정 0, 의무 55·시나리오 71): 표 격리·계정 삭제, 계획·그룹·소셜, 조회 정합성, 프로필·카탈로그·기록·초안·사진 문, 통계·유지보수. 앱 main 전체 71개 중 70 통과·releaseEligible false(제품 결함 Barbelic#1624). 앱 qa2.lock.json → QA2 096eb5a는 release/v0.19.3 큐 병합 | | 2026-09-15-www-root-redirect-1609.md | #1609·BUG-146 — v0.19.0 뒤 www.barbelic.com/ 루트만 app으로 넘어가지 않던 문제(Vercel이 /:path*를 빈 경로에 맞지 않는 정규식으로 바꿈)를 /:path(.*)로 수리하고, 정적 검사·QA1 테스트·Production 배포 프런트 잡의 실제 308 확인 두 층으로 고정. 관리자 병합 v0.19.1 Production 반영 완료(태그 v0.19.1). 후속 #1619: 같은 날 www가 랜딩 정규 주소가 되어 앱의 옛 주소 목록을 비우고 Site URL·랜딩 canonical 정리 | | 2026-09-15-legal-consent-1625.md | #1625 — 심사 P0 7건: www 법률문서·탈퇴 주소 → app 원문 308, 약관·처리방침 v5 + 동의문 3종 게시(빈칸 16종 확정), 만 14세 확인·항목별 동의·재동의·개인정보 설정, 공개 범위 서버 게이트(검색·팔로우·피드·상세·사진·민감 필드), 서버 요구 v5 전환(민감정보 동의 필수 D1). 오너 지시로 CI 없이 release/v0.19.3 병합(PR #1636), Production 미반영 | | 2026-09-15-www-root-redirect-1609.md | #1609·BUG-146 — v0.19.0 뒤 www.barbelic.com/ 루트만 app으로 넘어가지 않던 문제(Vercel이 /:path*를 빈 경로에 맞지 않는 정규식으로 바꿈)를 /:path(.*)로 수리하고, 정적 검사·QA1 테스트·Production 배포 프런트 잡의 실제 308 확인 두 층으로 고정. 관리자 병합 v0.19.1 Production 반영 완료(태그 v0.19.1) | | 2026-09-15-render-invariants-1610.md | #1610 — 모바일에서 세션 카드·종목 상세·운동 시작 같은 입력 1건에 조립 루트와 숨은 판까지 다시 그려지던 구조를 규칙 하나(상태는 스토어에, 화면은 자기 조각만)와 불변식 표(입력 21종 × 허용 경계)·장부 A/B·전수 게이트 3겹(정적 R1~R6·팬아웃 러너·텔레메트리)으로 고정. 루트 재실행 14 → 0, 허용 밖 재렌더 41 → 0, 세트 타자 재렌더 = 행 1 | | 2026-09-15-workflow-run-names.md | #1659 Phase 1 — 승격 CI·배포 실행 이름을 [vX.Y.Z] Release -> Stage Merge · Staging Deploy · Stage -> Main Merge · Production Deploy 4종으로 고정(변수 RELEASE_VERSION + scope 가드), 이어서 오너 지시로 QA1 완전 퇴역·승격 CI 두 레인(release→staging precheck = static-checks + migration-smoke, staging→main = QA2만). 배포 뒤 QA1 smoke·소셜 로그인 일일 점검·prod-smoke 삭제 | | 2026-09-15-design-preview-tool.md | Barbelic-preview #2 — 디자인 세션 프리뷰를 독립 저장소 도구로: up <이슈번호> 하나로 워크트리·포트 풀 5300~5319·staging 강제·기기 틀 4종, 병합·clean·push 확인 뒤 자동 정리. 09-15 실측 프리뷰 6개 중 4개가 Production 을 보던 것을 0 으로. 앱 변경 없음 | | 2026-09-15-promotion-gates-1661.md | #1661 — 오너 지시(작업→release Merge Check만 · release→staging precheck 레인 · staging→main QA2 레인 · QA1 완전 퇴역)를 두 세션이 동시에 받아 #1659 세션 PR #1663·#1664가 앱을 먼저 반영. 이 트랙은 중복 PR #1665를 닫고 잔여 정리(큐 dry-run·tree 기록·안내문·npm 항목, PR #1677 → release/v0.19.4)와 문서·지침(AGENTS·공통 규칙·세션 제목·큐·QA2 게이트·전역 CLAUDE.md §31)을 맡았다 | | 2026-09-15-docs-admin-subdomains-1666.md | #1666 — 문서를 docs.barbelic.com, 관리자를 admin.barbelic.com/(루트)으로 이전. 관리자 Vite base /admin/ → /, 옛 /admin* 경로와 문서 사이트의 /admin*은 308(rewrite 대신 redirect), 산출물 검사는 /assets/ 요구, 로그인 복귀 주소는 빌드 base 기준. Vercel 도메인 2개 배정·관리자 API 주소를 www(랜딩)에서 app으로 수정·앱 허용 origin 추가·CLI 게시. 앱 코드 변경 없음(PR #127·#131) | | 2026-09-15-legal-launch-v1-1640.md | #1640 — 유료 플랜 대비(D1 앱 내 결제만, 약관 유료 조항·사업자 표시·결제 전 고지 최소 계약) 뒤 출시 전 초안 v1~v6를 이용약관 v1·처리방침 v1 한 판으로 통합(법 요건 대조표). 앱 v0.19.4(PR #1681): 사본 v1 한 벌·레지스트리 v1·서버 요구 v1 마이그레이션·게시 기준점. 문서 #116 게시(docs.barbelic.com), 랜딩 #6 대기. staging·Production 미반영 |
Archive — archive/
역사 자료. 현행 규범이 아니며, 링크·인용 대상이 아니다. (2026-08-19 감사로 이동)
| 문서 | 아카이브 사유 |
|---|---|
architecture-work-plan.md | 2026-06 아키텍처 PR 1~5 분할 계획서 — 전부 완료, 내용은 개별 문서로 승계 |
workout-write-path.md | 2026-07-30 완료 운동 직접 저장 계약 — "수정·삭제는 live-only·create-only outbox·만들지 않을 것 목록"이 #1199(2026-09-04)로 퇴역. 현행은 contracts/completed-workout-write-pipeline.md |
claude-functional-requirements.md | 초기 화면 요구사항 브리핑 — 미구현 화면(길드·회복) 서술 다수, 정본은 designContract.ts+contracts/ |
desktop-scroll-ownership-handoff.md | #169 데스크톱 스크롤 일회성 핸드오프 — 구현 완료 |
feature-slice-architecture.md | 경로 전면 드리프트된 구 구조 지도 — 현행은 AGENTS.md §2 + domain-service-boundaries.md |
ios-macbook-handoff.md | #382 Mac 검증 일회성 핸드오프 — 머지 완료, 내용은 ios-setup.md 등에 중복 |
profile-screen-props.md | 프로필 화면 계약 구판 — 실코드 드리프트. 현행은 contracts/profile-screen-props.md (2026-08-19 재작성) |
software-architecture-patterns.md | 구 개괄 아키텍처 — fixture 지시가 2026-08-19 전달 채널 독트린과 충돌, 대체 문서 존재 |
vite-migration-proposal-for-claude.md | Vite 전환 제안서 — 전환 완료된 역사 자료 |
error-cases/ | 루트 /error-cases/로 이전된 구 위치의 호환 포인터 (저장소 내 참조 0건) |
한국어 번역본 — ko/
영어로 작성된 문서 26편의 한국어 번역이다. 경로는 원문과 같고 앞에 ko/만 붙는다 (data/brid.md → ko/data/brid.md 식). 정본은 원문이고 번역본은 읽기용이다.
원문을 번역으로 대체하지 않은 이유: ⚙ 문서 4편(app-screen-rpc-contract, stats-refresh-jobs, exercise-identity-hard-cutover, typescript-migration-scope)은 테스트·스크립트가 원문 문장을 직접 읽어 검증하고, policies/exercise-model/versions/**는 CI가 변경을 거부하는 불변 스냅샷이다.
| 영역 | 번역된 문서 |
|---|---|
| architecture | domain-service-boundaries · observability-logging |
| data | app-screen-rpc-contract · stats-refresh-jobs · stats-refresh-dirty-events · measured-pr-state-events · admin-health-report · onboarding-data-model · workout-draft-protection · wodup-import-async-jobs · exercise-identity-hard-cutover · supabase-migration-strategy |
| contracts | session-screen-props |
| gates | typescript-migration-scope |
| process | claude-free-design-contract · claude-handoff-rules |
| testing | browser-full-stack-e2e |
| policies | e1rm/CHANGELOG · max-reps/README · set-purpose/README |
| archive | software-architecture-patterns · feature-slice-architecture · architecture-work-plan · error-cases/README · error-cases/CASE-001 · error-cases/CASE-002 |
원문을 고치는 PR은 ko/의 짝도 같이 갱신한다. 짝이 없는 문서는 이미 한국어로 쓰인 것이다.