1. 为什么 AI 写代码会「越写越烂」
用 AI 写代码的人大多经历过这个曲线:前 20 分钟它像个靠谱搭档,代码又快又对;聊到第 50 轮,它开始忘记你定过的命名规范,把之前删掉的字段又加回来,甚至跟你上一轮的决定自相矛盾。这不是模型变笨了,而是**上下文腐化(Context Corruption)**在起作用。
原理不复杂。模型的上下文窗口是有限的,对话越长,早期那些约束、共识、边界条件就被后面越来越多的新内容稀释。它在有限窗口里做相关性加权,窗口越满,信噪比越低,输出质量自然往下掉。你越聊越累,它越写越飘。
Vibe Coding 想做到「人工编程参与率百分之 0」,靠的不是让模型更聪明,而是把上下文当成工程问题来管。核心思路有两条:一是让每个干重活的 AI 都从干净上下文出发,二是把项目知识从聊天记录里搬出来,落到文件里。gsd-core 就是把这套思路产品化的规格驱动框架,它跑在 Claude Code 里,用.planning/目录承载全部状态,用子代理隔离上下文。
这篇要交付的东西很具体:一套可复制的 gsd-core 配置骨架、上下文文件的组织方式,以及一次从规格到可运行代码的完整验证动作。全程走 TaoToken 统一 Key/API 通道,你不需要在多个平台之间来回切。
适合谁看:已经会用 Claude Code 或类似 CLI 工具、想让 AI 独立跑完一个中小项目的开发者;被上下文腐化折磨过、想找系统解法的人;以及想搭一套「规格驱动」工作流但不知道文件该怎么摆的人。
2. TaoToken 前置:把 Key 和通道准备好
gsd-core 本身是 Claude Code 的技能包,它调用模型时走的是 Anthropic 兼容接口。如果你直接用官方通道,会遇到两个现实问题:一是账号和额度管理分散,二是多项目切换时 Key 不好统一。TaoToken 在这里的角色是统一 Key/API 通道——一个 Key 覆盖模型对话、编码代理、批量任务,gsd-core 的请求也走这条通道。
先把 Key 拿到。打开控制台创建 API Key:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite创建后复制那串sk-开头的 Key,先存到环境变量里,别硬编码进任何文件:
export TAOTOKEN_API_KEY="sk-你的key"接着确认接入地址。TaoToken 的 API 基址是:
https://taotoken.net/api注意这个地址不带任何查询参数,是干净的基址。Claude Code 和 gsd-core 需要的是 Anthropic 兼容端点,配置时把 base URL 指向它即可。如果你用的是 Claude Code 的 Anthropic 配置方式,可以在~/.claude/settings.json或项目级配置里指定:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key" } }这里有个容易踩的坑:ANTHROPIC_BASE_URL不要带尾部斜杠,也不要自己拼/v1,让客户端去处理路径拼接。多拼一层会导致 404,报错信息还很不直观。
Key 和通道准备好之后,装 gsd-core:
npx @opengsd/gsd-core@latest装完在 Claude Code 里输入/gsd-help,能看到命令列表就说明技能包加载成功。如果看不到,先检查 Claude Code 版本,再确认 npx 拉取的是最新版——gsd-core 迭代很快,旧版本命令名可能对不上。
提示:把
TAOTOKEN_API_KEY写进 shell 的 rc 文件(如~/.zshrc)可以省去每次重设,但别提交到 Git。项目里用.env加.gitignore更稳妥。
3. 可复制的 gsd-core 配置骨架
配置的核心不是命令有多少,而是上下文文件怎么组织。gsd-core 把所有状态放在.planning/目录,这个目录就是 AI 的「外部记忆」。先看骨架:
.planning/ ├── PROJECT.md # 项目愿景:做什么、给谁用、边界在哪 ├── REQUIREMENTS.md # 需求清单,带编号,可追溯 ├── ROADMAP.md # 路线图,拆成多个阶段 ├── STATE.md # 状态记忆:进度、决定、待办 ├── config.json # 工作模式配置 ├── todos/ # 随手记的想法和待办 ├── phases/ # 各阶段的计划与执行记录 │ └── 01-xxx/ │ ├── 01-01-PLAN.md │ └── CONTEXT.md └── codebase/ # 旧项目接入时的代码地图这套结构的价值在于:任何时刻中断,状态都不丢。你不需要靠聊天记录续命,回来跑一句/gsd-progress,它读STATE.md就知道该从哪继续。
config.json是工作模式配置,建议显式写清楚,避免默认行为不符合预期:
{ "workflow": { "autoCommit": true, "verifyBeforeShip": true, "contextIsolation": "strict" }, "planning": { "phaseGranularity": "medium", "requireAcceptanceCriteria": true } }contextIsolation: strict是关键项,它保证每个执行子代理拿到的是全新上下文,只装当前任务需要的东西。requireAcceptanceCriteria: true强制每个任务都带验收标准,这是「规格驱动」落地的地方——没有验收标准的任务不允许进入执行阶段。
初始化项目用:
/gsd-new-project它会追着你提问,把「我要做个 X」问清楚:做什么、给谁用、哪些先不做。回答完,PROJECT.md、REQUIREMENTS.md、ROADMAP.md、STATE.md会自动生成。这一步别偷懒,问题答得越具体,后面 AI 跑偏的概率越低。
如果是已有代码库,先走接入流程:
/gsd-onboard /gsd-map-codebase/gsd-map-codebase会派子代理并行读你的代码,把技术栈、目录结构、代码规范、测试习惯、风险点全记进.planning/codebase/。之后生成的每个计划都基于你项目的真实情况,不用你一遍遍解释「我们错误处理用 Result 不用异常」这种约定。
4. 从规格到可运行代码:一次完整验证
配置摆好了,现在跑一次真实循环,验证整条链路通不通。阶段循环是六步:讨论 →(界面设计)→ 规划 → 执行 → 验收 → 发布。我们用一个最小可运行项目来验证:一个带健康检查接口的 HTTP 服务。
第一步,讨论。规划前先聊清楚技术路线:
/gsd-discuss-phase 1Claude 会针对阶段 1 的关键决策提问:用什么语言、错误怎么处理、配置放哪。你的回答写进CONTEXT.md,后续规划和执行都照着来。如果这个阶段你已经想得很清楚,加--auto让它自动选推荐答案。
第二步,规划。把阶段拆成带验收标准的任务:
/gsd-plan-phase 1gsd-core 会派子代理并行做技术调研,生成phases/01-xxx/01-01-PLAN.md。打开看一眼,每个任务应该都有明确的验收标准,比如「GET /health 返回 200 且 body 为{"status":"ok"}」。没有验收标准的计划,说明config.json没生效,回去检查。
第三步,执行。按计划写代码:
/gsd-execute-phase 1每个执行子代理拿全新上下文,按计划逐条实现,每完成一部分自动提交一次。执行完它会校验阶段目标是否达成。这一步是「人工参与率 0」的关键——你不需要盯着它写,它自己按计划推进。
第四步,验收。问答式验收,按标准一条条过:
/gsd-verify-work 1它会针对每条验收标准提问或自动检查,过了才算完成。不是「看着能跑」,而是逐条对照。
第五步,发布。
/gsd-ship 1验收通过后提 PR。到这里,一个阶段从规格到可运行代码的闭环就走完了。
验证成功的标志:.planning/phases/01-xxx/下有完整的 PLAN 和执行记录,STATE.md更新了进度,Git 历史里能看到自动提交,/health接口实际可访问。如果接口跑不起来,先看执行记录里的报错,再对照CONTEXT.md里的技术决策,通常是某个决策没被正确传递。
5. 本篇常见错排查
报 404 或模型不可用。九成是 base URL 拼错了。ANTHROPIC_BASE_URL只填https://taotoken.net/api,不要加/v1,不要加尾部斜杠。改完重启 Claude Code 让配置生效。
/gsd-help没反应。技能包没加载。确认npx @opengsd/gsd-core@latest跑完没报错,Claude Code 版本是否满足要求。gsd-core 更新频繁,旧版本命令名可能变了,以/gsd-help --full的输出为准。
执行阶段质量突然下滑。检查config.json里contextIsolation是不是被改成了非 strict。上下文隔离失效,子代理会继承主会话的历史,腐化就回来了。
计划里没有验收标准。requireAcceptanceCriteria没生效,或者config.json位置不对。它应该在.planning/根目录下。
老项目接入后 AI 还是不懂代码。/gsd-map-codebase可能没跑完或没生成codebase/目录。重新跑一次,确认.planning/codebase/下有内容。描述新需求时只说「我要加什么」,别把整个项目重讲一遍——代码地图里已经有了。
中断后不知道从哪继续。任何时候回来先跑/gsd-progress,它读STATE.md告诉你下一步。别凭记忆猜。
小任务走了完整循环,太慢。改错别字用/gsd-fast "改个错别字",小需求用/gsd-quick "给登录页加验证码"。完整阶段循环留给复杂任务,上下文腐化成为真实风险时才物有所值。
6. 把通道和框架接起来
gsd-core 解决的是上下文工程和规格驱动的问题,TaoToken 解决的是通道统一的问题,两者接起来才是一套能长期跑的 Vibe Coding 工作流。你现在手上应该有了:一个统一 Key、一套.planning/骨架、一次跑通的阶段循环。
接下来按你的场景选入口。如果你要长期跑编码代理、搭 Agent 工作流,建议直接上 Coding Plan,额度和并发更适合持续调用:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite如果你只是想先验证模型对话质量、对比不同模型在规格驱动任务上的表现,用模型对话页更轻:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite如果你在接入过程中遇到 Key 或端点问题,先看接入文档,大部分报错在里面都有对照:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite需要新建或轮换 Key,回控制台:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite如果你用的是 Claude Code 的 Anthropic 兼容模式,接入说明在这里:
https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite我自己的习惯是:新项目先跑/gsd-new-project把规格问清楚,再/gsd-plan-phase看计划里的验收标准够不够硬,标准不够就回去补CONTEXT.md,而不是急着执行。规格驱动框架的收益,全在「执行前把话说死」这一步。