2026-09-23·by Sijie Wang#standmeet#architecture#design

role-snapshot-frozen

RoleSnapshot 在会话签发时冻结

上级: access-control

会话签发时,整个角色状态(corpus URI、prompt 正文、skill prompts、允许的工具、拒绝的 capability、拒绝的语料 glob、waypoints、按 capability 的配置、角色 id/name)会被快照进 Redis 里的 session_data;此后该会话再也不会读取角色行(backend/internal/access/entity/role_snapshot.go)。

由此带来的结果:owner 修改一个角色 / prompt / skill,不会影响已经在跑的会话——不存在"正在进行中的会话突然失去访问权限"这种情况。会话中途唯一的补救手段是吊销 access code——唯一的例外是全局 capability 层,它是实时生效的,能立刻杀死会话(confusables)。deniedCapabilities显式的(不是做减法),所以它甚至能拦住 ACL=always 的 capability(retrieval、ask_visitor)。

类视图

全部 18 个字段都是未导出的——快照在构造完成后不可变RoleSnapshotInit 是唯一的入口,且它通过 Redis 做 JSON 往返)。注意它同时也冻结了 codePromptBody(按 code 区分的 prompt)、该角色的 dockButtons、该 code 的语料拒绝(deniedCorpusURIs,来自 code_corpus_denials)以及每个 capability 的按角色配置(capConfig,对本 domain 不透明)。

AllowsCorpus(uri, published) 会先硬性拒绝 raw://**,再要求命中正向 glob 列表且不命中该 code 的拒绝 glob——同一份被冻结的作用域(CorpusScope())会作为一个不透明的整块,通过 _meta 转发给外部化的 retrieval 插件。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →