改善計画書
最終更新: 2026-10-24(v7.5.0 時点で状態欄と行数を確かめ直した。棚卸しの書き直しは 2026-10-01 の v7.0.3 時点)
残作業の 1 件 1 ファイルの一覧は docs/superpowers/todo/README.md(todo 番号はそちらの番号)。
2026-10 時点の残課題
v7.0.3(main = develop)で残っているリファクタリング・不具合・整理作業。出典は .eslintrc.cjs の lint baseline、code-evaluation-2026-09.md §4、 2026-08-18 の全体監査。実バグと到達不能コードは 2026-09-05 の評価 PR (#261) でほぼ処理済みで、 残りは「構造負債」と「後片付け」の 2 系統。
判断待ち(仕様)
| # | 内容 | 推奨 |
|---|---|---|
API 由来の試合が 2v2 固定で Rank 集計から外れる | ✅ 済み(PR #311)。21→Normal_2v2 / 22→Rank_2v2 / 12→Rank_1v1(battleType/battleTypeMap.ts) | |
| O-3 | token 失効時に checkLoginStatus のフォールバックが「ログイン済み」を返す | フォールバックを loggedIn:false に倒す(todo 059、判断待ち) |
| O-2 / O-4 | 対 AI 戦をカジュアル集計に含めるか / Recorder の headless 設定が死んでいる | AI 戦は除外、headless 設定は削除(todo 060、判断待ち) |
小物(各 1 PR)
| 項目 | 状態 |
|---|---|
renderer に消費者のない統計 IPC・saveMatches・_openPlayerUid の削除 | ✅ PR #294(マージ済み) |
| telemetry-ingest Worker の gzip 本文をストリーム展開しながら上限で打ち切る (O-12) | ✅ PR #293(マージ済み) |
初めて開いたタブで画面ガイドが出ない (O-13, LazyTabPanel の mount タイミング) | ✅ PR #295(マージ済み) |
| MatchData→DB 変換 3 系統の team フォールバック統一 (O-9) | ✅ PR #297 |
RecorderStateFile の毎秒 DB 照会 (O-11) | ✅ 解消済み(TTL 1 秒メモ化 + 5 秒間隔 + 差分書き込み。#238) |
useDraggable の全状態 broadcast (O-10) | ✅ rAF 間引き済み (#241)。mouseup 確定にするかは任意 |
OverlayState の描画されない永続キー(avatar* / cornerDecoration* / bottomRightText*)の除去 | 未着手(todo 065、判断待ち)。zustand persist は撤去済みで、保存先は正本 overlay-config.json(OverlayConfigOwner)と移行元の legacyOverlayStorage.ts。PositionAdjustment の UI と Overlay セレクタも触る |
lint baseline(= 分割 backlog)
閾値はファイル 600 行 / 関数 250 行(どちらも空行・コメントを除いた実コード行)。baseline から外して yarn lint が通れば完了の証明になる。 下表の行数は 2026-10-24 の wc -l(空行・コメント込み)で、lint の数え方より多い。
max-lines(ファイル)
| 行数 | ファイル | 備考 |
|---|---|---|
| 2,494 | electron/services/recorder/RecorderAutoStart.ts | 7 月評価時 1,138 行。マルチプロファイル対応以降も伸び続けている(todo 073) |
| 1,211 | electron/main.ts | 起動クロージャ(todo 073) |
| 792 | scripts/log/analyze-log/parsers/LogParser.ts | 本体と乖離した第 2 パーサ。分割ではなく削除対象(todo 074) |
| 602 | src/types/electron.d.ts | electron/preload/types.ts との二重管理。型の単一ソース化で解消(todo 072) |
max-lines-per-function(関数): DatabaseConnection.ts(createTables)/ main.ts / recorderModeBootstrap.ts / BrowserAutomationTab.tsx / LogSimulator.tsx / PlayerDashboardTab.tsx / useRealtimeSessionState.ts / AutoLaunchSectionView.tsx / useLogWatcher.ts の 9 件。React 側は props-only の *View 抽出で renderer テストだけで進められる。electron 側は yarn dev:electron / test:fresh:dev での起動確認が要る。
構造的な大物(順番に意味がある)
- ElectronAPI 型の単一ソース化:
electron/preload/types.tsとsrc/types/electron.d.tsが相互参照なしで並走し、変更頻度トップ 2。preload 側を正にして d.ts を生成か re-export に。以降の全作業の再発防止になるので最初(todo 072) - scripts 側ログ解析エンジンの廃止:
watch-log.ts --replayとscripts/debug/*だけが使う。src/utils/logAnalyzerに差し替えて削除(todo 074) RecorderAutoStartの分割: 純関数抽出 → メソッド抽出 → クラス分割の 3 段階。まずプロファイル巡回とログイン窓を外へ(todo 073)main.ts/recorderModeBootstrapの起動クロージャ分解:StartupSequencerへ載せ替える- O-7 終了処理を
before-quitへ: Recorder / Viewer ではクリーンアップが一度も走らない構造。3 の後 - O-8 試合終了ワークフローの renderer 二重実装(
useBrowserAutomation/useBrowserAutomationSession)と status ポーラ 4 本を単一 owner hook に O-5: ✅ 解消済み(PR #315)。ファイルごとの読み位置をLogWatcherServiceの単一ファイル位置モデルfileReadStates(Map)に持ち、監視中に作られたファイルは先頭から読むO-6 同期モデルが「全状態の後勝ち」: ✅ 解消済み(PR #299)。正本overlay-config.jsonは 1 つで、画面は変わったキーだけ(パッチ)を送る(Sync and State)- DB マイグレーション runner 化: 単独 PR +
test:fresh:upgrade必須 storageState の token 平文保存: ✅ 解消済み(PR #382、safeStorageで暗号化)
やらないと決めたこと
- 2025-11〜2026-06 の
refactor/*ブランチの rebase・マージ(1,000 コミット以上遅れ、各 1〜3 コミット) - 2026-07-11 のリファクタリング総合評価 (#217) のマージ(古い地図が 2 枚になる。生きている項目は上に転記)
- E2E の再開(2026-07-03 の判断どおり停止)
- 旧「第 3 サイクル」の
useOverlayStore/Overlay.tsx/RealtimeAnalysisPanel/LogAnalysisTab分割を個別に追うこと(現在の lint baseline に載っていない = 閾値内)。カバレッジ閾値 60→70% は vitest 設定で達成済み
App Performance Optimization (spec: app-performance-optimization)
Electron 起動と Control パネルのタブ切替を中心に、起動・稼働時の負荷を体系的に下げた。詳細は .spec-workflow/specs/app-performance-optimization/ と各 Implementation Logs/。基準値は perf-baseline.json。
主要 KPI と達成状況
| 指標 | Before | After | 変化 | 判定 |
|---|---|---|---|---|
mainBootstrapMs(critical path) | 978.59 ms | 270.54 ms(dev 計測, trial 3) | -72.4% | ✅ 目標 -30% 達成 |
controlFirstPaintMs | 75.9 ms | 取得継続中 | — | △ dev 計測の安定化が今後の課題 |
controlMainKb(initial load) | 1339.61 KB | 734.17 KB | -45.2% | ✅ 目標 -20% 達成 |
controlTotalKb | 1339.61 KB | 1339.87 KB | ±0% | — lazy 化で初期パスから外したのみ |
overlayKb | 274.30 KB | 274.30 KB | ±0% | — singlefile 維持 |
| renderer に main 専用依存の混入 | 監視なし | CI で機械検出 | — | ✅ Phase 3.2 |
Phase ごとの成果
- Phase 0(計測基盤):
scripts/perf/measure-startup.ts/measure-bundle.tsを整備し、perf-baseline.jsonを真実の単一 source 化。yarn perf:all1 コマンドで再現可能。 - Phase 1(critical path 短縮):
electron/core/StartupSequencer.tsを導入し main bootstrap を「critical(ウィンドウ生成 + core IPC)」と「deferred(DB / 機能 IPC / startup-import / chokidar)」に 2 分。main.bootstrapを 978 → 270 ms に短縮。 - Phase 2.1〜2.2(タブ lazy mount):
LazyTabPanel+tabLoaders.tsで全タブを動的 import + keep-alive。タブ切替時の DOM ツリーが状態保持される。 - Phase 3(バンドル分割):
- 3.1: Control の
viteSingleFileを外しmanualChunksでreact-vendor/mui/charts/vendorに分割。initial load -45%。 - 3.2:
check-renderer-imports.tsで main 専用依存の renderer 流入を検出。 - 3.3:
check-bundle-size.tsで initial load 予算をperf-baseline.jsonに固定。 - 3.4: GitHub Actions の pr-check に統合(当面
continue-on-error: true)。2026-10-25 に独立 job からcheckjob の後半ステップへ移した(Actions の分数削減)。
- 3.1: Control の
- Phase 5.1(dev:electron 体感改善): スプラッシュ +
optimizeDeps事前列挙 + parallel build/vite で「白画面待ち」を解消。
未達 / 持ち越し
- 2.3
React.memo/ selector 最適化(計測ベース): Profiler 計測の安定化が必要なため、別 issue に切り出し。 - 2.4 仮想スクロール導入要否の判断: 計測待ちで延期。
- 2.5 タブ TTI ベースライン再計測: 5.2 と同様 dev 計測の安定化と一緒に再着手。
- 5.2 dev:electron 完全自動 3-run 計測: ユーザの実 Vite session と並走しない構成(独自 userData / 別ポート + DevTools off)に固める作業を follow-up issue として登録予定。
CI 統合(perf 計測)
- pr-check の
checkjob の後半ステップ:yarn build→perf:bundle→perf:check-imports→perf:check-size。 - 当面
continue-on-error: true(Phase A)。1〜2 PR サイクル安定確認後に required 化(Phase B)。 - pre-push には載せない(毎 push に build を強いるとローカル流れが重い)。
- 予算引き上げが必要なときは
npx tsx scripts/perf/check-bundle-size.ts --update --margin 5で書き換え、PR 説明に理由を書く。
第2サイクル進捗
| # | 項目 | ステータス |
|---|---|---|
| 11 | 各タブの個別 ErrorBoundary ラップ | ✅ 完了 (06ef350) |
| 12 | console.log → Logger 置換 | ✅ 完了 — store/hooks (2ae87f7) |
| 13 | SeasonAnalyticsPanelView 分割 (562→292行) | ✅ 完了 (10f4ddd) |
| 14 | SettingsSubTabs 分割 (458→212行) | ✅ 完了 (10f4ddd) |
| 15 | DB row の as any 型キャスト排除 | ✅ 完了 (10f4ddd) |
進捗
| # | 項目 | ステータス |
|---|---|---|
| 1 | Error Boundary の導入 | ✅ 完了 (fcd2ad9) |
| 2 | グローバルエラーハンドラの追加 | ✅ 完了 (fcd2ad9) |
| 3 | IPCチャネルのホワイトリスト化 | ✅ 完了 (fcd2ad9) |
| 4 | electronAPI ラッパーへの統一 | ✅ 完了 — BP Window/ResponseStorage/RuntimeStatusも移行済み |
| 5 | Electron サービスのテスト追加 | ✅ 完了 (9b6b3b0) — UserSettings/ResponseStorage テスト追加 |
| 6 | ウィンドウマネージャ・大型コンポーネントのテスト追加 | ✅ 完了 — フックテスト6件 + WindowStateStoreテスト追加 |
| 7 | 大型コンポーネントの分割 | ✅ 完了 — 全6コンポーネント分割(BrowserAutomationTab/ControlPanel/SeasonAnalyticsPanel/LogAnalysisTab/CharacterMatchupsSectionView/RealtimeAnalysisTab) |
| 8 | React.memo の適用 | ✅ 完了 (8f930d0) — 6コンポーネントに適用 |
| 9 | シーズンフィルタの再有効化 | ✅ 完了 (a82a829) — 7箇所のTODO解消 |
| 10 | as any キャストの排除 | ✅ 完了 (c1bd1ef) |
概要
コードベース全体(React + Vite + Electron)の調査に基づく改善項目を優先度別に整理。 各項目は独立して着手可能。
HIGH優先度
1. Error Boundary の導入
- 課題: React Error Boundary が一つも存在せず、任意のコンポーネントでレンダーエラーが発生すると UI 全体がクラッシュする
- 提案: 共通
ErrorBoundaryコンポーネントを作成し、主要画面(ControlPanel、Overlay、RealtimeAnalysisTab 等)をラップ - 影響範囲:
src/components/全体 - 見積: 小〜中
2. グローバルエラーハンドラの追加
- 課題: Electron メインプロセスに
uncaughtException/unhandledRejectionハンドラがなく、未捕捉の例外がサイレントに失敗またはクラッシュを引き起こす - 提案:
electron/core/AppLifecycle.tsにプロセスレベルのエラーハンドラを追加し、ログ出力+ユーザー通知を行う - 影響範囲:
electron/core/AppLifecycle.ts,electron/main.ts - 見積: 小
3. IPC チャネルのホワイトリスト化
- 課題:
preload.tsのon()メソッドが任意のチャネル文字列を受け付ける。レンダラ側で不正なチャネルのリッスンが可能 - 提案: 許可されるチャネル名のホワイトリストを定義し、
on()内で検証 - 影響範囲:
electron/preload.ts - 見積: 小
4. electronAPI ラッパーへの統一
- 課題: 20箇所以上で
window.electronAPIを直接参照しており、一部はas anyキャストを使用。型安全性とエラーハンドリングがバイパスされている - 主な該当箇所:
BrowserAutomationTab.tsx(5箇所)useMatchListState.ts(8箇所)useMatchDetail.ts(2箇所)LogSimulator.tsx(1箇所)SeasonAnalyticsPanel.tsx(1箇所)LayoutResetButtons.tsx(6箇所,as any付き)RealtimeAnalysisTab.tsx(2箇所)
- 提案:
src/utils/electronAPI/の型付きラッパーに全て移行し、直接アクセスを排除 - 影響範囲:
src/components/,src/hooks/ - 見積: 中
MEDIUM優先度
5. Electron サービスのテスト追加
- 課題: 5つのElectronサービスのうち4つがテストなし
AutoUpdateService.tsBrowserAutomationService.tsResponseStorageService.tsUserSettingsService.ts
- 現状テストあり:
LogWatcherService.test.tsのみ - 提案: 各サービスの責務に応じたユニットテストを追加。既存のテストパターン(
electron/database/,electron/ipc/)に準拠 - 影響範囲:
electron/services/ - 見積: 中〜大
6. ウィンドウマネージャ・大型コンポーネントのテスト追加
- 課題:
- 4つのウィンドウマネージャがすべてテストなし(
ControlWindowManager,OverlayWindowManager,BPOpponentWindow, 予定のウィンドウ) BrowserAutomationTab.tsx(986行)がテストなし
- 4つのウィンドウマネージャがすべてテストなし(
- 提案: 重要度の高いものからテストを追加。BrowserAutomationTab はコンポーネント分割(#7)と併用が効果的
- 影響範囲:
electron/windows/,src/components/tabs/browser-automation/ - 見積: 大
7. 大型コンポーネントの分割
- 課題: 以下のコンポーネントが過大で、状態管理・API呼び出し・描画が混在
BrowserAutomationTab.tsx— 986行ControlPanel.tsx— 819行SeasonAnalyticsPanel.tsx— 715行LogAnalysisTab.tsx— 658行CharacterMatchupsSectionView.tsx— 545行RealtimeAnalysisTab.tsx— 522行
- 提案: 責務ごとに子コンポーネント・カスタムフックへ分割。Container/View パターン(既存の
bp-opponent/で採用済み)に統一 - 影響範囲:
src/components/tabs/ - 見積: 大(コンポーネントごとに中)
8. React.memo の適用
- 課題:
React.memoを使用しているコンポーネントがわずか2件(PlayerCard,CharacterIcon)。親コンポーネントの状態変化で不要な再レンダリングが発生 - 提案: 再レンダリングが頻繁なコンポーネント(リストアイテム、チャート、アイコン等)に
React.memoを適用。React DevTools Profiler でボトルネックを特定してから対応 - 影響範囲:
src/components/,src/screens/ - 見積: 小〜中
LOW優先度
9. シーズンフィルタの再有効化
- 課題: シーズンフィルタ機能が一時無効化され、7つの TODO コメントが散在
MatchListToolbar.tsx(3箇所)useMatchListState.ts(2箇所)PlayerDashboardTab.tsx(2箇所)useMatchesData.ts(2箇所)
- 提案: シーズン判定ロジック(
src/constants/seasons.ts)を安定化させ、各箇所の TODO を解消してフィルタを再有効化 - 前提: シーズンデータの供給方法が確定していること
- 影響範囲:
src/constants/seasons.ts,src/components/tabs/db-viewer/,src/components/tabs/player-dashboard/ - 見積: 中
10. as any キャストの排除
- 課題: 以下の箇所で
as anyを使用src/components/tabs/common/hooks/useProfileManager.ts:62— プロファイルリストのキャストsrc/hooks/useMatchConverter.ts:54,58— プロパティアクセスのキャストsrc/components/tabs/settings/containers/LayoutResetButtons.tsx(6箇所) — #4 で対応
- 提案: 適切な型ガード・インターフェース定義に置換
- 影響範囲: 個別ファイル
- 見積: 小
パフォーマンス計測の自動化アイディア
spec: app-performance-optimization の Task 0.5 / 1.6 / 2.5 など、現状は人手依存の計測項目を yarn perf:all 一発で回せる状態にしたい。下記アイディアの整理メモ。実装は app-performance-optimization の本体タスクとは別に、e2e-automation-tests spec(未着手)と連携して進める想定。
自動化しやすい(数時間〜半日)
- バンドルサイズ計測:
dist/control/manifest.jsonを読むスクリプト。tasks.md3.3 に既に積んでいるscripts/perf/check-bundle-size.tsが該当。 - 冷起動
main.bootstrap: 既存scripts/perf/measure-startup.tsをyarn perf:startupとしてpackage.jsonに登録、yarn build:electron-tsを pre-script に置く。 yarn perf:all一括計測: 上記 2 つ + 結果をperf-baseline.jsonに上書きする集約スクリプトを書く。レポート 1 回で全部更新できる。
中くらい(1〜2 日)
- タブ切替 TTI:
playwright-core(既に依存にある)で Electron を直接駆動。タブクリック →performance.now()で次フレームの DOM marker までの差分を測る。 - renderer first paint: renderer 起動直後に
src/utils/perf.tsから[perf] control.firstPaint=Nmsをconsole.log出力 →--enable-loggingで main の stdout に乗る →measure-startup.tsが拾う。既存の[perf] <label>=<ms>仕組みをそのまま流用できる。 - DB 初期化失敗フォールバック: Playwright で
userDataの DB ファイルを退避 → app 起動 → ダイアログ visible の assert。manual checklist の 1 項目を E2E に昇格できる。 - chokidar 起動有無: デバッグ用 IPC
dev-internal-statusを追加(dev のみ expose)→ Playwright で fetch → 期待値と比較。dev only にしてセキュリティ影響を回避。
難しい / 自動化しないほうが良い
- React Profiler の再レンダ回数の正確な比較: Profiler API は dev only でビルド差で値が変わる。Playwright +
<Profiler onRender>のサンプリングで「相対値」までは取れるが、CI で安定的な閾値判定は難しい。dev 開発者が手元で見るだけに留める方針推奨。 - 「体感の重さ」の主観評価: 人がやるしかない。手動チェックリストは残す。
- シーン依存(実ログ解析中)の負荷計測: テスト用ログサンプルが必要。整備 → 維持コストが高め。
推奨アプローチ
app-performance-optimizationの Task 3.3(bundle-size)と Task 0.3 のpackage.jsonscript 化から着手。即効性あり、コスト低。- Playwright Electron による cold start + tab TTI 自動化は別 spec
e2e-automation-testsの 1st マイルストーンに据える。app-performance-optimization内では参照のみ。 - 再レンダ回数は CI 判定にせず、dev 用の
Profilerラッパーで開発者が見られるだけにする。退化検知は TTI / バンドルサイズで十分なケースが多い。
この方針で進めれば、app-performance-optimization の Task 0.5 / 1.6 / 2.5 を yarn perf:all 1 コマンドで再現可能にできる。
E2E 自動化(e2e-automation-tests)の到達点
spec e2e-automation-tests の Phase 0–3 が完了し、主要フローの手動回帰依存が解消 された。
- Phase 0: Playwright + Electron 基盤(
@playwright/test、playwright.config.ts、launchApp/withTempUserData/dbAccessヘルパー、ELECTRON_USER_DATAoverride) - Phase 1: 5 シナリオ(startup smoke / log-import / db-viewer / profile-switch / overlay-sync)
- Phase 2: yarn scripts(
test:e2e[:smoke|:headed])と GitHub Actions(PR smoke / nightly full) - Phase 3:
tests/e2e/README.md、vitest exclude、本ドキュメントへの反映
これにより、リリース前作業は「CI 緑(unit + lint + tsc + e2e:smoke)+ 重点スポット確認」に縮約可能。
カバレッジベースライン(2026-05-05, spec: code-split-and-coverage)
計測コマンド:
yarn test:unit --coverage
詳細:coverage-baseline.json
| Metric | Current | Target | 状態 |
|---|---|---|---|
| Lines | 81.11% | 70% | ✅ |
| Statements | 79.48% | 70% | ✅ |
| Functions | 81.26% | 70% | ✅ |
| Branches | 67.32% | 60% | ✅ |
全指標でターゲット超過済み。以下のファイルが個別に低カバレッジ:
| File | Stmts | Branch | 対処方針 |
|---|---|---|---|
electron/database.ts | 51.37 | 32.28 | coverage.exclude に追加(Electron直依存) |
electron/services/LogWatcherService.ts | 54.02 | 37.07 | coverage.exclude に追加 |
src/utils/electronAPI/database.ts | 31.85 | 31.57 | coverage.exclude に追加 |
src/utils/electronAPI/window.ts | 44.87 | 42.30 | coverage.exclude に追加 |
src/components/tabs/db-viewer/hooks/useMatchListState.ts | 54.54 | 32.25 | Phase 1/3 テスト追加で改善 |
src/components/tabs/realtime-analysis/hooks/useBrowserAutomation.ts | 60.44 | 39.36 | Phase 3 テスト追加で改善 |
src/store/sync/wsAdapter.ts | 61.29 | 64.28 | Phase 1 テスト追加で改善 |
カバレッジしきい値の固定(2026-05-05, spec: code-split-and-coverage Phase 4)
vitest.config.ts の coverage.thresholds を以下にロック:
| Metric | Threshold | After excludes |
|---|---|---|
| Lines | 70% | 86.00% |
| Statements | 70% | 84.64% |
| Functions | 70% | 85.30% |
| Branches | 60% | 71.48% |
coverage.exclude に追加した Electron 直依存 / データのみのファイル:
electron/database.ts,electron/services/LogWatcherService.tssrc/utils/electronAPI/{database,window,index,responseStorage,simulator}.tssrc/data/**,src/utils/logAnalyzer/{StreamLogParser,index,types}.tssrc/test-helpers/**,src/utils/__mocks__/**
CI: .github/workflows/pr-check.yml を手動実行(workflow_dispatch・coverage 付き)したときに yarn test:ci 実行 + coverage/ artifact を 14 日保持。PR では 2026-10-25 から yarn test:unit(カバレッジなし)。
メモ
- 現在のテストカバレッジ閾値: lines/funcs/stmts 70% / branches 60%(
vitest.config.ts、2026-05-05 引き上げ) - IPC ハンドラのエラーハンドリングは良好(
electron/ipc/配下は一貫して try/catch を使用) - Electron セキュリティ設定は概ね良好(
contextBridge使用、nodeIntegration: false、contextIsolation: true) - グローバルな HACK / WORKAROUND コメントは見当たらず、コードベースはクリーン
perf 計測の CI 統合方針(2026-05-05)
app-performance-optimization Task 3.4 で決定。
場所
- GitHub Actions(
.github/workflows/pr-check.yml)に統合する。当初は独立 jobbundle-checks、2026-10-25 からcheckjob の後半ステップ(continue-on-error)。 pre-pushフックには載せない。理由: 1 push ごとにyarn buildが走ると人間の作業フローが重くなる。CI なら並列 job として動かせる。
段階的ロールアウト
- Phase A(現状): バンドルのステップを
continue-on-error: trueで運用。 失敗しても PR の checks は緑。チェック結果はログで確認できる。 この期間に false positive / 予算過小設定を洗い出す。 - Phase B: 1〜2 PR サイクル安定したら
continue-on-errorを外して required にする。 branch protection rule 側で必須にするのも同タイミング。 - Phase C(オプション): bundle size 差分を PR コメントに自動投稿する bot を入れるかは別判断。
何をチェックしているか
yarn perf:check-imports(scripts/perf/check-renderer-imports.ts): renderer に main 専用依存(playwright-core/electron-updater/better-sqlite3/chokidar/electron)が import されていないか。yarn perf:check-size(scripts/perf/check-bundle-size.ts): Control 初期ロード(entry + modulepreload + css の合計)がperf-baseline.jsonのthresholds.controlMainKbを超えていないか。
予算更新の手順
予算引き上げが必要になったら:
yarn build
npx tsx scripts/perf/check-bundle-size.ts --update --margin 5
git add perf-baseline.json
# PR 説明に「なぜ予算を増やしたか」を必ず書く背景データ(2026-05-05 時点)
controlMainKb: 734.17 KB(5% margin で threshold 770.88 KB)controlTotalKb(lazy 含む全体): 1339.87 KBoverlayKb(singlefile): 274.30 KB
データソース連携の整備(spec: data-integration-inventory)
ローカルログとブラウザ自動化の差分・照合ロジックの取りこぼし・推奨アクションを 1 ドキュメントに整理した。
上位の推奨アクション(次 spec の素材)
- A1: BattleId を log 由来 match にも紐付ける(M / DB 変更) — 短時間連戦・StartTime ずれの両方を緩和
- A2: BattleType の数値 → 文字列マッピングを単一ソース化(S)
- A3: avatar_url / rank_id / awake_kill_count 等の UI 反映を点検(S〜M)
詳細は inventory の §5 推奨アクションリストを参照。