@jsonstudio/rcc 0.89.1803 → 0.89.1959

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/configsamples/config.json +19 -0
  2. package/configsamples/provider/deepseek/config.v1.json +59 -0
  3. package/dist/build-info.js +2 -2
  4. package/dist/cli/commands/claude.d.ts +4 -0
  5. package/dist/cli/commands/claude.js +56 -0
  6. package/dist/cli/commands/claude.js.map +1 -0
  7. package/dist/cli/commands/clock-admin.d.ts +20 -0
  8. package/dist/cli/commands/clock-admin.js +234 -0
  9. package/dist/cli/commands/clock-admin.js.map +1 -0
  10. package/dist/cli/commands/code.d.ts +0 -42
  11. package/dist/cli/commands/code.js +4 -414
  12. package/dist/cli/commands/code.js.map +1 -1
  13. package/dist/cli/commands/codex.d.ts +4 -0
  14. package/dist/cli/commands/codex.js +43 -0
  15. package/dist/cli/commands/codex.js.map +1 -0
  16. package/dist/cli/commands/examples.js +13 -16
  17. package/dist/cli/commands/examples.js.map +1 -1
  18. package/dist/cli/commands/init/basic.d.ts +40 -0
  19. package/dist/cli/commands/init/basic.js +482 -0
  20. package/dist/cli/commands/init/basic.js.map +1 -0
  21. package/dist/cli/commands/init/camoufox.d.ts +7 -0
  22. package/dist/cli/commands/init/camoufox.js +59 -0
  23. package/dist/cli/commands/init/camoufox.js.map +1 -0
  24. package/dist/cli/commands/init/interactive.d.ts +18 -0
  25. package/dist/cli/commands/init/interactive.js +223 -0
  26. package/dist/cli/commands/init/interactive.js.map +1 -0
  27. package/dist/cli/commands/init/shared.d.ts +66 -0
  28. package/dist/cli/commands/init/shared.js +9 -0
  29. package/dist/cli/commands/init/shared.js.map +1 -0
  30. package/dist/cli/commands/init/workflows.d.ts +29 -0
  31. package/dist/cli/commands/init/workflows.js +341 -0
  32. package/dist/cli/commands/init/workflows.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +2 -26
  34. package/dist/cli/commands/init.js +220 -53
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/launcher-kernel.d.ts +78 -0
  37. package/dist/cli/commands/launcher-kernel.js +1194 -0
  38. package/dist/cli/commands/launcher-kernel.js.map +1 -0
  39. package/dist/cli/commands/start.js +27 -1
  40. package/dist/cli/commands/start.js.map +1 -1
  41. package/dist/cli/commands/status.d.ts +2 -0
  42. package/dist/cli/commands/status.js +24 -1
  43. package/dist/cli/commands/status.js.map +1 -1
  44. package/dist/cli/commands/stop.d.ts +1 -0
  45. package/dist/cli/commands/stop.js +201 -4
  46. package/dist/cli/commands/stop.js.map +1 -1
  47. package/dist/cli/commands/tmux-inject.d.ts +20 -0
  48. package/dist/cli/commands/tmux-inject.js +212 -0
  49. package/dist/cli/commands/tmux-inject.js.map +1 -0
  50. package/dist/cli/config/init-provider-catalog.js +34 -0
  51. package/dist/cli/config/init-provider-catalog.js.map +1 -1
  52. package/dist/cli/register/claude-command.d.ts +3 -0
  53. package/dist/cli/register/claude-command.js +5 -0
  54. package/dist/cli/register/claude-command.js.map +1 -0
  55. package/dist/cli/register/clock-admin-command.d.ts +3 -0
  56. package/dist/cli/register/clock-admin-command.js +5 -0
  57. package/dist/cli/register/clock-admin-command.js.map +1 -0
  58. package/dist/cli/register/codex-command.d.ts +3 -0
  59. package/dist/cli/register/codex-command.js +5 -0
  60. package/dist/cli/register/codex-command.js.map +1 -0
  61. package/dist/cli/register/status-config-commands.d.ts +2 -0
  62. package/dist/cli/register/status-config-commands.js.map +1 -1
  63. package/dist/cli/register/tmux-inject-command.d.ts +3 -0
  64. package/dist/cli/register/tmux-inject-command.js +5 -0
  65. package/dist/cli/register/tmux-inject-command.js.map +1 -0
  66. package/dist/cli/server/port-utils.d.ts +3 -2
  67. package/dist/cli/server/port-utils.js +171 -32
  68. package/dist/cli/server/port-utils.js.map +1 -1
  69. package/dist/cli.js +45 -6
  70. package/dist/cli.js.map +1 -1
  71. package/dist/client/gemini/gemini-protocol-client.js +56 -5
  72. package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
  73. package/dist/commands/token-daemon.js +59 -7
  74. package/dist/commands/token-daemon.js.map +1 -1
  75. package/dist/commands/validate.js +87 -15
  76. package/dist/commands/validate.js.map +1 -1
  77. package/dist/config/routecodex-config-loader.js +31 -2
  78. package/dist/config/routecodex-config-loader.js.map +1 -1
  79. package/dist/docs/daemon-admin-ui.html +948 -74
  80. package/dist/index.d.ts +1 -0
  81. package/dist/index.js +325 -37
  82. package/dist/index.js.map +1 -1
  83. package/dist/manager/quota/provider-quota-center.js +8 -14
  84. package/dist/manager/quota/provider-quota-center.js.map +1 -1
  85. package/dist/modules/llmswitch/bridge.d.ts +39 -0
  86. package/dist/modules/llmswitch/bridge.js +169 -0
  87. package/dist/modules/llmswitch/bridge.js.map +1 -1
  88. package/dist/modules/pipeline/utils/colored-logger.js +1 -1
  89. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  90. package/dist/providers/auth/deepseek-account-auth.d.ts +39 -0
  91. package/dist/providers/auth/deepseek-account-auth.js +329 -0
  92. package/dist/providers/auth/deepseek-account-auth.js.map +1 -0
  93. package/dist/providers/auth/deepseek-account-token-acquirer.d.ts +15 -0
  94. package/dist/providers/auth/deepseek-account-token-acquirer.js +644 -0
  95. package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -0
  96. package/dist/providers/auth/oauth-lifecycle.js +26 -4
  97. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  98. package/dist/providers/auth/oauth-repair-cooldown.d.ts +5 -0
  99. package/dist/providers/auth/oauth-repair-cooldown.js +39 -0
  100. package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
  101. package/dist/providers/auth/token-scanner/index.d.ts +6 -0
  102. package/dist/providers/auth/token-scanner/index.js +53 -0
  103. package/dist/providers/auth/token-scanner/index.js.map +1 -1
  104. package/dist/providers/core/api/provider-config.d.ts +17 -2
  105. package/dist/providers/core/api/provider-types.d.ts +6 -0
  106. package/dist/providers/core/api/provider-types.js.map +1 -1
  107. package/dist/providers/core/config/camoufox-launcher.d.ts +7 -0
  108. package/dist/providers/core/config/camoufox-launcher.js +68 -21
  109. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  110. package/dist/providers/core/config/service-profiles.js +19 -0
  111. package/dist/providers/core/config/service-profiles.js.map +1 -1
  112. package/dist/providers/core/contracts/deepseek-provider-contract.d.ts +34 -0
  113. package/dist/providers/core/contracts/deepseek-provider-contract.js +100 -0
  114. package/dist/providers/core/contracts/deepseek-provider-contract.js.map +1 -0
  115. package/dist/providers/core/runtime/anthropic-http-provider.d.ts +0 -5
  116. package/dist/providers/core/runtime/anthropic-http-provider.js +0 -26
  117. package/dist/providers/core/runtime/anthropic-http-provider.js.map +1 -1
  118. package/dist/providers/core/runtime/deepseek-http-provider.d.ts +35 -0
  119. package/dist/providers/core/runtime/deepseek-http-provider.js +373 -0
  120. package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -0
  121. package/dist/providers/core/runtime/deepseek-session-pow.d.ts +55 -0
  122. package/dist/providers/core/runtime/deepseek-session-pow.js +422 -0
  123. package/dist/providers/core/runtime/deepseek-session-pow.js.map +1 -0
  124. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +0 -3
  125. package/dist/providers/core/runtime/gemini-cli-http-provider.js +0 -72
  126. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  127. package/dist/providers/core/runtime/gemini-http-provider.d.ts +1 -7
  128. package/dist/providers/core/runtime/gemini-http-provider.js +3 -110
  129. package/dist/providers/core/runtime/gemini-http-provider.js.map +1 -1
  130. package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
  131. package/dist/providers/core/runtime/http-request-executor.js +4 -0
  132. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  133. package/dist/providers/core/runtime/http-transport-provider.d.ts +10 -4
  134. package/dist/providers/core/runtime/http-transport-provider.js +308 -82
  135. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  136. package/dist/providers/core/runtime/iflow-http-provider.d.ts +0 -4
  137. package/dist/providers/core/runtime/iflow-http-provider.js +0 -28
  138. package/dist/providers/core/runtime/iflow-http-provider.js.map +1 -1
  139. package/dist/providers/core/runtime/provider-factory.d.ts +5 -0
  140. package/dist/providers/core/runtime/provider-factory.js +59 -6
  141. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  142. package/dist/providers/core/runtime/responses-provider.d.ts +0 -2
  143. package/dist/providers/core/runtime/responses-provider.js +0 -11
  144. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  145. package/dist/providers/core/strategies/oauth-device-flow.js +16 -1
  146. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  147. package/dist/providers/core/utils/provider-type-utils.js +2 -1
  148. package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
  149. package/dist/providers/profile/families/anthropic-profile.d.ts +2 -0
  150. package/dist/providers/profile/families/anthropic-profile.js +32 -0
  151. package/dist/providers/profile/families/anthropic-profile.js.map +1 -0
  152. package/dist/providers/profile/families/antigravity-profile.d.ts +2 -0
  153. package/dist/providers/profile/families/antigravity-profile.js +109 -0
  154. package/dist/providers/profile/families/antigravity-profile.js.map +1 -0
  155. package/dist/providers/profile/families/glm-profile.d.ts +2 -0
  156. package/dist/providers/profile/families/glm-profile.js +48 -0
  157. package/dist/providers/profile/families/glm-profile.js.map +1 -0
  158. package/dist/providers/profile/families/iflow-profile.d.ts +2 -0
  159. package/dist/providers/profile/families/iflow-profile.js +232 -0
  160. package/dist/providers/profile/families/iflow-profile.js.map +1 -0
  161. package/dist/providers/profile/families/qwen-profile.d.ts +2 -0
  162. package/dist/providers/profile/families/qwen-profile.js +14 -0
  163. package/dist/providers/profile/families/qwen-profile.js.map +1 -0
  164. package/dist/providers/profile/families/responses-profile.d.ts +2 -0
  165. package/dist/providers/profile/families/responses-profile.js +28 -0
  166. package/dist/providers/profile/families/responses-profile.js.map +1 -0
  167. package/dist/providers/profile/profile-contracts.d.ts +74 -0
  168. package/dist/providers/profile/profile-contracts.js +2 -0
  169. package/dist/providers/profile/profile-contracts.js.map +1 -0
  170. package/dist/providers/profile/profile-registry.d.ts +3 -0
  171. package/dist/providers/profile/profile-registry.js +40 -0
  172. package/dist/providers/profile/profile-registry.js.map +1 -0
  173. package/dist/providers/profile/provider-directory.d.ts +2 -0
  174. package/dist/providers/profile/provider-directory.js +55 -0
  175. package/dist/providers/profile/provider-directory.js.map +1 -0
  176. package/dist/providers/profile/provider-profile-loader.js +43 -3
  177. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  178. package/dist/providers/profile/provider-profile.d.ts +8 -0
  179. package/dist/scripts/deepseek/pow-solver.mjs +146 -0
  180. package/dist/scripts/deepseek/sha3_wasm_bg.7b9ca65ddd.wasm +0 -0
  181. package/dist/server/handlers/config-admin-handler.js +27 -0
  182. package/dist/server/handlers/config-admin-handler.js.map +1 -1
  183. package/dist/server/runtime/http-server/clock-client-registry.d.ts +113 -0
  184. package/dist/server/runtime/http-server/clock-client-registry.js +592 -0
  185. package/dist/server/runtime/http-server/clock-client-registry.js.map +1 -0
  186. package/dist/server/runtime/http-server/clock-client-routes.d.ts +2 -0
  187. package/dist/server/runtime/http-server/clock-client-routes.js +481 -0
  188. package/dist/server/runtime/http-server/clock-client-routes.js.map +1 -0
  189. package/dist/server/runtime/http-server/clock-daemon-inject-config.d.ts +1 -0
  190. package/dist/server/runtime/http-server/clock-daemon-inject-config.js +11 -0
  191. package/dist/server/runtime/http-server/clock-daemon-inject-config.js.map +1 -0
  192. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +3 -3
  193. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
  194. package/dist/server/runtime/http-server/daemon-admin/auth-session.d.ts +1 -0
  195. package/dist/server/runtime/http-server/daemon-admin/auth-session.js +18 -2
  196. package/dist/server/runtime/http-server/daemon-admin/auth-session.js.map +1 -1
  197. package/dist/server/runtime/http-server/daemon-admin/control-handler.js +2 -15
  198. package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
  199. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +65 -7
  200. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  201. package/dist/server/runtime/http-server/executor-metadata.js +37 -1
  202. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  203. package/dist/server/runtime/http-server/executor-provider.js +55 -0
  204. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  205. package/dist/server/runtime/http-server/executor-response.js +49 -1
  206. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  207. package/dist/server/runtime/http-server/index.d.ts +10 -0
  208. package/dist/server/runtime/http-server/index.js +534 -9
  209. package/dist/server/runtime/http-server/index.js.map +1 -1
  210. package/dist/server/runtime/http-server/managed-process-probe.d.ts +6 -0
  211. package/dist/server/runtime/http-server/managed-process-probe.js +294 -0
  212. package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -0
  213. package/dist/server/runtime/http-server/middleware.js +16 -1
  214. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  215. package/dist/server/runtime/http-server/provider-utils.js +6 -2
  216. package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
  217. package/dist/server/runtime/http-server/request-executor.d.ts +1 -0
  218. package/dist/server/runtime/http-server/request-executor.js +360 -35
  219. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  220. package/dist/server/runtime/http-server/routes.js +95 -3
  221. package/dist/server/runtime/http-server/routes.js.map +1 -1
  222. package/dist/server/runtime/http-server/stats-manager.d.ts +10 -0
  223. package/dist/server/runtime/http-server/stats-manager.js +119 -16
  224. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  225. package/dist/server/runtime/http-server/tmux-session-probe.d.ts +3 -0
  226. package/dist/server/runtime/http-server/tmux-session-probe.js +101 -0
  227. package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -0
  228. package/dist/server/utils/stage-logger.js +21 -5
  229. package/dist/server/utils/stage-logger.js.map +1 -1
  230. package/dist/token-daemon/index.js +59 -10
  231. package/dist/token-daemon/index.js.map +1 -1
  232. package/dist/token-daemon/server-utils.d.ts +1 -0
  233. package/dist/token-daemon/server-utils.js +4 -1
  234. package/dist/token-daemon/server-utils.js.map +1 -1
  235. package/dist/token-daemon/token-daemon.js +38 -4
  236. package/dist/token-daemon/token-daemon.js.map +1 -1
  237. package/dist/token-daemon/token-types.d.ts +1 -1
  238. package/dist/token-daemon/token-types.js +2 -1
  239. package/dist/token-daemon/token-types.js.map +1 -1
  240. package/dist/token-daemon/token-utils.js +5 -2
  241. package/dist/token-daemon/token-utils.js.map +1 -1
  242. package/dist/utils/clock-client-token.d.ts +3 -0
  243. package/dist/utils/clock-client-token.js +54 -0
  244. package/dist/utils/clock-client-token.js.map +1 -0
  245. package/dist/utils/managed-server-pids.d.ts +25 -0
  246. package/dist/utils/managed-server-pids.js +176 -0
  247. package/dist/utils/managed-server-pids.js.map +1 -0
  248. package/dist/utils/process-lifecycle-logger.d.ts +8 -0
  249. package/dist/utils/process-lifecycle-logger.js +151 -0
  250. package/dist/utils/process-lifecycle-logger.js.map +1 -0
  251. package/dist/utils/runtime-exit-forensics.d.ts +30 -0
  252. package/dist/utils/runtime-exit-forensics.js +101 -0
  253. package/dist/utils/runtime-exit-forensics.js.map +1 -0
  254. package/dist/utils/shutdown-caller-context.d.ts +22 -0
  255. package/dist/utils/shutdown-caller-context.js +25 -0
  256. package/dist/utils/shutdown-caller-context.js.map +1 -0
  257. package/docs/PROVIDERS_BUILTIN.md +8 -0
  258. package/docs/PROVIDER_TYPES.md +3 -1
  259. package/docs/SERVERTOOL_PRE_COMMAND_HOOKS.md +85 -0
  260. package/docs/clock-client-daemon-design.md +343 -0
  261. package/docs/daemon-admin-ui.html +948 -74
  262. package/docs/providers/deepseek-web-provider-design.md +192 -0
  263. package/docs/routing-instructions.md +4 -1
  264. package/docs/stop-message-auto.md +4 -3
  265. package/docs/v2-architecture/PROVIDER-V2-CHANGESET-RELEASE-CHECKLIST.md +80 -0
  266. package/docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md +225 -0
  267. package/docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md +88 -0
  268. package/docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md +164 -0
  269. package/docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md +201 -0
  270. package/docs/v2-architecture/PROVIDER-V2-PROFILE-GEMINI-DRAFT.md +56 -0
  271. package/docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md +102 -0
  272. package/docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md +163 -0
  273. package/package.json +10 -9
  274. package/scripts/copy-compat-assets.mjs +18 -0
  275. package/scripts/copy-modules-config.mjs +1 -0
  276. package/scripts/deepseek/pow-solver.mjs +146 -0
  277. package/scripts/deepseek/sha3_wasm_bg.7b9ca65ddd.wasm +0 -0
  278. package/scripts/ensure-cli-executable.mjs +64 -0
  279. package/scripts/install-global.sh +5 -2
  280. package/scripts/install.sh +1 -1
  281. package/scripts/monitor/daemon-kill-watch.mjs +184 -0
  282. package/scripts/monitor/port-kill-watch.sh +74 -0
  283. package/scripts/quick-install.sh +1 -1
@@ -0,0 +1,164 @@
1
+ # Provider V2 分阶段迁移与回滚方案(Draft)
2
+
3
+ - Status: Draft
4
+ - Date: 2026-02-09
5
+ - Owner: routecodex-113.4
6
+ - Strategy: 新实现主路径 + 旧实现影子路径;验证通过后移除旧实现
7
+
8
+ ## 1. 迁移总原则(已确认)
9
+
10
+ 本次 Provider 重构采用以下固定策略:
11
+
12
+ 1. 对每个替换点,**新实现先成为主路径**。
13
+ 2. 原实现保留为影子路径(shadow),并行执行只用于比对,不参与主响应。
14
+ 3. 当测试与 replay 指标达标后,移除原实现。
15
+
16
+ > 该策略与“先实现、不连线”并不冲突:先完成可调用实现;进入连线阶段时采用“新主旧影子”的切换方式。
17
+
18
+ ## 2. 影子模式定义
19
+
20
+ ### 2.1 主路径(new-primary)
21
+
22
+ - 用户请求只返回新实现结果。
23
+ - 失败直接按 fail-fast 上报,不静默回落旧实现。
24
+
25
+ ### 2.2 影子路径(legacy-shadow)
26
+
27
+ - 同 shape 输入驱动旧实现并记录输出。
28
+ - 不影响主请求响应。
29
+ - 仅记录:关键字段、错误类型、耗时、shape diff。
30
+
31
+ ### 2.3 比对维度
32
+
33
+ - Request shape:endpoint、headers 关键字段、body 关键字段。
34
+ - Response shape:status、error envelope、核心 data path。
35
+ - Error classification:`statusCode / code / upstreamCode`。
36
+ - 性能:P50/P95 latency 增量。
37
+
38
+ ## 3. 分阶段与 Gate
39
+
40
+ ## Phase 0(设计冻结)
41
+
42
+ - 输入:`113.1/113.2/113.3` 草案已通过。
43
+ - 产出:替换点清单 + 每点 shadow 观测字段。
44
+
45
+ ### Entry Gate
46
+
47
+ - ADR 决策冻结。
48
+ - 迁移矩阵完整(Mxx 对应关系清晰)。
49
+
50
+ ### Exit Gate
51
+
52
+ - 每个 Mxx 指定 owner、wave、回滚键。
53
+
54
+ ## Phase 1(实现不连线)
55
+
56
+ - 新增 kernel/protocol/profile 模块,但不接入主执行流。
57
+ - 增加模块级单测与样本对比。
58
+
59
+ ### Entry Gate
60
+
61
+ - 模块接口与 registry 契约稳定。
62
+
63
+ ### Exit Gate
64
+
65
+ - 单测通过。
66
+ - `npx tsc --noEmit` 通过。
67
+ - 不影响现网路径(零行为变化)。
68
+
69
+ ## Phase 2(新主旧影子切换)
70
+
71
+ - 按 wave 逐批连线(Wave-1 iflow -> Wave-2 antigravity/gemini-cli -> Wave-3 清理层)。
72
+ - 连线后新实现主路径生效,旧实现影子并行观测。
73
+
74
+ ### Entry Gate
75
+
76
+ - 该 wave 对应实现与测试准备完成。
77
+ - shadow 观测点已接入日志/快照。
78
+
79
+ ### Exit Gate(每个 wave 必须全部满足)
80
+
81
+ 1. 构建验证通过:
82
+ - `npm run build:dev`
83
+ - `npm run install:global`
84
+ 2. 类型与单测通过:
85
+ - `npx tsc --noEmit`
86
+ - 该 wave 相关测试集全绿
87
+ 3. 回放验证通过:
88
+ - 至少一组 same-shape replay(目标 provider)
89
+ - 至少一组 control replay(不受影响 provider)
90
+ 4. shadow 比对达标:
91
+ - 无 P0/P1 shape diff
92
+ - 关键错误分类一致率达标(建议 >= 99%)
93
+
94
+ ## Phase 3(移除旧实现)
95
+
96
+ - 在 wave exit gate 连续达标后,删除对应 legacy 代码路径。
97
+ - 删除后执行全量回归与 replay。
98
+
99
+ ### Entry Gate
100
+
101
+ - 连续 N 次(建议 3 次)回放稳定。
102
+ - 无新增高优先级缺陷。
103
+
104
+ ### Exit Gate
105
+
106
+ - 旧实现路径删除完成。
107
+ - 文档与测试更新完成。
108
+ - `bd` 任务附证据后关闭。
109
+
110
+ ## 4. 回滚策略
111
+
112
+ ## 4.1 回滚触发条件
113
+
114
+ 任一条件满足即回滚该 wave:
115
+
116
+ - 新主路径出现 P0/P1 功能偏差。
117
+ - 关键 provider 出现不可接受错误激增(例如 4xx/5xx 激增)。
118
+ - same-shape 或 control replay 失败。
119
+
120
+ ## 4.2 回滚动作
121
+
122
+ 1. 停止该 wave 的继续连线。
123
+ 2. 切回旧实现主路径(保留新实现为影子,定位差异)。
124
+ 3. 保留失败证据(requestId/providerKey/route/model/before-after diff)。
125
+ 4. 修复后重新走该 wave gate,不跨级推进。
126
+
127
+ ## 4.3 回滚粒度
128
+
129
+ - 以 wave 为最小回滚单位。
130
+ - wave 内可按 provider family 子单元回滚(例如仅回滚 iflow)。
131
+
132
+ ## 5. Wave 拆分建议
133
+
134
+ ### Wave-1(iflow)
135
+
136
+ - 包含 M01~M07 + M18(iflow)。
137
+ - 核心目标:iflowWebSearch 去重、UA/signature、business envelope 归一。
138
+
139
+ ### Wave-2(antigravity/gemini-cli)
140
+
141
+ - 包含 M09/M10/M12/M14/M17。
142
+ - 核心目标:fallback/error wrapping/header policy 下沉。
143
+
144
+ ### Wave-3(协议/工厂/目录清理)
145
+
146
+ - 包含 M11/M13/M15/M16。
147
+ - 核心目标:protocol adapter 定型、factory 仅装配、目录映射单一事实源。
148
+
149
+ ## 6. 证据模板(任务关闭必填)
150
+
151
+ 每个 wave 的 BD 关闭 notes 至少包含:
152
+
153
+ - 构建/类型/测试命令与结果。
154
+ - same-shape replay 证据(requestId、providerKey、model、route)。
155
+ - control replay 证据(不受影响 provider)。
156
+ - shadow 比对摘要(diff 数、严重级别、结论)。
157
+ - 回滚演练结果(如有)。
158
+
159
+ ## 7. 执行纪律
160
+
161
+ - 不允许同时连线多个高风险 family。
162
+ - 不允许在未达 gate 时删除旧实现。
163
+ - 不允许把 compat 逻辑迁入 provider transport。
164
+
@@ -0,0 +1,201 @@
1
+ # Provider V2 Profile API 与 Registry 机制(Draft)
2
+
3
+ - Status: Draft
4
+ - Date: 2026-02-09
5
+ - Owner: routecodex-113.3
6
+ - Strategy: 先实现各层模块,不连线;按 Wave 批次接线
7
+
8
+ ## 1. 目标与输入约束
9
+
10
+ 本草案定义 Provider 分层中 `Profile` 的抽象契约与注册解析机制,遵循已确认决策:
11
+
12
+ - 配置显式字段 `providerProtocol + providerId + compatibilityProfile` 决定协议、品牌分支与 compat。
13
+ - `providerId / providerFamily` 单一事实来源来自“配置文件 + provider 目录映射”。
14
+ - Gemini CLI 长期作为 Gemini 协议变体。
15
+
16
+ ## 2. 当前代码的结构约束(作为设计边界)
17
+
18
+ - 已存在声明式 profile 输入:`src/providers/profile/provider-profile.ts`。
19
+ - 已存在配置装载器:`src/providers/profile/provider-profile-loader.ts`。
20
+ - 已存在 runtime metadata 承载 `providerProtocol/providerFamily/compatibilityProfile`:`src/providers/core/runtime/provider-runtime-metadata.ts`。
21
+ - 当前 transport 内仍有大量品牌分支(iflow/antigravity 等),需要迁移到 family profile:`src/providers/core/runtime/http-transport-provider.ts`、`src/providers/core/runtime/http-request-executor.ts`。
22
+
23
+ ## 3. 抽象契约(API 草案)
24
+
25
+ > 下列接口为目标 API;本阶段只定义,不替换现网调用。
26
+
27
+ ### 3.1 标识与解析结果
28
+
29
+ ```ts
30
+ type ProtocolId =
31
+ | 'openai-chat'
32
+ | 'openai-responses'
33
+ | 'anthropic-messages'
34
+ | 'gemini-chat';
35
+
36
+ interface ProviderDirectoryEntry {
37
+ providerId: string;
38
+ providerFamily: string;
39
+ allowedProtocols: ProtocolId[];
40
+ defaultModuleType?: string;
41
+ defaultProfileId: string;
42
+ }
43
+
44
+ interface ResolvedProviderBinding {
45
+ providerId: string;
46
+ providerFamily: string;
47
+ providerProtocol: ProtocolId;
48
+ profileId: string;
49
+ compatibilityProfile: string;
50
+ moduleType?: string;
51
+ }
52
+ ```
53
+
54
+ ### 3.2 Profile 能力接口
55
+
56
+ ```ts
57
+ interface RequestPolicyInput {
58
+ endpoint: string;
59
+ headers: Record<string, string>;
60
+ body: Record<string, unknown>;
61
+ runtime: ProviderRuntimeMetadata;
62
+ }
63
+
64
+ interface ResponsePolicyInput {
65
+ response: unknown;
66
+ runtime: ProviderRuntimeMetadata;
67
+ }
68
+
69
+ interface ErrorPolicyInput {
70
+ error: unknown;
71
+ runtime: ProviderRuntimeMetadata;
72
+ }
73
+
74
+ interface ProviderFamilyProfile {
75
+ id: string; // e.g. 'iflow/default'
76
+ providerFamily: string;
77
+
78
+ applyRequestPolicy?(input: RequestPolicyInput): RequestPolicyInput;
79
+ applyResponsePolicy?(input: ResponsePolicyInput): ResponsePolicyInput;
80
+ mapError?(input: ErrorPolicyInput): ProviderErrorAugmented;
81
+ }
82
+ ```
83
+
84
+ ### 3.3 Registry 契约
85
+
86
+ ```ts
87
+ interface ProviderProfileRegistry {
88
+ register(entry: ProviderDirectoryEntry, profile: ProviderFamilyProfile): void;
89
+ resolve(binding: {
90
+ providerProtocol: string;
91
+ providerId: string;
92
+ compatibilityProfile: string;
93
+ moduleType?: string;
94
+ }): ResolvedProviderBinding;
95
+ getProfile(profileId: string): ProviderFamilyProfile;
96
+ }
97
+ ```
98
+
99
+ ## 4. 解析顺序(已定稿)
100
+
101
+ 解析顺序必须固定并可审计:
102
+
103
+ 1. 读取配置中的 `providerProtocol`,映射到唯一 `ProtocolId`。
104
+ 2. 读取配置中的 `providerId`,通过 provider-directory 映射得到 `providerFamily` 与 `defaultProfileId`。
105
+ 3. 读取配置中的 `compatibilityProfile`,写入 `ResolvedProviderBinding`(供 llmswitch-core compat 阶段使用)。
106
+ 4. 若任一字段缺失/非法/冲突,直接 fail-fast。
107
+
108
+ ### 4.1 重要边界
109
+
110
+ - Provider 层只“解析并透传” `compatibilityProfile`,不在 transport 内执行 compat 语义。
111
+ - compat 的实际转换仍由 llmswitch-core 负责(保持 AGENTS 既有边界)。
112
+ - Factory 仅负责组装 runtime 依赖,不负责 profile 解析与实例化。
113
+ - Registry resolver 仅做 binding 解析;profile 实例由预注册集合提供,禁止在 resolver/factory 内临时 `new` profile。
114
+
115
+ ## 5. Protocol 与 Profile 的交互边界
116
+
117
+ ### 5.1 Protocol 层负责
118
+
119
+ - wire shape(endpoint/body/stream)
120
+ - 协议级 response parse
121
+ - 协议字段合法性
122
+
123
+ ### 5.2 Family Profile 层负责
124
+
125
+ - 品牌级 header 策略(UA、签名、清理)
126
+ - 品牌级 request 微调(字段注入/裁剪)
127
+ - 品牌级 error envelope 映射
128
+
129
+ ### 5.3 明确禁止
130
+
131
+ - Profile 禁止发 HTTP、禁止路由决策、禁止工具语义改写。
132
+ - Protocol 禁止品牌识别分支。
133
+
134
+ ## 6. 向后兼容策略(迁移期间)
135
+
136
+ ### 6.1 Legacy 兼容输入
137
+
138
+ 现有配置仍可能仅给 `providerType/type`(无显式 `providerProtocol`)。迁移期策略:
139
+
140
+ 1. 在配置加载阶段做一次性 legacy 归一(alias -> protocol/providerId)。
141
+ 2. 归一后输出“显式三元组”:`providerProtocol + providerId + compatibilityProfile`。
142
+ 3. 运行时仅消费归一结果,不再做二次猜测。
143
+
144
+ ### 6.2 兼容期约束
145
+
146
+ - 兼容归一逻辑只存在于配置加载层(single source of truth)。
147
+ - Provider runtime / transport 中不得新增 legacy 推断。
148
+
149
+ ## 7. 最小可行目录结构(MVP)
150
+
151
+ ```text
152
+ src/providers/
153
+ profile/
154
+ provider-directory.ts # providerId -> providerFamily/protocol constraints
155
+ profile-contracts.ts # ProviderFamilyProfile interfaces
156
+ profile-registry.ts # register/resolve/getProfile
157
+ families/
158
+ iflow/default-profile.ts
159
+ antigravity/default-profile.ts
160
+ qwen/default-profile.ts
161
+ gemini/default-profile.ts
162
+ core/
163
+ protocols/
164
+ openai-chat/adapter.ts
165
+ openai-responses/adapter.ts
166
+ anthropic-messages/adapter.ts
167
+ gemini-chat/adapter.ts
168
+ ```
169
+
170
+ ## 8. 先实现不连线:可执行落地清单
171
+
172
+ ### Step A(仅实现)
173
+
174
+ - 新增 `provider-directory.ts` + `profile-registry.ts`。
175
+ - 新增 `profile-contracts.ts`。
176
+ - 为 iflow/antigravity 提供最小 default profile(空实现 + 单测)。
177
+
178
+ ### Step B(仅验证)
179
+
180
+ - 增加 registry 解析测试:字段缺失/冲突/非法协议 fail-fast。
181
+ - 增加 profile policy 单测:请求头策略和错误映射逻辑纯函数测试。
182
+
183
+ ### Step C(仍不连线)
184
+
185
+ - 在 factory/transport 增加“旁路可调用”探针(仅日志/快照,不接入主执行流)。
186
+
187
+ ## 9. 风险与防护
188
+
189
+ 1. **风险:Registry 成为第二个 factory**
190
+ - 防护:registry 只做解析,不做实例化。
191
+ 2. **风险:compat 再次下沉到 provider**
192
+ - 防护:compatibilityProfile 仅透传,不在 profile 中执行。
193
+ 3. **风险:legacy 兼容逻辑散落**
194
+ - 防护:只允许配置加载层存在 alias 归一。
195
+
196
+ ## 10. 113.3 验收对应关系
197
+
198
+ - Profile 接口:见第 3 节。
199
+ - Protocol/Profile 边界:见第 5 节。
200
+ - 向后兼容:见第 6 节。
201
+ - 最小目录结构:见第 7 节。
@@ -0,0 +1,56 @@
1
+ ---
2
+ # Provider V2 Profile: Gemini Protocol + Family
3
+
4
+ > 目标:将 `gemini-http-provider` 与 `gemini-cli-http-provider` 中的品牌特判迁移到 Kernel → Protocol → Profile 三层架构。
5
+
6
+ ## 现状盘点
7
+
8
+ | 当前特判 | 位置 | 应属层级 | 备注 |
9
+ |---------|------|----------|------|
10
+ | OpenAI Chat → Gemini contents 形状转换 | `gemini-http-provider.ts:preprocessRequest` | Protocol (gemini-chat) | 协议层字段映射 |
11
+ | systemInstruction 提取与合并 | `gemini-http-provider.ts:preprocessRequest` | Protocol (gemini-chat) | 同上 |
12
+ | x-goog-api-key 认证头处理 | `gemini-http-provider.ts:finalizeRequestHeaders` | Protocol (gemini-chat) | 协议层认证规范 |
13
+ | Authorization: Bearer → x-goog-api-key 转换 | `gemini-http-provider.ts` | Protocol (gemini-chat) | 同上 |
14
+ | generationConfig 构建 | `gemini-http-provider.ts:buildGenerationConfig` | Protocol (gemini-chat) | 字段映射 |
15
+ | Antigravity runtime 检测 | `gemini-http-provider.ts` | Family Profile (antigravity) | 品牌特有运行时 |
16
+ | Antigravity session/signature 头注入 | `gemini-http-provider.ts:applyAntigravityRequestCompat` | Family Profile (antigravity) | 同上 |
17
+ | Antigravity 错误包装 (wrapAntigravityHttpErrorAsResponse) | `gemini-http-provider.ts:sendRequestInternal` | Family Profile (antigravity) | 错误处理策略 |
18
+ | Gemini CLI user-agent 处理 | `gemini-cli-http-provider.ts` | Family Profile (gemini-cli) | CLI 特有头策略 |
19
+ | Gemini empty-reply-continue servertool | `gemini-empty-reply-continue.ts` | Protocol (gemini-chat) | 协议层空回复处理 |
20
+
21
+ ## 迁移策略
22
+
23
+ ### Phase 1: Protocol 层 `gemini-chat`
24
+
25
+ 新建 `src/providers/profile/protocols/gemini-chat-protocol.ts`:
26
+ - 实现 `ProtocolAdapter` 接口
27
+ - 提供 `toProtocolPayload(openaiChat)` → `geminiContents`
28
+ - 提供 `fromProtocolResponse(geminiResponse)` → `openaiChat`
29
+ - 认证头标准化:`x-goog-api-key`
30
+
31
+ ### Phase 2: Family Profile `antigravity`
32
+
33
+ 新建 `src/providers/profile/families/antigravity-profile.ts`:
34
+ - 继承 `gemini-chat` protocol
35
+ - 注入 antigravity 特有头:`x-antigravity-session`, `x-antigravity-signature`
36
+ - 错误处理:识别 antigravity 特有错误码并包装
37
+
38
+ ### Phase 3: 影子实现验证
39
+
40
+ 1. 保留现有 `gemini-http-provider` 作为影子
41
+ 2. 新实现走 `http-transport-provider` + profile 路径
42
+ 3. 对比测试通过后再移除旧实现
43
+
44
+ ## BD 任务拆分
45
+
46
+ - routecodex-113.10: Gemini Protocol Adapter 设计与实现
47
+ - routecodex-113.11: Antigravity Family Profile 迁移
48
+ - routecodex-113.12: Gemini CLI Profile 对齐
49
+ - routecodex-113.13: 影子实现与对比验证
50
+
51
+ ## 验收标准
52
+
53
+ - [ ] same-shape replay: Gemini 原生请求前后一致
54
+ - [ ] control replay: OpenAI Chat 请求不受影响
55
+ - [ ] antigravity 特有功能(session/signature)正常
56
+ - [ ] 无回归:现有 Gemini 相关测试通过
@@ -0,0 +1,102 @@
1
+ # Provider V2 重构总览(Draft)
2
+
3
+ - Status: Draft
4
+ - Date: 2026-02-09
5
+ - Epic: routecodex-113
6
+ - Working Mode: 先实现、不连线;连线时采用“新主旧影子”,通过 gate 后移除旧实现
7
+
8
+ ## 1) 已冻结决策
9
+
10
+ 1. 分层固定为:`Kernel -> 4 Protocol -> Family Profile`
11
+ 2. 四协议固定为:
12
+ - openai-chat
13
+ - openai-responses
14
+ - anthropic-messages
15
+ - gemini-chat(Gemini CLI 作为 Gemini 协议变体长期保留)
16
+ 3. 配置显式字段 `providerProtocol + providerId + compatibilityProfile` 决定:
17
+ - Protocol Adapter
18
+ - Family Profile
19
+ - Compat Profile
20
+ 4. `providerId/providerFamily` 的单一事实来源:配置文件 + provider 目录映射。
21
+
22
+ ## 2) 子任务产出总览
23
+
24
+ - `routecodex-113.1`:分层 ADR 草案
25
+ - `docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md`
26
+ - `routecodex-113.2`:特判盘点与迁移矩阵
27
+ - `docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md`
28
+ - `routecodex-113.3`:Profile API 与 Registry 机制
29
+ - `docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md`
30
+ - `routecodex-113.4`:分阶段迁移与回滚
31
+ - `docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md`
32
+ - `routecodex-113.5`:验证矩阵与 Replay 模板
33
+ - `docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md`
34
+
35
+ ## 3) 执行顺序(建议)
36
+
37
+ ## Phase A:实现不连线
38
+
39
+ - 新建 profile contracts / registry / provider-directory
40
+ - 新建 family profiles(iflow、antigravity、qwen、gemini)
41
+ - 新建 protocol adapters(4 协议)
42
+ - 只加单测,不改主路径
43
+
44
+ ## Phase B:分 wave 连线(新主旧影子)
45
+
46
+ - Wave-1:iflow
47
+ - Wave-2:antigravity / gemini-cli
48
+ - Wave-3:protocol/factory/service-profile/provider-type 清理
49
+
50
+ ## Phase C:旧实现移除
51
+
52
+ - 每个 wave 连续达标后删除对应 legacy 路径
53
+ - 删除后重新跑 build/install/tsc/replay
54
+
55
+ ## 4) Gate(摘要)
56
+
57
+ 每个 wave 的退出 gate 必须包含:
58
+
59
+ - `npm run build:dev`
60
+ - `npm run install:global`
61
+ - `npx tsc --noEmit`
62
+ - wave 目标测试集
63
+ - same-shape replay(目标 provider)
64
+ - control replay(未受影响 provider)
65
+ - shadow diff 指标达标(P0/P1 diff=0)
66
+
67
+ ## 5) 回滚规则(摘要)
68
+
69
+ 触发条件(任一):
70
+
71
+ - P0/P1 功能偏差
72
+ - 错误率异常升高
73
+ - same-shape/control replay 失败
74
+
75
+ 回滚动作:
76
+
77
+ - 回切到旧主路径
78
+ - 新实现保留影子继续对比
79
+ - 修复后重走该 wave gate
80
+
81
+ ## 6) 当前建议提交范围(仅架构草案)
82
+
83
+ 可提交:
84
+
85
+ - `.beads/issues.jsonl`
86
+ - `docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md`
87
+ - `docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md`
88
+ - `docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md`
89
+ - `docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md`
90
+ - `docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md`
91
+ - `docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md`
92
+
93
+ 建议暂不纳入本次(与架构草案无关/另案处理):
94
+
95
+ - `AGENTS.md`
96
+ - `package.json`
97
+ - `package-lock.json`
98
+ - `src/build-info.ts`
99
+ - `src/commands/validate.ts`
100
+ - `src/providers/core/runtime/http-transport-provider.ts`
101
+ - `tests/providers/core/runtime/http-transport-provider.headers.test.ts`
102
+
@@ -0,0 +1,163 @@
1
+ # Provider V2 验证矩阵与 Replay 验收模板(Draft)
2
+
3
+ - Status: Draft
4
+ - Date: 2026-02-09
5
+ - Owner: routecodex-113.5
6
+ - Scope: 用于 Wave 连线与旧实现移除前的统一验证标准
7
+
8
+ ## 1. Mandatory 验证项(每次 Wave 必跑)
9
+
10
+ 1. 构建与安装
11
+ - `npm run build:dev`
12
+ - `npm run install:global`
13
+ 2. 类型检查
14
+ - `npx tsc --noEmit`
15
+ 3. 目标改动测试
16
+ - 运行该 Wave 关联的 provider / routing / pipeline 测试集
17
+ 4. Replay 验证
18
+ - same-shape replay(受影响 provider)至少 1 组
19
+ - control replay(未受影响 provider)至少 1 组
20
+ 5. Shadow 对比
21
+ - 新主路径 vs 旧影子输出差异比对
22
+
23
+ ## 2. Four-Protocol × Family 验证矩阵
24
+
25
+ > 说明:矩阵是“至少覆盖”;某 Wave 可聚焦子集,但必须包含对应 control 列。
26
+
27
+ | Protocol | 受影响 Family(示例) | Same-shape 必测 | Control 必测 | Mandatory 指标 |
28
+ |---|---|---|---|---|
29
+ | openai-chat | iflow / qwen / glm / lmstudio | 1+ 样本(目标 family) | 1+ 样本(openai 或未改 family) | shape 一致、错误分类一致、无新增 P0/P1 |
30
+ | openai-responses | iflow / openai / 其他 responses 路由 | 1+ 样本(目标 family) | 1+ 样本(responses 其他 family) | SSE/JSON 结构一致、工具回合一致 |
31
+ | anthropic-messages | anthropic / 兼容代理 | 1+ 样本(目标 family) | 1+ 样本(anthropic control) | tool alias / message shape 一致 |
32
+ | gemini-chat | gemini / gemini-cli / antigravity | 1+ 样本(目标 family) | 1+ 样本(gemini family control) | header policy 与错误映射一致 |
33
+
34
+ ## 3. Same-shape Replay 模板
35
+
36
+ ### 3.1 目标
37
+
38
+ 验证“同一输入 shape 下,新主路径结果与旧影子可比”,并确保主链路正确。
39
+
40
+ ### 3.2 命令模板
41
+
42
+ ```bash
43
+ npm run replay:codex-sample -- \
44
+ --sample <path-to-client-request.json> \
45
+ --label wave-<n>-same-shape
46
+ ```
47
+
48
+ 脚本就绪状态(2026-02-09):`package.json` 已存在 `replay:codex-sample -> node scripts/replay-codex-sample.mjs`。
49
+ 若后续脚本不可用,需在 `routecodex-113.5` 新增“replay script readiness”子任务后再推进 wave gate。
50
+
51
+ ### 3.3 证据最小字段
52
+
53
+ - requestId
54
+ - providerKey / runtimeKey
55
+ - providerProtocol
56
+ - routeName
57
+ - model(clientModelId / assignedModelId)
58
+ - 结果类型(JSON / SSE)
59
+ - 关键字段对比结论(pass/fail)
60
+
61
+ ## 4. Control Replay 模板
62
+
63
+ ### 4.1 目标
64
+
65
+ 验证“未受影响 provider 不回归”。
66
+
67
+ ### 4.2 选择原则
68
+
69
+ - 与目标 Wave 不同 family。
70
+ - 同协议优先(若有),跨协议可作为补充。
71
+
72
+ ### 4.3 命令模板
73
+
74
+ ```bash
75
+ npm run replay:codex-sample -- \
76
+ --sample <path-to-control-client-request.json> \
77
+ --label wave-<n>-control
78
+ ```
79
+
80
+ ### 4.4 证据最小字段
81
+
82
+ - requestId
83
+ - providerKey
84
+ - providerProtocol
85
+ - 关键响应 shape 结论
86
+ - 错误分类是否与基线一致
87
+
88
+ ## 5. Shadow Diff 验证模板
89
+
90
+ ### 5.1 必比字段
91
+
92
+ - endpoint
93
+ - header 关键键(UA、签名、protocol 相关头)
94
+ - body 关键键(messages/tools/stream/metadata)
95
+ - response.status / error.code / upstreamCode
96
+
97
+ ### 5.2 通过阈值(建议默认)
98
+
99
+ - P0/P1 差异:0
100
+ - 关键错误分类一致率:>= 99%
101
+ - 性能增量:P95 不超过基线 +10%(或明确备案)
102
+
103
+ ## 6. Wave 退出 Gate Checklist(可复制)
104
+
105
+ ```markdown
106
+ ## Wave-<n> Exit Gate
107
+ - [ ] npm run build:dev
108
+ - [ ] npm run install:global
109
+ - [ ] npx tsc --noEmit
110
+ - [ ] Targeted tests passed
111
+ - [ ] Same-shape replay evidence attached
112
+ - [ ] Control replay evidence attached
113
+ - [ ] Shadow diff metrics attached
114
+ - [ ] No P0/P1 regression
115
+ ```
116
+
117
+ ## 7. BD 关闭任务证据模板(可复制)
118
+
119
+ ```markdown
120
+ ## Verification Summary
121
+ - Wave: <wave-id>
122
+ - Scope: <families/protocols>
123
+ - Date: <YYYY-MM-DD>
124
+
125
+ ## Build / Type / Test
126
+ - build:dev: <pass/fail>
127
+ - install:global: <pass/fail>
128
+ - tsc --noEmit: <pass/fail>
129
+ - targeted tests: <list>
130
+
131
+ ## Same-shape Replay
132
+ - requestId: <id>
133
+ - providerKey: <key>
134
+ - providerProtocol: <protocol>
135
+ - model/route: <model>/<route>
136
+ - result: <pass/fail>
137
+ - evidence path: <runs/...>
138
+
139
+ ## Control Replay
140
+ - requestId: <id>
141
+ - providerKey: <key>
142
+ - providerProtocol: <protocol>
143
+ - result: <pass/fail>
144
+ - evidence path: <runs/...>
145
+
146
+ ## Shadow Diff
147
+ - compared fields: <list>
148
+ - P0/P1 diffs: <count>
149
+ - error-classification match: <percent>
150
+ - performance delta (P95): <value>
151
+
152
+ ## Decision
153
+ - gate: <pass/fail>
154
+ - rollback required: <yes/no>
155
+ - notes: <details>
156
+ ```
157
+
158
+ ## 8. 与前序文档对齐关系
159
+
160
+ - 分层与决策来源:`docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md`
161
+ - 特判迁移清单:`docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md`
162
+ - 分阶段与回滚:`docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md`
163
+