slim-always-loaded-docs

毎回読まれる文書(CLAUDE.md・ハブ)の減量候補を出し、Issue に起票する。「毎回読まれる文書を減量して」と指示されたとき。

SKILL.md

GitHub

/slim-always-loaded-docs

毎回読まれる文書の減量候補を出し、ai-fixable と needs-human-decision の2件の Issue に分けて起票する。文書は編集しない。 直すのは、起票した Issue の実装である。確認は取らず、起票まで進める。

なぜ要るか

毎回全文が読まれる文書は、文字数がそのまま毎回のコンテキスト消費になる。上限内なら足され、後から削る仕組みが無い。/doc-review の「削る目」は行ごとの置き場所を判定せず、/doc-consistency は重複と矛盾しか見ない。

対象

  • 引数のファイル。無ければ CLAUDE.md・docs/policy-hub.md・docs/design-hub.md。CLAUDE.md が対象なら、@ で import しているファイルも対象にする(import に逃がしても消費量は変わらない)
  • 判定の範囲は全文(変わった行だけにしない。すでに増えた分を拾えなくなるため)
  • ここに挙げたファイル以外が渡されたら、毎回読まれる文書ではないので、対象外として報告し、読まない。Rule(.claude/rules/)と auto memory の MEMORY.md も同じ

手順

1. 全文を読む

対象を全文 Read する。続けて、置き場所の判定に使う policy-driven-development-policy の「CLAUDE.md には、発火点を機械が判定できない指示だけを置く」節を Read する。

2. 置き場所を判定する

CLAUDE.md とその import 先:各行について、効き始める瞬間をファイルパス・コマンド・Skill 名のどれかで言えるかを、上の節の表で判定する。言えない行は CLAUDE.md に残す。言える行は、表の置き場所の列を移す先の候補にする。

移す先は、実在するファイルを開いて確かめる。ファイル冒頭の目的の一文か、移す先の節の見出しを読み、移す行がその範囲に入らなければ、移す先は無い扱いにする。

  • ❌ 移す先が無い:着手時の手順の行を、その手順と関係のない Skill へ移す(Skill は在るが、その Skill の目的の範囲外)
  • ✅ 移す先が有る:worktree を切る手順の行を、/git-commit の「並行セッションを検出する」節へ移す(コミットの作業の一部で、節の見出しが手順そのもの)

policy-hub.md・design-hub.md:振り分けの表は当てない。ハブは、各文書の参照タイミングと担当範囲を書く場所だからである。代わりに、各行のリンク先を開き、リンク先の中身(規定・理由)を書き写した部分(行や括弧書き)を消す候補にする。リンク先の同じ文を引用して根拠にする。参照タイミングを言う文言そのものは、applies-to で届くポリシーでも消さない(ハブは編集前でなく着手前に読まれる)。

  • ❌ 消さない:「参照タイミング: 設計書・README などプロジェクトの文書を作成・編集・レビューする前」(いつ読むかを言う文言)
  • ✅ 消す候補:参照タイミングの行の括弧書きのうち、リンク先の文を繰り返している語だけ(例:policy-hub.md の application-architecture-policy の行の「(設計判断の北極星として常時参照)」なら、消す候補はリンク先と同じ「設計判断の北極星として」だけで、「常時参照」は残す)

3. 削除の候補を出す

deletion-advocate-agent に渡す。

  1. 対象読者と用事の一文を決める。 文書が冒頭に持つなら、それをそのまま使う(policy-hub.md・design-hub.md の「対象読者:…」)。無ければこの Skill が、いつ読まれ、読む AI が何のために読むかを一文に起草する。起草した一文は agent にだけ渡し、対象文書には書き足さない(docs/reference/doc-rule-exceptions.md の CLAUDE.md の行と同じ扱い)
  2. 対象行を含む ## の節ごとに、1で決めた一文と、その節の原文(全行に対象行の印)だけを渡す(契約は agent が持つ)。会話や Issue の経緯は渡さない。本文が空の節は飛ばす。起動は1メッセージにまとめて並列にする
  3. 返った候補のうち、agent が候補ごとに付ける3点セットが1つでも欠けたものを棄却する。次も欠けた扱いにする:引用が対象ファイルや1の一文に実在しない/行動の変化が「冗長に感じる」のような感想で、「変わらない+根拠」でも行動を表す動詞でもない。ハブの参照タイミングを言う文言そのものを消す候補も、「置き場所を判定する」の手順と同じ理由で棄却する。原文が理由(なぜそうするか)を述べる文の候補も棄却する。理由は、規定を変えてよいかを読者が判断する材料である(documentation-policy「『なぜ』を必ず書く」)。ふだんの手順は変えないので、agent の基準ではほぼ常に「変わらない」と判定されてしまう。棄却した候補は、理由を添えて最後の報告に残す(Issue には載せない)

4. 言い換えの候補を出す

指示を1つも消さずに縮める案を、この Skill 自身が出す(agent は削除の提案だけを返し、言い換え案を添えることを禁じている)。

  • 削ってよいのは、言い回しと、同じ指示を言い直しただけの文である。理由を削る案は出さない(削除の候補でも、理由の文は棄却する)
    • ✅ 削ってよい:直前に「それ以外 → 宣言して着手する」とある節の、「タイポ修正など取り違えの損害が軽微な作業は宣言のみでよい」(同じ指示の言い直し)
    • ❌ 削らない:CLAUDE.md の「(LLM はほぼ常にもっともらしい一文を作れるので、確認が永久に発火しない)」(言い逃れを防ぐ理由)
  • 案を作る前に、原文の指示(命令・禁止・条件・例外)を数え、案にも同じ数が残っていることを確かめる。数が合わなければ案を捨てる。同じ指示の言い直しは、言い直された指示と合わせて1つと数える
    • ✅ 通す:上の ✅ の案(言い直しの文を消しても、数は変わらない)
    • ❌ 捨てる:CLAUDE.md の「断られたら指示どおり進め、それ以外の種類では提案しない」を「断られたら指示どおり進める」に縮める案(禁止が1つ消える)
  • 各案に、いまの文・変えた後の文・減る字数を書く

5. 同じ行の候補をまとめる

先に、agent が返した削除の候補のうち、行動の変化の根拠が「同じ指示が同じ節の別の文にある」ものを言い換えの候補に移す。移したものは「言い換えの候補を出す」と同じく指示の数を数え、数が合えば言い換えとして残し、合わなければ削除の候補に戻す。消しても指示が残る文を、指示を消す候補として人間へ回さないためである。

  • ✅ 言い換えに移す:「目的は全判断の上位基準である」(見出しの「(最優先)」と同じ指示の言い直しで、消しても指示の数は変わらない)
  • ❌ 削除の候補に戻す:「反する提案・実装・操作はしない」(「読んで従う」の言い直しに見えるが、消すと禁止が1つ減る)

そのうえで、同じ行が複数の候補に入ったら、移す>消す>言い換えの順で1つだけ残す。ハブの書き写し行と agent が返した削除の候補が同じ行を指したら、書き写しとして1件にまとめる。

6. 却下済みの案と、起票済みの候補を除く

  • 却下済み:/past-decision-search で、対象ファイルのパスと、候補ごとの主題語(例:「使用Skillの一覧」)について過去の決定を引く。却下済みの案と同じ候補(同じ中身を同じ先へ移す、同じ指示を消す)は除く
    • ✅ 除く:「変更種別ごとの使用Skill一覧を docs/guide/development-flow.md へ移す」候補(#1365 が見送った案と、中身も移す先も同じ)
    • ❌ 除かない:同じ一覧の言い回しを詰める言い換えの候補(中身が違う)
  • 起票済み:候補ごとに gh issue list --state open --search "<候補の主題語>" を引く。open な Issue に同じ候補があれば除く

除いた候補は、出典(起票済みなら Issue 番号)を添えて最後の報告に残す。Issue には載せない。

7. 2件に分けて起票する

/quick-issue の SKILL.md を Read し、書き方・ラベル・親への紐づけに従う。候補を除いた後に該当が0件の側は、起票しない。

起票する Issue 入れる候補
ai-fixable 既にあるファイル(Skill・Rule・Policy など)へ移す行/指示を1つも消さない言い換え/ハブの書き写し行(消してもリンク先に同じ文が残る)
needs-human-decision 指示そのものを消す候補(削除の候補)/移す先が無い行/移すのに新しい hook・スクリプト・CI ジョブが要る行(issue-policy の「恒久的に保守が要る資産を新設する」に当たる)

どれを捨てるかは重要度の比較で、機械にも AI にも裁定できない(policy-driven-development-policy)。だから指示を消す候補は人間へ回す。混ぜると、AI が直せる分まで人間の判断待ちで止まる。

  • ✅ needs-human-decision:コマンドで言える行を hook へ移したいが、そのコマンドで動く hook が .claude/hooks/ に無い(新設に当たる)
  • ❌ needs-human-decision にしない:既にある hook やスクリプトに処理を足すだけの行(新しい資産を増やさないので、新設に当たらない)

この Skill が /quick-issue に足す決まりは次のとおり。

  • タイトル:段番号に続けて [減量](ai-fixable)または [減量・要判断](needs-human-decision)、対象ファイル名を書く
  • 現状:候補ごとに、出典(パスと行番号)・原文の引用・種別・移す先または変えた後の文・減る字数を書き写す。needs-human-decision の候補には、agent が返した「消したときの読者の行動の変化」も書く
  • 実装フロー:移す先と編集元の変更種別を、CLAUDE.md「変更種別ごとの使用Skill」に当てて決める

報告

次を表示する。

  • 起票した Issue の番号と URL
  • 起票しなかった側とその理由(該当0件)
  • 3点セットが欠けて棄却した候補と、その理由
  • 却下済みとして除いた候補と、出典
  • 起票済みとして除いた候補と、その Issue 番号

両方の Issue が0件のときは、起票せず「該当なし」と、読んだ文書の一覧を表示する。棄却した候補と除いた候補も、同じように表示する(除いた候補が消えると、蒸し返しの防止が働いたかを人間が確かめられない)。