【Kiro・Playwright】社内でフルAI開発バトル!!「1行も書かずに」Todoアプリを完成させた話〜yamadaの場合〜

こんにちは。エンジニアのyamadaです。

このブログはギークフィードアドベントカレンダー2025の8日目の記事です。

自己紹介

クラウド開発事業部所属のyamadaです。 普段はサーバレスバックエンド開発を担当しています。エンジニア歴は2年で、主にNode.jsやAWSを使った開発をしています。

最近は1歳の子供と過ごす時間にハマっています。毎日できることが増えていく様子を見ていると、“学習曲線の暴力”ってこういうことか…と実感します。
技術も育児も、小さな成功を積み重ねるのが一番楽しいですね。

普段使ってるAIツール

日常的に以下のAIツールを活用しています。

  • ChatGPT: 設計書などのドキュメント作成
    • お気に入りポイント
      • 意図の読み取りが正確で、話の軸がぶれにくい点
        前後の文脈や目的を踏まえて回答してくれるため、こちらの意図から外れた内容になりにくく、作業の手戻りが減ります。

      • 必要な背景や前提を自然に補って文章を整えてくれる点
        こちらが省略した部分を違和感なく補足してくれるため、資料化しやすい形で文章をまとめられます。

      • 最終的な“読み物としての品質”に仕上げる速度が速い点
        叩き台の作成から仕上げまで一気に進められるため、短時間でも外部に出せる水準の文章に整えられます。

企画概要とゴール

今回、「フルAI開発バトル」という企画に参加しました。

ルールはシンプルかつ過酷です。

詳しいルールや目的はアドベントカレンダー1日目の記事で紹介しております。

作業プロセス

要件の理解と整理

まず最初にやったのは、渡された要件を丁寧に読み込むことです。

実務でもそうですが、要件定義書には「書かれていること」と「書かれていないこと」があります。今回の企画では、意図的に曖昧な部分が残されていると気がつき、自分で判断する必要があると思いました。

提示された要件には「軽量」「サクサク」「直感的」といった感覚的な表現が多く含まれていました。
ただ、こういった言葉は方向性としては大事でも、そのままでは実装時の判断基準にならず、曖昧さが残ってしまいます。
そのため、まずはこれらの表現が実際には“何を満たす状態”を指しているのかを整理し、判断できる形にまとめるところから始めました。

最初に決めたのは、このシステム全体が最終的に目指す姿(上位の目的)です。

「社員が今日やるべきタスクを、ロール問わず誰でも使えるインターフェースで、パフォーマンス劣化なく管理できるシステムを提供する」

この大枠を決めたうえで、ここから実際に満たすべきポイントを3つに分けました。

1. 誰でも迷わず使えること

2. タスク数によらないパフォーマンス保証

3. 必要なCRUD処理をすべて行えること

この3つを土台として「何を作るべきか」をはっきりさせ、そのうえで要件定義の作業に進む形をとりました。

運営への質問事項 

特に質問は行いませんでした。特に疑問がなく要件定義を整理できたからです。

Specs定義

要件を整理した上で、スペック駆動開発の第一歩として、Kiroに要件定義を依頼しました。

指示に至るまでの思考プロセス

ここまでで、「このシステムが最終的にどういう状態になっていればOKか」と、そこに至るための3つのポイントまでは自分の中で整理できました。
一方で、この時点ではまだそれが「頭の中の整理」でしかなく、そのままでは要件定義書としては使えません。そこで、ここから先は Kiro に手を動かしてもらい、「人がそのまま実装・テストに使える形」にまで落としてもらうことにしました。

ただ、「要件定義書を作ってください」とだけ投げると、粒度や範囲の解釈が Kiro 側に寄ってしまい、せっかく決めた3つのポイントとズレるリスクがあります。そこで、Kiro にお願いする前に、次のような役割分担をはっきりさせておきました。

  • 自分がやること

    • どこまでをこのアプリの守備範囲とするか

    • 何を優先するか(使いやすさ/パフォーマンス/タスク管理の完結性)

    • 「サクサク」などの感覚的な表現を、ある程度判断できるレベルまで整理しておくこと

  • Kiro にやってほしいこと

    • それらを前提にしたうえで、ユーザーストーリーと受け入れ基準まで具体的に書き起こすこと

    • 抜けがちな部分(テスト観点、デプロイ方法、データ構造など)も含めて、仕様として一通りそろえ切ること

    • あとから自分や他の開発者が読んでも迷わないように、「何をもって完了とするか」が分かるレベルまで文章を整えること

もう一つ意識したのは、「一発で正解を書いてもらう」というより、
① まず Kiro にドラフトを書いてもらう → ② そのドラフトを Kiro 自身にチェックさせる → ③ 最後に自分が見る、という三段階構成にしておくことです。
これを最初に決めておくことで、「どこまでがAIに任せられて、どこから先は自分が見るべきか」という線引きができ、結果的に負担を減らしつつ、必要な精度も確保できるだろうと考えました。

Kiroへの指示

要件定義書、設計書、タスクで次のようなプロンプトをKiroに投げました。

  • requirements.md

 

  • design.md

 

  • tasks.md

Kiroの出力

Kiroがこんな感じにドキュメントを出してくれました。

  • requirements.md

 

  • design.md

 

  • tasks.md

出力の判定と修正

Kiroの出力を確認し、期待通りか、修正が必要かを判断しました。

判定結果

requirements.md

判定結果
  • 修正必要
良かった点
  • タスクの追加・一覧表示・編集・削除・データ保持といった、基本となる機能要件は一通り押さえられていた
  • それぞれの機能について「ユーザーストーリー+受け入れ基準」という形で書かれており、意図は概ね読み取れた
  • 「ブラウザを閉じてもタスクが残っていてほしい」といった、ユーザー視点の要望もきちんと拾えていた
問題点
  • テスト要件(Playwright MCP でどこまで確認するか)やデプロイ要件が定義されておらず、実装後の品質保証やリリースの前提が分からなかった
  • 「視認性が高く読みやすい」「軽量で直感的に使える」といった表現がそのまま残っており、どうなっていれば達成と言えるのかが判断しづらかった
  • Task や保存データの構造(id / title / assignee / dueDate / createdAt など)が明示されておらず、データ設計が仕様として見えない状態だった
  • 「やらないこと」(ログイン機能、サーバーサイド連携など)のスコープが書かれておらず、読み手によって解釈が広がる余地があった
  • バリデーションの細かい条件(どこまでを不正入力とみなすか)や、ユーザーに見せるエラーメッセージが定義されていなかった

 

design.md

判定結果
  • 修正必要
良かった点
  • プレゼンテーション層 / ビジネスロジック層 / データ永続化層 / データモデル層というレイヤー分割自体は初版の時点で明確に分かれていた

  • TaskUI / TaskManager / TaskStorage / Task というクラス分割の方向性は、責務の分離という観点で大きく外れてはいなかった

  • Task の中核フィールド(id / title / assignee / dueDate / createdAt)が初版から揃っており、「タスク 1 件」の単位はブレていなかった

  • タスクの追加・編集・削除・一覧のフロー(UI → TaskManager → TaskStorage → UI 再描画)は、初版のコードでも一通り成立していた

  • 単一 HTML + localStorage + Tailwind(CDN)という「ブラウザローカル完結・軽量シングルページ」の方針は初版から一貫していた

問題点
  • HTML の具体的構造(フォーム・エラー表示・Undo バー・テーブルなど)が書かれておらず、画面要素の ID やレイアウト前提が設計書から読み取れなかった

  • クラス依存関係図や初期化シーケンスがなく、TaskStorage → TaskManager → TaskUI の初期化順・依存関係が仕様として明示されていなかった

  • バリデーション仕様が不十分で、「空欄チェック」以外の要件(YYYY-MM-DD 形式、有効日付、エラーメッセージ)が定義されていなかった

  • XSS 対策・サニタイズ方針が書かれておらず、ユーザー入力の安全な扱いが仕様として欠落していた

  • 元に戻す機能に関する仕様がなく、「データ損失ゼロ」という設計原則との整合が取れていなかった

 

tasks.md

判定結果
  • 修正不要
理由
  • 要件・設計の内容がタスクにきれいにトレースされており、機能的な抜けやダブりが見当たらなかった
  • 実装の依存関係と順序(HTML → モデル → ストレージ → ロジック → UI → エントリーポイント)が自然で、2時間スコープとも矛盾していなかった
  • 各タスクの粒度がほぼ一貫していて「1タスク=1責務」として扱えるため、このまま実装のチェックリストとして十分実用になると判断した

Kiroとの対話

判定した結果修正が必要と判断したドキュメントについては、以下のプロンプトを使いドキュメントを修正しました。

このプロンプトにした理由は次のとおりです。

  • 一つの視点に依存しないため
    要件・設計のレビューは立場によって気づく点が異なるため、複数ロール(BA / アーキテクト / QA / UX / 開発者)を並べて俯瞰させることで、仕様の抜けを網羅的に拾えるようにした。

  • Kiro のレビュー粒度のブレを防ぐため
    「レビューしてください」だけでは深すぎたり浅すぎたり観点が偏りやすいので、ロールをざっくり指定することで、広さと適度な粒度を両立させた。

  • 自分側の確認コストを最小化するため
    短時間でレビューするために「指摘リスト」と「修正版」の2つを見るだけでよい構造として、レビュー負荷を最小にした。

テスト実装

今回の企画では「AI が生成した要件定義・設計に従って本当に動くか」を検証するため、Playwright MCP を使って CRUD + Undo 機能周りの E2E テストを実行しました。実際に行ったテストは次のとおりです。

  • タスク追加のテスト
    タイトル・担当者・期限を入力して追加ボタンを押すと、一覧の先頭にタスクが表示されることを確認。

  • タスク編集のテスト
    編集ボタンを押して内容を書き換え、保存すると、変更後の内容が一覧に正しく反映されることを確認。

  • タスク削除のテスト
    削除ボタンを押したとき、タスクが即座に一覧から消えることを確認。

  • データ永続性のテスト
    タスクを追加 → ページをリロードしても、localStorage から元のタスクが復元されることを確認。

  • 入力検証のテスト
    タイトル・担当者・期限のいずれかが空の状態で追加を試みると、エラーメッセージが表示されることを確認。

  • 元に戻す(Undo)機能のテスト
    タスク削除後に「元に戻す」を押すと、タスクが削除前の位置に戻ることを確認。

  • 元に戻すタイムアウトのテスト
    タスク削除後、10 秒間何も操作しない場合、自動的に Undo 通知が消えることを確認。

成果物

できあがった成果物がこちらです!

タスク入力

入力されたタスクの追加

タスク編集画面

タスク追加画面

タスク削除画面

バリデーション画面

所要時間

2時間50分

主な機能

盛り込んだ機能はこちらです。

今回のミニアプリは「シンプルだけど毎日の業務でちゃんと使える」ことを意識して実装しました。実際に備えている主な機能は次のとおりです。

1. タスク追加

  • タイトル・担当者・期限を入力して新しいタスクを追加

  • 入力後は自動でフィールドをクリア

  • 未入力の場合はエラーメッセージを表示して追加をブロック

  • 追加されたタスクは常に一覧の先頭に表示

2. タスク一覧

  • すべてのタスクをテーブル形式で表示

  • タイトル/担当者/期限をそれぞれの列で確認可能

  • 作成日時に応じて自動で「新しい順」に並び替え

  • タスクが1件もない場合は「タスクがありません」と表示

3. タスク編集

  • 編集ボタンでその場で編集できるインライン編集方式

  • 保存で内容を更新、キャンセルで編集前の状態に戻せる

  • 編集時にもバリデーションを実行して不正入力を防止

4. タスク削除

  • 削除ボタンで即時削除(確認ダイアログは無し)

  • 後述の Undo 機能と組み合わせてシンプルな操作感を実現

5. 削除の取り消し(Undo)

  • タスク削除後に「元に戻す」通知を表示

  • 10 秒以内なら元の位置に完全復元可能

  • 「×」ボタンで通知を手動で閉じることもできる

  • 10 秒経過すると Undo は自動的に無効

  • 最新の削除 1 件のみ復元できる仕様

6. データ永続化

  • localStorage に自動保存

  • ブラウザを閉じてもタスクが残る

  • 再読み込み時には JSON から復元して一覧を再構築

7. UI/UX

  • 日本語ラベル(追加・編集・削除・保存・キャンセル・元に戻す)を完備

  • 項目名も「タイトル」「担当者」「期限」で統一

  • エラーは画面上部にわかりやすく表示

  • Tailwind CSS を使って軽量なデザインと十分な視認性を両立

8. 単一ページ構成

  • すべての機能を 1 つの HTML だけで完結

  • ページ遷移・リロードなしでスムーズに操作可能

  • JavaScript で UI を動的更新して「サクサク感」を実現

工夫点など

今回のアプリは、操作した瞬間に画面がスッと切り替わる“サクサク感”を強く意識しています。

これをこのように実現しました!

  • 同期的なデータ操作
     非同期処理による待ち時間をなくし、データの読み書きをその場で完了させることで、操作と結果のズレを感じさせません。

  • メモリファーストの更新戦略
     画面に表示するデータはまずメモリ上で更新し、永続化は後回しにすることで、ユーザーが結果を即座に確認できる状態を確保しています。

  • 即時の画面反映
     データが変わったら迷わず画面にも直ちに反映させ、押した瞬間に変化が見える UI 体験を実現しています。

また、誤操作を防ぎながらテンポを落とさない UI 設計を心がけました。
誤ってタスクを削除してしまうと影響が大きいですが、いちいち「削除しますか?」の確認ログがでるとユーザー体験が悪化してしまいます。そこで今回は、

  • 削除はワンクリックで即時反映

  • 必要なら 10 秒以内に戻せる削除通知

という構成にしました。

発見と学び

今回の企画を通して、「AI にどう指示するか」が、想像以上に結果に影響することを実感しました。
ざっくり要望を投げるよりも、

  • 何を作りたいのか

  • どこまでを AI に任せたいのか

  • どの粒度のアウトプットがほしいのか

を先に言葉にしてから投げるだけで、要件定義書や設計書の質がかなり変わりました。

感想

良かった点

  • 要件定義書・設計書・実装タスクという一連の流れを、短時間でもきちんと踏めて有意義な時間でした。

  • 「AI に書かせて、自分がレビューする」という役割分担のイメージがかなりクリアになりました。

  • Playwright で E2E テストを書くところまでを一気通貫で試せました。

苦労した点

  • 最初のプロンプトがふわっとしていると、要件定義や設計がそれなりに曖昧なまま出てきてしまい、何度か書き直しが必要になりました。

  • 「軽い」「サクサク」といった言葉を、どこまで数値や条件に落とし込むかの線引きに悩みました。

  • どこまで仕様を詰めて、どこからは割り切るかの判断が地味に難しかったです。

今後に活かせること

  • 実務でも、要件や設計のドラフトを AI に書かせるときは、「ロール(誰目線か)」と「ゴール(どこまで書いてほしいか)」を最初に明示するといいかなと思いました。
  • 小さな機能追加でも、「やること」「やらないこと」「どうなっていれば完了か」を短く書き出してから AI に渡す習慣をつけるようにしようと思いました。

 

この記事が、少しでもみなさんのにお役に立てば幸いです。

ここまでお読みいただき、ありがとうございました!

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ