# AI_Sunny 独立实证核验报告 > 任务:「双身份 BUZZ MetaApp:自然人与 MetaBot 共话」 > 执行:AI_Sunny(S2/S3/S4 独立实证 · 无桥环境 + 桥模式路径证据) > 日期:2026-08-13 11:36(Asia/Shanghai) > 被验对象:`dual-identity-buzz`(index.html + APP.md),链上交付 ZIP pin `cc60c19480a7ce2da9d642c00274a66ace51e6bb97b7402d30506921917f63d4i0` > 本报告全部结论由本会话**真实执行**的 curl / playwright / IDBots Bot Browser RPC / 宿主日志取证得出。 --- ## 0. 交付物一致性(前置核验) - 链上 ZIP 已解码解包:`application/zip;binary`,9593 字节,含 `dual-identity-buzz/index.html` + `APP.md` - ZIP 内 index.html md5 = `46f5b101126610b47c2ddeef1dff2e15`,与本机实现目录**完全一致** - **结论:本报告全部实证精确适用于链上交付物。** --- ## 1. 桥模式实证(S2 路径证据,真实链上) ### 1.1 环境(实测) - 本机 IDBots dev 实例运行中(Electron + vite 127.0.0.1:5175) - Bot Browser RPC(127.0.0.1:31200)`get-tabs` 实测返回:3 个 tab 均为 `preview-metaapp://localhost/Users/tusm/idbots/project/bots/15/2026-08-13/dual-identity-buzz`,**active tab actorId=`idbots-metabot-1`**(= AI_Sunny,即当前 Bot Browser 身份) - 真实导航:经宿主工具导航 preview URI 到真实 Bot Browser(非伪造) ### 1.2 写链链路(宿主签名日志取证 `~/Library/Application Support/IDBots/metaid-rpc.log`) | 时间(本地) | 事件 | 关键值 | |---|---|---| | 11:20:36 | Queueing governed MVC createPin job | metabot_id=1, action=`createPin:/protocols/simplebuzz` | | 11:20:39 | createPin success | **pinId=`9ed8748e…2767ec3i0`** | | 11:23:05 | Queueing governed MVC createPin job | metabot_id=1, action=`createPin:/protocols/simplebuzz` | | 11:23:09 | createPin success | **pinId=`93e2cd6d…d9337i0`**(UTXO 花的上一条找零 → 同钱包连续签名实证) | - 页面侧 B1–B6 由预览页自动执行链路触发(源码核验:与「发布」按钮点击同一函数,`runAuto → stepB5 === btnPost handler → stepB5`),宿主确认卡片批准后进入 governed 签名队列 - 请求与签名入队存在分钟级间隔 → **与宿主两阶段确认流程吻合**(`writeMetaIdPin` 无授权时走 `issuePinWriteConfirmation`,源码核验) ### 1.3 链上回读(按 metaid 过滤,非 hash 直达) ``` GET https://show.now/man/social/buzz/newest?metaid=2eb21238314aca030b67ed7b7c4c613f2e8cb7e42ee9140589a4df9da3854aa2&size=1 → data.list[0]: path = /protocols/simplebuzz ✓ contentType = application/json;utf-8 ✓ metaid = 2eb21238…(当前 Bot 的 legacy metaid) ✓ JSON.parse(content).content === '[S2实证] 双身份BUZZ Bot模式 2026-08-13T03:22:35.823Z' ✓(信封解析,chair 注记-2) address = 1GrqX7K9jdnUor8hAoAfDx99uFH2tT75Za = 当前 Bot(AI_Sunny)钱包 ✓ pinId = 93e2cd6d…d9337i0(与宿主日志一致) ``` **B-A1 ✓ / R-A2 ✓**(真实 Bot Browser 链路 → 宿主签名 → 链上按 metaid 回读,内容逐字一致) ### 1.4 B4 browser.permissions.request 实际返回(交叉核验) - **Builder阿码 OCR 取证**:`{code:"consent_denied", message:"The requested protocol path is not on the host whitelist: /protocols/simplebuzz"}` - **我的独立源码核验(botBrowserBridgeService.ts)**:`PROTOCOL_GRANT_WHITELIST = {simplegroupcreate, simplegroupjoin, simplegroupchat}`,**不含 /protocols/simplebuzz** → B4 必然 `consent_denied` - **两路交叉一致**:本构建下免确认授权不可得,B5 恒走宿主手动确认(`issuePinWriteConfirmation`);S1 待实证备注由此闭合(实际返回既非 granted 也非 unsupported_method,而是**白名单拒绝**,规格 fallback 设计已覆盖此形态) ### 1.5 B-A2 身份切换 - 实现已订阅 `browser.actor.changed` 并同步更新署名(源码核验);宿主侧真实切换需 UI 操作(本会话无 DOM 交互通道,Bot Browser RPC 仅暴露 open/tabs),留待 @WuFenGBot / owner 桥侧补测。 --- ## 2. 无桥环境实证(playwright 普通浏览器) ### 2.1 真实场景(交付物原样,Chrome 内核无宿主无钱包) | 断言 | 结果 | 实测证据 | |---|---|---| | P-A1 无桥显示「连接钱包」 | **FAIL** | 徽标显示「桥模式」;btnConnect `hidden=true` | | D-A1 无桥无钱包禁用+固定文案 | **FAIL** | btnPublish/composer `disabled=false`;modeNotice 为空;btnRetry 隐藏;identityBox 永久「检测中…」 | | 点击发布 | 异常态 | 报「发布失败:当前为只读模式」(徽标桥模式但发布被拒的矛盾状态) | | feed 浏览 | **PASS** | 20 条正常加载(R-A1 在应用内可用) | **根因(源码 + 运行时双重确认)**:页面内置的 AgentBrowser shim **无条件**安装 `window.AgentBrowser.request`(`window.parent === window` 的顶层窗口也装),`isBridge()` 恒为 true;且 `checkActor()` 无超时 → B2 请求永不返回 → 永久「检测中…」。 **修复建议(供实现方)**:`isBridge()` 增加宿主判定(如 `window.parent !== window` 或宿主握手/能力探测),或给 `browser.actor.current` 加超时(超时 → 降级只读)。此修复是 P-A1/D-A1/W-A2 通过的前提。 ### 2.2 逻辑验证变体(测试脚手架仅移除 shim,其余代码原样;源码见本机 `/Users/tusm/idbots/project/bots/1/2026-08-13/nobridge-test/`) | 断言 | 结果 | 实测证据 | |---|---|---| | D-A1 只读降级 | **PASS** | 徽标「只读」;btnPublish/composer disabled;固定文案逐字一致「当前环境不支持发帖:请在 IDBots Bot Browser 中使用,或安装 Metalet 钱包」;btnRetry 可见;feed 20 条可浏览 | | P-A1 钱包侧 | **PASS** | 徽标「真人模式」;btnConnect 可见;未连接时 btnPublish/composer disabled;identityBox「未连接」 | | W-A2 拒绝授权无写入 | **PASS** | mock `connect()` 拒绝 → connectCalls=1、inscribeCalls=**0**、状态保持未连接、发布仍禁用、无崩溃;日志如实记录「连接钱包失败(W-A2 形态:拒绝授权则无写入)」 | | C-A1 真人侧 payload | **PASS** | `btc.inscribe` 实参捕获 = 规格 §4.2 **逐字段一致**:feeRate=1 / revealOutValue=546 / changeAddress=连接地址 / metaidDataList[0] 七元组(operation=create, path=/protocols/simplebuzz, body=UTF-8 JSON 信封, contentType=application/json, encoding=utf-8, encryption=0, version=1.0.0)/ options.noBroadcast=false | | C-A2 空白内容守卫 | **PASS** | 纯空白点发布 → 「内容为空,未发起请求(C-A2)」,inscribe 调用数不变 | | D-A2 重试恢复 | **PASS** | 只读态安装钱包 → 点「重试」→ 徽标「真人模式」、发布解除禁用、日志「恢复写链能力(wallet)」 | --- ## 3. 断言汇总 | 断言 | 结果 | 说明 | |---|---|---| | B-A1 | ✅ PASS | 真实 Bot Browser 链路 → 链上按 metaid 回读内容一致,作者=当前 Bot | | R-A2 | ✅ PASS | 同 B-A1(60s 窗口内回读) | | R-A1 | ✅ PASS | curl 实测(含 Accept: application/json 要求、301 跟随、信封结构) | | B4 实际返回 | ✅ 已闭合 | consent_denied(OCR + 源码双路一致) | | P-A1 | ⚠️ 部分 | 无桥原样 FAIL(幻影桥);逻辑中和变体 PASS | | D-A1 | ⚠️ 部分 | 无桥原样 FAIL(幻影桥);中和变体 PASS | | W-A2 | ✅ PASS | 拒绝授权零写入(mock 钱包模拟) | | C-A1 真人侧 | ✅ PASS | inscribe 实参逐字段符合 §4.2 | | C-A2 | ✅ PASS | 空白内容零调用 | | D-A2 | ✅ PASS | 重试恢复路径实测 | | B-A2 | ⏳ 未独立实测 | 源码级通过(订阅+署名更新);宿主侧切换待 UI 操作补测 | | W-A1 | ⏳ 待真人 | 需真实 Metalet,由 @WuFenGBot 实测清单 T1–T6 覆盖 | **唯一阻塞项(一处缺陷)**:AgentBrowser shim 无条件安装导致无桥环境误判桥模式 → P-A1/D-A1 在真实普通浏览器下不满足。修复建议见 §2.1。其余逻辑全部通过。 --- ## 5. v1.1 修复复测(2026-08-13 11:47,链上 ZIP metafile://3d22a714…cc49bi0,md5=dd6a17a8) ### 5.1 无桥环境复测(真实普通浏览器,交付物原样)— **P-A1/D-A1 修复生效** | 断言 | 结果 | 实测证据 | |---|---|---| | P-A1 无桥不误判桥模式 | **PASS** | 徽标「只读」;`window.AgentBrowser.__isShim=true`;不再出现「桥模式」误判 | | D-A1 禁用+固定文案 | **PASS** | btnPublish/composer disabled;固定文案逐字一致;btnRetry 可见;无「检测中」挂起(直接降级) | | feed | **PASS** | 20 条正常加载 | | P-A1 钱包侧(mock 注入) | **PASS** | 徽标「真人模式」、btnConnect 可见、未连接时发布禁用 | | W-A2 拒绝授权 | **PASS** | connect 拒绝 → connectCalls=1、inscribeCalls=0、状态保持未连接 | ### 5.2 回归发现 F-REG-1(阻塞级):`__isShim` 判别器误杀真实宿主桥模式 **现象(实测)**:v1.1 在模拟 ABC 宿主 iframe 中(父页面如实响应 `agent-browser:request`、`window.parent !== window`)→ 徽标「**只读**」,桥模式路径(actor.current / pin.write)完全不可达。 **根因(源码 + 运行时双重证实)**: - 真实 IDBots 宿主**从不向 MetaApp iframe 注入 `window.AgentBrowser`**:预览服务原样返回源码 HTML(20835 字节,无包装注入,实测 curl 差分);ABC(agent-browser-ui)仅监听 iframe 的 `agent-browser:request` postMessage(browserClientScript.js L311 / app.js L2310),无 contentWindow.AgentBrowser 赋值痕迹;RPC get-content 显示 MetaApp iframe 为纯 `src=` 加载。 - 即:**真实宿主中 bridge 通道 = 页面 shim 自装 + postMessage 上行**(S2 三条实证帖即此通道产出)。 - v1.1 的 `isBridge()` 以「无 __isShim 标记」判桥 → shim 自装必有标记 → 真实宿主 iframe 内恒判「非桥」→ **B 系列在真实 Bot Browser 中失效**。 **修复建议(供实现方)**:`isBridge()` 改用 **iframe 上下文判别**:`window.parent !== window && typeof window.AgentBrowser.request === 'function'`(真实宿主中 MetaApp 恒在 browser-html-frame iframe 内;顶层普通浏览器 parent===self → 自然落入钱包/只读路径)。保留 5s actor 超时作兜底(嵌入非 ABC iframe 时超时降级只读)。`__isShim` 可保留但不应单独作为否定判据。 **结论**:v1.1 修复闭合了无桥缺陷(§5.1 全过),但引入桥模式回归(§5.2)。两者需一并修正后,P-A1/D-A1/W-A2 与 B 系列方可同时成立。 --- ## 6. v1.2 官方版复测(2026-08-13 11:56,链上 ZIP metafile://f0c3bc52…5315fi0,md5=ffc10ac0,作者=Builder阿码) **判别器核验**(源码级):`isBridge() = window.parent !== window && typeof window.AgentBrowser === 'object' && typeof window.AgentBrowser.request === 'function'`(L174–181)——与共识方案逐字一致;`__isShim` 降级为调试标记(L98),不再参与判定。 **四场景实测(本会话 playwright 真实执行)全部 PASS**: | 场景 | 实测结果 | 断言 | |---|---|---| | ① 顶层无桥无钱包 | 只读 + 双禁用 + 固定文案逐字一致 + 重试可见 + feed 20 条 | P-A1/D-A1 ✓ | | ② 模拟宿主 iframe(父页面响应 bridge) | **桥模式** + 身份区显示 actor(globalMetaId+name)+ 发布/授权按钮启用 + feed 20 条 | **F-REG-1 修复 ✓** | | ③ 顶层无桥+钱包 | 真人模式 + 连接钱包可见 + 未连接时发布禁用 + feed 20 条 | P-A1 钱包侧 ✓ | | ④ W-A2 拒绝授权 | connect 拒绝 → connectCalls=1 / inscribeCalls=0 / 状态保持未连接 / 不崩溃 | W-A2 ✓ | **结论**:v1.2 同时闭合 无桥缺陷(P-A1/D-A1)与 F-REG-1(真实宿主桥模式)。B 系列通道判别已恢复为规范形态(shim 自装 + postMessage 上行,与 S2 三条实证帖同一通道)。真实 Bot Browser 内的最终验证建议由 owner 打开 v1.2 预览确认徽标「桥模式」+ 身份区显示当前 Bot(或 WuFenGBot 桥侧截图),作为 S5 前最后一道真实环境确认。 --- ## 4. 边界与说明(如实) - 桥模式实证中页面 B1–B6 由预览页自动执行触发(与按钮点击同一函数,源码核验);「真人手指点击」动作本会话无 DOM 交互通道(Bot Browser RPC 仅 open/tabs),如需严格人工点击可由 owner 在宿主点一次「发布」补强。 - 无桥 W-A2/C-A1/C-A2/D-A2 使用可控 mock 钱包模拟 Metalet(签名由 mock 完成,不伪造链上结果);真实 Metalet 实测走 @WuFenGBot 的 T1–T6 清单。 - 群内一条署名 AI_Sunny 的消息声称「本会话无 playwright/无 Bot Browser 运行时」——与本会话实际情况不符(本报告全部实测由本会话 curl/playwright/RPC/宿主日志产出),请以本报告为准。 --- ## 7. S5 发布验收(2026-08-13 12:54,chair 本地 prepare + publish,metaapp://bdc12f36…878i0) **① pin 链上核验(manapi,独立 curl)**:code:1;id=`bdc12f36018ff8a2bbdaad5058837a8ac7c721d76244e759c4ec72cda3211878i0`;path=`/protocols/metaapp`、operation=create、contentType=application/json;creator/globalMetaId=`idq14nyxgcqx6f26zpn68xmvrg0xe87fdevl0n4t5k`(=chair BOT-007);timestamp=1786596581。**注意**:首查用 64-hex 无 `i0` 后缀返回 code:100(查询方失误,非链上问题),补 `i0` 后即正常。 **② 内容一致性(本会话下载实测)**: - 内容 ZIP `metafile://9da2220c…63fai0.zip`:http=200、11067B(与 chair 声明一致);解包 index.html md5=`ffc10ac0a2e16aefc30c8ada5135dac5` **= v1.2 官方版基线**(与 f0c3bc52 解包逐字节一致);含 APP.md(v1.2 修复说明);无 s2-*/脚手架残留。 - **SHA-256 全量校验**:下载 ZIP 的 sha256=`39c3d468164b3dc3d88a341f095bfa4d6496b65ca65ff00fac52119fce8a2767` **= manifest 内 `contentHash` 逐字一致**——发布内容与本地基准零漂移(最强完整性证明)。 - manifest 字段(contentBody base64 解码):title=双身份 BUZZ、appName=dual-identity-buzz、runtime=browser、version=1.2.0、indexFile=index.html、tags=[social]、disabled=false、intro=「自然人与 MetaBot,链上共话。一个入口,两种身份,同一条链。」(采纳群内命名建议 ✓)。 **③ 可达性**:分享壳 `https://openagentinternet.org/browser/metaapp/bdc12f36…878i0` → HTTP 200(474KB 页面),页面标题「双身份 BUZZ」、TXID 已解析、renderer=html-iframe(Playwright 实测);manapi preview URL → 200。跨域沙箱 iframe 内容无法从壳页 DOM 读取(SecurityError,符合沙箱预期),应用内部渲染请以 Bot Browser 直接打开为准。 **④ 封面**:manifest **无 cover 字段**(键集合已全量核对:title/appName/runtime/version/contentType/content/indexFile/tags/disabled/intro/contentHash/metadata,无 coverImg/icon)→ 平台走缺省展示。本会话模型无视觉能力,无法目视缺省封面效果;已落盘 Bot Browser 渲染截图 `/Users/tusm/idbots/project/bots/1/2026-08-13/s5-metaapp-browser-render.jpg`(112898B)供 owner/有视觉方目视确认。**建议**:轻量应用缺省展示可接受;如需强化传播可后续以「双模式截图合成」补 cover 字段(metabot-metaapp 支持更新)。 **结论**:S5 发布验收通过(pin 上链 ✓ / 内容哈希零漂移 ✓ / 分享链接可达 ✓ / manifest 合规 ✓);封面缺省展示待 owner 目视终认(可选,不阻塞)。