業務委託契約書に埋め込んだ 8 個の間違いを chaff が見つける — 契約書レビューの機械化デモ

業務委託契約書に埋め込んだ 8 個の間違いを chaff が見つける — 契約書レビューの機械化デモ

契約書のレビューは、人間が目で追うと見落としが起きる仕事です。「第 8 条に定める」と書いたのに第 8 条が無い、条番号が 7 の次が 9 に飛んでいる、1 年契約なのに期間末日が 4 月 30 日になっている — こうした機械で確定できる誤りは、本来は人の時間を使うべきではありません。

chaffjs は、legal/contract ジャンルで契約書を番地つきの木として読み、構造の矛盾を自動で指摘します。本記事では、A4 1 枚の業務委託契約書に 8 個の間違いを意図的に埋め込んだサンプルを作り、chaff が何を拾うかを実演します。

サンプル — 間違いを埋め込んだ業務委託契約書

以下が検査対象です。意図的に埋めた間違いは次の 8 種類です。

  1. 第 2 条で「次の 3 項目」と書いて実際は 4 項目
  2. 第 3 条で「2026 年 4 月 1 日から 1 年間、2027 年 4 月 30 日に満了」(1 年なら 3/31 のはず)
  3. 第 4 条で月額 50 万円で「年間合計 700 万円」(50 万 × 12 = 600 万のはず)
  4. 第 6 条で「詳細は第 8 条に定める」 (第 8 条は無い)
  5. 条番号が第 7 → 第 9 と飛んでいる (第 8 条が抜けている)
  6. 第 9 条「すべての未払い金は、解除日から 30 日以内に支払う。ただし、支払いが困難な場合は、別途協議する」 (絶対規則への例外)
  7. 必須条項の欠落: 再委託、契約不適合責任(瑕疵担保)、報告義務
  8. 「〜ものとする」の冗長表現

契約書本文:

業務委託契約書

株式会社Aと株式会社Bは、2026年4月1日、次のとおり業務委託契約を締結する。

第一条(目的)
 甲は乙に対し、第二条に定める業務を委託し、乙はこれを受託する。

第二条(業務内容)
 本件業務の内容は、次の3項目のとおり。
 一 Webサイトの設計・開発
 二 運用保守サービス
 三 月次レポートの作成
 四 セキュリティ監査

第三条(契約期間)
 本契約の有効期間は、2026年4月1日から1年間とし、2027年4月30日に満了する。

第四条(委託料)
 甲は乙に対し、本件業務の対価として、月額500,000円を支払う。年間の委託料は合計7,000,000円とする。

第五条(支払条件)
 甲は、乙の請求に基づき、翌月末日までに乙の指定する銀行口座へ振込により支払う。

第六条(成果物の権利)
 本件業務の成果物に係る著作権は、委託料の支払完了時に乙から甲に譲渡する。詳細は第八条に定める。

第七条(秘密保持)
 甲および乙は、相手方から開示された秘密情報を、第三者に開示または漏洩しない。

第九条(契約解除)
 甲または乙は、相手方が本契約に違反した場合、書面による催告の後、本契約を解除することができる。すべての未払い金は、解除日から30日以内に支払うものとする。ただし、支払いが困難な場合は、別途協議するものとする。

第十条(損害賠償)
 甲または乙は、本契約の違反により相手方に損害を与えた場合、損害を賠償する。

第十一条(準拠法・合意管轄)
 本契約は日本法に準拠する。本契約に関する紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とする。

設定

chaff.yaml を 1 枚置くだけです。

genre: legal/contract
plugins:
  - chaff-plugin-legal-contract
style: legal-contract/outsourcing

契約書種別ごとに style を切り替える前提の設計で、ここでは業務委託向けの legal-contract/outsourcing を指定しています。chaff-plugin-legal-contract は NDA / 業務委託 / 利用規約 / プライバシーポリシーの 4 種類に対応した自作プラグインです。

chaff にかける

npx chaffjs contract.txt

出力(compact 版):

1:1     error   この業務委託契約書には「再委託の可否」に関する条項が見当たりません。
                legal-contract/required-clauses-outsourcing
1:1     error   この業務委託契約書には「契約不適合責任(瑕疵担保)」に関する条項が見当たりません。
                legal-contract/required-clauses-outsourcing
1:1     error   この業務委託契約書には「報告義務」に関する条項が見当たりません。
                legal-contract/required-clauses-outsourcing
16:29   warning 2026年4月1日から1年間なら、終わりは2027-03-31ごろのはずですが、
                2027年4月30日と書かれています
                duration-mismatch
25:41   error   「第八条」(番地 8)はこの文書にありません
                dangling-reference
30:1    error   「第七条」の次が「第九条」です(8 番目のはず)
                numbering-gap
31:83   info    「支払い」と書いています(この文書はふつう「支払」と書く語です。3 箇所のうち 1 箇所が違う)
                orthographic-variant
31:94   info    「別途協議するものとする」は「別途協議する」で足りる可能性があります。
                意図して「ものとする」の含みを持たせているなら残してください。
                legal-contract/mono-to-suru-filler

指摘 8 件、動いていない rule 108 件

何が拾えたか

埋めたミス 検出 ルール 重大度
第 8 条への参照(存在しない) ◯ dangling-reference error
第 7 → 第 9 の番号抜け ◯ numbering-gap error
1 年間 vs 4 月 30 日の矛盾 ◯ duration-mismatch warning
必須条項欠落(再委託・瑕疵担保・報告) ◯ legal-contract/required-clauses-outsourcing error
「ものとする」の冗長 ◯ legal-contract/mono-to-suru-filler info
「支払 / 支払い」表記ゆれ ◯ orthographic-variant info
「3 項目」vs 4 項目のミスマッチ △ 漢数字では未検出 —
50 万 × 12 ≠ 700 万(金額の計算ミス) ✗ 現状の chaff には算術検証ルール無し —
すべて…ただし(絶対規則への例外) ✗ absolute-exception は fire せず —

8 項目中 6 項目を自動検出しました。

仕組み — chaff は契約書を木として読む

chaff は legal/contract ジャンルで、契約書を番地つきの木(第 1 条 → 第 1 条第 2 項 → 第 1 条第 2 項第 3 号)として解釈します。chaff tree で確認できます:

(doc :language "ja" :path "contract.txt" :line 1
  (date :value "2026-04-01" :line 3)
  (article "1" :heading "目的" :label "第一条" :line 5
    (reference :label "第二条" :target "2" :unitWord "条" :line 6))
  (article "2" :heading "業務内容" :label "第二条" :line 8
    (item "2.1.1" :label "一" :line 10)
    ...)
  (article "3" :heading "契約期間" :label "第三条" :line 15
    (date :value "2026-04-01" :line 16)
    (quantity :unit "年間" :value 1 :line 16)
    (date :value "2027-04-30" :line 16))
  ...
  (article "6" :heading "成果物の権利" :label "第六条" :line 24
    (reference :label "第八条" :target "8" :unitWord "条" :line 25))
  (article "7" :heading "秘密保持" :label "第七条" :line 27)
  (article "9" :heading "契約解除" :label "第九条" :line 30
    ...))

ここから:

抽象的なルール(「契約書は番地で書く」)を木に落とし込んだことで、人間の目視チェックに匹敵する粒度の指摘が機械で返ります。

Claude Code 向けの skill が同梱されている

chaff には、Claude Code 向けの Agent Skills が最初から入っています。1 コマンドで入ります。

npx chaffjs skill             # .claude/skills/chaff/ に入れる(プロジェクト固有)
npx chaffjs skill --global    # ~/.claude/skills/chaff/ に入れる(全プロジェクト共通)

skill に書かれている主な内容:

本記事の契約書サンプル検査も、この skill が示している「ジャンル選択 → 検査 → 3 つの応じ方」のフレームに沿って進めています。

対応する側

chaff は検出するだけで、書き換えません(こちらの記事 で詳説)。契約書も同じで、指摘を見ながら書き直すのは人間か LLM の仕事です。ただし chaff の出力は「どう直すか」まで含んでいるので、たとえば dangling-reference を直すには「第八条の文を書くか、第六条の参照を削除する」の 2 択に絞られます。

実務の流れは次のループになります。

  1. 契約書案を書く
  2. npx chaffjs contract.txt で機械チェックをかける
  3. error が出た箇所を人間が判断する(LLM に書き直させる場合も、chaff の指摘をプロンプトに渡す)
  4. 再度 chaff にかける
  5. 相手方へ送付する

契約書 1 枚あたりの機械チェックは数秒で終わるので、PR の CI に組み込んでも苦になりません。

chaff の限界

今回のサンプルで chaff が拾えなかったのは:

いずれも、人間の目で読めば分かる種類の誤りです。chaff は構造と番号の整合、既知のパターンの欠落検出に特化しており、意味の整合は人間 or LLM に任せる、という棲み分けになります。

まとめ

契約書のドラフトを書く AI の精度は上がっていますが、「意図せぬ番号ズレ・無い条への参照・計算ミス」は AI が気づきにくい領域です。ここに chaff を差し込むことで、法務担当者のレビュー時間を本質的な論点に集中させられます。

参考


Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。

この記事をシェア

関連記事

記事一覧に戻る