You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
refactor(afternote): 테스트 전용 접근으로 넓어진 presentation·mapper visibility 축소 #1673
최초 조사에서 프로덕션 외부 사용이 없는데 테스트가 직접 접근해 public·internal로 남은 애프터노트 선언 18개를 확인했다. 아래 목록은 최초 인벤토리이며 분리한 항목은 담당 이슈의 현재 범위로 처리한다. 프로덕션 호출 범위에 맞춰 private로 줄이고 테스트는 public owner 동작이나 private preview wrapper를 통해 검증한다.
AfternoteNavGraphTheme.kt:13AfternoteLightTheme는 프로덕션 사용이 0건이고 screenshotTest만 사용한다. src/main에서 제거해 screenshotTest 내부 private wrapper로 이동한다.
완료 기준:
프로덕션 사용이 같은 파일뿐인 선언은 private, 사용 0건인 AfternoteLightTheme는 테스트 소스셋으로 이동한다.
테스트는 create/update payload, editor prefill·저장, 화면 semantics 같은 공개 owner 계약을 검증한다.
테스트 tag·screenshot Content 접근을 위해 프로덕션 visibility를 유지하지 않는다.
presentation/data 관련 JVM·Compose·screenshot 테스트, 컴파일, ktlint를 통과한다.
자식 이슈
No response
참고
프로덕션에서 다른 파일이 실제 소비하는 rememberMemorialMediaSourceState와 그 반환 타입은 제외했다.
분리 범위의 현재 처리
편집기 EditorContent, EditorServiceSelectionSheetContent, editorContentSignature, Throwable.toAfternoteEditorError 네 건은 #1817로 분리한 뒤 refactor(afternote): 편집기 ViewModel과 직접 소비 경계를 MVI로 전환한다 #1804 편집기 MVI 안에서 private 전환과 실제 화면·Save Intent 검증을 함께 완료한다. 이 이슈에서 다시 구현하지 않는다.
DeleteInProgressOverlay는 #1968의 상세 MVI 전환과 같은 변경에서 완료한다. 별도 후속 #1817은 철회했으며 이 이슈에서 중복 구현하지 않는다.
MVI 전환(#1811) 착수에 맞춰 이 이슈에서 화면 seam 5건을 #1817 로 분리했습니다.
MVI 전환은 화면을 Screen(stateful) / Content(internal stateless) 2단으로 가르고 Content 를 테스트·프리뷰 진입점으로 열어 둡니다. 지금 private 로 조이면 #1804 전환 때 다시 열어야 해서, 같은 파일을 두 번 고치고 리뷰도 두 번 돕니다.
이 이슈에 남는 것 (선행 없이 진행 가능): data mapper · TEST_TAG 2종 · editorMessagesSaver · replaceEditorMessages() · buildMemorialWritePayload() · Receiver.toAfternoteEditorReceiver · filterEditorServiceOptions · serviceSelectionSheetTitleResOrNull
본문의 18건을 develop(93e983fe1)과 refactor/1968-afternote-mvi HEAD(ee53fe85c, PR #2021) 양쪽에서 대조했습니다. 새로 구현할 것은 없고, 남은 5건은 이미 작성된 PR 이 머지되면 함께 사라집니다.
develop 에서 이미 해소된 13건
MemorialSongPayload.toDto, Receiver.toAfternoteEditorReceiver, editorMessagesSaver, replaceEditorMessages, buildMemorialWritePayload, filterEditorServiceOptions, AfternoteType.serviceSelectionSheetTitleResOrNull, AfterNoteListItem.toUiModel, getIconResForType 는 private 이고, MEMORIAL_VIDEO_CARD_TEST_TAG·MEMORIAL_VIDEO_ADD_TEST_TAG·AFTERNOTE_CATEGORY_MORE_INDICATOR_TEST_TAG 는 참조 0건으로 삭제됐습니다. AfternoteLightTheme 은 아래에 따로 적습니다.
귀속은 #1844(25083f46e)입니다. konsist 베이스라인 10건 제거에 더해, 베이스라인에 없던 3건(toDto·replaceEditorMessages·buildMemorialWritePayload)까지 같이 처리했습니다. 이 3건이 베이스라인에 없던 이유는 analyzer 가 최상위 선언만 수집하는데 이들은 멤버이기 때문입니다.
develop 에 남은 5건
develop 의 ISSUE_1673_AFTERNOTE 집합이 그대로 이 5건입니다.
심볼
develop
해소하는 커밋
DeleteInProgressOverlay
internal (detail/AfternoteDetailRoute.kt:60)
#2021ee53fe85c 가 AfternoteDetailContent.kt:145 로 옮기며 private 화
본문의 「4 pending #1972 / 1 pending #2021」은 두 갈래로 갈라져 있지 않습니다. git merge-base --is-ancestor f6e902831 bebdcbe42 가 YES 라 #1972 의 4건은 이미 #2021 의 base 브랜치 안에 있고, #2021 은 나머지 1건과 함께 ISSUE_1673_AFTERNOTE 집합 자체를 지웁니다(그 HEAD 에서 ISSUE_1673 검색 0건). VisibilityBaseline.checkExact 는 신규 위반과 stale 항목을 양쪽 다 실패시키므로, 집합을 통째로 지운 커밋이 초록이라는 것이 afternote 잔여 위반 0의 근거입니다. 즉 이 이슈는 #2021 스택이 develop 에 들어오는 시점에 저절로 완결됩니다.
AfternoteLightTheme 은 역행이 아닙니다
#1844 가 src/main 에서 지웠지만 Nav3 머지 7d7c7afba(#1698)가 internal 로 되살렸습니다. 지금은 AfternoteNavHost.kt:63,86,96,109 와 ReceivedAfternoteNavHost.kt:11,41,49,63 에서 실제로 호출합니다. 같은 모듈의 다른 파일이 쓰는 선언이므로 internal 이 규칙상 맞는 층이고, 테스트 때문에 넓어진 가시성이 아닙니다. 원래 18건 목록에서 이 항목만 판정을 바꿔 적습니다.
그래서 이 이슈는 열어 둡니다. 새 구현이나 cleanup 커밋을 만들 근거는 없고, #2021 스택이 develop 에 들어온 뒤 konsist 집합이 실제로 비는 것을 확인하고 닫는 것이 맞습니다.
범위 밖 관찰 하나
ISSUE_1672_CORE 의 PROFILE_ICON_TEST_TAG(core/ui/.../HomeTopBar.kt:24)는 여전히 feature 테스트가 참조합니다. konsist 주석은 소비 모듈을 feature:afternote, feature:receiver 로 적었지만 실제 두 번째는 feature:home 입니다(ReceiverHomeHeaderTest.kt). 소유가 #1672 라 여기서는 건드리지 않았습니다.
#1972가 EditorContent, EditorServiceSelectionSheetContent, editorContentSignature, Throwable.toAfternoteEditorError 네 건을 private으로 바꿉니다. #2021은 마지막 DeleteInProgressOverlay를 AfternoteDetailContent.kt 내부 private으로 옮기며 #1972를 실제 조상으로 포함합니다. 테스트는 화면 owner·ViewModel 저장 동작을 통해 검증합니다. 두 PR의 코드를 중복 구현하지 않습니다.
본문의 AfternoteLightTheme 전제는 정정이 필요합니다. 현재 두 NavHost의 실제 프로덕션 호출은 7곳이며 같은 모듈의 다른 파일에서 소비하므로 internal이 최소 범위입니다. 8곳이라고 적었던 이전 기록은 import 한 줄까지 센 참조 수였습니다. screenshotTest 참조는 0건입니다. 테스트 소스셋으로 옮기면 실제 내비게이션이 컴파일되지 않습니다.
#2021의 위 정확한 HEAD에서 :konsist:test --tests '*ProductionVisibilityKonsistTest'를 실행해 9건 모두 통과했습니다. 본래 13건은 develop에서 해소됐고, 분리한 5건까지 develop 도달을 확인하려면 #1972와 #2021 및 실제 선행 PR들의 병합을 확인해야 합니다. 현재 두 PR은 OPEN이므로 전체 18건의 develop 반영 완료로 보고하지 않습니다.
Activity
OnlyReadOneBook commentedon Sep 3, 2026
MVI 전환(#1811) 착수에 맞춰 이 이슈에서 화면 seam 5건을 #1817 로 분리했습니다.
MVI 전환은 화면을
Screen(stateful) /Content(internal stateless) 2단으로 가르고Content를 테스트·프리뷰 진입점으로 열어 둡니다. 지금private로 조이면 #1804 전환 때 다시 열어야 해서, 같은 파일을 두 번 고치고 리뷰도 두 번 돕니다.이관:
EditorContent·EditorServiceSelectionSheetContent·DeleteInProgressOverlay·editorContentSignature·Throwable.toAfternoteEditorError이 이슈에 남는 것 (선행 없이 진행 가능): data mapper · TEST_TAG 2종 ·
editorMessagesSaver·replaceEditorMessages()·buildMemorialWritePayload()·Receiver.toAfternoteEditorReceiver·filterEditorServiceOptions·serviceSelectionSheetTitleResOrNullOnlyReadOneBook commentedon Sep 13, 2026
상태 정리: develop 13건 해소, 남은 5건은 열린 스택 안에 있습니다
본문의 18건을 develop(
93e983fe1)과refactor/1968-afternote-mviHEAD(ee53fe85c, PR #2021) 양쪽에서 대조했습니다. 새로 구현할 것은 없고, 남은 5건은 이미 작성된 PR 이 머지되면 함께 사라집니다.develop 에서 이미 해소된 13건
MemorialSongPayload.toDto,Receiver.toAfternoteEditorReceiver,editorMessagesSaver,replaceEditorMessages,buildMemorialWritePayload,filterEditorServiceOptions,AfternoteType.serviceSelectionSheetTitleResOrNull,AfterNoteListItem.toUiModel,getIconResForType는private이고,MEMORIAL_VIDEO_CARD_TEST_TAG·MEMORIAL_VIDEO_ADD_TEST_TAG·AFTERNOTE_CATEGORY_MORE_INDICATOR_TEST_TAG는 참조 0건으로 삭제됐습니다.AfternoteLightTheme은 아래에 따로 적습니다.귀속은 #1844(
25083f46e)입니다. konsist 베이스라인 10건 제거에 더해, 베이스라인에 없던 3건(toDto·replaceEditorMessages·buildMemorialWritePayload)까지 같이 처리했습니다. 이 3건이 베이스라인에 없던 이유는 analyzer 가 최상위 선언만 수집하는데 이들은 멤버이기 때문입니다.develop 에 남은 5건
develop 의
ISSUE_1673_AFTERNOTE집합이 그대로 이 5건입니다.DeleteInProgressOverlayinternal(detail/AfternoteDetailRoute.kt:60)ee53fe85c가AfternoteDetailContent.kt:145로 옮기며private화EditorContentinternalf6e902831editorContentSignatureinternalf6e902831Throwable.toAfternoteEditorErrorinternalf6e902831EditorServiceSelectionSheetContentinternalf6e902831본문의 「4 pending #1972 / 1 pending #2021」은 두 갈래로 갈라져 있지 않습니다.
git merge-base --is-ancestor f6e902831 bebdcbe42가 YES 라 #1972 의 4건은 이미 #2021 의 base 브랜치 안에 있고, #2021 은 나머지 1건과 함께ISSUE_1673_AFTERNOTE집합 자체를 지웁니다(그 HEAD 에서ISSUE_1673검색 0건).VisibilityBaseline.checkExact는 신규 위반과 stale 항목을 양쪽 다 실패시키므로, 집합을 통째로 지운 커밋이 초록이라는 것이 afternote 잔여 위반 0의 근거입니다. 즉 이 이슈는 #2021 스택이 develop 에 들어오는 시점에 저절로 완결됩니다.AfternoteLightTheme은 역행이 아닙니다#1844 가
src/main에서 지웠지만 Nav3 머지7d7c7afba(#1698)가internal로 되살렸습니다. 지금은AfternoteNavHost.kt:63,86,96,109와ReceivedAfternoteNavHost.kt:11,41,49,63에서 실제로 호출합니다. 같은 모듈의 다른 파일이 쓰는 선언이므로internal이 규칙상 맞는 층이고, 테스트 때문에 넓어진 가시성이 아닙니다. 원래 18건 목록에서 이 항목만 판정을 바꿔 적습니다.#2021 에
Closes #1673을 달지 않는 이유blocked_by를 게이팅 집합에 넣습니다. 키워드를 더하면 이미 실패 중인 가드에 블로커만 추가됩니다.refactor/1804-editor-mvi라 기본 브랜치 머지가 아니어서 auto-close 가 동작하지 않습니다.그래서 이 이슈는 열어 둡니다. 새 구현이나 cleanup 커밋을 만들 근거는 없고, #2021 스택이 develop 에 들어온 뒤 konsist 집합이 실제로 비는 것을 확인하고 닫는 것이 맞습니다.
범위 밖 관찰 하나
ISSUE_1672_CORE의PROFILE_ICON_TEST_TAG(core/ui/.../HomeTopBar.kt:24)는 여전히 feature 테스트가 참조합니다. konsist 주석은 소비 모듈을 feature:afternote, feature:receiver 로 적었지만 실제 두 번째는 feature:home 입니다(ReceiverHomeHeaderTest.kt). 소유가 #1672 라 여기서는 건드리지 않았습니다.OnlyReadOneBook commentedon Sep 20, 2026
2026-09-20 최신 리비전에서 최초 인벤토리 18건을 다시 대조했습니다. 새로 구현할 선언은 없습니다.
f69332d995a2e9890605b3c8075c427b2dd0cc8cfbf549703310991691a10a146788575aeb9d90efb13a7026e312c037edfd223b089b50817faee640#1972가 EditorContent, EditorServiceSelectionSheetContent, editorContentSignature, Throwable.toAfternoteEditorError 네 건을 private으로 바꿉니다. #2021은 마지막 DeleteInProgressOverlay를 AfternoteDetailContent.kt 내부 private으로 옮기며 #1972를 실제 조상으로 포함합니다. 테스트는 화면 owner·ViewModel 저장 동작을 통해 검증합니다. 두 PR의 코드를 중복 구현하지 않습니다.
본문의 AfternoteLightTheme 전제는 정정이 필요합니다. 현재 두 NavHost의 실제 프로덕션 호출은 7곳이며 같은 모듈의 다른 파일에서 소비하므로 internal이 최소 범위입니다. 8곳이라고 적었던 이전 기록은 import 한 줄까지 센 참조 수였습니다. screenshotTest 참조는 0건입니다. 테스트 소스셋으로 옮기면 실제 내비게이션이 컴파일되지 않습니다.
#2021의 위 정확한 HEAD에서
:konsist:test --tests '*ProductionVisibilityKonsistTest'를 실행해 9건 모두 통과했습니다. 본래 13건은 develop에서 해소됐고, 분리한 5건까지 develop 도달을 확인하려면 #1972와 #2021 및 실제 선행 PR들의 병합을 확인해야 합니다. 현재 두 PR은 OPEN이므로 전체 18건의 develop 반영 완료로 보고하지 않습니다.github-actions commentedon Sep 21, 2026
이 이슈를 맡은 PR 은 #2021 다 (base
refactor/1804-editor-mvi).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.