Skip to content

Latest commit

 

History

History
196 lines (162 loc) · 13.7 KB

File metadata and controls

196 lines (162 loc) · 13.7 KB

밀린 일

목록을 던지면 여기로 들어온다. 세션이 끝나면 채팅은 사라지지만 이 파일은 남는다.

규칙

  • 한 줄에 하나. 하려는 것만 적고, 어떻게 할지는 적지 않는다.
  • 상태는 셋뿐이다: [ ] 안 함 / [~] 하는 중 / [x] 확인까지 끝남.
  • [x]직접 보고 확인했을 때만 붙인다. 코드를 넣은 것과 되는 것은 다르다.
  • 안 하기로 한 것은 지우지 말고 버림 절로 옮기고 이유를 한 줄 적는다. 같은 걸 두 달 뒤에 다시 꺼내는 일을 막는다.

아래는 2026-08-18 기준, 지난 세션들의 목록에서 커밋으로 확인되지 않은 것을 모은 것이다. 이미 됐는데 여기 남아 있는 게 있으면 확인 후 [x]로 옮긴다.

확인이 필요한 것 (했는지 불확실)

  • 할 일 목록에서 입력창이 안 나오는 버그 — 2026-08-02에 "일단 넘어가"로 미뤘고 그 뒤 언급 없음
  • 삭제 후 데이터가 날아가는 현상 — 2026-08-10 목록에 있었으나 대응 커밋이 안 보임
  • 태그가 여러 개라 길어질 때 두 줄로 흐르기 — WrappingHStack은 있는데 적용 여부 미확인
  • 앱 시작 시 알림 권한 요청 — StartupPermissionRequest. 안내가 끝난 뒤 알림 → 위치 순서로 묻는다 (2026-08-18)
  • 앱스토어 리뷰 유도가 실제로 뜨는지 — 2026-08-05에 넣었고 08-11에 "잘 안 되는 것 같다"

안 한 것

  • 대체 공휴일 표시 — 시뮬레이터에서 2026-08-17이 빨간 '대체공휴일'로 나오는 것을 직접 봤다 (2026-08-18)
  • 영어 지원 (현재 기본 언어 한국어 전용으로 좁혀둠)
  • 애플 워치 지원
  • 결제 모듈
  • 가격 A/B 테스트
  • 수출 규정 문서 이슈 — Info.plistITSAppUsesNonExemptEncryption 넣어 해소
  • 카테고리 분류 기준선 만들기 — 입력·기대 카테고리 쌍 30개. docs/TRAPS.md 참고

하네스를 만들면서 드러난 것

  • CONTRIBUTING.md가 feature 브랜치 + PR 절차인데 실제로는 main 직행이던 것 — 실제 기준(언제 브랜치, 언제 main)을 표로 정하고 "작은 단위 PR" 규칙은 폐기했다 (2026-08-18)
  • DesignSystem/README.md가 없는 파일(PriorityTag, DemoPriority)과 틀린 hex 값을 가리키던 것 — 팔레트·컴포넌트 표를 실제 코드에 맞춰 고쳤다. M8로 계속 감시된다 (2026-08-18)
  • README.md가 11바이트 스텁이던 것 — 기능·구조·문서 지도를 채웠다 (2026-08-18)
  • PR 템플릿의 "관련 테스트 통과" — 테스트 타깃이 생길 때까지 /verify 훑음으로 읽는다고 CONTRIBUTING.md에 명시했다 (2026-08-18)
  • 커밋 하나에 여러 작업이 섞이던 것 — CONTRIBUTING.md 커밋 절에 규칙을 넣었다 (2026-08-18)

죽은 코드 훑기에서 나온 것 (2026-08-18)

  • Xcode 템플릿 보일러플레이트 — SceneDelegate 빈 메서드 5개, AppDelegate didDiscardSceneSessions. 본문 없이 영문 주석만 있던 것을 걷어냈다
  • 버린 MoSCoW 우선순위 색 should/could/wont — 참조 0곳. must만 남겼다 (공휴일 이름·과부하 배너). DesignSystem/README.md 팔레트 표도 같이 고쳤다
  • 미참조 토큰·프로퍼티 — Metrics.chipRadius, Metrics.listSectionGap, MonthPageMetrics.compactRowHeight, CategoryColorPalette.colors, TodayTodoWidgetView.remaining, MonthLayout.weekRowIndex(of:)
  • 미사용 import SwiftData 3개 — CategoryEditorSheet, TodoDetailSheet, ToggleTodoCompletionIntent
  • Mosco/build/ 18MB 작업 폴더 삭제 (BACKLOG 이전 항목 해소)
  • 카테고리 편집에 "알림 권한 거부" 안내가 없다showsDeniedNotice라는 @State만 있고 읽는 곳이 없었다(그래서 지웠다). 알림을 켜도 시스템 권한이 거부돼 있으면 사용자는 아무 말도 못 듣는다. 안내를 넣을지 정해야 한다
  • MoscoPalette.must 이름이 기능과 안 맞는다 — 우선순위는 없어졌고 지금은 경고 빨강이다. alert 같은 이름이 맞지만 호출부 3곳을 건드려야 해서 미뤘다
  • DayCell의 공휴일 라벨이 MoscoPalette.must를 쓴다 — CalendarDayTone은 "달력 색과 팔레트 색을 일부러 분리한다"고 적어놨는데 여기서 섞였다. 값은 같아서(#EF4444) 화면은 그대로다. CalendarDayTone.holidayRed로 옮길 것
  • MoscoML.mlproj(1.4MB)·MLTraining/ 삭제 — 갈아탄 이유를 docs/CATEGORIZATION.md에 적고 파일은 지웠다. 남길 값어치는 파일이 아니라 이유였다. 되살릴 일이 생기면 git 이력에 있다 (2026-08-19)
  • StyleGuideView 진입점이 없다 — #Preview로만 열린다. 설정에 디버그 진입점을 두거나, 규범 확인은 Xcode 프리뷰로만 한다고 정하거나

v1.2.0 첫 작업 — 테스트 타깃 (R2 · R7)

우선순위가 올라갔다 (2026-08-18). R2가 시뮬레이터를 닫으면서 테스트가 AI가 쓸 수 있는 유일한 검증이 됐다. 이게 되기 전까지 AI가 확인할 수 있는 것은 컴파일뿐이다.

순서대로 한다. 위에서부터 반복해서 깨진 순이다.

  • 테스트 타깃 생성MoscoTests, Swift Testing, TEST_HOST = App. App 스킴에 물려서 스킴 하나로 빌드와 테스트가 같이 돈다 (2026-08-18)
  • 날짜 경계 — 월말/월초에 같은 날짜가 두 번 나오지 않는다 · MonthLayoutTests 8건
  • 반복 일정 전개 — 3일짜리가 걸친 날짜 전부에 나온다 · RecurrenceTests
  • 반복 일정 완료 — 하루 완료가 다른 날 완료로 번지지 않는다 · RecurrenceTests
  • 블록 배치 — 날짜 바로 아래부터 쌓이고 빈 줄이 없다 · EventRowAssignerTests 9건
  • 시각 파싱TimeExpressionParser로 꺼내고 TimeExpressionParserTests 21건으로 덮었다. 4시~7시 종료 시각, 오전/오후 해석, 오전/오후 12시 경계, 오후 7시N시 패턴에 중복으로 안 잡히는 것까지 (2026-08-18)
  • 분류 기준선 — 입력·기대 카테고리 쌍 30개로 임계값 0.35 검증 (docs/TRAPS.md)
  • CLAUDE.md R1을 "빌드와 테스트가 통과하기 전에는 보고하지 않는다"로 확장 (2026-08-18)

순수 로직을 덮은 뒤 화면 흐름을 UI 테스트로 남긴다 — 첫 실행·튜토리얼·할 일 만들기·삭제 확인 순. /verify 목록에서 테스트로 옮긴 항목은 그 목록에서 지운다.

  • UI 테스트 — 첫 실행과 튜토리얼 건너뛰기
  • UI 테스트 — 한 줄 입력으로 할 일이 만들어진다
  • UI 테스트 — 삭제 확인 뒤 다른 데이터가 남아 있다

2026-08-18 목록 (CI/CD · 튜토리얼 데이터 · 뷰 모드 · 권한)

받은 즉시 적는다. 착수 순서는 갈림길 답을 받고 정한다.

CI/CD

  • PR마다 빌드 + 테스트 자동 실행
  • 배포 자동화 범위 미정 — TestFlight까지인지, 스토어 제출까지인지
  • 막는 것: GoogleService-Info.plist가 저장소에 없다. 서명은 DEVELOPMENT_TEAM = W5QTRMS954로 박혀 있다. 둘 다 Secrets 처리가 필요하다

튜토리얼 데이터

  • 이탈 감지TutorialFunnel. 단계를 자국으로 남겨두고 다음 실행에서 읽는다. 이탈은 그 순간에 못 잡는다(앱이 죽을 때는 이벤트를 보낼 시간이 없다). reason: abandoned로 건너뛰기와 구분해서 센다 (2026-08-19)
  • 완료·스킵은 이미 기록되고 있었다. 문자열을 TutorialOutcome으로 묶었다
  • 사용자 식별AnalyticsIdentity. iCloud 키–값 저장소에 UUID를 두어 재설치·기기 교체를 건너온다. PRIVACY.md에 수집 항목으로 적었다 (2026-08-19)

시간표 뷰 모드

  • 캘린더 하루치 화면과 오늘 할 일 탭에 시간표 보기 추가 (2026-08-19)
  • 마지막으로 고른 뷰 모드가 유지된다 — 두 화면이 같은 값을 공유한다. 화면마다 따로 기억하면 같은 하루를 두 곳에서 다르게 보게 된다
  • 시간 없는 할 일은 축 위쪽 '시간 미정'에 모은다. 아무 데나 놓으면 거짓말이 되고, 빼면 화면에서 사라진다
  • 시간표에서 블록을 끌어 시각 바꾸기 — 이번엔 안 했다. 끄는 동작이 목록에서는 순서, 시간축에서는 시각이라 뜻이 갈린다. 필요해지면 그때 정한다

권한

  • 설정 토글이 권한 상태를 안 따른다PermissionGate(순수 로직, 테스트 11건)로 판정을 옮기고 알림·라이브 액티비티·날씨 세 토글을 전부 물렸다. 권한이 없으면 꺼진 것으로 보이고, 거부 상태에서 켜려 하면 시스템 설정으로 보낸다 (2026-08-18)
  • 앱 시작 시 필요한 권한을 모두 요청 — StartupPermissionRequest로 되살렸다. 알림 → 위치 순서로 줄 세워 묻는다 (2026-08-18)
  • 튜토리얼과 겹치는 순서 — 안내가 끝난 뒤에 묻는다. 앱을 한 번 보여준 뒤에 물어야 무엇에 쓰는 권한인지 알고 고를 수 있고, 한 번 거부되면 다시 못 묻는다

불필요 코드 전수조사 (2026-08-19)

tools/deadcode_audit.py로 훑었다. Swift 코드는 깨끗하다 — 미참조 심볼 0건, 통째로 죽은 파일 0건, 미발생 이벤트 0건, 미사용 에셋·문자열 0건. 남은 낭비는 코드가 아니라 타깃 밖 파일이었다.

  • MoscoML.mlproj + MLTraining/ 삭제 (1.4MB)
  • screenshot/ 5장 3.3MB — 남긴다 (2026-08-19 결정). 코드·문서 어디서도 참조하지 않지만 App Store 제출용 원본이다. 저장소 무게보다 원본을 잃는 쪽이 비싸다. deadcode_audit.py의 "타깃 밖 파일"에 계속 뜨겠지만 지우지 않는다
  • PermissionState.notRequired 제거 — 방금 만든 PR(#6)에 "나중에 쓸까 봐" 넣고 안 쓴 값이었다. 도구가 자기가 만든 죽은 코드를 바로 잡았다 — 이게 한 번 훑고 마는 대신 검사를 남긴 이유다
  • periphery(표준 도구)는 이 프로젝트에서 못 쓴다 — Xcode 16 폴더 동기화 그룹을 이해하지 못해 소스 목록이 빈 채로 돌고 "깨끗하다"고 답한다. 죽은 코드를 심어 확인했다

2026-08-19 목록 (시간표 다듬기 · 아이콘 버튼 · 설정 구조 · 테마 색)

시간표 검증에서 나온 것 셋 + 새 요청 셋.

시간표 다듬기 (PR #9에 이어서)

  • 눈금 폭 52 → 62, 눈금과 블록 사이 8pt (2026-08-19)
  • 오전 01 되돌림 — 오전/오후를 바뀌는 자리에서만 붙인다. 폭은 글자를 깎지 말고 오른쪽 정렬로 맞춘다. 규범 특례도 같이 걷어냈다
  • 롱프레스 메뉴TodoActions 수정자로 꺼내서 목록 셀과 시간표 블록이 같은 것을 쓴다. 메뉴만이 아니라 메모 시트·경고·삭제 확인까지 한 덩어리다

아이콘 버튼

  • 뷰 모드·검색·편집을 아이콘만으로. 상태가 바뀌면 아이콘도 바뀐다 (편집 중 checkmark, 검색 중 xmark). 접근성 이름을 필수로 넣었다 (2026-08-19)
  • '오늘'은 글자로 남긴다 — 아이콘으로 옮길 모양이 없고, 모드 토글이 아니라 특정 날짜로 가는 버튼이라 성격이 다르다

설정 화면 구조

  • 캘린더·카테고리를 각각 row 하나로. 누르면 상세 화면으로 들어간다. 행에 개수를 같이 보여줘서 들어가 보지 않고도 뭐가 있는지 안다 (2026-08-19)

앱 테마 색

  • 시스템 색 고르기로 강조색 선택 + 기본으로 되돌리기 (2026-08-19)
  • MoscoPalette.accent를 상수에서 계산 프로퍼티로. 호출부 27곳은 그대로 둔다
  • 위젯까지 따라간다 — App Group에 hex를 저장하고 위젯이 읽는다. 바꾸면 WidgetCenter.reloadAllTimelines()로 곧바로 다시 그린다
  • 읽을 수 없는 색 방지 — 흰색을 골라도 막지 않고 WCAG 3:1까지만 눌러 쓴다. ThemeColorTests 15건
  • 색은 고르면 바로 적용한다. '적용' 버튼을 넣어봤다가 되돌렸다 — 설정 목록에 버튼이 갑자기 생겼다 사라지는 것이 낯설었다 (2026-08-19)
  • CategoryColorPalette.accent가 어디서도 안 쓰이고 있었다 — 위젯 달력의 '오늘' 동그라미가 Color.accentColor(시스템 색)를 쓰고 있었고, 그건 규범 문서가 하지 말라고 적어둔 바로 그 자리였다. 고쳤다
  • 시스템 피커의 저장 팔레트(+)는 공개 API로 못 감춘다. 없애려면 자체 팔레트로 바꿔야 하고 그러면 색 선택지가 좁아진다 — 지금은 시스템 피커를 유지한다
  • CategoryColorPalette.accentHex 중복 상수 제거 — 기본색이 두 곳에 있으면 한쪽만 바뀌어 앱과 위젯 색이 갈라진다

버림

  • 라이브 액티비티 원격 자동 시작 — pushToStartToken에 서버가 필요하다. 서버는 넣지 않기로 해서, 꾹 눌러 직접 시작하는 방식으로 대체했다 (2026-08-12)
  • Create ML 우선순위 분류기 — 온디바이스 임베딩 + 코사인 유사도로 교체했다. 학습 과정이 없어 카테고리를 사용자가 추가해도 즉시 대응된다 (2026-07-30)