news 2026/9/23 1:30:49

gbrain Brain-First 技能合规检查实战:以 compliant-phase 为例解析 Phase 1 头脑优先查找协议

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
gbrain Brain-First 技能合规检查实战:以 compliant-phase 为例解析 Phase 1 头脑优先查找协议

gbrain Brain-First 技能合规检查实战:以 compliant-phase 为例解析 Phase 1 头脑优先查找协议

【免费下载链接】gbrainGarry's Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain

导读

本文围绕 gbrain 仓库中 test/fixtures/brain-first-skills/compliant-phase/SKILL.md 这一测试语料,系统讲解 gbrain 的Brain-First(头脑优先)技能合规机制:为什么所有涉及外部数据查找的技能必须先查大脑知识库,如何在 SKILL.md 中以显式 "Phase 1: Brain-First Lookup" 标题声明合规,以及 doctor 检查、审计快照与--fix自动修复如何贯穿 CI。读完本文,你将掌握编写符合 gbrain 合规检查的 Skill 文件的全部规则与源码级判定原理。


一、背景:为什么 gbrain 强制要求 "先查大脑"

gbrain 的核心设计是让 Agent 拥有一个可持续累积的个人知识图谱(brain)。如果每个技能在收到实体、人物、公司、事实类查询时都直接调用web_searchperplexityexa等外部 API,就会产生两类问题:重复付费(外部 API 成本高)与知识孤岛(大脑里已有的结论被忽略)。

仓库中 skills/conventions/brain-first.md 是这条约定的权威定义,开头即声明:"Read this before doing ANY entity/person/company/fact lookup."(在执行任何实体/人物/公司/事实查找前必读)。其核心规则是强制查找链

  1. 已知确切 token / 名称 / 结构化字段 →search(廉价混合检索,无扩展)
  2. 概念 / 全景 / 同义改写类问题 →query(多查询扩展)
  3. 拿到 slug 后 →get_page读取完整编译事实
  4. 仅当步骤 1–2 无有效结果时,才允许调用外部 API

该文件的源码注释(src/core/skill-brain-first.ts)记录了一个真实事故作为动机:2026-05-19 的 "tweet-shield" 事件中,跨模态评估发现没有任何模型知道某条推文的关键背景,而大脑中其实早已存有相关记录——"先查大脑再查外部"的合规检查本可以避免这次误判。这正是skill_brain_first检查存在的意义:在代码层面拦截那些"声明了外部查找却未声明或未实现头脑优先"的技能作者

二、测试语料全景:brain-first-skills 目录的 9 个 SKILL.md

合规判定逻辑的完整行为边界由 test/fixtures/brain-first-skills/ 下的 9 个 SKILL.md 语料固化,每个文件对应一个判定结果(reason):

Fixture 目录SKILL.md 声明形态判定 reason
compliant-phase/显式## Phase 1: Brain-First Lookup标题compliant_phase
compliant-callout/顶部> **Convention:**规范 calloutcompliant_callout
compliant-position/第一个 brain 引用先于外部引用compliant_position
exempt-frontmatter/frontmatter 声明brain_first: exemptexempt_explicit
no-external/正文无任何外部查找模式exempt_no_external
missing-brain-first/直接外部查找、无任何合规信号missing_brain_first
multi-pattern/同时使用 exa / perplexity / crustdatamissing_brain_first(warn)
typo-frontmatter/brain-first: exempt(kebab-case 拼写错误)missing_brain_first+ typo 提示
negation-prose/否定式表述但 brain 引用在前compliant_position

本文的主角compliant-phase属于第一种合规路径——通过显式的阶段标题声明头脑优先。

三、compliant-phase 解析:Phase 1 标题就是合规证据

compliant-phase/SKILL.md全文如下(frontmatter + 正文):

--- name: compliant-phase description: External-lookup skill with explicit Phase 1 brain heading triggers: - "enrich entity" mutating: true --- # compliant-phase A skill that enriches entities via web_search but starts with an explicit Phase 1 brain-first lookup section. ## Phase 1: Brain-First Lookup Before reaching for external sources, check what the brain already knows. ## Phase 2: External Enrichment If the brain answer is thin, run web_search for missing context, then cross-reference with exa.api for citations.

这是一个"外部查找型技能"(会调用web_searchexa),因此必然触发外部模式检测;但它在正文最前面显式声明了## Phase 1: Brain-First Lookup,向分析器表明"我先查大脑、外部只是补充",从而通过合规判定。

注意 frontmatter 中mutating: true表示该技能会写数据。这与compliant-callout语料形成了完整的对照实验:两个文件都调用外部 API,只是合规证据形态不同(一个是 callout,一个是 Phase 标题)。

为什么是 "Phase 1" 或 "Step 0"?

源码中判定标题的正则(src/core/skill-brain-first.ts)为:

export const PHASE_HEADING_RE = /^##+\s*(?:Phase\s*1|Step\s*0)\b[^\n]*brain/im;

它要求满足三个条件:

  • 必须是 H2 及以上标题^##+):# Phase 1: Brain Lookup这类 H1 不匹配,因为 H1 通常是技能名本身,不算执行步骤;
  • 必须是Phase 1Step 0## Phase 2: Synthesis不匹配——外部查找必须排在"第 1 阶段/第 0 步",这是时间顺序的强约束;
  • 标题中必须包含brain字样[^\n]*brain,忽略大小写):## Phase 1: Research这种含糊标题不匹配。

测试套件在 test/skill-brain-first.test.ts 中逐一验证了这四种形态:## Phase 1: Brain-First Lookup✅、### Step 0: Brain Context✅、# Phase 1(H1)❌、## Phase 2❌。

四、合规判定的完整逻辑:豁免优先,三级阶梯兜底

判定入口是纯函数analyzeSkillBrainFirst(content, skillName, frontmatter)(src/core/skill-brain-first.ts)。它的执行顺序是"豁免优先,从上到下":

第一层:显式声明豁免(exempt_explicit)

frontmatter 中出现规范形式brain_first: exempt时直接判定 OK。适用于纯基础设施类技能(cron 调度、容器管理、浏览器驱动、ask-user 提示器等),它们的工作根本不涉及知识查询。

第二层:正文无外部模式(exempt_no_external)

分析器先把 frontmatter 剥离(stripFrontmatter),再在正文中扫描外部查找模式。一个关键细节(源码 F6 说明,src/core/skill-brain-first.ts):frontmatter 里的tools: [web_search]声明不会触发误报——声明是元数据而非执行,所以位置比较一律基于剥离 frontmatter 后的正文。

外部模式共 8 种(EXTERNAL_LOOKUP_PATTERNS),全部词边界锚定、忽略大小写:

模式名正则匹配示例
web_search\bweb_search\bweb_search(不会误匹配web_search_history
web_fetch\bweb_fetch\bweb_fetch
exa\bexa[\s._-]exa.searchexa_lookup(不会误匹配examexalt
perplexity\bperplexity\bPerplexityperplexity
happenstance\bhappenstance\bhappenstance
crustdata\bcrustdata\bcrustdata
captain_api\bcaptain[\s._-]?api\bcaptain apicaptain_apicaptain-apicaptainapi四种形态
firecrawl\bfirecrawl\bfirecrawl

第三层:合规三级阶梯(任一命中即 OK)

  • a. 规范 callout:正文存在> **Convention:**块引用且包含brain-first子串(CONVENTION_CALLOUT_RE = /^>\s*\*\*Convention:\*\*[^\n]*brain-first/im)。路径写法不限(纯文本路径、markdown 链接均可),这是 F7 修复的兼容性设计(src/core/skill-brain-first.ts)。
  • b. 显式 Phase 1 / Step 0 标题:即本文主角compliant-phase走的路径,见第三节。
  • c. 位置优先findFirstBrainRefOffset(body) < findFirstExternalRefOffset(body),即正文中第一个 brain 引用(gbrain searchgbrain querysearch the brain等 11 种模式,见 BRAIN_REFERENCE_PATTERNS)严格出现在第一个外部引用之前。

默认兜底:missing_brain_first(warn)

外部模式存在、三层阶梯全未命中,则返回warnmissing-brain-first语料即此形态——"Call web_search to find information. Hit perplexity for synthesis. No brain consultation at all.",测试断言它同时匹配到web_searchperplexity两个模式(test/skill-brain-first.test.ts)。

拼写错误的 frontmatter:typo 提示而非静默放行

typo-frontmatter语料展示了"近乎豁免但未落地"的场景:作者写了brain-first: exempt(kebab-case)。分析器拒绝猜测,返回 warn 并附带 paste-ready 修复提示(Found brain-first: exempt — did you mean brain_first?)。skills/conventions/brain-first.md 列出了全部 5 种近失形态及修复提示:kebab-case / CamelCase 需改 snake_case、带引号需去引号、大写值需转小写、required等未知值不被支持。设计原则是"静默的拼写错误是最坏的结果"——"我声明了豁免它却还报警",所以解析器宁可响亮提示也不猜测。

五、doctor 集成:skill_brain_first 检查与审计快照

合规判定不是孤立脚本,而是 gbraindoctor命令的正式检查项。在 src/commands/doctor/skill-checks.ts 中,skillBrainFirstCheck(skillsDir)会:

  1. 通过loadOrDeriveManifest加载技能清单,逐个 SKILL.md 调用analyzeSkillBrainFirst
  2. 收集warn违规者与 typo 提示技能;
  3. 执行快照 + diff 审计(A2 契约):将本次违规者集合与上次快照(skill-brain-first-snapshot.json)比对,仅对"新增检测 / 已解决"的状态迁移追加审计事件(detected/resolved)到skill-brain-first-YYYY-Www.jsonl(ISO 周格式文件);首次运行则引导写入每条当前违规者的detected事件;
  4. 违规者为空时返回ok(如"N skill(s) compliant or exempt"),否则按技能名排序输出 warn 消息。

审计相关实现位于 src/core/audit-skill-brain-first.ts。零迁移运行的"零写入"契约由 e2e 测试严格验证:第二次 doctor 运行若违规集合无变化,审计文件行数必须保持不变(test/e2e/skill-brain-first.test.ts)。

六、gbrain doctor --fix:自动插入规范 callout

对违规技能,doctor --fix会通过 dry-fix 机制自动插入规范 callout,将warn翻转回ok。自动修复有严格的安全门(test/e2e/skill-brain-first.test.ts):

  • 必须处于 git 仓库内且文件已跟踪,否则拒绝写入(防止破坏唯一的文件副本、无法回滚);
  • dry-run 模式(autoFixDryViolations(..., { dryRun: true }))只报告"拟插入"内容而不落盘;
  • 插入位置必须满足"frontmatter 闭合之后 + 首个 H1 之后"(测试通过索引比较断言,test/e2e/skill-brain-first.test.ts);
  • 二次运行幂等:已插入过的技能跳过并报already_delegated
  • 插入后重新运行 doctor,违规者归零(typo-frontmatter也会被一并修复,因为它的 typo 豁免未生效、同样被判定为违规)。

七、CI 门禁:check-skill-brain-first.sh

仓库自身的技能目录也受此规则约束。scripts/check-skill-brain-first.sh 是bun run verify链路上的 CI 守卫:它运行GBRAIN_SKILLS_DIR="$ROOT/skills" bun run src/cli.ts doctor --fast --json并对 JSON 输出做显式解析,断言skill_brain_first检查状态不是warn

脚本注释特别强调--fast参数是必需的:不带它时 doctor 会调用connectEngine(),在无~/.gbrain/config.json的 CI 环境(未初始化 brain)会以状态码 1 退出、产生零 stdout 导致解析失败;--fast走纯文件系统检查(resolver_healthskill_conformanceskill_brain_first),后者本就是文件系统级检查,因此这是正确用法而非绕过(scripts/check-skill-brain-first.sh)。

触发时脚本给出两条修复路径:对确实不需要头脑优先的技能加brain_first: exempt;否则在技能正文顶部添加规范 callout。

八、如何验证:运行测试与复现判定

本仓库用 Bun 运行测试。执行下面命令即可复现本文全部判定结论:

# 单元测试:驱动 fixtures 语料,断言 9 个 SKILL.md 的判定 reason bun test test/skill-brain-first.test.ts # e2e:将语料镜像进临时 git 仓库,验证 doctor 检查 + --fix 自动修复 + 审计 bun test test/e2e/skill-brain-first.test.ts

test/skill-brain-first.test.ts 的 fixture 语料驱动用例逐条断言:compliant-phase必须返回ok且 reason 为compliant_phasemissing-brain-firstmulti-pattern必须返回warnexternal_patterns_matched分别包含对应的外部模式名(multi-pattern 同时命中exaperplexitycrustdata三个)。

九、写给技能作者:四条落地准则

综合 skills/conventions/brain-first.md、fixture 语料与源码判定逻辑,编写任何涉及外部查找的 SKILL.md 时,只需满足以下任一条件即可通过skill_brain_first检查:

  1. 显式阶段标题(本主题核心):正文最前方声明## Phase 1: Brain-First Lookup(或### Step 0: Brain Context),H2+、含brain、编号为 Phase 1 / Step 0;
  2. 规范 callout:正文顶部放> **Convention:** see conventions/brain-first.md for the lookup chain...,引用路径写法不限;
  3. 位置优先:确保正文中第一个 brain 引用(如gbrain search)严格出现在第一个外部引用之前——negation-prose语料证明即便是否定式表述,只要顺序正确同样合规;
  4. 显式豁免:frontmatter 中写规范形式brain_first: exempt(注意严格 snake_case、小写、无引号),且仅在技能确实不依赖大脑知识时使用。

无论选择哪种形态,都建议遵循 skills/conventions/brain-first.md 中"每个 brain 页面引用都应输出可点击链接""外部 API 拉取结果务必gbrain capture回收入箱"等实践,让"先查大脑、外部补充、结果回存"形成完整闭环——这不仅是为了通过检查,更是为了让大脑知识图谱随每次查找持续增值。

【免费下载链接】gbrainGarry's Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 1:30:39

5道脑筋急转弯题源码解析,搞定面试原理难题

5道脑筋急转弯题源码解析,搞定面试原理难题 上周陪一个做嵌入式的朋友模拟面试,面试官没问STM32寄存器,直接甩出一句:“给你3根绳子,烧完都要1小时,怎么用它们计时45分钟?” 朋友愣住,脑子一片空白。 其实这不只是智力题,它考的是你对 资源约束下状态机切换 的理解。…

作者头像 李华
网站建设 2026/9/23 1:30:33

最强垃圾系统面试避坑速查手册:3步搞懂GC原理

最强垃圾系统面试避坑速查手册:3步搞懂GC原理 刚学完Java基础,对着 new 关键字如数家珍,可一问到项目里内存泄漏怎么排查,大脑瞬间死机?别慌,这正是“最强垃圾系统”面试里最扎心的盲区。很多开发者把JVM当成黑盒,以为只要代码写得对,内存就永远不会爆。其实,面试官想听的不是背八股文,而是你如何…

作者头像 李华
网站建设 2026/9/23 1:30:29

3步搞定查经纬度的地图:图解原理避坑指南

3步搞定查经纬度的地图:图解原理避坑指南 面对满屏红色的 StackTrace,你是不是头都大了? 报错信息里全是 NullPointerException 或者 IndexOutOfBounds ,根本看不出哪行代码挂了。 别慌,今天咱们不整虚的,直接用图解原理拆解查经纬度的地图开发。…

作者头像 李华
网站建设 2026/9/23 1:30:05

Aras PLM二次开发实战:ItemType建模、AML查询与Method调优

简介&#xff1a;这份 Aras PLM 学习文档面向刚接触产品生命周期管理系统的工程师、实施人员与运维管理者&#xff0c;帮助其快速理解 Aras PLM 的系统管理机制与配置逻辑。资源以 docx 格式交付&#xff0c;压缩包内共 1 个文件&#xff0c;体积约 11.06MB&#xff0c;内容为一…

作者头像 李华
网站建设 2026/9/23 1:30:05

3个坑:2026最新知乎热榜爬虫,从报错到落地的避坑指南

3个坑:2026最新知乎热榜爬虫,从报错到落地的避坑指南 复制来的代码跑不通,改了三行还是报403,日志里全是反爬拦截,你盯着屏幕发呆。 别急,这是2026年最新环境下的常态,知乎的热榜接口早已不是简单的JSON返回。…

作者头像 李华
网站建设 2026/9/23 1:30:03

抖音去水印工具避坑指南:搞懂原理再谈薪资

抖音去水印工具避坑指南:搞懂原理再谈薪资 面试被问原理答不上来,是大多数初级开发者的噩梦。特别是当面试官抛出“抖音去水印”这种看似简单实则暗藏玄机的高频面试题时,很多人只能支支吾吾说“调个API”,瞬间失去加分项。别慌,今天咱们不背八股文,直接拆解底层逻辑,让你下次遇到这类问题能自信地画出流程图,甚…

作者头像 李华