设计规则与不变量
PurRDF 必须保持快速、确定、乏味:同一个引擎,同一套行为,原样带入 Rust、Python、WebAssembly 与 C。这一承诺由一小组硬性不变量来兑现,每一条都由 CI 强制执行,而不是依靠约定。规范性表述是仓库中的 AGENTS.md;本章解释其_缘由_。
没有语义性的 Cargo feature——永远没有
工作区中没有任何语义性 feature 标志。其唯一的 feature 声明是空的 purrdf-capi:capi = [] 兼容性标记,cargo-c 在构建 C ABI 时会无条件启用它。该标记不控制任何代码,绝不能出现在 cfg(feature = ...) 中;CI 会验证它恰好是空的形态,并扫描 Rust 源码中受 feature 控制的行为。PurRDF 是数据载体,而可选性会让语义因使用方而异——「同一版本」的两个构建若以不同方式解析或序列化,就会使整个意义落空。没有其他 [features],没有可选依赖,也没有受 feature 控制的行为。每个使用方得到的都是同样的、逐字节相同的语义。
显式的应用词汇表
PurRDF 不是本体。结构化 Markdown 与有序 JSON 按各自已发布的规范提供具名的标准 profile 和词汇表;调用方须有意选择 profile,或自行提供词汇表。不存在隐式的命名空间回退。其他应用词汇表——切片清单、陈述元数据下行转换(downcast)、盒角色、SPARQL 扩展函数命名空间、JSON-Schema 命名空间——都是调用方提供的配置,没有任何杜撰的默认值。在缺少其词汇表的情况下使用某项功能,要么硬错误,要么保持未激活。库从不硬编码任何厂商命名空间(GMEOW 本体是一个_使用方_;依赖箭头从不由 PurRDF 指向它),测试夹具使用 example.org。使用方配置类型(SliceVocab、Namespaces、StatementMetadataVocab)统一在下游一次性构建的 OntologyProfile 之后。
字节确定性
序列化器与 GTS 写出器都是逐字节确定性的。任何输出路径都不允许依赖迭代顺序、时间或随机数生成器;热路径上的映射正是出于这一原因而使用固定密钥的 FixedHasher。改变输出字节的变更必须以可见的方式更新受影响的黄金文件(golden file)。
内核隔离带
purrdf-core 绝不能依赖 PyO3,并有一道卫生关卡对依赖树进行断言。根 crate purrdf-hash 保持零运行时依赖,其上的基础叶子 crate(purrdf-lex、purrdf-iri、purrdf-xsd、purrdf-events)只依赖其 layers.toml 行所允许的第一方 crate,不依赖任何第三方 crate。诊断在内核中保持结构化且不含 SARIF;SARIF 边界是 purrdf-validate 这个叶子 crate。
一切皆可编译到 wasm
每个发布 crate 都必须能构建到 wasm32-unknown-unknown,否则 CI 会硬失败。任何依赖都不得在 wasm 路径上引入线程、文件系统、C 工具链或挂钟/随机数系统调用——密码学实现保持纯 Rust,正是出于这一原因。这正是 JavaScript 包之所以是_同一个引擎_、而不是移植版本的原因。
宁可硬失败,绝不给错答案
在整个工具包中,超出范围的输入是一个带类型的错误,绝不是部分答案:格式错误的 RDF 是 RdfDiagnostic,不支持的 SPARQL 内建函数是 EvalError::Unsupported,ShEx 语法错误是 ShexError,越过的求值上限是 EntailError::Evaluate 而不是被截断的推理闭包,不支持的结果投影是带类型的格式错误。按设计有损的投影是允许的,但必须_显式报告_,经由损失台账。
硬失败只针对工具包无法处理的输入——绝不针对其自身签名所接受的值。purrdf-entail::materialize 过去会拒绝 OWL-Direct 与 RIF,因为 Regime 值既不携带查询的类表达式,也不携带规则集;那是一个披着完全(total)签名外衣的部分函数,而修复的方式是更改参数,而不是把这个漏洞写进文档。它现在接受 Materialization,其中携带每种蕴涵机制自身的输入,因而不再有任何「不支持的蕴涵机制」错误可以指称。
推理一侧在硬失败之上增加了第二条纪律:当一次运行_成功_但有界时,它会明言。materialize 随每个推理闭包返回一份 ReasoningReport——绝不只返回一个数据集——其中载有该蕴涵机制的完备性、已触发与未触发的规则、所遇到的边界,以及所运行演算的契约哈希。静默交付一个正确但不完备的答案,与交付一个错误答案属于同一种失效模式。
一致性语料就是契约
W3C 与社区的测试套件均随库固化(vendored)、字节冻结并经 SHA-256 校验;测试框架断言精确的计数,并在其预期失败台账上执行 XPASS 纪律。参见一致性与测试。
辅助规则
- 经过测量的性能——性能声称需要一个基准测试,而不是一个形容词(性能)。
- 同一版本,同步发布——crates.io、PyPI 与 npm 发布同一个工作区版本(版本与发布)。
- 不使用任何 nightly 特性,MSRV 基于 stable——工作区中任何地方都没有
#![feature(...)]属性,MSRV 下限(当前为 1.98,位于 stable 通道)由专门的 CI 作业强制执行,该作业恰好在这一版本的编译器上构建。贡献者与 CI 门禁使用rust-toolchain.toml中指定的_浮动_ nightly,以获得更锐利的 clippy 与 rustdoc lint 以及更强的默认借用检查器;发布工件在 stable 上构建。 - 品牌——项目在行文中写作 PurRDF,在标识符中写作
purrdf(docs/BRAND.md)。