get-shit-done 模型解析单一事实源改造:Model Catalog 模块如何终结 resolve-model 的 SDK/CLI 模型漂移(3229)

发布时间:2026/9/8 23:23:34

get-shit-done 模型解析单一事实源改造:Model Catalog 模块如何终结 resolve-model 的 SDK/CLI 模型漂移(3229)
get-shit-done 模型解析单一事实源改造Model Catalog 模块如何终结 resolve-model 的 SDK/CLI 模型漂移#3229【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done本篇技术指南聚焦 get-shit-done 项目面向 Claude Code 的轻量 meta-prompting、上下文工程与规范驱动开发系统中的一次关键架构修复把模型选择数据收敛进一个共享的 Model Catalog 模块从根上修复resolve-model在 SDK 与 CLI/CJS 两侧的注册表漂移issue #3229。读者读完将掌握漂移 bug 的症状与根因、sdk/shared/model-catalog.json的数据结构与配置字段语义、共享模块被双端消费的实现方式以及resolve-model面向未知 agent 的配置档语义化回退策略与对应的回归测试。背景resolve-model 为什么会在 SDK 与 CLI 之间各说各话get-shit-done 的模型解析链路存在两条入口一条是面向现代 AI 编程工具Claude Code、Codex 等的 SDKTypeScript 实现位于 sdk/另一条是兼容 CommonJS 环境的 CLI 包位于 get-shit-done/bin/。resolve-model是这条链路上被调用最频繁的查询之一——它根据当前工作区配置的model_profilequality / balanced / budget / adaptive / inherit把某个具体 agent例如gsd-planner、gsd-code-reviewer解析成最终要调用的模型标识符。在变更前SDK 侧维护了一份独立的 agent→模型映射而 CLI/CJS 侧又有自己的解析逻辑。当仓库中的 agent 数量持续增长时两侧的注册表就不可避免开始漂移。症状合法 agent 被当成未知 agent修复前issue #3229 所描述的一类问题表现为SDK 侧只认识 18 个 agent而磁盘上实际已经随发行版提供了 33 个 agent。当工作流尝试解析第二梯队的合法 agent如gsd-code-reviewer、gsd-security-auditor时SDK 的resolve-model因为查不到记录会静默返回{ unknown_agent: true, model: sonnet }这类返回的两层危害在于语义失真agent 明明合法对应文件真实存在于 agents/却被标记为unknown_agent: true调用方可能据此走未知 agent降级或告警路径模型错配回退到写死的sonnet完全无视当前model_profile的语义。若用户处于budget预算档期望的是 haiku 级别的廉价模型却拿到了 sonnet若处于quality档又拿不到 opus。这一修复的 changeset 记录在 .changeset/fix-3229-model-catalog-source-of-truth.mdPR #3230其核心理念一句话即可概括模型选择数据只允许存在一份其余都是消费方。单一事实源sdk/shared/model-catalog.json的数据结构修复的第一步是把所有模型选择数据收敛到一个 JSON 文件sdk/shared/model-catalog.json。它现在拥有整个决策所需的五类数据顶层结构一览顶层键作用取值样例profiles合法配置档集合[quality,balanced,budget,adaptive,inherit]phaseTypesagent 所属的工序阶段类型[planning,discuss,research,execution,verification,completion]adaptiveTierMap自适应档下路由层级→模型别名换算heavy→opus、standard→sonnet、light→haikuruntimeTierDefaults各运行时在 opus/sonnet/haiku 三档下的默认模型claude.sonnet.model claude-sonnet-4-6agents完整 33-agent 注册表见下文agents 注册表每条 agent 的五元组元数据agents下每个 key 都是一个真实存在的 gsd-* agent对应 agents/ 中的同名.md文件。以gsd-code-reviewer为例gsd-code-reviewer: { golden: opus, balanced: sonnet, budget: sonnet, phaseType: verification, routingTier: standard }字段语义如下golden/balanced/budget分别对应 quality、balanced、budget 三档配置档下该 agent 应该使用的模型别名opus/sonnet/haikuphaseTypeagent 归属的工序阶段供按阶段统一覆盖模型时使用例如verification阶段统一调整routingTierlight/standard/heavy用于adaptive自适应档的派生计算——adaptive 档不写死模型而是读取该映射经adaptiveTierMap换算成模型别名。注册表中前 18 个条目为gsd-planner、gsd-roadmapper、gsd-executor、gsd-phase-researcher、gsd-project-researcher、gsd-research-synthesizer、gsd-debugger、gsd-codebase-mapper、gsd-verifier、gsd-plan-checker、gsd-integration-checker、gsd-nyquist-auditor、gsd-pattern-mapper、gsd-ui-researcher、gsd-ui-checker、gsd-ui-auditor、gsd-doc-writer、gsd-doc-verifier随后以空行分隔追加了gsd-advisor-researcher、gsd-ai-researcher、gsd-assumptions-analyzer、gsd-code-fixer、gsd-code-reviewer、gsd-debug-session-manager、gsd-doc-classifier、gsd-doc-synthesizer、gsd-domain-researcher、gsd-eval-auditor、gsd-eval-planner、gsd-framework-selector、gsd-intel-updater、gsd-security-auditor、gsd-user-profiler共 15 个扩展 agent。两组合计恰好 33 个与 issue #3229 中磁盘上有 33 个 agent的事实对齐——此前 SDK 恰好只内置了前一组 18 个后一组 15 个全部落入查无此 agent黑洞。runtimeTierDefaults全运行时三档模型映射针对每个受支持运行时runtimeTierDefaults给出opus/sonnet/haiku三档对应的默认模型。当前文件中配置了 15 个运行时其中 7 个 Group A 运行时带有内建默认模型运行时opus 档sonnet 档haiku 档备注claudeclaude-opus-4-7claude-sonnet-4-6claude-haiku-4-5—codexgpt-5.4reasoning_effort: xhighgpt-5.3-codexmediumgpt-5.4-minimedium附带reasoning_effortgeminigemini-3-progemini-3-flashgemini-2.5-flash-lite—qwenqwen3-max-2026-01-23qwen3-coder-plusqwen3-coder-next—opencodeanthropic/claude-opus-4-7anthropic/claude-sonnet-4-6anthropic/claude-haiku-4-5带 provider 前缀copilotclaude-opus-4-7claude-sonnet-4-6claude-haiku-4-5—hermesanthropic/claude-opus-4-7anthropic/claude-sonnet-4-6anthropic/claude-haiku-4-5带 provider 前缀其余 Group B 运行时kilo、cline、cursor、windsurf、augment、trae、codebuddy、antigravity三档值均为null即没有内建默认——resolve 时应依赖用户侧显式覆盖或 profile 覆盖而不应静默捏造模型名。这一显式留空的设计尤其重要它可以被 SDK 与 CLI 双向用于校验运行时若在KNOWN_RUNTIMES中但查不到档位默认就能明确判定该运行时需要外部配置。双端共享同一份 JSON 如何同时驱动 SDK 与 CLI/CJS单一数据源能否成立取决于两端是否真的从同一份文件加载。源码中能看到两套独立的加载器但指向的都是同一份数据。SDK 端sdk/src/model-catalog.tsSDK 加载器在模块加载期用readFileSync读取../shared/model-catalog.json即仓库根下的sdk/shared/model-catalog.json并一次性派生出全部派生表MODEL_PROFILES把每条 agent 的golden/balanced/budget/routingTier展开成{ quality, balanced, budget, adaptive }四档别名映射其中adaptive由routingTier经adaptiveTierMap换算而来AGENT_TO_PHASE_TYPEagent → phaseType 映射AGENT_DEFAULT_TIERSagent → 默认 routing tier 映射getAgentToModelMapForProfile(profile)给定配置档产出全量 agent→模型别名的映射inherit档透传inherit未知档回退balancedresolveRuntimeTierDefault(runtime, alias)查询某运行时某档位的默认模型条目runtimesWithReasoningEffort()检测哪些运行时带reasoning_effort当前实现下即codex。也就是说SDK 侧对 agent 集合的认知不再是硬编码数组而是对目录 JSON 的一次Object.keys推导——新增 agent 只要落进 JSONSDK 与 CLI 就同时可见彻底消除了两边各维护一份清单的漂移土壤。CLI/CJS 端get-shit-done/bin/lib/model-catalog.cjsCommonJS 侧没有import.meta.url且要同时适配源码仓库开发态与安装后的运行态两种布局因此 model-catalog.cjs 采用了一个优先级候选路径解析策略同目录安装态install/bin/shared/model-catalog.json——这是bin/install.js在安装期写入的规范化位置issue #3288 修复各运行时Claude Code、Codex、OpenCode 等安装后都从这里加载源码仓库开发态从bin/lib/向上三级找到sdk/shared/model-catalog.json支持直接在仓库克隆目录内运行环境变量覆盖GSD_MODEL_CATALOG指向任意自定义目录文件供测试夹具与特殊部署使用。与 SDK 端一一对应CJS 侧导出MODEL_PROFILES、AGENT_TO_PHASE_TYPE、AGENT_DEFAULT_TIERS、MODEL_ALIAS_MAP、RUNTIME_PROFILE_MAP、KNOWN_RUNTIMES、RUNTIMES_WITH_REASONING_EFFORT、nextTier、formatAgentToModelMapAsTable、getAgentToModelMapForProfile等符号。值得注意的错误处理细节加载失败时它只把MODULE_NOT_FOUND/ENOENT视为可换下一个候选路径重试的缺失类错误其余解析错误、权限错误会直接抛出而非被吞掉若全部候选都失败则抛出列出所有已尝试路径的诊断信息。GSD_MODEL_CATALOG的存在也让安装路径回归测试可以低成本地在临时目录内模拟各种安装布局相关背景可进一步参考 ADR-0003model-catalog-module 与 ADR-0005SDK 架构接缝图。resolve-model 的解析顺序与配置档语义化未知回退有了单一数据源还要把resolve-model的行为做对——尤其是面对真正未知的 agent如拼写错误、未来新增但目录未更新时回退模型必须尊重配置档语义而不是硬编码。在 SDK 查询层 config-query.ts 中resolveModelhandler 的执行顺序是读取配置经由loadConfig加载当前工作区可附带 workstream配置profile config.model_profile缺省balanced小写化逐 agent 覆盖优先若config.model_overrides[agentType]存在则直接命中覆盖值——若该 agent 不在目录中会附加unknown_agent: true标记无配置文件项目尚无配置时返回空model与 CJS 行为保持 parity目录未命中则同样带unknown_agent: true查表命中在MODEL_PROFILES[agentType]中按agentModels[profile] || agentModels[balanced] || sonnet取别名目录未命中真正未知进入配置档语义化回退。其中第 5 步正是本次修复的另一半——未知 agent 回退从一律 sonnet改为按 profile 语义推导当前 profile回退模型别名语义qualityopus追求质量budgethaiku追求成本/速度balanced/adaptivesonnet均衡默认inheritinherit透传继承语义对应源码片段位于 config-query.ts#L261-L268。这样即使遇到目录外的 agentbudget档也不会再被错误地推向 sonnet 级别的开销。从别名到真实模型 id 的落盘拿到别名opus/sonnet/haiku之后还有最后一步换算若命中phaseType且配置中存在models[phaseType]字符串档位则以阶段档位覆盖 agent 别名随后调用运行时解析resolveRuntimeTier得到真实的模型 id——例如claude sonnet 档得到claude-sonnet-4-6若运行时条目带reasoning_effort如 codex 的xhigh/medium该字段也会一并透传到结果中见 config-query.ts#L274-L286。最后再根据resolve_model_ids的取值决定是否返回完整模型 id 或省略。这也意味着用户最终拿到的是运行时语义完整的模型字符串而非裸别名避免别名泄漏到下游消费方。回归测试与验证证据本次修复在 SDK 测试与仓库级测试两个层面都固化了断言sdk/src/query/config-query.test.ts#L125-L135明确以gsd-code-reviewer作为曾随发行提供但旧 SDK 缺失的代表断言resolve-model结果不再带unknown_agent属性直接对照 issue #3229 的症状sdk/src/query/config-query.test.ts#L138-L154对真正未知agent 断言返回unknown_agent: true并分别验证quality → opus、budget → haiku的语义化回退tests/bug-3288-model-catalog-install-path.test.cjs验证安装后 CJS 侧能从 co-located 的bin/shared/model-catalog.json读到同一份目录tests/model-catalog-runtime-defaults.test.cjs验证各运行时的三档默认模型与reasoning_effort存在性配套的配置覆盖链路tests/bug-3227-config-set-model-overrides.test.cjs与 inherit 配置档语义tests/bug-1829-inherit-model-profile.test.cjs也持续守护着这条解析链路的相邻行为。从本次修复可复用的工程经验把 issue #3229 的修复拆开看它其实给同类多入口代码库提供了三条可复用的准则凡是跨进程、跨语言入口都要共享的决策数据必须收敛为单一 JSON 事实源而不是在每侧各自维护一份看起来相同的常量或映射——两侧各自演进的清单迟早会以最隐晦的方式静默回退、未知标记暴露分歧留空优于捏造对尚无内建默认的运行时Group B 的 8 个运行时显式null宁可让上层判定为需要外部配置也不要悄悄填一个可能错配的模型名同理未知 agent 的兜底值也必须服从配置档语义让降级行为可预测修复必须以回归测试锚定具体症状gsd-code-reviewer不再返回unknown_agent: true、budget未知 agent 回退haiku——这类断言把抽象的数据一致翻译成了任何人可以运行的验收标准。如今只要向 sdk/shared/model-catalog.json 增补一条 agent 记录SDK 与 CLI/CJS 两侧的resolve-model都会在下一个加载周期自动感知同样地新增运行时或调整某运行时的默认模型也只需改动这一份文件。这正是 ADR-0003 所定义的 Model Catalog 模块希望长期维持的状态一份数据、双端消费、全程可测。【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

FastAPI 高级指南:在 OpenAPI 中声明附加响应(Additional Responses)的完整实战解析

FastAPI 高级指南:在 OpenAPI 中声明附加响应(Additional Responses)的完整实战解析

2026/9/8 23:23:34

FastAPI 高级指南:在 OpenAPI 中声明附加响应(Additional Responses)的完整实战解析 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/G…

MCP工具UI方案:直接返回HTML还是采用A2UI结构化描述协议?

MCP工具UI方案:直接返回HTML还是采用A2UI结构化描述协议?

2026/9/8 23:23:34

上个月我接了一个 MCP 工具&#xff0c;想着“这回用 AI 自动生成表单&#xff0c;总算能省掉自己写 UI 的功夫了”。结果工具返回了一段完整的 HTML&#xff0c;从<!doctype html>到</html>一应俱全。我把它贴到浏览器里&#xff0c;渲染效果确实漂亮&#xff1b;…

10 分钟调出复古半色调点阵:three.js DotScreenPass 实战指南

10 分钟调出复古半色调点阵:three.js DotScreenPass 实战指南

2026/9/8 23:23:34

10 分钟调出复古半色调点阵&#xff1a;three.js DotScreenPass 实战指南 【免费下载链接】three.js JavaScript 3D Library. 项目地址: https://gitcode.com/GitHub_Trending/th/three.js three.js 的 DotScreenPass 是一个半色调后处理通道&#xff1a;场景渲染完成后…

回测胜率90%和92%差两个百分点,策略真的更优吗?

回测胜率90%和92%差两个百分点,策略真的更优吗?

2026/9/9 0:03:36

前两天有位朋友拿两份回测报告来问我&#xff1a;同样是自动交易的机器人策略&#xff0c;策略A胜率90%&#xff0c;策略B胜率92%&#xff0c;是不是B更厉害&#xff1f;我说先别急着换&#xff0c;单看这两个百分点的差距&#xff0c;大概率说明不了问题。很多做实盘交易、做量…

拆解OpenAI Codex:Rust CLI与AI Agent工程的样板实践

拆解OpenAI Codex:Rust CLI与AI Agent工程的样板实践

2026/9/9 0:03:36

最近 GitHub 热榜上的 OpenAI Codex 讨论度很高&#xff0c;我特意翻了一圈评论区&#xff0c;发现点赞最多的不是“AI 编程体验有多惊艳”&#xff0c;而是满屏的安装报错截图&#xff0c;以及围绕 Rust 和 JavaScript 生态的无休止争论。作为一个把这仓库翻过几遍的人&#x…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座&#xff0c;你会发现一个有意思的现象&#xff1a;有的里面躺着一颗黑色的软封装芯片&#xff0c;丝印都看不清&#xff1b;有的则是一块小小的蓝色或绿色PCB&#xff0c;上面赫然印着STM8或者STC的字样。同样叫"定时插座"&#xff0c;…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述&#xff1a;为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活&#xff08;6&#xff09;——环路裕量测试”&#xff0c;这个标题一出来&#xff0c;老电源工程师可能已经下意识摸了摸示波器探头&#xff0c;新同事则大概率在想&…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介&#xff1a;面向毕业设计场景的PyQt5扩散模型图像恢复项目&#xff0c;提供完整Python源码与项目说明&#xff0c;适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分&#xff0c;具体涉…

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

2026/9/8 23:53:36

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”&#xff01;从“湿地面积”到“土壤碳密度”&#xff1a;为什么需要重新认识潮汐湿地蓝碳变化&#xff1f;潮汐湿地位于陆地与海洋的交汇地带&#xff0c;包括红树林、盐沼和潮滩&#xff0c;是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包&#xff0c;并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身&#xff1a;从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中&#xff0c;容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务&#xff0c;镜像体积通常被严格控制在 50MB 到 200MB 以内&#xff0c;拉取镜像只…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介&#xff1a;面向毕业设计场景的PyQt5扩散模型图像恢复项目&#xff0c;提供完整Python源码与项目说明&#xff0c;适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分&#xff0c;具体涉…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述&#xff1a;为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活&#xff08;6&#xff09;——环路裕量测试”&#xff0c;这个标题一出来&#xff0c;老电源工程师可能已经下意识摸了摸示波器探头&#xff0c;新同事则大概率在想&…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座&#xff0c;你会发现一个有意思的现象&#xff1a;有的里面躺着一颗黑色的软封装芯片&#xff0c;丝印都看不清&#xff1b;有的则是一块小小的蓝色或绿色PCB&#xff0c;上面赫然印着STM8或者STC的字样。同样叫"定时插座"&#xff0c;…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具&#xff0c;而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置&#xff1b;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…