dsh-vision-router 2.2.8 → 3.0.0

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 (132) hide show
  1. package/README.md +16 -7
  2. package/README.zh.md +16 -7
  3. package/docs/architecture/2.3.0-compat-retirement.md +147 -0
  4. package/docs/architecture/2.3.0-execution-plan.md +410 -0
  5. package/docs/architecture/2.3.0-final-audit.md +279 -0
  6. package/docs/architecture/2.3.0-reopened-plan.md +720 -0
  7. package/docs/architecture/3.0-architecture-plan.md +252 -0
  8. package/docs/architecture/3.0-r0-contract-ledger.md +137 -0
  9. package/docs/architecture/3.0-r1-source-artifact-boundary.md +98 -0
  10. package/docs/architecture/3.0-r10-final-correctness-closure.md +207 -0
  11. package/docs/architecture/3.0-r11-adversarial-review.md +441 -0
  12. package/docs/architecture/3.0-r5-browser-go-no-go.md +165 -0
  13. package/docs/architecture/3.0-r5-browser-typescript-gate.md +105 -0
  14. package/docs/architecture/3.0-r6-compat-retirement.md +203 -0
  15. package/docs/architecture/3.0-r7-public-api.md +151 -0
  16. package/docs/architecture/3.0-r8-ci-release.md +248 -0
  17. package/docs/architecture/3.0-r9-final-audit.md +370 -0
  18. package/docs/architecture/compat-inventory.md +26 -34
  19. package/docs/architecture/dsh-compatibility-matrix.md +65 -54
  20. package/docs/architecture/dsh-support-window.md +30 -22
  21. package/docs/architecture/final-closure-audit.md +2 -0
  22. package/docs/releases/v2.3.0.md +53 -0
  23. package/docs/releases/v3.0.0.md +85 -0
  24. package/entry.js +9 -57
  25. package/index.js +268 -761
  26. package/lib/agent-request-route-authority.js +1 -20
  27. package/lib/catalog-corrections.js +1 -2
  28. package/lib/client-maintenance-actions.js +145 -0
  29. package/lib/client-presentation-boundary-main.js +75 -17
  30. package/lib/client-presentation-boundary.js +53 -28
  31. package/lib/client.js +246 -144
  32. package/lib/core-apply-lifecycle.js +41 -0
  33. package/lib/core-cache.js +87 -0
  34. package/lib/core-primitives.js +91 -278
  35. package/lib/core-vision-surface-domain.js +63 -0
  36. package/lib/core-vision-surface.js +11 -77
  37. package/lib/delegated-call-config.js +15 -24
  38. package/lib/desktop-screenshot-tool.js +262 -0
  39. package/lib/doctor-cli.js +0 -0
  40. package/lib/doctor-runtime.js +4 -1
  41. package/lib/dsh-contract-compat.js +37 -256
  42. package/lib/dsh-host-capabilities.js +3 -9
  43. package/lib/dsh-settings-017-compat.js +17 -10
  44. package/lib/dsh-support-window.js +3 -3
  45. package/lib/file-logger.js +8 -3
  46. package/lib/grounding-coordinate-runtime.js +1 -2
  47. package/lib/http-body-limit.js +97 -79
  48. package/lib/http-compat.js +1 -2
  49. package/lib/image-offload-compat.js +30 -21
  50. package/lib/image-resource-governor.js +210 -228
  51. package/lib/legacy-global-proxy-boundary.js +46 -3
  52. package/lib/live-model-client-prelude.js +12 -4
  53. package/lib/live-model-discovery.js +134 -43
  54. package/lib/local-remote-settings-permission.js +33 -7
  55. package/lib/local-vision-stabilizer.js +31 -17
  56. package/lib/maintenance-routes.js +134 -0
  57. package/lib/native-image-coexistence.js +15 -3
  58. package/lib/ollama-cold-start.js +87 -23
  59. package/lib/pi-ai-bridge-wire-compat.js +3 -2
  60. package/lib/proxy-dispatcher-pool.js +151 -92
  61. package/lib/proxy-routing.js +75 -51
  62. package/lib/proxy-url-compat.js +3 -10
  63. package/lib/public-config.js +36 -0
  64. package/lib/public-entry.d.ts +148 -0
  65. package/lib/public-entry.js +19 -11
  66. package/lib/remote-settings-bridge.js +11 -0
  67. package/lib/remote-settings-risk-client-boundary.js +155 -0
  68. package/lib/remote-settings-risk-confirmation.js +17 -105
  69. package/lib/replay-delegation.js +12 -7
  70. package/lib/replay-envelope-v2-compat.js +12 -7
  71. package/lib/runtime-composition.js +127 -34
  72. package/lib/runtime-i18n-boundary.js +10 -11
  73. package/lib/screenshot-source-boundary.js +2 -2
  74. package/lib/session-affinity-runtime.js +113 -97
  75. package/lib/session-affinity.js +89 -76
  76. package/lib/session-event-history-compat.js +30 -0
  77. package/lib/session-message-source-compat.js +7 -3
  78. package/lib/session-query-readers.js +263 -0
  79. package/lib/session-surface-compat.js +30 -31
  80. package/lib/session-surface-policy-domain.js +85 -0
  81. package/lib/session-surface-policy.js +2 -111
  82. package/lib/session-turn-resolver.js +2 -6
  83. package/lib/session-vision-attachment-index.js +143 -0
  84. package/lib/session-vision-delegation-boundary.js +34 -0
  85. package/lib/session-vision-delegation.js +22 -0
  86. package/lib/session-vision-index.js +179 -116
  87. package/lib/session-vision-mode-authority.js +229 -192
  88. package/lib/session-vision-mode-boundary.js +65 -22
  89. package/lib/session-vision-policy-domain.js +304 -0
  90. package/lib/session-vision-policy.js +104 -0
  91. package/lib/session-vision-state.js +368 -378
  92. package/lib/settings-client-017-compat.js +9 -7
  93. package/lib/settings-client-loader-lifecycle.js +129 -0
  94. package/lib/sharp-runtime.js +0 -7
  95. package/lib/structured-flow-hardening.js +25 -6
  96. package/lib/tesseract-exec-compat.js +9 -1
  97. package/lib/turn-budget-context.js +47 -41
  98. package/lib/update-check.js +11 -2
  99. package/lib/vision-attachment-handle-runtime.js +176 -156
  100. package/lib/vision-backend-runtime-policy.js +19 -2
  101. package/lib/vision-background-benchmark.js +41 -4
  102. package/lib/vision-background-failure-policy.js +41 -41
  103. package/lib/vision-background-stop-store-core.js +217 -0
  104. package/lib/vision-background-stop-store.js +8 -179
  105. package/lib/vision-capability-benchmark-service.js +1 -0
  106. package/lib/vision-capability-benchmark.js +11 -61
  107. package/lib/vision-capability-evidence.js +35 -0
  108. package/lib/vision-capability-fingerprint.js +72 -0
  109. package/lib/vision-capability-identity.js +116 -61
  110. package/lib/vision-capability-router.js +13 -33
  111. package/lib/vision-chunk-assembler.js +95 -0
  112. package/lib/vision-diagnostics-routes.js +246 -0
  113. package/lib/vision-evidence-guidance.js +3 -1
  114. package/lib/vision-execution-order-apply.js +45 -55
  115. package/lib/vision-execution-order.js +19 -19
  116. package/lib/vision-execution-policy.js +12 -7
  117. package/lib/vision-model-registry.js +30 -17
  118. package/lib/vision-provider-transport.js +137 -176
  119. package/lib/vision-routing-authority.js +47 -48
  120. package/lib/vision-routing-product.js +26 -29
  121. package/lib/vision-routing-settings-prelude.js +8 -3
  122. package/lib/vision-runtime-performance-store.js +166 -0
  123. package/lib/vision-runtime-performance.js +13 -142
  124. package/lib/vision-toggle-root-hardening.js +22 -5
  125. package/lib/vision-tool-runtime-boundary.js +104 -31
  126. package/lib/web/dsh-settings-017-root-transport.js +27 -12
  127. package/lib/web/remote-settings-client.js +6 -9
  128. package/lib/web-capability-boundary.js +17 -7
  129. package/lib/wrapper-directory.js +14 -23
  130. package/package.json +56 -20
  131. package/lib/android-attachment-compat.js +0 -244
  132. package/lib/settings-client-rc8-lifecycle.js +0 -397
@@ -0,0 +1,410 @@
1
+ # DVR 2.3.0 architecture execution plan
2
+
3
+ Baseline: `origin/main@74e3f0194f8ba733f2e64f6080f68c5c9dca9167` (`v2.2.7`).
4
+
5
+ Branch: `2.3.0`.
6
+
7
+ Implementation status: **first-pass plan completed, overall 2.3.0 reopened**. This document is retained as the historical plan for the first architecture pass. A later adversarial review found additional correctness/integration work; the active execution authority is `2.3.0-reopened-plan.md`.
8
+
9
+ This document defines the implementation order for the 2.3.0 architecture phase. All work described here is developed on the single `2.3.0` branch first. No pull request is opened while the phase is being assembled and validated.
10
+
11
+ 2.3.0 is not another architecture rewrite. The 2.x single-owner model remains authoritative. The goal is to harden composition, retire compatibility seams whose removal conditions are now satisfied, and extract stable responsibilities from the mature Core without creating new semantic owners.
12
+
13
+ ## 1. Phase goals
14
+
15
+ 2.3.0 has three ordered goals:
16
+
17
+ 1. **Composition hardening** — make cross-boundary behavior explicit, lifecycle-safe and testable as a composition, not merely as isolated modules.
18
+ 2. **Compatibility retirement** — remove transitional registries/shims only when their documented removal conditions are actually satisfied; keep real Host-gap compatibility intact.
19
+ 3. **Mature-Core extraction** — move stable responsibilities out of the mature monolith into explicit owners while preserving behavior and authority direction.
20
+
21
+ The order is intentional. Extraction must not begin by moving unstable composition behavior into new modules, and compatibility code must not be deleted before the replacement seam has been proven in production paths.
22
+
23
+ ## 2. Frozen product and architecture decisions
24
+
25
+ The following decisions are fixed for 2.3.0 unless explicitly revisited before implementation.
26
+
27
+ ### 2.1 Remote Settings behavior is reminder-only
28
+
29
+ Remote Settings keeps its current product model:
30
+
31
+ - a remote client may be shown a risk reminder before enabling remote settings;
32
+ - the reminder is a user-facing warning, not an authentication or authorization proof;
33
+ - the server does **not** add a second confirmation validator, challenge, identity check, one-time secret, or local-machine approval requirement;
34
+ - the existing remote field allow-list and local-only field boundaries remain the actual capability restriction;
35
+ - `acceptedRisk` remains a product-flow acknowledgement, not a security credential.
36
+
37
+ Therefore 2.3.0 must **not** treat the reminder-only design as a security defect and must not silently strengthen it into a server-side validation gate.
38
+
39
+ ### 2.2 Existing single-owner architecture remains normative
40
+
41
+ 2.3.0 preserves the current ownership direction:
42
+
43
+ | Responsibility | Owner |
44
+ | --- | --- |
45
+ | Routing/background authority | `vision-routing-authority.js` |
46
+ | Routing evidence | `vision-routing-evidence.js` |
47
+ | Planning/scoring | `vision-capability-router.js` |
48
+ | Execution order | `vision-execution-order.js` |
49
+ | Session visual state | `session-vision-runtime.js` / state + index |
50
+ | Managed artifacts | `vision-artifact-store.js` |
51
+ | Router-owned provider HTTP | `vision-provider-transport.js` |
52
+ | Host product/presentation decisions | `vision-product-presentation.js` |
53
+ | Browser rendering | browser/client presentation layer |
54
+
55
+ No 2.3.0 task may introduce a second owner for one of these responsibilities.
56
+
57
+ ### 2.3 Host-first remains the transport rule
58
+
59
+ With no explicit DVR proxy override, Host network policy remains authoritative. 2.3.0 may make transport ownership more explicit, but must not replace blank-proxy Host behavior with a DVR-owned dispatcher or native-fetch snapshot.
60
+
61
+ ### 2.4 Compatibility retirement is evidence-driven
62
+
63
+ A compatibility seam is removed only when its existing inventory removal condition is satisfied by code and tests. A seam that still closes a real DSH Host gap is retained even if its implementation is aesthetically undesirable.
64
+
65
+ In particular, the `modules -> webServer` and `connection -> webServer` compatibility overlays are retained while exact supported/preview DSH source contracts still classify them as `shim-required`.
66
+
67
+ ## 3. Workstream A — composition hardening
68
+
69
+ Composition hardening is the first implementation batch because the current main risk is interaction between individually-correct boundaries.
70
+
71
+ ### A1. Converge every DVR `fetch` wrapper on one lifecycle primitive
72
+
73
+ **Problem**
74
+
75
+ `runtime-i18n-boundary.js` still assigns `globalThis.fetch` directly while the proxy and pi-ai compatibility boundaries use `captureFetchDelegate()` + `installFetchWrapper()`. With a Host accessor-owned fetch pipeline, direct assignment can invoke the foreign setter and create a recursive cycle.
76
+
77
+ **Implementation**
78
+
79
+ - Replace direct i18n fetch assignment/restoration with the shared descriptor-safe fetch lifecycle.
80
+ - Preserve live Host accessor recomposition rather than freezing one compiled getter result.
81
+ - Preserve out-of-order disposal and later Host replacement behavior.
82
+ - Do not broaden the i18n boundary's network scope; only its installation lifecycle changes.
83
+
84
+ **Required composition matrix**
85
+
86
+ Test both load orders and disposal orders for:
87
+
88
+ - Host accessor + i18n;
89
+ - Host accessor + wire compatibility;
90
+ - Host accessor + proxy compatibility;
91
+ - Host accessor + i18n + wire;
92
+ - Host accessor + i18n + proxy;
93
+ - Host accessor + i18n + wire + proxy;
94
+ - live Host middleware replacement/removal;
95
+ - later Host `fetch` replacement;
96
+ - blank DVR proxy Host-first behavior;
97
+ - scoped proxy/wire behavior remaining visual-call-only.
98
+
99
+ **Exit condition**
100
+
101
+ No production DVR boundary assigns `globalThis.fetch` through a foreign accessor setter.
102
+
103
+ ### A2. Promote composition tests from feature-local to cross-boundary contracts
104
+
105
+ Create a small set of composition contract tests that assert invariants across installers rather than re-testing individual implementations.
106
+
107
+ Target invariants:
108
+
109
+ - no wrapper recaptures itself through a Host setter;
110
+ - no disposal restores a stale DVR layer over a later Host replacement;
111
+ - no compatibility boundary expands its authority when another wrapper is present;
112
+ - ordinary Host traffic remains untouched by visual-only scopes;
113
+ - all lifecycle cleanup is order-independent where the public lifecycle permits non-LIFO cleanup.
114
+
115
+ The tests should depend on public/narrow seams, not private implementation ordering where possible.
116
+
117
+ ### A3. Restructure `runtime-composition.js` into explicit phases
118
+
119
+ Do not convert the runtime into a service locator. Keep dependency construction explicit, but group the current high-fan-out installer sequence into named phases.
120
+
121
+ Target shape:
122
+
123
+ ```text
124
+ applyVisionRuntimeComposition
125
+ -> installHostAndSecurityBoundaries
126
+ -> createRuntimeOwners
127
+ -> installExecutionAndRouting
128
+ -> applyMatureCoreBridge
129
+ -> installPresentationAndWeb
130
+ ```
131
+
132
+ Each phase receives and returns a narrow composition object containing only dependencies required by later phases.
133
+
134
+ **Rules**
135
+
136
+ - installation order remains behaviorally identical in the first refactor;
137
+ - no product behavior changes in the same commit as the phase extraction;
138
+ - Core receives the same context identity/compat boundaries as before;
139
+ - phase functions do not become new semantic authorities.
140
+
141
+ **Exit condition**
142
+
143
+ The top-level composition file reads as lifecycle orchestration rather than a flat installer chain, and cross-phase dependencies are visible in function signatures.
144
+
145
+ ### A4. Create one 2.3 critical architecture gate
146
+
147
+ Do not make all existing workflows required. Instead define one aggregated 2.3 architecture/compat gate that runs the minimum high-value contracts needed before branch integration:
148
+
149
+ - Node 22 + 24 core test suite;
150
+ - fetch composition matrix;
151
+ - architecture closure contracts;
152
+ - current supported Host contract;
153
+ - security/property boundary tests;
154
+ - package/entry smoke relevant to the modified phase.
155
+
156
+ This gate is added and exercised on the `2.3.0` branch. Whether it becomes a protected-branch required check for `main` is a separate integration decision after the branch is complete.
157
+
158
+ ## 4. Workstream B — compatibility retirement
159
+
160
+ Compatibility retirement starts only after Workstream A is green, so removal work is protected by stronger composition tests.
161
+
162
+ ### B1. Remove the VisionProviderTransport process/profile registry
163
+
164
+ **Current transitional seam**
165
+
166
+ `vision-provider-transport.js` retains module-level `installed[]`; `http-compat.js` and `catalog-corrections.js` read `currentVisionProviderTransport()`.
167
+
168
+ **Target**
169
+
170
+ Make transport dependency explicit in all production compatibility callers.
171
+
172
+ Expected direction:
173
+
174
+ ```text
175
+ runtime owner
176
+ -> explicit VisionProviderTransport
177
+ -> OpenAI compatibility caller
178
+ -> Anthropic/catalog correction caller
179
+ ```
180
+
181
+ **Implementation constraints**
182
+
183
+ - keep direct/unit call compatibility only where it is part of the public/testable function contract;
184
+ - do not replace the registry with another module-global current owner;
185
+ - preserve proxy admission, redirect-hop selection, credential resolution, bounded body reads, cancellation and dispatcher lifecycle;
186
+ - delete `installVisionProviderTransport()` / `currentVisionProviderTransport()` only after repository-wide production reads reach zero.
187
+
188
+ **Exit condition**
189
+
190
+ No production module-global transport locator remains.
191
+
192
+ ### B2. Reclassify the compatibility inventory
193
+
194
+ For every retained compatibility seam, assign one 2.3 state:
195
+
196
+ - `retain-host-gap` — exact current Host evidence still requires it;
197
+ - `retire-ready` — replacement seam exists and all production callers have migrated;
198
+ - `product-compat` — intentionally retained product compatibility, not blocked on Host evolution;
199
+ - `historical-only` — no production use remains and it can be deleted.
200
+
201
+ Update `docs/architecture/compat-inventory.md` only after code evidence exists. Documentation must describe the actual state, not the desired state.
202
+
203
+ ### B3. Retain DSH Web activation overlays until upstream ownership lands
204
+
205
+ The `modules` and `connection` WebServer overlays stay in 2.3.0 while the exact supported/preview upstream rows remain `shim-required`.
206
+
207
+ The source-contract watcher remains responsible for producing `retire-ready` when upstream starts owning the dependency.
208
+
209
+ 2.3.0 must not remove these overlays simply as part of a generic compatibility cleanup.
210
+
211
+ ### B4. Review legacy global proxy compatibility without changing proxy product policy
212
+
213
+ `proxy` / `proxyHosts` remain supported advanced overrides.
214
+
215
+ The work in 2.3.0 is limited to:
216
+
217
+ - verifying the remaining unscoped whole-turn fallback is still reachable only through the documented legacy configuration;
218
+ - ensuring it does not expand during composition changes;
219
+ - removing it only if its existing product/support-window retirement condition is independently satisfied.
220
+
221
+ Do not deprecate explicit DVR proxy support as part of 2.3.0 architecture cleanup.
222
+
223
+ ## 5. Workstream C — mature-Core extraction
224
+
225
+ Core extraction begins after A is stable and B1 has removed the most important process-level locator. The objective is not to minimize file size; it is to move stable responsibilities to explicit owners.
226
+
227
+ ### C1. Extract public configuration construction
228
+
229
+ Replace the current two-stage Config/default construction with an explicit public configuration factory or schema composition seam.
230
+
231
+ Target distinction:
232
+
233
+ ```text
234
+ Core schema / legacy implementation defaults
235
+ +
236
+ 2.3 public product defaults and settings additions
237
+ -> public Config
238
+ ```
239
+
240
+ **Constraints**
241
+
242
+ - no user-visible default changes in the extraction commit;
243
+ - entry-point exports stay compatible;
244
+ - Settings registration receives the same final schema/defaults;
245
+ - historical profile migration remains unchanged.
246
+
247
+ ### C2. Extract Core-owned browser/maintenance route registration
248
+
249
+ Move stable route registration currently buried in `index.js` into a narrow installer owned by the runtime/web composition layer, starting with routes that are not intrinsic to image algorithms, for example:
250
+
251
+ - update check;
252
+ - self update;
253
+ - model-capability metadata;
254
+ - other product/maintenance endpoints whose authority already lives outside the Core algorithm.
255
+
256
+ All extracted routes must continue to pass through the existing Web capability/authentication boundary.
257
+
258
+ **Goal**
259
+
260
+ `index.js` should increasingly describe visual Core behavior rather than product Web administration.
261
+
262
+ ### C3. Extract stable local image-processing/tool groups by ownership
263
+
264
+ Candidates are extracted only when they have a clear cohesive owner and can be moved without recreating hidden shared state.
265
+
266
+ Preferred extraction units:
267
+
268
+ - image preprocessing / downscale and bounded resource helpers;
269
+ - OCR execution group;
270
+ - visual artifact-producing tool group;
271
+ - screenshot/capture implementation behind the existing screenshot runtime boundary.
272
+
273
+ Do not split a function merely to reduce LOC. A move is accepted only if the resulting module has a stable input/output contract and a narrower dependency set than the Core monolith.
274
+
275
+ ### C4. Reduce `client.js` by moving current-product modules first
276
+
277
+ The browser cleanup follows the same rule: current product logic moves to real modules; old Host compatibility shims may remain injected/prelude code.
278
+
279
+ First candidates:
280
+
281
+ - settings product sections already backed by server-owned state;
282
+ - update/log/diagnostics actions;
283
+ - capability/runtime presentation components with stable contracts.
284
+
285
+ Do not rewrite the entire client or remove legacy loader shims in one batch.
286
+
287
+ ### C5. Keep Core extraction behavior-preserving
288
+
289
+ Every extraction commit must satisfy:
290
+
291
+ - no new Settings proxy/impersonation;
292
+ - no new module-global runtime owner;
293
+ - no second routing/session/artifact/transport authority;
294
+ - no change to native multimodal non-intervention;
295
+ - no expansion of browser authority;
296
+ - no support-window increase or decrease unless separately documented.
297
+
298
+ ## 6. Implementation sequence on branch `2.3.0`
299
+
300
+ The branch is implemented in this order:
301
+
302
+ | Batch | Scope | Must be behavior-changing? | Dependency |
303
+ | --- | --- | --- | --- |
304
+ | 0 | Planning document + baseline evidence | No | none |
305
+ | 1 | A1 fetch lifecycle convergence | Yes, bug fix only | Batch 0 |
306
+ | 2 | A2 composition contract matrix | No product change | Batch 1 |
307
+ | 3 | A3 composition phase refactor | No | Batch 2 |
308
+ | 4 | A4 2.3 critical architecture gate | No | Batch 3 |
309
+ | 5 | B1 explicit provider transport plumbing + registry deletion | Internal only | Batch 4 |
310
+ | 6 | B2/B3/B4 compat inventory reconciliation | Only if retirement evidence exists | Batch 5 |
311
+ | 7 | C1 public Config construction extraction | No | Batch 6 |
312
+ | 8 | C2 product/Web route extraction from mature Core | No | Batch 7 |
313
+ | 9 | C3 local image/tool extraction | No | Batch 8 |
314
+ | 10 | C4 browser current-product modularization | No intended product change | Batch 9 |
315
+ | 11 | Final 2.3 adversarial architecture audit | No | Batch 10 |
316
+
317
+ A later batch may be dropped if its preconditions are not met. In particular, compatibility deletion is never forced merely because it appears in this plan.
318
+
319
+ ## 7. Commit discipline
320
+
321
+ All work remains on `2.3.0` during the phase.
322
+
323
+ Recommended commit boundaries:
324
+
325
+ 1. `docs(architecture): define 2.3.0 execution plan`
326
+ 2. `fix(fetch): converge runtime i18n on safe wrapper lifecycle`
327
+ 3. `test(composition): cover complete DVR fetch wrapper matrix`
328
+ 4. `refactor(runtime): group composition into explicit phases`
329
+ 5. `ci(architecture): add 2.3 critical composition gate`
330
+ 6. `refactor(transport): pass provider transport explicitly`
331
+ 7. `refactor(compat): retire satisfied compatibility seams`
332
+ 8. `refactor(config): make public config construction explicit`
333
+ 9. `refactor(core): extract product web routes`
334
+ 10. subsequent Core/client extraction commits, one responsibility at a time
335
+ 11. `docs(architecture): record 2.3.0 final audit and remaining compat`
336
+
337
+ Do not combine a compatibility deletion with an unrelated Core extraction. Regressions must be attributable to one ownership change.
338
+
339
+ ## 8. Validation policy
340
+
341
+ ### Per-batch minimum
342
+
343
+ Each batch runs its directly affected tests plus:
344
+
345
+ - Node-supported unit tests for the changed boundary;
346
+ - architecture closure tests if owner/dependency direction changes;
347
+ - Host contract tests if DSH seams change;
348
+ - package smoke if public entry/config/export behavior changes.
349
+
350
+ ### Milestone validation
351
+
352
+ After A, B and C respectively, run the branch-wide validation set:
353
+
354
+ ```text
355
+ pnpm test
356
+ pnpm test:compat
357
+ pnpm test:security
358
+ pnpm test:property-fuzz
359
+ pnpm test:stress
360
+ pnpm test:quality
361
+ package/pack smoke
362
+ ```
363
+
364
+ Where a script name differs from the current package scripts, the equivalent existing workflow/test set is used rather than adding duplicate commands just for naming consistency.
365
+
366
+ ### Final branch exit criteria
367
+
368
+ 2.3.0 is ready for integration discussion only when:
369
+
370
+ 1. all branch changes are on `2.3.0` and the working tree is clean;
371
+ 2. the i18n/accessor fetch recursion reproducer is permanently covered and green;
372
+ 3. composition contracts cover all production fetch-wrapper combinations;
373
+ 4. the provider transport registry is gone, or documented with concrete evidence explaining why B1 could not complete;
374
+ 5. every deleted compatibility seam satisfies its inventory removal condition;
375
+ 6. all retained Host-gap seams remain feature-detected and tested;
376
+ 7. Core extraction introduced no new semantic owner/global current locator;
377
+ 8. current stable Host and admitted preview Host contracts remain green;
378
+ 9. Node 22/24 and required platform tests remain green;
379
+ 10. final architecture audit explicitly lists retained debt rather than declaring blanket purity.
380
+
381
+ ## 9. Explicit non-goals for 2.3.0
382
+
383
+ 2.3.0 does not include:
384
+
385
+ - changing Remote Settings from reminder-only to server-side confirmation/authentication;
386
+ - redesigning capability scoring or routing policy;
387
+ - changing native multimodal ownership;
388
+ - deleting DSH compatibility overlays that still classify as `shim-required`;
389
+ - deprecating DVR `proxy` / `proxyHosts`;
390
+ - adding PDF/video/CAD/GUI-agent product features;
391
+ - rewriting all of `index.js` or `client.js`;
392
+ - introducing a general dependency-injection container/service locator;
393
+ - raising the public DSH minimum solely to simplify DVR internals.
394
+
395
+ ## 10. Architectural success definition
396
+
397
+ 2.3.0 succeeds if the runtime becomes easier to reason about **without changing who owns decisions**:
398
+
399
+ ```text
400
+ 2.2.x
401
+ correct owners + many compatibility/composition seams
402
+
403
+ 2.3.0
404
+ same correct owners
405
+ + composition behavior explicitly contracted
406
+ + fewer process/global compatibility locators
407
+ + mature Core containing less product/lifecycle glue
408
+ ```
409
+
410
+ The release should end with less hidden coupling, not merely more files.