yoshiakist

Claude Code にハートビート自動起動で仕様駆動開発してもらうには

鬱が来ると、興味関心がリセットされる

双極症Ⅱ型の治療を開始してから半年ほどが経つ。3〜4日の躁エピソードで新機能を一気に実装し、その後1週間ほどの鬱エピソードで寝込む。このサイクルを繰り返している。

問題は、鬱から回復したときに前回の自分が何をしていたか分からなくなることだ。興味関心がリセットされる。エディタを開いても、その時ワクワクして実装していた時の気分に戻れない。開発中のゲームが3本あり、それぞれに固有の設計思想とコンテキストがある。鬱のたびにそのすべてが揮発する。

そこで考えた。自分が動けない間も、Claude にいい感じに複数ゲームの開発を進めてもらえないか。

構成

Windows のタスクスケジューラで Claude Code を1時間ごとに起動し、タスクキューから1つずつ作業を消化させる。朝7時から夜10時まで。

Windows Task Scheduler (毎時)
  │
  ▼
heartbeat.bat
  │  type heartbeat-prompt.md | claude -p --model opus ...
  │
  ├── tasks.md を読む(人間が書いた要望)
  ├── queue.md を読む(Claude が分解したタスクキュー)
  ├── 未完了タスクを1つ拾って実行
  ├── 完了したら queue.md を更新
  └── ntfy で通知

ファイル構成はこうなっている。

aboutme/              ← コックピット
  tasks.md            ← 双方向。人間の要望 + Claude からの依頼
  queue.md            ← Claude が管理するタスクキュー
  CLAUDE.md           ← 運用ルール
  about-scheduler.md  ← スケジューラの操作方法

claude-tools/
  heartbeat.bat       ← タスクスケジューラが叩くバッチ
  heartbeat-prompt.md ← 起動時に渡すプロンプト
  heartbeat.sh        ← 手動テスト用(bash)
  screen.py           ← GUI操作ユーティリティ

heartbeat.bat

タスクスケジューラから起動されるバッチファイル。

@echo off
cd /d C:\Users\yoshi\aboutme

set LOGFILE=C:\Users\yoshi\claude-tools\heartbeat-%date:~0,4%%date:~5,2%%date:~8,2%.log

echo === %date% %time% === >> %LOGFILE%
type C:\Users\yoshi\claude-tools\heartbeat-prompt.md | claude -p --model opus ^
  --add-dir C:\Users\yoshi\GodotProjects\logomancy ^
  --add-dir C:\Users\yoshi\GodotProjects\groove_forge ^
  --add-dir C:\Users\yoshi\RobloxProjects\mad_musical_chairs ^
  --add-dir \\wsl.localhost\Ubuntu\home\yoshiakist\specre ^
  --permission-mode bypassPermissions ^
  >> %LOGFILE% 2>&1

ポイントがいくつかある。

  • --add-dir で全プロジェクトを渡す。cwd は aboutme だが、各プロジェクトの CLAUDE.md やスキルが自動的に読み込まれる
  • --permission-mode bypassPermissions で非対話実行でもツール許可を通す。自分のマシンなのでリスクは受け入れる
  • ログは日付ごとにファイルを分ける。放置しても肥大化しない

heartbeat-prompt.md

Claude が起動時に読むプロンプト。これが自律駆動の核になる。

あなたはハートビートで定期起動された Claude です。以下の手順で作業してください。

## 手順

1. tasks.md を読む
2. queue.md を読む
3. tasks.md に未反映の要望があれば queue.md に分解する
4. 未完了タスクから1つだけ選んで実行する
   - 対象プロジェクトの CLAUDE.md を必ず最初に読むこと
5. 完了したら queue.md を更新し、引き継ぎメモを残す
6. ntfy-send.sh で通知する
7. 人間でないと進められない作業は tasks.md に書く
8. 技術的に迷ったら queue.md にメモしてスキップする

## SDD ワークフロー

Groove Forge / LOGOMANCY のタスクでは必ず SDD ワークフローに従う。
- 新機能 → specre-sdd-new-auto.md
- 修正 → specre-sdd-fix-auto.md

双方向の tasks.md

普通、タスク管理は人間が書いて人間が消す。このシステムでは Claude も tasks.md に書き込む。

# やるべきこと

## 最優先

- [ ] 4/13 メンタルクリニックで身体症状を主治医に報告する

## 自動開発タスク

- [ ] LOGOMANCY で、韻律ボーナスを追加する。
  - イメージ: プレイヤーが "RIGHT" "LIGHT" "NIGHT"と詠唱すると [AIT] 発音で発生。文字の基礎点が2倍、3倍、4倍となって、ライムボーナスが発生したことが画面上で分かること
    - 他にも、 "WEED" "SEEK" "LEAK" → [II] など、中間音でも発生。
    - 考慮: 韻律とは?発音記号の辞書をどこからとってくる?英単語と発音記号のマッピングは、軽量なDBを内部で持つ?

## Claude からの依頼

- [ ] LOGOMANCY: 韻律ボーナスの「気持ちよさ」を確認してほしい
      → feature/rhyme-dictionary ブランチで動作確認

自分がやること・Claude がやること・Claude から自分への依頼が一箇所に集まる。鬱から回復したとき、このファイルだけ開けば現在地が分かる。

あとは、こんな感じになっててほしいなーという意志を込めておく。「こんなん一体どうやんの?」と思っていることも、元気があるうちに迷わず書いておく。

仕様駆動開発を自動化する

個人開発で specre という仕様管理ツールを使っている。1ファイル=1振る舞いの Markdown カードで仕様を管理し、コード中の @specre マーカーで双方向トレーサビリティを確保する仕組みだ。

対話セッションでの SDD ワークフローには「specre カードを書いたら人間がレビューする」というチェックポイントがある。自動起動ではこれが使えない。

そこで specre-sdd-new-auto / specre-sdd-fix-auto というチェックポイントなしの自律版ワークフローを用意した。チェックポイントの代わりに、フェーズ4のセルフレビューで品質を担保する。

specre-sdd-new        ← 対話用。チェックポイントあり
specre-sdd-new-auto   ← 自律用。一気通貫
specre-sdd-fix         ← 対話用。チェックポイントあり
specre-sdd-fix-auto    ← 自律用。一気通貫

GUI 操作

Godot のデバッグには画面を見る必要がある。PyAutoGUI でスクリーンショット撮影とマウス・キーボード操作を可能にした。

# screen.py の一部
def screenshot(path="screenshot.png"):
    img = pyautogui.screenshot()
    img.save(path)

def focus_window(title_part):
    matches = [w for w in gw.getAllWindows()
               if title_part.lower() in w.title.lower()]
    if matches:
        matches[0].activate()

Claude はスクリーンショットを撮影して Read ツールで画像を読み、画面の状態を把握できる。マルチモーダルなので画面に何が映っているか理解した上で、次のクリック座標を決められる。

試験運転

スケジューラを登録し、手動で1回走らせてみた。

tasks.md に「韻律ボーナス機能」と書いてあったのを読み取り、Claude は queue.md にこう分解した。

## LOGOMANCY: 韻律ボーナス機能

- [x] 発音辞書データの導入
- [ ] 韻律判定ロジックの実装
- [ ] RhymeManager の作成
- [ ] スコア計算への統合
- [ ] 韻律ボーナスの視覚フィードバック
- [ ] テストの作成

最初のタスク「発音辞書データの導入」をその場で実行し、CMU Pronouncing Dictionary から韻律キーのデータを生成してプロジェクトに配置した。ntfy の通知が飛んできて、完了を知る。

2回目の起動では SDD ワークフローに乗って specre カードを作成し、ユニットテストを書き、韻律判定ロジックを実装し、フィーチャーブランチにコミットした。

自分は寝ていた。

設計上の判断

いくつかの判断について書いておく。

  • 1回の起動で1タスクだけ。 欲張って複数タスクを消化させると、1つの失敗が後続に波及する。1タスク完了→通知→次の起動で次のタスク、というリズムのほうが安全で、ログも追いやすい。
  • 50分タイムアウト。 1時間間隔なので、前回の実行が残っていると次の起動がスキップされる。余裕を持たせた。
  • セッション間の記憶がない。 毎回のハートビートは新しい Claude で、前回の文脈を覚えていない。queue.md のタスク説明と作業メモだけが引き継ぎ手段になる。割り切っている。
  • bypassPermissions。 自分のマシンで自分のコードを触るだけなので、全ツール許可を通している。git push や npm publish も無許可で通るため、そこだけは意識しておく必要がある。

まだ分からないこと

この仕組みは今日作ったばかりで、うまくいくかは分からない。

  • 長期的にタスクの粒度が適切かどうか
  • specre カードのセルフレビューが人間レビューの代替として機能するか
  • GUI 操作で実際にゲームのデバッグがどこまでできるか
  • 鬱エピソード中に通知が来ること自体がストレスにならないか

それでも、「動けない間もプロジェクトが前に進む」という安心感には価値がある。少なくとも、鬱から回復したときに queue.md を開けば「ここまで進んだ」が分かる。興味関心がリセットされても、文脈は残っている。

しばらく回してみて、また書く。