Permissions World State 把当前审批策略、沙箱策略和可写范围渲染成 Developer 上下文。它不负责执行授权判断;真正的工具调用仍由 Permission/Approval Runtime 校验。Prompt 里的权限说明与执行策略必须来自同一个 StepContext,前者是模型规划依据,后者才是安全边界。
从策略生成模型说明
PermissionsState 由当前权限指令文本构造。它把渲染片段的内容哈希作为 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 要表达撤销,而不是让旧说明永久留在模型工作记忆中。
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:真实执行安全边界,后章展开。
评论
登录后即可评论