gstack 模型行为覆盖层解析:fable-5 的继承机制与四条行为校准 gstack 模型行为覆盖层解析fable-5 的继承机制与四条行为校准【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstackgstack 通过model-overlays/目录为不同的 LLM 模型族注入行为校准补丁behavioral overlay让同一套技能skill在不同模型下都表现出一致的工程纪律。fable-5.md正是其中之一它用一行{{INHERIT:claude}}指令继承通用基线再叠加四条针对 Fable 5 模型族特性的校准规则。本文以 fable-5.md 为主体结合 model-overlay.ts 的解析器、preamble.ts 的组装逻辑与 model-overlay-fable-5.test.ts 的守护测试完整讲清这份覆盖层的结构、原理与激活方式。一、模型覆盖层Model Overlay的定位在 gstack 里覆盖层是纯 Markdown 文件存放在 model-overlays/ 目录按模型族名命名如claude.md、fable-5.md、opus-4-7.md、gpt-5.4.md。它的职责不是描述功能而是修正某个模型族的特定行为偏差——例如某模型容易过度规划、某模型容易提前终止任务、某模型输出过于冗长。设计上有两条硬约束覆盖层是偏好而非规则。解析器会在文件内容前统一加上一段从属声明subordinate 语言明确它低于技能工作流、STOP 点、AskUserQuestion 门控、plan-mode 安全与/ship审查门控。纯 Markdown 即可编辑。CHANGELOG 中明确写道Overlay files are plain markdown — edit in place, no code changes.这意味着调整某个模型的行为只需要改对应文件无需动任何 TypeScript。fable-5.md全文仅 23 行信息密度却很高第一行是继承指令其余四条加粗小标题各是一段行为校准。二、骨架一行{{INHERIT:claude}}继承通用基线fable-5.md 的第一行是{{INHERIT:claude}}这个指令会让解析器先把 claude.md 的全部内容读进来、拼在本文件其余内容之前。claude.md是模型无关的通用基线包含三条纪律Todo-list discipline待办清单纪律多步计划中每完成一个任务就单独标记完成不要批量在末尾一次性打勾若某任务发现无需执行标记为 skipped 并附一行原因。Think before heavy actions重操作前先想面对复杂操作重构、迁移、非平凡新功能执行前先用简短的话说明你的方案让用户能在中途而非飞行途中低成本纠偏。Dedicated tools over Bash优先专用工具优先用 Read / Edit / Write / Glob / Grep 而非 shell 等价物cat / sed / find / grep因为专用工具更便宜、更清晰。这正是 CHANGELOG 里记录的拆分思路claude.md被精简为模型无关的基线而各具体版本如 opus-4-7、fable-5则各自继承它、再追加自己版本的专属校准。fable-5 因此同时拥有通用基线 Fable 专属规则两层内容。三、四条 Fable 专属行为校准继承基线之后fable-5.md 追加了四条针对 Fable 5 模型族爱过度规划倾向的校准。每一条都是可独立引用的行为契约。1. Act when you have enough to act有足够信息就行动原文直指 Fable 5 的核心弱点——“Fable 5 can over-plan on ambiguous tasks.”Fable 5 在模糊任务上容易过度规划。校准规则是一旦信息足够行动就直接行动不要重新推导会话中已经确立的事实不要重新争论用户已经做出的决定不要在对用户可见的消息里罗列你并不会去走的选项给的是一个推荐而不是一份穷举式调研明确限定这条规则不适用于 thinking blocks思考块——思考块内部仍可以自由展开。这条的意图是让 Fable 5 的对外表达收敛到一个可执行推荐上而不是把用户的注意力淹没在备选方案里。2. Ground progress claims in evidence用证据支撑进度声明在报告任何进度之前必须先对每一条声明与本会话内的某次工具结果做核对只报告你能指得出来的工作若某事尚未验证就明说若测试失败就带着输出一并报出来若某步骤被跳过就说被跳过了若某事确实完成并经过验证就干脆利落地陈述不要含糊其辞without hedging。这条把自报进度从主观叙述拉回到可追溯到工具结果的客观层面直接压制大模型常见的虚报完成度问题。3. Assessment vs action评估与行动的边界这条区分了两类对话场景防止该问的时候动手或该停的时候不停当用户在描述问题、提问或自言自语而不是请求改动时交付物就是你的评估报告发现然后停下。在他们开口要之前不要替他去打补丁在执行任何改变状态的命令重启、删除、改配置之前先确认证据支持的是这一下具体动作而不是泛泛支持做点什么。它本质上是一道安全闸门把理解/诊断与落地修改分开避免模型越界执行用户尚未授权的操作。4. Delegate independent work并行委托独立工作当任务天然扇出fan out为若干相互独立的子项时应把子项委托给 sub-agent子代理并在它们运行的同时继续干自己的活而不是串行逐个处理若某个 sub-agent 跑偏或缺少上下文就介入纠正。这条与 gstack 整体的并行化理念一致——CHANGELOG 里对 opus-4-7 也曾加过类似Fan out explicitly的并行校准说明 gstack 一贯鼓励能并行的绝不串行。四、解析机制readOverlay如何拼接继承链覆盖层的核心解析逻辑在 scripts/resolvers/model-overlay.ts 的readOverlay(model, seen)中。其工作方式从源码结构看目录定位OVERLAY_DIR指向仓库内的 model-overlays/读取model-overlays/{model}.md环检测用seen: Setstring记录已访问的模型名if (seen.has(model)) return 防止A → B → A的死循环INHERIT 匹配用正则/^\s*\{\{INHERIT:([a-z0-9-](?:\.[0-9])*)\}\}\s*\n/去匹配第一个非空白行。若匹配成功取match[1]作为基线模型名递归读取基线再把基线内容 \n\n 本文件其余内容拼接返回文件缺失if (!fs.existsSync(filePath)) return 优雅降级为空串而不是报错。以 fable-5 为例解析流程是读fable-5.md→ 命中{{INHERIT:claude}}→ 递归读claude.md无 INHERIT直接返回其 3 条基线→ 拼接成claude 基线 fable-5 四条专属的完整文本。文件里的{{INHERIT:...}}指令本身在拼接后被raw.replace(INHERIT_RE, )去掉不会泄漏到最终输出。五、组装与降级generateModelOverlay的从属包装readOverlay只负责读文件 拼继承。真正把内容包成行为补丁段落的是同文件里的generateModelOverlay(ctx)若ctx.model为空直接返回空串无模型即无覆盖层为每个模型生成一个统一标题## Model-Specific Behavioral Patch ({model})标题下紧跟一段从属声明。对非 Sol 模型fable-5 属于此类声明为The following nudges are tuned for the {model} model family. They aresubordinateto skill workflow, STOP points, AskUserQuestion gates, plan-mode safety, and /ship review gates. If a nudge below conflicts with skill instructions, the skill wins. Treat these as preferences, not rules.这段从属语言被解析器固定注入与文件内容无关——也就是说无论覆盖层里写了什么它永远被标注为低于技能指令的偏好。这正是测试断言expect(out).toContain(subordinate)想锁住的行为契约。在更上层的组装中preamble.ts 的generatePreamble(ctx)把generateModelOverlay(ctx)作为预序preamble的一个段落注入。源码里有一段关键注释说明了顺序generateAskUserFormat(ctx)会先于模型覆盖层渲染让节奏规则pacing成为环境默认覆盖层的行为校准则以从属补丁的形式落在其后。注释还提到若颠倒这个顺序会让 plan-review 的节奏出现回归v1.6.4.0 的 bug。六、模型路由如何激活 fable-5 覆盖层覆盖层不是永远生效的它由运行时的模型参数决定。模型族名单定义在 scripts/models.ts 的ALL_MODEL_NAMES中其中就包含fable-5。resolveModel(input)的解析优先级是精确匹配输入完全等于ALL_MODEL_NAMES中的某项直接返回这是选中gpt-5.6-sol的唯一路径族启发式针对常见变体的正则匹配。对 Fable 而言是if (/^claude-fable-5(-|$)/.test(s)) return fable-5;也就是说用户传入claude-fable-5或claude-fable-5-xxx这类后缀都会被归一到fable-5族从而读取 fable-5.md。未知输入返回null由调用方决定是报错还是回退。因此激活方式是在生成/运行技能时显式传--model claude-fable-5解析到fable-5族。CHANGELOG 对同类覆盖层的用法描述是Run bun run gen:skill-docs --model gpt-5.4 and every generated skill picks up GPT-tuned behavioral patches.——fable-5 同理--model claude-fable-5会让每个被生成的技能都带上 Fable 调优的行为补丁。模块头注释也特别强调host ≠ model宿主 ≠ 模型Claude Code 可以跑任何 Claude 模型生成器不会从宿主自动推断模型需要用户显式传--model。七、测试如何守护这份配置fable-5.md 的行为契约由 test/model-overlay-fable-5.test.ts 用门控级断言锁定。文件头注释概括了 fable-5 继承 claude 基线并追加的 Fable 族校准act when you have enough context避免过度规划、ground progress claims in tool results、assessment-vs-action boundaries、delegate independent work。其五个测试分别是原始文件包含行动校准fable-5.md原文必须含Act when you have enough to act继承 claude 基线generateModelOverlay(ctx(fable-5))的输出必须同时包含Todo-list discipline来自 claude 基线与subordinate来自从属包装携带 Fable 专属校准输出必须含Act when you have enough to act与Ground progress claims in evidence无未解析的 INHERIT 指令输出不得再出现{{INHERIT:保证继承链被完全展开基线不反向污染generateModelOverlay(ctx(claude))纯基线不应含 Fable 的Act when you have enough to act——确保 Fable 校准只作用于 fable-5不泄漏回通用基线。这几条断言共同构成了一张行为守护网继承关系、从属声明、专属校准、指令展开、基线隔离任何一条被破坏测试就会失败从而防止 fable-5.md 被误改时悄悄漂移。八、设计原则小结偏好而非规则fable-5.md这份覆盖层的精妙之处在于它用极小的篇幅一个继承指令 四条校准解决了一个很实际的问题同一套 gstack 技能在 Fable 5 模型上会想太多——过度规划、虚报进度、评估与行动不分、把本可并行的活串行做。它的解法不是改代码而是用{{INHERIT:claude}}复用通用工程纪律避免重复用四条针对性校准把 Fable 5 的行为偏差逐一拉回轨道用解析器固定注入的从属声明保证这些校准永远低于技能工作流——冲突时技能赢用测试把继承、从属、隔离三条契约全部锁死。对使用者的直接启示是当你想让 gstack 在某个特定模型下表现得更利落、更守证据、更不越界时你不需要碰 TypeScript只需理解 model-overlays/ 下对应模型的 Markdown 文件——而fable-5恰好是这套机制继承 专属校准 从属声明 测试守护四个环节都完整可查的一个样本。【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考