雨天小六

读懂 Codex(4.9):Permissions World State 的生成和更新

· 更新于 2026-08-02 · 专栏:读懂 Codex

#Codex#Agent Runtime#Prompt#上下文工程#软件架构

Permissions World State 把当前审批策略、沙箱策略和可写范围渲染成 Developer 上下文。它不负责执行授权判断;真正的工具调用仍由 Permission/Approval Runtime 校验。Prompt 里的权限说明与执行策略必须来自同一个 StepContext,前者是模型规划依据,后者才是安全边界。

从策略生成模型说明

PermissionsState 由当前权限指令文本构造。它把渲染片段的内容哈希作为 Snapshot,而不是复制所有策略对象;因为分区只需判断“模型可见说明是否改变”,不需要承担执行器状态恢复。

权限策略渲染为模型说明并生成内容哈希快照
图 4.9-1:执行策略先被规范化为模型可见说明,再对说明做哈希。Snapshot 比较的是模型实际知道什么,不是内部配置对象的内存地址。
def build_permissions_state(step):
    text = render_permissions(
        approval_policy=step.approval_policy,
        sandbox_policy=step.sandbox_policy,
        writable_roots=step.writable_roots,
    )
    return PermissionsState(fragment=text, snapshot=sha1(text))

哈希降低 Rollout Snapshot 体积,但意味着旧值不可用于自动生成字段级差异。因此变化时重新发送完整权限说明;无变化时完全省略。

首次、变化与撤销

首次基线缺失时发送完整片段。哈希不同则发送更新后的完整权限合同,并明确新规则取代旧规则。若权限片段不再存在,World State 要表达撤销,而不是让旧说明永久留在模型工作记忆中。

权限 World State 从首次说明到变化更新和执行时复核
图 4.9-2:模型按 Step N 的说明提出调用,Runtime 仍用 Step N 的策略执行;下一 Step 权限变化后,新的说明与新的 Router 一起被捕获。
async def sample_with_permissions(session, turn):
    step = await capture_step_context(turn)
    world = build_world_state(step)
    await record_world_state_diff(world)
    prompt = build_prompt(step)
    intent = await model.sample(prompt)
    return await step.tool_runtime.execute(intent, step.permissions)

安全边界

模型遵守权限说明属于行为优化,不属于授权。即使提示词被截断、模型忽略说明或产生恶意命令,Runtime 仍必须独立做审批与沙箱判断。反过来,如果 Prompt 说“可写工作区”而执行器使用旧的只读策略,模型会不断提出必然失败的操作;这虽未越权,却破坏可用性。

测试应同时覆盖 World State 文本快照与工具执行策略测试,不能用“模型看到了不允许”替代安全测试。

源码与测试锚点

  • codex-rs/core/src/context/world_state/permissions.rs:内容哈希与差异渲染。
  • codex-rs/core/src/session/world_state.rs:从 Step 策略构造分区。
  • codex-rs/core/src/context/world_state/permissions_tests.rs:Snapshot 与更新快照。
  • codex-rs/core/src/tools/sandboxing.rs:真实执行安全边界,后章展开。

评论


← 返回文章列表