feat: 增加最小工单依赖规则 (#8)
This commit is contained in:
@@ -5,6 +5,12 @@
|
||||
- 所属 MVP / 版本:#
|
||||
- 阶段:
|
||||
|
||||
## 依赖与并行
|
||||
|
||||
- 前置工单:无 / #编号
|
||||
- 是否允许与前置工单并行:是 / 否
|
||||
- 原因:
|
||||
|
||||
## 要解决什么
|
||||
|
||||
<!-- 描述现状和目标。缺陷需要写清复现步骤、实际结果和期望结果。 -->
|
||||
|
||||
@@ -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 不可用时,输出完整工单草稿并说明阻塞。未经用户明确授权,不得默认绕过建单。
|
||||
|
||||
|
||||
@@ -161,6 +161,10 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
|
||||
return
|
||||
content = path.read_text(encoding="utf-8")
|
||||
required = (
|
||||
"## 依赖与并行",
|
||||
"- 前置工单:无 / #编号",
|
||||
"- 是否允许与前置工单并行:是 / 否",
|
||||
"- 原因:",
|
||||
"## 文档影响",
|
||||
"- [ ] 不影响长期文档,原因:",
|
||||
"- [ ] 更新架构与代码地图",
|
||||
|
||||
+19
-2
@@ -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
|
||||
<!-- gitea-wiki-mirror:end -->
|
||||
|
||||
# 开发工作流
|
||||
@@ -37,6 +37,23 @@ synchronized_at: 2026-08-08T01:36:38Z
|
||||
|
||||
每个单元任务都应目标单一,能够独立测试、提交和回退。
|
||||
|
||||
#### 依赖与并行
|
||||
|
||||
建立新工单不要求其他工单已经完成,也不按工单编号限制实施顺序。每个单元任务必须声明:
|
||||
|
||||
- 前置工单,没有时填写“无”;
|
||||
- 是否允许与未完成的前置工单并行;
|
||||
- 判断可以或不可以并行的原因。
|
||||
|
||||
开始修改前,Agent 检查工单声明的前置工单:
|
||||
|
||||
- 没有前置工单,或前置工单已经完成,可以进入“进行中”;
|
||||
- 前置工单未完成且存在实际依赖时,不得开始实施,工单保持“待实施”;
|
||||
- 与前置工单没有实施冲突、允许并行时,可以进入“进行中”,但必须在工单写明原因;
|
||||
- 已经进入实施后出现计划外、当前无法解除的问题,才使用“阻塞”。
|
||||
|
||||
依赖不改变单元任务边界。依赖满足后,该任务仍须拥有独立的范围、提交、测试和回退方式。
|
||||
|
||||
### 3. 实施
|
||||
|
||||
Agent 检查分支和工作区,只修改工单范围内的文件。发现新问题时先记录到工单;如果不影响当前验收,则另建工单,不扩大当前任务。
|
||||
|
||||
@@ -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
|
||||
<!-- gitea-wiki-mirror:end -->
|
||||
|
||||
# 业务规则与术语
|
||||
@@ -30,9 +30,9 @@ synchronized_at: 2026-08-08T00:58:06Z
|
||||
| 状态 | 含义 | 可以进入下一状态的条件 |
|
||||
|---|---|---|
|
||||
| 待确认 | 目标或方案仍需用户选择 | 用户明确确认方案 |
|
||||
| 待实施 | 方案已确认,尚未修改 | 工作区和范围检查完成 |
|
||||
| 待实施 | 方案已确认但尚未修改,或真实前置依赖尚未满足 | 前置依赖已满足或明确允许并行,且工作区和范围检查完成 |
|
||||
| 进行中 | 正在实现、测试或同步文档 | 验收标准逐项检查完成 |
|
||||
| 阻塞 | 满足规则定义的持续阻塞条件 | 阻塞解除并更新工单 |
|
||||
| 阻塞 | 实施过程中出现计划外、当前无法解除的问题 | 阻塞解除并更新工单 |
|
||||
| 待验收 | 代码、测试、归档和证据已完成 | 用户明确验收 |
|
||||
| 已完成 | 用户已验收并完成父任务同步 | 无 |
|
||||
|
||||
@@ -40,6 +40,8 @@ synchronized_at: 2026-08-08T00:58:06Z
|
||||
|
||||
- 没有确认方案和单元任务工单,不修改产品行为。
|
||||
- 一个单元任务只解决一个可独立验证和回退的问题。
|
||||
- 建立后续工单不要求已有工单全部完成;实施前必须检查工单声明的前置依赖。
|
||||
- 前置工单未完成且存在实际依赖时保持“待实施”;允许并行时必须写明原因。
|
||||
- 需求、接口、数据、安全边界或验收标准变化时先更新工单。
|
||||
- 长期文档必须先修改 Wiki,再导出本地镜像。
|
||||
- 测试结果必须真实;未执行的验证必须明确记录。
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user