## 大白话 账本读不出来的时候,有一条路径**静默返回空数组**而不是响亮报错。 后果不是崩溃,是**装好的包在界面上显示成「没装」** —— 用户会以为自己没装过, 而移除按钮也跟着消失,claim 变成无人认领。 **这比崩溃更糟:崩溃你会去查,"看起来没装"你只会以为自己记错了。** ## 事实 - `readPackageGraphs()`(`packages/ui-mac/src/main/ext-receipt-v2.ts:1113`)在 `readError` 时返回 `[]`; - 而同一份账本的 `readPackageLedgerStateV1` 在同样情况下**响亮失败**(`ok:false`)。 **两条读路径对同一个损坏状态给出相反的答案。** ## 为什么现在提 `alpha-code#758`(PR #770)的实现方在做「旧账本键响亮拒绝」时点名了这条: 它正是那条路上「读不出来 → 看起来没装」形态的**现成入口**。 既有行为,不是 `#758` 引入的,按边界未改。 同一份报告还指出:`docs/contracts/extension-package-lifecycle.md:19` 的交叉引用是**错的** —— 它说账本的 V3 形状(`packageGraphs` / `claims` / owner tokens)在 `extension-install-ledger.md`, 但那份文档**全文零处**提 graph / claim / V3(它是 REQ-100 时代的文档,V3 落地时没补章节)。 **一并在本票修掉**,否则下一个人会照那条引用去读一份不存在的章节。 ## Development plan 1. 先勘破:`readPackageGraphs()` 今天的生产消费方是谁? (`#758` 的报告说「目前只有测试」—— **自己用两条独立检索轴复核**,别照抄。) 2. 让它与 `readPackageLedgerStateV1` **对同一个损坏状态给出同一个答案**: 要么都响亮失败,要么都降级 —— **但降级必须是可观察的降级**,不能是空数组冒充「没有」。 3. 修正 `extension-package-lifecycle.md:19` 的交叉引用,指向真正描述 V3 形状的地方 (或补上 `extension-install-ledger.md` 缺的那一节 —— 走 `maintain-repository-docs`)。 ## Acceptance and named gates - 一条断言:**预置一本损坏账本 → 两条读路径给出一致的、可观察的失败**; 判据 = 把其中一条改回静默 `[]`,该断言必须红。 - 文档交叉引用:链接指向的目标**真的含那一节**(不是只解析得了 URL)。 ## 出处 `alpha-code#758`(PR #770)实现方报告,按边界未改。
Activity
[#773][CODE] 账本读不出来不再冒充「没装」——V3 三条只读路径共用一道读闸 (#1068)