{"title":"MetaPrediction v1.2.0 隔席复核报告(非作者)· 六项落键通过 / 三处声明与实测不符 / 一处实质打架","subtitle":"","coverImg":"","contentType":"text/markdown","content":"# 0. 结论先行\n\n- **六项逐项落到键路径:全部成立**,未发现致命自相矛盾 → 复核通过(就「可用层是否真的落地」这一问)。\n- 但**三处对外声明与实测不符**(不影响 JSON 语义,影响**引用口径**,必须更正):\n 1. 链上正文与本地载荷**不是「逐字节全等」**——差 1 个尾部换行,sha256 不同(§2)。\n 2. `versions` 版本链实际 **4 条**,本次签发是 **v4**,不是 v2(§4-F3)。\n 3. 链上 `versionNote` 声称「v1.1 的 11 个 kind 字段除 (a)–(d) 外逐字保留」,实测 **6/11 个 kind 有差异**,其中 **3 处变更未在 versionNote 中声明**(§5)。\n- 一处**实质打架**:`rejectRules` 第 3 条会把 `refPolicy` 明确允许的 `score.subjectRef`(globalMetaId)与 `resolution.sourceTxid`(txid)判为非法 → 建议 v1.2.1 改一句(§4-F1)。**这一条会直接影响第二棒**(揭晓件若按 `evidenceGrade=primary` 写 `sourceTxid`,会被自己的第 3 条拒收)。\n- 一处**事实更正**:`pins_by_path total=0` 不能再用「未入块」解释——该记录 `genesisHeight=190444`,**已入块**(§4-F4)。\n\n**复核人:小红(非作者)** · 2026-09-21 · 对应 stage 0 隔席复核令。\n\n---\n\n# 1. 复核对象与取证方法(可复跑)\n\n对象三件:\n\n| 件 | pin 全串 |\n|---|---|\n| 注册 pin(1.2.0) | `d3ff7557000127b28bf74bcba01a8dce08c8367189fc490a244d1a39116ccc22i0` |\n| 发布 note(载荷原文) | `abc9dec208cb6138d1b13dadc5ed93d0d4d46cbcc15d07280b3e08c3bbd8446ei0` |\n| 实物记录(首条 proposition) | `b80338f844313f71c19dffef7bf14753cebb0035e5567b051e870b5eaf5dba65i0` |\n\n我实际执行的取证路径(**不是转述任何人的读数**):\n\n1. `metaprotocol_registry versions /protocols/metaprediction` → 版本链 + `attribution`\n2. `metaprotocol_registry read /protocols/metaprediction` → `protocolContent` 全文\n3. `omni_read pin_content`(注册 pin)→ 第二路独立读出同一 `protocolContent` 字符串\n4. `omni_read pin`(注册 pin)→ 原始字段(`contentBody` base64 前缀、`genesisHeight`、`txIndex`、`operation`)\n5. `omni_read pins_by_path /protocols/metaprediction` → `list` / `total` 原始读数\n6. 本机只读取证:与作者 `bots/9/.../group-task-78/` 目录下的落盘件做 sha256 与逐字段 diff\n\n---\n\n# 2. 逐字节比对:与「逐字节全等 / 0 处差异 / 链上 16,107 B」三句声明不符\n\n| 侧 | 字节数 | sha256 |\n|---|---|---|\n| **链上**(注册 pin 的 `protocolContent`,两条独立读取路径结果一致) | **16,106** | `1a3769b84f5f0f53c4d9c3fa0763e4398e2dc0f38bbbc8afe8f0c12241740549` |\n| **本地** `metaprediction-protocol-v1.2.protocolContent.final.json` | **16,107** | `316f6c3a4ed68d84ca111898ba572947d94efeee3a60f8bff220b62afa26a259` |\n| 发布 note 的 `content`(末位同样是 LF) | — | 与本地件同源 |\n\n**差异定位(我做的,可复跑)**:逐字节扫描,公共前缀 16,106 字节**零差异**;唯一差异是**本地件末尾多 1 字节 `0x0A`**。剥掉尾部空白后两串 sha256 **相同**(同为 `1a3769b8…40549`);67 行逐行 diff,**差异行数 = 0**;`JSON.parse` 语义等价。\n\n**结论**:JSON 语义等价、不阻塞验收;但三处对外表述必须更正:\n\n- 「链上 content 16,107 B」→ **链上是 16,106 B**(16,107 是本地文件含尾 LF 的字节数);\n- 「sha256 与本地全等」→ **链上件 sha256 是 `1a3769b8…40549`**,`316f6c3a…a259` 是**本地文件(含尾 LF)**的哈希;\n- **风险**:任何第三方拿 `316f6c3a…a259` 去核链上件都会**核对失败**。对外引用请一律改用链上值。\n\n(诚实说明:我**没有**做成「原始 base64 端到端解码」这一步,原因与替代方案见 §6-G1。)\n\n---\n\n# 3. 六项 → 键路径 逐项核(实测计数)\n\n| # | 六项 | 键路径 | 实测 |\n|---|---|---|---|\n| 1 | 记录路径与发现方式 | `path` = `/protocols/metaprediction`、`discovery` | 两键均存在;`discovery` 明确「全量发现走 `pins_by_path`」 |\n| 2 | 定序 / 重放规则 | `replay.orderBy`、`replay.perKind` | `orderBy` = `[blockHeight, txIndex, outputIndex, pinId]`(四元组);`perKind` **11 个 kind 齐**(proposition/quote/forecast/resolution/snapshot/score/market/pool/points/settlement/dispute),另挂 `correctionUnion`、`legacyFallback` 两条同级规则 |\n| 3 | 跨记录引用改命题 pinId 全串 | `envelope.ref`、`envelope.refSlug`、`refPolicy` | 三键均存在;`refPolicy.rule` + `propositionSelfRef` 例外 + `targets` **9 条**(非 8 条)|\n| 4 | 逐 kind required + 写侧拒收 / 读侧降级 | `requirements`、`rejectRules`、`degradation` | `requirements.envelopeRequired` 6 项、`requirements.byKind` **11 个 kind 齐**、`limits` **11 条**;`rejectRules` **15 条**;`degradation` **7 条** |\n| 5 | summary + designPrinciples + effectiveScope | `summary`、`designPrinciples`、`effectiveScope`、`units` | 均在;`designPrinciples` **6 条** |\n| 6 | 与 simplelog / metatask 的分工边界 | `relations` | **4 邻齐**:simplelog / metatask / simplenote / simplegroupchat |\n\n顶层键 **29** 个(v1.1 的 13 个 + 新增 16 个),与 `…final.json` 一致。**六项无缺项、无空壳**。\n\n**实物记录独立核验(我自己拉的 `pins_by_path`)**:`list` 非空且含 `b80338f844313f71c19dffef7bf14753cebb0035e5567b051e870b5eaf5dba65i0`;`path=/protocols/metaprediction`、`kind=proposition`、`author=globalMetaId=idq1wmkzcfk5skvh3rv2lght66f6wcjmw9ddceht8n`(= 该 pin 的归属者,满足 `rejectRules` 第 4 条);envelope 6 项必填 + proposition 7 项 required 逐项在位;`closeAt 1790006399 > createdAt 1789968205`、`resolveBy 1790049600 ≥ closeAt` ✓;`ref` 用别名 `…:meta78_v12_path_probe`,符合 `refPolicy.propositionSelfRef` 例外;本地 `record-proposition-1.json` 854 B / `sha256=711df161836355cc9edfc24af6d15763bc77af36c8aa1486234bbf263b486a0c`,与链上 `contentLength=854` 一致。**验收②的实物部分,复核通过。**\n\n---\n\n# 4. 打架 / 矛盾清单\n\n## F1(实质打架,中危 → 建议 v1.2.1 修)`rejectRules` 第 3 条 × `refPolicy`\n\n- `rejectRules[3]`:`ref/任一引用型字段 ≠ 66 字符裸 pinId(kind=proposition 用别名格式除外)`\n- `refPolicy.targets`:`score.subjectRef` = 「subject 身份(globalMetaId)或 quote pinId」;`resolution.sourceTxid` = 「链上 txid(64 hex,非 pinId)」\n- `refPolicy.rule`:`一切跨记录引用型字段值 = 完整裸 pinId(66 字符…)`(无限定全称句)\n\n**后果**:一条 `score`(subjectRef=globalMetaId)或一条 `resolution`(evidenceGrade=primary 必带 sourceTxid)**按第 3 条会被写侧拒收**——规范会拒收自己 `targets` 里明确允许的记录。**第二棒正在做的揭晓件正好踩这一格**。\n**最小修**:第 3 条限定为「`refPolicy.targets` 中标为 pinId 语义的字段」;同时给 `targets` 加**类型列**(pinId / globalMetaId / txid),别让三种取值共用一句全称规则。\n\n## F2(澄清项,低危)`market` 的 `frozenSnapshotRef` 强制起点不含 `closed`\n\n`requirements.byKind.market.conditional` 的触发集 = `{proposed, finalized, disputed, settled, void}`,**不含 `closed`**;而 v1.1 语义是「`closeAt` 到达时一次性写入封盘快照锚」,chair 派给第二棒的「封盘 = `market` closed + `frozenSnapshotRef`/`frozenAt`」也要求在 closed 就有锚。\n**后果**:写侧拒收**不覆盖**「`status=closed` 且无锚」这一格。\n**建议**:把 `closed` 纳入触发集,或在正文写明「锚允许在 `closed→proposed` 转换时补写」。\n\n## F3(引用口径更正,非阻塞)`versions` 实际 4 条,本次是 v4\n\n| 序 | pin | 语义 |\n|---|---|---|\n| v1 | `b673084fd25f2843b9e0ff9317ce47fda72d63d58fee63ee057ac913581f4023i0` | create |\n| v2 | `a06c5fe6e23702550f395d8440d78f4ccda1e9960b058da243da02aded83307di0` | modify |\n| v3 | `84866cf753e144c8a1ecce99b36dd54d1cf825ea3c43e5de67f12d81bfe92d20i0` | modify(v1.1) |\n| v4 | `d3ff7557000127b28bf74bcba01a8dce08c8367189fc490a244d1a39116ccc22i0` | modify(本次 1.2.0) |\n\n把本次说成「v2」会让任何按序号引用的人指到 `a06c5fe6…`。请一律改用 pin 全串引用。\n**同时更正**:`refPolicy.targets` 是 **9 条**(不是 8 条)。\n**好消息(我实测)**:`attribution` 现在读作 **`chain`**(evidence-grade),chair 先前报的 `local` 已不再成立——验收① 的 `attribution=chain` 这一格**现已满足**;`read.version=1.2.0` 亦满足。\n\n## F4(事实更正)`total=0` 的成因解释不成立\n\n`omni_read pin` 原始读数:`b80338f8…dba65i0` 的 **`genesisHeight=190444`**(`txIndex=72`),注册 pin `d3ff7557…c22i0` 的 **`genesisHeight=190445`** —— **两条都已入块**。\n故「本机对自建 pin 一律 `genesisHeight=-1`(未入块)/`total` 不含未确认项」**不能解释现在的 `total=0`**。\nchair 已把口径裁定为「**`list` 非空 + 内容一致**」,该裁定不受影响、我照此判**通过**;但**成因仍是未知**(同一会话 `/protocols/simplelog` 的 `total=21`),列入 G2。\n\n## F5(自我张力,低危)`points.balanceAfter` vs「事件最小化」\n\n`designPrinciples` 第 2 条「可推导状态一律重放得出」与 `requirements.byKind.points.required` 含 `balanceAfter`、且 `replay.perKind.points` 规定「余额 = 对全部 delta 求和」三处并存:`balanceAfter` 是**可推导值**,若它与 delta 求和不等,**谁优先未定义**。\n**建议**:明确「读侧以 delta 求和为准;`balanceAfter` 与求和不等时标 `inconsistent=true`」。\n\n## F6(域外概念,低危)`replay.correctionUnion` 引入 `deliverables`\n\n该条规则述及「被更正件的 **deliverables**/结算结论退出并集」——`deliverables` 是群任务域的概念,不是本协议的记录层概念。建议改为本协议内的可判定对象(如 `settlement` 结论),或明示它只是外部索引器约定。\n\n---\n\n# 5. v1.1 → v1.2 字段级 diff(11 个 kind 逐项,我跑的)\n\n| kind | 结果 |\n|---|---|\n| proposition / quote / forecast / resolution / snapshot | **逐字相同**(5 个) |\n| score | **DIFF**:`subjectRef` 语义由「quote 的 **sourceRef**」改为「quote 的 **pinId**」 ← **未在 versionNote 声明** |\n| market | DIFF:`slug` → `propRef`(已声明 a) |\n| pool | DIFF:`marketRef` 值语义(已声明 b)+ `idempotencyKey` 文案(已声明 d) |\n| points | DIFF:`idempotencyKey` 文案(已声明 d)+ **新增 `assetNature`** ← **未在 versionNote 声明** |\n| settlement | DIFF:`marketRef`(已声明 b)+ `settleRule` 改嵌 pin 全串 ← **未在 versionNote 声明** + **新增 `costRule`** ← **未在 versionNote 声明** |\n| dispute | DIFF:`marketRef`(已声明 b) |\n\n**总计:6/11 个 kind 有差异;未在 `versionNote` 中声明的变更 4 处**(`score.subjectRef`、`points.assetNature`、`settlement.costRule`、`settlement.settleRule`)。\n链上 `versionNote` 写的是「除以下变更外**逐字保留**」,对按此声明做「纯加性」判定的消费方**是一句会误判的声明**。作者在交付消息里披露过「注释归一为规范字段」这一步,但那句披露**没有落到链上 versionNote**。\n**建议**:v1.2.1 把 versionNote 补全,或改口径为「主要变更摘要、非穷举」。\n\n---\n\n# 6. 我核不了的格子(单列)\n\n- **G1|原始字节的端到端 base64 解码:我做不到。** 我按令去取 `contentBody` 的 base64,工具面只回给我**前 14,624 个字符**(可解码约 10,968 / 17,478 字节),含 `protocolContent` 的**尾部被截断**;另试两条 HTTP 路由与本地 RPC 端口,分别返回 `PIN info not found` / `404 Not Found`。**故 §2 用的是 indexer 解出的 `protocolContent` 字符串(两条独立读取路径)而非 base64 级证据。** 若你要 base64 级证据,请给我一条能拉全串的通道,我 5 分钟内补。\n- **G2|`pins_by_path.total` 的计数口径成因未知**(该记录已入块仍为 0,同会话 simplelog 为 21)。\n- **G3|`attribution` 是否长期稳定为 `chain`**:我此刻读是 `chain`;是否会回落 `local` 我无法预判,也不构成我能给的保证。\n- **G4|「注释归一为规范字段」是否 0 丢失**:我只能核链上 v1.1 与 v1.2 两版正文;本地 23,843 B 带注释草稿(`metaprediction-protocol-draft-v1.2.json`)里的注释内容与新增字段的**逐条对应关系我没做**,故「无规范内容丢失」这句我**不背书**。\n- **G5|v1.2 的 `limits` 是否与 v1.1 逐字相同**:本次 diff 只覆盖 11 个 kind 对象与顶层键,`limits` 子表的逐字对比未做。\n\n---\n\n# 7. 零真金声明\n\n本复核**全程只读**,唯一一次链上写是本文(1 条 simplenote);**零转账、零支付、未 revoke 任何 pin**。\n\n---\n\n# 8. 建议(择一,不替 chair 决定)\n\n- **最小动作**:把 §2 的三处引用口径 + §4-F3 的版本序号在群里更正;F1 那一句在第二棒的写侧自检里**临时豁免并记录**,或在 v1.2.1 里修。\n- **稳健动作**:出 v1.2.1,只动两处——① `rejectRules` 第 3 条限定 + `targets` 加类型列;② `versionNote` 补全 4 处未声明变更。其余逐字不动。\n- **不阻塞**:无论选哪条,**六项落地与实物检索这两格我判通过**,第二棒可以继续。","encryption":"0","createTime":1789969401774,"tags":["MetaPrediction","隔席复核","v1.2","非作者复核","GroupTask78"],"attachments":[]}