From d79d6c17e9f7827a4b2d84078fd4c78eba83fe99 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 17:10:20 +0000 Subject: [PATCH] Require Cursor for every implementation unit Why: Ensure implementation authorship is delegated per unit while the primary model remains responsible for planning and delivery management. Evidence: The focused task-card generation regression went red then green, and git diff --check passed. Impact: Every repository-writing implementation unit gets a fresh Cursor CLI run; unavailable or failed Cursor work is recorded as a blocker instead of being silently implemented by the primary model. Refs: .task/feature-goal-first-delivery.md --- AGENTS.md | 13 +++++++++++++ policy/adoption.md | 2 +- policy/delivery.md | 20 ++++++++++++++++++++ policy/governance.md | 6 ++++-- policy/tool-adaptation-matrix.md | 2 +- scripts/task.sh | 9 +++++++++ tests/test_task.py | 13 +++++++++++++ 7 files changed, 61 insertions(+), 4 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f7c21607..47c180c3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,6 +20,19 @@ policy/delivery.md。 - 先实现端到端可用和可验证的最小闭环,再将体验、结构、性能及治理优化作为独立增量迭代;非阻塞 Review 意见不得阻止当前目标交付。 +## 实施角色拆分(强制) + +- 产生仓库变更的实施按可独立实施的单元拆分;**每个实施单元启动一次新的 Cursor CLI 进程/运行**, + 不得跨单元复用同一 Cursor 进程。 +- 主模型(host)可计划、拆解、调度、强制范围、检查/审阅 diff、运行权威验证、集成/提交、管理 + PR/CI/合入、写入证据与任务管理元数据,并做安全清理;**不得直接撰写实施变更**。 +- 每个 Cursor worker 只接收一个有界单元:不得扩围、提交、推送、开或合 PR、派遣同伴、改路由/模型、 + 部署或清理 worktree。 +- Cursor CLI 不可用或无法完成该单元时,停止该单元并在任务卡记录 blocker;不得静默把实施交回主模型代写。 +- 规划、只读调查、证据捕获、控制器/任务卡元数据与集成操作属 host 管理工作,不递归再开 Cursor 实施单元。 +- 细则见 [policy/delivery.md](policy/delivery.md);不削弱已生效的 goal-first、严格范围、先可用、 + 独立 Review、证据、平台准入与高后果双钥匙规则。 + ## UI 设计门禁(强制) - 本仓一切界面生成/修改**先读根目录 `DESIGN.md`**(四原则:美观、现代、简洁、易用), diff --git a/policy/adoption.md b/policy/adoption.md index 7764c29c..87764015 100644 --- a/policy/adoption.md +++ b/policy/adoption.md @@ -18,7 +18,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(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | goal-first:目标/范围/终点一次确认,范围内智能体连续完成实施、验证、Review、合入和安全收口;仅真实决策点需人工;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py | +| policy/delivery.md(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | goal-first:目标/范围/终点一次确认,范围内连续推进验证、Review、合入和安全收口;实施写入按 cursor-per-unit(一单元一新 Cursor CLI;主模型不直接写实施变更;不可用则记 blocker);仅真实决策点需人工;任务卡提供记录,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 指针已就位) | diff --git a/policy/delivery.md b/policy/delivery.md index 01b586c4..60cdc1b2 100644 --- a/policy/delivery.md +++ b/policy/delivery.md @@ -28,6 +28,26 @@ 需求拆解、评估、方案和计划可以共用一份任务卡。小任务只记录目标、范围、验收、关键决定和验证; 不适用的阶段标记原因后直接跳过。任务启动检查、独立工作区和收据用于准备现场,不表示业务结果已验证。 +## Cursor 实施单元与主模型职责 + +产生仓库变更的实施工作拆成可独立实施的单元。任务卡默认记 `实施执行:cursor-per-unit`: +**每个实施单元对应一次全新的 Cursor CLI 进程/运行**;不得复用已有 Cursor 进程处理另一单元。 + +主模型(host)负责计划、拆解、调度、强制范围、检查与审阅 diff、运行权威验证、集成与提交、 +管理 PR/CI/合入、写入证据与任务管理元数据,以及安全清理。主模型**不得直接撰写实施变更**。 +权威验证、集成、合入与任务卡证据所有权属于 host;worker 的局部自检不能替代任务卡证据、 +独立 Review、当前 HEAD 的 CI 与平台准入。 + +每个 Cursor worker 只接收一个有界单元。Worker 不得扩围、提交、推送、打开或合并 PR、 +派遣同伴、改变路由或模型、部署,或清理 worktree。 + +若 Cursor CLI 不可用或无法完成该单元,停止该单元,并在任务卡「Cursor 实施收据」记录 blocker; +不得静默把实施交回主模型代写。规划、只读调查、证据捕获、控制器/任务卡元数据与集成操作 +属于 host 管理工作,不递归创建另一 Cursor 实施单元。 + +本条不重新引入逐阶段人工门禁;goal-first 的决策点、严格范围、先可用再迭代、独立 Review、 +证据、平台准入与高后果双钥匙规则继续有效。 + ## 目标优先、范围控制与问题分流 执行顺序为: diff --git a/policy/governance.md b/policy/governance.md index ff1cafc2..dc24dcb1 100644 --- a/policy/governance.md +++ b/policy/governance.md @@ -3,8 +3,10 @@ 本文件细化根 AGENTS.md 的启动、验证和回收规则。通用语义以固定的 `deps/development-guidelines` 为准;门禁实现及回归用例随本仓版本管理。 需求表、设计试验、迭代调整、阶段产物、人工决策及智能体 Review/合入按 -[迭代交付](delivery.md) 执行。任务卡分别记录授权边界、必要人工决策点、智能体审阅者及对象版本; -本地 evidence 仅记录 SELF 命令,不能证明授权/人工决策或提升为 CI/独立审阅证据。 +[迭代交付](delivery.md) 执行。任务卡分别记录授权边界、必要人工决策点、`cursor-per-unit` 实施执行模式、 +逐单元 Cursor 实施收据、智能体审阅者及对象版本;权威验证与合入仍由 host/主模型执行, +Cursor worker 局部自检不替代。本地 evidence 仅记录 SELF 命令,不能证明授权/人工决策或提升为 +CI/独立审阅证据。 ## 启动与恢复 diff --git a/policy/tool-adaptation-matrix.md b/policy/tool-adaptation-matrix.md index 50dfef87..a4fc8f21 100644 --- a/policy/tool-adaptation-matrix.md +++ b/policy/tool-adaptation-matrix.md @@ -14,7 +14,7 @@ | A5 回收 | 本地命令检查;写者退出须可证明,无法证明时才请求 owner 决策 | 登记根目录、锁/操作状态、父子仓与唯一文件、合入核验 | `tests/test_task.py` | | A6 秘密 | 本地脱敏及 CI 获取边界;权限与宿主隔离另验 | 命令/输出/摘要脱敏,凭据不持久写 Git 配置 | `tests/test_evidence.py`、`tests/test_ci_credentials.py` | | A7 证据 | 本地 SELF 收据;外部来源独立核验 | 首次捕获、完整脱敏输出/摘要、对象记录、原样导入 | `tests/test_evidence.py`;CI/审阅链接另核 | -| A8 阶段记录与迭代 | goal-first;模板默认连续执行,仅真实决策点需人工,没有全流程授权强制 | policy/delivery.md;任务卡分别记录阶段状态、决策点、Review、冲突、当前 HEAD 的 CI 和合入;post-merge 默认仅提示 | `tests/test_task.py` 核对 goal-first 模板及钩子不自动写入;智能体核对授权范围、Review、冲突及匹配 HEAD 的 CI/平台准入 | +| A8 阶段记录与迭代 | goal-first + cursor-per-unit;模板默认连续执行,仅真实决策点需人工,没有全流程授权强制;实施写入经新 Cursor 进程按单元执行 | policy/delivery.md;任务卡分别记录阶段状态、决策点、Cursor 实施收据、Review、冲突、当前 HEAD 的 CI 和合入;post-merge 默认仅提示 | `tests/test_task.py` 核对 goal-first/cursor-per-unit 模板及钩子不自动写入;智能体核对授权范围、实施单元边界、Review、冲突及匹配 HEAD 的 CI/平台准入 | | A9 长期方向与后续任务 | manual;模板不校验规划有效性或自动调度任务 | policy/delivery.md;PROJECT.md 提供规划入口,任务卡关联规划/里程碑并记录下一步建议 | `tests/test_task.py` 核对生成字段与未授权默认值;智能体核对当前规划、进展、重复任务和建议依据,新任务仍不自动获得授权 | | A10 交付窗口 | manual 受控试行;无自动互斥或接管 | policy/merge-queue.md;Issue #518 与协调者已登记,本候选固定实际合入规范版本;用户授权本轮三个任务并指定单一协调者;已实测平台机制及当前写者清单,当前候选组合与最终准入另核验 | tests/test_merge_queue_trial.py 临时 Git 场景 SELF;平台机制独立 REPLAY 已完成(范围见 Issue518);真实三任务及复盘待完成 | | A11 固定后证据 | manual 选择源码外位置;工具捕获绝对未用路径/原始输出;无 OS 冻结 | policy/governance.md;RECEIPT 捕获,后续授权闭合再原样导入 | `tests/test_evidence.py` 固定对象、权限、覆盖拒绝、原样导入与幂等 | diff --git a/scripts/task.sh b/scripts/task.sh index 184bd2fc..8810941e 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -201,6 +201,7 @@ cmd_start() { ${parent_note} - 授权与交付终点:<本次允许的动作与终点;未授权事项写明> - 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) +- 实施执行:cursor-per-unit(每个产生仓库变更的实施单元启动一次新的 Cursor CLI 进程;不得跨单元复用;主模型不直接撰写实施变更) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收 - 当前阶段:需求拆解;当前增量:I1(待定义) @@ -210,6 +211,14 @@ ${parent_note} <预期结果、受影响入口/模块/契约;明确不做什么。> +## Cursor 实施收据 + +一单元一新进程;Cursor 不可用或失败时记录 blocker,不得交回主模型代写。 + +| 单元 ID | 预期范围 | Cursor 运行 | 结果 | 阻塞原因 | 收据路径 | +|---|---|---|---|---|---| +| 待定义 | — | NOT_RUN | — | — | — | + ## 关联方向与规划 - 适用状态:待核对(无适用规划时说明原因) diff --git a/tests/test_task.py b/tests/test_task.py index 478e6c3b..de597c40 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -706,9 +706,22 @@ class TaskLifecycleTests(unittest.TestCase): card = (wt / ".task/feature-new.md").read_text() self.assertIn("make precheck", card) self.assertIn("交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)", card) + self.assertIn( + "实施执行:cursor-per-unit(每个产生仓库变更的实施单元启动一次新的 Cursor CLI 进程;" + "不得跨单元复用;主模型不直接撰写实施变更)", + card, + ) self.assertIn("人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收", card) self.assertNotIn("authorized-continuous", card) self.assertIn("流程依据:仓库根目录 policy/delivery.md", card) + self.assertIn("## Cursor 实施收据\n", card) + cursor_receipts = card.split("## Cursor 实施收据\n", 1)[1].split("\n## ", 1)[0] + self.assertIn( + "| 单元 ID | 预期范围 | Cursor 运行 | 结果 | 阻塞原因 | 收据路径 |", + cursor_receipts, + ) + self.assertIn("| 待定义 | — | NOT_RUN | — | — | — |", cursor_receipts) + self.assertIn("一单元一新进程;Cursor 不可用或失败时记录 blocker,不得交回主模型代写", cursor_receipts) for field in ("当前阶段", "当前增量", "方案引用", "实施计划引用", "测试计划引用"): self.assertIn(field + ":", card) self.assertIn("## 交付调度\n", card)