137 lines
7.3 KiB
Markdown
137 lines
7.3 KiB
Markdown
# 任务 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))
|
||
```
|