契約書のレビューは、人間が目で追うと見落としが起きる仕事です。「第 8 条に定める」と書いたのに第 8 条が無い、条番号が 7 の次が 9 に飛んでいる、1 年契約なのに期間末日が 4 月 30 日になっている — こうした機械で確定できる誤りは、本来は人の時間を使うべきではありません。
chaffjs は、legal/contract ジャンルで契約書を番地つきの木として読み、構造の矛盾を自動で指摘します。本記事では、A4 1 枚の業務委託契約書に 8 個の間違いを意図的に埋め込んだサンプルを作り、chaff が何を拾うかを実演します。
サンプル — 間違いを埋め込んだ業務委託契約書
以下が検査対象です。意図的に埋めた間違いは次の 8 種類です。
- 第 2 条で「次の 3 項目」と書いて実際は 4 項目
- 第 3 条で「2026 年 4 月 1 日から 1 年間、2027 年 4 月 30 日に満了」(1 年なら 3/31 のはず)
- 第 4 条で月額 50 万円で「年間合計 700 万円」(50 万 × 12 = 600 万のはず)
- 第 6 条で「詳細は第 8 条に定める」 (第 8 条は無い)
- 条番号が第 7 → 第 9 と飛んでいる (第 8 条が抜けている)
- 第 9 条「すべての未払い金は、解除日から 30 日以内に支払う。ただし、支払いが困難な場合は、別途協議する」 (絶対規則への例外)
- 必須条項の欠落: 再委託、契約不適合責任(瑕疵担保)、報告義務
- 「〜ものとする」の冗長表現
契約書本文:
業務委託契約書
株式会社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
...))
ここから:
- 条のリスト =
{1, 2, 3, 4, 5, 6, 7, 9, 10, 11}→ 8 が無い →numbering-gap - 第 6 条の中の reference target = 8 → 木に無い →
dangling-reference - 第 3 条の date + 年間 の組 → 自動で日付計算 →
duration-mismatch
抽象的なルール(「契約書は番地で書く」)を木に落とし込んだことで、人間の目視チェックに匹敵する粒度の指摘が機械で返ります。
Claude Code 向けの skill が同梱されている
chaff には、Claude Code 向けの Agent Skills が最初から入っています。1 コマンドで入ります。
npx chaffjs skill # .claude/skills/chaff/ に入れる(プロジェクト固有)
npx chaffjs skill --global # ~/.claude/skills/chaff/ に入れる(全プロジェクト共通)
skill に書かれている主な内容:
- ジャンル選択の作法:契約書なら
legal/contract、マニュアルならdocs/manual、など、文書種別の判定を先にやる - 指摘への 3 つの応じ方:直す / その箇所だけ黙らせる (
<!-- stet: rule-id — 理由 -->) / ルールを変える (chaff relax) - 「AI 風を人間風に直す」3 モード:
- Light(指摘箇所だけ)
- Bold(各節の prose を書き直す、アウトラインは維持)
- Full(全面書き直し、「全面的に」「一から」のリクエストや、ブログ・エッセイで
ai-generated-compositeが fire した場合)
- Full モードの 3 原則:擬人化を解く(「文化が醸成された」→「互いにレビューするようになった」)、名詞連鎖を文に戻す、具体を発明しない(書き手が言っていない数字を補わず「どんな場面でしたか」と聞く)
- 構造ドキュメントの作法:
chaff tree/chaff citeの使い方(本記事の契約書サンプルがここに該当) - チームの文体ルールを
chaff.yamlに落とす方法 - chaff が間違っているときの feedback 投稿方法:
npx chaffjs feedback <file> --rule <rule-id>で下書きが生成される
本記事の契約書サンプル検査も、この skill が示している「ジャンル選択 → 検査 → 3 つの応じ方」のフレームに沿って進めています。
対応する側
chaff は検出するだけで、書き換えません(こちらの記事 で詳説)。契約書も同じで、指摘を見ながら書き直すのは人間か LLM の仕事です。ただし chaff の出力は「どう直すか」まで含んでいるので、たとえば dangling-reference を直すには「第八条の文を書くか、第六条の参照を削除する」の 2 択に絞られます。
実務の流れは次のループになります。
- 契約書案を書く
npx chaffjs contract.txtで機械チェックをかける- error が出た箇所を人間が判断する(LLM に書き直させる場合も、chaff の指摘をプロンプトに渡す)
- 再度 chaff にかける
- 相手方へ送付する
契約書 1 枚あたりの機械チェックは数秒で終わるので、PR の CI に組み込んでも苦になりません。
chaff の限界
今回のサンプルで chaff が拾えなかったのは:
- 算術の整合(50 万 × 12 ≠ 700 万): 計算ルールは現状の chaff に無い。契約書で金額の計算をチェックする専用機能は、d.contract のような専用ツールか、LLM に別途投げる方が実務的
- 「3 項目」vs 4 項目: サンプルを漢数字(三項目 / 四項目)にしたため、chaff の
announced-count-mismatchルールが拾えなかった。Markdown 版(算用数字)では拾う - 絶対規則への例外: 「すべて…ただし」は本来
absolute-exceptionルールの対象だが、今回は語の揺らぎで fire せず
いずれも、人間の目で読めば分かる種類の誤りです。chaff は構造と番号の整合、既知のパターンの欠落検出に特化しており、意味の整合は人間 or LLM に任せる、という棲み分けになります。
まとめ
- A4 1 枚の業務委託契約書に 8 個の間違いを埋めて chaff にかけたら、6 個を自動検出
- 構造的な誤り(条番号・参照・日付計算・必須条項)は、chaff の
legal/contractジャンル + カスタムプラグインで広くカバー - 「書き直し」は人間 or LLM、「ここを見ろ」は chaff、という分業は、契約書レビューでも成立
契約書のドラフトを書く AI の精度は上がっていますが、「意図せぬ番号ズレ・無い条への参照・計算ミス」は AI が気づきにくい領域です。ここに chaff を差し込むことで、法務担当者のレビュー時間を本質的な論点に集中させられます。
参考
- chaffjs — Node.js 24 以上があれば
npx chaffjs <file>で動く - chaff-plugin-legal-contract — NDA / 業務委託 / 利用規約 / プライバシーポリシー対応の自作プラグイン
- AI が書いた日本語を chaffjs + LLM で直す — 20 行の実例で結果だけ比べる — 散文版の Before/After デモ
Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。
