この記事が良かったら
RYO ITABASHI さんへの応援になります

自律エージェントに人格と学習力を持たせ、権限モデルをもう一段閉じた2ヶ月の開発記録
この記事が良かったら
RYO ITABASHI さんへの応援になります
前回、Tsukuttaに公開したShellyの説明では、自律エージェントの話を中心に書きました。自然文で登録すると Android の AlarmManager が画面オフのまま起こしてくれること、前回の実行結果を覚える実行メモリとスキル学習、無人実行のときだけツールを Codex とローカル LLM に絞る安全設計について紹介しました。
v7.0.0 が「エージェントが自分で動き出した」だとすれば、v8.0.0 は「エージェントに人格と学習力を持たせた」2ヶ月です。
v7.0.0 のタグが 2026-06-27、v8.0.0 が 08-31。2 ヶ月ちょっとで 825 コミット、うち feat が 158。全部は書ききれないので、要点に絞って紹介します。
https://github.com/RYOITABASHI/Shelly
v7.0.0 までの AI ペインは、プロバイダを切り替えるたびに会話が別人になっていました。Gemini で話していた続きを Groq に切り替えても、Groq は何も知りません。
v8.0.0 では、デフォルトの AI ペインがひとりの Shelly として一貫して振る舞うようになりました。返信ごとにプロバイダ名のタグが付くこともありません。裏で実際に答えているプロバイダはペインのヘッダーに出るだけで、会話そのものは Shelly という一人称を保ったまま、プロバイダを切り替えても短い引き継ぎ情報と一緒に続いていきます。
会話は切り替えるたびに自動で companion journal に要約されます。その日の会話が _companion スコープのメモリノートになる。確認は要りません、端末内だけで完結します。Settings → Companion Memory から一覧・編集・削除できます。
Settings 自体も、companion 向けと developer 向けに分けました。Tasks / Skills はデフォルトで開いたまま、開発者向けのセクションは Developer という一行の下にまとめて畳んであります。「使う人」と「作る人」で画面を分けました。
v7.0.0 でエージェントに実行メモリとスキルが入った話を書きましたが、あれはまだ「覚えるだけ」でした。v8.0.0 では、覚えたあとどうするかまで踏み込みました。
スキルの自己改善です。失敗したあとに成功したケースがあれば、その教訓をスキル本体に確定的に反映します。人が見ている実行では確認を求め、無人実行では自動適用したうえでワンタップの取り消しを残す。スキル本文を LLM に丸ごと書き直させたりはしません。教訓を1行足すだけの、機械的な処理です。
これとペアで、保守的なスキルキュレーターも入りました。重複したスキルのマージ提案、昇格、アーカイブ。人間の承認なしに黙って統廃合することはありません。スキルカタログ自体も、インポートできるレシピが 4 個から 21 個に増えました。
記憶の呼び出しにも手を入れました。BM25 とタイムディケイのスコアリング、そしてローカルに embedding 対応モデルが動いていれば、それによる再ランキングまで一通り通しています。
もう一つ、エージェント間の共有メモリも入りましたが、ここだけは明示的な自然文トリガーと確認ゲートを必須にしました。全エージェントの前提を書き換える操作を、暗黙に走らせたくなかったからです。
前回、無人実行はあえて不自由にする、という方針を紹介しました。v8.0.0 ではこの方針をさらに進め、無人実行だけでなく、人が見ている実行のデフォルトも閉じました。
draft / notify / webhook / cli / intent / dm-reply、これらのアクションは、デフォルトが自動承認から手動レビュー必須に反転しました。「Runtime Review」のタップを、人が見ている実行でも標準で挟むようにしています。自動承認に戻すには Settings で明示的に選び直す必要があります。
例外は一つだけ作りました。ローカルの agent-output ワークスペースへの draft 書き込みだけは、楽観的に実行できます(自動セーブポイント → 実行 → 結果に「元に戻す」ワンタップ)。書き込み先を、明示的に元へ戻せる場所だけに絞っているからです。オプトインで、デフォルトは OFF のままです。
シェルコマンド、webhook、SNS 投稿、返信 —— これらは今も、無人実行でも人が見ている実行でも、人間のタップを待ちます。
- AI → Terminal Insert: AI チャットの返信に出てきた ``` `bash ``` ブロックに Insert ボタンが付きました。タップすればフォーカス中のターミナルペインの入力行にそのまま入ります(Enter は自動で押しません)。ターミナルが開いていなければ新しく開いて挿入をキューします。
Widget No-Confirm Register、デフォルト OFF)が付きました。指標v7.0.0v8.0.0コミット数(v7.0.0 以降)—825うち feat コミット—158テストファイル数40255(約6.4倍)スキルカタログの数—4 → 21デフォルトのアクション承認自動承認手動レビュー必須(反転)エージェントの永続記憶実行メモリ + スキル+ 自己改善 + 共有メモリ + BM25/embedding再ランク
この2ヶ月は、"Track A" から "Track HH"(アルファベットを一周して、さらにもう一周)まで、小さく切った検証単位を積み上げ、最後に3つの並列 squad ブランチをマージして締める、という進め方でした。1つの機能を大きく作り込んでから通しでレビューするのではなく、切り分けた単位ごとに確定させていくスタイルに、この2ヶ月で寄っていきました。
非エンジニアが日本語で問題を伝え、AIエージェントに調査・実装・レビューをさせてリリースする、というShellyの開発スタイル自体は変わっていません。この2ヶ月もCHANGELOG.mdの更新はリアルタイムでは追いつかず、エージェントの開発速度に人間側のログ運用が追いついていない状態が続いています。
うまくいった話ばかりではありません。2026-08-29、app.act という機能を実装しました。Android の Accessibility Service を使って、Shelly の外にある他アプリ(LINE でのメッセージ送信、X への投稿の2つだけに絞り)の画面を読み、タップし、文字を打つ機能です。Fable5 と Codex、両方の独立レビューを通し、P0 は見つかりませんでした。
ところが実機で実際に触ってみたところ、レシピ収録 UI で Shelly 自身の「Capture」ボタンをタップすると、Accessibility Service が対象アプリの画面を読み取るより先に、Android のフォアグラウンドウィンドウのフォーカスが Shelly 自身に移ってしまうという、直しようのないバグが見つかりました。ほかにも構造的なバグが同時に2つ出ており、08-31、実装からわずか2日後にこの機能を完全に撤去しています。
2つの独立レビューを通ったコードが、実機のたった1セッションで詰みました。SNS への配信自体は既存の配信コネクタ経由で今も可能です。エージェントに他アプリの画面を直接操作させる、という体の与え方だけをやめました。作って、実機で試して、ダメならすぐ引っ込める。このサイクルが2ヶ月で自然に回るようになったのも、今回の変化のひとつです。
APK: GitHub Releases(android-latest)
License: GPLv3