0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeで起動した裏方が会話終了で道連れ停止した話 〜罠をCLAUDE.md・コード・メモリに書き分ける〜

0
Posted at

AIは、会話が終わると全部忘れます😇 だから「同じ罠に二度はまらない」ためには、罠をどこかに書き残すしかありません。問題は、その「どこか」をどこにするか。意外と、ここで差がつきました。

日本株のAI銘柄スクリーニング&継続学習端末「ALPHA FORGE(アルファフォージ)」を、Claude Code と二人三脚で個人開発しています。この記事では、運用中に踏んだ3つの罠(子プロセスの道連れ停止、空のPIDファイル、APIキー名の衝突)と、それぞれの書き残し先の決め方をまとめます🗂️

【要約:この記事で伝えたいこと】

  1. AIに起動してもらった裏方の処理が、会話を閉じた瞬間に道連れで止まり、翌朝まで定期実行がお休みしていた🌙
  2. 自動起動も、古い記録ファイルのせいで約2週間「成功」と表示したまま何もしていなかった。クラウドではAPIキーの名前が開発ツール本体とぶつかる罠も🔑
  3. 持ち帰り:罠ごとに「毎回読む約束(CLAUDE.md)」「コード」「メモリ」へ書き分ける。どこに置くかで、次に効くかどうかが決まる

※本記事はnote連載[ALPHA FORGE 開発秘話 #14] の技術的な部分を、エンジニア向けに再構成したものです。

🌙 会話を閉じたら、裏方も一緒に止まった

項目 内容
開発 Claude Code(CLI)。システムの起動もAIに頼む
裏方 Celery のワーカーと beat(決まった時刻に仕事の合図を出す係)
環境 Windows(のちにクラウドの作業環境でも起動)

ALPHA FORGE には、画面の裏で動き続ける処理があります。朝の銘柄抽出、場中の監視、夜の答え合わせと学習。これらを動かしているのが Celery のワーカーと beat です。お店の裏で黙々と働く店員さんだと思ってください🧑‍🍳

9月25日の夕方、Claude Code にシステムを起動してもらい、作業を終えて会話を閉じました。17時44分のことです。そして翌朝、「あれ、定期実行が動いてない…?」と気づきました😳

原因はこうでした。AIがコマンドで起動した処理は、AI自身の「子ども」のプロセスとして生まれます。親である会話のセッションが終わると、子どもも道連れで終了します。会話を閉じた瞬間、ワーカーも beat も、一緒に帰宅していたのです🏃

🕳️ 「成功」と言いながら、2週間なにもしていなかった

02_wall.jpg
表示は「成功」でも、裏では何も起動していない。罠はエラーを出さずに潜んでいた

PCにログオンしたときに全部を自動で起動する仕組みも用意してあります。ところが、その2日後。こちらにも別の罠が潜んでいました😱

  1. 起動スクリプトは、二重起動を防ぐために「起動中の印」として記録ファイル(PIDファイル)を置く
  2. このファイルが、中身が空のまま、9月15日から残っていた
  3. スクリプトは「ファイルがある=起動中」と判断して、何もせずに終了する
  4. しかも失敗を呼び出し元に伝えていなかったので、自動起動のタスクは「成功」と表示されたまま

修正が入ったのは9月28日の朝。約2週間、自動起動は「やりました!」という顔で、黙って何もしていなかったことになります😴

「ファイルがあるか」で生死を判断すると、古いファイルが残った瞬間に壊れます。さらに失敗の終了コードを返さないと、上位のタスクは「成功」と表示し続けます。二重起動防止は、必ず生きているかの確認とセットにしましょう。

さらに10月1日、クラウドの作業環境でも動かせるようにしたところ、3つ目の罠が見つかりました。アプリがLLMを呼ぶためのAPIキーと、開発ツール(Claude Code)自身が使うAPIキーは、標準の環境変数名が同じなのです。そのまま置くと、開発ツールの利用料金がアプリ用のキーに付く恐れがあります💸

fig_traps.jpg
踏んだ罠は3つ。どれもエラーは出ず、静かに間違ったまま動いていた

3つとも、エラーは出ません。静かに、間違ったまま動きます。これが一番たちが悪いんですよね😱

🗂️ 罠ごとに、書き残す場所を選ぶ

03_fix.jpg
罠の性質に合わせて、毎回読む約束・コード・メモリへ書き分ける

第5話で、守りたいルールの置き場所を4つに分けている、と書きました📚 毎回全員が読む約束は CLAUDE.md、毎回同じ手順はスキル、私の判断のクセはメモリ、コードで守れる約束はテスト。今回の3つの罠は、こう書き分けました。

罠1(会話と一緒に止まる)→ CLAUDE.md

これはコードの問題ではなく、AIが起動するときのやり方の問題です。だから、AIが毎回最初に読む CLAUDE.md に書きました。Windows では、WMI 経由で起動すると、親がAIのセッションではなくOSの管理プロセスになり、切り離されます。CLAUDE.md には、起動コマンドの例をそのまま載せています(要旨)。

Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{ CommandLine = '(ワーカーの起動コマンド)' }

「システム起動して」と頼まれたら、この方式で起動する。これが条文です📜

罠2(黙って何もしない)→ コード

「ファイルがあるか」ではなく、「記録された処理が本当に生きているか」で判断するよう、起動スクリプト自体を直しました。全部止まっていれば古い記録を消して起動を続け、失敗したら呼び出し元へ正しく失敗を返して、ログにも残します。コードで守れる約束は、文章ではなくコードに書きます💻

罠3(キーの名前がぶつかる)→ CLAUDE.md

クラウド用の起動手順を CLAUDE.md に足し、アプリ用のキーは別の名前で預けて、起動のときにアプリの設定ファイルへだけ書き写す、と決めました。「値はチャットにもログにも出さない」も同じ条文に入っています🔑

🧠 メモリは「判断のクセ」、そして古くなる

メモリは、会話をまたいで残る、私の好みや方針のメモです。たとえば「料金のかかる実機検証は、計画を承認したあとでも、実行の直前にもう一度確認する」。これはプロジェクトの約束というより、私がどこで止まりたいかという判断のクセなので、メモリに置いています。実際、別の回でお話しする「試し打ち」機能の検証でも、AIは料金がかかる実行の前に、ちゃんと私へ確認してきました🙆

ただ、メモリは古くなります。正直な例があります。9月22日に「アプリの名前は公開物に出さない」とメモリに残したのに、翌日には私自身が「ブランドとして前面に出す」と方針を変えました。

fig_compare_memory.jpg
方針が変わったのにメモが古いままだと、AIは昔の私に従ってしまう

古いメモリが残っていると、AIは昔の私に従ってしまいます😅 方針が変わったら、メモリも書き換える。メモリは「育てる」ものというより、「手入れする」ものだと感じています🌱

🧰 ハーネス術:置き場所を決める4つの問い

罠を見つけたら、次の順に問うと、置き場所が決まります👇

fig_checklist_place.jpg
上から順に問うと、書き残す場所が決まる

  1. コードで止められるか → できるなら、コードとテストへ(罠2)
  2. AIが毎回、作業の前に知っておくべきか → CLAUDE.md へ(罠1・罠3)
  3. 決まった手順の途中で踏む罠か → その手順書(スキル)へ
  4. 私の好みや判断の基準か → メモリへ。古くなったら書き換える

スキルは、決まった手順をAIが呼び出せる形にした手順書です。書き始めは成功の手順ですが、使ううちに「ここで落ちた」の記録のほうが増えていきます。罠の記録こそが、手順書の本体なのだと思います📖

置き場所 向いているもの 今回の例
コード・テスト 機械で止められる約束 生死確認、失敗コードの返却
CLAUDE.md AIが毎回、作業前に知るべき約束 切り離して起動、キーの置き方
スキル 決まった手順の途中で踏む罠 手順書の「ここで落ちた」記録
メモリ 私の好み・判断のクセ 料金がかかる検証は直前に確認

🤝 まとめ:今回の役割分担

fig_traps.jpg
気づくのは人間、突き止めるのはAI、置き場所を決めるのは人間

  • 気づいたのは人間👀:翌朝、定期実行が動いていないことに気づき、「切り離して起動して」とルール化を指示した
  • 突き止めたのはAI🔍:子プロセスの道連れ、空の記録ファイル、失敗を返さないスクリプト、キー名の衝突。原因を調べて、直し方と書く場所を提案した
  • 決めたのは人間🧭:どの罠をどこに書くか、メモリをいつ書き換えるか

次の記事では、「子プロセス」が別の形で牙をむいた話、学習プロセスが子プロセスで即死する Windows × spawn の罠をまとめます👶

☕ note.comで開発秘話と毎朝の検証ログを連載中

note.comでは、ALPHA FORGE の開発秘話と、毎朝のアルゴリズム検証ログを公開しています。

👉 元記事(note連載第14話):
【ALPHA FORGE 開発秘話 #14】会話を閉じたら裏方も止まってた🌙 ― 失敗を「スキル」と「メモリ」に変える


免責事項
本記事は個人開発およびAIエージェントを活用したシステム開発の技術記録です。特定の銘柄の売買推奨や投資助言を行うものではありません。本ツールは証券会社等への発注機能を持ちません。記事中の日付・発言は開発時の記録にもとづくもので、AIの返答は要約です。紹介したコマンドやルールは要旨であり、実際の設定ファイルそのものではありません。

⚠️ 【システム検証記録に関する免責事項・注意事項】

  • 本記事は、独自開発アルゴリズム「ALPHA FORGE」の動作検証およびデータ分析過程を公開する技術・運用の個人的な記録ログです。
  • 掲載されているすべてのデータ(各スコア、基準観測値、統計的変動上限、シナリオ無効化水準など)は、過去の市場データに基づき数式(ATR等)により機械的に算出されたバックテスト・シミュレーション用のパラメータであり、特定の有価証券の売買勧誘、取引の推奨、投資助言・代理行為を目的としたものではありません。
  • また、将来の株価変動や運用成果を保証するものではありません。実際の投資判断および最終決定は、必ずご自身の責任と判断において行っていただけますようお願いいたします。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?