merge: candidate multi-repo-design-closeout-2026-09-29 into dev
CI / go-vet-and-short-test (push) Failing after 0s
CI / backup-restore-drill (push) Failing after 1s
CI / web (push) Failing after 0s

This commit is contained in:
weichen
2026-09-29 00:17:12 +00:00
3 changed files with 1586 additions and 0 deletions
@@ -0,0 +1,344 @@
---
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 实测为准。
## Revision 2: Web and Agent-Native
授权来源:用户在原方案审阅中追加前端拆仓和 pi-native/agent-native 共享执行基础设计;沿用 task_id,不启动实施。
本轮源码基线仍为 a3db288a7aa055ff5884e3aa4d91511959cff721,文档上一提交为 de90d0cd70e5cfadbd680e8caf8bdf18724e44a8。
旧机器登记已 done,agentctl 不提供 reopen;新增同 worktree 的执行登记 multi-repo-design-2026-09-28-r2,逻辑任务和三个允许写路径不变。
### Confirmed Wiring
| 证据位置 | 确认的事实 |
|---|---|
| internal/agent/backend.go:38–60 | 公共 Backend/Execute,工厂支持 pi-agent/pi-native;native 包裹 PI fallback;未知名默认 Stub |
| internal/app/app.go:132–133 | 通过同一工厂创建助手 dialogueBackend 并注入 coordinator |
| internal/coordinator/dialogue_llm.go:126 | 助手调用 Execute,交付 reply.md;当前非直接返回文本接口 |
| internal/squad/service.go:261、402 | Squad 任务/工作流也调用同一后端工厂 |
| internal/config/config.go:109 | 源码默认 AGENT_BACKEND 为 pi-agent;不证明运行配置 |
| internal/app/app.go:162–186 | 语义摘要、文档变更叙事、U9 segment 仍有 pi-agent 名称条件 |
| internal/agent/pinative.go:17–28、96 | PiNativeBackend 是产品配置/工作区与 agentx.Run 的适配层 |
| internal/agentx/loop.go | 具备原生 loop、tool 调度、stream、usage、turn cap;不是完整产品持久任务控制面 |
| internal/agentx/llm/client.go:14 | 当前是兼容 Chat Completions 的 client,不能推断全供应商适配 |
| internal/agentx/session/jsonl.go | 本地 JSONL transcript 与对象 mutex;不是跨进程执行租约 |
| internal/agent/fallback.go:21–41 | native 不成功且 context 未取消时尝试 PI;Name 仍可为 pi-native,仅日志记录实际回退 |
| internal/taskrun/backend.go | 另有后端名称 allowlist 和生产 stub 限制,改名需全入口一致 |
| web/package.json / vite.config.ts | 独立 npm 构建、测试与 Vite API proxy,可作为独立源码仓 |
| web/embed.go:14 | 当前 Go embed 与前端目录共置,不能直接整体搬走而不处理 Go import |
| internal/server/static_assets.go:16、20–36、resolveDistDir | 导入主模块 web;磁盘资源优先,多个相对路径可能遮蔽内嵌 UI |
| web/src/api/* / admin/console | 手写 API 客户端、auth header/cookie、后端信息展示需要契约与兼容检查 |
CodeGraph sync 成功并 explore PiNativeBackend;rg 再确认助手/Squad 工厂调用和 agentx import 依赖。
未读取业务 output.md、workspace.json、模型密钥或运行实例环境;没有调用真实模型或产品 Agent。
所以结论是“源码支持双方选择 native、具备公共接口”,不是“当前两条线上路径已运行 native”或“native 全能力已验收”。
### Revision Decisions
1. 新增 Agent-System-Web 与 Agent-Native 仓库建议;Core 不再承载前端源码和通用 Agent 内核。
2. Agent-Native 包含 contract/runtime/adapters/conformance;公共 contract 不反向依赖 Core/Squad,Core 注入后端,Squad 只使用契约。
3. 模型适配、完整 Agent 适配、工具适配分开;保留未来吸收先进实现的空间,不承诺任意 SDK/CLI 即插即用。
4. pi-native 旧名、AGENTX 配置与 .agentx 数据路径提供兼容;默认后端不随拆仓切换。
5. 区分 native 自身成功与 PI fallback 成功;未知副作用不自动跨后端重放。
6. Web 构建产物在隔离构建上下文物化到 Core embed 目录,仍可发布一个包含 UI 的服务二进制;不提交 dist 或软链接越界。
7. 增加 U7/U8、R11–R13、V13–V16,同步更新仓库地图、拓扑、Core/Squad 依赖、发布组合和描述;没有只追加一个与旧建议矛盾的附录。
### Revision Verification
本轮针对新增边界做源码/官方资料核对与作者一致性复核,不复用第一轮六视角结果作为修订 2 的新增审查证据;未发起额外外部模型复核。
复核修正:U7a 先形成可独立获取的最小 contract 模块,U4 消费它,U7b 再迁 native/PI 实现,避免 Squad 和完整 Native 提取相互等待。
Go embed 的包/模块边界据[官方文档](https://pkg.go.dev/embed)确认;Vite 独立构建/后端集成据[官方指南](https://vite.dev/guide/backend-integration)核对;工具与完整 Agent 的区别参考[MCP 架构](https://modelcontextprotocol.io/docs/learn/architecture)。
仅实施计划中定义真实 native/PI、浏览器与平台验收,本轮未运行,不能标 PASS。
## Revision 3: Ubuntu-only and PI Core Parity
用户确认近期不需要 Ubuntu ARM/Apple Silicon;异步澄清确认目标为“对齐核心能力并逐步替代”,不是仅兼容接口或完整上游复刻。仍未授权实施。
本机 uname -m=x86_64,os-release=Ubuntu 26.04.1 LTS;当前支持目标改为 linux/amd64,无需本期交叉编译。
只读核对 deploy/pi-agent/Dockerfile 固定包0.85.1;npm 该版本元数据 gitHead=d981de1229ef899957bbe968bc8dcda02a21f477,repository=earendil-works/pi,license=MIT。通过内存读取发布tarball检查README/compaction/rpc/extensions文档,无安装/执行包代码;未验证运行容器版本。
项目 pi-args 默认 --mode rpc --no-session,workspace 为受限工具且加载扩展;Runner提供 /v1/run 与 /v1/search,typed-result-v1 与 Tavily 属于实际依赖范围。
agentx 已有 loop/tools/session/stream/steering/follow-up;没有因此推断完整 PI compaction/扩展/会话兼容。
现有 abtest/Suite 只有6例;Judge比较成功率/P0/P95≤1.3倍;live测试直接 NewPiNativeBackend 禁止隐性fallback,RUN_AGENTX_AB=1 才运行。本轮未运行它,不把既有测试代码当通过证据。
新增独立 U9 能力盘点→补齐→对比→渐进启用→替代收口;移除本期双平台要求、macOS签名阻断与ARM构建要求;更新描述与验收。
来源:https://registry.npmjs.org/@earendil-works%2fpi-coding-agent/0.85.1 与固定提交的上游 README/docs;上游main仅用于导航,能力基线以固定版本为准。
## Revision 4: Governance Review
用户要求根据多仓/Ubuntu/Agent-Native方案复审锁、agentctl及规范,可在方案中删减不必要/频繁出问题的机制并补齐缺项。
授权仍为研究和待审文档,不执行规范切换,不改变现行工具/配置/数据库/远端设置。
### Confirmed Issues and Evidence
ISSUE-20260928-governance-lock-domain,issue_state=investigating,owner=Codex(方案),影响为独立工作区无关写入被全仓恢复状态阻塞。
已证实机制:scripts/agentctl.py:532–557 的 path 资源和 overlaps 没有工作区标识;path:. 覆盖所有相对路径。
scripts/agentctl_console.py:186 为 integrate_prepare 获取 path:. + git:index + git:dev;:211–220 对合并失败尝试abort后仍标 recovery_required。
scripts/agentctl.py:982–998 的持锁比较继续纳入 recovery_required,因此一个候选冲突/失败可能长期挡住不同worktree。
本会话 r2 提交与 r3 文档写入实际均被同一 operation 拒绝;它不是仅根据代码猜测的风险。
没有调查那个集成任务具体合并失败的底层原因,不能声称已经定位其全部根因。
问题类别还包括过度恢复升级:execute 在带 env/git:dev 的命令非零退出时统一需要恢复(agentctl.py:1145–1146);应按实际副作用证据区分,不能因此把真正未知结果直接释放。
physical_names 将 git:dev 与 env:dev 绑定同一 dev-integration.lock;固定制品部署后可分离代码引用与运行环境锁。
另有 task 生命周期不一致:规范允许 blocked并要求原task_id续办,task close 只支持done/cancelled,register拒绝非active的同ID。
本会话曾尝试blocked而被CLI明确拒绝;新增-r2/-r3只是受限工具下的执行登记,逻辑研究任务一直保持原ID。
建议新工具原ID可reopen/update-state,执行尝试另有attempt_id,旧运行副作用日志保留。
治理快照(本轮只读SQLite URI mode=ro):completed=1455、failed=208、recovered=167、busy=21、recovery_required=1。
其中recovered为command=144、integrate_prepare=22、integrate=1;这不是错误率、误报率或性能基准,不把正常恢复也算缺陷。
阻塞operation为 integrate-nightly-advance-2026-09-28-r2-prepare-838577a7,resources含git:dev/path:./该候选tree,exit_code=1。
稍后复核该记录已为recovered,本代理没有调用recover、删锁或修改管理数据库状态来解除它;正常agentctl with随后返回成功。
Development-Manager中的对应overlaps/Lease/prepare与task close逻辑仍同类,不能靠只把工具搬仓根治。
### Decisions and Replacements
方案KTD6改用Gitea原生PR合并/保护/CI,取消默认自建签名收据网关、机器人直推与manually-merged回写。
仍显式验证base/head/候选tree/组件manifest,合入后的真实SHA绑定制品和部署;不能将PR head测试当合并候选通过。
方案KTD13给出retain/replace/remove矩阵、局部资源身份、known-failure/unknown分类、任务续办、清理和规范层级。
U2负责替代治理与切换,补V19–V23负例;不是另外堆一套大型协调服务。
工作区的源码副本不互锁;同实际目录和共享环境保留适用保护;产品数据库事务/文档职责/运行租约不在工程锁裁剪范围。
暂不修改共享ISSUES/lessons索引:本次用户明确仅允许三个待审文档,本节保存问题主记录候选,实施/正式文档集成时由相应owner补索引。
没有修复和回归运行,不把上述问题标resolved或经验标validated;既有coordination-authority问题继续按原状态追踪。
### Authority and Exception Record
曾因正常入口仍被全仓恢复锁阻塞,请求只针对这三份文档的临时租约豁免。
用户批准:owner=Codex,原因=待审文档落盘被无关恢复操作阻塞,覆盖=本任务三文档的agentctl with前置,禁止=解锁/改工具或现行规范/提交/推送;有效期=保存完成即结束;恢复动作=保留可审diff,恢复正常租约流程。
实际结果:原阻塞先恢复,r3与r4方案主体通过agentctl with保存;随后新操作integrate-nightly-advance-automation-2026-09-28-r7-prepare-dca474ad再次进入recovery_required,正常入口拒绝最后的文档写入。
本轮最后保存使用用户已批准的豁免,仅对原三文档直接写入;没有调用recover、删除锁、修改hook/agentctl/现行规范或提交/推送。完成保存和校验即终止豁免,后续回归正常租约流程。
用户确认的“仅三份待审文档、不提交或推送”作为本次交付限制保留。
修订3的Ubuntu单平台和U9原生核心替代已经本轮正常落盘;修订2工作区改动一并保留,没有丢弃或覆盖其他任务文件。
本次审查是源码/运行元数据/官方Gitea资料的定向核对与作者一致性检查,未声称重复进行了首轮六视角或外部模型审查。
最终校验:3份文档、6个相对链接、15项要求、9个实施单元、23项验收场景,结构/ID/链接/旧方案残留检查通过;git diff --check exit=0。收口盘点cleanup total=18/blocked=18/ready=0,未清理;docs drift regressions=0/open_capabilities=3。没有实施、编译或真实运行验收。本轮使用的一次性三文档豁免至此结束,不提交/不推送。
## Revision 5: Proportionate Everyday Rules
用户追加“很多规范过严,按最新方案适当完善”;本轮仍仅修订原方案、证据与任务,不批准或启用新规范。
读当前AGENTS、PROJECT、验证契约、经验闭环、收口模板及KTD13;核实已有纯文档免全量测试/按机制选场景/矩阵按声明更新等合理条款,未把它们误报为全都缺失。
问题是执行尺度和入口一致性:Go/接口验证矩阵列全包vet/short,而报告章节又说明不无条件全量;需明确本地迭代/组件CI/组合发布三个检查阶段。
启动阅读、每次收口盘点、任务与多表状态、逐修复lesson要求,对小改动容易叠加成本;应区分硬边界、默认做法和工具建议。
本会话没有测试耗时/误报率统计,不虚构量化收益;提出的改进以规则文本和已出现流程阻塞为依据。
保留真实权限、持久性、运行制品、敏感数据和已确认外部副作用边界。
新增KTD14及验证分层/证据复用/规则强度说明,扩展U2的规范模板同步和日常演练,新增R16/V24/V25。
不新增implementation unit或独立报告,避免为了精简流程再扩大产物层级。
本轮仅修订三文档,使用新的r5执行登记承载同一个逻辑task_id;上一轮一次性豁免已结束,本轮不自动沿用。
修订5验证:三文档结构、6个相对链接、R1–R16/U1–U9/V1–V25唯一性与待审状态检查通过,git diff --check通过。只读cleanup为18项blocked、0项ready,docs drift无回退;未清理工作区。正常agentctl with写入,无需也未沿用上轮临时豁免;未提交、推送、修改生效规范或执行产品测试。
## Revision 6: Remove Coding Workflow Dependence
用户明确反馈Agent主要精力被agentctl任务领取、提交、合并消耗。本轮收敛KTD13/14的职责,新增KTD15:普通编码流程零agentctl依赖,任务/PR单一状态来源;治理恢复归维护者,发布部署独立。
这不是已经测得时间占比;依据为用户观察与本会话两次跨工作区锁阻塞、登记续办及blocked CLI不匹配的实际记录。
修改U2优先顺序,先完成本地减负与Gitea交接,再做多仓适配;不把新的task/reopen/claim平台作为减负前提。新增V26端到端日常流程验收。
本轮仅修订原三份待审文档,不启用新规则,不提交/推送;现行登记仍按当前工具执行,逻辑task_id未变。
## Revision 7: Single Executable, Instance Configuration and Native Infrastructure
用户连续补充:同一套单文件应用供测试/生产等多个实例,通过启动配置隔离;希望.env、CLI、系统设置后读覆盖;进一步评估KB/DB/文档库用launcher、daemon、应用内启动或原生程序。
本轮作为原任务续办,只完善原三文档;此前中断段只读检查已完成,没有启动或变更产品服务。
### Baseline and Current Source Checks
原研究worktree仍HEAD=de90d0cd(业务源码基线a3db288a);主目录本轮已为test@fd177f8dd5c7e5714476b59efc1b9a2ae27bdb22,dev=b9339cd27206f519f423eaa6a1601d3a67dfac01。
没有切换/重置主目录或重新合并业务源码。
对a3db288a..dev的config/localpg/sysadmin settings/db migrate/main/app/templates/web embed/build-single-binary以及kb/storage/workspace/docrevision相关路径做diff --stat,无差异输出;本节结论同时适用于本轮核对的这些dev路径,不能推及未查模块或运行环境。
没有读取.env真实值、用户output.md、workspace.json、运行数据库数据或修改系统设置。
### Source Findings
| 来源 | 已确认事实与影响 |
|---|---|
| cmd/server/main.go:22–40、config/config.go:103、159–174 | 默认→env文件→进程env,CLI只覆盖env/port/host/backend;默认.env路径与Load空字符串的overlay路径不同 |
| config/config.go:99、localpg/localpg.go:36/48/74 | 存在dev默认路径与部分直接os.Getenv读取;尚非统一最终配置快照 |
| sysadmin/settings.go:78/229/275 | 独立DB→进程env→默认解析,不直接消费已合并CLI/.env的cfg;不能说所有系统设置已整体覆盖启动配置 |
| sysadmin/service.go:NewService、settings/store | 系统设置来自所选业务PG,key无实例命名空间;用它配置自身连接会循环 |
| sysadmin/apply.go、settings.go:199、app/app.go | 部分键推送PI /admin/reload;保存、热更新和真正启动消费并不等价 |
| db/migrate.go:RunMigrations/ResolveMigrationsDir | 当前Goose从磁盘SQL目录读取;现有二进制尚未内嵌全部迁移 |
| web/embed.go、templates/embed.go、template/loader.go、squad/service.go | Web与部分Markdown已内嵌,agent指令和xlsx等仍依赖磁盘路径 |
| localpg/localpg.go:100/123/271/287 | 查找已安装PG→可initdb建cluster→createdb建应用库→启用vector;不是安装数据库,也不创建独立KB语料库 |
| localpg/localpg.go:187/261/307、cmd/server/main.go | 当前按端口就绪判断、已有角色bootstrap、started标记与defer清理不足以证明所有权/崩溃恢复;os.Exit可绕过defer |
| kb/client.go:75/94、kb/store.go、kb/embed.go | KB是应用内检索代码直连PG;embedding/reranker为外部HTTP能力;连通不等于语料与索引已准备 |
| storage/cas.go:42、workspace/capability.go、docrevision/pg_store.go | 文档库由PG账本/内容与持久文件组成,非独立文档daemon |
| app/app.go:224、workspace/lease.go | 进程内workspace租约不足以宣称多副本共享同一数据根已安全;独立实例与HA副本分开 |
| cmd/server/main.go:71、cmd/events/main.go | server已有可选内置events consumer,单文件模式可收敛到同一程序角色,不必分发第二个应用程序 |
两项后续调查候选:配置解析双路径/生效声明不一致、managed-local PG所有权与失败回收不足。
本轮没有运行复现或修复,不登记为resolved,不改共享ISSUES索引;U10中给出针对性正负例。
既有data-dir-doubled、PI runner DATA_DIR覆盖、隔离DB经验直接用于路径归一化与禁止隐式dev回退的验收设计。
### Decisions
1. 单版本单个Ubuntu amd64应用文件内置Web/SQL/prompts/xlsx等资产,同文件可启动多个独立实例;配置/数据/日志不打进程序。
2. 不新增应用launcher/KB/文档daemon;同一二进制提供serve/init/migrate/config检查,系统服务管理应用和原生PG。
3. 产品部署设置放独立实例配置根的instance-settings文件,作为普通部署参数的最终层;产品业务策略仍在所选DB,key各有唯一owner。
4. bootstrap identity/config_root/settings读取模式不自覆盖;DB/KB/目录等可经UI配置,但须重启/迁移后确认applied,不能在进行中任务里换一半。
5. 默认existing;显式创建逻辑库与安装PG/建立cluster/迁移schema/导入KB区分;managed-local仅可选自有cluster。
6. 配置身份、DB角色、可写目录、cookie/密钥、Runner上下文和文件/数据库备份同时隔离;一套二进制不构成隔离证明。
7. U10为应用部署新工作,U6a要先满足其最小单文件/外部PG出口;不把该需求隐藏在U9的PI能力替代里。
复核由独立只读子审查覆盖配置链、存储/进程依赖与设计一致性,补齐saved/applied、最终配置冲突检查和外部进程停止权。
本轮没有额外外部模型审查、编译、initdb、建库、启动/停止daemon、服务配置写入或业务数据迁移。
### Primary References
- [PostgreSQL initdb](https://www.postgresql.org/docs/current/app-initdb.html):cluster初始化与原生进程身份。
- [CREATE DATABASE](https://www.postgresql.org/docs/current/sql-createdatabase.html):逻辑数据库创建。
- [PostgreSQL启动与系统服务](https://www.postgresql.org/docs/current/server-start.html):原生postgres/pg_ctl和系统服务职责。
- [pg_ctl](https://www.postgresql.org/docs/current/app-pg-ctl.html):原生管理边界。
- [pgvector项目](https://github.com/pgvector/pgvector):PG内扩展而非单独daemon。
systemd官方man页面本次抓取403,未将该失败当作成功资料;系统服务建议参考PostgreSQL官方启动文档。
修订7验证:3文档结构、6个相对链接、R1–R19/U1–U10/V1–V34唯一性与待审标记检查通过,git diff --check通过;只读cleanup为20项blocked/0项ready,docs drift无回退,未清理。源码/配置/生命周期定向复核完成;未编译、建库、运行实例或部署。文档通过正常agentctl with保存,本次未使用临时豁免,仍不提交/不推送。
@@ -0,0 +1,126 @@
---
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 执行迁移。
## 修订 2:前端与 Agent-Native(2026-09-28)
用户追加前端拆仓、自研 Agent 和第三方 Agent 接入方向;原“待审、不生效”授权边界继续适用。
沿用逻辑 task_id 与 worktree;旧执行登记已关闭且工具无 reopen,续办执行登记为 multi-repo-design-2026-09-28-r2,不扩大三个文档路径 scope。
完成源码确认:助手与 Squad 共用 agent.Backend/NewBackend;原生内核位于 agentx,pinative 是产品适配;源码默认仍 pi-agent,部分增强功能仍按该名称装配,运行态未验证。
新增 Agent-System-Web/Agent-Native 设计、契约与权限边界、旧名兼容、PI fallback 真正执行身份、Web 单二进制资产装配,以及对应迁移单元与验收。
通用规范/模块契约记忆仅辅助定位,当前结论来自新读源码;没有实施或扩大运行权限。
不新增 validated lesson;本轮未修复或运行验证。
原任务的首轮审查/盘点保留为历史记录,修订 2 的结果单独记于证据。
## 修订 3:Ubuntu与原生核心替代
用户确认Ubuntu 26.04 x86_64单平台与PI核心能力对齐方向;新增执行登记multi-repo-design-2026-09-28-r3,逻辑task_id与三个写路径保持。U9独立于拆仓与现版发布,不实施、不改默认后端、不推送或部署。
## 修订 4:多仓开发治理精简
来源:用户明确要求重新审视规范、锁、agentctl,可删减无必要或反复阻塞的机制并增加适合新方案的能力;只修订待审方案。
沿用multi-repo-design-2026-09-28逻辑任务及仍active的r3执行登记;仅更新原三个文档。
交付变化:KTD6改为Gitea原生准入;新增KTD13治理取舍/锁与恢复模型,重写U2,增加R15与V19–V23;补落盘上轮Ubuntu单平台和PI核心能力对齐U9。
已核验一次全仓恢复阻塞的实际因果链,并保存为audit中的问题候选;未修复工具,不把历史恢复次数当错误率。
临时例外:用户批准仅三份待审文档的一次性写入租约豁免,owner=Codex,期限=保存即终止,禁止改锁/工具/现行规范/提交/推送,恢复为正常租约写入。
原锁先恢复,方案主体通过agentctl with保存;随后新候选准备操作出现相同全仓恢复阻塞,最终三文档保存使用已批准豁免。没有解锁或修改现行工具/规则;保存校验结束立即终止豁免,按用户明确范围不提交或推送。
本轮研究产物完成后仍review_state=pending、policy_state=proposed,部署/实施/远端设置均未执行。
最终校验:3份文档、6个相对链接、15项要求、9个实施单元、23项验收场景,结构/ID/链接/旧方案残留检查通过;git diff --check exit=0。收口盘点cleanup total=18/blocked=18/ready=0,未清理;docs drift regressions=0/open_capabilities=3。没有实施、编译或真实运行验收。本轮使用的一次性三文档豁免至此结束,不提交/不推送。
## 修订 5:日常规范按影响适配
用户要求按最新方案适当完善过严规范;继续只更新三份待审文档,不提交/推送/实施。
逻辑task_id不变;机器执行登记multi-repo-design-2026-09-28-r5承接本次,旧登记不重开。
增加KTD14:四类工作影响、精简默认、按阶段验证与适用证据复用、硬边界/默认/建议区分;U2负责同步规范、模板、客户端与CI。
保留原规范已合理的纯文档轻验证、按机制回归和真实证据要求;不把放宽流程误写为跳过必要验证或扩大外部授权。
修订5验证:三文档结构、6个相对链接、R1–R16/U1–U9/V1–V25唯一性与待审状态检查通过,git diff --check通过。只读cleanup为18项blocked、0项ready,docs drift无回退;未清理工作区。正常agentctl with写入,无需也未沿用上轮临时豁免;未提交、推送、修改生效规范或执行产品测试。
## Revision 6: Remove Coding Workflow Dependence
用户明确反馈Agent主要精力被agentctl任务领取、提交、合并消耗。本轮收敛KTD13/14的职责,新增KTD15:普通编码流程零agentctl依赖,任务/PR单一状态来源;治理恢复归维护者,发布部署独立。
这不是已经测得时间占比;依据为用户观察与本会话两次跨工作区锁阻塞、登记续办及blocked CLI不匹配的实际记录。
修改U2优先顺序,先完成本地减负与Gitea交接,再做多仓适配;不把新的task/reopen/claim平台作为减负前提。新增V26端到端日常流程验收。
本轮仅修订原三份待审文档,不启用新规则,不提交/推送;现行登记仍按当前工具执行,逻辑task_id未变。
## 修订 7:单文件应用与可配置多实例
用户要求统一单文件应用制品、通过启动配置隔离test/prod及其他实例,并评估存储依赖的启动方式。
新增KTD16–18、实例隔离与数据目录、U10;替换旧外置assets部署包合同,扩充R17–R19及V27–V34。
推荐应用入口内置、自带应用静态资产,PG原生服务,KB/文档逻辑在应用内;部署设置使用独立config_root的本地持久层解决DB启动循环。
实例名不再绑定Git分支;同版本制品只构建一次,各实例固定版本与自己的配置/数据。
原任务worktree/逻辑task_id不变,执行登记multi-repo-design-2026-09-28-r7。主目录当前test,未切换/部署;对本轮涉及路径复核最新dev差异。
仍只修改三文档、不提交或推送;新配置/初始化/迁移与服务生命周期尚未实施,不会因方案示例创建目录或数据库。
修订7验证:3文档结构、6个相对链接、R1–R19/U1–U10/V1–V34唯一性与待审标记检查通过,git diff --check通过;只读cleanup为20项blocked/0项ready,docs drift无回退,未清理。源码/配置/生命周期定向复核完成;未编译、建库、运行实例或部署。文档通过正常agentctl with保存,本次未使用临时豁免,仍不提交/不推送。
File diff suppressed because it is too large Load Diff