却下ログは「学習信号」だった — 自己進化ハーネスが strategy.md に書けない暗黙知を拾う仕組み
先週、私が運用しているハーネスから出てきた提案を、私は却下しました。ボタンを押した瞬間に頭をよぎったのは「これでこの提案はなかったことになる」という、いかにも妥当そうな理解でした。その理解は間違っていました。却下は消去ではありません。却下は、ハーネスにとって一番おいしい餌でした。私はそのとき、ふてくされた顔をしているのは却下されたハーネスのほうだと思い込んでいましたが、実際にデータを残しているのは私のほうで、私の却下理由を翌週せっせと読み返して賢くなっていたのもハーネスのほうでした。
この話は、kenimoto.dev のコンテンツ自動生成パイプライン、つまりこの記事自体を生み出している仕組みの、4層目の内部構造です。
最初に、似ているけれど違う話を3つ切り分けておきます。私は前に「他のエージェントを監査する4層目を足したら、Strategist が3週サボっていたのが見つかった」という記事を書きました。あれは監査役が怠慢を検出する話です。昨日は「賢いモデルが来るほどハーネスは捨てる設計になる」という記事を出しました。あれはモデルの進化で足場が不要になる時間軸の話です。Zenn では「ハーネスを別環境に移植したら全壊した」という話も書きました。あれは移植性と環境依存の話です。今日の主題はそのどれでもありません。人間が押した「却下」という行為そのものを、次サイクルの学習信号として取り込む構造の話をします。拒否が報酬になる、という一点に絞ります。

却下しても提案は消えない
私のハーネスには Evolver という層があります。strategy.md という戦略ルールのファイルや記事テンプレ自体の書き換えを提案してくる、自己進化の担当です。Observer や Strategist が strategy.md に従って動くのに対して、この層は strategy.md そのものに手を入れようとします。
提案が出ると、承認か却下のどちらでも domains/<name>/data/evolution/EVO-NNNN.md というファイルが残ります。フィールドはこんな構造です。
id: EVO-0003
domain: devto
status: approved # approved / rejected / reverted / muted のいずれか
reason_if_rejected: "" # 却下したときだけ私が1行書く
承認すると status: approved が記録され、diff が strategy.md に当たります。却下すると status: rejected と reason_if_rejected の1行が残るだけで、strategy.md は1文字も変わりません。
ここまでなら、却下は普通のゴミ箱行きに見えます。提案が一つ却下フォルダに入り、戦略ファイルは無傷のまま。私もそう思っていました。提案を出してきたハーネスのほうが、却下されてしょんぼりしている図を勝手に想像していたくらいです。
翌週、ハーネスは却下フォルダを全部読む
ところが翌週、Evolver は走行する前に過去の却下ログを全件読みます。reason_if_rejected の1行も含めて、です。
仮に私が EVO-0003 を却下して、理由欄にこう書いたとします。
reason_if_rejected: "MCP はまだ書籍販売の主力ジャンルなので落とせない"
この1行は、ただのメモではありません。翌週の Evolver はこれを読んで、自分の判断を調整します。「MCP 系テーマを優先から外す」提案、「MCP の撤退基準を厳しくする」提案、「MCP 系記事の公開頻度を下げる」提案。こうした同趣旨の案を、出さないように手前で引っ込めます。
つまり strategy.md には書いていない私の事業判断が、却下ログ1行を介してハーネスの暗黙ルールに染み込んでいきます。私は戦略ファイルを編集していません。却下ボタンを押して、理由を1行書いただけです。それだけで翌週の提案分布が変わる。しょんぼりしていると思っていた相手は、私の不機嫌を観察データとして淡々と記録していました。
拒否されるたびに賢くなっていた
ここで私は、自分の見立てがちょうど裏返っていたことに気づきます。
却下とは、提案を捨てる行為だと思っていました。実際には、提案を捨てる代わりに、私の頭の中にある事業文脈を1行ずつ外に取り出す行為でした。strategy.md を完璧に書ききるのは現実には無理です。私が持っている事業の前提を全部文章にしたら、たぶん100ページを超えます。書ききれないまま運用していて、書き忘れた文脈のほうが圧倒的に多い。その書き忘れを、却下という行為が事後的に1行ずつ掘り出していく構造になっていました。
古典的な強化学習でいう報酬信号に、構造はよく似ています。エージェントが行動し、環境から信号が返り、次の行動が調整されます。違うのは信号の形式です。スカラー値の報酬ではなく、1行の自然言語の理由が信号になっています。「MCP は落とせない」という日本語の1文が、翌週の提案空間を狭める報酬として効いているわけです。私はてっきり自分が審査員のつもりでいましたが、審査の一つ一つが教師データとして回収されていたわけで、賢くなっていたのは却下された側でした。
human-in-the-loop の文脈でも、この発想は2026年の定番になりつつあります。人間の修正・却下・上書きをすべて訓練データとして捕捉し、カテゴリ分けして次バージョンの評価に回す、という設計が複数のチームから報告されています(Maxim AI / AlignX AI)。私のハーネスが特殊なのは信号がスカラーではなく1行の理由文だという点だけで、根っこの発想は同じ流れの上にあります。
同趣旨3回で、ハーネスは口を閉じる
報酬信号を取り込むと言うと、いつまでも同じ提案を出し続ける暴走を心配したくなります。ここに歯止めがあります。
evolver.mute_after_consecutive_rejects: 3 という設定です。同趣旨の提案が3週連続で却下されたら、その提案類型は自動 mute されます。4回目を出すこと自体が禁止されます。私が同じ理由を3回書いた時点で、ハーネスはその話題について口を閉じます。
これは2026年のエージェント設計でいう rate limiting やランナウェイ防止の一種です。最大反復回数、無進捗検出、トークン予算といったハード制約で暴走ループを止める、という defense in depth の発想が標準になっています(Atlan / Maxim AI)。私の場合は「人間が同じ却下を3回繰り返した」を無進捗のサインとして扱い、提案類型ごとに自動でミュートをかけています。学習信号を貪欲に拾う仕組みと、拾いすぎを止める仕組みが対になっている、という形です。
EVO-0003 は、実際には承認した
ここまで却下の話をしてきましたが、実在の EVO-0003 を、私は承認しました。
提案の中身は、devto の撤退基準を Reaction 率単独から Engagement 率(Reaction + Comment)へ拡張し、Strategist に毎週この式を計算する義務を追加する、というものでした。承認の決め手は「観察で対応可能」という一点でした。
式を変えると Comment ゼロの記事が撤退候補に入ります。Comment は受動的に伸びにくいので、過剰に撤退してしまうリスクがあります。それでも承認できたのは、もし過剰撤退が起きても翌週の Evolver が逆方向の提案を出してくる経路があるからです。観察結果を踏まえて軌道修正が入る。その安心感が承認を後押ししました。
この安心感が、今日の主題と同じ仕組みの上に乗っていることに注目してください。逆提案が出てくる経路とは、却下ログ学習の経路そのものです。私が過剰撤退を見て不機嫌になり、却下理由を1行書けば、翌週それが信号として効く。承認の判断さえ、拒否が報酬になるこの構造を前提にして成り立っていました。
短く言うと
却下は提案の消去ではなく、私の暗黙知を1行ずつ外に取り出す回収装置でした。reason_if_rejected の1行が翌週の提案分布を変え、同趣旨3回で自動 mute がかかって暴走を止めます。明示的に strategy.md へ書き込む経路と、却下を通じて事後的に推論される経路。この二重構造で、ハーネスは私が言語化しきれていない事業文脈を少しずつ覚えていきます。
しょんぼりしているのは却下されたハーネスのほうだと、私はずっと思っていました。実際は逆でした。私が却下するたびに相手は1行賢くなり、私のほうは「また同じ理由を書いている」という事実を3回目に突きつけられて口を塞がれます。報酬を受け取っていたのは、最後まで向こうでした。
この記事は役に立ちましたか?