Skip to content

test(runtime): add native Codex isolation acceptance probes - #413

Merged
sda-rob merged 64 commits into
mainfrom
ao/agent-infra-27/codex-isolation
Sep 13, 2026
Merged

sda-rob merged 64 commits into
mainfrom
ao/agent-infra-27/codex-isolation

Conversation

@LichKing-2234

@LichKing-2234 LichKing-2234 commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Closes #404

变更摘要

  • 修复 Codex 原生跨用户数据隔离:Driver 按可信 agentId/conversationId/sessionGeneration 派生的存储键,为每个 Conversation 代次运行独立原生 app-server 进程与持久目录(<driver-state>.native/conversations/<key>/{home,workspace})。
  • 文件边界按平台施加,均不落盘配置文件:Darwin 由 pinned Codex 自身的权限 profile 以 session flag 注入(Conversation 根 deny、本 home 只读、workspace 可写);Linux 由部署可信 setpriv 的 Landlock allowlist 限定整个原生进程。无法施加边界的平台拒绝启动原生进程,不存在无边界回退。
  • 启动准入改为按进程执行:每个原生进程独立验证 pinned provenance、initialize 与受限配置;一个进程的准入不为另一个担保,一个原生传输只允许一个请求多路复用器。
  • 新增显式启用的 pinned Codex 双用户隔离验收 harness,经正式 RuntimeHost/Driver/Bridge、真实原生进程与 loopback 受控模型端点验证 Session、文件、历史、运行上下文、并发与重启恢复。正式镜像探针新增预先存在的兄弟 Conversation 目录负向用例。
  • 两处随验收暴露的相关缺陷:Driver 现在也从 item/completed 记录 agent message 正文(pinned Responses 传输从不流式发送 delta,平台 replay 原本完全丢失 assistant 正文);Bridge 拒绝为 loopback 模型端点走宿主代理。
  • 同步工程 Spec §10.9、HLD §10.1/§10.2、ADR 0008、Agent 入口文档与 README 布局说明。不改变部署单元、对外 Runtime Contract、Grant 校验或 §10.8 模型传输边界,也不引入平台统一 Sandbox。

与原 Scope 的两处偏离(均为实测冲突,已在文档修正)

  1. Darwin 不能再包一层外层 filesystem profile。 pinned 版本在 macOS 用 /usr/bin/sandbox-exec 执行工具,外层 profile 只要含任何具有约束力的规则,内层 sandbox_applyOperation not permitted,会使工具普遍不可用并伪造出「隔离通过」。实测矩阵与改用原生权限 profile 的依据见 #404 设计修订评论
  2. Linux 不能同时保留原生自有文件 sandbox。 pinned 版本拒绝把任何 default_permissions profile 与 --use-legacy-landlock 同用(连只写 extends=":workspace" 也拒绝),而它的替代后端需要 bubblewrap 与 user namespace,pinned 发行版不附带该二进制、运行容器在移除全部 capabilities 与 no-new-privileges 下也无法 unshare(CLONE_NEWUSER)。实测该 legacy Landlock 后端在执行工具前需要对 / 的递归 read-dir:缺少它时工具以 Failed to execvp /bin/sh: Permission denied panic,补上它之后兄弟 Conversation 目录重新可列举、本人 workspace 写入反而失效。Landlock 只能增加访问、深层规则无法收窄父规则,因此两个后端不能同时成立。本 PR 保留能真正隔离的那一个:Linux 关闭原生自有文件 sandbox,平台 Landlock 边界成为唯一文件边界,后端选择仍留在 legacy Landlock 以避免残留代码路径落到需要 namespace 权限的后端。代价是同一 Conversation 内的模型工具与该 Conversation 自身权限相同,可写入本 Conversation 的原生 home;跨 Conversation 的读取、列举、搜索与写入仍全部被拒绝,并由镜像探针的负向用例证明。Darwin 不受影响,home 对模型工具仍只读。

验收标准

AC Status Evidence
AC-1 pass 报告记录 pinned 0.153.0upstreamTag=rust-v0.153.0、schema sha256 已校验)与 darwin 有效配置 approvalPolicy=on-requestsandboxType=workspaceWritenetworkAccess=falselaunchConfiguration.actors.{a,b}.isolated=trueactorsDisjoint=trueconfiguration.personal-memory=pass(原生 feature 关闭且模型未暴露 memory 工具)。Linux 的机制、已验证保障与已记录代价见上一节与 Spec §10.9。同目录与 threadId 均未单独作为结论。
AC-2 pass 两个 actor 在同一 Agent 各自 Conversation:owner-file-readthread-context 正向对照 pass;cross-file-readcross-file-searchforeign-read-permission-deniedcross-file-modifyforeign-write-permission-denied(他人文件独立回读未变),cross-history-fileforeign-marker-absent(本人 present + 对方 denied)。四通道均未观察到外来标记。Linux 侧由正式镜像探针 native-sibling-conversation-denied 覆盖:预先存在的兄弟 Conversation 目录读取、列举与写入全部被拒绝,同一命令内本人 workspace 写入并回读成功。
AC-3 pass concurrentrestart-resume 两个阶段全部场景 pass,restart-resume.original-native-sessions=two-processes-resumed-original-native-sessions;证据绑定 clean-head commit a5feebb6d6e7a35b8ac06c86a0614ac7cc39f38bpersistence=pass / required-403-merge-reachable-clean-headmergeCommit=389b2b30890399270c645a32cd21ddf3a81dd41e)。
AC-4 pass 每个负向结论都有同命令的本人正向对照成功(读 READ、写 APPLIED、历史 OWNER=present),因此不是「工具普遍不可用」;host-positive-control=passactiveThreadEvidence=pass 且 raw marker 正向对照 success。镜像探针的兄弟目录负向用例另做过反证:把 allowlist 放宽到 / 后该阶段立即失败,确认不是空断言。现有 Session/Grant/fence 回归随 pnpm test 全绿。
AC-5 pass 本轮实际通过,隔离标记为通过;结论只来自包含修复的 clean head 运行。两处机制偏离都先给出实测复现再修正文档,未改变任何 AC,也未降低门禁。前几轮失败的最小复现保留在 #404 与本 PR 评论中。
AC-6 pass 完整 AGENTS.md 验证序列通过(见「自动验证」)。产物仅含合成数据与脱敏布尔/分类结果,不含 native ID、路径、模型输入正文或凭证;#190/#322 的 Fake 交付关系未改变。

自动验证

  • 已执行:pnpm install --frozen-lockfilepnpm checkpnpm check-typespnpm testpnpm buildpnpm smokepnpm docker:buildmarkdownlint-cli2 25 文件、markdown-link-checkverify-workflow-policyrun-actionlintgit diff --check@agent-infra/agent-runtime 488 passed / 16 skipped。
  • 已执行:pinned Codex 原生隔离验收(darwin/arm64)overall=pass,退出码 0,全部场景 pass;pinned 原生进程恢复套件 15 passed。
  • 已执行:正式镜像探针在本地 runner 镜像中 status=passed,14 项 check 含新增 native-sibling-conversation-denied。本地内核只提供 Landlock ABI 4,因此本地运行把 ABI V5 准入探针权限位换成 fs:truncate;CI 走未改动的 fs:ioctl-dev 路径。
  • 说明:本机 pnpm docker:build 并行调用因 npm registry 超时失败,改为逐服务构建后全部成功;合并 main 之后本机 @agent-infra/platform-store 的 PostgreSQL 容器因本地磁盘压力无法就绪。两项都与本变更无关,以 CI 结果为准。
  • 未执行及原因:多用户隔离 harness 需要 pinned 二进制,默认跳过且无法由 CI 复跑;darwin 结论不外推为 Linux/Pod,Linux 侧结论限于正式镜像探针覆盖的范围。CI 结果以本提交的 Check 为准。
  • 已移除本轮全部临时 CI 诊断步骤:git diff.github/workflows/ci.yml 相对实现基线为空。

人工验证

  • 结论:需要人工验证
  • 验证内容:分支保护要求非作者 CODEOWNER 对当前提交 Approve;ready-for-human 曾被应用,因此 Human Validation Gate 需要针对当前 head a5feebb6d6e7a35b8ac06c86a0614ac7cc39f38b 的团队成员确认评论。原生验收需要 pinned 二进制且默认跳过,无法由 CI 复跑,请按需回读本 PR 的脱敏报告。

评审意见处理

48 条自动化评审线程已全部回复并 resolve(0 条未解决),逐条处置见
评审处置汇总。其中实际改码的部分:
边界规则只接受规范化目录并双向拒绝与共享边界重叠的条目;Conversation 根不再可写;/proc 只可列举
(关闭模型工具从原生进程环境取走模型凭证的路径,并有反证);/dev 收窄到设备节点所需权限;
transport 已绑定别的 Conversation 时 fail closed 且该策略不再是生产状态里的标志位;通知路由绑定到持有
transport 的 Conversation;证据要求实际观测到的 0 退出码;close() 缓存首次关闭使并发/重复调用只关闭一次
模型传输;darwin-only 的隔离 harness 在其他平台直接 skip(它的观察 wrapper 写在边界外,在 Linux 会把
「边界确实生效」报成 harness 失败)。其余为实测判定不成立(含一条 harness 断言被验收数据反驳)或保持现状
并给出理由;setpriv 从可信 PATH 解析这一条明确 declined 并说明了真实不对称在于 helper 缺少 provenance
固定,建议单独开票。

风险

  • 已知风险:单个 Agent 的并发 Conversation 数量决定原生进程数量,内存与文件句柄开销随之线性增长。准入从 Driver 打开时移到首个 Turn,部署配置错误会更晚暴露(表现为该 Turn RUNTIME_* 失败而不是启动失败)。Linux 上模型工具可写入本 Conversation 的原生 home(见上节代价),Darwin 不受影响。旧共享布局的持久目录不会被迁移或复用。macOS 结论不外推为 Linux/Pod 验收。
  • 回退方式:git revert 本 PR 的 squash 提交即可回到单进程装配;持久目录只新增 conversations/<key>/ 子树,回退后旧代码仍使用原 home/workspace 路径,不需要数据迁移。回退将同时恢复 test(runtime): verify Codex cross-user workspace and memory isolation #404/test(platform): validate main-system Pilot readiness with Fake Connection #194 的隔离门禁。

@LichKing-2234 LichKing-2234 added the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 7, 2026
@sda-rob
sda-rob marked this pull request as ready for review September 7, 2026 16:36
@sda-rob
sda-rob requested a review from a team as a code owner September 7, 2026 16:36
@sda-rob
sda-rob enabled auto-merge (squash) September 7, 2026 16:36
@sda-rob
sda-rob force-pushed the ao/agent-infra-27/codex-isolation branch from cda5deb to 049e6be Compare September 7, 2026 16:37
@LichKing-2234
LichKing-2234 marked this pull request as draft September 7, 2026 16:37
auto-merge was automatically disabled September 7, 2026 16:37

Pull request was converted to draft

sda-rob
sda-rob previously approved these changes Sep 7, 2026
@sda-rob
sda-rob marked this pull request as ready for review September 7, 2026 16:37
@sda-rob
sda-rob enabled auto-merge (squash) September 7, 2026 16:37
@LichKing-2234
LichKing-2234 marked this pull request as draft September 7, 2026 16:37
auto-merge was automatically disabled September 7, 2026 16:37

Pull request was converted to draft

@sda-rob
sda-rob marked this pull request as ready for review September 7, 2026 16:38
@sda-rob
sda-rob enabled auto-merge (squash) September 7, 2026 16:38
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⚡ No major issues detected

Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts Outdated
Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Standalone PR Review

PR-Agent could not safely update the persistent review. This standalone result will not replace the canonical review.

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

No code suggestions found in the successfully analyzed chunks.

⚠️ Suggestion coverage: 1 of 1 analysis chunks failed; no suggestions were found in the successful chunks; failed chunks could not be analyzed.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Standalone PR Review

PR-Agent could not safely update the persistent review. This standalone result will not replace the canonical review.

Comment thread packages/agent-runtime/src/codex-isolation.test-support.ts Outdated
@LichKing-2234 LichKing-2234 removed the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Standalone PR Review

PR-Agent could not safely update the persistent review. This standalone result will not replace the canonical review.

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⚡ No major issues detected

Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts
@github-actions github-actions Bot added the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 8, 2026
@LichKing-2234 LichKing-2234 removed the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Standalone PR Review

PR-Agent could not safely update the persistent review. This standalone result will not replace the canonical review.

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⚡ No major issues detected

Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts Outdated
Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts Outdated
Comment thread packages/agent-runtime/src/codex-app-server-bridge.ts
Comment thread packages/agent-runtime/src/codex-runtime-driver.ts
Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts Outdated

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: 1ed95f9e55c1e52c7c34beb8703b4ae942a9ffc7

1 finding(s) published as review threads.

Comment thread packages/agent-runtime/src/codex-app-server-bridge.ts
The pinned legacy Landlock backend needs recursive read-dir on / before it
runs a tool, and Landlock only ever adds access, so granting that made every
sibling Conversation listable and broke the owner workspace write. Disable the
native filesystem sandbox on Linux, keep the legacy backend selected, and prove
the platform boundary with a sibling-Conversation negative control in the image
probe.
Comment thread packages/agent-runtime/src/codex-app-server-bridge.ts
Comment thread packages/agent-runtime/src/codex-runtime-driver.ts
Comment thread packages/agent-runtime/src/codex-isolation.native.test.ts

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: 4e0f8d305e924ad61540735e5b6441003b619199

1 finding(s) published as review threads.

Comment thread packages/agent-runtime/src/codex-runtime-driver.ts Outdated

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: b51474f678932a63dfcaf44d8ffdec9c8d3af8c4

1 finding(s) published as review threads.

Comment thread packages/agent-runtime/src/codex-isolation.test-support.ts
@github-actions

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

No code suggestions found for the PR.

@LichKing-2234

Copy link
Copy Markdown
Contributor Author

最终验收证据(clean head b51474f678932a63dfcaf44d8ffdec9c8d3af8c4

本轮的实质变化是 Linux 文件边界:pinned Codex 自身的文件 sandbox 与平台 Landlock 边界经实测互斥,
保留能真正隔离的一侧。完整实测矩阵(profile 拒绝、bubblewrap 与 user namespace 不可用、/ 递归
read-dir 需求、以及关闭原生 sandbox 后的逐项结果)见
#404 Linux 边界评论
Scope 的机制描述已按该结论拆分平台,AC-1 至 AC-6 未改。

Darwin 双用户原生隔离验收

  • commit=b51474f678932a63dfcaf44d8ffdec9c8d3af8c4platform=darwinoverall=pass、退出码 0、20 tests passed。
  • provenanceVerified=true,pinned 0.153.0upstreamTag=rust-v0.153.0upstreamCommit=41e22fee…、schema sha256 已校验)。
  • persistence=pass / required-403-merge-reachable-clean-headmergeCommit=389b2b30890399270c645a32cd21ddf3a81dd41e
  • concurrent(两个 actor 各四通道)与 restart-resume 全部场景 pass:本人 owner-file-readthread-context
    正向成功;cross-file-read/cross-file-search=foreign-read-permission-denied
    cross-file-modify=foreign-write-permission-deniedcross-history-file=foreign-marker-absent
    restart-resume.original-native-sessions=two-processes-resumed-original-native-sessions
  • activeThreadEvidence=pass,raw foreign marker 正向对照 successconfiguration.personal-memory=pass

Linux 正式镜像探针

  • 本地 runner 镜像(node:24-alpine,pinned 0.153.0)在 --network=none --cap-drop=ALL --security-opt=no-new-privileges 与 tmpfs 数据目录下 status=passed,14 项 check。
  • 新增 native-sibling-conversation-denied:预先存在的兄弟 Conversation 目录的读取、列举、递归搜索与
    写入全部 Permission denied,共享边界目录列举同样被拒绝,而同一命令内本人 workspace 写入并回读成功。
  • 反证:把边界 allowlist 放宽到 / 后该阶段立即失败(stage=native-sandboxed-tool-execution),确认这些
    断言不是空断言。
  • 本机内核只提供 Landlock ABI 4,所以本地运行把 ABI V5 准入探针的权限位换成 fs:truncate;CI 走未改动的
    fs:ioctl-dev 路径,结果以 CI 的 Probe native Codex runtime image 为准。

其他

  • pinned 原生进程恢复套件 15 passed(AGENT_INFRA_CODEX_NATIVE_TEST=1)。
  • 本轮全部临时 CI 诊断步骤已移除,.github/workflows/ci.yml 相对实现基线无差异。
  • 已合并 main0285a658591a09),解决 BEHIND 状态。

仍需人工

  • 针对当前 head b51474f678932a63dfcaf44d8ffdec9c8d3af8c4/human-validation 团队成员确认评论。
  • 非作者 CODEOWNER 对当前提交 Approve。

@sda-rob sda-rob removed the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 13, 2026
Review follow-up on #413:

- boundary rules only accept canonical directories and reject any entry that
  reaches the shared Conversation boundary in either direction, so an injected
  PATH entry or a release installed in a system root cannot widen it
- the Conversation root is no longer writable; only its home and workspace are
- /proc is listed but never read, so a model tool cannot lift the model
  credential out of a native process environment, and /dev keeps only the
  rights a device node needs
- a transport already bound to another Conversation fails closed instead of
  aliasing two Conversations onto one native process
- native evidence requires an observed zero exit code, so output without the
  exec envelope is incomplete evidence rather than a pass
@github-actions github-actions Bot added the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 13, 2026
@LichKing-2234

Copy link
Copy Markdown
Contributor Author

自动化评审意见逐条处理(head e2fb163186f64a3860e1641781eaff543defddcd

下面按机制分组给出处置。Fixed 指本次提交实际改了代码,Measured 指用实测数据判定为不成立,
By design 指保持现状并给出理由。每条负向断言都能被反证(放宽对应规则后立即失败)。

Fixed — Landlock allowlist 收窄

意见 处置
PATH 或程序目录条目可能包含/落在共享边界内,从而绕过隔离 规则只接受绝对且已规范化的目录(realpath(path) === path,因此路径中任意一段符号链接都被拒绝),并且双向拒绝与共享边界重叠的外部条目:落在边界内的条目会暴露兄弟 Conversation,反向包含边界的条目会暴露全部 Conversation
dirname(dirname(executable)) 可能解析成 /,把整个根目录变成可读 同一条检查覆盖:把 pinned 发行版装在系统根目录时推导出的程序目录反向包含边界,直接被拒绝,不再静默授予该根目录
词法绝对路径仍可能是符号链接 同上,realpath 相等性检查取代了原来的 lstat 判定
policy.root 拿到完整可写权限,连带 home Conversation 根不再可写,只对它自己的 homeworkspace 各授一条规则;缺失或非规范的自有目录改为直接拒绝启动,而不是静默丢规则
/proc 递归 read-file 会暴露同 UID 兄弟进程 /proc 改为只可列举、不可读取。实测:Landlock 本来就拒绝跨域读取(同一容器内 path-beneath:read-file,read-dir:/proc 下读 /proc/1/environ 返回 EACCES,读 /proc/self/environ 成功),所以兄弟进程通道原本已关闭;本次改动关闭的是剩下那条——模型工具读自己原生进程的 environ 取走模型传输凭证。镜像探针新增该负向用例,并已反证:把 /proc 改回可读后该阶段立即失败
/dev 授了包含 make-*/remove-* 的完整可写集合 收窄为 read-file,read-dir,write-file,原生进程从不在 /dev 下创建或删除节点
系统程序与库目录(/usr/etc/bin 等)递归可读 保持只读且不含写权限,这是运行 pinned 发行版与 Node 的最小集合,其中不存在 Conversation 数据;与边界重叠时按上面的规则拒绝。/etc/sys 只读元数据,/proc 只可列举

Fixed — Driver 与证据

意见 处置
同一 transport 被另一个 Conversation 复用会把两个 Conversation 别名到一个原生进程 生产路径改为 fail closed:transport 已绑定到别的 conversationKey 时直接 RUNTIME_CODEX_UNAVAILABLE。只有脚本化测试替身显式声明「一个 transport 服务全部 Conversation」,该开关只存在于 test-support 调用的受保护入口
completeToolOutput 接受 undefined 退出码,任意文本都能算成功 现在要求每条输出都带实际观测到的 0 退出码,缺少 exec 信封一律判为证据不完整。单测 fixture 相应改为携带真实信封

Measured — 实测不成立

意见 实测结果
controlProbe 从未提交给 model.urlcontrolHold.observed 永远不会 resolve 该 probe 是经原生 turn/start 提交的(raw native client 的输入里带 ISOLATION_PROBE:<probeId>),loopback 模型按 id 匹配后 resolve。验收报告里 activeThreadEvidence.rawForeignMarkerControl = {status: pass, category: success, markerObserved: true},即该对照确实跑过;waitForModelSignal 也保证观测不到时判为 model-observation-unavailable 而不是挂死或直接通过
missing native root 用例仍期望 nativeDriver(path) 拒绝,与本 PR 冲突 不冲突:丢失所属目录就是要 fail closed。ensureOwnedDirectory(dir, create)create 只在 Conversation 根不存在时为 true,已存在的 Conversation 缺失 home/workspace 不会被重建。pinned 原生恢复套件 15/15 通过

By design — 保持现状并说明理由

意见 理由
setpriv 不应与 codex 从同一个可配置 launchPath 解析 该 PATH 是部署装配,不能由用户请求或 Grant 覆写,且镜像以只读根文件系统与文件权限保证运行用户不能替换它;这条约束写在 HLD §10.1。把它换成硬编码路径会把发行版布局固化进运行时代码,收益低于成本
ensureOwnedDirectory(dataRoot, true) 会重建丢失的持久根 数据根与共享边界目录是部署装配的容器,重建它们不携带任何 Conversation 状态;只有 Conversation 自己的目录丢失时 fail closed(见上一节)
Conversation RPC 永不驱逐,原生进程直到 close() 才退出 原生进程死亡后当前设计是对该 Session fail closed(后续调用返回稳定的 RUNTIME_CODEX_UNAVAILABLE),而不是静默重开一个新进程去续接历史;改成自动重开会掩盖崩溃并改变恢复语义,属于需要单独评审的设计变更。close() 清空两张表并关闭全部 RPC
启动前应校验完整的 wrapped command 已经是这样:Conversation 自有目录缺失时 allowOwned 直接抛出,边界数组构造失败即拒绝启动,不会带着不完整的规则集 spawn
Linux 验收 launcher 的 wrapper/环境/observations.jsonl 写入问题 该 harness 当前只在 darwin 运行,其结论明确不外推为 Linux;Linux 侧的兄弟 Conversation 负向证据由正式镜像探针在真实镜像与容器约束下产生
Linux 上模型工具仍可写本 Conversation 的原生 home 这是 pinned 后端互斥导致的已记录代价,理由与实测见 #404 Linux 边界评论,Spec §10.9 与 ADR 0008 均按平台记录。它属于同一用户范围内的削弱,不影响跨 Conversation 结论;Darwin 的 home 对模型工具仍只读
临时把 / 加入 allowlist / 由环境变量放宽 allowlist 这些都是当轮定位问题的临时诊断,早已 revert,当前 head 不存在任何 / 规则或环境变量放宽路径

验证

pnpm install --frozen-lockfilecheckcheck-typestest(全仓绿,@agent-infra/agent-runtime 488 passed / 16 skipped,platform-store 269 passed)、buildsmoke、五个部署镜像逐个构建、markdownlint、markdown-link-check、workflow policy、actionlint、git diff --check 全部通过。darwin 双用户原生隔离验收 overall=pass(20/20,绑定 e2fb163…),pinned 原生恢复 15 passed,正式镜像探针 14 项 check status=passed

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: e2fb163186f64a3860e1641781eaff543defddcd

1 finding(s) published as review threads.

Comment thread packages/agent-runtime/src/codex-isolation.test-support.ts
Comment thread packages/agent-runtime/src/codex-runtime-driver.ts Outdated
Comment thread packages/agent-runtime/src/codex-runtime-driver.ts
…tion

Native thread and turn IDs only mean something inside the app-server process
that issued them, so journal resolution now matches the Conversation that owns
the transport as well as the ID. Also give the two deterministic sandbox
admission rejections a deadline that does not depend on machine load.
@github-actions

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

No code suggestions found for the PR.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: 620f60eb928b4939814626f44f92dbbd064b6142

No major issues detected.

@LichKing-2234 LichKing-2234 removed the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 13, 2026
…e once

Review follow-up on #413:

- the transport-sharing policy moves to a protected hook the test double
  overrides, so the production class no longer carries a test-only flag; one
  scripted transport can host exactly one JSON-RPC multiplexer, which is why the
  double shares it and production never can
- close() joins the first shutdown, so repeated or concurrent calls close the
  model transport once and never return early
- the darwin-only isolation harness refuses to run elsewhere: its launch
  observer writes outside the Conversation boundary, so on Linux it would report
  an enforced boundary as a harness failure
@github-actions github-actions Bot added the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 13, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR-Agent Review

Commit: a5feebb6d6e7a35b8ac06c86a0614ac7cc39f38b

No major issues detected.

Comment thread packages/agent-runtime/src/codex-app-server-bridge.ts
@LichKing-2234 LichKing-2234 removed the ready-for-human Human implementation on an Issue or pending human validation on a PR label Sep 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

test(runtime): verify Codex cross-user workspace and memory isolation

2 participants