name: 切片
description: “将计划切分为SLICES.md中的依赖图(DAG);验证它;并选取/标记下一个准备好的切片以执行。当被要求将计划切分为切片、生成或修复SLICES.md,或选择下一个要工作的切片时使用。”
切片
概述
切片是一个计划空间工作流,它将Markdown计划转换为仓库根目录SLICES.md中的依赖感知DAG的可PR切片,然后使用该文件作为规范源来选择下一个要工作的切片。
它支持两种模式:
- 生成模式:从计划创建/修复
SLICES.md,并(重新)构建合理的DAG,包括显式依赖和子任务清单。 - 下一个模式:验证
SLICES.md,选择下一个准备好的切片执行,将其标记为in_progress,并将其作为工作项返回给用户。
默认行为是自动:
- 如果
SLICES.md缺失、无效或有零个切片记录:运行生成模式。 - 如果
SLICES.md有效:运行下一个模式。
重要提示:
- 生成模式从不在同一次调用中自动选择工作切片;它只写入
SLICES.md。选择/开始工作发生在后续显式调用(模式=next或自动当有效时)。 - 在自动模式中,选择切片仅在调用开始时
SLICES.md已有效的情况下发生。
输入
- 计划路径(在
SLICES.md中的可选元数据):- 在首次运行时提供以创建/修复
SLICES.md。 - 下一个模式不需要;
SLICES.md是可移植的。
- 在首次运行时提供以创建/修复
- 模式:
- 不需要;从调用文本+
SLICES.md状态推断。 - 如果人类想要强制生成,可以说“生成”/“重建”/“重新生成”。
- 如果人类想要强制选择,可以说“下一个切片”/“我应该做什么”。
- 不需要;从调用文本+
- 分配者(协调器ID):
- 在下个模式中使用以支持并发的
in_progress切片(每个分配者一个)。 - 如果从
SLICES.md头部或调用上下文中不可用,询问人类一次。
- 在下个模式中使用以支持并发的
- 可选:范围边界、排序约束、优先级指导和流程约束。
默认值(如果用户另有说法则覆盖)
- 并行优先:构建DAG,而不是单一线性链。
blocks仅用于真正前提;对软排序使用tracks/related。- 中等粒度:每个叶子切片应独立可PR。
- 包括显式契约切片(API/模式/接口/配置格式)以解耦工作流。
- 包括检查点/集成切片作为连接点(强制反馈循环)。
SLICES.md(仓库根工作空间)
- 路径:仓库根目录的
SLICES.md。 - 规范:
SLICES.md是切片状态的规范源。 切片只读取计划文件和SLICES.md,并且只写入到SLICES.md。
文件头部
SLICES.md应以最小元数据开始,以便下一个模式无需任何计划引用即可运行:
schema_version: 1
default_assignee: opencode
default_assignee是可选的;如果存在,下一个模式将其用作协调器ID。plan_path仅是可选元数据。
切片记录格式
每个切片表示为一个包含单个YAML对象的部分,该对象具有一致的问题记录模式。
在SLICES.md中的规范Markdown布局:
# 切片
## <标题> (<ID>)
```yaml
id: sl-...
...
```
惯例:
- ID:
sl-<短哈希>(在SLICES.md内稳定)。 priority:整数0…4(0最高)。issue_type:task|bug|feature|epic|chore|docs|question(或自定义字符串)。status:open|in_progress|blocked|closed|tombstone。dependencies:{type, depends_on_id}对象列表。- 允许的依赖类型:
blocks|tracks|related。
- 允许的依赖类型:
推荐添加:
subtasks:切片内部步骤的有序清单(2-10项)。verification:至少一个具体信号(命令或手动检查)证明切片完成。parent_id:可选;如果存在,此切片是史诗的子项。assignee:可选字符串;当status: in_progress时需要。
每个切片的最小推荐键:
id,title,status,priority,issue_typedescription,acceptance_criteria,notes(可以为空字符串但应收敛)dependencies(省略或空列表)
如果status: in_progress,assignee是必需的。
如果存在,subtasks应为YAML字符串列表。
史诗/子惯例:
- 优先使用
parent_id,而不是将父/子编码为依赖关系。 - 如果任何切片有
parent_id: <id>,则<id>是史诗。 - 史诗是组织性的;不要在父和子之间添加
blocks边。
推荐元数据页脚(在notes中,用于选择/评分):
工作流: <名称>
角色: 契约 | 实现 | 集成 | 检查点
并行性影响: 解锁 <n> 切片
角色 ↔ 双钻石(指导):
contract:定义implementation:开发 / 交付integration/checkpoint:交付
示例切片:
id: sl-1a2b3c4d
title: "后端API:认证契约"
status: open
priority: 1
issue_type: task
description: |
决定并记录认证API表面,以便前端/集成工作可以继续进行。
acceptance_criteria: |
- 记录端点(请求/响应)包括错误形状。
- 定义令牌/会话生命周期。
verification: |
- 文档:打开规范并确认所有端点+错误形状存在。
subtasks:
- 草拟端点列表和认证模型。
- 指定请求/响应JSON形状。
- 指定错误形状和令牌/会话生命周期。
notes: |
工作流: 后端API
角色: 契约
并行性影响: 解锁3切片
dependencies:
- type: blocks
depends_on_id: sl-deadbeef
工作流
0) 调用门 + 模式选择
- 确认显式调用。
- 确定模式(推断;不需要显式标志):
- 如果用户明确要求“生成”/“(重新)构建”切片:模式=
generate。 - 如果用户明确要求“下一个切片”/“我应该做什么”:模式=
next。 - 否则模式=
auto。
- 如果用户明确要求“生成”/“(重新)构建”切片:模式=
- 如果模式需要计划路径并提供,读取计划文件。
1) 确保 + 验证 SLICES.md
-
如果
SLICES.md不存在:- 如果没有计划路径可用,询问人类。
- 否则创建
SLICES.md,包括头部元数据和空# 切片部分。
-
验证
SLICES.md(结构 + 语义)。将失败视为:- 硬无效(必须在下一个模式继续之前修复)。
- 警告(可以继续,但打印警告)。
硬无效检查:
- 头部:有
schema_version。 - 可解析性:每个切片部分包含恰好一个有效的YAML对象(映射)。
- 必需键:每个切片至少
id,title,status,priority,issue_type。 - 优先级合理性:
priority是0…4的整数。 - 唯一性:切片ID唯一。
- 状态合理性:状态在允许集中。
- 依赖类型合理性:依赖
type是blocks|tracks|related之一。 - 引用性:每个
dependencies[*].depends_on_id引用现有切片。 - 史诗引用性:如果
parent_id存在,它引用现有切片。 - 进行中分配者:每个
status: in_progress切片有非空assignee。 - 进行中唯一性:每个
assignee最多一个切片有status: in_progress。 - 进行中就绪性:
in_progress切片没有未满足的blocks依赖。 - 依赖合理性:
blocks边是无环的(拓扑排序/DFS;如果不确定,询问)。
警告检查:
status: blocked但没有未满足的blocks依赖(自动翻转为open)。status: open但有未满足的blocks依赖(推荐切换为blocked)。status: closed但有未满足的blocks依赖(可能是簿记错误)。- 叶子切片缺少
verification或有意义的接受标准。
规范化 + 自动修复(与
$select重叠):- 在硬失败前应用确定性规范化:
- ID规范化 + 别名:修剪/小写ID和
depends_on_id,去掉前导#,并在明确时映射唯一数字后缀别名。 - 状态令牌规范化:将
in progress,in-progress, 和in_progress视为等效;写回规范in_progress。 - 安全状态漂移修复:保持自动翻转
blocked->open当没有未满足的blocks依赖时。
- ID规范化 + 别名:修剪/小写ID和
- 规范化后,未解决的未知依赖ID保持硬无效。
- 将应用的修复记录为
auto_fix键,用于下一个模式输出。
歧义护栏:
- 如果验证失败需要人类意图(例如,
in_progress切片缺少assignee,或同一assignee有多个in_progress切片),询问人类如何解决后再修复。
-
如果验证失败:
- 切换到模式=
generate(自动修复),并(重新)读取计划(如果可用)。 - 在写入修复的
SLICES.md后停止;不选择/标记任何切片in_progress。
- 切换到模式=
-
如果模式=
auto且SLICES.md包含零个切片记录:- 切换到模式=
generate,并读取计划(如果提供)。 - 在写入
SLICES.md后停止。
- 切换到模式=
派生集(尽力而为):
- 叶子 vs 史诗:史诗如果
issue_type=epic或任何切片有parent_id指向它。 - 被阻止集:任何
blocks依赖到非closed切片。 - 准备就绪工作集:
status in {open}且没有阻止依赖且非史诗。 - 准备就绪执行集:准备就绪工作且满足可PR叶子标准如下。
- 解锁候选:被阻止叶子切片按同一风险层内最高解锁影响排名。
定义“可PR叶子”为:
- 足够小以单个PR,
- 清晰的接受标准,
verification(或显式验证信号在acceptance_criteria内),- 包括
subtasks(清单)或显然是单步。
2) 生成模式:创建/修复DAG
生成模式要么创建初始DAG,要么修复无效DAG。
如果SLICES.md没有切片记录(或正在重建):
- 从计划提取主要工作流、里程碑、风险和隐含前提。
- 按工作流创建史诗。
- 创建解锁并行工作的契约切片(API/模式/接口决策)。
- 创建实现切片和至少一个检查点/集成切片每个工作流。
- 对每个切片,添加
subtasks(2-10项)和至少一个verification信号。 - 连线依赖:
blocks:仅硬前提(消费切片无法安全启动)。tracks:软排序/“如果可能先做这个”。related:仅信息关系。
- 在生成可用DAG后停止(不在第一遍详尽阐述每个切片)。
生成模式不标记任何切片in_progress。
依赖识别启发式:
- 契约阻止消耗它们的实现(API/模式/CLI/接口决策)。
- 数据模型/迁移阻止任何读取/写入受影响数据的。
- 基础设施/配置(环境变量、密钥、数据库设置、CI管道)阻止运行时/集成切片。
- 检查点/集成切片通常
track多个实现;它们很少block它们。 - 如果依赖不确定并会成为
blocks边,在添加前询问人类。
3) 下一个模式:选择下一个切片执行
如果有零个切片记录:
- 报告:
未找到切片;使用计划路径运行生成模式的切片。
确定self_assignee(协调器ID):
- 优先使用
SLICES.md头部中的default_assignee(如果存在)。 - 否则从调用上下文推断;如果未知,询问人类。
如果已经有切片status: in_progress且assignee: <self_assignee>:
- 返回该切片(不选取新切片)。
否则,从准备就绪执行集中选择下一个切片,使用以下准则。
如果准备就绪执行集为空但准备就绪工作集非空,报告切片存在但未充分指定(缺少verification/接受)并推荐运行生成模式以丰富它们。
如果准备就绪执行集为空且存在被阻止叶子切片,返回顶部解锁推荐(不标记它in_progress)并识别必须先关闭的缺失前提切片。
选择准则(改编自select):
- 功能优先:如果任何就绪切片是
issue_type=feature,评估所有就绪功能优先。 - 类型顺序(回退):
task>bug>feature>chore>epic>docs>question。 - 优先级:0 > 1 > 2 > 3 > 4。
- 风险:迁移、认证/安全、基础设施、数据丢失/一致性、破坏API/CLI、性能回归、模糊接受。
- 难度:模糊范围、多个子系统、未知依赖、沉重验证。
- 影响半径:广泛使用的模块、共享配置、CI/构建管道、核心用户路径。
- 并行性影响(与风险平衡):当风险在同一层时,偏好解锁更多被阻止切片或建立契约/检查点的切片。
- 软依赖:如果就绪切片
tracks/relates另一个就绪切片,应用软惩罚并偏好被跟踪优先项。 - 平局打破:优先级 -> 最强信号 -> 文件顺序最早。
评分笔记(轻量):
- 基础分数来自风险/难度/影响/优先级。
- 并行性微调(仅在同一风险层内应用):
- 角色:契约/检查点 +2;集成 +1;实现 +0。
- 解锁计数:+1每个解锁的被阻止切片(上限+3)。
- 软依赖:-2如果它
tracks/relates另一个就绪切片;0否则。
就绪门:
- 从不选择执行切片如果它有缺失前提。
- 下一个模式非创造性:不在选择时添加新切片或依赖。
- 如果选择表面缺失决策/契约或模糊前提,切换到生成模式以更新DAG并在写入
SLICES.md后停止(不标记任何切片in_progress)。
4) 更新SLICES.md
如果模式=next(或自动选择下一个):
- 标记所选切片
status: in_progress。 - 设置
assignee: <self_assignee>(in_progress需要)。 - 不重写无关切片;应用尽可能小的编辑。
如果在验证期间识别出任何安全规范化编辑(例如,自动翻转blocked -> open当没有blocks依赖时),应用它们且差异最小。
如果模式=generate(或自动选择生成):
- 如果现有切片太大或多PR,分割为2-6个子切片。
- 确保每个叶子切片有
subtasks和verification。 - 可能时用最小差异更新
SLICES.md;如果文件无效/不可解析,重新生成# 切片部分并保留任何未知内容在# 附录(遗留)部分。
5) 全局审查(快速)
在任何写入后:
- 审计本地依赖子图以获取并行性;如果大多线性,重构为工作流+契约+连接点。
- 确保
blocks边仅是真正前提。 - 确保每个叶子切片独立可PR且有接受+验证(+必要时
subtasks)。 - 运行审查者通过以重叠间隙从
$select:未解决的未知依赖、循环风险、以及可能近期叶子工作缺少验证。
输出
- 如果模式=
generate:打印生成切片: <n>并列出新/更新切片ID。 - 如果模式=
generate(包括自动修复):指示人类审查SLICES.md并稍后重新运行切片以选择工作。 - 如果模式=
next:打印下一个切片: <id> - <标题>并包括所选切片YAML完整内容。 - 如果模式=
next:包括紧凑选择跟踪,含counts,pick,next2,warnings, 和auto_fix。 - 如果没有准备就绪工作项存在,报告原因(所有
closed,或剩余项blocked)并在需要时询问针对性问题。 - 如果没有准备就绪工作项存在但存在被阻止叶子切片,也打印
顶部解锁器: <id> - <标题>并前提ID。
示例
最小SLICES.md骨架(可移植;无计划引用需要):
---
schema_version: 1
---
# 切片
## 后端工作流 (sl-0a1b2c3d)
```yaml
id: sl-0a1b2c3d
title: "后端工作流"
status: open
priority: 2
issue_type: epic
description: |
后端工作的组织史诗。
acceptance_criteria: |
- 所有子切片关闭。
verification: |
- 审查:sl-0a1b2c3d的所有子项关闭。
subtasks: []
notes: |
工作流: 后端
角色: 检查点
dependencies: []
```
## 后端API:认证契约 (sl-1a2b3c4d)
```yaml
id: sl-1a2b3c4d
parent_id: sl-0a1b2c3d
title: "后端API:认证契约"
status: open
priority: 1
issue_type: task
description: |
决定并记录认证API表面以便其他工作可以继续进行。
acceptance_criteria: |
- 记录端点(请求/响应)包括错误形状。
- 定义令牌/会话生命周期。
verification: |
- 文档:打开规范并确认端点+错误形状存在。
subtasks:
- 草拟端点列表和认证模型。
- 指定请求/响应JSON形状。
- 指定错误形状和令牌/会话生命周期。
notes: |
工作流: 后端API
角色: 契约
dependencies: []
```
## 后端:实现认证端点 (sl-2b3c4d5e)
```yaml
id: sl-2b3c4d5e
parent_id: sl-0a1b2c3d
title: "后端:实现认证端点"
status: open
priority: 2
issue_type: feature
description: |
按照契约实现认证端点。
acceptance_criteria: |
- 端点实现并返回预期响应。
verification: |
- 运行: <测试命令>
subtasks:
- 实现路由+处理器。
- 添加测试。
notes: |
工作流: 后端
角色: 实现
dependencies:
- type: blocks
depends_on_id: sl-1a2b3c4d
```