前言

本书定义 asciidoc-abundant-tree 中 RDF 1.2 标题投影图的实现计划。

06-rdf12-line-projection 定义标题投影图的对象规约。本书定义从当前 src/rdf12-projection/ 实现迁移到该规约的工程批次、文件边界、测试要求、审核门槛和打回条件。

当前源码已经具备 RDF term、graph、路径坐标、PROV、Turtle 输出、JSON-LD 输出、CLI 和 public API 基础。当前源码的投影对象仍然包含 paragraph、listing、table、anchor、label resource、SurfaceAttribute resource 和 PayloadBlock resource。本书把这些源码事实作为实现基线,而不是把它们作为目标对象。

本书的核心断言是:实现批次必须让公共 rdf12 输出收敛到 06 号书定义的标题投影图。每个批次必须产生可验证的源码变化、测试变化和审核证据。没有验收证据的批次不得解锁下一批。

本书使用中文叙事。RDF、Turtle、IRI、literal、triple term、reifier、selector、headline、payload、provenance、graph、batch、review package 等术语在正文中保留英文形式或中英并列形式,以保持与 06 号书、源码和测试之间的术语连续性。

第一部:执行契约

这一部定义实现计划书的对象边界、源码基线、批次门槛、提交规则和全局验收。

1. 执行契约

本章定义本计划书的执行契约。所有批次章节均受本章约束。

1.1. 对象边界

本计划书的对象是 RDF 1.2 标题投影图的实现序列。

标题投影图对象由 AsciiDoc 标题切片到 RDF 1.2 投影规约 定义。本计划书不重新定义标题投影图。本计划书只定义如何从当前源码状态到达该对象:哪些文件承担哪些职责,哪些测试证明行为成立,哪些旧对象必须退出公共图表面。

1.2. 公共入口

公共入口保持 rdf12

CLI 公共表面:

asciidoc-abundant-tree <file.adoc> --format rdf12

TypeScript public API 公共表面:

const projection = rdf12(document, {
	documentRoot: process.cwd(),
});

const graph = projection.graph;
const ttl = projection.ttl;
const jsonLd = projection.jsonLd;

rdf12 输出必须描述标题投影图。Turtle 文本是图的序列化表面;测试不得只比较 Turtle 排版。涉及 RDF 1.2 reifier 的验收必须检查 rdf:reifies 的 object 是 triple term。

1.3. 批次状态

批次状态使用受控集合:

未开始

批次没有实现提交。

执行中

批次存在实现活动,尚未提交审核包。

待审核

批次提交 hash 和审核包已经产生。

打回

审核者拒绝通过该批次。

通过

审核者确认该批次满足本书验收条件。

批次状态记录在 批次状态台账。状态台账只记录事实,不记录愿望、估计或口头进度。

1.4. 批次门槛

每个批次开始前必须满足以下门槛:

  • 前一批次状态为 通过

  • 前一批次提交 hash 已写入状态台账。

  • 当前工作树中不存在与本批无关的未提交修改。

  • 执行者已经阅读本批列出的 06 号书章节、源码入口和测试入口。

Batch 00 没有前置批次。Batch 00 开始前必须确认 src/rdf12-projection/ 是正式实现目录,docs/bookshelf/books/06-rdf12-line-projection/ 是目标规约来源。

1.5. 语言规则

批次章节使用规约语言。任务授权不得使用以下表达:

  • 建议。

  • 可以考虑。

  • 最好。

  • 尽量。

  • 后续再说。

  • 视情况。

  • 基本完成。

  • 差不多。

未确定对象不得进入实施任务。未确定对象必须登记为风险、相邻人工制品或打回项。

1.6. 文件提交规则

提交在内部 Git 仓库 micheng-ts/projects/asciidoc-abundant-tree 中执行。

新文件必须先进入 Git index:

git add <new-files>

每批提交使用 git commit --only 限定路径:

git commit --only -m "<message>" -- <paths>

每批提交只包含本批文件。跨批文件、其它项目文件、构建产物和无关格式化不得进入本批提交。

1.7. 审核包

每批完成后必须提交审核包。审核包格式见 阶段审核包模板

审核包必须包含:

  • 批次编号。

  • 提交 hash。

  • 修改文件列表。

  • 本批完成范围。

  • 本批未处理对象。

  • 已运行命令。

  • 命令结果。

  • 规约检查清单。

  • 审核结论。

没有提交 hash 的批次不得进入审核。没有审核通过结论的批次不得解锁下一批。

1.8. 全局打回条件

出现以下任一情况,当前批次必须打回:

  • 投影层重新解析 AsciiDoc 源结构,而不是消费 AbundantDocument

  • 投影层打开跨文件 xref 指向的外部 .adoc 文件。

  • 作者显式 ID、headline、generated ID、xref display label 或 payload selector 进入 resource IRI。

  • 可回源 resource 或复杂属性缺少 aat:relativePathaat:startLineaat:endLine

  • 标题节点自身 aat:raw 吞并子标题切片。

  • aat:containsDirectly 连接标题节点到 paragraph、listing、table、payload、label 或普通属性。

  • aat:childOrder 缺失于存在 parent heading 的 heading。

  • 同一 parent 的 direct children 的 aat:childOrder 不连续、不唯一或不从 1 开始。

  • aat:documentOrder 缺失、不连续、不唯一或不从 1 开始。

  • aat:previousSibling 出现在当前核心 heading projection 中。

  • heading order 从 source line、relative path、IRI lexical order 或 Turtle textual order 推导。

  • 未绑定 selector 生成虚构 target heading。

  • 多义 selector 生成单一 target heading。

  • xref payload selector 字符串占用 aat:payload

  • payload raw 被展开为业务 RDF graph。

  • named attribute 生成 aat:SurfaceAttributerdf:value 属性资源。

  • 公共图中保留 aat:Paragraphaat:ListingBlockaat:TableBlockaat:AnchorTargetaat:PayloadBlock 作为标题投影图节点。

  • 验收只比较 Turtle 字符串排版,不比较 graph 语义。

1.9. 覆盖矩阵

06 号书承诺 实现批次 验收批次

当前旧 RDF12 输出被锁定为迁移基线

Batch 00

Batch 00、Batch 07

aat:Heading、headline、headingLevel、address label、generated address label

Batch 01

Batch 01、Batch 07

标题自身 raw、metadata span、content span、line span

Batch 01

Batch 01、Batch 07

aat:containsDirectly 只连接标题节点

Batch 02

Batch 02、Batch 07

aat:childOrder 表达同父 direct children 局部顺序

Batch 02

Batch 02、Batch 07

aat:documentOrder 表达 logical heading tree preorder

Batch 02

Batch 02、Batch 07

标题 label 空间与 selector binding

Batch 03

Batch 03、Batch 04、Batch 06、Batch 07

xref relation triple 与 RDF 1.2 reifier

Batch 04

Batch 04、Batch 07

aat:XrefEdge 边证据

Batch 04

Batch 04、Batch 07

直接字段谓词

Batch 05

Batch 05、Batch 07

节点 payload 与边 payload

Batch 06

Batch 06、Batch 07

Turtle、JSON-LD、CLI、public API

Batch 07

Batch 07

2. 当前源码状态

本章记录实现计划的源码基线。该基线描述当前事实,不定义目标对象。

2.1. 可复用基础设施

src/rdf12-projection/terms.ts 定义 RDF 1.2 term、literal、triple term 和 triple。src/rdf12-projection/graph.ts 提供 graph 去重和稳定输出基础。src/rdf12-projection/n3-adapter.tsturtle-serializer.tsjson-ld-serializer.ts 提供序列化出口。

src/rdf12-projection/path-coordinate.tssource-digest.tsoptions.tsprovenance.ts 提供 document root、relative path、document key、source digest 和 PROV-O 来源事实。标题投影图继续需要这些事实。

src/index.ts 已暴露 rdf12(document, options)src/cli.ts 已暴露 --format rdf12--format rdf12-json-ld。公共入口可以保留;入口背后的图对象必须迁移。

2.2. 当前投影对象

src/rdf12-projection/structure-projector.ts 当前投影多类结构 resource:

  • aat:Section

  • aat:Paragraph

  • aat:ListingBlock

  • aat:TableBlock

  • aat:AnchorTarget

该文件还把 document resource 到普通 block 的 aat:containsDirectly 作为结构树边输出。06 号书要求 aat:containsDirectly 只连接标题节点。

src/rdf12-projection/labels.ts 当前创建 label resource,并把 label resource 通过 aat:hasLabel 挂到 owner。label catalog 的 owner 包含 section、listing、table、anchor、payload 和 document。06 号书要求 label 是标题节点上的查询字段或边证据上的 display label,不作为核心结构资源。

src/rdf12-projection/attributes.ts 当前创建 aat:SurfaceAttribute resource,并使用 aat:namerdf:valueaat:hasAttribute 表达字段。06 号书要求 named attribute 直接投影为 owner 上的 aat:<name> literal 谓词。

src/rdf12-projection/payload-projector.ts 当前创建 aat:PayloadBlock resource,并使用 aat:hasPayloadaat:payloadOfaat:sourceTextaat:dataFormat。06 号书要求 payload 是标题节点或 xref edge evidence 上的复杂属性对象,字段名为 aat:payloadaat:rawaat:formataat:payloadKind 等。

src/rdf12-projection/xref-projector.ts 当前创建 aat:XrefOccurrence resource,并使用 aat:sourceNodeaat:targetNodeaat:rawRelaat:payloadSelector。06 号书要求 xref 形成关系边和 aat:XrefEdge 边证据,边证据使用 aat:sourceHeadingaat:targetHeadingaat:relaat:targetSelectoraat:displayLabelaat:payloadSelector

2.3. 当前测试状态

test/rdf12-projection/ 中的测试覆盖当前旧投影对象。以下断言属于迁移对象,而不是目标验收:

  • structure-projector.test.ts 断言 SectionParagraphListingBlockTableBlockAnchorTarget

  • labels.test.ts 断言 label resource、rdf:valueaat:hasLabel

  • attributes.test.ts 断言 SurfaceAttributeaat:namerdf:valueaat:hasAttribute

  • payload-projector.test.tspayload.acceptance.test.ts 断言 PayloadBlockhasPayloadpayloadOf

  • xref-projector.test.ts 断言 XrefOccurrencesourceNodetargetNoderawRel

这些测试不能直接删除。实现批次必须先写出 06 号书目标测试,再把旧测试迁移、替换或删除。测试删除必须由同批目标测试覆盖,不得留下未验收行为。

2.4. 迁移原则

实现层继续消费 AbundantDocument。解析器、metadata parser、inline occurrence scanner 和 source interval resolver 不是本计划的目标对象。只有当标题自身 raw 无法由现有字段稳定恢复时,才允许在专门批次中补充源区间辅助函数。

投影层可以保留 RDF term、graph、路径、PROV、序列化和 public entry。投影层必须重写资源集合、label catalog、selector binding、attribute projection、payload projection 和 xref edge projection。

2.5. 文件职责目标

projector.ts

编排标题投影图生成顺序,不承载具体规则。

structure-projector.ts

生成 heading node、heading slice raw、heading containment、childOrderdocumentOrder

node-index.ts

只索引 heading node,并支持 xref source heading 和 target heading 绑定。

label-catalog.ts

只维护标题节点 label 空间。

labels.ts

写入 aat:addressLabelaat:generatedAddressLabelaat:headline 等标题查询字段;不创建 label resource。

xref-projector.ts

生成 relation triple、aat:XrefEdge 和 RDF 1.2 reifier。

attributes.ts

将 named attributes 写为 owner 上的直接 aat:<name> literal。

payload-projector.ts

生成节点 payload 和边 payload 的复杂属性对象。

resource-identity.ts

移除或隔离 paragraph、listing、table、anchor、attribute、label 等旧 public resource kind。

2.6. 目标样例

samples/structural-payload.adoc 是本计划的核心验收样例。实现完成后,该样例的 RDF12 图必须满足 06 号书完整样例中的正向事实和负向事实。负向事实与正向事实同等重要,因为它们定义标题投影图的对象边界。

第二部:标题结构批次

这一部把当前结构资源投影迁移为标题节点、标题切片、直接父子关系、同父局部顺序和全局 preorder。

3. Batch 00:基线与迁移护栏

3.1. 批次目标

本批建立迁移基线和目标护栏。本批不改变 RDF12 运行时输出。

本批输出三类证据:当前旧输出快照、06 号书目标验收清单、迁移期间允许失败的目标测试集合。

3.2. 上游门槛

Batch 00 没有上游批次。开始前必须确认 06 号书位于 docs/bookshelf/books/06-rdf12-line-projection/,当前实现位于 src/rdf12-projection/

3.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/book.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/08-worked-example.adoc

  • src/rdf12-projection/projector.ts

  • src/rdf12-projection/structure-projector.ts

  • src/rdf12-projection/xref-projector.ts

  • src/rdf12-projection/attributes.ts

  • src/rdf12-projection/payload-projector.ts

  • test/rdf12-projection/*.test.ts

3.4. 输入事实

当前 RDF12 输出包含旧结构资源。目标 RDF12 输出只包含标题投影图资源。迁移必须以测试表达目标对象,不能只删除旧断言。

3.5. 文件边界

创建:

  • test/rdf12-projection/heading-projection.acceptance.test.ts

  • test/rdf12-projection/helpers/graph-matchers.ts

  • docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan/backmatter/batch-00-review-package.adoc

修改:

  • test/rdf12-projection/query-contracts.test.ts

  • docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan/backmatter/batch-status-ledger.adoc

不得修改:

  • src/rdf12-projection/**

  • src/model.ts

  • src/parser.ts

3.6. 实施任务

  1. 建立 graph matcher 辅助函数,用于按 RDF term 检查 triple 存在、triple 不存在、resource type 数量和 literal 值。

  2. samples/structural-payload.adoc 写目标验收测试。

  3. 将目标验收测试标记为迁移期间允许失败的显式集合,标记必须集中在测试文件顶部,不得散落在断言旁。

  4. 写出当前旧输出快照命令和目标差距说明。

  5. 创建 Batch 00 审核包。

3.7. 目标验收断言

heading-projection.acceptance.test.ts 必须覆盖:

  • 标题节点数量为四个。

  • = root 产生 aat:Heading

  • 配送策略 节点具有 aat:addressLabel "delivery-policy"

  • 配送策略 节点具有 aat:kind "policy"aat:status "active"aat:owner "ops"

  • 运力规则 节点自身 aat:raw 不包含 === 我是3级标题

  • root 直接包含 配送策略运力规则

  • 运力规则 直接包含 我是3级标题

  • root 的 direct children 中,配送策略aat:childOrder1运力规则aat:childOrder2

  • 四个标题节点的 aat:documentOrderroot配送策略运力规则我是3级标题 连续递增。

  • 当前核心 projection 不输出 aat:previousSibling

  • 配送策略运力规则 生成 rel:depends-on

  • xref 边证据类型为 aat:XrefEdge

  • xref weight=0.8 投影为 aat:weight "0.8"

  • xref payload=rel-delivery-capacity 投影为 aat:payloadSelector "rel-delivery-capacity"

  • delivery-policy-payload 绑定为 配送策略 节点 payload。

  • rel-delivery-capacity 绑定为 xref edge payload。

  • payload raw 不展开为业务 RDF graph。

  • ParagraphListingBlockTableBlockAnchorTargetSurfaceAttributePayloadBlock 不作为目标图类型出现。

3.8. 验证命令

pnpm test -- test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm test -- test/rdf12-projection/query-contracts.test.ts
pnpm typecheck

目标验收测试在 Batch 00 可以失败。失败必须与旧实现差距一致。pnpm typecheck 必须通过。

3.9. 提交规则

git add test/rdf12-projection docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan/backmatter
git commit --only -m "test: add rdf12 heading projection migration guardrails" -- test/rdf12-projection docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan/backmatter

3.10. 审核规则

审核者必须确认目标测试直接来自 06 号书完整样例,而不是来自当前旧输出。审核者必须确认允许失败的测试集合有明确移除批次。

3.11. 打回条件

出现以下任一情况,本批不通过:

  • 目标测试只比较 Turtle 字符串。

  • 目标测试缺少负验收事实。

  • 目标测试把旧资源类型当作目标。

  • 本批修改 src/rdf12-projection/**

4. Batch 01:标题节点与标题切片

4.1. 批次目标

本批把结构 resource 投影收敛为标题节点投影。本批生成 aat:Heading、headline、heading level、address label、generated address label、标题自身 raw 和回源坐标。

本批不生成 xref edge。本批不生成 payload。本批不处理直接字段谓词。

4.2. 上游门槛

4.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/02-heading-node.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/03-heading-slice.adoc

  • src/model.ts

  • src/source-lines.ts

  • src/source-surfaces.ts

  • src/source-interval-resolver.ts

  • src/rdf12-projection/structure-projector.ts

  • src/rdf12-projection/node-index.ts

  • test/rdf12-projection/structure-projector.test.ts

4.4. 输入事实

标题节点由 SectionNode 和 document title 对应的等号标题产生。标题节点不是 paragraph、listing、table 或 inline anchor 的父类。

标题切片是连续源文本区域。切片起点是标题头部 metadata 第一行;没有 metadata 时起点是标题行。切片终点是下一个标题切片起点之前。父标题自身 raw 不包含子标题切片。

4.5. 文件边界

修改:

  • src/rdf12-projection/structure-projector.ts

  • src/rdf12-projection/node-index.ts

  • src/rdf12-projection/resource-identity.ts

  • test/rdf12-projection/structure-projector.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

允许创建:

  • src/rdf12-projection/heading-slice.ts

  • test/rdf12-projection/heading-slice.test.ts

不得修改:

  • src/parser.ts

  • src/asciidoctor-adapter.ts

  • src/metadata-parser.ts

4.6. 实施任务

  1. structure-projector.ts 的 public 行为改为只投影 heading node。

  2. 将 section resource type 从 aat:Section 改为 aat:Heading

  3. aat:sectionLevel 改为 aat:headingLevel

  4. 将 section title 写为 aat:headline

  5. 将手动 ID 写为 aat:addressLabel

  6. 将 Asciidoctor generated ID 写为 aat:generatedAddressLabel

  7. 实现 heading local id:heading-l<startLine>-o<ordinal>

  8. 实现标题自身 raw 计算。

  9. 写入 aat:relativePathaat:startLineaat:endLineaat:headingLine

  10. 有 metadata 时写入 aat:metadataStartLineaat:metadataEndLine

  11. 有标题正文内容时写入 aat:contentStartLineaat:contentEndLine

  12. 删除 paragraph、listing、table、anchor resource 创建路径,或把它们隔离到不被 rdf12 调用的旧实现分支。

  13. 更新 node-index.ts,使 index entry 的公共语义为 heading index entry。

4.7. 测试任务

  1. structure-projector.test.ts 断言 samples/structural-payload.adoc 产生四个 aat:Heading

  2. structure-projector.test.ts 断言没有 aat:Paragraphaat:ListingBlockaat:TableBlockaat:AnchorTarget

  3. heading-slice.test.ts 断言 配送策略 raw 是 line 5 到 line 40。

  4. heading-slice.test.ts 断言 运力规则 raw 是 line 41 到 line 45,不包含 line 46 到 line 48。

  5. heading-slice.test.ts 断言 我是3级标题 headingLevel 是 2

  6. heading-projection.acceptance.test.ts 中标题节点与 raw 相关断言解除允许失败标记。

4.8. 验收标准

  • aat:Heading 是标题节点唯一结构类型。

  • 标题节点 IRI 不包含 headline、address label 或 generated address label。

  • aat:raw 是标题自身切片,不是递归子树文本。

  • 所有 heading node 都有 relative path 和 closed line span。

  • 本批后不再有旧 block 类型从 structure-projector.ts 输出。

4.9. 验证命令

pnpm test -- test/rdf12-projection/structure-projector.test.ts test/rdf12-projection/heading-slice.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

4.10. 提交规则

git add src/rdf12-projection test/rdf12-projection
git commit --only -m "feat: project rdf12 heading nodes and slices" -- src/rdf12-projection test/rdf12-projection

4.11. 审核规则

审核者必须检查标题 raw 的行范围。审核者必须检查旧 block resource 没有以新名称保留下来。

4.12. 打回条件

出现以下任一情况,本批不通过:

  • paragraph、listing、table 或 anchor 仍作为 RDF12 结构 resource 输出。

  • aat:raw 包含子标题切片。

  • generated ID 被当作 resource identity。

  • 缺少 heading line 或 line span。

5. Batch 02:标题结构边

5.1. 批次目标

本批实现 ordered heading tree graph。本批生成 aat:containsDirectlyaat:childOrderaat:documentOrder

本批不生成 xref relation。本批不改变 payload。本批不改变 public API。

5.2. 上游门槛

5.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/04-structure-edges.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/08-worked-example.adoc

  • src/rdf12-projection/structure-projector.ts

  • src/rdf12-projection/node-index.ts

  • test/rdf12-projection/containment.test.ts

  • test/rdf12-projection/query-contracts.test.ts

5.4. 输入事实

aat:containsDirectly 表达父标题到直接子标题的关系。它不表达传递闭包。

aat:childOrder 表达 heading 在同一 parent 的 direct children 中的 1-based 局部顺序。它不跨 parent 解释。

aat:documentOrder 表达 logical heading tree preorder traversal 中的 1-based 全局顺序。

source coordinate fields 表达 origin source location。relativePathstartLineendLineheadingLineraw 不参与 heading tree order 计算。

5.5. 文件边界

修改:

  • src/rdf12-projection/structure-projector.ts

  • test/rdf12-projection/containment.test.ts

  • test/rdf12-projection/query-contracts.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

不得修改:

  • src/rdf12-projection/xref-projector.ts

  • src/rdf12-projection/payload-projector.ts

  • src/parser.ts

5.6. 实施任务

  1. 在标题节点创建后记录父标题关系。

  2. 仅在父子标题之间写入 aat:containsDirectly

  3. 移除 document resource 到 paragraph、listing、table、anchor 的 contains 输出。

  4. 为所有 heading 写入连续、唯一、1-based aat:documentOrder

  5. 为存在 parent heading 的 heading 写入同父连续、1-based aat:childOrder

  6. 保证 document title heading 存在时拥有 aat:documentOrder 1 且没有 aat:childOrder

  7. 保证无 document title heading 时不创建虚构 parent heading,顶层 sections 没有 aat:childOrder

  8. 停止输出 aat:previousSibling

  9. 保证 root我是3级标题 不生成直接 contains。

5.7. 测试任务

  1. containment.test.ts 断言 root containsDirectly 配送策略

  2. containment.test.ts 断言 root containsDirectly 运力规则

  3. containment.test.ts 断言 运力规则 containsDirectly 我是3级标题

  4. containment.test.ts 断言 root 不直接 contains 我是3级标题

  5. containment.test.ts 断言 配送策略 不 contains paragraph 或 listing。

  6. containment.test.ts 断言 root 的 direct children 按 childOrder配送策略运力规则

  7. containment.test.ts 断言所有 heading 按 documentOrder 形成 preorder。

  8. containment.test.ts 断言 graph 不输出 aat:previousSibling

  9. query-contracts.test.ts 覆盖直接子标题和递归子树查询。

  10. heading-projection.acceptance.test.ts 中结构边断言解除允许失败标记。

5.8. 验收标准

  • aat:containsDirectly 的 subject 和 object 均为 aat:Heading

  • 有 parent heading 的 direct children 均有 aat:childOrder

  • 同一 parent 的 direct children 的 aat:childOrder 唯一、连续、从 1 开始。

  • 所有 heading 均有 aat:documentOrder

  • aat:documentOrder 在 projection 内唯一、连续、从 1 开始。

  • 传递包含由查询层使用 property path 表达,不由投影器物化。

  • line span 仍然负责回源;childOrderdocumentOrder 负责结构顺序。

  • aat:previousSibling 不作为当前核心契约输出。

5.9. 验证命令

pnpm test -- test/rdf12-projection/containment.test.ts test/rdf12-projection/query-contracts.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

5.10. 提交规则

git add src/rdf12-projection/structure-projector.ts test/rdf12-projection
git commit --only -m "feat: project rdf12 heading structure edges" -- src/rdf12-projection/structure-projector.ts test/rdf12-projection

5.11. 审核规则

审核者必须检查 containsDirectly 没有连接非标题资源。审核者必须检查 childOrder 只在同一 parent 的 direct children 内解释。审核者必须检查 documentOrder 是 logical heading tree preorder。审核者必须检查 graph 不输出 aat:previousSibling

5.12. 打回条件

出现以下任一情况,本批不通过:

  • root containsDirectly 我是3级标题 被物化。

  • 非标题资源出现在 structure edge 两端。

  • aat:previousSibling 被生成。

  • childOrderdocumentOrder 从 source line、relative path、IRI 或 Turtle textual order 推导。

第三部:关系、属性与载荷批次

这一部实现标题 label 空间、selector binding、xref 边证据、直接字段谓词和 payload 复杂属性。

6. Batch 03:标题 Label 空间与 Selector Binding

6.1. 批次目标

本批把 selector binding 收敛到标题节点 label 空间。本批不创建 label resource。本批输出标题节点上的 label 字段,并让 selector 只绑定 aat:addressLabelaat:generatedAddressLabelaat:headline

本批不生成 xref relation triple。本批不生成 payload binding。

6.2. 上游门槛

6.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/02-heading-node.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/05-xref-edge.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/06-payload-and-attribute.adoc

  • src/rdf12-projection/labels.ts

  • src/rdf12-projection/label-catalog.ts

  • src/rdf12-projection/selector-binding.ts

  • test/rdf12-projection/labels.test.ts

  • test/rdf12-projection/selector-binding.test.ts

6.4. 输入事实

标题节点 label 空间由三类字段构成:

  • aat:addressLabel

  • aat:generatedAddressLabel

  • aat:headline

Selector binding 只查询这三类字段。selector 不绑定到标题节点 IRI、payload id、role、普通字段谓词、raw 文本、listing ID、table ID 或 inline anchor ID。

6.5. 文件边界

修改:

  • src/rdf12-projection/labels.ts

  • src/rdf12-projection/label-catalog.ts

  • src/rdf12-projection/selector-binding.ts

  • src/rdf12-projection/projector.ts

  • test/rdf12-projection/labels.test.ts

  • test/rdf12-projection/selector-binding.test.ts

  • test/rdf12-projection/interdocument.acceptance.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

不得修改:

  • src/metadata-parser.ts

  • src/binding-merge.ts

  • src/parser.ts

6.6. 实施任务

  1. 删除或隔离 label resource 写入路径。

  2. TitleLabelAddressLabelGeneratedAddressLabel 的运行时语义迁移为 heading node 字段与 catalog entry。

  3. 删除 BlockTitleLabelAnchorLabelReftextLabelRoleLabel 对 selector binding 的影响。

  4. 让 label catalog entry 只记录 heading owner、label kind 和 label value。

  5. bindSelector 返回标题节点 IRI。

  6. 多义 selector 返回所有候选 heading。

  7. 未绑定 selector 保留 selector literal,不生成 target heading。

  8. 删除 rdf:value label resource 相关输出。

6.7. 测试任务

  1. labels.test.ts 断言 heading node 直接具有 aat:headline

  2. labels.test.ts 断言手动 ID 直接成为 aat:addressLabel

  3. labels.test.ts 断言 generated ID 直接成为 aat:generatedAddressLabel

  4. labels.test.ts 断言没有 aat:TitleLabelaat:AddressLabelaat:GeneratedAddressLabel resource。

  5. selector-binding.test.ts 断言 xref target selector 只绑定标题 label。

  6. selector-binding.test.ts 断言 listing ID、table ID、inline anchor ID 不成为 xref target heading。

  7. selector-binding.test.ts 断言重复 headline 返回多义候选。

  8. interdocument.acceptance.test.ts 断言外部 xref 不打开外部文件。

  9. heading-projection.acceptance.test.ts 中 label 与 selector 相关断言解除允许失败标记。

6.8. 验收标准

  • 公共图中不出现 label resource type。

  • rdf:value 不再用于 label 表达。

  • selector binding 不读取外部文件。

  • selector 多义时不生成单一 target heading。

  • selector 未绑定时不生成虚构 target heading。

6.9. 验证命令

pnpm test -- test/rdf12-projection/labels.test.ts test/rdf12-projection/selector-binding.test.ts test/rdf12-projection/interdocument.acceptance.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

6.10. 提交规则

git add src/rdf12-projection test/rdf12-projection
git commit --only -m "feat: bind rdf12 selectors to heading labels" -- src/rdf12-projection test/rdf12-projection

6.11. 审核规则

审核者必须检查 catalog 的 owner 集合只包含 heading。审核者必须检查 label value 没有进入 resource IRI。

6.12. 打回条件

出现以下任一情况,本批不通过:

  • label resource 仍出现在公共 RDF12 图中。

  • listing、table、anchor 或 payload label 参与 xref target binding。

  • 多义 selector 选择第一个候选。

  • 未绑定 selector 生成虚构 heading。

7. Batch 04:Xref 边与 Reifier

7.1. 批次目标

本批把 xref occurrence 投影迁移为标题之间的关系边和边证据。本批输出主 relation triple、aat:XrefEdgerdf:reifies、source heading、target heading、target selector、display label、rel、raw 和回源坐标。

本批不处理 xref 普通字段谓词。本批不绑定 payload。

7.2. 上游门槛

7.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/05-xref-edge.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/07-query-contract.adoc

  • src/rdf12-projection/xref-projector.ts

  • src/rdf12-projection/reifier.ts

  • src/rdf12-projection/relation-predicate.ts

  • src/rdf12-projection/selector-binding.ts

  • test/rdf12-projection/xref-projector.test.ts

  • test/rdf12-projection/reifier.test.ts

  • test/rdf12-projection/relation-predicate.test.ts

7.4. 输入事实

xref 所在标题切片决定 source heading。xref target selector 绑定到唯一标题节点时决定 target heading。rel 决定关系谓词;没有 rel 时谓词是 aat:references

边证据是关系边的属性承载面和回源证据。边证据不是标题节点。

7.5. 文件边界

修改:

  • src/rdf12-projection/xref-projector.ts

  • src/rdf12-projection/relation-predicate.ts

  • src/rdf12-projection/resource-identity.ts

  • src/rdf12-projection/terms.ts

  • test/rdf12-projection/xref-projector.test.ts

  • test/rdf12-projection/reifier.test.ts

  • test/rdf12-projection/relation-predicate.test.ts

  • test/rdf12-projection/query-contracts.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

不得修改:

  • src/inline-occurrence-scanner.ts

  • src/macro-argument-parser.ts

  • src/parser.ts

7.6. 实施任务

  1. 将 xref resource type 从 aat:XrefOccurrence 改为 aat:XrefEdge

  2. 将 local id 从 xref-l<line>-c<column>-o<ordinal> 保持或迁移为 xref-edge-l<line>-c<column>-o<ordinal>;若迁移,测试必须锁定新 local id。

  3. aat:sourceNode 改为 aat:sourceHeading

  4. aat:targetNode 改为 aat:targetHeading

  5. aat:rawRel 改为 aat:rel

  6. 保留 aat:targetSelector

  7. 将 xref display text 写为 aat:displayLabel literal。

  8. 在 source、target、predicate 均确定时生成主 relation triple。

  9. rdf:reifies 连接边证据到主 relation triple 的 triple term。

  10. 未绑定 target selector 时只保留边证据和 selector,不生成主 relation triple。

  11. 多义 target selector 时输出候选 heading,不生成主 relation triple。

  12. rel 无法映射合法 IRI 时保留 aat:rel,不生成主 relation triple。

7.7. 测试任务

  1. xref-projector.test.ts 断言 运力规则 生成 rel:depends-on triple。

  2. xref-projector.test.ts 断言无 rel 时生成 aat:references triple。

  3. xref-projector.test.ts 断言边证据类型为 aat:XrefEdge

  4. xref-projector.test.ts 断言边证据有 aat:sourceHeadingaat:targetHeading

  5. xref-projector.test.ts 断言边证据有 aat:targetSelectoraat:displayLabelaat:relaat:raw

  6. reifier.test.ts 断言 rdf:reifies object 是 triple term。

  7. xref-projector.test.ts 断言未绑定 selector 不生成主 relation triple。

  8. xref-projector.test.ts 断言多义 selector 不生成主 relation triple。

  9. query-contracts.test.ts 覆盖“查标题发出的边”查询。

  10. heading-projection.acceptance.test.ts 中 xref 边断言解除允许失败标记。

7.8. 验收标准

  • 公共图中不出现 aat:XrefOccurrence

  • relation triple 的 subject 和 object 均为 heading node。

  • rdf:reifies 指向主 relation triple。

  • rel 字段只选择谓词,不触发业务解释。

  • display label 不是 target heading identity。

7.9. 验证命令

pnpm test -- test/rdf12-projection/xref-projector.test.ts test/rdf12-projection/reifier.test.ts test/rdf12-projection/relation-predicate.test.ts test/rdf12-projection/query-contracts.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

7.10. 提交规则

git add src/rdf12-projection test/rdf12-projection
git commit --only -m "feat: project rdf12 xref edges" -- src/rdf12-projection test/rdf12-projection

7.11. 审核规则

审核者必须检查边证据与标题节点集合分离。审核者必须检查未绑定和多义 selector 路径没有主 relation triple。

7.12. 打回条件

出现以下任一情况,本批不通过:

  • aat:XrefOccurrence 仍作为公共类型输出。

  • relation triple 的端点不是 heading node。

  • rdf:reifies object 是 string literal。

  • display label 参与 selector binding 或 resource identity。

8. Batch 05:直接字段谓词

8.1. 批次目标

本批把 SurfaceAttribute resource 投影迁移为直接字段谓词。标题 attrlist named attributes 写为标题节点上的 aat:<name> literal。xref 普通 named attributes 写为 xref edge evidence 上的 aat:<name> literal。

本批不改变 payload raw。本批不解释字段名或字段值的业务语义。

8.2. 上游门槛

8.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/02-heading-node.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/06-payload-and-attribute.adoc

  • src/rdf12-projection/attributes.ts

  • src/rdf12-projection/namespaces.ts

  • src/rdf12-projection/literals.ts

  • test/rdf12-projection/attributes.test.ts

  • test/rdf12-projection/reference-links.acceptance.test.ts

8.4. 输入事实

标题 #id 是 address label。点号 role token 是 role。named attributes 才进入 aat:<fieldName> 谓词。

xref relpayload 是控制字段。rel 可作为 aat:rel 保留。payload 必须保存为 aat:payloadSelector,不得占用 aat:payload

8.5. 文件边界

修改:

  • src/rdf12-projection/attributes.ts

  • src/rdf12-projection/resource-identity.ts

  • src/rdf12-projection/xref-projector.ts

  • test/rdf12-projection/attributes.test.ts

  • test/rdf12-projection/reference-links.acceptance.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

允许创建:

  • src/rdf12-projection/field-predicate.ts

  • test/rdf12-projection/field-predicate.test.ts

不得修改:

  • src/metadata-parser.ts

  • src/macro-argument-parser.ts

8.6. 实施任务

  1. 删除 aat:SurfaceAttribute resource 创建路径。

  2. 删除 aat:hasAttribute 输出。

  3. 删除属性表达中的 rdf:value

  4. 将标题 attrlist named attributes 写到 heading node。

  5. 将 xref 普通 named attributes 写到 xref edge evidence。

  6. 保证字段值统一写为 string literal。

  7. 保证 rel 不作为普通 xref attribute 重复处理。

  8. 保证 payload 不作为普通 xref attribute 重复处理。

  9. 实现字段名到 aat: IRI 的稳定映射。

  10. 对不能直接作为 Turtle prefixed local name 的字段名使用 IRI-safe 编码。

  11. 在测试中覆盖简单字段名和需要编码的字段名。

8.7. 测试任务

  1. attributes.test.ts 断言 kind=policy 生成 aat:kind "policy"

  2. attributes.test.ts 断言 status=active 生成 aat:status "active"

  3. attributes.test.ts 断言 owner=ops 生成 aat:owner "ops"

  4. attributes.test.ts 断言 xref weight=0.8 生成 aat:weight "0.8"

  5. attributes.test.ts 断言 rel=depends-on 不生成第二个普通属性资源。

  6. attributes.test.ts 断言 payload=rel-delivery-capacity 只生成 aat:payloadSelector

  7. attributes.test.ts 断言公共图中没有 aat:SurfaceAttribute

  8. field-predicate.test.ts 断言字段名映射稳定。

  9. heading-projection.acceptance.test.ts 中直接字段谓词断言解除允许失败标记。

8.8. 验收标准

  • aat:<name> 是源字段谓词,不是业务谓词。

  • 字段值是源文档表面字符串 literal。

  • 字段名映射确定且可重复。

  • 属性不生成属性资源。

  • aat:payload 不保存 selector 字符串。

8.9. 验证命令

pnpm test -- test/rdf12-projection/attributes.test.ts test/rdf12-projection/field-predicate.test.ts test/rdf12-projection/reference-links.acceptance.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

8.10. 提交规则

git add src/rdf12-projection test/rdf12-projection
git commit --only -m "feat: project rdf12 direct field predicates" -- src/rdf12-projection test/rdf12-projection

8.11. 审核规则

审核者必须检查字段谓词没有被写成业务 class、业务 relation 或校验结论。审核者必须检查 payloadSelectorpayload 谓词未混用。

8.12. 打回条件

出现以下任一情况,本批不通过:

  • 公共图中出现 aat:SurfaceAttribute

  • 公共图中出现 aat:hasAttribute

  • named attribute 仍通过 rdf:value 表达。

  • xref payload selector 被写入 aat:payload

9. Batch 06:Payload 复杂属性

9.1. 批次目标

本批把 PayloadBlock resource 投影迁移为 payload 复杂属性对象。节点 payload 归属于标题节点。边 payload 归属于 xref edge evidence。

本批不展开 payload raw 内部结构。本批不把 payload block 作为标题节点、结构边端点或 xref target heading。

9.2. 上游门槛

9.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/06-payload-and-attribute.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/08-worked-example.adoc

  • src/rdf12-projection/payload-projector.ts

  • src/rdf12-projection/xref-projector.ts

  • src/rdf12-projection/selector-binding.ts

  • test/rdf12-projection/payload-projector.test.ts

  • test/rdf12-projection/payload.acceptance.test.ts

9.4. 输入事实

.payload block 通过 for 字段绑定标题节点。for 只在标题节点 label 空间中绑定。绑定失败或多义绑定时,payload 对象保留 selector 和回源坐标,不连接到标题节点。

.xref-payload block 通过 xref 的 payload 字段绑定边证据。xref edge evidence 使用 aat:payloadSelector 保存 selector 字符串,使用 aat:payload 连接复杂 payload 对象。

9.5. 文件边界

修改:

  • src/rdf12-projection/payload-projector.ts

  • src/rdf12-projection/labels.ts

  • src/rdf12-projection/label-catalog.ts

  • src/rdf12-projection/resource-identity.ts

  • test/rdf12-projection/payload-projector.test.ts

  • test/rdf12-projection/payload.acceptance.test.ts

  • test/rdf12-projection/query-contracts.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

不得修改:

  • src/metadata-parser.ts

  • src/parser.ts

9.6. 实施任务

  1. 删除 aat:PayloadBlock 公共类型输出。

  2. 删除 aat:hasPayloadaat:payloadOf 作为公共 payload 关系。

  3. 使用 aat:payload 从 heading node 连接节点 payload 对象。

  4. 使用 aat:payload 从 xref edge evidence 连接边 payload 对象。

  5. payload 对象写入 aat:payloadId

  6. payload 对象写入 aat:payloadKind,节点 payload 使用 "node",边 payload 使用 "edge"

  7. payload 对象写入 aat:format

  8. payload 对象写入 aat:raw

  9. payload 对象写入 aat:relativePathaat:startLineaat:endLine

  10. payload 对象写入 aat:contentStartLineaat:contentEndLine

  11. 节点 payload 保留 aat:forSelector

  12. 边 payload 不挂到 source heading 或 target heading。

  13. payload id 不进入 payload object identity。

  14. payload raw 内部 JSON、YAML、TOML、XML 字段不生成 RDF triple。

9.7. 测试任务

  1. payload-projector.test.ts 断言 .payload block 绑定到 heading node 的 aat:payload

  2. payload-projector.test.ts 断言 .xref-payload block 绑定到 xref edge evidence 的 aat:payload

  3. payload-projector.test.ts 断言 payload 对象包含 payloadId、payloadKind、format、raw、relativePath、line span 和 content line span。

  4. payload-projector.test.ts 断言 unbound for 不连接 heading node。

  5. payload-projector.test.ts 断言 ambiguous for 不连接 heading node。

  6. payload-projector.test.ts 断言 missing xref payload selector 不连接 payload 对象。

  7. payload.acceptance.test.ts 断言 delivery-policy-payload 是节点 payload。

  8. payload.acceptance.test.ts 断言 rel-delivery-capacity 是边 payload。

  9. payload.acceptance.test.ts 断言 payload raw 中的 JSON key 不成为 RDF predicate。

  10. heading-projection.acceptance.test.ts 中 payload 断言解除允许失败标记。

9.8. 验收标准

  • payload 是复杂属性对象,不是标题节点。

  • payload 不参与 aat:containsDirectly

  • payload 不参与 aat:childOrderaat:documentOrder

  • payload 不作为 xref target heading。

  • xref payload selector 和 aat:payload 对象谓词不混用。

9.9. 验证命令

pnpm test -- test/rdf12-projection/payload-projector.test.ts test/rdf12-projection/payload.acceptance.test.ts test/rdf12-projection/query-contracts.test.ts test/rdf12-projection/heading-projection.acceptance.test.ts
pnpm typecheck

9.10. 提交规则

git add src/rdf12-projection test/rdf12-projection
git commit --only -m "feat: project rdf12 payload complex properties" -- src/rdf12-projection test/rdf12-projection

9.11. 审核规则

审核者必须检查 payload raw 没有被解析为业务图。审核者必须检查边 payload 没有挂到 source heading 或 target heading。

9.12. 打回条件

出现以下任一情况,本批不通过:

  • 公共图中出现 aat:PayloadBlock

  • payload 使用 aat:hasPayloadaat:payloadOf 作为公共契约。

  • payload JSON 字段进入 RDF graph。

  • xref payload 连接到 relation endpoint。

  • payload id 进入 payload resource IRI。

第四部:公共出口与最终门禁

这一部锁定 rdf12 公共出口、查询契约、书稿一致性和最终验收。

10. Batch 07:公共契约与最终门禁

10.1. 批次目标

本批锁定 rdf12 公共出口、查询契约、序列化行为和最终验收。本批删除迁移期间允许失败标记,并确认旧 RDF12 对象不再出现在公共图中。

10.2. 上游门槛

10.3. 本批上下文包

执行者必须阅读:

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/07-query-contract.adoc

  • docs/bookshelf/books/06-rdf12-line-projection/chapters/08-worked-example.adoc

  • src/index.ts

  • src/cli.ts

  • src/rdf12-projection/turtle-serializer.ts

  • src/rdf12-projection/json-ld-serializer.ts

  • test/rdf12-projection/public-api.test.ts

  • test/rdf12-projection/roundtrip.test.ts

  • test/rdf12-projection/query-contracts.test.ts

10.4. 输入事实

公共入口已经存在。最终批次的对象不是增加入口,而是证明现有入口输出 06 号书定义的标题投影图。

10.5. 文件边界

修改:

  • src/index.ts

  • src/cli.ts

  • src/rdf12-projection/turtle-serializer.ts

  • src/rdf12-projection/json-ld-serializer.ts

  • test/rdf12-projection/public-api.test.ts

  • test/rdf12-projection/roundtrip.test.ts

  • test/rdf12-projection/query-contracts.test.ts

  • test/rdf12-projection/heading-projection.acceptance.test.ts

  • test/cli.test.ts

允许修改:

  • README.md

  • CHANGELOG.md

不得修改:

  • src/parser.ts

  • src/asciidoctor-adapter.ts

10.6. 实施任务

  1. 删除 Batch 00 中设置的允许失败标记。

  2. 确认 rdf12(document, options) 返回 graph、prefixes、relativePath、document/source/projection/projectionActivity IRI、ttl 和 jsonLd。

  3. 确认 CLI --format rdf12 输出 Turtle。

  4. 确认 CLI --format rdf12-json-ld 输出 JSON-LD。

  5. 确认 CLI 不新增 rdfttlturtle 公共 format。

  6. 确认 Turtle serialization 能表达 RDF 1.2 triple term reifier。

  7. 确认 JSON-LD serialization 保留 triple term 结构。

  8. 更新 query contract tests,使它们覆盖 06 号书查询表面。

  9. 更新 README 中 RDF12 描述,使它不承诺旧结构资源。

  10. 更新 CHANGELOG,记录 RDF12 public graph 对象收敛为标题投影图。

10.7. 查询契约验收

query-contracts.test.ts 必须覆盖:

  • aat:addressLabel 查标题。

  • aat:headline 查标题。

  • 读取标题自身 aat:raw

  • 查询直接子标题,并按 aat:childOrder 排序。

  • 使用 property path 查询标题子树。

  • 查询全局 heading preorder,并按 aat:documentOrder 排序。

  • 查询标题发出的 xref edge。

  • 查询边 payload。

  • 查询节点 payload。

  • 按直接字段谓词查询标题。

10.8. 负验收

最终图不得包含以下类型:

  • aat:Paragraph

  • aat:ListingBlock

  • aat:TableBlock

  • aat:AnchorTarget

  • aat:PayloadBlock

  • aat:SurfaceAttribute

  • label resource 类型

  • aat:XrefOccurrence

最终图不得包含以下旧谓词作为公共契约:

  • aat:hasAttribute

  • aat:hasLabel

  • aat:hasPayload

  • aat:payloadOf

  • aat:sourceNode

  • aat:targetNode

  • aat:rawRel

  • aat:previousSibling

10.9. 验证命令

pnpm test -- test/rdf12-projection
pnpm test -- test/cli.test.ts
pnpm typecheck
pnpm lint
pnpm build
pnpm pack:check
pnpm smoke:cli
pnpm --dir docs/bookshelf test
pnpm --dir docs/bookshelf run build

pnpm check 可以作为最终聚合命令执行。审核包必须列出实际运行的完整命令和结果。

10.10. 提交规则

git add src test README.md CHANGELOG.md docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan
git commit --only -m "feat: finalize rdf12 heading projection contract" -- src test README.md CHANGELOG.md docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan

10.11. 审核规则

审核者必须从 public API、CLI、Turtle、JSON-LD 和 graph tests 五个表面检查同一对象。任一表面仍暴露旧结构资源时,本批不得通过。

10.12. 打回条件

出现以下任一情况,本批不通过:

  • 任一允许失败标记仍存在。

  • 旧 RDF12 类型或旧谓词出现在公共契约测试中。

  • CLI 输出与 public API 输出不是同一 projection。

  • Turtle roundtrip 丢失 reifier triple term。

  • README 或 CHANGELOG 描述旧结构图为当前 RDF12 对象。

Appendix A: 阶段审核包模板

每个批次完成后必须提交审核包。审核包是批次事实记录,不是进度汇报。

A.1. 批次信息

批次编号

Batch NN

批次名称

<批次标题>

提交 hash

<git commit hash>

执行者

<name>

审核者

<name>

审核状态

待审核打回通过

A.2. 修改文件

src/rdf12-projection/...
test/rdf12-projection/...
docs/bookshelf/books/07-rdf12-heading-projection-implementation-plan/...

文件列表必须只包含本批提交中的路径。

A.3. 完成范围

本节列出本批已经实现并由测试覆盖的对象事实。

- <对象事实 1>
- <对象事实 2>
- <对象事实 3>

完成范围不得写入“基本完成”“大概完成”“后续完善”等状态词。

A.4. 未处理对象

本节列出本批边界外的对象。边界外对象必须指向后续批次或明确说明不属于本计划。

- <对象>:归属 Batch NN。

A.5. 已运行命令

pnpm test -- ...
pnpm typecheck

命令必须是实际运行过的命令。不得把计划运行的命令写成本节内容。

A.6. 命令结果

<命令 1>: PASS
<命令 2>: PASS

失败命令必须保留失败输出摘要,并说明失败是否属于本批允许失败集合。

A.7. 规约检查清单

  • 本批没有修改批次边界外文件。

  • 本批没有引入全局打回条件。

  • 本批测试覆盖了正向事实。

  • 本批测试覆盖了必要负向事实。

  • 本批 public graph 与 06 号书对象语言一致。

A.8. 审核结论

结论

通过打回

理由

<对象级理由>

后续动作

<下一批次或返工项>

Appendix B: 批次状态台账

本台账记录批次事实。状态字段只使用 未开始执行中待审核打回通过

批次 名称 状态 提交 hash 审核记录

Batch 00

基线与迁移护栏

通过

8458ebeb81666b82a2b48c481fabc9426fd3c3d0

Batch 00 审核包

Batch 01

标题节点与标题切片

通过

2645741c6f3422cb271b150739f73ad2f8739a5b

Batch 01 审核包

Batch 02

标题结构边

通过

d10a0a712fd023a0bf6b9a44d4e00fb1fa97c989

Batch 02 审核包

Batch 03

标题 Label 空间与 Selector Binding

通过

69ed418645dda07d00c6286601f506dcdf613c12

Batch 03 审核包

Batch 04

Xref 边与 Reifier

通过

0deadc878cd20f3c1ff08cb548a3e04172f9d63f

Batch 04 审核包

Batch 05

直接字段谓词

通过

fb712b3992e4316bded427ed0f97558ded43b996

Batch 05 审核包

Batch 06

Payload 复杂属性

通过

c1b3ecac0b1d40238439af5dada49517ce312e72

Batch 06 审核包

Batch 07

公共契约与最终门禁

通过

49a7c602997f35aabcad493ecb792064ef599edd

Batch 07 审核包

B.1. 台账规则

  • 批次提交产生后,提交 hash 必须写入本表。

  • 审核包路径必须写入审核记录。

  • 批次被打回时,审核记录必须写明打回对象和返工批次。

  • 下一批次开始前,上一批次状态必须为 通过