=== receipt_card.py v3 · SELF-TEST（三个夹具，先看尺子会不会红）===

----- 夹具 A 差额>0 -----
=== receipt_card.py v3 · 双臂 + 一闸 ===
输入: fixture:A 差额>0
回执: requested=1 returned=1 tpc=1 len(tps)=1 caliber=selftest
[参考] 落盘件 633 字符 / 633 字节；bytes_written=0 equal=False
[臂一·单件] 被裁 1 枚：PASS 0 / SHORT 1 / OMITTED 0 / TORN 0 / MISSING 0；Σ差额=30 字符
  SHORT   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai0 delivered=10 total=40 差额=30 (== kept)
[臂二·批内] coverage(被裁件)=Σkept/Σtotal=10/40=0.2500 (25.00%)
[闸三·分配律] PASS q=10 r=0；kept 11×0 + 10×1；+1 集 total=[]（降序）；单侧为空，序关系自动成立
[闸四·数组层] PASS omitted_ids |seg|=16 预测=16 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 15 → 假红 -1）
[闸四·数组层] PASS unreadable_ids |seg|=19 预测=19 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 18 → 假红 -1）
[闸四·数组层] PASS truncation_points |seg|=206 预测=206 (n=1, Σ(inner+2)=184, 逗号=0)
判定: FAIL (exit 1)
[夹具 A 差额>0] exit=1 want=1 ok

----- 夹具 B tpc=0 -----
=== receipt_card.py v3 · 双臂 + 一闸 ===
输入: fixture:B tpc=0
回执: requested=1 returned=1 tpc=0 len(tps)=0 caliber=selftest
[参考] 落盘件 460 字符 / 460 字节；bytes_written=0 equal=False
[臂一·单件] N/A：truncation_points 为空，单件层无从量起（不是 0）
[臂二·批内] UNCOMPUTABLE：tpc=0 / truncation_points=0 枚 —— 覆盖度不可计算（不打印 0）
[闸三·分配律] UNCOMPUTABLE：tpc=0 / 无被裁件，q 与 r 无定义
[闸四·数组层] PASS omitted_ids |seg|=16 预测=16 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 15 → 假红 -1）
[闸四·数组层] PASS unreadable_ids |seg|=19 预测=19 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 18 → 假红 -1）
[闸四·数组层] PASS truncation_points |seg|=22 预测=22 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 21 → 假红 -1）
判定: UNCOMPUTABLE (exit 3)
[夹具 B tpc=0] exit=3 want=3 ok

----- 夹具 C 空数组 -----
=== receipt_card.py v3 · 双臂 + 一闸 ===
输入: fixture:C 空数组
回执: requested=1 returned=1 tpc=1 len(tps)=1 caliber=selftest
[参考] 落盘件 643 字符 / 643 字节；bytes_written=0 equal=False
[臂一·单件] 被裁 1 枚：PASS 1 / SHORT 0 / OMITTED 0 / TORN 0 / MISSING 0；Σ差额=0 字符
  PASS    cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccci0 delivered=20 total=20
[臂二·批内] coverage(被裁件)=Σkept/Σtotal=20/20=1.0000 (100.00%)
[闸三·分配律] PASS q=20 r=0；kept 21×0 + 20×1；+1 集 total=[]（降序）；单侧为空，序关系自动成立
[闸四·数组层] PASS omitted_ids |seg|=16 预测=16 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 15 → 假红 -1）
[闸四·数组层] PASS unreadable_ids |seg|=19 预测=19 (n=0, Σ(inner+2)=0, 逗号=0)；空数组 max 项=0（若漏 max 项 = 18 → 假红 -1）
[闸四·数组层] PASS truncation_points |seg|=206 预测=206 (n=1, Σ(inner+2)=184, 逗号=0)
判定: PASS (exit 0)
[夹具 C 空数组] exit=0 want=0 ok

[空数组演示] omitted_ids 直量=16；max 式=16（绿）；漏 max 式=15（差 -1 → 假红）

[SELFTEST] 全部命中：A=1 / B=3 / C=0；空数组漏 max 项差 -1
