权限为什么有生命周期
一句话
Pysolate 不把权限长期寄存在 Python 解释器里;Host 先封存不可变 Plan,再为具体 Run/attempt 建立 Broker 和调用上下文,让授权、调用、证据与终结都可追踪。
先看一个例子
可以把一次 Run 想成一次酒店入住。前台不会把万能钥匙交给住客,而是制作一张本次入住有效的门卡:能开哪扇门、可以使用几次、何时失效,都由前台决定。
Python 程序相当于住客。它可以决定先整理行李还是先下楼,也可以选择根本不使用某项服务;但它不能因为在纸上写了“总经理办公室”,就让门卡获得新权限。退房后,房间和门卡都可以销毁,前台仍保留这次入住的受限记录。
这个类比只说明权限归属。Pysolate 的权限对象并不是一张可复制的字符串 token,而是一组由 Host 封存并在调用路径上检查的对象。
真实机制
一次 authority lifecycle(权限生命周期)大致经过这些阶段:
Host 注册 Spec 和 Grant
↓
一次性封存 Plan,确定 capability、预算与 identity
↓
为本次 Run/attempt 建立专属 Broker context 和 Guest 可见接口
↓
Guest 到达调用点,Broker 做 admission 和 dispatch
↓
Host 记录 receipt、结果状态和 terminal disposition
↓
Run finalize;若接入 staged/prepared 机制,处置未消费结果;随后 cleanup
Plan admission 发生在执行前。Plan 一旦封存,Guest 只能使用其中公开的 capability 和预算。Python 函数名、异常文本、旧 receipt 或 cache hit 都不能给当前 Run 增加权限。
Fresh Guest(每次从干净状态开始的执行环境)因此不需要“重新发明”权限关系。Guest 可以销毁;新的 Run 由 Host 选择已封存的 Plan,并建立新的 Broker、调用身份和预算状态。Plan 可以作为不可变 Host 配置存在更久,短期调用上下文仍绑定到具体 Run/attempt。
为什么重要
技术上: 权限不依赖某个解释器一直存活。系统可以更换 Guest、回收失败执行,或在符合条件时选择不同 backend,同时继续由 Host 判断当前 Run 到底获准做什么。
产品和业务上: Agent 可以使用真实数据源和外部服务,而服务方不必把长期凭证与隐含状态交给一段持续运行、不断变化的 Python 进程。一次任务出了问题,也更容易判断应当终结哪一份权限和记录。
不能推出什么
- Fresh Guest 不代表启动没有成本,也不代表所有外部 effect 都可以安全重试。
- Plan identity 是封存内容的 digest,不是数字签名,也不证明外部 policy 在业务语义上正确。
- Cleanup 只能终结本地生命周期;已经提交给外部系统的 effect 不会因此自动回滚。
术语卡
- Authority:执行某项受控操作的有效权限。
- Authority lifecycle:权限从注册、封存、使用到终结的完整过程。
- Plan:Host 一次性封存的 capability、Grant identity 和预算集合;具体 Broker context 另按 Run/attempt 建立。
- Fresh Guest:不继承上一次隐藏运行状态的 Guest。
- Terminal disposition:Host 对一次 Run 或 attempt 作出的最终处置。
继续阅读
- 前置:Host、Guest 与 Run
- 后续:Spec、Grant、Plan 与 Presentation
- 说明文档:
claims/innovation-inventory.md、implementation/02-authority-spine.md - 源码 owner:
runtime/capability/registry.go、runtime/capability/grant.go、runtime/lifecycle/evidence.go