{
  "format": "dcl-learning-resources/1",
  "verifiedOn": "2026-11-14",
  "asOf": "2026-11-14 Asia/Shanghai",
  "policy": {
    "en": "Published archives and pinned standards, verified against primary sources. No planned or speculative 2026 course is presented as available. Lab exercises are original; they are not solutions to university assignments. Public reading access does not confer enrollment, grading, certificates or textbook access.",
    "zh": "以下为经原始来源核验的已发布课程档案与固定版本标准，不把计划或推测中的 2026 课程列为可学资源。本 Lab 练习为原创，不是大学原作业的解答。公开阅读不等于获得注册、批改、证书或教材权限。"
  },
  "courses": [
    {
      "id": "mit-6005-s16",
      "school": "Massachusetts Institute of Technology",
      "courseNumber": "6.005",
      "name": "Software Construction",
      "semester": "Spring 2016",
      "status": "published-archive",
      "era": {"en": "2016 classic; specifications and testing transfer to this Lab, while its Java/Eclipse setup is historical.", "zh": "2016 年经典课程；规格与测试方法适用，Java/Eclipse 安装说明属于历史环境。"},
      "url": "https://ocw.mit.edu/courses/6-005-software-construction-spring-2016/",
      "prerequisites": {"official": "No numbered prerequisite was found on the checked OCW syllabus. The Getting Started page requires quickly learning basic Java.", "lab": "Basic programming, JSON, functions, recursion; Node 18+ for the optional offline exercises.", "url": "https://ocw.mit.edu/ans7870/6/6.005/s16/getting-started/index.html"},
      "publicMaterials": "OCW readings, calendar and assignment statements; selected readings require no login.",
      "registrationAndFees": "Reading the selected OCW material is free and requires no registration. This is an archive, not MIT enrollment or a credential. Original course grading and institutional services are not provided by this Lab.",
      "verifiedOn": "2026-11-14"
    },
    {
      "id": "cmu-15445-f25",
      "school": "Carnegie Mellon University",
      "courseNumber": "15-445/645",
      "name": "Intro to Database Systems",
      "semester": "Fall 2025",
      "status": "published-archive",
      "era": {"en": "2025 archive, already published. Only the relevant data-model material is selected; this Lab does not teach or implement BusTub.", "zh": "已发布的 2025 年课程档案。只选相关数据模型章节；本 Lab 不教授或实现 BusTub。"},
      "url": "https://15445.courses.cs.cmu.edu/fall2025/",
      "prerequisites": {"official": "CMU 15-213/513; the syllabus also requires C++17 programming for the full course projects.", "lab": "For Lecture 01 here: basic data types, sets and constraints. The full systems prerequisite is not required for our small JSON exercise.", "url": "https://15445.courses.cs.cmu.edu/fall2025/syllabus.html"},
      "publicMaterials": "Archived schedule, lecture slides and lecture notes; selected PDF notes are readable without login. Textbook chapters are not redistributed here.",
      "registrationAndFees": "The selected archived notes are public without payment or registration. University enrollment, grading, course services and textbook purchase are separate; this page offers none of them and quotes no tuition price.",
      "verifiedOn": "2026-11-14"
    }
  ],
  "materials": [
    {"id":"mit-spec","courseId":"mit-6005-s16","kind":"reading","title":"Reading 6, Part 1: Specifications","section":"Behavioral equivalence; Specification structure; Testing and specifications","url":"https://ocw.mit.edu/ans7870/6/6.005/s16/classes/06-specifications/specs/","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"mit-testing","courseId":"mit-6005-s16","kind":"reading","title":"Reading 3: Testing","section":"Choosing Test Cases by Partitioning; Blackbox and Whitebox Testing; Automated Testing and Regression Testing","url":"https://ocw.mit.edu/ans7870/6/6.005/s16/classes/03-testing/","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"mit-strength","courseId":"mit-6005-s16","kind":"reading","title":"Reading 7: Designing Specifications","section":"Stronger vs. weaker specs","url":"https://ocw.mit.edu/ans7870/6/6.005/s16/classes/07-designing-specs/","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"mit-recursion","courseId":"mit-6005-s16","kind":"reading","title":"Reading 16: Recursive Data Types","section":"Introduction; Part 1: Recursive Data Types","url":"https://ocw.mit.edu/ans7870/6/6.005/s16/classes/16-recursive-data-types/","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"cmu-model","courseId":"cmu-15445-f25","kind":"lecture-notes","title":"Lecture 01: Relational Model & Algebra","section":"Sections 3–4, PDF pages 2–3: data model, schema, domains, integrity constraints and NULL","url":"https://15445.courses.cs.cmu.edu/fall2025/notes/01-relationalmodel.pdf","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"cmu-schedule","courseId":"cmu-15445-f25","kind":"schedule","title":"Fall 2025 course schedule","section":"Lecture 01, August 25; confirms the lecture identity and public notes","url":"https://15445.courses.cs.cmu.edu/fall2025/schedule.html","status":"published-archive","verifiedOn":"2026-11-14"},
    {"id":"json-schema-version","organization":"JSON Schema","kind":"standard","title":"JSON Schema Draft 2020-12","version":"Draft 2020-12; specification documents published 2022-06-16","section":"Pinned comparison reference; DCL/1 is not an implementation of this dialect","url":"https://json-schema.org/draft/2020-12","status":"published","verifiedOn":"2026-11-14"},
    {"id":"json-object","organization":"JSON Schema","kind":"official-tutorial","title":"Understanding JSON Schema: object","section":"Required Properties; Additional Properties","url":"https://json-schema.org/understanding-json-schema/reference/object","status":"published","verifiedOn":"2026-11-14"},
    {"id":"json-null","organization":"JSON Schema","kind":"official-tutorial","title":"Understanding JSON Schema: null","section":"null is a present value, distinct from an absent property","url":"https://json-schema.org/understanding-json-schema/reference/null","status":"published","verifiedOn":"2026-11-14"},
    {"id":"pointer","organization":"IETF / RFC Editor","kind":"standard","title":"RFC 6901: JavaScript Object Notation (JSON) Pointer","version":"April 2013","section":"Section 3: ~0 and ~1 escaping","url":"https://www.rfc-editor.org/rfc/rfc6901","status":"published","verifiedOn":"2026-11-14"},
    {"id":"pact-how","organization":"Pact Foundation","kind":"official-tutorial","title":"How Pact works","section":"Consumer testing; Provider verification; Non-HTTP testing (Message Pact)","url":"https://docs.pact.io/getting_started/how_pact_works","status":"published","verifiedOn":"2026-11-14"},
    {"id":"pact-spec","organization":"Pact Foundation","kind":"specification","title":"Pact Specification","version":"V4 reference; per-language support must be checked separately","section":"File metadata and specification versions; this Lab does not emit Pact files or run Pact verification","url":"https://docs.pact.io/getting_started/specification","status":"published","verifiedOn":"2026-11-14"},
    {"id":"pact-v4-release","organization":"Pact Foundation","kind":"release-note","title":"Pact Open Source Update — May 2022","version":"V4 already announced in May 2022","section":"V4 Pact Specification","url":"https://docs.pact.io/blog/2022/05/04/pact-open-source-update-may-2022","status":"published","verifiedOn":"2026-11-14"},
    {"id":"odcs","organization":"Bitol","kind":"standard","title":"Open Data Contract Standard","version":"v3.1.0 (pinned, not a claim of latest)","section":"Schema, quality, responsibilities and service commitments exceed this Lab's value-schema scope","url":"https://bitol-io.github.io/open-data-contract-standard/v3.1.0/","status":"published","verifiedOn":"2026-11-14"},
    {"id":"odcs-fundamentals","organization":"Bitol","kind":"standard-section","title":"ODCS v3.1.0: Fundamentals","version":"apiVersion v3.1.0 vs. a data contract's own version","section":"Definitions: apiVersion; version","url":"https://bitol-io.github.io/open-data-contract-standard/v3.1.0/fundamentals/","status":"published","verifiedOn":"2026-11-14"}
  ],
  "units": [
    {"id":"U01","title":{"en":"Identify the language before judging a contract","zh":"先识别方言，再判断契约"},"sources":["mit-spec","cmu-model","json-schema-version"],"goal":{"en":"Separate an interface promise, a data model and its validation language.","zh":"区分接口承诺、数据模型与校验语言。"},"task":{"en":"Load Nested contract repair. Add pattern to the quantity schema and run. Predict an input error, then remove it. DCL/1 rejects unsupported keywords.","zh":"载入“嵌套契约修复”，给 quantity 字段的 Schema 加 pattern 后运行。先预测输入错误，再删除它；DCL/1 会拒绝未知关键字。"},"expected":{"en":"Unsupported keyword is rejected. No claim of JSON Schema, Pact or ODCS conformance is made.","zh":"未知关键字报错；没有据此声称符合 JSON Schema、Pact 或 ODCS。"},"command":"node run.mjs U01"},
    {"id":"U02","title":{"en":"Partition absent, null and typed values","zh":"划分缺失、null 与有类型的值"},"sources":["cmu-model","mit-testing","json-object","json-null"],"goal":{"en":"Test existence and value constraints independently. SQL NULL is background; JSON absence is a separate state.","zh":"分别测试存在性与值约束。SQL NULL 是背景概念，JSON 属性缺失是另一种状态。"},"task":{"en":"In the new item's quantity schema, change type to [\"integer\",\"null\"]. Rerun: null is now allowed; the missing-key row still fails. Then remove the quantity name from that item's required list and rerun.","zh":"把新契约数组项中 quantity 的 type 改为 [\"integer\",\"null\"] 后运行：null 获准，缺键行仍失败。再从该项的 required 列表移除 quantity 字段名，重跑比较。"},"expected":{"en":"Required + nullable accepts null but rejects absence; optional + non-nullable does the reverse for those two states.","zh":"必填且可空允许 null、拒绝缺失；可选且不可空在这两种状态上的结果相反。"},"command":"node run.mjs U02"},
    {"id":"U03","title":{"en":"Predict both compatibility directions","zh":"预测两个兼容性方向"},"sources":["mit-strength","pointer"],"goal":{"en":"Use set inclusion to explain why widening producer outputs can break an existing reader.","zh":"用值集合包含关系解释为什么放宽生产者输出会破坏现有消费方。"},"task":{"en":"Reload the nested scenario, run, and open the witness. New maximum 9 is accepted by the producer; the old reader allows at most 8. Trace /records/0/quantity~1unit~0.","zh":"重新载入嵌套场景，运行并展开反例。新生产者允许 9，旧消费方最多允许 8；定位 /records/0/quantity~1unit~0。"},"expected":{"en":"New → old: verified counterexample. Old → new: proven inclusion. A wildcard concern path is not the concrete array index in a replay diagnostic.","zh":"新 → 旧有已验证反例；旧 → 新已证明包含。包含关系提示中的数组通配符与回放诊断中的具体下标含义不同。"},"command":"node run.mjs U03"},
    {"id":"U04","title":{"en":"Make an independent counterexample oracle","zh":"构造独立判定的反例集"},"sources":["mit-testing","mit-recursion"],"goal":{"en":"Follow a failing nested branch without losing it behind unrelated sibling samples.","zh":"沿着失败的嵌套分支构造反例，避免被无关兄弟属性的样例截断。"},"task":{"en":"Run U04 offline. Inspect exercises/oracle.mjs: it uses case-specific predicates, not the engine validator. Reverse the property order in a copied corpus case and rerun.","zh":"离线运行 U04，查看 exercises/oracle.mjs：它使用逐案例判定式，不调用引擎校验器。复制一个案例，逆序排列属性后重跑。"},"expected":{"en":"15 known small separating cases are found; the identical control is proven; a compatible enum case and an oversized witness remain not-proven. These finite cases do not establish completeness.","zh":"15 个已知小反例均可找到；相同契约对照已证明；兼容枚举对照及超预算反例仍为尚未证明。有限案例不能证明搜索完备。"},"command":"node run.mjs U04"},
    {"id":"U05","title":{"en":"Repair a promise and replay the same rows","zh":"修复承诺，用相同行回放"},"sources":["mit-spec","pact-how"],"goal":{"en":"Distinguish producer acceptance, reader acceptance and an actual integration test.","zh":"区分生产者接受、消费方接受与真实集成测试。"},"task":{"en":"Reload. Set the new item's quantity maximum from 9 back to 8 and rerun. As a separate agreement experiment, reload and change only the consumer maximum to 9. No consumer implementation is executed.","zh":"重新载入，把新契约数组项 quantity 的 maximum 从 9 改回 8，重跑。另做一次协商实验：重新载入，只把消费方 maximum 改为 9。本练习不执行消费方应用。"},"expected":{"en":"Producer repair proves new → reader, but five archived rows still fail both producer contracts. The initially fixed row meant only new-producer acceptance; it still broke the existing reader.","zh":"生产者修复后，新 → 消费方已证明；但五行历史样例仍违反两版生产者契约。初始“已修复行”只表示新生产者接受，该行仍破坏旧消费方。"},"command":"node run.mjs U05"},
    {"id":"U06","title":{"en":"Export evidence and check source fidelity","zh":"导出证据，核对来源语义"},"sources":["mit-testing","pact-spec","odcs-fundamentals"],"goal":{"en":"Record the exact checked contracts and separate structure from factual correctness.","zh":"记录实际检查的契约，区分结构合法与事实正确。"},"task":{"en":"After the producer repair, export JSON, CSV and readable HTML. Compare summaries and paths; no raw batch IDs should be present. Run U06: an authored extraction has legal quantity 5 while its source says 6.","zh":"生产者修复后导出 JSON、CSV 与可读 HTML，核对摘要与路径，原始 batch ID 不应出现。运行 U06：原创抽取案例结构合法地输出 5，但原始来源是 6。"},"expected":{"en":"The repaired result survives JSON round-trip; CSV diagnostics match the report. A structural pass does not establish extraction fidelity. This is an offline semantic counterexample, not an LLM benchmark.","zh":"JSON 往返保留修复结果，CSV 诊断与报告一致。结构通过不能证明抽取忠实度；这是离线语义反例，不是 LLM 评测。"},"command":"node run.mjs U06"}
  ]
}
