easy-coding-harness 0.9.1 → 0.10.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,22 @@
6
6
  - `y`:常规功能升级
7
7
  - `z`:日常 bug 修复
8
8
 
9
+ ## 0.10.0-beta.0
10
+
11
+ - 接入 `easy-dev-spec/v1` Canonical Spec:同步最终 producer 协议实现并新增只读
12
+ `inspect-dev-spec`、确定性 `select-dev-spec-scope`、选择式 `create-task-from-spec` 与
13
+ 依赖证据 `satisfy-spec-dependency` 状态 API;用户选择多个 Spec task 后仍只创建一个
14
+ Harness task,消费上下文按仓库形成闭包。
15
+ - Task、Unit 与执行证据新增来源 Spec SHA、仓库、source task/step、符号和测试命令追踪;
16
+ ANALYSIS 使用最终 READY 语义机械校验全局、契约、仓库、任务和验收闭环,并继续校验
17
+ 仓库身份、基线、hard 依赖及 task/change/step/test 追踪。
18
+ - IMPLEMENT、REVIEW、VERIFICATION 与 Git 范围按 `repo_id` 隔离;pending integration
19
+ 依赖允许完成本地检查,但在证据闭合前禁止进入 MEMORY 或宣称全链路完成。
20
+ - 保持历史/legacy task、现有状态图、approval/workflow mode 与指纹证据兼容;Canonical
21
+ Spec 始终只读,本地 dev-spec、execution plan 和 test strategy 作为带来源哈希的派生物。
22
+ - 补齐 Codex 根身份兼容:真实运行时写入的裸 `root`、既有 `/root` 及其协作子路径统一
23
+ 规范化为 `codex`,避免状态行、breadcrumb、任务列表与 claim 再次误报跨 Agent handoff。
24
+
9
25
  ## 0.9.1
10
26
 
11
27
  - 正式发布 Codex Agent 身份归一化修复:协作路径 `/root`、`/root/...` 与平台身份
package/README.md CHANGED
@@ -92,6 +92,23 @@ any stage --[user abort via ec-task-close]--> CLOSED
92
92
  并留下当前指纹下的绿色证据,就不算通过。
93
93
  - `MEMORY` 先写入本次任务短期记忆,再执行长期记忆阈值门禁;未超过阈值时长期沉淀为 no-op。
94
94
 
95
+ ## Canonical Dev Spec
96
+
97
+ Harness 可选择性消费 easy-dev-spec 生成的单文件 `easy-dev-spec/v1` Canonical Spec:
98
+
99
+ 1. `ec-workflow` 先只读检查 manifest、仓库、任务 DAG、依赖和 baseline,不创建任务。
100
+ 2. 用户明确选择一个或多个 Spec task;`select-dev-spec-scope` 按仓库提取确定性消费
101
+ 闭包,Harness 不默认导入整份 Spec,也不会读取未选任务正文。
102
+ 3. 一次选择创建一个 Harness task;ANALYSIS 使用最终 producer READY 门禁,并将
103
+ selected task 映射为带 `repo_id`、`source_task_id`、source steps、文件、符号和测试
104
+ 命令的 Unit。
105
+ 4. `hard` 依赖决定执行顺序,冻结的 `contract` 依赖允许并行编码,`integration` 依赖
106
+ 在证据闭合前阻止全链路完成。
107
+
108
+ Canonical Spec 是只读设计源;`.easy-coding/tasks/<task-id>/` 下的 `dev-spec.md`、
109
+ `execution.jsonl` 和 `test-strategy.md` 是绑定来源 SHA-256 的运行时派生物,不会把开发
110
+ 进度写回源 Spec。无 Canonical manifest 的历史 Dev-Spec 继续走原有整文分析流程。
111
+
95
112
  ## Supermodule 模型
96
113
 
97
114
  在包含 `.gitmodules` 的父仓中,Easy Coding Harness 按 git 边界分层运行:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easy-coding-harness",
3
- "version": "0.9.1",
3
+ "version": "0.10.0-beta.0",
4
4
  "description": "CLI scaffold for installing Easy Coding harness files into agent-native directories.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -73,6 +73,21 @@ frozen concrete mode, and any `pending_transition`; `dev-spec.md` is the human-r
73
73
  /`review`/`verify`/`handoff` records). Because plan and log live on disk, not in an agent's
74
74
  context window, a task survives session end and agent switches with zero information loss.
75
75
 
76
+ ## Canonical Spec integration
77
+
78
+ An `easy-dev-spec/v1` Canonical Spec is a read-only design source, not progress storage.
79
+ `inspect-dev-spec` validates the document with the protocol implementation pinned from
80
+ `easy-dev-spec@7eb9b64`; after explicit task selection, `select-dev-spec-scope` returns one
81
+ deterministic producer-compatible closure per repository, and `create-task-from-spec` creates one
82
+ Harness task with the source ID/revision/SHA, selected task IDs, portable repository bindings,
83
+ baseline classifications, and dependency evidence.
84
+
85
+ ANALYSIS derives local `dev-spec.md`, `execution.jsonl`, and `test-strategy.md` for the selected
86
+ consumption closure. Canonical-backed units keep repository, source task/steps, files, symbols,
87
+ and test commands. Hard dependencies shape the Unit DAG, READY contracts can run in parallel,
88
+ and integration dependencies block end-to-end completion until evidence is recorded. The source
89
+ Canonical Spec is never rewritten with Harness runtime state.
90
+
76
91
  ## Memory system
77
92
 
78
93
  Short memory: one schema-v2 file per task, sliding window (max 10, keep 5). Long memory:
@@ -93,9 +108,10 @@ demand.
93
108
  continues. All platform-agnostic artifacts (dev-spec, execution.jsonl, task.json, memory)
94
109
  make cross-agent handoff lossless. `task.json.last_agent` records the last owner so a new
95
110
  agent knows a task was handed off rather than self-interrupted.
96
- Owner identities use platform namespaces. Codex collaboration paths such as `/root` and
97
- `/root/...` normalize to `codex`, so internal Codex delegation is not mistaken for a cross-agent
98
- handoff; existing task files with those paths remain compatible without migration.
111
+ Owner identities use platform namespaces. Codex root identities such as `root`, `/root`, and
112
+ their collaboration subpaths normalize to `codex`, so internal Codex delegation is not mistaken
113
+ for a cross-agent handoff; existing task files with those identities remain compatible without
114
+ migration.
99
115
 
100
116
  Handoff is target-less. The leaving agent writes a `handoff` record with `from`, `stage`,
101
117
  `summary`, and `timestamp`, then releases its session pointer. It does not know or record the
@@ -21,6 +21,24 @@ Communicate with the user in the user's language.
21
21
  4. Inspect concrete code paths and tests. Expand context only when evidence reveals another
22
22
  dependency or risk.
23
23
 
24
+ For a task with `task.json.spec_source`, re-run `inspect-dev-spec` against the stored source and
25
+ every stored `task.repo_paths` repository binding. The schema, spec ID, revision, and SHA-256
26
+ must still match. Then call the read-only selector for the exact stored selection:
27
+
28
+ ```bash
29
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py inspect-dev-spec \
30
+ --spec <stored-source> --repo-path <repo-id>=<stored-path> [--repo-path <repo-id>=<stored-path>]...
31
+
32
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py select-dev-spec-scope \
33
+ --spec <stored-source> --spec-task <selected-task-id> [--spec-task <selected-task-id>]...
34
+ ```
35
+
36
+ Load only the returned per-repository consumption closures: manifest/global context, selected
37
+ task and repository sections, related contracts, direct dependency summaries, selected
38
+ changes/steps/tests, and relevant integration rows. Never replace the selector with a whole-file
39
+ read. `scope-drifted` requires current-code conflict analysis before confirmation;
40
+ `baseline-unavailable` or unresolved repository identity remains blocked in ANALYSIS.
41
+
24
42
  ## Analysis artifacts
25
43
 
26
44
  Copy `.easy-coding/templates/dev-spec-skeleton.md` first, then replace every `[[EC_TODO:...]]`.
@@ -43,11 +61,33 @@ Execution plan records use:
43
61
  "acceptance_criteria": ["observable result"],
44
62
  "test_points": ["targeted check"],
45
63
  "contracts": ["input/output/invariant or none"],
46
- "risks": ["known risk or none"]
64
+ "risks": ["known risk or none"],
65
+ "repo_id": "R1",
66
+ "source_task_id": "R1-T1",
67
+ "source_step_ids": ["S1"],
68
+ "symbols": ["Class#method"],
69
+ "test_commands": ["exact source test command", "optional local command"]
47
70
  }]
48
71
  }
49
72
  ```
50
73
 
74
+ The five source fields are mandatory only for Canonical-backed code units. Default to one unit
75
+ per selected Spec task. A split may cover only one `repo_id` and one `source_task_id`, and all
76
+ units together must cover every source step exactly once. Map selected hard dependencies into
77
+ `depends_on`, contract dependencies into `contracts`, and dependency levels into
78
+ `parallel_groups`.
79
+
80
+ Canonical-backed `dev-spec.md`, `execution.jsonl`, and `test-strategy.md` are runtime-derived
81
+ evidence, not a second maintained Spec. Record the source path/ID/revision/SHA, selected tasks
82
+ and repositories, baseline/conflict result, Unit mapping, source test mapping, and pending
83
+ integration edges.
84
+
85
+ Every source test command remains mandatory. Additional commands from the current repository are
86
+ allowed only when `test-strategy.md` records why the Canonical command alone is insufficient.
87
+ For every selected source test, `test-strategy.md` must spell out its Test ID, source task ID,
88
+ owning Unit ID, repository-relative test file, and exact Canonical command; the state gate checks
89
+ these markers mechanically.
90
+
51
91
  Prefer one coherent unit over artificial file-level splitting. Use parallel only for truly
52
92
  independent write scopes. Better unit contracts reduce later REVIEW rework.
53
93
 
@@ -120,3 +160,5 @@ controls waiting; it never changes the selected execution depth.
120
160
  - No code task with an empty change scope.
121
161
  - No unit without acceptance criteria, test points, contracts, and risks.
122
162
  - No transition without a valid workflow proposal.
163
+ - No Canonical-backed transition with changed source SHA, unresolved repository identity,
164
+ incomplete selected-task coverage, or an open Unit/Step/File/Symbol/Test traceability gap.
@@ -44,6 +44,9 @@ with `.easy-coding/sessions/` always excluded. The CLI already added it to `.git
44
44
  `repo_paths`), the commit/push covers every involved repo. Read `repo_paths` from the
45
45
  current task state to locate each checkout, check changes, and commit/push them as one
46
46
  coherent change set — do not leave a sub-repo behind.
47
+ For Canonical-backed tasks, this set is exactly the repositories referenced by
48
+ `selected_spec_tasks` and resolved in `spec_repositories`; unselected Spec repositories stay
49
+ out of scope.
47
50
  5. **Supermodule two-step commits.** If the current repo has `.gitmodules`, or the current
48
51
  task touches a git submodule path, treat each submodule as an independent git boundary:
49
52
  commit and push child repos first, then commit and push the parent gitlink update. If a
@@ -59,6 +62,7 @@ with `.easy-coding/sessions/` always excluded. The CLI already added it to `.git
59
62
  - Do not commit `spec/dev/` unless the user explicitly asks.
60
63
  - Do not omit managed `easy-coding upgrade` changes merely because they were created outside
61
64
  the current agent turn.
65
+ - Never modify or stage the source Canonical Spec merely to record Harness execution progress.
62
66
  - In a supermodule task launched from the parent root, parent `.easy-coding/` belongs to the
63
67
  parent git. Child `.easy-coding/memory/` changes created by memory archive belong to the
64
68
  owning child git and must be committed before the parent gitlink update.
@@ -60,6 +60,11 @@ Sub-agents never dispatch other sub-agents or read `.easy-coding` workflow asset
60
60
  ## Identity Easy Coding implementation unit
61
61
  ## Workflow Mode {fast|standard|strict}
62
62
  ## Task {unit description}
63
+ ## Source Spec {spec_id@revision + sha256 | NONE}
64
+ ## Source Task {source_task_id | NONE}
65
+ ## Repository {repo_id + resolved repository root | current project}
66
+ ## Source Steps {source_step_ids | NONE}
67
+ ## Symbols {symbols | confirmed local symbols}
63
68
  ## Editable Scope {unit.files | NONE — read-only}
64
69
  ## Acceptance {unit.acceptance_criteria}
65
70
  ## Test Points {unit.test_points and exact targeted commands}
@@ -68,17 +73,23 @@ Sub-agents never dispatch other sub-agents or read `.easy-coding` workflow asset
68
73
  ## Coding Rules {pre-digested RULES sections}
69
74
  ## Architecture {pre-digested ABSTRACT sections}
70
75
  ## Output
71
- changed_files[], summary, deliverable|null, issues[], needs_attention[]
76
+ status:"completed", repo_id|null, source_task_id|null, changed_files[], summary,
77
+ deliverable|null, issues:[], needs_attention:[]
72
78
  ```
73
79
 
74
80
  ## Dispatch and result loop
75
81
 
76
- 1. Append a `dispatch` record before work begins.
82
+ 1. Append a `dispatch` record before work begins. Canonical-backed records include `repo_id` and
83
+ `source_task_id`; resolve every file relative to `task.repo_paths[repo_id]` before dispatch.
77
84
  2. Execute according to dependency order and selected owner.
78
85
  3. Run targeted unit tests and self-audit scope, contracts, TODOs, and introduced warnings.
79
- 4. Append one `result` record. Include unresolved issues rather than hiding them.
86
+ 4. Append one `result` record. Only a successful unit uses `status:"completed"`; include
87
+ unresolved issues rather than hiding them, and do not advance while `issues` or
88
+ `needs_attention` is non-empty.
80
89
  5. If a result changes a cross-unit contract, stop dependent units and return to ANALYSIS.
81
90
  6. For parallel units, detect overlapping writes before advancing.
91
+ 7. If implementation needs a file, symbol, repository, or source step outside the mapped
92
+ Canonical change set, stop and return to ANALYSIS instead of expanding scope implicitly.
82
93
 
83
94
  Do not emit a progress message for every trivial edit. Report at unit boundaries to reduce
84
95
  conversation overhead while keeping work observable.
@@ -14,6 +14,13 @@ Every new code task enters REVIEW. Read-only tasks do not. Obtain the current fi
14
14
  Review the final diff against `dev-spec.md`, RULES, unit acceptance criteria, tests, contracts,
15
15
  and obvious security risks. Every finding cites `file:line`.
16
16
 
17
+ For Canonical-backed tasks, group evidence by `repo_id` and `source_task_id`. Every selected
18
+ Spec task needs an implementation result and source test evidence; file references remain
19
+ repo-relative within the owning repository. Missing or expanded source change/step coverage is
20
+ a blocking correctness finding. Every Canonical review record includes its `repo_id` and
21
+ `source_task_id`; emit at least one current-fingerprint record per selected task and required
22
+ review dimension. A global record without source ownership cannot satisfy the gate.
23
+
17
24
  ## Depth by workflow mode
18
25
 
19
26
  - `fast`: main Agent performs one final-diff self-review across correctness, scope, tests, and
@@ -67,6 +74,8 @@ Fast and Standard normally use `combined`; Strict uses at least two distinct dim
67
74
  "reviewer": "main-or-independent-agent",
68
75
  "implementation_fingerprint": "<state-api value>",
69
76
  "timestamp": "<ISO-8601>",
77
+ "repo_id": "<canonical repo-id; omit for non-Canonical tasks>",
78
+ "source_task_id": "<canonical task-id; omit for non-Canonical tasks>",
70
79
  "findings": []
71
80
  }
72
81
  ```
@@ -18,6 +18,8 @@ Call the state API snapshot and show:
18
18
  - task `concrete_workflow_mode` or ANALYSIS proposal when present;
19
19
  - harness enabled/disabled state;
20
20
  - active and resumable tasks.
21
+ - for Canonical-backed tasks: source Spec ID/revision/SHA, selected task IDs, repository
22
+ bindings/baseline status, and pending dependency evidence.
21
23
 
22
24
  Explain precedence:
23
25
 
@@ -50,3 +52,8 @@ confirmed interaction.
50
52
  Support listing, creating, selecting, claiming, handing off, and closing tasks through the
51
53
  state API. Preserve pending transitions when merely changing approval mode. Never infer user
52
54
  acceptance from opening this panel.
55
+
56
+ When creating from a Canonical Spec, call `inspect-dev-spec`, display the complete task and
57
+ dependency selection, then call `select-dev-spec-scope` and `create-task-from-spec` only after
58
+ explicit user selection. Multiple selected Spec tasks still create one Harness task, while the
59
+ selector returns one deterministic consumption closure per selected repository.
@@ -42,7 +42,9 @@ Append one record per executed check:
42
42
  "passed": true,
43
43
  "implementation_fingerprint": "<state-api value>",
44
44
  "config_fingerprint": "<state-api value>",
45
- "timestamp": "<ISO-8601>"
45
+ "timestamp": "<ISO-8601>",
46
+ "repo_id": "<canonical repo-id; omit for non-Canonical tasks>",
47
+ "source_task_id": "<canonical task-id; omit for non-Canonical tasks>"
46
48
  }
47
49
  ```
48
50
 
@@ -64,5 +66,26 @@ do not append a later synthetic pass without rerunning the failed command.
64
66
  user wait.
65
67
  - A reported in-scope problem returns to IMPLEMENT; out-of-scope work becomes a separate task.
66
68
 
69
+ For Canonical-backed tasks, run each repository's commands from `task.repo_paths[repo_id]` and
70
+ cover every selected task's source test IDs. Report pending integration edges separately from
71
+ local green checks. They do not block local implementation evidence, but the state API blocks
72
+ `VERIFICATION -> MEMORY` until evidence is recorded with `satisfy-spec-dependency`. Never claim
73
+ end-to-end completion while an integration edge remains pending. Every Canonical verify record
74
+ includes the owning `repo_id` and `source_task_id`; duplicate check names in different source
75
+ tasks remain separate evidence records. In `strict`, every involved repository independently
76
+ records all four check types; a repository-specific non-applicable record still needs its reason
77
+ and source ownership.
78
+
79
+ Record the exact integration edge only after its evidence exists:
80
+
81
+ ```bash
82
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py satisfy-spec-dependency \
83
+ --task-id <harness-task-id> \
84
+ --source-task <source-spec-task-id> \
85
+ --spec-task <target-spec-task-id> \
86
+ --evidence "<verifiable evidence>" \
87
+ --agent <agent>
88
+ ```
89
+
67
90
  The state API rejects VERIFICATION -> MEMORY unless all evidence for the current implementation
68
91
  and config fingerprints is green.
@@ -52,7 +52,36 @@ plan decision; Auto continues immediately. Both remove later waiting, not qualit
52
52
  - Present with `status != "COMPLETE"`: invoke `{{skill_trigger}}ec-init`, then stop.
53
53
  - `[easy-coding:upgrade-init-pending:X]`: recommend `{{skill_trigger}}ec-init` for vX
54
54
  adaptation, but allow the user to continue; this reminder is not a workflow block.
55
- 3. Match the user's intent against `current_task` and the active task list before resuming.
55
+ 3. When the user explicitly references a Dev-Spec, run the read-only `inspect-dev-spec` command
56
+ before ordinary task creation. For `protocol=canonical-v1`, show every task ID, repository,
57
+ title, dependency, and baseline status; never select all tasks by default. After the user
58
+ chooses one or more tasks and resolves repository paths or omitted hard-dependency evidence,
59
+ call `create-task-from-spec` once for the complete selection. A document without a Canonical
60
+ manifest remains a legacy ANALYSIS input for an ordinary task. A malformed, DRAFT, or otherwise
61
+ non-READY Canonical Spec stays blocked and must never be downgraded to the legacy route. Never
62
+ edit the source Spec.
63
+
64
+ ```bash
65
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py inspect-dev-spec \
66
+ --spec <path> [--repo-path <repo-id>=<path>]...
67
+
68
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py select-dev-spec-scope \
69
+ --spec <path> --spec-task <task-id> [--spec-task <task-id>]...
70
+
71
+ {{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py create-task-from-spec \
72
+ --spec <path> --spec-task <task-id> [--spec-task <task-id>]... \
73
+ --task-id <harness-task-id> --type <type> --title <title> \
74
+ --repo-path <repo-id>=<path> [--dependency-evidence <dependency-id>=<evidence>]... \
75
+ --agent <agent-id> --session-file <P>
76
+ ```
77
+
78
+ `select-dev-spec-scope` is read-only and may run only after explicit task selection. Its
79
+ per-repository payload is the authoritative ANALYSIS context; do not load unselected task
80
+ bodies from the source document.
81
+
82
+ When multiple selected tasks depend on the same target, disambiguate creation evidence with
83
+ `<source-task-id>-><dependency-task-id>=<evidence>`.
84
+ 4. Match the user's intent against `current_task` and the active task list before resuming.
56
85
  If the user names or clearly matches another task, confirm the switch and call
57
86
  `claim-task --task-id <id> --agent <agent-id> --session-file <P>`. Do not execute task A
58
87
  under task B's request.
@@ -64,10 +93,10 @@ plan decision; Auto continues immediately. Both remove later waiting, not qualit
64
93
  to the requested deliverable. Feature, bugfix, refactor, performance, and workflow changes
65
94
  are code tasks. Use `doc`, `analysis`, or `report` only when the user explicitly requested
66
95
  a no-code deliverable; never downgrade a code request to the read-only completion path.
67
- 4. Resume the matched/current task, then load only state-relevant assets. Do not read five full
96
+ 5. Resume the matched/current task, then load only state-relevant assets. Do not read five full
68
97
  memories at every startup; ANALYSIS searches memory metadata and opens relevant entries on
69
98
  demand.
70
- 5. If another Agent last owned the task, summarize the stored handoff before continuing.
99
+ 6. If another Agent last owned the task, summarize the stored handoff before continuing.
71
100
 
72
101
  ## Stage dispatch
73
102
 
@@ -24,6 +24,13 @@
24
24
  - 需求 vs 现有代码:[[EC_TODO:填写结果或“无冲突”]]
25
25
  - Dev-Spec vs 现有代码:[[EC_TODO:填写结果或“无冲突”]]
26
26
 
27
+ ### Canonical Spec 来源
28
+ - **来源**:[[EC_TODO:非 Canonical 任务写“无”;否则填写 repo-relative path、spec_id、revision、SHA-256]]
29
+ - **选择任务 / 仓库**:[[EC_TODO:非 Canonical 任务写“无”;否则填写 selected task IDs 与 repo IDs]]
30
+ - **消费闭包**:[[EC_TODO:非 Canonical 任务写“无”;否则填写 contracts、direct dependencies、changes、steps、tests 摘要]]
31
+ - **基线与冲突**:[[EC_TODO:非 Canonical 任务写“无”;否则逐仓填写 exact/scope-unchanged/scope-drifted/baseline-unavailable 及处理结论]]
32
+ - **待闭合 integration**:[[EC_TODO:非 Canonical 任务或不存在时写“无”;否则列依赖边和证据要求]]
33
+
27
34
  ### 影响面分析
28
35
  - **涉及模块**:[[EC_TODO:涉及模块]]
29
36
  - **核心类 / 页面 / 接口**:[[EC_TODO:核心类 / 页面 / 接口]]
@@ -49,11 +56,11 @@
49
56
 
50
57
  ### 实施拆解
51
58
 
52
- | 单元 | 说明 | 类型 | 涉及文件 | 依赖 | 验收条件 | 测试点 | 跨单元契约 |
53
- |------|------|------|---------|------|---------|-------|-----------|
54
- | U1 | [[EC_TODO:单元标题]] | [[EC_TODO:backend/frontend/test/...]] | [[EC_TODO:涉及文件]] | — | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证]] | [[EC_TODO:输入输出或“无”]] |
55
- | U2 | [[EC_TODO:单元标题]] | [[EC_TODO:单元类型]] | [[EC_TODO:涉及文件]] | — | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证]] | [[EC_TODO:输入输出或“无”]] |
56
- | U3 | [[EC_TODO:单元标题]] | [[EC_TODO:单元类型]] | [[EC_TODO:涉及文件]] | U1, U2 | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证]] | [[EC_TODO:与 U1/U2 的契约]] |
59
+ | 单元 | 说明 | 类型 | 仓库 / 来源任务 / 步骤 | 涉及文件 / 符号 | 依赖 | 验收条件 | 测试点 / 命令 | 跨单元契约 |
60
+ |------|------|------|----------------------|-----------------|------|---------|---------------|-----------|
61
+ | U1 | [[EC_TODO:单元标题]] | [[EC_TODO:backend/frontend/test/...]] | [[EC_TODO:普通任务写“当前仓库 / 无 / 无”;Canonical 写 repo_id / source_task_id / source_step_ids]] | [[EC_TODO:文件与 symbols]] | — | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证与 test_commands]] | [[EC_TODO:输入输出或“无”]] |
62
+ | U2 | [[EC_TODO:单元标题]] | [[EC_TODO:单元类型]] | [[EC_TODO:仓库 / 来源任务 / 步骤]] | [[EC_TODO:文件与 symbols]] | — | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证与命令]] | [[EC_TODO:输入输出或“无”]] |
63
+ | U3 | [[EC_TODO:单元标题]] | [[EC_TODO:单元类型]] | [[EC_TODO:仓库 / 来源任务 / 步骤]] | [[EC_TODO:文件与 symbols]] | U1, U2 | [[EC_TODO:可验证结果]] | [[EC_TODO:定向验证与命令]] | [[EC_TODO:与 U1/U2 的契约]] |
57
64
 
58
65
  **执行策略**:[[EC_TODO:parallel / sequential / single]]
59
66
  - 第一批(并行):U1 [[EC_TODO:单元标题]] | U2 [[EC_TODO:单元标题]]