Connect long-term plans to task completion

Why: preserve project direction across tasks and require grounded next-task recommendations.

Evidence: the generated task-card regression fails before the template update and passes afterward; original SELF receipts are in the task card.

Impact: document the planning entrypoint and extend task records without granting new-task execution rights.

Refs: .task/feature-goal-continuity.md; policy/delivery.md
This commit is contained in:
2026-10-07 06:10:51 +00:00
parent 78ab913652
commit 908504e8b5
7 changed files with 179 additions and 11 deletions
File diff suppressed because one or more lines are too long
+7
View File
@@ -4,6 +4,13 @@
- 组合:modules/{core,backend,frontend,ui,documents} + deps/{development-guidelines,agent-native,agent-squad,agent-intent,agent-command,error-code-system,logging-system}。
- 部署:非容器;Releases 仓从本仓固定提交导出版本。
## 方向与规划入口
长期方向、目标及跨任务规划沿用过程仓的 [方案与规划目录](modules/documents/docs/proposals/)。
确立或调整具体方向时,在本入口维护其主记录链接;正文、确认依据和进展仍以该主记录为准。
目录中的既有文档不因被收录而自动成为已批准规划。记录、任务关联及收尾建议按
[交付规范的长期方向与任务衔接](policy/delivery.md#长期方向与任务衔接) 执行。
## 验证
`make test` 先核对子模块工作树与固定指针,再运行治理脚本、公开边界、跨仓指针、库及各模块
+1 -1
View File
@@ -16,7 +16,7 @@
| standards/verification.md | 验收 | 本地 make test-governance + 组合测试;当前证据与历史 scratch 记录分开 |
| standards/multi-repo.md | 跨仓/gitlink | manual;受控历史迁移通道已于 2026-09-30 行使一次(documents/records/2026-09-30-history-migration.md) |
| 工作区回收 | 交付终点 | advisory(task-finish);负例:合入前 finish 拒绝输出 |
| policy/delivery.md(项目收紧) | 需求、试验、实施迭代及交付 | manual:人工评审和有范围的连续推进授权;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py |
| policy/delivery.md(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | manual:人工评审和有范围的连续推进授权;方向主记录及任务收尾建议;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py |
| standards/tool-adaptation.md(draft.8) | 为工具创建规则/钩子实例 | 本组合 CLI/git 级实例已登记:policy/tool-adaptation-matrix.md(A1–A7 逐行定级+正负例证据) |
| 同上(zcode 实例) | zcode 客户端写路径 | policy/tool-adaptation-zcode.md:PreToolUse 写守卫;脚本负例与客户端接线分开,客户端 pending-live |
| core/baseline.md「规范层级」+ documentation.md「记忆分层/机制化」(draft.9) | 层级效力、记忆权威、经验机制化 | manual:本仓 policy/ 仅收紧不放宽;记忆四层按条文执行(任务卡=任务记忆,documents/records=项目记忆,Dev 仓 AGENTS.md 指针已就位) |
+32 -1
View File
@@ -36,12 +36,43 @@
| 7 正式测试与验收 | 需求到证据映射;正常、异常、边界、回归结果及缺项 | 人工审阅当前候选的验证结果;正式验收前同步并固定被测对象 |
| 8 代码 Review | 需求符合性、正确性、维护性、测试充分性及问题闭合记录 | 完成必要重放、整改、补测和复审,由有权评审者放行当前版本 |
| 9 合入 | 最新 base/head、必要检查及评审、冲突处置、合入授权 | 合入前再次同步核验;经 PR 合入后取得真实合入结果 |
| 10 合入核验与收口 | 实际合入内容及组件版本、验证依据、成果保存位置、写者状态、清理清单与任务归档安排 | 清理前取得人工批准或对应连续推进授权;安全回收后核对结果、闭合任务卡 |
| 10 合入核验与收口 | 实际合入内容及组件版本、验证依据、成果保存位置、写者状态、清理清单、任务归档安排及适用规划的进展与下一步建议 | 清理前取得人工批准或对应连续推进授权;安全回收后核对结果、闭合任务卡 |
表中的人工节点仅在明确的连续推进授权范围内按授权执行;阶段产物及验证条件保留。
正式测试和最终 Review 的顺序不限制设计阶段试验、实施期测试或提前审阅。
文本合并无冲突不证明组合兼容;合入后仍核验真实内容与被测候选是否一致。
## 长期方向与任务衔接
用户提出大方向、长期目标或跨任务规划时,必须在项目中留存可接续的主记录,不能仅保留
在聊天、IDE 私有计划或执行者记忆中。优先更新已有相关规划;确需新文档时,沿用
过程仓的 `modules/documents/docs/proposals/`,并在 [项目入口](../PROJECT.md) 提供链接。
正文只维护一处,任务卡和其他入口引用文档及版本,不复制另一份规划状态。
主记录至少包括:目标及背景、范围及成功标准、阶段或里程碑、关联方案和任务、来源、
负责人、确认状态、推进状态及更新时间。只有方向时可以先写简短目标记录,未知项标待定。
未确认的想法标“待确认”;确认依据与版本另记,不能由“已记录”推断“已批准”。
方向、范围或优先级调整时保留原决定、变更原因及批准依据,更新受影响的方案和任务引用。
启动或恢复相关任务时,先读取适用方向及规划的当前有效版本,核对本任务所属里程碑、
已有实现和在途任务。多个规划相互冲突或优先级不明时,记录冲突并提交人工决定,
不凭文档标题、日期或本地旧副本擅自选择权威。
任务完成时,如果存在适用方案或规划,必须依据实际结果更新其进展,并在任务主记录和
最终交付说明中给出下一步任务建议:
- 说明本任务推进了哪个目标或里程碑,以及剩余差距;区分已实现、已验证、已合入和已部署。
- 优先推荐一个下一任务,说明要解决的问题、关联规划及版本、推荐理由和优先顺序依据。
- 写明前置条件、依赖、待确认事项、预期产物和可判定验收条件;必要时补充备选及取舍。
- 建议前核对已有或在途任务;已有任务覆盖时引用该任务及待续办内容,避免重复安排。
- 无适用规划或规划已经完成时如实说明;存在阻塞时列出阻塞条件,优先建议澄清、验证假设
或解除阻塞的任务,不为凑出下一步虚构工作。
进展更新和建议属于当前任务的收尾产物。跨仓更新遵循对应工作区、版本和评审要求;
更新尚未获批或合入时,任务卡保留待更新内容、负责人和下一动作,不能声称原规划已更新。
**下一步建议不等于启动授权**:没有覆盖该任务的明确授权,建议停留在待确认状态;
当前任务的完成、批准或连续推进授权不自动扩展到新任务。
## 需求表与追溯
需求表以任务卡为主记录。项目符合度使用“符合 / 需调整后符合 / 不符合 / 待核实”,
+1
View File
@@ -15,6 +15,7 @@
| A6 秘密 | 本地脱敏及 CI 获取边界;权限与宿主隔离另验 | 命令/输出/摘要脱敏,凭据不持久写 Git 配置 | `tests/test_evidence.py`、`tests/test_ci_credentials.py` |
| A7 证据 | 本地 SELF 收据;外部来源独立核验 | 首次捕获、完整脱敏输出/摘要、对象记录、原样导入 | `tests/test_evidence.py`;CI/审阅链接另核 |
| A8 阶段评审与迭代 | manual;模板和提示不构成批准身份校验或全流程阻断 | policy/delivery.md;任务卡记录需求、方案/计划、评审与试验迭代;post-merge 默认仅提示 | `tests/test_task.py` 核对模板及钩子不自动写入;人工核对批准范围和版本 |
| A9 长期方向与后续任务 | manual;模板不校验规划有效性或自动调度任务 | policy/delivery.md;PROJECT.md 提供规划入口,任务卡关联规划/里程碑并记录下一步建议 | `tests/test_task.py` 核对生成字段与未授权默认值;人工核对当前规划、进展、重复任务和建议依据 |
## 失败处理
+16
View File
@@ -187,6 +187,12 @@ ${parent_note}
<预期结果、受影响入口/模块/契约;明确不做什么。>
## 关联方向与规划
- 适用状态:待核对(无适用规划时说明原因)
- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文)
- 对应里程碑:待核对
## 需求分析
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
@@ -238,6 +244,16 @@ ${parent_note}
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 规划进展与下一步
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
- 推荐依据:待填写
- 前置条件/待确认:待核对
- 预期产物/验收条件:待定义
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
## 合入与清理
- 合入记录:NOT_RUN(授权依据、PR、合入 SHA、验证来源)
+17
View File
@@ -607,6 +607,13 @@ class TaskLifecycleTests(unittest.TestCase):
self.assertIn(f"{field}:无", card)
for field in ("当前阶段", "当前增量", "方案引用", "实施计划引用", "测试计划引用"):
self.assertIn(field + ":", card)
self.assertIn("## 关联方向与规划\n", card)
planning = card.split("## 关联方向与规划\n", 1)[1].split("\n## ", 1)[0]
for field in ("适用状态", "主记录路径/版本", "对应里程碑"):
self.assertIn(field + ":待核对", planning)
self.assertIn("无适用规划时说明原因", planning)
self.assertIn("路径按仓库根目录定位,归档后不变", planning)
self.assertIn("只引用唯一正文", planning)
self.assertIn("| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |", card)
reviews = card.split("## 阶段评审\n", 1)[1].split("\n## ", 1)[0]
self.assertIn("| 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 |", reviews)
@@ -618,6 +625,16 @@ class TaskLifecycleTests(unittest.TestCase):
self.assertIn("## 探索试验与迭代", card)
for field in ("假设", "范围", "判断和停止条件", "批准依据", "结果", "变更影响", "需重审补测"):
self.assertIn(field, card.split("## 探索试验与迭代\n", 1)[1].split("\n## ", 1)[0])
self.assertIn("## 规划进展与下一步\n", card)
next_step = card.split("## 规划进展与下一步\n", 1)[1].split("\n## ", 1)[0]
for field in ("本次推进/剩余", "首选下一任务", "前置条件/待确认", "重复任务核对"):
self.assertIn(field + ":待核对", next_step)
self.assertIn("推荐依据:待填写", next_step)
self.assertIn("预期产物/验收条件:待定义", next_step)
self.assertIn("无适用规划、已完成或受阻时如实说明,不虚构任务", next_step)
self.assertIn("已有/在途任务、PR 与规划记录", next_step)
self.assertIn("启动授权:未授权", next_step)
self.assertIn("建议不自动启动新任务,仍须明确授权", next_step)
self.assertIn("## 合入与清理", card)
for field in ("合入记录", "清理记录"):
self.assertIn(field + ":NOT_RUN", card)