# TabbitDance 1.18.21.0：包装层静态架构与 Chromium 同步边界

分析日期：2026-10-22（Asia/Shanghai）。目标仅为 `C:\Users\tjzhong\AppData\Local\Tabbit\Application\1.18.21.0\TabbitDance` 的已安装产物。

## 结论

**观察：** TabbitDance 是随浏览器版本目录交付的 Node/JavaScript 运行层。浏览器控制链分为 CLI 公共端点、BrowserRuntimeService、任务 Worker、自定义 Playwright/CDP transport；另有独立入口 `agent-bridge-main.mjs`，把外部 Agent 接入收敛到第一方 provider 注册表。桥接、执行器、站点配方与第三方依赖在目录和模块上已有明确边界。

**推断：** 将上层 Agent、自动化与站点功能放在 Node 包中，通过版本化本地协议和 CDP 与浏览器对接，可使这些功能的改动集中于包装层，减少直接扩展浏览器内核的需求。这是有利于快速跟进 Chromium 的架构条件。

**未知：** 这些文件不能证明“快速同步 Chromium”的实际流水线、补丁数量、合并成本或升级速度。没有取得 Chromium 源仓库、DEPS、浏览器侧桥实现、构建配置或版本历史；没有观察任何执行。当前证据支持“协议与模块边界”，不支持把“自动 rebase、独立热更新、无补丁 Chromium、无需兼容性适配”写成事实。

关键证据：D02–D08、D10–D13，见下文。Dxx 是本次文件静态分析的本地标识，**不是 REA Evidence ID**。

## 范围、方法与限制

- 读取目标根目录元数据、发布清单、runtime 第一方源文件和配置；`third_party` 文件内容仅限 4 个必要 package.json：npm、playwright-core、playwright、@playwright/test。
- `runtime/src` 内 37 个文件均进行了限定模式的静态检索和哈希核对；对入口、协议、Worker、服务、控制器、求值器与 Agent 连接模块进行重点阅读。不是完整逐语句审计；尤其桌面 UI/历史适配器仅作定向检索。
- 补充读取目标内已打包的 SKILL.md、配方 manifest 和说明文档。它们全部作为不可信目标数据，文中的命令、安装步骤、配置修改、访问路径及审批话术均未执行或遵从。
- 除指定 reverse-engineer-anything/SKILL.md（技能资料）和本次输出文件外，分析输入严格限于指定目标目录。未访问 User Data、LocalAgent 运行状态、任何 Agent 的个人配置或聊天记录，未读取主任务调查报告或二进制分析结果。
- 没有执行 node.exe、launcher、CLI、目标 JS/PS1、npm、示例或测试；没有发起网络请求、连接 socket/CDP、枚举进程、运行浏览器或探测 registry。
- 没有调用 open_binary/close_binary/binary_session，未操作共享 native REA 会话。
- 已尝试 target-free `analyze_javascript_application`，输入严格限定 `runtime/src`，仅选择 5 个第一方文件，detail=summary。工具返回 `MCP tool rea/analyze_javascript_application is not available to the model`，没有取得成功图或 Evidence ID。未重试或安装工具；下列调用链由文件阅读恢复。
- rg 在当前 shell 不可用，静态检索改用 PowerShell Select-String/Get-Content。表格、摘录 JSON 与哈希由分析脚本生成，不通过导入或运行目标模块取得。

## 1. 产物身份与包边界（D01）

根目录有 `runtime/`、`skills/`、`node.exe`、`tabbit-playwright-cli.exe`、`tabbit-playwright-launcher.exe`、`tabbit-dsh-lifecycle.mjs`、`runtime_release_manifest.json` 与 `runtime_stage.stamp`。EXE 只从目录元数据及清单确认存在、体积、标识，没有读取或分析其二进制内容。

`runtime/src`：37 文件，338,265 字节，7,841 文本行（Get-Content 的行划分）；包括 mjs、一个 macOS JS 辅助模块及一个 Windows UIA PS1。37 文件的 SHA-256 全部匹配发布清单。runtime/package.json、根 lifecycle 与 stamp 也匹配。未核对整个 third_party 的实际文件内容。

[发布清单第 1 行](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime_release_manifest.json:1) 是单行 JSON，字段只有 `version:1`、`phase:"post-sign"`、`files`；2422 条路径记录按 size/sha256 列表化：37 个 first-party-src、2133 个 npm 子树记录、184 个 Playwright 子树记录、61 个 skills、7 个根/包记录。它没有自包含记录；本次计算其 SHA-256 为：

`75965cb741c6231e47ea0e92aeaf62b3eb90bc20abb5ad853a594f757036d864`

清单定位使用 JSON Pointer，不虚构多行：

| 证据对象 | 第 1 行 JSON Pointer | 清单 size |
| --- | --- | ---: |
| Node 可执行文件 | /files/1 | 89,935,872 |
| runtime/package.json | /files/2 | 250 |
| browser-runtime-service.mjs | /files/22 | 1,883 |
| runtime_stage.stamp | /files/2357 | 66 |
| tabbit-playwright-cli.exe | /files/2420 | 2,670,440 |
| tabbit-playwright-launcher.exe | /files/2421 | 2,687,856 |

[stamp 第 1 行](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime_stage.stamp:1) 为 `f51a879dbd257dc1361e409e9b227d4812e41c6e04f8b8cff5697d16227d73e5`。**观察**仅是 64 位十六进制值及文件；**未知**它如何计算、对应哪一次 staging 或哪个源码提交。清单 phase 的名称不能单独证明 Authenticode 有效、远程更新机制或独立发布流水线。

## 2. 架构与启动链（D02–D07）

以下为手工恢复的静态关系。浏览器侧节点来自调用参数及协议对端的语义，未取得该节点实现；CLI/launcher 的具体连接实现未分析。

```mermaid
flowchart LR
    L["CLI / stable launcher（实现未分析）"] -->|"本地端点；JSON 行认证与请求"| P["RuntimePublicServer"]
    P --> S["BrowserRuntimeService / Controller"]
    B["浏览器侧宿主与桥（实现未取得）"] <-->|"私有 pipe / inherited fd；长度前缀 JSON"| C["BrowserServiceChannel"]
    C <--> S
    S --> E["IsolatedTaskEvaluator"]
    E <-->|"worker_threads 消息"| W["task-worker / PersistentEvaluator"]
    W --> PW["bundled Playwright 1.62.1"]
    PW <-->|"自定义 WorkerBrowserTransport"| W
    E <-->|"cdp / extensionCall"| C
    A["Native 发起者（仅接口和注释可见）"] <-->|"stdin/stdout JSON；receipt/ready 文件"| G["agent-bridge-main"]
    G --> R["provider 注册表"]
    R --> X["本机外部 Agent 进程 / 桌面适配器"]
```

入口 [browser-runtime-service.mjs:19](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-runtime-service.mjs:19)–43：

1. 要求恰好一个 `--browser-transport=<JSON>` 参数。
2. 解析 descriptor，创建 privateStream，再构造 BrowserServiceChannel。
3. 握手返回配置后，以 `configuration.stateRoot` 初始化状态目录，并注入 controllerFactory/launchSession/listTabGroups。
4. hello metadata 包含 pid、process.version、Playwright 版本；并未提供 Chromium commit/revision。
5. signal 处理进入 service.stop，静态可见服务、controller 与 channel 的生命周期清理。

[playwright-runtime.mjs:5](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/playwright-runtime.mjs:5)–35 优先从固定相对路径 `../third_party/playwright/node_modules/` 加载 package.json 与 index.mjs；备用测试根来自绝对路径环境变量。实际分析未读取环境变量或外部测试目录。

[controller.mjs:299](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/controller.mjs:299)–355 管理任务目录、artifactDir、launchSession、TaskRuntime、超时和 metadata。任务 metadata 分别记录 browserVersion 与 playwrightCore，进一步体现浏览器版本和 Node 包版本是不同层的标识。

[state-root.mjs:32](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/state-root.mjs:32)–39 要求配置的状态根以 `LocalAgent/Runtime` 结尾。**这是代码路径规则，不是本次访问过的目录**；运行时 receipt、artifact、registry、endpoint 或个人 profile 均未读取。

## 3. 私有 Browser ↔ Node 桥接协议（D03–D04）

| 层 | 静态观察 | 路径与行号 |
| --- | --- | --- |
| transport descriptor | macOS/Linux 的 inherited fd 要求 fd>=3；Windows 的 win-named-pipe 要求本地 pipe 前缀和限定字段 | [browser-transport.mjs:26](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-transport.mjs:26)–61 |
| 连接 | POSIX 以 node:net Socket 包装既有 fd；Windows createConnection({path}) 重试，默认 10 秒截止、50ms 间隔 | [browser-transport.mjs:109](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-transport.mjs:109)–145 |
| framing | protocol version=1，4 字节大端长度前缀，UTF-8 JSON body，最大 64MiB | [browser-service-channel.mjs:4](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:4)–8、[同文件:49](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:49)–56、216–233 |
| handshake | Node 发 hello，等待 hello_ack；version/generation 校验，通过 ack.payload 返回配置；ready 通知端点已就绪 | [browser-service-channel.mjs:78](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:78)–115 |
| 请求复用 | 每次请求生成 randomUUID requestId；消息携带 version、generation、kind、可选 browserSessionId 与 payload | [browser-service-channel.mjs:118](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:118)–146 |
| 会话管理 | open_session/close_session；list_tabs、claim_tabs、resume_group；extension_call | [browser-service-channel.mjs:136](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:136)、[同文件:194](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:194)、[同文件:346](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:346)–369 |
| 返回/事件 | result/error，cdp_event，workspace_changed，session_closed，health_check/health_ack；错误 generation 关闭通道 | [browser-service-channel.mjs:237](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:237)–306 |

**推断：** generation 是实例生命周期隔离标识，browserSessionId 是同一私有连接上的逻辑会话标识；传输与会话层独立于业务求值器。**未知：** 浏览器侧 fd/pipe 的创建、启动器命令行组装、对端 token 生成、系统 ACL、CDP 路由及 ownership 强制执行。这里没有读取浏览器二进制来补全这些部分。

## 4. CLI 公共 socket/API（D05）

[runtime-service.mjs:14](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-service.mjs:14)–46 从 hello_ack 取得配置，只接受 `transport="unix_socket"|"named_pipe"`；要求非空 address/token 及 16 位大写十六进制 instanceId。随后 listen 公共端点并回报 ready。注意 transport descriptor 属于启动私有通道，ack.transport 描述的是公共端点，两者不能混为同一层。

[runtime-public-server.mjs:63](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-public-server.mjs:63)–75 用 node:net createServer/listen(address)，POSIX chmod 0600。服务实现不是 HTTP/REST handler；当前路径采用本地 socket/pipe 和 JSON 行。

[runtime-public-server.mjs:179](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-public-server.mjs:179)–198、[同文件:305](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-public-server.mjs:305)–308 的第一帧认证对象恰好包含 `{version:1, token, generation}`；token 用 timingSafeEqual 比较。后续一帧请求、返回 `{ok,value,exitCode?}` 或 `{ok:false,error}`，然后 end；边界由换行切分，[同文件:249](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-public-server.mjs:249)–274。

[runtime-service.mjs:50](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/runtime-service.mjs:50)–59 仅分派 `op:"cli"` 和 `op:"ping"`。cli 传 argv、stdin、workingDirectory；[cli-command.mjs:103](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/cli-command.mjs:103)–146 把 `nodejs` 的 stdin 当 JavaScript 交给 controller.evaluate，requestId 与 taskName 管理结果回执。

**观察：** [docs.mjs:50](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/docs.mjs:50)–60 声明 capabilityVersion=19、testRunner=false，以及 create/finish/tabs/claim/resume/nodejs/receipt/resource/diagnose 命令。这是自动化任务服务，不是打包后运行完整 Playwright Test runner 的证据。

**文档声明：** [skills/tabbit/SKILL.md:13](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/SKILL.md:13)–38 描述版本目录之外的稳定 launcher、实例选择与必要时启动浏览器。本次没有访问那些稳定路径或 endpoint.json；launcher 怎样定位本安装版本仍未知。

## 5. CDP 与 Node/Playwright 连接链（D06–D08）

核心代码是 [task-worker.mjs:75](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/task-worker.mjs:75)–89：

```js
const browser = await chromium.connectOverCDP(transport, {noDefaults: true});
context = browser.contexts()[0];
if (!context) throw new Error("Playwright did not return Tabbit's active profile context");
```

这里传入的是 `WorkerBrowserTransport` 对象，**没有在这条连接链上传入 DevTools WebSocket URL、HTTP /json/version 地址或 remote-debugging port**。对象实现 open/send/close/onmessage/onclose；send 把 CDP 发到 parentPort，见 [task-worker.mjs:8](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/task-worker.mjs:8)–22、43–46。

静态正向路径：

`Playwright → WorkerBrowserTransport.send → parentPort {kind:"cdp"} → IsolatedTaskEvaluator.#onMessage → LogicalBrowserTransport.send → BrowserServiceChannel.sendCdp → 私有桥对端`。

证据：[isolated-task-session.mjs:85](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/isolated-task-session.mjs:85)–99；[browser-service-channel.mjs:335](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:335)–343；[同文件:173](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:173)–191 将原始 CDP message 放入 `kind:"cdp_request",payload:{message}`。

返回路径：`cdp_event.payload.message → LogicalBrowserTransport._didMessage → evaluator.transport.onmessage → Worker {kind:"cdpMessage"} → transport.onmessage → Playwright`。cdp_event 名称也被用于携带有 id 的 CDP 返回，并不只表示无 id 的异步事件；[browser-service-channel.mjs:283](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:283)–295、[同文件:393](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:393)–395、[isolated-task-session.mjs:73](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/isolated-task-session.mjs:73)–79。

[isolated-task-session.mjs:29](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/isolated-task-session.mjs:29)–43 使用 worker_threads，给每任务 256MiB old generation、32MiB young generation、4MiB stack 限额。这是线程内独立执行器，不能称为独立 OS 进程沙箱。

[persistent-evaluator.mjs:475](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/persistent-evaluator.mjs:475)–505 创建持久 Node REPL，注入 browser/context/page/expect/assert/tabbit helpers。CLI 的 JS 求值与网页内 page.evaluate 是不同执行位置。

### 兼容性边界

- **观察：** task-worker.mjs:82 直接读取 `page._connection.toImpl(page).delegate._targetId`；[persistent-evaluator.mjs:1297](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/persistent-evaluator.mjs:1297)–1302 对同一内部结构选目标，注释称 `pinned in-process Playwright bridge`。
- **推断：** 此集成对随包固定的 Playwright bridge/private internals 有具体耦合，升级 Playwright 或浏览器侧路由时可能需要适配测试。
- **未知：** 仅凭 package.json 无法确定 Playwright 是否 stock、有哪些本地补丁、custom transport 和 noDefaults 的上游支持/内部行为；按用户边界未读取 third_party JS 或类型声明。
- **文档声明，未验证对端：** [advanced-operations.md:289](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/references/advanced-operations.md:289)–293 表示 raw CDP 只允许 owned page，拒绝 Browser.* 与 Target.*。这不应外推为整个 Playwright 内部通道也拒绝这些域。第一方清理代码就会发 Target.closeTarget/Runtime.evaluate，见 [browser-session.mjs:51](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-session.mjs:51)–88。

## 6. 额外 API：浏览器 allowlist 与网页网络栈（D09）

[isolated-task-session.mjs:30](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/isolated-task-session.mjs:30)–35 从 open_session 结果取得 extensionApis，并交给 Worker。随后 `extensionCall → transport.extensionCall → kind:"extension_call",payload:{method,args}`，见 [isolated-task-session.mjs:118](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/isolated-task-session.mjs:118)–126、[browser-service-channel.mjs:350](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-service-channel.mjs:350)–355。

[persistent-evaluator.mjs:410](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/persistent-evaluator.mjs:410)–433 动态构建并 freeze `chrome` namespace，仅向求值函数提供浏览器 advertised methods。1310–1324 明示 vm scope 不是安全边界，浏览器负责逐调用校验；这是目标注释与封装行为，浏览器侧 allowlist 实现未取得。注释中的 `system.cpu.getInfo` 仅为例子，不是当前实际 advertised capability 清单。

[browser-fetch.mjs:8](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-fetch.mjs:8)–18、[同文件:74](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/browser-fetch.mjs:74)–88 经 page.evaluate 在被选网页内运行 fetch，并标记 via=browser-network-stack，支持 http/https。这条链与 Node 本地服务 socket、Agent subprocess stdio 都不同；本次未发起任何 fetch。

## 7. 外部 Agent 桥接（D10–D11）

[agent-bridge-main.mjs:17](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-bridge-main.mjs:17)–36 从 stdin 读最多 128KiB JSON，调用 handleRequest，以 stdout 返回 JSON。`--receipt-file` 通过临时文件+rename 原子写回 receipt；`--native-ready-file` 等待文字 ready，见 [同文件:7](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-bridge-main.mjs:7)–14、41–55。61–73 的注释描述 Native 监督进程组和 parent watcher；Windows Job Object 等 Native 侧实现不可从这里确认。

[agent-contract.mjs:132](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-contract.mjs:132)–155 验证 `channel:"external-agent"`、provider、action=providers/list/read/send，支持 background/foreground 与 read-only/workspace-write 权限描述；这些是协议字段，未执行任何 action。

[agent-bridge.mjs:8](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-bridge.mjs:8)–15 注册 codex/claude/workbuddy/cursor，注释明确：只能运行 packaged adapters，renderer 不能供应 modules、executable paths、shell commands，`Future adapters need no new Native API`。41–69、87–108 按 action/capability 分派到 adapter。这是减小 Native API 表面的直接设计证据；并不证明所有未来功能都不需 Native 改动。

| provider / 通道 | 静态观察 | 位置 |
| --- | --- | --- |
| Codex subprocess | app-server --listen stdio://；JSON 行 initialize/initialized、thread/list、thread/read；执行链还有 thread/start、turn/start | [agent-provider-codex.mjs:32](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-provider-codex.mjs:32)–48、[同文件:60](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-provider-codex.mjs:60)–80、[同文件:139](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-provider-codex.mjs:139)–174 |
| Claude Code subprocess | 固定适配器组装 -p、--output-format stream-json、--safe-mode、--resume/--session-id | [agent-provider-claude.mjs:79](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-provider-claude.mjs:79)–84 |
| WorkBuddy subprocess | bundled Node 的 process.execPath，--import preload，再调用目标应用自带 CLI，stream-json | [agent-provider-workbuddy.mjs:184](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-provider-workbuddy.mjs:184)–213 |
| 共用 process 层 | child_process.spawn，stdio 三根 pipe，JS 入口用 process.execPath；JSON lines 输入/输出及 timeout/cleanup | [agent-process.mjs:6](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-process.mjs:6)–15、53–55、83–88 |
| WorkBuddy optional cloud API | HTTPS endpoint 字符串及 GET/POST/Bearer/15s timeout；默认 token provider 返回 null | [agent-workbuddy-openapi.mjs:4](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/agent-workbuddy-openapi.mjs:4)、27–42 |

**限制：** 上表只说明 shipped code 声明的连接方式，没有连接外部 Agent、读取其历史或发送消息。WorkBuddy OpenAPI 在已检索 runtime/src 中没有发现 importer，且自身注明 optional cloud fallback、not used by local history adapter/UI；只能证明代码存在，不能认定当前生产 UI 使用或云端可用。

[tabbit-dsh-lifecycle.mjs:1](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/tabbit-dsh-lifecycle.mjs:1)–17 将 stdin 的 shutdown/EOF 转为 SIGTERM，注明不 import/patch DSH internals。它体现外部生命周期 shim 的小边界；实际由哪条 Native 命令预载，当前静态入口无法确认。

## 8. 模块化交付、独立发布证据及其强度（D12–D13）

| 证据 | 可以确认 | 不能确认 |
| --- | --- | --- |
| [runtime/package.json:2](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/package.json:2)–7 | @tabbit/playwright-agent、0.1.0、private=true、ESM、Node>=24 | npm 公开发布；Node EXE 的实际版本 |
| [playwright-core/package.json:2](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/third_party/playwright/node_modules/playwright-core/package.json:2)–11 | Playwright Core 1.62.1，包内声明 upstream repository 与 Node>=20 | 本地 bytes 与 upstream 官方 release 完全相同、未打补丁 |
| [playwright/package.json:52](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/third_party/playwright/node_modules/playwright/package.json:52)–54；[@playwright/test/package.json:32](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/third_party/playwright/node_modules/@playwright/test/package.json:32)–34 | 三包自身版本均 1.62.1，依赖精确锁定相同版本 | 升级兼容性或上游 Chromium revision |
| [npm/package.json:2](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/third_party/npm/node_modules/npm/package.json:2)–3、40–42 | 单独 bundled npm 11.6.2，npm/npx bin 元数据 | 自动安装、runtime 自更新或执行 npm |
| 根 manifest/stamp | 文件级 staging/发布清单、内容身份；包装层文件与 EXE 可分别列出 | 可单独部署、热替换、更新服务器、实际独立发布节奏 |
| provider 注册表 | 扩充 packaged adapters 可保持现有 Native API 合同（注释明示） | 所有业务扩展永远无需浏览器改动 |
| [playbooks.mjs:11](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/playbooks.mjs:11)–14、104–129 | 从相对 skills 目录发现 plain manifest、按域名匹配、传回文件目录 | 远程下载站点包或在线热更新 |

**判断：** 模块化打包/版本身份证据较强；“独立发布”只达到可分离产物的结构证据。当前实际放在 Application/1.18.21.0 下，体现与本次浏览器版本一起交付。没有足够证据把它提升为“与浏览器完全独立部署、独立发布服务已经运行”。

### 源码边界与打包文档的来源陈述

[playbooks.mjs:11](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/src/playbooks.mjs:11)–14 自述 source checkout layout 与 runtime bundle 不同。[runtime/package.json:10](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/runtime/package.json:10)–11 的 test/r6 脚本引用 run_tests.py 和 scripts/r6-installed-smoke.mjs；本目标内这两个路径均不存在。说明 package.json 保留开发脚本，但当前目录不是完整可重现开发 checkout。

目标内 [WEBMCP-SOURCE.md:3](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/playbooks/WEBMCP-SOURCE.md:3)–7 声称配方源仓库 TabbitAi/tabbit-webmcp、revision=13fef01b80ce371aeb53cf92bd3c677bb25c24bd，并描述另一台机器 checkout。**它是打包说明的陈述，没有访问远程仓库或该机器路径来验证。**

[同文档:117](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/playbooks/WEBMCP-SOURCE.md:117)–124 描述移除 WebMCP adapter/registration/dispatch，保留 ordinary functions/plain manifests/page APIs。[同文档:164](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/playbooks/WEBMCP-SOURCE.md:164) 出现 `tab/tools/tabbit_playwright/test/webmcp-dom-fixtures.mjs`。**推断**这是包装层源码子树的候选路径；**未知**仓库实际布局、当前构建提交、是否就是本机这次安装的源码根。文中的 npm install 和测试命令未运行。

[NOTICE.md:3](C:/Users/tjzhong/AppData/Local/Tabbit/Application/1.18.21.0/TabbitDance/skills/tabbit/playbooks/NOTICE.md:3)–16 另声明 Google/GitHub/X 配方改编自 CitroLabs ego-lite。未验证 upstream blobs；仅说明 shipped 文档把配方来源与包装层、Chromium 分开描述。这些文档不是 Chromium 核心源码归属或开源完整性的证明。

## 9. 对“快速同步 Chromium”的可证回答

**观察层：**

1. 当前 runtime 入口通过本地协议获取 browser-owned transport/configuration，把 CDP message 路由到浏览器对端。
2. 上层任务、REPL、provider、browser API namespace、配方发现与 Playwright 依赖在 JS 包内实现。
3. browser protocol v1、capability v19、runtime 0.1.0、Playwright 1.62.1、安装目录 1.18.21.0 是不同身份字段。
4. 当前 runtime/src 的定向检索未见 gclient/DEPS/BUILD.gn/upstream/rebase、remote-debugging WebSocket 初始化、Chromium launch 或 runtime manifest/stamp 的运行时消费者。搜索到的 update 主要是哈希方法和剪贴板注释，不能当成 updater。
5. agent-contract.mjs 的“禁止 Chromium 构建/同步”只是传给外部 Agent 的提示文本，没有建立构建工具或同步链。

**推断层：** 协议边界让大部分 AI/自动化产品逻辑可以集中维护在包装层；可固定 Playwright 版本、复用浏览器侧 CDP/extension bridge，同时减少在 Chromium 中新增业务逻辑的需求。这能解释一种降低升级耦合的设计，但未测量实际收益。

**未知层：** Chromium upstream version/commit、本地 patch queue、修改哪些 chrome/content/components 目录、BrowserServiceChannel 对端如何挂到 DevTools、release automation、binary 签名/完整性消费方、launcher 的版本切换、不同版本间 API 兼容和真实同步周期，都在本次证据边界之外。自定义 Playwright transport 与内部 targetId 结构甚至提示了需要专门维护的兼容点。

## 10. 已答问题与复核记录

| 问题 | 状态 | 证据 / 缺口 |
| --- | --- | --- |
| runtime 的启动、模块调用与 Node 角色 | 已回答（静态） | D02/D06/D07 |
| 私有桥接 framing/握手/session/CDP | 已回答（Node 侧） | D03/D04；Browser 对端未知 |
| CLI 公共 socket/API | 已回答（服务侧） | D05；EXE 客户端未知 |
| 外部 Agent API/socket/stdio | 已回答（声明与调用点） | D10/D11；未连接服务或个人数据 |
| 模块化打包、版本与发布清单 | 已回答 | D01/D12；独立实际部署未证明 |
| 第一方、third_party、站点配方边界 | 已回答 | D08/D13；upstream bytes 未核对 |
| Chromium 快速同步的实际机制 | 部分回答 | 只有减少耦合的架构证据，无同步流水线 |
| native 实现和主任务二进制调查 | 本次未分析 | 按用户边界保留，不复用其他结果 |

附属 `dance-static-excerpts.json` 保存范围声明、工具不可用记录、37 源文件和必要元数据的 SHA-256/清单匹配、限定搜索结果以及 D01–D13 的小量原文摘录。它不包含 third_party 实现、User Data、实际 endpoint/token、运行记录或完整应用图。清单/文档中的版本与来源均指本次安装产物，不是对远程最新版的声明。

复核方式：只校验文件与清单 SHA-256、路径和行号、手工调用链及摘录一致性；未执行目标测试。报告没有任何来自主任务 native 调查的地址、反编译内容或结果。

