From 4adfe002070fe5d19bf42d5a2b8073a5654f930e Mon Sep 17 00:00:00 2001
From: Tianyi Cui <53024+tianyicui@users.noreply.github.com>
Date: Sat, 12 Sep 2026 15:34:59 +0800
Subject: [PATCH] fix(session): validate generated release facts
---
.../dsh-doc/templates/persistence-release.md | 2 +
.../releases/README.i18n.yaml | 4 +-
docs/persistence-changes/releases/README.md | 6 +
.../persistence-changes/releases/README.zh.md | 6 +
.../releases/dsh-v0.0.1-rc.1.i18n.yaml | 4 +-
.../releases/dsh-v0.0.1-rc.1.md | 6 +-
.../releases/dsh-v0.0.1-rc.1.zh.md | 8 +-
.../releases/dsh-v0.0.1-rc.2.i18n.yaml | 4 +-
.../releases/dsh-v0.0.1-rc.2.md | 6 +-
.../releases/dsh-v0.0.1-rc.2.zh.md | 6 +-
.../releases/dsh-v0.0.1-rc.3.i18n.yaml | 4 +-
.../releases/dsh-v0.0.1-rc.3.md | 6 +-
.../releases/dsh-v0.0.1-rc.3.zh.md | 6 +-
.../releases/dsh-v0.0.1-rc.4.i18n.yaml | 4 +-
.../releases/dsh-v0.0.1-rc.4.md | 6 +-
.../releases/dsh-v0.0.1-rc.4.zh.md | 8 +-
.../releases/dsh-v0.0.1-rc.5.i18n.yaml | 4 +-
.../releases/dsh-v0.0.1-rc.5.md | 6 +-
.../releases/dsh-v0.0.1-rc.5.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.1.md | 6 +-
.../releases/dsh-v0.1.0-rc.1.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.2.md | 6 +-
.../releases/dsh-v0.1.0-rc.2.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.3.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.3.md | 6 +-
.../releases/dsh-v0.1.0-rc.3.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.5.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.5.md | 6 +-
.../releases/dsh-v0.1.0-rc.5.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.6.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.6.md | 6 +-
.../releases/dsh-v0.1.0-rc.6.zh.md | 8 +-
.../releases/dsh-v0.1.0-rc.7.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.7.md | 8 +-
.../releases/dsh-v0.1.0-rc.7.zh.md | 6 +-
.../releases/dsh-v0.1.0-rc.8.i18n.yaml | 4 +-
.../releases/dsh-v0.1.0-rc.8.md | 6 +-
.../releases/dsh-v0.1.0-rc.8.zh.md | 6 +-
.../releases/dsh-v0.1.1-rc.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.1-rc.1.md | 8 +-
.../releases/dsh-v0.1.1-rc.1.zh.md | 6 +-
.../releases/dsh-v0.1.1-rc.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.1-rc.2.md | 6 +-
.../releases/dsh-v0.1.1-rc.2.zh.md | 6 +-
.../releases/dsh-v0.1.2-alpha.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-alpha.1.md | 6 +-
.../releases/dsh-v0.1.2-alpha.1.zh.md | 6 +-
.../releases/dsh-v0.1.2-alpha.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-alpha.2.md | 6 +-
.../releases/dsh-v0.1.2-alpha.2.zh.md | 6 +-
.../releases/dsh-v0.1.2-alpha.3.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-alpha.3.md | 6 +-
.../releases/dsh-v0.1.2-alpha.3.zh.md | 8 +-
.../releases/dsh-v0.1.2-alpha.4.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-alpha.4.md | 6 +-
.../releases/dsh-v0.1.2-alpha.4.zh.md | 6 +-
.../releases/dsh-v0.1.2-alpha.5.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-alpha.5.md | 6 +-
.../releases/dsh-v0.1.2-alpha.5.zh.md | 8 +-
.../releases/dsh-v0.1.2-rc.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.2-rc.1.md | 6 +-
.../releases/dsh-v0.1.2-rc.1.zh.md | 8 +-
.../releases/dsh-v0.1.3-alpha.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.3-alpha.1.md | 6 +-
.../releases/dsh-v0.1.3-alpha.1.zh.md | 6 +-
.../releases/dsh-v0.1.3-alpha.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.3-alpha.2.md | 6 +-
.../releases/dsh-v0.1.3-alpha.2.zh.md | 6 +-
.../releases/dsh-v0.1.5-alpha.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.5-alpha.1.md | 6 +-
.../releases/dsh-v0.1.5-alpha.1.zh.md | 6 +-
.../releases/dsh-v0.1.5-alpha.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.5-alpha.2.md | 6 +-
.../releases/dsh-v0.1.5-alpha.2.zh.md | 6 +-
.../releases/dsh-v0.1.5-rc.1.i18n.yaml | 4 +-
.../releases/dsh-v0.1.5-rc.1.md | 6 +-
.../releases/dsh-v0.1.5-rc.1.zh.md | 8 +-
.../releases/dsh-v0.1.5-rc.2.i18n.yaml | 4 +-
.../releases/dsh-v0.1.5-rc.2.md | 6 +-
.../releases/dsh-v0.1.5-rc.2.zh.md | 8 +-
scripts/persistence-release-facts.ts | 95 ++++++++++++
scripts/persistence-releases.spec.ts | 136 +++++++++++++++++-
scripts/persistence-releases.ts | 26 +++-
85 files changed, 593 insertions(+), 128 deletions(-)
create mode 100644 scripts/persistence-release-facts.ts
diff --git a/.agents/skills/dsh-doc/templates/persistence-release.md b/.agents/skills/dsh-doc/templates/persistence-release.md
index de4965b6c9..08b85503db 100644
--- a/.agents/skills/dsh-doc/templates/persistence-release.md
+++ b/.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.
diff --git a/docs/persistence-changes/releases/README.i18n.yaml b/docs/persistence-changes/releases/README.i18n.yaml
index 1357802306..599e6d0e3f 100644
--- a/docs/persistence-changes/releases/README.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/README.md b/docs/persistence-changes/releases/README.md
index 79aab27310..fef1f0f3f8 100644
--- a/docs/persistence-changes/releases/README.md
+++ b/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.
+
+
| 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 |
+
+
## 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.
diff --git a/docs/persistence-changes/releases/README.zh.md b/docs/persistence-changes/releases/README.zh.md
index 721a30e7f7..37c0800754 100644
--- a/docs/persistence-changes/releases/README.zh.md
+++ b/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 不补造。首条记录是历史起点,变化数包含其所有根。
+
+
| 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 |
+
+
## 文件与范围
@@ -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)规定单条记录的字段。
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml
index 4a224a6727..2934a0a38b 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md
index c718a5d972..6a8a597b8a 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md
+++ b/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 | 42 roots / 341 types |
| 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:
## Structural changes
+
+
This entry establishes the historical comparison starting point. Its declaration lists every extracted root; it makes no compatibility judgment about earlier versions.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md
index fe2a240dca..ba0bf1925d 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md
+++ b/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 |
+| 完整重建清单 | 42 个根类型 / 341 种类型 |
| 本条快照 | [dsh-v0.0.1-rc.1.schema.json](dsh-v0.0.1-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -180,7 +180,11 @@ changes:
## 结构变化
-本条建立历史比较的起点。声明列出所有已提取的根类型;没有对更早版本作兼容性判断。
+
+
+本条记录建立历史比较起点。机器声明列出所有提取的根类型,不对更早版本作兼容性判断。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml
index f2a40a74ca..84d371395b 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md
index 08daa44c40..f3cea3d71d 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md
+++ b/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 | 47 roots / 374 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md
index 9c72d9ff01..65da0d51df 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.0.1-rc.2.schema.json](dsh-v0.0.1-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -189,6 +189,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml
index 4b15696855..74f838b2a7 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md
index ab1f964c38..ef1ccfaac6 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md
+++ b/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 | 47 roots / 374 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md
index 50bf6265e7..4de93261de 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.0.1-rc.3.schema.json](dsh-v0.0.1-rc.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml
index 0e27ac5b08..b13e3e309b 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md
index 0c4301ff47..0ce12ebe3b 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md
index d8fa16a570..ffcfe4e46f 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.0.1-rc.4.schema.json](dsh-v0.0.1-rc.4.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml
index a55a4efb4d..2eb783ac35 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md
index 34954e243f..f36c541168 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md b/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md
index bbf9ee13ca..0364bc284b 100644
--- a/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.0.1-rc.5.schema.json](dsh-v0.0.1-rc.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml
index 440824d377..9ce158222d 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md
index 29cfe65e04..faeb7d1e9c 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md
index 2220097bf2..0b866adf58 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.1.schema.json](dsh-v0.1.0-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml
index 8500162c0f..6ff6ec653e 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md
index fd0c868e9e..0217947256 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md
index 4e3959a562..d8743a74f4 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.2.schema.json](dsh-v0.1.0-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml
index 1208f1bffe..45641234d0 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md
index 09e811bb21..5cc00deedb 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md
index 7337fb756f..8c607fd2f1 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.3.schema.json](dsh-v0.1.0-rc.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml
index 1b14def8d6..02d2e8335c 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md
index b4a4a941c5..c92270852f 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md
index b977d98efb..2b16670b60 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.5.schema.json](dsh-v0.1.0-rc.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml
index 7ed3b60715..ff534411d5 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md
index 60adeead92..0fea7055fd 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md
+++ b/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 | 47 roots / 374 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md
index 62aaaa7181..ea0198770e 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 374 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.6.schema.json](dsh-v0.1.0-rc.6.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml
index 3f56594f13..b28f39f661 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md
index daa9592419..b9894c9141 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md
+++ b/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 | 47 roots / 376 types |
| 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:
## 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.
+
+
+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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md
index c28eff6a09..08741228a2 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md
+++ b/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 |
+| 完整重建清单 | 47 个根类型 / 376 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.7.schema.json](dsh-v0.1.0-rc.7.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
## 结构变化
+
+
检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
|---|---|---|
| `event:assistant/chunk.data.chunk.replayState` | `type-changed` | `version-bump` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml
index 0f2f839add..da1a5c4b4c 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md
index a66324d479..a8725d448a 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md
+++ b/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 | 51 roots / 403 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md b/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md
index bc7c1e0616..3acadf86de 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md
+++ b/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 |
+| 完整重建清单 | 51 个根类型 / 403 种类型 |
| 本条快照 | [dsh-v0.1.0-rc.8.schema.json](dsh-v0.1.0-rc.8.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -78,6 +78,8 @@ changes:
## 结构变化
+
+
检测到 8 个根类型变化、8 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -91,6 +93,8 @@ changes:
| `event:team/task` | `root-added` | `same-version` |
| `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml
index f619fea16b..2703e4bd31 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md b/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md
index 9aa80350e3..cf47ee2445 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md
+++ b/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 | 51 roots / 407 types |
| 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:
## 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.
+
+
+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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md
index 6e689b57a3..0195c04c9e 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md
+++ b/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 |
+| 完整重建清单 | 51 个根类型 / 407 种类型 |
| 本条快照 | [dsh-v0.1.1-rc.1.schema.json](dsh-v0.1.1-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
## 结构变化
+
+
检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
|---|---|---|
| `event:permission/preset.data.origin` | `optional-property-added` | `same-version` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml
index 5ccf8a38e7..1929d64f58 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md b/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md
index 1b5d9dadee..f2f08c817d 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md
+++ b/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 | 51 roots / 404 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md
index c0c89a6db3..6204ae387e 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md
+++ b/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 |
+| 完整重建清单 | 51 个根类型 / 404 种类型 |
| 本条快照 | [dsh-v0.1.1-rc.2.schema.json](dsh-v0.1.1-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -84,6 +84,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml
index 50b1d604e6..c087cc0849 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md
index 39a911fe49..e81e562fda 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md
+++ b/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 | 54 roots / 417 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md
index ede759ef72..eeb662e8da 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 417 种类型 |
| 本条快照 | [dsh-v0.1.2-alpha.1.schema.json](dsh-v0.1.2-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml
index 18d6a9efd3..044a69df49 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md
index 855cbb4a18..3c2fbba038 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md
+++ b/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 | 54 roots / 417 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md
index c1db6021bc..b75873c19d 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 417 种类型 |
| 本条快照 | [dsh-v0.1.2-alpha.2.schema.json](dsh-v0.1.2-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml
index 9fe64ad24d..1535f2cfd7 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md
index 71ef63e7e3..aed9535e0b 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md
+++ b/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 | 54 roots / 417 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md
index ae30301c50..314bee920a 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 417 种类型 |
| 本条快照 | [dsh-v0.1.2-alpha.3.schema.json](dsh-v0.1.2-alpha.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml
index 6786f53815..3456067326 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md
index 0d12a1439c..82ce5ae996 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md
+++ b/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 | 54 roots / 415 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md
index 6173937a03..d6dc87ac19 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 415 种类型 |
| 本条快照 | [dsh-v0.1.2-alpha.4.schema.json](dsh-v0.1.2-alpha.4.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml
index 546526e5f2..273eef486d 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md
index a98b7d78ee..7c4ac43fab 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md
+++ b/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 | 54 roots / 415 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md
index b84c832471..c86884019e 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 415 种类型 |
| 本条快照 | [dsh-v0.1.2-alpha.5.schema.json](dsh-v0.1.2-alpha.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml
index 5514d77fe1..8fbad3708b 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md b/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md
index c5930f6c1d..fbd3f7be51 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md
+++ b/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 | 54 roots / 415 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md
index 75f55c52bf..406f1cef49 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 415 种类型 |
| 本条快照 | [dsh-v0.1.2-rc.1.schema.json](dsh-v0.1.2-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml
index de5e4b8abc..d01a824c89 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md
index 577db358b2..82fc261fcd 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md
+++ b/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 | 54 roots / 425 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md
index 7238a1bdba..cf3203c6ed 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md
+++ b/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 |
+| 完整重建清单 | 54 个根类型 / 425 种类型 |
| 本条快照 | [dsh-v0.1.3-alpha.1.schema.json](dsh-v0.1.3-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -105,6 +105,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml
index 2ff79ae7ee..91c5e464c6 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md
index 836cd8769a..4c8e7c070b 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md
+++ b/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 | 56 roots / 435 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md
index 83966d8538..c3c398ac68 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md
+++ b/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 |
+| 完整重建清单 | 56 个根类型 / 435 种类型 |
| 本条快照 | [dsh-v0.1.3-alpha.2.schema.json](dsh-v0.1.3-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -60,6 +60,8 @@ changes:
## 结构变化
+
+
检测到 2 个根类型变化、2 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -67,6 +69,8 @@ changes:
| `event:feedback/message-delete` | `root-added` | `same-version` |
| `event:feedback/message-put` | `root-added` | `same-version` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml
index bebc236b31..7259c455be 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md
index 505f6f6335..10e513f7c6 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md
+++ b/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 | 57 roots / 443 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md
index 6a30d17026..02d66b8615 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md
+++ b/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 |
+| 完整重建清单 | 57 个根类型 / 443 种类型 |
| 本条快照 | [dsh-v0.1.5-alpha.1.schema.json](dsh-v0.1.5-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
## 结构变化
+
+
检测到 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` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml
index 0b077c823d..b1350f0756 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md
index 0fc6a26348..c8e55c1f50 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md
+++ b/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 | 59 roots / 462 types |
| 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:
## Structural changes
+
+
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` |
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md
index b72d4996df..b1676d43cd 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md
+++ b/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 |
+| 完整重建清单 | 59 个根类型 / 462 种类型 |
| 本条快照 | [dsh-v0.1.5-alpha.2.schema.json](dsh-v0.1.5-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
## 结构变化
+
+
检测到 4 个根类型变化、5 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -76,6 +78,8 @@ changes:
| `event:feedback/record.data.category` | `optional-property-added` | `same-version` |
| `event:subagent/catalog` | `root-added` | `same-version` |
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml
index 27470cfc52..4a437034a7 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md b/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md
index 0f61cf51e7..0e22c63aec 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md
+++ b/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 | 59 roots / 462 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md b/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md
index f646baf4df..fc5e76b27a 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md
+++ b/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 |
+| 完整重建清单 | 59 个根类型 / 462 种类型 |
| 本条快照 | [dsh-v0.1.5-rc.1.schema.json](dsh-v0.1.5-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml b/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml
index 710059bcf7..6972eae6a6 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml
+++ b/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
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md b/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md
index dab655cc15..5ad9def844 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md
+++ b/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 | 59 roots / 462 types |
| 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: []
## Structural changes
+
+
Normalized root types and their transitive digests are unchanged from the preceding tag.
+
+
## Verification
diff --git a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md b/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md
index 9ef65ac725..a9a5b952e6 100644
--- a/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md
+++ b/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 |
+| 完整重建清单 | 59 个根类型 / 462 种类型 |
| 本条快照 | [dsh-v0.1.5-rc.2.schema.json](dsh-v0.1.5-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
## 结构变化
-相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
+
+
+规范化后的根类型及其传递引用摘要与前一 tag 相同。
+
+
## 校验
diff --git a/scripts/persistence-release-facts.ts b/scripts/persistence-release-facts.ts
new file mode 100644
index 0000000000..69500eb0f8
--- /dev/null
+++ b/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 = ``
+ const 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()
+ const typeCounts = archive.entries.map((entry) => {
+ const types = new Set()
+ 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
+}
diff --git a/scripts/persistence-releases.spec.ts b/scripts/persistence-releases.spec.ts
index 13eb1e2303..80e0e0cca6 100644
--- a/scripts/persistence-releases.spec.ts
+++ b/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 | pending |', '',
+ '```yaml persistence-release', block.trimEnd(), '```', '',
+ '', '', 'Pending facts.', '', '', '',
+ ].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.', '',
+ '', '', 'Pending index.', '', '', '',
+ ].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 {
+ 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('', ''))
+ 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')
+ }
+ })
+})
diff --git a/scripts/persistence-releases.ts b/scripts/persistence-releases.ts
index d7b26796aa..3e1e7d72dd 100644
--- a/scripts/persistence-releases.ts
+++ b/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