#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.sh | Phase 5: 판정 러너를 라벨 빌드(label:port)·묶음·fixture·시나리오·캐시 조합으로 돈다(judge-matrix.sh <batch> <profiles> <scenarios> <modes> <label:port> [count]) |
build.mjs | production 빌드 + 소스맵. 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.mjs | evidence-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.mjs | Phase 2 시나리오: 미리 받기가 끝난 뒤 클릭(quiet) · 개요 요청 시작 직후 클릭(collide) · 개요 응답을 CDP 로 붙들기(hold, 미채택) |
experiments/refactor-report-sections.mjs · markup-diff.mjs · projection-keys.mjs | Phase 3: 모바일 리포트 섹션 분리 스크립트, 분리 전·후 정적 마크업 6개 상태 대조, 상세 병합이 바꾸는 필드 목록 |
experiments/apply-e5-cv.mjs | 실험 5: 화면 밖 리포트 섹션에 content-visibility: auto(미채택) |
patch-p4a.diff · build-fingerprint-p4a.json | Phase 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 으로 분리.
재현
npm run ci:full-local -- --only db --keep --sandbox <dir>로 샌드박스를 만들고(마이그레이션 전체 적용),stack.sh <dir>/database status로env.json.node scripts/performance/workload/generate.mjs --all --seed 1284 --out <workloads>→node --import tsx prepare-fixtures.mjs --profile history-1y --workloads <workloads> --execute.source env1596.sh→P1596_SOURCEMAP=1 P1596_BUILD_LABEL=baseline node build.mjs --execute→vite preview --outDir test-results/dist/baseline --port 4596.profile-matrix.sh history-1y report-open,calendar-enter,calendar-month mobile,desktop cold,warm 5 baseline:4596→node compare.mjs.