From 271d95ff688a1104f1717f19a7d3458332059dc6 Mon Sep 17 00:00:00 2001 From: agent-exec-transport Date: Sat, 17 Oct 2026 09:05:56 +0000 Subject: [PATCH] agent-exec transport 10744e242fc07c8b53c17e7ad7a55cf4/cb4ae8cd1607 --- .gitea/workflows/ci.yaml | 2 ++ .task/templates/task-card.md | 66 +++++++++++++++++++++++++++++++++++ PROJECT.md | 2 ++ deps/development-manager | 2 +- policy/guidelines-adoption.md | 31 ++++++++++++++++ scripts/dm | 55 +++++++++++++++++++++++++++++ scripts/task | 4 +++ 7 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 .task/templates/task-card.md create mode 100644 policy/guidelines-adoption.md create mode 100755 scripts/dm create mode 100755 scripts/task diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 0a3dabba..74fc560c 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -168,6 +168,8 @@ jobs: ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt - name: Validate AGENT-EXECUTION.md with the pinned shared executor run: scripts/agent-exec validate --repo . + - name: Governance check with the pinned kit + run: scripts/dm governance check --repo . - name: Install Node 22 run: | set -euo pipefail diff --git a/.task/templates/task-card.md b/.task/templates/task-card.md new file mode 100644 index 00000000..e3a02372 --- /dev/null +++ b/.task/templates/task-card.md @@ -0,0 +1,66 @@ +# <任务标题> 任务卡 + +任务主记录:。 +状态:<进行中 / 待审核 / 已合入 / 已放弃>;owner:<填写>。 + +## 基线与授权 + +- 权威仓:<仓 URL 或逻辑 ID>;root_target:main;immediate_target:
+- branch_kind:;initiative_id:<稳定 ID,普通任务为空> +- R0(initial_main_sha):<完整 SHA>;工作区:<路径>(worktree / clone);分支: +- 父任务信息(仅子任务填写):parent_branch=<父分支>;parent_head_sha=;parent_pr=<父 PR> +- accepting_requirements:(仅 initiative 可为 true;冻结后为 false) +- 需求分流:verdict=;selected_initiative=<分支或无>;候选=<分支@HEAD 列表或无>;理由=<不适配/适配依据>;triage 收据=<源码外路径与摘要> +- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md;外部 Agent 一单元一新进程/会话/工作区) + +## 目标与非目标 + +<预期结果、受影响入口/模块/契约;明确不做什么。> + +## Agent 实施收据 + +按根目录 AGENT-EXECUTION.md 路由;外部 Agent 一单元一新进程/会话/隔离工作区。实施、修复与测试必须通过登记的候选执行;未配置或候选安全耗尽停在 unavailable/blocked,禁止 host 隐式代写。 + +| 单元 ID | 预期范围 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---| +| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — | + +## 复用材料(task-start 自动检索结果摘录) + +- 相关近期提交: 命中;无则写无>。 +- 相关经验条目:<检索命中;无则写无>。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | 结果 | +|---|---|---|---|---| +| 启动 | | | <日期时间> | <一致/已同步> | +| 验收前 | <填写> | <填写> | <填写> | <填写> | + +字段没有发生的写"无",不省略。本卡与 PR 描述同源:开 PR 时将"目标与非目标、结果与验证、影响与剩余项"复制进 PR 描述,不另写第二份。 + +## 交付调度(有多个就绪任务时) + +- 调度记录 / entry_id / 当前 attempt_id:<平台或调度服务链接及标识;未入队写无>。 +- 入队源 HEAD / owner / 依赖:<完整 SHA、身份、依赖或无>。 +- 固定候选引用:<调度尝试中的 base/head、组件与配置;未固定写无>。 +- 窗口、最终 CI、Review 与真实合入结果:<引用调度记录及原始证据,不复制全队列>。 + +定义见 [合入调度与 CI 分配](../standards/merge-queue.md)。本段在候选固定前整理;固定后先使用源码之外的记录保存运行结果,再按项目闭合流程回填。 + +## 结果与验证(完成后填写) + +- 结果:<交付了什么;未发生写无>。 +- 验证:<结论性摘要:PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据见下表,来源标注与写入规则见 [按影响选择验证与证据](../standards/verification.md)>。 +- 影响与剩余项:<影响面、遗留风险、后续任务>。 + +| 时间(UTC) | 命令 | 被测 HEAD | exit | 来源 | 摘要/位置 | +|---|---|---|---|---|---| +| <时间> | <命令;由项目 evidence 工具写入,无工具时附命令+对象 SHA+输出 digest 并标 SELF> | | | GATE/REPLAY/SELF | <摘要/位置> | + +## 回收(task-finish) + +- 合入核对:<分支已包含于目标分支的核对输出>。 +- 未跟踪/ignored 文件处置:<归档/可再生/存疑 逐项;无则写无>。 +- 回收动作:。 diff --git a/PROJECT.md b/PROJECT.md index 7e7edaf5..02a0d283 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -67,6 +67,8 @@ U2 起实施与部署分别评审。 测试。实际目标以根 Makefile 为准。`make test-governance` 可独立检查开发门禁,使用临时 真实仓库,不访问生产数据;操作与证据要求见 [开发门禁](policy/governance.md)。 +`scripts/agent-exec validate --repo .` 核验 `AGENT-EXECUTION.md`,`scripts/dm governance check --repo .` 核验治理 kit 入口与采纳状态(只读);二者均在 CI 中运行。 + `make build` 在 backend 模块内编译,replace 指向该模块自己的 `deps/`; `scripts/check-pins.sh` 核对这些 gitlink 与 Dev 顶层指针,`make test-worktree` 另核对 真正被测的组件工作树。两者分别验证固定组合与实际检出,不能相互替代。 diff --git a/deps/development-manager b/deps/development-manager index 42e675fe..0552b735 160000 --- a/deps/development-manager +++ b/deps/development-manager @@ -1 +1 @@ -Subproject commit 42e675fec8e0069646319fcd298e61d03d8cbfd5 +Subproject commit 0552b7358d6955057d6eea090326f83317ed992a diff --git a/policy/guidelines-adoption.md b/policy/guidelines-adoption.md new file mode 100644 index 00000000..ada1ae8b --- /dev/null +++ b/policy/guidelines-adoption.md @@ -0,0 +1,31 @@ +# 通用规范采纳记录 + +- 项目/负责人:Agent-System-Dev / weichen +- 状态:active +- 规范位置:`deps/development-guidelines` +- 规范性文档目录:`policy/`(项目规则与制度放此处;只收紧不放宽上游规范) +- 过程文档位置:任务卡 `.task/`,归档 `.task/archive/`,规划记录 `docs/superpowers/plans/`;任务主记录在对应 PR 中 +- 版本权威:本仓 gitlink `deps/development-guidelines` @ `2688fd2be6a5`(完整提交 `2688fd2be6a52c0bf110e7e6366b6f291ab5e4eb`);可读标签:无 +- 批准/生效依据:`feature/governance-v2-closeout PR(Agent-System-Dev)`;在该 PR 合入前,证据、Review 与 CI 须先记录于 `.task/feature-governance-v2-closeout.md` +- 替代范围和迁移说明:无。既有 [policy/adoption.md](adoption.md) 的逐条决策保持不变,本文件不替代其内容。 + +逐条规范的采纳、不适用理由与执行方式以 [policy/adoption.md](adoption.md) 为准,本文件不重复其表格。 +本仓 `make task-*`(`scripts/task.sh`、`scripts/task_triage.py`、`scripts/task_pr_check.py`)仍是权威任务生命周期; +`scripts/task` 只是 DM 共享入口,供不含 `task.sh` 的仓库使用,本仓不以它替代 `make task-*`。 + +本文件由 kit 要求的采纳入口只登记以下一行,其余规范沿用 [policy/adoption.md](adoption.md): + +| 规范/工作流 | 适用条件与范围 | 采纳或不适用理由 | 执行方式/证据 | +|---|---|---|---| +| [standards/agent-execution.md](../deps/development-guidelines/standards/agent-execution.md) | 工程 Agent CLI 执行路由、会话隔离与受控集成 | 凡允许 AI 协助必须采纳;配置见 `AGENT-EXECUTION.md` | advisory:`AGENT-EXECUTION.md` + `scripts/agent-exec`(validate / admit);CI 步骤「Validate AGENT-EXECUTION.md with the pinned shared executor」与「Governance check with the pinned kit」(`scripts/dm governance check --repo .`)。分支保护要求 governance check 为必需检查之前,不宣称为强制(enforced)门禁 | + +## 项目差异 + +无。项目差异(如有)以 [policy/adoption.md](adoption.md) 的「项目差异」节为准。 + +## 本次升级或首次接入验证 + +- 入口:根目录 `AGENTS.md`、`PROJECT.md`、`AGENT-EXECUTION.md`、`scripts/dm`、`scripts/task`、`.task/templates/task-card.md`。 +- 相对链接:规范文档统一经 `../deps/development-guidelines/...` 引用;本仓内文档使用仓内相对路径。 +- 版本获取:`deps/development-guidelines` gitlink 固定于上表版本;`deps/development-manager` gitlink 固定于 `0552b7358d6955057d6eea090326f83317ed992a`,由 `scripts/dm` 按该提交构建共享 dm-server。 +- 验证:在采纳 PR 的临时副本中运行 `scripts/dm governance check --repo .` 与 `scripts/agent-exec validate --repo .`,结果与 `make test-governance` 记录于 `.task/feature-governance-v2-closeout.md`。 diff --git a/scripts/dm b/scripts/dm new file mode 100755 index 00000000..a7cdae36 --- /dev/null +++ b/scripts/dm @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# 共享 dm-server 薄入口:读取 deps/development-manager 的 gitlink 钉住提交, +# 按该提交构建并缓存 dm-server,再 exec 其子命令(agent-exec、task、governance)。执行语义与退出码以该二进制为准。 +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +dm="$root/deps/development-manager" + +die() { echo "dm: $*" >&2; exit 2; } + +# git 钩子会导出仓库本地变量(GIT_DIR、GIT_INDEX_FILE 等),它们会让 `git -C "$dm"` 解析到外层仓库。 +# 所有针对 DM 检出的 git 与 go 调用都在清除这些变量后执行;读取外层 gitlink 与最终 exec 仍保留继承环境。 +dm_local_env="GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_PREFIX GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_GRAFT_FILE GIT_NAMESPACE GIT_CONFIG GIT_CONFIG_PARAMETERS GIT_CONFIG_COUNT GIT_SHALLOW_FILE GIT_IMPLICIT_WORK_TREE $(git rev-parse --local-env-vars 2>/dev/null || true)" +dm_clean_env() { for v in $dm_local_env; do unset "$v"; done; } +dmgit() ( dm_clean_env; git -C "$dm" "$@" ) + +# 1. 钉住版本只来自索引中的 gitlink(mode 160000),不读取工作区文件。 +entry=$(git -C "$root" ls-files -s -- deps/development-manager 2>/dev/null || true) +[ -n "$entry" ] || die "索引中缺少 deps/development-manager 的 gitlink,无法确定钉住的 DM 版本" +read -r mode pin _stage _path <<<"$entry" +[ "$mode" = 160000 ] || die "deps/development-manager 不是 gitlink(mode=$mode)" +[[ "$pin" =~ ^[0-9a-f]{40}$ ]] || die "gitlink 提交格式无效:$pin" + +# 2. 检出必须存在且确为 DM 独立仓库(避免 git -C 误解析到外层仓库),HEAD 必须等于钉住提交。 +[ -e "$dm/.git" ] || die "deps/development-manager 未检出;请按钉住提交 $pin 检出该 gitlink" +top=$(dmgit rev-parse --show-toplevel 2>/dev/null || true) +[ -n "$top" ] && [ "$top" = "$(cd "$dm" && pwd -P)" ] \ + || die "deps/development-manager 不是独立检出;请按钉住提交 $pin 检出该 gitlink" +head=$(dmgit rev-parse HEAD 2>/dev/null || true) +[ "$head" = "$pin" ] \ + || die "deps/development-manager HEAD(${head:-未知})与钉住提交 $pin 不一致;请按钉住提交检出" + +# 3. 检出工作树必须干净(忽略嵌套 submodule 状态)。 +dirty=$(dmgit status --porcelain --ignore-submodules=all) \ + || die "无法读取 deps/development-manager 的工作树状态" +[ -z "$dirty" ] || die "deps/development-manager 存在未提交改动,拒绝运行(请先清理该检出)" + +# 4. 二进制按钉住提交缓存;缺失时在缓存目录内临时构建,完成后原子改名,避免留下半成品。 +cache="${DM_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/development-manager/dm-server}" +bin="$cache/dm-server-$pin" +if [ ! -x "$bin" ]; then + command -v go >/dev/null 2>&1 || die "缺少 go,无法构建 dm-server($pin)" + mkdir -p "$cache" + cache=$(cd "$cache" && pwd -P) + bin="$cache/dm-server-$pin" + work=$(mktemp -d "$cache/build-$pin.XXXXXX") + if ! (dm_clean_env; cd "$dm" && GOWORK=off go build -trimpath -o "$work/dm-server" ./cmd/dm-server); then + rm -rf "$work" + die "构建 dm-server 失败($pin)" + fi + mv -f "$work/dm-server" "$bin" + rm -rf "$work" +fi + +exec "$bin" "$@" diff --git a/scripts/task b/scripts/task new file mode 100755 index 00000000..fe7d2ca9 --- /dev/null +++ b/scripts/task @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# 通用任务入口:转调 scripts/dm 的 task 子命令(triage / start / pr-check)。 +set -euo pipefail +exec "$(dirname "$0")/dm" task "$@"