Skip to content

#1596 Phase 1 원인 분해 실험 원본 (2026-09-14)

앱 작업 트리 test-results/phase1596/(gitignored)의 도구와 결과를 키·계정 파일(env.json, .private/) 없이 옮긴 것. 절차·해석·판정은 검증 기록 Phase 1.

도구

파일역할
stack.sh · prepare-fixtures.mjs · run-matrix.sh · runner.mjs · summarize.mjs · scenario-*.mjs#1592 Phase 4 원본(합격 판정용 20표본 러너·fixture 적재·요약). Phase 5 에서 runner.mjs--build-label(라벨 빌드의 dist·지문 대조, 워크트리 소스 일치는 기록)·결과 파일명에 라벨, summarize.mjs 에 "빌드" 열을 더했다
judge-matrix.shPhase 5: 판정 러너를 라벨 빌드(label:port)·묶음·fixture·시나리오·캐시 조합으로 돈다(judge-matrix.sh <batch> <profiles> <scenarios> <modes> <label:port> [count])
build.mjsproduction 빌드 + 소스맵. P1596_BUILD_LABEL 별 출력 폴더(test-results/dist/<label>)·지문 파일(build-fingerprint-<label>.json, head·tracked diff sha·번들 sha·패치 diff 경로)
profile-runner.mjs#1592 러너의 판정식 + CPU 프로파일(500µs) + 타임라인 트레이스 + performance.mark(t0/t1/t3). 창별 층 분해·긴 작업·RPC 시각을 evidence-profile/profile-<시나리오>-<fixture>-<화면>-<캐시>-<label>.json 으로 낸다. --build-label(빌드) · --label(출력 이름) · --app-url(그 빌드를 띄운 미리보기)
profile-analysis.mjs소스맵 해석(@jridgewell/trace-mapping), 층 분류, 창별 집계(스택 맨 위 자기 시간 / 가장 안쪽·바깥 앱 프레임 / 층 / 트레이스 이벤트), 러너 관측기 프레임 분리
profile-matrix.sh조합마다 라벨(빌드:포트)을 번갈아 실행 — 같은 시간대 A/B
compare.mjsevidence-profile 의 라벨 간 중앙값 비교표(compare.md) + 모바일 cold 의 개요 캐시 유무 분리
experiments/apply-e1.mjs + stableProviderValue.ts실험 1: 조립 루트 provider 값 15개를 감싸 (diag) 변경 키 기록 / (stable) identity 안정화. churn-driver.mjs 가 탭 전환마다 기록을 뽑는다
experiments/apply-e1b.mjs실험 1b: PC 리포트·홈 바인딩을 내리지 않고 숨김
experiments/apply-e2.mjs실험 2: 리포트 연간 잔디 섹션 memo 분리
experiments/apply-e4.mjs실험 4: exerciseCatalog 파생 목록 memo + 동의어 색인 지연 구축
experiments/transfer-cost.mjs실험 3 축소판: 개요 응답의 parse/stringify/clone/워커 왕복 비용
experiments/build-ab2.sh실험 빌드 3종을 패치→빌드→되돌리기로 만든다
scenario-quiet.mjs(→ scenario-report-open-quiet.mjs·scenario-calendar-enter-quiet.mjs) · scenario-report-open-collide.mjs · scenario-report-open-hold.mjsPhase 2 시나리오: 미리 받기가 끝난 뒤 클릭(quiet) · 개요 요청 시작 직후 클릭(collide) · 개요 응답을 CDP 로 붙들기(hold, 미채택)
experiments/refactor-report-sections.mjs · markup-diff.mjs · projection-keys.mjsPhase 3: 모바일 리포트 섹션 분리 스크립트, 분리 전·후 정적 마크업 6개 상태 대조, 상세 병합이 바꾸는 필드 목록
experiments/apply-e5-cv.mjs실험 5: 화면 밖 리포트 섹션에 content-visibility: auto(미채택)
patch-p4a.diff · build-fingerprint-p4a.jsonPhase 4 채택안: 안정화 비교가 getter 를 읽지 않음 + 문자열 바이트 상한의 인코딩 없는 판정
patch-e6-background-lane.diff · experiments/e6-mainThreadQuiet.test.mjs·e6-resourceStoreBackgroundLane.test.mjs · build-fingerprint-p4-lane.json실험 6: 배경 요청의 채택을 requestIdleCallback 뒤로 미루는 자원 저장소 차선(미채택 — 겹침 첫 반응 86→195ms)

결과 파일

  • run1-loaded/ — 첫 묶음(기준 10조합 + E1 stable). E1 실행 구간에 같은 PC 의 다른 세션 부하가 있어 비교에는 쓰지 않는다(기준 분해 표는 이 묶음의 기준 파일에서 뽑았다).
  • runs/profile-*-ab1.json — 기준 vs E4 동시 A/B. profile-*-ab2.json — 기준 vs E1 stable · E1b · E2. profile-*-ab3.json·ab4 — 기준 vs Phase 2(p2-identity; ab4 = quiet 시나리오). profile-*-ab5.json — 기준 vs Phase 2 vs Phase 3(p3-sections). profile-*-ab6.json — 기준 vs Phase 3 vs Phase 3+실험 5(p3-cv). profile-*-ab7.json — 기준 vs Phase 3 vs Phase 4(p4a) vs 실험 6(p4-lane), 4 시나리오. profile-*-ab8.json — 달력 겹침 없는 진입·월 이동(기준 vs Phase 3 vs Phase 4).
  • churn-{mobile,desktop}-history-1y.json — provider 값 변경 기록. patch-*.diff — 각 실험·Phase 빌드에 들어간 소스 diff(patch-p2-identity.diff, patch-p3-sections.diff). build-fingerprint-*.json — 빌드 지문. compare.md — 비교표.
  • transfer-cost-*.json — 실험 3 축소판.
  • judge/browser-*-final-batch*.json — Phase 5 판정 계측(#1592 러너 20표본, 최종 빌드 bc935f35, 모바일 1·4년 × 3 시나리오 × cold/warm × 묶음 1·2 중 23조합). judge/summary.md·summary.json — 합격선 대조 결과. 기준 빌드 재계측·나머지는 #1603 으로 분리.

재현

  1. npm run ci:full-local -- --only db --keep --sandbox <dir> 로 샌드박스를 만들고(마이그레이션 전체 적용), stack.sh <dir>/database statusenv.json.
  2. node scripts/performance/workload/generate.mjs --all --seed 1284 --out <workloads>node --import tsx prepare-fixtures.mjs --profile history-1y --workloads <workloads> --execute.
  3. source env1596.shP1596_SOURCEMAP=1 P1596_BUILD_LABEL=baseline node build.mjs --executevite preview --outDir test-results/dist/baseline --port 4596.
  4. profile-matrix.sh history-1y report-open,calendar-enter,calendar-month mobile,desktop cold,warm 5 baseline:4596node compare.mjs.