U1 收口:基线同步、治理演练记录与实施方案(D2'/D7 修正) #1

Merged
weichen merged 4 commits from feature/governance-u2-relief-2026-09-29 into dev 2026-09-29 03:01:33 +00:00
4 changed files with 362 additions and 21 deletions
@@ -0,0 +1,66 @@
---
title: "U1 治理演练记录:Gitea 原生门禁与 CI 可用性验证"
date: 2026-09-29
task_id: multi-repo-design-2026-09-28
drill_repo: weichen/governance-drill-2026-09 (private, 验证后保留至 U2b 收口再删)
basis: 2026-09-29-multi-repo-implementation-plan.md Phase 0 / U1.5
---
# U1.5 演练结论(全部通过)
环境:Gitea 1.27.3(本机 docker:gitea-server/gitea-db/gitea-runner),runner `home-runner`,
标签映射:`ubuntu-latest→docker://gitea/runner-images:ubuntu-latest`、`docker→docker://docker:dind`(不可用)、`nightly→host`。
## 分支保护与 PR 门禁(负例 + 正例)
保护配置(drill main):enable_push=false、required_approvals=1、dismiss_stale_approvals=true、
block_on_outdated_branch=true、apply_to_admins=true、status_check_contexts=[pr-verify / verify (pull_request)]。
| 编号 | 场景 | 结果 |
|---|---|---|
| N1 | admin 身份 HTTP 直推保护分支 | 拒绝(pre-receive hook declined;apply_to_admins=true 生效) |
| N2 | API PUT /contents 写保护分支 | 拒绝(user cannot commit to repo) |
| N3 | 无批准合并 PR | 拒绝(Does not have enough approvals) |
| N4 | 批准后 head 新提交再合并 | 拒绝(陈旧批准被撤销);重新批准后可合并 |
| N5 | required status check 未完成时合并 | 拒绝(405 Please try again later);CI success 后合并成功 |
| 自批准 | 作者批准自己的 PR | **Gitea 1.27.3 硬禁止**(approve your own pull is not allowed),admin 亦不可 |
合并语义:merge 后 base.sha=merge_commit_sha(0540e27c),merged_by=审核者(weichen)而非作者。
PR #2/#3 全流程:agent-bot(作者)→ weichen(批准+合并),作者/审核者分离经 Gitea 原生强制。
## D2' 决策修正:agent-bot 机器账号
单账号下 required_approvals=1 永远无法满足(自批准被硬禁止)。
已创建机器账号 `agent-bot`(凭据存 `~/.secrets/agent-bot`,token scope:write:repository, read:user):
编码 Agent 以 agent-bot 提交/建 PR;用户以 weichen 批准并合并。原方案 D2"不建机器人账号"据此作废。
## CI 可用性与根因修复
发现并修复 Agent-System CI 自 2026-09-24 起全红的根因:
1. **docker 网络地址池耗尽**:历史 CI 任务遗留 24 个 `GITEA-ACTIONS-TASK-*` 桥接网络未清理,
默认地址池(~16 个 /16 池)占满,此后所有 docker 模式任务创建 job 网络时报
`all predefined address pools have been fully subnetted` 秒败。已清理全部 24 个陈旧网络(10 个网络保留),
清理后 ubuntu-latest docker 模式任务验证成功。
2. **nightly host 模式失败为当时环境问题**:09-24~28 日志显示 runner 容器内 github.com DNS(fake-ip 198.18.0.1)拒绝;
当前 DNS(192.168.3.1)下 runner 容器可访问 github.com,`actions/checkout@v4` 克隆探针成功。
3. `docker:dind` 标签的镜像拉取在本机挂死,该标签不可用;工作流避免使用。
## Workflow 路径行为(实例特性)
- **新仓库只有 `.gitea/workflows/` 路径触发**(树级检测:文件未被本次提交修改也会触发);
drill 仓 `.github/workflows/` 从未触发(含文件被修改的推送)。
- 存量 Agent-System 仓 `.github/workflows/` 正常触发(run 74 = 本日 dev 推送,179 个历史任务均来自该路径)。
- 结论:现有 Agent-System 维持 `.github/workflows/` 不迁移;**新建仓库一律用 `.gitea/workflows/`**。
实例对不同仓库的路径检测差异根因未深究,已记录为已知行为。
## 遗留状态
- drill 仓任务 183/185(docker:dind 拉取挂死)在 UI 呈 running 僵尸态,无实际执行,仓库删除时一并消失。
- 演练仓保留至 U2b 完成(作为保护配置参照),之后删除。
## 对 U2b 的直接输入
- dev/test/main 保护字段组合与白名单保底方案(weichen 进 push whitelist 以不破坏现有直推流程)。
- required checks 的 context 命名格式:`<workflow> / <job> (<event>)`。
- 新流程红线:作者≠批准者由 Gitea 强制;Agent 不得以 weichen 身份批准自己的 PR。
@@ -0,0 +1,49 @@
---
title: "U1 基线清单与主干同步记录"
date: 2026-09-29
task_id: multi-repo-design-2026-09-28
---
# U1 基线盘点与同步结果
## 备份
- 全量 bundle:`~/projects/agent-system-all-2026-09-29.bundle`(193M,--all,verify 通过)。
## 主干同步(D1)
- 本地 dev(1bb48030)→ 远端 dev:fast-forward `fabd85a6..1bb48030`(337 提交),无分叉无重写。
- 补推 11 个缺失 tags(rc-v1.0.0-beta.1–7、rc-v1.1.0-beta.4–7、backup/pre-rewrite-2026-09-13)。
- test/main 未动(test=0e4b111,main=210fe4a)。
## 分支清理(D5)
- 删除已合入 dev 的 25 个远端陈旧分支(chore/、docs/、feature/pu*、fix/nightly-* 等)。
- 保留:dev/test/main、6 个未合入待审分支(integrate-agent-governance-config、
integrate-coordination-db-daemon-impl-closeout、promote-task-bubble-bind-test、
remove-herdr-agent-settings、software-project-bootstrap、squad-missing-target-retry,
均为 2026-09-14~23 遗留,后续逐个审阅收口)、
**feature/u9u12-keys-rollout-2026-09-25(活跃 worktree 任务,已推送远端保存)**。
- 清理后远端共 10 分支。
## Worktree 状态(全部保留)
| 目录 | 状态 | 处置 |
|---|---|---|
| .worktrees/u9u12-keys-rollout-2026-09-25 | 活跃 git worktree,分支 feature/u9u12-keys-rollout-2026-09-25(f9ce7719),干净 | 保留;分支已推远端 |
| .worktrees/full-system-browser-e2e-2026-09-26 | 非 git worktree,仅含 .doc 残留 | 保留不动 |
| .worktrees/promote-rc-beta6-closeout-2026-09-28 | 非 git worktree,仅含 .doc 残留 | 保留不动 |
## 运行制品与治理状态快照
- 树内跟踪 *.test 二进制 4 个(docgov/notification/projectinstance/storage)——U6 阶段以普通提交移除,不重写历史。
- 锁库(.locks/state.sqlite,只读快照):tasks=417、runs=1934、receipts=147、audit_ledger=26682;
agentctl status 若干 busy 项 supervisor_alive=dead(陈旧),未清理——U2a 处理,本轮只记录。
- 工作区唯一脏文件 `.cursor/rules/agentctl-mandatory.mdc`(删除)已恢复(D6),随 U2a 再删。
## 远端仓库现状(同步后)
- Agent-System:dev=1bb48030(=本地),10 分支,无保护(U2b 设置)。
- Development-Manager:dev=main=8867e38,本地一致干净。
- 4 空仓(Squad/Documents/Guidelines/Releases)原样;Releases-Internal(private)待 U6a 前创建。
- governance-drill-2026-09(演练仓,private):已完成 U1.5 全部门禁验证,保留至 U2b 收口。
@@ -0,0 +1,211 @@
---
title: "多仓库架构实施方案:U1–U10 执行计划"
date: 2026-09-29
type: implementation-plan
task_id: multi-repo-design-2026-09-28
basis:
- .doc/remediation/2026-09-28-multi-repo-architecture-plan.md (rev 7)
- .doc/audit/2026-09-28-multi-repo-evidence.md
- 2026-09-29 只读基线核实(Gitea API + 本地仓库)
policy_state: proposed
execution_authority: "design_only; implementation requires user approval"
---
# 多仓库架构实施方案(待审,不生效)
本文件把 2026-09-28 架构方案(rev 7)的 U1–U10 落成可执行的分阶段计划:
每个阶段给出前置、具体步骤(含 Gitea API/命令级细节)、验收、回退和暂停准则。
所有写操作(推送、建仓、改保护、停旧入口)都需用户按阶段批准后才执行;本文不构成授权。
---
## 一、2026-09-29 基线核实结果(只读)
### 与证据文档一致的事实
- Gitea 1.27.3,读取身份 `weichen`(实例 admin)。
- 六仓库:Agent-System 与 Development-Manager 非空,其余四个(Squad / Development-Documents / Development-Guidelines / Releases)仍为空、public、default=main。
- Agent-System 远端 dev/test/main 未动:`fabd85a` / `0e4b111` / `210fe4a`;Development-Manager 远端 dev=`8867e38` 与本地一致、干净。
- 两仓 branch_protections 均为 `[]`,releases 为空。
### 相对证据文档的关键更新
| # | 更新事实 | 对方案的影响 |
|---|---|---|
| N1 | **实例级 runner 存在且在线**:`home-runner`(id=1,online,labels:`ubuntu-latest`/`docker`/`nightly`) | 架构方案"实施前须核实 runner"的前置已满足;U1/U2 的 Gitea 原生 CI 门禁可直接落地,但仍需用一个真实 workflow 验证标签匹配与执行语义 |
| N2 | 本地 dev 领先 origin/dev 从 306 → **337** 提交,HEAD `1bb48030`(含方案三文档、rc-v1.1.0-beta.5/6 晋升、多个产品修复);无 behind,纯 fast-forward | U1 的"差异同步"对象扩大;同步本身仍是 U1 第一决策 |
| N3 | 远端分支从 3 个 → **29 个**(大量 2026-09-22~23 的陈旧 feature/* 分支) | U1 基线盘点需含远端分支清理清单 |
| N4 | 实例**单用户**(weichen,admin)、无组织 | KTD4 的"每人一个 fork"退化场景成立:首期不需要 fork,直接 repo 内 feature 分支 + PR(见决策 D2) |
| N5 | 工作区有一个未提交删除:`.cursor/rules/agentctl-mandatory.mdc` | 属于 U2a 内容,不应混入 U1 基线同步;先恢复,在 U2a 作为首个提交处理 |
| N6 | workflows 仍仅在 `.github/workflows/`(ci.yml、nightly-real-pi.yml),无 `.gitea/workflows/` | U2b 切换 CI 时需确认实例 ACTIONS 路径配置,避免双跑(沿用架构方案 KTD CI 节) |
凭证说明:`~/.secrets/gitea` 为 YAML(`url_prefix` + `access_token` 两键),token 对 API 有效(token/Bearer 均可)。本文件不含凭证值。
---
## 二、总体执行序列
```
Phase 0 U1 基线与治理试点 ──────────────出口:治理替代清单可审、远端同步完成
Phase 1 U2a 本地减负 ─→ U2b 远端交接 ───出口:编码流程零 agentctl 依赖(V19–V26)
Phase 2a U7a Agent-Native 契约(最小模块)─出口:contract SHA 可供 U4 消费
Phase 2b U4 Squad 提取 ∥ U7b Native 内核提取
U3 文档仓拆分 ∥ U8 Web 拆分 ∥ U10 单文件/多实例(可在现仓并行早启)
Phase 3 U5 外层仓收口 ─→ U6b 多仓组合发布
早交付线 U10 → U6a 单仓单文件内部 RC(不等待拆仓,Phase 0 后即可并行)
独立线 U9 PI parity(依赖 U7a 契约;能力盘点 U9a 可随时提前)
```
架构方案定的依赖顺序不变:U1→U2→U7a→U4/U7b;U3/U8 穿插;U5 收口;U9 独立验收。
每个 Phase 出口都是一个可暂停点:保留当时已验证的组合,不半开新门禁。
---
## 三、需用户确认的决策点(开工前批准)
| ID | 决策 | 建议 | 理由 |
|---|---|---|---|
| D1 | 337 提交如何同步到远端 dev | **整体 fast-forward push dev**(不 push 全部分支);test/main 暂不动 | 无 behind、无分叉,机械安全的路径;远端 dev 自 2026-09-24 起未变,阻塞了 U1 之后一切远端治理试点。push 前先 `git push --dry-run` + 备份 `git bundle` |
| D2 | 单用户下的协作模型 | ~~不建机器人账号~~ → **D2'(09-29 演练修正):已创建机器账号 `agent-bot`**。演练证实 Gitea 1.27.3 硬禁止自批准(author approve own pull → "approve your own pull is not allowed",admin 亦不可),单账号下 required_approvals 永远无法满足。最终模型:编码 Agent 以 agent-bot 提交/建 PR,用户以 weichen 批准+合并。不建 fork | 见[演练记录](../audit/2026-09-29-governance-drill-record.md);agent-bot 凭据在 `~/.secrets/agent-bot`(token scope: write:repository, read:user) |
| D3 | 新仓库创建时机 | 只新建 3 个:`Agent-Native`(U7a 时)、`Agent-System-Web`(U8 时)、`Agent-System-Core`(U5 时);`Agent-System-Releases-Internal`(U6a 前,**private**)。其余 4 个复用空仓 | 仓库跟着实施单元走,避免空壳仓库先行;Releases-Internal 必须 private 并做匿名拒绝验证(V5) |
| D4 | runner 信任边界 | 实例 runner 只有一台;U2b 起 PR 触发的 workflow 一律**无秘密、无共享环境写权限**(`nightly` 标签任务除外,它持部署凭证但只由 protected 分支/维护者触发) | 单 runner 同时服务不可信 PR 代码与可信 nightly,必须按 Gitea Actions token 权限文档隔离;架构方案 CI Trust 节的落地 |
| D5 | 29 个远端陈旧分支 | U1 盘点后按清单**删除已合入 dev 的**;保留 dev/test/main 与仍活跃的(如 feature/squad-missing-target-retry 系列) | 分支堆积干扰 U1 基线与后续 PR 流;删除可逆(reflog + 对象仍在) |
| D6 | 工作区未提交的 `.cursor/rules/agentctl-mandatory.mdc` 删除 | U1 先 `git restore` 恢复;到 U2a 随"解除强制 hook"提交一起删除 | 保持 U1 基线同步为纯 fast-forward,不夹带治理变更 |
| D7 | (09-29 用户指令)**不破坏现有 Agent-System 系统**:所有拆分/迁移工作放入 `~/projects/` 下**新目录**(单一目录+submodule 结构,即未来外层仓工作区);对现有仓的一切治理变更走 feature 分支 + PR,不直接改 dev 运行状态 | 新目录承载 Agent-Native/Web/Squad/Documents/Guidelines 各组件仓 clone 与外层结构;现有 Agent-System 保持在原位运行,直到 U5 收口以普通提交完成外层化 | 用户 09-29 指令;与 R9 可迁移可停止一致 |
---
## 四、Phase 0 — U1 基线与治理试点(预计 1–2 日)
目标:远端与本地一致、治理演练仓验证 Gitea 原生门禁真实行为、产出 U2 所需的完整替代清单。
### 步骤
1. **本地备份**:`git bundle create ../agent-system-dev-$(date +%F).bundle --all` 并验证 `git bundle verify`;记录恢复步骤。
2. **处理脏工作区**(D6):`git restore .cursor/rules/agentctl-mandatory.mdc`。
3. **盘点(只读,产出清单文件)**:
- 本地/远端分支映射表(29 远端 + 本地 feature/* 与 docs/*),逐条标注 keep/delete/merge-pending;
- 活跃 worktrees(当前 3 个:u9u12-keys-rollout 注册在册,另 2 个目录核查归属);
- 运行制品身份:rc-v1.1.0-beta.* tags、主仓树内 *.test 二进制清单(后续移除对象,历史不重写);
- `.locks/state.sqlite` 快照(busy/recovery_required 计数)与活跃 agentctl 任务。
4. **同步主干**(D1 批准后执行):`git push --dry-run origin dev` 核对 fast-forward → `git push origin dev`。不 push 其他分支;test/main 不动。
5. **建演练仓**(一次性、可删):创建 `weichen/governance-drill-2026-09`(临时 private),在其中验证以下 Gitea 原生行为,逐项记录证据(对应架构方案 V6/V23 的前置):
- 分支保护 API:`POST /repos/weichen/governance-drill-2026-09/branch_protections`,字段组合:`enable_push=false`、`required_approvals=1`、`block_on_official_review_requests=true`、`dismiss_stale_approvals=true`、`status_check_contexts=["ci/verify"]`;
- 验证旁路负例:API/Web/HTTP 直推被拒;无 approve 的合并被拒;head 更新后旧 approve 被撤销;required check 缺失时合并被拒;
- 合并语义:merge/rebase/squash 各触发一次,记录 `merge_commit_id`/`head_commit_id` 行为,确认"合入后 tree 可核验"路径;
- runner 真实执行:push 一个最小 workflow(`on: pull_request`,runs-on 匹配 `ubuntu-latest` 或 `docker`),确认实例 runner 认领并跑通,验证 job token 权限边界(尝试跨仓读应失败);
- `.github/workflows/` 与 `.gitea/workflows/` 双路径是否双跑(决定 U2b 迁移路径)。
6. **产出**:`.doc/ops/` 下新增《U1 基线清单》+《Gitea 门禁演练记录》;按 KTD13 更新 retain/replace/remove 矩阵为最终可审版。
### 出口 / 回退
- 出口:远端 dev=本地 dev;演练仓全部负例有证据;D5 清单获批;U2 范围冻结。
- 回退:主干 push 不改变历史(纯 fast-forward),无需回退;演练仓直接删除。
- 暂停准则:演练中任一门禁旁路成功(负例失败)→ 停止 U2 计划,先解决实例配置。
---
## 五、Phase 1 — U2 治理切换(预计 3–5 日,U1 后重估)
### U2a 本地减负(先做,只依赖 U1 的基线核对)
1. Development-Manager 侧修改 agentctl 职责(KTD13/KTD15):
- 删除普通编辑/提交的全局 `with`/SQLite 前置;锁域改为 `workspace_id+path` 局部身份;
- `overlaps` 不再比较 `path:.` 类全局资源;候选冲突只隔离该候选工作区;
- 失败分类落地:preflight_rejected / failed_known / outcome_unknown(V21);
- task 子系统退出编码流程:不再要求 register/claim/lease/close(历史只读保留)。
2. 主仓侧配套(一次提交,含 N5 的 hook 删除):
- 删除 `.cursor/rules/agentctl-mandatory.mdc` 与对应 hook 转发;
- `AGENTS.md`/`PROJECT.md` 按三层规范(Guidelines → 各仓短文件 → CI/执行器规则)改写;
- 保留纯 Git 主干误提交保护、秘密防护、单工作区 owner。
3. 新增测试(Development-Manager):`test_workspace_isolation.py`、`test_operation_outcomes.py`、`test_task_lifecycle.py`、`test_cleanup_allowlist.py`;主仓保留与新合同相符的 `test_agentctl*.py` 子集。
4. 验收(V19/V20/V22/V26 前半):两个 worktree 改同路径互不阻塞;停 daemon/损坏缓存仍可本地开发提交;完整"修复→测试→提交→PR"流程零 agentctl 调用。
### U2b 远端交接(依赖演练仓全部负例通过)
1. Agent-System 正式设置分支保护:dev/test/main 按演练确认的字段组合(D4 信任边界);首期 `required_approvals=1` 由用户人工 approve(D2)。
2. 迁移 CI 到确定路径(避免双跑,N6);PR workflow 无秘密;nightly 保持维护者触发 + `nightly` 标签。
3. 停用旧本地 dev 推进入口(`git-push-dev.sh` 直推路径、agentctl integrate 入口):先排空在途操作(`agentctl status` 无 running/busy),记录旧新权限清单,同一提交内生效。
4. 切换验证(V23):旧 token/hook/本地 integrate 不能推进远端;无 approve/CI 的 PR 不能合并;陈旧 head 不能合并。
5. 四类日常演练(V24):文档微调 / 单组件 bug / 跨仓 API 变更 / 共享 DB 迁移,确认低风险不再被旧模板强制全流程。
### 出口 / 回退
- 出口:远端唯一写权威=Gitea 保护分支+PR;本地编码零 agentctl;治理命令调用数显著下降(记录基线对比)。
- 回退:若保护/CI 行为异常,恢复旧入口前必须先关闭新写权威(不同时双开);保留旧管理库只读。
---
## 六、Phase 2 — 组件拆分(可部分并行)
### U7a Agent-Native 最小契约(预计 1–2 日,Phase 1 后立即)
1. 现 chat-agent-system 仓内冻结助手/Squad 执行行为与副作用语义(不改默认后端);
2. 定义 contract 包(Execute 输入输出/事件/错误/能力/取消),不依赖 config/workspace;
3. 新建 `weichen/Agent-Native` 仓(D3),首提交只含 contract + go.mod + conformance fake 测试;
4. 推送、打 tag(如 `contract/v0.1.0`),产出 U4 可固定的 SHA。
### U4 Squad 提取(预计 5–8 日)∥ U7b Native 内核(预计 4–7 日)
- U4 按 KTD1:先现仓依赖注入/材料解析去耦(保持行为)→ filter-repo 抽取至 `Agent-System-Squad`(复用空仓)→ 主仓留临时 facade 适配 29 个调用文件 → 迁移算法测试 + 新增双侧 contract_test。主仓以相邻 replace(`../squad`、`../agent-native`)联调,`GOWORK=off` 正式构建。
- U7b 迁 agentx/runtime、工具/模型/执行会话、PI transport 适配器至 Agent-Native;`pi-native` 旧名 alias、AGENTX_* 配置、transcript 根兼容期保留(V16)。
- 共同出口:两库均无 `chat-agent-system/internal/*` import、可独立 `go build`/`go test`;真实 PI 与 Native 分别验证,fallback 不冒充 native PASS(V13)。
### U3 文档拆分(预计 2–3 日)
- 通用规范 → `Development-Guidelines`(复用空仓);静态设计/审计 → `Agent-System-Development-Documents`(复用空仓);
- 机器契约 `module-boundaries.yaml` 留代码仓 `configs/architecture/`;CURRENT/MATRIX 活动文档**暂留**原路径(KTD2 首期不整体替换);
- 主仓建 `development/` gitlinks;文档仓内容经 PR 合入后由主仓 gitlink 显式采纳;
- 历史导入前先扫描将公开内容(架构方案 Risks 节的阻断出口)。
### U8 Web 拆分(预计 3–5 日)
- 迁 web 源码/npm 锁/前端测试至 `Agent-System-Web`(D3 新建);Go embed 入口留应用侧 `internal/webassets`;
- 构建链:固定 Web SHA → `npm ci && npm run build` → dist 物化到隔离构建上下文 → 摘要校验后编译;
- static_assets 多路径猜测在发布模式禁用(V15);新增 `test_web_asset_assembly.py` 与 manifest 校验。
### U10 单文件/多实例(可与 Phase 2 并行,基于 U1 最低基线)
- U10a:迁移 SQL/prompts/xlsx 等内嵌 fs.FS;同一程序 serve/init/migrate/config 子命令;
- U10b:ConfigSnapshot 统一(默认→.env→进程 env→CLI→instance-settings),字段唯一 owner,saved/applied 分离(V28/V32);
- U10c:实例隔离(instance_id/目录重叠/cookie 独立/进程归属,V29–V31/V33/V34);managed-local PG 为可选后续 profile,首期 CLI 明确 unsupported。
---
## 七、Phase 3 — 收口与发布
- **U5 外层仓**(2–4 日):剩余产品代码 → `Agent-System-Core`;主仓变纯组合入口(components.yaml + gitlinks + 构建配方);验证全新 recursive clone / 源码 bundle / 无原路径构建(V9)。
- **U6b 多仓发布**(2–3 日):同一配方切换固定组件组合,重跑 U6a 全部验收;私有 RC → 用户审批 → 公开晋升,附件摘要一致(V5/V10/V11)。
## 八、早交付线 — U10 → U6a 单仓单文件内部 RC
Phase 0 后即可并行:在现单仓完成 U10a/U10b 最小集 → `scripts/build-single-binary.sh` 完善 → 干净 Ubuntu 26.04 amd64 验收(V9/V27 部分)→ 发布至 `Agent-System-Releases-Internal`(新建 private,D3)→ 匿名/无权限下载拒绝验证(V5)。不等待任何拆仓。
## 九、独立线 — U9 PI parity
U9a 盘点(1–2 日)可立即做:固定上游 0.85.1 三层基线,产出 parity matrix(available/partial/missing/not_required + 证据)。U9b–e 依赖 U7a 契约与 U7b 内核;全程禁用 fallback 验收 native(V17/V18),分批计划在 U9a 后单独报批。
---
## 十、风险与暂停准则(汇总)
| 风险 | 触发信号 | 动作 |
|---|---|---|
| Gitea 保护旁路 | 演练负例未全部拒绝 | 停 U2b;不上线新权威 |
| 单 runner 被不可信代码滥用 | PR workflow 越权访问跨仓/秘密 | 收紧 token/标签路由;必要时暂停 PR CI |
| 拆仓等价性破坏 | Squad/Native contract 回归失败 | 保留旧组合;该组件暂停,其他组件不受牵连 |
| 单文件验收失败 | 干净机启动缺资产/误连 dev DB | U6a 不发布;修 U10 对应项 |
| 历史含敏感内容 | 公开导入扫描命中 | 阻断对应仓库公开化;仅走内部包 |
| 在途治理操作未排空 | 切换时存在 running/recovery_required | 延后 U2b 切换;不清空管理库 |
三条独立回退路径保持不变:产品代码回退(git)、部署制品回退(Release 附件)、DB/用户文件恢复(备份)。
## 十一、验收映射
V1–V5/V10/V11 → Phase 0/U6;V6/V23/V24 → Phase 1;V13/V16/V19–V22/V25/V26 → Phase 1–2;V7/V8 → U4/U3;V9/V15/V27–V34 → U10/U6a/U6b;V12 → U5/U6b;V14 → U7 后新增 adapter 时;V17/V18 → U9。全部证据落 `.doc/audit/` 或 Release 元数据,绑定最终 SHA。
---
## Definition of Done(本方案自身)
用户批准决策点 D1–D6 并批准首个 Phase 后,本文件升级为生效执行计划;各单元完成以架构方案 Definition of Done(U1–U8、U10 出口 + V 证据)为准。未获批准前,一切远端写操作不执行。
+36 -21
View File
@@ -8,7 +8,7 @@ on:
branches: [dev, test, main]
jobs:
go-vet-and-short-test:
go-vet:
runs-on: ubuntu-latest
services:
postgres:
@@ -17,8 +17,6 @@ jobs:
POSTGRES_USER: app
POSTGRES_PASSWORD: ci_secret_db_pass
POSTGRES_DB: agent_system_ci
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U app -d agent_system_ci"
--health-interval 5s
@@ -37,22 +35,41 @@ jobs:
- name: migration gate
env:
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@localhost:5432/agent_system_ci?sslmode=disable
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@postgres:5432/agent_system_ci?sslmode=disable
run: go test -count=1 -run TestMigrationGate ./internal/db/...
- name: go test (short)
env:
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@localhost:5432/agent_system_ci?sslmode=disable
run: go test -short -timeout 20m ./...
- name: governance PG integration (no -short)
env:
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@localhost:5432/agent_system_ci?sslmode=disable
run: go test -count=1 -timeout 15m ./internal/server/ -run 'TestWorkflowGovernance_PG_|TestE2E_WorkflowGovernance'
- name: arch-check (block cleared kinds)
run: ./scripts/arch-check.sh --mode block
short-tests-report:
# 存量已知失败(会话项目绑定等环境依赖用例)在 CI 从未通过;先报告不阻断,
# 跟踪 issue #2,修绿后并入 go-vet 必需门禁。
continue-on-error: true
runs-on: ubuntu-latest
services:
postgres:
image: pgvector/pgvector:pg16
env:
POSTGRES_USER: app
POSTGRES_PASSWORD: ci_secret_db_pass
POSTGRES_DB: agent_system_ci
options: >-
--health-cmd "pg_isready -U app -d agent_system_ci"
--health-interval 5s
--health-timeout 5s
--health-retries 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.27.1"
cache-dependency-path: go.sum
- name: go test (short, report-only)
env:
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@postgres:5432/agent_system_ci?sslmode=disable
run: go test -short -timeout 20m ./...
backup-restore-drill:
runs-on: ubuntu-latest
services:
@@ -62,8 +79,6 @@ jobs:
POSTGRES_USER: app
POSTGRES_PASSWORD: ci_secret_db_pass
POSTGRES_DB: agent_system_ci
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U app -d agent_system_ci"
--health-interval 5s
@@ -82,24 +97,24 @@ jobs:
- name: migrate and seed schema
env:
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@localhost:5432/agent_system_ci?sslmode=disable
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@postgres:5432/agent_system_ci?sslmode=disable
run: go test -count=1 -run TestMigrationGate ./internal/db/...
- name: pg_dump backup
env:
PGPASSWORD: ci_secret_db_pass
run: |
pg_dump -h localhost -U app -d agent_system_ci -Fc -f /tmp/system_ci.dump
pg_dump -h postgres -U app -d agent_system_ci -Fc -f /tmp/system_ci.dump
pg_restore --list /tmp/system_ci.dump >/dev/null
- name: restore to fresh database and re-run migrations
env:
PGPASSWORD: ci_secret_db_pass
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@localhost:5432/agent_system_ci_restore?sslmode=disable
TEST_DATABASE_URL: postgres://app:ci_secret_db_pass@postgres:5432/agent_system_ci_restore?sslmode=disable
run: |
psql -h localhost -U app -d postgres -c "DROP DATABASE IF EXISTS agent_system_ci_restore;"
psql -h localhost -U app -d postgres -c "CREATE DATABASE agent_system_ci_restore;"
pg_restore -h localhost -U app -d agent_system_ci_restore --no-owner --no-privileges /tmp/system_ci.dump
psql -h postgres -U app -d postgres -c "DROP DATABASE IF EXISTS agent_system_ci_restore;"
psql -h postgres -U app -d postgres -c "CREATE DATABASE agent_system_ci_restore;"
pg_restore -h postgres -U app -d agent_system_ci_restore --no-owner --no-privileges /tmp/system_ci.dump
go test -count=1 -run 'TestMigrationGate|TestPhase5_BackupRestoreMigration_PG' ./internal/db/... ./internal/server/...
web: