safe-change について
safe-changeは、複数の呼び出し元が使う関数、クラス、モジュールを変更するためのコーディングスキルです。依存関係と現在の動作を確認し、最小限の変更、互換性確認、利用可能なテストの実行を進めます。
主な機能
- 01impact-checkで呼び出し元と依存先を把握
- 02変更前の観測可能な動作を記録
- 03タスクに必要なコードだけを変更
- 04すべての呼び出し元で互換性を確認
- 05既存テストがあれば実行
活用シーン
- 01共有関数のシグネチャを安全に変更
- 02複数の呼び出し元が使うモジュールを更新
- 03戻り値の型変更前に互換性を評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rheinmir/ setup --skill safe-changeインストール後、Claude Code で/safe-changeを入力して読み込まれたか確認します。
詳細
スキル:safe-change
WHAT
目的とコンテキスト
- 目的: 複数の呼び出し元がある共有コード(関数/クラス/モジュール)を、既存の呼び出し元を壊さずに修正します。
- 使用するタイミング: 複数箇所から呼び出される関数、クラス、モジュールを変更する場合。
- 対象外: 隣接するコードをついでにリファクタリングしないこと、タスクの範囲外のテストを追加しないこと、
impact-checkの代わりに手作業で呼び出し元を探さないこと。
メンタルモデル
共有シンボル → impact-check(呼び出し元+依存先)→ 現在観察できる動作 → 最小限の変更 → 呼び出し元ごとに後方互換性を保つか、明示的に更新 → テスト(あれば)→「Changed X. Verified Y」→ verify-before-commit
入出力の契約
| フィールド | 必須? | 意味 | |
|---|---|---|---|
| 入力 | 修正するシンボル/モジュール+変更要件 | はい | 複数の呼び出し元があるもの |
| 入力 | モジュールのテスト | いいえ | あれば実行し、なければコミットメッセージに明記 |
| 出力 | 最小限の変更+確認/更新済みの呼び出し元 | はい | ステップ1で見つかったすべての呼び出し元を検討済み |
| 出力 | 確認文「Changed X. Verified Y still works.」 | はい | その後 verify-before-commit を呼び出す |
| 出力 | wiki/sources/draft/DDMMYY-<ten>.md | はい(成果物が0件の場合を除く) | 出力レポート |
ルールと機能
- RULE-01(必須):後方互換性を保てない場合は、作業を続ける前にユーザーに伝えます。
- RULE-02(必須):タスクで必要な箇所だけに触れます。ついでのリファクタリングは禁止です。
- RULE-03(必須):テストがない場合は、その旨を記録して構いません。タスクの範囲外のテストは追加しません。
- 機能:呼び出し元/依存先のグラフを照会する、タスクの範囲内でコードを読み取り・修正する、ローカルテストを実行する、Wiki の下書きを作成する。
失敗時の境界
- 後方互換性を保てない → 確認:停止し、作業を続ける前にユーザーへ伝えます(RULE-01)。
- 修正後にテストが失敗 → ブロック:
verify-before-commitに進みません。 - テストがない → 部分的な対応として許容:コミットメッセージに明記し、テストを自分で追加しません。
HOW
メインワークフロー
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | シンボル | スキル impact-check を実行 | 呼び出し元+依存先の一覧 | — |
| W02 | judgment | 現在のコード | 観察可能な動作(戻り値、副作用)を記録 | 動作のベースライン | — |
| W03 | effect | 要件 | 隣接するコードに触れず、最小限の変更を行う | 差分 | 互換性を保てない → B01 |
| W04 | judgment | W01 の呼び出し元 | 呼び出し元ごとに、後方互換性を確認するか明示的に更新 | すべての呼び出し元を検討済み | — |
| W05 | deterministic | テストディレクトリ | テストを探し、あれば実行 | 終了コード 0 または「no tests」の記録 | テスト失敗 → blocked、テストなし → B02 |
| W06 | effect | 結果 | 確認し、verify-before-commit を呼び出し、出力レポートを作成 | 確認文+下書き | — |
各ステップの詳細(W01〜W06 の正とする情報源):
impact-checkスキルを実行し、すべての呼び出し元と依存先の一覧を取得します。- 現在観察できる動作(戻り値、副作用)を記録します。
- 最小限の変更を行います。隣接するコードには触れません。
- ステップ1で見つかった呼び出し元ごとに、後方互換性を確認するか、呼び出し元を明示的に更新します。
CHECK: ls <test-dir>/*<module>* 2>/dev/null | head -3— テストがあればRUN: <test-cmd>。なければコミットメッセージに明記します。- 「Changed X. Verified Y still works.」と確認してから、
verify-before-commitを呼び出します。
分岐
| ID | Kind | Guard | 行動 | スキップ/失敗 | 再開先 |
|---|---|---|---|---|---|
| B01 | recovery | 後方互換性を保てない | 停止し、作業を続ける前にユーザーへ伝える | ユーザーが承認しない → cancelled | ユーザー承認後、W04 |
| B02 | conditional_required | モジュールのテストがない | コミットメッセージに「no tests」と明記し、新しいテストは書かない | — | W06 |
検証と停止
次に進む条件:impact-check の一覧にあるすべての呼び出し元を検討済みであり、テストがある場合は終了コードが 0 であること。確認文と verify-before-commit で停止し、それ以上のリファクタリングは自分で行いません。
例
- 成功例: 4 つの呼び出し元がある
fetch_page()にオプションのパラメーターtimeout=30を追加 → impact-check で 4 つの呼び出し元を列挙し、いずれもパラメーターを渡していないため互換性あり → テストモジュールが成功 → 「fetch_page のシグネチャを変更しました。4 つの呼び出し元が引き続き動作することを確認しました。」 → コミット前に検証。 - 境界/失敗例:
get_user()の戻り値の型を dict から object に変更し、2 つの呼び出し元がuser["id"]を使用 → 互換性を維持できない → 中止してユーザーに報告(B01)。承認を得る前に呼び出し元を修正しない。
納品 — 出力レポート
メインのスキルタスクがすべて完了したら、Wiki に提案の下書きを作成します。
手順
1. ファイル名を作成します:
- 形式:
DDMMYY-<ten>.md DDMMYY= 今日の日付(例:2026 年 6 月 2 日の場合は020626)<ten>= 実施内容を要約する kebab-case の 2〜4 語(例:landing-page-coteccons、brand-kit-fintech、ingest-auth-spec)
2. llmwiki/wiki/sources/draft/DDMMYY-<ten>.md を作成します:
---
type: draft
title: "DDMMYY-<ten>"
status: proposed
tags: [<skill-name>, output-report]
timestamp: YYYY-MM-DD
---
# DDMMYY-<ten>
**Type:** draft
**Status:** proposed
**Tags:** <skill-name>, output-report
**Proposed:** YYYY-MM-DD
## What
<One sentence — what this skill invocation produced or decided>
## Output
<Key artefacts, files created/modified, or decisions made>
## Files
| File | Action |
|------|--------|
| `path/to/file` | created / modified |
## Notes
- Invoked via: `/<skill-name>` skill
## Origin
- **Draft:** `wiki/sources/draft/DDMMYY-<ten>.md`
- **Commit:** _(filled by verify-before-commit)_
- **Date promoted:** _(filled by verify-before-commit)_
3. Wiki のインデックスとログを更新します:
llmwiki/wiki/index.md— 1 行追加:| [DDMMYY-<ten>](sources/draft/DDMMYY-<ten>.md) | draft | YYYY-MM-DD |llmwiki/wiki/log.md— 追加:## YYYY-MM-DD — <skill-name> — <ten>
スキルによって成果物も決定事項も一切生じない場合に限り、スキップします(例:
/caveman-statsのような表示のみのモード)。
コメント
Markdown 対応