Chain · 选择性访问 —— 谁能看到什么,在签发时冻结
状态: 最深的一条链路 —— 设计已定稿,测试最重。
L0 · 愿景
introduction —— 模式即角色:四个应用共享同一个语料库;ACL 是能否触达的硬墙,角色是哪些内容被呈现出来的软框架。boundaries —— 一个"面向选择性互动的思想领袖式过滤器",既不是完全公开广播,也不是谁都能预约。design-principles —— "服务那些已经喜爱它的人;保留一些访问摩擦"。
L1 · 承诺
主理人按受众逐一决定,究竟存在哪一个切片;访客的规则在邀请签发的那一刻就被固定下来,此后只能收窄,绝不能放宽。
L2 · 需求(旅程与功能)
主理人的邀请码管理旅程,以及访客的门禁旅程(入口:Code / BYOAI / Request access),外加配额;管理界面呈现 Codes 与 Access Requests;门禁页面 /gate。
L3 · 设计决策
已定稿的三层设计(capability-acl-hierarchy,决策锁定于 2026-06-23):纯 AND 式收窄 global(live) ∧ role(frozen) ∧ ¬code-deny(frozen)(acl-and-quota-granularity);三态覆写已被否决,改用稀疏拒绝表(一个邀请码只能做减法);冻结/实时的不对称性(role-snapshot-frozen);AccessCode 即邀请,只有一张表,不设并行概念;身份识别经由中立的 _meta(trusted-identity-via-meta);BYOAI 的封装隔离(byoai-envelope、byoai-browser-vault)。
L4 · 工程产物
数据表 access_codes(assumed_role_id、prompt_id / inline_prompt、slug、microsite_id、limit_per_period)、code_capability_denials、code_skill_denials、code_corpus_denials、code_members、capability_settings、roles/role_skills/role_mcp_servers/role_corpus_uris、embeds(code_id UNIQUE、key_id / public_key);backend/internal/conversation/usecase/visitor_role_snapshot.go;面向 ACL=always 能力的 RoleSnapshot.deniedCapabilities;以及配额系统。
L5 · 验证
仓库中最重的一片 e2e 测试:acl-capability-matrix、acl-skill-matrix、acl-freeze-isolation、visitor-chat-permissions-deny、gate-access —— 外加时序上的讲究(ACL 在会话建立时通过 ErrHidden 生效;调用时只做 monitor 与密钥扫描)。
状态与缺口
全局层已落地;角色/邀请码拒绝按定稿设计实现;corpus-glob ACL 现已落地(AllowsCorpusEntry 在每次读取时强制执行;raw://** 一律硬拒绝;按邀请码收窄语料走 code_corpus_denials,2026-07-16 6395374b0);按邀请码定制的 prompt 已落地(access_codes.prompt_id 或 inline_prompt → codePromptBody 被冻结进快照,在 visitor_chat_prompt.go 中叠加于角色人格之后)。2026-08-30 那次核对之后:系统派生的邀请码随机后缀从 16 bit 加到 64 bit(2026-09-01 1ca9d9564,access/entity/code_derive.go,由一次渗透测试推动);暴露在第三方站上的邀请码走 embed-credential-never-carries-the-code(2026-09-01 2098975db);每张邀请码自带落地路径 /c/<slug>(2026-09-06 4e383c2a7 + c6c54ce88,DeriveSlug,migration 2026-09-06-access-code-slug.sql);邀请码的字符串可以轮换以应对泄露,codes.rotate → RotateCode 并清掉该码的会话(2026-09-07 505b3fc4f + 6ed1759bb,access/usecase/codes.go:113);访客页上输入新码会切换会话、无效码落到 /gate(2026-09-06 230a17025)。