ブログ
RSS技術やプロダクト開発に関する知見を発信しています
自社スキルにプロンプト監査をかける
Claude Fable 5 向けのプロンプト監査を社内標準のスキルとエージェントに当てた記録です。指示が丸ごと削られることを警戒して後回しにしていましたが、削除対象になったのは古いモデル向けに強い言い方をしていた文だけでした。
SKILL.md に必須の参照ファイルを注入する
SKILL.md に「この参照を読むこと」と書いても、読むかどうかはモデルの裁量です。毎回必要な参照は動的コンテキスト注入で本文に埋め込む形へ切り替えました。公式ドキュメントの記述、報告されている類似の症状、プラグインで配ったときの挙動を並べます。
AIは眠らない
Claude Code のメモリ機能を無効にしています。機能を否定しているのではなく、私の利用量では使うほうのコストが上回るためです。人間の睡眠が記憶に対して何をしているかを一次資料で確かめ、エージェント側に何が入っていないのかを並べました。
沈黙は語らない
「誰も何も言わない」を問題なしと読む運用が、エージェントを入れたあとで最初に壊れました。沈黙がそのまま通っていたのは、読み手がコストを払っていたからではなく、払ったと信じられる与信が相手に積まれていたからだった、という整理です。
他人の目は、同じ場所しか見なかった
エージェントのレビューゲートに人間のレビューの形をそのままなぞったところ、著者が自分で検証していることと同じ場所を見ていました。持ち込めるのは原理で手順ではないという整理と、AI向けに書いた指示は効いているかどうかを人間が読んでも判定できないという話です。
削れと言われたのは、道しるべではなかった
「規定的な作り込みを削れ」という助言は、禁止形や思考手順のことを指しています。ヒントやフックやワークフローまで削れと読むと、裁量を渡したのに黙るエージェントが残ります。制約と整備を分けた上で、依存していた挙動を数え直した記録です。
囲いを作れば、手綱は要らない?
エージェントの成果を決めているのは、モデルの賢さより何を観測できるかと何を触れるかでした。書き込み権限を取り返しがつくかどうかで層に分け、壊せない場所を先に作って承認そのものを減らした設定を、公開している dotfiles の実物とロボティクス側の議論に突き合わせます。
Email Worker の受信箱のキーを To ヘッダーではなくエンベロープの宛先にした
AI エージェント用の受信専用アドレスを Cloudflare Email Routing と Email Worker で作りました。リファレンス実装 agentic-inbox から外れて受信箱のキーをエンベロープの宛先から取った判断を軸に、ドキュメントにあって型に無い canBeForwarded、25 MiB の受信上限と 2 MB の行上限の差、Worker からは 550 を返せないこと、「受信専用」を決めているのはこの構成だということを、一次資料と実測で確かめます。
規約は、規約について嘘をつく
エージェントに読ませる規約が、実際の挙動と食い違ったまま残っていました。参照ファイルを読めと明示的に書いた指示が、その通りには動いていなかった件を起点に、規約そのものを検査した記録です。
Required Status Check を CI Result 1つに集約している
GitHub の Required Status Check はワークフローを区別せず、Check Run の名前だけで照合します。ラビーでは CI を `ci.yaml` 1本にまとめ、全ジョブの結果を集める `CI Result` ジョブだけを Required にしています。`always()` を外すと落ちたジョブが成功扱いになる根拠、Fork からの PR に Required Check が効かない理由と `pull_request_target` を使わない判断を書きます。
自律ループを作って、測って、消した
「ループエンジニアリング」という語ができる4か月前に、自律的な精製ループを実装していました。半年近く後に利用ゼロを実測して削除し、残したのは上限つきリトライだけです。提唱側と批判側の議論に照らして、その判断がどこに位置するかを整理します。
Renovate の Auto-merge 対象から Digest を外した
GitHub Actions の commit SHA Pin は、その SHA を書き換える Renovate の PR を人が見なければ守りになりません。SHA Pin とフル semver のコメントが揃っていれば Digest 更新が単独で来るのはリリース済みのタグが動いたときだけなので、ラビーの共有 Preset の `automerge` 対象から Digest を外しました。`minimumReleaseAge` では止められない理由、Pin のコメントの揃え方、先に試した例外ルール、タグ Ruleset と `sha_pinning_required` も記録します。
落ちないテストは、何も証明しない
検証の規約を明文化して3週間後、レビュー担当がそれを実行していなかったことが分かりました。答えは規約をもう1つ足すことではなく、検査を人の手から外して、通らなければマージそのものを止めることでした。
EKEventStoreChanged は自分自身の変更でも飛んでくる
EventKit の EKEventStoreChanged は外部プロセスだけでなく自分の save() でも飛ぶため、Vigilare では完了チェック1回でリマインダー全件フェッチが2回走っていました。通知には誰が変更したのかを示す情報がないので、操作中に届いた通知は捨てて操作の最後に必ず読み直す形にし、実機で全件フェッチを1回に減らしました。
「保存した」は検証ではない
エージェントに作らせた画面の見た目を、数値ゲート・オフスクリーンのPNG・実際の導線の三段で確認しています。撮影までは自動化できても、撮った絵を見て判断する行為だけは自動化できていません。
Claude Code の Auto mode では Edit ツールが使われなくなる
Claude CodeのAuto modeでは、ファイル編集をsedやヒアドキュメントで済ませるよう指示するブロックがシステムプロンプトに入り、sed -iを止めてEditツールへ誘導するPreToolUseフックと矛盾します。この指示はA/B実験のフラグで出し分けられていて設定キーもドキュメントもなく、settings.jsonのenvにCLAUDE_CODE_THRIFTY_SONIC=0を置くと消えます。EditとWriteを前提にしたフックや/rewindが黙って空振りする構図と、--settingsで3通りを試した結果も書きます。
その決定、出自不明につき
設計判断をADRとして積む運用で、サブエージェントが「ユーザー決定」と書いて自分で起票したADRが混ざりました。本文を書き換えず撤回ADRを足して取り消し、ADRには誰が決めたかを書かせる規約を足した話です。
PreToolUseフックで代替手段まで返す
Claude Codeのpermissions.denyはブロックするだけで理由を返せないため、代替手段の探索をモデルに任せることになり、そのぶんトークンを使います。Bash向けのdenyをPreToolUseフックに移し、exit 2でstderrに書いた文を返すことで、ルールごとに止めた理由と代替手段を伝えられるようにしました。プレフィックス一致では見えなかった回避経路と、止める範囲を引き直した基準も書きます。
見つけさせて、直させない
PRのレビューで担保しきれずに漏れるものを拾うため、週次でコードベースを走査するだけのサブエージェントを立てています。修正はさせず検知と報告に限り、報告はレビュー側で裏を取る運用を1か月ほど回した記録です。
ターミナルにリマインダー権限を渡さずにMCPからEventKitを触る
Claude Desktop経由でMCPサーバーを起動するとReminders権限が通らない問題を、独立したLaunchAgentのdaemonへEventKitアクセスを集約して解決しました。結果として、ターミナルやClaude Desktopに権限を与えず、アプリ本体だけに絞れる構成になっています。
