見出し画像

【通算100|要求AI 17】Spec Kitに“実装”させた——301のテストでバグを見つけ、完走した

前回、Spec Kitに、Kiroと同じ経費申請の設計フェーズ(/speckit-plan)を最後まで走らせた。

今日はその続きだ。同じ仕様から、実装フェーズ(/speckit-tasks → /speckit-implement)を最後まで完走。

確認したいのは「作り切るか」。Kiroの検証を終わらせたのは、コードの品質ではなくクレジット不足だった(通算095)。ローカルで動くSpec Kitは、Kiroのその先を、最後の1タスクまで走り抜けられるのか。

前回の設計に続いて、実装フェーズも最後まで走り切った。この記事は、「どう作り切ったのか」を、生成された成果物で確かめる。

108タスク、301のテスト——完走した

/speckit-tasks は、設計を 108個のタスクに分解した。ユーザーストーリー単位(US1〜US5)でまとまり、[P](並列可)や依存関係まで振られている。そして /speckit-implement が、実行した。

処理時間は 45分42秒。途中で一度PCがハングして再起動したが、Spec Kitはファイルベースで状態を保存しているので、tasks.md の進捗(何番まで完了か)を見て続きから再開した

実装結果は以下のとおり。

  • 108/108 タスク完了(未完 0)

  • TypeScript とテストで、約100ファイル

  • tsc(型検査)/eslint/next build(本番ビルド)、いずれもエラーなし

そして、テストが全部で301本。しかも、ただ書いただけではない。全部を実際に走らせて、完了した。

完了報告のテスト結果。4層のテストが合計301本、すべて通過

ユニット(Vitest) 114 全通過
統合+契約(実PostgreSQL+MinIO) 143 全通過
E2E(Playwright / desktop+Pixel 7) 44全通過
合計 301テスト 全通過

「データベース」で確かめた

私が驚いたのは検証方法だ。統合テストは、PostgreSQLとMinIO(S3互換ストレージ)をDockerで立てて、テスト実行。

要件を、データベース・実際のオブジェクトで確かめられている。
完了報告が以下(メッセージをそのまま添付)。

  • FR-009(監査証跡は追記専用):audit_event への UPDATE / DELETE / TRUNCATE が、アプリのDBロールでは権限で、特権ロールでもトリガで拒否されることを、実DBで確認

  • FR-012(証憑7年保存):Object Lock を GOVERNANCE モード・保持期限「申請日+7年3か月」で実際に設定し、削除が拒否されることを実オブジェクトで確認

  • FR-013(通知):ディスパッチャ停止中でも承認は成立し、送信キュー(outbox)に70件が滞留 → 起動後に70件送信 → メール検証ツール(Mailpit)の受信70件と一致

  • R-008(代理期間の重複禁止):排他制約(EXCLUDE、SQLSTATE 23P01)で実際に拒否

  • 性能:本番ビルドで全エンドポイントが p95、 5〜9ms

テスト中、5つのバグを発見

45分の実装は、トライ&エラー。書いては走らせ、落ちては直す——その繰り返しだった。そして完了報告は、テストが検出した"バグ"を5件、すべて修正済み、どのテストで発生を報告。

テストが検出した実バグ5件。
  1. 経費発生日が1日ずれる — JSTの0時に対応する瞬間を日付列に渡すと、PostgreSQLが前日に切り捨てていた(契約テストが検出)

  2. 営業日計算が1日ずれる — 曜日判定を、JST起点でない瞬間で行っていた(ユニットテストが検出)

  3. 代理承認者が申請詳細を開けない — 権限判定が代理を考慮せず、承認待ち一覧に出ているのに404になっていた(E2Eが検出)

  4. 証憑差し替えが部分ユニークインデックスと衝突 — 新旧の更新順序が逆だった(統合テストが検出)

  5. 契約とレスポンス形状の不一致3箇所 — AuditEvent.id の型、category/receipt の必須項目欠落(契約テストが検出)

この5件は、実装レベルのバグ。日付、権限判定の抜け、インデックスの順序、API。Spec Kitは自分でテストし、自分で直した

自分で動かしてみた——できたアプリの画面

「テスト完了」「動作確認」は、Spec Kitの自己申告。鵜呑みにしたくなかったので、生成されたものを自分の環境で起動して、実際に画面を操作してみた(全301テストも手元で再実行し、同じ結果になることを確認した)。

以下は、その実際の画面だ。経費申請の提出から承認、差し戻し、月次の滞留管理まで、ワークフローがひととおり動いた。
以下に操作した画面のスクリーンショット掲載する。

ログイン画面。申請者・上長・経理と、役割ごとにアカウントを切り替えて操作した


申請フォーム。費目は選択式(自由入力禁止・勘定科目と1対1/FR-003)、証憑画像は必須


提出直後の申請詳細。証憑は「2033/10/29まで削除できません(法令対応)」=7年保存、承認履歴は「追記専用・編集削除不可」(FR-009/FR-012)


申請者から見た申請一覧


上長の承認待ち一覧


上長が承認して完了。5万円未満は上長承認だけで完結する(FR-004)。履歴に提出→承認が時系列で残る


承認/差し戻しの操作画面。7.2万円なので「2段階承認(上長→経理)」。理由コメントを付けて差し戻せる


差し戻された申請の修正・再提出画面


経理の月次サマリ。25日以降の提出は翌月分に分類され(2026-08/FR-010)、滞留を段階・経過営業日で集計する


直属上長が未設定だと提出が拒否される(FR-014)。赤字で理由が表示される

以上が、実際に動かしてみた結果です。

今日のまとめ

  • Spec Kitは実装フェーズ(/speckit-implement)を 108タスク・301テストすべて完走した。

  • 検証はPostgreSQL・実オブジェクトで行われ、監査の追記専用性・証憑の7年保存・通知の再送などの要件が"DB"で確認された

  • 実装の途中でテストが5つのバグ(日付境界・権限漏れ・インデックス順・契約形状)を自分で発見、修正した。

  • 「完走した」が「完成した」わけではない。だが、ローカル・定額のSDDが実装を最後まで作り切り、テストで自分の誤りを正せることは、今回、確かめられた

タグ


#AIエージェント #SpecKit #スペック駆動開発 #要件定義 #要求定義 #ClaudeCode #システム開発 #テスト #SE #生成AI

いいなと思ったら応援しよう!