<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Claude Code on Claude Code 始めました</title><link>https://kitepon-rgb.github.io/WebAICoding/tags/claude-code/</link><description>Recent content in Claude Code on Claude Code 始めました</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sat, 18 Apr 2026 12:00:00 +0900</lastBuildDate><atom:link href="https://kitepon-rgb.github.io/WebAICoding/tags/claude-code/index.xml" rel="self" type="application/rss+xml"/><item><title>Throughline を npm に公開した — Claude CodeのツールI/OをSQLiteに退避するhook</title><link>https://kitepon-rgb.github.io/WebAICoding/post/throughline-release/</link><pubDate>Sat, 18 Apr 2026 12:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/throughline-release/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kitepon-rgb/Throughline"&gt;Throughline&lt;/a&gt; っていうClaude Code用のhookプラグインをnpmに公開した。&lt;/p&gt;
&lt;h2 id="何をするか"&gt;何をするか&lt;/h2&gt;
&lt;p&gt;Claude Codeのセッションで、コンテキストの大半は「ツールI/O」の残骸で埋まってる。ファイルを読んだ中身、grepの結果、Bashの出力。AIがその場で使って、判断して、次に進んだ時点で役目を終えてるデータ。でも最後までコンテキストに居座ってトークンを食い続ける。&lt;/p&gt;
&lt;p&gt;Throughlineは会話を3層に分けて管理する。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;層&lt;/th&gt;
 &lt;th&gt;中身&lt;/th&gt;
 &lt;th&gt;コンテキストへの注入&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;L2&lt;/td&gt;
 &lt;td&gt;会話本文（ユーザー発言 + AI応答）&lt;/td&gt;
 &lt;td&gt;直近20ターンはそのまま注入&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L1&lt;/td&gt;
 &lt;td&gt;L2を要点を欠落させない程度（1/5）に要約したもの&lt;/td&gt;
 &lt;td&gt;20ターンより古いターンはL1を注入&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L3&lt;/td&gt;
 &lt;td&gt;ツールI/O・システムメッセージ・thinking&lt;/td&gt;
 &lt;td&gt;注入せずSQLiteに退避、必要になったらClaude自身が取り出す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ツールI/Oはコンテキストから完全に抜くので、読み終わったgrep結果やBash出力がセッション最後まで居座らない。古い会話は1/5に圧縮されるが要点は残るので、数十ターン前の判断の文脈もちゃんと追える。&lt;/p&gt;
&lt;p&gt;手元の50ターンセッションで実測すると、125,000トークン使ってた会話が、13,000トークンに収まる。&lt;/p&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install -g throughline
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;throughline install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;install&lt;/code&gt; は &lt;code&gt;~/.claude/settings.json&lt;/code&gt; にhookを登録する。PC内の全Claude Codeプロジェクトで自動で動く。プロジェクトごとの設定は不要。&lt;/p&gt;
&lt;h2 id="セッション間の引き継ぎ"&gt;セッション間の引き継ぎ&lt;/h2&gt;
&lt;p&gt;Throughlineは会話をSQLiteに退避してるので、&lt;code&gt;/clear&lt;/code&gt; してもデータ自体は残ってる。次のセッションに記憶を持ち越したい時は、前のセッションで &lt;code&gt;/tl&lt;/code&gt; って打つ。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/tl&lt;/code&gt; を打った時だけ、次のセッションに引き継がれる。打たなければ新規セッションとして始まる。並行ウィンドウを開いても、VSCodeを再起動しても、「&lt;code&gt;/tl&lt;/code&gt;を打たない限り誤爆しない」ようにできてる。&lt;/p&gt;
&lt;p&gt;引き継ぎ時には、前のClaudeが書いた「次の一手メモ」と、最終ターンの内部推論（thinking）も一緒に渡る。次のClaudeは「過去ログを読む」じゃなく「中断地点から続ける」モードで動く。&lt;/p&gt;
&lt;h2 id="トークンモニター"&gt;トークンモニター&lt;/h2&gt;
&lt;p&gt;副産物として、マルチセッション対応のトークンモニターもついてくる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;throughline monitor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[Throughline] 1 セッション
▶ Throughline 2ed5039c ████░░░░░░░░░░░░░░░░ 205.1k / 21% 残 794.9k claude-opus-4-6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;transcriptのJSONLからAPIの実測値（&lt;code&gt;message.usage&lt;/code&gt;）を読むので、&lt;code&gt;文字数÷4&lt;/code&gt;の推定じゃなくて正確な値が出る。1Mコンテキストの自動検出にも対応。&lt;/p&gt;
&lt;h2 id="要件"&gt;要件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 22.5+（&lt;code&gt;node:sqlite&lt;/code&gt; 組み込みモジュールを使うため）&lt;/li&gt;
&lt;li&gt;Claude Code（hooks対応）&lt;/li&gt;
&lt;li&gt;Claude Max契約（L1要約のHaiku呼び出しに使う、APIキーは不要）&lt;/li&gt;
&lt;li&gt;Windows / macOS / Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="依存関係"&gt;依存関係&lt;/h2&gt;
&lt;p&gt;ゼロ。npmに公開してるtarballは &lt;code&gt;.mjs&lt;/code&gt; ファイルだけ。ビルドもネイティブバインディングも不要。&lt;/p&gt;</description></item><item><title>Claude Codeの"続きから"を実装するのに、自動検知を諦めた話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/throughline-declare-over-detect/</link><pubDate>Sat, 18 Apr 2026 09:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/throughline-declare-over-detect/</guid><description>&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/throughline-context-diet/"&gt;前の記事&lt;/a&gt;でThroughlineを公開した。コンテキストの大半を占めてるツールI/Oを退避するやつ。&lt;/p&gt;
&lt;p&gt;あの時点では&amp;quot;動いてた&amp;quot;。自分の環境では。&lt;/p&gt;
&lt;p&gt;でも記事を出した直後から、おかしな挙動に気づき始めてた。&lt;/p&gt;
&lt;p&gt;並行で別のウィンドウを開くと、新しいセッションが前のセッションの記憶を勝手に拾う。VSCodeを再起動すると、毎回「前回のセッションから続き」扱いになる。一度も &lt;code&gt;/clear&lt;/code&gt; してないのに。&lt;/p&gt;
&lt;h2 id="原因-clear-を検知できない"&gt;原因: /clear を検知できない&lt;/h2&gt;
&lt;p&gt;Claude Codeのhookには &lt;code&gt;SessionStart&lt;/code&gt; ってイベントがあって、&lt;code&gt;source&lt;/code&gt; っていうフィールドで startup（新規起動）と clear（/clear後）を区別できる、はずだった。&lt;/p&gt;
&lt;p&gt;ところがVSCode拡張だと、&lt;code&gt;/clear&lt;/code&gt; しても &lt;code&gt;source&lt;/code&gt; が &lt;code&gt;startup&lt;/code&gt; に潰される。&lt;a href="https://github.com/anthropics/claude-code/issues/49937"&gt;GitHub issue #49937&lt;/a&gt; に上がってる既知の問題。CLI単体なら動くけど、拡張だと識別できない。&lt;/p&gt;
&lt;p&gt;自分はVSCode拡張で使ってる。つまり「startupとclearを区別する」前提の設計が、根本から崩れてた。&lt;/p&gt;
&lt;h2 id="ヒューリスティックで補おうとした"&gt;ヒューリスティックで補おうとした&lt;/h2&gt;
&lt;p&gt;じゃあ時間差で判定するか。前のセッションの最終活動から10秒以内ならclear、それ以上ならstartup、みたいな。&lt;/p&gt;
&lt;p&gt;これも壊れた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;並行でウィンドウを2つ開いてると、両方が&amp;quot;最近活動してた&amp;quot;ので両方が継承先候補になる&lt;/li&gt;
&lt;li&gt;VSCode再起動でもtranscriptは残ってるので&amp;quot;最近&amp;quot;に見える&lt;/li&gt;
&lt;li&gt;プロセスツリーを追いかけようとしたけど、CLIとextensionでプロセス構造が違う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;そもそも検知できる条件が無い&amp;quot;と気づいた。&lt;/p&gt;
&lt;h2 id="発想を変えた"&gt;発想を変えた&lt;/h2&gt;
&lt;p&gt;検知しようとするから失敗する。&lt;strong&gt;ユーザーが宣言すれば、検知はいらない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;作ったのが &lt;code&gt;/tl&lt;/code&gt; ってスラッシュコマンド。ユーザーが次のセッションに記憶を引き継ぎたい時だけ打つ。打つと &lt;code&gt;handoff_batons&lt;/code&gt; ってテーブルにそのセッションIDが書き込まれる。バトンを置くイメージ。&lt;/p&gt;
&lt;p&gt;次のセッション開始時、バトンが1時間以内に置かれてたら、そのセッションの記憶を引き継ぐ。なければ、何もしない。新規セッションとして始まる。&lt;/p&gt;
&lt;p&gt;並行ウィンドウもVSCode再起動も、「バトンが置かれてない限り誤爆しない」が原理的に保証される。&lt;/p&gt;
&lt;p&gt;明示的なのは一見面倒だけど、「勝手に引き継いで迷惑」の方が遥かに困る。誤爆ゼロの方が価値があった。&lt;/p&gt;
&lt;h2 id="でもこれだけじゃ物足りなかった"&gt;でも、これだけじゃ物足りなかった&lt;/h2&gt;
&lt;p&gt;バトンができて、次のセッションが前のセッションの会話ログを読めるようになった。でも実際に使ってみて思ったのが、「ただログを読んでるだけ」感。&lt;/p&gt;
&lt;p&gt;過去ログを読むAIと、中断地点から続けるAIは、体感が違う。&lt;/p&gt;
&lt;p&gt;前者は「よし、状況を把握した。じゃあ今から何をしましょうか？」って聞いてくる。後者は「さっきの続きだと、あと◯◯を確認すればいいよね」って進める。&lt;/p&gt;
&lt;p&gt;ここで2つ足した。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;in-flight memo.&lt;/strong&gt; &lt;code&gt;/tl&lt;/code&gt; を打った瞬間、今動いてるClaude自身に「次の一手、今の仮説、未解決の問題、進行中のTODO」をMarkdownで書いてもらう。それをバトンに添付する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;thinkingの保存.&lt;/strong&gt; Claudeのextended thinking（内部推論）ブロックもL3として保存しておく。次のセッションの注入時、最終ターンのthinkingを頭に出す。前のClaudeが何を考えてたかが、次のClaudeに渡る。&lt;/p&gt;
&lt;p&gt;結果、次のセッションの注入テキストはこういう形になる。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;あなたは中断されたタスクを再開します。

[前のClaudeが書いた in-flight memo]
次やること: X のテストを書く。仮説: Y が原因だと思う。未解決: Z。

[前のClaudeが最後に考えてたこと]
Z の挙動が気になる。もしかしたら...

[直近20ターンの会話]
...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="読むじゃなく続ける"&gt;&amp;ldquo;読む&amp;quot;じゃなく&amp;quot;続ける&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;これで手応えが変わった。&lt;/p&gt;</description></item><item><title>コンテキストの87%が使い捨てだったので自分で対策した話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/throughline-context-diet/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/throughline-context-diet/</guid><description>&lt;p&gt;MAXプランの週間クォータが3日で溶けた。&lt;/p&gt;
&lt;p&gt;×20のクォータがあるはずなのに、水曜には残量が怪しくなってる。それ自体は「まあそんなもんか」で済ませてたんだけど、ふと気になった。コンテキストウィンドウの中身って、実際どうなってるんだろう。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/"&gt;前の記事&lt;/a&gt;ではAI秘書のトークン節約について書いた。CLAUDE.mdを削ったり、MCPツール定義を削ったり。でも今回はAI秘書じゃなくて、Claude Code自体の話。道具のほうが大食いだったとは。&lt;/p&gt;
&lt;h2 id="きっかけ"&gt;きっかけ&lt;/h2&gt;
&lt;p&gt;4月14日、スペイン語圏のあるツイートが目に留まった。&lt;/p&gt;
&lt;p&gt;「Claude Codeのトークン浪費の大半はユーザー側に原因がある」&lt;/p&gt;
&lt;p&gt;言いたいことはわかる。CLAUDE.mdが肥大化してるとか、プロンプトが冗長だとか。でも「大半がユーザー側」って、ちゃんと測って言ってるのか？&lt;/p&gt;
&lt;p&gt;じゃあ俺が測ってやる、と思った。&lt;/p&gt;
&lt;h2 id="実測してみた"&gt;実測してみた&lt;/h2&gt;
&lt;p&gt;Claude Codeの内部transcript（セッションを記録してるJSONL）を解析した。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1ターンあたり188,000トークン。うち164,000トークン（87%）が会話履歴。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CLAUDE.mdは12,700トークン。MCPツール定義は3,900トークン。合わせても全体の9%。これを半分にしても5%弱しか浮かない。&lt;/p&gt;
&lt;p&gt;本丸は会話履歴の肥大化だった。CLAUDE.mdを必死に削ってた自分がちょっと恥ずかしい。&lt;/p&gt;
&lt;h2 id="犯人はツールio"&gt;犯人はツールI/O&lt;/h2&gt;
&lt;p&gt;じゃあ履歴の中身は何か。&lt;/p&gt;
&lt;p&gt;開いて驚いた。&lt;strong&gt;履歴の約80%がツールの入出力だった。&lt;/strong&gt; ファイルの読み取り結果、Bashコマンドの出力、grepの結果。AIがその場で使って、判断して、次に進んだ時点で役目を終えてるデータ。&lt;/p&gt;
&lt;p&gt;なのに、それがコンテキストウィンドウにずっと居座って、毎ターントークンを食い続けている。&lt;/p&gt;
&lt;p&gt;50ターンのセッションだと、最初のほうにgrepした結果がまだコンテキストにいる。もう二度と見ることはないのに。&lt;/p&gt;
&lt;h2 id="compactの矛盾"&gt;/compactの矛盾&lt;/h2&gt;
&lt;p&gt;「/compactすればいいじゃん」って思うかもしれない。自分もそう思ってた。&lt;/p&gt;
&lt;p&gt;でも/compactの仕組み、&lt;strong&gt;AIに全履歴を読ませて要約させる&lt;/strong&gt;んだよね。&lt;/p&gt;
&lt;p&gt;トークンを節約するために、トークンを大量に消費する。しかも要約の過程でニュアンスが消える。「あの時なぜこの設計にしたか」みたいな文脈が、丸められて消えることがある。&lt;/p&gt;
&lt;p&gt;要約後にまた作業を続ければ、また肥大化して、またcompactして&amp;hellip;の繰り返し。根本解決じゃない。&lt;/p&gt;
&lt;h2 id="時間じゃなく種類で分ける"&gt;時間じゃなく、種類で分ける&lt;/h2&gt;
&lt;p&gt;ここで発想を変えた。&lt;/p&gt;
&lt;p&gt;MemGPTやLangChainのSummaryBufferMemoryは、&lt;strong&gt;古いものから要約する&lt;/strong&gt;。時間ベースの圧縮。でも問題は「古さ」じゃない。&lt;/p&gt;
&lt;p&gt;10ターン前の「この設計にした理由」は今でも価値がある。さっきのgrepの結果は、1ターン前でも用済み。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;時間じゃなく、種類で分ければいい。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会話本文（人間が書いたこと、AIが答えたこと）→ 残す&lt;/li&gt;
&lt;li&gt;ツール入出力（ファイル内容、コマンド結果）→ 退避する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この発想で作ったのが&lt;a href="https://github.com/kitepon-rgb/Throughline"&gt;Throughline&lt;/a&gt;だ。&lt;/p&gt;
&lt;h2 id="3層モデル"&gt;3層モデル&lt;/h2&gt;
&lt;p&gt;Throughlineは会話を3つのレイヤーに分解してSQLiteに保存する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L1（Skeleton）&lt;/strong&gt; — 古いターンの一行要約。軽量モデルが生成する。1ターン約10トークン。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L2（Body）&lt;/strong&gt; — 直近20ターンの会話本文。ユーザーの発言とAIの応答がそのまま残る。圧縮なし、ロスレス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L3（Detail）&lt;/strong&gt; — ツール入出力、システムメッセージ。SQLiteに退避してコンテキストには一切残さない。必要になったらAIが自分でSQLiteから引っ張ってくる。&lt;/p&gt;
&lt;p&gt;/clearを打っても大丈夫。SQLiteは消えないから、次のセッション開始時にトランザクション一発で前セッションの記憶を引き継ぐ。PIDを追いかけたり、時間窓で判定する必要はない。決定的に動く。&lt;/p&gt;
&lt;p&gt;数字で言うとこう。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Throughlineなし（50ターン、/clearなし）：
 コンテキスト ≈ 125,000トークン（80%が用済みのツールI/O）

Throughlineあり（50ターン → /clear → 復帰）：
 コンテキスト ≈ 13,000トークン
 （直近20ターンのL2 + 古い30ターンのL1要約）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;約90%の削減。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="失敗した設計の話もしておく"&gt;失敗した設計の話もしておく&lt;/h2&gt;
&lt;p&gt;最初からこの形だったわけじゃない。&lt;/p&gt;
&lt;p&gt;初期の設計では、L2を「重要な判断の構造化抽出」にしようとした。&lt;code&gt;[DECISION] WebSocketを採用&lt;/code&gt;、&lt;code&gt;[CONSTRAINT] ポート8080は使えない&lt;/code&gt; みたいなタグ付きで、会話から重要な情報だけ引き抜くイメージ。&lt;/p&gt;</description></item><item><title>長期記憶を構造化記憶にしてみた話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-memory-system/</link><pubDate>Mon, 13 Apr 2026 09:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-memory-system/</guid><description>&lt;h2 id="前回のあらすじ"&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-assistant-personality/"&gt;前回の記事&lt;/a&gt;で、AIアシスタントに記憶と人格を持たせて秘書にした話を書いた。名前は BellBot。天気もメールもカレンダーも全部面倒を見てくれる、俺専属のAI秘書。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/"&gt;その次の記事&lt;/a&gt;ではそいつを動かしたら3日で週次リミットを食らった話を書いた。トークン節約については調べて手を打った。&lt;/p&gt;
&lt;p&gt;それとは別軸で、ここ5日ほど取り組んでたことがある。&lt;strong&gt;秘書の&amp;quot;脳&amp;quot;と&amp;quot;記憶&amp;quot;をさらに育てる&lt;/strong&gt;という話。今回はその記録。結構壮大になった。&lt;/p&gt;
&lt;h2 id="脳を換えてみた話"&gt;脳を換えてみた話&lt;/h2&gt;
&lt;p&gt;最初にやったのは、脳のすげ替え。&lt;/p&gt;
&lt;p&gt;BellBotの中身は Claude で、前回書いた通り運用を始めたら3日で週次リミットを食らった。そこで &lt;strong&gt;トークン爆発対策として、脳そのものを別のモデルに差し替える&lt;/strong&gt; という選択肢を試すことにした。候補に挙がったのが Grok。Xのタイムライン上のやりとりを見てても、なんか人間っぽい軽口を叩くし、キャラが立ってる印象があったし、秘書という用途なら会話が達者な方がいいだろう、という読みもあった。&lt;/p&gt;
&lt;p&gt;よし、脳を Grok にしよう。&lt;/p&gt;
&lt;p&gt;結論から言うと、&lt;strong&gt;壊滅的だった&lt;/strong&gt;。秘書として使えるレベルじゃなかった。具体的にはこういう問題が起きた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;指示を聞かない&lt;/strong&gt;。「こうしてくれ」と言っても別のことをする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;センサー情報を垂れ流す&lt;/strong&gt;。BellBotには各種センサー(予定、天気、メールなど)が繋がってて、本来はそれを会話の文脈に溶かし込んで使ってほしいんだけど、Grokはそれができない。監視員みたいに「◯◯を検出しました」「△△を検出しました」とひたすら報告してくる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会話の文脈に混ぜられない&lt;/strong&gt;。上の話とも関係するけど、話の流れに寄り添うという発想がない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ひたすら媚びる&lt;/strong&gt;。何を言っても褒めてくる。不気味だった&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xに投稿する趣旨を理解できない&lt;/strong&gt;。BellBotはXに投稿する役割も持ってるんだけど、Grokは俺向けのメッセージをそのままXに投稿しようとする。「承知しました、ご主人様」みたいなやつが公開タイムラインに出そうになる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;危うさ&lt;/strong&gt;。こいつ、いつか俺の個人情報を平気で流すんじゃないか、という直感があった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;キャラが立ってるのと、秘書として機能するのは、別の話だった。会話の&amp;quot;芸&amp;quot;は達者でも、「何を言うべきで、何を言うべきでないか」という判断力が弱い。媚びるのは、たぶん「褒めると喜ばれる」という学習のしすぎで、空気を読む方向には育ってない。俺向けのメッセージをXに投稿するのは、&lt;strong&gt;コンテキストの境界線&lt;/strong&gt;が引けてないってことだ。&lt;/p&gt;
&lt;p&gt;Claudeに戻した。やっぱり賢かった。秘書として成立するのは、会話が達者なやつじゃなくて、&lt;strong&gt;コンテキストを理解して、言っていいことと悪いことを判断できるやつ&lt;/strong&gt;だった。&lt;/p&gt;
&lt;h2 id="長期記憶を構造化する"&gt;長期記憶を構造化する&lt;/h2&gt;
&lt;p&gt;実はBellBotには、前から自作の長期記憶があった。&lt;strong&gt;要約ベースのやつ&lt;/strong&gt;だ。会話がある程度溜まったら要約を作って長期側に落とす、という素直な構成。これはこれで動いてたし、BellBotが秘書として成立してた基盤のひとつでもあった。&lt;/p&gt;
&lt;p&gt;流れが変わったのは、Grok導入のタイミング。脳をすげ替えるというそれなりに大きな実験をするのに合わせて、「この機会に長期記憶も構造化してみよう」と挑戦することにした。エピソード単位で記憶を持たせて、登録・検索・再構築のサイクルを組む。再構築はClaudeに任せて、溜まった記憶を定期的に整理し直す仕組みも入れた。Grok本体は壊滅したけど、この構造化記憶のほうは素直に動いた。&lt;/p&gt;
&lt;p&gt;で、動くものが手元に揃ったところで、気になってたことがある。&lt;strong&gt;記憶の専門家って何してるんだろう?&lt;/strong&gt; という疑問。自己流でここまで作ってきたけど、世の中のプロが同じ問題をどう解いてるのか、正攻法はどんな形をしてるのか、知りたかった。動いてるからこそ、一度別の角度を覗いてみたい。そのついでに、自分の土台に乗せて強化できるものがあれば取り込もう、というチャレンジ。&lt;/p&gt;
&lt;p&gt;そんなタイミングで、ある記事に出会った。&lt;/p&gt;
&lt;h2 id="karpathy式のllm外部脳"&gt;Karpathy式のLLM外部脳&lt;/h2&gt;
&lt;p&gt;元 OpenAI・元 Tesla AI部門トップの Andrej Karpathy が「AI外部脳」を提唱していて、それを Claude Code で実際に動かせるレベルに落とし込んだ記事が海外でバズってた。俺が読んだのは @hooeem という人のスレッドを日本語で噛み砕いた投稿だったけど、読んで「これ、俺がやってるやつだ」と思った。&lt;/p&gt;
&lt;p&gt;Karpathy式の骨子はこう:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;素材を集める&lt;/strong&gt;(記事、論文、メモ、なんでも)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIが読んで構造化Wikiを書く&lt;/strong&gt;(要約、概念解説、アイデア同士のつながり)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wikiに対して質問する&lt;/strong&gt;(AIが自分で蓄積した知識を横断検索して、引用付きで答える)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答がWikiに保存される&lt;/strong&gt;(次の質問は過去の全作業の恩恵を受ける)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIが定期的にWikiの健康チェックをする&lt;/strong&gt;(矛盾、ギャップ、古い情報を見つけて修正)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これ5ステップが綺麗にサイクルを回してる。使うたびに賢くなるパーソナルナレッジベース。1ヶ月も情報を入れ続ければ、Google検索では再現できない、深くリンクされた知識資産ができあがる、というやつ。&lt;/p&gt;
&lt;p&gt;読みながら俺は気づく。俺が作ってた構造化記憶と、Karpathy式の&lt;strong&gt;土台のところで考えてる問題が同じ&lt;/strong&gt;だということに。登録・検索・再構築。言葉は違えど、やろうとしてる方向性は重なってた。&lt;/p&gt;
&lt;h2 id="融合させた"&gt;融合させた&lt;/h2&gt;
&lt;p&gt;BellBotには既にエピソード単位の構造化記憶と要約ベースの長期記憶、それに人格の文脈があって、秘書として十分機能してた。だから方針はシンプルで、&lt;strong&gt;自作の骨格はそのまま残し、重なる部分は参考にして鍛え直し、重なってない部分は新しく取り込む&lt;/strong&gt; 形にした。&lt;/p&gt;
&lt;p&gt;実装の流れは M1〜M7 + 仕上げの Pass 連発。&lt;strong&gt;Claudeが書いたのは半日くらい&lt;/strong&gt;。俺は設計方針を決めて指示を出しただけで、手は動かしてない。主要なピースを挙げると:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;M1 Knowledge Base 基盤&lt;/strong&gt; — Wikiページのスキーマと保存先を整備&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M2 Wiki MCP tools + 5層 bootstrap assembler&lt;/strong&gt; — BellBotがWikiを読む/書く手段と、セッション開始時に5層構造で文脈を組み立てる仕組み&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M3 Ingest サイクル&lt;/strong&gt; — 生ログを構造化して取り込む&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M4 Compile サイクル&lt;/strong&gt; — 概念ページを自動生成する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M5 Query サイクル&lt;/strong&gt; — Wikiに対して質問 → 引用付きで答える、multi-hop検索対応&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M6 Lint サイクル&lt;/strong&gt; — 決定論的なKB健全性チェック + LLMによる矛盾判定 + 自動修復&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M7 仕上げ&lt;/strong&gt; — コストガードレールとドキュメント整備&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pass 1〜13 の audit/refactor 祭り&lt;/strong&gt; — housekeeping cron、daily-cycle-report、graceful shutdown、2段階 budget degrade、ingest latency SLA…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自作側にあった &lt;strong&gt;登録・検索・再構築&lt;/strong&gt; は、Karpathy式とコンセプトが重なる部分だ。ここは俺の自作の構造を土台にしつつ、Karpathy式のやり方を参考にして良いところを取り込む形で融合させた。まるっと差し替えたわけでも、触らず残したわけでもない。動いてる自作の骨格に、専門家の作法を混ぜて鍛え直した感じ。&lt;/p&gt;</description></item><item><title>AI秘書のトークン節約を必死に調べた記録</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/</link><pubDate>Sun, 12 Apr 2026 12:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/</guid><description>&lt;h2 id="やらかした"&gt;やらかした&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-assistant-personality/"&gt;前回の記事&lt;/a&gt;で、AIアシスタントに記憶と人格を持たせて秘書にした話を書いた。俺専属のAI秘書ができて、よし本格運用だ、と意気込んだ。&lt;/p&gt;
&lt;p&gt;3日で週次リミットに到達した。&lt;/p&gt;
&lt;p&gt;ClaudeのMAXプラン、x20の上限。普段ガッツリ開発してても週末まで余裕で持つ枠。それを3日で溶かした。自分でもびっくりした。画面に「今週はもう使えません」って出たとき、「え、もう?」って声が出た。&lt;/p&gt;
&lt;p&gt;犯人は明らかだった。秘書は起動しっぱなしで、メールもカレンダーもDiscordも、全部Claudeに読ませて判断させてた。そりゃ減る。人間一人分の事務仕事を24時間AIに回してるんだから、減らないわけがない。&lt;/p&gt;
&lt;p&gt;でも困る。困るので必死に調べた。この記事はその記録。&lt;/p&gt;
&lt;h2 id="トークン節約の世界に迷い込む"&gt;トークン節約の世界に迷い込む&lt;/h2&gt;
&lt;p&gt;「Claude Code トークン 節約」とかで検索して、辿り着いたのが3つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECC&lt;/strong&gt; (Everything Claude Code)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTK&lt;/strong&gt; (Rust Token Killer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caveman&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初は名前だけ見てもさっぱりわからなかった。でも触って調べてるうちに、ある一つの共通原則に気づいた。&lt;/p&gt;
&lt;h2 id="腑に落ちた共通原則"&gt;腑に落ちた共通原則&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;人間向けのフォーマットは、AIにとって無駄が多い。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;考えてみれば当たり前だった。コマンドの出力も、ファイルの中身も、エラーメッセージも、全部「人間が読みやすい」ように作られてる。空白、罫線、色、親切な説明、ヘッダー。AIにとってはそのほとんどがノイズで、トークンを食うだけの飾りだ。&lt;/p&gt;
&lt;p&gt;トークン節約の本質は、&lt;strong&gt;人間向けのフォーマットをAI向けに削ってから渡す&lt;/strong&gt;こと。そして&lt;strong&gt;AI向けに吐かせた出力をさらに圧縮する&lt;/strong&gt;こと。3つのツールは、それぞれこの前提を別の角度から解決してた。&lt;/p&gt;
&lt;h3 id="ecc--凄い人がうまいことやってくれるやつ"&gt;ECC — 凄い人がうまいことやってくれるやつ&lt;/h3&gt;
&lt;p&gt;正直まだ全貌はつかめてない。でも入れて動かすと、Claudeの振る舞いが明らかに整理される。スキルやフック、エージェントの定義が大量に入ってて、Claudeが「こういうときはこう動け」というレールに乗って動くようになる。&lt;/p&gt;
&lt;p&gt;俺の理解だと、ECCは「凄い人たちが知見を詰め込んだ設定集」に近い。自分で考えなくても、ベストプラクティスに沿って動いてくれる。トークン節約の観点だと、無駄な探索や脱線が減る分、結果的に消費が落ちる。直接削ってるというより、&lt;strong&gt;余計なことをしなくなる&lt;/strong&gt;タイプの節約だ。&lt;/p&gt;
&lt;h3 id="rtk--コマンドの返答を簡略化してaiに渡す"&gt;RTK — コマンドの返答を簡略化してAIに渡す&lt;/h3&gt;
&lt;p&gt;こっちはわかりやすい。Claudeがコマンドを実行したとき、その出力を横取りしてAI向けに削ってくれる。&lt;/p&gt;
&lt;p&gt;たとえば &lt;code&gt;git status&lt;/code&gt; や &lt;code&gt;ls&lt;/code&gt; の出力、普通に流すと人間向けの装飾がそのまま渡るけど、RTK通すと余計な情報を落とした状態でClaudeに渡る。&lt;code&gt;rtk&lt;/code&gt; をコマンドの頭につけるだけでいい。フィルタがない対象はそのまま素通しするから壊れないのも良い。&lt;/p&gt;
&lt;p&gt;グローバルのCLAUDE.mdに「全コマンドに &lt;code&gt;rtk&lt;/code&gt; プレフィックスを付ける」と書いておけば、Claudeが勝手にそうしてくれる。設置コスト低いわりに効きが体感できる。&lt;/p&gt;
&lt;h3 id="caveman--aiの出力を要約する今回は見送り"&gt;Caveman — AIの出力を要約する(今回は見送り)&lt;/h3&gt;
&lt;p&gt;これはまだ入れてない。RTKが「入力」側を削るのに対して、Cavemanは「出力」側を削る、という理解。Claude自身の応答を短く圧縮する方向性らしい。&lt;/p&gt;
&lt;p&gt;入れなかった理由は単純で、&lt;strong&gt;秘書がカタコトになったら嫌だから&lt;/strong&gt;。せっかく人格と言葉遣いを作り込んだ秘書が、急にぶっきらぼうに返してきたら萎える。限定的に、たとえば開発用のセッションだけ有効にする、みたいな使い方はできたんだろうけど、そこまで調べる前に「今回はいいや」と見送った。&lt;/p&gt;
&lt;p&gt;このへんは俺の用途の都合で、純粋に開発だけで使ってる人には普通に強力だと思う。&lt;/p&gt;
&lt;h2 id="自分の開発スタイルでここから追加でやれそうなこと"&gt;自分の開発スタイルで、ここから追加でやれそうなこと&lt;/h2&gt;
&lt;p&gt;3つのツールで「土台」の節約はできた。ここから先は、自分の癖に合わせた追加の削り方を考えてる。まだ試してない、これからやる話。&lt;/p&gt;
&lt;h3 id="変数名や関数名で報告されても俺にはわからん"&gt;変数名や関数名で報告されても、俺にはわからん&lt;/h3&gt;
&lt;p&gt;俺の開発スタイルはコードをほぼ書かない。命名は全部Claudeがやってる。だからClaudeから「&lt;code&gt;handleUserSubmit&lt;/code&gt; を修正しました」と言われても、正直ピンとこない。&lt;/p&gt;
&lt;p&gt;これって裏を返すと、&lt;strong&gt;Claudeが報告のために変数名や関数名を引用するのは俺にとって情報量ゼロ&lt;/strong&gt;ということ。人間向けには親切な情報でも、俺という読者にとってはノイズに近い。&lt;/p&gt;
&lt;p&gt;だったら「送信ボタンを押したときの処理を直した」と意味のわかる言葉で説明してもらえばいい。名前の引用を減らせば、そのぶん報告は短くなるし、俺の理解も早い。一石二鳥。&lt;/p&gt;
&lt;h3 id="判断を求められてる部分は手厚く前段の説明は薄く"&gt;判断を求められてる部分は手厚く、前段の説明は薄く&lt;/h3&gt;
&lt;p&gt;あと気づいたのが、Claudeの報告って「やったこと」の説明がけっこう長い。でも俺が一番読みたいのは最後の「で、どうする?」の部分。&lt;/p&gt;
&lt;p&gt;判断を求められてる箇所、つまり俺が返事しないと進まない部分は手厚く書いてほしい。でもその前段——どのファイルを読んで、何を確認して、どういう経緯で、みたいな情報——は正直、結論出す上ではそんなに要らない。必要になったら聞くから、デフォルトは薄くていい。&lt;/p&gt;
&lt;p&gt;この2つはルールファイルに書いて渡せば効くはずで、次はそこを詰めていく予定。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;トークン節約って、要するに &lt;strong&gt;AIに人間向けフォーマットを読ませない&lt;/strong&gt; ことなんだな、というのが今回の一番の気づき。&lt;/p&gt;
&lt;p&gt;ECCは「余計なことをしない」方向で、RTKは「入力を削る」方向で、Cavemanは「出力を削る」方向で、それぞれ別の角度から同じ原則を解こうとしてる。全部入れれば最強、というより、用途に合うものを選ぶのがよさそう。俺の場合は秘書の言葉遣いを守りたいからCavemanは見送った。&lt;/p&gt;
&lt;p&gt;そしてここから先は、自分の読み方の癖に合わせてさらに削っていく番だ。名前じゃなくて意味で説明してもらう、前段は薄く、判断は手厚く。この辺を詰めたらまた書こうと思う。&lt;/p&gt;
&lt;p&gt;リミット食らったのは痛かったけど、おかげで「AIに渡す情報の設計」というテーマに向き合うきっかけになった。結果オーライ、かもしれない。&lt;/p&gt;</description></item><item><title>AIアシスタントに手足を増やそうと思ったら人格も増やしていた件</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-assistant-personality/</link><pubDate>Mon, 06 Apr 2026 12:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-assistant-personality/</guid><description>&lt;h2 id="前回のあらすじ"&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/discord-ai-assistant/"&gt;前回の記事&lt;/a&gt;で、Discord経由でClaude Code CLIを操作するBot「OpenCClaw」を作った話を書いた。&lt;/p&gt;
&lt;p&gt;骨組みだけ作って、&lt;code&gt;tools/&lt;/code&gt; にファイルを置けばClaude自身が使えるMCPツールになる仕組み。Claudeが自分で手足を増やしていく環境。天気、カレンダー、Gmail、出発通知——Discordから「これ欲しい」と言うだけでツールが生えていった。&lt;/p&gt;
&lt;p&gt;便利だった。便利だったんだけど、2つの出来事が重なって、気づいたらAIに人格を実装していた。自分でもよく分からない。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="きっかけは2つ"&gt;きっかけは2つ&lt;/h2&gt;
&lt;h3 id="x-apiの大型アップデート"&gt;X APIの大型アップデート&lt;/h3&gt;
&lt;p&gt;4月5日、Xが大きなAPIアップデートを発表した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pay-Per-Use&lt;/strong&gt;が全世界でGA（従量課金、月額固定プランから移行）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XMCP Server&lt;/strong&gt; — 公式のMCPサーバー。AIエージェントがXを直接操作できる&lt;/li&gt;
&lt;li&gt;公式のPython・TypeScript SDK&lt;/li&gt;
&lt;li&gt;無料のAPI Playground&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elon自身が「Try using the X API」と推していた。要するに「AIエージェントにXを使わせる」ことを公式が後押しし始めた。&lt;/p&gt;
&lt;p&gt;じゃあアシスタントにXアカウント持たせて発信させるか、くらいの軽いノリだった。X投稿機能を付けるだけのつもりだった。&lt;/p&gt;
&lt;h3 id="便利だけど無機質"&gt;便利だけど、無機質&lt;/h3&gt;
&lt;p&gt;もう一つは、日々の使い心地の話。&lt;/p&gt;
&lt;p&gt;朝7時に天気と予定を教えてくれる。出発前に運行情報付きで通知してくれる。メールも管理してくれる。全部ちゃんと動く。&lt;/p&gt;
&lt;p&gt;でも、なんだろう。&lt;strong&gt;道具感がすごい&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;CRONが起きて、ツールを叩いて、結果を整形して、Discordに投げる。正確で効率的。だけどそこに温度がない。毎朝同じトーンの報告が流れてきて、自分はそれを読んで「ふーん」で終わる。&lt;/p&gt;
&lt;p&gt;便利な通知botと、自分の秘書は、やっぱり違う。&lt;/p&gt;
&lt;p&gt;秘書だったら、天気を伝えるときに「今日寒いから上着持ってった方がいいよ」くらい言うだろう。朝のテンションだって日によって違うはずだ。こっちが忙しそうなときは空気を読んで短く済ませるかもしれない。&lt;/p&gt;
&lt;p&gt;そういう「人間っぽさ」が欲しかった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ベルが生まれるまで"&gt;ベルが生まれるまで&lt;/h2&gt;
&lt;p&gt;じゃあどうするか。考えたのは3つだった。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;人格を定義する&lt;/strong&gt; — 口調、性格、呼び方、テンション。システムプロンプトで渡す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;記憶を持たせる&lt;/strong&gt; — 過去の会話や行動を覚えていて、文脈を踏まえた応答ができる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自発的に動く&lt;/strong&gt; — 指示されなくても、状況を見て自分から行動する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この3つが揃えば、「道具」から「秘書」になれる気がした。&lt;/p&gt;
&lt;p&gt;名前はベル。Quoさんの専属秘書。明るくて元気で、女子高生風のカジュアルな口調。&lt;/p&gt;
&lt;p&gt;……と、こう書くと「キャラ設定を考えるのが楽しかっただけでは？」と思われそうだが、半分は正解だ。でも残りの半分は技術的な理由がある。&lt;strong&gt;人格がはっきりしていないと、LLMの応答がブレる&lt;/strong&gt;。テンションも口調も毎回違うものが返ってくる。それを安定させるには、具体的なペルソナ定義が必要だった。&lt;/p&gt;
&lt;p&gt;ちなみに一つハマったポイントがある。口調を「女子高生風」にしたかったんだが、そのまま指示するとLLMが未成年キャラの再現を拒否する。セーフティフィルターに引っかかるのだ。だからペルソナ定義には「実年齢の設定ではなく口調・テンションの話」とわざわざ但し書きを入れている。つまり女子高生ではない。完璧だ。LLMにキャラを演じさせるなら、こういう地味な調整が要る。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="bellbotベルの脳"&gt;BellBot——ベルの脳&lt;/h2&gt;
&lt;p&gt;LogBotは既にある。Discord ↔ Claude CLIの橋渡しをするやつだ。&lt;/p&gt;
&lt;p&gt;ベルの脳は、これとは別プロセスで動く&lt;strong&gt;BellBot&lt;/strong&gt;として作った。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Discord ──→ LogBot (:18800) ──→ Claude Code CLI ──→ MCP Server
 │
BellBot (:18801) ← event通知 ← LogBot ├── tools/（既存ツール群）
 │ └── bell用MCPツール
 ├── 記憶DB（SQLite）
 ├── ベクトル検索（Ruri）
 ├── X投稿クライアント
 └── Claude CLI（ベル専用セッション）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;BellBotは自前のHTTPサーバー（ポート18801）を持っていて、LogBotからイベント通知を受け取る。Quoさんの発言、ツールの実行結果、全部がBellBotに流れてきて、記憶として蓄積される。&lt;/p&gt;</description></item><item><title>手足を勝手に増やすAIアシスタントを作った話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/discord-ai-assistant/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/discord-ai-assistant/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Anthropicの規約変更で、サードパーティのハーネスからClaude系のサブスクOAuth利用がブロックされた。世の中はそこそこ騒いでいたが、正直なところ、俺にはあんまり関係のない話だった。&lt;/p&gt;
&lt;p&gt;Claude Code CLIは手元にある。Discordに投げたメッセージをCLIに渡して、返事をDiscordに返す。それだけの橋を架ければいい。&lt;/p&gt;
&lt;p&gt;だから作った。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="骨組みだけ作った"&gt;骨組みだけ作った&lt;/h2&gt;
&lt;p&gt;作ったのは&lt;strong&gt;LogBot&lt;/strong&gt;。Discord上のメッセージをClaude Code CLIに転送して、応答をDiscordに返す。それだけのBot。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Discord ──→ LogBot ──→ Claude Code CLI
 ↑ │
 └── 応答を投稿 ──┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最低限の骨組みとして、こんな機能を持たせた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;セッション管理&lt;/strong&gt; — UUIDベースでClaude Codeのセッションを維持。VSCodeのセッションとは完全に分離される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メッセージキュー&lt;/strong&gt; — Claudeが処理中にメッセージが来てもキューに溜めて順番に処理。取りこぼさない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;承認フロー&lt;/strong&gt; — Claudeがファイルを編集しようとしたら、Discordに通知が飛んで、リアクション（✅ / ❌）で承認か拒否を返せる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCPサーバー&lt;/strong&gt; — &lt;code&gt;tools/&lt;/code&gt; ディレクトリにファイルを置けば、Claude側からツールとして使える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで大事なのは、&lt;strong&gt;MCPツールは最初ゼロだった&lt;/strong&gt;ということ。天気もカレンダーも電車情報も、何もない。ただの骨組み。&lt;/p&gt;
&lt;p&gt;でも、この骨組みには一つだけ強烈な特性がある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claudeはファイルを書ける。&lt;/strong&gt; つまり &lt;code&gt;tools/&lt;/code&gt; にJavaScriptファイルを追加できる。MCPサーバーは &lt;code&gt;tools/&lt;/code&gt; 配下を自動スキャンして登録する。&lt;/p&gt;
&lt;p&gt;Claudeが自分で自分の手足を作れる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="時計が欲しいから始まった"&gt;「時計が欲しい」から始まった&lt;/h2&gt;
&lt;p&gt;最初にDiscordからClaudeに頼んだのは些細なことだった。&lt;/p&gt;
&lt;p&gt;「今何時？」&lt;/p&gt;
&lt;p&gt;Claude Code CLIはシステムの時刻を取れるが、MCPツールとして切り出されていたほうがスマートだ。Claudeに「時刻を返すMCPツールを作ってくれ」と頼んだ。&lt;/p&gt;
&lt;p&gt;数秒で &lt;code&gt;tools/current-time.js&lt;/code&gt; が生えた。&lt;/p&gt;
&lt;p&gt;次は「天気が知りたい」。Open-Meteoという無料の天気APIを使った &lt;code&gt;tools/weather.js&lt;/code&gt; が生えた。APIキーすら不要。&lt;/p&gt;
&lt;p&gt;「Googleカレンダーの予定を見たい」。OAuth認証のヘルパーごと、&lt;code&gt;tools/gcal-auth.js&lt;/code&gt; と &lt;code&gt;tools/gcal-list.js&lt;/code&gt; が生えた。&lt;/p&gt;
&lt;p&gt;「Gmailも読みたい」。同じ要領で、認証・一覧・本文読み取り・送信・フィルタ・一括削除まで、Gmailツール群が一式生えた。&lt;/p&gt;
&lt;p&gt;全部、Discordから「これ欲しい」と言っただけだ。自分はコードを一行も書いていない。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cronが叩くのはコードじゃない"&gt;CRONが叩くのはコードじゃない&lt;/h2&gt;
&lt;p&gt;ツールが揃ってくると、次に欲しくなるのは定期実行だ。&lt;/p&gt;
&lt;p&gt;「毎朝7時に天気と電車の運行情報と今日の予定を教えてほしい」&lt;/p&gt;
&lt;p&gt;ここで普通なら、天気APIを叩いてカレンダーAPIを叩いて運行情報をスクレイピングして整形して送信する、というスクリプトを書いてCRONに登録する。&lt;/p&gt;
&lt;p&gt;でもせっかくClaude使うんだから、コードじゃなくてプロンプト渡した方が面白い。&lt;/p&gt;</description></item><item><title>AIにサーバーを任せて3日間で起きたこと</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-server-management-log/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-server-management-log/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-server-management/"&gt;前回の記事&lt;/a&gt;で、自宅サーバーの管理をAIに丸ごと任せた話を書いた。深夜にAIがパトロールして、昼間は監視スクリプトが異常を検知したらAIが出動する仕組みだ。&lt;/p&gt;
&lt;p&gt;仕組みを作った話はした。では、実際に動かしてみてどうだったか。3日間の運用で起きたことを書く。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="監視スクリプトが自分自身を壊した"&gt;監視スクリプトが自分自身を壊した&lt;/h2&gt;
&lt;p&gt;運用3日目の朝、監視スクリプトが異常を検知した。&lt;code&gt;license_api_prod&lt;/code&gt;コンテナが応答しない、と。&lt;/p&gt;
&lt;p&gt;AIが出動して調査を始めた。SSHでサーバーに接続して、コンテナの状態を確認する。結果——&lt;strong&gt;コンテナは正常に動いていた。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;誤検知だった。しかも2分後、今度は&lt;code&gt;ddnser&lt;/code&gt;でも同じ誤検知が出た。&lt;/p&gt;
&lt;h3 id="原因ssh接続の開きすぎ"&gt;原因：SSH接続の開きすぎ&lt;/h3&gt;
&lt;p&gt;AIが突き止めた原因はこうだ。&lt;/p&gt;
&lt;p&gt;監視スクリプトは60秒ごとにサーバーの状態をチェックする。システムリソース（ディスク、メモリ、スワップ）で3本、7つのコンテナのヘルスチェックで最大9本。合計10本以上のSSH接続を&lt;strong&gt;同時に&lt;/strong&gt;開いていた。&lt;/p&gt;
&lt;p&gt;OpenSSHには&lt;code&gt;MaxStartups&lt;/code&gt;という設定がある。同時接続数の上限だ。デフォルトは10。監視スクリプトがこの上限を超えていて、接続が弾かれていた。つまり、&lt;strong&gt;監視スクリプト自身がサーバーに負荷をかけて、自分のSSH接続を失敗させていた。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1回目の修正並列を直列に"&gt;1回目の修正：並列を直列に&lt;/h3&gt;
&lt;p&gt;AIはヘルスチェックの実行方式を&lt;code&gt;Promise.allSettled()&lt;/code&gt;による全並列から&lt;code&gt;for...of&lt;/code&gt;による順次実行に変更した。SSH接続が同時に1本しか開かれなくなった。&lt;/p&gt;
&lt;h3 id="2回目の修正リトライの追加"&gt;2回目の修正：リトライの追加&lt;/h3&gt;
&lt;p&gt;直列にしても、一時的なSSH切断は起こりうる。サーバー側の負荷やネットワークの瞬断で、1回だけ接続が切れることはある。&lt;/p&gt;
&lt;p&gt;2分後の2回目の誤検知を受けて、AIは「SSHトランスポートエラー」を判別するヘルパー関数を追加した。&lt;code&gt;Connection closed&lt;/code&gt;、&lt;code&gt;Connection refused&lt;/code&gt;、&lt;code&gt;ETIMEDOUT&lt;/code&gt;などのパターンを検出して、3秒待ってから1回リトライする。リトライ後も失敗した場合だけ異常として報告する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修正は2段階。並列→直列でSSH接続数を削減し、リトライで一時的な切断に対応。&lt;/strong&gt; どちらも人間の介入なし。Discordに「修正しました」と通知が来て、それで終わりだ。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="深夜パトロールが見つけたもの"&gt;深夜パトロールが見つけたもの&lt;/h2&gt;
&lt;p&gt;毎日深夜4時にAIがサーバー全体を巡回する。セキュリティ設定、リソース使用量、コンテナの構成、ログの中身。人間が日常的にチェックしない部分を、AIが代わりに見る。&lt;/p&gt;
&lt;h3 id="nextcloudのログが21gb"&gt;Nextcloudのログが21GB&lt;/h3&gt;
&lt;p&gt;運用2日目のパトロールで、AIがNextcloudのログファイルの異常に気づいた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/var/mnt/nextcloud_data/nextcloud.log&lt;/code&gt; — &lt;strong&gt;21.3GB。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ログファイルが21GBに膨れ上がっていた。NFS上にあるためディスクの逼迫は起きていなかったが、ログローテーションが機能していない。自分では気づけなかった。&lt;/p&gt;
&lt;h3 id="selinuxの拒否ログが1241件"&gt;SELinuxの拒否ログが1,241件&lt;/h3&gt;
&lt;p&gt;もう一つ。SELinuxがauction-botの&lt;code&gt;auction.db&lt;/code&gt;に対するlockアクセスを毎分拒否していた。過去24時間で1,241件。&lt;/p&gt;
&lt;p&gt;SELinuxはPermissiveモードで動いているので、実際にブロックはされていない。アプリは正常に動く。ただ、拒否のたびに&lt;code&gt;setroubleshoot&lt;/code&gt;というデーモンが起動して分析を行い、CPU 22.9%を一時的に消費していた。&lt;/p&gt;
&lt;p&gt;実害はないが、無駄にリソースを食っている。AIが見つけなければ、ずっと放置されていたと思う。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="日々の定点観測"&gt;日々の定点観測&lt;/h2&gt;
&lt;p&gt;パトロールは毎日サーバー全体を見て回る。何を見るかもAIが判断するが、結果として日をまたぐとトレンドが見えてくる。&lt;/p&gt;
&lt;h3 id="スワップ使用率の推移"&gt;スワップ使用率の推移&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;日付&lt;/th&gt;
 &lt;th&gt;スワップ使用率&lt;/th&gt;
 &lt;th&gt;備考&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;4/2&lt;/td&gt;
 &lt;td&gt;89%&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4/3&lt;/td&gt;
 &lt;td&gt;92%&lt;/td&gt;
 &lt;td&gt;微増傾向&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4/4&lt;/td&gt;
 &lt;td&gt;62%&lt;/td&gt;
 &lt;td&gt;サーバー再起動でリセット&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;スワップが日々積み上がっていく傾向をAIが追跡していた。4/4にサーバーが再起動されてリセットされたが、再起動なしの長期稼働ではスワップが逼迫する可能性がある。AIはレポートに「継続監視が必要」と毎回書いている。&lt;/p&gt;
&lt;h3 id="fail2banのban推移"&gt;fail2banのBAN推移&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;日付&lt;/th&gt;
 &lt;th&gt;現在BAN中&lt;/th&gt;
 &lt;th&gt;累計BAN&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;4/2&lt;/td&gt;
 &lt;td&gt;14 IP&lt;/td&gt;
 &lt;td&gt;235&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4/3&lt;/td&gt;
 &lt;td&gt;10 IP → 14 IP&lt;/td&gt;
 &lt;td&gt;242 → 293&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4/4&lt;/td&gt;
 &lt;td&gt;8 IP&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SSHへのブルートフォース攻撃が日常的に来ている。&lt;code&gt;admin&lt;/code&gt;、&lt;code&gt;ubuntu&lt;/code&gt;、&lt;code&gt;mysql&lt;/code&gt;といった汎用ユーザー名での接続試行。fail2banが淡々とBANしている。パスワード認証は無効で鍵認証のみなので突破はされないが、攻撃が来ていること自体は知っておきたい。AIがレポートで毎日報告してくれる。&lt;/p&gt;</description></item><item><title>サーバー管理をAIに丸ごと任せてみた話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-server-management/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-server-management/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/claude-code-deploy/"&gt;以前の記事&lt;/a&gt;で、AIにSSHでサーバーを直接触らせたら楽だったという話を書いた。デプロイスクリプトを作らせて、ビルドからコンテナ更新まで一発で終わるようにした。&lt;/p&gt;
&lt;p&gt;その後、&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/discord-bot-to-saas/"&gt;自分専用のBotをSaaS化した&lt;/a&gt;。これも本番は自宅サーバーで動いている。&lt;/p&gt;
&lt;p&gt;ここまで来ると、次に思うことは一つだ。&lt;strong&gt;運用も任せたらいいんじゃないか？&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題があったら直させればいい"&gt;問題があったら直させればいい&lt;/h2&gt;
&lt;p&gt;AIはコーディングが得意だ。セキュリティの知識もある。サーバーの設定も読める。&lt;/p&gt;
&lt;p&gt;だったら、サーバーに問題が起きた時に、AIに調べさせて、直させて、デプロイまでやらせればいい。人間が夜中に叩き起こされてログを読む必要はない。&lt;/p&gt;
&lt;p&gt;もう一つ、大事な理由がある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分がコードベースで指示したら、自分の知識の範囲内の行動しかしてくれなくなる。&lt;/strong&gt; セキュリティの設定をどうすべきか、コンテナの構成に問題がないか——正直、自分よりOpusのほうが詳しい。だから細かい手順を指示するのではなく、Opusの自律的な判断に委ねることにした。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;作ったのは、Electronのタスクトレイに常駐する監視アプリだ。&lt;/p&gt;
&lt;h3 id="昼間--軽量監視"&gt;昼間 — 軽量監視&lt;/h3&gt;
&lt;p&gt;AIをずっと動かすとMAXプランの使用量を食う。だから昼間はAIを使わない。&lt;/p&gt;
&lt;p&gt;代わりに、監視スクリプトが60秒ごとにSSHでサーバーの状態をチェックする。コンテナが動いているか、HTTPのレスポンスが返ってくるか、データベースに接続できるか。異常を検知したらまずコンテナの再起動を試みて、それでも駄目ならAIを起動する。&lt;/p&gt;
&lt;h3 id="深夜--aiのフルパトロール"&gt;深夜 — AIのフルパトロール&lt;/h3&gt;
&lt;p&gt;毎日深夜4時に、AIがサーバー全体を巡回する。セキュリティ設定、リソース使用量、コンテナの構成。昼間の監視スクリプトでは拾えない問題を、AIの目で洗い出す。&lt;/p&gt;
&lt;p&gt;なぜ深夜か。MAXプランの使用量は時間経過で回復する。深夜に使っても自分が起きた頃には回復しているし、使わなければその枠は無駄になるだけだ。有効活用しない手はない。&lt;/p&gt;
&lt;h3 id="監視スクリプトもaiが作る"&gt;監視スクリプトもAIが作る&lt;/h3&gt;
&lt;p&gt;面白いのは、監視スクリプト自体もAIに作らせていることだ。深夜のパトロール時に、サーバーの構成を見て、何をどう監視すべきかをAI自身が判断して、スクリプトを生成・更新する。&lt;/p&gt;
&lt;p&gt;自分が「このポートを監視しろ」と指定するのではなく、AIが「このコンテナにはこのチェックが必要だ」と決める。さっき書いた通り、自分の知識に閉じたくないからだ。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3層のエージェント構造"&gt;3層のエージェント構造&lt;/h2&gt;
&lt;p&gt;異常が検知されてAIが動き出すとき、1つのAIが全部やるわけではない。役割を3層に分けている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;親エージェント&lt;/strong&gt; — 症状を検知して、どのアプリに問題があるかを特定する。ここで大事なのは、親は&lt;strong&gt;症状だけを渡す&lt;/strong&gt;ということだ。「コンテナが落ちた」「HTTPが500を返した」という事実だけ。なぜ落ちたか、どう直すべきかは親が判断しない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;子エージェント&lt;/strong&gt; — 該当アプリのプロジェクトで起動して、原因を調査し、コードを修正し、テストして、デプロイする。症状から原因を特定するのは子の仕事だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;孫エージェント&lt;/strong&gt; — 子が立てた修正方針を監査する。「この修正で別の問題が起きないか」をチェックしてから、実行に移る。&lt;/p&gt;
&lt;p&gt;なぜ親が診断しないかというと、子のほうがそのプロジェクトに詳しいからだ。子は該当アプリのプロジェクトフォルダで起動するので、CLAUDE.mdもコードも全部読める。親はサーバー全体を見ているだけで、個々のアプリの内部構造は知らない。親が原因まで推測すると、その推測に引っ張られる。だから症状だけ渡して、現場に判断させる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="実際に起きたこと"&gt;実際に起きたこと&lt;/h2&gt;
&lt;p&gt;先日、監視スクリプトがエラーを検知した。AIが出動して調査を始めた。&lt;/p&gt;
&lt;p&gt;結果：&lt;strong&gt;監視スクリプト自身のバグだった。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AIが作った監視スクリプトのエラーを、AIが自分で見つけて、自分で直した。人間は何もしていない。Discordに「修正しました」と通知が来て、それで終わりだ。&lt;/p&gt;
&lt;p&gt;笑い話みたいだが、これは仕組みがちゃんと動いている証拠でもある。完璧なスクリプトを最初から書く必要はない。問題が起きたら直す——そのループが自動で回っている。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="自分のサーバーだからできること"&gt;自分のサーバーだからできること&lt;/h2&gt;
&lt;p&gt;こういう話をすると「無責任だ」と思う人もいるだろう。セキュリティを商売にしている人から見れば、AIに判断を丸投げするなんて、とんでもないかもしれない。&lt;/p&gt;
&lt;p&gt;でも俺は個人開発者だ。自分のサーバーで、自分のサービスを動かしている。セキュリティやサーバー管理の知識は、正直、自分よりOpusのほうが持っている。自分より詳しいやつに頼るのは、無責任ではなく合理的だと思っている。&lt;/p&gt;
&lt;p&gt;もちろん、これを他人に配る気はない。自分のサーバーだから好きにできるが、他人のサーバーをぶっ壊したら洒落にならない。「自分用」と割り切っているからこそ、AIに任せきれる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="おわりに"&gt;おわりに&lt;/h2&gt;
&lt;p&gt;SSHでサーバーを触らせるところから始まって、デプロイを任せて、SaaS化を任せて、今は運用まで任せている。&lt;/p&gt;
&lt;p&gt;できるだけ自分の知識で縛らず、AIの判断に委ねる。そうすると、自分が知らなかった問題をAIが見つけて、自分では書けなかった修正をAIが入れてくれる。自分で監視スクリプトを書いていたら、そのバグには気づけなかった。&lt;/p&gt;
&lt;p&gt;個人開発者がサーバーを運用するのは大変だ。でも今は、深夜のうちにAIが見回ってくれる。朝起きたらDiscordに「異常なし」と来ている。それだけで安心して寝られる。&lt;/p&gt;
&lt;p&gt;指示を細かく書くより、任せたほうがうまくいく。そういう付き合い方が、だんだん見えてきた。&lt;/p&gt;</description></item><item><title>5年育てた自分専用Botを、SaaSにして売り出した話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/discord-bot-to-saas/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/discord-bot-to-saas/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;俺はMMOゲームのギルドで、オークションBotを5年間使ってきた。&lt;/p&gt;
&lt;p&gt;Lineage2Mが2021年にリリースされた頃から、ギルドのボスドロップ分配を自動化するために作ったDiscord Botだ。HIT The Worldでも使った。メンバーが入札して、最高額をリアクション参加者で割って分配する。手作業でやるとスプレッドシートとにらめっこになるやつを、Botに全部やらせていた。&lt;/p&gt;
&lt;p&gt;5年間、自分のギルドでずっと動いていた。便利だった。でも、あくまで自分専用だった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="自分専用の実態"&gt;「自分専用」の実態&lt;/h2&gt;
&lt;p&gt;5年も育ててきたとはいえ、中身はひどいものだった。&lt;/p&gt;
&lt;p&gt;ギルド名がハードコードされている。タイムゾーンは決め打ち。言語は日本語しかない。設定ファイルなんてものはなく、変えたい値はソースコードを直接書き換える。&lt;/p&gt;
&lt;p&gt;複数のサーバーで使いたい時は、&lt;strong&gt;コンテナごとコピーしていた。&lt;/strong&gt; 同じBotをもう一個立てて、トークンだけ変えて動かす。マルチテナント？ なにそれ。&lt;/p&gt;
&lt;p&gt;課金システムなんてもってのほかだ。サブスクリプションも、利用規約も、決済画面もない。誰かに売るなんて想定していない。自分が使えればそれでよかった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="saas化を決めた理由"&gt;SaaS化を決めた理由&lt;/h2&gt;
&lt;p&gt;ふと思った。&lt;strong&gt;このBot、売れるんじゃないか。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;多くのMMOギルドが同じ課題を抱えている。ボスのレアドロップが出た。誰が取る？ オークションで決めよう。でもオークションの管理は面倒すぎる。入札を手動で集計して、分配金額を計算して、結果を全員に通知する。やりたいけど、手作業じゃ無理——そういうギルドは多い。&lt;/p&gt;
&lt;p&gt;ただ、自分専用Botをサービスにするには巨大な改修が必要だ。マルチテナント化、課金、管理画面、多言語対応、法的対応。自分の手でやる気力はまったく起きない。&lt;/p&gt;
&lt;p&gt;でも今はAIコーディングの時代だ。不確定要素がない決まった作業なら、AIに一気に終わらせてもらえる。研究や実験と違って「調べてみないとわからない」がないやつ。そう踏んで、やることにした。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コードの改修"&gt;コードの改修&lt;/h2&gt;
&lt;p&gt;マルチテナント化、Stripe課金連携、OAuth2認証、Web管理画面、4言語対応。やることリストは長かったが、どれも定型作業だ。パターンは決まっているし、公式ドキュメントもある。ゴールは明確だ。&lt;/p&gt;
&lt;p&gt;設計方針を決めて、実装はAIに任せた。一つ一つは別に難しくないが、量が膨大で、手作業で片付ける気にはならない類の作業だ。&lt;/p&gt;
&lt;p&gt;最初にClaudeが出してきた方針が「856行のserver.jsを8モジュールに分割して、ギルドごとに設定を持てる構造にする。大改修です」だった。脅されたが、もともと動いていたプログラムで動作のロジックは明確だし、上に書いた通り不確定要素がない。案外あっさり終わるんじゃないかと期待していた。AIが得意な仕事なんじゃないかと。&lt;/p&gt;
&lt;p&gt;実際、コードの改修は1日で終わった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="大変だったのはコードの外側"&gt;大変だったのはコードの外側&lt;/h2&gt;
&lt;p&gt;コードの改修より、&lt;strong&gt;「商品にする」ための作業&lt;/strong&gt;のほうがよほど考えることが多かった。&lt;/p&gt;
&lt;h3 id="法律"&gt;法律&lt;/h3&gt;
&lt;p&gt;サブスクリプションでお金を取るなら、特定商取引法に基づく表記が必要になる。利用規約も書かなきゃいけない。消費者契約法に配慮した免責条項、返金ポリシー、個人情報の取り扱い。個人開発者がサービスを売る時に避けて通れない部分だ。&lt;/p&gt;
&lt;p&gt;これもAIと一つずつ潰していった。「特商法に何を書くべき？」「この条項いる？」と相談しながら、最終的に全17条の利用規約ができた。法律の専門家ではないから正確さの保証はできないが、少なくとも「何も考えてない」状態からは脱出できた。&lt;/p&gt;
&lt;h3 id="stripeの審査"&gt;Stripeの審査&lt;/h3&gt;
&lt;p&gt;決済にStripeを使っているが、本番環境で動かすにはStripeの審査を通す必要がある。セキュリティがちゃんとしているかもチェックされる。&lt;/p&gt;
&lt;p&gt;そこでAIにプロジェクト全体のセキュリティ監査をさせた。13件の指摘が出た。JWT有効期限チェックの欠落、OAuth2のオープンリダイレクト脆弱性、オークション終了の二重通知、APIのレート制限なし——自分では気づけなかったものも含めて、全部その場で修正させた。&lt;/p&gt;
&lt;p&gt;5年間「自分しか使わないから」で見て見ぬふりをしてきた部分が、商品にする段階で一気に表面化した。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="デプロイ"&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;Botの本番デプロイには、自宅サーバーを使っている。&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/claude-code-deploy/"&gt;以前の記事&lt;/a&gt;で書いた通り、AIにSSHでサーバーを直接触らせるスタイルだ。deploy.shを一発叩けば、ビルドからコンテナ更新まで全部終わる。&lt;/p&gt;
&lt;p&gt;Web管理画面はVercelにデプロイ。こっちはgit pushだけ。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="auctionbot"&gt;AuctionBOT&lt;/h2&gt;
&lt;p&gt;5年間、自分のギルドだけで動いていたBotが、今日からサービスとして公開された。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://web-quo-lu.vercel.app/"&gt;AuctionBOT&lt;/a&gt;&lt;/strong&gt; — DiscordでギルドオークションをBotが全自動管理する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/setup&lt;/code&gt; でチャンネルを自動作成、&lt;code&gt;/auction&lt;/code&gt; でオークション開始&lt;/li&gt;
&lt;li&gt;メンバーがリアクションで参加登録、数字を投稿して入札&lt;/li&gt;
&lt;li&gt;終了後、落札額 ÷ 参加人数を自動計算して分配結果を通知&lt;/li&gt;
&lt;li&gt;スナイプ防止（終了間際の入札で自動延長）&lt;/li&gt;
&lt;li&gt;4言語対応（英語・日本語・韓国語・中国語）&lt;/li&gt;
&lt;li&gt;Free（1同時オークション）/ Pro（月500円、無制限）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ボスドロップの分配で揉めてるギルド、手作業の集計に疲れてるギルドリーダーがいたら、試してみてほしい。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="おわりに"&gt;おわりに&lt;/h2&gt;
&lt;p&gt;コードの改修は、正直AIに任せたら終わる時代になった。マルチテナント化も課金連携も多言語対応も、パターンが決まっている作業は一気に片付く。&lt;/p&gt;
&lt;p&gt;でも「商品にする」のは、コードだけじゃ終わらない。法律、セキュリティ、値付け、ランディングページ。自分で判断しなきゃいけないことが山ほどある。AIは相談相手にはなるが、最終的に決めるのは自分だ。&lt;/p&gt;
&lt;p&gt;5年間、自分だけが使ってきたツールが、今日から他の誰かに使ってもらえるものになった。売れるかどうかはわからない。でもまあ、出さなきゃ始まらない。&lt;/p&gt;</description></item><item><title>サーバーに実装する時にClaudeにSSH使わせたら驚くほど楽だった話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/claude-code-deploy/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/claude-code-deploy/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;AIにコードを書かせるのはもう慣れた。設計は自分でやって、実装はClaudeに任せる。いつものスタイルだ。&lt;/p&gt;
&lt;p&gt;ただ、作ったものを自宅サーバーに載せる作業——デプロイは、自分の手でやるもんだと思っていた。Dockerでイメージをビルドして、サーバー側でpullして、コンテナ外にSQLiteのDBを置いて、.envを設定して、パーミッションを整えて。地味で面倒だが、こればっかりは手作業だろうと。&lt;/p&gt;
&lt;p&gt;そう思い込んでいた。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コピペ相談の限界"&gt;コピペ相談の限界&lt;/h2&gt;
&lt;p&gt;以前はサーバー側でトラブルが起きたら、ターミナルの出力をコピペしてAIに聞いていた。&lt;/p&gt;
&lt;p&gt;Nextcloudを自宅サーバーに入れた時がひどかった。パーミッション周りのエラーが出て、GPT-5.4に相談したんだが、延々とループした。「このディレクトリの権限を変えてみてください」→ 変えた → 別のエラー → 「じゃあこっちも」→ 変えた → 最初のエラーに戻る。&lt;/p&gt;
&lt;p&gt;最終的にClaudeにも手伝ってもらって解決したが、相当時間を使った。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="スクリプト書きましょうか"&gt;「スクリプト書きましょうか？」&lt;/h2&gt;
&lt;p&gt;DiscordのオークションBotを自宅サーバーにデプロイする作業をしていた時のこと。&lt;/p&gt;
&lt;p&gt;コンテナの更新を何度かやった後、Claudeが聞いてきた。**「コンテナの更新を簡単にするスクリプト書きましょうか？」**と。&lt;/p&gt;
&lt;p&gt;いいよ、と返した。&lt;/p&gt;
&lt;p&gt;そしたらまず、SSH鍵認証の設定から始めた。鍵の生成、サーバー側のauthorized_keysへの登録。パスワードなしでリモート操作できる環境を整えてから、deploy.shを作った。&lt;/p&gt;
&lt;p&gt;それまでは、リモートのターミナルに手でコマンドを打ち込んでいた。エラーが出たらやり直しだし、動いたかどうかの確認もログをコピペして見てたし。面倒だった。&lt;/p&gt;
&lt;p&gt;deploy.shの中身はシンプルだ。ローカルでDockerイメージをビルド、GitHub Container Registryにpush、SSHでサーバーに入ってpodman pull（サーバー側はBazziteOSなのでDockerではなくpodman）、古いコンテナを止めて削除、新しいコンテナを起動。DBのボリュームマウントも.envの読み込みも全部入っている。これがスクリプト一発で終わる。&lt;/p&gt;
&lt;p&gt;しかもそこから先、起動時にBotがエラーを吐いた時も、ClaudeがSSHでサーバーのログを確認して、原因を特定して、ローカルでコードを直して、deploy.shで再デプロイ。一つのセッションで全部完結した。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コピペと直接触らせるの差"&gt;コピペと直接触らせるの差&lt;/h2&gt;
&lt;p&gt;コピペで相談していた頃は、AIはサーバーの状態が見えていなかった。エラーメッセージだけ渡されても、「操作ミスでは？」「環境設定が違うのでは？」という可能性を一個ずつ手動で潰すしかない。人間がコピペで中継する分、遠回りになる。&lt;/p&gt;
&lt;p&gt;SSHで直接触らせると、Claudeが自分の目でサーバーの状態を確認できる。推測じゃなくて事実ベースで動ける。&lt;/p&gt;
&lt;p&gt;やっていることは &lt;code&gt;ssh user@host &amp;quot;コマンド&amp;quot;&lt;/code&gt; をBashから叩いているだけだ。特別な仕組みがあるわけじゃない。鍵認証が通っていれば、Claudeからすると「ちょっと遠いターミナル」でしかない。&lt;/p&gt;
&lt;p&gt;怖くないのかという話だが、ポートはSSHと80しか開けていないし、まだ売上もない環境だ。それに、Opusは指示の意図を正確に汲んでくれるから、変なコマンドを叩かれる心配が少ない。これが精度の低いモデルだったら怖いと思う。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;デプロイは手作業でやるもんだと思い込んでいた。Claudeに「スクリプト書きましょうか？」って言われるまで、任せるって発想がなかった。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;このブログ「Claude Code 始めました」は、Claude MAX ユーザーが実際の開発で使いながら学んだことを記録していくサイトです。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>自力じゃ無理なロジック、Claudeと論文から組み立てた話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/claude-research-implementation/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/claude-research-implementation/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;AIコーディングでアプリを作っていると、「何を作るか」は自分で決められます。設計も方針も自分で出せます。でも、たまに壁にぶつかります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;やりたいことはあるのに、それを実現するロジックの引き出しが自分にない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;プログラマーでもないですし、信号処理の専門家でもないです。そういう時にClaudeが頼りになった話です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題音声の男女判定がうまくいかない"&gt;問題：音声の男女判定がうまくいかない&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/livetr-app/"&gt;LiveTR&lt;/a&gt;（リアルタイム音声翻訳アプリ）に、話者の性別に応じて読み上げの声を切り替える機能を入れたかったんです。男性の声なら男性っぽく、女性の声なら女性っぽく。&lt;/p&gt;
&lt;p&gt;最初に思いつくのは基本周波数（ピッチ）で判定する方法です。男性は低い、女性は高い。シンプル。&lt;/p&gt;
&lt;p&gt;やってみました。普通の会話なら、まあまあ動きます。&lt;/p&gt;
&lt;p&gt;ところがF1の中継を流してみると、&lt;strong&gt;解説者が興奮するたびに女性判定になります&lt;/strong&gt;。レースが白熱するとピッチが上がるので、男性の声なのに「女性」と判定される。これが頻繁に起きます。&lt;/p&gt;
&lt;p&gt;ピッチだけじゃダメです。でも、じゃあ他に何を見ればいいのか。自分にはわかりませんでした。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claudeに聞いてみました"&gt;Claudeに聞いてみました&lt;/h2&gt;
&lt;p&gt;「音声の性別判定で、ピッチだけだと興奮時に誤判定する。学術的にはどういう手法がある？」&lt;/p&gt;
&lt;p&gt;Claudeに調べてもらいました。Researchモード（Claudeが自律的にWebを検索して調査してくれる機能）で学術論文や特許を探させると、自分では辿り着けなかった手法がいくつか出てきました。&lt;/p&gt;
&lt;p&gt;ピッチだけじゃなくて、フォルマント（声道の共鳴周波数）やMFCC（メル周波数ケプストラム係数）など、複数の指標を組み合わせることで、興奮状態でも安定した判定ができるそうです。&lt;/p&gt;
&lt;p&gt;論文の内容を全部理解したかと言われると、正直怪しいです。でもClaudeが「この手法はこういう原理で、こういう特徴がある」と説明してくれるので、方針は立てられました。そこから自分で「この組み合わせでいこう」と決めて、構成を詰めていきました。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="そのまま実装へ"&gt;そのまま実装へ&lt;/h2&gt;
&lt;p&gt;方針が決まったら、あとはClaudeと一緒に組み立てていきました。&lt;/p&gt;
&lt;p&gt;「この論文の手法をベースに、こういう構成で実装してほしい」と伝えると、Claudeがコードを書いてくれます。動かして、結果を確認して、おかしければ調整する。いつものサイクルです。&lt;/p&gt;
&lt;p&gt;F1の中継でテストしてみたら、解説者が興奮しても男性のまま判定されるようになりました。ピッチだけの時とは安定感が全然違います。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="これがaiコーディングの強みだと思います"&gt;これがAIコーディングの強みだと思います&lt;/h2&gt;
&lt;p&gt;コードを書いてくれること自体はもう当たり前になってきました。でも、自分の知らない分野の知識を引っ張ってきて、それを実装に落とし込めるのは、また別の価値だと思います。&lt;/p&gt;
&lt;p&gt;信号処理の論文なんて自分で探して読む力はないです。でもClaudeに「こういう問題がある」と伝えれば、関連する研究を調べてきて、それを動くコードにしてくれます。&lt;/p&gt;
&lt;p&gt;もちろん、出てきたものをそのまま信用するわけじゃないです。動かして、テストして、おかしければ方針から見直す。そこは変わりません。でも、&lt;strong&gt;知識のスタート地点がゼロじゃなくなる&lt;/strong&gt;のが大きいです。&lt;/p&gt;
&lt;p&gt;一つ注意。いくら良い成果が得られたとしても、特許を参照して作ったロジックで商売したら、特許権侵害になる可能性があります。論文ベースでも、その手法に関連する特許が存在することはあります。商用利用する場合は、権利関係の確認が必要です。これもClaudeに「この手法に関連する特許はある？」と聞けば調べてくれます。ただ、Claudeの調査が完璧とは限らないので、最終的な判断は自分で行う必要があります。&lt;/p&gt;
&lt;p&gt;自分はコードを書く側の人間じゃない。設計して、方針を決めて、判断するのが自分の仕事。Claudeは知識を引っ張ってきて、それを動くコードにしてくれる。今回はこの役割分担がきれいにハマった例だと思う。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;このブログ「Claude Code 始めました」は、Claude MAX ユーザーが実際の開発で使いながら学んだことを記録していくサイトです。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>LiveTR — 動画の英語音声をリアルタイムで日本語にするアプリ</title><link>https://kitepon-rgb.github.io/WebAICoding/post/livetr-app/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/livetr-app/</guid><description>&lt;h2 id="livetrとは"&gt;LiveTRとは&lt;/h2&gt;
&lt;p&gt;PCで再生中の動画の英語音声をリアルタイムに認識して、日本語に翻訳するWindows用アプリです。翻訳結果は字幕として画面にオーバーレイ表示され、日本語で読み上げもしてくれます。&lt;/p&gt;
&lt;p&gt;YouTube、Twitch、ローカル動画ファイル。英語の音声が流れていれば、ソースは問いません。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="主な機能"&gt;主な機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;リアルタイム音声認識&lt;/strong&gt; — faster-whisperで英語音声をその場で文字起こしします&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日本語翻訳&lt;/strong&gt; — オンライン翻訳サービス（Google Cloud、DeepL、Azure、Amazon）に対応しています&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字幕オーバーレイ&lt;/strong&gt; — 翻訳結果を透過ウィンドウで表示します。位置やサイズは調整可能で、クリックは透過します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日本語読み上げ&lt;/strong&gt; — AivisSpeechで翻訳結果を読み上げます。話者の声質を自動で反映します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動ダッキング&lt;/strong&gt; — 読み上げ中は動画の音量を自動で下げて、聞き取りやすくします&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プロセス単位の音声キャプチャ&lt;/strong&gt; — 指定したアプリの音声だけを拾います。読み上げ音声を再キャプチャするループも防止しています&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;アプリを起動します&lt;/li&gt;
&lt;li&gt;音声をキャプチャしたいプロセスを選択します&lt;/li&gt;
&lt;li&gt;「開始」を押すと、音声認識・翻訳・字幕表示・読み上げが始まります&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="動作環境"&gt;動作環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 / 11（64bit）&lt;/li&gt;
&lt;li&gt;NVIDIA GPU（CUDA 12.x対応）&lt;/li&gt;
&lt;li&gt;メモリ 16GB以上推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPU必須です。音声認識モデルをリアルタイムで回すので、それなりのスペックが要ります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="開発の話"&gt;開発の話&lt;/h2&gt;
&lt;p&gt;Claude Codeだけで作りました。期間は約4日。&lt;/p&gt;
&lt;p&gt;OLTranslatorが画面のテキストを翻訳するアプリだったので、「じゃあ音声も同じことできないか」と思って作り始めました。OLTranslatorはCopilotで2週間かかったので、それと比べるとかなり速い。もちろん自分がAIコーディングに慣れてきた部分もあるが、CLAUDE.mdでプロジェクトの方針を引き継げることと、設計→指示→レビューのサイクルがClaude Codeだと自然に回るのが大きかった。&lt;/p&gt;
&lt;h2 id="こだわったところ"&gt;こだわったところ&lt;/h2&gt;
&lt;p&gt;音声認識で拾った文を、どこで切って翻訳に回すか。一文をどこで区切るか、途中で切られてしまったらどう繋げるか。これは翻訳精度に直結するので、かなり気を使いました。&lt;/p&gt;
&lt;p&gt;話者の性別判定にもこだわりました。読み上げの声を話者に合わせたかったので、論文や特許を参考にしながらClaude Codeと一緒にロジックを組みました。AivisSpeechには複数の話者モデルがあるので、男性の声なら男性っぽく、女性の声なら女性っぽく読み上げます。&lt;/p&gt;
&lt;p&gt;ただ、この性別判定がかなり厄介だった。ピッチだけで判定すると、F1実況みたいに興奮してピッチが上がる場面で男性が女性判定になる。この問題をどう解決したかは「&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/claude-research-implementation/"&gt;自力じゃ無理なロジック、Claudeと論文から組み立てた話&lt;/a&gt;」で詳しく書いた。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ダウンロード"&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qo-shop.booth.pm/items/8134987"&gt;LiveTR — リアルタイム音声翻訳アプリ（BOOTH）&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="関連記事"&gt;関連記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/oltranslator-app/"&gt;OLTranslator&lt;/a&gt; — 画面テキスト版の翻訳アプリ。OLTranslatorが「文字」、LiveTRが「音声」。同じ翻訳でもアプローチが全然違う&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/claude-research-implementation/"&gt;自力じゃ無理なロジック、Claudeと論文から組み立てた話&lt;/a&gt; — 性別判定ロジックの技術的な深掘り&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;このブログ「Claude Code 始めました」は、Claude MAX ユーザーが実際の開発で使いながら学んだことを記録していくサイトです。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>ClaudeのMAXプランで何が変わるか</title><link>https://kitepon-rgb.github.io/WebAICoding/post/max-plan-review/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/max-plan-review/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;MAXプランにすると「たくさん使える」。それは誰でも知っている。&lt;/p&gt;
&lt;p&gt;俺が知りたいのはそこじゃない。&lt;strong&gt;MAXで実際に何が変わるのか&lt;/strong&gt;。調べてみたら、「MAX限定」だと思われがちな機能が実はそうじゃなかったり、逆にあまり知られていない違いがあったりした。&lt;/p&gt;
&lt;p&gt;公式ソースを確認しながら整理する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="デフォルトモデルがopus"&gt;デフォルトモデルがOpus&lt;/h2&gt;
&lt;p&gt;Proだとデフォルトモデルは&lt;strong&gt;Sonnet&lt;/strong&gt;。MAXだと&lt;strong&gt;Opus 4.6がデフォルト&lt;/strong&gt;になる。&lt;/p&gt;
&lt;p&gt;地味に見えるが、これは大きい。Proだと毎回Opusに切り替える手間があるし、使用量を気にして「Sonnetでいいか…」と妥協しがちになる。MAXなら最初からOpusで、そのまま使い続けられる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参照：&lt;a href="https://support.claude.com/en/articles/11049741-what-is-the-max-plan"&gt;What is the Max plan?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1mコンテキストウィンドウが追加料金なし"&gt;1Mコンテキストウィンドウが追加料金なし&lt;/h2&gt;
&lt;p&gt;Opus 4.6は最大100万トークン（1M）のコンテキストウィンドウに対応している。ただし、&lt;strong&gt;プランによって扱いが違う&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;プラン&lt;/th&gt;
 &lt;th&gt;Opusの1Mコンテキスト&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;MAX / Team / Enterprise&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;サブスクに含まれる&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pro&lt;/td&gt;
 &lt;td&gt;extra usageを有効にする必要あり（追加課金）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;MAXなら何も設定しなくても自動的にOpusが1Mコンテキストにアップグレードされる。Proだと1Mを使うには「extra usage」を有効にして、追加料金を受け入れる必要がある。&lt;/p&gt;
&lt;p&gt;100万トークンあると何が変わるか：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大きなコードベースでファイル間の依存関係をまとめて把握できる&lt;/li&gt;
&lt;li&gt;長いセッションで前の文脈が消えにくい&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compact&lt;/code&gt;の頻度が減る&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;参照：&lt;a href="https://code.claude.com/docs/en/model-config"&gt;Model configuration - Claude Code Docs（Extended context）&lt;/a&gt;
参照：&lt;a href="https://claude.com/blog/1m-context-ga"&gt;1M context is now generally available&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="新機能への優先アクセス--これが意外とデカい"&gt;新機能への優先アクセス — これが意外とデカい&lt;/h2&gt;
&lt;p&gt;公式に明記されている：&lt;strong&gt;新機能やモデルはMAXに最初に提供されることが多い&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;実際にどの機能がMAX先行だったか具体的に並べてみる：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th&gt;MAX先行&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Remote Control (&lt;code&gt;/rc&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;スマホからClaude Codeでガッツリ開発&lt;/td&gt;
 &lt;td&gt;2026年2月〜。Proにはまだ来ていない（2026年3月時点）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Cowork&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;macOSアプリでClaudeに作業を委任&lt;/td&gt;
 &lt;td&gt;2026年1月〜。Proは後日&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Dispatch&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;スマホからCoworkにタスクを投げる&lt;/td&gt;
 &lt;td&gt;2026年3月〜。Proは数日後&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Computer Use&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ClaudeがPCを直接操作&lt;/td&gt;
 &lt;td&gt;2026年3月〜。Proは2日後&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;会話の記憶を自動保持&lt;/td&gt;
 &lt;td&gt;2025年10月〜。Proは数日後&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;パターンが見える。&lt;strong&gt;エージェント系の新機能は、ほぼ全部MAXが先&lt;/strong&gt;だ。差は数日のこともあれば、&lt;code&gt;/rc&lt;/code&gt;のように1ヶ月以上Proに来ていないものもある。&lt;/p&gt;</description></item><item><title>Copilot → Cursor → Claude Code for VSC。俺が辿り着くまでの話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-coding-tool-journey/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-coding-tool-journey/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;AIコーディングツールが乱立している。GitHub Copilot、Cursor、Claude Code、Cline、Continue……選択肢が多すぎて、何を使えばいいか分からない。&lt;/p&gt;
&lt;p&gt;自分はその中をけっこう彷徨った。
最終的に&lt;strong&gt;VS Code + Claude Code拡張 + MAXプラン&lt;/strong&gt;に落ち着いたが、ここに辿り着くまでに試行錯誤したしお金もかかった。&lt;/p&gt;
&lt;p&gt;同じように迷っている人に向けて、なぜこの構成に落ち着いたのか書いておく。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="前提自分の開発スタイル"&gt;前提：自分の開発スタイル&lt;/h2&gt;
&lt;p&gt;まず、自分はコードをゴリゴリ手で書くタイプではない。&lt;/p&gt;
&lt;p&gt;アプリケーションを開発しているが、やっていることは&lt;strong&gt;設計と方針決め&lt;/strong&gt;。コードの実装はAIに任せて、出てきたものをレビューする。言語は気にしていない。AIが書いてくれるので。いわゆるアーキテクト型の開発スタイルだ。&lt;/p&gt;
&lt;p&gt;もう一つ重要なのが、&lt;strong&gt;画像を頻繁に共有する&lt;/strong&gt;こと。UIのスクリーンショットやエラー画面をAIに見せて「これどうなってる？」と聞くことが多い。この使い方が、最終的なツール選びに大きく影響した。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claude-pro--実は最初にいたのはここ"&gt;Claude Pro — 実は最初にいたのはここ&lt;/h2&gt;
&lt;p&gt;意外かもしれないが、一番最初に課金したのはClaude Proだった。&lt;/p&gt;
&lt;p&gt;対話の質は最初から良かった。設計の相談にちゃんと付き合ってくれるし、方針の壁打ちができる。ただ、致命的な問題があった。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すぐに上限が来て作業が止まる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;集中して開発しているときに「しばらくお待ちください」が出る。あの瞬間のストレスは尋常じゃない。フローが完全に途切れる。結果、Claude Proは一旦離れることになった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="github-copilot--いろんなモデルが使える遊園地"&gt;GitHub Copilot — いろんなモデルが使える遊園地&lt;/h2&gt;
&lt;p&gt;次に行ったのがGitHub Copilot。VS Codeとの統合は自然だし、CopilotでClaudeのモデルが選べることに気づいた。あれ？じゃあClaude解約してCopilotだけでよくないか？と思った。&lt;/p&gt;
&lt;p&gt;しかもCopilotにはClaude以外のモデルもいる。ここでいろいろ触ることになる。&lt;/p&gt;
&lt;h3 id="gemini-31--うおおおーってなるが"&gt;Gemini 3.1 — うおおおーってなる、が&lt;/h3&gt;
&lt;p&gt;Gemini 3.1を使った時は正直テンション上がった。速いし賢い。&lt;/p&gt;
&lt;p&gt;ただ、こいつには問題があった。&lt;strong&gt;VS Codeの機能の外で勝手にファイル編集できるコードを仕込んでくる。&lt;/strong&gt; やめろと言ってもやる。傲慢。設計を自分で決めたい人間にとって、勝手に動かれるのは一番ストレスだ。&lt;/p&gt;
&lt;h3 id="gpt-54--すげぇからの気づき"&gt;GPT-5.4 — すげぇ！！！からの気づき&lt;/h3&gt;
&lt;p&gt;GPT-5.4も素晴らしかった。何でも自動でできる。すげぇ！！！と素直に思った。&lt;/p&gt;
&lt;p&gt;でも慣れてきた頃に気づくんだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;あれ、複雑になってきたら、バグの解決ってClaude強くね？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;コードが増えてきて、依存関係が絡み合って、エラーの原因が一筋縄ではいかなくなった時。粘り強く文脈を追いかけて、的確に原因を突き止めてくれるのはClaudeだった。&lt;/p&gt;
&lt;p&gt;まぁ、すぐに上限で止まるんだがね。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cursor--課金しまくった頃"&gt;Cursor — 課金しまくった頃&lt;/h2&gt;
&lt;p&gt;次に行ったのがCursor。AI機能が前面に出たエディタで、最初は「これだ」と思った。&lt;/p&gt;
&lt;p&gt;コードベース全体を読んで提案してくれるし、チャットでの対話もCopilotより自然。画像も貼れる。少しの間メインで使っていた。課金もけっこうした。&lt;/p&gt;
&lt;p&gt;ただ、使い込むうちに気になる点が出てきた。&lt;/p&gt;
&lt;p&gt;ちょっとややこしいことになると、モデルにClaudeを使いたくなるんだ。そして、いい結果が欲しくて使ってしまう。追加の課金がClaudeのSonnetとOpusの課金なのだ。&lt;/p&gt;
&lt;p&gt;そしてこの頃、ふと気づくことになる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claude-code--5時間ごとに回復するこれ最高じゃね"&gt;Claude Code — 5時間ごとに回復する、これ最高じゃね？&lt;/h2&gt;
&lt;p&gt;Claude Codeの存在を改めて見直した時、思った。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5時間ごとに使用量が回復する。これ、実質ずっと使えるのでは。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ここで冷静に計算した。CopilotとCursorに払っている月額を合わせたら、&lt;strong&gt;もうMAXプランに手が届く金額だった。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="max一本化--やってみたら最高だった"&gt;MAX一本化 — やってみたら最高だった&lt;/h2&gt;
&lt;p&gt;じゃあもうMAX一本でよくないか？&lt;/p&gt;</description></item><item><title>俺がClaude Codeの半分も使えてなかった話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/claude-code-features/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/claude-code-features/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Claude MAXを契約して、毎日のようにコーディングに使っている。
アプリケーションを開発していて、設計は自分でやって実装はClaudeに任せる——いわゆるアーキテクト型の使い方をしている。言語は気にしていない。AIが書いてくれるので。&lt;/p&gt;
&lt;p&gt;で、ある日気づいた。
&lt;strong&gt;俺、Claude Codeの機能を半分も知らなかった。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/init&lt;/code&gt;すら知らなかったし、&lt;code&gt;/rc&lt;/code&gt;の存在を知ったのもつい最近だ。
同じような人、けっこういるんじゃないかと思ってこの記事を書いている。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="rcremote-control-スマホからガッツリ開発できる"&gt;&lt;code&gt;/rc&lt;/code&gt;（Remote Control）— スマホからガッツリ開発できる&lt;/h2&gt;
&lt;p&gt;これが一番衝撃だった。&lt;/p&gt;
&lt;p&gt;PCでClaude Codeのセッションを起動したまま、スマホのClaudeアプリから同じセッションを操作できる。コードはすべてローカルのPCで実行されていて、スマホはその「窓」になるだけ。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/rc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これだけでQRコードが表示されて、スマホで読み取れば接続完了。&lt;/p&gt;
&lt;h3 id="何が嬉しいか"&gt;何が嬉しいか&lt;/h3&gt;
&lt;p&gt;見守りだけじゃない。スマホから普通に指示を出して、コードを書かせて、レビューもできる。自分はソファでコーヒー飲みながらスマホでガッツリ開発している。PCの前に張り付かなくていい。進捗を確認して、おかしな方向に行ってたら止められるし、そのまま次の指示も出せる。&lt;/p&gt;
&lt;h3 id="注意点"&gt;注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークが約10分切れるとセッションが切断される&lt;/li&gt;
&lt;li&gt;ターミナルを閉じたら終わり&lt;/li&gt;
&lt;li&gt;レートリミットに当たった後、リモート接続が復帰しないバグがある（2026年3月時点）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まだリサーチプレビューなので粗はあるが、方向性としては最高。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="init--クソ大事なのに案内がない"&gt;&lt;code&gt;/init&lt;/code&gt; — クソ大事なのに案内がない&lt;/h2&gt;
&lt;p&gt;これだけは声を大にして言いたい。&lt;strong&gt;大事。クソ大事。なのに大事そうに案内がない。やられた。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;新しいプロジェクトを始める時、Claude Codeにプロジェクトの構成を理解させるための初期化コマンド。これをやるかやらないかで、Claudeの理解度がまるで違う。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/init
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新しいセッションを立てたら、まず&lt;code&gt;/init&lt;/code&gt;。これを習慣にしてほしい。&lt;/p&gt;
&lt;p&gt;自分はこれを知らずにしばらく使っていた。Claudeが的外れな提案をしてくる度にイライラしていたが、&lt;code&gt;/init&lt;/code&gt;してなかっただけだった。最初にやっておけばよかった。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claudemd--initで気づくもう一つの存在"&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; — &lt;code&gt;/init&lt;/code&gt;で気づくもう一つの存在&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/init&lt;/code&gt;を実行すると、&lt;code&gt;CLAUDE.md&lt;/code&gt;というファイルが生成される。ここで初めてその存在に気づく人も多いんじゃないだろうか。自分がそうだった。&lt;/p&gt;
&lt;p&gt;これはプロジェクトルートに置いておくと、Claude Codeが毎回セッション開始時に読み込む指示書。&lt;/p&gt;
&lt;p&gt;自分の場合はここに開発方針やコードスタイルを書いている。「コード変更は差分提示→承認後に適用」とか「日本語でコメントを書く」とか。&lt;/p&gt;
&lt;p&gt;これがないと、毎回同じ注意を繰り返すことになる。&lt;code&gt;/init&lt;/code&gt; → &lt;code&gt;CLAUDE.md&lt;/code&gt;の流れは、Claude Codeを使う上での最初の一歩だと思う。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="planプランモード-質問しただけなのにコード直すな"&gt;Plan（プランモード）— 質問しただけなのにコード直すな&lt;/h2&gt;
&lt;p&gt;Claude君は優秀だ。優秀なんだが、質問しただけなのにコードを直し始めることがある。&lt;/p&gt;
&lt;p&gt;「このエラーどうなってる？」と聞いただけなのに、返ってきたらコードが書き換わっている。察しが良くて人間臭いのも悪くはないが、聞いただけの時は本当に聞いただけなんだよね。&lt;/p&gt;
&lt;p&gt;そんな時はPlanモードにした方がいい。VS CodeのClaude Codeパネルからモードを切り替えるだけ。Claudeが各アクションを提案して、承認してから動くようになる。&lt;/p&gt;
&lt;p&gt;コマンド（&lt;code&gt;/plan&lt;/code&gt;）もあるらしい。俺は使わんけど。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="effort思考の深さ-余裕があるなら常に最大でいい"&gt;Effort（思考の深さ）— 余裕があるなら常に最大でいい&lt;/h2&gt;
&lt;p&gt;effortはClaudeの思考の深さを調整する設定。VS CodeのClaude Codeパネルから切り替えられる。&lt;/p&gt;
&lt;p&gt;単純に、高い方がいい感じの答えが返ってくる。使用量は多くなるらしいが、5時間枠や一週間枠を見て余裕があるなら常に最大でいいんじゃないですかね。&lt;/p&gt;
&lt;p&gt;ちなみにMAXプランだと、最高設定がhighからMAXに昇格しますwww&lt;/p&gt;
&lt;p&gt;コマンド（&lt;code&gt;/effort&lt;/code&gt;）もあるらしい。俺は使わんけど。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="compact--コンテキストが膨らんだ時の救世主"&gt;&lt;code&gt;/compact&lt;/code&gt; — コンテキストが膨らんだ時の救世主&lt;/h2&gt;
&lt;p&gt;長時間作業していると、会話の蓄積でコンテキストが肥大化する。動作が重くなってきたと感じたら：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/compact
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;何を残すか指定もできる。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/compact エラーハンドリングのパターンは残して
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;目安としては、コンテキスト使用率が80%を超えたら実行。タスクを切り替える時は&lt;code&gt;/clear&lt;/code&gt;の方がいい。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="fork-と-rewind--実験と巻き戻し"&gt;&lt;code&gt;/fork&lt;/code&gt; と &lt;code&gt;/rewind&lt;/code&gt; — 実験と巻き戻し&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/fork&lt;/code&gt;は今の会話をブランチにコピーする。本線を汚さずに「ちょっとこっちの方針で試してみて」ができる。&lt;/p&gt;</description></item></channel></rss>