Files

7.3 KiB
Raw Permalink Blame History

任务 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## 父级 / ParentDAG 父级 = Kind/EpicKind/Feature[org-internal #3061] 阶段 2——文中「Epic scope」泛指源工单 scope
单门 review-dagTOPO / REQMAP / RELEASE 三维,深度由 dag_metrics 导出)
评审深度 `D1

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:敏感数据/认证/授权/审计/加密/威胁) {已覆盖/明确排除/待确认} {证据/指针}
非功能需求 NFRCMP 1.12ISO/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_typecontract_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 覆盖核对), 由 verify skill 按 DAG 切片生成——见 dag-pipeline/spec-05

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。

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))