하단 복귀 바를 메인 탭으로 — 앱을 다시 켠 첫 화면에서 쓰다 만 기록으로 돌아가기 (2026-09-01)
- 기간: 2026-09-01 (세션 1개, 오너 보고 원문: "현재 일지탭에서 세션 수정하다가 앱 끄면, 다시 돌아왔을떄 일지탭 하단에 '마저 수정하기' 풀 블리드바가 뜨는데, 그거 메인텝에서 뜨게 해줄 수 있어?")
- 랜딩: PR #1092(Phase 1·2,
5e932867) — 마이그레이션 없음, Vercel 자동 배포 - 설계서: 없음(소규모 UX 변경 — 분석·Phase 계획은 이슈 #1088 본문)
- 정본: 노출 규칙 =
src/react/mobileApp.tsx의resumeBar게이트(셸MobileTabsRegion) · 문구 =src/react/barbelicCopy.ts의MOBILE_SHELL_COPY.resumeWorkout/resumeWorkoutEdit - 도구: 없음
- 게이트:
tests/react/workoutFlowDraftSafety.test.mjs— "mobile container wires completed-session editing and home-tab resume" - 버그리포트: 없음(결함 수리가 아니라 디자인 계약 변경)
- 계약:
src/react/ui/mobile/styles/base/nav.css복귀 바 주석 — "작성을 시작한 탭에서만"(2026-07-31) → "메인 탭에서만"(이슈 #1088)
Phase 현황
| Phase | 내용 | 상태 |
|---|---|---|
| Phase 1 | 복귀 바 노출 조건을 메인 탭 전용으로 교체 | ✅ PR #1092 (5e932867) |
| Phase 2 | 완료 기록 수정 초안이면 바 문구를 "마저 수정하기"로 분기 | ✅ PR #1092 (5e932867) |
1. 배경
기록을 쓰다가(또는 지난 기록을 고치다가) 화면을 벗어나면 초안이 기기에 남고, 화면 하단에 마저 기록 작성하기 바가 떠서 이어갈 수 있다. 이 바는 2026-07-31 디자인 전달본에서 작성을 시작한 탭에서만 뜨는 계약으로 들어왔다.
같은 불편은 이미 한 번 걸러진 적이 있다. 이슈 #887 Phase 2에서 부팅 시 진행 중이던 운동이 있어요 확인 팝업을 넣으면서, 코드 주석에 "종전에는 이어하기 바가 시작했던 탭에서만 보여서 복원 성공과 소실을 구별할 수 없었다"고 적었다. 팝업은 재실행 직후 한 번만 묻고, 그 팝업을 닫은 뒤의 상태는 종전 그대로였다.
2. 문제 제기
일지에서 기록을 고치다 앱을 끄면, 다시 켠 첫 화면에는 아무 표시가 없다
유저 A가 일지 탭에서 지난 운동 기록을 열어 수정하다 앱을 껐다. 다시 켜면 확인 팝업이 뜨고, "지금은 아니고 나중에" 뜻으로 바깥을 눌러 닫는다. 이때 남아야 할 마저 기록 작성하기 바는 일지 탭에만 있고, 앱이 처음 여는 메인 탭 하단에는 아무것도 없다. A는 일지 탭으로 직접 옮겨 가기 전까지 고치던 내용이 사라진 줄 안다.
증거:
- 노출 조건이 "지금 보는 탭 == 작성·수정을 시작한 탭" 한 줄이었다 —
src/react/mobileApp.tsx,const resumeBar = … && tab === workoutOriginTab. - 시작한 탭은 편집기를 열 때 기록되고(
appController.tsx의captureWorkoutOriginTab), 일지에서 수정을 열면calendar가 된다. - 그 값이 기기에 보관된 초안 봉투에 함께 저장돼(
workoutDraftStore.ts) 앱을 껐다 켜도 복원되므로, 재실행 후에도 바는 일지 탭 전용으로 남았다.
3. 해결 방안
원칙 (오너 결정 D1·D2, 2026-09-01)
| 결정 | 선택지 | 결과 |
|---|---|---|
| D1 — 바를 어디에 띄우나 | (A) 메인 + 시작한 탭 / (B) 메인 탭에서만 / (C) 모든 탭 | (B) 메인 탭에서만 채택. (A)는 세션 제안이었으나 오너가 (B) 선택 — 하단 바를 한 곳에만 둔다. (C)는 피드·그룹 등 모든 탭 하단을 54px씩 계속 덮어 기각. |
| D2 — 문구를 구분하나 | (A) 항상 "마저 기록 작성하기" / (B) 수정 중이면 "마저 수정하기" | (B) 분기 채택. 메인 탭에는 무엇을 하다 나왔는지 보여주는 문맥이 없어 문구가 유일한 단서다. |
접근
노출 판단은 종전대로 셸(MobileTabsRegion)이 단독으로 소유한다. CSS(:has() 등)로 숨기는 방식은 2026-07-31 주석이 명시적으로 금지하고 있어 그대로 지켰다 — 바뀐 것은 조건식 하나다.
문구 분기는 "완료한 기록을 고치는 중"이라는 사실이 이미 편집기 의도(workoutEditorIntent)에 있으므로, 새 상태를 만들지 않고 파생값 하나(editingCompletedSession)를 셸까지 내려보냈다.
4. 적용한 내용
Phase 1 — 메인 탭 전용 노출 (#1092)
src/react/mobileApp.tsx—resumeBar게이트를tab === workoutOriginTab→tab === "home"으로 교체. 셸 영역이 더 이상workoutOriginTab을 보지 않으므로 그 배선을 걷어냈다.src/react/ui/mobile/styles/base/nav.css— 노출 계약 주석을 새 규칙으로 갱신(구 계약은 날짜와 함께 한 줄 남김).tests/react/workoutFlowDraftSafety.test.mjs— 게이트 계약 앵커·테스트 이름 재조준,tests/audit/pending-changes.json에 수정 사유 등재.
Phase 2 — 수정 초안 문구 분기 (#1092)
src/react/controllers/workoutDraftController.ts—editingCompletedSession(완료 기록 + 수정 모드) 파생.src/react/appController.tsx→src/react/mobileApp.tsx→src/react/ui/mobile/shell/MobileShell.tsx—resumeEditing한 값으로 전달, 바 라벨만 갈아 끼운다.src/react/barbelicCopy.ts—resumeWorkoutEdit: "마저 수정하기"신설(문구는 공용 상수 강제 규칙 유지).
주요 결정과 그 근거
- 하단 크롬 높이는 손대지 않았다. 메인 탭은 초안이 있는 동안
탭바 55 + 바 54 = 109px가 되는데, 이는 평소오늘 운동 시작바가 있을 때와 같은 값이라 여백 사상표(--bottom-chrome-h)를 그대로 쓴다. - 수정을 마치거나 취소하고 나올 때 돌아가는 탭은 종전대로 작성·수정을 시작한 탭이다(일지에서 시작했으면 일지). 이번 변경은 노출 위치만 다룬다.
작업 중 드러난 것
- 이 "시작한 탭에서만" 규칙은 버그가 아니라 디자인 전달본이 넣은 계약이었다(nav.css 주석 + v61 전달 커밋). 계약을 바꾸는 변경이므로 주석·계약 테스트를 함께 갱신해야 회귀 그물이 새 규칙을 지킨다.
- 노출 조건에서
workoutOriginTab을 빼면 셸까지 내려오던 그 값이 미사용이 된다. 미사용 코드 게이트에 걸리므로 배선(컨텍스트 키 → 리전 props → 호출부)을 같은 커밋에서 함께 정리했다.
5. 적용 결과
| 항목 | 전 → 후 |
|---|---|
| 초안이 남은 상태에서 메인 탭 하단 복귀 바 | 없음 → 있음 |
| 초안이 남은 상태에서 일지(시작한) 탭 하단 복귀 바 | 있음 → 없음(오너 결정 D1=B) |
| 완료 기록 수정 초안일 때 바 문구 | 마저 기록 작성하기 → 마저 수정하기 |
| 메인 탭 하단 크롬 높이(초안 있을 때) | 55px → 109px(= 시작 바가 있을 때와 동일) |
| 로컬 게이트 | npm run check 전 단계 통과(단위 2290건) · CI Repository checks 성공 |
검증은 자동 증거까지다(계약 테스트 + 로컬·CI 게이트). 바가 실제로 그려진 모습·애니메이션 등 눈으로 볼 품질은 확인하지 않았다.
6. 이번 개선으로 향상된 것
앱을 다시 켠 첫 화면에서 쓰다 만 기록으로 돌아갈 수 있다
부팅 확인 팝업을 닫아도 되돌아갈 길이 첫 화면에 남는다. 어느 탭에서 쓰다 나왔든 복귀 지점이 한 곳(메인 탭)으로 고정돼, 사용자가 "어느 탭에서 시작했더라"를 기억할 필요가 없다.
남아 있는 것이 "새 기록"인지 "지난 기록 수정"인지 문구로 구분된다
문맥이 없는 메인 탭에서도 무엇을 하다 나왔는지 한 줄로 알 수 있다.
구조적으로 남는 것
- 복귀 바 노출 규칙의 정본이 셸 한 곳(
MobileTabsRegion)이라는 점은 그대로다 — CSS는 계속 노출 판단에 관여하지 않는다. - 새 규칙이 계약 테스트로 고정돼, 다음 디자인 전달본이 조건식을 되돌리면 게이트가 잡는다.
남은 것
- 없음. 노출 위치·문구 외의 동작(수정 종료 후 돌아가는 탭 등)은 이번 범위 밖이며 그대로 둔다.