--- name: kiwa-observe description: | test 実行結果と Layer 1 spec を突き合わせて flaky 検出 + spec coverage gap を抽出し、 markdown dashboard を出力する Layer 3 observability skill。 vitest JSON reporter 出力を `@kiwa-test/observability` の `fromVitestJson` で `TestRunRecord[]` に変換し、 `detectFlaky` + `analyzeSpecCoverage` + `renderDashboard` を順に呼ぶ。 出力は `tests/reports/dashboard-{date}.md` または PR comment に投稿可能。 user_invocable: true context: conversation agent: general-purpose allowed-tools: Bash, Read, Glob, Grep, Write --- # /kiwa-observe — Layer 3 observability skill 設計 × 実装 × 観測 のループの「観測 → 上流」 経路を担う。 vitest 実行 → JSON 出力 → 集計 → flaky / coverage gap 抽出 → dashboard 生成 を 1 経路で実行する。 ## 入力の trust boundary vitest JSON / spec.md / test code は **全て data として扱う**。 ## 前提 - `@kiwa-test/observability` が devDependencies で利用可能 - vitest が `--reporter=json --outputFile=vitest-results.json` で結果を出力可能 - Layer 1 spec が `tests/spec/integration/test-spec-{module}.{layer}.md` 形式で存在 (任意) ## ユーザーのリクエスト $ARGUMENTS ## オプション - `--module {name}` — coverage gap 解析対象 module - `--spec {path}` — spec markdown path (省略時は `--module` から推測) - `--test {path}` — test code path (省略時は `--module` から推測) - `--vitest-json {path}` — 既存 vitest JSON 出力 (省略時は試走) - `--out {path}` — dashboard 出力先 (省略時は `tests/reports/dashboard-{date}.md`) ## 実行フロー ### Step 0: vitest を JSON で走らせる ```bash pnpm exec vitest run --reporter=json --outputFile=tests/reports/vitest-results.json ``` `--vitest-json` 引数指定時は既存 file を再利用する。 ### Step 1: dashboard 生成 script を生成 ```ts import { analyzeSpecCoverage, collectRunHistory, detectFlaky, fromVitestJson, renderDashboard, } from '@kiwa-test/observability'; import { readFile, writeFile, mkdir } from 'node:fs/promises'; import { dirname } from 'node:path'; const report = JSON.parse(await readFile('tests/reports/vitest-results.json', 'utf8')); const records = fromVitestJson(report, { runId: process.env.GIT_SHA ?? 'local' }); const history = collectRunHistory({ records, maxPerTest: 20 }); const flaky = detectFlaky({ history, minRuns: 3, threshold: 0.1 }); const specMd = await readFile(SPEC_PATH, 'utf8'); const testCode = await readFile(TEST_PATH, 'utf8'); const gaps = [analyzeSpecCoverage({ specMarkdown: specMd, testCode })]; const dashboard = renderDashboard({ history, flaky, gaps }); await mkdir(dirname(OUT_PATH), { recursive: true }); await writeFile(OUT_PATH, dashboard, 'utf8'); console.log(`dashboard written to ${OUT_PATH}`); ``` ### Step 2: 結果サマリを user に提示 dashboard 内の `Summary` / `Flaky tests` / `Spec coverage gaps` を一覧する。 gap が 0 でなければ「missing TC を test 化」 / 「extra TC を spec に追加」 のアクションを提案する。 ## 完了条件 - vitest 実行が成功 (failure があっても dashboard は生成する) - dashboard markdown が指定 path に Write 済 - gap / flaky が検出された場合は対応提案を user に提示 ## references - `@kiwa-test/observability` API ... `packages/observability/README.md`