Lynn Lee / LABS

方法、方言与证据边界

DCL/1 v1.0 是刻意缩小范围、严格检查关键字的契约语言,不声称兼容完整 JSON Schema。

精确支持范围

契约顶层仅接受 dialect、schema、可选 semantics。dialect 必须为 dcl/1;根节点为非空值 object。每个 Schema 节点必填 type:object、array、string、number、integer、boolean、null,或严格的 [type,"null"]。允许 null 必须明确声明,不支持 nullable 关键字。

类型除 type 外允许的关键字
objectproperties、required、additionalProperties(仅布尔值)
arrayitems(必填)、minItems、maxItems
stringenum(标量)、minLength、maxLength
number / integerenum(标量)、minimum、maximum(闭区间)
boolean / nullenum(标量)

properties 默认 {},required 默认 [],additionalProperties 默认 true。必填字段必须在 properties 中声明。items 为全部数组项共用的 Schema。字符串长度按 Unicode 码点计算。枚举只接受类型合法且不重复的标量。类型不适用的关键字、矛盾边界、未知关键字与空枚举均报错。不支持 $schema、$ref、format、pattern、anyOf、oneOf、allOf 或任意业务表达式。嵌套诊断使用 RFC 6901 JSON Pointer,~ 与 / 分别编码为 ~0 与 ~1。数值使用有限 IEEE-754 双精度,integer 必须为安全整数;十进制运算并不精确。

结构包含关系:比较哪个方向?

对每个消费方,检查“所有结构合法的生产者值,是否都满足该消费方”。分别比较旧 → 消费方、新 → 消费方,并额外列出新 → 旧、旧 → 新。递归充分证明检查类型包含(integer ⊆ number)、必填保证、属性约束、额外字段、标量枚举、闭区间数值边界、字符串长度及数组项和长度包含。生产者枚举逐项检查。文本 diff 不能当作兼容证明。

“已证明包含”是在 DCL/1 范围内成立的充分证明。证明未成立时,受限的构造搜索尝试生产者合法对象、枚举成员和边界值;只有实际通过生产者、且被消费方拒绝,才展示反例。否则报告“尚未证明”,不宣称不兼容。搜索不完备:先沿不同的 Schema 分支定向构造,最多检查 2,000 个局部候选,再尝试每节点最多 200 个样例的受限后备搜索。每个构造反例最多 1,000 个值节点;证明较保守,部分兼容关系可能无法证明。反例只覆盖结构,结构证明不证明生产者真实行为。

明确的语义声明

semantics 把已声明的对象属性 JSON Pointer 映射到规则。首版不能用语义路径定位数组项。未声明即未知,不从字段名推断单位。消费方声明的路径决定语义比较范围;生产者缺少声明需复核。相同声明仍只是承诺。

{"/event_time":{"kind":"timestamp","unit":"s","timezone":"UTC","after":"2020-01-01T00:00:00Z","before":"2030-01-01T00:00:00Z"},"/amount":{"kind":"money","unit":"USD-cent"},"/event_id":{"kind":"identifier","format":"decimal-string"}}

时间戳单位:s、ms 需要 integer 类型及 UTC;rfc3339 需要 string 类型及 UTC 或 explicit-offset。UTC 字符串必须带 Z;explicit-offset 接受 Z 或数值时区偏移。必须含完整日期、时分秒和时区,可带 1–3 位小数秒;不支持闰秒,并检查日历合法性。可选 after/before 为 UTC 时间,表示包含端点的声明窗口。没有窗口时,仅凭数值不能识别秒/毫秒错误;本工具不猜测。

金额单位支持 USD-cent、USD-dollar、EUR-cent、EUR-euro。分要求安全整数,元要求有限数值;数值本身不能证明币种和单位,单位变化仍需声明复核。标识符 decimal-string 仅接受数字字符串,不做数值转字符串。缺失/null 跳过语义值检查,存在性与 null 允许范围由 required 和 type 负责。不推断未声明的业务规则。

回放与导出证据

同一解析成功行分别校验旧新结构、旧新语义与全部消费方。行结果分为均通过、新增失败、已修复、仍失败。每行按 JSON Pointer + 错误代码匹配新增、修复、未变错误;即使仍失败,也能观察错误变化。坏行单列解析错误,不进入两版校验。空输入绝不等价于零错误。

每次运行都在浏览器真实执行算法。四个场景为人工设计的合成输入,并非生产基准,也没有用保存数字冒充本次实测。导出含契约和名称,不含原始事件值;生成反例可能含 Schema 枚举值。CSV 全字段加引号,并为公式形态前缀(含前导空白)加单引号保护;导入表格时应保留。

范围之外

不执行生产者代码、消费方应用、Schema Registry、网络服务和集成测试,不采样真实流量或数值分布。结构包含与语义声明无法证明上线安全。JSON Schema 支持更广的词汇,需要该标准时请使用独立固定版本的成熟校验器。编写仓库保持私有;只公开经过审计的浏览器运行代码与原创离线练习子集。

原始参考