data-loss-gate について
data-loss-gateは、gbrainを使うチーム向けに破壊的操作を一時停止し、ユーザーの明示的な承認を求めるエージェントスキルです。実行前の対象確認、復旧情報カードの提示、日付付き削除ログを定めますが、ランタイムで強制する仕組みではなくルーティング規約です。
主な機能
- 01削除前の対象確認
- 02範囲と復旧情報カードの提示
- 03ユーザーの明示的な承認
- 04確認済み削除の日付別記録
- 05ファイルシステムとgbrainの削除に対応
活用シーン
- 01ファイルの一括削除前の確認
- 02gbrainのページやソース削除の承認
- 03削除済みページの完全消去の検討
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ garrytan/ gbrain --skill data-loss-gateインストール後、Claude Code で/data-loss-gateを入力して読み込まれたか確認します。
同梱ファイルrouting-eval.jsonl
詳細
データ損失ゲート — 破壊的操作前の確認
規約: conventions/brain-first.md を参照してください — 削除を提案する前に、実際の対象を調査してください:
get_backlinks、gbrain graph <slug>、対象ファイルに対するgit log。以下の確認カードの質は、 その根拠となる調査の質に左右されます。規約: _brain-filing-rules.md を参照してください — 確認後の削除ログファイルは、日付をキーとして
daily/の下に保存します。
これは何か
破壊的な操作の前に必ず発動し、ユーザーによる明示的な確認を求めるゲートです。エージェントは処理を止め、復元可能性カードを提示して、返答を待ちます。
適用範囲に関する注意: このゲートはルーティング規約です。破壊的な意図に一致した場合、ハーネスがその規約をコンテキストに反映し、適切に動作するエージェントがそれに従います。これは操作境界での強制ではありません。スキルが読み込まれなければ、gbrain ランタイムが削除を機械的に阻止することはありません。(操作境界でネイティブに確認を行うゲートは、登録済みの TODO です。実装されるまでは、この規約が防御線となります。)一部の CLI サーフェスには独自のフラグゲートがあります。たとえば gbrain sources remove には --confirm-destructive が必要です。ただし、このフラグで確認するのは、エージェントが確信しているかどうかです。このスキルは、ユーザーが確信しているかどうかを確認するためにあります。
発動するタイミング
次の操作を行う前:
シェル/ファイルシステムレベル:
- データを含むディレクトリに対する
rm -rf - 10 個を超えるファイルに対する
rm/unlink - 10 個を超えるファイルを変更する
sed -i - 管理対象ファイルに対する
git rm - ファイルの内容を一括で切り詰める、または削除する操作
- ファイルの内容を削って、より小さいバージョンで上書きする操作
- データファイルに触れる「クリーンアップ」や「空き容量の確保」と称する操作
ブレイン/データベースレベル(gbrain 固有):
- 一括忘却 — 多数の事実に対して
gbrain forget <fact-id>をスクリプト化またはループ処理で実行すること。1 件の忘却は慎重に行われ、冪等性のある操作です。一括忘却はデータ損失です。 - ページ一括削除 —
gbrain delete <slug>をループで実行すること、または一連のスラッグに対してdelete_pageを一括実行するスクリプト。削除はパージされるまではソフト削除であり、gbrain restore <slug>で復元可能です。カードにその旨を記載したうえで、必ずゲートを通してください。一括削除を誤ると、一括で元に戻すには多大な手間がかかります。 gbrain pages purge-deleted— ブレインのすべてのソースから、ソフト削除されたページを完全に削除します。これはソフト削除のセーフティネットが機能する最後の時点です。まずgbrain pages purge-deleted --dry-run --jsonをユーザーに提示してください。このコマンド自体も確認を求め(ターミナルがない場合は終了コード 3)、ユーザーの同意後にのみ--yesを付けて実行します。- ソースの削除 —
gbrain sources remove <id>はソースと、その中のすべてのページを削除します。--confirm-destructiveフラグはカードの代わりにはなりません。 - マウントの削除 —
gbrain mounts remove <id>が削除するのはローカル登録だけです(マウントされたブレインのデータベースは残ります。再追加すれば復旧できます)。ただし、処理の流れでマウント元のデータベースやファイルも削除する場合は、必ずゲートを通してください。その場合は、それらに対して完全なカードが適用されます。 - 生 SQL による切り詰め — どの経路(psql、マイグレーションスクリプト、エンジンの
executeRaw呼び出し)であっても、ブレインのデータベースに対するDROP TABLE、TRUNCATE、または限定的なWHERE句のないDELETE。 - データベース行の一括削除、テーブル、コレクション、インデックスの削除。
すること
ステップ 1:実行前に停止する
破壊的なコマンドを実行してはいけません。まず実際の対象を調査し (バックリンク、グラフのエッジ、Git の履歴、ファイルの内容など、カードの根拠となるものを確認して)、 そのうえで次をユーザーに提示します:
ステップ 2:確認カード
⚠️ DATA DELETION — Confirmation Required
What: [exactly what will be deleted/modified]
Count: [number of files/rows/pages/facts affected]
Size: [how much data will be removed]
Location: [exact paths, slugs, or source/mount ids]
Why: [the reason for the deletion]
Recoverable?
- [ ] Backed up to a remote (git remote, database backup, object storage)
- [ ] In git history (can git checkout)
- [ ] Soft-deleted in the brain (restorable via `gbrain restore` until purged)
- [ ] Re-fetchable from an upstream source (which one, how long)
- [ ] NOT recoverable — permanent data loss
What we'd lose:
- [specific data/capability that would be gone]
- [any downstream systems that depend on this data]
Alternative to deletion:
- [compress instead of delete?]
- [move to cold storage?]
- [archive to a remote backup?]
- [soft-delete and defer the purge?]
Proceed? (yes/no)
ステップ 3:「yes」という明示的な返答を待つ
- 「ok」「sure」「go ahead」では進めないでください。「yes」または「do it」を必須とします
- ユーザーが「wait」と言ったり、質問したりした場合は、回答してカードを再提示してください
- ユーザーが「no」と言った場合は、すぐに停止して代替案を提案してください
ゲートの提示とターンの停止の仕組みについては、 ask-user の選択ゲートパターンを使用してください。このスキルでは カードの内容と「yes」を明示的に求める厳格さを定め、ask-user では 停止して待つ手順を定めています。
ステップ 4:ログを記録して実行する
確認後:
- 削除した内容を
daily/notes/YYYY-MM-DD.mdの## Data Deletionsの下に記録します - タイムスタンプ、対象、件数、サイズ、復元方法を記載します
- 削除規模が大きい場合(1GB 超または 1000 件超のファイル/ページ)は、分割して進め、進捗を報告します
例外のないクラス
デフォルトで破棄可能なデータのカテゴリはありません。古いログ、git stash のエントリ、ビルド成果物、キャッシュなどは、いずれも過去に何かの信頼できる情報源となったことがあります。破棄可能かどうかは、カテゴリの性質ではなく、対象を調査して確認する属性です(バックリンク、git status、依存関係、再取得の可否とそのコストなど)。調査によって対象が一時的なもので、再生成可能だと実際に確認できた場合は、カードの記入はすぐに終わり、ユーザーからの「yes」もすぐに得られます。ゲートを機能させるためのコストです。
このルールがある理由
かつて、下流のエージェントがディスク容量を空けるために、脳のデータディレクトリにあった数 GB の生ソースファイルのキャッシュを削除しました。ファイルは「ただのキャッシュ」に見えましたが、計画中の機能で使うソースデータでした。そのデータは上流のソースから再取得できましたが、それでも削除は誤りでした。理由は次のとおりです。
- 利用が計画されていた作業を破壊した
- データ所有者の同意なしに実行された
- 「クリーンアップ」という表現によって、安全でないのに安全だと思わせた
ルール:データであり、大量にある場合は、まず必ず確認してください。
失敗した場合
gbrain のエラー code、終了コード、[AGENT] ブロックまたは通知ブロックについては、agent operator protocol に従ってください。このスキルに固有の注意事項:
- 破壊的なコマンドが終了コード 3(
confirmation_required)で終了する、または--confirm-destructiveを求める場合:このフラグが示すのはエージェントが確信していることだけであり、ユーザーの同意ではありません。復元可能性カードを提示し、ユーザーの明示的な yes を待ってください。 gbrain pages purge-deletedはソフト削除されたページを完全に削除するため、その後はgbrain restoreで復元できません。その旨をカードに記載してください。物理的な消去や、確認できない復元を約束してはいけません。- 削除または忘却の処理が
write_pending(終了コード 10)を返した場合は、削除ログの記録前にレシートをポーリングしてください。
アンチパターン
- ❌ 「これはただのキャッシュファイルです」 — キャッシュファイルが信頼できる情報源の場合もあります
- ❌ 「API から再取得できます」 — 再取得には時間と費用がかかり、同一のデータが得られるとは限りません
- ❌ 「gitignore 対象なので問題ありません」 — gitignore 対象であることは、重要でないことを意味しません
- ❌ 「ディスクがいっぱいなので、今すぐ容量を空ける必要があります」 — 切迫した状況でも、まず確認してください
- ❌ 「先にクリーンアップして、後でユーザーに伝えます」 — 削除前に確認を得る必要があります
- ❌ 「ソフト削除にすぎません」 — 誤った一括削除を元に戻すには、依然として大きな手間がかかります。また、パージすると恒久的な削除になります
- ❌ 「コマンドにはすでに --confirm-destructive が付いています」 — このフラグが確認するのはエージェントの意図であり、ユーザーの同意ではありません
- ❌ 代替案を列挙せず、削除だけを唯一の選択肢として提示する
重複(明確な境界)
- conventions/test-before-bulk.md — 書き込み側の姉妹スキルです。test-before-bulk は大量の WRITE の品質を担保します(170 件を実行する前に 3~5 件をテストします)。data-loss-gate は大量の DESTRUCTION を担保します(一括削除の前に確認します)。ページをその場で書き換えるフローには、両方が必要です。新しいコンテンツには test-before-bulk、書き換えで失われる内容には data-loss-gate を使います。
- ask-user — 確認の仕組み(選択肢を 2~4 個提示する、回避策を設ける、そのターンを停止する、回答を処理する)です。data-loss-gate は、破壊的操作カードと厳格な明示的な「はい」のルール(「ok」は同意ではありません)を提供する、用途を特化した呼び出し元です。破壊的でない判断ゲートでは、ask-user に振り分けてください。
- maintain — 脳の健全性チェックと定期的なクリーンアップ(孤立項目、バックリンク、古くなった項目の検出)を行います。maintain はクリーンアップ候補を見つけます。候補への対応が一括削除に及ぶ場合は、実行前に data-loss-gate が作動します。「脳の健全性をチェックする」は、ここではなく maintain に振り分けてください。
契約
このスキルでは、次のことが保証されます。
- 対象範囲(「When This Fires」のリスト)に含まれる破壊的操作は、確認カードが提示され、ユーザーが明示的に「yes」または「do it」と回答するまで実行されません。
- カードには、復旧可能性のチェックリスト、失われるもの、削除以外の代替案が少なくとも 1 つ必ず含まれます。
- 確認済みの削除は、タイムスタンプ、対象範囲、復旧方法とともに
daily/notes/YYYY-MM-DD.mdの## Data Deletionsの下に記録されます。 - 振り分けは frontmatter の正式なトリガーに一致します。
- 出力は
writes_to:に記載されたディレクトリの下に書き込まれます。 - プライバシーに関する契約が維持されます。実名、フォーク固有のファイルシステムパスのリテラル、上流フォークへの言及は含めません。
完全な動作契約は上記の本文セクションに記載されています。このセクションは適合性テストのために設けられています。
出力形式
成果物は 2 つです。
- 確認カード(実行前) — Step 2 の正確なフェンス付きブロックを、ask-user の停止して応答を待つパターンで提示します。カードの提示後にターンを終了し、ユーザーの回答があるまでツールを呼び出しません。
- 削除ログのエントリ(実行後、明示的に「yes」と回答された場合のみ) —
daily/notes/YYYY-MM-DD.mdに追記します。
## Data Deletions
- **[HH:MM]** [what was deleted] — [count], [size]. Reason: [why].
Recovery: [backup/git/restore path, or "none — permanent"].