dsh-vision-router 2.3.0 → 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 (103) hide show
  1. package/README.md +12 -3
  2. package/README.zh.md +12 -3
  3. package/docs/architecture/3.0-architecture-plan.md +252 -0
  4. package/docs/architecture/3.0-r0-contract-ledger.md +137 -0
  5. package/docs/architecture/3.0-r1-source-artifact-boundary.md +98 -0
  6. package/docs/architecture/3.0-r10-final-correctness-closure.md +207 -0
  7. package/docs/architecture/3.0-r11-adversarial-review.md +441 -0
  8. package/docs/architecture/3.0-r5-browser-go-no-go.md +165 -0
  9. package/docs/architecture/3.0-r5-browser-typescript-gate.md +105 -0
  10. package/docs/architecture/3.0-r6-compat-retirement.md +203 -0
  11. package/docs/architecture/3.0-r7-public-api.md +151 -0
  12. package/docs/architecture/3.0-r8-ci-release.md +248 -0
  13. package/docs/architecture/3.0-r9-final-audit.md +370 -0
  14. package/docs/architecture/dsh-support-window.md +5 -3
  15. package/docs/releases/v3.0.0.md +85 -0
  16. package/entry.js +1 -1
  17. package/index.js +108 -71
  18. package/lib/agent-request-route-authority.js +1 -20
  19. package/lib/core-apply-lifecycle.js +37 -43
  20. package/lib/core-cache.js +87 -0
  21. package/lib/core-primitives.js +3 -143
  22. package/lib/core-vision-surface-domain.js +63 -0
  23. package/lib/core-vision-surface.js +11 -77
  24. package/lib/delegated-call-config.js +15 -24
  25. package/lib/doctor-cli.js +0 -0
  26. package/lib/doctor-runtime.js +4 -1
  27. package/lib/dsh-contract-compat.js +26 -230
  28. package/lib/dsh-host-capabilities.js +3 -9
  29. package/lib/dsh-settings-017-compat.js +17 -10
  30. package/lib/file-logger.js +8 -3
  31. package/lib/grounding-coordinate-runtime.js +1 -2
  32. package/lib/http-body-limit.js +97 -79
  33. package/lib/image-offload-compat.js +30 -21
  34. package/lib/image-resource-governor.js +210 -228
  35. package/lib/legacy-global-proxy-boundary.js +46 -3
  36. package/lib/live-model-client-prelude.js +12 -4
  37. package/lib/live-model-discovery.js +134 -43
  38. package/lib/local-vision-stabilizer.js +31 -17
  39. package/lib/maintenance-routes.js +1 -3
  40. package/lib/native-image-coexistence.js +15 -3
  41. package/lib/ollama-cold-start.js +87 -23
  42. package/lib/pi-ai-bridge-wire-compat.js +3 -2
  43. package/lib/proxy-dispatcher-pool.js +151 -92
  44. package/lib/proxy-routing.js +75 -51
  45. package/lib/proxy-url-compat.js +3 -10
  46. package/lib/public-config.js +23 -44
  47. package/lib/public-entry.d.ts +148 -0
  48. package/lib/public-entry.js +17 -4
  49. package/lib/replay-delegation.js +12 -7
  50. package/lib/replay-envelope-v2-compat.js +12 -7
  51. package/lib/runtime-composition.js +22 -4
  52. package/lib/screenshot-source-boundary.js +2 -2
  53. package/lib/session-affinity-runtime.js +113 -97
  54. package/lib/session-affinity.js +89 -76
  55. package/lib/session-event-history-compat.js +30 -0
  56. package/lib/session-query-readers.js +263 -0
  57. package/lib/session-surface-compat.js +30 -31
  58. package/lib/session-surface-policy-domain.js +85 -0
  59. package/lib/session-surface-policy.js +2 -111
  60. package/lib/session-turn-resolver.js +2 -6
  61. package/lib/session-vision-attachment-index.js +143 -0
  62. package/lib/session-vision-delegation-boundary.js +34 -0
  63. package/lib/session-vision-delegation.js +22 -0
  64. package/lib/session-vision-index.js +25 -107
  65. package/lib/session-vision-mode-authority.js +229 -192
  66. package/lib/session-vision-mode-boundary.js +65 -22
  67. package/lib/session-vision-policy-domain.js +304 -0
  68. package/lib/session-vision-policy.js +104 -0
  69. package/lib/session-vision-state.js +368 -378
  70. package/lib/settings-client-017-compat.js +9 -7
  71. package/lib/structured-flow-hardening.js +22 -4
  72. package/lib/tesseract-exec-compat.js +9 -1
  73. package/lib/turn-budget-context.js +47 -41
  74. package/lib/update-check.js +11 -2
  75. package/lib/vision-attachment-handle-runtime.js +176 -156
  76. package/lib/vision-backend-runtime-policy.js +16 -0
  77. package/lib/vision-background-benchmark.js +41 -4
  78. package/lib/vision-background-failure-policy.js +41 -41
  79. package/lib/vision-background-stop-store-core.js +217 -0
  80. package/lib/vision-background-stop-store.js +8 -179
  81. package/lib/vision-capability-benchmark.js +11 -61
  82. package/lib/vision-capability-evidence.js +35 -0
  83. package/lib/vision-capability-fingerprint.js +72 -0
  84. package/lib/vision-capability-identity.js +116 -61
  85. package/lib/vision-capability-router.js +13 -33
  86. package/lib/vision-chunk-assembler.js +95 -0
  87. package/lib/vision-diagnostics-routes.js +34 -4
  88. package/lib/vision-execution-order-apply.js +45 -55
  89. package/lib/vision-execution-order.js +19 -19
  90. package/lib/vision-execution-policy.js +12 -7
  91. package/lib/vision-model-registry.js +30 -17
  92. package/lib/vision-provider-transport.js +137 -147
  93. package/lib/vision-routing-authority.js +47 -48
  94. package/lib/vision-routing-product.js +26 -29
  95. package/lib/vision-routing-settings-prelude.js +8 -3
  96. package/lib/vision-runtime-performance-store.js +166 -0
  97. package/lib/vision-runtime-performance.js +13 -142
  98. package/lib/vision-tool-runtime-boundary.js +99 -30
  99. package/lib/web/dsh-settings-017-root-transport.js +27 -12
  100. package/lib/web/remote-settings-client.js +4 -7
  101. package/lib/web-capability-boundary.js +17 -7
  102. package/lib/wrapper-directory.js +14 -23
  103. package/package.json +37 -11
package/README.md CHANGED
@@ -42,9 +42,9 @@
42
42
  > **Data leaves your machine by default.** When a cloud vision model is used, Vision Router sends the image (or a derived crop), the vision prompt and related request metadata to that provider. A fresh install has an anonymous OVHcloud vision fallback enabled, so "free" and "no key" do **not** mean offline. Do not use the cloud chain for confidential, regulated or classified material. See [Data flow and strict local-only use](#data-flow-and-strict-local-only-use).
43
43
 
44
44
  > [!WARNING]
45
- > 📌 **Announcement (v2.3.0)**
45
+ > 📌 **Announcement (v3.0.0)**
46
46
  >
47
- > **v2.3.0:** Architecture hardening and compatibility convergence. The supported DSH 0.1.x window now starts at `0.1.5-rc.1`, while the 0.2.x train starts at verified `0.2.0-rc.2`; composition, Session repair, Settings/browser ownership and Desktop lifecycle contracts are hardened, and only proven-unreachable pre-floor shims are retired. [What’s new →](docs/releases/v2.3.0.md)
47
+ > **v3.0.0: Session Vision policy now has a durable owner.** The supported DSH 0.1.x window now starts at `0.1.5-rc.1`, while the 0.2.x train starts at verified `0.2.0-rc.2`; Vision authority lives in a scoped, Host-storage-backed policy store, hydrates before child sessions publish, and binds delegation to the Host Agent lifecycle. The package root is a deliberate, typed public API, the runtime installation is grouped into explicit composition phases with an explicitly passed provider transport, and a new required peer (`@deepseek-ai/dsh-storage-domain`) is added. This release also closes the R11 adversarial final audit. [What’s new →](docs/releases/v3.0.0.md)
48
48
 
49
49
  <p align="center">
50
50
  <img src="assets/vision-demo.gif" width="640" alt="Demo: paste an image, the agent locates the send button with vision_ground / vision_crop / vision_pixel_diff and answers with coordinates" />
@@ -151,6 +151,15 @@ For normal npm/npx installs, installation is a single command:
151
151
  npx @deepseek-ai/dsh plugin --profile web add dsh-vision-router
152
152
  ```
153
153
 
154
+ > [!IMPORTANT]
155
+ > **Which profile?** Install into an **existing profile that already serves the Web UI**:
156
+ >
157
+ > - Web DSH: `--profile web` (default data directory `~/.dsh`);
158
+ > - the official DeepSeek Harness desktop app: `--profile desktop` (same `~/.dsh` data directory; reload the plugin or restart the app afterwards);
159
+ > - Oh-DSH Desktop: its data directory is `~/.ohdsh`, see [Oh-DSH Desktop](#oh-dsh-desktop) below.
160
+ >
161
+ > `dsh plugin add` only adds the plugin to the profile you name. A **brand-new** profile contains just `@deepseek-ai/dsh-base`, and `dsh web` never binds a port in that state (no Web surface). Install into an existing profile, or give the new profile a Web surface first.
162
+
154
163
  > [!WARNING]
155
164
  > If this profile already loads community plugins manually through `cordis.patch.yml`, do **not** mix that legacy setup with `dsh plugin add` / `dsh plugin list`: current DSH CLI behavior can also append bundle-patch dependencies to `dsh.profile.bundles`, causing those plugins to register twice. Migrate the existing manual plugin rows to bundle-managed loading first, or keep using the manual installation path. See [deepseek-harness discussion #2889](https://github.com/deepseek-ai/deepseek-harness/discussions/2889).
156
165
 
@@ -436,7 +445,7 @@ ollama pull qwen2.5vl
436
445
  ## Requirements
437
446
 
438
447
  - DeepSeek Harness Web profile. Normal installs can use `npx @deepseek-ai/dsh ...`; source checkouts use `pnpm dsh ...`. A bare `dsh ...` command only works when the CLI is already on your shell `PATH`.
439
- - **DSH Host support policy:** DVR 2.3.x supports DSH 0.1.x continuously from `0.1.5-rc.1` (current stable evidence: `0.1.5-rc.3`) and supports the 0.2.x train from verified `0.2.0-rc.2`. Exact `0.2.0-rc.2` is also the ordinary 2.3 development Host. Pre-0.1.5 Hosts are unsupported, and DVR no longer publishes the older jagged 0.1.x exception list. Runtime behavior remains capability-based. See [DSH Host support window](docs/architecture/dsh-support-window.md).
448
+ - **DSH Host support policy:** DVR 3.0.x supports DSH 0.1.x continuously from `0.1.5-rc.1` (current stable evidence: `0.1.5-rc.3`) and supports the 0.2.x train from verified `0.2.0-rc.2`. Exact `0.2.0-rc.2` is also the ordinary 3.0 development Host. Pre-0.1.5 Hosts are unsupported, and DVR no longer publishes the older jagged 0.1.x exception list. Runtime behavior remains capability-based. See [DSH Host support window](docs/architecture/dsh-support-window.md).
440
449
  - Node ≥ 22 (host side).
441
450
  - No API key for the default free chain; a credential reference (`apiKeyEnv`) only for paid `httpProviders`.
442
451
  - Chrome / Chromium / Edge is needed only for `vision_html_screenshot`; every other tool works without a browser.
package/README.zh.md CHANGED
@@ -42,9 +42,9 @@
42
42
  > **默认配置会让数据出网。** 使用云端视觉模型时,Vision Router 会将图片(或由它裁剪出的局部)、识图提示词及相关请求元数据发送给对应供应商。新安装默认开启 OVHcloud 匿名视觉兜底,因此“免费”和“免 Key”不等于离线。涉密、涉案、内部或其他受限材料请勿使用云端链路。详见[数据流向与严格纯本地配置](#数据流向与严格纯本地配置)。
43
43
 
44
44
  > [!WARNING]
45
- > 📌 **公告(v2.3.0)**
45
+ > 📌 **公告(v3.0.0)**
46
46
  >
47
- > **v2.3.0:架构加固与兼容收敛。DSH 0.1.x 正式支持线提高到 `0.1.5-rc.1` 起,0.2.x 从已验证的 `0.2.0-rc.2` 起;composition、Session repair、Settings/浏览器 ownership 与 Desktop lifecycle 均完成加固,只退休已证明在新支持窗口不可达的旧 shim。** [查看完整更新 →](docs/releases/v2.3.0.md)
47
+ > **v3.0.0:Session Vision policy 有了持久归属。DSH 0.1.x 正式支持线提高到 `0.1.5-rc.1` 起,0.2.x 从已验证的 `0.2.0-rc.2` 起;识图权威由作用域化的、Host storage 背书的策略存储持有,子会话发布前完成 hydrate,委派绑定 Host Agent 生命周期;包根改为显式声明且带类型的公共 API,运行时装配显式分阶段、provider transport 必须显式传入,并新增必需 peer `@deepseek-ai/dsh-storage-domain`。本版本同时完成 R11 对抗终审。** [查看完整更新 →](docs/releases/v3.0.0.md)
48
48
 
49
49
  <p align="center">
50
50
  <img src="assets/vision-demo.gif" width="640" alt="演示:粘贴图片,Agent 用 vision_ground / vision_crop / vision_pixel_diff 定位发送按钮并给出坐标" />
@@ -149,6 +149,15 @@ Vision Router 在默认配置下不是完全离线工具。具体边界取决于
149
149
  npx @deepseek-ai/dsh plugin --profile web add dsh-vision-router
150
150
  ```
151
151
 
152
+ > [!IMPORTANT]
153
+ > **装到哪个 profile?** 请装进**已经存在、并且自带 Web 界面**的 profile:
154
+ >
155
+ > - 网页版 DSH:`--profile web`(默认数据目录 `~/.dsh`);
156
+ > - 官方 DeepSeek Harness 桌面应用:`--profile desktop`(同一个 `~/.dsh` 数据目录,装完在应用里重新加载插件或重启一次应用);
157
+ > - Oh-DSH Desktop:数据目录是 `~/.ohdsh`,见下方 [Oh-DSH Desktop](#oh-dsh-desktop)。
158
+ >
159
+ > `dsh plugin add` 只是把插件加进**指定** profile。**全新创建**的 profile 只含 `@deepseek-ai/dsh-base`,此时 `dsh web` 不会绑定端口(没有 Web 面)。请装进已有的 profile,或先让新 profile 具备 Web 面。
160
+
152
161
  > [!WARNING]
153
162
  > 如果这个 profile 里已经有通过 `cordis.patch.yml` **手动挂载**的社区插件,不要再把这种旧式加载方式与 `dsh plugin add` / `dsh plugin list` 混用:当前 DSH CLI 可能同时把带 bundle patch 的依赖追加到 `dsh.profile.bundles`,导致这些插件被重复注册。请先把原有手动插件迁移到 bundle 管理方式,或继续沿用手动安装路径。详见 [deepseek-harness Discussion #2889](https://github.com/deepseek-ai/deepseek-harness/discussions/2889)。
154
163
 
@@ -434,7 +443,7 @@ ollama pull qwen2.5vl
434
443
  ## 环境要求
435
444
 
436
445
  - DeepSeek Harness 的 Web profile。普通安装可用 `npx @deepseek-ai/dsh ...`;从源码仓库运行时用 `pnpm dsh ...`。只有 CLI 已经进入系统 `PATH` 时才能直接写 `dsh ...`。
437
- - **DSH Host 支持策略:** DVR 2.3.x 从 `0.1.5-rc.1` 起连续支持 DSH 0.1.x(当前稳定证据为 `0.1.5-rc.3`),并从已验证的 `0.2.0-rc.2` 起支持 0.2.x;精确 `0.2.0-rc.2` 同时作为 2.3 默认开发 Host。低于 0.1.5 的 Host 不再支持,也不再维护旧的 0.1.x 锯齿式例外列表。运行时仍按能力判断,而不是按版本字符串分支。详见 [DSH Host 支持窗口](docs/architecture/dsh-support-window.md)。
446
+ - **DSH Host 支持策略:** DVR 3.0.x 从 `0.1.5-rc.1` 起连续支持 DSH 0.1.x(当前稳定证据为 `0.1.5-rc.3`),并从已验证的 `0.2.0-rc.2` 起支持 0.2.x;精确 `0.2.0-rc.2` 同时作为 3.0 默认开发 Host。低于 0.1.5 的 Host 不再支持,也不再维护旧的 0.1.x 锯齿式例外列表。运行时仍按能力判断,而不是按版本字符串分支。详见 [DSH Host 支持窗口](docs/architecture/dsh-support-window.md)。
438
447
  - Node ≥ 22(宿主侧)。
439
448
  - 默认免费链路无需 API Key;付费 `httpProviders` 只需一个凭据引用(`apiKeyEnv`)。
440
449
  - 只有 `vision_html_screenshot` 需要 Chrome / Chromium / Edge;其余工具无浏览器也能用。
@@ -0,0 +1,252 @@
1
+ # DVR 3.0 architecture plan
2
+
3
+ Status: **complete through R10 post-main correctness closure**
4
+
5
+ Baseline:
6
+
7
+ - DVR `main@c61802dfc591410ba328b7f4c8f983b0e3d5f447`
8
+ - DSH `deepseek-ai/deepseek-harness@639ed015397290b3745d163aafe02ffee4aa3f84` (`0.2.0-rc.2`)
9
+ - 3.0 development branch: `3.0`
10
+ - R9 architecture checkpoint: `1e331b1b8f8ea74a5cd38a1347f4e0bd13ef9ef9`
11
+ - R9 architecture audit: `docs/architecture/3.0-r9-final-audit.md`
12
+ - R10 post-main correctness implementation: `b38d427d54024f739dabbb3dacf389dc719a960f`
13
+ - R10 closure: `docs/architecture/3.0-r10-final-correctness-closure.md`
14
+
15
+ 3.0 is **typed architecture consolidation**, not a repository-wide TypeScript rewrite.
16
+ The success criterion is that changes to DSH contracts, lifecycle ownership, Settings,
17
+ Session, provider contracts, and public package boundaries fail loudly at the nearest
18
+ compiler/runtime/package gate. The percentage of files ending in `.ts` is not a goal.
19
+
20
+ ## Invariants inherited from 2.3
21
+
22
+ 3.0 must preserve the semantic owners established by 2.3:
23
+
24
+ | Responsibility | Owner |
25
+ | --- | --- |
26
+ | routing/background authority | `lib/vision-routing-authority.js` |
27
+ | routing evidence | `lib/vision-routing-evidence.js` |
28
+ | planning/scoring | `lib/vision-capability-router.js` |
29
+ | execution order | `lib/vision-execution-order.js` |
30
+ | Session visual state/index | Session runtime/state/index owners |
31
+ | managed artifacts | `lib/vision-artifact-store.js` |
32
+ | DVR-owned provider HTTP | explicit `VisionProviderTransport` instance |
33
+ | Host/product projection | server presentation boundaries |
34
+ | browser rendering | client/presentation layer |
35
+
36
+ High fan-out in `runtime-composition` is expected for a composition root and is not
37
+ by itself an extraction target. Core extraction requires a stable semantic owner, not
38
+ a line-count or import-count justification.
39
+
40
+ ## Required architecture direction
41
+
42
+ ```text
43
+ DSH public contracts
44
+ |
45
+ v
46
+ narrow Host boundaries
47
+ |
48
+ v
49
+ DVR domain types
50
+ |
51
+ v
52
+ Authority -> Evidence -> Planner -> Execution
53
+ | |
54
+ +------ composition ----+
55
+ |
56
+ v
57
+ mature core
58
+ ```
59
+
60
+ Host types and DVR domain types must not become one giant interface graph.
61
+
62
+ ## Source/build target
63
+
64
+ The target package model is:
65
+
66
+ ```text
67
+ canonical source generated package artifact
68
+ src/**/*.ts / transitional .js -> lib/**/*.js
69
+ client typed/transitional source -> lib/client.js
70
+ -> lib/types/**/*.d.ts
71
+ ```
72
+
73
+ The preferred artifact directory remains `lib`; introducing `dist` has no identified
74
+ architectural benefit. Ordinary generated Host JavaScript should not become a second
75
+ checked-in source of truth.
76
+
77
+ Host code remains unbundled ESM. Browser code is a separate build/type world.
78
+
79
+ ## Type ownership
80
+
81
+ Use DSH package-exported public contracts wherever DSH owns the concept. DVR owns only
82
+ DVR semantics such as routing decisions, capability evidence, image ownership, Session
83
+ vision state, provider configuration, diagnostics, and resource ownership.
84
+
85
+ Do not create a generic `DvrContext`, Host facade, service locator, DI container,
86
+ global registry, or callback bag to make TypeScript conversion easier.
87
+
88
+ ## Runtime validation
89
+
90
+ TypeScript never replaces validation at Settings/JSON, RPC, provider/network,
91
+ filesystem, persisted state, environment, browser/Node, or user-input boundaries.
92
+
93
+ Preferred rule:
94
+
95
+ ```text
96
+ unknown -> boundary parser/official codec -> typed value -> domain
97
+ ```
98
+
99
+ Schemastery remains the owner for plugin Config/Settings schema. Zod or another runtime
100
+ validator is justified only for complex untrusted external shapes; browser code should
101
+ not gain a heavyweight validator merely for type symmetry.
102
+
103
+ ## Host / Client programs
104
+
105
+ Host and browser Client must be type-checked as separate programs. DSH itself separates
106
+ the two because both sides augment Cordis Context under different runtime contracts.
107
+
108
+ Host compilation should follow real Node ESM resolution rather than copying DSH's
109
+ monorepo-only build choices mechanically. Current target for the Host compiler is
110
+ NodeNext/NodeNext with explicit ESM extension discipline.
111
+
112
+ ## Browser constraint
113
+
114
+ The existing `262144` byte single-file review bound for `lib/client.js` is frozen.
115
+ 3.0 must not raise it to make TypeScript fit. Client migration is an independent Go/No-Go
116
+ workstream and may remain partly JavaScript if typed generation would weaken
117
+ determinism, debugging, loader transparency, or the size gate.
118
+
119
+ ## Compatibility
120
+
121
+ Runtime Host compatibility and durable user-data compatibility are independent.
122
+
123
+ 3.0 may raise the Host floor only after a dedicated evidence gate proves that the
124
+ removed Host generations account for real compatibility complexity. A higher Host floor
125
+ does not authorize deleting readers/migrations for persisted Settings, profile data,
126
+ Session/replay data, attachment identity, or historical image ownership.
127
+
128
+ No speculative DSH 0.3 implementation is part of this plan.
129
+
130
+ ## Production dependency policy
131
+
132
+ Production runtime code may depend on documented/package-exported DSH faces. It must
133
+ not import `@deepseek-ai/*/src/*` or DeepSeek Harness monorepo filesystem internals.
134
+
135
+ Exact-source compatibility surveillance under `scripts/` and tests is a separate
136
+ category: it may inspect upstream implementation source to detect Host drift or a shim's
137
+ removal condition, but that source dependency must not enter runtime code, public
138
+ declarations, or the npm runtime graph.
139
+
140
+ ## Public API direction
141
+
142
+ R7 replaced the former transitive mature-Core export graph with an explicit package-root
143
+ runtime/type surface. New Core exports no longer become package API automatically.
144
+
145
+ `./client` remains a DSH loader entry and is not treated as an ordinary consumer
146
+ library API.
147
+
148
+ ## Roadmap
149
+
150
+ Final status:
151
+
152
+ | Phase | Result |
153
+ | --- | --- |
154
+ | R0 | complete |
155
+ | R1 | complete |
156
+ | R2 | complete |
157
+ | R3 | complete |
158
+ | R4 | complete |
159
+ | R5 | complete — production Browser TypeScript switch No-Go |
160
+ | R6 | complete |
161
+ | R7 | complete |
162
+ | R8 | complete |
163
+ | R9 | complete |
164
+ | R10 | complete — post-main final correctness closure |
165
+
166
+ R9 records the typed-architecture audit at its historical checkpoint. The post-main
167
+ correctness findings and repairs are recorded separately in
168
+ `docs/architecture/3.0-r10-final-correctness-closure.md`.
169
+
170
+ ### R0 - Baseline and contract ledger
171
+
172
+ - freeze package/export/browser/support facts;
173
+ - record DSH public type authorities;
174
+ - classify current package-root exposure;
175
+ - gate production private DSH source imports;
176
+ - record compatibility candidates without deleting them.
177
+
178
+ ### R1 - Source/artifact boundary
179
+
180
+ - establish `src` as canonical source and `lib` as generated output;
181
+ - preserve behavior/module ownership during relocation;
182
+ - add clean/reproducible artifact checks;
183
+ - do not combine source moves with semantic refactors.
184
+
185
+ ### R2 - Type infrastructure and Host boundaries
186
+
187
+ - separate Host and Client TypeScript programs;
188
+ - add strict compiler policy;
189
+ - type Settings, Session, LLM/provider, attachment, RemoteResult, and composition inputs
190
+ against DSH public contracts;
191
+ - allow a controlled JS bridge during migration.
192
+
193
+ ### R3 - DVR domain types
194
+
195
+ Type only stable DVR-owned semantics. Do not create interfaces without a named owner and
196
+ a concrete coupling/risk they reduce.
197
+
198
+ ### R4 - Composition and mature Core
199
+
200
+ Migrate composition/lifecycle before low-value algorithmic code. Mature Core conversion
201
+ is incremental and must not trigger decomposition solely for file size.
202
+
203
+ ### R5 - Browser Client
204
+
205
+ Run an independent typed-source/build experiment. Switch production ownership only when
206
+ the output is deterministic, understandable, uses only supported runtime externals,
207
+ passes real browser/Desktop tests, and stays at or below 256 KiB.
208
+
209
+ ### R6 - Compatibility retirement / Host floor
210
+
211
+ Re-run every shim's documented removal condition. Host-floor changes are evidence-based
212
+ and do not retire durable-data compatibility.
213
+
214
+ ### R7 - Public API
215
+
216
+ Classify root exports as plugin contract, supported API, compatibility API, accidental
217
+ internal, or test-only. Publish only deliberate types/runtime faces.
218
+
219
+ ### R8 - CI/release
220
+
221
+ Add typecheck, lint, clean build, generated sync, reproducibility, packed declaration
222
+ smoke, and source-to-artifact evidence without weakening the existing pack-once,
223
+ tarball-identity, trusted-publishing, and provenance model.
224
+
225
+ ### R9 - Final audit
226
+
227
+ Re-run ownership, lifecycle, dependency-cycle, browser, compatibility, package,
228
+ Node 22/24, supported DSH, Desktop, adversarial, property, resource, and release audits.
229
+
230
+ ### R10 - Final correctness closure
231
+
232
+ - review post-main implementation rather than treating R9 green evidence as transitive;
233
+ - repair provider transport capture, dynamic Host validation and optional Cordis seams;
234
+ - complete Session Vision sidecar/user-authority lifecycle ownership;
235
+ - align package-root runtime and declaration contracts;
236
+ - migrate CI trigger ownership from generated artifacts to canonical source;
237
+ - verify the exact package candidate before tag creation while preserving pack-once.
238
+
239
+ ## Explicit non-goals
240
+
241
+ - 100% TypeScript conversion;
242
+ - Big Bang rewrite;
243
+ - generic DI/service locator;
244
+ - global current owner or registry;
245
+ - `Object.create(core)` facade;
246
+ - Config/Settings impersonation;
247
+ - Core decomposition by LOC;
248
+ - composition splitting by fan-out;
249
+ - routing/Session/provider rewrites unrelated to a proven 3.0 seam;
250
+ - browser size-limit increase;
251
+ - importing DSH private implementation to obtain richer types;
252
+ - deleting runtime validation because code is typed.
@@ -0,0 +1,137 @@
1
+ # DVR 3.0 R0 contract ledger
2
+
3
+ Status: **R0 baseline**
4
+
5
+ Audit baseline:
6
+
7
+ - DVR source baseline: `main@c61802dfc591410ba328b7f4c8f983b0e3d5f447`
8
+ - 3.0 planning commit: `9fe18fb0abe8732ee2848140e10113dfada92623`
9
+ - DSH source baseline: `deepseek-ai/deepseek-harness@639ed015397290b3745d163aafe02ffee4aa3f84`
10
+ - DSH package line at audit: `0.2.0-rc.2`
11
+
12
+ R0 records facts and installs non-behavioral architecture gates. It does not move source,
13
+ change Host support, delete compatibility, or alter plugin runtime behavior.
14
+
15
+ ## Package and runtime baseline
16
+
17
+ | Contract | R0 value |
18
+ | --- | --- |
19
+ | package | `dsh-vision-router@2.3.0` |
20
+ | module kind | ESM |
21
+ | Node | `^22.19.0 || >=24.0.0` |
22
+ | package root | `lib/public-entry.js` |
23
+ | DSH browser entry | `lib/client.js` |
24
+ | CLI | `lib/doctor-cli-p0.js` |
25
+ | browser hard bound | `262144` bytes |
26
+ | browser R0 size | `261672` bytes |
27
+ | browser headroom | `472` bytes |
28
+ | production ESM cycles at 2.3 close | 0 |
29
+
30
+ The 256 KiB browser review bound is a retained constraint, not a migration target to relax.
31
+
32
+ ## Current root export topology
33
+
34
+ The current root is intentionally **not** curated during R0:
35
+
36
+ ```text
37
+ package "."
38
+ -> lib/public-entry.js
39
+ -> export * from ../entry.js
40
+ -> export * from ./index.js
41
+ -> export * from ./lib/vision-resilience.js
42
+ ```
43
+
44
+ Static export inventory at the R0 baseline:
45
+
46
+ - `index.js`: 101 direct named exports;
47
+ - `lib/vision-resilience.js`: 13 named exports re-exported by `index.js`;
48
+ - `entry.js`: 10 direct named exports plus the Core star export;
49
+ - estimated distinct package-root named surface after shadowing/deduplication: **122 names**.
50
+
51
+ This is an **inventory**, not an assertion that all 122 names are supported public API.
52
+ R7 must classify every root export as one of:
53
+
54
+ - `PLUGIN_CONTRACT`;
55
+ - `PUBLIC_SUPPORTED`;
56
+ - `PUBLIC_COMPAT`;
57
+ - `INTERNAL_ACCIDENTAL`;
58
+ - `TEST_ONLY`.
59
+
60
+ R0 must not reduce this surface before that classification because doing so would mix API
61
+ breakage with source/build migration.
62
+
63
+ ## DSH type authority ledger
64
+
65
+ Production TypeScript must prefer package-exported DSH contracts where DSH owns the
66
+ concept.
67
+
68
+ | Concept | Current DSH authority |
69
+ | --- | --- |
70
+ | `RemoteResult` / remote failures | `@deepseek-ai/dsh-typert-protocol` |
71
+ | Session client/controller faces | `@deepseek-ai/dsh-api-session-controller/client` |
72
+ | Session/model-selection value contracts | `@deepseek-ai/dsh-api-session-controller/types` |
73
+ | LLM/provider/message vocabulary | `@deepseek-ai/dsh-llm/types` |
74
+ | attachment vocabulary | `@deepseek-ai/dsh-attachment` / exported types face |
75
+ | Settings transport/view vocabulary | `@deepseek-ai/dsh-settings/types` |
76
+ | generated client remote assembly | `@deepseek-ai/dsh-api-remotes/client` |
77
+ | browser slots | `@deepseek-ai/dsh-client-ui-slots` |
78
+ | ModelDirectory controller/state | `@deepseek-ai/dsh-client-ui-model-selection/client` |
79
+
80
+ `ModelDirectory` and `ModelDirectoryState` are package-exported browser contracts, but
81
+ remain model-selection UI/controller types. They are not DVR routing-domain types.
82
+
83
+ ## Production private-source policy
84
+
85
+ R0 installs a hard architectural rule:
86
+
87
+ > Production runtime code must not import or reference DSH package `src/*` entry points
88
+ > or `deepseek-harness/packages/*/src/*` monorepo implementation paths.
89
+
90
+ This applies to production entry points and `lib/**/*.js` now, and later to generated
91
+ runtime output from `src`.
92
+
93
+ The rule deliberately does **not** ban scripts/tests that inspect exact upstream source.
94
+ Files such as `scripts/dsh017-source-contract.mjs` are upstream compatibility
95
+ surveillance; they are allowed to inspect DSH implementation source because they do not
96
+ enter the npm production runtime graph.
97
+
98
+ ## Compatibility baseline
99
+
100
+ 2.3 closes with runtime Host support spanning the 0.1.5 train and exact 0.2.0-rc.2
101
+ evidence. 3.0 does not change that in R0.
102
+
103
+ Runtime Host compatibility and durable-data compatibility remain independent. A later
104
+ Host-floor raise cannot by itself remove replay, Settings/profile, Session, attachment,
105
+ route-identity, or historical image-ownership readers.
106
+
107
+ ## R0 compatibility candidate: dsh-client-runtime
108
+
109
+ Current DVR still names `@deepseek-ai/dsh-client-runtime` in two places:
110
+
111
+ 1. `package.json#dsh.client.inject`;
112
+ 2. `lib/doctor-runtime.js#HOST_PACKAGES`.
113
+
114
+ At the audited DSH `0.2.0-rc.2` source baseline, repository search finds historical
115
+ references but no current package implementation that establishes this as a current
116
+ browser runtime package. DVR also has no identified `ctx.runtime` consumption.
117
+
118
+ Classification: **candidate stale Host/browser edge, not yet deletion-authorized**.
119
+
120
+ Removal requires real package/Host/browser evidence and must update both the manifest
121
+ and Doctor assumption together. R0 records the candidate; R6 owns the decision.
122
+
123
+ ## R0 exit criteria
124
+
125
+ R0 is complete when:
126
+
127
+ - the 3.0 architecture plan exists in-repo;
128
+ - this contract ledger exists;
129
+ - the existing package/browser/support baselines remain unchanged;
130
+ - CI runs on the 3.0 development branch;
131
+ - production private DSH source references are forbidden by an executable architecture
132
+ test;
133
+ - no runtime behavior, support floor, compatibility shim, release metadata, tag, npm
134
+ package, or GitHub Release is changed.
135
+
136
+ The next phase is R1: establish a source/artifact boundary without mixing that move with
137
+ semantic refactors.
@@ -0,0 +1,98 @@
1
+ # DVR 3.0 R1 source/artifact boundary
2
+
3
+ Status: **complete**
4
+
5
+ R1 was intentionally split so source relocation and artifact removal were not performed
6
+ in one unreviewable change.
7
+
8
+ ## Final source/artifact model
9
+
10
+ The canonical editable runtime tree is `src/`, preserving the established 2.3 package
11
+ artifact topology:
12
+
13
+ ```text
14
+ src/entry.js / transitional .ts -> entry.js
15
+ src/index.js / transitional .ts -> index.js
16
+ src/lib/**/*.js / src/lib/**/*.ts -> lib/**/*.js
17
+ ```
18
+
19
+ `entry.js`, `index.js`, and `lib/**` are generated package artifacts and are no longer
20
+ tracked by Git.
21
+
22
+ The move did not authorize import rewrites, Core decomposition, public API contraction,
23
+ or runtime ownership changes. Source relocation and TypeScript migration remain separate
24
+ review dimensions.
25
+
26
+ ## Build ownership
27
+
28
+ `scripts/build-source-artifacts.mjs` is the only writer for the package runtime tree.
29
+
30
+ A normal `pnpm build`:
31
+
32
+ 1. removes any stale root `entry.js`, `index.js`, and `lib/**`;
33
+ 2. copies transitional canonical JavaScript from `src/` byte-for-byte;
34
+ 3. compiles canonical TypeScript in an isolated temporary output directory;
35
+ 4. copies compiled JavaScript into the established package artifact paths.
36
+
37
+ This clean-before-build rule prevents deleted or renamed source modules from surviving as
38
+ stale files that could later enter `pnpm pack`.
39
+
40
+ `pnpm build:check` builds into a temporary directory and compares generated output with
41
+ the current package tree without mutating it.
42
+
43
+ `pnpm build:reproducible` performs two clean builds into independent temporary
44
+ directories and compares relative paths, byte sizes, and SHA-256 hashes.
45
+
46
+ ## Install and package lifecycle
47
+
48
+ Repository installs run `prepare -> pnpm build`, so workflows and direct test commands
49
+ that historically consumed `lib/**` receive current artifacts from canonical source.
50
+
51
+ The one security workflow that intentionally installs with `--ignore-scripts`
52
+ (`adversarial-fuzz`) has an explicit build step.
53
+
54
+ `prepack -> pnpm build` is an independent package safety gate. Packaging therefore does
55
+ not rely on generated files being present in the checkout or left over from tests.
56
+
57
+ Generated runtime paths are ignored by Git:
58
+
59
+ - `/entry.js`;
60
+ - `/index.js`;
61
+ - `/lib/`.
62
+
63
+ The npm `files` allowlist continues to name those artifact paths because they are package
64
+ outputs, not repository source.
65
+
66
+ ## Workflow trigger migration
67
+
68
+ Specialized workflows whose path filters referenced the old root `index.js`,
69
+ `entry.js`, or `lib/**` now also follow `src/**`. This prevents removal of tracked
70
+ artifacts from silently disabling architecture, Host, browser, resource, compatibility,
71
+ or fuzz gates.
72
+
73
+ ## Browser client
74
+
75
+ The browser client remains a separate workstream. Canonical browser source currently
76
+ lives under `src/lib/client.js`; its deterministic embedded maintenance-actions sync is
77
+ performed on canonical source before package artifacts are rebuilt.
78
+
79
+ The existing 262144-byte hard review bound is unchanged.
80
+
81
+ ## R1 verification
82
+
83
+ R1b was verified from a checkout with **zero tracked generated runtime artifacts**:
84
+
85
+ - frozen install succeeded;
86
+ - prepare rebuilt the runtime tree;
87
+ - clean build succeeded;
88
+ - generated artifact verification succeeded;
89
+ - two-build reproducibility succeeded;
90
+ - Host and Client typecheck succeeded;
91
+ - full Node 22 and Node 24 test suites succeeded;
92
+ - Linux and macOS native Host/sharp smoke succeeded;
93
+ - Windows runtime regression succeeded;
94
+ - Windows `pnpm pack` succeeded with generated artifacts ignored by Git;
95
+ - the packed tarball installed into a DSH-like Host with the shared-sharp invariant intact.
96
+
97
+ R1 is closed. Further source migration is R2/R3/R4 work and must preserve this build
98
+ contract.