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