关于 brain-ops
brain-ops 是围绕 gbrain 的上下文与记忆操作技能,面向使用脑库检索和保存信息的 Agent。它要求先查找相关资料,并在获准保存时记录来源、维护反向链接,同时区分私有与远程访问限制。
主要功能
- 01回答前优先检索脑库
- 02按授权保存信息并标注来源
- 03维护实体页面反向链接
- 04遵循私有信息读取限制
- 05支持记忆动词检索与写入
适用场景
- 01回答人物或公司相关问题前查找上下文
- 02获准时保存带来源的新信息
- 03处理远程读取受限的私有记忆
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ garrytan/ gbrain --skill brain-ops安装后在 Claude Code 中输入/brain-ops确认已加载。
详细介绍
Brain Operations——环境上下文层
在回复前回忆相关上下文。保存明确请求及其来源;在用户选择启用前,自动捕获处于关闭状态。阅读此技能不会启用捕获、委派或付费增强。仅限聊天的指令会禁止本轮写入,即使已启用常驻捕获也是如此。
约定: 查阅
skills/conventions/brain-first.md,了解查询链和可复制的检索筛选条件。 约定: 查阅skills/conventions/quality.md,了解引用和反向链接规则。 记忆动词(MEMORY_VERBS v1,gbrain ≥ 0.43)。 通过 MCP 进行读写时,优先使用五个核心记忆动词:remember(fact, provenance, ttl?)用于保存单条持久事实(必须提供来源 provenance;会去重并替代旧事实);recall(query | entity, budget_tokens)用于按预算打包读回记忆;entity(name)用于获取无需大模型参与的实体卡片;synthesize(question)用于开销较大的跨页面综合回答;forget(id)用于撤回活跃记忆(历史、源材料和备份可能仍然保留)。context_pack和delta补全七动词接口。当你已经有一条成型的事实时,使用remember而不是extract_facts;put_page/add_link/add_timeline_entry仍是页面与图谱的写入路径。若接口中没有这些动词,则回退到经典操作。约定见:docs/protocol/MEMORY_VERBS_v1.md。预算紧张时的页面问题: 请明确使用
recall({query: "zebra telescope", budget_tokens: 75, budget_policy: "query_first"}),使排序后的页面证据优先于近期事实进行打包。命令行:gbrain recall --query 'zebra telescope' --budget-tokens 75 --budget-policy query_first --json。 以实体优先、事件/会话过滤和事实聚焦的问题,应保持其现有的事实优先路径;不要更改context_pack。成本按字符数估算,超大的首个条目会被直接丢弃,不会跳过或截断。若结果为空,请先阅读budget_packing,再判断是否缺少记忆。MCP 请求与调用示例见skills/query/SKILL.md。指引本身并不等同于原生 harness 已激活:在观察到新会话发出已选择加入的调用之前,采用情况仍未经验证。选择能看到目标可见性的读回路径: 受信任的本地命令行调用方可以读回并撤回私有事实。所有 MCP 调用方(包括 stdio),以及连接到 MCP 的轻量命令行,目前只能读回和撤回世界可见事实。用户要求记住某内容,并不授权将真实的私人信息变为世界可见。若可用,请对私有记忆使用受信任的本地写入/读回路径。若只能远程访问,私有写入的成功回执仅确认已存储,私有读回仍未经验证;请说明这一限制,以及进行私有读回或撤回所需的受信任本地路径。不要为了让验证通过而扩大可见性或申请更宽泛的 OAuth 范围。进行 MCP 连接测试时,仅可在用户授权下使用无害的合成
visibility: "world"测试数据,保留其 ID,并在事后撤回。结果中的
<REDACTED:pattern>(例如<REDACTED:url_credentials>或<REDACTED:high_entropy_assignment>)表示知识库在该处保存了形似凭证的值,且本次响应已将其隐去;已存储的页面并未改变。请告知用户被隐去的是哪一类值,并说明该值可在知识库主机上读取。不要为恢复该值而重试其他操作,也不要猜测并回显其内容。用户要求你remember的凭证,按设计会对远程读回隐藏:所有 MCP 调用方(包括 stdio),以及连接到 MCP 的轻量命令行,都属于远程访问,因此只有在知识库主机上运行gbrain recall,才会按原样显示该凭证。文档见:docs/guides/write-refusals.md#secret-scan-refusals-and-redaction。无密钥知识库: 当
extract_facts返回skipped: extraction_unavailable时,由你自己充当抽取器:从该轮对话中自行提取事实,并通过remember逐条写入,设置kind(event | preference | commitment | belief | fact,这五个是冻结的协议枚举;抽取器和数据库中使用的idea类型不在其中),可见性则采用信封中agent_action指定的值(默认 private,请明确固定;remember默认为 world)。也可以在实体页面上编写## Facts代码块。skipped: extraction_failed信封(服务端抽取器在该轮出错,reason说明原因)同样建议对该轮采用手动remember的回退方式;未来的写入仍会保持自动抽取。
合约
此技能保证:
- 在任何外部 API 调用之前检查 Brain(优先查询 Brain)
- 明确的保存请求和选择加入的入站信号会触发 READ → WRITE 循环;信息补充需要单独配置的授权
- 每次对外响应都会检查 Brain,查找相关上下文
- 每条写入的事实都注明来源(内联
[Source: ...]引用) - 用户的直接陈述具有最高数据权威性
- 每次写入 Brain 时都维护反向链接(铁律)
铁律:反向链接(强制)
每当提及有 Brain 页面的人或公司,都必须从该实体页面创建指向提及它的页面的反向链接。提及未链接,就意味着 Brain 已损坏。格式请参阅 skills/conventions/quality.md。
阶段
阶段 1:优先查询 Brain(强制)
在使用任何外部 API 研究人物、公司或主题之前:
gbrain entity "<name>"(v0.43+)——针对一个已知人物/公司/项目,获取完整卡片(描述、别名、未结事项、近期事件、关联、反向链接/事实计数)。不调用 LLM,耗时不到 100 毫秒。对于已知实体查询,这一次调用即可替代步骤 2–6;近似匹配时会返回建议。gbrain search "name"——精确词元查找现有页面(轻量混合检索,不扩展)gbrain query "natural question about name"——概念/全景类问题优先使用此命令(语义匹配加重排可找回同义表达;结果不足时,--expand会添加 LLM 改写;search返回非零结果并不能证明结果完整)gbrain get <slug>——如果知道 slug,则读取完整页面- 检查反向链接:谁引用了此实体?
- 检查时间线:近期有哪些涉及此实体的事件?
Brain 几乎总能提供一些信息。外部 API 用于填补空缺,而不是从头开始。
先使用 gbrain 搜索,再直接读取、grep 或查询 Brain 文件;筛选器
(--types、--match keyword、query --since/--until、--source、--json)
见 Brain 优先约定中的“检索:优先使用 gbrain”部分。
⚠️ 切勿用浅层 ls 来界定或统计语料库——请查询 gbrain 或使用 find。 联合来源通常会同时采用多种目录结构——扁平的旧版结构,以及按日期嵌套的 meetings/YYYY/MM/ 结构。非递归的 ls dir/*.md 只能看到其中一种,因此会严重少计。真实案例:对某个来源的 meetings/ 执行浅层 ls,只统计到 132 个文件,且几乎全是用户的文件,于是误以为这就是全部语料库——遗漏了嵌套在 meetings/YYYY/MM/ 下的数千份记录。统计/界定 Brain 语料库:
- **最佳做法:**使用
gbrain sources list(显示每个来源已索引的页面数)和gbrain query。gbrain 能正确索引所有联合来源;应信任其索引,而非文件系统。 - **如果必须访问文件系统:**使用
find <dir> -name '*.md' | wc -l,绝不要使用ls *.md。然后梳理目录布局:find <dir> -name '*.md' | sed -E 's#(.*/)[^/]+$#\1#' | sort | uniq -c。 - 问题绝不会是“gbrain 看不到该来源”——几乎总是浅层的文件系统 glob 所致。在相信偏低的计数之前,先对照
gbrain sources list验证。
阶段 1.5:分析查询(gbrain think)
对于需要综合分析、结合时间背景或给出分析性回答的问题—— 不只是“找到页面”,而是“回答问题”:
- 使用
gbrain think "<question>"——跨页面、takes 和图谱进行多跳综合。时间相关问题会转入轨迹分析;其他问题则由 LLM 综合并生成带引用的回答,同时分析冲突和信息缺口。 返回的是有依据的回答,而不只是匹配页面列表。 - 最适合回答:“acme-example 上次融资是什么时候”“3 月份的 ARR 是多少”“自 Q1 以来发生了哪些变化”“alice-example 的联合创始人是谁,他们在做什么”“总结我们与 acme-example 的关系”。
- 找不到匹配的时间线事实时,会平稳回退到标准检索。
- 成本:每个问题都会调用 LLM——这是成本较高的路径。只需要 slug 或快速检查上下文的简单页面查询,请使用
query。
Phase 2: Authorized Capture (READ → WRITE)
For an explicit save request, or a message within the user's opted-in capture scope that has no chat-only restriction:
- Detect entities:识别提到的人物、公司和交易
- Load brain pages:在回复前读取已有页面以获取上下文
- Identify new information:这条信号带来了哪些页面尚未掌握的新信息?
- Write it back:用新信息、时间线条目和来源引用更新 brain 页面
- Create if missing:若内容值得记录,则保存所提供的信息并附上出处;仅在获得单独授权时才调用丰富化
为用户的直接陈述标注 [Source: User, YYYY-MM-DD]。
没有捕获授权时,可以在当前对话中使用这些信息,但不得持久化保存。明确的"记住"请求不等于授权持续捕获。
Phase 2.5: Structured Graph Updates (auto-link)
"Auto-link" 对账会从页面中提取实体引用,并以推断出的关系类型将其写入图谱(links 表);过时的链接(页面文本中已不再出现的引用)会被移除。由哪一方执行取决于写入路径:
- Trusted local writes(
gbrain put、gbrain capture、gbrain call put_page)会内联执行自动链接,并返回auto_links: { created, removed, errors }。 - **MCP callers(stdio 和 HTTP)**会返回
auto_links: { skipped: "remote", hint }与auto_timeline: { skipped: "remote" }。正文中的 wikilink 仅保存为文本。 随后的提交后效果会为同一来源中已存在的页面添加普通mentions边(auto_links.mention_links: "queued";执行gbrain config set mcp.remote_auto_links off可关闭该行为)。类型化边、frontmatter 边和时间线边不在此范围内:stdio 模式下的gbrain serve会通过其维护扫描(启动时以及每 10 分钟空闲触发一次)异步对账这些边。gbrain serve --http不会自行扫描——请使用gbrain sweep --once(通过 IPC 委托给正在运行的 serve)或gbrain extract links --source db按需对账。 对于需要立即生效的关系,请使用add_link,但会议出席关系除外,它由自动链接根据会议页面推导。未受信任的正文文本可能植入提升排名的边,因此内联路径仅限本地使用。 - 推断的链接类型:
attended、works_at、invested_in、founded、advises、source(frontmatter)、mentions(默认)。在当前激活的 schema pack 未覆盖出席规则的情况下(即gbrain init设置的 gbrain-base-v2),attended仅来自会议页面中明确的参会人名单(其Attendees:行或attendees:frontmatter),且方向为person -> meeting;覆盖该规则的 pack(如较早的gbrain-base)会自行设定规则与方向。 - 禁用方法:
gbrain config set auto_link false。默认开启。 - 带有具体日期的时间线条目仍需显式执行
gbrain timeline-add(或通过gbrain extract timeline --source db批量处理)。
Phase 3: On Every Outbound Response (READ → PULL → RESPOND)
在回答任何关于人物、公司或主题的问题之前:
- Check the brain:读取相关页面
- Pull context:使用编译后的 truth 与近期时间线
- Respond with context:brain 让每一个回答都更好
当 brain 页面存在时,不要仅凭通用知识作答。
Phase 4: Optional Enrichment
丰富化是用户可选的额外操作。仅仅提及某个实体、分享某个链接,或开启捕获选项,都不构成外部调研、付费调用或委派任务的授权。应遵循用户明确的导入/丰富化请求,或其已保存的范围与支出策略。在没有此类授权的情况下,只需调取已有上下文,并仅保存用户授权保留的所提供信息。
仅当委派已获授权且运行环境支持时,才使用后台 Agent。汇报观察到的结果,不要声称某个生成的例行程序已经运行。
输出格式
在回复中使用检索到的上下文并注明引用。只有在读回确认后才确认已授权的写入;如果用户没有请求或选择写入,不要仅为生成记忆更新而持久化对话。
跨来源引用格式(v0.18.0+)
当一个脑包含多个来源(wiki、gstack、yc-media 等)时,每条引用都必须包含来源 ID:[source-id:slug]。示例:
你告诉过我重试预算方案——参见 [wiki:topics/resilience] 和 [gstack:plans/retry-policy],了解相关出处。
规则:
- 键是
sources.id(不可变),绝不能使用sources.name(可变显示名称)。 - 单来源脑仍可使用
[default:slug],也可以省略前缀以保持向后兼容。 search、query、get_page、list_pages返回的每个页面负载都带有source_id——引用时务必使用它,绝不可猜测。
如果搜索结果的 source_id: "gstack" 且 slug: "plans/foo",引用格式为 [gstack:plans/foo]。规则就是这么简单。
发生错误时
对于任何 gbrain 错误 code、退出代码、[AGENT] 块或通知块,请遵循Agent 操作员协议。此技能的具体要求如下:
put_page返回revision_conflict:重新读取页面,将更改合并到新文本中,并使用新修订版本保存。write_pending(退出代码 10):在声称写入成功前,轮询get_write_request(gbrain write-request <request_id>)。put_page(或capture、标签、时间线)返回owner_unavailable,且detail: unbound_source:这是一个经典的 Postgres 脑。在来源的检出目录中将页面写入文件、提交,然后运行gbrain sync --source <id>;如果你在远程环境中,请将这三个步骤告诉用户。绝不要认领来源或切换模式来完成写入(参见Agent 操作员协议)。- 写入被机密扫描或 slug 围栏拒绝(
permission_denied):不要通过删除或重命名来规避;告诉用户拒绝了什么以及原因(参见docs/guides/write-refusals.md)。 recall/search在返回内容为空时带有降级通知或search_degraded:说明脑目前仅在搜索关键词,而不是说没有保存任何内容。- 通过 MCP 遇到
insufficient_scope/scope_denied:连接缺少该权限范围。告知用户;绝不要仅为让写入通过而索要更广泛的令牌。
反模式
- 未先检查脑就回答有关人物或公司的问题
- 未先检查脑就使用外部 API
- 写入事实时未附带行内
[Source: ...]引用 - 为了补充信息而阻塞回复
- 用权威性较低的来源覆盖用户的直接陈述
- 为不重要的实体创建脑页面
- 为同一实体创建重复页面——创建前务必先检查:运行
gbrain entity "<name>"(可捕获别名和近似匹配),然后使用名称变体执行query
使用的工具
search— 低成本混合搜索(向量 + 关键词,不扩展)query— 用于概念/全局概览问题的混合搜索(--expand会添加 LLM 多查询扩展)get_page— 读取脑页面put_page— 创建或更新脑页面add_link— 交叉引用实体add_timeline_entry— 记录事件get_backlinks— 检查哪些页面引用了某个实体sync_brain— 将更改同步到索引