feat: 增加最小工单依赖规则 (#8)
This commit is contained in:
@@ -5,6 +5,12 @@
|
|||||||
- 所属 MVP / 版本:#
|
- 所属 MVP / 版本:#
|
||||||
- 阶段:
|
- 阶段:
|
||||||
|
|
||||||
|
## 依赖与并行
|
||||||
|
|
||||||
|
- 前置工单:无 / #编号
|
||||||
|
- 是否允许与前置工单并行:是 / 否
|
||||||
|
- 原因:
|
||||||
|
|
||||||
## 要解决什么
|
## 要解决什么
|
||||||
|
|
||||||
<!-- 描述现状和目标。缺陷需要写清复现步骤、实际结果和期望结果。 -->
|
<!-- 描述现状和目标。缺陷需要写清复现步骤、实际结果和期望结果。 -->
|
||||||
|
|||||||
@@ -33,10 +33,11 @@
|
|||||||
2. 给出目标、非目标、方案、影响范围、风险、回退方式、验证方法和文档影响。
|
2. 给出目标、非目标、方案、影响范围、风险、回退方式、验证方法和文档影响。
|
||||||
3. 方案没有得到用户明确确认前,只做只读诊断和方案整理,不实施正式代码。
|
3. 方案没有得到用户明确确认前,只做只读诊断和方案整理,不实施正式代码。
|
||||||
4. 方案确认后,先建立单元任务工单,再修改代码。
|
4. 方案确认后,先建立单元任务工单,再修改代码。
|
||||||
5. 开始实施前检查分支和工作区,明确哪些现有改动不属于本任务。
|
5. 建立新工单不要求其他工单已经完成;开始实施前检查工单声明的前置工单。真实依赖未满足时保持“待实施”,允许并行时必须写明原因。
|
||||||
6. 严格按工单范围实现;新发现的问题先记录,不顺手混入当前任务。
|
6. 开始实施前检查分支和工作区,明确哪些现有改动不属于本任务。
|
||||||
7. 执行与风险相称的测试,把关键结果和未验证部分更新到工单。
|
7. 严格按工单范围实现;新发现的问题先记录,不顺手混入当前任务。
|
||||||
8. 长期文档必须先修改 Wiki、读取确认,再运行 `python dev_scripts/sync_wiki_docs.py` 导出本地镜像;不得直接编辑 `docs/` 后反向覆盖 Wiki。
|
8. 执行与风险相称的测试,把关键结果和未验证部分更新到工单。实施过程中出现计划外、当前无法解除的问题时才标记“阻塞”。
|
||||||
|
9. 长期文档必须先修改 Wiki、读取确认,再运行 `python dev_scripts/sync_wiki_docs.py` 导出本地镜像;不得直接编辑 `docs/` 后反向覆盖 Wiki。
|
||||||
|
|
||||||
Gitea 不可用时,输出完整工单草稿并说明阻塞。未经用户明确授权,不得默认绕过建单。
|
Gitea 不可用时,输出完整工单草稿并说明阻塞。未经用户明确授权,不得默认绕过建单。
|
||||||
|
|
||||||
|
|||||||
@@ -161,6 +161,10 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
|
|||||||
return
|
return
|
||||||
content = path.read_text(encoding="utf-8")
|
content = path.read_text(encoding="utf-8")
|
||||||
required = (
|
required = (
|
||||||
|
"## 依赖与并行",
|
||||||
|
"- 前置工单:无 / #编号",
|
||||||
|
"- 是否允许与前置工单并行:是 / 否",
|
||||||
|
"- 原因:",
|
||||||
"## 文档影响",
|
"## 文档影响",
|
||||||
"- [ ] 不影响长期文档,原因:",
|
"- [ ] 不影响长期文档,原因:",
|
||||||
"- [ ] 更新架构与代码地图",
|
"- [ ] 更新架构与代码地图",
|
||||||
|
|||||||
+19
-2
@@ -2,8 +2,8 @@
|
|||||||
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
|
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
|
||||||
wiki_page: Development-Workflow
|
wiki_page: Development-Workflow
|
||||||
wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Development-Workflow.-
|
wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Development-Workflow.-
|
||||||
wiki_revision: d00ceed847becc95439296f618bd8a461c0a4c0f
|
wiki_revision: dcef8c85c6c99d4ff2ce4678736092479b505794
|
||||||
synchronized_at: 2026-08-08T01:36:38Z
|
synchronized_at: 2026-08-09T16:28:05Z
|
||||||
<!-- gitea-wiki-mirror:end -->
|
<!-- gitea-wiki-mirror:end -->
|
||||||
|
|
||||||
# 开发工作流
|
# 开发工作流
|
||||||
@@ -37,6 +37,23 @@ synchronized_at: 2026-08-08T01:36:38Z
|
|||||||
|
|
||||||
每个单元任务都应目标单一,能够独立测试、提交和回退。
|
每个单元任务都应目标单一,能够独立测试、提交和回退。
|
||||||
|
|
||||||
|
#### 依赖与并行
|
||||||
|
|
||||||
|
建立新工单不要求其他工单已经完成,也不按工单编号限制实施顺序。每个单元任务必须声明:
|
||||||
|
|
||||||
|
- 前置工单,没有时填写“无”;
|
||||||
|
- 是否允许与未完成的前置工单并行;
|
||||||
|
- 判断可以或不可以并行的原因。
|
||||||
|
|
||||||
|
开始修改前,Agent 检查工单声明的前置工单:
|
||||||
|
|
||||||
|
- 没有前置工单,或前置工单已经完成,可以进入“进行中”;
|
||||||
|
- 前置工单未完成且存在实际依赖时,不得开始实施,工单保持“待实施”;
|
||||||
|
- 与前置工单没有实施冲突、允许并行时,可以进入“进行中”,但必须在工单写明原因;
|
||||||
|
- 已经进入实施后出现计划外、当前无法解除的问题,才使用“阻塞”。
|
||||||
|
|
||||||
|
依赖不改变单元任务边界。依赖满足后,该任务仍须拥有独立的范围、提交、测试和回退方式。
|
||||||
|
|
||||||
### 3. 实施
|
### 3. 实施
|
||||||
|
|
||||||
Agent 检查分支和工作区,只修改工单范围内的文件。发现新问题时先记录到工单;如果不影响当前验收,则另建工单,不扩大当前任务。
|
Agent 检查分支和工作区,只修改工单范围内的文件。发现新问题时先记录到工单;如果不影响当前验收,则另建工单,不扩大当前任务。
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
|
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
|
||||||
wiki_page: Business-Rules-and-Glossary
|
wiki_page: Business-Rules-and-Glossary
|
||||||
wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Business-Rules-and-Glossary.-
|
wiki_url: http://ilaer.eicp.net:8418/opc/dev_harness/wiki/Business-Rules-and-Glossary.-
|
||||||
wiki_revision: 7534fd60157096dab2c6f06214acfff84d1a5370
|
wiki_revision: 82bb04c1bf6a703568218664a652b5192055f072
|
||||||
synchronized_at: 2026-08-08T00:58:06Z
|
synchronized_at: 2026-08-09T16:28:11Z
|
||||||
<!-- gitea-wiki-mirror:end -->
|
<!-- 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,再导出本地镜像。
|
- 长期文档必须先修改 Wiki,再导出本地镜像。
|
||||||
- 测试结果必须真实;未执行的验证必须明确记录。
|
- 测试结果必须真实;未执行的验证必须明确记录。
|
||||||
|
|||||||
@@ -57,6 +57,24 @@ class TaskTemplateTests(unittest.TestCase):
|
|||||||
check_task_template(errors)
|
check_task_template(errors)
|
||||||
self.assertEqual(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):
|
class AgentRuleTests(unittest.TestCase):
|
||||||
def test_agent_efficiency_sections_are_required(self) -> None:
|
def test_agent_efficiency_sections_are_required(self) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user