Next.js  ·  Rust  ·  Supabase

レガシー業務システムを、
AI と一緒に作り直しています。

テストがなく、認可が独自で、手順を再現できないシステムを、検証できる最小単位で置き換えていく取り組みです。設計を先に固め、判断を記録し、検証してから進める。その過程を、判断の記録ごと公開しています。

  • 合成データのみ
  • ADR 20件以上
  • 動かせる設計図 5枚
  • CC BY 4.0

通信は4つの境界を越え、1つのデータストアへ収束します。

  1. Browser
  2. Next.js
  3. Rust API
  4. PostgreSQL
Scroll

Why it is hard

簡単な題材ではありません。
そこが面白いところです。

対象はメンバー管理を中心に、経歴・スキル、現場・案件、面談、人事考課、権限管理まで広がる基幹寄りの業務システムです。一括で書き直すのではなく、機能単位の縦切りで移行しています。理由は、この3つが同時に効いてくるからです。

01

認可モデルの移行

「管理者/一般」のような単純なロールではなく、グループとユーザー単位の例外を組み合わせた、機能・操作単位のモデルです。安易にロールへ縮約すると権限漏れが起きます。認可モデルを、データベースの制約とクエリレベルの絞り込みにまで反映して再現します。

02

データ移行の検証

旧システムには自動テストがほとんどありません。行数・チェックサム・キー関係の突合など、値そのものを見ずに移行の正しさを示す方法を設計する必要があります。

03

保証基準がないテスト設計

「今まで動いていたから正しい」という前提が使えません。機能ごとに期待される挙動を明文化してからテストを書きます。何を正とするかを決めるところが仕事です。

How we work

人の役割が「書くこと」から
「検証すること」へ移ります。

実装は AI コーディングエージェントが行い、人が差分を検証します。それを成立させているのは、設計を先に固め、レビューを通してから実装するという順序です。この5つは、その順序をエージェントが実装する環境で保つための具体策です。

01

AI-first 開発

共通指示を1か所へ集約し、繰り返す手順を skill へ切り出す。実装者が変わっても手順が変わらない。

02

ADR 駆動

元に戻しにくい判断は必ず記録する。設計書レビューの後継にあたる仕組み。

03

契約優先

OpenAPI を HTTP API 契約の正とし、型を自動生成し、CI で乖離を検出する。

04

要求トレーサビリティ

受け入れ条件に機械可読なIDを割り当て、マーカーで実装とテストに結び付け、食い違いを終了コードで検出する。

05

検証文化

生成されただけでは完了ではない。確認できなかったことも書き残す。

ズレを検出したら、エージェントは整合を取らずに停止して人へ報告します。検出スクリプトに --fix にあたる機能はありません。

生成 AI が仕様とコードの両方を書く体制では、「仕様のほうを書き換えて辻褄を合わせる」が最も起こりやすい失敗モードだからです。整合させる判断は人に残します。

開発の進め方を読む →

Proof

壊してみてください。

1つの要求IDは、5箇所に現れていなければなりません。仕様、台帳、コミット、実装、テスト。どれか1つだけを動かすと検出され、そこで止まります。実際の要求で試せます。

  1. 01仕様 - [x] `REQ-MEMBER-INTRO-001` 一覧responseは許可されたsummaryだけを含み、自己紹介全文を含まない requirements-md.md の実例(逐語)
  2. 02台帳 status: implemented kind: requirement registry.yaml は非公開。規則が読む2項目のみ
  3. 03コミット Requirement: REQ-MEMBER-INTRO-001 trailer(任意)
  4. 04実装 // @req REQ-MEMBER-INTRO-001 implemented なら必須
  5. 05テスト // @req REQ-MEMBER-INTRO-001 implemented なら必須

req:checkpassexit 05箇所すべてでIDが一致している。

壊す

2つめの操作が、この仕組みの核心です。「仕様のほうを書き換えて辻褄を合わせる」「状態を下げて警告が出ないようにする」は、生成AIが仕様とコードの両方を書く体制で最も起こりやすい失敗です。その回避行動自体を D-REGRESS で検出します。

そして、検出したらエージェントは整合を取らずに停止し、人へ報告します。検出スクリプトに --fix にあたる機能はありません。

この仕組みが検出できないこと

限界は規約本文に書いてあります。以下はすべてその引用です。

  • 仕様とコードを同一 Pull Request で同時に書き換えれば通過します。検出できるのは共変更規約の違反であって、意味の一致ではありません。
  • D-CODE は意味を変えないリファクタでも発火します。機械的に除外する信頼できる方法が無いため、恒久的に warning に留め、ブロックへ昇格させません。
  • 参照先 ADR の実在は確認しますが、ADR 本文が要求を実際に満たしているかは機械検証しません。その判断は人のレビューに残ります。

規約の全文を読む →

Diagrams

設計判断を反映した、動かせる図。

ADR から機械的に生成した図です。生成のたびに同じ結果になることと、配置や線の重なりを自動で検証しています。ブラウザの中でそのまま動きます — 図と ADR が食い違う場合は、ADR が正です。

  • テーマ切替
  • 検索
  • 関係のたどり
  • 拡大縮小
  • 画像の書き出し
この図は ADR から機械的に生成しています。生成のたびに同じ結果になることと、配置や線の重なりを自動で検証しています。図の中でテーマ切替・検索・関係のたどり・拡大縮小・画像の書き出しが動きます。 全画面で開く →

Built this way

このページ自体が、その過程です。

ここまでのヒーロー、さきほど壊していただいたデモ、上の図の埋め込み。いずれも AI エージェントが実装し、人が差分を検証し、公開の Pull Request を経てマージされました。差分も検証結果もそのまま読めます。

先に、検証できなかったことを書きます。ヒーローの 3D について、GPU のフレーム時間は信頼できる値を測れませんでした。検証に使ったブラウザでは gl.finish() を挟んでも実際の GPU 時間を反映しなかったためです。この事実は PR 本文にそのまま書かれています。

「確認できなかったことも書く」はこのプロジェクトの完了条件のひとつです。ここで伏せると、その主張自体が嘘になります。

PR作ったもの差分検証
#42 このページと 3D ヒーロー +4,036 / −260 劣化経路4条件を実機確認。GPU のフレーム時間は測れず、その旨を明記
#43 上のトレーサビリティのデモ +461 検証項目 9 件。引用が原本と逐語一致することを機械的に検査
#44 上の設計図の埋め込み +117 検証項目 7 件。埋め込む幅の閾値は実測で決定

規模は誇張しません。これは公開サイトであって、作り直している業務システムそのものではありません。示せるのは、同じ進め方が実際に回り、検証の記録が公開されているという事実だけです。開発そのものは別のリポジトリで行っています。

マージ済みの Pull Request を見る →

What you touch

参加して何に触れられるか

到達点は人によって違って構いません。環境構築まででも、その日の学びとしては十分です。

  • Rust — 業務ロジック・認可・トランザクション
  • TypeScript / Next.js — サーバーサイド統合を含む UI
  • PostgreSQL — スキーマ、Row Level Security、権限モデル
  • OpenAPI — 契約優先の型生成と drift 検査
  • 要求トレーサビリティ
  • データ移行・検証設計
  • CI/CD・デプロイ構成
  • AI エージェント運用

アーキテクチャを読む →

Join

社内メンバー、有志、自己学習目的。
いずれも歓迎します。

参加は Discussions の Apply カテゴリへの投稿から始まります。アクセスは段階的にお渡しします。

  1. 申込Discussions の Apply カテゴリへ、動機・使える時間・関心領域を書いて投稿します。
  2. ワークショップ参加該当する場合。当日限定の一時アクセスをお渡しします。
  3. 実績の確認Issue への着手・PR 提出、または Discussions でのやり取り。
  4. 招待開発リポジトリの collaborator 権限をご案内します。

開発で使うのは合成データだけです。メンバー名や写真も、この用途のために作った架空のデータです。実在する人物の情報をローカル環境やCIへ持ち込まないことを、プロジェクトの譲れない原則としています。

AI コーディングエージェントのアカウントが必要です(Claude Code か Codex のどちらか一方)。費用は自己負担になります。