gbrain 紧凑列表格式 RESOLVER.md 解析原理与回归测试剖析OpenClaw 规模化路由问题的修复锚点【免费下载链接】gbrainGarrys Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain导读本文围绕 gbrain 仓库中test/fixtures/openclaw-compact-resolver/skills/RESOLVER.md这一测试夹具fixture展开深入讲解 gbrain 技能路由解析器对紧凑列表格式compact list-formatRESOLVER.md的解析规则、kebab 小写技能名校验、散文条目prose bullet防误判机制以及它们如何与checkResolvable核心校验函数和gbrain doctor健康检查协同工作。读完本文你将掌握紧凑列表格式的书写语法、与 Markdown 表格格式的混用规则、触发词索引的构建原理以及 v0.41.7.0 中 238 个 FAIL 错误归零这一回归事件的完整技术背景。一、背景OpenClaw 部署下的规模化路由回归gbrain 是一个Agent Brain代理大脑实现它通过skills/RESOLVER.md作为调度器dispatcher来把入站消息路由到对应的技能skill。skills/RESOLVER.md见 仓库根级解析器明确说明每个技能的 frontmattertriggers:数组是权威的路由信号而RESOLVER.md则是同一路由的人类可读调度映射——一处扫描所有技能及其触发短语的地方。在 v0.41.7.0 之前的版本中OpenClaw 部署出现了一个规模化回归问题任何使用紧凑- **name**: t1 | t2形状而非 Markdown 表格编写解析器的 agent都会在gbrain doctor中被报告为所有技能不可达unreachable。该回归的具体数据是238 个 FAIL 错误 → 修复后 0 错误。这一事件记录在 回归测试文件 的头部注释中并被定位为 OpenClaw 规模化回归的二分锚点bisect anchor。二、夹具结构openclaw-compact-resolver的完整布局本文章的核心对象位于test/fixtures/openclaw-compact-resolver/目录其结构如下test/fixtures/openclaw-compact-resolver/ └── skills/ ├── brain-search/SKILL.md ├── calendar-prep/SKILL.md ├── content-creation/SKILL.md ├── daily-digest/SKILL.md ├── email-triage/SKILL.md ├── executive-assistant/SKILL.md ├── flight-tracker/SKILL.md ├── gift-advisor/SKILL.md ├── investor-update-ingest/SKILL.md ├── meeting-prep/SKILL.md └── RESOLVER.md夹具由两部分组成约 10 个技能目录每个目录内是带有效 frontmattertriggers:的SKILL.md桩文件stub且全部使用虚构的技能名如gift-advisor、flight-tracker避免遮蔽真实打包技能。每个桩文件的 frontmatter 与解析器条目一一对应例如--- name: email-triage triggers: - triage email - sort my inbox - morning email --- # email-triage Stub for fixture testing (v0.40.11.0 compact-resolver regression suite).skills/RESOLVER.md——即本文章的主体文档采用纯紧凑列表格式按##小节组织末尾附有一段专门用于钉住pinD4 正则收紧行为的散文小节详见下文。值得注意的是夹具中的技能桩文件注释标记为 v0.40.11.0 compact-resolver regression suite而 回归测试 的注释标记为 v0.41.7.0二者是同一回归事件的不同阶段标记测试在 v0.41.7.0 正式合入。另有一个姊妹夹具test/fixtures/openclaw-mixed-merge/用于钉住 v0.31.7 引入的 D-CX-14 多解析器合并场景表格格式的skills/RESOLVER.md 父目录紧凑列表格式的../AGENTS.md。三、紧凑列表格式解析语法紧凑列表格式是 OpenClaw 生态原生的解析器形状其完整语法规则定义在核心解析函数 parseResolverEntries 中。与传统的 Markdown 表格格式| trigger | skills/name/SKILL.md |并列二者可以在同一文件中混合使用。3.1 两种行形态解析器同时支持以下两种列表行加粗形态推荐- **skill-name**: trigger1 | trigger2纯文本形态回退- skill-name: trigger1 | trigger2其对应的正则分别为const listBold line.match(/^-\s\*\*([a-z][a-z0-9-])\*\*\s*:\s*(.)$/); const listPlain listBold ? null : line.match(/^-\s([a-z][a-z0-9-])\s*:\s*(.)$/); const listMatch listBold ?? listPlain;3.2 技能名必须是 kebab-lowercaseD4 收紧两条正则中的技能名部分均限定为[a-z][a-z0-9-]即首字符必须是小写字母a-z后续可以是小写字母、数字或连字符-大写字母如Note、TODO一律不匹配。这一设计是 D4 回归修复的核心。真实世界的AGENTS.md文件中充斥着类似- **Note**: ...、- **Convention**: ...这样的散文项目符号如果解析器不加以区分它们会被误解析为技能行进而产生幽灵触发词orphan trigger。夹具中的## Notes小节专门钉住了这一行为详见第四节。3.3 多个触发词扇出为多条条目一行内通过|分隔的多个触发词会被扇出fan out为多条解析条目每条共享同一个skillPath。例如夹具中的- **gift-advisor**: gift idea | what should I bring | birthday gift | housewarming会被解析为 4 条{ trigger: gift idea | what should I bring | birthday gift | housewarming, skillPath: skills/gift-advisor/SKILL.md }条目。checkResolvable下游会按skillPath去重因此技能可达性计数中每个技能只计一次。3.4 路径后缀被剥离但不被采用D3列表行允许携带一个可选的显式路径后缀解析器会将其从触发词字符串中剥离但不会作为实际路径采用const cleaned triggersRaw.replace(/\s*(?:→|-)\s*skills\/[^]\s*$/, );Unicode 箭头→和 ASCII 箭头-均可接受。skillPath始终按约定推导为skills/name/SKILL.md。源码注释明确指出下游消费者如routing-eval.ts的skillSlugFromPath以及本文件的可达性查找都假设该约定路径对于非约定路径必须改用表格格式。3.5 其他细节空触发词和被字面量...占位符会被过滤##标题行会被捕获为当前小节名section并挂到该小节内的每条条目上供--fix建议和报告定位使用支持#注释行——从源码看解析器会跳过所有不匹配的行既非标题、也非表格行、也非列表行因此散文、空行和说明文字天然被忽略。四、Notes 小节散文防误判的回归哨兵夹具RESOLVER.md末尾的## Notes小节是整个夹具的反向测试用例原文如下## Notes The bullets below are prose, not skill rows. The v0.41.7.0 parser rejects them via the kebab-lowercase name regex. If you see entries materialize for any of these, the D4 regex tighten regressed. - **Note**: this is a prose bullet (capitalized name, must be skipped) - **Convention**: see [parent docs] (capitalized name, must be skipped) - **TODO**: nothing here is a real skill row (capitalized, skipped) - **Important**: this is just a callout (capitalized, skipped)这 4 个散文条目Note、Convention、TODO、Important都使用大写开头的名字故意设计为不匹配kebab-lowercase 正则。它们的存在是为了保证如果未来某次改动放宽了 D4 正则收紧这些条目会立刻以orphan_trigger警告的形式在回归测试中暴露出来防止技能行被误解析的问题重新出现。在真实世界的skills/RESOLVER.md中也有对应的结构## Notes之外的常规正文如Memory defaults、Disambiguation rules都是纯散文或表格解析器同样依靠正则自然跳过它们。五、checkResolvable 的完整校验流水线checkResolvable 是解析器的核心校验函数它有三个调用点bun test——单元测试直接导入并断言checkResolvable()的返回值gbrain doctor——运行时健康检查附带可操作的 agent 指引skill-creator技能——创建技能后的强制性校验门post-creation validation gate。其返回的ResolvableReport结构包含ok、errors、warnings、issues和summary含total_skills、reachable、unreachable、overlaps、gaps五项统计。ok仅在errors为空时为真警告默认不翻转ok但--strict模式会将其提升为失败条件。5.1 输入加载frontmatter 触发词 解析器行条目的并集自 v0.41.11 起触发词来源采用 UNION 语义加载自loadSkillTriggerIndex(skillsDir)见 skill-trigger-index.ts每个技能SKILL.md的 frontmattertriggers:权威——每个技能自带触发词新技能即使没有RESOLVER.md行也能保持可达RESOLVER.md/AGENTS.md中的策划行条目——来自skillsDir及其父目录保留 D-CX-14 的 OpenClaw 工作区根布局。frontmatter 是事实来源关闭 #1451 漂移问题RESOLVER.md行仍然做加法贡献使人类可读的调度映射保持承载价值。解析器文件名集合定义于 resolver-filenames.ts第 19 行RESOLVER_FILENAMES [RESOLVER.md, AGENTS.md]。5.2 六类检查流水线依次执行以下检查序号检查严重级别触发条件1可达性unreachableerror低置信度场景降级为 warningmanifest 中的技能在解析器条目中无对应触发词2文件缺失missing_fileerror解析器引用了磁盘上不存在的skills/name/SKILL.md3MECE 重叠mece_overlapwarning同一触发词命中多个技能白名单除外4MECE 缺口mece_gapwarning技能 frontmatter 缺少triggers:数组5DRY 违规dry_violationwarning技能内联了应委托给约定文件的跨切面规则6路由评估routing_*warning结构性路由评估与 routing-eval.jsonl 夹具不一致其中 MECE 重叠的白名单为OVERLAP_WHITELISTingest路由器、signal-detector始终开启、brain-ops始终开启——它们被设计为与许多技能有意重叠。5.3 低置信度外部目录的降级逻辑当满足以下全部条件时unreachable从 error 降级为 warning技能目录通过cwd_walk_up发现、无解析器文件贡献行或仅有一个零行条目的AGENTS.md、不可达数大于可达数、且磁盘上无manifest.json。这避免了其他工具目录中恰好带triggers:的单个技能导致其所有兄弟技能被硬判为 error。高置信度来源显式 flag、env、安装路径始终保持严格。六、回归测试如何验证紧凑格式解析回归测试文件 使用两个夹具驱动多个回归测试。对紧凑夹具而言共有 5 项断言所有技能可达report.summary.unreachable为 0reachable total_skills且total_skills 10——这是头条断言修复前每个技能都是unreachableN零 error 级问题report.errors.length 0且report.ok true——对应 238 FAIL → 0 的结果零 mece_gap 警告夹具桩文件均带有效 frontmatter 触发词gap 检测应保持静默该断言一旦触发即说明某个夹具文件丢失了triggers:数组D4 回归守卫4 个散文条目Note、Convention、TODO、Important不得以orphan_trigger警告形式出现零 missing_file 警告每条列表条目都能解析到磁盘上的真实文件。对混合合并夹具openclaw-mixed-merge另有 3 项断言8 个技能表格格式 5 个 紧凑列表格式 3 个全部可达、零 error、两种格式的技能都在合并结果中贡献条目——专门防止某一种格式的解析器通过dedup-by-skillPath路径吞掉另一种格式的输出。要本地运行这组测试可以在仓库根目录执行bun test test/check-resolvable-openclaw-compact.test.ts该测试使用 Bun 的bun:test运行时见 package.json 与 bunfig.toml 中的测试配置。七、实战为 OpenClaw 工作区编写紧凑格式解析器基于上述解析规则为 OpenClaw 风格的 agent 工作区编写紧凑格式RESOLVER.md时应遵循以下最佳实践7.1 推荐的行模板## Always-on - **brain-search**: search my brain | what do we know about | find references to ## Personal - **gift-advisor**: gift idea | what should I bring | birthday gift | housewarming - **flight-tracker**: track my flight | flight status | when does my flight land ## Email Calendar - **email-triage**: triage email | sort my inbox | morning email要点使用加粗形态- **name**: ...技能名保持小写连字符kebab-lowercase用##小节对技能做语义分组Always-on、Personal、Email Calendar、Workflows 等解析器会把小节名关联到每条条目一个技能最多一行多个触发词用|分隔若需要指向非约定路径改用表格格式| trigger | \skills/ /SKILL.md |。7.2 保持每个技能文件自带 frontmatter triggers由于 frontmattertriggers:是权威信号且RESOLVER.md行是加法贡献双写时务必保持二者一致。仓库级 RESOLVER.md 也强调如果某一行与技能的 frontmatter 冲突frontmatter 胜出且应修复该行。7.3 规避散文误判不要在解析器文件中使用- **Note**:、- **Convention**:等大写开头的散文项目符号来写注释它们会被跳过但语义容易误导如需注释可放在正文段落中或使用不会被正则匹配的行形态。夹具的## Notes小节本身就是反面教材式注释可参考其写法。7.4 使用 gbrain doctor 验证运行gbrain doctor会对解析器做全量校验输出unreachable、missing_file、orphan_trigger、mece_overlap、mece_gap、dry_violation等报告项并在--strict模式下将警告提升为失败。新技能创建后skill-creator技能也会强制调用checkResolvable作为完成门。八、与真实仓库级 RESOLVER.md 的差异对照仓库根级的 skills/RESOLVER.md 是生产环境的调度映射含 100 技能行、GStack 思维技能、身份与访问规则、消歧规则、跨切面约定等它主要使用表格格式同时遵循相同的路由契约frontmattertriggers:是权威路由信号。而本夹具是纯紧凑列表格式的最小化副本二者共同验证了parseResolverEntries对两种格式以及混用场景的兼容性。夹具中的技能名gift-advisor、flight-tracker等均为虚构确保测试不会遮蔽真实打包技能。结语test/fixtures/openclaw-compact-resolver/skills/RESOLVER.md看似只是一个小型测试夹具实则是 gbrain 技能路由体系的关键回归锚点它同时钉住了紧凑列表格式的完整语法kebab-lowercase 名校验、触发词扇出、路径后缀剥离、散文条目防误判D4 收紧、以及 238 FAIL → 0 的规模化回归修复。理解这份夹具就理解了parseResolverEntries的解析边界与checkResolvable的校验语义也掌握了在 OpenClaw 风格工作区中编写、验证和演进紧凑格式解析器的全部要点。相关代码入口解析器实现、校验函数、回归测试、解析器文件名定义。【免费下载链接】gbrainGarrys Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
技术人做项目交付:优势、翻车点与避坑指南 我记得第一次独立带一个交付项目,甲方问了我一句很平常的话:你们能不能在一个月内把这套系统跑起来?我当时的条件反射是“技术上没什么问题”,然后我们很快就谈妥了价格和工期。结果那一个月成了我职业生涯里最难熬的三十天——需… · 2026/9/23 4:03:52
网页的字怎么变小了?新手避坑指南与性能优化实战 网页的字怎么变小了?新手避坑指南与性能优化实战 打开浏览器刷新页面,原本清晰的标题突然变得细若蚊蚋,鼠标悬停才勉强看清。这种“网页的字怎么变小了”的诡异现象,往往不是字体文件丢失,而是渲染引擎在高压下的崩溃前兆。新手常误以为是CSS写错,但… · 2026/9/23 4:03:40
黒域实战避坑指南:3步搞定API变更与版本兼容 黒域实战避坑指南:3步搞定API变更与版本兼容 版本升级后 API 全变了,代码直接报错?别慌,这是后端开发最常见的“黑域”困境。今天分享一份黒域实战避坑指南,帮你彻底解决兼容性问题。 项目目标:构建可复现的黑域环境… · 2026/9/23 4:03:33
用 arcpy 按属性批量导出 shp:Select_analysis 与 SearchCursor 实战配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 4:47:36
SpringCloud微服务电商系统架构与实战 1. 项目概述:SpringCloud电子商城系统全解析这个基于SpringCloud的电子商城系统是我在电商领域摸爬滚打多年后的一次技术沉淀。不同于简单的CRUD项目,它完整复现了中小型电商平台的核心业务场景,从商品展示、购物车到订单支付、物流跟踪一应俱… · 2026/9/23 4:47:36
反弹Shell弹不出?三步定位链路故障,从排错到实战绕过 你能想象那种感觉吗?授权测试做完了、RCE也拿到了,命令都能正常执行了,结果反弹shell就是弹不出来。nc -lvp 4444 这头开着,那头命令也发了,屏幕上却一片死寂。我至今记得第一次在内网靶场里遇到"SHELL弹不出&quo… · 2026/9/23 4:47:30
街头霸王人物实力排名:3个维度拆解高频面试题背后的底层逻辑 街头霸王人物实力排名:3个维度拆解高频面试题背后的底层逻辑 版本升级后 API 全变了,这种痛谁懂?上周刚把项目里的角色数据模型重构完,发现之前写的排名算法全得推倒重来。更坑的是,面试时面试官甩过来一道 高频面试题… · 2026/9/23 4:47:24
2026 主流 IP 代理商横向测评:稳定性、速度与性价比全对比 1. 引言在数据采集、账号矩阵运营、广告验证和跨境电商等场景中,稳定可靠的代理 IP 是业务正常运转的基础。市面上的 IP 代理商数量众多,定价模式、IP 类型和适用场景差异很大,选错服务商不仅浪费预算,还可能影响业务稳定性。本文… · 2026/9/23 4:47:24
5个坑点:人性的电影环境配置与面试必问注销流程避坑 5个坑点:人性的电影环境配置与面试必问注销流程避坑 配置环境就卡半天,这感觉太熟悉了。你明明照着教程敲了半小时,结果还是报错,头发都抓秃了也没个结果。更扎心的是,当你去搜“人性的电影”相关的项目案例或资源时,发现很多教程里夹带的“注销流程”… · 2026/9/23 4:47:12
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29