关于 data-loss-gate
data-loss-gate 是面向 gbrain 用户的 Agent 技能,在执行破坏性操作前暂停并征求用户明确同意。它要求先检查目标、展示恢复信息卡并记录删除日志;其机制是路由约定,并非运行时强制拦截。
主要功能
- 01删除前检查目标
- 02展示范围与恢复信息卡
- 03要求用户明确同意
- 04按日期记录已确认删除
- 05涵盖文件系统与 gbrain 删除
适用场景
- 01执行批量删文件前进行审查
- 02确认删除 gbrain 页面或来源
- 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/下。
这是什么
一个会在任何破坏性操作执行前触发,并要求用户明确确认的关卡。Agent 会停止操作,展示可恢复性卡片,然后等待。
**范围说明:**这个关卡是一种路由约定——当破坏性意图匹配时,运行环境会将其解析到上下文中,行为良好的 Agent 会遵循该约定。它并非操作边界强制机制:如果技能从未加载,gbrain 运行时不会以任何机制阻止删除。(原生操作边界确认关卡已登记为待办事项;在实现之前,这项约定就是防线。)某些 CLI 操作界面有自己的标志关卡——例如,gbrain sources remove 要求使用 --confirm-destructive——但该标志确认的是 Agent 确定要执行操作。这项技能是为了确认用户是否确定。
何时触发
在执行以下任意操作之前:
Shell/文件系统层面:
- 对任何包含数据的目录执行
rm -rf - 对超过 10 个文件执行
rm/unlink - 执行会修改超过 10 个文件的
sed -i - 对受 Git 跟踪的文件执行
git rm - 批量截断或剥离文件内容
- 用更小的版本覆盖文件(剥离内容)
- 任何被描述为“清理”或“释放空间”且会触及数据文件的操作
Brain/数据库层面(gbrain 专属):
- 批量遗忘——编写脚本或循环对许多事实执行
gbrain forget <fact-id>。单次遗忘是经过审慎考虑、可幂等执行的操作;批量遗忘则属于数据丢失。 - 批量删除页面——循环执行
gbrain delete <slug>,或使用任何脚本对一组 slug 批量执行delete_page。删除是软删除(可通过gbrain restore <slug>恢复),直到被清除为止——请在卡片中说明这一点,但仍须经过关卡:批量误删后,要批量恢复并纠正代价很高。 gbrain pages purge-deleted——从 Brain 的所有来源中永久删除软删除页面。这是软删除安全网的最后一道防线。首先向用户展示gbrain pages purge-deleted --dry-run --json;该命令本身会询问确认(没有终端时退出码为 3),只有在用户同意后才使用--yes执行。- 移除来源——
gbrain sources remove <id>会删除该来源及其中的所有页面。--confirm-destructive标志不能替代确认卡片。 - 移除挂载——
gbrain mounts remove <id>只会移除本地注册信息(被挂载的 Brain 数据库仍然保留;重新添加即可恢复)。但如果工作流还计划删除挂载所对应的底层数据库或文件,也必须经过关卡——此时这些对象适用完整的确认卡片。 - 原始 SQL 截断——通过任何途径对 Brain 数据库执行任何
DROP TABLE、TRUNCATE,或不含精确WHERE条件的DELETE(包括 psql、迁移脚本或引擎的executeRaw调用)。 - 批量删除数据库行;删除表、集合或索引。
要怎么做
步骤 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 选择关卡模式——此技能提供卡片内容以及对明确肯定答复的严格要求;ask-user 提供停止并等待的规范。
步骤 4:执行并记录
确认后:
- 将删除内容记录到
daily/notes/YYYY-MM-DD.md的## Data Deletions下 - 记录:时间戳、内容、数量、大小、恢复路径
- 如果删除量较大(>1GB 或 >1000 个文件/页面),请分批执行并更新进度
不存在例外类别
没有任何类别的数据默认可以丢弃。旧日志、git stash 条目、构建产物、缓存——它们都曾在某个时候成为某些内容的真实来源。是否可丢弃取决于具体目标,必须通过检查(反向链接、git 状态、依赖关系,以及能否重新获取及其成本)来确认——绝不能仅凭类别判断。如果检查确实表明目标是临时且可重新生成的,那么填写确认卡片很快,取得用户的“yes”也很快。这就是确认关卡正常运作的代价。
存在的原因
有一次,下游 Agent 为了腾出磁盘空间,删除了其大脑数据目录中一个数 GB 的原始源文件缓存。这些文件看起来“只是缓存”——但它们其实是一个计划中功能的源数据。虽然这些数据恰好可以从上游来源重新获取,但这次删除仍然是错误的,因为:
- 它销毁了已有计划用途的成果
- 事先没有取得数据所有者的同意
- “清理”的说法让删除显得安全,实际却并非如此
规则:如果是数据,且数量庞大,就必须先征求同意。务必如此。
失败时的处理
对于任何 gbrain 错误 code、退出码、[AGENT] 块或通知块,请遵循Agent 操作者协议。此技能的具体要求如下:
- 破坏性命令以 3(
confirmation_required)退出,或要求使用--confirm-destructive:该标志确认的是 Agent 确实确定要执行,并不代表用户已同意。展示可恢复性确认卡片,并等待用户明确答复“yes”。 gbrain pages purge-deleted会永久移除软删除的页面,此后gbrain restore无法将其恢复:请在确认卡片上说明这一点。绝不要承诺无法验证的物理擦除或恢复能力。- 删除或遗忘操作返回
write_pending(退出码 10):在写入删除日志条目前,先轮询回执。
反模式
- ❌ “这些只是缓存文件”——缓存文件也可能是事实来源
- ❌ “我们可以从 API 重新获取”——重新获取需要时间和金钱,而且得到的数据可能不完全相同
- ❌ “它被 gitignore 忽略了,所以不重要”——被 gitignore 忽略 ≠ 不重要
- ❌ “磁盘已满,我现在就得腾出空间”——即使情况紧急,也要先征求同意
- ❌ “我会先清理,之后再告诉用户”——必须先取得确认,然后才能删除
- ❌ “这只是软删除”——错误的批量清理仍然会造成高昂的恢复成本,而且清除操作会让删除变为永久
- ❌ “命令已经带有 --confirm-destructive”——该标志确认的是 Agent 的意图,不是用户的同意
- ❌ 把删除说成唯一选项,却不列出替代方案
去重(明确边界)
- conventions/test-before-bulk.md — 写入侧的姊妹规范。test-before-bulk 用于把控批量写入质量(先测试 3-5 项,再运行 170 项);data-loss-gate 用于把控批量销毁操作(批量删除前先确认)。就地重写页面的流程两者都需要:test-before-bulk 用于检查新内容,data-loss-gate 用于确认重写会销毁的内容。
- ask-user — 确认机制(2-4 个 选项、退出路径、停止本轮、处理回复)。data-loss-gate 是专用调用方:它会提供破坏性操作卡片,并采用 严格的明确肯定规则(“ok”不算同意)。对于任何非破坏性决策关卡,请转交给 ask-user。
- maintain — 知识库健康检查和例行清理(孤立项、反向链接、过时内容检测)。maintain 用于找出 清理候选项;若处理这些候选项涉及批量删除,则必须在执行前触发 data-loss-gate。“检查知识库健康状况”应转交给 maintain,而不是本规范。
合约
此技能保证:
- 在确认卡片呈现、且用户明确回复“yes”/“do it”之前,范围内(“触发条件”列表所列)的任何破坏性操作都不会执行。
- 卡片始终包含可恢复性检查清单、将丢失的内容,以及至少一种删除之外的替代方案。
- 已确认的删除操作会记录到
daily/notes/YYYY-MM-DD.md的## Data Deletions下,并注明时间戳、范围和恢复路径。 - 路由与 frontmatter 中的规范触发条件一致。
- 输出写入
writes_to:中列出的目录。 - 保留隐私合约:不包含真实姓名、特定分支的文件系统路径字面值或上游分支引用。
完整的行为合约已记录在上文各正文部分;本节用于一致性测试。
输出格式
两个产物:
- 确认卡片(执行前)——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"].