开源一条 14 角色 AI 交付管线:从 3 个零依赖 Demo 讲起
先给结论:我把完整工程团队的角色分工(需求→设计→开发→测试→审查→上线)编成了一条可被 AI 驱动的交付管线,MIT 开源了。这篇不空谈理念,直接从 3 个可跑的命令讲起。
先跑起来:3 个命令,零依赖
不用装包、不用模型、不用 key:
bash
git clone https://github.com/zw-onemaker-ai/onemaker-pipeline
cd onemaker-pipeline
python3 examples/01_quality_gate/demo.py # ① 质量门禁
python3 examples/02_memory_guard/check.py memory --self-test # ② 记忆守卫
python3 examples/03_pipeline_walkthrough/run.py # ③ 管线漫游
Demo ① 质量门禁:拦住"假装完成"
真实输出(节选):
arduino
▌场景 1 · 闸门①:文件存在性
⛔ 拦截 Agent 声称产出 [main.py, config.json],实际只写了 1 个
磁盘上缺少或为空: ['config.json'] → 「已完成」不成立
✅ 放行 补齐 config.json 后
▌场景 2 · 闸门②:EXIT_CODE 指纹
⛔ 拦截 「测试全过」但没有任何退出码
未找到 EXIT_CODE 指纹 → 该验证视为未执行
✅ 放行 贴出 EXIT:0 指纹
▌场景 3 · 闸门③:文档脱敏
⛔ 拦截 客户文档混入内部术语
演示完成:7/7 个用例行为符合预期(拦截 4 次 · 放行 3 次)
这就是整套系统的最小内核:产出必须过闸门,不通过不路由 。完整协议在 pipeline/agent_core.md。
Demo ② 记忆守卫:防"记忆膨胀"
管线要跨会话跑,记忆必须"记得住"、但不能"无限涨"。三层记忆各有硬上限:
javascript
✅ L1 _index.json ≤ 4KB 454B
✅ active_project 未设置(空记忆库,正常)
▌自检:构造违规样例,验证守卫能拦截
✅ 已拦截 L1 超 4KB 被拦截
✅ 已拦截 L2 非法 JSON 被拦截
✅ 已拦截 幽灵 active_project 被拦截
超限自动裁剪,裁剪前先快照到 archive/------可从快照恢复。
Demo ③ 管线漫游:看一次完整交付
不带模型,用"虚拟运行"把调度引擎的行为走一遍:
less
R1 需求分析 → docs/requirements.md
上下文预算: 上游累计 2.1KB [CTX_NORMAL]
R4 后端开发 → backend/
R10 ◀ CTO 首轮: 5.8/10(< 6 不放过)
问题分类: 代码 Bug → 定向回环 R4,而不是回退到起点
R4 (回环修复) → 补齐错误处理 · Bash 验证 EXIT:0
R10 ▶ CTO 复审: 8.2/10 · 五维 [正确性 8 · 安全 7 · 维护 8 · 性能 7 · UX 9] ✅ 放行
🏁 R12 验收脚本: 4 / 4 PASS → merge to main → tag v1.0.0-mvp
角色交接、上下文预算档位、定向回环、五维评分------一次看全。
管线解剖
pipeline/
├── agent_core.md 核心规章:记忆 / 验证 / 审计 / 安全 全协议
├── 00_orchestrator.md 调度引擎:门禁裁决 / 预算控制 / 回环路由
├── engineering_mode.md 工程模式:已上线项目的 6 步迭代
├── EXECUTION_MODE.md 执行标准:验证拦截 / 场景策略 / 安全门禁链
├── roles/ 14 个角色提示词(R1-R12 + R13×2)
└── tools/ validate.sh · CPOO · Pipeline Doctor
角色就是一个 Markdown 文件。 比如需求角色的开头:
本产品管线从你这里启动。你的产出是整个管线的"施工蓝图"------后续所有角色都依据你的需求文档和验收标准来判断是否做对了产品。
整套提示词是可 git diff 的------你可以像维护代码一样维护它:改一条规则、提交、观察行为变化。提示词不是玄学,它可以被版本控制。
还有个外部校验工具 validate.sh,按角色检查产出物(文件存在性、EXIT 指纹、脱敏、记忆完整性):
bash
bash pipeline/tools/validate.sh <project_name> --auto --role R6 --check-context
四个机制,贴细节讲
① EXIT_CODE 指纹协议。 所有 Bash 验证输出必须形如:
shell
$ pytest tests/ -q
42 passed in 1.2s
$ echo "EXIT:$?"
EXIT:0
无 EXIT: 指纹 = 视为未验证;退出码非零 = 验证失败。Agent 可以编话,编不了退出码。
② 定向回环路由表。 审查不通过时不盲目重跑,调度引擎按问题类型回退:
| 问题类型 | 回环目标 |
|---|---|
| 代码 Bug / 安全漏洞 | R4 / R5 / R6 |
| 架构 / 设计问题 | R2 |
| 视觉 / 前端问题 | R3 / R5 |
| 数据模型问题 | R4 |
| 回环超过 2 次 | 触发管线医生(停止回环) |
③ 三级上下文预算。 上游产出累计 ≤12KB 正常加载;>12KB 摘要优先、按需深读;>20KB 仅消费摘要。防止长上下文把模型注意力稀释到"变糊"。
④ 记忆写入四问自检。 写入前逐条过:下次恢复用得到吗?能从已有信息推导出来吗?是不是已经写过了?会不会超限?------写入的是"下次需要知道的",不是"发生了什么"。
怎么接进你的工作流
两种用法,按你的需要选:
用法 A:当方法论参考。 读 agent_core.md,挑需要的机制裁进自己的流程。建议从最小开始:先加三道闸门(文件存在 / EXIT 指纹 / 脱敏),能拦住大部分"静默失败"。
用法 B:直接当工作目录用。 仓库本身就是完整结构:memory/(三层记忆)、plans/(计划层)、projects/(产出目录)全部就位。用 Claude Code 打开目录------CLAUDE.md 就是协议入口:
- 新项目:走 14 角色完整管线(需求 → ... → MVP 放行)
- 已有项目:自动切"工程模式"6 步迭代(健康检查 → 快照 → 依赖分析 → 修改 → 回归 → 记忆)
实战产出
这条管线(v4.x)完成过多类真实交付,公开的一个产出是 AgentGate:多 Agent 可靠性框架,127 个自动化测试、CI 三版本矩阵。
有一组记录值得单独说:某次用较弱模型跑完整管线,"代码生成"环节连续 5 次产出不达标------每次都被门禁拦下,零次侥幸通过。第 5 次触发自动诊断,定位为模型方差问题;修复后首跑完整走完 8 个环节(含 3 次定向回环)。
没有门禁的话,这 5 次里至少有 2 次会伪装成成功。
三个翻车复盘(黑的)
复盘 ①:幽灵数据库。 现象:部署后数据写不进去,排查两小时------代码用了相对路径 ./data/db.sqlite,工作目录一变连上空库,零报错。 沉淀:反模式清单加硬性条目------数据库连接强制绝对路径,后端角色启动时对照检查。
复盘 ②:假完成。 现象:早期让模型自评完成度 95%,打开目录文件是空的。 沉淀:自评永久降级为"不可信输入";验证从"看报告"改为"看磁盘 + 看退出码"。
复盘 ③:上下文断崖。 现象:12 个环节产出全量传递,到第 8 个环节质量断崖式下跌。 沉淀:三级上下文预算 + ContextPackage 物化快照(下游只读摘要,需要时再深读源文件)。
每一个机制背后,都是一次真实的翻车。机制的列表,就是事故的名单。
常见问题
Q:需要配合什么模型? A:管线本身模型无关------Claude、Qwen、DeepSeek、本地 Ollama 都能挂,提示词做过实战调优,换模型建议先跑回归。三个零依赖 Demo 完全不用模型,纯 Python 标准库。
Q:跑一条管线贵吗? A:花费只有角色的模型调用;门禁、回环路由、记忆管理都是纯规则引擎,不调模型。实测即使是较弱的模型,配上强门禁也能跑出可用交付------被拦下的失败会定向重做,而不是把错误传下去。
上手建议
不用一次上全量。路径是:
- 三道闸门 → 2. 写出你的"放行标准" ("功能完成"不算,
curl /health返回 200 才算)→ 3. 记忆与上限 → 4. 再谈角色分工。
仓库地址:github.com/zw-onemaker...(MIT)。架构图、14 个角色定义、完整规章都在里面。欢迎 issue、拍砖、讨论。