diff --git a/.gitea/issue_template/task.md b/.gitea/issue_template/task.md index 63589ce..035b720 100644 --- a/.gitea/issue_template/task.md +++ b/.gitea/issue_template/task.md @@ -5,6 +5,12 @@ - 所属 MVP / 版本:# - 阶段: +## 依赖与并行 + +- 前置工单:无 / #编号 +- 是否允许与前置工单并行:是 / 否 +- 原因: + ## 要解决什么 diff --git a/AGENTS.md b/AGENTS.md index 4e6f7c8..09ace88 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,10 +33,11 @@ 2. 给出目标、非目标、方案、影响范围、风险、回退方式、验证方法和文档影响。 3. 方案没有得到用户明确确认前,只做只读诊断和方案整理,不实施正式代码。 4. 方案确认后,先建立单元任务工单,再修改代码。 -5. 开始实施前检查分支和工作区,明确哪些现有改动不属于本任务。 -6. 严格按工单范围实现;新发现的问题先记录,不顺手混入当前任务。 -7. 执行与风险相称的测试,把关键结果和未验证部分更新到工单。 -8. 长期文档必须先修改 Wiki、读取确认,再运行 `python dev_scripts/sync_wiki_docs.py` 导出本地镜像;不得直接编辑 `docs/` 后反向覆盖 Wiki。 +5. 建立新工单不要求其他工单已经完成;开始实施前检查工单声明的前置工单。真实依赖未满足时保持“待实施”,允许并行时必须写明原因。 +6. 开始实施前检查分支和工作区,明确哪些现有改动不属于本任务。 +7. 严格按工单范围实现;新发现的问题先记录,不顺手混入当前任务。 +8. 执行与风险相称的测试,把关键结果和未验证部分更新到工单。实施过程中出现计划外、当前无法解除的问题时才标记“阻塞”。 +9. 长期文档必须先修改 Wiki、读取确认,再运行 `python dev_scripts/sync_wiki_docs.py` 导出本地镜像;不得直接编辑 `docs/` 后反向覆盖 Wiki。 Gitea 不可用时,输出完整工单草稿并说明阻塞。未经用户明确授权,不得默认绕过建单。 diff --git a/dev_scripts/check_harness.py b/dev_scripts/check_harness.py index 13a9676..d24c520 100644 --- a/dev_scripts/check_harness.py +++ b/dev_scripts/check_harness.py @@ -161,6 +161,10 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None: return content = path.read_text(encoding="utf-8") required = ( + "## 依赖与并行", + "- 前置工单:无 / #编号", + "- 是否允许与前置工单并行:是 / 否", + "- 原因:", "## 文档影响", "- [ ] 不影响长期文档,原因:", "- [ ] 更新架构与代码地图", diff --git a/docs/01-workflow.md b/docs/01-workflow.md index 373acbb..bbeb3ac 100644 --- a/docs/01-workflow.md +++ b/docs/01-workflow.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Development-Workflow wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Development-Workflow.- -wiki_revision: d00ceed847becc95439296f618bd8a461c0a4c0f -synchronized_at: 2026-08-08T01:36:38Z +wiki_revision: dcef8c85c6c99d4ff2ce4678736092479b505794 +synchronized_at: 2026-08-09T16:28:05Z # 开发工作流 @@ -37,6 +37,23 @@ synchronized_at: 2026-08-08T01:36:38Z 每个单元任务都应目标单一,能够独立测试、提交和回退。 +#### 依赖与并行 + +建立新工单不要求其他工单已经完成,也不按工单编号限制实施顺序。每个单元任务必须声明: + +- 前置工单,没有时填写“无”; +- 是否允许与未完成的前置工单并行; +- 判断可以或不可以并行的原因。 + +开始修改前,Agent 检查工单声明的前置工单: + +- 没有前置工单,或前置工单已经完成,可以进入“进行中”; +- 前置工单未完成且存在实际依赖时,不得开始实施,工单保持“待实施”; +- 与前置工单没有实施冲突、允许并行时,可以进入“进行中”,但必须在工单写明原因; +- 已经进入实施后出现计划外、当前无法解除的问题,才使用“阻塞”。 + +依赖不改变单元任务边界。依赖满足后,该任务仍须拥有独立的范围、提交、测试和回退方式。 + ### 3. 实施 Agent 检查分支和工作区,只修改工单范围内的文件。发现新问题时先记录到工单;如果不影响当前验收,则另建工单,不扩大当前任务。 diff --git a/docs/03-business-rules-and-glossary.md b/docs/03-business-rules-and-glossary.md index 45c3966..1f5f449 100644 --- a/docs/03-business-rules-and-glossary.md +++ b/docs/03-business-rules-and-glossary.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Business-Rules-and-Glossary wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Business-Rules-and-Glossary.- -wiki_revision: 7534fd60157096dab2c6f06214acfff84d1a5370 -synchronized_at: 2026-08-08T00:58:06Z +wiki_revision: 82bb04c1bf6a703568218664a652b5192055f072 +synchronized_at: 2026-08-09T16:28:11Z # 业务规则与术语 @@ -30,9 +30,9 @@ synchronized_at: 2026-08-08T00:58:06Z | 状态 | 含义 | 可以进入下一状态的条件 | |---|---|---| | 待确认 | 目标或方案仍需用户选择 | 用户明确确认方案 | -| 待实施 | 方案已确认,尚未修改 | 工作区和范围检查完成 | +| 待实施 | 方案已确认但尚未修改,或真实前置依赖尚未满足 | 前置依赖已满足或明确允许并行,且工作区和范围检查完成 | | 进行中 | 正在实现、测试或同步文档 | 验收标准逐项检查完成 | -| 阻塞 | 满足规则定义的持续阻塞条件 | 阻塞解除并更新工单 | +| 阻塞 | 实施过程中出现计划外、当前无法解除的问题 | 阻塞解除并更新工单 | | 待验收 | 代码、测试、归档和证据已完成 | 用户明确验收 | | 已完成 | 用户已验收并完成父任务同步 | 无 | @@ -40,6 +40,8 @@ synchronized_at: 2026-08-08T00:58:06Z - 没有确认方案和单元任务工单,不修改产品行为。 - 一个单元任务只解决一个可独立验证和回退的问题。 +- 建立后续工单不要求已有工单全部完成;实施前必须检查工单声明的前置依赖。 +- 前置工单未完成且存在实际依赖时保持“待实施”;允许并行时必须写明原因。 - 需求、接口、数据、安全边界或验收标准变化时先更新工单。 - 长期文档必须先修改 Wiki,再导出本地镜像。 - 测试结果必须真实;未执行的验证必须明确记录。 diff --git a/tests/test_harness_docs.py b/tests/test_harness_docs.py index c0c7374..4ec2347 100644 --- a/tests/test_harness_docs.py +++ b/tests/test_harness_docs.py @@ -57,6 +57,24 @@ class TaskTemplateTests(unittest.TestCase): check_task_template(errors) self.assertEqual(errors, []) + def test_task_template_requires_dependency_fields(self) -> None: + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + template = root / ".gitea" / "issue_template" / "task.md" + template.parent.mkdir(parents=True) + template.write_text( + "## 文档影响\n" + "- [ ] 不影响长期文档,原因:\n" + "- [ ] 更新架构与代码地图\n" + "- [ ] 更新业务规则与术语\n" + "- [ ] 更新常见修改或故障排查\n", + encoding="utf-8", + ) + errors: list[str] = [] + check_task_template(errors, root) + self.assertIn("单元任务模板缺少:## 依赖与并行", errors) + self.assertIn("单元任务模板缺少:- 前置工单:无 / #编号", errors) + class AgentRuleTests(unittest.TestCase): def test_agent_efficiency_sections_are_required(self) -> None: