ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零搭建 Harness Engineering 框架:Rule、Skill、Sub-Agent 工程落地完整路径与 TaoToken 统一接入

从零搭建 Harness Engineering 框架:Rule、Skill、Sub-Agent 工程落地完整路径与 TaoToken 统一接入 1. 从一次真实的翻车说起为什么单靠 Prompt 撑不住工程我试过在一个 Go 小项目里只靠一份长 Prompt 让 AI 端到端干活前两天很爽第三天开始崩。表现很典型它说“已完成”但go build ./...直接报错它说“测试通过”结果go test -race里躺着一个数据竞争它说“按规范改了”可golangci-lint run冒出一堆新警告。最要命的是同一个低级错误在三个不同会话里重复出现因为它对上一次的失败没有任何持久记忆。这就是 Harness Engineering 要解决的问题。它不是某个工具也不是某个 Prompt 技巧而是一整套工程系统让 AI 在真实项目里稳定、可靠、可预测地产出正确结果。核心模块就四个Rule 定义边界Skill 固化流程Sub-Agent 拆分角色Workflow 编排协作。而要让这四个模块真正跑起来你还需要一条统一的模型调用通道——否则每个 Agent、每个 Skill 都要单独配 Key、单独处理报错工程复杂度会瞬间失控。这篇内容面向需要为 AI 工具链建立统一配置与调用通道的开发者。我会用一个最小化的 Go 项目作为贯穿例子交付可复制的settings.json/config.toml骨架、CC Switch 与 Cline 的接入配置以及逐项验证动作。你跟着做就能完成从规则定义到子代理编排的完整闭环。适合谁正在把 AI 从“聊天助手”升级成“工程执行系统”的个人开发者和小团队。2. 前置准备用 TaoToken 统一模型调用通道在搭 Harness 之前先把模型调用这层地基铺平。原因很简单Rule、Skill、Sub-Agent、Workflow 四层里每一层都可能调用不同模型——PM 用轻量模型做路由需求分析和 Code Review 用重型模型做深度推理。如果每个角色都单独配一套 Key 和端点你的配置文件会变成一团乱麻排障时根本不知道是哪条链路出的问题。TaoToken 在这里扮演的角色就是统一接入层。它提供兼容主流协议的统一 API 端点你只需要维护一份 Key就能让 CC Switch、Cline、以及你自己写的脚本走同一条通道。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。具体操作分三步。第一步打开控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。第二步如果你要长期跑编码和 Agent 任务建议看一下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它针对长链路、多轮次的编码场景做了额度优化。第三步把 Key 存进环境变量不要硬编码进任何配置文件export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api这里有个我踩过的坑很多人把 Key 直接写进settings.json然后提交到 git结果 Key 泄露。正确做法是配置文件里只写环境变量引用真正的值放在本地 shell 或 CI 的 secret 里。后面所有配置骨架都遵循这个原则。3. 可复制配置settings.json 与 config.toml 骨架3.1 Rule 与 Skill 的目录结构先把目录搭出来这是整个 Harness 的物理骨架。Rule 和 Skill 都是文件不是散落在 Prompt 里的句子harness/ ├── rules/ │ ├── 00-core.md # 硬边界编译、测试、校验三步不可跳过 │ ├── 10-naming.md # 命名与导出 API 规约 │ └── 20-security.md # 禁止硬编码密钥、禁止 os.Exit 绕过 ├── skills/ │ ├── compile-skill.md # 编译标准流程 │ ├── test-skill.md # 测试标准流程 │ └── validation-skill.md # 后置校验标准流程 ├── agents/ │ ├── pm.contract.md │ ├── analyst.contract.md │ ├── architect.contract.md │ ├── gatekeeper.contract.md │ ├── developer.contract.md │ ├── reviewer.contract.md │ └── qa.contract.md ├── workflow/ │ └── dev-pipeline.toml # 阶段、转移、回滚定义 └── scripts/ └── master-gate.sh # 主校验脚本Rule 是软约束写清楚“什么绝对不能违反”Skill 是标准操作流程写清楚“具体怎么做”。两者分开Rule 才能保持精简不会因为塞满命令细节而膨胀到 AI 记不住。3.2 settings.json 骨架CC Switch 接入CC Switch 用来在多个模型配置之间快速切换。下面这份settings.json把 TaoToken 作为统一端点并给不同角色分配不同模型{ providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, models: { router: claude-haiku, reasoning: claude-sonnet, heavy: claude-opus } } }, profiles: { pm: { provider: taotoken, model: router }, analyst: { provider: taotoken, model: heavy }, architect: { provider: taotoken, model: heavy }, developer: { provider: taotoken, model: reasoning }, reviewer: { provider: taotoken, model: heavy }, qa: { provider: taotoken, model: heavy } }, harness: { rulesDir: ./harness/rules, skillsDir: ./harness/skills, workflowFile: ./harness/workflow/dev-pipeline.toml } }关键点apiKeyEnv指向环境变量而不是明文 Keyprofiles把七个 Agent 映射到不同模型档位PM 用轻量模型做路由分析和评审用重型模型做深度推理。这样既控制成本又保证高价值推理步骤拿到匹配的算力。3.3 config.toml 骨架Cline 接入Cline 是编辑器里的编码 Agent它需要读同一套 Rule 和 Skill。用config.toml把 Cline 接到同一条通道[cline] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model claude-sonnet [cline.harness] rules [./harness/rules/00-core.md, ./harness/rules/10-naming.md] skills [./harness/skills/compile-skill.md, ./harness/skills/test-skill.md] workflow ./harness/workflow/dev-pipeline.toml [cline.validation] master_script ./harness/scripts/master-gate.sh fail_on_new_warning true baseline_file ./harness/.baseline-report.jsonfail_on_new_warning true配合baseline_file是基线对比机制改动前先跑一遍校验存基线改动后再跑一遍做 diff任何新增失败或警告都必须修复。这样 AI 就没法用“这个错本来就有”来甩锅。3.4 Workflow 定义文件Workflow 不是“启动几个 Agent”而是显式定义阶段、转移和回滚条件[workflow] name dev-pipeline entry requirement [[stages]] id requirement agent analyst produces spec.md next design [[stages]] id design agent architect produces design.md next gate [[stages]] id gate agent gatekeeper produces gate-report.md next implement on_reject design [[stages]] id implement agent developer produces dev-log.md next review [[stages]] id review agent reviewer produces review-report.md next qa on_reject implement [[stages]] id qa agent qa produces qa-report.md next done on_reject implementon_reject定义了回滚路径。下游 Agent 不允许直接修改上游产物如果发现上游有问题必须正式提出 blocker由 PM 按on_reject路由回上游修正。这条规则强制起来之后每份产物都有唯一、可追溯的归属者。4. 验证请求逐项确认配置真的生效配置写完不算完必须逐项验证。下面这套动作按顺序做每一步都有明确的成功标志。4.1 验证 API 通道连通先用一条最小请求确认 TaoToken 通道可用curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H content-type: application/json \ -d { model: claude-sonnet, max_tokens: 64, messages: [{role: user, content: 回复 OK 两个字母}] }成功标志返回 JSON 里content字段包含OK。如果返回 401检查TAOTOKEN_API_KEY是否导出成功如果返回 404检查 base URL 是否写成了https://taotoken.net/api而不是带路径的变体。4.2 验证 Rule 被正确加载让 Cline 读一条 Rule 并复述确认它能访问到文件cline --config ./config.toml --prompt 读取 harness/rules/00-core.md复述其中关于编译、测试、校验的三步要求成功标志输出里明确提到“编译成功后才允许跑测试测试通过后才允许跑后置校验三步全过才算完成”。如果它答非所问说明rules路径没配对。4.3 验证 Skill 可执行触发一次编译 Skill看它是否按标准流程走cline --config ./config.toml --prompt 执行 compile-skill编译当前项目成功标志它先跑go mod tidy检查依赖同步再跑go build -v ./...最后把结构化输出写到日志文件。如果它直接一句go build ./...了事说明 Skill 没被正确引用。4.4 验证主校验脚本这是最关键的一步。先跑基线再改一行代码再跑一次做对比# 存基线 ./harness/scripts/master-gate.sh --baseline harness/.baseline-report.json # 故意引入一个警告 echo package main import fmt func main() { fmt.Println(debug) } /tmp/probe.go # 再跑校验 ./harness/scripts/master-gate.sh --compare harness/.baseline-report.json成功标志脚本检测到新增的fmt.Println违规并返回非零退出码。如果它放行了说明静态检查规则没覆盖到这一项。4.5 验证 Workflow 回滚模拟一次 Gatekeeper 驳回确认工作流能正确回滚到设计阶段cline --config ./config.toml --prompt 以 gatekeeper 角色审查当前 design.md如果发现验收标准缺失就提出 blocker成功标志PM 收到 blocker 后按on_reject design把任务路由回架构师并在时间线里记录这次回滚。如果它直接让开发者继续说明 Workflow 定义没生效。5. 本篇常见错排查5.1 报错401 Unauthorized最常见的原因是环境变量没导出到当前 shell 会话。export只在当前终端有效新开一个窗口就没了。解决办法是写进~/.bashrc或~/.zshrc或者用direnv做项目级环境管理。另一个原因是 Key 前后带了空格或换行用echo -n $TAOTOKEN_API_KEY | wc -c确认长度。5.2 报错Rule 被忽略AI 选择性执行这是 Rule 作为软约束的固有缺陷。规则集越大、任务越复杂模型越容易遗忘或绕过。解决办法不是加更多 Rule而是把可验证的约束移到 Script 里。比如“禁止fmt.Println”这条 Rule与其反复强调不如在master-gate.sh里加一条grep -rn fmt.Println --include*.go检查命中就返回非零退出码。脚本说不过就是不过。5.3 报错下游 Agent 擅自修改上游产物典型场景是架构师读需求文档时发现不严谨没提 blocker而是悄悄把需求改成符合自己理解的样子。这会让需求归属权模糊出问题无法追溯。解决办法是在角色契约里写死下游 Agent 只读上游产物发现问题必须正式提出 blocker由 PM 按 Workflow 的on_reject路由回上游修正。5.4 报错PM 越界做技术判断PM 坐在中心位置看到一切很容易从流程管理者漂移成意见提供者。它会说“这个需求应该调整一下”“这个设计改 X 更好”。但 PM 的技术判断往往不专业反而把流程带偏。解决办法是严格收缩 PM 边界只管理工作流状态不做任何专业判断Agent 卡住时路由到正确的专门 Agent真有歧义就暂停等人类决策。5.5 报错基线对比误报如果基线文件是在代码已经有问题的情况下生成的后续对比就会把历史问题当成“已存在”而放行。解决办法是每次合并到主分支前重新生成基线并确保基线生成时master-gate.sh返回零退出码。如果基线生成时就有失败先修复再存基线。5.6 报错Cline 读不到 Skill 文件检查config.toml里的skills路径是相对路径还是绝对路径。Cline 的工作目录可能和你的项目根目录不一致建议统一用相对于项目根的路径并在启动 Cline 时确保工作目录正确。如果还是读不到用cline --config ./config.toml --prompt 列出你能访问的所有文件做一次诊断。6. 把闭环跑起来从规则定义到子代理编排到这里四个核心模块已经全部落地。Rule 定义边界Skill 固化流程Sub-Agent 拆分角色Workflow 编排协作Script 做客观裁判。而 TaoToken 作为统一接入层让这四层共享同一条模型调用通道你只需要维护一份 Key 和一套配置。接下来你要做的是让这套系统真正跑起来。建议按这个顺序推进先打磨一份扎实的 SPEC别急着写 Rule 或拆 Agent然后只加关键的 Rule聚焦在 AI 经常翻车的底线上接着把高频固定动作沉淀成 Skill等单 Agent 失稳时再拆 Multi-Agent复杂度上来后加 Workflow 定义和角色契约最后把可验证的约束全部移到 Script 里。如果你在接入过程中遇到模型调用问题可以先去 API Keys 页面确认 Key 状态地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 再对照接入文档逐项检查配置文档地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型对话是否正常可以直接用模型对话页面测试地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。如果你要长期跑编码和 Agent 任务Coding Plan 针对长链路场景做了额度优化地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。最后留一句我自己的经验Harness Engineering 不是关于信任 AI而是关于设计出让偷懒无处可藏的机制。当“完成”从“我觉得我做完了”变成“脚本通过了所以我完成了”你的系统才真正从任务推送器变成结果验证器。
返回列表