/-! # Primitives —— Courseware 契约的基元 课程工程文件模型(ADR-0005)依赖一组基元:element kind 怎么标识、某 kind 的数据 schema 是什么、export target 怎么标识。收口成载体 `Primitives`,让模型在其上参数化 ——契约谈得了 element / lesson / 渲染**之间的关系**,而把每个基元的**内部表示**留给 实现。注意:某基元语义已 PINNED(如 schema 形态由 ADR-0006 固定)与其表示进 Lean 是两回事——JSON Schema / typst 的内部结构属实现细节,不入 Lean,故基元在此仍以抽象 类型承载。富内容的母本见 `Courseware.RichContent`。 -/ namespace Spec.Courseware /-- Courseware 契约基元载体(关系 `PINNED`, ADR-0005;各基元表示留给实现, ADR-0006)。 -/ structure Primitives where /-- element kind 标识(`PINNED` **开放宇宙**, ADR-0005;表示 `OPEN`)。用抽象 类型而非 `inductive`:ADR-0005 决定 kind 是开放可扩展宇宙(stdlib + 第三方), 封闭枚举会违背它——此处开放是**已决策的**(区别于 `RunState` 的"尚未封闭")。 -/ KindId : Type /-- 某 kind 的合法数据类型(`PINNED` 依赖关系, ADR-0005;schema 形态 `PINNED` ADR-0006,表示仍抽象)。以 kind 为索引:`ElementData k` 即"符合 `k` schema 的 数据"。schema 形态(声明式 JSON Schema + `content` 叶子 = typst 源)由 ADR-0006 固定,但属 JSON/typst 内部结构、实现细节,不进 Lean;契约只锚定"数据符合 kind schema"这条关系,故此处仍是抽象类型。 -/ ElementData : KindId → Type /-- export target 标识(`PINNED` 角色, ADR-0005;表示 `OPEN`)。一个 target 是一次 build,产出对 lesson 的一种投影(讲义/教案/PPT/平台 archive…),见 `Render`。 -/ TargetId : Type -- 注:原 `RenderRule : Type` 已随 ADR-0011 移除。渲染的"how"不再是契约层 per-target -- 载荷,而由 `Render.TargetSpec.steps` 里 `typstCompile` step 引用的**模板文件**承载; -- 契约只保留覆盖声明 `TargetSpec.covers`(该 target 渲染哪些 kind),供种子诊断用。 end Spec.Courseware