☰
os-taxonomy (Marble Skill Taxonomy)零依赖校验脚本validate.mjs原理剖析:引用完整性与SHA-256校验和如何保证数据可信
2026/10/20 10:35:31 网站建设 项目流程

os-taxonomy (Marble Skill Taxonomy)零依赖校验脚本validate.mjs原理剖析:引用完整性与SHA-256校验和如何保证数据可信

【免费下载链接】os-taxonomy项目地址: https://gitcode.com/GitHub_Trending/os/os-taxonomy

os-taxonomy(Marble Skill Taxonomy)是一个开放的小微知识点依赖图数据集,包含 1,590 个微知识点、3,221 条前置依赖边和 3,261 条课程对标。它的核心亮点之一,是零依赖校验脚本 validate.mjs——不安装任何 npm 包,仅凭 Node.js 内置模块,就能同时完成引用完整性检查与SHA-256 校验和比对,让任何人在拿到数据的第一分钟就能判断"这份数据是否完整、是否被改动过"。🔍

为什么"零依赖"是这项设计的第一原则

打开 package.json 你会发现整个项目只有一个脚本:

node scripts/validate.mjs

validate.mjs只导入了 Node.js 的四个内置模块:node:crypto、node:fs、node:path、node:url,没有任何第三方库。这意味着:

  • 无构建步骤:不需要npm install,克隆仓库即可运行;
  • 无供应链风险:校验逻辑本身不受第三方依赖漏洞影响;
  • 跨环境一致:任何装了 Node.js 的机器上跑出来的结果都相同。

对于一个"纯数据、无运行时"的项目来说,校验工具越轻,可信度的门槛就越低。

完整校验链路:从声明数量到校验和的五道关卡

validate.mjs 的校验顺序层层递进,共五道关卡:

1️⃣ 声明数量 vs 实际数量

数据集的每个 JSON 文件都自带"计数声明"(如topicCount: 1590)。脚本第一步就核对声明是否与实际数组长度一致,防止"元数据与内容不同步"这类最常见的数据事故:

  • data/topics.json 的topicCount是否等于topics数组长度;
  • data/dependencies.json 的edgeCount同理;
  • data/clusters.json 与课程文件也逐一核对。

2️⃣ 知识点 ID 与字段合法性

每个知识点会被逐一检查:

  • id必须以mt_开头(稳定标识符规范);
  • type必须是五种合法类型之一(概念型 / 程序型 / 表征型 / 语言型 / 元认知型);
  • description非空、evidence必须是数组;
  • ID 不允许重复——重复 ID 会直接压垮后续的图结构查询。

3️⃣ 标准编码与 "codes-only" 不变量

data/curriculum-standards.json 里汇集了 7 套课程框架的标准。由于部分上游版权受限(NGSS、C3、IB 等只允许发布编码),脚本会强制检查:

  • 每个标准的key必须严格等于slug:code拼接格式;
  • 标记为"仅编码"的来源,其记录里绝不能泄露逐字原文(codes-only不变量)。

这道关卡把法律层面的约束也变成了可机器验证的断言。⚖️

4️⃣ 引用完整性:抓出所有"悬空引用"

这是整份脚本的灵魂。脚本先构建两张"有效键集合":

  • topicIds:所有合法知识点 ID;
  • standardKeys:所有合法标准编码。

然后对两类引用逐一验证:

引用方向检查内容
依赖边(3,221 条)topicId与prerequisiteId两端都必须存在于topicIds;不能自依赖;strength只能是hard或soft
知识点 → 标准(1,859 条链接)每个standards里的 key 必须存在于standardKeys;悬空引用会被累计统计,并抽样报告前 5 条

由于前置依赖构成一张有向无环图,任何一个 ID 写错都会让"学习路径回溯"彻底断裂。引用完整性检查保证图上每条边都能解析到真实节点。🕸️

5️⃣ SHA-256 校验和:证明文件"一个字节都没变"

结构检查能发现"逻辑坏了",但发现不了"文件被悄悄改了一个字节"。这时轮到 data/manifest.json 出场——它记录着每个数据文件的bytes大小和sha256摘要:

"topics.json": { "bytes": 1667462, "sha256": "2d99fc3b5e57d9ddb86b6c179b58a1b0390f048d9798585fe03b13cbc183719b" }

脚本用createHash('sha256')对磁盘上的实际字节重新计算摘要,再与 manifest 中的值逐一比对。只要有任何一个数据文件被修改(哪怕一个空格),摘要就会完全不一致。🔒

结构校验保证"数据是对的",校验和保证"数据是原始的"——两层合起来才构成完整的数据可信链。

校验结果如何呈现

所有问题都通过一个统一的check(cond, msg)收集器累积,最后统一裁决:

  • 失败:输出✗ N problem(s)加逐条原因列表,并以非零退出码结束——这让脚本可以直接嵌入 CI 流水线做门槛检查;
  • 通过:输出一行绿色摘要,例如✓ valid — 1590 topics, 3221 dependencies, 3261 standards, 183 clusters. Referential integrity + checksums OK.

与 JSON Schema 的分工:校验脚本检查什么、不检查什么

值得澄清的是,仓库里还有四份 JSON Schema(schema/ 目录),它们定义的是结构契约:哪些字段必填、类型是什么、additionalProperties: false禁止多余字段。而validate.mjs专注的是跨文件语义:文件 A 的 ID 必须能对上文件 B 的引用、文件字节必须对得上 manifest 的摘要。

工具负责什么典型断言
schema/topics.schema.json 等单文件结构id匹配^mt_正则
validate.mjs跨文件引用 + 字节级完整性依赖边两端 ID 存在、SHA-256 一致

两者互补:Schema 像"户口登记规则",校验脚本像"户籍系统对账"。

小结:给数据项目的一个可复制模板

os-taxonomy 用不到 110 行零依赖代码,演示了开放数据集建立可信度的完整配方:

  1. 自带计数声明,让"元数据漂移"一眼可见;
  2. 稳定 ID 规范 + 引用集合,把悬空引用变成可枚举的错误;
  3. manifest 清单 + SHA-256 摘要,让"文件未被篡改"可机器验证;
  4. 非零退出码,让校验天然适配自动化流程。

📌 相关文件的完整清单:数据位于 data/,结构契约在 schema/,变更历史见 CHANGELOG.md,来源与授权说明见 PROVENANCE.md。

【免费下载链接】os-taxonomy项目地址: https://gitcode.com/GitHub_Trending/os/os-taxonomy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询