chaff
文書の linter です。契約書・報告書・マニュアル・ブログ記事の中で、機械で確かめられることを見つけます。読み切れないほど長い文、内訳と合わない合計、終わりが始まりより前の期間、無い条項への参照。文章は書き換えません。
日本語や英語の文書を書く人・確かめる人のための道具です。AI に下書きさせているチームが、その間違いを別の AI の意見ではなく機械で捕まえるためにも使えます。
npx chaffjs article.md npx chaffjs --genre legal/contract 契約書.md
Node.js 24 以上が要ります。先に入れるものも、設定ファイルも、API キーも要りません。
出力の例
下の文書はこのページのために書いたものです。その下の出力は、このサイトを作るときにその文書へ chaff をかけた結果で、手で書いたものはありません。
自分と食い違う契約書
終わりが始まりより前の期間、内訳の和と合わない合計、日付と合わない曜日、無い条への参照。どれも計算か文書自身の構造で決まるので、機械が毎回同じように言えます。
# 業務委託契約書 ## 第1条(期間) 本契約の期間は、2026年4月1日から2026年3月31日までとする。 ## 第2条(委託料) 委託料は、設計費50万円及び開発費60万円の合計120万円とする。 ## 第3条(納品) 受託者は、2026年5月12日(月)までに初稿を納品する。 ## 第4条(解除) 各当事者は、第6条の定めにより本契約を解除できる。
$ npx chaffjs --compact --genre legal/contract 契約書.md
契約書.md legal/contract · 日本語 ジャンルは --genre から
5:9 warning 期間「2026年4月1日から2026年3月31日」の終わりが始まりより前です
date-range-reversed
9:25 error 合計「120万円」が、内訳の金額の和(1,100,000円)と合いません
total-mismatch
13:6 error 「2026年5月12日」は火曜日です(月曜日と書いてあります)
date-weekday-mismatch
17:7 error 「第6条」(番地 6)はこの文書にありません
dangling-reference
指摘 4 件、動いていない rule 98 件AI が書いたような文章と、その書き直し
生成した文章のように書いた下書きです。chaff は、決まり文句の書き出しや締め、中身を言わない強調を挙げます。AI が書いたかどうかは判定しません。
文書
# AI エージェントの並列実行とは?徹底解説 近年、AI エージェントを並列で動かす手法が大きな注目を集めています。本記事では、そのメリットと課題について詳しく解説していきます。 ## 並列実行のメリット 並列実行には、主に3つのメリットがあります。 - **開発速度の向上**: 複数のタスクを同時に進められます。 - **待ち時間の削減**: 一つのエージェントを待つ必要がなくなります。 - **品質の向上**: 異なるアプローチを並行して試せます。 これは非常に重要なポイントと言えるでしょう。 ## まとめ いかがでしたでしょうか。AI エージェントの並列実行は、今後ますます重要になっていくと考えられます。ぜひ試してみてください。
$ npx chaffjs --compact 下書き.md
下書き.md blog/tech · 日本語 ジャンルは既定から
3:1 warning 「近年」は、どの記事にも当てはまる書き出しです
padded-intro
13:1 warning 「非常に重要」は、中身を言わずに強調だけしています
empty-intensifier
17:1 warning 「いかがでしたでしょうか」で締めています
closing-cliche
17:51 warning 「ぜひ試してみてください」で締めています
closing-cliche
指摘 4 件、動いていない rule 59 件同じ話題を、数字と決めたことを入れて手で書き直したものです。chaff は書き直していません。確かめただけです。
書き直した文書
# AI エージェントを並列で動かした一か月 コーディング用のエージェントを4つ、それぞれ別の git worktree で同時に動かしています。最初の一か月でわかったことを書きます。 ## 得たもの - 4枚のチケットが一度に進みます。 - エージェントの終わりを待たずに、次の作業を始められます。 - 直し方が決まらないときは、2つのエージェントに別々のやり方を試させ、よいほうの差分を残します。 ## 払ったもの エージェントごとに作業コピーとテストとレビューが要ります。8コアのノート PC では、5つ目を足すと、どのテストもそれまでより遅くなりました。 いまはエージェントを4つまでにし、1つに1ファイルだけを任せています。2つのエージェントが同じ関数を書き換えることはありません。 ## 始めるなら 関係のないチケット2枚に、エージェント2つから始めます。差分を読む時間が自分で書く時間より短くなってから、3つ目を足します。
$ npx chaffjs --compact 書き直し.md
書き直し.md blog/tech · 日本語 ジャンルは既定から
3:1 warning 文の長さのばらつきが 24%(36% 以上ほしい)
sentence-rhythm
指摘 1 件、動いていない rule 59 件チームの言葉
社内用語、必ず要る見出し、表記の揃え方は、チームの chaff.yaml から読みます。chaff は自分では持っていません。何が社内用語かはチームごとに違うからです。
genre: business/proposal prefer: メイル: メール jargon: - 巻き取り required_sections: - リスク
文書
# 問い合わせ窓口を共有の受信箱にまとめる ## 提案 いまは問い合わせがメイルで3人に届いています。共有の受信箱を1つ作り、誰かが休んでいても返事が出せるようにします。 ## 費用 共有の受信箱は月4,000円です。設定には技術者1人の2日分の作業が要ります。 ## 次にすること 金曜日にサポートの担当者と話し、残りの作業はこちらで巻き取ります。6月から始めます。
$ npx chaffjs --compact 提案書.md
提案書.md business/proposal · 日本語 ジャンルは chaff.yaml から
1:1 error 「リスク」の見出しがありません
required-sections
5:10 warning 「メイル」は「メール」と書きます
preferred-term
13:1 warning 「巻き取り」は社内でしか通じないかもしれません(そういう語が 1 箇所)
internal-jargon
指摘 3 件、動いていない rule 70 件ほかの道具と違うところ
- 同じ文章なら同じ結果
- lint の道筋にモデルは入っていません。版と設定が同じなら、同じ文章からは毎回同じ指摘が出ます。CI での結果と手元での結果は同じ意味です。
- 文書を文書自身と突き合わせる
- 合計と内訳、期間の始まりと終わり、日付と曜日、二通りに書かれた数字や名前、無い条への参照、番号の抜け、二度定義された用語。
- 確かめなかったことを言う
- 動かなかったルールを、理由(言語が違う、このジャンルでは見ない、
chaff testが要る)と一緒にすべて並べます。指摘 0 件が「何も見ていない」と読まれることはありません。 - 文書の種類に合わせる
- 契約書の文はブログより長くなるものです。
--genreでジャンルを選ぶと、ルールと閾値がその種類に合います。設定は要りません。 - 日本語と英語の両方で、全部
- ルールも、メッセージも、画面も、両方の言語にあります。言語は文章から決めます。
- 意味を読むのは、頼んだときだけ AI に
- 読まないと決まらないこと(結論が何かを言っているか)は
npx chaffjs testで見ます。判断の要る箇所を機械が先に絞り、送る前に何を送るかを見せます。
なぜ書き換えないのか
「AI が書いたように見える」と言うだけの道具では、何を直せばよいかがわかりません。代わりに書き換える道具は、書いた人を自分の文書から外してしまいます。それに、書き換えで数字が落ちたり日付がずれたりしても、誰も気づきません。
chaff は報告するだけです。何を変えるかは書いた人が決めます。AI に頼むなら、読める計画(fix-plan)を渡して直させます。報告の最後には、文章を変えていないことが書いてあります。
文章はどこかへ送られますか
送られません。確かめるのは手元のマシンの中、プレイグラウンドならそのページの中で、何も送りません。
AI の API を呼ぶのは npx chaffjs test だけです(Anthropic か OpenAI、自分のキーで)。送るのは機械が選んだ箇所だけで、--dry-run を付けると API を呼ばずにそれを見せます。feedback は報告の下書きをファイルに書くだけで、自分では何も送りません。
lint のほかにできること
どのコマンドも終了コードを返すので、CI で回せます。
npx chaffjs compare 元.md 書き直し.md- 書き換えで事実が落ちていないか、増えていないかを確かめます。数字、日付、URL、コード、名前、引用。 詳しく
npx chaffjs cite 出典.md quotes.json- 引用した文が、本当にその出典にあるかを確かめます。 詳しく
npx chaffjs ai-score 記事.md- AI らしさを低・中・高で簡易に判定します。生成した文章に多く、同じジャンルの人の文書には少ない印を数えます。AI が書いたかどうかの判定ではありません。 詳しく
npx chaffjs grade outputs.jsonl- モデルの出力を並べたファイルを、ルールと compare と cite で採点します。評価の仕組みの中で、決まった結果を出す層になります。何も送りません。 詳しく
npx chaffjs fix-plan 記事.md- 書き直す人(人でも AI でも)に渡す計画です。ルールごとの指摘、それぞれの直し方、直した後にかける検査を並べます。 詳しく
npx chaffjs . --sarif out.sarif- CI で、指摘を pull request の行に出します。
baselineでいまある指摘を棚上げすれば、新しい指摘だけがビルドを落とします。 詳しく
ほかの道具との比べ方
ほかの道具が何かは、それぞれのサイトの説明から引いています。どれもそれぞれの仕事が得意で、chaff と並べて使えるものもあります。下の違いは chaff がすることで、ほかの道具に何かが欠けているという話ではありません。
Vale
どういう道具か: オープンソース(MIT)で、マークアップを読む文章の linter。チームのスタイルガイドを YAML のルールで書きます。
chaff の違い: ルールを同梱し、文書の種類で選びます。文書の中の数字・日付・参照を突き合わせます。英語に加えて日本語も読みます。
textlint
どういう道具か: JavaScript で書かれた、オープンソースでプラグイン式の自然言語の linter。ルールは npm から別に入れます。
chaff の違い: ルールが最初から入っていて、ジャンルごとに決まります。チーム独自のルールは chaff.yaml か YAML のルール集に書きます。
LanguageTool
どういう道具か: 25 を超える言語のための、オープンソース(LGPL)の校正ツール。スペルチェッカーでは見つからない誤りを見つけます。自分のサーバーでも動かせます。
chaff の違い: 文法やつづりの検査器ではなく、読むのは日本語と英語だけです。構造・一貫性・計算を確かめます。
Grammarly
どういう道具か: 直し方や段落の書き直しを提案する AI の文章アシスタント。ブラウザ、デスクトップ、オフィスのアプリで動きます。
chaff の違い: 書き換えません。手元か CI で動き、同じ文章には同じ結果を出します。
LLM に頼む
どういう道具か: 「この契約書を確認して」のようなプロンプト。意味を読み、どのルールにもないことにも気づけます。
chaff の違い: 同じ入力でも同じ答えが返るとは限らず、見落とした合計には気づきにくいものです。chaff の検査はそのまま繰り返せて、変更のたびにかけても費用がかかりません。両方を組み合わせられます。chaff test は、読む必要のある箇所だけを AI に渡します。
しないこと
- 意味は判断しない
- 論が通っているか、事実が正しいか、契約が公平かは、linter の仕事ではありません。chaff は問いを絞るところまでです(
chaff test)。 - 見逃す
- 見つけるのは、ルールがあることと、そのルールが知っている書き方だけです。指摘 0 件は、動いたルールが何も見つけなかったという意味です。
- 間違える
- 一か所だけ黙らせるなら
<!-- stet: rule-id — 理由 -->、チームでゆるめるならnpx chaffjs relax rule-id --why "理由"、止めるなら chaff.yaml に書きます。
どう測っているか
誤りを仕込んだ文書の組: ジャンルごとに自分たちで書いた文書(契約書、メール、報告書、技術文書など)を、誤りのない版と誤りを仕込んだ版の二つで持っています。変更のたびに、仕込んだ誤りのうちその行で指摘できたものと、誤りのない版に出た指摘を数え、どちらかが悪くなると CI が落ちます。
パブリックドメインの法令を含む実際の文書(corpus)にも変更のたびにかけ直します。新しいルールがふつうの文章を指摘し始めたら、出す前にわかります。
指摘が間違っていたら
npx chaffjs feedback <ファイル> --rule <ルール> が、指摘の前後の行だけを入れた報告の下書きを作り、GitHub の issue にするコマンドを出します。自分では何も送りません。報告の一つ一つが、試験と修正になります。
ソースとライセンス
- github.com/isamu/lab (text/)
- MIT ライセンス
- npm: chaffjs
- 作者は isamu で、isamu/lab リポジトリにあります。