stop について
stopは、自己修正ループを終了するスキルです。契約ファイルにDONEと理由を記録して最終状態を通知し、ループの後処理を行います。調査用ファイルを残すオプションもあります。
主な機能
- 01契約ファイルへのDONE記録
- 02最終状態の通知
- 03ループのアンロードと登録解除
- 04状態ディレクトリの保管と削除
- 05調査用ファイルの保持
活用シーン
- 01目標達成後のループ終了
- 02外部依存で進めない場合の停止
- 03停止後のハートビートと修正ログの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill stopインストール後、Claude Code で/stopを入力して読み込まれたか確認します。
詳細
autoloop: 停止
自己修正ループを正常に終了します。タイムスタンプと理由を含む ## DONE セクションを追記し、最終状態の概要をまとめた PushNotification を送信して、新しい起動のスケジュールを停止します。次回の /loop の起動時には DONE マーカーを検出し、何もせずに終了します。
自己進化型スキル:このスキルは使用を通じて改善されます。指示に誤りがある、パラメーターがずれている、または回避策が必要だった場合は、先送りせず、すぐにこのファイルを修正してください。実際に再現できる問題がある場合にのみ更新してください。
引数
- 位置引数(省略可):理由を示す文字列。デフォルトは
"user-requested stop"です。 --keep-forensics(フラグ、省略可):停止後にアーカイブして削除する代わりに、状態ディレクトリを保持します。Wave 2 以降のデフォルトの動作では、クリーンアップ用の tarball を作成し、<state_dir>に対してrm -rfを実行します。停止後に heartbeat.json または revision-log/ を調査する必要がある場合は、このフラグを指定してください。
ステップ 1:コントラクトを特定する
CONTRACT_PATH="${CONTRACT_PATH:-./LOOP_CONTRACT.md}"
if [ ! -f "$CONTRACT_PATH" ]; then
echo "No contract at $CONTRACT_PATH — nothing to stop."
exit 0
fi
ユーザーがコントラクトを指定しておらず、cwd 以下に複数の LOOP_CONTRACT.md ファイルがある場合は、AskUserQuestion を使用して選択してください。
ステップ 2:停止理由を確認する
AskUserQuestion を使用して停止理由を選択してください。
Research saturation— null-rescue の起動が3回連続したGoal achieved— 完了条件を満たしたUser request— 手動で終了するBlocked on external dependency— 介入なしでは続行できない
選択した理由と、ユーザーからの自由記述のメモ(ある場合)を DONE セクションに記録してください。
ステップ 3:DONE セクションを追記する
以下のブロックをコントラクトに追記してください(Edit または Bash の cat >> を使用します)。
---
## DONE
- **Stopped at**: <ISO 8601 UTC>
- **Iteration**: <current value from frontmatter>
- **Reason**: <chosen reason>
- **User note**: <free-text if any>
- **Final state summary**:
<one-paragraph synthesis of the Current State section at time of stop>
The next /loop firing will observe this section and exit without further action.
ステップ 4:PushNotification を送信する
PushNotification がまだ利用可能でない場合は、ToolSearch 経由で読み込んでから、次を送信してください。
<loop-name> stopped at iter <N>. Reason: <reason>. Final state: <one-line summary>.
200文字以内にしてください。
ステップ 5:launchd plist をアンロードする
登録を解除する前に、launchd plist をアンロードしてください。
# Source the launchd library
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/cc-skills/plugins/autoloop}"
source "$PLUGIN_ROOT/scripts/launchd-lib.sh"
source "$PLUGIN_ROOT/scripts/state-lib.sh"
# Derive loop_id and state_dir
loop_id=$(derive_loop_id "$CONTRACT_PATH")
state_dir=$(state_dir_path "$loop_id" "$CONTRACT_PATH")
# Unload plist (idempotent; no-op on non-macOS)
if ! unload_plist "$loop_id" "$state_dir" 2>/dev/null; then
echo "WARNING: Failed to unload launchd plist" >&2
fi
ステップ 6:マシンレジストリからループの登録を解除する
plist をアンロードした後、マシンレジストリのエントリーをクリーンアップしてください。
# Source the registry library
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/cc-skills/plugins/autoloop}"
source "$PLUGIN_ROOT/scripts/registry-lib.sh"
# Derive loop_id from contract path
loop_id=$(derive_loop_id "$CONTRACT_PATH")
# Unregister from machine registry (idempotent; no error if already absent)
if ! unregister_loop "$loop_id"; then
echo "WARNING: Failed to unregister loop from machine registry" >&2
fi
ステップ 7:状態ディレクトリをクリーンアップする(Wave 2)
登録を解除した後、ループの状態ディレクトリをアーカイブして削除し、孤立したディレクトリが蓄積しないようにしてください。tarball はディレクトリの隣(親ディレクトリ内)に作成され、その後ディレクトリ自体に rm -rf を実行します。
# state_dir was already computed in Step 5 via state_dir_path()
if [ -n "$state_dir" ]; then
# Pass --keep-forensics if the user requested it (e.g. they want to inspect
# heartbeat.json or revision-log/<session>.jsonl after stop).
KEEP_FLAG=""
for arg in "$@"; do
[ "$arg" = "--keep-forensics" ] && KEEP_FLAG="--keep-forensics"
done
cleanup_state_dir "$state_dir" $KEEP_FLAG
fi
cleanup_state_dir は state-lib.sh によってエクスポートされます。$HOME の外にあるパスへの操作は拒否されます(安全ガード)。tarball の作成に失敗しても致命的ではありません。警告を表示して、rm を続行します。
ステップ 8:frontmatter を更新する
YAML frontmatter の exit_condition フィールドを編集し、DONE を含めてください。これにより、次回の起動時に本文をスキャンせず、すぐに検出できます。
ステップ 9:最終コミットを提案する
推奨するコミットを表示してください。
git add "$CONTRACT_PATH"
git commit -m "$(cat <<'EOF'
loop(stop): <loop-name> complete — <reason>
Final iteration: <N>
Last action: <summary from Current State>
EOF
)"
アンチパターン
- このスキルから実行中のプロセスに
kill -9を実行しないでください。これは対象外です。このスキルはループにシグナルを送るだけです。プロセスの終了には、別のスキル(ru:stopやpueue killなど)を使用します。 - Revision Log を書き換えないでください。追記のみです。代わりに DONE セクションを追加してください。
- ユーザーがその場にいる場合(直近60秒以内のユーザー発話がないか確認してください)は
PushNotificationを送信しないでください。迷った場合は、プッシュ通知を省略してください。
トラブルシューティング
| 症状 | 対処法 |
|---|---|
PushNotification ツールが読み込まれていない | ステップ4の前に、クエリ select:PushNotification を指定して ToolSearch を実行します |
| DONE セクションがすでに存在する | ループはすでに停止しています。確認メッセージを表示して終了してください |
| DONE の後もループが起動し続ける | 次回の /loop ではコントラクトを読み込んで即時終了するはずです。ポインタートリガーが正しいか確認してください |
実行後の振り返り
- 現在地を確認します。 — 編集する前に、この SKILL.md が正式なファイルであることを確認します。
- 何が失敗しましたか? — 原因となった指示を修正します。
- 何にずれが生じましたか? — 必要に応じて DONE セクションのテンプレートを更新します。
- 記録します。 — Evolution-log に記録します。