# 新規プロジェクトへの flaker 導入チェックリスト [English](new-project-checklist.md) 新しいリポジトリで flaker を「即日 → 1 週 → 1 ヶ月」の段階で価値を出すための手順書。0.7.0 以降を前提とする。 Day 1 は `init → doctor → plan → apply → status` の 5 ステップで収束させる。順に実行すれば 30 分で初期セットアップが終わり、1 週間で計測ベースが整い、2〜4 週間で CI gating に昇格できる状態になる。 --- ## Day 0: 前提確認 (5 分) ```bash node --version # >= 24 pnpm --version # >= 10 git remote -v # origin が GitHub を指している gh auth status # ログイン済み (flaker apply で履歴収集するときに必要) ``` GitHub Actions を使っていない / 履歴が無い場合も問題ない。`flaker apply` は履歴ゼロの repo では cold-start 経路 (local run で self-seed) を選ぶので、Day 1 の手順はそのまま通る。CI 履歴は後から自然に溜まる。 `moon` (MoonBit) は不要。flaker は `dist/moonbit/flaker.js` を bundle 済みで配布し、無ければ TypeScript fallback (`src/cli/core/loader.ts`) で動く。 --- ## Day 1: インストールから収束まで (15 分) Day 1 は次の 5 ステップで完結する。個別のキャリブレーション / 履歴取り込みは `flaker apply` が内部で面倒を見るので、ユーザーが順序を覚える必要はない。 ### 1. インストール ```bash pnpm add -D @mizchi/flaker ``` ### 2. `flaker.toml` を生成 adapter / runner をその場で指定: ```bash # 例: vitest プロジェクト pnpm flaker init --adapter vitest --runner vitest # 例: playwright e2e pnpm flaker init --adapter playwright --runner playwright # 例: jest pnpm flaker init --adapter jest --runner jest # 例: actrun (GitHub Actions ローカル実行) で playwright をラップ pnpm flaker init --adapter playwright --runner actrun ``` owner / name は git remote から自動検出される。`--owner` / `--name` で上書き可。 `flaker init` は `[gate.release]` / `[gate.merge]` / `[gate.iteration]` の既定値も同時に書き込む。 ### 3. doctor で環境チェック ```bash pnpm flaker doctor ``` 期待する出力: ``` OK config flaker.toml is readable OK config ranges all values within expected ranges OK duckdb DuckDB initialized successfully OK moonbit MoonBit JS build detected (or fallback) Doctor checks passed. ``` DuckDB が落ちる場合は `node --version` が 24 未満の可能性が高い。 ### 4. affected resolver を設定 `flaker run --gate iteration` / `hybrid` strategy を活かすには resolver の設定が必要。`flaker init` の既定は `simple`。プロジェクトの形に合わせて `flaker.toml` の `[affected]` セクションを編集: ```toml # 単一 package / フォールバック (init 既定。vitest / jest ライブラリでまずこれ) [affected] resolver = "simple" config = "" # pnpm / npm / yarn workspaces を使っているモノレポ [affected] resolver = "workspace" config = "" # glob ルールを手で書く (flaker.affected.toml を別途作成) [affected] resolver = "glob" config = "flaker.affected.toml" # bitflow を使っている場合 [affected] resolver = "bitflow" config = "flaker.star" # MoonBit プロジェクト [affected] resolver = "moon" config = "" ``` resolver を設定しないと `hybrid` は `weighted` フォールバックで動くだけ。選択の目安: - 単一 package なら `simple` のまま - monorepo なら `workspace` (最も楽) - 細かい依存ルールが要るなら `glob` 詳細表は [how-to-use.ja.md 依存分析の設定](how-to-use.ja.md#依存分析の設定) を参照。 ### 5. `flaker plan` で差分を確認 ```bash export GITHUB_TOKEN=$(gh auth token) pnpm flaker plan ``` `flaker.toml` を desired state として、今 DB に何が欠けているかを planner が示す。履歴ゼロの repo なら `collect_ci` + `cold_start_run` が、`[quarantine].auto=true` のときは `quarantine_apply` も plan に載る。 ### 6. `flaker apply` で収束させる ```bash pnpm flaker apply ``` `flaker apply` は `collect` / `calibrate` / `quarantine apply` を現状に応じて自動で順に実行する idempotent コマンド。同じコマンドを cron や nightly で回しても状態が壊れない。 ### 7. `flaker status` で確認 ```bash pnpm flaker status ``` サマリダッシュボードが 1 画面で出る。Day 1 段階では `data confidence: insufficient` が出て普通。1 週間運用すると自然に `moderate` に上がる。 --- ## Day 2-3: 継続的な apply `flaker apply` は idempotent なので、Day 2 以降は「1 日 1 回走らせておく」だけで十分。手動で `collect` / `calibrate` を順に叩く必要はない。 ```bash export GITHUB_TOKEN=$(gh auth token) pnpm flaker apply pnpm flaker status # 日次ダッシュボード pnpm flaker status --detail # KPI ビュー (旧 analyze kpi) ```
内部で何が走っているか知りたい・個別コマンドで掘りたい場合 `flaker apply` は内部的に以下を現状に応じて実行する。単体で叩きたい場合は直接呼んでもよいが、`flaker apply` が canonical。 **CI 履歴取り込み:** ```bash export GITHUB_TOKEN=$(gh auth token) pnpm flaker import --ci --days 30 ``` **キャリブレーション:** ```bash pnpm flaker calibrate ``` `flaker.toml` の `[sampling]` セクションに最適な戦略・サンプル率が書き込まれる。`--dry-run` を付ければ書き込まずに推奨だけ見られる。 データが少ないとき (commits < 20) は `confidence: insufficient` か `low` の警告が出るが無視して続行 OK。1 週間後に再度 `flaker apply` を回せば自然に更新される。
--- ## Day 3: package.json scripts を整える 0.7.0 以降は apply-first の script 構成にする: ```jsonc { "scripts": { "flaker": "flaker", "flaker:plan": "flaker plan", "flaker:apply": "flaker apply", "flaker:status": "flaker status", "flaker:run:iteration": "flaker run --gate iteration", "flaker:run:release": "flaker run --gate release", "flaker:eval": "flaker status --markdown", "flaker:doctor": "flaker doctor" } } ``` `pnpm flaker:run:iteration` を pre-push hook や lefthook / husky と組み合わせると、push 前に自動で affected テストだけ流せる。`pnpm flaker:apply` は毎朝の cron / launchd 向け。 --- ## Day 5: GitHub Actions に統合 (advisory モード) ### 1. PR advisory ジョブ `.github/workflows/ci.yml` に追加: ```yaml - name: Setup Node uses: actions/setup-node@v4 with: node-version: 24 - name: Setup pnpm uses: pnpm/action-setup@v4 - name: Install run: pnpm install --frozen-lockfile - name: Run tests via flaker (advisory) run: pnpm flaker run --gate merge continue-on-error: true # advisory mode env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Post status as PR comment if: github.event_name == 'pull_request' run: | pnpm flaker status --markdown > .artifacts/status.md pnpm flaker report report.json --summary --adapter vitest --pr-comment \ | gh pr comment ${{ github.event.pull_request.number }} --body-file - env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` `continue-on-error: true` がポイント。最初の 2〜4 週間は **絶対に required check にしない**。データが揃うまで誤検知が出る。 ### 2. nightly 履歴蓄積ジョブ `.github/workflows/nightly-flaker.yml`: ```yaml name: nightly flaker on: schedule: [{ cron: "0 18 * * *" }] # JST 03:00 workflow_dispatch: jobs: apply: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: { node-version: 24 } - run: pnpm install --frozen-lockfile - run: pnpm flaker apply env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: pnpm flaker status --markdown > .artifacts/flaker-status.md - uses: actions/upload-artifact@v6 with: name: flaker-nightly path: .artifacts/ ``` 毎晩 `flaker apply` で現状を収束させ、`flaker status --markdown` で週次レビュー用の artifact を残す。 --- ## Week 1: 観測と微調整 毎朝 5 分: ```bash pnpm flaker status # 1 画面で全体把握 pnpm flaker status --list flaky # 上位の flaky テスト pnpm flaker explain insights # CI vs local 差分などの AI 分析 ``` 何か気になったら: ```bash # 個別テストを N 回再実行して broken/flaky/transient 判定 pnpm flaker debug confirm "tests/api.test.ts:handles timeout" --runner local --repeat 10 # CI で失敗したテストをローカル再実行 pnpm flaker debug retry --run # どのコミットで flaky 化したか pnpm flaker debug bisect --test "tests/api.test.ts:handles timeout" ``` --- ## Week 2-4: required check に昇格する条件 `pnpm flaker status` の drift セクションが `ready` を示したら CI gating に切り替えて OK。より詳細な actual 値を確認したいときは `pnpm flaker status --gate merge --detail`。到達目安は以下: | Metric | 目標 | |---|---| | Matched commits | ≥ 20 | | Recall (CI failures caught) | ≥ 90% | | False negative rate | ≤ 5% | | Pass correlation | ≥ 95% | | Holdout FNR (もし使うなら) | ≤ 10% | | Co-failure data | "ready" | | Data confidence | "moderate" or "high" | 到達したら、`ci.yml` の `continue-on-error: true` を外して required check 化。 ### 自動キャリブレーション再実行 `flaker apply` を回し続ける限り、データが増えれば自動で再キャリブレーションされる。明示的に状態を確認したい場合: ```bash pnpm flaker apply git diff flaker.toml # 推奨値の変化を確認 ``` --- ## トラブルシュート (よくある詰まり) | 症状 | 原因と対処 | |---|---| | `flaker.toml uses deprecated keys` | 0.1.x 以前の config。`docs/how-to-use.md#config-migration` の表で rename | | `Config file not found` | プロジェクトルートで実行されていない。`cd` して `pnpm flaker init` から | | `actrun runner requires [runner.actrun] workflow` | `[runner.actrun]` を `flaker.toml` に追加 | | `hybrid` で 0 件しか選ばれない | resolver 未設定。`[affected].resolver` を埋める | | `flaker apply` が 0 runs しか取れない | GITHUB_TOKEN 不足 or actions:read 権限不足。`gh auth refresh -s actions:read` | | `flaker status` が `data confidence: insufficient` | コミット数 < 5。`flaker apply` を回し続ければ自然に解消 (1 週間目安) | | 並列テストが timeout | DuckDB の単一書き手制約。同じ `.flaker/data.duckdb` を使う複数プロセスを直列化 | | `dist/moonbit/flaker.js` が無い | `pnpm install` 後に flaker パッケージ内で `pnpm build` 済みのものが配られているはず。npm install 直後は問題なし | --- ## 1 ヶ月後の理想形 - `flaker run --gate merge` が PR の required check - nightly で `flaker apply` が毎晩 history を更新 - 週次レポート (`flaker status --markdown`) が自動生成され Slack/issue に流れる - 開発者は手元で `pnpm flaker:run:iteration` だけで affected テストを回す - flaky テストは `[quarantine].auto=true` + `flaker apply` の自動隔離で吸収される ここまで来れば、CI 時間を 30〜70% 削減しつつ、見逃しは 5% 未満に保てる。 --- ## 参照 - [README.md](../README.md) — プロジェクト概要 - [docs/usage-guide.ja.md](usage-guide.ja.md) — 利用側の入口 - [docs/operations-guide.ja.md](operations-guide.ja.md) — 運用側の入口 - [docs/how-to-use.ja.md](how-to-use.ja.md) — コマンドと設定の詳細 - [docs/migration-0.6-to-0.7.md](migration-0.6-to-0.7.md) — 0.6.x からの移行ガイド - [docs/migration-0.12-to-0.13.ja.md](migration-0.12-to-0.13.ja.md) — 0.12.x からの移行ガイド - [docs/contributing.md](contributing.md) — 開発・dogfood - [CHANGELOG.md](../CHANGELOG.md) — バージョン履歴と breaking changes