世界を動かす技術を、日本語で。

Specsmaxxing – AI精神病を克服する方法と、なぜYAMLで仕様を書くのか

2026年5月3日原文(acai.sh)

概要

  • Acai.sh は、受け入れ基準管理と仕様記述を効率化する オープンソースツールキット
  • feature.yaml による明確な要件管理と、ACIDタグによるコード・テストとの連携
  • CLI・Webダッシュボード、APIなど多様なインターフェースを提供
  • 継続的なレビューとイテレーション を通じて、仕様主導の開発プロセスを推進
  • 仕様記述・QA自動化・テスト最大化 による次世代ソフトウェア開発の展望

Acai.shによる仕様主導開発のすすめ

  • Acai.sh は、受け入れ基準(Acceptance Criteria)を中心に据えた ソフトウェア開発支援ツール
  • 仕様(spec)を feature.yaml 形式で記述し、要件ごとに一意の ACID(Acceptance Criteria ID) を付与
  • ACID をコードやテスト内で参照・トラッキング可能
  • CLIツール (npm配布・GitHubリリースあり)や WebダッシュボードREST API を提供
  • GitHub Actions 等CI/CDと連携し、要件の実装・テスト・レビュー進捗を一元管理
  • 無料ホスティング も提供、ソースコードは Apache 2.0ライセンス で公開

仕様記述の基本

  • feature.yaml は、機能ごとに 要件(requirements) を階層的・番号付きで記述
  • 各要件は 安定したID で他所から参照可能(例:my-feature.ENG.2)
  • 要件は具体的・テスト可能・機能本位 に記述
  • 設計・テストガイド・アーキテクチャ 等、あらゆるドキュメントを.md形式で管理推奨

ACIDタグの活用

  • ACIDタグ により、コードと仕様の対応関係を明示
  • 仕様変更時に 関連コードの追跡・修正 が容易
  • 受け入れ基準のカバレッジ管理 や進捗可視化が可能
  • ダッシュボード で要件ごとにコメント・状態(Todo, Assigned, Completed, Accepted, Rejected)を管理

開発フロー

  • Step 1 - 仕様記述 ・feature.yamlで要件を明文化 ・曖昧なUIや細部は省き、 本質的な機能要件 に集中
  • Step 2 - 実装・テスト ・CLIやエージェントでACIDをコード・テストに組み込み ・CI/CDで自動的に acai push を実行し進捗をダッシュボードへ反映
  • Step 3 - レビュー ・PR単位ではなく、 要件単位でレビュー ・ダッシュボード上で 状態管理・コメント・コラボレーション
  • Step 4 - イテレーション ・仕様やノートを随時更新 ・エージェントが 自己割り当てや自律的な対応 も可能

仕様管理の価値

  • 受け入れ基準の明文化 はプロダクト品質・コラボレーション促進の鍵
  • 仕様は 会話や頭の中 だけでなく、 明示的に記録 することで価値を最大化
  • feature.yaml はそのためのシンプルかつ強力な出発点

QA・テスト自動化と未来展望

  • コード生成速度 が上がるほど、 QA・検証・テスト自動化 の重要性が増大
  • 最終的には LLM(大規模言語モデル) がテスト失敗やアラートに 自律的に反応 する未来を見据えた設計
  • Acai.sh はまず 仕様と実装の対応・可視化 にフォーカス
  • 今後は QAフィードバックやユーザーレビュー 等との連携も想定

まとめ:仕様主導の新しい開発習慣

  • 仕様(Spec) は常にプロダクトの本質
  • 明確な受け入れ基準リスト を維持することが、今後ますます重要
  • Acai.sh は、仕様記述・テスト・レビュー・コラボレーションを一元化し、 次世代の開発現場 を支える
  • 今すぐ仕様を書き始める ことが、すべての開発者にとって最良の第一歩

Hackerたちの意見

作者です。全部読むのが面倒なら、要点をうまくまとめた一節を紹介しますね。

「私の言いたいことは、仕様はどこかに存在しなければならないということです。たとえ書き留めなくても。仕様は、あなたがソフトウェアに求めるものです。それはしばしばあなたの頭の中や会話の中にしか存在しません。あなたやあなたのチーム、ビジネスは常にその仕様が何を言っているかを気にするでしょう。それは決して変わりません。だから、今のうちに書き留めておく方がいいですよ!そして、受け入れ基準のシンプルなリストから始めるのが良いと思います。(それが実際にfeature.yamlの全てです。)」

いいね!あなたの仕様を最大限に活用する姿勢、すごく共感できる。私は明確な要件を扱ってきたけど、会話から引き出したり、別のソフトウェアを内省したりしている。ワンショットでそれを得て、"おじいちゃんがクロードに怒鳴る" みたいな反復作業をしながら、常に最新の状態に保ってる。あなたとは違って、LLMにできるだけ多くの作業をしてほしいと思ってるけど、「可能な限り」というのはその文の中でかなりの作業を意味してる。自分がどこで必要とされているのか、Opusや反復作業が最終的にどうなるのかを明確にするのに苦労してる。要件と制約の違いを明確にすることが本当に挑戦的だった(例えば、「データベーススキーマを再発明することはできない、大きなシステムの一部を構築しているから」)。UIの挙動をいつ、どのように指定するかについてもまだ悩んでる。UIの多くは暗黙的で、動作させるためにたくさん指定しなきゃいけないのはかなり大変に感じる。Flutterや他のUIツールキットのために間違いなく膨大なテストを書いた人には新たな敬意を表します。

これとJiraの違いは何?あなたの仕様はすでにどこかに存在してるよ、それを定義した場所だから。だから、何かが壊れたときに仕様を参照できるように、コードやコミットにJiraチケット番号を入れるのがいいんだよね。

最近、エージェント生成のコードには人間が書いたコードのような「組織的記憶」が欠けているって似たようなことを書いたんだ。決定がなぜなされたのかを聞ける人がいないからね。「スペックマキシング」ってのがこの問題に対する正しいアプローチだと思う。著者の記憶に頼れないなら、意図をどこかにしっかり残さないといけない。AI生成コードの道を進むなら、スペックがデフォルトで真実の源になるよ。

いつもスペックが何を言っているか気にする、それは決して変わらない 何か見逃した?それともみんな1970年代に戻って、ウォーターフォールプロセスで働いてるの?

この仕様の伝統的な名前は「ソースコード」だよ。システムの動作に関する真実の基準で、人間が読めるようにできる限りのものなんだけど、自動化ツールによってコンピュータが実行するためのあまり読めない派生物に処理されるんだ。コンパイルされたアーティファクトをソースコードをチェックせずにコードベースにチェックインするのは、常にリスキーな行動だよね!

自分も似たようなことに行き着いたよ。C++の作業には、2〜3つの仕様書を使ってるんだ。ファームウェアマニュアル(機能やインターフェースを説明)、実装計画(実装の順序、指定されたメカニズム - 新機能はここに入る)、プロダクトマニュアル(ユーザーストーリー、外部効果)。ユーザーストーリーから始めて、実装計画を作り、コードを書いて、ファームウェアマニュアルを書いて、3つのドキュメントとコードの整合性をチェックする。整合した統一された真実を反映するために、コードかドキュメントのどちらかを変更する(実装計画は徐々に実際のものになっていく)。コードには詳しいコメントを付けて、誤解されにくくしてる。「正確で、一貫性があり、整合性があり、コメントがある」このプロセスを機能ごとに繰り返して、時々元のプロダクトマニュアルに戻ってズレを特定する。元のドキュメントがドラフトされたら、エージェントにプレースホルダーファイルを書かせて、必要になるインターフェースを定義させる(後でたくさん追加することになるけど、それは大丈夫)。すべてのファイルは明確な関心の分離を反映し、定義されたインターフェースを通じてのみアクセスできるようにして、他はプライベートにする。手作業よりも多くの個別ファイルができるけど、ファイルの粒度で範囲を制限し、ファイルごとに不変のインターフェースを定義することで、メンテナンスしにくいコードを生むショートカットを避けてる。新しいコンテキストを開くときは、プロジェクトのロゴや理念を簡単に説明するオンボーディングプロセスを設けて、エージェントがプロジェクトの成功に深く投資すべき理由を説明するし、エージェントが特に気をつけているポイントや好みを書いたlearnings.mdも作成する。言うまでもなく、1ミリオンコンテキストを使ってて、トークンが火の海だけど、結果はしっかりしてて、生産性は5〜10倍だよ。

結局、ソースコードが何かに集約されるんだよね。「仕様」と呼ばれる最も一般的な形は、作業チケットの受け入れ基準で、これは加算的な仕様、つまり望ましい変更の説明なんだよね。「既存のものを考慮して、次のように変更してください」って感じ。つまり、製品が始まって以来作成されたすべてのチケットを重ねて要約したら、それが「仕様」になるんだ。でも、それを要約しているのは開発者たちで、各仕様の追加と既存のコードベースの現実を理解しながらやってるんだよね。だから、今の人たちが「仕様」と呼んでいるものと、コードがすでにやっていることとの間のギャップは大きくないし、これからも大きくはならないと思う。ただ、実質的に別の(準)コンパイルステップを追加しているから、今回は非決定的なものになってるんだ。

あなたはソフトウェアアナリストの仕事を再発見したね。90年代初頭までは存在してたんだけど、その後はプロダクトオーナー、プロジェクトマネージャー、開発者/DevOpsのミックスになっちゃった。でも、アナリストは別のスキルセットだってことを無視してると思う。

仕様を書くだけじゃなくて、他の人の仕様を共有したり使ったりもできるよ。それがspeX.buildが作られた理由で、バージョン管理された仕様のハブになって、みんなが自分の実装を好きな言語やスタイル、詳細で作れるようにするためなんだ。

会話を記録するだけでいいんじゃない?必要なことが全部含まれてるし。初期の大まかなスコーピング、xをやろうとしてyをやらなかった失敗、特定のコード行が特定のエッジケースをどう解決するか、などなど。レビューの時間が来たら、コードと会話の両方を見直せばいい。200件の「ユーザーが書いたメッセージで、なぜ、何を?」って?それは良いPRだね。15件の「はい、うん、オッケー、なんでもいいよ」?それはPRにもう少し愛情を注ぎたくなるかも。コミットするとき、記録しないことでやった作業の半分、いや大部分を捨ててる気がする。

すごい!YAMLでプログラミングするの大好き!これをもっと楽しくするためには、Jinjaをちょっと加えたらいいんじゃない?そしたら、ガスで料理できるよ。

Hacker Newsで議論の続きを見る