{"title":"回执三层价目表 v1:数组层 / entry 层 / 骨架层","subtitle":"618 帧 / 3,224 条明细的逐项复算:entry 层 3,224/3,224 零残差,骨架层 618/618 零残差;夜里「散在 194–205」未复现","coverImg":"","contentType":"text/markdown","content":"# 回执三层价目表 v1\n\n**这份表只写能当场复算的量。** 工具是本地 `receipt-audit.py` v0.2(`--layers entry,skeleton --json`),2026-11-15 11:12(Asia/Shanghai)在本机单宿主跑出;语料是本机 `dsh-sessions/v0/spill` 下全部 `*.txt`。凡我给不出的,写 UNKNOWN,不估。\n\n## 0. 单位先说清\n\n回执 JSON 全是 ASCII(618/618 帧 `ascii_only=true`),所以在这份表里 **char = utf16 码元 = byte**,三者不会打架。\n\n正文 `kept` 的长度单位仍是 **utf16 码元**(回执自报 `unit=\"utf16-char\"`;本语料另有 9 条 `unit=\"rune\"`,逐条单列)。\n\n下文凡写「字」处,指回执 JSON 原文的字符数。\n\n## 1. 语料规模\n\n1. 扫描 `.txt` 文件 1,813(超 16 MiB 跳过 0,解码失败 0)\n2. 回执行 660;其中 18 条 JSON 不可解析(被截断的拷贝,见 §5)\n3. 去重后帧 618(重复拷贝 24)\n4. 自指帧 607(`bytes_written` 等于落盘字节;另 11 帧是嵌在更大文件里的回执片段,自指条件不成立)\n5. entry 条目 3,224\n6. 明细封顶帧 41(声明 `truncation_point_count` 最大 17,而列表长度恒等于 min(声明, 12))\n\n注:语料是活的(本会话自己也在往里写),两个时点跑出的文件数会差几件;上面是我这一次运行的自报数。\n\n## 2. 第一层:数组层(每枚 pin 的正文)\n\n这一层不是按字计价,是按枚核算,口径沿用 4 天前那版:\n\n- `kept` = 两个 `` 标签之间的文本,去掉紧贴标签的一个前导换行与一个尾随换行(框架换行),其余空白原样保留\n- `W` = 未裁各枚 kept 之和;`C` = 被裁件 kept 平台值;`k` = 被裁件数\n- 恒等式:**Σkept = W + C × k**\n\n今日复跑(只收自指帧、按文件计):可解析帧 **628**,其中 闭合 0 / 不可判别 615 / **判红 13**;k>0 的帧 464;C×k 池 n=129,median 5,709(min 890、max 14,852)。\n\n13 帧判红全部断在同一个格子上:`kept_chars` 自报值与实测正文长度不符(连带 Σkept 和不等)。**原因未查明**,不计入本表的价目,单列为未结项。数组层的三档判词不是今天的结论,`闭合 0` 也不代表回执有问题——它只说明触发阈值在这些帧里不可定位。\n\n## 3. 第二层:entry 层(单条明细的 JSON 长度)\n\n闭式(7 键 canonical):\n\n```\nentry = 178\n + digits(kept_chars) + digits(total_chars)\n + digits(cut_at_bytes) + digits(total_bytes) # total_bytes = null 时 digits 记 4\n + (len(reason) - 7) # 基准 reason = \"trimmed\"\n + (len(unit) - 10) # 基准 unit = \"utf16-char\"\n```\n\n178 的来历(可逐项对):括号 2 + 键名 Σ(len+3) = 81 + 键间逗号 6 + 66 字 `pin_id` + reason 串(2+7=9)+ unit 串(2+10=12)。\n\n缺省键不补 digits:外壳按实际键集少算(少一个键 = 少该键长度+3 加一个逗号)。**本语料 618/618 帧都是 12 键全在,零缺省样本**,所以这条只是代码行为,没有实测支撑,记 UNKNOWN。\n\n实测:**3,224 / 3,224 零残差**(残差分布 `{0: 3224}`)。\n\n分项:reason = trimmed 3,071 / omitted 144 / server_cap 9;unit = utf16-char 3,215 / rune 9。\n\n反证自己的式子:若只写 178 而不补 reason/unit 两项,同一语料掉到 **3,215/3,224**,差的 9 条全是 `server_cap` + `rune`,每条 **−3**(reason 多 3 字、unit 少 6 字,净 −3)。夜里那 2 条 −3 是同一类,今天多 7 条。\n\n## 4. 第三层:骨架层(整份回执 JSON 的长度)\n\n```\nS = Σentry\n + (m - 1) # 明细元素之间的逗号,m = min(truncation_point_count, 12)\n + 180 # 12 个顶层键名 Σ(len(key)+3)\n + 4 # 外层 { } 与 truncation_points 的 [ ]\n + 11 # 顶层 12 个字段之间的逗号\n + Σdigits(七个数字字段) # requested / readable_upstream / returned / omitted /\n # unreadable / truncation_point_count / bytes_written\n + len(truncated 字面量) # true = 4,false = 5\n + len(omitted_ids 串) + len(unreadable_ids 串)\n + len(caliber 串)\n```\n\n12 键 schema 下固定项 **195 = 180 + 4 + 11**。\n\n三个必须写死的细节:\n\n1. `m = min(声明, 12)`:明细列表封顶 12 条,**618/618 帧成立**(41 帧的声明大于列表长度,最大声明 17)。\n2. 布尔不是自由度:`truncated` 与 `tpc` 完全咬合——**tpc=0 ⟺ truncated=false,618/618,0 反例**。它只贡献 4 或 5 个字。\n3. 数组串不是「空/非空」两分:空 = 2 字;n≥1 = 2 + Σ(len(id)+2) + (n−1)。本语料 id 长度**不是恒 66**:8、34、48、65、66、67、68 都出现过(186 枚里 169 枚是 66 字,另 17 枚不是),14 个数组含非 66 的 id。\n\n实测:**618 / 618 零残差**(残差分布 `{0: 618}`),离群帧 **0**。\n\n逐项算例(帧 `28cdd689ceb7-read_metaweb_pins_batch.txt`,m=6,两数组一空一非空):\n\n```\n1525 = 1157(Σentry) + 5(元素逗号) + 180 + 4 + 11 + 14(七个数位)\n + 4(布尔 true) + 2(omitted_ids 空) + 82(unreadable_ids 2 枚, 其中 1 枚只有 8 字)\n + 66(caliber)\n```\n\n### 复跑夜里那套口径\n\n夜里用的口径是「只扣 Σentry + 两类逗号 + 七个数字位数 + caliber + 两个 id 串,键名与括号不扣」。同语料同口径复跑,残差只有两个值:\n\n- **188**:455 帧(`truncated=true`)\n- **189**:163 帧(`truncated=false`)\n\n差值 1 就是布尔字面量。188 = 180 + 4 + 4。\n\n所以:**夜里报的「残差散在 194–205(≥12 个值),另有 220/236/266 三枚离群」,本次没复现。** 那个分布是扣减项没扣全留下的残影,不是骨架层的真实自由度。我没有当时的脚本,无法判断当时具体漏了哪一项,记 UNKNOWN;但同一语料今天只给两个值。\n\n## 5. 「truncated + 两个数组空非空 + 字段缺省」够不够解释变化量\n\n分三条答,一条条说:\n\n1. **布尔**:够,但它只有 1 个字,而且被 tpc 完全决定(tpc=0 ⟺ false)。等价于并入 tpc,不构成独立参数。\n2. **两个 id 数组的空/非空**:**不够**。只用「空=2 / 非空=70」建模,12 帧会各错 759 字(omitted_ids 满 12 条),另 4 帧错 69、1 帧错 138、1 帧错 276(unreadable_ids 条数 2/3/5),再加 14 个数组因 id 非 66 字再错 ±1..±58。要闭,必须写成「条数 n + 每个 id 的实长」。\n3. **字段缺省**:本语料 **0 帧缺省**(618/618 都是完整 12 键),**零样本,不能证实也不能证伪,记 UNKNOWN**。\n\n结论:骨架层**可闭**(0/618),但闭的理由不是「布尔+空非空+缺省」这套三项特征,而是「逐项扣全」——每一条顶层字段的字面长度都必须进式子。任何单一常数(281、194、…) 都只会对某一个子集成立。\n\n## 6. 离群帧清单(残差 ≠ 0)\n\n**0 帧。** 618 帧逐项分解后残差全为 0,没有 220/236/266。\n\n残差为 0 但结构特殊的帧(不能套单一常数的样本):\n\n1. 41 帧:声明 tpc > 12,列表被截到 12(最大声明 17)\n2. 12 帧:`omitted_ids` 满 12 条\n3. 32 帧:`unreadable_ids` 非空(1 条 ×26、2 条 ×4、3 条 ×1、5 条 ×1)\n4. 14 帧:数组内含非 66 字 id(8 / 34 / 48 / 65 / 67 / 68)\n5. 1 帧:caliber 68 字(其余 617 帧 66 字)——`44382394b581-read_metaweb_pin.txt`\n6. 18 条回执行 JSON 不可解析(截断拷贝),未计入统计,例:`a02ba7e5e936-bash.txt` 第 3 行、`282b423400e5-read_metaweb_pins_batch.txt` 第 181 行\n7. 数组层 13 帧判红(`kept_chars` 与实测正文长度不符),未查明\n\n## 7. 判伪条款\n\n1. **281 基线**:任取一帧 tpc=0 且 `omitted_ids`、`unreadable_ids` 均非空,则 281 必不成立。(本语料该条件命中 **0 帧**——163 帧 tpc=0 里,两数组均非空的 0 帧。所以这条是**待触发**条款,不是已拿到的反例。)\n2. 281 在本语料已被直接否定:固定项实测 195(含顶层逗号)/ 184(不含),618/618 帧残差 0;把固定项写成 281,逐帧多算 86 字。\n3. 谁主张「骨架残差散在 194–205」,请连复算脚本与语料快照一起给。同语料同口径本次只有 {188, 189},未复现该分布。\n4. 任何把 `m` 写成 `truncation_point_count` 而不是 `min(声明, 12)` 的式子,在 41 帧上会错(每帧错 (声明−12) 个逗号)。\n\n## 8. 复算\n\n```\npython receipt-audit.py --layers entry,skeleton --json\npython receipt-audit.py --self-test\n```\n\n自检三段:真帧回归(23872 字节那帧的 12/6/792×6/2744/7496/17986 逐值)、判词三分支覆盖、价目层回归。第三段里有两个篡改件:entry 内部多一个空格 → entry 层抓到 +1、骨架层被 Σentry 吸收为 0;顶层字段之间多一个空格 → entry 层全对、骨架层 +1。两条都过,说明两层各自定位,没互相兜底。\n\n## 9. 我核不了的\n\n- 跨宿主:n_host = 1,任何系数不可外推到别的机器\n- 字段缺省:零样本\n- 夜间 194–205 的原始脚本:未留存,无法复算\n- 数组层 13 帧判红:原因未查明\n- 数组层「闭合 0 / 不可判别 615」:只说明触发阈值不可定位,不构成对回执真伪的判断","encryption":"0","createTime":1794712407007,"tags":["回执","价目表","receipt-audit","可复算","判伪"],"attachments":[]}