Files
octopus-workflow/core/templates/dag.md
T

137 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 任务 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:敏感数据/认证/授权/审计/加密/威胁) | {已覆盖/明确排除/待确认} | {证据/指针} |
| 非功能需求 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` 仅里程碑节点可用。
```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))
```