契約書・利用規約でできること

契約書や利用規約は、条に番号を振り、日付と金額で約束を書く文書です。 chaff は、番号、参照、定義、日付、金額がかみ合っているかを機械で確かめます。ジャンルは legal/contract です。プライバシーポリシーも同じジャンルで見ます。

契約書でよく起きる崩れ

契約書は、ひな形を使い回し、条を足したり消したりして作ります。そのとき、数がずれます。

崩れ例
期間が逆になる去年のひな形の年だけを直し、終わりの日が始まりより前になった
合計が合わない内訳の金額を一つ直したのに、合計を直していない
無い条を引く「第9条に定める」と書いたが、第9条が無い
番号が飛ぶ第4条を消したのに、番号を振り直していない
曜日が合わない「2026年12月5日(月)」と書いたが、その日は土曜日
同じ語を二度定義する「本業務」を第1条と第6条で別々に定義している

どれも、署名の後に見つかると、どちらの数が正しいのかで揉めます。

chaff が見ること、見ないこと

このジャンルでは、次のルールが何も付けなくても動きます。

ルール見つけるもの
date-range-reversed期間の終わりが始まりより前の所
total-mismatch合計が内訳の和と合わない所。表でも文でも
dangling-reference文書に無い条を指している参照
numbering-gap条の番号の抜けや重なり
date-weekday-mismatch日付に添えた曜日が、暦と合っていない所。年を書いていない日付は、その前に年まで書いた日付から 5 か月以内になる年として読みます
duplicate-definition同じ語を二度定義している所
dangling-figure-reference文書に無い図・表・別表を指す所

見ないことも決めてあります。

  • 契約の中身が妥当か、法律に合っているかは見ません。読んで決めるのは人です。
  • 一方に不利な条項かどうかは見ません。
  • 二つの定義のどちらが正しいかは決めません。二度目の定義の場所を示すだけです。
  • 受け身や、長い漢字の連なりは見ません。契約書ではそれが決まった書き方だからです。

条の番号と参照の見かたは、社内規程・規則でできること と同じです。このページでは、まず日付と金額の食い違いを、次に呼び名、定義した語、期限を見ます。

かけてみる

準備がまだなら、先に準備するを済ませます。次の契約書を keiyaku.md という名前で保存しました。会社の名前は架空です。

# ウェブサイト保守業務委託契約書

株式会社みなと商事(以下「甲」という。)と、合同会社ささき制作(以下「乙」という。)は、次のとおり契約を結ぶ。

## 第1条(目的)

甲は、甲のウェブサイトの保守業務(以下「本業務」という。)を乙に委託し、乙はこれを受託する。

## 第2条(契約期間)

契約期間は、2026年11月1日から2026年10月31日までとする。

## 第3条(委託料)

本業務の委託料は、次のとおりとする。

| 項目 | 金額 |
| --- | --- |
| 月次の更新作業 | 50,000円 |
| サーバーの監視 | 20,000円 |
| 合計 | 80,000円 |

甲は、毎月の委託料を翌月末日までに乙に支払う。支払の方法は、第9条に定める。

## 第5条(報告)

乙は、毎月の作業の内容を、翌月5日までに甲に報告する。初回の報告日は、2026年12月5日(月)とする。

## 第6条(定義)

この契約において「本業務」とは、甲のウェブサイトの更新、監視及び障害の対応をいう。

## 第7条(協議)

この契約に定めのない事項は、甲乙が誠実に協議して決める。

ジャンルを付けずにかけると、chaff は技術記事として見ます。そのとき、勧めるジャンルが出ます。

$ npx chaffjs keiyaku.md --compact

keiyaku.md   blog/tech · 日本語   ジャンルは既定から
   契約書・規約のようです。--genre legal/contract を試せます

  1:18    info    節の長さのばらつきが 22% しかありません(35% 以上ほしい)
                  section-length-uniformity
  3:1     info    段落の長さのばらつきが 29% しかありません(30% 以上ほしい)
                  paragraph-length-variance
  11:7    warning 期間「2026年11月1日から2026年10月31日」の終わりが始まりより前です
                  date-range-reversed
  21:8    error   合計「80,000円」が、内訳の金額の和(70,000円)と合いません
                  total-mismatch
  23:31   error   「第9条」(番地 9)はこの文書にありません
                  dangling-reference
  25:1    error   「第3条」の次が「第5条」です(4 番目のはず)
                  numbering-gap
  27:36   error   「2026年12月5日」は土曜日です(月曜日と書いてあります)
                  date-weekday-mismatch
  31:9    warning 「本業務」は 7 行目でも定義されています
                  duplicate-definition

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

勧められたとおり、--genre legal/contract を付けてかけ直します。 --compact は、1 件を 2 行にまとめて出す印です。

$ npx chaffjs keiyaku.md --genre legal/contract --compact

keiyaku.md   legal/contract · 日本語   ジャンルは --genre から

  11:7    warning 期間「2026年11月1日から2026年10月31日」の終わりが始まりより前です
                  date-range-reversed
  21:8    error   合計「80,000円」が、内訳の金額の和(70,000円)と合いません
                  total-mismatch
  23:31   error   「第9条」(番地 9)はこの文書にありません
                  dangling-reference
  25:1    error   「第3条」の次が「第5条」です(4 番目のはず)
                  numbering-gap
  27:36   error   「2026年12月5日」は土曜日です(月曜日と書いてあります)
                  date-weekday-mismatch
  31:9    warning 「本業務」は 7 行目でも定義されています
                  duplicate-definition

指摘 6 件、動いていない rule 98 件

error は、数や参照が食い違っていて、どちらかが必ず間違っている所です。 warning は、直したほうがよい所です。

最初に出る指針

ジャンルを決めると、chaff は結果の最初にそのジャンルの指針を出します。よい契約書が満たすことを、原稿を確かめる問いの形で並べたものです。その下に、このジャンルで特に効く rule の名前が 1 行で出ます。

問いの多くはルールでは確かめられないので、指摘より先に読みます。 AI に書き直させるときも、AI は同じ指針に沿って書きます(AI にジャンルの指針を渡す)。

$ npx chaffjs keiyaku.md --genre legal/contract

指針: 契約書・規約(legal/contract)

  下の指摘より先に、原稿がこれを満たしているかを確かめてください。

  - 当事者の呼び方(甲・乙、定義した名前)を、最後まで同じ形で使っているか
  - 定義語を一度だけ定め、定義どおりの形で使っているか
  - 義務ごとに、誰が・何を・いつまでにするかが読み取れるか
  - 金額・日付・期間・条番号の参照が、条項どうしと別表とで一致しているか
  - 解除・損害賠償・準拠法・紛争の解決を定めた条項があるか

  このジャンルで特に効く rule: dangling-figure-reference, dangling-reference, date-range-reversed, date-weekday-mismatch, defined-name-repeated, defined-term-form, duplicate-definition, numbering-gap, obligation-without-deadline, party-order, party-role-name, requirement-smell, toki-as-condition, total-mismatch, undefined-term, vague-deadline
  chaff.yaml の guide: で書き換えられます。出さないときは --no-guide。

════════════════════════════════════════════════════════════

keiyaku.md   legal/contract · 日本語   ジャンルは --genre から
…

パスや内容から推測したジャンルと、既定のジャンルでは、指針を出しません。違う種類の文書の指針は、かえって読み手を迷わせるためです。 --compact と --no-guide でも出しません。指針の文は、チームが chaff.yaml の guide: で書き換えられます(ジャンルの指針を変える)。

指摘の意味と直しかた

行指摘意味直しかた
11date-range-reversed終わりの日が、始まりの日より前です「2027年10月31日まで」のように、終わりの年を直します
21total-mismatch50,000円と 20,000円を足すと 70,000円です合計を直すか、抜けた項目を足します
23dangling-reference第9条がありません支払の方法を書いた条を足すか、参照を正しい条に直します
25numbering-gap第3条の次が第5条です番号を振り直します。参照している条の番号も一緒に直します
27date-weekday-mismatch2026年12月5日は土曜日です曜日を直すか、日付を月曜日に直します
31duplicate-definition「本業務」を第1条と第6条で定義しています定義を一つにまとめます。中身が違うなら、どちらが正しいかを当事者で決めます

番号を振り直すと、第5条が第4条になり、第9条の参照も変わります。直したら、もう一度かけて、参照が合っているかを確かめます。

呼び名、定義した語、期限

契約書は、当事者と語に一度だけ呼び名を決め、あとはその名前で書きます。ほかのひな形から写した条は、そのひな形の呼び名を連れてきます。期限の書き方も変わりがちです。次のルールが、呼び名と期限を確かめます。

ルール見つけるもの
party-role-name契約が決めていない役割の呼び名で当事者を指す所(甲と乙の契約に出てくる「受託者」)
defined-name-repeated短い呼び名を決めたあとに、当事者の正式な名前をまた書いた所
defined-term-form定義した語を別の形で書いた所(「本業務」と定義したのに「本件業務」)
undefined-term「本業務」のように定義した語と同じ形の「本成果物」を、定義しないまま使っている所
vague-deadlineほかの期限を日数で書いている契約で、「速やかに」「遅滞なく」とだけ書いた所
obligation-without-deadlineほかの義務に期限を書いている契約で、支払う・引き渡す・返還する・通知する義務に期限を書いていない所
duration-mismatch始まりの日と期間を足しても、隣に書いた終わりの日にならない所
reference-title-mismatch条を、その見出しと違う名前で指している所

次の契約書を kyodaku.md という名前で保存しました。会社の名前は架空です。

# ソフトウェア使用許諾契約書

株式会社みなと工房(以下「甲」という。)と、株式会社かもめ分析(以下「乙」という。)は、次のとおり契約を結ぶ。

## 第1条(許諾)

甲は、乙に対し、甲の分析ソフトウェアの保守(以下「本業務」という。)を行い、その使用を許諾する。

## 第2条(料金)

乙は、本業務の料金を、請求書を受け取った日から30日以内に支払う。受託者は、請求書を電子メールで送る。

## 第3条(保守)

株式会社みなと工房は、問い合わせを受けた日から2営業日以内に回答する。
本件業務で見つかった不具合は、速やかに直す。

## 第4条(期間)

この契約の期間は、2027年4月1日から2029年3月31日までの12か月とする。

## 第5条(解約)

甲及び乙は、第2条(通知)の定めにより、60日前までに書面で通知して、この契約を解約できる。
$ npx chaffjs kyodaku.md --genre legal/contract --compact

kyodaku.md   legal/contract · 日本語   ジャンルは --genre から

  11:34   info    「受託者」は、この契約が当事者に定めた呼び名(甲、乙)ではありません
                  party-role-name
  15:1    info    「株式会社みなと工房」は 3 行目で「甲」と呼ぶと定めた名前です
                  defined-name-repeated
  16:1    info    「本業務」は 7 行目で定義した語ですが、ここは「本件業務」と書いています
                  defined-term-form
  16:16   info    「速やかに」では期限が決まりません。何日以内かを数で書くと、守ったかどうかを決められます
                  vague-deadline
  20:21   warning 2027年4月1日から12か月なら、終わりは2028年3月31日ごろのはずですが、2029年3月31日と書かれています
                  duration-mismatch
  24:11   info    第2条に「通知」と添えていますが、第2条の見出しは「料金」です
                  reference-title-mismatch

指摘 6 件、動いていない rule 98 件
行指摘直しかた
11party-role-name「甲」と書きます。ほかの人が請求書を送るなら、先にその人を定義します
15defined-name-repeated「甲」と書きます
16defined-term-form「本業務」と書きます
16vague-deadline「報告を受けた日から10営業日以内に」のように、起点と日数で書きます
20duration-mismatch期間と終わりの日のどちらが正しいかを決め、もう一方を直します
24reference-title-mismatch通知の定めがある条を指します。無ければ、その条を足します

多くは info です。呼び名の付け方は書き手が決めることなので、ほかと違う所だけを示します。 duration-mismatch は warning です。期間と二つの日付が、すべて正しいことはありえないからです。

意味を読む検査は無い

このジャンルでは、npx chaffjs test で AI に送る箇所はありません。 npx chaffjs test keiyaku.md --genre legal/contract --dry-run で確かめると、送る箇所は 0 箇所と出ます。契約の中身を読んで決めることは、人がします。

chaff.yaml の始め方

契約書を置くフォルダに、次の chaff.yaml を置きます。

genre: legal/contract
language: ja

genre を書くと、毎回 --genre を付けなくて済みます。上と同じ指摘が、npx chaffjs keiyaku.md --compact だけで出ます。句読点の「、」と「,」の混ざり(kutoten-consistency)と、全角と半角の英数字の混ざり(fullwidth-alnum-consistency)も、既定で見ます。ひな形を貼り合わせて作る文書で、よく混ざるためです。この契約書には混ざりが無いので、指摘は出ていません。

次に読むページ