better-dsh 0.2.3 → 0.2.4-b

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 (406) hide show
  1. package/cordis.patch.yml +47 -16
  2. package/docs/10_plans/2026-09-23-remote-execution-framework.md +236 -0
  3. package/docs/10_plans/2026-09-23-remote-framework-impl.md +2083 -0
  4. package/docs/50_test-reports/2026-09-06-write/345/267/245/345/205/267sandbox/345/215/207/347/272/247/351/200/217/344/274/240bug/345/244/215/345/217/221/345/217/212/346/214/202/350/265/267-/344/272/213/344/273/266/346/212/245/345/221/212.md +176 -0
  5. package/docs/50_test-reports/2026-09-08-hashline-edit-E_RANGE_UNVERIFIED/350/267/250/350/275/256/344/274/232/350/257/235/351/224/256/345/244/261/346/225/210-/350/257/212/346/226/255/346/212/245/345/221/212.md +226 -0
  6. package/docs/50_test-reports/2026-09-11-control-prompt-into-eval-description/345/256/236/346/265/213/346/212/245/345/221/212.md +222 -0
  7. package/docs/50_test-reports/2026-09-12-fs-scheme-resolution-/345/256/236/346/265/213/346/212/245/345/221/212.md +81 -0
  8. package/docs/50_test-reports/2026-09-12-url-schemes-grammar-matrix/344/270/216catalog-centralize-/345/256/236/346/265/213/346/212/245/345/221/212.md +234 -0
  9. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-design/351/252/214/350/257/201/346/212/245/345/221/212.md +160 -0
  10. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/345/211/247/346/234/254.md +44 -0
  11. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/346/212/245/345/221/212.md +89 -0
  12. package/docs/50_test-reports/2026-09-12-url-schemes-/345/205/255scheme/345/206/222/347/203/237/344/270/216/350/276/271/347/225/214/345/256/236/346/265/213/346/212/245/345/221/212.md +198 -0
  13. package/docs/50_test-reports/2026-09-13-hashline-off/344/270/213scheme/345/217/257/350/276/276/346/200/247/345/267/245/345/205/267/351/235/242/344/270/215/345/257/271/347/247/260-/345/256/236/346/265/213/346/212/245/345/221/212.md +246 -0
  14. package/docs/50_test-reports/2026-09-13-preact-ui-shell/345/256/236/346/265/213/346/212/245/345/221/212.md +50 -0
  15. package/docs/50_test-reports/2026-09-14-4999-skill/346/270/205/345/215/225/344/270/216lsp-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +63 -0
  16. package/docs/50_test-reports/2026-09-17-plugins/351/241/265/345/205/255/347/273/204/344/273/266/346/213/206/345/210/206/345/256/236/346/265/213/346/212/245/345/221/212.md +76 -0
  17. package/docs/50_test-reports/2026-09-23-remote-framework/345/256/236/346/265/213/346/212/245/345/221/212.md +92 -0
  18. package/docs/50_test-reports/2026-09-23-remote-framework/347/254/254/344/270/200/344/272/272/347/247/260/345/244/215/346/265/213/346/212/245/345/221/212.md +125 -0
  19. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
  20. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
  21. package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
  22. package/docs/50_test-reports/v0.2.3b-hashline-content-locator/345/256/236/346/265/213/346/212/245/345/221/212.md +73 -0
  23. package/docs/50_test-reports/v0.2.3c-mobile-wave/345/256/236/346/265/213/346/212/245/345/221/212.md +47 -0
  24. package/docs/50_test-reports/v0.2.4-ios-focus-zoom-suppression/345/256/236/346/265/213/346/212/245/345/221/212.md +158 -0
  25. package/docs/specs/agent/spec.md +54 -0
  26. package/docs/specs/ast/spec.md +34 -0
  27. package/docs/specs/compaction-recall/spec.md +46 -0
  28. package/docs/specs/ctx/spec.md +107 -0
  29. package/docs/specs/dsh/spec.md +47 -0
  30. package/docs/specs/dvc/spec.md +87 -0
  31. package/docs/specs/escalation-guidance/spec.md +44 -0
  32. package/docs/specs/fs-scheme-resolution/spec.md +37 -0
  33. package/docs/specs/hash-edit/spec.md +41 -0
  34. package/docs/specs/http-read/spec.md +73 -0
  35. package/docs/specs/kernel-provisioning/spec.md +53 -0
  36. package/docs/specs/lsp/spec.md +121 -0
  37. package/docs/specs/mobile-layout/spec.md +108 -0
  38. package/docs/specs/model-failover/spec.md +20 -0
  39. package/docs/specs/plugins-page-components/spec.md +79 -0
  40. package/docs/specs/preact-ui-shell/spec.md +22 -0
  41. package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
  42. package/docs/specs/skill/spec.md +58 -0
  43. package/docs/specs/tool-surface/spec.md +222 -0
  44. package/docs/specs/url-schema/spec.md +148 -0
  45. package/docs/specs/web-trust-fence/spec.md +43 -0
  46. package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
  47. package/dsh-docs/AGENTS.md +75 -0
  48. package/dsh-docs/agent-lifecycle.md +84 -0
  49. package/dsh-docs/agent-lifecycle.zh.md +86 -0
  50. package/dsh-docs/api-gateway.md +164 -0
  51. package/dsh-docs/api-gateway.zh.md +164 -0
  52. package/dsh-docs/architecture.md +150 -0
  53. package/dsh-docs/architecture.zh.md +154 -0
  54. package/dsh-docs/capability-seams.md +543 -0
  55. package/dsh-docs/capability-seams.zh.md +545 -0
  56. package/dsh-docs/config-catalog.md +3473 -0
  57. package/dsh-docs/config-catalog.zh.md +3474 -0
  58. package/dsh-docs/cookbook/adding-a-package.md +117 -0
  59. package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
  60. package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
  61. package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
  62. package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
  63. package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
  64. package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
  65. package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
  66. package/dsh-docs/cookbook/adding-a-tool.md +101 -0
  67. package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
  68. package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
  69. package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  70. package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
  71. package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  72. package/dsh-docs/cookbook/extension-cookbook.md +132 -0
  73. package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
  74. package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
  75. package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  76. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  77. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  78. package/dsh-docs/cordis-api/context.md +364 -0
  79. package/dsh-docs/cordis-api/context.zh.md +366 -0
  80. package/dsh-docs/cordis-api/events.md +207 -0
  81. package/dsh-docs/cordis-api/events.zh.md +209 -0
  82. package/dsh-docs/cordis-api/fiber.md +375 -0
  83. package/dsh-docs/cordis-api/fiber.zh.md +377 -0
  84. package/dsh-docs/cordis-api/inherited.md +39 -0
  85. package/dsh-docs/cordis-api/registry.md +152 -0
  86. package/dsh-docs/cordis-api/registry.zh.md +154 -0
  87. package/dsh-docs/cordis-api/service.md +102 -0
  88. package/dsh-docs/cordis-api/service.zh.md +104 -0
  89. package/dsh-docs/cordis-primer.md +45 -0
  90. package/dsh-docs/cordis-primer.zh.md +51 -0
  91. package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
  92. package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  93. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  94. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  95. package/dsh-docs/cordis-tutorial/03-services.md +98 -0
  96. package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
  97. package/dsh-docs/cordis-tutorial/04-events.md +144 -0
  98. package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
  99. package/dsh-docs/cordis-tutorial/05-config.md +84 -0
  100. package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
  101. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  102. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  103. package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
  104. package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
  105. package/dsh-docs/cordis-tutorial/index.md +60 -0
  106. package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
  107. package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
  108. package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
  109. package/dsh-docs/defensive-patterns.md +33 -0
  110. package/dsh-docs/defensive-patterns.zh.md +35 -0
  111. package/dsh-docs/development.md +167 -0
  112. package/dsh-docs/development.zh.md +173 -0
  113. package/dsh-docs/event-producer-consumer.md +86 -0
  114. package/dsh-docs/event-producer-consumer.zh.md +88 -0
  115. package/dsh-docs/glossary.md +45 -0
  116. package/dsh-docs/glossary.zh.md +45 -0
  117. package/dsh-docs/graph-atlas.md +22 -0
  118. package/dsh-docs/graph-atlas.zh.md +24 -0
  119. package/dsh-docs/i18n/README.md +60 -0
  120. package/dsh-docs/i18n/README.zh.md +62 -0
  121. package/dsh-docs/i18n/style-samples.md +87 -0
  122. package/dsh-docs/i18n/terminology.md +214 -0
  123. package/dsh-docs/i18n/translation-prompt.md +263 -0
  124. package/dsh-docs/i18n/translation-rules.md +69 -0
  125. package/dsh-docs/i18n/translation-rules.zh.md +69 -0
  126. package/dsh-docs/module-graph.md +1411 -0
  127. package/dsh-docs/module-graph.zh.md +1413 -0
  128. package/dsh-docs/persistence-catalog.md +1075 -0
  129. package/dsh-docs/persistence-catalog.zh.md +1077 -0
  130. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  131. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  132. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  133. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  134. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  135. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  136. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  137. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  138. package/dsh-docs/postmortem/README.md +18 -0
  139. package/dsh-docs/postmortem/README.zh.md +18 -0
  140. package/dsh-docs/rescope.md +53 -0
  141. package/dsh-docs/rescope.zh.md +53 -0
  142. package/dsh-docs/session-format-status.md +47 -0
  143. package/dsh-docs/session-format-status.zh.md +47 -0
  144. package/dsh-docs/subsystems/README.md +61 -0
  145. package/dsh-docs/subsystems/README.zh.md +61 -0
  146. package/dsh-docs/subsystems/agent-team.md +207 -0
  147. package/dsh-docs/subsystems/agent-team.zh.md +207 -0
  148. package/dsh-docs/subsystems/approval.md +170 -0
  149. package/dsh-docs/subsystems/approval.zh.md +170 -0
  150. package/dsh-docs/subsystems/attachment.md +351 -0
  151. package/dsh-docs/subsystems/attachment.zh.md +351 -0
  152. package/dsh-docs/subsystems/client-modules.md +168 -0
  153. package/dsh-docs/subsystems/client-modules.zh.md +168 -0
  154. package/dsh-docs/subsystems/client-resources.md +91 -0
  155. package/dsh-docs/subsystems/client-resources.zh.md +91 -0
  156. package/dsh-docs/subsystems/code-runtime.md +195 -0
  157. package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
  158. package/dsh-docs/subsystems/commands.md +219 -0
  159. package/dsh-docs/subsystems/commands.zh.md +219 -0
  160. package/dsh-docs/subsystems/compaction.md +238 -0
  161. package/dsh-docs/subsystems/compaction.zh.md +238 -0
  162. package/dsh-docs/subsystems/conversation.md +258 -0
  163. package/dsh-docs/subsystems/conversation.zh.md +258 -0
  164. package/dsh-docs/subsystems/core.md +1209 -0
  165. package/dsh-docs/subsystems/core.zh.md +1219 -0
  166. package/dsh-docs/subsystems/credentials.md +329 -0
  167. package/dsh-docs/subsystems/credentials.zh.md +329 -0
  168. package/dsh-docs/subsystems/extensions.md +382 -0
  169. package/dsh-docs/subsystems/extensions.zh.md +382 -0
  170. package/dsh-docs/subsystems/feedback.md +266 -0
  171. package/dsh-docs/subsystems/feedback.zh.md +266 -0
  172. package/dsh-docs/subsystems/filesystem.md +505 -0
  173. package/dsh-docs/subsystems/filesystem.zh.md +505 -0
  174. package/dsh-docs/subsystems/goal.md +277 -0
  175. package/dsh-docs/subsystems/goal.zh.md +277 -0
  176. package/dsh-docs/subsystems/invariants.md +88 -0
  177. package/dsh-docs/subsystems/invariants.zh.md +88 -0
  178. package/dsh-docs/subsystems/jobs.md +290 -0
  179. package/dsh-docs/subsystems/jobs.zh.md +290 -0
  180. package/dsh-docs/subsystems/llm-streaming.md +1080 -0
  181. package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
  182. package/dsh-docs/subsystems/lsp.md +202 -0
  183. package/dsh-docs/subsystems/lsp.zh.md +202 -0
  184. package/dsh-docs/subsystems/permission-presets.md +131 -0
  185. package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
  186. package/dsh-docs/subsystems/persistence.md +395 -0
  187. package/dsh-docs/subsystems/persistence.zh.md +395 -0
  188. package/dsh-docs/subsystems/plan.md +87 -0
  189. package/dsh-docs/subsystems/plan.zh.md +87 -0
  190. package/dsh-docs/subsystems/sandbox.md +220 -0
  191. package/dsh-docs/subsystems/sandbox.zh.md +220 -0
  192. package/dsh-docs/subsystems/schedule.md +192 -0
  193. package/dsh-docs/subsystems/schedule.zh.md +192 -0
  194. package/dsh-docs/subsystems/scope.md +59 -0
  195. package/dsh-docs/subsystems/scope.zh.md +59 -0
  196. package/dsh-docs/subsystems/session-projection.md +354 -0
  197. package/dsh-docs/subsystems/session-projection.zh.md +354 -0
  198. package/dsh-docs/subsystems/session-query.md +509 -0
  199. package/dsh-docs/subsystems/session-query.zh.md +509 -0
  200. package/dsh-docs/subsystems/session-reference.md +219 -0
  201. package/dsh-docs/subsystems/session-reference.zh.md +219 -0
  202. package/dsh-docs/subsystems/session-telemetry.md +194 -0
  203. package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
  204. package/dsh-docs/subsystems/session-title.md +204 -0
  205. package/dsh-docs/subsystems/session-title.zh.md +204 -0
  206. package/dsh-docs/subsystems/session.md +1155 -0
  207. package/dsh-docs/subsystems/session.zh.md +1159 -0
  208. package/dsh-docs/subsystems/settings.md +405 -0
  209. package/dsh-docs/subsystems/settings.zh.md +405 -0
  210. package/dsh-docs/subsystems/shell.md +303 -0
  211. package/dsh-docs/subsystems/shell.zh.md +303 -0
  212. package/dsh-docs/subsystems/sidebar-right.md +148 -0
  213. package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
  214. package/dsh-docs/subsystems/skills.md +354 -0
  215. package/dsh-docs/subsystems/skills.zh.md +354 -0
  216. package/dsh-docs/subsystems/slots.md +175 -0
  217. package/dsh-docs/subsystems/slots.zh.md +175 -0
  218. package/dsh-docs/subsystems/spill.md +117 -0
  219. package/dsh-docs/subsystems/spill.zh.md +117 -0
  220. package/dsh-docs/subsystems/storage.md +260 -0
  221. package/dsh-docs/subsystems/storage.zh.md +260 -0
  222. package/dsh-docs/subsystems/subagent.md +766 -0
  223. package/dsh-docs/subsystems/subagent.zh.md +770 -0
  224. package/dsh-docs/subsystems/subprocess.md +324 -0
  225. package/dsh-docs/subsystems/subprocess.zh.md +324 -0
  226. package/dsh-docs/subsystems/system-prompt.md +220 -0
  227. package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
  228. package/dsh-docs/subsystems/terminal.md +184 -0
  229. package/dsh-docs/subsystems/terminal.zh.md +184 -0
  230. package/dsh-docs/subsystems/todo.md +32 -0
  231. package/dsh-docs/subsystems/todo.zh.md +32 -0
  232. package/dsh-docs/subsystems/token-meter.md +105 -0
  233. package/dsh-docs/subsystems/token-meter.zh.md +105 -0
  234. package/dsh-docs/subsystems/tools.md +720 -0
  235. package/dsh-docs/subsystems/tools.zh.md +720 -0
  236. package/dsh-docs/subsystems/typert.md +343 -0
  237. package/dsh-docs/subsystems/typert.zh.md +343 -0
  238. package/dsh-docs/subsystems/user-questions.md +178 -0
  239. package/dsh-docs/subsystems/user-questions.zh.md +178 -0
  240. package/dsh-docs/subsystems/web-client.md +95 -0
  241. package/dsh-docs/subsystems/web-client.zh.md +95 -0
  242. package/dsh-docs/subsystems/web-server.md +154 -0
  243. package/dsh-docs/subsystems/web-server.zh.md +154 -0
  244. package/dsh-docs/subsystems/web.md +206 -0
  245. package/dsh-docs/subsystems/web.zh.md +206 -0
  246. package/dsh-docs/subsystems/webhook.md +70 -0
  247. package/dsh-docs/subsystems/webhook.zh.md +70 -0
  248. package/dsh-docs/subsystems/workflow.md +278 -0
  249. package/dsh-docs/subsystems/workflow.zh.md +278 -0
  250. package/dsh-docs/subsystems/workspace.md +321 -0
  251. package/dsh-docs/subsystems/workspace.zh.md +321 -0
  252. package/dsh-docs/testing.md +54 -0
  253. package/dsh-docs/testing.zh.md +54 -0
  254. package/dsh-docs/tool-catalog.md +2225 -0
  255. package/dsh-docs/tool-catalog.zh.md +2233 -0
  256. package/dsh-docs/tool-execution-pipeline.md +62 -0
  257. package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
  258. package/dsh-docs/user/develop/basic/config.md +106 -0
  259. package/dsh-docs/user/develop/basic/config.zh.md +106 -0
  260. package/dsh-docs/user/develop/basic/index.md +144 -0
  261. package/dsh-docs/user/develop/basic/index.zh.md +144 -0
  262. package/dsh-docs/user/develop/basic/publish.md +183 -0
  263. package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
  264. package/dsh-docs/user/develop/basic/tool.md +52 -0
  265. package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
  266. package/dsh-docs/user/develop/framework/events.md +143 -0
  267. package/dsh-docs/user/develop/framework/events.zh.md +143 -0
  268. package/dsh-docs/user/develop/framework/index.md +137 -0
  269. package/dsh-docs/user/develop/framework/index.zh.md +137 -0
  270. package/dsh-docs/user/develop/framework/service.md +148 -0
  271. package/dsh-docs/user/develop/framework/service.zh.md +150 -0
  272. package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
  273. package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
  274. package/dsh-docs/user/develop/practice/index.md +155 -0
  275. package/dsh-docs/user/develop/practice/index.zh.md +155 -0
  276. package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
  277. package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
  278. package/dsh-docs/user/guide/github-review.md +102 -0
  279. package/dsh-docs/user/guide/github-review.zh.md +102 -0
  280. package/dsh-docs/user/guide/index.md +30 -0
  281. package/dsh-docs/user/guide/index.zh.md +30 -0
  282. package/dsh-docs/user/guide/mcp-memory.md +101 -0
  283. package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
  284. package/dsh-docs/user/guide/network-proxy.md +85 -0
  285. package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
  286. package/dsh-docs/user/guide/providers.md +190 -0
  287. package/dsh-docs/user/guide/providers.zh.md +190 -0
  288. package/dsh-docs/user/guide/python-sdk.md +150 -0
  289. package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
  290. package/dsh-docs/user/guide/schedule.md +21 -0
  291. package/dsh-docs/user/guide/schedule.zh.md +21 -0
  292. package/dsh-docs/user/index.md +11 -0
  293. package/dsh-docs/user/index.zh.md +11 -0
  294. package/dsh-docs/web-styling.md +29 -0
  295. package/dsh-docs/web-styling.zh.md +29 -0
  296. package/eval-description.md +33 -0
  297. package/lib/client/index.js +328 -89
  298. package/lib/compaction/index.d.ts +47 -0
  299. package/lib/compaction/index.js +159 -0
  300. package/lib/failover/index.d.ts +35 -0
  301. package/lib/failover/index.js +141 -0
  302. package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
  303. package/lib/fs-aware/sandbox-plugin.js +249 -0
  304. package/lib/index.d.ts +10 -41
  305. package/lib/index.js +226 -8173
  306. package/lib/lsp-server-registry-946ysdqg.js +972 -0
  307. package/lib/lsp-server-registry-XU6aHSqZ.js +3 -0
  308. package/lib/mobile/plugin.d.ts +29 -0
  309. package/lib/mobile/plugin.js +54 -0
  310. package/lib/native-capture-x_Hos2e8.js +68 -0
  311. package/lib/py-sdk-Chvy92MB.js +178 -0
  312. package/lib/py-sdk.d.ts +19 -2
  313. package/lib/py-sdk.js +2 -2
  314. package/lib/remote/plugin.d.ts +24 -0
  315. package/lib/remote/plugin.js +1095 -0
  316. package/lib/url-schemes/index.d.ts +88 -0
  317. package/lib/url-schemes/index.js +7200 -0
  318. package/lib/web-trust-BO66y72w.js +361 -0
  319. package/lib/web-trust-CgpBoFv3.d.ts +106 -0
  320. package/lib/web-trust.d.ts +2 -0
  321. package/lib/web-trust.js +3 -0
  322. package/lib/wrap-Dr8XtIak.js +747 -0
  323. package/package.json +87 -56
  324. package/url-schemes-instruction.md +22 -0
  325. package/control-prompt.md +0 -37
  326. package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
  327. package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  328. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  329. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  330. package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
  331. package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  332. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  333. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  334. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  335. package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  336. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  337. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  338. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  339. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  340. package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
  341. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  342. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  343. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  344. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  345. package/docs/60_exploration-and-research/cordis-research.md +0 -350
  346. package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
  347. package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
  348. package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
  349. package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
  350. package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
  351. package/docs/REPL-/345/267/245/345/205/267/350/260/203/347/224/250-/346/210/252/346/226/255/350/257/212/346/226/255.md +0 -110
  352. package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
  353. package/docs/adr/0002-masking-is-presentation-only.md +0 -15
  354. package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
  355. package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
  356. package/docs/plans/dashr-blueprint-review.md +0 -201
  357. package/docs/plans/dashr-blueprint.md +0 -561
  358. package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
  359. package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
  360. package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
  361. package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
  362. package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
  363. package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
  364. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
  365. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
  366. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
  367. package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
  368. package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
  369. package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
  370. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
  371. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
  372. package/docs/plans/recallable-compaction.md +0 -147
  373. package/docs/plans/spike-tag-repro.mjs +0 -102
  374. package/docs/plans/upstream-analysis.md +0 -128
  375. package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
  376. package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
  377. package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
  378. package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
  379. package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
  380. package/docs/v0.1.8d_artifacts/README.md +0 -138
  381. package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  382. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  383. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  384. package/docs/v0.1.8d_artifacts/functions.json +0 -592
  385. package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  386. package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  387. package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  388. package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  389. package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  390. package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
  391. package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
  392. package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
  393. package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  394. package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  395. package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  396. package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  397. package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
  398. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  399. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  400. package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  401. package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  402. package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
  403. package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
  404. package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
  405. package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
  406. package/lib/py-sdk-CbgYiX8O.js +0 -691
@@ -0,0 +1,63 @@
1
+ # 4999 实测报告 — skill:// 空路径清单 + lsp gate/fan-out(2026-09-14)
2
+
3
+ ## 被测构建
4
+ - canonical:`dashr/dashr` @ `0da6a9f`(skill:// bare list)+ `84a98dc`(lsp parity stages 2/3/5)+ `3a94ce1`(stage 4)+ `7373d4e`(gate)
5
+ - 部署:rsync → monorepo `packages/better-dsh/better-dsh`(tsdown + build-client)→ 4999 实例(unit `dsh-4999-test`,DSH_HOME=`.dsh-test`)重启后验证。
6
+
7
+ ## 方法
8
+ 真实 agent 会话(headless Chrome CDP 驱动 GUI,复用 `.scratch/cdp-chat.mjs`),会话 `session-3dc1ae5b`(workspace `--home-u1-workspaces-dashr--`),prompt 指示执行指定 tool call 并原样回报输出;tool result 从 session v3 jsonl(zstd)落账本取证。
9
+
10
+ ## 结果
11
+
12
+ ### 1. 裸 `skill://` → 可用技能清单 ✅
13
+ `read skill://`(无名字)返回 cwd 范围技能目录(`N available skill(s):` + 逐条 `skill://<name> — <description> (use when: …)`),实际返回 11 条(book-to-skill … markitdown),与会话 skill catalog 一致。此前"returns nothing"的空白路径消除。
14
+
15
+ ### 2. `write dvc://lsp {"action":"status"}` ✅
16
+ 返回 `{"ok":true,"gate":"unasked"}` —— gate 动作走通,session id 由 write 分发器自动注入,agent 无需手填。
17
+
18
+ ### 3. `{"action":"diagnostics","file":"<abs .ts>","all":true}` fan-out ✅
19
+ ```json
20
+ { "ok": true, "fanout": true,
21
+ "servers": ["typescript-language-server","biome","eslint","denols","tailwindcss"],
22
+ "diagnostics": [],
23
+ "summary": "fan-out …/src/index.ts: 0 diagnostic(s) across 5 server(s) — …" }
24
+ ```
25
+ 5 个覆盖 .ts 的注册 server 全部被查询、合并、按 server 标注,无崩溃。
26
+
27
+ ### 4. 结构化错误路径 ✅(负例)
28
+ 相对路径 `dashr/dashr/src/index.ts`(相对 session cwd 不存在)→ 结构化 `file not found: <cwd>/…`,非崩溃非静默。
29
+
30
+ ## 结论
31
+ 本轮三项改动(skill:// 清单、lsp gate、fan-out 诊断)在 4999 真实运行时第一人称实测通过。单测侧:lsp-device 22 过、lsp-gate 5 过、skill.spec 17 过;tsc/构建绿。
32
+
33
+ ## 遗留
34
+ - 真实 language server 端到端诊断(安装 pyright/ts 后取非空诊断、didOpen/didSave 同步行号对齐)未覆盖——本机当时无 server 二进制,fan-out 返回 0 视为"无 server/干净"两可;待装齐后补测。
35
+ - gate on 后的 warm-start/didOpen 预热延迟附挂路径需真实 server 才能观测。
36
+
37
+ ## 追加实测(同日,commit 351d942)— dvc://lsp 读面
38
+ - `read dvc://lsp/status`:同一会话先 `write {"action":"on"}` 后 read → `{"ok":true,"gate":"on"}` —— session 经 read env 注入生效,读面返回**调用会话**的 gate。
39
+ - `read dvc://lsp/diagnostics?file=<abs>&all=1`:query 经 selector 还原为参数,fan-out 5 server 正常返回。
40
+ - 写面保留 status 动作(与注入式分发对称),但查询的规范形式是读面。
41
+
42
+ ## 追加(同日,commit 660fd4b)— 两个活体缺陷修复
43
+ 1. **dvc://browser 被会话注入毒死**:dispatcher 把 `session` 塞进 args,browser device 严格 validator 报 `unknown field(s) "session"`。修复:session 改走 `execute(args, {session})` 带外传输(lsp gate 同步改读 ctx,兼容旧 in-args)。进程内实证:`dispatchDvcWrite('dvc://browser', open example.com, 'sess-1')` 真实启动 Chrome 并返回 `{"ok":true,...,"title":"Example Domain"}`。
44
+ 2. **read 普通文件路径失败**:wrapper 参数只声明 `path`,被委托方(host 原生 read 要求 `file_path`)收不到参数报 missing required property;非 string 返回值又撞 wrapper 的 string 输出 schema。修复:参数声明双键别名;委托前按被委托方**声明的 schema** 适配键名(opaque schema 原样透传);非 string 结果 JSON 归一。三个委托形态(file_path 声明/path 声明/opaque)单测覆盖。
45
+
46
+ ## 追加(同日,commit f53c609)— glob/grep URL 缺陷修复
47
+ - `glob pattern="skill://grp/*"` 曾把带 glob 元字符的 URL 整体传给 ripgrep 当字面路径(rg exit 2)。修复:`splitUrlGlob` 在路径段首个元字符(`*?[`)处切分——URL 部分走 resolvePath,尾部 glob 作为 rooted pattern 应用在资源真实目录内。进程内对真实 skill 目录实证:`skill://grp/*` 与 `skill://grp/**/*.md` 均在目录内解析,不再报 No such file。
48
+ - `grep path="skill://…"` 匹配路径改写回 URL 形式(绝对路径前缀改写 + 原生相对路径前置),模型看到 `skill://grp/SKILL.md` 而非内部磁盘位置。
49
+ - url-schema spec 的 "glob with a URL in pattern … globs the resource's real disk directory natively" 场景现在对带元字符的 URL 同样成立。
50
+
51
+ ## 追加(同日,commit 874edf2)— dsh://docs 指向上游官方文档
52
+ - 官方 harness 文档语料(241 个 md,源自 deepseek-ai/deepseek-harness docs/,经 dsh-dev-skill 抓取)vendor 进包内 `dsh-docs/`,随 `files` 发布。
53
+ - 解析顺序:显式 docsDir → `pkgRoot/dsh-docs` → `pkgRoot/docs` → `pkgRoot/../docs`;docs-dir 逐级上溯在每层先探 `dsh-docs`。
54
+ - 4999 部署后实测:`dsh://docs` 索引返回 agent-lifecycle/api-gateway/architecture/… 官方语料清单。
55
+
56
+ ## 追加(2026-09-15)— 外部调查四洞修复(commit 待填:本条 commit)
57
+ 外部 owner 级调查确认四个洞,全部修复并在 4999 部署后实测:
58
+ 1. **fan-out 死代码**:`obtainClient` 被提到 `all:true` 分支之前,primary 缺失时 fan-out 永不可达。修复:fan-out 提前分发(`diagnosticsFanOut` 独立函数),不再要求 primary client。
59
+ 2. **fan-out 失败与干净不可分**:每 server 结果现带 `status: ok|missing|error`(`perServer` 数组),summary 明示 "missing (NOT clean): …" / "errors: …"。4999 实测:`perServer:[{typescript-language-server,ok},{biome,missing},{eslint,missing},{denols,ok},{tailwindcss,missing}]`。
60
+ 3. **安装结果被丢弃**:`ensureMustHave` 的 `installServer` 结果现落入 `installFailed`(per-session),在 `status` 读面以 `installFailures` 呈现;成功安装后调 `clearCommandProbeCache` 清负探针缓存(修复负缓存永久误报)。
61
+ 4. **must-have 只在 write 后触发**:新增 `lspGateEnsure`,read/query-first 路径同样触发后台安装。附加:`resolveCommandPath` 显式探测 `~/.local/bin`、`~/.cargo/bin`、`~/go/bin`(daemon PATH 被 scrub 后 npm -g 安装位置不可见——本次 user 手工 symlink 到 /usr/local/bin 的根因)。
62
+ 5. **device summary 过期**("advertises 4, answers 11"):summary 改为完整动作枚举(read 面 + write 面)。
63
+ 6. **status 读面扩充**:`availability`(每语言 command+available)、`liveServers`、(会话内)`gate`+`installFailures`。4999 实测:python/typescript/rust available=true、go=false,liveServers 两条。
@@ -0,0 +1,76 @@
1
+ # Plugins 页组件化(6 行拆分)+ 卡片描述 实测报告
2
+
3
+ - 日期:2026-09-17
4
+ - 变更:spec `dashr/docs/specs/plugins-page-components/spec.md`(bundle patch 1 insert → 6 inserts;package.json 补 `description`;native-capture 提升共享模块)
5
+ - 测试环境:Dev/Test 1(upstream 0.1.5-rc.2 源码树 + 内嵌 dashr 副本),实例 **4988**(4999 被占用),LAN socat 中继
6
+ - 结论:**目标全部达成**(dev 线可证的全部事实);UI 行开关逐键验收待 prod 安装后(见 §六)
7
+
8
+ ## 一、机制事实(对 prod 0.1.3 线 plugin-manager 源码核实)
9
+
10
+ - 插件页卡片描述 = 包 manifest `description` 字段(`BundleInfo.description` JSDoc:"`description` of the package manifest")。better-dsh 此前缺该字段 → 卡片无描述。官方包走 locale 表(`builtinAgentTeamTitle/Description`),非官方回退 manifest。
11
+ - 页面"组件" = bundle patch 的 **insert 行**(`declaredRows()`:inserts 才进 `rows`;非 insert 行进 `overrides`,该页不显示)。行开关 = 向 profile 用户层 patch 写 `{id, disabled}`,HMR 即时生效(`writePluginEnabled(profile.patchPath, …)` + `reload()`)。
12
+ - 0.1.5-rc.2 测试线无 plugin-manager(无行开关 UI,仅只读 inventory);行结构为两线共用的 host 侧事实。
13
+
14
+ ## 二、交付物
15
+
16
+ 1. `package.json`:`description` 逐字取 awesome-dsh-plugins listing en 文案(与市场单源一致);新增 5 个子路径导出(`./url-schemes`、`./failover`、`./compaction-tuning`、`./web-trust`、`./mobile`)。
17
+ 2. `cordis.patch.yml`:6 条 insert(dashr-repl 核心 / dashr-url-schemes / dashr-failover / dashr-compaction-tuning / dashr-web-trust / dashr-mobile);compaction 再启用三条与 `connection` fence 保持 override 行(原生页不列 override——做成 insert 需 fork 上游模块,不采纳)。
18
+ 3. 配置键迁移:`urlSchemes`/`hashline`/`trustedPageAuthorities`/`mobile` 离开 dashr-repl Config,落所属行 schema(`DSH_TRUSTED_HOSTS` 派生默认保留在 web-trust 行 schema;MOBILE_CONFIG 原文迁至 mobile 行)。
19
+ 4. **顺序不变式结构化**:`native-capture` 升为共享模块(tsdown 多入口 chunk 共享 `native-capture-x_Hos2e8.js`,单例 WeakMap);wire mask 监听器第一步 `captureAllTools(agent)` 后才 restrict——两行激活顺序无关(`lib/index.js` 与 `lib/url-schemes/index.js` 实测引用同一 chunk)。
20
+
21
+ ## 三、构建卫生
22
+
23
+ - dev 基 `tsc --noEmit`:与 stash 基线**逐条一致**(仅同类既有错误的行号漂移;基线 15 条均为独立 dev 检出的 host 类型漂移)。
24
+ - dev 基 vitest 全量:**508 过 / 14 挂** —— 14 挂经 stash 基线复跑证实**先于本改动**(url-schemes.spec 2 + agent-family 12,同源类型漂移)。
25
+ - surface.spec 夹具更新为**双行挂载**(镜像真实组合),10/10 过;**反向挂载顺序**(mask 行先于 url-schemes 行)同样 10/10 —— 顺序无关性实测成立。
26
+ - monorepo 副本:`pnpm install`(node_modules 曾被清,build 产物完好)→ `tsdown` + `build-client.ts` 双半重建成功。
27
+
28
+ ## 四、4988 实例实测(第一人称)
29
+
30
+ boot log 当前段零 error/warn;shell 200;boot graph 含 `"id":"better-dsh"`;`/plugins/??better-dsh/client.js&rev=…` 200 且与 `lib/client/index.js` 仅差服务端追加的 sourceMappingURL 行。
31
+
32
+ 1. **组合面**:`web --dump-config` 六行齐落 —— `dashr-repl→better-dsh`、`dashr-url-schemes→better-dsh/url-schemes`、`dashr-failover→better-dsh/failover`、`dashr-compaction-tuning→better-dsh/compaction-tuning`、`dashr-web-trust→better-dsh/web-trust`、`dashr-mobile→better-dsh/mobile`;override 行 `compaction-basic` `disabled: false` 在位。
33
+ 2. **双腿活体**:served HTML 同时含 `__DSH_TRANSPORT__`(authorities = `[test.pc.randomhash.app, pc.randomhash.app, 192.168.31.130]`,schema 默认自 DSH_TRUSTED_HOSTS 派生 ✓)与 `__DASHR_MOBILE__` + zoomGuard 段。
34
+ 3. **行开关往返**(用户层 patch 写 `{id: dashr-mobile, disabled: true}`,即 prod 开关按钮的落盘形态):
35
+ - 禁用 → 3 秒内 HMR 生效:`__DASHR_MOBILE__` 0、zoomGuard 0、`__DSH_TRANSPORT__` 1(web-trust 行不受牵连);
36
+ - 恢复 → `__DASHR_MOBILE__` 2、zoomGuard 1、transport 1。零重启。
37
+ 4. **LAN 中继**:`http://192.168.31.130:4988/?token=…` 303(认证重定向,链路通)。
38
+ 5. `.dsh-test` 用户层旧 override(`hashline`/`urlSchemes` 挂在 dashr-repl 行)已顺手迁移清零(键已随拆分移行)。
39
+
40
+ ## 五、已知边界
41
+
42
+ - 0.1.5 测试线的 Settings → Plugins → Plugin list 只读 inventory 不展示 bundle 行(新 UI 模型);六行 UI 开关验收属 prod 0.1.3 线 plugin-manager 页面。
43
+ - url-schemes 行关闭时:eval/委派桥正常(mask 自带 capture 步骤固化被 mask 定义——单元级由 surface.spec 双行挂载覆盖);read/write/grep/glob 回落原生语义。
44
+ - failover / compaction-tuning 行关闭后,其 client 设置卡仍在 General 页写 settings(无消费者)——与拆分前"卡在、宿主逻辑在"的形态一致的降级,已在 spec §Out of Scope 记录。
45
+
46
+ ## 六、待办
47
+
48
+ - user 以普通 user 身份自装实测(发布红线 a→c;本次未 publish、未动 prod)。
49
+ - prod 安装后的 UI 验收清单:better-dsh 卡片显示 listing 描述;6 组件行在列;逐行开关 + HMR 生效;`dashr-mobile` 关闭后真机手势熄灭。
50
+
51
+ ---
52
+
53
+ ## 七、追加轮(2026-09-21):对齐 harness 0.1.6-alpha.2,真 UI 全量验收 ✅
54
+
55
+ user 裁决:侧栏 Plugins 页(plugin-manager UI)仅存在于 **0.1.6-alpha.2** 线;prod 已是 0.1.6-alpha.2 + latest better-dsh(0.2.4)。Dev/Test 1 checkout 由 `dsh-v0.1.5-rc.2` 切至 `dsh-v0.1.6-alpha.2`(ddefc45fbc)。
56
+
57
+ ### 对齐轮落位
58
+
59
+ - **本地 patch 手工重放**(未盲 apply):pnpm-workspace.yaml(storeDir/verifyDepsBeforeRun/linkWorkspacePackages + allowBuilds `zeromq`、`@deepseek-ai/dsh-subprocess-local`);root package.json devDep `unrun@^0.3.1`;`packages/client/tsdown.client.ts` REPOSITORY_ROOT 派生(clean apply);apps/web vite preact alias/dedupe + devDeps preact 10.29.8 pin(冲突手工并,pin 保留)。
60
+ - **vendor 文档再迁移**:`vendor/docs/`(前轮 ENOTDIR 补丁位)在 0.1.6 会被 root tsdown.config 的 `vendor/*` workspace glob 当作**幻影包**(无 package.json → 向上找名 → `@deepseek-ai/dsh-root` → `Cannot find entry lib/types/{index,invariant,startup}.js` 全 build 失败)。已移出 vendor,落 `.scratch/vendor-docs/`。vendor 根不允许任何子目录缺 package.json。
61
+ - **bun 工作流隔离**:树内另一 workstream 的未跟踪 bun-compile 实验文件(`packages/boot/app-boot/src/bun-internal-bridge.ts` + `bun-registry/` + 根 `x`)破坏 pristine tag 的 tsc(生成物 `dsh-bun-registry-entries/bun-registry.generated` 不存在,tracked 代码零引用)。已整体隔离至 `.scratch/bun-workstream-quarantine/`,未删除。
62
+ - **测试 profile 依赖声明**(本轮关键发现):0.1.6 plugin-manager 以 **profile package.json `dependencies`** 判定"已安装 bundle";`.dsh-test` profile 此前只有 bundle 行 + 手工 symlink、dependencies 为空 → better-dsh 卡片不出现。已补 `"better-dsh": "0.2.4"`(镜像 prod 形态;不跑 profile install,symlink 供位不变)。
63
+ - 全量构建通过(248 client artifacts);copy 侧 tsdown + build-client 双半重建;pnpm install 完成 copy 的 14 项 `workspace:*` devDeps 手术链接。
64
+
65
+ ### 真 UI 验收(CDP,4988 @ 0.1.6-alpha.2-ddefc45-dirty)
66
+
67
+ 1. **卡片**:`better-dsh v0.2.4` + listing 文案描述全文在卡("Make your dsh ready for serious coding tasks. (Tools x Schemas)^REPL. …")—— description 修复在真 UI 得证。
68
+ 2. **组件**:`Components 6 total · 6 running` —— dashr-repl / dashr-url-schemes / dashr-failover / dashr-compaction-tuning / dashr-web-trust / dashr-mobile,模块名逐行正确,各带 `role="switch"`。
69
+ 3. **行开关真 UI 往返**(dashr-mobile):
70
+ - 关 → aria-checked true→false;用户层 patch 立现 `{id: dashr-mobile, disabled: true}`;2.5s 内 served HTML `__DASHR_MOBILE__` 归零、zoomGuard 消失、`__DSH_TRANSPORT__` 不受牵连;
71
+ - 开 → override 行被移除、行态回 true、mobile 全局 + zoomGuard 复返。零重启,零页面错误。
72
+ 4. 截图:`.scratch/4988-plugins-016.png`(列表)、`4988-mobile-off.png` / `4988-mobile-on.png`(往返两态)。
73
+
74
+ ### 结论
75
+
76
+ 两项原始诉求(卡片描述、组件化行开关)在**与 prod 同版**的 harness 上全量验收通过。发布仍按红线等待 user 单次明确放行。
@@ -0,0 +1,92 @@
1
+ # Remote 执行框架(`remote` 工具)4986 第一人称实测报告
2
+
3
+ - **日期**: 2026-09-23
4
+ - **分支**: `remote-framework`(worktree `.worktrees/remote-framework`,基 `main` @ e9061b8)
5
+ - **代码范围**: `better-dsh/src/remote/*`(nonce-framing / target / transports / oneshot / pty-session / driver / status / tool / plugin,9 模块)+ 三处接线(exports `./remote`、tsdown entry、cordis.patch.yml `dashr-remote` 行)
6
+ - **对照设计**: `docs/10_plans/2026-09-23-remote-execution-framework.md`(spec 权威)+ 实施计划 `docs/10_plans/2026-09-23-remote-framework-impl.md`(含 Rulings P1–P14)
7
+ - **第一人称载体**: `dsh --profile headless`(真实运行时 session、真实 LLM、真实工具派发;9 次 headless 运行覆盖 18 case 矩阵)
8
+
9
+ ## 一、环境与部署
10
+
11
+ - Dev/Test 1:monorepo `upstream/deepseek-harness`(dsh-v0.1.6-alpha.2 基线 + 仓内 patch);canonical src 自 worktree rsync,devDeps 手术 14× workspace:* 照旧重打。
12
+ - **零新增依赖**:本框架纯 `node:child_process` / `node:crypto` + 系统 CLI(ssh / docker / incus / util-linux script)——RM0 的 ssh2 native 依赖面不存在。
13
+ - 构建:`pnpm --filter better-dsh exec tsdown` + `tsx scripts/build-client.ts`(lib/client 清洗陷阱照旧);`lib/remote/plugin.js` 产出。
14
+ - 实例:`PORT=4986 bash .tests/dsh-test1/start-4999.sh`(unit `dsh-4986-test`,boot 走构建产物 `apps/cli/lib/bin.js` + 裸 node——双平面红线遵守)。
15
+ - 配置面:`web --dump-config`(产物 bin)确认 `dashr-remote` 行入组合(`- id: dashr-remote / name: better-dsh/remote`,紧随 better-dsh/mobile)。
16
+ - 别名路由(case 9):test home 层 `cordis.patch.yml` 追加 `dashr-remote` 行重述 + `config.containers.{"ctr-1": "incus:ctr-1"}`——**行重述覆盖机制真通**(home 层 config 覆盖 bundle 层默认)。验收后已清理还原。
17
+
18
+ ## 二、18 case 验收矩阵(全部 ✅)
19
+
20
+ | # | case | 证据(第一人称 verbatim 摘录) | 判定 |
21
+ |---|---|---|---|
22
+ | 1 | ssh oneshot 基础 | `{dev4, echo ok && git --version}` → `CASE1: 0 \| ok / git version 2.43.0` | ✅ |
23
+ | 2 | 退出码透传 | `{dev4, exit 42}` → `CASE2: 42`(二进制退出码,零字符串扫描) | ✅ |
24
+ | 3 | 复合语法(管道+变量) | `{dev4, ls / \| head -2 && echo $HOME}` → `bin / bin.usr-is-merged / /home/u1` | ✅ |
25
+ | 4 | pty 状态保持 | cd /tmp + export F=1 → 次 turn `pwd && echo $F` → `/tmp` + `1`,`cwd=/tmp` | ✅ |
26
+ | 5 | 多行单帧 | `"echo a\necho b"`(单串含换行)→ 一帧 `a\nb`,exit 0 | ✅ |
27
+ | 6 | 伪 marker 免疫 | 打印静态 `\033]133;D;deadbeef…;99` → exit **0**(非 99)、输出含 real、流无截断(agent 转打时引号被 shell 搅碎成 command-not-found 噪音——帧判定不受影响,更狠的实证) | ✅ |
28
+ | 7 | pty 超时打断 | `sleep 300` timeout 2 → `exit 130 \| interrupted \| 2.3s`(P8 两段打断在真 `ssh -tt` 上成立);随后 `echo alive` exit 0 **会话存活** | ✅ |
29
+ | 8 | incus oneshot | `{incus:ctr-1, cat /etc/os-release \| head -1}` → `Ubuntu 26.04 LTS` | ✅ |
30
+ | 9 | incus pty + 别名路由 | 显式前缀 pty `cd / && pwd` → `cwd=/`;裸名 `ctr-1` → 路由进容器(`via-alias / ctr-1` hostname 证实)——别名优先于 ~/.ssh/config 同名 Host | ✅ |
31
+ | 10 | docker oneshot | `{docker:dashr-remote-t1, …}` → `in-docker / Ubuntu 24.04.5 LTS` | ✅ |
32
+ | 11 | docker pty(script 托管) | `cd /root && pwd` → `cwd=/root`(util-linux `script -qfec` 宿主 PTY + 远端 init 双层静默成立) | ✅ |
33
+ | 12 | BYO-PTY spawn | `{spawn:"docker exec -it dashr-remote-t1 bash", cmd:"echo spawned && hostname"}` → `spawned / 728e1cf8a10e` | ✅ |
34
+ | 13 | 错误透明 | ssh:`ssh: Could not resolve hostname no-such-host-xyz: Temporary failure in name resolution`(exit 255);docker:`Error response from daemon: No such container: no-such-ctr`(exit 1)——原生 stderr 逐字 | ✅ |
35
+ | 14 | 断联自愈 | `kill -9 $$` → exit null;次调用 → 首行逐字 `[remote: session reconnected to fresh shell; cwd reset to default]` + `back` + `cwd /home/u1`(归默认) | ✅ |
36
+ | 15 | 后台输出 Non-Goal | `nohup sleep 5 >/dev/null 2>&1 & echo bg-ok` → 输出恰 `bg-ok`、stderr 空、零噪声(使用者重定向职责示范成立) | ✅ |
37
+ | 16 | status 可达探测 | `{dev4}`(无 cmd)→ `probe: reachable in 3193ms (just now, on demand)` + `session: none — dials on first exec`;**全文无 "offline"**(agent 明确确认) | ✅ |
38
+ | 17 | status 会话层 | pty 用过之后 → `session: idle 4s (connected)`(user 裁决的 idle 语义:连接在、无 activity) | ✅ |
39
+ | 18 | status 容器事实/错误 | `{docker:no-such-ctr}` → `probe: error — error: no such object: no-such-ctr`(docker 原生文本透传) | ✅ |
40
+
41
+ **审计抽查** ✅:headless session log(`session-5628b047…`)含结构化 `dashr/remote-exec` 事件 3+ 条/会话——`{target, cmd, cwd, exit, durationMs}`(含中断记录:`sleep 300 → exit 130, 2260ms`)。
42
+
43
+ ## 三、四层模型映射核对
44
+
45
+ | spec 层 | 实现 | 证据 |
46
+ |---|---|---|
47
+ | L2 Bash One-shot(选定) | `ssh -o BatchMode=yes -T / docker exec -i / incus --force-noninteractive` + `bash -lc`,退出码即收尾 | case 1-3, 8, 10, 13 |
48
+ | L4 Assisted PTY(选定) | `ssh -tt` / `incus --force-interactive` / `script -qfec`(docker+spawn)+ nonce 收帧 | case 4-7, 9, 11, 12, 14 |
49
+ | L1/L3(拒绝) | 不存在对应代码路径 | — |
50
+
51
+ ## 四、状态词汇表行为证据(user 2026-09-23 裁决)
52
+
53
+ - **禁 `offline`**:三态探测输出 + 会话层输出全程缺席(agent 被直接问及并明确否认)。
54
+ - reachable / unreachable / 容器事实态 / error + `idle Ns` / `busy` / `none — dials on first exec` / `died` 全部按 Ruling 16 渲染。
55
+ - **on-demand 双重超时**(Ruling 17):探测在调用瞬间执行("just now, on demand" 标注);本矩阵全部真目标秒回,超时上限(5s/10s)未触发——由单测覆盖(`probe timed out after 10s` 标签路径)。
56
+ - 对比 RM0 时代的歧义(agent reasoning log 里纠结 "offline 是什么"):本轮 agent 零困惑、零多余 verify 尝试。
57
+
58
+ ## 五、Non-Goal 三条行为证据
59
+
60
+ 1. **后台输出不隔离**:case 15 使用者显式重定向 → 输出干净;未重定向的后台进程按 POSIX 会话语义自然出现在流里(工具不清洗)。
61
+ 2. **不重建 shell 内存状态**:case 14 重连后 cwd 归默认 + 明示提示行——由 Agent 上下文决定是否 cd 回去。
62
+ 3. **不暴露终端微调**:行列固定 40×120 烤进 init(无任何参数面)。
63
+
64
+ ## 六、真实观察(不阻塞,记录在案)
65
+
66
+ - **oneshot 会等 ssh 会话通道收尾**:case 15 中 `nohup sleep 5 >/dev/null 2>&1 &` 后调用持约 16.6s 才返回(远超 echo 即出的 bg-ok)——OpenSSH 会话通道语义(sshd 等会话内全部进程释放 fd),非本工具缺陷;agent 需要"发射后不管"时应加 `timeout` 或 `setsid` 全脱钩。工具侧如实等待(错误透明原则),描述文本可后续补一句披露。
67
+ - status probe 的 rtt 含 ssh 全握手(LAN 约 3.2s——含 DNS/KEX);纯 TCP rtt 需另设基准,非本期范围。
68
+ - dev4 无 docker,嵌套穿透(spec 场景 3 范式 A/B 的 ssh -t 嵌套 docker)未在本矩阵覆盖——spawn 通道(case 12)已证 BYO-PTY 机制本身;嵌套留待有嵌套环境时补测。
69
+ - pty 模式 stdout/stderr 合流(spec §4.2 诚实代价);oneshot 分离保留。
70
+
71
+ ## 七、测试基线
72
+
73
+ - worktree 单测:`test/remote/` **9 spec 69/69**(nonce 13 / target 5 / transports 9 / oneshot 6 / pty-session 13 / driver 6 / status 7 / tool 7 / plugin 3)。
74
+ - 全量 vitest(worktree):恰为基线 14 失败(url-schemes 2 + surface-devices/agent-family 12,皆先在、与本特性无关),577 通过 + 1 skip,无新增失败。
75
+ - `tsc --noEmit`:14 既有错误(同基线集合),remote/* 0 新错。
76
+
77
+ ## 八、遗留(后续里程碑候选)
78
+
79
+ - RM2 线:forward / tmux 驻留 / WebUI 终端面板(本框架 Non-Goal 边界外)。
80
+ - `ws://` transport(spec §二.2 远期)。
81
+ - status 的 `unreachable` 真机路径(断网/防火墙 DROP 场景)只有单测证据,真机矩阵未覆盖(需临时断 dev4)。
82
+ - 描述文本补一句 oneshot 会话通道持留语义的披露(§六 第 1 条)。
83
+
84
+ ## 九、发布前增量补遗(P16–P20,2026-09-24,均含第一人称验证)
85
+
86
+ - **P16** `ssh:` 显式选择器落地(后被 P20 降级为消歧备用);`ssh:ctr-1` 冒烟 exit 0。
87
+ - **P17** 删除自定义 `dashr/remote-exec` session 事件(原生事件集冻结、自定义类型落盘重载必拒——用户实测发现 history 加载失败);14 个毒化会话以 `ignorable:true` 信封手术修复。原生 `tool/call`+`tool/result` waterfall 即完整审计。
88
+ - **P18** 删除别名机制(插件数据不上 cordis 配置面;行 config 只留运行旋钮)。
89
+ - **P19** `remote({})` = roster 注意力入口(ssh config hosts + docker ps -a + incus list + 池内活会话,本地扫描零拨号);实测渲染无 exec 尾巴、池 key 内部标记剥离。
90
+ - **P20** 裸名按名优先解析(ssh config → docker → incus,撞名 ssh 优先);实测裸 `corti` 命中 docker、裸 `dev4` 走 ssh。description 重写为决策表开头 + 输出帽/流分离/pty 生命周期披露;`mode` 上 schema enum。
91
+ - 基线 14 失败定性为包版本锚定问题(user 裁决留待 housekeeping 批处理)。
92
+ - 最终态:`test/remote/` 78/78(11 spec)、tsc 既有基线零新增。
@@ -0,0 +1,125 @@
1
+ # Remote 执行框架 — 第一人称复测报告(approval policy = `never`)
2
+
3
+ - **日期**: 2026-09-23(矩阵 20:52–20:59 +08:00)
4
+ - **分支/HEAD**: `remote-framework` @ `ac8720a`(**post-P15**:pty 4M 尾窗环 + deathWaiter 摘除)
5
+ - **复测载体**: **本 agent 自己的 live session**(Dev/Test 1 实例 4999 Web 运行时,`session-95c48291-f958-455c-83ab-98de3fa815a4`,cwd `/home/u1/workspaces/dashr`),直接以 `remote` 工具逐条派发——不是 headless 代跑
6
+ - **策略面**: 同一 session 内 `approval/policy: ask → never`(seq 2 → 6)、`sandbox/mode: workspace-write → danger-full-access`(seq 1 → 5);全部复测动作发生在 `never` 之后
7
+ - **对照**: 原验收报告 `docs/50_test-reports/2026-09-23-remote-framework实测报告.md`(矩阵 @ c696fca,**pre-P15**)+ SDD ledger `.superpowers/sdd/2026-09-23-remote-framework-impl/progress.md`
8
+ - **运行时同一性**: 实例 20:22:08 启动,`lib/remote/plugin.js` 构建于 20:21:34;rsync 后 worktree `src/` 与 monorepo 副本 `src/` `diff -rq` 为空 → **所测即 `ac8720a`**。P15 之前从未在真运行时跑过矩阵(Task 10 矩阵早于 `ac8720a`),本报告是 **P15 代码的首次第一人称实测**。
9
+
10
+ ---
11
+
12
+ ## 一、结论
13
+
14
+ | 面 | 结果 |
15
+ |---|---|
16
+ | 18 case 矩阵(本 agent 亲自派发) | **18/18 ✅**(1–8、10–18 直接复现;9 别名腿在 4999 原地热生效后复现) |
17
+ | P15/C1 输出帽(此前仅单测) | **✅ 第一人称**(oneshot 30k 帽 + pty 4M 环,尾保留,daemon 存活) |
18
+ | 原报告 §八 遗留「unreachable 真机路径」 | **✅ 补上真机证据**(`192.0.2.1` 黑洞 → `Connection timed out`) |
19
+ | 审计事件 | **✅** 本 session 日志含结构化 `dashr/remote-exec`(target/cmd/cwd/exit/durationMs,含 exit 130 中断) |
20
+ | approval 耦合 | **零**。`never` 下无一次 approval 询问/拒绝(63 次工具调用,0 错误,0 `approval/request|denied`) |
21
+ | `test/remote/` 单测 | **70/70 ✅**(9 spec) |
22
+ | 全量 vitest | 14 失败(**同基线 2 文件**)/ **578 通过** / 1 skip(593) |
23
+ | `tsc --noEmit` | **14 错,集合同基线,`remote` 0 提及** |
24
+
25
+ ---
26
+
27
+ ## 二、18 case 矩阵(本 session verbatim)
28
+
29
+ | # | case | 本 session 调用与结果 | 判定 |
30
+ |---|---|---|---|
31
+ | 1 | ssh oneshot | `{dev4, echo CASE1: … / git --version}` → `CASE1: 0 \| ok / git version 2.43.0`,exit 0 · 4.2s | ✅ |
32
+ | 2 | 退出码透传 | `{dev4, exit 42}` → exit **42** · 3.4s | ✅ |
33
+ | 3 | 复合语法 | `{dev4, ls / \| head -2 && echo $HOME}` → `bin / bin.usr-is-merged / /home/u1` | ✅ |
34
+ | 4 | pty 状态保持 | `cd /tmp && export F=1`(cwd `/tmp`)→ `pwd && echo $F` → `/tmp` `1` | ✅ |
35
+ | 5 | pty 多行单帧 | `"echo a\necho b"` → `a\nb` 一帧,exit 0 · 0.3s | ✅ |
36
+ | 6 | 伪 marker 免疫 | `printf '\033]133;D;deadbeefdeadbeef;99\007' ; echo real-after-marker` → `real-after-marker`,exit **0**(非 99) | ✅ |
37
+ | 7 | pty 超时打断 | `sleep 300` timeout 2 → `exit 130 · 2.2s · interrupted`;随后 `echo alive` → exit 0(会话存活) | ✅ |
38
+ | 8 | incus oneshot | `{incus:ctr-1, cat /etc/os-release \| head -1}` → `Ubuntu 26.04 LTS` | ✅ |
39
+ | 9 | incus pty + **别名路由** | 显式前缀 pty `cd / && hostname && pwd` → `ctr-1` `/`;**裸名 `ctr-1`** pty `cd / && echo via-alias && hostname && pwd && cat /etc/os-release \| head -1` → `via-alias / ctr-1 / / Ubuntu 26.04 LTS`,cwd `/` | ✅ |
40
+ | 10 | docker oneshot | 新起 `dashr-remote-t1`(ubuntu:24.04)→ `in-docker / Ubuntu 24.04.5 LTS` | ✅ |
41
+ | 11 | docker pty(script 托管) | `cd /root && pwd` → cwd `/root` · 0.1s | ✅ |
42
+ | 12 | BYO-PTY spawn | `{spawn:"docker exec -it dashr-remote-t1 bash", cmd:"echo spawned && hostname"}` → `spawned / de819743d988` | ✅ |
43
+ | 13 | 错误透明 | ssh:`ssh: Could not resolve hostname no-such-host-xyz: Temporary failure in name resolution`(exit 255);docker:`Error response from daemon: No such container: no-such-ctr`(exit 1)——原生 stderr 逐字 | ✅ |
44
+ | 14 | 断联自愈 | `kill -9 $$` → `exit null` · 0.2s;次调用 → 首行逐字 `[remote: session reconnected to fresh shell; cwd reset to default]` + `back /home/u1`,cwd `/home/u1` | ✅ |
45
+ | 15 | 后台输出 Non-Goal | `nohup sleep 5 >/dev/null 2>&1 & echo bg-ok` → 输出恰 `bg-ok`,stderr 空,**3.6s**(见 §四.1) | ✅ |
46
+ | 16 | status 可达探测 | 无 pty 的 `dev3`/`dev2`:`probe: reachable in 1438/1061ms (just now, on demand)` + `session: none — dials on first exec`;**全文无 "offline"** | ✅ |
47
+ | 17 | status 会话层 | 用过 pty 后 `{dev4}` → `session: idle 8s (connected)` | ✅ |
48
+ | 18 | status 容器事实/错误 | `{docker:no-such-ctr}` → `probe: error — error: no such object: no-such-ctr`;`{docker:dkr-1}`(已退容器)→ `probe: container exited` | ✅ |
49
+
50
+ **审计抽查 ✅**:本 session 日志(`session.v3.jsonl.zstd` 解压)含逐条 `dashr/remote-exec`:`{target, cmd, cwd, exit, durationMs}`——含 `sleep 300 → exit 130, 2233ms`、别名腿 `target: "ctr-1" → cwd "/", exit 0`、`target: "docker exec -it … bash"`(spawn)。工具面失败路径(Task 8 的 Ruling 14)本轮无异类失败可触发,未新增样本。
51
+
52
+ ---
53
+
54
+ ## 三、补测:原报告遗留缺口
55
+
56
+ ### 3.1 输出帽(P15 / 终审 C1,此前仅 5M 单测)
57
+
58
+ | 面 | 调用 | 结果 |
59
+ |---|---|---|
60
+ | oneshot 30k 帽 | `{dev4, python3 -c "print('x'*50000)"}` | 文本首行 `[truncated: showing last 30000 of 50001 chars]`,尾标 `truncated, original 50001 chars`,exit 0 · 3.4s |
61
+ | pty 4M 尾窗环 | `{dev4, mode:pty, head -c 5000000 /dev/zero \| tr '\0' 'y'; echo; echo TAIL-MARK-OK}` | 文本首行 `[truncated: showing last 30000 of 4000000 chars]`,**尾部 `TAIL-MARK-OK` 在位**,尾标 `truncated, original 4000000 chars`,exit 0 · 4.8s |
62
+
63
+ 判读:pty 收集段被 4,000,000 UTF-16 环截断(`OUTPUT_HARD_CAP`),模型面再经 30k 尾窗;超 5MB 输出下 daemon 无 OOM、无卡死、尾字节保留——**C1 修复在真运行时成立**。注意 `original 4000000` 是**环上界**而非真实总量(帽后切片,设计如此)。
64
+
65
+ ### 3.2 status 真机 `unreachable`(原报告 §八 缺口)
66
+
67
+ `{192.0.2.1}`(TEST-NET 黑洞)→
68
+
69
+ ```
70
+ 192.0.2.1 — ssh host
71
+ probe: unreachable — ssh: connect to host 192.0.2.1 port 22: Connection timed out
72
+ session: none — dials on first exec
73
+ ```
74
+
75
+ 词汇表 `unreachable — <native error>` 自此有真机证据(此前仅单测标签路径)。
76
+
77
+ ### 3.3 别名路由的**热生效**事实(新发现)
78
+
79
+ 原 Task 10 把 case 9 的别名腿当"改 home 层 patch(隐含需重启)"处理。本次实测:写入 `.dsh-test/cordis.patch.yml`(`[]` → 一行 `dashr-remote` 行重述 + `containers: {ctr-1: incus:ctr-1}`),**约 3s 内 4999 活体自行重新对账**——
80
+
81
+ - 之前:`{ctr-1}` → `ctr-1 — ssh host`(~/.ssh/config 同名 Host 胜出)
82
+ - 之后:`{ctr-1}` → `ctr-1 — incus container` + `probe: container RUNNING`,pty 落容器(`via-alias / ctr-1`)
83
+ - 复原(`[]`)同样 ~3s 热生效:`{ctr-1}` 回到 `ssh host`
84
+
85
+ 即 0.1.6 的 HMR reconcile 覆盖 home 层 patch 写读,**别名腿无需重启**。副产品观察见 §四.2。
86
+
87
+ ---
88
+
89
+ ## 四、与原报告的差异 / 真实观察(均不阻塞)
90
+
91
+ 1. **case 15 的"oneshot 等 ssh 会话通道 ~16.6s"未复现**。本轮同形命令 **3.6s** 返回(≈常规 ssh 握手成本),输出/退出码/静默性均符 Non-Goal。原 §六 第 1 条的持留观察在本环境本轮不成立;描述文本是否补披露可再议(不据此改代码——一次观测 vs 一次观测,证据对等)。
92
+ 2. **配置热重载会丢弃 live pty 会话**:别名行热生效后,此前 idle 的 dev4 pty 会话从 `session: idle 8s (connected)` 变为 `session: none — dials on first exec`(插件行重挂 → `PtyPool` 重建)。行为可解释(重挂即新建 driver),但**不是** `idleTtlSec` 的语义,属"配置热改的代价",记录在案。
93
+ 3. **case 17 的 idle 语义**在热重载前验证成立(8s connected);热重载后必然归 none,两者不矛盾。
94
+ 4. dev4 无 docker,嵌套穿透(ssh -t 内嵌 docker)仍未覆盖(与原报告一致)——spawn 腿(case 12)已独立证 BYO-PTY 机制。
95
+
96
+ ---
97
+
98
+ ## 五、approval policy `never` 的专门核对
99
+
100
+ - 同一 session 策略事件:`approval/policy {ask}`(seq 2, 20:46)→ `{never}`(seq 6, 20:50);`sandbox/mode {workspace-write}` → `{danger-full-access}`。
101
+ - `never` 生效后:**63 次工具调用、0 次 `approval/request` / `approval/denied` / `sandbox/denied`**,18 case + 补测全部完成。
102
+ - 源码面核对:`src/remote/*` 无 `approval` / `sandbox` / `escalat` 任何引用(grep 0 命中)——本框架在 daemon 侧直接派发系统 CLI,**不经** agent 工具审批链,因此策略从 `ask` 收紧到 `never` 对 `remote` 功能面无影响。这条正是本轮复测要回答的问题。
103
+
104
+ ---
105
+
106
+ ## 六、单测 / 类型基线(worktree @ `ac8720a`)
107
+
108
+ - `npx vitest run test/remote/` → **Test Files 9 passed (9),Tests 70 passed (70)**(nonce 13 / target 5 / transports 9 / oneshot 6 / pty-session 14 / driver 6 / status 7 / tool 7 / plugin 3——pty-session 较原报告的 13 多 1,即 P15 的 5M 回归)。
109
+ - `npm test` → **14 failed | 578 passed | 1 skipped (593)**;失败恒为 **2 文件**:`test/url-schemes.spec.ts`(2)+ `test/surface-devices/agent-family.spec.ts`(12),单独复跑同得 `14 failed | 41 passed`——**全为 main 既有病,与本特性无关**。(ledger 记的 577 为 `ac8720a` 前数值;P15 新增 1 测试后应为 578。)
110
+ - `npx tsc --noEmit` → 14 错,文件集合同基线(`src/index.ts` 3、`src/url-schemes/index.ts` 1、`src/url-schemes/handlers/agent.ts` 1、`test/url-schemes.spec.ts` 2、`test/url-schemes/gates.spec.ts` 1、`test/surface-devices/agent-family.spec.ts` 6);**`remote` 0 提及**。
111
+
112
+ ---
113
+
114
+ ## 七、清理与现场状态
115
+
116
+ - 别名 patch:`.dsh-test/cordis.patch.yml` 已还原为 `[]`(原文件备份 `.scratch/cordis.patch.yml.bak-task10retest`),并已复核热还原。
117
+ - scratch 容器 `dashr-remote-t1` 已 `docker rm -f`;`docker ps -a` 无残留(`{docker:dashr-remote-t1}` 现报 `no such object` 即为清理后真值)。
118
+ - 未触碰 `corti` / `jellyfin` / `ctr-1` / `app` 等既有资产;未改任何源码或构建产物;未重启 4999(本轮全程在同一 session 内完成)。
119
+ - 证据落盘:解压后的本 session 日志 `.scratch/retest-session.jsonl`(356 行,含全部 audit 事件)。
120
+
121
+ ## 八、遗留
122
+
123
+ - 复核结论:**矩阵与缺口补测全过,approval `never` 无影响;分支 `ac8720a` 的实测证据面现覆盖 post-P15 代码**。
124
+ - 原报告 §八 其余两项仍开放(仅作里程碑候选):`ws://` transport(spec 远期);oneshot 会话通道持留语义的披露措辞(且本轮未复现,证据对等)。
125
+ - 本轮产物:本报告;无源码/测试改动,故无新单测需求。
@@ -0,0 +1,44 @@
1
+ # 上游 dsh 0.1.3-alpha.2 对齐轮本地实测报告(dashr 测试线)
2
+
3
+ - 实测日期:2026-09-08
4
+ - 范围:**仅 dashr(better-dsh 插件)** 自身对齐(omp-web 不在内);OpenSpec change `openspec/changes/2026-09-08-upstream-0-1-3-alpha-2-alignment/`(G1 S1–S7 + G2 小修,v0.2.3)
5
+ - 环境事实:checkout `upstream/deepseek-harness` @ `dsh-v0.1.3-alpha.2`(`82a5fd61a7`,release merge PR #3685);Node v22.22.1(unrun 路径);pnpm 11.7.0(store 重定向 `.scratch/pnpm-store`);better-dsh 副本 = canonical `0.2.3`(rsync 双向已收敛,src/test 字节一致);`DSH_HOME=.dsh-test`(prod `~/.dsh` 未动);web `127.0.0.1:4999`
6
+ - 上游版本判定(S0 报告 `docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md`):rc.1 = 纯发布(代码零差);目标 = alpha.2(npm `alpha` dist-tag)
7
+
8
+ ## 实测结果表
9
+
10
+ | 步骤 | 结果 | 备注 |
11
+ |---|---|---|
12
+ | S1 侦察 | ✅ | 三 tag 本机拉齐;patch 载体 tag 间 diff 复核(tsdown.client.ts ±1 / pnpm-workspace.yaml +8−1;`resolveRepositoryRoot` 上游未吸收,仍需本地) |
13
+ | S2 切换与重放 | ✅ | alpha.5 脏 overlay 全量归档 `.scratch/alpha5-dashr-local-overlay.patch`(2527 行)→ stash → checkout alpha.2 → 三必需 patch 手工重放(unrun devDep / storeDir+verifyDepsBeforeRun+zeromq / tsdown `resolveRepositoryRoot`)。**overlay 定性**:其余 17 文件全部为 bun --compile 可移植补丁(注释自证;Node 下惰性/同行为),未重引(4999 走 Node),归档留存 bun 实验用 |
14
+ | S3 副本地化 | ✅ | 副本无 stale `dsh-client-runtime` peerDep;peer 范围含 alpha.2(0.1.3-alpha.2 ∈ `>=0.1.2-alpha.1 <0.2.0-0`);bundle 名 `@deepseek-ai/dsh-base`/`dsh-web-app` 不变 |
15
+ | S4/S5 安装与构建 | ✅ | `pnpm install`(**pnpm 11.7 自动插 `allowBuilds` 占位符 `set this to true or false` → 硬错,改显式布尔**,AGENTS.md 已知坑再现);`pnpm run build` 全绿 ×2(tsc host + tsdown + vite web + 224 client artifacts),better-dsh lib+client 在位 |
16
+ | S6 启动 4999 | ✅ | systemd-run `dsh-4999-test`;root 200;dump-config:`dashr-repl` 行 + `DASHR_KERNEL_PYTHON` 注入 ✓;**注**:stop 后立即 start 有 EADDRINUSE 竞态(旧实例端口未释放),需间隔 ~2s 或独立 unit 先验证 |
17
+ | S7.1 工具面 | ✅ | `tool-web` 在位;`str_replace_editor` **缺席(0)**(base/web-app 默认下架生效) |
18
+ | S7.2 client 卡片 | ✅ | boot 图含 `"id":"better-dsh"`;合并 loader bundle 200(5.2MB/224 模块),better-dsh 段与 `lib/client/index.js` **字节一致**(除 sourceMappingURL 尾行);单入口 `/plugins/??better-dsh/client.js` 404(alpha.2 只服务聚合 `??` 请求——探针改聚合提取法) |
19
+ | S7.3 行形状查表 | ✅(预查收敛) | ① connection 行形状未漂移(persona 行改 prefix/suffix 与 dashr 无交集);② `__DSH_TRANSPORT__` 读法不变(新增可选 `__DSH_CONNECTION_RECOVERY__`,缺省无害);③④⑤ 零改动 |
20
+ | S7.4 fence/isLoopback | ✅ 静态 | 页面含 `__DASHR_MOBILE__` boot script(web-trust 腿在位);`__DSH_TRANSPORT__` 0(空 authorities 惰性=设计);env 探针(`DSH_TRUSTED_HOSTS` 401/403)留手测 |
21
+ | S7.5 zoomGuard | ✅ 静态 | ④⑤ 零改动 → reconcile 路径不变;CDP 双形态留手测 |
22
+ | S7.6 telemetry | ⏳ 手测 | feedback 面已 revert(上游 13daefe073);`DSH_TELEMETRY_DISABLED=1` 立场 prod 验证 |
23
+ | S7.7 老会话读兼容 | ⏳ 手测 | `.dsh-test` 无 v1 历史会话可自动验证;建议 GUI 用旧会话验证(上游 released migration 兜底) |
24
+ | file-tool 升级矩阵 | ⏳ 手测 | 事件报告建议 3 回归项;本地链路 09-06 已过,本实例留 user GUI 复测 |
25
+
26
+ ## 发现与修复(本批次代码改动,vitest 全量 481/481 绿)
27
+
28
+ 1. **session 事件面 API 漂移(真实对齐点)**:registry 解析的 `@deepseek-ai/dsh-session@0.1.2-rc.1` 为 **format-v2 会话**(`SESSION_FORMAT_VERSION=0`;header 必填 `isSeeded:boolean`;无 `.events` 属性,改 `snapshotEvents()`/`ownEvents()`)→ dashr `url-schema/handlers/agent.ts` roster 的 `live.events` 属性读失效。修复:`live.snapshotEvents()`;测试 fixture 补 `isSeeded:false`(自包含 seed,非 fork)。见 diff。
29
+ 2. **pi-natives loader 锚点穿透**:`findPackageDir` 的 `createRequire.resolve` 快路径会经进程 globalPaths(含 pnpm `.pnpm/node_modules` hoist 根)从**任意锚点**命中已安装 addon,违反"锚点限定"契约(degradation 测试抓出)。修复:去掉 resolve 快路径,仅用自锚点向上的确定性 node_modules walk。见 diff。
30
+ 3. **escalation-guidance 附 A 定稿回填 canonical**(drift 修正):monorepo 副本已实装定稿(deniable/denied · per-call),canonical `src/index.ts` 仍旧句 → 回填;`presentation.spec.ts` 断言同步(定稿 token + 无 'retried once' 断言)。
31
+ 4. **附 C 矛盾子句结案(不暴露)**:render 证据(`renderReplBridgeInstructions` signature-only,description 散文不进模型可见面)→ 不做 dashr 侧订正;上游 schema 文本缺陷记上游面 Open item。S7 实证项(grep 装配产物 0 命中)未单独执行——本轮运行实例装配面即证(签名行、零散文)。
32
+
33
+ ## 环境注记 / Open items
34
+
35
+ - **peer 双副本分裂**:better-dsh 的 peer `@deepseek-ai/*` 经 pnpm autoInstallPeers 从 registry 装入 `.pnpm`(dsh-llm/dsh-session@0.1.2-rc.1),而部分依赖链解析到 workspace 副本 → **包级 `tsc -p tsconfig.json` 出现双身份类型分裂(69 错,dsh-llm branded 字段、SessionSeq 品牌)**;权威类型门 = 根 `tsc -b tsconfig.host.json`(`pnpm run build`,**全绿 0 错**)。vitest 全量(36 文件/481 用例)绿。非代码回归,记录待解(历史 dev-loop 在 alpha.5 未现,系本次 registry 解析到 rc.1/alpha.2 后拓扑变化)。
36
+ - **registry 发布物与 tag 疑点(上游面)**:npm `@deepseek-ai/dsh-session@0.1.2-rc.1` 实为 format-v2 API,而 git rc.1 tag(== alpha.5)按版本号-only 判定应无此改动 → 疑似 session 包独立发布线带 0.1.3-alpha 代码却标 rc.1。记录,prod 升级前需以 npm 发布物为准复验。
37
+ - 手测/用户项:老会话读兼容、fence env 探针(401/403)、zoomGuard/mobile CDP 双形态、file-tool 升级矩阵、prod 3080 复测(write 事件回归)。
38
+ - 版本:canonical `dashr/package.json` → **0.2.3**(本地 commit+tag `v0.2.3`;npm 发布按 AGENTS.md 红线另行)。
39
+
40
+ ## 产出
41
+
42
+ - S0 差异报告:`docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md`(2026-09-08 已落)
43
+ - 本报告 + OpenSpec change `2026-09-08-upstream-0-1-3-alpha-2-alignment/`(proposal/design/tasks/specs delta)
44
+ - overlay 归档:`.scratch/alpha5-dashr-local-overlay.patch` + 逐文件分片 `.scratch/overlay-triage/`
@@ -0,0 +1,110 @@
1
+ # 上游 dsh 0.1.2-alpha.5 / rc.1 → 0.1.3-alpha.2 差异调研报告
2
+
3
+ - 调研日期:2026-09-08(本机复核日;上游 rc.1 发布 2026-09-03、alpha.2 发布 2026-09-07T13:11Z)
4
+ - 方法:**clean source git diff,非 npm tarball**。本机 `upstream/deepseek-harness` checkout 拉取 `dsh-v0.1.2-rc.1` / `dsh-v0.1.3-alpha.1` / `dsh-v0.1.3-alpha.2` 三个 tag 后,以 tag 树间 diff + 仓内 `.agents/notes/implemented/` 设计笔记 + npm registry 事实三源互证。文件/行数口径:`dsh-v0.1.2-alpha.5` vs `dsh-v0.1.3-alpha.2`(rc.1 与 alpha.5 代码零差,等价);commit 数口径:`rc.1..alpha.2`(rc.1 是 alpha.2 的祖先,范围线性、无歧义)。
5
+ - 版本事实:
6
+ - **rc.1 = release-only**:`alpha.5..rc.1` 只有 2 个 commit——release commit `a66e470204`(`release(dsh): 0.1.2-rc.1`,2026-09-03)+ 1 个空 merge(`5a69ba1cdd` Merge PR #3445,把 alpha.5 发布分支并入主线);代码差**为零**(见专题一)。npm `latest`/`next` dist-tag 均指 `0.1.2-rc.1`——今天裸装 `@deepseek-ai/dsh` 拿到的就是 alpha.5 代码。
7
+ - **alpha.1 = 只 tag 未上 npm**:`dsh-v0.1.3-alpha.1` tag 存在(merge PR #3554,09-04),但 registry `versions` 里 **没有 0.1.3-alpha.1**,0.1.3 线从 alpha.2 起;`alpha` dist-tag = `0.1.3-alpha.2`。
8
+ - alpha.2 tag = merge PR #3685(worktree/release-dsh-0.1.3-alpha.2,09-07);rc.1 与 alpha.1 均为其祖先(rc.1..alpha.1 = 328,alpha.1..alpha.2 = 316)。
9
+
10
+ ---
11
+
12
+ ## 数字复核表(转述值 → 实测值)
13
+
14
+ 对来源总结逐项复核,两处需修正口径,其余全部精确命中:
15
+
16
+ | 来源总结 | 实测(本机复核) | 结论 |
17
+ |---|---|---|
18
+ | rc.1 落后 alpha.5 "1 commit" | `alpha.5..rc.1` = 2 commits(release `a66e470204` + 空 merge `5a69ba1cdd`) | 口径差异;结论不变——代码零差 |
19
+ | rc.1 vs alpha.5 "252 文件全 package.json 版本号" | 252 文件,**0 个非 package.json**,diff 行过滤 `"version"` 后**零残留** | ✅ 精确命中 |
20
+ | alpha.2 "417 commits" | `rc.1..alpha.2` 共 **644** commits = 227 merges + **417 非 merge**(first-parent 仅 76) | 417 = 非 merge 数;总数 644 |
21
+ | "~103k+/40k− across 4.8k files" | 4,866 files,**+103,306 / −39,537** | ✅ 命中 |
22
+ | "~59k+/19k− 真实代码(剔 notes/snapshots/docs)" | 仅剔这三前缀 = 1,974 files,**+84,482 / −27,248**——到不了 59k | ❌ **不可复现**(见下"剔除阶梯") |
23
+ | fix 178 / test 97 / docs 53 / ci 11 / perf 9 | 对 644 条 subject 前缀统计:fix **178** / test **97** / docs **53** / ci **11** / perf **9**(另有 refactor 27 / feat 21 / chore 13 / revert 2 / release 3 / merge+other 230) | ✅ 全命中 |
24
+ | rc.1 = latest/next;alpha = alpha.2 | `npm view dist-tags`:latest=0.1.2-rc.1, next=0.1.2-rc.1, alpha=0.1.3-alpha.2 | ✅ |
25
+ | alpha.1 从未上 npm | `npm view versions` 无 0.1.3-alpha.1 | ✅ |
26
+
27
+ **真实代码量的"剔除阶梯"(都可精确复现)**:ALL 4,866 files +103,306/−39,537 → 剔 `.agents/notes/`+`snapshots/`+`docs/` 1,974 files +84,482/−27,248 → 再剔 `pnpm-lock.yaml` 1,973 files +83,369/−27,204 → 再剔各包 `tests/`·`test/`·`__snapshots__` 1,366 files +38,948/−11,653。来源总结的 ~59k+/19k− 落在前两档之间,对应的剔除集本机未能还原(可能含更大的生成语料剔除),**引用时以阶梯为准,勿再用 59k 口径**。
28
+
29
+ 主题占比(包组级,alpha.5..alpha.2,实测):`session*`(session 组全部 8 包)211 files **+25,333/−10,849**;`client*` 358 files +10,871/−2,691;`apps/web` 95 files +2,423/−641;`subagent` 75 files +3,144/−1,955;`api` 64 files +3,695/−985;`core` 71 files +2,919/−1,861;`llm` 68 files +3,011/−493。与来源"dominant areas = client/session/subagent/core/llm/api/apps/web"一致,session 显著居首。
30
+
31
+ ---
32
+
33
+ ## 专题一:rc.1 是一个纯发布 commit——bump 过去只买一个标签
34
+
35
+ `git diff dsh-v0.1.2-alpha.5 dsh-v0.1.2-rc.1`:252 个变更文件全部是各包 `package.json`,且 diff 内容除 `"version"` 字段外零残留(无 lockfile、无源码、无配置)。rc.1 相对 alpha.5 **功能字节级一致**。
36
+
37
+ 含义:**以 rc.1 为目标 = 白动**(只换 dist-tag 外观)。真正的代码分水岭在 `dsh-v0.1.3-alpha.2`。若只想要"稳定标签",rc.1 与 alpha.5 无差别;若需要 0.1.3 线的修复,只能走 alpha 通道(alpha.2 起)。
38
+
39
+ ---
40
+
41
+ ## 专题二:session format v2 + 内嵌 assistant 流(落盘/回放契约变更)
42
+
43
+ **三个 breaking commit 全部落在 omp-web 桥接的会话持久化/回放接缝上**(均实测在 `rc.1..alpha.2` 范围内):
44
+
45
+ | commit | subject(实测原文) | 性质 |
46
+ |---|---|---|
47
+ | `f99b06eaed` (09-01) | `feat(session)!: embed assistant streams in format v2` | 断(格式面) |
48
+ | `d1521ea783` (08-31) | `feat(session)!: add released format migration` | 断(迁移面) |
49
+ | `bec6805d6a` (08-28) | `refactor(session-persistence)!: handle-based seam with a lifecycle-owned write path` | 断(写路径面) |
50
+ | `c58097a826` (08-31) | `feat(session-persistence-jsonl): cross-process write-ownership lease` | 紧邻(lease 即 `session-persistence-omp.ts` 直接对话对象) |
51
+
52
+ 配套证据(tag 树内设计笔记,路径均已核实):
53
+ - `implemented/architecture/2026-09-01-v2-embedded-assistant-streams.md`(v2 内嵌流设计)
54
+ - `implemented/architecture/2026-09-05-read-only-session-migration-preparation.md` + `2026-09-06-embedded-stream-record-readers.md`(回放侧按 compact record 读内嵌流)
55
+ - `implemented/feature/2026-08-31-cross-process-session-write-lease.md`、`implemented/simplification/2026-08-30-jsonl-only-session-persistence.md`(jsonl-only 收敛 + 跨进程写权)
56
+ - 新包齐备:`packages/session/` 下新增 `session-format`、`session-format-catalog`、`session-format-v0-to-v1`、`session-format-v1-to-v2`(src:codec/dispositions/migration/validation)、`session-log-deepseek`、`session-checkpoint-policy`;`session-persistence-jsonl/src` 现含 `lease.ts`/`migration-verifier.ts`/`format.ts`/`generation.ts`/`storage.ts`/`worker.ts`。迁移测试语料是全 diff 最大单体(`v1-to-v2/tests/migration.spec.ts` +1,251)。
57
+
58
+ 流/回放修复链(同簇,非断):`30e045dfad` `feat(agent): emit live assistant stream frames`;`165cc31eb8` `perf(llm,host): read embedded Assistant streams per compact record`;`7bab91d247` `fix(llm): retain Anthropic resolved model during replay`。
59
+
60
+ ---
61
+
62
+ ## 专题三:persistence 重构主题(读/写/迁移的 perf 潮)
63
+
64
+ 除专题二四枚外,`session-persistence*` 在本范围有一整条 perf 链:prepared reads before publication、streamed migration publication/verification、restore 冻结读(来源总结定性);`2026-09-04-session-open-performance-gate` 测试笔记佐证"打开会话性能门槛"成为一等关注。对桥接方的含义集中在专题二列出的断点 + lease——即"谁持有某 jsonl 写权、生命周期何时移交、跨进程并发写如何排他",这正是第三方持久化实现需要对齐的契约。
65
+
66
+ ---
67
+
68
+ ## 专题四:其余主题簇(非断,但升级需知)
69
+
70
+ | 簇 | 证据(实测 subject,均 in-range) | 备注 |
71
+ |---|---|---|
72
+ | **str_replace_editor 默认下架** | `36a4665144` `feat(base): remove str_replace_editor from default tools`;`965adbb5cf` `feat(sdk): disable str_replace_editor by default` | 笔记 `2026-09-05-base-default-file-editor`;升级后默认工具面少一个 editor |
73
+ | **outbound 全走 proxy** | `545e2ad914` `feat(net): route every outbound request through the configured proxy` | 未配 proxy 时无行为变化 |
74
+ | **read_image 图片卡** | `56ca8af0ee` / `a4d4404708`(ui-tool 渲染嵌套/直接 read_image 结果为图) | 前端渲染面 |
75
+ | **通用文件存储 + 提交生命周期流式** | `bafa6ae11d` `feat(conversation): stream files through submission lifecycle` | 附件面 |
76
+ | **agent/UX** | `48cc1cf1d6` `feat(agent): announce model switches`;`96ead6091d` `feat(subagent): align human inbox controls`;`040d73871b` `feat(agent-team): unify messages on steer` | |
77
+ | **message-edit:landed 又 revert** | `ef88756f13`(09-02)`feat(session, agent, web): support same-session message editing` → `e974a655a0`(09-02)`Revert "…"` | 同日往返;**别按该 feat 写适配** |
78
+ | **telemetry/feedback:default-on 又回滚** | `02a029e679` feedback 记录进 session log、`9ffe85a512` OTel 默认全量上传统计 → `13daefe073` `revert(session-telemetry-otel): leave telemetry on its own transport` | 笔记 `2026-09-05-canonical-feedback-log` / `nonofficial-feedback-otel`;prod 跑 `DSH_TELEMETRY_DISABLED=1`,升级时查 session log 是否开始夹带 feedback 记录 |
79
+ | 其余重churn | fix 178 / test 97 / docs 53 / ci 11 / perf 9;web-heavy(sending states、skill chips、terminal cards、session reveal) | 体积主导:`.agents/notes`(含 notes i18n.yaml 迁移与 archived manifest.json 重组,~2.4k files)+ session/client 组 |
80
+
81
+ ---
82
+
83
+ ## 对本线(omp-web 桥 + dashr 测试线)的含义
84
+
85
+ 1. **对 omp-web 不是 drop-in bump**。format v2(`f99b06eaed`)+ released migration(`d1521ea783`)+ handle-based seam(`bec6805d6a`)+ 写权 lease(`c58097a826`)恰好是 `session-persistence-omp.ts` / `replay.ts` 桥接的契约面。升级 = 一次 upstream-alignment 适配轮:diff 载体 → 新格式读写 + lease 语义对齐 → 迁移读兼容验证 → 冒烟,按所在仓的 AGENTS.md 节奏(dashr 侧即 S1–S7)。
86
+ 2. **别追 alpha.1**:npm 无该版本,registry 线从 alpha.2 起;本地 tag 在库即可,发布侧不存在。
87
+ 3. **dashr 自己的 4999 测试线(现 alpha.5)将来对齐 alpha.2 时的 S7 盯点**(本轮不执行):默认工具面少 `str_replace_editor`(工具清单对比);session 落盘格式迁移(老 session 读兼容靠上游 released migration,验收一条老会话打开);`__DSH_TRANSPORT__`/`connection` 行/`AppFrame` 语义属性的行形状是否被 web-heavy churn 漂移(upstream-alignment.md S7.5 三处 + S7.8 两处查表在切换轮现查);telemetry 默认面变化对 `DSH_TELEMETRY_DISABLED=1` 立场的验证。
88
+ 4. **数字口径提醒**:引用本报告数字时用复核表/剔除阶梯的实测值;"417 commits""~59k real code"两个转述口径已修正。
89
+
90
+ ---
91
+
92
+ ## 参考索引
93
+
94
+ | 主题 | 证据 |
95
+ |---|---|
96
+ | rc.1 release-only | commit `a66e470204`;`git diff alpha.5 rc.1` = 252 package.json,版本号-only |
97
+ | format v2 / 内嵌流 | commit `f99b06eaed`;笔记 `implemented/architecture/2026-09-01-v2-embedded-assistant-streams.md` |
98
+ | released 迁移 | commit `d1521ea783`;包 `packages/session/session-format-v1-to-v2/`(codec/migration/validation) |
99
+ | handle seam | commit `bec6805d6a`;`session-persistence-jsonl/src/{lease,storage,worker,migration-verifier}.ts` |
100
+ | 写权 lease | commit `c58097a826`;笔记 `implemented/feature/2026-08-31-cross-process-session-write-lease.md` |
101
+ | jsonl-only 收敛 | 笔记 `implemented/simplification/2026-08-30-jsonl-only-session-persistence.md` |
102
+ | 回放读内嵌流 | commit `165cc31eb8`;笔记 `implemented/architecture/2026-09-06-embedded-stream-record-readers.md` |
103
+ | 迁移只读准备 | 笔记 `implemented/architecture/2026-09-05-read-only-session-migration-preparation.md` |
104
+ | message-edit 往返 | commit `ef88756f13` / revert `e974a655a0`(均 09-02) |
105
+ | telemetry 往返 | commit `02a029e679`/`9ffe85a512` → revert `13daefe073`;笔记 `…/2026-09-05-{canonical-feedback-log,nonofficial-feedback-otel}.md` |
106
+ | editor 下架 | commit `36a4665144` + `965adbb5cf`;笔记 `simplification/2026-09-05-base-default-file-editor.md` |
107
+ | proxy 全覆盖 | commit `545e2ad914` |
108
+ | 图片卡 / 文件流 | commit `56ca8af0ee`/`a4d4404708`/`bafa6ae11d` |
109
+ | agent/UX | commit `48cc1cf1d6`/`96ead6091d`/`040d73871b` |
110
+ | 体积与类型 | 复核表 + 剔除阶梯;session 组 +25,333/−10,849 居首 |