fix(session): validate generated release facts

This commit is contained in:
Tianyi Cui committed 2026-09-12 18:52:17 +08:00
1 parent 0b7f0b072b
commit 4adfe00207
85 files changed
+593 -128

No files matched your search

@@ -25,4 +25,6 @@ kind: persistence-release
The [archive reference](../../../../docs/persistence-changes/releases/README.md) owns the pinned release manifest and extraction limits. The first record contains every extracted root; later schema companions contain only changed roots that remain present, with all their reachable type definitions. Empty changes and snapshots preserve releases with unchanged types. Each record references the immediately preceding manifest entry.
The index table, inventory cell, and structural-change facts use `persistence-release-index`, `persistence-release-inventory`, and `persistence-release-changes` start/end comment markers. Keep human explanations outside these generated regions. `pnpm run verify-persistence-releases --write` validates all machine data before refreshing factual regions and pairing records; it preserves authored prose, machine declarations, and schema files. Default verification rejects stale generated facts and missing fixed index files.
Keep source `number` declarations and historical optional fields intact. Report actual writer version constants separately. Historical parsing permits optional `surfaceOp` for surface events; the live persistence parser and acknowledgement rules remain strict. Never insert these retrospective records into the current-source acknowledgement chain or rewrite the committed baseline to accommodate old releases.
@@ -2,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
@@ -25,6 +25,8 @@ This archive provides an approximate historical view of 26 DSH alpha/RC tags and
The [manifest](manifest.json) records every DSH alpha/RC tag captured on 2026-09-12: 16 have release records, and the earliest 10 are tag-only. Entries follow semantic-version order; absent tags are not invented. The first entry establishes the historical starting point, so its change count includes every root.
<!-- persistence-release-index:start -->
| Tag | Source date (UTC) | Session version | Roots / types | Changed roots |
|---|---|---|---|---|
| [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.md) | 2026-08-10 | 0 | 42 / 341 | 42 |
@@ -54,6 +56,8 @@ The [manifest](manifest.json) records every DSH alpha/RC tag captured on 2026-09
| [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
| [dsh-v0.1.5-rc.2](dsh-v0.1.5-rc.2.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
<!-- persistence-release-index:end -->
<a id="files"></a>
## Files and scope
@@ -84,6 +88,8 @@ pnpm run verify-persistence-releases
pnpm run doc-sync
```
The marker-delimited index, inventory cells, and structural-change facts are generated from the snapshots. Default verification rejects stale facts. Run `pnpm run verify-persistence-releases --write` to refresh those regions and pairing records after validating all machine data; authored summaries, source evidence, machine declarations, and schema files are preserved.
Tag completeness is relative to the manifest’s captured scope; offline checks do not discover later tags automatically. Standard documentation checks validate pairing records and Markdown links. The [format template](../../../.agents/skills/dsh-doc/templates/persistence-release.md) defines each record’s fields.
<a id="dev-note"></a>
@@ -25,6 +25,8 @@ description: "浏览全部已捕获 DSH alpha/RC tag 之间的 Session 持久化
[清单](manifest.json)记录了 2026-09-12 捕获的全部 DSH alpha/RC tag:16 个有发行记录,最早的 10 个只有 tag。版本按语义版本顺序排列;不存在的 tag 不补造。首条记录是历史起点,变化数包含其所有根。
<!-- persistence-release-index:start -->
| Tag | 源码日期(UTC) | Session 版本 | 根 / 类型 | 变化根 |
|---|---|---|---|---|
| [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.zh.md) | 2026-08-10 | 0 | 42 / 341 | 42 |
@@ -54,6 +56,8 @@ description: "浏览全部已捕获 DSH alpha/RC tag 之间的 Session 持久化
| [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.zh.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
| [dsh-v0.1.5-rc.2](dsh-v0.1.5-rc.2.zh.md) | 2026-09-10 | 3 | 59 / 462 | 0 |
<!-- persistence-release-index:end -->
<a id="files"></a>
## 文件与范围
@@ -84,6 +88,8 @@ pnpm run verify-persistence-releases
pnpm run doc-sync
```
标记区间内的索引、清单单元格和结构变化事实由快照生成。默认校验会拒绝陈旧事实。运行 `pnpm run verify-persistence-releases --write` 可在全部机器数据校验通过后刷新这些区间和配对记录;人工概述、源码证据、机器声明和 schema 文件保持不变。
tag 的完整性以清单的捕获范围为准;离线检查不会自动发现后续新 tag。配对记录及 Markdown 链接由常规文档检查校验。[格式模板](../../../.agents/skills/dsh-doc/templates/persistence-release.md)规定单条记录的字段。
<a id="dev-note"></a>
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | Earliest available prerelease tag; no earlier comparison input. |
| Session writer version | 0 |
| Reconstructed inventory | 42 roots / 341 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->42 roots / 341 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.0.1-rc.1.schema.json](dsh-v0.0.1-rc.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -180,8 +180,12 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
This entry establishes the historical comparison starting point. Its declaration lists every extracted root; it makes no compatibility judgment about earlier versions.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | 最早可用的预发行 tag;没有更早的比较输入。 |
| Session 写入版本 | 0 |
| 完整重建清单 | 42 roots / 341 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->42 个根类型 / 341 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.0.1-rc.1.schema.json](dsh-v0.0.1-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -180,7 +180,11 @@ changes:
<a id="changes"></a>
## 结构变化
本条建立历史比较的起点。声明列出所有已提取的根类型;没有对更早版本作兼容性判断。
<!-- persistence-release-changes:start -->
本条记录建立历史比较起点。机器声明列出所有提取的根类型,不对更早版本作兼容性判断。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.0.1-rc.2.schema.json](dsh-v0.0.1-rc.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -189,6 +189,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 45 changed roots and 48 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -242,6 +244,8 @@ Detected 45 changed roots and 48 structural differences. The minimum below is ca
| `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.0.1-rc.1](dsh-v0.0.1-rc.1.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.0.1-rc.2.schema.json](dsh-v0.0.1-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -189,6 +189,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 45 个根类型变化、48 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -242,6 +244,8 @@ changes:
| `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.0.1-rc.2](dsh-v0.0.1-rc.2.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.0.1-rc.3.schema.json](dsh-v0.0.1-rc.3.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -90,6 +90,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 12 changed roots and 12 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -107,6 +109,8 @@ Detected 12 changed roots and 12 structural differences. The minimum below is ca
| `event:session/title-llm-request.data.messages[].source.kind` | `type-changed` | `version-bump` |
| `event:user/message.data.source.kind` | `type-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.0.1-rc.2](dsh-v0.0.1-rc.2.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.0.1-rc.3.schema.json](dsh-v0.0.1-rc.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 12 个根类型变化、12 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -107,6 +109,8 @@ changes:
| `event:session/title-llm-request.data.messages[].source.kind` | `type-changed` | `version-bump` |
| `event:user/message.data.source.kind` | `type-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.0.1-rc.3](dsh-v0.0.1-rc.3.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.0.1-rc.4.schema.json](dsh-v0.0.1-rc.4.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.0.1-rc.3](dsh-v0.0.1-rc.3.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.0.1-rc.4.schema.json](dsh-v0.0.1-rc.4.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.0.1-rc.4](dsh-v0.0.1-rc.4.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.0.1-rc.5.schema.json](dsh-v0.0.1-rc.5.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.0.1-rc.4](dsh-v0.0.1-rc.4.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.0.1-rc.5.schema.json](dsh-v0.0.1-rc.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.0.1-rc.5](dsh-v0.0.1-rc.5.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.1.schema.json](dsh-v0.1.0-rc.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.0.1-rc.5](dsh-v0.0.1-rc.5.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.1.schema.json](dsh-v0.1.0-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.1.0-rc.1](dsh-v0.1.0-rc.1.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.2.schema.json](dsh-v0.1.0-rc.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.1](dsh-v0.1.0-rc.1.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.2.schema.json](dsh-v0.1.0-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.1.0-rc.2](dsh-v0.1.0-rc.2.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.3.schema.json](dsh-v0.1.0-rc.3.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.2](dsh-v0.1.0-rc.2.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.3.schema.json](dsh-v0.1.0-rc.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.1.0-rc.3](dsh-v0.1.0-rc.3.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.5.schema.json](dsh-v0.1.0-rc.5.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.3](dsh-v0.1.0-rc.3.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.5.schema.json](dsh-v0.1.0-rc.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Tag only; no release object. |
| Previous release | [dsh-v0.1.0-rc.5](dsh-v0.1.0-rc.5.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 374 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 374 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.6.schema.json](dsh-v0.1.0-rc.6.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 只有 tag,没有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.5](dsh-v0.1.0-rc.5.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 374 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 374 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.6.schema.json](dsh-v0.1.0-rc.6.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.0-rc.6](dsh-v0.1.0-rc.6.md) |
| Session writer version | 0 |
| Reconstructed inventory | 47 roots / 376 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->47 roots / 376 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.7.schema.json](dsh-v0.1.0-rc.7.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -57,12 +57,16 @@ changes:
<a id="changes"></a>
## Structural changes
Detected 1 changed roots and 1 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
<!-- persistence-release-changes:start -->
Detected 1 changed root and 1 structural difference. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
|---|---|---|
| `event:assistant/chunk.data.chunk.replayState` | `type-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ assistant/chunk 的 replayState 从 unknown 改为包含必需字段 response
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.6](dsh-v0.1.0-rc.6.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 47 roots / 376 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->47 个根类型 / 376 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.7.schema.json](dsh-v0.1.0-rc.7.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
|---|---|---|
| `event:assistant/chunk.data.chunk.replayState` | `type-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.0-rc.7](dsh-v0.1.0-rc.7.md) |
| Session writer version | 0 |
| Reconstructed inventory | 51 roots / 403 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 403 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.0-rc.8.schema.json](dsh-v0.1.0-rc.8.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -78,6 +78,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 8 changed roots and 8 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -91,6 +93,8 @@ Detected 8 changed roots and 8 structural differences. The minimum below is calc
| `event:team/task` | `root-added` | `same-version` |
| `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.7](dsh-v0.1.0-rc.7.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 51 roots / 403 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 403 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.0-rc.8.schema.json](dsh-v0.1.0-rc.8.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -78,6 +78,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 8 个根类型变化、8 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -91,6 +93,8 @@ changes:
| `event:team/task` | `root-added` | `same-version` |
| `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.0-rc.8](dsh-v0.1.0-rc.8.md) |
| Session writer version | 0 |
| Reconstructed inventory | 51 roots / 407 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 407 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.1-rc.1.schema.json](dsh-v0.1.1-rc.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -57,12 +57,16 @@ changes:
<a id="changes"></a>
## Structural changes
Detected 1 changed roots and 1 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
<!-- persistence-release-changes:start -->
Detected 1 changed root and 1 structural difference. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
|---|---|---|
| `event:permission/preset.data.origin` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ permission/preset 新增可选字段 origin,可取 default、selection 或 inf
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.0-rc.8](dsh-v0.1.0-rc.8.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 51 roots / 407 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 407 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.1-rc.1.schema.json](dsh-v0.1.1-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -57,12 +57,16 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 1 个根类型变化、1 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
|---|---|---|
| `event:permission/preset.data.origin` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.1-rc.1](dsh-v0.1.1-rc.1.md) |
| Session writer version | 0 |
| Reconstructed inventory | 51 roots / 404 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->51 roots / 404 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.1-rc.2.schema.json](dsh-v0.1.1-rc.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -84,6 +84,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 10 changed roots and 11 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -100,6 +102,8 @@ Detected 10 changed roots and 11 structural differences. The minimum below is ca
| `event:tool/result.data.message.content[0].content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
| `event:user/message.data.content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ permission/preset 删除 origin;附件记录新增可选字段 originalDimensi
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.1-rc.1](dsh-v0.1.1-rc.1.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 51 roots / 404 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->51 个根类型 / 404 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.1-rc.2.schema.json](dsh-v0.1.1-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -84,6 +84,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 10 个根类型变化、11 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -100,6 +102,8 @@ changes:
| `event:tool/result.data.message.content[0].content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
| `event:user/message.data.content[].attachment.originalDimensions` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.1-rc.2](dsh-v0.1.1-rc.2.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 417 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-alpha.1.schema.json](dsh-v0.1.2-alpha.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -210,6 +210,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 52 changed roots and 61 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -276,6 +278,8 @@ Detected 52 changed roots and 61 structural differences. The minimum below is ca
| `event:user/message.ignorable` | `property-removed` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `property-removed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.1-rc.2](dsh-v0.1.1-rc.2.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 417 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-alpha.1.schema.json](dsh-v0.1.2-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 52 个根类型变化、61 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -276,6 +278,8 @@ changes:
| `event:user/message.ignorable` | `property-removed` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `property-removed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-alpha.1](dsh-v0.1.2-alpha.1.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 417 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-alpha.2.schema.json](dsh-v0.1.2-alpha.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -210,6 +210,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 52 changed roots and 52 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -267,6 +269,8 @@ Detected 52 changed roots and 52 structural differences. The minimum below is ca
| `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-alpha.1](dsh-v0.1.2-alpha.1.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 417 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-alpha.2.schema.json](dsh-v0.1.2-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -210,6 +210,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 52 个根类型变化、52 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -267,6 +269,8 @@ changes:
| `event:user/message.ignorable` | `optional-property-added` | `version-bump` |
| `event:web/deepseek-search-llm-request.ignorable` | `optional-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-alpha.2](dsh-v0.1.2-alpha.2.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 417 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 417 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-alpha.3.schema.json](dsh-v0.1.2-alpha.3.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-alpha.2](dsh-v0.1.2-alpha.2.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 417 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 417 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-alpha.3.schema.json](dsh-v0.1.2-alpha.3.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-alpha.3](dsh-v0.1.2-alpha.3.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 415 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-alpha.4.schema.json](dsh-v0.1.2-alpha.4.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -66,6 +66,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 4 changed roots and 5 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -76,6 +78,8 @@ Detected 4 changed roots and 5 structural differences. The minimum below is calc
| `event:session/title-llm-request.data.messages[].source` | `union-variants-changed` | `version-bump` |
| `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-alpha.3](dsh-v0.1.2-alpha.3.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 415 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-alpha.4.schema.json](dsh-v0.1.2-alpha.4.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 4 个根类型变化、5 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -76,6 +78,8 @@ changes:
| `event:session/title-llm-request.data.messages[].source` | `union-variants-changed` | `version-bump` |
| `event:user/message.data.source` | `union-variants-changed` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-alpha.4](dsh-v0.1.2-alpha.4.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 415 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-alpha.5.schema.json](dsh-v0.1.2-alpha.5.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-alpha.4](dsh-v0.1.2-alpha.4.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 415 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-alpha.5.schema.json](dsh-v0.1.2-alpha.5.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-alpha.5](dsh-v0.1.2-alpha.5.md) |
| Session writer version | 0 |
| Reconstructed inventory | 54 roots / 415 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 415 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.2-rc.1.schema.json](dsh-v0.1.2-rc.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-alpha.5](dsh-v0.1.2-alpha.5.zh.md) |
| Session 写入版本 | 0 |
| 完整重建清单 | 54 roots / 415 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 415 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.2-rc.1.schema.json](dsh-v0.1.2-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.2-rc.1](dsh-v0.1.2-rc.1.md) |
| Session writer version | 2 |
| Reconstructed inventory | 54 roots / 425 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->54 roots / 425 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.3-alpha.1.schema.json](dsh-v0.1.3-alpha.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -105,6 +105,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 17 changed roots and 25 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -135,6 +137,8 @@ Detected 17 changed roots and 25 structural differences. The minimum below is ca
| `event:user/message.data.content[]` | `union-variants-changed` | `version-bump` |
| `event:user/message.data.source.references[].capturedFormatVersion` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.2-rc.1](dsh-v0.1.2-rc.1.zh.md) |
| Session 写入版本 | 2 |
| 完整重建清单 | 54 roots / 425 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->54 个根类型 / 425 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.3-alpha.1.schema.json](dsh-v0.1.3-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -105,6 +105,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 17 个根类型变化、25 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -135,6 +137,8 @@ changes:
| `event:user/message.data.content[]` | `union-variants-changed` | `version-bump` |
| `event:user/message.data.source.references[].capturedFormatVersion` | `optional-property-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.3-alpha.1](dsh-v0.1.3-alpha.1.md) |
| Session writer version | 2 |
| Reconstructed inventory | 56 roots / 435 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->56 roots / 435 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.3-alpha.2.schema.json](dsh-v0.1.3-alpha.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -60,6 +60,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 2 changed roots and 2 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -67,6 +69,8 @@ Detected 2 changed roots and 2 structural differences. The minimum below is calc
| `event:feedback/message-delete` | `root-added` | `same-version` |
| `event:feedback/message-put` | `root-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.3-alpha.1](dsh-v0.1.3-alpha.1.zh.md) |
| Session 写入版本 | 2 |
| 完整重建清单 | 56 roots / 435 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->56 个根类型 / 435 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.3-alpha.2.schema.json](dsh-v0.1.3-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -60,6 +60,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 2 个根类型变化、2 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -67,6 +69,8 @@ changes:
| `event:feedback/message-delete` | `root-added` | `same-version` |
| `event:feedback/message-put` | `root-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.3-alpha.2](dsh-v0.1.3-alpha.2.md) |
| Session writer version | 3 |
| Reconstructed inventory | 57 roots / 443 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->57 roots / 443 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.5-alpha.1.schema.json](dsh-v0.1.5-alpha.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -90,6 +90,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 12 changed roots and 25 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -120,6 +122,8 @@ Detected 12 changed roots and 25 structural differences. The minimum below is ca
| `event:user/message.surfaceOp.endSeq` | `required-property-added` | `version-bump` |
| `event:user/message.surfaceOp.startSeq` | `required-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.3-alpha.2](dsh-v0.1.3-alpha.2.zh.md) |
| Session 写入版本 | 3 |
| 完整重建清单 | 57 roots / 443 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->57 个根类型 / 443 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.5-alpha.1.schema.json](dsh-v0.1.5-alpha.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -90,6 +90,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 12 个根类型变化、25 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -120,6 +122,8 @@ changes:
| `event:user/message.surfaceOp.endSeq` | `required-property-added` | `version-bump` |
| `event:user/message.surfaceOp.startSeq` | `required-property-added` | `version-bump` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.5-alpha.1](dsh-v0.1.5-alpha.1.md) |
| Session writer version | 3 |
| Reconstructed inventory | 59 roots / 462 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.5-alpha.2.schema.json](dsh-v0.1.5-alpha.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -66,6 +66,8 @@ changes:
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Detected 4 changed roots and 5 structural differences. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.
| Path | Change | Current minimum |
@@ -76,6 +78,8 @@ Detected 4 changed roots and 5 structural differences. The minimum below is calc
| `event:feedback/record.data.category` | `optional-property-added` | `same-version` |
| `event:subagent/catalog` | `root-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.5-alpha.1](dsh-v0.1.5-alpha.1.zh.md) |
| Session 写入版本 | 3 |
| 完整重建清单 | 59 roots / 462 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.5-alpha.2.schema.json](dsh-v0.1.5-alpha.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -66,6 +66,8 @@ changes:
<a id="changes"></a>
## 结构变化
<!-- persistence-release-changes:start -->
检测到 4 个根类型变化、5 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。
| 路径 | 变化 | 当前最低要求 |
@@ -76,6 +78,8 @@ changes:
| `event:feedback/record.data.category` | `optional-property-added` | `same-version` |
| `event:subagent/catalog` | `root-added` | `same-version` |
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.5-alpha.2](dsh-v0.1.5-alpha.2.md) |
| Session writer version | 3 |
| Reconstructed inventory | 59 roots / 462 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.5-rc.1.schema.json](dsh-v0.1.5-rc.1.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.5-alpha.2](dsh-v0.1.5-alpha.2.zh.md) |
| Session 写入版本 | 3 |
| 完整重建清单 | 59 roots / 462 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.5-rc.1.schema.json](dsh-v0.1.5-rc.1.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
@@ -2,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
@@ -33,7 +33,7 @@ This approximate backfill supports reading and format validation; it is not a co
| Release record | Release object present. |
| Previous release | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.md) |
| Session writer version | 3 |
| Reconstructed inventory | 59 roots / 462 types |
| Reconstructed inventory | <!-- persistence-release-inventory:start -->59 roots / 462 types<!-- persistence-release-inventory:end --> |
| This snapshot | [dsh-v0.1.5-rc.2.schema.json](dsh-v0.1.5-rc.2.schema.json) |
Source evidence for the writer version constant at this tag:
@@ -54,8 +54,12 @@ changes: []
<a id="changes"></a>
## Structural changes
<!-- persistence-release-changes:start -->
Normalized root types and their transitive digests are unchanged from the preceding tag.
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## Verification
@@ -33,7 +33,7 @@ kind: persistence-release
| 发行记录 | 有 release 对象。 |
| 前一版本 | [dsh-v0.1.5-rc.1](dsh-v0.1.5-rc.1.zh.md) |
| Session 写入版本 | 3 |
| 完整重建清单 | 59 roots / 462 types |
| 完整重建清单 | <!-- persistence-release-inventory:start -->59 个根类型 / 462 种类型<!-- persistence-release-inventory:end --> |
| 本条快照 | [dsh-v0.1.5-rc.2.schema.json](dsh-v0.1.5-rc.2.schema.json) |
写入版本常量在该 tag 中的源码证据:
@@ -54,7 +54,11 @@ changes: []
<a id="changes"></a>
## 结构变化
相较前一 tag,规范化的根类型及其传递引用摘要没有变化。
<!-- persistence-release-changes:start -->
规范化后的根类型及其传递引用摘要与前一 tag 相同。
<!-- persistence-release-changes:end -->
<a id="verification"></a>
## 校验
+95
View File
@@ -0,0 +1,95 @@
/** Render bounded release facts from validated offline records while preserving authored prose. */
import { readFileSync } from 'node:fs'
import { join } from 'node:path'
import { renderPersistencePair } from './persistence-artifacts.ts'
import type { PersistenceArtifact } from './persistence-artifacts.ts'
import type { PersistenceReleaseEntry, PersistenceReleases } from './persistence-releases.ts'
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
type Language = 'en' | 'zh'
function count(value: number, noun: string): string {
return `${value} ${noun}${value === 1 ? '' : 's'}`
}
function replaceFacts(source: string, name: string, content: string, path: string): string {
const start = `<!-- persistence-release-${name}:start -->`
const end = `<!-- persistence-release-${name}:end -->`
const opening = source.indexOf(start)
const closing = source.indexOf(end)
if (opening < 0 || closing < opening || source.indexOf(start, opening + start.length) >= 0
|| source.indexOf(end, closing + end.length) >= 0) throw new Error(`${path}: expected one ${name} factual block`)
return source.slice(0, opening + start.length) + content + source.slice(closing)
}
function structuralChanges(entry: PersistenceReleaseEntry, language: Language): string {
if (entry.record.previous === null) {
return language === 'en'
? 'This entry establishes the historical comparison starting point. Its declaration lists every extracted root; it makes no compatibility judgment about earlier versions.'
: '本条记录建立历史比较起点。机器声明列出所有提取的根类型,不对更早版本作兼容性判断。'
}
if (entry.differences.length === 0) {
return language === 'en'
? 'Normalized root types and their transitive digests are unchanged from the preceding tag.'
: '规范化后的根类型及其传递引用摘要与前一 tag 相同。'
}
const summary = language === 'en'
? `Detected ${count(entry.record.changes.length, 'changed root')} and ${count(entry.differences.length, 'structural difference')}. The minimum below is calculated using current rules for comparison only; it does not assert historical compliance, migration correctness, or runtime compatibility.`
: `检测到 ${entry.record.changes.length} 个根类型变化、${entry.differences.length} 项结构差异。下表的最低要求按当前规则计算,只用于比较;不表示旧版本曾遵守这些规则,也不证明迁移或运行时兼容性。`
const heading = language === 'en' ? '| Path | Change | Current minimum |' : '| 路径 | 变化 | 当前最低要求 |'
const rows = entry.differences.map((change) => {
const path = change.path.replaceAll('`', '\\`').replaceAll('|', '\\|')
return `| \`${path}\` | \`${change.kind}\` | \`${change.requiresVersionBump ? 'version-bump' : 'same-version'}\` |`
})
return [summary, '', heading, '|---|---|---|', ...rows].join('\n')
}
/** Compute paired factual updates without writing or changing machine declarations.
* @param root - checkout containing existing documents with bounded factual markers.
* @param archive - fully validated release records and reconstructed roots.
* @returns complete bilingual documents and sidecars, validated together before any caller writes.
*/
export function persistenceReleaseFactArtifacts(root: string, archive: PersistenceReleases): PersistenceArtifact[] {
const directory = 'docs/persistence-changes/releases'
const rootTypes = new Map<string, readonly string[]>()
const typeCounts = archive.entries.map((entry) => {
const types = new Set<string>()
for (const root of entry.roots.values()) {
let digests = rootTypes.get(root.digest)
if (digests === undefined) {
digests = root.schema.nodes.map((_, index) => schemaDigest(canonicalizeSchema(root.schema.nodes, index)))
rootTypes.set(root.digest, digests)
}
for (const digest of digests) types.add(digest)
}
return types.size
})
const read = (name: string): string => readFileSync(join(root, directory, name), 'utf8')
const index = (language: Language): string => {
const heading = language === 'en'
? '| Tag | Source date (UTC) | Session version | Roots / types | Changed roots |'
: '| Tag | 源码日期(UTC) | Session 版本 | 根 / 类型 | 变化根 |'
const rows = archive.entries.map((entry, index) => {
const tag = entry.release.tag
const date = new Date(entry.release.sourceDate).toISOString().slice(0, 10)
return `| [${tag}](${tag}${language === 'zh' ? '.zh' : ''}.md) | ${date} | ${entry.release.sessionFormatVersion} | ${entry.roots.size} / ${typeCounts[index]} | ${entry.record.changes.length} |`
})
return '\n\n' + [heading, '|---|---|---|---|---|', ...rows].join('\n') + '\n\n'
}
const artifacts = renderPersistencePair(root, `${directory}/README.md`,
replaceFacts(read('README.md'), 'index', index('en'), 'README.md'),
replaceFacts(read('README.zh.md'), 'index', index('zh'), 'README.zh.md'))
for (const [index, entry] of archive.entries.entries()) {
const document = (language: Language): string => {
const path = `${entry.release.tag}${language === 'zh' ? '.zh' : ''}.md`
const inventory = language === 'en'
? `${count(entry.roots.size, 'root')} / ${count(typeCounts[index] as number, 'type')}`
: `${entry.roots.size} 个根类型 / ${typeCounts[index]} 种类型`
return replaceFacts(replaceFacts(read(path), 'inventory', inventory, path),
'changes', '\n\n' + structuralChanges(entry, language) + '\n\n', path)
}
artifacts.push(...renderPersistencePair(root, `${directory}/${entry.release.tag}.md`, document('en'), document('zh')))
}
return artifacts
}
+133 -3
View File
@@ -1,6 +1,6 @@
/** Offline release archives preserve historical schemas and reject incomplete or inconsistent transitions. */
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
import { mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { dump } from 'js-yaml'
@@ -8,7 +8,7 @@ import { afterEach, describe, expect, it } from 'vitest'
import { parsePersistenceSnapshot } from './persistence-changes.ts'
import { canonicalizeSchema, schemaDigest } from './persistence-schema-model.ts'
import type { PersistenceRoot, PersistenceSchemaInventory, PersistenceType, SchemaNode } from './persistence-schema-model.ts'
import { loadPersistenceReleases } from './persistence-releases.ts'
import { loadPersistenceReleases, runPersistenceReleases } from './persistence-releases.ts'
import type { PersistenceReleaseManifest, PersistenceReleaseRecord } from './persistence-releases.ts'
const TAGS = ['dsh-v0.1.0-alpha.1', 'dsh-v0.1.0-rc.1', 'dsh-v0.1.0-rc.2'] as const
@@ -59,7 +59,15 @@ interface Fixture {
function saveRecord(directory: string, record: PersistenceReleaseRecord): void {
const block = dump(record, { lineWidth: -1, noRefs: true })
for (const suffix of ['.md', '.zh.md']) {
writeFileSync(join(directory, record.tag + suffix), `---\nkind: persistence-release\n---\n\n# Archived release\n\n\`\`\`yaml persistence-release\n${block}\`\`\`\n`)
const switcher = suffix === '.md' ? `English | [中文](${record.tag}.zh.md)` : `[English](${record.tag}.md) | 中文`
writeFileSync(join(directory, record.tag + suffix), [
'---', 'kind: persistence-release', '---', '', '# Archived release', '', switcher, '',
'## Summary', '', 'Authored summary and evidence.', '',
'| Inventory | Count |', '|---|---|',
'| Reconstructed inventory | <!-- persistence-release-inventory:start -->pending<!-- persistence-release-inventory:end --> |', '',
'```yaml persistence-release', block.trimEnd(), '```', '',
'<!-- persistence-release-changes:start -->', '', 'Pending facts.', '', '<!-- persistence-release-changes:end -->', '',
].join('\n'))
}
}
@@ -68,6 +76,14 @@ function fixture(): Fixture {
temporary.push(root)
const directory = join(root, 'docs/persistence-changes/releases')
mkdirSync(directory, { recursive: true })
for (const suffix of ['.md', '.zh.md']) {
const switcher = suffix === '.md' ? 'English | [中文](README.zh.md)' : '[English](README.md) | 中文'
writeFileSync(join(directory, 'README' + suffix), [
'# Releases', '', switcher, '', 'Authored introduction.', '',
'<!-- persistence-release-index:start -->', '', 'Pending index.', '', '<!-- persistence-release-index:end -->', '',
].join('\n'))
}
writeFileSync(join(directory, 'README.i18n.yaml'), 'schemaVersion: 1\n')
const manifest: PersistenceReleaseManifest = {
schemaVersion: 1, capturedAt: '2026-09-12',
releases: TAGS.map((tag, index) => ({
@@ -121,6 +137,12 @@ describe('pinned persistence releases', () => {
expect(() => loadPersistenceReleases(data.root)).toThrow('missing release artifact')
})
it.each(['README.md', 'README.zh.md', 'README.i18n.yaml'])('requires the fixed archive companion %s', (name) => {
const data = fixture()
rmSync(join(data.directory, name))
expect(() => loadPersistenceReleases(data.root)).toThrow(`missing release artifact ${name}`)
})
it.each(['orphan.md', 'orphan.schema.json', 'orphan.zh.md', 'orphan.i18n.yaml'])('rejects an unreferenced archive file %s', (filename) => {
const data = fixture()
writeFileSync(join(data.directory, filename), '{}')
@@ -246,3 +268,111 @@ describe('pinned persistence releases', () => {
expect(() => loadPersistenceReleases(data.root)).toThrow('SessionHeader.version')
})
})
function directoryBytes(directory: string): Record<string, string> {
return Object.fromEntries(readdirSync(directory).map(file => [file, readFileSync(join(directory, file), 'utf8')]))
}
describe('release facts', () => {
it('refreshes complete-state counts and singular wording while preserving authored text, declarations, and snapshots', () => {
const data = fixture()
const before = directoryBytes(data.directory)
expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
expect(directoryBytes(data.directory)).toEqual(before)
expect(runPersistenceReleases(['--write'], data.root)).toContain('3 records, 2 adjacent transitions verified')
expect(runPersistenceReleases([], data.root)).toContain('3 records, 2 adjacent transitions verified')
const after = directoryBytes(data.directory)
expect(after['README.md']).toContain(`| [${TAGS[1]}](${TAGS[1]}.md) | 2026-09-01 | 0 | 4 / 7 | 1 |`)
expect(after[TAGS[1] + '.md']).toContain('4 roots / 7 types')
expect(after[TAGS[1] + '.md']).toContain('Detected 1 changed root and 1 structural difference.')
expect(after[TAGS[1] + '.md']).toContain('| `event:example/value.data` | `type-changed` | `version-bump` |')
for (const [name, source] of Object.entries(before)) {
if (name.endsWith('.json')) expect(after[name]).toBe(source)
if (name.endsWith('.md')) {
expect(after[name]).toContain(name.startsWith('README') ? 'Authored introduction.' : 'Authored summary and evidence.')
if (!name.startsWith('README')) expect(after[name]?.match(/```yaml persistence-release\n[\s\S]*?```/u)?.[0])
.toBe(source.match(/```yaml persistence-release\n[\s\S]*?```/u)?.[0])
}
}
expect(after[TAGS[1] + '.i18n.yaml']).not.toBe(before[TAGS[1] + '.i18n.yaml'])
expect(runPersistenceReleases(['--write'], data.root)).toContain('Refreshed 0 files.')
expect(directoryBytes(data.directory)).toEqual(after)
})
it.each([
['tag label', `[${TAGS[0]}]`, '[wrong-tag]'],
['date', '| 2026-09-01 |', '| 1999-01-01 |'],
['writer', '| 0 | 4 / 7 |', '| 9 | 4 / 7 |'],
['roots', '| 4 / 7 |', '| 99 / 7 |'],
['types', '| 4 / 7 |', '| 4 / 99 |'],
['changes', '| 4 / 7 | 4 |', '| 4 / 7 | 99 |'],
])('rejects stale index %s', (_label, original, replacement) => {
const data = fixture()
runPersistenceReleases(['--write'], data.root)
const path = join(data.directory, 'README.md')
const source = readFileSync(path, 'utf8')
expect(source).toContain(original)
writeFileSync(path, source.replace(original, replacement))
expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
})
it.each([
['inventory', '4 roots / 7 types', '4 roots / 999 types'],
['root count', '1 changed root', '9 changed roots'],
['difference count', '1 structural difference', '9 structural differences'],
['path', '`event:example/value.data`', '`event:example/value.wrong`'],
['kind', '`type-changed`', '`optional-property-added`'],
['minimum', '`version-bump`', '`same-version`'],
])('rejects stale record %s', (_label, original, replacement) => {
const data = fixture()
runPersistenceReleases(['--write'], data.root)
const path = join(data.directory, TAGS[1] + '.md')
const source = readFileSync(path, 'utf8')
expect(source).toContain(original)
writeFileSync(path, source.replace(original, replacement))
expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
})
it('checks Chinese facts too and allows authored prose outside generated regions to change', () => {
const data = fixture()
runPersistenceReleases(['--write'], data.root)
const path = join(data.directory, TAGS[1] + '.zh.md')
writeFileSync(path, readFileSync(path, 'utf8').replace('Authored summary and evidence.', 'Revised authored explanation.'))
expect(() => runPersistenceReleases([], data.root)).not.toThrow()
writeFileSync(path, readFileSync(path, 'utf8').replace('4 个根类型 / 7 种类型', '4 个根类型 / 999 种类型'))
expect(() => runPersistenceReleases([], data.root)).toThrow('Stale persistence release facts')
})
it('does not write anything when machine data is corrupt or a later pair cannot be rendered', () => {
const data = fixture()
const snapshotPath = join(data.directory, TAGS[2] + '.schema.json')
const snapshot = readFileSync(snapshotPath, 'utf8')
writeFileSync(snapshotPath, snapshot.replace('"formatVersion":1', '"formatVersion":2'))
const corrupt = directoryBytes(data.directory)
expect(() => runPersistenceReleases(['--write'], data.root)).toThrow('normalization version')
expect(directoryBytes(data.directory)).toEqual(corrupt)
writeFileSync(snapshotPath, snapshot)
const path = join(data.directory, TAGS[2] + '.zh.md')
writeFileSync(path, readFileSync(path, 'utf8').replace('<!-- persistence-release-changes:end -->', ''))
const missingMarker = directoryBytes(data.directory)
expect(() => runPersistenceReleases(['--write'], data.root)).toThrow('expected one changes factual block')
expect(directoryBytes(data.directory)).toEqual(missingMarker)
})
it('accepts matching literal writer versions and rejects a missing reconstructed header', () => {
const data = fixture()
const header = rootSchema('SessionHeader', [
{ kind: 'object', indices: [], properties: [{ name: 'version', type: 1, optional: false }] }, { kind: 'literal', value: 0 },
])
for (const roots of [data.snapshots[0]!.roots.map(root => root.key === header.key ? header : root),
data.snapshots[0]!.roots.filter(root => root.key !== header.key)]) {
const snapshot = inventory(roots)
replaceSnapshot(data, 0, snapshot)
saveRecord(data.directory, { ...data.records[0]!,
changes: roots.map(root => ({ root: root.key, before: null, after: root.digest })),
})
if (roots.some(root => root.key === header.key)) expect(() => loadPersistenceReleases(data.root)).not.toThrow()
else expect(() => loadPersistenceReleases(data.root)).toThrow('reconstructed state is missing SessionHeader')
}
})
})
+22 -4
View File
@@ -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