Skip to content

화면 전환 중 비던 본문과 편집 후 재생성을 줄임 — #1554 (2026-09-10)

반영 상태: 2026-09-10 release/v0.17.10 반영 완료, Production 미반영. 개별 검증은 아래에 실제 실행 범위로 기록한다. release 병합과 Production 배포는 구분하며, 인증 후 운영 전환·실기기 시간은 미실측이다.

  • 기간: 2026-09-10 ~ 작성 시점, 1개 작업. 오너 보고: “지금 화면 전환할때 컴포넌트의 불필요한 깜빡임이나 지연 같은것들이 보이는데, 그런애들 안발생하게 수정 진행할 수 있어?” 우선 경로는 메인 탭 이동·세션 수정 후 복귀·리포트 연도 변경·종목 상세 연도 변경이다.
  • 랜딩: 앱 이슈 #1554, 대상 release/v0.17.10. 앱 PR #1556, release 병합 해시 dbf39b1f5d4a31dabc8a19558895b800370272da, 문서 PR 앱 PR 본문과 상호 연결. Phase 1 구현 커밋 6cdc2aa, Phase 2 fb2d8b1, 최신 release 통합 a356bb4a. DB migration·Edge 변경 없음. staging/Production 승격·Vercel 배포는 이번 작업의 승인 범위에 포함하지 않는다.
  • 설계서: 없음(수리 건). 이슈의 Phase 계획·예상 효과를 기준으로 진행했다.
  • 정본: 화면 스택 계약, 앱 셸 프레임, 하단 크롬 여백, 리포트 props. 앱의 mobileApp.tsx, ui/mobile/shell/MobileShellFrames.tsx, ui/mobile/shell/bottomChrome.tsx, ui/mobile/lib/StackScreen.tsx, controllers/useReportDesignData.ts, controllers/useMobileReportDesignProps.ts, ui/mobile/screens/ReportScreen.tsx, ui/mobile/styles/base/primitives.css가 실행 동작을 소유한다.
  • 도구: 기존 e2e/profile/tabSwitchPaint.profile.mjs의 계측 방법을 참고했다. 실제 계정 생성이 필요한 원래 프로파일러는 실행하지 않았다. 별도 작업 폴더 work/transition_styles/measure.mjs, pending-return.mjs, harness.tsxwork/year-transition-repro.mjs로 로컬 브라우저를 측정했다. 이 임시 계측물은 앱·문서 저장소 밖에 있으며 제품 번들에 포함되지 않는다.
  • 게이트: Phase 1 npm run check는 총 3,435건·3,400 통과·35 skip·실패 0, 구현 커밋 6cdc2aa. 별도 신규 브라우저 검사 pendingReveal.browser.mjs 4건·reportPeriodTransition.browser.mjs 6건(하위 검사 포함)·mobileShellContinuity.browser.mjs 3건, 합계 13건 통과·실패 0·skip 0. 그룹 작성기 회귀를 포함한 최종 브라우저 결과는 통합 HEAD a356bb4a에서 16건 통과·실패/skip 0: 신규 15건(표시 4+리포트 6+셸 3+그룹 2)과 선행 종목 배치 1건. 기존 homeBootLoadingOrder.test.mjs 11건도 별도 통과했다. 최종 npm run check: Phase 1·2 각각 3,435건 중 3,400 통과 / 35 조건부 DB skip / 실패 0. 필수 precheck: 최신 release 82d2073c를 합친 HEAD a356bb4a에서 static/unused/build/artifacts 통과, unit-1 1,671 pass·12 skip + unit-2 1,729 pass·23 skip, 실패 0, 1분 54초. 브라우저·DB 제외. Merge Check: 정상 큐 실행 34484566618 성공. Merge Check 후 검증한 merge commit 반영. full CI 실행 아님. 서버·DB·migration·pgTAP 변경과 DB 검증 실행은 없다. 실제 계정 여정 e2e 통과로 표시하지 않는다.
  • 버그리포트: BUG-112 · BUG-113 · BUG-114.
  • 계약: 준비된 로딩 표시의 즉시 노출, 편집 중 원래 탭 수명·하단 바 소유권 보존, 리포트 갱신 중 기존 표시와 요청 중인 기간의 구분. 오른쪽 진입·한 겹 뒤로가기 규칙은 유지한다.

Phase 현황

Phase내용상태
Phase 1보고된 경로의 실제 원인 재현·수정·회귀 검사완료 — 6cdc2aa, check 3,435건 중 3,400 통과·35 skip·실패 0
Phase 2전체 탭·상세 전환의 코드/CSS 점검과 왕복·기간 변경·늦은 응답 확인모바일 7개 탭 및 등록 19종 코드 대조, 아래 범위표 작성. 그룹 작성기 보존·회귀의 최종 결과 화면·댓글 보존 수리 완료, 브라우저 2/2 통과. 최종 check Phase 1·2 각각 3,435건 중 3,400 통과 / 35 조건부 DB skip / 실패 0

1. 배경

화면을 이동할 때 필요한 데이터 요청과 정상적인 슬라이드는 남아 있어도, 이미 표시한 본문을 없앴다가 다시 만드는 과정은 줄일 수 있다. 이번 작업은 오너가 보고한 네 경로와 같은 표시·화면 수명 규칙을 쓰는 탭을 확인하고, 브라우저에서 재현된 원인 3개를 수정했다.

여기서 전수 점검은 현재 모바일 탭 7개와 화면 스택 등록 19종의 실제 렌더 경로·CSS·공용 표시 경로를 모두 코드 대조했다는 뜻이다. 모바일 탭은 home/calendar/feed/group/volume/search/profile이며, pr는 호환용 레거시 키로 현재 독립 판이 없다. 모든 화면을 실제 운영 계정으로 조작하거나 실기기 시간을 전수 측정했다는 뜻은 아니다. 실제 브라우저 재현 범위는 각 표에 구분했다.

2. 문제 제기

이미 보였던 로딩 표시가 탭 복귀 때 다시 투명해졌다

공용 .pend-reveal에는 opacity: 0과 300ms 대기 후 200ms fade가 있었다. 탭은 DOM을 보존한 채 .tab-pane.off { display: none; }으로 숨기므로, 로딩 중 다른 탭으로 갔다 돌아오면 이 애니메이션도 다시 시작했다.

실제 HomeBootstrapSkeleton이 완전히 보인 상태에서 피드로 이동한 뒤, 데이터 준비 중 상태를 유지하고 홈으로 돌아왔다. 첫 홈 프레임 26.6ms에는 여전히 opacity:0, 최초 보임은 343.3ms, 완전 표시는 526.5ms였다. 준비된 홈 데이터가 다시 로딩으로 바뀐 경우를 만들어 낸 검사가 아니라, 아직 준비 중인 같은 로딩 표시의 재방문을 검사한 결과다.

세션 편집을 열면서 돌아갈 탭과 상세 화면을 제거했다

mobileApp.tsx의 운동/편집 분기는 MobileTabsRegion을 제거하고 복귀 시 새로 만들었다. .app 바깥 골격이 같아도 방문했던 탭·상세 화면의 DOM과 컴포넌트 상태는 사라졌다. 실제 앱 컴포넌트와 owner store를 사용하는 로컬 검사에서 편집 진입 후 원래 홈 DOM의 isConnectedfalse가 되어 회귀 검사가 실패했다.

탭을 보존하는 수정에는 숨겨 둔 탭의 하단 바 신고가 현재 편집 화면을 바꾸지 않게 하는 처리도 필요했다. 또한 보존한 상세 화면의 진입 애니메이션이 숨김·복귀로 재생되지 않도록 진입 완료·취소를 해당 화면의 수명 안에서 기억해야 했다. 이 두 처리는 별도 사용자 결함을 추가한 것이 아니라, 원래 탭을 보존하는 수정에 필요한 화면 상태 처리다.

Phase 2의 등록 경로 대조에서 그룹 작성기는 전역 workout과 별개인 GroupStackPane의 early return으로 그룹 본문을 제거한다는 점도 확인했다. 실제 그룹 보드에 미전송 댓글을 입력하고 화이트보드 수정 → 취소 → 저장하지 않고 나가기로 왕복했을 때, 작성 중 원래 보드의 isConnected=false, 복귀 시 sameBoard=false, 댓글 값은 빈 문자열이었다. 이 재현은 같은 편집 진입 시 아래 화면 제거 원인의 별도 분기다. 그룹 화면 보존 수정·회귀의 최종 상태는 화면·댓글 보존 수리 완료, 브라우저 2/2 통과. Phase 1의 일반 운동 편집 보존만으로 이 경로까지 해결됐다고 표시하지 않는다.

리포트 연도를 바꿀 때 본문을 로딩 골격으로 교체했다

리포트 요청이 시작되면 useReportDesignDatadata:null/loading을 게시했고, ReportScreen은 완성된 본문 대신 골격을 렌더했다. 2026년에서 2025년으로 이동하는 재현에서 기존 본문 DOM 연결은 끊겼고, 잔디 칸은 365개 → 0개, 기간 이동 버튼도 0개가 됐다. 이미 조회했던 연도로 돌아가거나 탭을 왕복해도 다시 요청하면서 같은 본문 교체가 발생했다.

이 재현은 실제 리포트 controller·mapper·presenter를 사용하고 API 응답의 도착만 제어했다. 서버 RPC 자체가 느리거나 DB가 중복 계산한다는 원인을 확정한 결과는 아니다.

3. 해결 방안

원칙

  • D1 (2026-09-10): 오너의 “그런애들 안발생하게 수정 진행할 수 있어?” 요청에 따라 보고 경로와 동일 원인이 적용되는 화면을 확인하고, 확인된 원인을 수정한다.
  • 기존 화면 스택 규칙의 오른쪽 진입·한 겹 뒤로가기는 유지한다. 탭의 방문 상태·편집의 저장 의미·계정 경계를 보존한다.
  • 이전 리포트를 유지할 때는 기간 이름과 수치가 서로 다른 요청의 값처럼 섞이지 않게 한다. 새로 요청한 기간은 별도 로딩 설명으로 표시하고, 준비된 제목·기간·데이터를 함께 바꾼다.

접근

방안판단과 이유
공용 로딩 표시의 강제 지연·fade 제거채택. 이미 준비된 골격을 다시 투명하게 만드는 원인을 직접 제거한다. 추가 타이머를 만들지 않는다
편집 중 탭을 숨겨 보존하고 활성 하단 바 소유권을 분리채택. 복귀할 화면의 DOM·로컬 상태·스크롤을 유지한다
기간별 완료 응답 재사용과 완성된 리포트의 일괄 교체채택. 새 응답을 기다리면서 기존 본문·조작부를 유지하되 계정·조회 기준 변경을 구분한다
화면 전환에 별도 대기 타이머 추가기각. 재생성과 본문 교체 원인을 남긴다
승인된 슬라이드 일괄 제거기각. 깊이 화면의 이동 규칙을 바꾸며 조회·수명 문제를 해결하지 않는다
메인 탭의 useDeferredValue 제거채택하지 않음. 모의 대용량 탭에서 탭 강조 표시가 12.6ms → 120.8ms로 늦어졌다

4. 적용한 내용

Phase 1 — 재현된 표시·수명·리포트 교체 원인 수정

공용 primitives.css에서 .pend-reveal의 투명도·지연 애니메이션·키프레임을 제거했다. 로딩 장식의 pointer-events:none은 유지했다. 관련 코드·테스트의 이전 300ms 설명을 현재 동작에 맞췄다.

모바일 셸은 편집 중 원래 탭들을 제거하지 않고 숨긴다. 탭과 운동 화면의 BottomChromeProvider를 분리하고 active인 쪽만 하단 바 상태를 게시한다. 기존 스크롤 초기화 호출에도 숨은 화면의 80px 위치가 보존되는 것을 확인했으며, UiStackScreen은 진입 애니메이션 완료 또는 취소 후 복귀할 때 같은 진입을 다시 재생하지 않는다.

리포트는 계정·조회 기준에 맞는 완료 응답을 기간별로 재사용한다. 새 기간이나 필터를 조회하는 동안에는 마지막으로 완성한 본문의 기간 이름·값·조작 상태를 함께 유지하고, 요청 중인 기간을 설명한다. 응답이 준비되면 새 제목·기간·값을 함께 게시한다. 오류에는 기존 값과 조회 실패·재조회 동작을 표시하고, 다른 계정으로 바뀌면 이전 계정 데이터는 즉시 감춘다. 늦게 도착한 이전 요청이 현재 화면을 덮지 않도록 요청 취소와 유효성 검사를 유지한다.

Phase 2 — 전체 탭·상세 화면 점검 범위

그룹 작성기 진입 때 기존 그룹 화면을 유지하는 분기도 추가했다. BottomChromeScope는 숨은 그룹 화면의 신고만 해제하고 복귀 시 복원한다. 실제 편집 취소 경로에서 같은 보드 DOM과 미전송 댓글을 유지했다. 작성기의 저장·취소 의미는 바꾸지 않았다.

표면확인한 코드·CSS 범위실제 브라우저 확인 / 한계
공통 모바일 탭MobileTabsRegion, MobileTabFrame, base/core.css, primitives.css, nav.css, overlays.css실제 셸·CSS에서 숨김/복귀, 준비 중 표시와 모의 DOM 부하를 확인
메인(홈)HomeScreen.tsx, home.css, 공용 pending 표시실제 홈 UI 116개 하위 요소, 준비된 데이터 재방문 및 bootstrap/PR 로딩 표시 검사. 실사용 계정 데이터량은 아님
일지SessionScreen.tsx, screens/session.css, 공용 골격화면 전체 진입 fade 없음. 월 통계의 pending 표시 소비 경로 확인. 운영 월 이동 시간은 미실측
피드FeedScreen.tsx, screens/feed.css, 공용 골격화면 전체 진입 fade 없음. 로딩 표시 소비 경로 확인. 부하 측정의 피드 행은 모의 DOM
그룹GroupStackPane, screens/group.css, 공용 화면 스택·골격보드 내부 방향 전환 240ms 유지. 별도 그룹 작성기 왕복에서 보드 DOM·미전송 댓글 손실 재현. 수정·회귀 최종 결과 화면·댓글 보존 수리 완료, 브라우저 2/2 통과. 운영 그룹 전환 시간은 미실측
리포트useReportDesignData, useMobileReportDesignProps, ReportScreen.tsx, screens/report.css실제 controller·mapper·presenter에서 연도/필터/왕복·오류·계정 변경·늦은 응답 검사. API 응답만 제어
종목 검색screens/set-search.css, 공용 탭 골격탭 전체 강제 지연·fade 없음. 운영 검색 데이터로 전환 시간 미실측
내 정보screens/profile.css, 공용 탭 골격탭 전체 강제 지연·fade 없음. 운영 계정 설정 화면 전환 시간 미실측
종목 상세·기록 도구RecordsDetail.tsx, screens/records.css, 공용 StackScreen종목 상세 연도 변경에서 같은 상세/히어로 DOM 유지·추가 요청 0 확인. 전면 재생성 또는 RPC 재호출 결함은 재현되지 않음
세션 상세·편집 복귀실제 GymMobileApp·owner store·공용 스택·운동 셸편집 전후 같은 앱/홈/탭/세션 상세 DOM, 숨김, 하단 바, 스크롤 80px 보존 및 진입 슬라이드 재생 0 검사. 데이터·명령은 fixture
데스크톱desktop.css, screens/session.css, pr.css, volume.css, plan-editor.css의 전환 선언일반 탭 공통 진입 fade를 발견하지 못함. 인증 후 운영 데스크톱 전환 시간·전체 여정은 미실측

화면 스택 등록 19종 대조

등록 정본은 앱 src/react/controllers/screenKinds.ts다. 아래 표의 보존은 운동 편집 중 기존 방문 탭을 숨겨 유지하는 범위이며, 모든 하위 모달을 영구 보존하거나 최초 데이터 요청을 없앤다는 의미가 아니다. 그룹 작성기 관련 항목은 재현 당시 경로와 수정 후 확정 상태를 구분했다.

등록 kind실제 화면/경로공통 StackScreen코드 대조·이번 적용 범위
menuMobileNavDrawerBindingNavDrawer아니오drawer-scrim open 클래스로 표시. 탭 nav 보존, 운동 중 nav는 별도 슬롯
workoutWorkoutFlowBinding → 운동·완료기록·계획 편집아니오바탕 탭을 숨기고 같은 .app·방문 판 유지. 편집기 초기 lazy fallback은 내부 Suspense
legalapp.tsxLegalDocumentOverlay아니오앱 밖 전역 뷰어. 문서 경로별 본문 교체·스크롤 초기화는 기존 동작이며 실제 깜빡임 미실측
sessionUiStackSessionOverlayUiSessionSheetBody여는 탭 안에서 운동 편집 왕복 보존. 초기 데이터 부재 때 본문만 골격
daySummaryUiDayOverlay 또는 UiStackScreenUiDaySummary여는 탭 안에서 보존. 리포트 하루와 일반 하루 모두 공통 셸 사용
prDetailUiRecordsDetail초기 로딩은 내부 골격. 연도 이동에서 상세·히어로 DOM 유지·추가 요청 0 확인
friendScopeUiStackScreen.fscope → 친구 홈·일지·리포트·피드외부 친구 표면은 보존. 내부 4탭은 조건부 본문 교체이며 개별 keep-alive 아님
friendSessionUiStackSessionOverlay친구 조회용 세션. session과 같은 셸·초기 본문 로딩 경로
journalMonthSessionScreen 월간 요약 → UiStackScreen월 변경은 데이터/날짜 갱신. 항목 id가 같으면 셸 유지
journalDayUiDayOverlayUiSlideOverlayUiStackScreen날짜 props로 갱신. 세션 아래 하루 층 복원은 기존 beneathTop 계약 유지
homeReportHomeReportStackOverlay → 리포트 binding홈 위 오버레이 유지. 기간 표시·완료 응답 재사용 적용, 리포트 탭과는 별개 인스턴스
prTapeHomeScreenUiListOverlay전체 PR 목록·로컬 1RM 필터. 공통 셸 재등장 처리 적용
prListRecordsDetailUiListOverlayPR/훈련 전체 목록. 공통 셸 사용
groupLoungeGroupStackPaneUiGroupInfoScreen일반 운동 편집 왕복에서는 보존. 그룹 작성기 early return은 별도 재현 분기, 수정 상태 화면·댓글 보존 수리 완료, 브라우저 2/2 통과
groupBoardGroupStackPaneUiGroupScreen날짜·댓글은 내부 상태. 그룹 작성기 취소 왕복에서 미전송 댓글 손실 재현, 수정 상태 화면·댓글 보존 수리 완료, 브라우저 2/2 통과
groupSessionUiGroupSessionOverlay → 조회 세션초기 데이터 부재 때 내부 골격. 그룹 작성기 분리 처리의 최종 결과 화면·댓글 보존 수리 완료, 브라우저 2/2 통과
groupComposerGroupStackPaneUiGroupComposer아니오변경 전: 작성기 early return이 아래 그룹 본문 제거. 변경 후: 보존·회귀의 확정 결과 화면·댓글 보존 수리 완료, 브라우저 2/2 통과
groupBoardExercisegroupBoard 내부 종목 기록 뷰자체 표면 없음별도 슬라이드 표면 없이 부모 셸 사용. 날짜 변경 시 해당 항목 정리
recordsToolUiStackScreenrenderRecordsTool하위 도구는 favorites/manualPr/trainingStyle/customExercises 4종. lazy 로딩은 공통 셸 안

프로필·설정 모달, 댓글·신고·차단·초대 시트, 운동 픽커, 리포트 주차·통계 모달은 부모 로컬 상태 또는 도메인 스토어가 관리한다. 19종 등록 경로 대조를 이런 모든 부가 화면의 기능 e2e 실행으로 표시하지 않는다. 친구 내부 탭의 본문 교체와 법률 문서의 keyed 스크롤 초기화도 코드 관측만으로 추가 결함으로 단정하지 않았다.

UiStackScreen의 320ms 타이머는 퇴장 종료 이벤트 유실 시 항목 정리용이며 정상 종료는 animationend에서 처리한다. 화면 청크의 유휴 예열 3,000ms/1,500ms, 결과 알림 2,000ms, 훈련 스타일 저장 완료 모달 1,400ms도 목적을 대조했으며 모든 화면 전환을 지연시키는 타이머로 분류하지 않았다.

전체 모바일 스타일 계측에는 base/tokens.css·공통 base 4개·home.cssscreens/의 day-summary·feed·group·legal-doc·onboarding·profile·records·report·session·set-search·training-style·workout을 함께 로드했다. 스타일 파일의 포함과 각 부가 화면의 실제 사용자 여정 검증은 구분한다.

주요 결정과 그 근거

일반 탭은 준비된 같은 화면을 숨겼다 다시 보여 주는 구조를 유지한다. 홈의 닫힌 종목 검색 색인은 드로어가 열릴 때만 만들고 보드 정렬도 메모이즈되어 있었다. 계측된 준비 완료 홈 재방문에서는 추가 React 커밋이 0회였으므로 홈 전체 렌더가 모든 지연의 원인이라고 결론내리지 않았다.

작업 중 드러난 것

최초 precheck가 원격 fetch 완료 전에 시작되어 이전 기준을 사용했다. 이를 최종 증거로 사용하지 않고 최신 release를 합쳤으며, 검사 등록 한 줄의 충돌은 양쪽 테스트를 모두 유지해 해결했다. 이후 통합 HEAD에서 필수 precheck와 관련 브라우저 16건을 다시 통과했다. Phase 1의 기존 정적 검사 2건은 활성 제공자 구조와 삼항식 마지막 state 수집을 반영하도록 조정한 뒤 전체 검사를 재실행했다.

현재 useDeferredValue는 고정 대기 시간이 아니라 탭 강조와 본문 전환을 나누기 위해 쓰인다. 실제 홈·셸·전체 CSS에 다른 탭의 반복 DOM을 넣은 실험에서, 홈 재방문은 전체 DOM 876개 조건에서 평균 36.6ms, 12,156개 조건에서 53.4ms였다. 12,156개는 실계정에서 수집한 수치가 아니다. 같은 큰 DOM에서 하단 높이 변수 --bottom-chrome-h를 고정한 대조군도 홈 54.8ms여서 이 실험에서는 변수 변경을 회귀 원인으로 확정할 수 없었다.

이 부하 실험의 measure.mjs는 390×844 Chromium·개발 React·CPU 4배 감속·reduced-motion 조건이다. 로딩 표시 재방문의 pending-return.mjs에는 CDP CPU 감속 호출이나 reduced-motion 지정이 없다. 따라서 526.5ms → 29.6ms 비교는 390×844 Chromium·개발 React·CPU 감속 없음·브라우저 기본 motion 설정에서 측정한 별도 결과다. 로컬 측정치를 실기기·Production 보장 시간으로 사용하지 않는다.

5. 적용 결과

항목전 → 후 / 확인 상태
로딩 중 홈 재방문 첫 프레임26.6ms 시점 opacity:0 → 29.6ms 시점 opacity:1
이미 보였던 홈 골격의 완전 표시클릭 후 526.5ms → 29.6ms. 각 1회 재현 비교이며 일반 성능 보장 수치가 아님
편집 진입 때 원래 홈 DOM연결 해제(false) → 연결 유지(true), 편집 중에는 실제 비표시
편집 복귀 화면새 탭·상세 생성 → 같은 앱/홈/탭/세션 상세 DOM 유지, 스크롤 80px 보존, 진입 슬라이드 재생 0회
리포트 새 연도 요청 중 본문기존 DOM 연결 해제·잔디 365 → 0개·기간 버튼 0개 → 같은 본문·기간 조작부·잔디 365개 유지
리포트 기간 일치본문 전체 교체 → 기존 기간 이름·값을 함께 유지하고 요청 대상 안내, 새 응답의 제목·수치를 함께 게시
이미 완료한 기간/탭 왕복같은 기간 재요청 → 유효한 완료 응답 재사용, 해당 검사에서 추가 요청 0회
리포트 오류·계정 경계오류 시 기존 표시와 재조회, revision/필터 무효화, 계정 변경 즉시 이전 데이터 비표시 및 늦은 응답 거절 확인
종목 상세 연도 변경전후 같은 상세·히어로 DOM 유지, 추가 요청 0회. 해당 경로의 전면 재생성·RPC 재호출 결함은 재현되지 않음
신규 브라우저 회귀pending 4건 + 리포트 6건(하위 검사 포함) + 모바일 셸 3건 = 13건 통과. 그룹 추가 회귀를 포함한 최종 결과 통합 HEAD a356bb4a에서 16건 통과·실패/skip 0: 신규 15건(표시 4+리포트 6+셸 3+그룹 2)과 선행 종목 배치 1건
그룹 작성기 왕복변경 전 보드 DOM 연결 해제·복귀 시 새 보드·미전송 댓글 빈 문자열 재현. 변경 후 확정 결과 화면·댓글 보존 수리 완료, 브라우저 2/2 통과. fixture 높이가 낮아 스크롤은 0→0이며 손실 실측으로 주장하지 않음
결함 탐지 증거공용 pending 변경 전 4건 모두 투명한 첫 프레임으로 실패; 편집 보존 변경 전 원래 홈 연결 단언 실패; 리포트 변경 전 본문 연결 해제·잔디/조작부 소실 재현
기존 홈 검사homeBootLoadingOrder.test.mjs 11건 통과. 준비된 PR 데이터가 다시 골격으로 바뀌지 않는 기존 조건 유지
Phase 1 전체 검사npm run check: 3,435건 중 3,400 통과·35 skip·실패 0, 구현 6cdc2aa
최종 checkPhase 1·2 각각 3,435건 중 3,400 통과 / 35 조건부 DB skip / 실패 0
필수 precheck최신 release 82d2073c를 합친 HEAD a356bb4a에서 static/unused/build/artifacts 통과, unit-1 1,671 pass·12 skip + unit-2 1,729 pass·23 skip, 실패 0, 1분 54초. 브라우저·DB 제외
Merge Check정상 큐 실행 34484566618 성공. Merge Check 후 검증한 merge commit 반영. full CI 실행 아님
release 병합2026-09-10 release/v0.17.10 반영 완료, Production 미반영. 앱 PR #1556, merge dbf39b1f5d4a31dabc8a19558895b800370272da. 개별 검사·Production 배포와 구분
운영 확인공개 운영 URL의 로그인 화면만 확인. 인증 후 운영 전환·실기기 시간·Production 배포는 미검증

6. 이번 개선으로 향상된 것

준비 중인 화면의 표시가 재방문 때문에 다시 사라지지 않는다

홈·피드·리포트·탭 청크 등 공용 로딩 표시를 쓰는 곳에서, 이미 만들어 둔 골격을 추가 지연 없이 보여 준다. 준비 완료 화면을 인위적으로 로딩으로 바꾸는 정책을 추가하지 않았다.

세션을 편집하고 돌아와도 원래 화면을 이어 본다

탭과 상세 화면의 수명을 편집 화면과 분리해, 복귀할 화면의 DOM·스크롤·로컬 상태를 보존한다. 숨은 화면이 현재 편집 화면의 하단 바를 바꾸지 않도록 소유권도 함께 분리했다.

리포트를 넘기는 동안 본문과 조작부를 유지한다

새 응답을 기다리는 동안 기존 본문을 읽고 기간을 다시 선택할 수 있다. 기간 이름과 수치를 함께 바꾸는 표시 계약, 완료 응답 재사용, 계정 전환·응답 역전 검사를 남겼다.

남은 것

최종 적용 상태는 2026-09-10 release/v0.17.10 반영 완료, Production 미반영이며 필수 검사·병합 증거는 위 결과표에 기록한다. 그룹 작성기 분기의 최종 확인 상태는 화면·댓글 보존 수리 완료, 브라우저 2/2 통과. 인증 후 운영 전환·실기기 시간·Production 배포는 이번 로컬 검증으로 확인하지 않았다. 확인하지 않은 원인을 추가 결함이나 후속 수리 과제로 등록하지 않았다.