--- name: anti-ai-writing description: "人間らしい文章を書くための Linter とガイドライン。Use when: 文章をレビュー・リライトしたい、AI生成テキストを人間らしく修正したい、新規執筆でAI臭を避けたい。Triggers: 文章を書いて、校正" --- # Anti-AI Writing AI にありがちな表現や構成の偏りを抑え、自然な文章に整えるためのスキル。スクリプトによる機械チェックと、文脈を踏まえた推敲ガイドラインを組み合わせて使う。 ## 対応言語 - 日本語: [references/japanese.md](./references/japanese.md) - 英語: [references/english.md](./references/english.md) > [!TIP] > 言語が混在している場合は、それぞれの言語のリファレンスを参照する。 > [!NOTE] > 技術文書の構成、手順の書き方、誤読の余地の排除、用語の統一は `technical-writing` が担当する。このスキルは、AI にありがちな表現と構成の検出だけを扱う。 ## 共通原則 - 抽象的な評価語や誇張(「劇的に」「徹底的に」など)に頼らず、具体的な行動・対象・条件を書く。不要な強調語は別の言葉に言い換えず、そのまま削る。 - 結論と判断理由を先に示す。無意味な留保で結論を曖昧にしない一方、裏付けのない事柄まで決めつけない。既存の文章を推敲するときは、原文の確信度(未検証の推測・条件付きの判断・確定した事実)を勝手に変えない。 - 事実や数値は確認できるものに限る。人間らしさを演出しようとして、架空の体験談や感情、出典を捏造しない。 - 見出しのオウム返しや儀礼的な前置きは省き、本題から書き始める。 - 不要な打ち消しや対比構文で文章を膨らませず、言いたい内容を直接書く。 - 同じ構文や段落パターンを繰り返さない。重要な主張は厚く書き、補足は簡潔に済ませるなど、分量と文の長さにメリハリをつける。 - 太字や括弧の多用を控え、見出し内の太字や箇条書き全項目への機械的な太字ラベル付けは避ける。em dash(`—`)やダッシュ(`―`)に頼らず文を分けるか通常の句読点でつなぐ。 - 読者と用途に合ったトーンを保つ。人間味を出そうとして、不自然な雑談や砕けた口調、大げさな感情表現を混ぜない。 - 言い換えやルール適用よりも、引用・固有名詞・技術用語の正確さを優先する。 - 現在の状態を書く。過去の経緯や旧版の説明を網羅しない。変更履歴の管理は Git などのツールに任せ、履歴がないと誤読される場合(移行手順、互換性、判断の理由)だけ書く。 - 抽象度に迷ったら、この文章を誰が、どんな場面で読む可能性があるかを想像する。読み手と場面の候補を挙げていくと、抽象度をどのあたりに置くかの見当がつく。決め打ちの規則ではなく、迷ったときに使う観点である。1 回限りの出来事(日付、人名、案件名)は、抽象化しないまま一般論に混ぜない。反対に、抽象化しすぎて何の話か分からなくなる場合は、具体例を 1 つ添える。 ## 作業手順 1. 読者・目的・結論を整理し、共通原則と言語別リファレンスに沿って執筆・推敲する。 2. **短文でも省略せず**、対象の全文に [scripts/lint.py](./scripts/lint.py) を実行する。チャット上の文章は標準入力で渡すか、一時ファイルに書き出して検査する。 3. 指摘ごとに「修正する」か「文脈上そのまま残す」かを判断する。機械的に一括置換したり、指摘を消すためだけに事実・条件・肯定否定・確信度を変えたりしない。 4. 修正後に全文を再検査する。すべての指摘を確認し、あえて残す箇所の理由を説明できれば完了とする。指摘ゼロを目指して何度も書き直さない。 5. 最後に全文を通読し、論旨の流れ・根拠・読みやすさを確認する。機械チェックでは拾えない点も言語別リファレンスに照らして見直す。 レビューや診断だけを求められた場合は、指摘箇所と改善案の提示にとどめ、元の文章を直接書き換えない。また、環境上の理由でスクリプトを実行できない場合はその旨を伝え、機械チェック済みとは報告しない。 ## 静的チェックの実行 [scripts/lint.py](./scripts/lint.py) は Python 3.10 以降の標準ライブラリだけで動作し、追加パッケージや外部通信を必要としない。UTF-8 のプレーンテキストまたは Markdown を読み取り専用で検査し、元のファイルは変更しない。 実行時は `` をこのスキルの絶対パスに置き換える(カレントディレクトリやリポジトリ構成に依存させないため)。 ```bash uv run --no-project "/scripts/lint.py" --language ja draft.md uv run --no-project "/scripts/lint.py" --language en draft.md --json uv run --no-project "/scripts/lint.py" --language both draft.md ``` - ファイルパスの代わりに `-` を渡すと標準入力から読み込む。`--language` には `ja` / `en` / `both` のいずれかを明示する。`--json` を付けると、`file`・`language`・`findings`(各要素は `rule`、`severity`、1 始まりの `line` / `column`、`message`、`excerpt`)を JSON で出力する。 - 終了コードは `0` が指摘なし(または `info` のみ)、`1` が要確認の指摘(`warning` / `error`)あり、`2` が引数・入力・ルール定義のエラーを表す。終了コード `1` はスクリプトの異常終了ではなく、確認すべき指摘が見つかったことを意味する。 - コードブロック・インラインコード・インデントされたコード行・先頭の YAML front matter・HTML コメント・URL・Markdown のリンク先 URL は検査から除外される。見出し・箇条書き・引用の本文およびリンクの表示テキストは検査対象となる。 - 検出する語句と正規表現は [scripts/rules.json](./scripts/rules.json) で管理する。語句リストは `terms`、正規表現は `pattern` に記述し、`severity` には `info`(参考情報)・`warning`(要確認)・`error`(使用禁止)のいずれかを指定する。用途と修正方針が異なる語は、同じ配列へ混ぜず別のルール ID とメッセージに分ける。 スクリプトが検出するのは、登録された語句・記号・同じ語尾や接続詞の反復といった表層的なパターンのみである。文脈の妥当性や事実関係までは判定できないため、指摘がゼロでも必ず通読して仕上げる。