Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
b927554
feat(marketplace): D19「添加其他账户」不再死按钮 —— 按官方逐字实现内联表单
Oct 5, 2026
81253be
docs(marketplace): 补记「Grok 是保留的账户标签」提示的实机取证
Oct 5, 2026
e2aec5f
docs(marketplace): D19 行补记「Grok 是保留的账户标签」提示与更新后的测试计数
Oct 5, 2026
519b808
fix(marketplace): parity 汇总带出分母,并显式报出只在一侧存在的区块
Oct 5, 2026
06fa0fd
fix(marketplace): 单边区块判定排除 0 行容器标题;落一份官方首页区块基线
Oct 5, 2026
f8cd02c
docs(marketplace): D11 行补官方基线引用(登录与凭据管理 存在性已直接确认)
Oct 5, 2026
263be3e
docs(codesign): 推翻「只签顶层就够」那条前提,并把框架的 cdhash 型 DR 实测落证
Oct 5, 2026
614fb63
fix(marketplace): 修 L1b 类目页从来没被验过 —— 每轮重新解析按钮节点
Oct 5, 2026
21dd1fa
fix(marketplace): 缺口明细不再用 ❌ 字形撒谎;去掉会漂移的硬编码条数
Oct 5, 2026
10db3ec
fix(marketplace): cdpDump 加超时 —— 一个 app 不响应会让整轮零产出
Oct 5, 2026
90fa16f
docs(marketplace): 一次全绿跑定案,验收行 1/1b 换成就地实测值
Oct 5, 2026
420d620
docs(marketplace): D19 实机对拍落地 —— 13 项逐项对上,宽度差异非本项引入
Oct 5, 2026
80858b9
docs(marketplace): 排查并排除一个自查疑点 —— 「超时」与「错误」都是测量问题
Oct 5, 2026
7a20b7b
docs(marketplace): 验收行 2c 补 D19 —— 「分组」的官方对应物是自由文本而非选择器
Oct 5, 2026
bdb6e94
docs(marketplace): 用 AX 树补上首页逐行证据,并把「截图没拿到」换成确切诊断
Oct 5, 2026
a1714f5
fix(ci): 补齐 7 个文件里缺的那半个守卫 —— main 的 CI 已因此连续红 10 次
Oct 5, 2026
ae31cc2
fix(ci): 第二类 CI 敌对路径 —— .build 暂存目录,以及又三处「守卫只做了一半」
Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions docs/MARKETPLACE-066-EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -1439,6 +1439,34 @@ k && !as ? <button aria-label={V!=null ? xzJ6xV : tT4tWM} …> : null
⇒ D19 需要**新桥契约 + 表单 + 提交流程**,涉及选哪个宿主调用、参数形状、以及 OAuth 回跳 UX ——
这三处都有设计判断,没有实机可参照时盲写就是臆造,故**未擅自实施**,登记为待办。

#### ⚠️ 2026-10-05 21:5x 上面的「实施前提」被逐字证伪,D19 已实施

上面三行里「本项目桥没有 `addAccount`」「需要新桥契约」「三处设计判断待拍板」**全部是错的**,
它们是按「桥里有什么」推出来的,而不是按官方怎么调推出来的。重新取证(全部逐字):

- **官方只有一条提交路径**(`chunk-view-BudImuR0.js` @111600 起,`de = Pe`):
```js
Pe = async ($, U) => { const ee = U === void 0 ? ps : U; … await le(pe, se, ee) }
// 上游调用侧:
be = $ => de($.serverId, $.accountKey) // onAuthenticate
Me = $ => de($.serverId, $.label) // onAddAccount
```
两个回调**是同一个函数、只有第二个实参名不同** ⇒「标签就是 accountKey」,
⇒ 根本不存在「选哪个宿主调用 / 参数形状」这两问。
- **本项目桥本来就有**:`preload.ts:175` 早已暴露 `authenticate(serverId, accountKey?, trigger?)`,
`mcp-desktop.ts:11` 把 `accountKey` 原样透传给 `authenticateServer`(只缺省成 `default`),
`mcp-auth-watch-lifecycle.ts:103` 交给 `checkAuthStatus`,**没有「槽位必须预先存在」的前置检查**。
⇒ 不需要新桥契约。`addServersToAccount` 从头到尾都不相关。
- **回跳 UX 不由渲染层决定**(宿主 `catchLoopbackAuthorization` + `onAuthCompleted` 订阅),
也不是移植的未知项。
- **可见性门**:`k = featureGates.mcp_multi_account && url!=null && servedBy!=="grok" && cursorScmProvider==null`。
`mcp_multi_account` 在 `main-app.cjs` 注册的默认值是 `!0`,本地无条件渲染与官方默认路径一致。

官方 `P` 处理器的三条「只收起、不提交」分支(`index.eager-app-Cj5f8Gby.js` 的 `hPe`/`dPe` 解出):
`q = trim().toLowerCase()`;① `q` 为空或 `q === 源账户键` → `b(null)`;② `q === "grok"`(常量 `dPe`)→ `b(null)`;
③ 否则先 `b(null)` 再按 `C.has(q)` 分流 `t()` / `i()`。Enter 等价「授权」,Escape 等价「取消」。


### 三条方法论(本轮又踩)

1. **基准本身可能是错的,而它会以「守卫」的形式长期合理化错误结论。**
Expand Down
62 changes: 54 additions & 8 deletions docs/MARKETPLACE-066-PORT.md

Large diffs are not rendered by default.

59 changes: 59 additions & 0 deletions docs/evidence/marketplace-add-account-binding.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,62 @@ node /tmp/asar-find2.mjs "/Applications/Grok Bot.app/Contents/Resources/app.asar

本文档所有偏移量都绑定 0.66.0 这一次产物。**换版本后偏移失效,但检索串稳定** ——
按串重新定位,不要按偏移。

---

## 追加(2026-10-05 21:5x):实机量测补上一处字节读不出的东西

上面的结论全部来自字节。但字节里那个提示条件写的是
`S = h != null && Bs(h) === Vs` —— `Vs` 是从 `index.eager-vendor-Qbf9YA6n.js`
别名 `f6` 转进来的**压缩常量**,在同一文件里 `UL` 重名(撞上 `React.createContext`),
继续追就要开始猜了。**不猜,直接在官方界面上试。**

### 探针要过的两道关

1. **命中测试**:`innerText` 读得到 ≠ 界面上看得见(推栈 UI 下层节点仍在 DOM 且仍算可见)。
2. **自证起点**:先确认表单**确实是展开态**,否则「没变化」可能是压根没点开。

第一轮探针返回「表单未展开」,是**窗口只有 720×76 像素高**——输入框在 DOM 里(478×28),
滚动区 `clientHeight` 为 0,`elementFromPoint` 落在视口外外。命中测试正确地拒绝了读数。
用 `Emulation.setDeviceMetricsOverride` 临时撑开布局视口(读完立即 `clearDeviceMetricsOverride`)。
(`Browser.getWindowForTarget` 在 page 会话上不存在 —— `cdp.mjs` 连的是 page target。)

### 量到的表单结构(与字节逐字吻合)

| 角色 | tag | 类数 | 与本仓库常量 |
| --- | --- | --- | --- |
| 表单 | `div` | 9 | `DETAIL_ADD_ACCOUNT_FORM_CLASSES` ✅ |
| 字段外层 | `span` | 8 | `DETAIL_ADD_ACCOUNT_FIELD_CLASSES` ✅ |
| 输入框 | `input` | 17 | `DETAIL_ADD_ACCOUNT_INPUT_CLASSES` ✅ |
| 授权 | `button` | 54 | `ACTION_BUTTON_OFFICIAL_CLASSES` ✅ |
| 取消 | `button` | 55 | `CANCEL_BUTTON_OFFICIAL_CLASSES` ✅(= 授权 `slice(0,-3)` + 4 个 ghost 类) |

> 五个配方**本来就已转写好且全部闲置未用**。缺的只是 DOM 组装 —— 与本文件上半部分的
> 「桥不缺、只差渲染层接线」结论完全吻合。

### 提示条件:实测而非推断 ★

逐个标签输入,读字段 span 内的子节点:

| 输入 | 提示 |
| --- | --- |
| `Grok` | **出现** |
| `grok` | **出现** ⇒ 判定大小写不敏感 |
| `default` | 不出现 |
| `个人` | 不出现 |
| `工作` | 不出现 |

提示节点 = input 的**兄弟**(同一字段 span 内),5 类
`sand-9f619 sand-1wm8ruf sand-1d3mw78 sand-12oo3zp sand-1jh5svw`,
文案取官方默认(中文)表 `wLsCed` = 「Grok 是保留的账户标签」。
`sand-1jh5svw` 的声明是 `color: var(--cursor-text-red-primary)` —— 红色警告,语义自洽。

**跨版本可直接搬**:这 5 个类在 0.18(`index-lCyB53CO.css`)与 0.66
(`index-B9V4agTc.css`)里声明**逐字相同**,无需任何逻辑/物理属性替换
(这正是 AGENTS.md 记的那条「同一声明 ⇒ 同一类名」规律)。

### 一处我自己写错的断言(被测试当场抓住)

第一版用例把 `Grok2` 放进了「应显示」那一组。实现按官方的**精确相等**拒绝了它,
是**测试错了不是实现错了** —— `Grok2` 我从没在官方界面上试过,属于凭空推断。
判据是 `trim(h) === Vs`,不是 `startsWith`。已改正,并在用例里写下这条提醒。
13 changes: 11 additions & 2 deletions docs/evidence/marketplace-icon-assets.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,17 @@ B 的 12 是**下界**:只有两侧都定位到 `<img>` 的行才进入尺寸
任一不可达即显示空框;官方内联则**无外部依赖**。
2. 资产不同(离线字节比对 38/40 不同、38/39 尺寸不同)—— 影响视觉一致性。

**尚未确证**:具体每个品牌在渲染后差多少像素。这需要把同一行在两个 app 上截图对拍,
本轮的截图任务卡在导航循环里被中止,**没拿到**。在拿到截图之前不写「肉眼差多少」。
**2026-10-05 22:0x 复核,这两条都已经不需要截图来回答了**:
1. D18 落地后 parity 实测「两侧都解析出 `<img>` 后固有尺寸不同的 **0 行**」—— 官方内联归一化到
112×112、本地同步走宿主缩放,**资产层面的尺寸差已被测量消掉**,不再是推断。
2. 截图对拍在本地环境**确认不可得**,原因已查明(不再是「卡在导航循环里」这种含糊说法):
`Page.captureScreenshot` 在官方那个 Electron 页面上**四种参数组合全部超时**(原生长度、
Emulation 1180×1000、Emulation+clip+captureBeyondViewport、清除 Emulation 之后),
`Page.startScreencast` 能启动但 **0 帧**;同一时刻本地 app 的 screencast 正常出 3 帧
(1728×1019)。桌面级 AX 截图同样返回 `screenshot: none`。
⇒ **官方窗口不产合成帧**,这是环境限制,不是脚本 bug。改用 Accessibility 树取证,
它给出有序、精确、含行尾控件状态的等价结构证据,已落
`docs/evidence/marketplace-parity-20261005/homepage-row-diff.json`(两侧判据互相独立)。

## 四、检测器自身踩过的三个坑(值这一节本身)

Expand Down
125 changes: 125 additions & 0 deletions docs/evidence/marketplace-parity-20261005/homepage-row-diff.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
{
"_note": "2026-10-05 22:0x。要求 1「顺序/数量/名称/分类标签逐项一致」的逐行证据。官方侧取自 Accessibility 树(窗口 1414×1020,AX 读数),本地侧取自 parity 脚本自己的 SECTIONS_EXPR(CDP)—— 两侧**判据互相独立**,不是同一份数据抄两份。",
"officialSource": "kimi-cu get_app_state(mode=full, pid=75018) 的 AX 树",
"localSource": "verify-marketplace-parity.mjs 的 SECTIONS_EXPR,CDP 9232",
"counts": {
"officialSections": 13,
"localSections": 12,
"exact": 11,
"differ": 1,
"missing": 1
},
"sections": [
{
"section": "为你推荐",
"status": "行不同",
"official": "Aleph / Algolia Productivity / Allo / AMD",
"local": "Adobe Developer App Builder / Airtable / Asana / Atlassian",
"note": "affinity 归因见 D2"
},
{
"section": "精选插件",
"status": "逐行一致",
"official": "Gmail / Google Calendar / Google Drive / Granola",
"local": "Gmail / Google Calendar / Google Drive / Granola",
"note": ""
},
{
"section": "团队插件",
"status": "逐行一致",
"official": "oh-my-claudecode",
"local": "oh-my-claudecode",
"note": ""
},
{
"section": "登录与凭据管理",
"status": "缺整块",
"official": "1Password",
"local": "—",
"note": "D11"
},
{
"section": "效率",
"status": "逐行一致",
"official": "Adobe Developer App Builder / Airtable / Asana / Atlassian",
"local": "Adobe Developer App Builder / Airtable / Asana / Atlassian",
"note": ""
},
{
"section": "通信",
"status": "逐行一致",
"official": "ActiveCampaign / AgentMail / Ando / Bird",
"local": "ActiveCampaign / AgentMail / Ando / Bird",
"note": ""
},
{
"section": "设计",
"status": "逐行一致",
"official": "Canva / Docs Canvas / Figma / Google Slides",
"local": "Canva / Docs Canvas / Figma / Google Slides",
"note": ""
},
{
"section": "代码",
"status": "逐行一致",
"official": "Amazon Location Service / Appwrite / AWS Amplify / AWS Core",
"local": "Amazon Location Service / Appwrite / AWS Amplify / AWS Core",
"note": ""
},
{
"section": "数据",
"status": "逐行一致",
"official": "Amplitude / Antimetal / Apify / Astronomer",
"local": "Amplitude / Antimetal / Apify / Astronomer",
"note": ""
},
{
"section": "销售",
"status": "逐行一致",
"official": "Adspirer / Amplemarket / Apollo.io / Attio",
"local": "Adspirer / Amplemarket / Apollo.io / Attio",
"note": ""
},
{
"section": "财务",
"status": "逐行一致",
"official": "1inch / Aave / Airwallex AgentOS / Airwallex Developer",
"local": "1inch / Aave / Airwallex AgentOS / Airwallex Developer",
"note": ""
},
{
"section": "研究",
"status": "逐行一致",
"official": "Ahrefs / Context.dev / Context7 / Crustdata",
"local": "Ahrefs / Context.dev / Context7 / Crustdata",
"note": ""
},
{
"section": "支持",
"status": "逐行一致",
"official": "Intercom / MailerLite / Plain",
"local": "Intercom / MailerLite / Plain",
"note": ""
}
],
"localOnlySections": [],
"officialTrailing": {
"为你推荐": "添加 ×4",
"精选插件": "已添加 ×4",
"团队插件": "已添加 ×1(带「团队」徽标)",
"登录与凭据管理": "连接 1Password",
"效率": "添加 ×4",
"通信": "添加 ×4",
"设计": "已添加 ×2 / 添加 ×2",
"代码": "添加 ×4",
"数据": "添加 ×4",
"销售": "添加 ×4",
"财务": "添加 ×4",
"研究": "添加 ×4",
"支持": "添加 ×3"
},
"consistency": {
"查看全部 出现规则": "官方:行数>4 才有(支持 3 行无、其余 4 行有)—— 12 个区块里 9 个有,见 parity「查看全部 数量 官方 9 / 本地 9」",
"行尾控件": "官方 AX 树逐行可读:未安装=添加 / 已安装=已添加 / 凭据类=连接 1Password;本地同形,见 docs/MARKETPLACE-066-PORT.md 2c"
}
}
104 changes: 104 additions & 0 deletions docs/evidence/marketplace-parity-20261005/parity-green-run.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@

■ 上游真源(本机 0.66 的 browse-model chunk)
✅ chunk 存在且为 12,928 字节 — 实际 12928 字节
✅ Le 表逐条一致(14 条)
✅ Le 中确无 AGENT_ORCHESTRATION / MCP
✅ Te 表 16 个上游 slug 全部转写 — 额外 slug(须为补偿项): canva, mailerlite
✅ CATEGORY_BUCKET_ORDER 等于上游 Ce

■ 部署版字节(/Applications/Grok Node.app)
✅ 第一层投影 toPlugin 保留 categoryKeys
✅ 第二层投影 marketplacePluginToView 保留 categoryKeys — main.cjs 中共 17 处
✅ 第一层投影 toPlugin 的 pluginName 取自 Plugin.name(非 MCP server 句柄)
✅ 第二层投影 marketplacePluginToView 保留 pluginName — main.cjs 中共 19 处
部署版渲染器:为你推荐 的 affinity 键与官方一致 — 键函数 fe 直接取 category 标签,与官方 0.66 同源
✅ renderer chunk 逐个 node --check(101 个)
通过 101/101
✅ 市场 UI 文案在产物中(先还原 \uXXXX 再匹配)

■ 实机逐区块对拍(需要两个 app 同时带 CDP 端口运行)
✅ 官方 9224 读取成功 — 14 个区块
✅ 部署版 9232 读取成功 — 13 个区块

官方 14 个区块 / 本地 13 个 / 共有 13 个,逐行完全一致 12 个
✅ 市场
⚠️ 为你推荐
官方: Aleph / Algolia Productivity / Allo / AMD
本地: Adobe Developer App Builder / Airtable / Asana / Atlassian
✅ 精选插件
✅ 团队插件
✅ 效率
✅ 通信
✅ 设计
✅ 代码
✅ 数据
✅ 销售
✅ 财务
✅ 研究
✅ 支持
⚠️ 仅官方有的区块:登录与凭据管理(已知差异,未计入失败) — 本地缺这一整块内容(官方 1 行)
⚠️ 首页行图标:交付方式与资产尺寸与官方一致(已知差异,未计入失败) — 可比对 40 行;交付方式不同 1 行;两侧都解析出 <img> 后固有尺寸不同的 0 行,另有 27 行至少一侧未解析出图标(该数是下界,不是全量)。 官方把图标内联并统一到 112x112,本地透传 catalog 原始远端 URL。见 docs/evidence/marketplace-icon-assets.md
· 登录与凭据管理(仅官方有,官方: 1Password —— 缺口见上方 ⚠️)

剩余差异请对照 docs/MARKETPLACE-066-EVIDENCE.md §18–§20 归因:本地 catalog 已补齐为
与官方同规模(下方「catalog payload 对拍」逐条核对,缺失条目应为「无」);
1Password 不在任何一侧 catalog。
「为你推荐」:代码侧已对齐。已部署产物的 affinity 键是
`ye(n)=L(n.category).trim()` —— 直接取 category 标签、不经映射表,
与官方 `v(e,t)=j(e.category.trim(),t)` 同源,键为空 0 条。
残留差异**只有一层且不可消除**:官方那 4 个赢家的 category 四取四全是 MCP,
而本地已装的 8 条里没有 MCP 类 → 亲和表只有 {Featured:6, Productivity:2}。
历史:20:12 之前部署侧走 `as` 映射表(该表缺 MCP/AGENT_ORCHESTRATION/FEATURED,
169/403 条键为空);16:25 曾误判为「无缺陷」—— 按 minified 名字反查,
`ge` 读到的是 teamName 探针。详见
docs/evidence/marketplace-foryou-affinity-key.md

首页形状:
✅ 查看全部 数量 — 官方 9 / 本地 9
✅ 市场包裹层存在 — 官方 true / 本地 true
✅ 可继续纵向滚动 — scrollHeight 2372 / clientHeight 652(官方 2518 / 652)

■ 类目页与管理页对拍
✅ 官方 类目页读取成功 — 9 个查看全部
✅ 部署版 类目页读取成功 — 9 个查看全部
✅ 查看全部 总数 — 官方 9 / 本地 9
✅ 精选类目页 有行 — 官方 51 / 本地 6(含首页残留,不比等号)
✅ 类目桶 页 有行 — 官方 107 / 本地 60(含首页残留,不比等号)
✅ 精选类目页 标题 — 精选插件
✅ 类目桶 页 标题 — 效率
✅ 类目页 无分页控件 — 官方 false / 本地 false
✅ 精选与类目桶 是两个不同页面(两侧都须读到页面) — 官方精选「精选插件」/ 官方桶「效率」/ 本地精选「精选插件」/ 本地桶「效率」
✅ 管理页 可打开且有行 — 本地 48 行(官方 75,安装态不同故不比)
✅ 管理页 能进入详情 — 点击首行应到达详情页
✅ 管理页 返回后标题恢复 — 进入前「管理」/ 返回后「管理」
✅ 管理页 返回后行数不变 — 进入前 48 / 返回后 48

■ catalog payload 对拍
✅ 官方 catalog 读取成功 — 405 条,其中 252 条带 categoryKeys
✅ 部署版 catalog 读取成功 — 405 条,其中 252 条带 categoryKeys
✅ categoryKeys 取值集合一致 — 15 个 key 两侧相同
✅ categoryKeys 覆盖率无回退 — 本地 252/405(该字段修复前为 0)
✅ isUserOwned 计数一致 — 官方 93 / 本地 93
catalog 总数 官方 405 / 本地 405 —— 数据面:两侧条目集合一致
本地缺失条目: (无)

■ CTA 几何对拍(同一批控件,两侧实测互比,不用硬编码数字)
✅ 官方 CTA 读取成功 — 45 行
✅ 部署版 CTA 读取成功 — 44 行
✅ 行尾 添加/连接 尺寸 — 46x26
✅ 行尾 添加 padding — 0px 10px
✅ 行尾 添加 圆角 — 13px
✅ 行尾 添加 字重 — 420
✅ 行尾 添加 底色 — color(srgb 0.220753 0.220753 0.220753 / 0.32149)
✅ 详情 返回 尺寸 — 28x28
✅ 查看源码 尺寸 — 69x18
✅ 查看源码 外链图标 — 13x13
✅ 分享 尺寸 — 82x36
✅ 分享 图标盒 — 18x18
✅ 分享 label — 28x20
✅ 分享 子节点顺序 — SPAN.sand-kit-icon|SPAN.sand-euugli
✅ 查看源码 图标在 <a> 内 — text:查看源码|I.ui-icon
✅ 详情返回后回到首页

✅ 全部核验通过(另有 2 项已知差异,未计入失败)

Loading
Loading