docs: propose multi-repo architecture and release workflow
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
---
|
||||
title: "多仓库架构研究证据与审查记录"
|
||||
date: 2026-09-28
|
||||
task_id: multi-repo-design-2026-09-28
|
||||
evidence_basis: current_source_and_readonly_api
|
||||
---
|
||||
|
||||
# 多仓库调研证据
|
||||
|
||||
范围:[待审方案](../remediation/2026-09-28-multi-repo-architecture-plan.md)。
|
||||
记录只读 API 和源码事实,不包含业务正文、凭证值、认证头、原始数据库或敏感截图。
|
||||
未对远端执行 POST/PATCH/DELETE,也未 push、部署或创建远端仓库。
|
||||
|
||||
## Git and Gitea
|
||||
|
||||
本地研究基线:dev@a3db288a7aa055ff5884e3aa4d91511959cff721,开始时主目录干净。
|
||||
任务 worktree:.worktrees/multi-repo-design-2026-09-28,分支 feature/multi-repo-design-2026-09-28。
|
||||
`git rev-list --left-right --count fabd85a65e15f3417431ba6f004a8bcdf9cb83cb...a3db288a7aa055ff5884e3aa4d91511959cff721` 返回 `0 306`。
|
||||
因此领先 306 不是仅依据缓存 origin/dev;远端实时 API 的 SHA 与缓存一致,且祖先关系已核对。
|
||||
本轮未 fetch 修改 remote-tracking ref,未同步远端。
|
||||
|
||||
Gitea GET /api/v1/version 返回 1.27.3。
|
||||
GET /api/v1/user/repos 分页(本次一页已取完六仓),仅保留所需元数据:
|
||||
|
||||
| 仓库 | private | empty | default_branch | description | 结论 |
|
||||
|---|---|---|---|---|---|
|
||||
| weichen/Agent-System | false | false | dev | 空 | 保留主仓 |
|
||||
| weichen/Agent-System-Squad | false | true | main | 空 | 名称可复用,尚无组件内容 |
|
||||
| weichen/Agent-System-Development-Documents | false | true | main | 空 | 可复用,导入内容须分类 |
|
||||
| weichen/Development-Guidelines | false | true | main | 空 | 可复用 |
|
||||
| weichen/Agent-System-Releases | false | true | main | 空 | 只适合公开发布目标 |
|
||||
| weichen/Development-Manager | false | false | dev | 空 | 已有治理工具,不应重建覆盖 |
|
||||
|
||||
仓库 has_actions=true 只证明设置开启,不证明 runner/CI/权限可用。
|
||||
所有六仓当前读取身份有 admin/push/pull 权限;此事实不扩大本轮授权。
|
||||
|
||||
Agent-System 实时分支摘要:
|
||||
- dev: fabd85a65e15f3417431ba6f004a8bcdf9cb83cb
|
||||
- test: 0e4b111dff3726f5379e8168e3d00a244e111747
|
||||
- main: 210fe4a7bb2fd56c34a215c53e07617cccf81e49
|
||||
- 三分支 protected=false,GET branch_protections 返回 []。
|
||||
|
||||
Development-Manager 的 branch_protections 同样返回 []。
|
||||
两仓 GET releases?limit=3 返回 [];只说明本次未列出发布记录,不把 Git tags 当 Releases。
|
||||
两仓 repository-level GET actions/runners 返回 runners=[];没有检查实例级/组织级 runner,不推断整个实例无 runner。
|
||||
四个 empty 仓的 branches 返回 null,与 empty 状态一起解释为没有可列出的分支,不虚构 main 已有提交。
|
||||
|
||||
读取本机 /swagger.v1.json:
|
||||
MergePullRequestOption 的 do enum 包含 merge/rebase/rebase-merge/squash/fast-forward-only/manually-merged;
|
||||
包含 head_commit_id、merge_commit_id、force_merge。
|
||||
BranchProtection 包含 required_approvals、dismiss_stale_approvals、block_on_outdated_branch、status_check_contexts、push/merge allowlist 等。
|
||||
这是字段证据,未验证运行语义;方案 U1/U2 要做授权演练。
|
||||
|
||||
## Existing Development Manager
|
||||
|
||||
远端 README/PROJECT/MIGRATION 当前可读。
|
||||
MIGRATION 记录:2026-09-24T15:39Z,从 Agent-System dev@edbe59247872ef5861bafd30068955e22288c6ff 复制式拆出;新初始历史,未携带 .locks。
|
||||
PROJECT 将其定位为治理工具权威演进仓,阶段 A 通过 projects 聚合本机各项目 .locks,阶段 B 中央 API 尚预留。
|
||||
这是仓库文档的当前声明,不等于运行态部署证明。
|
||||
|
||||
本机 Development-Manager 目录存在,dev@8867e38ceb7cc71fa65d1a0f80178faff53fcb4c,工作树干净,缓存 origin/dev 无领先/落后提示。
|
||||
本次未单独核对其远端 dev SHA,因此不声称实时完全同步。
|
||||
本机 Development-Guidelines 目录不存在;历史记忆中的同名旧工作区不作为当前事实。
|
||||
|
||||
## Squad Boundary Evidence
|
||||
|
||||
| 路径 | 当前机制 | 设计影响 |
|
||||
|---|---|---|
|
||||
| internal/squad/service.go:113 | Service 引用主仓 config.Config | 注入 Options,不反向依赖主仓 |
|
||||
| internal/bizdev/service.go:195 | 直接 squad.NewService(cfg) | 装配与适配保留产品应用 |
|
||||
| internal/squad/workflow.go:547 | agent.Request、重试/失败分类与物化 | 执行端口、失败语义、重试归属要显式 |
|
||||
| internal/squad/service.go:256 | 直接主仓 stream 事件 | Squad 事件由应用映射至 SSE/持久状态 |
|
||||
| internal/squad/workspace_adapter.go:6 | 返回主仓 WorkspaceRef | 适配留应用侧 |
|
||||
| internal/squad/service.go:524 | templates/xlsx/cdo_quote.xlsx | 运行包资产不能仅包含 Markdown |
|
||||
| internal/bizdev/service_task_finalize.go:68 | 质量失败短路 | 不可将执行完成等同正式提交 |
|
||||
| internal/bizdev/service_task_finalize.go:35 | 编制人提交身份与 OnBehalfOf 分离 | 不改变产品授权 |
|
||||
| .doc/system-design/module-boundaries.yaml:283 | 七包依赖 allowlist | 先解耦,再独立 Go 模块 |
|
||||
|
||||
rg 穷举正式 Go import 显示 Squad 直接使用方涉及 29 文件/9 目录,包括 bizdev/chat/coordinator/server/intent/materialindex/projectcontext 与 CLI/script。
|
||||
主模块 `go.mod` 为 `module chat-agent-system`,Go 版本声明 1.27.1;本轮不推断目标机器工具链已安装。
|
||||
独立模块继续 import 主仓 internal 包不可行。
|
||||
现行模块开发标准明确模块化单体;仓库独立不自动授权增加 RPC/微服务。
|
||||
|
||||
## Tooling and Documentation Evidence
|
||||
|
||||
| 路径 | 观察 | 必须适配 |
|
||||
|---|---|---|
|
||||
| scripts/agentctl.py:598–610 | Git common-dir 需等于 main/.git | 标准 submodule 的 .git 文件布局当前不支持 |
|
||||
| scripts/agent_worktree.py:95–102 | 要求主工作区 .git 为目录 | 不能仅改 agentctl 一个入口 |
|
||||
| scripts/agentctl.py:642–669 | 直接 sqlite3.connect 至本地主仓 .locks/state.sqlite | 多 clone 不是共享协调域 |
|
||||
| scripts/agentctl.py:2861 | 本地 manager.lock 与队列循环 | 本地 daemon 不等于跨机服务 |
|
||||
| scripts/agentctl.py:1599–1625 | 按父仓 staged 文件识别共享文档并查收据 | .doc gitlink 不能替代内容级检查 |
|
||||
| scripts/agentctl.py:1287 / 1333 / 2245 | git show / cat-file 读取 HEAD/dev 中的文档与证据 | 跨仓 repo+SHA+path 引用 |
|
||||
| internal/archtest/boundaries.go:107 | 机器模块契约位于 .doc | 留在代码仓,不作为普通文档搬离 |
|
||||
| scripts/candidate-images-build.sh:60 | 仅 git archive 主仓提交 | 子模块源码固定递归导出 |
|
||||
| scripts/pi_subagents.py、agentctl_w4.py、.cursor | 多处固定 .doc 位置 | 客户端入口、报告及治理一起迁移 |
|
||||
|
||||
主目录 agentctl status 本轮返回 status=ok、protocol version=1;
|
||||
实际 policy revision 为 agent-governance-2026-09-23-fav-constraint-restored。
|
||||
CURRENT 顶部历史摘要仍有 2026-09-23 信息,活跃任务表更晚;方案未用其历史环境状态代替 Git/API 现状。
|
||||
|
||||
## Build and Runtime Assets
|
||||
|
||||
- scripts/build-single-binary.sh 构建 Web,然后 CGO_ENABLED=0 构建 cmd/server,写入版本 ldflags;不是全平台发布流程。
|
||||
- web/embed.go 的 go:embed all:dist 可将前端纳入二进制。
|
||||
- templates/embed.go 仅嵌入 docs/*.md;internal/template/loader.go 读取 configs/agents 指令和 configs/shared/writing.md。
|
||||
- deploy/app/Dockerfile 仍显式复制 web/dist、迁移、templates、configs,构建 server/events。
|
||||
- internal/localpg/localpg.go 查找本机 pg_ctl;数据库不是被 Go 服务自带。
|
||||
- deploy/pi-agent/Dockerfile 使用 Node 22 与单独 PI 包,固定 CLI 0.85.1;Runner 是额外执行依赖。
|
||||
- .github/workflows/ci.yml 有 Go/PG/Web 验证;nightly-real-pi.yml 有 Gitea 专用 runner/上传兼容说明。
|
||||
- 主仓 tree 跟踪 docgov.test、notification.test、projectinstance.test、storage.test;制品仓应避免继续提交二进制正文,历史不自动重写。
|
||||
- 未编译新平台、未启动服务、未读模型密钥、未读取 IDE 中业务 output.md。
|
||||
|
||||
## Lessons Reused
|
||||
|
||||
检索 .doc/audit/ISSUES.md 与 .doc/ops/lessons/INDEX.md,核对当前源码后采纳:
|
||||
- LESSON-20260923-matrix-status-cas:文档状态与 CAS 收据不能因拆仓失效。
|
||||
- LESSON-20260924-cursor-hook-advisory-gates:客户端提示与硬门禁分层,不称 UI/本地 hook 足以保护远端。
|
||||
- LESSON-20260926-failclosed-bypass-contract:缺失组件/收据/权限失败关闭,禁止 gitlink 绕过。
|
||||
- LESSON-20260927-server-facts-and-iso-db-recipe:未来验证使用明确隔离 DB,不回退至真实 dev。
|
||||
- 当前 Squad step-empty-output、squad-commit-authority、quality-heading 相关台账按原状态保留;本轮不修复、不关闭。
|
||||
|
||||
这次没有实施与运行验证,不新增 validated 经验;多仓适配风险在本研究记录和计划出口追踪,进入实施后按对应失败事实建问题/回归记录。
|
||||
未修改共享 ISSUES/CURRENT/MATRIX,避免把待审架构建议写成现行缺陷修复/生效规范。
|
||||
|
||||
## Review Record
|
||||
|
||||
ce-plan 研究后,由 ce-doc-review 的一致性、可执行性、安全、范围、产品价值、反向挑战视角复核。
|
||||
本地审查的四项实际修订:
|
||||
1. 五分钟上游通知明确为后续自动化目标,首期检查点不伪称实现该 SLA。
|
||||
2. U1 只验基线/平台可行性,完整候选队列/回写恢复在 U2 实现后验收,消除前置依赖循环。
|
||||
3. 内部完整源码包与公开源码包分开;公开包采用允许清单,排除私有开发资料,并加入负例。
|
||||
4. U6a 提前从当前固定单仓基线交付私有包试点,U6b 在拆仓后复验同一构建合同。
|
||||
|
||||
补充跨模型检查曾通过 ce-doc-review 的 claude CLI 路线请求 claude-opus-5/high,对 security/product/adversarial/whole-doc 发起只读复核。四个任务在本地审查完成后仍未返回结果,主代理主动终止附加检查;runner 记录 timeout(reaped on request before completion),result 读取均返回 3、没有审查产物。未验证实际服务模型,未将其计为独立复核或 PASS。此限制不改变本地六视角的事实与修订记录。
|
||||
|
||||
本地审查汇总:coherence 1、feasibility 1、security 1、product 1 项已修订;scope/adversarial 没有追加有效问题。未对复用同一子代理上下文的后续角色作独立性加权。
|
||||
用户要求完整待审方案,允许对本轮草稿调整完善,四项修改均保持 Product Contract 与用户已确认边界;不存在需要以草稿修订为由提前实施的动作。
|
||||
|
||||
最终文档检查:三份 Markdown 的 frontmatter、代码围栏、相对链接、R1–R10/U1–U6/V1–V12 覆盖与 whitespace 检查通过;git diff --check 通过。实施测试均未运行。
|
||||
只读收口:agentctl cleanup report exit=0,19 worktrees,ready=0、blocked=19;没有删除。agentctl docs drift exit=0,30 records、regressions=0、open_capabilities=3;没有改 MATRIX。
|
||||
CodeGraph 在开始与收口运行 sync -q 成功;其近似索引仅辅助定位,依赖完整性以 rg 核对。
|
||||
这些是文档审查修订,不是系统已支持的能力。
|
||||
|
||||
## External References
|
||||
|
||||
- [Git submodule](https://git-scm.com/docs/git-submodule):固定提交、相对 URL 解析。
|
||||
- [Go 模块布局](https://go.dev/doc/modules/layout):internal 可见性与公开包。
|
||||
- [Go cgo](https://go.dev/cmd/cgo/):交叉编译与 C 工具链边界。
|
||||
- [Gitea Actions FAQ](https://docs.gitea.com/usage/actions/faq/):PR head 与合并候选区别。
|
||||
- [Gitea Actions token](https://docs.gitea.com/usage/actions/token-permissions/):fork 和跨仓权限。
|
||||
- [Gitea 保护分支](https://docs.gitea.com/usage/access-control/protected-branches/):审批与状态检查配置。
|
||||
- [Gitea 仓库权限](https://docs.gitea.com/1.22/usage/permissions/):私有仓访问语义;最终以实例 ACL 实测为准。
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: "多仓库架构与 fork/PR 协作设计"
|
||||
task_id: multi-repo-design-2026-09-28
|
||||
status: done
|
||||
created: 2026-09-28
|
||||
updated: 2026-09-28
|
||||
owner: Codex
|
||||
task_type: research
|
||||
task_tier: multi_stage
|
||||
policy_revision: "agent-governance-2026-09-23-fav-constraint-restored @ a3db288a7aa055ff5884e3aa4d91511959cff721"
|
||||
branch: feature/multi-repo-design-2026-09-28
|
||||
worktree: .worktrees/multi-repo-design-2026-09-28
|
||||
base_dev_sha: a3db288a7aa055ff5884e3aa4d91511959cff721
|
||||
write_scope:
|
||||
- .doc/ops/short-term/2026-09-28-multi-repo-design.md
|
||||
- .doc/remediation/2026-09-28-multi-repo-architecture-plan.md
|
||||
- .doc/audit/2026-09-28-multi-repo-evidence.md
|
||||
allowed_environments: []
|
||||
mutex: path:multi-repo-design-documents
|
||||
review_state: pending
|
||||
integration_state: not_required
|
||||
deployment: not_required
|
||||
cleanup: retained-with-reason
|
||||
cleanup_owner: "审核后独立维护者"
|
||||
cleanup_trigger: "用户审阅完成且原 owner 退出"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 多仓库设计任务
|
||||
|
||||
## 用户目标与授权
|
||||
|
||||
来源:2026-09-28 本会话用户要求深入设计主仓 + 子仓 + submodule、fork/PR/上游同步、Gitea 多平台二进制发布,先提交待审方案,未审阅前不生效。允许读取本地代码和 Gitea 仓库元数据,生成本任务文档。仓库描述本轮仅拟稿,实际远端写入留到用户审阅通过后的执行阶段。
|
||||
|
||||
交付终点为可审方案与证据;不迁移代码、不创建或改写远端仓库、不调整权限/描述、不 push、不合入 dev、不部署、不访问业务正文。本地创建任务 worktree 和登记仅承载研究产物。
|
||||
|
||||
## 相关问题与经验
|
||||
|
||||
检索词:submodule、fork、跨仓、迁移、路径、candidate、squad、failclosed。
|
||||
采纳现有经验中的路径/快照一致性、拒绝旁路和未知状态、CURRENT/MATRIX 收据与证据绑定检查。
|
||||
历史多主机协调方案仅作线索,已重新核查本次源码与机器状态,不将方案当上线事实。
|
||||
本任务不修复已有业务问题,不将候选经验升级为 validated。
|
||||
|
||||
## 步骤与验收
|
||||
|
||||
1. 核对本地 dev、实时 Gitea、仓库用途和保护设置。
|
||||
2. 研究 Squad、文档、规范、治理工具、构建发布边界。
|
||||
3. 制定方案、分阶段迁移/回退与验收矩阵。
|
||||
4. 完成文档复核、差异/链接检查及只读收口盘点。
|
||||
|
||||
## 验证与交接
|
||||
|
||||
本地基线 a3db288a7aa055ff5884e3aa4d91511959cff721;Gitea dev 实时为 fabd85a65e15f3417431ba6f004a8bcdf9cb83cb,已验证远端为祖先,本地多 306 提交。本轮不同步。
|
||||
任务登记采用三个独占文件 scope;不修改 CURRENT/MATRIX 共享内容。
|
||||
|
||||
用户补充:Squad 为产品文档生成与复杂任务小队,开发治理工具可单列建议;内部测试版需要私有隔离,公开版公开。两项已写入方案。
|
||||
|
||||
交付:
|
||||
- [待审方案](../../remediation/2026-09-28-multi-repo-architecture-plan.md)
|
||||
- [调研证据与审查记录](../../audit/2026-09-28-multi-repo-evidence.md)
|
||||
|
||||
验收:三份文档的格式、链接、要求/单元/验收项覆盖和 git diff --check 已通过。本地六视角审查收敛四项修改;附加外部模型检查未返回并主动终止,不计 PASS。只读 cleanup report 为 19/blocked=19/ready=0;docs drift regressions=0。未运行实施测试或真实产品验证。
|
||||
|
||||
## 收口
|
||||
|
||||
研究任务 done;方案 review_state=pending/policy_state=proposed。用户审阅仍是后续实施入口。
|
||||
本地文档将以独立 Conventional Commit 保存;不合入 dev、不 push、不部署、不设置仓库描述/权限。
|
||||
worktree 保留供审阅,cleanup=retained-with-reason;用户审阅结束、owner 退出后由独立维护者处理,不能因为研究完成便删除唯一待审产物。
|
||||
本轮不新增 validated lesson;所有迁移风险仅是方案检查项,尚无修复验收证据。
|
||||
接管者先读本任务、方案与证据,再核对最新 dev/Gitea/在途任务;不得仅凭此任务 done 执行迁移。
|
||||
@@ -0,0 +1,553 @@
|
||||
---
|
||||
title: "Agent-System 多仓库、PR 协作与发布架构方案"
|
||||
date: 2026-09-28
|
||||
type: refactor
|
||||
task_id: multi-repo-design-2026-09-28
|
||||
policy_state: proposed
|
||||
review_state: pending
|
||||
execution_authority: "design_only; implementation requires user approval"
|
||||
product_contract_source: ce-plan-bootstrap
|
||||
artifact_contract: ce-unified-plan/v1
|
||||
execution: code
|
||||
---
|
||||
|
||||
# Agent-System 多仓库架构方案(待审,不生效)
|
||||
|
||||
## Goal Capsule
|
||||
|
||||
目标:让产品模块、项目文档、通用规范分别演进,以审核过的组件组合交付可部署版本,同时允许开发者在独立工作区并行开发。
|
||||
主仓成为版本组合与集成入口;拆仓不默认拆进程,不改变产品授权、数据和运行环境边界。
|
||||
|
||||
本轮仅交付方案与[调研证据](../audit/2026-09-28-multi-repo-evidence.md),[任务记录](../ops/short-term/2026-09-28-multi-repo-design.md)保存授权、验证和交接。
|
||||
所有新流程、仓库描述、权限、CI 与拆分均待用户审阅。
|
||||
当前 AGENTS/PROJECT/worktree 规范仍生效。
|
||||
|
||||
用户已补充确认:Squad 指产品中生成文档与处理复杂任务的小队;开发协作治理工具可以另行考虑;内部测试制品必须私有,公开版公开。
|
||||
以下推荐技术选择均为待审建议,不把本次答复理解为实施授权。
|
||||
|
||||
---
|
||||
|
||||
## Product Contract
|
||||
|
||||
### Problem Frame
|
||||
|
||||
原思路合理,但需要纠正四点:
|
||||
|
||||
1. fork 是服务器上的仓库派生关系;本地隔离使用 clone/worktree。通常每位开发者每个上游仓一个长期 fork,每项功能一个分支,无须每项功能新建远端仓库。
|
||||
2. 同一仓库内的并行任务可以从相同 SHA 出发;不同独立仓库没有共同父提交。跨仓基线应表示为“主仓 SHA + 各子仓 SHA”的版本向量。
|
||||
3. “一直最新”不能要求后台强制 pull 并改写正在开发/测试的工作区。改为上游变更及时通知、安全检查点同步、入队前强制最新、候选过期必须重验。
|
||||
4. submodule 只记录另一个仓库的固定提交,不负责跨仓 PR、依赖兼容、权限、CI、原子发布。必须补齐这些机制。
|
||||
|
||||
### Requirements
|
||||
|
||||
| ID | 要求 |
|
||||
|---|---|
|
||||
| R1 | 现有 Agent-System 保留为外层主仓,维护产品版本组合与集成入口,历史不重写 |
|
||||
| R2 | 产品 Squad 独立管理,保留文档生成、复杂任务、质量检查与执行生命周期行为 |
|
||||
| R3 | 项目开发文档、通用规范、可执行开发工具分开归属,运行模板和业务数据不误迁 |
|
||||
| R4 | 支持 fork + 功能分支 + PR 审核;开发工作区相互隔离 |
|
||||
| R5 | 上游更新可感知,合并只能基于当前上游与已验证的精确组件组合 |
|
||||
| R6 | 支持关联多仓 PR,明确非原子合并、兼容过渡与失败恢复 |
|
||||
| R7 | 在 Gitea 发布 macOS Apple Silicon、Ubuntu Server 二进制部署包 |
|
||||
| R8 | 内部测试发布私有,公开测试/稳定版公开;权限隔离经未授权访问测试验证 |
|
||||
| R9 | 迁移可追溯、可分阶段停止,保留活跃任务与运行数据,不自动改数据库 |
|
||||
| R10 | 本轮仅调研与待审方案,描述先拟稿,不让新方案生效 |
|
||||
|
||||
### Actors and Flows
|
||||
|
||||
A1 开发者/编码 Agent:写 fork 功能分支,提交组件 PR 与组合 PR。
|
||||
A2 审核者:确认产品边界、代码与测试,批准精确 head;作者不替代自己的审批。
|
||||
A3 中央集成执行者:维护队列、重建候选、执行保护分支更新;不代替 A2 的审核。
|
||||
A4 发布维护者:批准已验证组合进入内部或公开发布;持独立发布凭证。
|
||||
A5 测试者/部署者:按权限下载对应平台包,不依赖开发仓现场。
|
||||
|
||||
F1 单仓功能:固定基线 → 功能分支 → PR → 同步上游 → 组合候选验证 → 审核 → 受控合并。
|
||||
F2 跨仓功能:创建 change_set_id → 子仓扩展兼容能力 → 子仓 PR 合入 → 主仓 gitlink PR → 全组合验收 → 发布。
|
||||
F3 并行任务跟进:A 合入上游 → B 收到落后提示 → B 在安全检查点合并上游 → 对新组合重测;B 的未提交工作不被后台改写。
|
||||
F4 发布:固定主仓及组件 SHA → 构建包 → 原生平台验收 → 私有 RC → 必要审批 → 同摘要制品公开;任何重构建必须重新验收。
|
||||
|
||||
### Scope Boundaries
|
||||
|
||||
本方案包括仓库职责、submodule、组件依赖、fork/PR、版本组合、治理迁移、二进制发布、Gitea 设置建议与仓库描述。
|
||||
不包含本轮代码修改、推送、权限调整、服务部署、数据库迁移和正在发生的业务缺陷修复。
|
||||
不因拆仓引入 Kubernetes、消息总线、微服务或一套新的远程 Agent 调度平台。
|
||||
完整跨主机协调服务仅在将来出现多个共享环境执行者时另立项目;首期只有一个中央集成/发布执行者。
|
||||
|
||||
---
|
||||
|
||||
## Planning Contract
|
||||
|
||||
### Current Evidence
|
||||
|
||||
调研基线:本地 dev 为 `a3db288a7aa055ff5884e3aa4d91511959cff721`。
|
||||
Gitea 1.27.3 的 dev 为 `fabd85a65e15f3417431ba6f004a8bcdf9cb83cb`,图遍历确认远端为祖先、本地领先 306 提交;这是本次快照,不代表后续仍未变化。
|
||||
|
||||
已读到六个 Gitea 仓库;五个用户指定仓库均可复用,另外已有 Development-Manager。
|
||||
主仓与 Development-Manager 的 branch_protections 都为空;不能把本地 hook 当作 Gitea PR 门禁。
|
||||
两仓 repository-level runner 列表为空,不能据此断言没有实例级或组织级 runner,实施前须核实 runner 标签和实际执行。
|
||||
尚未执行跨平台编译、原生启动、PR 合并或发布演练。
|
||||
|
||||
Squad 依赖七个主仓内部包,约 29 个非测试文件直接导入它。
|
||||
现有单二进制脚本可嵌入 Web;PostgreSQL、pgvector、PI Runner、部分运行资产仍是部署依赖。
|
||||
现有治理工具拒绝标准 submodule Git 布局,构建 `git archive` 不包含子模块;这些是先决改造,不是小概率问题。
|
||||
|
||||
### Alternatives
|
||||
|
||||
| 方案 | 优点 | 代价 | 结论 |
|
||||
|---|---|---|---|
|
||||
| 继续单仓,只划模块目录 | 原子修改最简单,CI 低成本 | 不满足独立权限/版本/仓库目标 | 保留为迁移前基线 |
|
||||
| 分阶段多仓 + 精确版本组合 | 满足独立管理,能逐个验收,保留单体部署 | 需要组件合同、组合 CI 和治理适配 | 推荐 |
|
||||
| 一次拆所有目录并服务化 | 表面隔离彻底 | 同时改变代码、协议、部署、数据和工具;失败难定位 | 不采用 |
|
||||
|
||||
### Repository Map
|
||||
|
||||
| 仓库 | 目标职责 | 初期处理 |
|
||||
|---|---|---|
|
||||
| Agent-System | 产品总入口、submodule gitlinks、组合构建/测试、发布配方、项目策略入口 | 保留现有远端、dev/test/main 与历史 |
|
||||
| Agent-System-Core(拟新建) | Go 应用装配、HTTP API、IAM、工作流与文档治理、DB/迁移、Web UI、产品运行配置与 PI Runner 适配 | 在 Squad/工具试点通过后整体提取;Web 和迁移继续同仓 |
|
||||
| Agent-System-Squad | 产品任务编排、小队执行、质量检查、公共执行契约和 profile 支持 | 先解耦再独立 Go 模块,继续链接进同一进程 |
|
||||
| Agent-System-Development-Documents | 产品需求/架构/ADR/计划/审计/开发经验/脱敏验收报告 | 可复用空仓;机器契约与活动治理文档按阶段迁移 |
|
||||
| Development-Guidelines | 无产品依赖的开发规范、模板、证据分层和通用协作原则 | 可复用空仓;按版本显式采纳 |
|
||||
| Development-Manager | 可执行协作治理工具、agentctl、worktree、客户端集成 | 复用已有代码仓,先比对差异,禁止覆盖式再次导入 |
|
||||
| Agent-System-Releases | 公开测试版和稳定版的发布清单、说明、校验文件与 Release 附件 | 可复用空仓,保持公开 |
|
||||
| Agent-System-Releases-Internal(拟新建) | 受限内部 RC/测试包、内部验收信息 | 新建私有仓,限制测试者与发布机器人 |
|
||||
|
||||
Core 是让外层最终成为纯组合仓的必要承接点,但不应首刀移动所有业务代码。
|
||||
如审阅时希望控制首期仓库数量,可以让业务代码暂留主仓;达到真正外层结构后再建立 Core,不能声称过渡态已完成最终结构。
|
||||
|
||||
暂不单拆 Frontend、数据库迁移、公共 Types/Contracts、每个 agent 或每种 workflow。
|
||||
这些边界当前共同变化频繁;增加仓库会放大联动 PR 数量。
|
||||
PI Runner 已是部署依赖,但初期留在 Core 的 `deploy/pi-agent/`;仅当独立生命周期/复用需求成立,再评估 Agent-System-Runner。
|
||||
Releases 仓不作为主仓 submodule,避免发布依赖源码、源码又依赖发布记录的环。
|
||||
|
||||
### Target Layout
|
||||
|
||||
以下路径为未来目标,并非当前已存在:
|
||||
|
||||
```text
|
||||
Agent-System/
|
||||
AGENTS.md, PROJECT.md, README.md
|
||||
.gitmodules
|
||||
components.yaml # 组件用途、依赖和兼容条件;不复制可手改 SHA
|
||||
policy/ # 项目特定规则、采纳的规范版本与生效条件
|
||||
scripts/ # 薄入口、组合构建/验收/版本导出
|
||||
.gitea/workflows/
|
||||
.doc/ # 过渡期保留治理状态/研究入口,分阶段缩小
|
||||
modules/core/ # Agent-System-Core
|
||||
modules/squad/ # Agent-System-Squad
|
||||
development/documents/ # Agent-System-Development-Documents
|
||||
development/guidelines/ # Development-Guidelines
|
||||
development/manager/ # Development-Manager(工具源码只读消费)
|
||||
```
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
Root["Agent-System:固定产品组合"] --> Core["Core:应用、Web、授权与数据"]
|
||||
Root --> Squad["Squad:执行与质量能力"]
|
||||
Root --> Docs["Development Documents:项目知识"]
|
||||
Root --> Guide["Development Guidelines:通用规范"]
|
||||
Root --> Manager["Development Manager:开发治理工具"]
|
||||
Core -->|"公开接口 / 主仓适配器"| Squad
|
||||
Root --> Build["组合构建与原生验收"]
|
||||
Build --> Internal["私有 Releases Internal"]
|
||||
Internal -->|"发布批准 + 制品摘要核对"| Public["公开 Releases"]
|
||||
```
|
||||
|
||||
### KTD1. Split Ownership Without Splitting Runtime
|
||||
|
||||
Squad 独立 Go 模块,以公开 API 提供执行能力,主应用注入依赖。
|
||||
不直接导入 `chat-agent-system/internal/*`,不改名伪装成主仓以规避 Go internal 限制。
|
||||
独立库不持有产品 DB 连接、用户鉴权或正式文档提交权。[Go 官方模块布局](https://go.dev/doc/modules/layout)
|
||||
|
||||
| 现有耦合 | Squad 边界 | Core 保留 |
|
||||
|---|---|---|
|
||||
| config/backend factory | Options + Backend/Result/Failure 接口 | 环境配置、PI endpoint、凭证、具体执行适配 |
|
||||
| stream/SSE | 有类型的进度、步骤和完成事件 | SSE 映射、task_runs 持久事件、权限与重放 |
|
||||
| workflowdef/task keys | 版本化任务/流程输入 DTO、profile | 工作流审批、冻结快照、项目状态 |
|
||||
| template/instructions | 明确的资产 provider | 与业务绑定的模板、提示词及版本选择 |
|
||||
| quote | 可选任务准备/产物处理接口 | 报价领域规则、核算、xlsx 资产 |
|
||||
| workspace | 已授权 workspace 句柄、受限文件能力 | 数据根、租约、路径授权、环境隔离 |
|
||||
| 正式文档提交 | 候选产物、质量结果与证据 | 编制人身份、OnBehalfOf、账本、事务、人工确认 |
|
||||
|
||||
首期业务 profile 与运行模板继续由 Core 提供;只有确属 Squad 自有算法/通用 profile 的资产随库迁移。
|
||||
`internal/materialindex` 等仅为文本抽取而依赖 Squad 的调用应回归材料解析能力,避免依赖反向扩散。
|
||||
明确重试只有一个责任层:库负责步骤策略,Backend 返回标准化失败与已执行状态;不得两层重试产生重复写入。
|
||||
冻结现有 JSON、事件、任务键、workspace/manifest 格式;对旧版本未完成任务进行恢复兼容验证。
|
||||
|
||||
### KTD2. One Source of Truth Per Kind of Content
|
||||
|
||||
开发文档仓保存“如何设计和验证产品”;规范仓保存“与产品无关的工作规则”;工具仓保存“执行这些规则的程序”。
|
||||
规范采用固定 tag/SHA,由项目 policy 显式更新并登记生效;上游规范合并不会自动覆盖项目授权或改变客户端行为。
|
||||
|
||||
`configs/agents/`、`configs/shared/writing.md`、`templates/docs/`、`templates/xlsx/` 是运行内容。
|
||||
IDE 中 `data/dev/workspaces/.../output.md`、`workspace.json` 是业务数据。
|
||||
这两类都不迁入开发文档仓;真实业务文件和数据库保持原有授权与备份策略。
|
||||
|
||||
`.doc/system-design/module-boundaries.yaml` 是机器契约,先移到对应代码仓的 `configs/architecture/`,与接口/表写者修改在同一个 PR 验证。
|
||||
每个代码仓保留短 AGENTS/PROJECT/README、CI 合同和本仓规则;不要求贡献者为普通编译读取私有文档。
|
||||
产品跨仓 ADR、路线图和汇总验收放 Documents;与源代码同提交必须成立的接口说明/生成规范留代码仓。
|
||||
|
||||
首期不把整个 `.doc` 原位替换成 submodule。
|
||||
先建立 `development/documents`,迁移静态设计资料和归档;CURRENT/MATRIX/活动任务暂留原管理路径。
|
||||
完成文档收据、证据 URI 与 hook 的多仓适配后,再迁移活动文档。
|
||||
新证据引用使用仓库标识 + 完整 commit + 路径 + 内容摘要;未提交草稿不能当作生效证据。
|
||||
|
||||
对每个迁移文档只设一个可编辑来源。
|
||||
旧路径变成短指针或历史只读文件,记录来源 SHA 与新路径;不长期双写。
|
||||
文档仓的新提交先经 PR 合入,再通过主仓 gitlink 显式采纳。报告记录其验证对象的源码 SHA;不把随后接入报告的主仓 SHA 倒填成被测对象,避免循环引用。
|
||||
|
||||
### KTD3. Gitlink Is the Component Version Authority
|
||||
|
||||
主仓 tree 中的 gitlink 是实际源码版本权威。
|
||||
`components.yaml` 管仓库逻辑标识、职责、兼容范围、可见性和构建参与角色;不再手工维护第二套 SHA。
|
||||
构建时从固定 root SHA 生成不可变 resolved manifest,包含 root、子仓、规范、工具、资产、构建器/工具链及摘要;该生成物随收据/制品发布,不提交一个“包含自身最终 SHA”的循环锁文件。
|
||||
|
||||
`.gitmodules` 默认写上游绝对 URL,避免 fork 到不同 owner 后相对地址被解释到错误仓库。
|
||||
URL 只作定位,不作稳定 repo_id;repo_id 使用明确逻辑 ID 或 Gitea 实例+仓库 ID。
|
||||
本地 fork 只配置各子仓自己的 origin/upstream/push URL,不把个人 fork 地址提交进 .gitmodules。[Git submodule 官方说明](https://git-scm.com/docs/git-submodule)
|
||||
|
||||
CI/发布使用固定提交 checkout,不执行 `submodule update --remote`。
|
||||
构建/验收所必需组件缺失、不可访问、未审核或仅存在个人 fork 的 SHA,组合准入失败。
|
||||
components.yaml 区分 build-required 与 development-only;公开源码构建可以只初始化 Core/Squad 等批准公开的 build-required 组件,不递归获取私有开发资料。全量内部发布/治理校验在具备相应权限的执行器进行。
|
||||
主仓 PR 不接受“本地可用、远端取不到”的 gitlink。
|
||||
检验父仓、每个子仓的脏状态,拒绝把未提交文件混入制品。
|
||||
|
||||
首期 Go 联调采用明确的相邻源码 replace:Core 指向 `../squad`;整个组合仍由 gitlink 锁定。
|
||||
Core 可独立 clone,但构建前须按受控 bootstrap 获取固定依赖;组件 CI也使用同一个依赖解析入口。
|
||||
`go.work` 仅本地可选,正式构建设 `GOWORK=off`,避免开发者私有 workspace 掩盖依赖缺失。
|
||||
Squad 自身必须可独立构建测试;Core 依赖版本的精确物化由主仓候选流程提供。
|
||||
|
||||
Gitea 当前访问 URL 带自定义端口,Go module path 不能直接照抄带端口 URL。
|
||||
首期以固定源码组合与本地 replace 消除直接 go get 的路由依赖;模块名使用经批准的不含端口稳定命名空间。
|
||||
若以后要求通过版本号直接 go get,再配置稳定域名/vanity 路由或私有 Go proxy,另行验收;不能只改 go.mod 就宣称分发可用。
|
||||
|
||||
### KTD4. Fork Once, Isolate Each Task
|
||||
|
||||
Gitea 上为每个开发者/机器身份建立必要的长期 fork;仅修改涉及的子仓才需要 fork。
|
||||
同一 Gitea owner 不是无限创建同名 fork 的空间;若所有 Agent 共用一个账号,使用同一 fork 的多功能分支,或明确的开发组织/服务身份。
|
||||
独立 repo/clone 是工作区隔离;一个远端 repo 对应一个稳定组件边界,不与功能任务一一对应。
|
||||
|
||||
远端约定:origin 指向自己的 fork,upstream 指向权威仓。
|
||||
本地可以每个任务一个独立 recursive clone;涉及 submodule 的复杂任务初期优先此方式。
|
||||
现有无 submodule 任务继续受控 worktree;嵌套 submodule + linked worktree 只有在 Development-Manager 拓扑测试通过后才启用,不能直接套现脚本。
|
||||
|
||||
示例基线:任务 A/B 同从 root@R0 开始,R0 固定 Core@C0、Squad@S0。
|
||||
A 合入后上游为 R1;B 同步到 R1 时采用 R1 的组件组合,另保留 B 自己在变更清单中声明的组件分支。
|
||||
不是把所有子仓各自更新到各自最新 main;那会形成未经验证的新组合。
|
||||
|
||||
### KTD5. Freshness at Safe Boundaries
|
||||
|
||||
首期必交:在开始工作、开始关键验证、请求审核、进入合并队列四个检查点强制检查上游,并记录人工触发还是工具执行。
|
||||
完成首期迁移后,可增加常驻通知/轮询,目标为上游合并后 5 分钟内标记相关活跃任务落后;这个时效是后续自动化阶段的验收条件,不属于 U1–U6 的首期承诺。漏事件由轮询补偿。
|
||||
|
||||
自动后台只允许 fetch 和状态提示。
|
||||
同步器遇到脏文件、正在测试、未提交子仓或冲突时停止工作区改动,记录 sync_required;不 stash/reset/自动提交。
|
||||
共享/已公开任务分支默认 merge upstream 保留历史;rebase 仅由 owner 在自己的可重写分支上显式发起,不后台强推。
|
||||
|
||||
子仓有新提交时创建组件更新 PR,由组合验收决定是否采用;不自动跳过主仓审核。
|
||||
队列准入绑定 repo_id、PR ID、source head、target base、组件清单摘要与策略版本。
|
||||
任一值变化,旧验证失效;需要重新生成受影响候选和相应审核,不能拿旧 SHA 的绿色结果放行。
|
||||
|
||||
“同步及时”与“测试可复现”同时成立的标准是:可见地落后、在明确检查点更新、被测组合不在测试中途变化。
|
||||
不承诺所有工作区每秒都等于上游。
|
||||
|
||||
### KTD6. Reviewed PRs and One Integration Authority
|
||||
|
||||
主仓暂保留 dev → test → main 的现行生命周期,不在拆仓时顺带重新定义环境。
|
||||
子仓默认 main + 功能分支 + 不可变组件 tags;子仓 main 只是已审核组件,不等于产品已部署。
|
||||
Releases 仓 main 只存发布元数据;RC/stable 由 tag 和可见性决定。
|
||||
|
||||
推荐 Gitea 分支保护:禁止开发者直推受保护分支、禁止强推、要求非作者审批、陈旧审批失效、拒绝请求修改状态、要求明确命名的 CI checks。
|
||||
权限存在不等于某项操作已获授权;机器人也不获得自动部署 test/main 的权限。
|
||||
私有子仓的源码访问另配权限,不用公开 fork CI 中的秘密令牌补洞。
|
||||
|
||||
现有“本地 agentctl 精确候选后推进 dev”与“Gitea 服务器自行生成合并提交”必须选定一个权威,不能并行各自合入。
|
||||
推荐延续精确候选语义,增加中央 PR 集成控制器:
|
||||
|
||||
1. 从 Gitea 读取已审核 PR,冻结 base D 与 head T,重核审阅绑定。
|
||||
2. 在可信控制平面创建两父 merge 候选 M,在隔离的无写凭证执行器测试 M 及完整组件清单。
|
||||
3. 排他队列内再读 target/base、source/head、审批与检查;变化即作废重建。
|
||||
4. 只有受保护的 integration 机器人可发布已验证的 M;常规贡献者与 UI 合并不具备推进该分支的权力。
|
||||
5. 推进前要求远端仍为 D,拒绝非快进、未知目标和验证缺失。服务端 pre-receive/验证网关核验签名准入收据,使“机器人直推白名单”不能变成无审核旁路。
|
||||
6. 上游接受 M 后核对远端 SHA,再将 Gitea PR 标记为 manually-merged 并附 M 与验证链接;任一回写失败进入 reconciliation,禁止重复合并或隐藏已发生的推进。
|
||||
|
||||
Gitea 1.27.3 本机 Swagger 已存在 `do=manually-merged`、`head_commit_id`、`merge_commit_id` 字段。
|
||||
其权限、PR 状态回写及保护规则联动未实测;必须先在获授权的演练仓完成端到端验证。
|
||||
不假设 Gitea 自带与现有本地 gate 等价的 merge queue。
|
||||
如果管理员不能部署收据校验或手工合并标记行为不满足审计,停止此路线;改用 Gitea 原生合并模式需要单独调整现有“精确候选 SHA”规范并获审,不能临时两套并行。
|
||||
|
||||
Gitea PR Actions 默认 ref 指向 PR head,不是 GitHub 式合并预览。
|
||||
因此 PR head 单测只能作为输入检查,组合验收须显式构造目标基线与 PR 的合并候选。[Gitea Actions FAQ](https://docs.gitea.com/usage/actions/faq/)
|
||||
|
||||
开发 clone 的本地锁只保护本地;共享环境、schema 迁移号、发布序号与保护分支由中央执行者协调。
|
||||
将来多主机共享执行才引入远程 claim/lease、epoch、fencing、日志与恢复,不通过复制或共享 SQLite WAL 实现。
|
||||
|
||||
### KTD7. Cross-Repository Changes Are Staged
|
||||
|
||||
一个 change_set_id 关联全部子仓 PR、主仓组合 PR、接口版本、兼容矩阵和验证清单。
|
||||
预合并联调可以使用明确列出的 PR SHA,但只能在候选清单中使用,不能当作正式发布依赖。
|
||||
|
||||
合并顺序:提供方向后兼容扩展 → 消费方适配 → 子仓全部进入受保护分支 → 主仓更新 gitlinks → 系统验证 → 发布。
|
||||
同一功能没全部就绪前,主仓继续固定旧组合;必要时新接口关闭启用,不借拆仓改变默认行为。
|
||||
旧契约在所有受支持组合退出后再删除,不把跨仓同步大改作为唯一迁移方式。
|
||||
|
||||
子仓已合入、主仓失败时,子仓可保留未采用的新版本,主仓保持旧 SHA。
|
||||
撤回主仓采用记录使用普通 revert PR;不改写子仓历史,也不自动反向数据库迁移。
|
||||
跨仓 Git 没有原子事务,原子“产品版本”由主仓固定组合及一次发布晋升提供。
|
||||
|
||||
### KTD8. Reuse Development-Manager Without Duplicating Authority
|
||||
|
||||
远端 Development-Manager 已存在,PROJECT 将它定义为治理工具权威演进仓;MIGRATION 记录 2026-09-24 从 Agent-System 复制拆出。
|
||||
当前仅能据此确认仓库定位与内容,不能推导两个项目的工具已经同步、所有主机已接入或中央服务已运行。
|
||||
|
||||
实施前比较其源头映射与本次 Agent-System 工具改动,逐项选择保留/回移,不用旧复制覆盖新修复。
|
||||
通用规范抽到 Guidelines;Development-Manager 保留可执行工具及其自身开发文档;Agent-System 的环境端口、路径、模块 ownership 保留为项目 policy。
|
||||
根仓脚本最终只作固定版本的工具入口,工具更新也经组件 PR 和兼容测试。
|
||||
|
||||
先适配 Git common-dir/gitdir/worktree/submodule 身份,显式识别“工具源码仓”与“被管理目标仓”。
|
||||
工具作为 submodule 消费,不把其自身 .locks 当作产品协调状态。
|
||||
本地状态归属明确的 repo_id + host/workspace;共享权威只存在中央执行入口。
|
||||
|
||||
---
|
||||
|
||||
## Release Design
|
||||
|
||||
### Platform Matrix
|
||||
|
||||
| 制品 | 编译目标 | 验收环境 | 交付内容 |
|
||||
|---|---|---|---|
|
||||
| macOS Apple Silicon | darwin/arm64,CGO_ENABLED=0 | 实际 Apple Silicon macOS 主机 | agent-server、资产、启动/停止说明、launchd 模板 |
|
||||
| Ubuntu Server x86_64 | linux/amd64,CGO_ENABLED=0 | 实际 amd64 Ubuntu Server | agent-server、资产、systemd 单元与部署说明 |
|
||||
| Ubuntu Server ARM64 | linux/arm64,CGO_ENABLED=0 | 实际 arm64 Ubuntu Server | 相同职责的平台包;有硬件验收后才列为支持 |
|
||||
|
||||
Ubuntu 架构未被用户限定,建议同时规划 amd64/arm64;首个发布的最低必交为 macOS arm64 与 Ubuntu amd64,arm64 若缺真机证据须标 experimental,不伪称已支持。
|
||||
最低 OS/CPU/PG 版本在发布演练确定并记清单;无验证证据不先作宽泛兼容承诺。
|
||||
Go 目标可交叉编译;出现 CGo 依赖时需相应 C 工具链,不能仅设置 GOOS/GOARCH 即宣称可用。[Go cgo 官方说明](https://go.dev/cmd/cgo/)
|
||||
|
||||
macOS 公共分发加入 Developer ID 签名/公证的实施检查;签名凭证仅在受信发布步骤使用。
|
||||
签名改变字节时,对签名后的最终包重新计算摘要并验收;不能把签名前 RC 的摘要拿来证明公开附件一致。
|
||||
|
||||
### Package Contract
|
||||
|
||||
每个平台交付一个版本化 tar.gz/zip,包含:
|
||||
|
||||
- `bin/agent-server`:嵌入构建后的 Web 资源;如保留独立 events worker,另附平台匹配的 events,并明确单进程/独立模式不能重复消费。
|
||||
- `assets/`:迁移 SQL、运行配置模板、agent 指令、Markdown 模板、xlsx 等完整运行资产;逐项做包含校验。
|
||||
- `deploy/`:systemd 或 launchd 示例、启动/停止/健康检查与升级说明;不携带真实 .env。
|
||||
- `manifest.json`、`checksums.txt`、签名、SBOM、第三方许可、变更与升级/回退说明。
|
||||
- PI Runner 的固定版本素材或镜像 digest、Node/PI 版本与配置说明;不会伪装成已编译进 Go。
|
||||
- 对可完全离线安装的要求单列 profile;首期“源码之外可部署”不等于“所有依赖离线打包”。
|
||||
|
||||
PostgreSQL/pgvector 继续是独立运行依赖;`localpg` 会查找已安装的 pg_ctl,不是数据库被静态编进服务。
|
||||
默认服务器部署使用显式 DSN 和独立持久数据目录;受支持的 managed 本地模式另测。
|
||||
PI Runner 可以用固定镜像或受支持 Node 运行方式,模型/工具密钥由部署环境注入。
|
||||
|
||||
禁止安装包依赖原源码 checkout 的相对 cwd。
|
||||
资产根、配置根、数据根分别指定;从任意目录启动均能定位正确资产。
|
||||
从发布包在干净主机启动、完成真实任务,才算“可以部署”,仅 go build 成功不够。
|
||||
|
||||
### Build and Publication
|
||||
|
||||
源码权威在组件仓,构建配方与组合规则在主仓;Releases 仓不复制应用源码,也不独立维护另一份构建逻辑。
|
||||
从固定 root SHA 递归导出全部参与构建的组件 SHA,生成源码物料清单。
|
||||
修复现有 candidate-images-build 的仅主仓 git archive 假设;不得退回读取开发者的可变工作目录。
|
||||
前端使用锁文件 npm ci,Go 工具链和构建器固定版本/digest,禁用发布时隐式采用未知工具链。
|
||||
交叉编译与原生验收拆成独立 jobs,结果绑定最终制品摘要。
|
||||
|
||||
建议版本:组件用各自 SemVer;产品 RC 用 `vX.Y.Z-rc.N`,稳定版 `vX.Y.Z`。
|
||||
保留旧 rc-v1.1.0-beta.* tags;新命名启用前兼容现有 promotion 脚本,不能重打历史 tag。
|
||||
root release tag 固定产品组合;Releases 仓同名 tag 指向发布元数据提交,并在 manifest 明确 source_root_sha,二者不是同一个 Git 提交。
|
||||
|
||||
制品放 Gitea Release 附件或受控 package storage,不直接 commit 二进制到 Git。
|
||||
当前主仓已跟踪若干 *.test 二进制;后续停止新增并以普通提交移除当前树中的误入制品,保留历史;不为缩体积自动重写历史。
|
||||
Gitea 自带的“源码 zip”只覆盖被打 tag 的发布仓元数据,不代表完整产品源码。
|
||||
内部完整 source-bundle 可以包含受权构建所需组件;公开 source-bundle 必须按公开批准清单与构建角色导出,默认排除 development/documents、development/manager、内部证据和私有配置,不能直接打包全部 gitlinks。
|
||||
公开源码包逐项检查归档成员与敏感内容;必要构建依赖未获公开授权时,阻断公开源码包,不能自动扩大权限。公开运行包同样进行内容检查;两种包的可公开性分别判定。
|
||||
|
||||
发布状态:built → native_verified → internal_rc_published → approved_for_public → public_published。
|
||||
不可变内容以 manifest_digest + asset SHA256 标识。
|
||||
公开发布重新校验批准的内部制品,不从各子仓最新分支再构建一遍。
|
||||
如果重新构建/签名/重打包,作为新制品进入验证,不能沿用旧字节的 PASS。
|
||||
|
||||
跨仓发布不是事务:上传到 draft、逐项检查数量/大小/摘要、回读下载、最后发布;相同版本与摘要重试幂等,不同摘要冲突拒绝覆盖。
|
||||
外部请求结果未知时先查 tag、release、附件与摘要,补齐或终止;不得盲目重复发版。
|
||||
已公开错误版本标撤回/失效并发布修正版,不静默换同名附件。
|
||||
|
||||
内部发布仓必须 private。
|
||||
公开仓的 prerelease 标记只是发布成熟度,不能当访问控制;私有附件/API/源码包均需测试匿名和无权限账号拒绝。
|
||||
公开说明及 SBOM 不携带内部测试数据、凭证、私有路径与敏感下载 URL。[Gitea 仓库权限](https://docs.gitea.com/1.22/usage/permissions/)
|
||||
|
||||
### CI Trust and Promotion
|
||||
|
||||
贡献者 fork PR 在隔离、无秘密、无宿主共享环境写权限的 runner 测试。
|
||||
受信集成控制面与不可信候选代码执行面分开;测试进程不能拿 integration token、签名密钥或 Release 写 token。
|
||||
发布 job 不通过 pull_request_target checkout 未审核代码来取得秘密。
|
||||
Gitea job token 默认不等于跨仓发布权限;发布机器人使用只覆盖目标发布仓的最小授权,fork 流程不可获取它。[Gitea Actions token 权限](https://docs.gitea.com/usage/actions/token-permissions/)
|
||||
|
||||
现仓使用 .github/workflows 且有 Gitea 特定兼容处理。
|
||||
迁移时检查实例实际 ACTIONS workflow 路径配置,再统一到确定路径;不能同时复制两套导致双跑。
|
||||
不得默认套用 GitHub 专属 artifact action;现有 nightly 已记录 upload-artifact@v4 不兼容,发布演练直接验收实际 Gitea 上传/下载接口。
|
||||
|
||||
---
|
||||
|
||||
## Implementation Units
|
||||
|
||||
所有单元在审阅通过后另建实施任务;本节是执行路线,不代表本次已启动。
|
||||
估算按单个有上下文的实施者的工作日,不含等待硬件、证书、审阅和业务回归时长;阶段出口优先于日期。
|
||||
|
||||
### U1. Establish Baseline and Governance Pilot
|
||||
|
||||
覆盖 R1/R4/R5/R9;预计 1–2 日。
|
||||
记录所有本地/远端 branches、tags、活跃 worktrees、未提交成果和运行制品身份;冻结迁移范围与历史保留策略。
|
||||
先备份/验证 Git 对象与恢复方法,再经审阅决定如何将本地 306 提交差异同步至 Gitea;不机械 push 全部分支。
|
||||
建立迁移映射 source_repo/source_sha/source_path → target_repo/target_sha/target_path。
|
||||
对子仓抽取可在临时 clone 中 filter-repo 保留相关历史并保存 commit-map,先扫描整个将要公开的历史;不重写现有主仓。
|
||||
Development-Manager 已有独立历史,做差异合并,不再抽取覆盖。
|
||||
|
||||
受影响入口:现行 PROJECT/AGENTS、scripts/git-push-dev.sh、agentctl 集成和 Gitea settings(后续写入)。
|
||||
最小演练:在获授权的演练仓核对 Gitea 分支保护配置可用、管理员可部署服务端校验、manually-merged 能指向指定已合入提交;此阶段验证基础能力,不要求尚未编写的控制器已工作。
|
||||
出口:基线和保留策略明确、唯一集成权威选定、平台能力可行;产品仓仍走原流程。完整控制器验收归 U2,不能在 U1 先要求它通过。
|
||||
不在本阶段改变 test/main 部署。
|
||||
|
||||
### U2. Adapt Multi-Repository Tooling
|
||||
|
||||
覆盖 R4–R6/R9;预计 3–5 日,依赖 U1。
|
||||
修改 Development-Manager 的 agentctl/agent_worktree/git hooks/catalog,以及主仓薄入口、candidate 导出和收据 schema。
|
||||
新增 repo_id、组件清单、跨仓证据 URI;明确 clone 和 submodule Git 身份。
|
||||
Gitlink 门禁验证子仓受保护提交、文档审批与实际内容,不只检查父仓文件名。
|
||||
|
||||
建议新增测试:Development-Manager 的 `scripts/tests/test_multi_repo_topology.py`、`test_multi_repo_receipts.py`、`test_integration_queue.py`。
|
||||
主仓新增 `scripts/tests/test_component_export.py`;保留现有 test_agentctl/test_agent_worktree 回归。
|
||||
覆盖普通 clone、linked worktree、标准 submodule、路径别名、子仓缺失/脏状态、两候选竞争、修改 head/base 导致审批或验收失效、无审核 push 拒绝、manually-merged 回写失败恢复、操作未知后重试、报告 gitlink 绕过。
|
||||
仅在 U2 完整出口通过后,按批准的切换窗口排空旧集成入口、锁定当前 base、切换产品仓权威;演练失败不改变原产品集成流程。
|
||||
出口:隔离演练仓可通过审核 PR 按精确 M 合入;无凭证测试执行器不能写权威仓/环境。
|
||||
|
||||
### U3. Separate Guidelines and Development Documents
|
||||
|
||||
覆盖 R3;预计 2–3 日,依赖 U2 的相关子能力。
|
||||
先拆通用 Guidelines 与静态 Documents,机器契约留代码仓,活动状态/收据最后迁移。
|
||||
改对应入口链接、客户端规则、archtest 清单位置、文档索引和证据查找。
|
||||
声明版本采纳规则、owner 与旧路径只读状态。
|
||||
|
||||
新增文档链接/归属检查;继续验证 `internal/archtest`、`scripts/tests/test_agentctl*.py`。
|
||||
覆盖旧文档链接可追溯、新文档 PR 独立、缺文档权限仍能构建公开源码、能力状态不能因冲突退回、子仓 gitlink 不能绕过收据。
|
||||
出口:每项内容有唯一写来源,无业务数据或运行模板误迁。
|
||||
先抽取少量静态文档试点;失败通过普通 PR 恢复路径与 gitlink,不删除新仓历史。
|
||||
|
||||
### U4. Extract Product Squad
|
||||
|
||||
覆盖 R2/R6;预计 5–8 日,依赖 U2,接口冻结后可与 U3 部分并行。
|
||||
现仓先完成依赖注入与材料解析去耦,保持行为;随后抽取至 Squad。
|
||||
Core/主仓保留一层临时 facade 适配 29 个调用文件,注明清除条件。
|
||||
受影响:internal/squad、internal/bizdev、coordinator/chat/server/intent/projectcontext/materialindex、cmd/bizdev-cli、go.mod、模板 provider。
|
||||
|
||||
保留并迁移 Squad 算法测试;新增 Squad `contract_test.go` 与 Core `internal/squadadapter/contract_test.go`。
|
||||
关键回归沿用 quality_projection、squad_commit_actor、task_run_idempotent_sse、task_run_resume_pg、quality_repair_contract、step_retry 等。
|
||||
用原例、同类变体和正常行为比较;尤其旧工作区恢复、质量失败零正式投影、非编制人代理提交、传输失败残留文件不得当成功。
|
||||
出口:库可独立测试;真实 PI + 浏览器的商务/研发任务、权限负例、刷新/重启均通过。
|
||||
发现现存故障时拆分问题记录,避免把搬迁顺带修复当作等价性证据。
|
||||
|
||||
### U5. Finish the Outer Repository
|
||||
|
||||
覆盖 R1/R3/R6;预计 2–4 日,依赖 U3/U4 稳定。
|
||||
将其余产品代码作为一个 Core 仓提取;保留 Web/DB/运行配置/Runner 同仓,主仓变为组合入口。
|
||||
调整 Docker COPY、构建入口、Go replace、测试根目录、CodeGraph 索引、运行服务入口与资产根。
|
||||
迁移源为批准的固定 SHA;源仓历史原样保留。
|
||||
开发数据与生产数据目录不随代码树挪动;路径切换必须显式映射并在隔离环境验收。
|
||||
|
||||
新增主仓 component manifest 校验与 smoke 测试,复用 Core 全部门禁。
|
||||
验收全新 recursive clone、源码 bundle 解压、无原源码路径构建启动、组合指针回退、当前运行版本识别。
|
||||
出口:外层仓不承载业务实现,组件固定组合可完整重建。
|
||||
|
||||
### U6. Build and Release Portable Packages
|
||||
|
||||
覆盖 R7/R8;预计 3–5 日,分两个连续子阶段,沿用同一包格式与发布入口。
|
||||
U6a 在 U1 基线/授权边界明确后即可对当前固定单仓源码补齐运行资产、双平台包与私有发布演练,不等待 Core 提取。任何远端发布仍需要该实施阶段的明确授权。
|
||||
U6b 在 U5 后把同一配方切换为固定组件组合并重新验收;U6a 的结果是部署基线,不替代 U6b 的多仓版本验收。
|
||||
主仓实现固定组合构建与发布 metadata;组件实现必要的资产定位/版本输出。
|
||||
新增私有内部发布仓、发布账号最小权限,拟定描述在本阶段或 U1 审批后一次性设置。
|
||||
完善 scripts/build-single-binary.sh、candidate-images-build.sh、release/promote 入口和目标平台部署模板。
|
||||
|
||||
新增包内容/摘要/权限检查与两平台原生部署 smoke;CI 具体路径依实例 workflow 配置决定。
|
||||
验收干净 macOS arm64、Ubuntu amd64、可选 Ubuntu arm64,启动/health/ready/真实产品任务、升级、失败恢复、下载权限、重复发布冲突。
|
||||
出口:私有 RC 实际可安装;公开晋升经授权且附件摘要一致。
|
||||
业务数据库升级若存在,单列备份、前向兼容与恢复窗口;Git 回退不能宣称数据库已回退。
|
||||
|
||||
粗略总工作量约 16–27 人日;这不是固定工期,U6a 可以并行,U1/U2 演练后重估。
|
||||
可以在 U3 或 U4 完成后暂停,而不强迫一次完成全部拆分。
|
||||
|
||||
---
|
||||
|
||||
## Verification Contract
|
||||
|
||||
| 验收面 | 输入/动作 | 必须结果 |
|
||||
|---|---|---|
|
||||
| V1 Git 基线 | 同仓 A/B 从 R0 开始,A 先合并 | B 被标落后;旧候选失效;同步后基于 R1 重验 |
|
||||
| V2 脏工作区 | B 含未提交代码/子仓,收到同步事件 | 只提示,不 pull/reset/stash,不丢文件 |
|
||||
| V3 跨仓版本 | 子仓 PR 未合入、SHA 仅在 fork | 主仓正式准入拒绝;候选联调明确非发布 |
|
||||
| V4 精确组合 | 改任一组件 gitlink 或构建配方 | manifest 摘要变化,原组合验收无效 |
|
||||
| V5 权限 | 无审核 push、fork CI 读发布 secret、匿名下载内部包;私有资料嵌入唯一测试标记 | 未授权访问均拒绝;token 不进测试进程;公开运行/源码包不得包含测试标记与未批准路径 |
|
||||
| V6 并发合入 | 两个 controller/候选竞争同一 base | 只有一个推进,另一个重建;未知结果先 reconciliation |
|
||||
| V7 Squad 语义 | 文档生成/复杂任务 + 失败/权限/恢复变体 | 事件、正式文档、持久状态符合原产品合同 |
|
||||
| V8 文档治理 | CURRENT/MATRIX 子仓变化,父仓 gitlink 更新 | 子仓收据/审批可追溯;不能因 gitlink 隐藏绕过 |
|
||||
| V9 完整包 | 从任意 cwd 在无源码的干净机器启动 | Web/模板/xlsx/SQL 可用;缺依赖明确失败;不误连 dev DB |
|
||||
| V10 平台 | darwin/arm64、linux/amd64 真机;arm64 可选 | 对最终包执行原生验收,交叉编译不能替代 |
|
||||
| V11 发布恢复 | 上传一半中断、重复同版本、不同摘要同版本 | 幂等补齐/拒绝冲突;公开前附件完备;旧版不被覆盖 |
|
||||
| V12 回退 | 回退主仓 gitlinks,已有旧任务/数据 | 代码版本可回退;schema/任务格式不兼容时明确停止和恢复路径 |
|
||||
|
||||
现有可复用命令为 `./scripts/arch-check.sh --mode block`、`go vet ./...`、`go test -short ./...`、web 的 `npm test`/`npm run build`,迁移后在对应组件目录运行。
|
||||
PG、真实 PI 与浏览器验收遵守当前验证契约,使用独立环境;共享环境须独占。
|
||||
本轮只做文档差异、链接和事实一致性检查,没有执行上述实施验收,不记录为 PASS。
|
||||
|
||||
---
|
||||
|
||||
## Repository Descriptions
|
||||
|
||||
以下为审批后的拟写描述;本轮未调用更新 API。
|
||||
|
||||
| 仓库 | 拟用描述 |
|
||||
|---|---|
|
||||
| Agent-System | Agent-System 产品集成主仓:管理组件版本、开发入口、组合验证与发布流程。 |
|
||||
| Agent-System-Core | Agent-System 核心应用:API、Web、身份权限、工作流、文档治理与数据持久化。 |
|
||||
| Agent-System-Squad | Agent-System 产品智能体小队:文档生成、复杂任务编排、执行协作与质量检查。 |
|
||||
| Agent-System-Development-Documents | Agent-System 项目开发文档:需求、架构、设计决策、计划、审计与验收记录。 |
|
||||
| Development-Guidelines | 与具体项目无关的开发规范、协作流程、审查标准及工程实践模板。 |
|
||||
| Development-Manager | 多项目开发协作治理工具:任务与工作区管理、执行约束、验证收据和集成控制。 |
|
||||
| Agent-System-Releases | Agent-System 公开测试版与稳定版发布:macOS Apple Silicon、Ubuntu Server 部署包、校验与升级说明。 |
|
||||
| Agent-System-Releases-Internal | Agent-System 私有内部测试与候选版本:受限部署包、版本清单及验收说明。 |
|
||||
|
||||
---
|
||||
|
||||
## Risks and Decisions
|
||||
|
||||
需要用户审阅的核心建议:同意分阶段拆仓、复用 Development-Manager、最终新增 Core 承接应用、采用受审 PR 的中央精确候选集成。
|
||||
已确认的内部私有/公开隔离按本方案执行;不再作为未决问题。
|
||||
|
||||
实施前仍需验证、但本轮无法以只读研究证明的条件:
|
||||
|
||||
- Gitea 精确候选发布、服务端收据验证与 manually-merged 状态回写的端到端行为。
|
||||
- 可用的 macOS/Ubuntu 原生 runner、最低平台版本与公共 macOS 签名条件。
|
||||
- 全量历史导出是否包含不应公开的内容;未扫描历史不能认为空仓导入自然安全。
|
||||
- Core/Squad 公开模块命名空间,以及远期独立 go get 分发是否需要稳定域名。
|
||||
- 切换时仍在运行的任务/操作、Workspace 格式兼容与实际部署资产布局。
|
||||
|
||||
这些是对应阶段的阻断出口,不妨碍先审阅整体架构。
|
||||
出现无法恢复的未知副作用、缺少授权环境、活动任务无法排空、子仓 SHA 不可获取时停止相应阶段;保留当前已验证组合。
|
||||
保持产品代码回退、部署制品回退、DB/用户文件恢复三条独立路径。
|
||||
|
||||
---
|
||||
|
||||
## Definition of Done
|
||||
|
||||
本轮研究完成条件:现状证据、推荐与替代方案、仓库职责、协作/版本语义、迁移/回退、平台发布、可见性隔离、描述草稿与验收矩阵齐备,并交付用户审阅;不以实施状态衡量研究完成。
|
||||
|
||||
未来实施完成条件:U1–U6 对应出口和 V1–V12 均有证据;主仓是可重建组合;所有组件 PR 与 gitlinks 可追溯;真实部署包在承诺平台完成原生产品验收;内部制品未被未授权访问;远端与运行状态分别记录。
|
||||
未获得公开发布授权时,内部验收通过不自动发布公开版本。
|
||||
|
||||
---
|
||||
|
||||
## Sources
|
||||
|
||||
本地证据与方法见[调研记录](../audit/2026-09-28-multi-repo-evidence.md)。
|
||||
Git/Gitea/Go 官方链接随影响决策的段落引用;本机 Swagger 用于验证实例字段,但字段存在不证明流程已演练。
|
||||
本方案没有修改现行规范的效力。
|
||||
Reference in New Issue
Block a user