OSネイティブ知覚とプロアクティブケア
あなたのAI社員は、このマシンでのあなたの働き方に気づきます——あなたが指定したものだけを見て、集計だけを記憶し、割り込む価値があるときだけ声をかけます。
オプトインのセンシングレイヤー(v1.42–1.46)で、指定されたエージェントがローカルOSのアクティビティ——選んだフォルダ内のファイル変更と、どのアプリが前面にあるか——を知覚し、3つの方法で行動できるようにします:
- 自動化 — OSイベントは既存のautopilotルールエンジン(
os_file/os_frontmostイベント)に供給され、OSページにはワンクリックテンプレートがあります。 - 記憶 — 日次の蒸留が、生のイベントストリームをユーザーの働き方に関する少数のtemporal-memoryファクトに変換します。
- ケア — 毎時のプロアクティブチェックがその日のアプリ使用サマリーを読み、直近の会話へ短く有用なメッセージを1通送ることがあります。
すべてデフォルトでオフです。各レイヤーはagent.toml内の独立したスイッチです。
センシングレイヤー
Section titled “センシングレイヤー”ファイルシステム監視(os_events.rs):[capabilities] os_native = trueかつ空でない[os_watch] pathsリストを持つエージェントは、エージェントごとにデバウンス+レート制限付きのウォッチャー(debounce_ms、max_events_per_min)を得ます。イベントは、autopilotエンジンがすでに消費しているのと同じブロードキャストバスに流れます。ウォッチャーはホットリロード対応です:agents.update経由で[os_watch]を編集すると、そのエージェントのウォッチャーがその場で停止/起動し、ゲートウェイの再起動は不要です。エージェントごとのカウンターは、os_watch_status MCPツールのために<home>/os_watch_stats.jsonへ永続化されます。
前面アプリのポーリング(os_frontmost.rs):正の[os_watch] frontmost_poll_secsは低頻度のポーリングループを起動します。イベントは前面のアプリまたはウィンドウが実際に変化したときにのみ発行されます——アイドルなデスクトップは何も生みません。アプリ切り替えごとに1行の{"ts","app"}が日次JSONLログ(<home>/os/<agent>/frontmost-<date>.jsonl)へ追記され、今日と昨日のファイルだけが保持されます。ポーラーは純粋なセンシングソースです:アイドル状態を計算することは決してありません(それはハートビートパスの担当のままです)。
データ最小化
Section titled “データ最小化”プライバシールールは、書き込み時だけでなく収集時に強制されます:
- ウィンドウタイトルは決してディスクに書き込まれません。 日次ログはアプリ名+タイムスタンプのみ——ケアサマリーが必要とする最小限——を保存します。
- ファイル名はイベントの外に出ません。 フットプリント集計は、他の何をするより先にすべてのパスをその親ディレクトリに縮約するため、最もリスクの高い部分文字列(
quarterly-layoffs-draft.docx)はソースの時点で捨てられます。 - 知覚されたすべての文字列は、プロンプト・集計キー・記憶に入る前に知覚サニタイザー(
sanitize_perception_text)を通過します——すべてのOSセンシングパスが共有する境界です。 - オプトインしていないエージェントは決して追跡されません。 フットプリントフラグのないエージェントは、永続化時にスキップされるだけでなく、そもそもメモリ内トラッキングマップに追加されません。
フットプリント → Temporal Memory
Section titled “フットプリント → Temporal Memory”footprint_distill.rsは同じイベントバスを購読し、エージェントごと・UTC日ごとに集計します:前面アプリの秒数、アクティブディレクトリのカウント、時間帯別アクティビティヒストグラム。1日に1回(追跡している日が翌日へ繰り越されたとき)、終わった日をstore_temporal経由で最大3つの決定論的な(subject="user", predicate, object)トリプルに蒸留します——書き込みレートはO(agents × days)であり、イベントごとに1行になることは決してありません。既存の置き換え(supersession)チェーンが昨日のdaily_active_appファクトを自動的にクローズし、Ebbinghausの想起可能性が、繰り返し思い出されるものを上位にランクします。
重要なディテール:
- オプトインは
[os_watch] footprint = trueで、os_nativeの上に重ねられます——ファイルシステム監視だけではフットプリント記憶は付与されません。 - バケットは蒸留ティックごとに
<home>/os/<agent>/footprint-aggregate.jsonへスナップショットされます(アトミックなtmp+rename)。再起動で失うのは最大1チェック間隔分であり、1日全体ではありません。 - すべての書き込みには
origin = "agent_derived"(v1.41の書き込み時origin bindingに従い、信頼上限0.6)が刻印され、機密ラベルが付きます:daily_active_app/active_hours→ Personal、active_directory→ Internal。
プロアクティブケア
Section titled “プロアクティブケア”ハートビートスケジューラーは、各エージェントのスケジュールに従ってプロアクティブチェックを実行します:
check due? → quiet hours? skip → rate limit? skip → call Claude with the check prompt + MCP tools → response contains PROACTIVE_OK → discard silently → otherwise → send to the notify target- 組み込みデフォルトチェック:手書きの
PROACTIVE.mdを持たないos_nativeエージェントは、保守的な組み込みのDEFAULT_OS_CARE_CHECKSを使います(「2時間ぶっ通しで作業→休憩を提案。23:00を過ぎてもまだ作業中→短い声かけを1回。会議が支配的→TODOの整理を申し出る」)。デフォルトの答えはPROACTIVE_OK——ノイズより沈黙です。以前は、PROACTIVE.mdがないとチェックが黙ってスキップされたため、エージェントは1日分のデータを集めながら一度も行動しませんでした。 - OSコンテキスト:
frontmost_daily_summaryは日次JSONLログを読み、ランク付きのアプリ時間サマリーを生成します(30分超のギャップは「離席」と扱い、1分未満のアプリは除外、上位6件を保持、アプリ名はサニタイズ)。アプリ名と時間のみで、ウィンドウの内容は決して含まれません。 - 静音時間+レート制限:タイムゾーン対応の静音時間(深夜をまたげます)と、スライディングウィンドウの時間あたりメッセージ上限。
- 通知先フォールバック:明示的なターゲットがない場合、メッセージは
sessions.dbにあるエージェントの直近のプッシュ可能なチャネル会話へ送られます(Discord/Telegram/LINE/Slack/WhatsApp/Feishu/Google Chat/Teams——WebChatはプル専用のため除外)。
プロアクティブゲート
Section titled “プロアクティブゲート”ルール駆動の割り込みには、別途LLMスコアリングのゲート(proactive_gate.rs)があり、新しいautopilotアクションproactive_notifyとして実装されました——決定論的なnotifyルールは手つかずのまま、これまで通り正確に発火します。フロー(ContextAgentスタイルのプロアクティブスコアリング):
- すべてのイベントテキストをサニタイズし、ペルソナのコンテキストと現在の割り込み可能度スコアを含むスコアリングプロンプトを構築します。
- 1回のユーティリティLLM呼び出しが
proactive_score ∈ 1..=5を返します。 - 動的しきい値
base + round(interruptibility × 2)——ユーザーが忙しいほど、ハードルは上がります。 - スコア ≥ しきい値 → 許可。それ以外——LLMエラー、パース失敗、タイムアウトを含む——は抑制(フェイルクローズ:不確実なときは決して割り込まない)。
デフォルトのベースしきい値は3、デフォルト上限はエージェントごとにローリング1時間あたりプロアクティブ通知4件。すべての決定は<home>/proactive_gate.jsonlへ監査行を1行書き込みます。
ワンクリックテンプレート
Section titled “ワンクリックテンプレート”OSルールの作成には、以前はイベント名と条件JSONを手で知っている必要がありました——だから誰もやりませんでした。OSページには現在、テンプレートカード(OsAutomationTemplates.tsx)が用意されています:ファイルテンプレート(「このフォルダに何かが着地したら行動する」——os.settings.update経由で監視パスの追記も行います)と、アプリテンプレート(「このアプリが前面に来たら、このチャネルでリマインドする」)。それぞれ小さなフォームに記入すると、通常のautopilot.create RPCを通して本物のautopilotルールが作成されます——手書きのルールと同じく、サーバー側で検証され、サーキットブレーカーで保護されます。
オプトインスイッチとエディションクォータ
Section titled “オプトインスイッチとエディションクォータ”| レイヤー | スイッチ | デフォルト |
|---|---|---|
| OSネイティブシート | [capabilities] os_native = true |
オフ |
| ファイルシステム監視 | [os_watch] paths = [...] |
空(何も監視しない) |
| 前面アプリポーリング | [os_watch] frontmost_poll_secs |
0 / 未設定(ポーリングなし) |
| フットプリント記憶 | [os_watch] footprint = true |
オフ |
| プロアクティブゲート | [proactive] enabled = true |
オフ |
エディションのゲーティングは能力ロックではなくクォータロックです:PersonalエディションはOSネイティブエージェントをちょうど1つ許可し、有料ティアは無制限です。どのエディションでも機能が削除されたり劣化したりすることはありません——同時にOSを知覚できるシート数だけが異なります。