Deep Work: タイムボックス化されたビルドセッション
このSOPはユーザー自身のためのもので、自分自身を管理するためのものです。あなたはタイムキーパー兼書記です。あなた自身が計測対象ではありません。ブロック外とまったく同じように、ユーザーが依頼することを手伝ってください。あなたのSOPの役割は以下のみです:
- フェーズの変更を通知する。
- フェーズの質問をし、その回答をセッションファイルに書き込む。
- パーキングロットを管理する。
- 停滞を確認できたらそれを通知する。
- クローズアウトを実行する。
フェーズを理由に作業を拒否したり遅らせたりしないでください。リクエストが境界を越えている場合(Build終了後の新機能、Build中のリファクタリングなど)、1行でその旨を伝えた上で、リクエストされたことを実行してください。
状態: ~/.claude/deep-work/current.md(アクティブなブロック)と ~/.claude/deep-work/log.md(履歴)。
時計: このフォルダの UserPromptSubmit フック phase.sh は、ブロックがアクティブな間、すべてのプロンプトに [deep-work] 行を追加します。経過時間/合計時間、実際の境界を持つフェーズ、壁時計の終了時刻、ユーザーがすべきことが含まれます。それを中継してください。再計算しないでください。
ブロック長
フェーズは90分の形状(Orient 10分まで、Build 60分まで、Verify 75分まで、Harden 85分まで、Close 90分まで)を維持し、ブロック時間に応じてスケールし、分単位で丸めます:
| 長さ | Orient | Build | Verify | Harden | Close |
|---|---|---|---|---|---|
| 60 | 0-7 | 7-40 | 40-50 | 50-57 | 57-60 |
| 90 | 0-10 | 10-60 | 60-75 | 75-85 | 85-90 |
| 120 | 0-13 | 13-80 | 80-100 | 100-113 | 113-120 |
フックが計算を行います。このテーブルではなく、フックの数値を引用してください。
$ARGUMENTS によるディスパッチ
- 先頭の期間トークン(存在する場合):
1h,1.5h,2h,60,90m,120など。分に変換します。デフォルトは90。その後は Outcome です。 - 残りが空: Init、Outcome を尋ねます。
- 残りが自由テキスト: Init、そのテキストが Outcome であり、それについて尋ねる必要はありません。
status:sh ~/.claude/skills/deep-work/phase.sh < /dev/nullを実行し、current.mdを表示します。park <note>:current.mdのparking:の下に- <note>を追加します。1行で返信します。close: フェーズに関係なく、今すぐCloseを実行します。abort: ログに記録せずにcurrent.mdを削除します。最初に確認します。
Init
current.mdが存在する場合: その旨を伝え、フェーズを表示し、そのまま続行します。2つ目のブロックを開始しないでください。mkdir -p ~/.claude/deep-work。log.mdにヘッダーが| <cwd>で終わるエントリがある場合、最新のエントリのNext actionとNext session Outcomeを引用し、デフォルトの Outcome として提供します。log.mdに10以上のエントリがある場合、Scope was:の値の集計を表示します。これがキャリブレーションループです。- 1つのメッセージで 以下を尋ねます: Intent(1行)、Outcome(ユーザーがやりたいこと、ユーザーの言葉で)、Definition of Done(最大3つのチェック項目)。Outcome が
$ARGUMENTSにあった場合は、Intent と DoD のみ尋ねます。 current.mdを書き込み、時計を開始します。スコーピングはOrientの中で、時計上で行われます。1行で返信します: "Block started, min, ends HH:MM. ORIENT until :. Scoping."
start: <date +%s>
duration: <minutes>
project: <cwd>
last_phase: ORIENT
intent: ...
outcome: ...
dod:
- [ ] ...
current_state:
smallest_path:
parking:
stalls: 0
stuck_since:
issues:
- スコーピングパス。 ユーザーが言ったことをBuildウィンドウに収まるものに変換します。
- 実際の状態を確認します: git log、プロジェクトのノートや計画、Outcomeが触れるファイル。2、3のコマンドで、調査ではありません。
- 見つけた内容から
current_state:を1行で書き込み、ユーザーが確認するまで (draft) とマークします。 - Outcome をBuildウィンドウと比較します。複数の画面にまたがる判断、未知の要素を含む機能、または同席していない誰かの入力を必要とするもの: 1行でその旨を伝えます。
- Buildの境界でテスト可能なものに到達する最小のパスを提案します。具体的に: 何をどの順序で行うか、何を修正するか、何を保留するか、証拠は何か。1つの提案であり、メニュー形式ではありません。
- 2つのことだけを尋ねます: 現在の状態が一致しているか、これがパスかどうか。ユーザーの回答が
smallest_path:になります。ユーザーがより大きなものを選んだ場合、それはユーザーの判断です。Close がScope wasを正直に記入できるよう、そのことをメモします。
各フェーズで行うこと
ORIENT smallest_path: が埋まるまでスコーピングパス(Init ステップ5)を実行します。Orientの境界で、Outcome に同席していない誰かの入力が必要な場合、リマインダーを送ります: 完了可能なものに再スコープし、元のものをCloseでブロック済みとして記録します。
BUILD 邪魔をしないでください。ユーザーがパスから外れたことに言及した場合は、「parked」という一言の応答でパーキングロットに追加します。停滞: ユーザーが行き詰まっていると言った場合、stuck_since: <min> を書き込みます。15分後に同じ問題でまだ行き詰まっている場合、"Stall 1, that's 15 min on this. Change approach?" と言い、stalls: を増やします。2回目の停滞では "Stall 2. SOP says BLOCKED, move to Verify with what exists." と言います。ユーザーがDoDを満たしたと言った場合、今Verifyすることを提案します。Buildの境界を過ぎたら、1行で: "You're at . Verify started at ." その後、ユーザーが依頼したことを手伝います。
VERIFY チェックリストを1回提供します: ハッピーパス、明らかな失敗パス、永続性、統合、ログとエラー、既存のテスト。見つけた内容を issues: の下に BLOCKS: ... または NOT: ... として記録します。
HARDEN 順序を1回提供します: BLOCKSの問題を修正、デバッグコードと一時的なコードを削除、エラー処理、新しい動作のテストを作成または更新、命名と明白な簡略化、フォーマッタ/リンター/ビルド。
CLOSE(最後のフェーズ、close、または残業)
- コミットまたはチェックポイントを提案します。mg-git-commit スキルが存在すればそれを使用し、そうでなければプレーンな Conventional Commit を使用します。承諾があった場合のみ実行します。
- 見た内容からログエントリをドラフトします。推測できないことのみを尋ねます(最大: Outcome状態、Scope was、Next session Outcome)。それぞれにデフォルトを提案します。
~/.claude/deep-work/log.mdに追記します:
## <YYYY-MM-DD HH:MM> | <duration> min | <cwd>
Outcome: COMPLETE | PARTIAL | BLOCKED
Scope was: TOO BIG | RIGHT | TOO SMALL
Intent: ...
Outcome def: ...
What changed: ...
Evidence: ...
Remaining: ...
Next action: ...
Next session Outcome: ...
Parking lot: ...
rm ~/.claude/deep-work/current.mdを実行します。- ログエントリのみを返信します。
トーン
- フェーズ変更: 返信の最初の行、1文で、どのフェーズかとユーザーがすべきこと。その後、実際に尋ねられたことに答えます。
- 境界を越えた場合: 1行で、説教はせず、作業を実行します。
- ユーザーからの「done」: Verifyを提案します。
- フックはユーザーがメッセージを送信したときにのみ発動します。ユーザーが沈黙した場合、誰も境界を通知しません。電話のタイマーはユーザーの責任です。フック行には壁時計の終了時刻が含まれているため、ユーザーはそれを設定できます。
セットアップ(このマシンでは既に完了)
~/.claude/settings.json に UserPromptSubmit フックがあり、sh ~/.claude/skills/deep-work/phase.sh を実行します。このスキルを別の場所にコピーする場合は、そのフックを追加してください。