Browse Source

fix(session): validate generated release facts

Tianyi Cui 1 tuần trước cách đây
mục cha
commit
4adfe00207
85 tập tin đã thay đổi với 593 bổ sung128 xóa
  1. 2 0
      .agents/skills/dsh-doc/templates/persistence-release.md
  2. 2 2
      docs/persistence-changes/releases/README.i18n.yaml
  3. 6 0
      docs/persistence-changes/releases/README.md
  4. 6 0
      docs/persistence-changes/releases/README.zh.md
  5. 2 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml
  6. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md
  7. 6 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md
  8. 2 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml
  9. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md
  10. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md
  11. 2 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml
  12. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md
  13. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md
  14. 2 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml
  15. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md
  16. 6 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md
  17. 2 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml
  18. 5 1
      docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md
  19. 6 2
      docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md
  20. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml
  21. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md
  22. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md
  23. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml
  24. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md
  25. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md
  26. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml
  27. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md
  28. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md
  29. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml
  30. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md
  31. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md
  32. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml
  33. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md
  34. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md
  35. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml
  36. 6 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md
  37. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md
  38. 2 2
      docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml
  39. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md
  40. 5 1
      docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md
  41. 2 2
      docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml
  42. 6 2
      docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md
  43. 5 1
      docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md
  44. 2 2
      docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml
  45. 5 1
      docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md
  46. 5 1
      docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md
  47. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml
  48. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md
  49. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md
  50. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml
  51. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md
  52. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md
  53. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml
  54. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md
  55. 6 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md
  56. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml
  57. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md
  58. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md
  59. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml
  60. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md
  61. 6 2
      docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md
  62. 2 2
      docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml
  63. 5 1
      docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md
  64. 6 2
      docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md
  65. 2 2
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml
  66. 5 1
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md
  67. 5 1
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md
  68. 2 2
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml
  69. 5 1
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md
  70. 5 1
      docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md
  71. 2 2
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml
  72. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md
  73. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md
  74. 2 2
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml
  75. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md
  76. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md
  77. 2 2
      docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml
  78. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md
  79. 6 2
      docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md
  80. 2 2
      docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml
  81. 5 1
      docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md
  82. 6 2
      docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md
  83. 95 0
      scripts/persistence-release-facts.ts
  84. 133 3
      scripts/persistence-releases.spec.ts
  85. 22 4
      scripts/persistence-releases.ts

+ 2 - 0
.agents/skills/dsh-doc/templates/persistence-release.md

@@ -25,4 +25,6 @@ kind: persistence-release
 
 The [archive reference](../../../../docs/persistence-changes/releases/README.md) owns the pinned release manifest and extraction limits. The first record contains every extracted root; later schema companions contain only changed roots that remain present, with all their reachable type definitions. Empty changes and snapshots preserve releases with unchanged types. Each record references the immediately preceding manifest entry.
 
+The index table, inventory cell, and structural-change facts use `persistence-release-index`, `persistence-release-inventory`, and `persistence-release-changes` start/end comment markers. Keep human explanations outside these generated regions. `pnpm run verify-persistence-releases --write` validates all machine data before refreshing factual regions and pairing records; it preserves authored prose, machine declarations, and schema files. Default verification rejects stale generated facts and missing fixed index files.
+
 Keep source `number` declarations and historical optional fields intact. Report actual writer version constants separately. Historical parsing permits optional `surfaceOp` for surface events; the live persistence parser and acknowledgement rules remain strict. Never insert these retrospective records into the current-source acknowledgement chain or rewrite the committed baseline to accommodate old releases.

+ 2 - 2
docs/persistence-changes/releases/README.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/README.md
-README.md: 79aab273100d34bcfdf2a29daf852e07e066224d
-README.zh.md: 721a30e7f785bc82a97b90f9f43612fc8aa852d8
+README.md: fef1f0f3f8ce0de3b5118ad83524d30ac4c187f9
+README.zh.md: 37c08007549c79df3230b4f8acee5fad4e01b1dc

+ 6 - 0
docs/persistence-changes/releases/README.md

@@ -25,6 +25,8 @@ This archive provides an approximate historical view of 26 DSH alpha/RC tags and
 
 The [manifest](manifest.json) records every DSH alpha/RC tag captured on 2026-09-12: 16 have release records, and the earliest 10 are tag-only. Entries follow semantic-version order; absent tags are not invented. The first entry establishes the historical starting point, so its change count includes every root.
 
+<!-- persistence-release-index:start -->
+
 | Tag | Source date (UTC) | Session version | Roots / types | Changed roots |
 |---|---|---|---|---|
 | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.md) | 2026-08-10 | 0 | 42 / 341 | 42 |
@@ -54,6 +56,8 @@ The [manifest](manifest.json) records every DSH alpha/RC tag captured on 2026-09
 | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
 | [dsh-v0.1.5-rc.2](dsh-v0.1.5-rc.2.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
 
+<!-- persistence-release-index:end -->
+
 <a id="files"></a>
 ## Files and scope
 
@@ -84,6 +88,8 @@ pnpm run verify-persistence-releases
 pnpm run doc-sync
 ```
 
+The marker-delimited index, inventory cells, and structural-change facts are generated from the snapshots. Default verification rejects stale facts. Run `pnpm run verify-persistence-releases --write` to refresh those regions and pairing records after validating all machine data; authored summaries, source evidence, machine declarations, and schema files are preserved.
+
 Tag completeness is relative to the manifest’s captured scope; offline checks do not discover later tags automatically. Standard documentation checks validate pairing records and Markdown links. The [format template](../../../.agents/skills/dsh-doc/templates/persistence-release.md) defines each record’s fields.
 
 <a id="dev-note"></a>

+ 6 - 0
docs/persistence-changes/releases/README.zh.md

@@ -25,6 +25,8 @@ description: "浏览全部已捕获 DSH alpha/RC tag 之间的 Session 持久化
 
 [清单](manifest.json)记录了 2026-09-12 捕获的全部 DSH alpha/RC tag:16 个有发行记录,最早的 10 个只有 tag。版本按语义版本顺序排列;不存在的 tag 不补造。首条记录是历史起点,变化数包含其所有根。
 
+<!-- persistence-release-index:start -->
+
 | Tag | 源码日期(UTC) | Session 版本 | 根 / 类型 | 变化根 |
 |---|---|---|---|---|
 | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.zh.md) | 2026-08-10 | 0 | 42 / 341 | 42 |
@@ -54,6 +56,8 @@ description: "浏览全部已捕获 DSH alpha/RC tag 之间的 Session 持久化
 | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.zh.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
 | [dsh-v0.1.5-rc.2](dsh-v0.1.5-rc.2.zh.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
 
+<!-- persistence-release-index:end -->
+
 <a id="files"></a>
 ## 文件与范围
 
@@ -84,6 +88,8 @@ pnpm run verify-persistence-releases
 pnpm run doc-sync
 ```
 
+标记区间内的索引、清单单元格和结构变化事实由快照生成。默认校验会拒绝陈旧事实。运行 `pnpm run verify-persistence-releases --write` 可在全部机器数据校验通过后刷新这些区间和配对记录;人工概述、源码证据、机器声明和 schema 文件保持不变。
+
 tag 的完整性以清单的捕获范围为准;离线检查不会自动发现后续新 tag。配对记录及 Markdown 链接由常规文档检查校验。[格式模板](../../../.agents/skills/dsh-doc/templates/persistence-release.md)规定单条记录的字段。
 
 <a id="dev-note"></a>

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md
-dsh-v0.0.1-rc.1.md: c718a5d972e34204d08a9e4eb3d16c6433e87019
-dsh-v0.0.1-rc.1.zh.md: fe2a240dca6e1ea56459c97820a7c1958025e42c
+dsh-v0.0.1-rc.1.md: 6a8a597b8a363eb7f665a9ea32e7dcda20fd4fb1
+dsh-v0.0.1-rc.1.zh.md: ba0bf1925dcf4d4ec7fdee221ccd3131736a0516

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | Earliest available prerelease tag; no earlier comparison input. |
 | Session writer version | 0 |
-| Reconstructed inventory | 42 roots / 341 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->42 roots / 341 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.0.1-rc.1.schema.json](dsh-v0.0.1-rc.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -180,8 +180,12 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 This entry establishes the historical comparison starting point. Its declaration lists every extracted root; it makes no compatibility judgment about earlier versions.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | 最早可用的预发行 tag;没有更早的比较输入。 |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 42 roots / 341 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->42 个根类型 / 341 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.0.1-rc.1.schema.json](dsh-v0.0.1-rc.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -180,7 +180,11 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
-本条建立历史比较的起点。声明列出所有已提取的根类型;没有对更早版本作兼容性判断。
+<!-- persistence-release-changes:start -->
+
+本条记录建立历史比较起点。机器声明列出所有提取的根类型,不对更早版本作兼容性判断。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md
-dsh-v0.0.1-rc.2.md: 08daa44c40a17fcbd8b234f8883f267728cbcbef
-dsh-v0.0.1-rc.2.zh.md: 9c72d9ff018c37f1cd7fe98bc2303ae82343e8f0
+dsh-v0.0.1-rc.2.md: f3cea3d71d575ad3c8f5e1a09c61cb4f14e33eae
+dsh-v0.0.1-rc.2.zh.md: 65da0d51df3416afa607138d0ab42188d453de2c

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.0.1-rc.2.schema.json](dsh-v0.0.1-rc.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -189,6 +189,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 45 changed roots and 48 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -242,6 +244,8 @@ Detected 45 changed roots and 48 structural differences. The minimum below is ca
 | `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.0.1-rc.2.schema.json](dsh-v0.0.1-rc.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -189,6 +189,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 45 个根类型变化、48 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -242,6 +244,8 @@ changes:
 | `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md
-dsh-v0.0.1-rc.3.md: ab1f964c382a6552e1f9ce49416447fc0cbb00d0
-dsh-v0.0.1-rc.3.zh.md: 50bf6265e73890fe339b9f7d290eb3c7395297ac
+dsh-v0.0.1-rc.3.md: ef1ccfaac6d74556401ec965840b5fa9b649a1e0
+dsh-v0.0.1-rc.3.zh.md: 4de93261de37201fd0f48fd5bc3d91f4768f2407

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.0.1-rc.2](dsh-v0.0.1-rc.2.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.0.1-rc.3.schema.json](dsh-v0.0.1-rc.3.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -90,6 +90,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 12 changed roots and 12 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -107,6 +109,8 @@ Detected 12 changed roots and 12 structural differences. The minimum below is ca
 | `event:session/title-llm-request.data.messages[].source.kind` | `type-changed` | `version-bump` |
 | `event:user/message.data.source.kind` | `type-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.0.1-rc.2](dsh-v0.0.1-rc.2.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.0.1-rc.3.schema.json](dsh-v0.0.1-rc.3.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 12 个根类型变化、12 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -107,6 +109,8 @@ changes:
 | `event:session/title-llm-request.data.messages[].source.kind` | `type-changed` | `version-bump` |
 | `event:user/message.data.source.kind` | `type-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md
-dsh-v0.0.1-rc.4.md: 0c4301ff479e78c096c3ee13b9b4c5061e7755b6
-dsh-v0.0.1-rc.4.zh.md: d8fa16a5701244fb9030c3b5b6c1b68c73720f22
+dsh-v0.0.1-rc.4.md: 0ce12ebe3b518aa9c5d8e87a7b11d80bff828473
+dsh-v0.0.1-rc.4.zh.md: ffcfe4e46fda565571f53fcfb36fff6ab5fb81d4

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.0.1-rc.3](dsh-v0.0.1-rc.3.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.0.1-rc.4.schema.json](dsh-v0.0.1-rc.4.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.0.1-rc.3](dsh-v0.0.1-rc.3.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.0.1-rc.4.schema.json](dsh-v0.0.1-rc.4.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md
-dsh-v0.0.1-rc.5.md: 34954e243f58caeda55416853ec4a0c0e4b1cc6f
-dsh-v0.0.1-rc.5.zh.md: bbf9ee13ca14ef2404551b3207dd26bbd4e892e6
+dsh-v0.0.1-rc.5.md: f36c541168bc9abf735c73f3df2702bb0d690e96
+dsh-v0.0.1-rc.5.zh.md: 0364bc284b4156072e8bd608186345fa1a0f8d5d

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.0.1-rc.4](dsh-v0.0.1-rc.4.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.0.1-rc.5.schema.json](dsh-v0.0.1-rc.5.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.0.1-rc.4](dsh-v0.0.1-rc.4.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.0.1-rc.5.schema.json](dsh-v0.0.1-rc.5.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md
-dsh-v0.1.0-rc.1.md: 29cfe65e042bf3044d094739b0260b071d1f611b
-dsh-v0.1.0-rc.1.zh.md: 2220097bf2c662de911284e4b13fa394ee9d0b10
+dsh-v0.1.0-rc.1.md: faeb7d1e9c10474a3d22f527752b02bcd4e47f4b
+dsh-v0.1.0-rc.1.zh.md: 0b866adf5805e7ce4e6780ffce018046acfd1aca

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.0.1-rc.5](dsh-v0.0.1-rc.5.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.1.schema.json](dsh-v0.1.0-rc.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.0.1-rc.5](dsh-v0.0.1-rc.5.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.1.schema.json](dsh-v0.1.0-rc.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md
-dsh-v0.1.0-rc.2.md: fd0c868e9ee296ba446442e585bdd23fea91606b
-dsh-v0.1.0-rc.2.zh.md: 4e3959a5623909c4f40bddfe1990f447fc5ea5b6
+dsh-v0.1.0-rc.2.md: 0217947256c62261fc4c0e3914d4611281507364
+dsh-v0.1.0-rc.2.zh.md: d8743a74f48d6a903f746275f0f59ef06845c6d4

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.1.0-rc.1](dsh-v0.1.0-rc.1.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.2.schema.json](dsh-v0.1.0-rc.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.1](dsh-v0.1.0-rc.1.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.2.schema.json](dsh-v0.1.0-rc.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md
-dsh-v0.1.0-rc.3.md: 09e811bb212a6df8dc0e3af4e0cef8efb293bcc2
-dsh-v0.1.0-rc.3.zh.md: 7337fb756fe1492be637161b7a86e3989263824f
+dsh-v0.1.0-rc.3.md: 5cc00deedb1d6f6639105880641d7804de3fa2e9
+dsh-v0.1.0-rc.3.zh.md: 8c607fd2f14b9f6d7dd717f0913491d1f3f0030a

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.1.0-rc.2](dsh-v0.1.0-rc.2.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.3.schema.json](dsh-v0.1.0-rc.3.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.2](dsh-v0.1.0-rc.2.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.3.schema.json](dsh-v0.1.0-rc.3.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md
-dsh-v0.1.0-rc.5.md: b4a4a941c5f99054852e5491b68a8112bfa447a9
-dsh-v0.1.0-rc.5.zh.md: b977d98efb7e20a0214d3a52830517e317e344ea
+dsh-v0.1.0-rc.5.md: c92270852fa0634430da1410f013120a8f09063b
+dsh-v0.1.0-rc.5.zh.md: 2b16670b6057365c93d1caa5cf4bb43d9966ceeb

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.1.0-rc.3](dsh-v0.1.0-rc.3.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.5.schema.json](dsh-v0.1.0-rc.5.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.3](dsh-v0.1.0-rc.3.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.5.schema.json](dsh-v0.1.0-rc.5.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md
-dsh-v0.1.0-rc.6.md: 60adeead920f505e700abf079b4a097d7412010a
-dsh-v0.1.0-rc.6.zh.md: 62aaaa7181af7c23366e5837bcff907633ec7fe6
+dsh-v0.1.0-rc.6.md: 0fea7055fd2d3e65b23e0a42ebf63aa67a353d62
+dsh-v0.1.0-rc.6.zh.md: ea0198770e8f288387e9b2745211f3ea0cee4a2c

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Tag only; no release object. |
 | Previous release | [dsh-v0.1.0-rc.5](dsh-v0.1.0-rc.5.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 374 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.6.schema.json](dsh-v0.1.0-rc.6.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 只有 tag,没有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.5](dsh-v0.1.0-rc.5.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 374 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.6.schema.json](dsh-v0.1.0-rc.6.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md
-dsh-v0.1.0-rc.7.md: daa9592419ac907d874f6284b39d73668f73b904
-dsh-v0.1.0-rc.7.zh.md: c28eff6a09a842c42a9ad1b8f1f8a25f3e45afca
+dsh-v0.1.0-rc.7.md: b9894c9141a446178b7a7bd59cbbb9fd20523b1e
+dsh-v0.1.0-rc.7.zh.md: 08741228a21e46e41b1ac24431f1229c2634c6d1

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.0-rc.6](dsh-v0.1.0-rc.6.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 47 roots / 376 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 376 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.7.schema.json](dsh-v0.1.0-rc.7.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -57,12 +57,16 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
-Detected 1 changed roots and 1 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
+<!-- persistence-release-changes:start -->
+
+Detected 1 changed root and 1 structural difference. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
 |---|---|---|
 | `event:assistant/chunk.data.chunk.replayState` | `type-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md

@@ -33,7 +33,7 @@ assistant/chunk 的 replayState 从 unknown 改为包含必需字段 response 
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.6](dsh-v0.1.0-rc.6.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 47 roots / 376 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 376 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.7.schema.json](dsh-v0.1.0-rc.7.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
 |---|---|---|
 | `event:assistant/chunk.data.chunk.replayState` | `type-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md
-dsh-v0.1.0-rc.8.md: a66324d47940b39107f40c10b40b3de0a79ec4b1
-dsh-v0.1.0-rc.8.zh.md: bc7c1e06169605c7a7e3b8e5bc4632d958c48705
+dsh-v0.1.0-rc.8.md: a8725d448a971d94d0d8be0d170ec22a5d478c94
+dsh-v0.1.0-rc.8.zh.md: 3acadf86de7dd5f84107023a03bd7c7979494623

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.0-rc.7](dsh-v0.1.0-rc.7.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 51 roots / 403 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 403 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.0-rc.8.schema.json](dsh-v0.1.0-rc.8.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -78,6 +78,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 8 changed roots and 8 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -91,6 +93,8 @@ Detected 8 changed roots and 8 structural differences. The minimum below is calc
 | `event:team/task` | `root-added` | `same-version` |
 | `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.7](dsh-v0.1.0-rc.7.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 51 roots / 403 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 403 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.0-rc.8.schema.json](dsh-v0.1.0-rc.8.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -78,6 +78,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 8 个根类型变化、8 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -91,6 +93,8 @@ changes:
 | `event:team/task` | `root-added` | `same-version` |
 | `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md
-dsh-v0.1.1-rc.1.md: 9aa80350e385b988b95ef27ac9ad940f799ce8d6
-dsh-v0.1.1-rc.1.zh.md: 6e689b57a39ade0ebb86f15515658ca732cf4e60
+dsh-v0.1.1-rc.1.md: cf47ee2445a20c85d655ad11f0e2a665ee527987
+dsh-v0.1.1-rc.1.zh.md: 0195c04c9e1929b29a31aba85834450f522f08e8

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.0-rc.8](dsh-v0.1.0-rc.8.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 51 roots / 407 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 407 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.1-rc.1.schema.json](dsh-v0.1.1-rc.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -57,12 +57,16 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
-Detected 1 changed roots and 1 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
+<!-- persistence-release-changes:start -->
+
+Detected 1 changed root and 1 structural difference. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
 |---|---|---|
 | `event:permission/preset.data.origin` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md

@@ -33,7 +33,7 @@ permission/preset 新增可选字段 origin,可取 default、selection 或 inf
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.0-rc.8](dsh-v0.1.0-rc.8.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 51 roots / 407 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 407 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.1-rc.1.schema.json](dsh-v0.1.1-rc.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
 |---|---|---|
 | `event:permission/preset.data.origin` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md
-dsh-v0.1.1-rc.2.md: 1b5d9dadee01a8f55c526514755c341b8bf6e0fc
-dsh-v0.1.1-rc.2.zh.md: c0c89a6db33b9d833eb779c55d539f8633f6c6a2
+dsh-v0.1.1-rc.2.md: f2f08c817d804127d2a62389dadb591b52256b2b
+dsh-v0.1.1-rc.2.zh.md: 6204ae387ee4b4f7ba5f65ff43a9d6490cc3b6ef

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.1-rc.1](dsh-v0.1.1-rc.1.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 51 roots / 404 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 404 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.1-rc.2.schema.json](dsh-v0.1.1-rc.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -84,6 +84,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 10 changed roots and 11 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -100,6 +102,8 @@ Detected 10 changed roots and 11 structural differences. The minimum below is ca
 | `event:tool/result.data.message.content[0].content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
 | `event:user/message.data.content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md

@@ -33,7 +33,7 @@ permission/preset 删除 origin;附件记录新增可选字段 originalDimensi
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.1-rc.1](dsh-v0.1.1-rc.1.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 51 roots / 404 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 404 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.1-rc.2.schema.json](dsh-v0.1.1-rc.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -84,6 +84,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 10 个根类型变化、11 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -100,6 +102,8 @@ changes:
 | `event:tool/result.data.message.content[0].content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
 | `event:user/message.data.content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md
-dsh-v0.1.2-alpha.1.md: 39a911fe491d15f89396a9f31d2be5d9cc28b82f
-dsh-v0.1.2-alpha.1.zh.md: ede759ef722be798789a6c8c6216a159c2677d08
+dsh-v0.1.2-alpha.1.md: e81e562fda85b9002a9127e926a9bcfc4bdc899e
+dsh-v0.1.2-alpha.1.zh.md: eeb662e8dad0a6c65a05075f78b32833d7c0691d

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.1-rc.2](dsh-v0.1.1-rc.2.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 417 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-alpha.1.schema.json](dsh-v0.1.2-alpha.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -210,6 +210,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 52 changed roots and 61 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -276,6 +278,8 @@ Detected 52 changed roots and 61 structural differences. The minimum below is ca
 | `event:user/message.ignorable` | `property-removed` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `property-removed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.1-rc.2](dsh-v0.1.1-rc.2.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 417 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-alpha.1.schema.json](dsh-v0.1.2-alpha.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 52 个根类型变化、61 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -276,6 +278,8 @@ changes:
 | `event:user/message.ignorable` | `property-removed` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `property-removed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md
-dsh-v0.1.2-alpha.2.md: 855cbb4a187cf4f948f90109a4ceccf2fb60506f
-dsh-v0.1.2-alpha.2.zh.md: c1db6021bcd1a03413c5b485d8433a269ce3e92f
+dsh-v0.1.2-alpha.2.md: 3c2fbba0389330f4d91d1618193eb215b1c20d9b
+dsh-v0.1.2-alpha.2.zh.md: b75873c19dd240ed17cc20cd5dd707aa914f9ae5

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-alpha.1](dsh-v0.1.2-alpha.1.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 417 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-alpha.2.schema.json](dsh-v0.1.2-alpha.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -210,6 +210,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 52 changed roots and 52 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -267,6 +269,8 @@ Detected 52 changed roots and 52 structural differences. The minimum below is ca
 | `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-alpha.1](dsh-v0.1.2-alpha.1.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 417 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-alpha.2.schema.json](dsh-v0.1.2-alpha.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 52 个根类型变化、52 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -267,6 +269,8 @@ changes:
 | `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
 | `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md
-dsh-v0.1.2-alpha.3.md: 71ef63e7e37380c30c706c259133d719878473ac
-dsh-v0.1.2-alpha.3.zh.md: ae30301c50dacb4cc5902a24bf2cfdbaea13b58f
+dsh-v0.1.2-alpha.3.md: aed9535e0b18fd91fe1cc0a1b932cc9f9364c89e
+dsh-v0.1.2-alpha.3.zh.md: 314bee920af17a7ded9710299784642188187ce3

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-alpha.2](dsh-v0.1.2-alpha.2.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 417 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-alpha.3.schema.json](dsh-v0.1.2-alpha.3.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-alpha.2](dsh-v0.1.2-alpha.2.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 417 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-alpha.3.schema.json](dsh-v0.1.2-alpha.3.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md
-dsh-v0.1.2-alpha.4.md: 0d12a1439cfd9c4c77cd13c0a452a810cb46c995
-dsh-v0.1.2-alpha.4.zh.md: 6173937a036661a324661906af6343089e1fa659
+dsh-v0.1.2-alpha.4.md: 82ce5ae9968bb16850c24fed015b927bb143a497
+dsh-v0.1.2-alpha.4.zh.md: d6dc87ac190a68666c893f4c34d673af2c142abc

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-alpha.3](dsh-v0.1.2-alpha.3.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 415 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-alpha.4.schema.json](dsh-v0.1.2-alpha.4.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -66,6 +66,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 4 changed roots and 5 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -76,6 +78,8 @@ Detected 4 changed roots and 5 structural differences. The minimum below is calc
 | `event:session/title-llm-request.data.messages[].source` | `union-variants-changed` | `version-bump` |
 | `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-alpha.3](dsh-v0.1.2-alpha.3.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 415 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-alpha.4.schema.json](dsh-v0.1.2-alpha.4.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 4 个根类型变化、5 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -76,6 +78,8 @@ changes:
 | `event:session/title-llm-request.data.messages[].source` | `union-variants-changed` | `version-bump` |
 | `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md
-dsh-v0.1.2-alpha.5.md: a98b7d78ee7554eb4b3b17d2cb7a72bd52753957
-dsh-v0.1.2-alpha.5.zh.md: b84c83247169d1ce3b0cff480ce943714ec1031f
+dsh-v0.1.2-alpha.5.md: 7c4ac43fabdd80523ec9000535f42ee8ef316f7e
+dsh-v0.1.2-alpha.5.zh.md: c86884019ea853ca6a020f0baa21967dc6a1b5dc

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-alpha.4](dsh-v0.1.2-alpha.4.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 415 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-alpha.5.schema.json](dsh-v0.1.2-alpha.5.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-alpha.4](dsh-v0.1.2-alpha.4.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 415 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-alpha.5.schema.json](dsh-v0.1.2-alpha.5.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md
-dsh-v0.1.2-rc.1.md: c5930f6c1da9a43b0ec9ec8059d15ec975b73c86
-dsh-v0.1.2-rc.1.zh.md: 75f55c52bfb442b4c6e4c19feb68ea84a9edb280
+dsh-v0.1.2-rc.1.md: fbd3f7be514327d08513ce67342ad982fa5307d7
+dsh-v0.1.2-rc.1.zh.md: 406f1cef496a60521011a2ebdd4e9d82c5c337c5

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-alpha.5](dsh-v0.1.2-alpha.5.md) |
 | Session writer version | 0 |
-| Reconstructed inventory | 54 roots / 415 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.2-rc.1.schema.json](dsh-v0.1.2-rc.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-alpha.5](dsh-v0.1.2-alpha.5.zh.md) |
 | Session 写入版本 | 0 |
-| 完整重建清单 | 54 roots / 415 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.2-rc.1.schema.json](dsh-v0.1.2-rc.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md
-dsh-v0.1.3-alpha.1.md: 577db358b24268db165556b46f114d2efb0a4ba8
-dsh-v0.1.3-alpha.1.zh.md: 7238a1bdbae7b2ab193d94e2a5daf16d2331deea
+dsh-v0.1.3-alpha.1.md: 82fc261fcd8b6a125dab4bebaa4d71a27c56373e
+dsh-v0.1.3-alpha.1.zh.md: cf3203c6ed6b6c7e92dc5399af293fe2619a5b87

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.2-rc.1](dsh-v0.1.2-rc.1.md) |
 | Session writer version | 2 |
-| Reconstructed inventory | 54 roots / 425 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 425 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.3-alpha.1.schema.json](dsh-v0.1.3-alpha.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -105,6 +105,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 17 changed roots and 25 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -135,6 +137,8 @@ Detected 17 changed roots and 25 structural differences. The minimum below is ca
 | `event:user/message.data.content[]` | `union-variants-changed` | `version-bump` |
 | `event:user/message.data.source.references[].capturedFormatVersion` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.2-rc.1](dsh-v0.1.2-rc.1.zh.md) |
 | Session 写入版本 | 2 |
-| 完整重建清单 | 54 roots / 425 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 425 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.3-alpha.1.schema.json](dsh-v0.1.3-alpha.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -105,6 +105,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 17 个根类型变化、25 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -135,6 +137,8 @@ changes:
 | `event:user/message.data.content[]` | `union-variants-changed` | `version-bump` |
 | `event:user/message.data.source.references[].capturedFormatVersion` | `optional-property-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md
-dsh-v0.1.3-alpha.2.md: 836cd8769ab02b212bc571d2a47d25f6f69d9dc4
-dsh-v0.1.3-alpha.2.zh.md: 83966d8538308927d54363c5e51b95684237011b
+dsh-v0.1.3-alpha.2.md: 4c8e7c070bc1e6bbd129483af64f2e13ad94426c
+dsh-v0.1.3-alpha.2.zh.md: c3c398ac68521c1fbe2c960ee210faa633dedce2

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.3-alpha.1](dsh-v0.1.3-alpha.1.md) |
 | Session writer version | 2 |
-| Reconstructed inventory | 56 roots / 435 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->56 roots / 435 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.3-alpha.2.schema.json](dsh-v0.1.3-alpha.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -60,6 +60,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 2 changed roots and 2 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -67,6 +69,8 @@ Detected 2 changed roots and 2 structural differences. The minimum below is calc
 | `event:feedback/message-delete` | `root-added` | `same-version` |
 | `event:feedback/message-put` | `root-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.3-alpha.1](dsh-v0.1.3-alpha.1.zh.md) |
 | Session 写入版本 | 2 |
-| 完整重建清单 | 56 roots / 435 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->56 个根类型 / 435 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.3-alpha.2.schema.json](dsh-v0.1.3-alpha.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -60,6 +60,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 2 个根类型变化、2 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -67,6 +69,8 @@ changes:
 | `event:feedback/message-delete` | `root-added` | `same-version` |
 | `event:feedback/message-put` | `root-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md
-dsh-v0.1.5-alpha.1.md: 505f6f6335fca78165f51564fc527347e4a0e662
-dsh-v0.1.5-alpha.1.zh.md: 6a30d170268a1b82bcbf26d67baf6ddc7388c62a
+dsh-v0.1.5-alpha.1.md: 10e513f7c642769620d68b23e45ccf5ea659c3ba
+dsh-v0.1.5-alpha.1.zh.md: 02d66b861597df12026b4b081249f506b5e6af22

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.3-alpha.2](dsh-v0.1.3-alpha.2.md) |
 | Session writer version | 3 |
-| Reconstructed inventory | 57 roots / 443 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->57 roots / 443 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.5-alpha.1.schema.json](dsh-v0.1.5-alpha.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -90,6 +90,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 12 changed roots and 25 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -120,6 +122,8 @@ Detected 12 changed roots and 25 structural differences. The minimum below is ca
 | `event:user/message.surfaceOp.endSeq` | `required-property-added` | `version-bump` |
 | `event:user/message.surfaceOp.startSeq` | `required-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.3-alpha.2](dsh-v0.1.3-alpha.2.zh.md) |
 | Session 写入版本 | 3 |
-| 完整重建清单 | 57 roots / 443 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->57 个根类型 / 443 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.5-alpha.1.schema.json](dsh-v0.1.5-alpha.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 12 个根类型变化、25 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -120,6 +122,8 @@ changes:
 | `event:user/message.surfaceOp.endSeq` | `required-property-added` | `version-bump` |
 | `event:user/message.surfaceOp.startSeq` | `required-property-added` | `version-bump` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md
-dsh-v0.1.5-alpha.2.md: 0fc6a263481e512295f5603e32c6d3865f5e0651
-dsh-v0.1.5-alpha.2.zh.md: b72d4996dfbb48207485545d75750a151fb49c45
+dsh-v0.1.5-alpha.2.md: c8e55c1f50e72932e07179aed0073aa2db319d7c
+dsh-v0.1.5-alpha.2.zh.md: b1676d43cd9345e90910fbe97f0e7e6108f8d668

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.5-alpha.1](dsh-v0.1.5-alpha.1.md) |
 | Session writer version | 3 |
-| Reconstructed inventory | 59 roots / 462 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.5-alpha.2.schema.json](dsh-v0.1.5-alpha.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -66,6 +66,8 @@ changes:
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Detected 4 changed roots and 5 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
 
 | Path | Change | Current minimum |
@@ -76,6 +78,8 @@ Detected 4 changed roots and 5 structural differences. The minimum below is calc
 | `event:feedback/record.data.category` | `optional-property-added` | `same-version` |
 | `event:subagent/catalog` | `root-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.5-alpha.1](dsh-v0.1.5-alpha.1.zh.md) |
 | Session 写入版本 | 3 |
-| 完整重建清单 | 59 roots / 462 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.5-alpha.2.schema.json](dsh-v0.1.5-alpha.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
 <a id="changes"></a>
 ## 结构变化
 
+<!-- persistence-release-changes:start -->
+
 检测到 4 个根类型变化、5 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
 
 | 路径 | 变化 | 当前最低要求 |
@@ -76,6 +78,8 @@ changes:
 | `event:feedback/record.data.category` | `optional-property-added` | `same-version` |
 | `event:subagent/catalog` | `root-added` | `same-version` |
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## 校验
 

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md
-dsh-v0.1.5-rc.1.md: 0f61cf51e73a785511c5233334113de43d14ece5
-dsh-v0.1.5-rc.1.zh.md: f646baf4df526e48bfff017c1d74bafc0a536a9f
+dsh-v0.1.5-rc.1.md: 0e22c63aec8b5f949b140e300afda7e484a69e08
+dsh-v0.1.5-rc.1.zh.md: fc5e76b27aaf6fdb15bf80ef8a1c02a3bb82bb97

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.5-alpha.2](dsh-v0.1.5-alpha.2.md) |
 | Session writer version | 3 |
-| Reconstructed inventory | 59 roots / 462 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.5-rc.1.schema.json](dsh-v0.1.5-rc.1.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.5-alpha.2](dsh-v0.1.5-alpha.2.zh.md) |
 | Session 写入版本 | 3 |
-| 完整重建清单 | 59 roots / 462 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.5-rc.1.schema.json](dsh-v0.1.5-rc.1.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 2 - 2
docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md
-dsh-v0.1.5-rc.2.md: dab655cc1510012e89d09d45bd59a9fc659d05f7
-dsh-v0.1.5-rc.2.zh.md: 9ef65ac725bcde1d691abc60c75fb9202019da75
+dsh-v0.1.5-rc.2.md: 5ad9def844bc2365b272e60a1d796e65104f83b4
+dsh-v0.1.5-rc.2.zh.md: a9a5b952e6759b36495af99741f8f488b93d60dd

+ 5 - 1
docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md

@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
 | Release record | Release object present. |
 | Previous release | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.md) |
 | Session writer version | 3 |
-| Reconstructed inventory | 59 roots / 462 types |
+| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
 | This snapshot | [dsh-v0.1.5-rc.2.schema.json](dsh-v0.1.5-rc.2.schema.json) |
 
 Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
 <a id="changes"></a>
 ## Structural changes
 
+<!-- persistence-release-changes:start -->
+
 Normalized root types and their transitive digests are unchanged from the preceding tag.
 
+<!-- persistence-release-changes:end -->
+
 <a id="verification"></a>
 ## Verification
 

+ 6 - 2
docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md

@@ -33,7 +33,7 @@ kind: persistence-release
 | 发行记录 | 有 release 对象。 |
 | 前一版本 | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.zh.md) |
 | Session 写入版本 | 3 |
-| 完整重建清单 | 59 roots / 462 types |
+| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
 | 本条快照 | [dsh-v0.1.5-rc.2.schema.json](dsh-v0.1.5-rc.2.schema.json) |
 
 写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
 <a id="changes"></a>
 ## 结构变化
 
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+<!-- persistence-release-changes:start -->
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+<!-- persistence-release-changes:end -->
 
 <a id="verification"></a>
 ## 校验

+ 95 - 0
scripts/persistence-release-facts.ts

@@ -0,0 +1,95 @@
+/** Render bounded release facts from validated offline records while preserving authored prose. */
+
+import { readFileSync } from 'node:fs'
+import { join } from 'node:path'
+import { renderPersistencePair } from './persistence-artifacts.ts'
+import type { PersistenceArtifact } from './persistence-artifacts.ts'
+import type { PersistenceReleaseEntry, PersistenceReleases } from './persistence-releases.ts'
+import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
+
+type Language = 'en' | 'zh'
+
+function count(value: number, noun: string): string {
+  return `${value} ${noun}${value === 1 ? '' : 's'}`
+}
+
+function replaceFacts(source: string, name: string, content: string, path: string): string {
+  const start = `<!-- persistence-release-${name}:start -->`
+  const end = `<!-- persistence-release-${name}:end -->`
+  const opening = source.indexOf(start)
+  const closing = source.indexOf(end)
+  if (opening < 0 || closing < opening || source.indexOf(start, opening + start.length) >= 0
+    || source.indexOf(end, closing + end.length) >= 0) throw new Error(`${path}: expected one ${name} factual block`)
+  return source.slice(0, opening + start.length) + content + source.slice(closing)
+}
+
+function structuralChanges(entry: PersistenceReleaseEntry, language: Language): string {
+  if (entry.record.previous === null) {
+    return language === 'en'
+      ? 'This entry establishes the historical comparison starting point. Its declaration lists every extracted root; it makes no compatibility judgment about earlier versions.'
+      : '本条记录建立历史比较起点。机器声明列出所有提取的根类型,不对更早版本作兼容性判断。'
+  }
+  if (entry.differences.length === 0) {
+    return language === 'en'
+      ? 'Normalized root types and their transitive digests are unchanged from the preceding tag.'
+      : '规范化后的根类型及其传递引用摘要与前一 tag 相同。'
+  }
+  const summary = language === 'en'
+    ? `Detected ${count(entry.record.changes.length, 'changed root')} and ${count(entry.differences.length, 'structural difference')}. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.`
+    : `检测到 ${entry.record.changes.length} 个根类型变化、${entry.differences.length} 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。`
+  const heading = language === 'en' ? '| Path | Change | Current minimum |' : '| 路径 | 变化 | 当前最低要求 |'
+  const rows = entry.differences.map((change) => {
+    const path = change.path.replaceAll('`', '\\`').replaceAll('|', '\\|')
+    return `| \`${path}\` | \`${change.kind}\` | \`${change.requiresVersionBump ? 'version-bump' : 'same-version'}\` |`
+  })
+  return [summary, '', heading, '|---|---|---|', ...rows].join('\n')
+}
+
+/** Compute paired factual updates without writing or changing machine declarations.
+ * @param root - checkout containing existing documents with bounded factual markers.
+ * @param archive - fully validated release records and reconstructed roots.
+ * @returns complete bilingual documents and sidecars, validated together before any caller writes.
+ */
+export function persistenceReleaseFactArtifacts(root: string, archive: PersistenceReleases): PersistenceArtifact[] {
+  const directory = 'docs/persistence-changes/releases'
+  const rootTypes = new Map<string, readonly string[]>()
+  const typeCounts = archive.entries.map((entry) => {
+    const types = new Set<string>()
+    for (const root of entry.roots.values()) {
+      let digests = rootTypes.get(root.digest)
+      if (digests === undefined) {
+        digests = root.schema.nodes.map((_, index) => schemaDigest(canonicalizeSchema(root.schema.nodes, index)))
+        rootTypes.set(root.digest, digests)
+      }
+      for (const digest of digests) types.add(digest)
+    }
+    return types.size
+  })
+  const read = (name: string): string => readFileSync(join(root, directory, name), 'utf8')
+  const index = (language: Language): string => {
+    const heading = language === 'en'
+      ? '| Tag | Source date (UTC) | Session version | Roots / types | Changed roots |'
+      : '| Tag | 源码日期(UTC) | Session 版本 | 根 / 类型 | 变化根 |'
+    const rows = archive.entries.map((entry, index) => {
+      const tag = entry.release.tag
+      const date = new Date(entry.release.sourceDate).toISOString().slice(0, 10)
+      return `| [${tag}](${tag}${language === 'zh' ? '.zh' : ''}.md) | ${date} | ${entry.release.sessionFormatVersion} | ${entry.roots.size} / ${typeCounts[index]} | ${entry.record.changes.length} |`
+    })
+    return '\n\n' + [heading, '|---|---|---|---|---|', ...rows].join('\n') + '\n\n'
+  }
+  const artifacts = renderPersistencePair(root, `${directory}/README.md`,
+    replaceFacts(read('README.md'), 'index', index('en'), 'README.md'),
+    replaceFacts(read('README.zh.md'), 'index', index('zh'), 'README.zh.md'))
+  for (const [index, entry] of archive.entries.entries()) {
+    const document = (language: Language): string => {
+      const path = `${entry.release.tag}${language === 'zh' ? '.zh' : ''}.md`
+      const inventory = language === 'en'
+        ? `${count(entry.roots.size, 'root')} / ${count(typeCounts[index] as number, 'type')}`
+        : `${entry.roots.size} 个根类型 / ${typeCounts[index]} 种类型`
+      return replaceFacts(replaceFacts(read(path), 'inventory', inventory, path),
+        'changes', '\n\n' + structuralChanges(entry, language) + '\n\n', path)
+    }
+    artifacts.push(...renderPersistencePair(root, `${directory}/${entry.release.tag}.md`, document('en'), document('zh')))
+  }
+  return artifacts
+}

+ 133 - 3
scripts/persistence-releases.spec.ts

@@ -1,6 +1,6 @@
 /** Offline release archives preserve historical schemas and reject incomplete or inconsistent transitions. */
 
-import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
+import { mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
 import { tmpdir } from 'node:os'
 import { join } from 'node:path'
 import { dump } from 'js-yaml'
@@ -8,7 +8,7 @@ import { afterEach, describe, expect, it } from 'vitest'
 import { parsePersistenceSnapshot } from './persistence-changes.ts'
 import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
 import type { PersistenceRoot, PersistenceSchemaInventory, PersistenceType, SchemaNode } from './persistence-schema-model.ts'
-import { loadPersistenceReleases } from './persistence-releases.ts'
+import { loadPersistenceReleases, runPersistenceReleases } from './persistence-releases.ts'
 import type { PersistenceReleaseManifest, PersistenceReleaseRecord } from './persistence-releases.ts'
 
 const TAGS = ['dsh-v0.1.0-alpha.1', 'dsh-v0.1.0-rc.1', 'dsh-v0.1.0-rc.2'] as const
@@ -59,7 +59,15 @@ interface Fixture {
 function saveRecord(directory: string, record: PersistenceReleaseRecord): void {
   const block = dump(record, { lineWidth: -1, noRefs: true })
   for (const suffix of ['.md', '.zh.md']) {
-    writeFileSync(join(directory, record.tag + suffix), `---\nkind: persistence-release\n---\n\n# Archived release\n\n\`\`\`yaml persistence-release\n${block}\`\`\`\n`)
+    const switcher = suffix === '.md' ? `English | [中文](${record.tag}.zh.md)` : `[English](${record.tag}.md) | 中文`
+    writeFileSync(join(directory, record.tag + suffix), [
+      '---', 'kind: persistence-release', '---', '', '# Archived release', '', switcher, '',
+      '## Summary', '', 'Authored summary and evidence.', '',
+      '| Inventory | Count |', '|---|---|',
+      '| Reconstructed inventory | <!-- persistence-release-inventory:start -->pending<!-- persistence-release-inventory:end --> |', '',
+      '```yaml persistence-release', block.trimEnd(), '```', '',
+      '<!-- persistence-release-changes:start -->', '', 'Pending facts.', '', '<!-- persistence-release-changes:end -->', '',
+    ].join('\n'))
   }
 }
 
@@ -68,6 +76,14 @@ function fixture(): Fixture {
   temporary.push(root)
   const directory = join(root, 'docs/persistence-changes/releases')
   mkdirSync(directory, { recursive: true })
+  for (const suffix of ['.md', '.zh.md']) {
+    const switcher = suffix === '.md' ? 'English | [中文](README.zh.md)' : '[English](README.md) | 中文'
+    writeFileSync(join(directory, 'README' + suffix), [
+      '# Releases', '', switcher, '', 'Authored introduction.', '',
+      '<!-- persistence-release-index:start -->', '', 'Pending index.', '', '<!-- persistence-release-index:end -->', '',
+    ].join('\n'))
+  }
+  writeFileSync(join(directory, 'README.i18n.yaml'), 'schemaVersion: 1\n')
   const manifest: PersistenceReleaseManifest = {
     schemaVersion: 1, capturedAt: '2026-09-12',
     releases: TAGS.map((tag, index) => ({
@@ -121,6 +137,12 @@ describe('pinned persistence releases', () => {
     expect(() => loadPersistenceReleases(data.root)).toThrow('missing release artifact')
   })
 
+  it.each(['README.md', 'README.zh.md', 'README.i18n.yaml'])('requires the fixed archive companion %s', (name) => {
+    const data = fixture()
+    rmSync(join(data.directory, name))
+    expect(() => loadPersistenceReleases(data.root)).toThrow(`missing release artifact ${name}`)
+  })
+
   it.each(['orphan.md', 'orphan.schema.json', 'orphan.zh.md', 'orphan.i18n.yaml'])('rejects an unreferenced archive file %s', (filename) => {
     const data = fixture()
     writeFileSync(join(data.directory, filename), '{}')
@@ -246,3 +268,111 @@ describe('pinned persistence releases', () => {
     expect(() => loadPersistenceReleases(data.root)).toThrow('SessionHeader.version')
   })
 })
+
+function directoryBytes(directory: string): Record<string, string> {
+  return Object.fromEntries(readdirSync(directory).map(file => [file, readFileSync(join(directory, file), 'utf8')]))
+}
+
+describe('release facts', () => {
+  it('refreshes complete-state counts and singular wording while preserving authored text, declarations, and snapshots', () => {
+    const data = fixture()
+    const before = directoryBytes(data.directory)
+    expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
+    expect(directoryBytes(data.directory)).toEqual(before)
+    expect(runPersistenceReleases(['--write'], data.root)).toContain('3 records, 2 adjacent transitions verified')
+    expect(runPersistenceReleases([], data.root)).toContain('3 records, 2 adjacent transitions verified')
+    const after = directoryBytes(data.directory)
+    expect(after['README.md']).toContain(`| [${TAGS[1]}](${TAGS[1]}.md) | 2026-09-01 | 0 | 4 / 7 | 1 |`)
+    expect(after[TAGS[1] + '.md']).toContain('4 roots / 7 types')
+    expect(after[TAGS[1] + '.md']).toContain('Detected 1 changed root and 1 structural difference.')
+    expect(after[TAGS[1] + '.md']).toContain('| `event:example/value.data` | `type-changed` | `version-bump` |')
+    for (const [name, source] of Object.entries(before)) {
+      if (name.endsWith('.json')) expect(after[name]).toBe(source)
+      if (name.endsWith('.md')) {
+        expect(after[name]).toContain(name.startsWith('README') ? 'Authored introduction.' : 'Authored summary and evidence.')
+        if (!name.startsWith('README')) expect(after[name]?.match(/```yaml persistence-release\n[\s\S]*?```/u)?.[0])
+          .toBe(source.match(/```yaml persistence-release\n[\s\S]*?```/u)?.[0])
+      }
+    }
+    expect(after[TAGS[1] + '.i18n.yaml']).not.toBe(before[TAGS[1] + '.i18n.yaml'])
+    expect(runPersistenceReleases(['--write'], data.root)).toContain('Refreshed 0 files.')
+    expect(directoryBytes(data.directory)).toEqual(after)
+  })
+
+  it.each([
+    ['tag label', `[${TAGS[0]}]`, '[wrong-tag]'],
+    ['date', '| 2026-09-01 |', '| 1999-01-01 |'],
+    ['writer', '| 0 | 4 / 7 |', '| 9 | 4 / 7 |'],
+    ['roots', '| 4 / 7 |', '| 99 / 7 |'],
+    ['types', '| 4 / 7 |', '| 4 / 99 |'],
+    ['changes', '| 4 / 7 | 4 |', '| 4 / 7 | 99 |'],
+  ])('rejects stale index %s', (_label, original, replacement) => {
+    const data = fixture()
+    runPersistenceReleases(['--write'], data.root)
+    const path = join(data.directory, 'README.md')
+    const source = readFileSync(path, 'utf8')
+    expect(source).toContain(original)
+    writeFileSync(path, source.replace(original, replacement))
+    expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
+  })
+
+  it.each([
+    ['inventory', '4 roots / 7 types', '4 roots / 999 types'],
+    ['root count', '1 changed root', '9 changed roots'],
+    ['difference count', '1 structural difference', '9 structural differences'],
+    ['path', '`event:example/value.data`', '`event:example/value.wrong`'],
+    ['kind', '`type-changed`', '`optional-property-added`'],
+    ['minimum', '`version-bump`', '`same-version`'],
+  ])('rejects stale record %s', (_label, original, replacement) => {
+    const data = fixture()
+    runPersistenceReleases(['--write'], data.root)
+    const path = join(data.directory, TAGS[1] + '.md')
+    const source = readFileSync(path, 'utf8')
+    expect(source).toContain(original)
+    writeFileSync(path, source.replace(original, replacement))
+    expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
+  })
+
+  it('checks Chinese facts too and allows authored prose outside generated regions to change', () => {
+    const data = fixture()
+    runPersistenceReleases(['--write'], data.root)
+    const path = join(data.directory, TAGS[1] + '.zh.md')
+    writeFileSync(path, readFileSync(path, 'utf8').replace('Authored summary and evidence.', 'Revised authored explanation.'))
+    expect(() => runPersistenceReleases([], data.root)).not.toThrow()
+    writeFileSync(path, readFileSync(path, 'utf8').replace('4 个根类型 / 7 种类型', '4 个根类型 / 999 种类型'))
+    expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
+  })
+
+  it('does not write anything when machine data is corrupt or a later pair cannot be rendered', () => {
+    const data = fixture()
+    const snapshotPath = join(data.directory, TAGS[2] + '.schema.json')
+    const snapshot = readFileSync(snapshotPath, 'utf8')
+    writeFileSync(snapshotPath, snapshot.replace('"formatVersion":1', '"formatVersion":2'))
+    const corrupt = directoryBytes(data.directory)
+    expect(() => runPersistenceReleases(['--write'], data.root)).toThrow('normalization version')
+    expect(directoryBytes(data.directory)).toEqual(corrupt)
+    writeFileSync(snapshotPath, snapshot)
+    const path = join(data.directory, TAGS[2] + '.zh.md')
+    writeFileSync(path, readFileSync(path, 'utf8').replace('<!-- persistence-release-changes:end -->', ''))
+    const missingMarker = directoryBytes(data.directory)
+    expect(() => runPersistenceReleases(['--write'], data.root)).toThrow('expected one changes factual block')
+    expect(directoryBytes(data.directory)).toEqual(missingMarker)
+  })
+
+  it('accepts matching literal writer versions and rejects a missing reconstructed header', () => {
+    const data = fixture()
+    const header = rootSchema('SessionHeader', [
+      { kind: 'object', indices: [], properties: [{ name: 'version', type: 1, optional: false }] }, { kind: 'literal', value: 0 },
+    ])
+    for (const roots of [data.snapshots[0]!.roots.map(root => root.key === header.key ? header : root),
+      data.snapshots[0]!.roots.filter(root => root.key !== header.key)]) {
+      const snapshot = inventory(roots)
+      replaceSnapshot(data, 0, snapshot)
+      saveRecord(data.directory, { ...data.records[0]!,
+        changes: roots.map(root => ({ root: root.key, before: null, after: root.digest })),
+      })
+      if (roots.some(root => root.key === header.key)) expect(() => loadPersistenceReleases(data.root)).not.toThrow()
+      else expect(() => loadPersistenceReleases(data.root)).toThrow('reconstructed state is missing SessionHeader')
+    }
+  })
+})

+ 22 - 4
scripts/persistence-releases.ts

@@ -1,6 +1,6 @@
 /** Verify the pinned prerelease archive without Git, network access, or source extraction. */
 
-import { readFileSync, readdirSync } from 'node:fs'
+import { readFileSync, readdirSync, writeFileSync } from 'node:fs'
 import { join, resolve } from 'node:path'
 import { parseArgs } from 'node:util'
 import { JSON_SCHEMA, load } from 'js-yaml'
@@ -8,6 +8,7 @@ import { classifyPersistenceChange, parseHistoricalPersistenceSnapshot } from '.
 import type { PersistenceTypeChange } from './persistence-changes.ts'
 import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
 import type { PersistenceRoot, PersistenceSchemaInventory } from './persistence-schema-model.ts'
+import { persistenceReleaseFactArtifacts } from './persistence-release-facts.ts'
 
 const ARCHIVE_DIRECTORY = 'docs/persistence-changes/releases'
 const TAG_PATTERN = /^dsh-v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)-(alpha|rc)\.(0|[1-9]\d*)$/u
@@ -185,6 +186,7 @@ export function loadPersistenceReleases(root: string): PersistenceReleases {
   const manifest = parseManifest(JSON.parse(readFileSync(join(directory, 'manifest.json'), 'utf8')))
   const files = new Set(readdirSync(directory))
   const expected = new Set(['manifest.json', 'README.md', 'README.zh.md', 'README.i18n.yaml'])
+  for (const filename of expected) if (!files.has(filename)) throw new Error(`missing release artifact ${filename}`)
   for (const release of manifest.releases) {
     for (const suffix of ['.md', '.zh.md', '.i18n.yaml', '.schema.json']) {
       const filename = release.tag + suffix
@@ -224,11 +226,27 @@ export function loadPersistenceReleases(root: string): PersistenceReleases {
   return { manifest, entries }
 }
 
+/** Validate the archive and check or refresh its bounded factual Markdown regions.
+ * @param args - CLI arguments; --write refreshes facts and pairing sidecars after complete validation.
+ * @param root - default repository directory, overridden by --root when provided.
+ * @returns the verified release counts and optional number of refreshed artifacts.
+ */
+export function runPersistenceReleases(args: readonly string[], root = resolve(import.meta.dirname, '..')): string {
+  const { values } = parseArgs({ args: [...args], options: { root: { type: 'string' }, write: { type: 'boolean' } } })
+  root = resolve(values.root ?? root)
+  const archive = loadPersistenceReleases(root)
+  const artifacts = persistenceReleaseFactArtifacts(root, archive)
+  const changed = artifacts.filter(artifact => readFileSync(join(root, artifact.path), 'utf8') !== artifact.content)
+  const stale = changed.filter(artifact => artifact.path.endsWith('.md'))
+  if (!values.write && stale.length > 0) throw new Error(`Stale persistence release facts: ${stale.map(file => file.path).join(', ')}. Run pnpm run verify-persistence-releases --write.`)
+  if (values.write) for (const artifact of changed) writeFileSync(join(root, artifact.path), artifact.content)
+  return `Persistence release archive: ${archive.entries.length} records, ${archive.entries.length - 1} adjacent transitions verified.`
+    + (values.write ? ` Refreshed ${changed.length} file${changed.length === 1 ? '' : 's'}.` : '')
+}
+
 if (process.argv[1] !== undefined && resolve(process.argv[1]) === import.meta.filename) {
   try {
-    const { values } = parseArgs({ options: { root: { type: 'string' } } })
-    const archive = loadPersistenceReleases(resolve(values.root ?? resolve(import.meta.dirname, '..')))
-    console.log(`Persistence release archive: ${archive.entries.length} records, ${archive.entries.length - 1} adjacent transitions verified.`)
+    console.log(runPersistenceReleases(process.argv.slice(2)))
   } catch (error: unknown) {
     console.error(error instanceof Error ? error.message : String(error))
     process.exitCode = 1