Document sandbox and workspace recovery review design
Why: Specify the approved remediation direction for three Important findings from the independent dependency-migration review. Evidence: SELF Markdown link and whitespace checks passed before commit; written design awaits human review and implementation validation. Impact: Add a bounded design addendum for local/CI candidate isolation, fixed-rules retry and safe generated-workspace finish without changing product code. Refs: Agent-System-Documents#100, Agent-System-Dev#537, Stage 8 review
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
# 版本依赖迁移:独立 Review 整改设计 r1
|
||||
|
||||
状态:**设计原则已获用户批准;本书面设计待人工评审**(2026-10-14 UTC)。实施计划、代码整改、新 HEAD 的阶段 7 验收及阶段 8 复审均未完成。本文是[版本化依赖与按需源码工作区方案 r1](2026-10-13-versioned-dependencies-and-workspaces.md)的有界修订,关联[原实施计划](2026-10-13-versioned-dependencies-implementation-plan.md)、Dev PR #537 与 [独立 Stage 8 Review](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/537#issuecomment-5989)。旧 Dev `6a2f7cd3e610a263b6348efe9084e386dc88f30c` 的阶段 7 人工通过、run3076 和 RDM run3077 只覆盖旧候选;三项 Important 未关闭,14 个 PR 继续 WIP,Dev #518 的原交付窗口已释放。
|
||||
|
||||
## 决定与目标
|
||||
|
||||
用户在本会话先选择“本地执行强制 Bubblewrap 沙箱”,随后选择“本轮同时隔离 CI:由受信步骤启动无 Docker socket 的子容器执行候选代码”。目标是关闭三项独立 Review 阻塞:候选脚本可通过同 UID 文件系统读取本地凭据、固定规范缓存部分克隆后无法重试、生成固定 `.workspace/` 后普通任务无法安全 `task-finish`。继续保留独立仓库、语言版本权威、旧候选重建、在途分支和唯一文件保护。
|
||||
|
||||
信任边界分为控制面和候选执行面。已审阅的 Dev 编排器与 CI 工作流负责校验固定提交、预取私有来源和建立沙箱;Go/npm 提供方脚本、测试、构建及 Dev 正式验证命令进入候选执行面。本轮阻断候选执行面直接读取本机 HOME、私有 SSH 文件及 Docker socket。**本轮不声称防止恶意 PR 改写其自身工作流/编排器**:平台是否强制采用不受候选控制的工作流、runner 是否隔离、token 最小权限与自动 fencing 继续按实际状态标 `NOT_RUN`/manual;若要对恶意控制面改写提供平台强制保证,需独立的受信外部准入设计与所有者操作。此限制必须写入项目规则、测试报告和 PR 审阅材料,不把“环境变量已清理”表述为 OS 级隔离。
|
||||
|
||||
## 本地候选执行
|
||||
|
||||
正式 `make test/build` 先由受信编排器从 `components.lock.json`、`go.mod/go.sum`、npm lock 获取并验证固定源码;获取完成后才调用候选命令。所有候选 Go/npm/项目测试和构建子进程经同一 Bubblewrap 入口执行,不能从 `run()` 的某条旁路直接执行。入口创建每次独立的 HOME、XDG/Go/npm 缓存及临时目录,隐藏主机 `/home`、`/root`、其他 `/tmp`、`/run`/Docker socket,只挂载必要系统工具与本次隔离组合目录;候选进程有独立 PID 与 `/proc` 视图,输出目录限于本次组合。需要本机 HTTP/数据库验收的测试保留明确的网络能力,不能由此获得主机凭据文件。传输凭据、Git extraheader、SSH agent、宿主 HOME 与 npm/Git 用户配置均不传入候选环境。
|
||||
|
||||
启动时验证 Bubblewrap 可用且实际阻断绝对路径访问;不可用、挂载不符合允许集或负例能读到受保护标记时,正式命令**失败关闭**,没有同 UID 直接执行的降级分支。普通 clone 的 `make setup`/PROJECT 指出该 Linux 前置和诊断命令;缺前置不能标 R2 正式构建通过。受信控制面本身仍是代码 Review 对象,不把 Bubblewrap 包装误写成恶意 Dev `Makefile` 无法执行的强制机制。
|
||||
|
||||
## CI 候选执行
|
||||
|
||||
三个必需作业 `test`、`test-pg`、`svc-realcombo` 的受信父步骤继续按白名单获取固定来源,只在获取步骤环境中读取 checkout token;父步骤校验镜像、工作区卷身份、固定 SHA 与无凭据的本地 mirror 配置。受信父步骤经 Docker socket 启动一个子容器运行该作业**全部候选源码命令**,包括 Dev `make test/build`、RDM 固定 pin 构建、Backend PG/Redis、双进程 HTTP 与真实生命周期。父容器不得在子容器启动前运行候选 Makefile、Go/npm 脚本或测试。
|
||||
|
||||
子容器只挂载本次作业的工作区卷,**不挂** Docker socket、`/var/run/act`、父容器 HOME 或凭据文件;使用只读根文件系统、丢弃 Linux capabilities、`no-new-privileges`、独立 PID 及临时 `/tmp`,仅工作区与明确缓存路径可写。受信准备在子容器内安装/核对固定 Go 1.27.1、Node 22、Python 与本作业所需系统工具后再执行候选命令。PG/Redis 作业可共享父作业的网络命名空间以访问本机测试服务,但不能共享其文件系统或 Docker socket。子容器创建失败、工具版本不符、挂载/负例检查失败或任何候选命令失败时,原作业失败;三个必需 job/context 名称保持不变,禁止跳过作业换绿。
|
||||
|
||||
已做的**一次性机制探针**:本机 Bubblewrap 可隐藏 SSH 文件;当前 `gitea/runner-images:ubuntu-latest` 容器内安装 Bubblewrap 后因命名空间权限被拒;受信父容器可启动共享工作区卷与网络、无 Docker socket、cap-drop、只读根文件系统的子容器,SELF `/tmp/dependency-ci-child-sandbox-probe-20261014-01a1345f.json`。探针仅证明容器机制,不证明完整 Go/npm/PG/浏览器工作流或平台工作流来源;完整 CI 必须在新 HEAD 重跑。共享 runner 配置和分支保护不在本设计中直接修改。
|
||||
|
||||
## 固定规范缓存的失败恢复
|
||||
|
||||
`precheck` 继续读取清单中的 Guidelines 精确 SHA。持有缓存身份锁时,先在仓外缓存创建唯一暂存目录,完成 clone、fetch、detached checkout、独立 Git 身份、干净状态与 `core/baseline.md`/`workflows/delivery.md` 校验,再以同目录原子 rename 公布为固定身份路径。失败或中断留下的暂存目录原样保留并报告路径;下一次重试创建新暂存目录,不因前次临时目录阻塞。身份锁是活动写者保护,不能删除锁强行重试。
|
||||
|
||||
已存在的正式身份路径只在 Git 身份、origin、SHA、干净状态和必读文件完全匹配时复用。旧实现留下的空目录可在锁下保留到命名的隔离路径后重试;含未知文件、借用 Git 身份、脏状态、活动锁或独有引用的异常目录拒绝自动迁移并报告明确的人工保留/处置入口,**不自动删除或覆盖**。这一区分使新失败可直接重试,也给旧部分现场留安全出口。
|
||||
|
||||
## 普通任务的安全回收
|
||||
|
||||
`task-finish` 仍要求任务分支已合入、远端/HEAD 核验、工作区 owner 明确 `TASK_WRITERS_STOPPED=1`、Git 锁及递归子仓检查通过。仅对 `.workspace` 中已登记、固定且 detached 的独立源码检出放行:登记的 owner/path/origin/baseline 与实际 checkout 一致;没有 staged、unstaged、untracked、ignored 唯一文件、独有 refs/reflog/stash、外部 worktree、活动操作或 overlay;顶层只允许 `state.json`、`resolved.json` 与登记的固定组件目录,且元数据为普通文件。验证后,仅将根仓 `git status` 中的**确切** `!! .workspace/` 视为可再生生成内容,再由现有 `git worktree remove` 正常回收;任何其他 ignored/untracked 项仍拒绝,不能加 force 或按目录名一概清理。
|
||||
|
||||
处于 editable/linked 的功能仓、未知目录、坏 state、唯一内容或额外 Git 工作区继续拒绝回收,并输出需先保留独立源码的路径;本轮不自动移动或删除可编辑仓。后续阶段 10 对这些现场逐项由 owner 指定保存/处置方式,未经授权不执行实际工作区回收。正常仅准备固定源码的新任务须能顺利走完现有 `task-finish`。
|
||||
|
||||
## 验证、影响与停止条件
|
||||
|
||||
- 临时真实仓覆盖:规则 clone/fetch 中断后留存现场并重试、旧空目录隔离、未知内容/锁拒绝;固定 `.workspace` 的干净成功回收,以及脏/ignored/编辑分支/独有引用/外部 worktree/坏 state 拒绝且原字节保留。治理脚本必须跑 `make test-governance`。
|
||||
- 本地沙箱负例用**假标记**验证候选脚本不能通过 HOME 或绝对路径读取宿主文件、Docker socket;正例验证固定 Go/npm/Frontend/RDM 构建和普通 Dev 克隆,不读取真实密钥值。CI 子容器负例验证 socket、父 HOME、`/var/run/act` 不可见,正例验证工作区卷、固定工具链与 PG/Redis/生命周期;不把容器机制探针当完整 CI。
|
||||
- 新 Dev HEAD 需重新 `make task-sync`、`make test/build`、来源/摘要、普通克隆/Native 编辑、受影响产品浏览器重放,且当前 SHA 的 `test`、`test-pg`、`svc-realcombo` 三个 GATE 全部成功;Docs/Guidelines 的相关文档链接和规则一致性复核。正式结果重新提交阶段 7 人工审阅,之后对变更范围进行独立 Stage 8 REPLAY/Review,再逐仓核准合入。旧 `6a2f7cd` GATE/验收保留为旧对象历史,不移用。
|
||||
- 若 Bubblewrap 或 CI 子容器在普通 clone/runner 上不可用、沙箱需要挂载宿主凭据/Socket 才能通过、固定缓存恢复会移动未知文件、或回收会删除唯一内容,则停止受影响交付并修订设计。发布、部署、业务数据、历史改写、删除来源引用、共享 runner/保护设置及未授权任务回收仍不实施。
|
||||
|
||||
备选取舍:仅清理环境变量/改 HOME 无法阻止同 UID 绝对路径读密钥;只给 CI 容器安装 Bubblewrap 在当前权限下实测失败;仅把原作业容器当沙箱仍暴露 Docker socket。因此本轮采用本地 Bubblewrap + CI 无 socket 子容器;更强的恶意工作流平台强制准入另立边界,不用此方案冒称完成。
|
||||
@@ -12,6 +12,7 @@
|
||||
2026-10-13 已批准具体方案并授权重构、自检连续推进,增补在途分支保护 R15。
|
||||
[实施计划](2026-10-13-versioned-dependencies-implementation-plan.md)记录 U1–U8;实施进展见 Dev 任务卡,
|
||||
正式验收、共享部署和发布保留原审批边界。
|
||||
[独立 Review 整改设计 r1](2026-10-14-versioned-dependency-review-remediation.md)记录三项 Stage 8 阻塞的本地/CI 沙箱、规范缓存重试与生成工作区安全回收边界;设计原则已获用户批准,书面设计待人工评审,旧候选不得据旧 CI 合入。
|
||||
|
||||
- [IAM I1 权限边界与公开扩展合同 r1](2026-10-13-iam-i1-permission-contract.md):
|
||||
依据已批准的[用户、职位角色与分层权限统一方案 r1](2026-10-13-identity-role-permission-plan.md)
|
||||
|
||||
Reference in New Issue
Block a user