16 Principles中文
16 · 设计原则
规范来源:
capability-language-core-principles-v1.md——设计原则声明(rev 4,2026-09-14),是规范的伴生文档;具有约束力的规范锚点在capability-language-core-v1.md§1 与 §12。 本页是便于阅读的指南。如有冲突,以规范为准。 状态:Preview — 不供生产环境使用。
提要(TL;DR)
CLC-v1 附有一份原则声明:十二条原则(P1–P12),每条都带一个可证伪检验——能跑起来的陈述,不是形容词——外加五条派生判定规则(R1–R5)用于裁决功能取舍争论、四项可运行性质,以及一份条文↔证据台账(声明 §7)来执行纪律:不绑定任何规范条文和向量的原则只是装饰。当前诚实状态包含三条已记录的 gap:P7(尚无 carrier 文档引用 CLC)、P8②/P12(三个实现同出一位作者——彼此一致只是回归测试,不构成独立验证)。
1. 声明是什么(不是什么)
声明是伴生文档,不是第二份规范:它回答核心为什么长成这样、每条原则如何被检验;语言规范仍是语义、verdict 与 reason code 的唯一权威。它的修订史本身就是方法论的一部分:
| Rev | 日期 | 变更 |
|---|---|---|
| 1 | 2026-09-10 | P1–P8 |
| 2 | 2026-09-11 | P9–P12、三处澄清、条文↔证据台账 |
| 3 | 2026-09-13 | 派生规则 R1–R5(§2.5);CLC-E 开放项裁决(「已实现、不声称」) |
| 4 | 2026-09-14 | P11 收窄到组合;委派包含(containment)明确移出 P11 |
2. 核心一张表
| 元素 | 授权侧 | 证据侧 |
|---|---|---|
| 值 | Operation(具体请求) | ObservedAction(断言的效果) |
| 身份 | CapabilityId(类) | ActionId(实例) |
| 关系 | Entailment(⊆) | Match |
| 边界 | Grant params / constraints | Evidence requirements / freshness |
| 判定 | allow / deny |
SATISFIED / UNSATISFIED |
外加恰好一个组合算子:交集(∩)——见 09-intersection.md。
3. 十二条原则(P1–P12)
| # | 原则 | 一句话 | 可证伪检验(压缩) |
|---|---|---|---|
| P1 | 最小核 | 五个共享抽象、一个组合算子、两个分侧函数;此外任何东西不得进入核心 | 删掉一条规则重跑语料——若没有任何 vector 结果改变,该规则就不属于最小核 |
| P2 | 无控制流 | 没有分支、循环、递归、宏或用户过程;条件性只能表达为更窄的能力 + 更紧的约束 | §3 语法中不存在求值顺序依赖值的构造;每个 vector 一次遍历即判定 |
| P3 | 值不可变 | 无赋值、无可变状态;求值是对有限输入的单次纯遍历 | 任一 vector 在全新求值器中按任意顺序求值两次——结果相同 |
| P4 | 值域而非类型 | 作为 bound 的 3 与作为 identifier 的 3 行为不同;每个参数声明值域(bound | enum | exact) |
改变参数的值域必须改变 ≥1 个 vector 的结果——grant {"station":[3]} 不得覆盖 station 2 |
| P5 | 确定且可终止——含 reason | 相同输入 → 相同 verdict 且相同规范 reason code(§9.1 固定顺序、§9.2 稳定码) | 实现之间按规范 reason 比较,而不仅是 verdict |
| P6 | 缺省即拒绝 | 未定义 / 未知 / 缺失 / 过期 / 不可验证 → deny;未声明的参数不构成授权(undeclared_param) |
语料中每条失败路径都返回稳定 deny 码;不存在「因遗漏而放行」的输入 |
| P7 | 定义一次,处处消费 | carrier(AIC-JWT DA、EMILIA AEB、OAuth RAR、委派链……)引用语义,绝不重新定义 matching/subset/deny | 第二份 subset/deny 实现要么是 bug、要么是另一门语言——并且必须言明是哪种 |
| P8 | 载体与语义分离 | ① 载体无关(JWT / X.509 / ACPs);② 实现语言无关(独立实现给出相同 verdict 和 reason) | 两层分离各自独立检验;绝不合并成一个声明 |
| P9 | 本地可判 | 判定可由工件加已声明的本地输入算出;核心规则不得需要网络调用、注册表查询或未声明的时钟 | 核心语料零 I/O 运行;依赖外部状态的 profile 必须声明这些输入,缺失即 deny |
| P10 | 有界工作量 | 序列化 params ≤ 512 字节、嵌套 ≤ 32 层;超限 → deny(invalid_params_size);无回溯、无超线性构造 |
顶格测试:恰好到达每个上限的正例、越界一步的负例——上限是规范条文,不是实现常量 |
| P11 | 组合只收窄 | 有效 grant 必须落在每一个源之内且与顺序无关;源覆盖(⊑)只比较该源声明的键(有效键集是并集);键闭包属于有效 grant | 性质测试:对每个源 merged ⊑ src、Intersect(S) = Intersect(reverse(S))、任何源都未声明的键 deny |
| P12 | 一致即门槛 | 规则要等 ≥2 个独立实现在 verdict 和规范 reason 上一致才算完成;不一致是规范缺陷 | 双向:每条规则映射 ≥1 个 vector、每个 vector 映射条文;runner 遇任何不一致以非零码退出 |
P11 的适用范围(rev 4)。 P11 管的是组合(声明集的交集)——不管委派包含:子 grant 是否留在父边界内是规范 §13 的独立关系 Contains(CLC-D,见 12-containment.md)。委派链展示的是声明集的交集,不是同一条定理。
P5 与 P10 之分。 结论的确定性是 P5;代价的可预测性是 P10。二者不可混同。
4. 派生判定规则(R1–R5)
R1–R5 不是新原则——每条都把旁边点名的原则操作化,使功能争论可以通过指认规则来裁决,而不必每次从头重辩。可证伪检验仍是最终依据。
| 规则 | 陈述 | 派生自 |
|---|---|---|
| R1 | 状态、时间或网络 ⇒ 归 carrier 或 profile,绝不进核心 | P9 + §6 扩展规则 |
| R2 | 新值域 = 加类型;新算子 = 加语法——且必须在 §9.1 顺序中占有位置 | P4 + §6 |
| R3 | 为某一家 vendor 修改核心是缺陷;那属于 profile | P7 + P8① |
| R4 | 没有条文或没有向量的规则是装饰 | 台账纪律(§7) |
| R5 | 一致性类只在 ≥2 个独立实现通过语料后才声称 | P12 + P8② |
R5 的现实含义:「已实现、有语料钉住、不声称」是合法且诚实的状态——本修订的证据侧(CLC-E)正是这个状态;同一作者名下实现之间的一致不满足该规则(见 13-conformance.md)。
5. 四项可运行性质
| 性质 | 原则 | 运行位置 |
|---|---|---|
| 本地可判 | P9 | 核心语料零 I/O 运行;offline-vectors.json(12 条 OCMP 用例,覆盖全部 11 个 §3 reason code)在 CI 中有覆盖 + 词表闸门 |
| 有界工作量 | P10 | params-018/019(越界一步 → deny)+ params-020/021(恰好顶格 → pass) |
| 组合只收窄 | P11 | property-cases.json——1184 条确定性用例,三个实现全部运行(数字完全一致);CLC-D 另有 containment-property-cases.json(784 条前向闭包用例);CLC-1.15 新增 param-bounds-meet-property-cases.json(500 条:每次成功的 meet 只授权每个源都授权的操作) |
| 一致即门槛 | P12 | 123 条 vector 由 Go、Python、TypeScript runner 按 verdict 和规范 reason 断言,任何不一致非零退出,三个仓库的 CI 均运行——并带有下节所述同作者限定 |
6. 台账纪律——与已记录的 gap
声明 §7 逐条列出每个原则对应的条文、检验工件与状态:ok、gap(有缺失)或 open(待裁决)。当前没有 open 项。三条 gap 由声明自己写明:
- P7 — gap:尚无 carrier 文档引用 CLC,且
aic-jwt/wit-wpt-interop携带了第二份 subset 实现,其通配符面(**、{a,b}、[a-z])为 v1 所禁。(该互操作研究是实验性近邻,不是 CLC——见13-conformance.md§3。) - P8 — gap:三个实现(Go、Python、TypeScript)同出一位作者;第三方 parity 是尚未证明的另一半。
- P12 — gap:语料看不出同作者限制——≥2 个独立实现的门槛被如实记录为未达成。
这些检验是有牙齿的:P11 性质测试(2026-09-11)立刻抓出了「语料全绿」掩盖的真实缺陷——Python 用真值判断把空 params 的合并放宽并覆盖了已收边界;两个实现在合并时取了更宽的 identifier;identifier 比较走了 Entails 而非 params-free 副本;次日(2026-09-12)又发现第四处(对象值交集可能加宽组合)。全部缺陷在所有实现中修复,语料自此断言合并结果(result_params / result_constraints),不再只看 verdict。
7. CLC 刻意拒绝的内容
if/then/else、循环、递归、宏、用户过程;- 通用策略语言(Rego / Cedar / XACML 量级);
- 信任建立、密钥绑定(cnf/DPoP/mTLS)、发放、吊销传输;
- 线格式、执行生命周期、evidence/receipt 格式。
v2 的扩展规则(声明 §6):加值域(如 range、pattern)= 加类型,不是加语法;加算子(如 **、{a,b}、[a-z])= 加语法且必须在 §9.1 顺序中占位;任何需要状态、时间或网络的东西归 carrier 或 profile(R1),绝不进核心。
常见误区
- 把声明当第二份规范——它是伴生文档;一切语义问题以语言规范为准,原则只通过陈述它的条文产生约束力。
- 以为 P11 覆盖委派包含——rev 4 已把 P11 明确限定于组合;containment 是 §13 / CLC-D,有自己的关系、语料和性质文件。
- 以为「≥2 个独立实现」已达成——同作者 parity 不满足门槛(P12、R5);这正是 CLC-E 已实现却不声称的原因。
- 把 R1–R5 当成新原则——它们是派生的操作化规则;P1–P12 的可证伪检验仍是最终依据。
← 15-glossary.md · 这是最后一页 · 相关:02-overview.md、13-conformance.md、README.md