概要
- AIチャットボットが単なる履歴書の言い換えに留まらず、実際のリポジトリやCI設定を参照して具体的な回答を提供できる仕組み
- 公開用エージェント(nullclaw)と非公開エージェント(ironclaw)を分離し、セキュリティとプライバシーを強化
- IRCプロトコルと自前インフラによる完全なコントロールと拡張性
- モデル選定やコスト管理、セキュリティ対策の徹底
- Agent-to-Agent通信やA2Aプロトコルの工夫による柔軟な連携
「Ask My Resume」の問題点
- 従来のAIチャットボット は履歴書の内容を単に再表現するだけの仕組み
- 実際のコードやCI設定 を参照せず、表面的な回答に終始
- 具体的な質問 (例:「テストカバレッジはどう管理しているか」)に対し、実証的な根拠を示すことができない
- 本質的な情報提供 の実現が課題
独自アーキテクチャの構築
- 2つのエージェント (nullclawとironclaw)、2台のサーバ、2つのセキュリティ境界による分離設計
- nullclaw :公開用エージェント。最小構成(678 KB Zigバイナリ、1 MB RAM)で動作
- 公開GitHubリポジトリの参照
- ポートフォリオ文脈の事前ロード
- IRC経由でironclawへルーティング
- ironclaw :非公開エージェント。Tailscale経由で接続
- メールやカレンダーなどプライベート情報へのアクセス
- 複雑なリクエストへの対応
- セキュリティ境界 :公開サーバはプライベートデータへ一切アクセス不可
なぜIRCなのか
- UIとの親和性 :ポートフォリオサイトのターミナルUIとマッチ
- インフラ全体の所有 :サーバ・クライアント・エージェントすべて自前運用
- プロトコルのシンプルさ・堅牢性 :30年以上の歴史、ベンダーロックインなし
- 柔軟な運用 :Webクライアントからも、irssi等のターミナルクライアントからも利用可能
モデル選定とコスト管理
- 会話層 :Haiku 4.5(高速・低コスト、サブ秒レスポンス)
- ツール利用層 :Sonnet 4.6(必要時のみ推論コスト発生)
- コスト上限 :$2/日(乱用・暴走対策のためのハードキャップ)
- モデル理解のシグナル :必要最小限のモデルで対応、重い推論は必要時のみ
セキュリティポリシー
- SSH :非rootユーザー、鍵認証、非標準ポート、rootログイン無効
- ファイアウォール :SSH、IRC(TLS)、HTTPS(WebSocket経由)のみ開放
- Cloudflareプロキシ :直接アクセス遮断、TLS終端・レート制限・Bot対策
- エージェントのサンドボックス化 :ワークスペース限定、コマンド許可リスト、1時間あたり10アクション制限
- コスト・監査 :$2/日・$30/月キャップ、全ツール利用のログ取得
- 自動アップデートとTLS証明書自動更新
- 攻撃面最小化 :2サービス(ergo, nullclaw)のみ、Webコンテンツ直接配信なし、プライベートデータ非保持
コミュニケーションスタック
- Ergo :IRCサーバ。Go製、2.7 MB RAM
- gamja :Web IRCクライアント。152 KB、Cloudflare配信
- nullclaw :AIエージェント。4 MB Zigバイナリ、1 MB RAM
- 全体フットプリント :バイナリ合計10 MB未満、アイドル時RAM 5 MB未満
- 最小構成のVPSで運用可能
nully(nullclaw)ができること
- 言語・技術スタックの把握 :履歴書ではなく、事前文脈+リポジトリ実査
- テスト構成の調査 :リポジトリをクローンし、テストファイルを解析
- プロジェクト詳細の提示 :事前記憶+ソース調査で具体的な説明
- 連絡先情報の提供 :正確な情報のみ、架空情報は出力しない
- スケジュール調整依頼 :GoogleのA2Aプロトコル経由でironclawへ連携、結果だけを返却
- 単なるチャットボットに留まらず、実コードによる裏付けを持つ応答
A2A実装の詳細
- Google A2Aプロトコルv0.3.0対応 :エージェントカード発見、JSON-RPCディスパッチ、タスク状態管理
- 独自クライアント実装 :a2a_callツールでリモートエージェントにリクエスト送信、結果をツール出力として返却
- セキュリティ設計 :公開エンドポイントはHTTPS必須、プライベートネットワークやTailscale範囲のみHTTP許可
- ironclaw側の工夫 :APIキーはironclawのみ保持、nullclawは推論パイプラインをゲートウェイ経由で借用
- APIキー・課金の一元化 :どちらのエージェントからリクエストが始まっても、支払いはironclaw側で統一
A2A連携のセキュリティ
- A2AエンドポイントはTailscale内のみ公開、外部アクセス不可
- nullclawのガードレール :特定リクエストのみironclawへルーティング(例:スケジューリング、連絡先取得)
- 任意の指示は拒否 :「ironclawにXをさせて」のような命令は通さない
- 両エージェントのサンドボックス化 :ファイルアクセス・コマンド制限
- エスカレーション判断はnullyが実施
学びと哲学
- モデル選定はシステム設計の一部 :コスト・レイテンシ・能力・UXすべてに影響
- エージェント本体より通信・セキュリティ・インフラ整備に工数がかかる
- IRCの再評価 :SDKやAPIバージョン管理不要、シンプルなメッセージ通信
- nullclawとironclawの分離がセキュリティモデルの根幹
- A2Aプロトコルで構造化・監査性を担保しつつ、IRCでリアルタイム監視・介入が可能
- APIキーや認証情報の一元管理で漏洩・乱用リスクを最小化
体験方法
- https://georgelarson.me/chat/ でWebチャット
- IRCクライアント では irc.georgelarson.me:6697(TLS)、#lobby チャンネルに接続
技術スタック総括
- 公開エージェント(nullclaw) :678 KB Zigバイナリ、~1 MB RAM、Ergo IRCサーバと連携
- 非公開エージェント(ironclaw) :メール・スケジューリング担当、Tailscale経由でA2Aプロトコル利用
- 推論層の階層化 :会話はHaiku 4.5(高速・低コスト)、ツール利用時のみSonnet 4.6
- コスト上限 :$2/日
- A2Aパススルー設計 :APIキー・課金はironclawに一元化
- nullyとの対話 :Web(georgelarson.me/chat/)またはIRCクライアント(irc.georgelarson.me:6697、#lobby)