# 任务 DAG 模板 > 任务 DAG 是「需求(节点验收标准)+ 设计(边契约)+ 计划(拓扑排序)」三视图的 > **单一工件**,由 `analyze-dag` skill 产出,落地为 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 | D2 | D3 | D4`(`dag_metrics.review_depth`) | ## 2. 需求登记表 > 仅登记功能性需求(Epic scope 项中的功能性条目)。产品 NFR 不占 `REQ-F` 编号、 > 不登记入表、以 `NFR:` 前缀条目落节点 AC(见 §3 `acceptance_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.md` CMP/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` 仅里程碑节点可用。 ```yaml 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 的集成点)。 ```yaml 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 覆盖核对), > 由 `verify` skill 按 DAG 切片生成——见 `dag-pipeline/spec-05`。 ```yaml milestones: - id: "M-01" fan_in: ["N-02", "N-03"] # 全部跨 session 入边源节点 downstream: ["N-05"] # 下游消费者;无下游则为 sink 里程碑(无出边) ``` ## 6. 拓扑约束(必须满足,否则单门 TOPO 维不通过) 1. **无环**:边方向定义的图无环。环 → BLOCKER。 2. **里程碑位置**:任意节点 `cross_session_in ≥ 2` → 必须焊入里程碑(见 §5)。 3. **粒度下限**:以 `estimated_sessions` 为准(完整分档见 spec-03 §3 规则 3)。 ## 7. dag_metrics > 键名冻结于 spec-02 §2.6。`review_depth` 由 spec-06 §1 派生公式取三输入 MAX。 ```yaml 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)) ```