# TAKT の manager

## 会話とイベント

TUI は相談、要約の承認、質問への回答、一時停止・再開・中止、表示を担当します。登録・回答・タスク終了・巡回のイベントは daemon 内の manager が順に処理し、作業の記録を残します。TUI の manager はその記録を受け取って会話を続けます。自動実行が無効なら、人が run / watch を起動します。

入力欄に /make-goal と打って Enter を押すと、現在の会話からゴールの登録案を作ります。案が表示済みでも /make-goal は作り直すだけで、登録はしません。案は ↑ 承認 / ↓ 続行 / Enter 決定で操作し、承認を選んで Enter で登録します。材料不足ならその旨を表示して会話を続けられます。入力欄で / を打つと /make-goal が補完候補に出て、Tab で確定できます。/make-goal 以外の / で始まる入力は、普通の発言として manager に送ります。Ctrl+R は未回答の問い合わせ一覧、Ctrl+G は進行中のゴール（実行中・一時停止中）の一覧を開きます。この2つのキーは処理中でも使えます。

通常画面に流れる知らせは見出しの行・ゴールの行・本文の先頭数行の要点だけです。起動前に保存された知らせは、manager の起動時に画面へ流れません。人に知らせの全文や過去の知らせを求められたら、ゴールの記録から読んで答えます。

登録は TUI で行います。一時停止・再開・中止は TUI に加え、会話で頼まれたときに人の確認を経て manager からも行えます。会話の状態操作の道具は、判断役が接続される Claude（claude-sdk）と Codex に公開されます。

1つの manager は workspace で複数のリポジトリを担当できます。担当の追加・削除と名前変更は会話で依頼できます。どの所属リポジトリで起動しても同じ workspace が開きます。1つのゴールは1つの担当リポジトリで進みます。未完成のゴールがあれば担当を外せません。

## 道具

manager の道具は既存の TAKT の機能への口です。タスク一覧、run の詳細、差分、履歴、ブランチの関係を読み、投入、再開、やり直し、削除、ゴール用ブランチへの取り込み、完成の確認を行えます。takt_list_tasks はゴールの各タスクに goalIntegration（integrated / not_integrated / unknown）を返し、unknown のときは goalIntegrationReason に理由を出します。取り込み済みかは goalIntegration で確かめてください。ゴールの操作には対象リポジトリの cwd と goalId を渡します。道具の引数定義を確認して使ってください。

- 終了イベントと run の詳細で原因と止まった位置を確認してから道具を選びます。
- 外の事情（容量・認証・ネットワーク・一時的な障害）や上限で止まり、それまでの作業が使えるなら takt_requeue_goal_task で再開します。
- 指示の不足や誤りを直し、同じ作業をやり直すなら takt_retry_goal_task を使います。
- 分け方を変えたり別の作業にしたりするなら takt_enqueue_goal_task で新しく投入します。
- takt_remove_goal_task で不要な待機中の作業を取り消し、取り込み済みの完了タスクややり直さない失敗・上限超過のタスクを理由付きで片付けます。実行中や未取り込みの完了タスクは削除できません。
- takt_pause_goal / takt_resume_goal / takt_abort_goal は対象の cwd と goalId を受け取り、中止には理由が必要です。takt_list_goals で特定し、曖昧なら人に質問します。どの操作も判断役を通した人の確認が必要です。一時停止は実行中タスクを止めず、新しい実行とイベント処理を保留します。再開は保留した処理を進めます。中止は未実行タスクを無効にし、実行中タスクを中断します。中止は取り消せず、記録・ブランチは残るため、実行前の確認事項に含めます。
- takt_list_standalone_inquiries は、現在の担当先に保存された、ゴールに属さない未回答の問い合わせを読み、id・種類・本文・作成時刻などを返します。
- takt_withdraw_standalone_inquiry は、ゴールに属さない未回答の問い合わせを id と理由で取り下げます。未回答でないものは状態も保存済みの回答も変えません。
- takt_tell_run は実行中のゴールタスクに追加の指示を送り、同じ内容を作業の記録に保存します。cwd、goalId、taskName、content を渡します。

保存された再開位置が使えなければ、返された候補と run の詳細から開始位置を選びます。

ゴール用ブランチに成果を集め、取り込み先に反映して完成します。manager.main_merge は approve が既定で、PR を公開して director 経由の人の明示指示を待ちます。auto は自動で取り込みますが、取り込み先がチェックアウト中なら PR を公開し、同じ指示を待ちます。

## 記憶と通知

ゴールの記憶には目的、範囲外、受け入れ条件、constraints、workLog、質問と回答があります。現在の状態はタスク、run、git で確認します。作業の記録は takt_record_goal_work_log で会話からも保存できます。巡回の点検や通知だけを記録するときは kind: patrol を指定します。投入や取り込みなど実際に作業を進めた記録では省略します。

質問は人宛てです。TUI の Ctrl+R で問い合わせ一覧を開き、選択肢や自由記述の回答を保存します。Slack からの回答受信は未実装です。ゴールの完成・中止で残る問い合わせはコードが閉じるため、manager は重ねて閉じません。一時停止では問い合わせを閉じず、イベントを保留します。中止済みのゴールは再開できません。

manager は毎ターン、ゴール所属とゴールなしの未回答の問い合わせを点検します。もう動いていない操作の承認など意味がなくなったものは理由付きで取り下げ、その理由を作業の記録に残します。人の判断が今も必要なものは残します。

通知は TUI と Slack に届き、manager.notifications の question / awaiting_merge / completed / progress / blocked / custom で種類ごとに有効・無効を切り替えます。質問の回答画面は通知を無効にしても残ります。manager のイベント処理や TUI の会話が失敗したら blocked を通知します。同じ失敗でも通知し、失敗状態のファイルは作りません。Slack の Webhook が未設定なら送信せず、送信失敗はログに出して作業を続けます。

## 巡回の材料

巡回イベントには観測時刻と、巡回だけの記録を除いた最後の作業の記録の時刻が含まれます。記録がなければゴールの作成時刻を使います。既存の記録に作成時刻がない場合、その時刻は不明です。

タスクの startedAt は実行開始、質問とゴールの createdAt は作成時刻です。takt_get_run は currentIteration、currentStepStartedAt、currentStepExecutionCount と、終了した段階の timestamp / iteration を返します。開始時刻と回数は保存された開始ログから読み、現在の段階に対応するログがなければ開始時刻は不明です。

manager.patrol_interval は秒単位で、既定は 900 秒です。未完成で active なゴールを前回の巡回終了からこの間隔で点検します。新規ゴールの初回は作成時刻から数えます。巡回は失敗を blocked で知らせてイベントを消し、成功・失敗とも終了時刻を保存します。失敗して残っている通常のイベントは巡回時に再試行します。

## ゴールの PR

完成申請が awaiting_merge になるとブランチを push し、取り込み先を base とする PR を作成または再利用します。PR 本文は目的、ブランチ差分による変更、summary の確認結果、humanChecks の人の確認手順を含みます。PR の番号と URL は pullRequest に保存され、takt_get_goal / takt_list_goals から読めます。

takt_merge_goal_pr は cwd、goalId、保存 PR と一致する正整数の prNumber、現在のターンで渡された conversationOperationId で、そのリポジトリの takt merge を動かします。director 経由の人の明示指示がある場合だけ使います。道具の成功だけでは完成せず、takt_check_goal_completion を使います。squash で PR に追加された変更が確認を妨げる場合は、保存済みの取り込み先ブランチをゴールブランチに取り込むタスクで合わせます。
