7.3 KiB
任务 DAG 模板
任务 DAG 是「需求(节点验收标准)+ 设计(边契约)+ 计划(拓扑排序)」三视图的 单一工件,由
analyze-dagskill 产出,落地为 wiki 页{epic-slug}/dag。 结构契约以.octopus/templates/dag.md为准;字段语义权威源:dag-pipeline/spec-03、冻结契约dag-pipeline/spec-02§2。
DAG 工件状态: draft 版本戳: v1 页尺寸自检: 未超限
1. 头部卡
| 项 | 内容 |
|---|---|
| slug / 源 DAG 父级 | {epic-slug} / #N(## 父级 / Parent;DAG 父级 = Kind/Epic 或 Kind/Feature,[org-internal #3061] 阶段 2——文中「Epic scope」泛指源工单 scope) |
| 单门 | review-dag(TOPO / REQMAP / RELEASE 三维,深度由 dag_metrics 导出) |
| 评审深度 | `D1 |
2. 需求登记表
仅登记功能性需求(Epic scope 项中的功能性条目)。产品 NFR 不占
REQ-F编号、 不登记入表、以NFR:前缀条目落节点 AC(见 §3acceptance_criteria)。 登记表登记的是「提出者写了什么」;§2.1 类目覆盖矩阵补上「还有什么该问的」 ([org-internal #2905]:legacy elicitation 广度扫描被折叠后的补偿层——表 ↔ 现实完备性)。
| id | title | source | refs_by |
|---|---|---|---|
| REQ-F-001 | {需求标题} | {Epic scope 项} | {引用节点 id 集} |
2.1 类目覆盖矩阵([org-internal #2905] 方案 1)
固定类目集(≤10 类,自 legacy
.octopus/archive/checklists/requirements-analysis.mdCMP/SAF 维抽取)。 每类目状态 ∈ {已覆盖, 明确排除, 待确认}:
- 已覆盖 — 类目下存在登记需求(§2 登记表
REQ-F-{NNN}行或节点NFR:条目);- 明确排除 — 类目整体或部分条目 out of scope,须在 §2.2 排除账本登记
E-n行;- 待确认 — 无法判定的中间态,须写明「向{确认人}确认{什么}」。 「明确排除」与「漏了」在工件上可区分:漏了 = 状态空白、或写「N/A」而无账本行。 矩阵是 analyze-dag 生产侧义务,不新增单门判据(REQMAP 三张表不变, spec-04 §1 冻结文本不动)。矩阵 + 账本计入页尺寸预算(spec-02 §2.6), 超限时类目细目下沉子页
{epic-slug}/dag-coverage(同 AC 下沉机制)。
| 类目 | 状态 | 证据 / 指针 |
|---|---|---|
| 用户角色(CMP 1.7:直接/间接/自动化) | {已覆盖/明确排除/待确认} | {REQ-F-{NNN}… / E-{n} / 向{确认人}确认{问题}} |
| 外部系统集成(CMP 1.5;产品 Epic 强制——External-System Rule 的 N 类目推广) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 接口需求(CMP 1.13:用户/硬件/软件/通信) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 数据需求(CMP 1.14:数据量/保留/质量/敏感性) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 业务规则(CMP 1.15,含来源) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 约束(CMP 1.8:法规/技术/组织/进度/预算) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 安全(SAF 5.1–5.10:敏感数据/认证/授权/审计/加密/威胁) | {已覆盖/明确排除/待确认} | {证据/指针} |
非功能需求 NFR(CMP 1.12,ISO/IEC 25010:2011;条目落节点 NFR: AC——矩阵仅确认已扫描) |
{已覆盖/明确排除/待确认} | {证据/指针} |
| 错误与边界场景(CMP 1.11:空输入/边界值/异常状态,Epic 级;节点级路径覆盖由 REQMAP「AC 路径覆盖」承担) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 假设与依赖(CMP 1.9:列出并评估影响) | {已覆盖/明确排除/待确认} | {证据/指针} |
2.2 排除账本([org-internal #2905] 方案 1)
「明确排除」的唯一凭证登记处。每行一条
E-n:条目 — out of scope、理由、确认人。 排除可逆:重开时删行并把 §2.1 矩阵状态改为「已覆盖/待确认」,同一次修订内完成。 无账本行的「N/A」视为未扫描(等同「漏了」)。
| id | 类目 | 条目 | 理由(为何 out of scope) | 确认人 |
|---|---|---|---|---|
| E-1 | {类目名} | {具体条目} | {一句话理由} | {提出者/干系人} |
3. 节点表
任务节点
N-{nn}(N-01…);里程碑节点M-{nn}(M-01…)。status ∈ {pending, ready, in_progress, done, blocked, green}——green仅里程碑节点可用。
nodes:
- id: "N-01"
title: "{一行}"
type: task # task | milestone
acceptance_criteria: # 每条可证伪 + 映射 test_id;可含 NFR: 前缀条目
- "AC-1: <可证伪的验收条件>"
- "NFR: <产品 NFR 条目>" # 可选
req_refs: ["REQ-F-001"] # 由 §2 需求登记表派生;milestone 节点无此字段
status: pending
owner_session: null
size_attrs: # 仅 type=task 节点必填;milestone 节点不填
cross_session_in: 0 # 入边跨 session 边数
cross_session_out: 0 # 出边跨 session 边数
contract_change: none # none | additive | breaking(仅聚合承载契约的跨 session task 出边)
estimated_hours: 8 # 预估实现时长(小时)
estimated_sessions: 1 # 1 session ≈ 8h;须满足 |estimated_hours − 8×estimated_sessions| ≤ 2
4. 边表
与里程碑相连的边(入边 + 出边)
cross_session: true但无contract_ref、无change_type、contract_state不适用(里程碑 = 无 session 的集成点)。
edges:
- from: "N-01"
to: "N-02"
contract_ref: "shared/{contract-name}" # 跨 session task 边必填;里程碑边省略
cross_session: true # from/to 是否由不同 session 拥有
contract_state: draft # draft | frozen(仅 task 间跨 session 边有冻结语义)
change_type: additive # none | additive | breaking(仅跨 session task 边)
5. 里程碑节点
每个
cross_session_in ≥ 2汇聚点焊入里程碑(无实现工作,只有 DoD)。 里程碑 DoD = 汇聚范围集成验证(集成测试 / 契约符合性 / 回归 / NFR 覆盖核对), 由verifyskill 按 DAG 切片生成——见dag-pipeline/spec-05。
milestones:
- id: "M-01"
fan_in: ["N-02", "N-03"] # 全部跨 session 入边源节点
downstream: ["N-05"] # 下游消费者;无下游则为 sink 里程碑(无出边)
6. 拓扑约束(必须满足,否则单门 TOPO 维不通过)
- 无环:边方向定义的图无环。环 → BLOCKER。
- 里程碑位置:任意节点
cross_session_in ≥ 2→ 必须焊入里程碑(见 §5)。 - 粒度下限:以
estimated_sessions为准(完整分档见 spec-03 §3 规则 3)。
7. dag_metrics
键名冻结于 spec-02 §2.6。
review_depth由 spec-06 §1 派生公式取三输入 MAX。
dag_metrics:
node_count: 6 # 任务 + 里程碑节点总数
cross_session_edge_count: 7 # 全图 cross_session: true 边总数
contract_change_surface: additive # none | additive | breaking(最坏值聚合)
review_depth: D4 # max(depth_by(node_count), depth_by(cross_session_edge_count), depth_by(contract_change_surface))