0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実践2】「振込先を印字したい」を実装できる Spec にする — AI に決めさせてはいけないこと

0
Last updated at Posted at 2026-09-26

本記事はシリーズ「J-SIX:Japanese SI Transformation」の実践編(全6回)の第2回です。第1回:Plugin を入れて、最初のプロジェクトを立ち上げるの続きです。

今回やること

前回、Plugin を入れて品質ゲートの設定を置きました。今回から実際の開発に入ります。

要件はこの一言です。

請求書に振込先口座を印字したい。

これだけです。実務でも、要望はこのくらいの粒度で降ってきます。この一言を、AI が実装できて、後から検証できる Spec にするまでが今回の範囲です。

結論を先に書きます。この工程で人間がやるべき仕事は、文章を書くことではありません。決めるべきことを決めることです。 AI に丸投げすると、業務上の判断が勝手に確定します。しかも、それらしく実装されるので気づきにくい。

1. AI は「それらしく」実装できてしまう

「請求書に振込先口座を印字したい」と CC に伝えれば、おそらく動くものは出てきます。しかしその過程で、少なくとも次の5つが暗黙に決まります。

  • 口座は自社に1つなのか、取引先ごとに違うのか
  • 口座が登録されていない取引先があったら、締め処理はどうなるのか
  • 締めた後に口座情報を変更したら、発行済みの請求書の記載は変わるのか
  • 確定した請求の口座は変更できるのか
  • 会計連携ファイルにも口座を出すのか

どれも業務の判断です。技術的にはどちらでも実装できます。だからこそ AI は迷わず、訓練データで最も一般的なパターンを選びます。それがこの案件で正しいとは限りません。

2. Skill を起動する

J-SIX では、Spec の作成に spec-create Skill を使います。

spec-create の起動と、AI からの質問

この Skill は、テンプレート(要求 Spec の雛形)と既存の Spec を読んでから、決まっていないことを質問します。いきなり書き始めません。

注目してほしいのは最後の一文です。

3 については、既存の設計で交付先名称を「締め時点のスナップショット」として保存しています(帳票編集定義)。同じ扱いに揃えるのが自然に見えます。

既存の設計書(帳票編集定義)を読んだうえで、既存の方針との整合を提案しています。これは、設計書が実装から逆生成されていて、かつ最新であることの効用です。設計書が古いと、この提案は成立しません。

3. 人間が決める

5つの論点に答えます。今回の判断は次の通りです。

# 論点 決定 理由
1 誰の口座か 取引先ごとに指定 入金元を取引先ごとに分けている運用があるため
2 未登録のとき 印字を省いて警告 既存の売上取込が「1行の不備で全体を止めない」方針。締めも揃える
3 締め時点で固定するか スナップショット 交付先名称と同じ扱い。発行済み請求書の記載が後から変わらないように
4 確定後の変更 不可 既存の REQ-007(確定済みの請求は変更不可)と整合
5 会計連携 含めない 現行の列構成を維持する。仕訳に口座は不要

5つのうち4つは「既存の方針に揃える」という判断です。 新しいことを決めたのは1番だけでした。

これは偶然ではありません。既存の Spec・ADR・設計書が揃っていれば、新しい要件の判断の多くは「既存とどう揃えるか」に還元されます。逆に、既存の方針が文書化されていないプロジェクトでは、毎回ゼロから考えることになり、しかも人によって答えが変わります。

2番は特に議論が必要な論点でした。 「口座が未登録なら締めを止める」ほうが安全に見えます。しかし、月末の締め処理が1社の設定漏れで止まると、経理の業務全体が止まります。今回は「止めない。ただし気づけるようにする」を選びました。この判断が後で監査記録の設計に効いてきます。

4. 決めたことを REQ として書く

判断が決まったら、業務ルール(REQ)として Spec に書きます。

REQ と PROP の追記

実際に追記された3行がこれです。

| REQ-011 | 振込先口座は取引先ごとに登録する | 金融機関名・支店名・預金種別・口座番号・口座名義を持つ。請求書に印字する |
| REQ-012 | 振込先は締め時点の内容を請求に保存する | 交付先名称と同じ扱い。締め後にマスタを変更しても、作成済みの請求の記載は変わらない |
| REQ-013 | 振込先が未登録でも締めは止めない | 請求は作成し、請求書には「振込先未登録」と表示する。その締めは監査記録に警告として残す |

1つの要望が3つの REQ になりました。 「印字する」という機能の話は REQ-011 だけで、残りの2つは「いつの情報を使うか」「異常時にどうするか」です。実務でバグや仕様のもめごとになるのは、たいてい後者のほうです。

要件に ID を振るのは、単なる整理のためではありません。この ID が、後の工程で機械的な検証の鍵になります。 品質ゲートは「REQ-011 に対応するテストが存在するか」を正規表現で走査して判定します。ID が無ければ、この検証は成立しません。

5. 受入条件から「性質」を導く

J-SIX には、REQ とは別に PROP(Property) という概念があります。

REQ は個別の例で書かれます。「10万円の申請は2段承認になる」のような書き方です。例だけを検証面にすると、その例だけを通す実装が成立してしまいます。そこで、入力空間全体で成り立つべき性質を取り出します。

今回追加した性質は2つです。

| PROP-007 | REQ-012 | 任意の請求について、保存された振込先は締め時点の取引先の振込先と
|          |         | 一致し、その後のマスタ変更では変化しない |
| PROP-008 | REQ-013 | 任意の取引先集合について、振込先の登録有無は作成される請求の件数と
|          |         | 金額に影響しない |

書式は「任意の〈前提〉について〈性質〉が成り立つ」で統一します。

この2つは、第4回で性質テスト(Property-Based Testing)に変換されます。「A 社の口座を変えたら B 社の請求書が変わってしまった」のような事故は、例ベースのテストでは見落とされがちですが、性質として書けば入力空間を自動で探索してくれます。

PROP-008 の「件数と金額に影響しない」は、一見すると当たり前に思えます。しかし「未登録のときに締めを止める」実装をしてしまうと、この性質は破れます。性質は、間違った実装を排除する形で書くのがコツです。

6. hold-out 受入テストの対象を決める

要求 Spec には、もう1つ書く欄があります。hold-out 受入テストの対象です。

| 5 | UC-002, UC-004 | 振込先が請求書に印字され、締め後のマスタ変更で記載が変わらないこと。
|   |                | 未登録の取引先があっても締めが成功すること |

hold-out 受入テストは、実装担当と分けて作り、その担当へ共有しないテストです。別の担当(J-SIX では別のサブエージェント)が、Spec の受入条件だけを見て書きます。現行の Plugin Hook は対象ツールの直接操作を拒否しますが、全経路からの不可視性は保証しません。

なぜそんな面倒なことをするのか。実装する側がテストを見られると、「そのテストを通すための実装」に寄ってしまうからです。人間でも起きますが、AI ではもっと顕著に起きます。詳しくは4層品質ゲートの記事に書きました。

ここでは「何を検証してほしいか」を Spec の側に書いておくだけです。テストそのものは第4回で作ります。

7. 非機能要件は6大項目で書く

機能の話に集中していると抜けるのが非機能要件です。J-SIX では、IPA の非機能要求グレードの6大項目で分類します。今回のサンプルでは、こう書いています(抜粋)。

大項目 要件 レベル/目標値 根拠
可用性 運用スケジュール 平日業務時間帯。締め処理は月1回 経理の月次業務
運用・保守性 処理の追跡 全締め処理・確定操作を監査ログに記録 内部統制
移行性 過去の請求データ 移行しない。現行は Excel の手作業で移行元システムが無いため 現行業務
システム環境・エコロジー — 対象外(本番化の際に設置環境と合わせて合意する) —

ポイントは3つです。

  • 合意した重要項目だけを書く。 グレードには238のメトリクスがありますが、全部を埋める必要はありません
  • 対象外の大項目も、行を消さずに「対象外(理由)」と書く。 消すと、検討したのか忘れたのかが分からなくなります
  • テストのカバレッジや mutation score は、ここには書きません。 非機能要求グレードはシステム基盤の要求を扱うもので、テストの品質は対象外です。品質ゲートの閾値は別表に書きます

今回の要件は、この表を変えませんでした。しかし確認はしました。「振込先を印字する」機能は、可用性にも性能にも影響しないと判断できたからです。

8. どこまで合意できたかを測る

最後に、Spec の承認欄を見ます。J-SIX では、IPA の合意成熟度の3段階をゲートの到達基準にしています。

レベル 定義
仕掛レベル 発注者が「言い切った」、開発者が「聞き切った」
充実レベル 図表に書いてレビューを繰り返し、合意内容が充実した
完成レベル 合意内容が管理され、発注者・開発者の双方が確認できた

Phase 1 のゲートを通すには、要求 Spec(ユースケース・業務ルール・受入条件・非機能要件)が完成レベルに達している必要があります。

重要なのは、仕掛レベルのまま残っている項目があってもよいことです。ただし条件があります。「未確定」と明記し、いつ・誰が確定させるかを決めることです。これを決めずに先へ進むと、実装の途中で判断を求められ、そこで誰かが勝手に決めることになります。

ここまでのまとめ

「請求書に振込先口座を印字したい」という一言は、最終的にこうなりました。

成果物 追加したもの
業務ルール REQ-011・REQ-012・REQ-013
性質 PROP-007・PROP-008
hold-out 受入テストの対象 1行(UC-002 / UC-004)
非機能要件 変更なし(影響しないことを確認)

この工程で人間がやったことは、5つの質問に答えることだけです。文章は AI が書きました。しかし、その5つの答えがこの案件の仕様そのものです。

そして、5つのうち4つは「既存の方針に揃える」で決まりました。設計書が最新であることは、新しい要件を決めるコストを下げます。 これは、設計書を実装から逆生成する仕組みの、あまり語られない効用だと思います。

次回は、決めた判断を ADR(設計判断の記録) に残し、実装可能なタスクに分解します。J-SIX では、タスクに「変更してよいファイルの範囲」を書いて、人間が先に承認します。なぜそんなことをするのかも含めて説明します。


本連載で使っているサンプル・テンプレート・Plugin は GitHub で公開しています。

今回の要求 Spec の実物:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?