# 新規プロジェクトへの 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