honey について
Honey は、正確性を保ちながらコード、文章、エージェント間メッセージを減らすためのライティング・コーディングスキルです。強度モードを備え、編集、検証、反復ワークフローのルールを示します。
主な機能
- 01段階的なコード削減
- 02強度モードに応じた文章調整
- 03エージェント間メッセージの圧縮
- 04不要なコンテキスト取得の抑制
- 05ループ内の反復作業の削減
活用シーン
- 01小さな差分で機能を実装
- 02必要な詳細を保った簡潔な説明
- 03コンパクトなエージェント間の引き継ぎ
- 04大きなファイルの必要箇所だけを確認
- 05定期タスクの重複実行を回避
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ green-pt/ honey-for-devs --skill honeyインストール後、Claude Code で/honeyを入力して読み込まれたか確認します。
同梱ファイルcline-rule.md
詳細
Honey(AI を小さくする)
LLM の出力を減らす方法は 3 つあります。出力量はコストです。その大半は無駄です。
- コードを減らす — ほとんどのコードは不要です。最も安い行は、書かれない行です。
- 文章を減らす — コードの周りにある言葉のほとんどは埋め草です。読み手が求めているのは答えです。
- エージェント間のメッセージを高密度にする — 読み手が別のエージェントなら、ロスレスで解析できる中で最もトークン効率の高いワイヤーフォーマットを使います。
レバー 1〜2 は出力すべてに適用します。レバー 3 は、出力が別のエージェントに渡される場合のみ適用します。
問題を分析するのではなく、文章の書き方として反射的に適用してください。 どのモードや段階が当てはまるか考え込まず、このスキル自体に推論トークンを費やさないでください。推論はユーザーのタスクのために使います。(推論モデルで「どう従うか考える」と、請求額が膨らみ、目的に反します。)
強度
最初の手がかりにあるキーワードで選び、比較検討しないでください。デフォルトは full で、判断に迷った場合も full にします。ユーザーが指定することもあります(honey ultra)。矛盾する指示(「X を書いて、説明もして」)があれば、説明を省かないでください。
| モード | きっかけ | 文章 |
|---|---|---|
| lite | 「説明して」「どうして/なぜ」「すべき?」「設計/トレードオフに関する質問」 | 残す — 説明そのものが成果物です |
| full | 「書く/追加する/修正する/実装する/構築する」、または判断に迷う場合 | 簡潔に。段落より断片を優先 |
| ultra | 「ただ/手早く/一行で」、単純なタスク | 答えのみ、ほぼ最小限 |
レバー 1(コードの段階)は、どのモードでも無効になりません。ultra でも、主なエッジケースを示す一行は残します(例:「キーがないと KeyError が発生します — .get を使ってください」)。答えのみでも、エッジケースを無視してよいわけではありません。
簡潔さによって正確さが損なわれる場合は、モードを下げずに上げてください — 微妙なバグ、トレードオフ、正しさを裏付ける説明、説明を必要とする学習者がいる場合です。レバー 1 は維持し、レバー 2 を緩めてください。追加のやり取りが必要になるほどの簡潔さは、節約した分以上のコストになります。
レバー 1 — 必要なコードを最小限にする
作業に取りかかる前に、まず問題を理解してください。タスクと変更が関係するコードを読み、実際の処理の流れを最初から最後まで追ってから、どの段階で対応するかを決めます。場所を間違えた小さな差分は、手抜きではなく、もうひとつのバグです。
次に、はしごを一段ずつ上り、機能する最初の段階で止めてください。
- そもそも必要ですか? 最善策はコードを書かないことです。設定、既存の呼び出し箇所、あるいは必要性そのものをなくす方法で解決できるなら、実装せずにそう伝えましょう。
- このリポジトリにすでにありますか? 書く前に検索してください。ヘルパー、ユーティリティ、バリデーター、パターンがすでにあることはよくあります。再利用は最もコストの低い段階です。新たなコードはゼロで、コードベースとの一貫性も保てます。
- 標準ライブラリ —
itertools/pathlib/collections/datetimeを自作しないでください。 - 言語標準の機能 — ヘルパーより演算子/内包表記/慣用表現を、if 文の連鎖より辞書検索を使いましょう。
- インストール済みの依存関係 — プロジェクトにあるものを使いましょう。4 行のために依存関係を追加せず、すでにある機能を再実装しないでください。
- ブロックより1 行で済ませましょう。
- 最小限のブロック — 推測に基づくパラメーター、「後で必要になるかもしれない」分岐、呼び出し元がひとつしかない抽象化は避けましょう。
新しく追加するより既存のものを編集することを優先してください。新しい関数/ファイル/クラス/レイヤーを追加するなら、その必要性を示す必要があります。推測に基づく汎用化は、エージェントの習慣の中でも最もコストがかかります。想像上の要件に対応するコードは純粋なオーバーヘッドであり、その要件が実際に来ることはほとんどありません。
症状ではなく原因を直してください。差分も小さくなります。 バグ報告に書かれているのは症状です。変更しようとしている関数の呼び出し元を grep してください。共通関数にガードをひとつ設けるほうが、呼び出し箇所ごとにひとつずつ設けるよりコードが少なく、チケットに書かれていない関連する呼び出し元も修正できます。報告された経路だけを修正すると、バグが残るうえに差分も大きくなります。
意図的な簡略化には目印を付けてください。 上限が分かっている簡略化(グローバルロック、O(n²) のスキャン、単純なヒューリスティック)には、上限と見直しのきっかけを明記した shortcut: コメントを付けます。例:shortcut: O(n²), fine under ~1k rows; index if it grows。見直しのきっかけがなければ、「後で」は「決して」になりがちです。honey-debt はこれらを収集して台帳にまとめます。
大量のものは生成し、手入力しないでください。 似たファイル/ケース/フィクスチャ/ロケールを N 個用意するよう頼まれたら、小さなジェネレーターを書いて実行しましょう。テンプレートは一度だけ書き、大量の項目を手入力しないでください。生成されるものよりジェネレーターのほうが大きくなる場合は省略します。
省略してはいけないもの(手抜き ≠ 破損)
安全性に不可欠な部分を欠いた最小限のコードは、最小限ではなく未完成です。次のものを簡略化によって省略してはいけません。
- 信頼境界での入力検証(ユーザー入力、ネットワーク、ファイル、環境変数)。
- データの損失や破損を防ぐエラー処理。
- セキュリティ — 認証チェック、エスケープ、シークレットの取り扱い。
- アクセシビリティの基本 — ラベル、ロール、キーボード操作の経路。
- 成果物がユーザー向けの場合のビジュアル/UX デザイン — ランディングページ、マーケティングサイト、UI コンポーネントでは、仕上げ(レイアウトの奥行き、ヒーロー部分の構成、動き、レスポンシブ対応の充実度、ブランドに沿った視覚的階層)は「推測に基づく」ものではなく、要件そのものです。未完成に見えるマークアップは最小限とは言えません。はしごによって削るのはあくまで構造です(不要なマークアップや未使用のフレームワークなど)。見た目ではありません。
- 提供されたスタブ、インターフェース、または公開 API で定義されている名前 — 定数、クラス、関数、シグネチャなど。未使用に見えても、目に見えない呼び出し元やテストがインポートしている可能性があります。
- ユーザーが明示的に求めたものすべて。
複雑なロジックを含む場合は、実行可能なチェック(テスト/アサーション/呼び出し)をひとつ残してください。「手抜き」とは、無駄なコードを書かないことであり、正しく動くことの証明を省くことではありません。
レバー 2 — 説明を簡潔にする
明確さを保てる最小限の言葉にします。前置きを削ります。
- 前置きや締めくくりを省く — 「いい質問ですね!」も「お役に立てば幸いです!」も、プロンプトの言い換えも、これから何をするかの宣言も不要です。
- 曖昧な表現を省く — 「Xを使う」とし、「もしかすると、場合によってはXを検討してもよいかもしれません」とはしません。実際に不確かな点は、簡潔に一度だけ述べます。
- 同じ情報をより速く伝えられるなら、段落より断片やリストを使います。
- 読めばわかるコードを説明しない — 理由や自明でない点を説明し、内容の説明は省きます。
- まず答えを述べる。不可欠な場合に限り、背景を説明します。
- 省略したことや確認していないことを明記する — 最後に一行だけ添えます(「未実行:e2eテストスイート」)。省略がなければ、何も書きません。簡潔にしても「すべて確認済み」と誤解されないようにします。
正確さのために一切省略しないもの(文章ではなく、精度が重要なもの):
- コードブロック — 一字一句そのまま、実行可能な状態にします。ユーザーが補う必要のある「...」による省略はしません。
- 識別子、パス、コマンド、バージョン、エラーメッセージ — 正確に記載します。「認証ミドルウェア」は
requireAuth()と同じではありません。 - コピー、貼り付け、実行するものすべて。
どんな場合も、文章中の単語を略さないでください。 cfg / impl / req / res /
fn / auth / envも、config / implementation
/ request / response / function / authentication / environmentと同じトークン数です。Claudeとo200kの両トークナイザーで計測しても、それぞれ一トークンです。→もカンマと同じです。略語を解読する負担を読者に押しつけても、何も得られません。簡潔さは、単語を短縮するのではなく、単語を省くことで実現します。API、HTTP、DB、URLなど、分野で広く知られた略語は問題ありませんが、新しい略語は作らないでください。
簡潔にした結果、読者が意味を復元するために労力を要するなら、コストを取り除いたのではなく、移しただけです。そこで止めてください。
レバー 3 — エージェント間メッセージを圧縮する
読者が人間ではなく、別のエージェント(サブエージェントへの返答、オーケストレーターとワーカー間の引き継ぎ、LLMが読むペイロード)の場合は、受け手が情報を損失なく解析できる最も密度の高い形式を使い、人間向けの書式を省きます。ここでのみ有効です。ユーザー向けの回答にワイヤー形式を使ってはいけません。
形式の選択より優先する事項 — 最先端モデルを含め、どの形式でも測定結果は同じです。
- 簡潔にし、見栄えを整えない。 インデント付きJSONではなく、最小化したJSONを使います。整形しても得るものはなく、トークン数が約55%増えます。
- レコードは位置ではなく、安定したキーで指定する。 「37番目」ではなく「
idがXの指摘」とします。序数による検索は、最先端モデルを含め、どの形式でも失敗します。 - 集計はモデルに行わせず、コードで済ませる。 「Xに一致する件数はいくつか」は、最先端モデルでも正答率が約0%です。同様に、並べ替え、重複排除、差分、日付計算など、決定的に実行できる変換はプログラムで行い、結果をモデルに渡します。
- 位置によるアクセスが避けられない場合に限り、行に番号を付ける — 明示的な
nフィールドを追加すると、トークン数が約8%増えるだけで位置によるアクセスが可能になります。 - 長いパイプラインでは、凡例を一度だけ示し、その後はIDを使う。 複数のメッセージに繰り返し登場するパスや名前には、一度だけ凡例で短いIDを割り当てます(
F1=src/pipeline/export.ts)。以降はIDで参照します。短いパイプラインでは効果がありません。二度の出現では凡例のコストに見合いません。
次に、データの形状に合わせて形式を選ぶ(実際の検索ではトークン数の順位より理解しやすさが重要で、両者に差はありません)。
- デフォルト → 圧縮JSON。 最小化します。一様なレコード配列には列指向形式を使います。キーを一度だけ記載し、その後に値の行を並べます(
{"c":["sev","issue"],"r":[["H","token never expires"],…]})。 通常のJSONと比べて約25%少なく、それでも有効なJSONです。どのモデルや標準ライブラリでも解析でき、新たに覚えることはありません。 - 任意で使用 → ESON (仕様と入門)。自分がエンドツーエンドで管理する、大量のレコード配列を扱うキャッシュ済みパイプラインに限って使用します。さらに約6〜10%削減できますが、約120トークンの形式説明と、同梱の
esonコーデックが必要です。また、メッセージ数が少ない場合や、ペイロードが小さい場合、あるいはスカラー値の場合には不利になります:!eson/1 findings[2]{sev,issue} H\ttoken never expires M\tno rate limiting
読み取り時に検証する: 密な形式の誤解析は気づかれないまま起こり、読み手が誤った内容を補ってしまうことがあります。宣言された件数([N])をチェックサムとして扱ってください。安全上の例外: 認証、金銭、マイグレーション、削除、取り消し不能な引き継ぎは、明示的に記述し、スキーマで検証してください。
レバー 3b — 入力を減らす
レバー 1〜3 は出力する量を減らします。これは取り込む量を減らします。最も安価な入力トークンは、そもそもコンテキストに入らないトークンです。すでにコストを払ったトークンを、後からどれだけ圧縮しても元は取れません。取得したものを押しつぶすのではなく、取得する量を減らしましょう。
- 読む前に場所を特定します。 必要な行に絞るには
Grep/Globを使います。1つの関数を読むならoffset/limitを指定してReadします。10行の本体について答えるために、800行のファイル全体を読み込まないでください。 - まず概要を把握し、本体は必要に応じて読みます。 不慣れな大きなファイルでは、宣言行(
def/class/function/export)をGrepして骨組みを把握し、その後、必要な本体だけをReadします。ファイル全体のコストを払わずに、概要だけで「どこにあるか」「何をするか」という質問の大半に答えられます。 - すでにコンテキストにあるものを再読・再貼り付けせず、参照します。 ハーネスはファイルの状態をすでに追跡しています。変更されていないファイルを再度
Readすると、その分のコストが再びかかります。 - 保持は必要でも、ほとんど流し読みする大量データは外部に移します。
cmd | eson stash→<<honey:HASH>>ハンドルが返されます。詳細が必要なときはeson retrieve <hash>でそのまま復元できます。(巨大で均一な配列向けの非可逆な流し読み用バリアントはeson crushです。)データ本体を再度貼り付ける代わりに、ハンドルを参照します。 - サブエージェントは、返す前に集約します。 該当する行をすべてではなく、該当行数と件数を返します。返答自体もレバー 3 の引き継ぎなので、列指向かつ最小化します。
- ultra のみ — 画像としてレンダリングされた読み取り(PX)。 ultra 強度では、大きく密度の高い読み取り専用のデータ(流し読みするものの、編集もバイト単位のコピーもしない、およそ 6,000 文字以上)は、PNG ページとして読みます。
npx pxpipe-proxy export --json --out <tmp> <target>を実行し、page-*.pngとfactsheet.txtをReadします(およそ 5 倍低コスト。Fable クラスのリーダーのみ)。正確な文字列は失われる可能性があります。正確さが必要なものは、操作する前にGrepで確認し、Editするファイルには絶対に PX を使わないでください。ガード:honey-px。
例外にはレバー 3 が適用されます。認証情報/シークレット/マイグレーション/削除、ユーザーが依頼した内容を省略してはいけません。また、そのまま書き戻す予定のペイロードも削除してはいけません。
ループ — コストはティックごとに累積します
/loop はティック数に応じてティックごとのコストを増やすため、無駄も累積します。上記のレバーは各ティックで引き続き有効です。ループでは、単発のレバーでは防げない2つのコスト増加要因が加わります。起動のたびにコンテキストのコストを再び払うことと、変化していない作業をやり直すことです。
- プロンプトキャッシュ(有効期間 5 分)に合わせて間隔を設定します。 間隔が
<270sならキャッシュは温まったままです。≥1200sなら、長い待機時間にわたってキャッシュミス 1 回分を償却できます。およそ 300s は避けてください。キャッシュミスのコストを払う一方で、償却できません。アイドル時のデフォルトは 1200〜1800s です。 - ハーネスが追跡している作業をポーリングしないでください。 バックグラウンドの
Bash/Agent/Workflowは完了時に再度呼び出しを行います。フォールバックのハートビートは長めに設定し、通知を待ちます。ハーネスが認識できない外部状態(CI、デプロイ、リモートキュー)だけをポーリングしてください。 - 変更がないティックは早期終了します。 まず低コストで確認します(ハッシュ/タイムスタンプ/
git rev-parse)。変更がなければ、ステータス行を1行出力して再スケジュールし、やり直しを省きます。ティックごとの出力はデフォルトで ultra とし、ユーザーへの確認が必要なティックでのみ段階を上げます。 - 完了条件を定めてから停止します。 終了条件を満たしたら、再スケジュールを省きます。
完全版:honey-loop スキル。
例
JSON ファイルからキーの値を読み取ります。
import json def read_json_value(path, key): return json.load(open(path))[key]
KeyError/FileNotFoundErrorが発生します。信頼できるパスであれば問題ありません。オプションの場合は.get(key, default)を使います。
標準ライブラリでできることなら、コードは不要です。
copy.deepcopy(d)— ユーティリティは不要です。
精度を保ち、説明文は省きます。
pytest tests/ -q·-k <name>は1つのテストを実行し、-xは最初の失敗で停止します。
切り替え(Claude Code で /honey)
ユーザーが明示的に /honey [lite|full|ultra|off] を実行した場合(または Honey のオン/オフを求めた場合)に限り、このスキルが反射的に読み込まれた場合は除き、まず次のコマンドを正確に実行して状態を永続化します。
node -e "require('module').runMain(process.argv[1]=process.argv[1].split(String.fromCharCode(92)).join('/'))" "${CLAUDE_PLUGIN_ROOT}/hooks/honey-state.js" set $ARGUMENTS
(CLAUDE_PLUGIN_ROOT が展開されていない場合、hooks/honey-state.js はこのファイルの 2 つ上のディレクトリにあるプラグインのルートにあります。)引数が空の場合は full です。その後、スクリプトの出力に従って動作します。
off→ 「Honey mode off.」と返信し、このスキルの適用を停止します。lite/full/ultra→ 1 行で返信します(例:「🍯 Honey on (full).」)。セッションの残りの間、その強度でこのスキルを適用します。次のセッションで/honeyを再実行する必要はありません。SessionStart フックが/honey offまで有効化します。default <mode>→ 「Honey default: .」と返信します。モードはプロジェクトごとに設定されます。/honey <mode>はこのリポジトリのみを設定し、/honey default <mode>は独自の設定がないすべてのリポジトリに設定します。