sparv 工作流概述
sparv(Specify-Plan-Act-Review-Vault)是 PinableAgents 中精确度最高的开发工作流。它的设计目标是"零歧义开发"——在编写第一行代码之前,确保需求规格已经精确到不留任何解释空间。sparv 的独特之处在于其外部记忆系统(Vault),能够将开发过程中积累的知识、决策和上下文持久化存储,使智能体在跨会话、跨任务时能够调取历史上下文,避免重复探索和决策。
sparv 特别适合对精确度要求极高的场景:金融系统 API 开发、医疗数据处理管线、安全关键系统的变更等。在这些场景中,一个模糊的需求理解可能导致严重的线上事故,而 sparv 的十项规格门禁机制从源头消除了这种风险。
sparv 的哲学是"慢即是快"。在 Specify 阶段多花 20% 的时间,能在整个开发周期节省 50% 的返工时间。Vault 系统进一步将这种投资的回报延伸到未来的每一个相关任务。
第一阶段:Specify(精确规格)
Specify 阶段是 sparv 最核心的阶段,由 Specification Analyst 智能体负责。该阶段的目标是将用户的自然语言需求转化为形式化的规格文档,精确到每个字段的类型、每个接口的参数、每个错误码的含义。
规格文档结构
Specification Analyst 产出的规格文档遵循固定模板,包含以下部分:
- 功能概述:一段话描述功能的业务价值和技术范围
- API 契约:每个端点的路径、方法、请求参数、响应格式、错误码
- 数据模型:每个字段的名称、类型、约束、默认值、索引需求
- 状态机:如果涉及状态变更,绘制完整的状态转换图
- 验收标准:可自动化验证的 Given-When-Then 格式测试场景
- 非功能性约束:响应时间、并发容量、数据保留策略
十项规格门禁详解
规格文档必须通过十项检查才能进入 Plan 阶段。每项检查为通过/不通过二元判定,所有十项均通过才能继续。
| 序号 | 检查项 | 判定标准 |
|---|---|---|
| 1 | 功能边界明确 | 规格文档明确列出了"包含"和"不包含"的范围 |
| 2 | 输入参数完整 | 每个接口的所有参数都有类型、约束和示例值 |
| 3 | 输出格式定义 | 成功和失败的响应格式均有明确定义 |
| 4 | 错误码覆盖 | 所有可预见的错误场景都有对应的错误码和描述 |
| 5 | 数据模型完整 | 每个字段都有类型、约束、索引和迁移策略 |
| 6 | 状态转换定义 | 所有有效的状态转换都有明确的触发条件和副作用 |
| 7 | 安全约束声明 | 认证、授权、输入验证和敏感数据处理策略已定义 |
| 8 | 性能基线设定 | 关键操作的响应时间和吞吐量有明确的 SLA |
| 9 | 向后兼容评估 | 对现有接口和数据模型的影响已评估并有兼容策略 |
| 10 | 验收场景可执行 | 所有验收标准均为 Given-When-Then 格式且可自动化 |
# 十项门禁检查输出示例
[sparv:specify] 规格门禁检查:
[1/10] 功能边界明确 ✓ 通过
[2/10] 输入参数完整 ✓ 通过
[3/10] 输出格式定义 ✓ 通过
[4/10] 错误码覆盖 ✗ 未通过 -> 缺少 429 Too Many Requests 定义
[5/10] 数据模型完整 ✓ 通过
[6/10] 状态转换定义 ✓ 通过 (无状态变更)
[7/10] 安全约束声明 ✓ 通过
[8/10] 性能基线设定 ✓ 通过
[9/10] 向后兼容评估 ✓ 通过
[10/10] 验收场景可执行 ✓ 通过
结果: 9/10 通过 -> 门禁未通过,回到 Specify 阶段补充错误码定义
第二阶段:Plan(实施规划)
Plan 阶段由 Implementation Planner 智能体负责,将精确的规格文档转化为具体的实施步骤。与 do 工作流的 Plan 阶段不同,sparv 的规划粒度更细——不仅定义变更哪些文件,还精确到每个函数的签名、每个数据库查询的索引策略。
规划产出物
- 文件变更清单:精确到行级别的变更预估
- 函数签名定义:每个新增或修改函数的完整签名
- 依赖变更:新增或升级的外部依赖及版本锁定
- 迁移脚本:数据库变更的正向和回滚脚本
- 测试清单:与验收场景对应的测试用例列表
第三阶段:Act(执行实现)
Act 阶段由 Precise Coder 智能体负责。与其他工作流中的开发智能体不同,Precise Coder 被严格约束在 Plan 阶段的产出范围内——它不能自行决定添加规划外的功能或改变约定的函数签名。这种约束确保了实现与规格之间的严格一致性。
2-Action Saves 机制
Act 阶段内置了 2-Action Saves 安全机制。每执行两个编辑操作后,系统自动保存当前状态的快照(通过 Git stash 或独立 commit)。这确保了即使后续操作出错,最多只需要回退两步。该机制对于大型文件变更尤其重要,避免了因单次操作失误导致大量工作丢失。
# 2-Action Saves 日志示例
[sparv:act] 操作 1: 创建 handlers/orders.go
[sparv:act] 操作 2: 实现 CreateOrder 函数
[sparv:act:save] 自动快照 #1 已保存 (2 个操作)
[sparv:act] 操作 3: 创建 services/order_service.go
[sparv:act] 操作 4: 实现 ValidateOrder 函数
[sparv:act:save] 自动快照 #2 已保存 (4 个操作)
第四阶段:Review(审查验证)
Review 阶段由 Specification Verifier 智能体负责。它的核心任务不是通常意义上的代码审查,而是规格一致性验证——逐条对照 Specify 阶段产出的规格文档,检查实现是否与规格完全一致。
验证清单
- 每个 API 端点的路径、方法、参数是否与规格一致
- 每个错误码是否在对应场景下正确返回
- 数据模型的字段类型和约束是否与规格匹配
- 所有验收场景对应的测试是否通过
- 性能基线测试是否达标
第五阶段:Vault(外部记忆持久化)
Vault 阶段是 sparv 区别于其他所有工作流的独特阶段。由 Knowledge Curator 智能体负责,将本次任务中积累的关键知识、决策和上下文提取并持久化到外部记忆系统中。
存储内容类别
| 类别 | 示例 | 检索方式 |
|---|---|---|
| 架构决策记录(ADR) | "选择 PostgreSQL 全文搜索而非 Elasticsearch,因为当前数据量不超过 100 万条" | 按项目和模块检索 |
| 代码模式 | "本项目的中间件遵循 func(next) handler 模式" | 按技术栈和模式类型检索 |
| 约束与限制 | "用户表的 email 字段有唯一索引,注册时需要处理冲突" | 按数据模型检索 |
| 问题与解决方案 | "Go 的 json.Decoder 在空 body 时返回 EOF 而非空值" | 按错误类型和技术栈检索 |
Vault 系统深度解析
Vault 系统使用本地文件系统存储知识条目,每个条目是一个 JSON 文件,包含元数据(创建时间、关联项目、标签)和内容。条目通过语义索引进行高效检索。
# Vault 存储结构
~/.pinable-agents/vault/
├── index.json # 全局索引
├── projects/
│ └── my-api/
│ ├── adr/ # 架构决策记录
│ │ └── 001-search-engine.json
│ ├── patterns/ # 代码模式
│ │ └── middleware-pattern.json
│ └── constraints/ # 约束与限制
│ └── user-email-unique.json
└── global/
└── solutions/ # 跨项目通用方案
└── go-empty-body-eof.json
检索与注入
在 sparv 工作流启动时,系统自动从 Vault 中检索与当前任务相关的知识条目,并注入到 Specify 阶段的上下文中。这使得智能体能够"记住"之前的决策和发现,避免重复探索已知的模式和约束。
统一日志机制
sparv 的每次执行都会生成一个统一日志(Journal),记录所有阶段的输入、输出、决策和耗时。Journal 采用追加写入模式,保证数据不丢失。它既是调试和审计的工具,也是 Vault 知识提取的数据源。
# Journal 条目示例
{
"timestamp": "2026-02-25T14:30:00Z",
"phase": "specify",
"action": "gate_check",
"result": "pass",
"details": {
"checks_passed": 10,
"checks_total": 10,
"duration_ms": 4520
}
}
安全协议:2-Action Saves 与 3-Failure Protocol
sparv 内置两套安全协议,防止执行过程中的意外损失。
2-Action Saves
如前文所述,每两个编辑操作后自动创建快照。快照以 Git stash 形式保存,可在 Act 阶段的任何时刻回退到最近的快照点。
3-Failure Protocol
当连续三次操作失败时(编译错误、测试失败或门禁不通过),系统自动暂停当前阶段并触发以下流程:
- 保存当前状态快照
- 生成失败分析报告(包含三次失败的详细信息和可能原因)
- 将失败上下文写入 Journal
- 暂停工作流,等待人工决策(继续、回退或终止)
[sparv:act] 操作失败 (1/3): 编译错误 - undefined: OrderStatus
[sparv:act] 操作失败 (2/3): 编译错误 - undefined: OrderStatus
[sparv:act] 操作失败 (3/3): 编译错误 - undefined: OrderStatus
[sparv:3fp] ⚠ 3-Failure Protocol 触发
[sparv:3fp] 快照已保存: stash@{0}
[sparv:3fp] 失败分析: OrderStatus 类型在 models/order.go 中未定义,
可能原因: Plan 阶段遗漏了类型定义,或文件创建顺序错误
[sparv:3fp] 工作流已暂停,等待人工决策
实战:构建 REST API 端点
以下演示使用 sparv 工作流为一个 Go Gin 项目构建订单创建的 REST API 端点。
启动工作流
pinable-agents run sparv \
--task "实现创建订单 API,支持商品列表、收货地址、优惠券" \
--context "Go + Gin + PostgreSQL,已有 products 和 users 表"
Specify 产出
POST /api/v1/orders
Request Body:
{
"items": [{"product_id": "string", "quantity": "integer(1-99)"}],
"address_id": "string(uuid)",
"coupon_code": "string|null"
}
Response 201:
{"order_id": "string(uuid)", "total": "decimal", "status": "pending"}
Error Codes:
400 - 请求参数格式错误
401 - 未认证
404 - 商品或地址不存在
409 - 库存不足
422 - 优惠券无效或已过期
Vault 注入
系统从 Vault 中检索到两条相关知识:项目中间件使用 AuthMiddleware 进行 JWT 认证(来自之前的认证任务),以及 PostgreSQL 的事务隔离级别设置为 Read Committed(来自项目约束条目)。这些知识自动注入到 Plan 阶段,避免了重复探索。
跨会话上下文维持
Vault 系统的核心价值在于跨会话上下文维持。当你在新会话中启动 sparv 工作流时,系统会自动加载与当前项目和任务相关的所有 Vault 条目,让智能体仿佛"记得"之前所有的工作上下文。这对于长期维护的项目尤其重要——随着 Vault 中积累的知识越来越丰富,智能体对项目的理解也越来越深入,执行效率持续提升。
CLI 命令参考
# 完整 SPARV 流程
pinable-agents run sparv --task "任务描述"
# Vault 管理命令
pinable-agents vault list # 列出所有条目
pinable-agents vault search "关键词" # 搜索条目
pinable-agents vault export --format json # 导出 Vault 数据
pinable-agents vault import ./backup.json # 导入 Vault 数据
pinable-agents vault prune --older-than 6m # 清理过期条目
# Journal 查看
pinable-agents journal show --last 10 # 查看最近 10 条日志
pinable-agents journal show --phase specify # 按阶段筛选
# 安全协议配置
pinable-agents run sparv --task "任务描述" \
--save-interval 2 \
--failure-threshold 3 \
--auto-resume false