# 01 · 任务分解（WBS）

> 全量任务清单。每个任务含：**目标 / 产出物 / 依赖 / 验收 / 估时 / 角色**。
> 角色缩写：桥=桥/容器、台=平台/领域、能=能力工程师、Q=QA。估时单位：人日(pd)。
> 验收一律以《契约规范》对应条目为准；通用 DoD 见 [00_总体规划 §7](./00_总体规划.md)。

---

## 进度总览

> 状态图例：☐ 未开始 / ◐ 进行中 / ☑ 完成 / ⚠ 受阻 / ⏸ 延后。每完成任务或里程碑**及时更新**（CLAUDE.md 工作约定）。最后更新：2026-06-26。

| 里程碑 | 状态 | 说明 |
|---|---|---|
| **M0** 脚手架 + 契约类型 | ☑ 完成 | 7 任务全完成并真机/模拟器验证 |
| **M1** 桥引擎 | ☑ 完成 | 8 任务全完成；**V1 真机通过**、桥核心单测覆盖 87.3% |
| **M2** 容器 + 启动 + 资源 | ☑ 完成 | 13 任务全完成；**V2 真机通过(R-02 关闭)**、VersionResolver 单测覆盖 81.8%；T-M2-12 机制已验证(真实远程大厅待服务端可用时终验) |
| **M3** 本期能力 | ◐ 进行中 | 全 Provider 落地；分享面板(微信SDK+QQ/抖音系统分享)/getcompareCode(接版本决策)/app_gamename 补全，EchoSample 移除；余 T-M3-17 真机回归（录音 prepareaudio、微信开放平台注册 待外部） |
| **M4** 通用网页容器 | ☑ 完成 | GenericWebContainer+SettingsProxy(6方法)+getWebdata/gamebackkeydown/backgameData 直调+101回传+返回键；子游戏切换(路径A)/打开通用容器(路径B) |
| **M5** 性能与加固 | ☑ 完成 | 01/02 双 Web 架构 ✓；04 onRenderExited 崩溃兜底 ✓；05 安全加固 ✓；**03 节流（Debouncer/Throttler+网络防抖）✓；06 可观测（BridgeTracer 全链路 traceId+ErrorCenter→APM sink）✓；07 冷启动（远程配置/内置资源并行化+耗时打点）✓**（均 build 通过，真机量化/回归待真机阶段）；T-M5-08 包体裁剪⏸延后 M6 |
| **M6** 暂缓能力集成 | ☐ 未开始 | 按需；含 T-M5-08（包体/渠道 HSP 裁剪，因微信/七牛 SDK 至 M6 才真集成而延后） |

**M0 任务明细（全部 ☑）**：

- ☑ T-M0-01 多模块工程（entry + 6 HAR）
- ☑ T-M0-02 模块依赖与导出（单向向下、无环）
- ☑ T-M0-03 构建/签名/CI（签名已配 `tsgames.p12`；CI = `scripts/ci.sh`）
- ☑ T-M0-04 契约类型 SSOT（45 入站 + 21 出站 + 17 DTO + Result/Errors）
- ☑ T-M0-05 公共设施 common（Logger/Tracer/EventBus/DI/ErrorCenter）
- ☑ T-M0-06 引入桥 JS（lzyzsd 原文件 + BridgeJsLoader）
- ☑ T-M0-07 App 入口与路由壳（Navigation；真机验证启动→路由→回传→横屏）

**M1 任务明细**：

- ☑ T-M1-01 IWebController + WebviewControllerAdapter(emitter UI 线程守卫) + FakeWebController
- ☑ T-M1-02 Message + MessageCodec（lzyzsd 二次转义逐字复刻 + 单引号转义修复）
- ☑ T-M1-03 HandlerRegistry + 空实现 DefaultHandler 兜底
- ☑ T-M1-04 BridgeController（对能力零感知、纯逻辑可测）
- ☑ T-M1-05 桥 JS 注入（onPageEnd）
- ☑ T-M1-06 最小回显 H5 + 容器接桥（BridgeGameContainer 挂 Web）
- ☑ **T-M1-07 V1 阻塞性验证真机通过**：yy:// 被 onLoadIntercept 捕获、_fetchQueue 经
  yy://return 回传、双向回执、含 `\"\\/'中文` 特殊字符转义往返一致。技术路线成立。
- ☑ T-M1-08 桥引擎单测：15 用例全通过，桥核心覆盖率 87.3%（≥80%）；
  运行方式 = scripts/test.sh（DevEco hvigorw 本地单测，已解决 R-18）

**M2 任务明细（全部 ☑）**：

- ☑ T-M2-01 平台存储/文件：KvStore(preferences)、FileSystem(fileIo 增删读写/列目录/拷贝内置 rawfile)
- ☑ T-M2-02 网络/下载：HttpClient(GET 禁缓存)、Downloader(http 流式写盘+进度)
- ☑ T-M2-03 解压：Unzipper(zlib.decompressFile)。**偏差**：下载/解压用原生异步 API 即满足"UI 不阻塞"，
  独立 TaskScheduler(TaskPool) 推迟到 M5 真有 CPU 密集任务(MD5)时再加，避免投机性死代码
- ☑ T-M2-04 权限/上传：PermissionGuard(用时申请，沙箱文件免存储权限)、LocalUploadServer(**已落地**：@ohos.net.socket 本机 HTTP server，接 H5 POST 截图→PHOTO_UPLOAD→微信图片分享，见 T-M3-13)
- ☑ T-M2-05 ConfigManager：本地 rawfile/app_config.json + 远程拉取/校验(<30 阻断) + 决策（按线上真实格式：单 agentlist 树，无二级 url）
- ☑ T-M2-06 VersionResolver：纯函数，按线上真实格式 agent→game→channel→market 后层覆盖（game_zip / 数字 id 归一 / gameid 回退 version.xml）；单测重写为真实格式 + 线上大厅样例；模拟器端到端验证（下载 261 版大厅渲染）
- ☑ T-M2-07 ResourceManager：路径规范、内置包拷贝解压、version.xml 解析、远程 zip 下载/删旧/解压、版本比较
- ☑ T-M2-09 AppDataInjector：加载前写 app_data.js（§6 全局变量同名同义）
- ☑ T-M2-11 StartupOrchestrator：INIT→…→ENTER_HALL 状态机，远程失败降级本地、showmessage 阻断
- ☑ T-M2-13 能力插件框架骨架：CapabilityProvider/Context/Registrar + 组装根 buildCapabilities() + 样板
- ☑ T-M2-10 BridgeGameContainer 完整化：Registrar 注册能力、首次 100% 推 appservice/setPostUrl、清理、入口 URL
- ☑ **T-M2-08 V2 阻塞性验证真机通过**：file:// fetch/XHR 首测被 CORS 拦截，用
  `setPathAllowingUniversalAccess` 放开资源根跨域（对 H5 透明）后复测 OK；R-02 关闭
- ☑ T-M2-12 集成联调：用内置测试大厅(gamehall_builtin.zip)端到端验证全链路（启动→资源→app_data→
  file:// 加载→跨域 fetch→桥双向）真机通过。**真实远程大厅** H5 需服务端/网络可用时做终验

**M3 任务明细**（进行中，8/17）：

- ☑ T-M3-15 RoomStubProvider/PayStubProvider（§6.5 占位桩，全 void、不触发出站）
- ☑ T-M3-04 VibrateProvider（vibrator/repeatvibrator/canclevibrator）
- ☑ T-M3-05 ClipboardProvider（gameCopytext/gamepastetext）
- ☑ T-M3-01 AppSystemProvider（orientation/browser/finsh/openApplyDownloadpath/notification空）
- ☑ T-M3-02 DeviceProvider（getTime/getphonestate/getbattery/getwifiLevel/getcompareCode/getphoneInfo/getmarketname/getothername/getOther）
- ☑ T-M3-03 NetworkProvider（getnetwork + 出站广播）
- ☑ T-M3-08 ShakeProvider（@ohos.sensor 加速度合力阈值 + shakeEnd）
- ☑ T-M3-09 LocationProvider（geoLocationManager 定位+逆地理编码，用时申请权限，错误码 0/-1/-2）
- ◐ T-M3-10 AudioProvider（AVPlayer 播放完成：mediaTypeAudio/srcIsloop/voicePlaying + gameui_play/stop_voice；
  **录音 prepareaudio 分档**：platform QiniuUploader(@qiniu/upload，token 走服务端)就绪，待按住说话手势+麦克风+七牛服务端 token）
- ☑ T-M3-11 ScanProvider（@kit.ScanKit 默认界面扫码，免权限）
- ☑ T-M3-12 CameraProvider（@kit.CameraKit cameraPicker，免权限）
- ☑ T-M3-07 PhotoProvider（批量下载到资源根 photos/，复用 Downloader）
- ☑ T-M3-13 ShareProvider（对齐原工程分享面板：微信 SDK 网页/Canvas截图→sharesuccess；QQ/抖音 @kit.ShareKit 系统分享；截图经 CapabilityContext.captureCanvas）；**另支持 H5 主动 POST 截图上传链路**（LocalUploadServer→PHOTO_UPLOAD→微信图片分享，对齐原 OkHttpPhotoServer）
- ☑ T-M3-14 LoginProvider（微信授权取 code；profile 换取待服务端端点，AppSecret 不入端）
- ☑ T-M3-06 NavProvider（随 M4 完成）：OpenurlTitleData(开通用容器+101回传)/SwitchOverGameData(同容器切换+app_data重注入)/getGameinstall(同步)/backgameData(返回大厅)
- ◐ T-M3-16 前后台 appservice（容器 EventBus 联动已就位，随 EntryAbility 前后台触发）
- ☐ T-M3-17 契约一致性回归（全 44 入站逐条真机核对）

> 已落地 Provider 当前为 **build 验证 + 契约逐字对齐**；真机逐条验证在 T-M3-17 回归阶段统一做（最小回显页不覆盖业务 handler）。
> getcompareCode 已接启动期版本决策(KvStore 缓存网络 App 版本)；app_gamename 已解析 version.xml 子 game name；EchoSampleProvider 已移除(getTime 由 DeviceProvider 提供)；ShareProvider 已完整(微信真分享待开放平台注册做真机验证)；LoginProvider profile 换取仍待服务端。

**M2 期间确立的项目决策/偏差**：
- file:// 跨域采用 `WebviewController.setPathAllowingUniversalAccess([filesDir/tsgames])`（官方"本地资源跨域"方案），优于通用 onInterceptRequest 代理。
- 沙箱路径简化：弃用 Android 的 `<包名>/<时间戳>` 多级目录，用固定 `filesDir/tsgames/<gamedir>`（§5.1 许可，对 H5 无影响）。
- 启动期不申请敏感权限（沙箱文件免存储权限；定位/电话等由 M3 Provider 用时申请），仅声明 INTERNET。
- 内置 `gamehall_builtin.zip` 为 M2 测试大厅（含 V2 验证页），真实大厅由远程 zip 生产下发；M3 用真实 Provider 替换 EchoSampleProvider。

**M0 期间确立的项目决策（超出原计划的补充）**：
- 包名 `com.lobby.daoqi`；横屏项目，`module.json5` 配 `auto_rotation_landscape`（横屏两朝向跟随旋转、不进竖屏，H5 显式方向控制保留）。
- ArkTS 验证用 `devecocli build`（其 CompileArkTS 为权威编译器）；deveco-mcp 的 LSP check 因 70s 索引 / 20s 超时不可用。
- `devecocli` 无 `test` 子命令，单测运行方式待 M1 解决。

---

## M0 · 工程脚手架 + 契约类型

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M0-01** | 创建多模块工程 | `devecocli create` 生成 entry + 6 HAR（`feature_bridge`/`feature_capabilities`/`domain_resource`/`platform`/`contracts`/`common`） | — | 工程可 `devecocli build`（debug）通过 | 1 | 桥 |
| **T-M0-02** | 模块依赖与导出 | 各 `oh-package.json5` 依赖关系（单向向下）；`index.ets` 导出 | T-M0-01 | 跨模块 import 无环、可编译 | 0.5 | 桥 |
| **T-M0-03** | 构建/签名/CI | `build-profile.json5`（debug/release product）；调试签名；CI 脚本（build+单测） | T-M0-01 | PR 触发 CI 通过 | 1 | 桥 |
| **T-M0-04** | 契约类型（SSOT） | `contracts` HAR：`enum Handlers`（全部入站/出站 handler 名常量，含 `finsh`/`getcameraaAddress`/`backgameData-` 等原样拼写）；DTO interface（`sharetypeBean`/`MaplocationInfo`/`phoneInfoBean`/`savephotoURLBean`/`videoinfobean`/`Othervideoinfo`/`GamePay`/`sharelogin`/`sharesuccess`）；`Result<T>`/`Errors`；每 handler 的 `payloadType:'raw'|'json'` 标注 | T-M0-02 | 全量对照《契约规范》§8/§9/§12，零缺漏；编译通过 | 1.5 | 台 |
| **T-M0-05** | 公共设施 | `common` HAR：`Logger`(分级)/`BridgeTracer`(traceId)/`EventBus`(emitter 封装)/`DIContainer`/**`ErrorCenter`(异常收敛+弹窗/静默/上报策略)**/`Result<T>` 配套 | T-M0-02 | 单测覆盖；可被各模块引用（框架 §10） | 1.5 | 台 |
| **T-M0-06** | 引入桥 JS | 把 lzyzsd `WebViewJavascriptBridge.js` **原文件**放入 `feature_bridge/assets`，建读取/内联机制 | T-M0-01 | 文件就位、可被注入流程读取 | 0.5 | 桥 |
| **T-M0-07** | App 入口与路由壳 | `EntryAbility`（Stage 模型生命周期，含 `onForeground/onBackground` 钩子接口）+ `Navigation`/路由骨架（Splash↔BridgeGameContainer↔GenericWebContainer 跳转与回传通道）+ `SplashPage` 壳（框架 §4） | T-M0-01 | 空壳可启动、可路由跳转；前后台钩子可触发 | 1 | 桥 |

---

## M1 · 桥引擎（最高优先 ⭐）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M1-01** | Web 控制器抽象 | `IWebController` 接口 + `WebviewControllerAdapter`（包 `webview.WebviewController`）+ `FakeWebController`（测试用） | T-M0-01 | 桥不直接依赖系统类；Fake 可记录脚本/模拟回执 | 1 | 桥 |
| **T-M1-02** | 消息编解码 | `Message`（5 字段）+ `MessageCodec`：`toJson`/`toArray`/`escape`，**与 lzyzsd 完全一致的二次转义**（`\`、`"`） | T-M0-04 | 单测：与 Android 端样例字节级一致 | 1 | 桥 |
| **T-M1-03** | Handler 注册表 | `HandlerRegistry`（put/get/default）+ `DefaultHandler`（空实现兜底） | T-M0-04 | 未注册名落默认 handler 不抛错（框架 §5.2/§6.5） | 0.5 | 桥 |
| **T-M1-04** | 桥控制器 | `BridgeController`：`onLoadIntercept`/`callHandler`/`registerHandler`/`onPageEnd`/`flushMessageQueue`/`handleReturnData`/`dispatch`/`queue`；**`_fetchQueue` 走 `yy://return/` 回传**（非 runJavaScript 返回值）；**UI 线程守卫**（§5.5） | T-M1-01/02/03 | 单测（FakeWebController）：模拟 H5 callHandler→handler 分发、原生 callHandler→下发、回执路由、启动队列补发 | 2.5 | 桥 |
| **T-M1-05** | 桥 JS 注入 | `onPageEnd` 中 `runJavaScript(BRIDGE_JS)` + 启动消息补发 | T-M1-04/T-M0-06 | 页面就绪后 `window.WebViewJavascriptBridge` 可用 | 0.5 | 桥 |
| **T-M1-06** | 最小回显 H5 | 测试用 H5（`registerHandler('echo')`、`callHandler('getTime')`）+ 一个挂桥的最小测试页 | T-M1-04 | 真机：H5↔原生双向回显成功 | 1 | 桥/Q |
| **T-M1-07 ⚠** | **阻塞性验证 V1** | 真机验证 `yy://` 的 iframe 导航被 `onLoadIntercept` 捕获；产出结论报告 | T-M1-06 | V1 通过；若不通过，按 [00 §5](./00_总体规划.md) 回退方案并更新设计 | 1 | 桥/技术负责人 |
| **T-M1-08** | 桥引擎单测 | `BridgeController`/`MessageCodec`/`HandlerRegistry` 单测套件 | T-M1-04 | 覆盖率 ≥80%（框架 §13） | 1.5 | 桥/Q |

> **M1 出口**：T-M1-06 跑通 + **T-M1-07（V1）通过** + T-M1-08 达标。

---

## M2 · 容器 + 启动 + 资源（轨道 A 容器 / 轨道 B 平台领域）

### 平台层（轨道 B，可与 M1 并行起步）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-01** | 存储/文件 | `KvStore`(@ohos.data.preferences)、`FileSystem`(@ohos.file.fs) | T-M0-01 | 读写 `urlpath`/`upurlpath`；文件增删查 | 1 | 台 |
| **T-M2-02** | 网络/下载 | `HttpClient`(@ohos.net.http 或 rcp)、`Downloader`（断点可选、进度回调） | T-M0-01 | GET 禁缓存；大文件下载带进度 | 1.5 | 台 |
| **T-M2-03** | 解压/并发 | `Unzipper`(@ohos.zlib decompressFile)、`TaskScheduler`(TaskPool/Worker) **仅传 Sendable + emitter 进度**（§9.1） | T-M0-01 | zip 解压成功；解压在子线程、UI 不阻塞 | 1.5 | 台 |
| **T-M2-04** | 权限/上传服务 | `PermissionGuard`（存储/电话/定位/相机/麦克风 用时申请）；`LocalUploadServer`（socket/NAPI 本机端口服务，截图上传用） | T-M0-01 | 权限流程合规；本机端口可访问 | 1.5 | 台 |

### 配置/资源/启动（轨道 B）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-05** | 本地+远程配置 | `ConfigManager`：内置 `rawfile/app_config.json`（§4.2 全键）；远程配置请求（`http://gameconfig 去-换/ .txt?a=ts`，禁缓存）；`showmessage` 阻断、<30 错误文案 | T-M2-02 | 配置键齐全；远程 JSON 正确解析、阻断逻辑生效 | 2 | 台 |
| **T-M2-06** | 分层覆盖 | `VersionResolver`：线上真实格式 单 `agentlist` 树 + **agent→game→channel→market 后层覆盖**（`game_zip` / 数字 id 归一 / gameid 回退 version.xml，纯函数） | T-M2-05 | 单测：多层样例覆盖结果正确（《契约规范》§4.4） | 2 | 台 |
| **T-M2-07** | 资源管理 | `ResourceManager`：路径规范、内置包拷贝+解压、`version.xml` 解析(@ohos.xml)、远程 zip 下载/删旧/解压、版本比较 | T-M2-03/06 | 首启拷贝、版本更新下载解压到正确目录（§5） | 2 | 台 |
| **T-M2-08 ⚠** | **阻塞性验证 V2** | 真机验证 `file://` 大厅页 XHR/fetch 取本地资源；结论报告 | T-M2-07 + T-M2-10 | V2 通过；否则启用 §7.3 自定义协议方案并更新设计 | 1 | 台/桥 |
| **T-M2-09** | app_data 注入 | `AppDataInjector`：加载前写 `<urlpath>/gamehall/app_data.js`（§6 全局变量同名同义） | T-M2-07 | H5 加载时能读到 `app_*` 变量；**时序在加载前**（§7.1 铁律） | 1 | 台 |
| **T-M2-11** | 启动状态机 | `StartupOrchestrator`：INIT→…→ENTER_HALL；可重试/降级/阻断 | T-M2-05/07/09 | 真机按序走通；失败降级本地缓存 | 1.5 | 台 |

### 容器（轨道 A）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M2-13** | **能力插件框架骨架** | `feature_capabilities`：`CapabilityProvider` 接口、`CapabilityContext`、注册表对接桥、组装根 `buildCapabilities()`/`AppModule`（DI 装配）、Provider 样板（框架 §6.1/§6.2） | T-M1-04、T-M0-05 | 一个示例 Provider 可注册并被桥分发；组装根可批量装配 | 1 | 桥 |
| **T-M2-10** | 大厅/子游戏容器 | `BridgeGameContainer`：`Web` + 属性（JS/DOM/file/mixed/cache/geo/zoom）+ 生命周期接桥（`onControllerAttached` 注册能力、`onLoadIntercept` 接桥、`onPageEnd` 注桥）+ **首次进度 100% 推 `appservice`/`setPostUrl`** + `SwitchOverGameData` 同容器 `loadUrl` 切换 + `aboutToDisappear` 清理 | T-M1-08、T-M2-13、T-M0-07 | 入口 URL 规则正确（`weburl` 空→file://，非空→http://，带 `?Launchtype=0`） | 2 | 桥 |
| **T-M2-12** | 集成联调 | 大厅 H5 真机加载 + 进子游戏 | T-M2-08/10/11 | 现有大厅 `index.html` 正常显示、可进子游戏 | 1 | 桥/Q |

> **M2 出口**：T-M2-12 跑通 + **T-M2-08（V2）通过**。
> **注**：`T-M2-13` 能力插件框架骨架是 **M3 全部 Provider 与 T-M2-10 容器注册能力的前置依赖**，须先于铺开能力完成。

---

## M3 · 本期能力（轨道 C，各 Provider 高度并行）

> **前置依赖**：M3 全部 Provider 均依赖 `T-M2-13`（能力插件框架骨架）+ `T-M2-10`（容器可加载）+ `T-M0-04`（契约类型）。这三者就绪后，各 Provider 之间**互不依赖、可多人并行**。
> 通用验收（每个 Provider）：入站 handler 名/参数解析、出站 handler 名/data 结构/时机**逐条对照《契约规范》§8/§9/§12**；异步回传经 UI 线程守卫；真机录用例。

| ID | Provider | 入站 handler | 出站 handler | 关键实现/SDK | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M3-01** | `AppSystemProvider` | `orientation`、`browser`、`finsh`、`openApplyDownloadpath`、`notification`(空) | — | 屏幕方向、拉起浏览器、退出、按包名启动/下载兜底 | 1.5 | 能 |
| **T-M3-02** | `DeviceProvider` | `getTime`、`getphonestate`、`getbattery`、`getwifiLevel`、`getcompareCode`、`getphoneInfo`、`getmarketname`、`getothername`、`getOther` | `getBattery`、`getwifiLevel`、`phonestate` | deviceInfo/telephony/batteryInfo/wifiManager；裸串 vs JSON 严格区分 | 2.5 | 能 |
| **T-M3-03** | `NetworkProvider` | `getnetwork` | `getnetwork`(广播变化) | NetworkKit 监听 | 1 | 能 |
| **T-M3-04** | `VibrateProvider` | `vibrator`、`repeatvibrator`、`canclevibrator` | — | @ohos.vibrator | 0.5 | 能 |
| **T-M3-05** | `ClipboardProvider` | `gameCopytext`、`gamepastetext` | —（gamepastetext 同步返回串） | @ohos.pasteboard | 0.5 | 能 |
| **T-M3-06** | `NavProvider` | `OpenurlTitleData`、`SwitchOverGameData`、`getGameinstall`(同步 0/1)、`backgameData` | `getWebdata` | 打开通用容器(M4)、同容器切换、目录判断 | 1.5 | 能/桥 |
| **T-M3-07** | `PhotoProvider` | `getphoto` | `getphoto`(下载完成数组) | 批量下载图片到本地 + Downloader | 1.5 | 能 |
| **T-M3-08** | `ShakeProvider` | `startshake`、`SwitchShake`、`stopshake` | `shakeEnd`(空串，触发后~1s) | @ohos.sensor 加速度 + 节流；声音可选 | 1.5 | 能 |
| **T-M3-09** | `LocationProvider` | `startlocation`(1连续/否单次)、`getlocationinfo`(同步) | `getlocationinfo`(MaplocationInfo/错误码) | geoLocationManager；**隐私合规初始化**；错误码 0/-1/-2 | 2 | 能 |
| **T-M3-10** | `AudioProvider` | `prepareaudio`(录音)、`mediaTypeAudio`、`srcIsloop`、`voicePlaying` | `getaudiourl`(`{audiourl,time}`)、`gameui_play_voice`、`gameui_stop_voice` | AVPlayer/SoundPool；录音上传(七牛等)；wav 路径拼接 | 3 | 能 |
| **T-M3-11** | `ScanProvider` | `opensaoma` | `getsaomaData` | Scan Kit | 1 | 能 |
| **T-M3-12** | `CameraProvider` | `opencamera` | `getcameraaAddress` | Camera Picker | 1 | 能 |
| **T-M3-13** | `ShareProvider` | `friendsSharetypeUrlToptitleDescript` | `sharesuccess`(仅微信) | 微信分享 SDK；`type==2` 截图：`runJavaScript(canvas.toDataURL)` + LocalUploadServer | 2.5 | 能 |
| **T-M3-14** | `LoginProvider` | `accreditlogin` | `sharelogin`(用户资料) | 微信登录；**建议 code 模式**（密钥下沉） | 2 | 能 |
| **T-M3-15** | `RoomStubProvider`/`PayStubProvider` | `createRoom`/`exitRoom`/`getVideoinfo`/`DragViewvideoIsshow`；`paybrowser`/`getGameplay` | —（不触发） | **占位桩**：空实现 + 日志（§6.5） | 0.5 | 能 |
| **T-M3-16** | 前后台联动 | — | `appservice`('1'/'2') | `UIAbility.onForeground/onBackground` → callHandler | 0.5 | 桥 |
| **T-M3-17** | 契约一致性回归 | 全 44 入站 + 全出站真机逐条核对 | — | 对照《契约规范》§8/§9，出回归报告 | 2 | Q |

> **M3 出口**：本期能力真机逐条通过；**视频房/支付桩被调用不报错不卡死**（T-M3-17 含此项）。

---

## M4 · 通用网页容器（轨道 A，可与 M3 尾段并行）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M4-01** | 通用容器 | `GenericWebContainer`：`Web` + cacheMode(有网 Default/无网 Only) + `javaScriptProxy` 注入 `settings` | T-M2-10 | 打开任意 url、属性正确 | 1.5 | 桥 |
| **T-M4-02** | settings 注入 + 直调 | `SettingsProxy` 6 方法（`backgameData`/`loadurl`/`browser`/`finishweb`/`isexitdialogeshow`/`isbackfinishweb`）+ 3 个 `runJavaScript` 直调（`getWebdata`/`gamebackkeydown`/`backgameData`） | T-M4-01 | 逐一对照《契约规范》§11.3 | 1.5 | 桥 |
| **T-M4-03** | 回传与返回键 | 101 结果经 router/emitter 回上层 → 上层 `callHandler('getWebdata')`；返回键逻辑（isbackfinishweb/isexitdialogeshow） | T-M4-02 | 活动页/收银台/客服打开、回传、返回正常 | 1 | 桥 |

---

## M5 · 性能与加固（轨道 D，部分贯穿 M3/M4）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M5-01 ☑** | Web 保活/激活（**双 Web 槽**模型，框架 §7.5）| 大厅 Web 常驻(Stack 内，subgame 时 Hidden+onInactive)；子游戏 Web 进入创建/返回销毁；**同时只一个激活**：WebSlot 激活协议(appservice'2'/'1' + setActive 桥闸门 + forEachForeground/Background + onActive/onInactive)；各 Web 独立桥+能力。已落地 WebSlot + 双 Web 容器 | T-M2-10 | ☑ 真机验证：返回保留大厅(未重载)、接口不串、非激活端停 native 监听 | 3 | 桥 |
| **T-M5-02 ☑** | 切换与桥重绑 | 子游戏 Web 创建即注册自己的桥+能力；销毁时 dispose；大厅桥常驻不重绑。已替换单 WebView loadUrl。**真机验证：大厅未重载(常驻)、子游戏 LT=1 独立桥、appservice 1/2 互斥、backgameData→getWebdata 回传** | T-M5-01 | ☑ 切换后两端桥各自正常、大厅状态保留 | 1.5 | 桥 |
| **T-M5-03 ☑** | 高频节流/批处理 | common `Debouncer/Throttler`；NetworkProvider 网络变化 300ms 防抖合并；连续定位受系统 5s 约束、Device 被动查询无需节流；lzyzsd 单条协议不跨条合并（保 H5 零改动） | T-M3-* | 跨引擎调用次数下降、无卡顿（真机终验待真机阶段） | 1 | 桥 |
| **T-M5-04 ☑** | 崩溃兜底/内存 | `onRenderExited` 重载；`aboutToDisappear` 彻底清理 | T-M2-10 | 渲染子进程崩溃可自恢复 | 1 | 桥 |
| **T-M5-05 ☑** | 安全加固 | WebDebug 按 `isDebug` 守卫；密钥下沉服务端；明文 HTTP 域名白名单；file 跨域最小授权；自定义 scheme 注册(module.json5)；日志脱敏 | 各能力就绪 | 安全审查清单（附录 B）全过 | 2 | 桥/台 |
| **T-M5-06 ☑** | 可观测 | `BridgeTracer` 全链路 traceId（桥流转 OUTBOUND/INBOUND/HANDLER/RESPONSE/DISPATCH/RETURN 打点，Message 非协议 traceId 字段）；entry `installErrorSink` 打通 ErrorCenter Report→APM/Crash | T-M0-05 | 能还原一条桥消息全链路 | 1 | 台 |
| **T-M5-07 ☑** | 冷启动优化 | StartupOrchestrator 远程配置与内置资源准备并行化（max 而非求和）；各阶段 `[startup]` 耗时打点 | T-M2-11 | 冷启动到首帧达标（<2s 基线；真机量化待真机阶段） | 1 | 台 |
| **T-M5-08 ⏸** | 包体/渠道裁剪（可选） | 能力 Provider 按渠道用 HSP 动态特性裁剪；包体瘦身（框架 §9 包体） | T-M3-* | **延后 M6**：最大包体头微信/七牛 SDK 至 M6 才真集成，现裁剪意义有限；HAR 不支持条件编译，真裁剪须 HSP 化 | 1 | 桥/台 |

---

## M6 · 暂缓能力集成（按需，可延后）

| ID | 目标 | 产出物 | 依赖 | 验收 | 估时 | 角色 |
|---|---|---|---|---|---|---|
| **T-M6-01** | 视频房真实 | `RoomProvider`（声网 RTC HarmonyOS SDK）替换桩 | M3 完成 | `createRoom/exitRoom/getVideoinfo/DragViewvideoIsshow` + 出站 `getVideoinfo` 真打通；H5 零改动 | 视 SDK | 能 |
| **T-M6-02** | 支付真实 | `PayProvider`（浏览器收银台/或 App 内支付）替换桩；如启用 App 内支付则补 `PayuserPaytypePaystate` | M3 完成 | 支付闭环；H5 零改动 | 视 SDK | 能 |
| **T-M6-03** | 补齐项（可选） | 抖音/快手登录(code)、主动截图 `getCanvasBase64`、QQ/抖音分享回传统一 | 按需 | 对照框架 §6.4 | 视需求 | 能 |

---

## 任务总数与估时汇总

| 里程碑 | 任务数 | 估时(pd) |
|---|---|---|
| M0 | 7 | 7 |
| M1 | 8 | 9 |
| M2 | 13 | 19 |
| M3 | 17 | 24.5 |
| M4 | 3 | 4 |
| M5 | 8 | 10 |
| **合计(M0–M5)** | **56** | **≈73.5 pd（含测试/缓冲）** |
| M6 | 3 | 视集成 |

> 估时为"工作量"非"日历"。3 人并行、关键路径串行下，日历周期约 5–7 周（见 [00 §1](./00_总体规划.md)）。

---

## 附：框架设计 → 计划覆盖矩阵（完整性自检）

> 逐条证明《框架设计与开发指南》每个章节都有计划任务承接，**无遗漏**。

| 框架章节 | 计划任务 | 状态 |
|---|---|---|
| §1 设计原则 | 贯穿 DoD（[00 §7](./00_总体规划.md)）与代码规范（00 §6） | ✓ 原则类，非任务 |
| §2 能力映射总表 | 各能力/桥任务的实现依据（引用表） | ✓ 参考 |
| §3 分层架构 / §4 工程结构 | T-M0-01/02（建 entry+6 HAR）、**T-M0-07**（EntryAbility/路由/Splash） | ✓ |
| §5.1–5.2 桥协议/控制器 | T-M1-02/03/04/05 | ✓ |
| §5.3 同步/异步 | T-M1-04 + 各 Provider | ✓ |
| §5.4 裸串vsJSON | T-M0-04（payloadType） | ✓ |
| §5.5 线程模型 | T-M1-04（UI 守卫） | ✓ |
| §5.6 IWebController | T-M1-01 | ✓ |
| §6.1/6.2 插件框架/组装根/DI | **T-M2-13**（能力插件框架骨架） | ✓ 已补 |
| §6.3 Provider 样板/截图分享 | T-M3-09(样板)、T-M3-13(分享截图) | ✓ |
| §6.4 补齐项 | T-M6-03 | ✓ |
| §6.5 占位桩 | T-M3-15 | ✓ |
| §7.1 大厅/子游戏容器 | T-M2-10 | ✓ |
| §7.2 通用网页容器 | T-M4-01/02/03 | ✓ |
| §7.3 file:// 跨域 | T-M2-08（V2 阻塞验证） | ✓ |
| §8.1 启动状态机 | T-M2-11 | ✓ |
| §8.2 ConfigManager | T-M2-05 | ✓ |
| §8.2 分层覆盖 | T-M2-06（VersionResolver） | ✓ |
| §8.3 ResourceManager | T-M2-07 | ✓ |
| §8.4 AppDataInjector | T-M2-09 | ✓ |
| §9 性能（保活/并发/批处理/就绪渲染/内存/冷启动） | T-M5-01/02/03/04/07、T-M2-03 | ✓ |
| §9 包体/HSP 裁剪 | **T-M5-08** | ✓ 已补 |
| §9.1 TaskPool Sendable | T-M2-03 | ✓ |
| §10 契约类型 SSOT | T-M0-04 | ✓ |
| §10 日志/追踪 | T-M0-05（Tracer）、T-M5-06 | ✓ |
| §10 ErrorCenter | **T-M0-05**（已含 ErrorCenter） | ✓ 已补 |
| §10 事件总线/DI | T-M0-05 | ✓ |
| §10 权限 | T-M2-04（PermissionGuard） | ✓ |
| §10 安全 | T-M5-05 | ✓ |
| §10 可测试 | T-M1-01/08 + 各单测 | ✓ |
| §11 可追溯矩阵 | [02 测试与验收 §4](./02_测试与验收计划.md) 契约核对清单 + 本矩阵 | ✓ |
| §12 路线图 M0–M6 | 本 WBS 全部里程碑 | ✓ |
| §13 验收标准 | [02 测试与验收计划](./02_测试与验收计划.md) | ✓ |
| 附录 A ArkTS/ArkUI 适配 | 贯穿 DoD（[00 §7](./00_总体规划.md) 已引用 §5.5/§9.1）+ T-M0-07/T-M2-10 落地 | ✓ |
| 附录 B 生产加固合规 | T-M5-05（逐项）+ [02 §5 M5 Gate](./02_测试与验收计划.md) | ✓ |

> **结论**：框架设计指南全部章节均有计划任务承接，覆盖完整。本次自检新增 `T-M0-07`、`T-M2-13`、`T-M5-08` 及 `T-M0-05` 的 ErrorCenter，补齐了能力插件框架骨架、入口/路由壳、ErrorCenter、包体裁剪四处缺口。
