From 0f4c5c017d444369470443faede3283e101c3be9 Mon Sep 17 00:00:00 2001 From: weichen Date: Thu, 15 Oct 2026 05:03:14 +0000 Subject: [PATCH] Route project work through configured agents Why: replace fixed Cursor execution authority with project-configured agent routing Evidence: focused task-card contract, agent-exec validation, governance regression, and diff check Impact: updates project policy, task templates, capability records, and current task metadata Refs: U4; docs/superpowers/plans/2026-10-15-project-agent-execution.md --- .task/feature-goal-first-delivery.md | 58 ++++++++++++++++------------ AGENTS.md | 21 +++++----- policy/adoption.md | 3 +- policy/delivery.md | 31 +++++++++------ policy/governance.md | 20 ++++++++-- policy/tool-adaptation-matrix.md | 2 +- scripts/task.sh | 12 +++--- tests/test_task.py | 26 +++++++------ 8 files changed, 102 insertions(+), 71 deletions(-) diff --git a/.task/feature-goal-first-delivery.md b/.task/feature-goal-first-delivery.md index 07ae85eb..d8bbfb3e 100644 --- a/.task/feature-goal-first-delivery.md +++ b/.task/feature-goal-first-delivery.md @@ -7,11 +7,12 @@ - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 33261925a10c4eee40d1b6175b3895e78a47ef02 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-goal-first-delivery(worktree);分支:feature/goal-first-delivery -- 授权与交付终点:完善本仓交付规范,确立目标优先、不私自扩围、先可用再迭代并移除机械人工环节;进一步设计每项目一份 Markdown 执行 Agent 配置、多 CLI adapter、`run-everything` 优先与全候选不可用后主模型回退。当前终点是书面设计评审;未授权实施执行器、修改 Guidelines 子模块、业务代码或平台保护。 -- 交付模式:authorized-continuous(用户已批准书面设计,明确免除本次实施计划的人工复审,并授权使用 Cursor Agent 执行 U1–U5) +- 授权与交付终点:完善本仓交付规范,确立目标优先、不私自扩围、先可用再迭代并移除机械人工环节;实施并接线每项目一份 Markdown 执行 Agent 配置、多 CLI adapter、`run-everything` 优先与全候选不可用后主模型回退(U1–U5)。当前终点是 U1–U5 实施、本地验证、Review、精确 HEAD CI 与合入;未授权修改 Guidelines 子模块、业务代码或平台保护。 +- 交付模式:authorized-continuous(用户已批准书面设计,明确免除本次实施计划的人工复审,并授权执行 U1–U5) +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 人工决策点:仅目标/范围/验收变更、未知外部副作用、高后果操作或无法自动判定的业务验收;计划完成后不停顿 -- 当前阶段:实施计划;当前增量:U1–U5(项目级执行 Agent 路由) +- 当前阶段:实施与自检;当前增量:U4(项目治理接线;U1–U3 已合入规范基线) - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 @@ -20,13 +21,20 @@ 非目标:不放宽授权、独立 Review、证据、CI/平台准入、高后果双钥匙或安全回收条件;不修改通用 Guidelines 子模块和业务功能。 -## Cursor 实施收据 +## Agent 实施收据 -| 单元 ID | 预期范围 | Cursor 运行 | 结果 | 阻塞原因 | 收据路径 | -|---|---|---|---|---|---| -| I1 | goal-first 初始规范及模板 | 不适用(用户提出 cursor-per-unit 要求前已实施) | 已提交 `90265ac` | — | 任务卡 SELF 证据 | -| I2/P2 attempt-1 | cursor-per-unit 规范、模板及测试 | `20261014T165622Z-bec26a3d` | 失败,0 文件变更,已安全清理 | 当次 sandbox 启动失败;用户后续实测后重试 | `/tmp/compound-engineering-1000/ce-work/goal-first-cursor-delegation-20261015` | -| I2/P2 attempt-2 | 同上,限 7 个治理文件 | `20261014T170714Z-817c5d04` | 完成;Cursor red→green;host 集成为 `d79d6c17` | — | 同上;SELF 状态收据 `f4240aa219103d4e` | +现行执行权威:根目录 [AGENT-EXECUTION.md](../AGENT-EXECUTION.md) 的 agent-per-unit 路由与收据门控的 host fallback(`host-fallback-authorized`)。历史 I1/P2 Cursor 行仅为早期 cursor-per-unit 时期记录,不是现行权威,仓库检索不得将其当作活跃固定 Cursor 要求。U1–U3 早于活跃 agent-exec 路由,由 ce-work 固定 Cursor 控制器实施,非本配置角色路由选型。源码外 ce-work 运行根:`/tmp/compound-engineering-1000/ce-work/project-agent-exec-20261015`(`manifest.json`)。 + +| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---|---| +| I1(历史;非现行权威) | goal-first 初始规范及模板 | 历史:固定 Cursor / cursor-per-unit 前;非 AGENT-EXECUTION 路由 | — | — | 历史 | 不适用 | 已提交 `90265ac` | — | — | 任务卡 SELF 证据 | +| I2/P2 attempt-1(历史;非现行权威) | 历史 cursor-per-unit 规范、模板及测试 | 历史:ce-work 固定 Cursor;非现行执行权威 | — | — | `20261014T165622Z-bec26a3d` | Cursor(历史) | 失败,0 文件变更,已安全清理 | — | — | `/tmp/compound-engineering-1000/ce-work/goal-first-cursor-delegation-20261015` | +| I2/P2 attempt-2(历史;非现行权威) | 同上,限 7 个治理文件 | 历史:ce-work 固定 Cursor;非现行执行权威 | — | — | `20261014T170714Z-817c5d04` | Cursor(历史) | 完成;host 集成为 `d79d6c17` | — | — | 同上;SELF 状态收据 `f4240aa219103d4e` | +| U1 | 配置合同 AGENT-EXECUTION.md / parser | 早于活跃 agent-exec 路由;ce-work 固定 Cursor 控制器;accepted `attempt-4`;job `20261015T021049Z-c63f0c9c`;见 `manifest.json` | implementation | 非角色路由;ce-work 固定 Cursor | attempts 1–4;accepted `attempt-4` | Cursor Agent / Auto(已核实) | 完成;规范 `bdad8ffc91beab7f0008a3382b650bfa15394065` | `5ce1c685ccf9b4da20f0ca7bb2449bf0ce8cef45` | 无 / 未授权 | `/tmp/compound-engineering-1000/ce-work/project-agent-exec-20261015`(manifest.json) | +| U2 | adapter seam | 早于活跃 agent-exec 路由;ce-work 固定 Cursor 控制器;accepted `attempt-4`;job `20261015T025219Z-8edd087e`;见 `manifest.json` | implementation | 非角色路由;ce-work 固定 Cursor | attempts 1–4;accepted `attempt-4` | Cursor Agent / Auto(已核实) | 完成;规范 `92330a225f9d839aaaf279e6ae1ad96a4bdfebb4` | `cfdae5f9cf0dbec3ad991df77d39852236927255` | 无 / 未授权 | `/tmp/compound-engineering-1000/ce-work/project-agent-exec-20261015`(manifest.json) | +| U3 | 可恢复执行控制器 | 早于活跃 agent-exec 路由;ce-work 固定 Cursor 控制器;accepted `attempt-9`;job `20261015T042945Z-e824725f`;见 `manifest.json` | implementation | 非角色路由;ce-work 固定 Cursor | attempts 1–9;accepted `attempt-9` | Cursor Agent / Auto(已核实) | 完成;规范 `8f11d002aec74ed21d3dae8ccbb760963b99e93a` | `6671fc2d6bdb7b64d8a83cc53a27d9443c98e61a` | 无 / 未授权 | `/tmp/compound-engineering-1000/ce-work/project-agent-exec-20261015`(manifest.json) | +| U4 | 项目治理接线(本单元) | NOT_RUN | implementation | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | `/tmp/compound-engineering-1000/ce-work/project-agent-exec-20261015` | +| U5 | 真实 CLI 探针与组合验收 | NOT_RUN | implementation | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — | ## 关联方向与规划 @@ -41,16 +49,16 @@ | R1 | 任务目标和系统可用性优先,先形成可验证的最小可用闭环 | 符合通用基线的授权边界与按影响选择流程 | P0 | AGENTS.md 和 policy/delivery.md 明确优先级、完成标准和先可用后迭代 | 现有交付规范 | 纳入 I1 | | R2 | 禁止私自扩围,仅解决直接阻塞项;非阻塞项按价值记录或忽略 | 收紧基线硬边界 1,不放宽授权 | P0 | 规范具有阻塞/有价值非阻塞/低影响噪音分流,任务外修复必须获得授权 | R1 | 纳入 I1 | | R3 | 移除可移除的逐阶段人工停顿,保留真实决策、安全和质量门禁 | 项目层在通用基线内明确执行方式 | P0 | 任务卡默认 goal-first,阶段为追溯记录而非人工签字表;治理测试覆盖模板 | R1、R2 | 纳入 I1 | -| R4 | 每个产生仓库变更的实施单元启动一个新 Cursor CLI,主模型只规划和管理 | 保留 host 的范围、验证、集成和交付权威;worker 无提交/扩围权 | P0 | AGENTS.md/policy 明确一单元一新进程、禁止主模型代写和失败 blocker;任务卡模板生成实施模式与收据表 | R1–R3 | 纳入 I2 | -| R5 | 用项目级 Markdown 配置驱动多 Agent CLI,取代固定 Cursor 候选 | R4 保留为历史候选;新契约只在项目显式采纳后生效 | P0 | 书面设计定义 `AGENT-EXECUTION.md`、adapter seam、角色顺序、模型 auto 和受控 custom adapter | R1–R4 | 纳入 U0 | -| R6 | 优先 `run-everything`,配置候选全部不可用后才回退当前主模型 | 不放宽任务授权、共享环境、秘密、平台准入或高后果边界 | P0 | 书面设计定义终态机、精确恢复和 `host-fallback-authorized` 收据 | R5 | 纳入 U0 | +| R4(历史;已被 R5/R6 取代;无现行验收权威) | 早期迭代曾要求:每个产生仓库变更的实施单元启动一个新 Cursor CLI,主模型只规划和管理,且失败时禁止 host 回退代写 | 历史要求;不再作为活跃 P0 或验收门禁。host 范围/验证/集成权威仍由 R5/R6 与现行路由保留 | 历史 | 无现行验收权威。不得再以「禁止 host fallback」或固定 Cursor CLI 作为验收依据;现行唯一执行权威见 R5/R6 与 `AGENT-EXECUTION.md` | R1–R3 | 历史纳入 I2;已被 R5/R6 取代 | +| R5 | 用项目级 Markdown 配置驱动多 Agent CLI,取代固定 Cursor 候选 | R4 仅为早期迭代历史记录(无现行验收权威);现行契约以项目 `AGENT-EXECUTION.md` 为准 | P0 | `AGENT-EXECUTION.md`、adapter seam、角色顺序、模型 auto 和受控 custom adapter 已定义并可校验;agent-per-unit 为现行路由 | R1–R3 | 纳入 U0 | +| R6 | 优先 `run-everything`,配置候选全部不可用后才回退当前主模型(须有效 `host-fallback-authorized` 收据) | 不放宽任务授权、共享环境、秘密、平台准入或高后果边界;取代 R4「禁止 host 代写」的绝对表述 | P0 | 终态机、精确恢复与收据门控 host fallback;`failed-unknown`/`scope-expansion`/无效配置/未对账 Git/安全失败均不授权回退 | R5 | 纳入 U0 | | R7 | 将高消耗实施下放给 CLI,限制主模型上下文消耗 | 主模型仍负责范围、Review、权威验证、集成和交付决定 | P0 | 任务包传路径/固定版本,正常收据有上限,原始日志不自动进入主模型上下文 | R5、R6 | 纳入 U0 | ## 方案与计划 -- 方案引用:[2026-10-15 项目级执行 Agent 路由设计](../docs/superpowers/specs/2026-10-15-project-agent-execution-design.md)(待书面评审) +- 方案引用:[2026-10-15 项目级执行 Agent 路由设计](../docs/superpowers/specs/2026-10-15-project-agent-execution-design.md)(已批准) - 实施计划引用:[2026-10-15 项目级执行 Agent 路由实施计划](../docs/superpowers/plans/2026-10-15-project-agent-execution.md)(用户明确免除计划复审) -- 测试计划引用:设计规定配置/解析、adapter 契约、路由/回退、主模型消耗和真实 CLI 探针;具体命令待实施计划确定 +- 测试计划引用:U1–U3 本地 unittest / agent-exec validate 为 SELF;U4 聚焦任务卡模板与 validate;U5 真实 CLI 探针与完整治理回归(GATE 待 PR HEAD) ## 阶段评审 @@ -61,8 +69,8 @@ | 需求表确认 | R1–R7 | 通过 | weichen | 2026-10-15 | 用户确认多 CLI 受控 adapter、`run-everything` 优先、主模型低消耗与全候选不可用后回退 | | 方案设计 | `docs/superpowers/specs/2026-10-15-project-agent-execution-design.md` | 通过 | weichen | 2026-10-15 | 用户明确“批准” | | 实施计划 | `docs/superpowers/plans/2026-10-15-project-agent-execution.md` | 授权连续执行 | weichen | 2026-10-15 | 用户明确“实施计划后不需要再让我审阅”,并指定 Cursor Agent 执行 | -| 实施与自检 | `8b7e8ca` 审阅候选 | 通过 | weichen | 2026-10-15 | 用户明确“批准”;P2 收据及控制器聚焦验证/`make test-governance` run receipt | -| 正式测试与验收 | 旧 `cursor-per-unit` 候选 `cc03710` | 不适用(范围已变更) | Codex host | 2026-10-15 | 本地 `make test`/`make build` SELF 只保留旧对象历史;未进入 PR/GATE | +| 实施与自检 | U1 `bdad8ffc` / U2 `92330a22` / U3 `8f11d002`;U4/U5 进行中 | 进行中 | Codex host + 外部 worker | 2026-10-15 | U1–U3 规范合入;U4 治理接线;U5 探针 NOT_RUN;历史 P2/`8b7e8ca` 仅作旧对象线索 | +| 正式测试与验收 | 待定(U1–U5 组合候选) | 待执行 | — | — | 旧 `cursor-per-unit` 候选 `cc03710` 已停止交付;不发明 GATE/REPLAY | | 代码 Review | 待定 | 未评审 | — | — | — | | 合入 | 待定 | 未评审 | — | — | — | | 合入核验与收口 | 待定 | 未评审 | — | — | — | @@ -95,19 +103,19 @@ ## 结果与验证(完成后填写) -- 结果:旧 cursor-per-unit 候选已停止交付;新项目级多 Agent CLI 路由设计已写入书面规格,待用户评审。 -- 验证:SELF PASS — Cursor focused red→green;host 集成验证 PASS;控制器 `make test-governance` 退出 0,对象 `d79d6c17`,evidence digest `d16726eb13aba7f5`;状态收据由 `make evidence` 写入。 -- 影响与剩余项:新设计的实施计划、业务实施、测试、Review、PR、CI、合入与采纳均 NOT_RUN。 +- 结果:旧 cursor-per-unit 候选已停止交付并保留为历史;U0 设计已批准;U1–U3 已合入规范基线(`bdad8ffc…` / `92330a22…` / `8f11d002…`);U4 将项目规则改为配置驱动 agent-per-unit;U5 真实探针 NOT_RUN。 +- 验证:U1–U3 本地 SELF 见各单元聚焦测试与 host 集成;U4 本地聚焦任务卡测试与 `agent_exec.py validate`(SELF);完整 `make test-governance` / PR CI(GATE)由 host 权威事务执行,本卡不手抄。历史 P2 digest `d16726eb13aba7f5` 仅作旧对象线索。 +- 影响与剩余项:U5 探针、独立 Review、精确 HEAD CI、合入与任务卡闭合仍 NOT_RUN。 ## 规划进展与下一步 -- 本次推进/剩余:U0 书面设计已批准;U1–U5 实施计划已编写,完成自检后直接执行。 -- 首选下一任务:U1 配置合同,使用新 Cursor Agent 进程实施。 -- 推荐依据:遵循本次 goal-first 与不扩围原则。 -- 前置条件/待确认:计划自检通过;无待人工复审项。 -- 预期产物/验收条件:批准的 R1–R10 设计及可执行 U1–U5 计划;实施和采纳后续分别交付。 +- 本次推进/剩余:U1–U3 已完成;U4 治理接线进行中;U5 组合验收待办。 +- 首选下一任务:U5 真实 CLI 探针与组合验收(新 agent-per-unit 进程)。 +- 推荐依据:遵循本次 goal-first 与不扩围原则;U4 完成后才具备日常任务路由权威。 +- 前置条件/待确认:U4 聚焦验证通过并由 host 权威集成;无待人工复审项。 +- 预期产物/验收条件:R1–R10 有代码/测试/证据映射;无活跃固定 Cursor 权威;U5 后决定是否声明已安装 CLI 就位。 - 重复任务核对:未发现需另建任务的重复范围。 -- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) +- 启动授权:U1–U5 已授权连续执行;U5 之外新任务仍须明确授权 ## 合入与清理 diff --git a/AGENTS.md b/AGENTS.md index 47c180c3..135cb5e3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,18 +20,17 @@ 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、证据、平台准入与高后果双钥匙规则。 +- 实施、修复、测试与审阅调度**必读根目录 [AGENT-EXECUTION.md](AGENT-EXECUTION.md)**(唯一项目执行路由配置)。 +- 产生仓库变更的实施按可独立实施的单元拆分;任务卡记 `实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)`。 +- 外部 Agent 在新进程/隔离工作区执行一个有界单元;host 负责计划、拆解、范围审阅、权威验证、规范提交、 + PR/CI/合入、证据与任务元数据及安全清理。Worker 不得提交、推送、开或合 PR、部署、改路由或派遣同伴。 +- 当前 host 仅在 `scripts/agent_exec.py run` 对该精确单元发出有效 `host-fallback-authorized` 收据后, + 方可撰写该单元的仓库变更;`failed-unknown`、`scope-expansion`、无效配置、未对账 Git 状态与安全失败 + 均不授权回退。适配器、终态与回退细则见配置及 [policy/delivery.md](policy/delivery.md)、 + [policy/governance.md](policy/governance.md)。不削弱 goal-first、严格范围、先可用、独立 Review、 + 证据、平台准入与高后果双钥匙规则。 ## UI 设计门禁(强制) diff --git a/policy/adoption.md b/policy/adoption.md index c9deff15..88377f87 100644 --- a/policy/adoption.md +++ b/policy/adoption.md @@ -18,7 +18,8 @@ | 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、合入和安全收口;实施写入按 cursor-per-unit(一单元一新 Cursor CLI;主模型不直接写实施变更;不可用则记 blocker);仅真实决策点需人工;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py | +| policy/delivery.md(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | goal-first:目标/范围/终点一次确认,范围内连续推进验证、Review、合入和安全收口;实施写入按 agent-per-unit(配置 AGENT-EXECUTION.md;外部 Agent 一单元一新进程;host 仅在有效 host-fallback-authorized 收据后可写实施变更);仅真实决策点需人工;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py | +| AGENT-EXECUTION.md + agent-exec | 项目执行路由 | 本地 SELF:parser/adapter/controller 假 CLI 契约由 tests/test_agent_exec*.py 与 make agent-exec-validate 强制;已安装 provider/model 真实身份待 U5 探针,此前不接受为已就位;远端平台准入仍为 GATE | | 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 60cdc1b2..baac07e2 100644 --- a/policy/delivery.md +++ b/policy/delivery.md @@ -28,22 +28,29 @@ 需求拆解、评估、方案和计划可以共用一份任务卡。小任务只记录目标、范围、验收、关键决定和验证; 不适用的阶段标记原因后直接跳过。任务启动检查、独立工作区和收据用于准备现场,不表示业务结果已验证。 -## Cursor 实施单元与主模型职责 +## Agent 实施单元与主模型职责 -产生仓库变更的实施工作拆成可独立实施的单元。任务卡默认记 `实施执行:cursor-per-unit`: -**每个实施单元对应一次全新的 Cursor CLI 进程/运行**;不得复用已有 Cursor 进程处理另一单元。 +产生仓库变更的实施工作拆成可独立实施的单元。任务卡默认记 +`实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)`。执行路由以根目录 +[AGENT-EXECUTION.md](../AGENT-EXECUTION.md) 为唯一权威;按角色声明的候选顺序在新进程与 +隔离工作区中尝试外部 Agent。不得跨单元复用同一外部进程。 -主模型(host)负责计划、拆解、调度、强制范围、检查与审阅 diff、运行权威验证、集成与提交、 -管理 PR/CI/合入、写入证据与任务管理元数据,以及安全清理。主模型**不得直接撰写实施变更**。 -权威验证、集成、合入与任务卡证据所有权属于 host;worker 的局部自检不能替代任务卡证据、 -独立 Review、当前 HEAD 的 CI 与平台准入。 +主模型(host)负责计划、拆解、有界单元包、强制范围、检查与审阅实际 diff、运行权威验证、 +规范提交、管理 PR/CI/合入、写入证据与任务管理元数据,以及安全清理。权威验证、集成、合入与 +任务卡证据所有权属于 host;worker 的局部自检不能替代任务卡证据、独立 Review、当前 HEAD 的 CI +与平台准入。 -每个 Cursor worker 只接收一个有界单元。Worker 不得扩围、提交、推送、打开或合并 PR、 -派遣同伴、改变路由或模型、部署,或清理 worktree。 +每个外部 worker 只接收一个有界单元。Worker 不得扩围、提交、推送、打开或合并 PR、派遣同伴、 +改变路由或模型、部署,或清理规范 worktree。 -若 Cursor CLI 不可用或无法完成该单元,停止该单元,并在任务卡「Cursor 实施收据」记录 blocker; -不得静默把实施交回主模型代写。规划、只读调查、证据捕获、控制器/任务卡元数据与集成操作 -属于 host 管理工作,不递归创建另一 Cursor 实施单元。 +`run-everything` 仅在隔离单元内取消逐步命令批准提示;不扩大用户授权范围,也不授予 worker +规范 Git、推送、PR、合入、部署或清理权威。 + +当前 host **仅当** `scripts/agent_exec.py run` 对该精确单元发出有效 +`host-fallback-authorized` 收据后,方可直接撰写该单元的仓库变更。全部候选须已安全耗尽 +(`unavailable` 或已精确恢复的 `failed-clean`)。`failed-unknown`、`scope-expansion`、无效配置、 +未对账 Git 状态与安全失败均不授权回退。规划、只读调查、证据捕获、控制器/任务卡元数据与集成 +操作属于 host 管理工作,不递归创建另一实施单元。 本条不重新引入逐阶段人工门禁;goal-first 的决策点、严格范围、先可用再迭代、独立 Review、 证据、平台准入与高后果双钥匙规则继续有效。 diff --git a/policy/governance.md b/policy/governance.md index 0dbc98a7..329b82f5 100644 --- a/policy/governance.md +++ b/policy/governance.md @@ -3,10 +3,22 @@ 本文件细化根 AGENTS.md 的启动、验证和回收规则。通用语义以固定的 `deps/development-guidelines` 为准;门禁实现及回归用例随本仓版本管理。 需求表、设计试验、迭代调整、阶段产物、人工决策及智能体 Review/合入按 -[迭代交付](delivery.md) 执行。任务卡分别记录授权边界、必要人工决策点、`cursor-per-unit` 实施执行模式、 -逐单元 Cursor 实施收据、智能体审阅者及对象版本;权威验证与合入仍由 host/主模型执行, -Cursor worker 局部自检不替代。本地 evidence 仅记录 SELF 命令,不能证明授权/人工决策或提升为 -CI/独立审阅证据。 +[迭代交付](delivery.md) 执行。任务卡分别记录授权边界、必要人工决策点、 +`agent-per-unit(配置:AGENT-EXECUTION.md)` 实施执行模式、逐单元 Agent 实施收据、 +智能体审阅者及对象版本;权威验证与合入仍由 host/主模型执行,worker 局部自检不替代。 +本地 evidence 仅记录 SELF 命令,不能证明授权/人工决策或提升为 CI/独立审阅证据。 + +### Agent 实施收据与回退 + +每次外部实施尝试须在任务卡「Agent 实施收据」记录:配置摘要(`AGENT-EXECUTION.md` digest)、 +角色、声明候选顺序、attempt、CLI/模型、终态、transport、fallback,以及源码外原始收据路径。 +初始生成状态为 `NOT_RUN`。原始事件流与超限输出保留在源码外;未知终态(`failed-unknown`) +与 `scope-expansion` 的隔离工作区须保留待对账,不得静默丢弃。清理须有精确恢复或保留现场的 +可复核证据。 + +当前 host 仅在 `scripts/agent_exec.py run` 对该精确单元发出有效 `host-fallback-authorized` +收据后,方可撰写该单元的仓库变更;该收据不得由叙述或局部失败推断。`failed-unknown`、 +`scope-expansion`、无效配置、未对账 Git 状态与安全失败均不授权回退。 ## 启动与恢复 diff --git a/policy/tool-adaptation-matrix.md b/policy/tool-adaptation-matrix.md index dc8f37d3..fe18d621 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 + 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/平台准入 | +| A8 阶段记录与迭代 | goal-first + agent-per-unit(AGENT-EXECUTION.md);模板默认连续执行,仅真实决策点需人工,没有全流程授权强制;实施写入经配置候选在新进程/隔离工作区按单元执行;host 回退仅凭有效 host-fallback-authorized 收据 | policy/delivery.md、AGENT-EXECUTION.md;任务卡分别记录阶段状态、决策点、Agent 实施收据(配置摘要/角色/候选/attempt/CLI-模型/终态/transport/fallback/源码外路径)、Review、冲突、当前 HEAD 的 CI 和合入;post-merge 默认仅提示 | `tests/test_task.py` 核对 goal-first/agent-per-unit 模板及钩子不自动写入;`python3 scripts/agent_exec.py validate` / parser·adapter·controller 假测为本地 SELF 强制行为;已安装 provider/model 身份待 U5,远端平台准入为 GATE;智能体核对授权范围、实施单元边界、Review、冲突及匹配 HEAD 的 CI/平台准入 | | A9 长期方向与后续任务 | manual;模板不校验规划有效性或自动调度任务 | policy/delivery.md;PROJECT.md 提供规划入口,任务卡关联规划/里程碑并记录下一步建议 | `tests/test_task.py` 核对生成字段与未授权默认值;智能体核对当前规划、进展、重复任务和建议依据,新任务仍不自动获得授权 | | A10 交付窗口 | manual;无自动互斥或接管 | [合入调度](merge-queue.md)与 #518:同一目标一个最终窗口,等待分支不追 main;轮到后同步、固定、验证并由智能体合入 | 每个实际 PR 核对窗口记录、精确 HEAD 三项 GATE、Review 和合入后 main;不要求额外试行或全写者审计 | | A11 固定后证据 | manual 选择源码外位置;工具捕获绝对未用路径/原始输出;无 OS 冻结 | policy/governance.md;RECEIPT 捕获,后续授权闭合再原样导入 | `tests/test_evidence.py` 固定对象、权限、覆盖拒绝、原样导入与幂等 | diff --git a/scripts/task.sh b/scripts/task.sh index 8810941e..320a7742 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -201,7 +201,7 @@ cmd_start() { ${parent_note} - 授权与交付终点:<本次允许的动作与终点;未授权事项写明> - 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) -- 实施执行:cursor-per-unit(每个产生仓库变更的实施单元启动一次新的 Cursor CLI 进程;不得跨单元复用;主模型不直接撰写实施变更) +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收 - 当前阶段:需求拆解;当前增量:I1(待定义) @@ -211,13 +211,13 @@ ${parent_note} <预期结果、受影响入口/模块/契约;明确不做什么。> -## Cursor 实施收据 +## Agent 实施收据 -一单元一新进程;Cursor 不可用或失败时记录 blocker,不得交回主模型代写。 +按根目录 AGENT-EXECUTION.md 路由;外部 Agent 一单元一新进程/工作区。仅当 scripts/agent_exec.py run 对该精确单元发出有效 host-fallback-authorized 收据后,当前 host 方可实施该单元。failed-unknown、scope-expansion、无效配置、未对账 Git 状态与安全失败均不授权回退。原始日志保留在源码外收据路径。 -| 单元 ID | 预期范围 | Cursor 运行 | 结果 | 阻塞原因 | 收据路径 | -|---|---|---|---|---|---| -| 待定义 | — | NOT_RUN | — | — | — | +| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---|---| +| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — | ## 关联方向与规划 diff --git a/tests/test_task.py b/tests/test_task.py index de597c40..bd666d90 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -706,22 +706,26 @@ 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("实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)", card) self.assertIn("人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收", card) self.assertNotIn("authorized-continuous", card) + self.assertNotIn("cursor-per-unit", card) + self.assertNotIn("Cursor unavailable means blocker only", card) + self.assertNotIn("不得交回主模型代写", card) + self.assertNotIn("never return to host", 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("## Agent 实施收据\n", card) + self.assertNotIn("## Cursor 实施收据\n", card) + agent_receipts = card.split("## Agent 实施收据\n", 1)[1].split("\n## ", 1)[0] self.assertIn( - "| 单元 ID | 预期范围 | Cursor 运行 | 结果 | 阻塞原因 | 收据路径 |", - cursor_receipts, + "| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |", + agent_receipts, ) - self.assertIn("| 待定义 | — | NOT_RUN | — | — | — |", cursor_receipts) - self.assertIn("一单元一新进程;Cursor 不可用或失败时记录 blocker,不得交回主模型代写", cursor_receipts) + self.assertIn( + "| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |", + agent_receipts, + ) + self.assertIn("host-fallback-authorized", agent_receipts) for field in ("当前阶段", "当前增量", "方案引用", "实施计划引用", "测试计划引用"): self.assertIn(field + ":", card) self.assertIn("## 交付调度\n", card)