dsh-openwrite 0.2.8

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 (275) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +107 -0
  3. package/THIRD_PARTY_NOTICES.md +33 -0
  4. package/assets/logo-dark.svg +31 -0
  5. package/assets/logo-light.svg +31 -0
  6. package/cordis.patch.yml +11 -0
  7. package/docs/BENCHMARK_TASKS.md +54 -0
  8. package/docs/COST_MEASUREMENT.md +39 -0
  9. package/docs/DEVELOPMENT.md +65 -0
  10. package/docs/DSH_STORE.md +58 -0
  11. package/docs/FRAMEWORK_ADVANTAGES.md +288 -0
  12. package/docs/IMPROVEMENT_PLAN.md +252 -0
  13. package/docs/INSTALL.md +99 -0
  14. package/docs/LEARNING.md +68 -0
  15. package/docs/OPEN_SOURCE_NOVEL_AUDIT.md +191 -0
  16. package/docs/PLUGIN_MAINTENANCE.md +54 -0
  17. package/docs/PLUGIN_MAINTENANCE_RC7.md +157 -0
  18. package/docs/QA_20260908.md +103 -0
  19. package/docs/QA_20260909_BENCHMARK.md +24 -0
  20. package/docs/RELEASE_ACCEPTANCE.md +116 -0
  21. package/docs/REVIEW_DAG_FRAMEWORK.md +82 -0
  22. package/docs/TARGETED_NOVEL_PROJECT_REVIEW.md +167 -0
  23. package/docs/WORKFLOWS.md +74 -0
  24. package/docs/WORKSPACE_CONTEXT_CONTRACT.md +125 -0
  25. package/docs/WORKSPACE_INTEGRATION_GOAL.md +278 -0
  26. package/docs/research/autosave-race-repro.mjs +133 -0
  27. package/docs/research/framework-stats-2026-09-05.json +116 -0
  28. package/dog-tools.mjs +11 -0
  29. package/package.json +132 -0
  30. package/packages/openwrite-bridge/LICENSE +201 -0
  31. package/packages/openwrite-bridge/cordis.patch.yml +10 -0
  32. package/packages/openwrite-bridge/lib/client.d.ts +95 -0
  33. package/packages/openwrite-bridge/lib/client.js +193 -0
  34. package/packages/openwrite-bridge/lib/contracts-generated.d.ts +367 -0
  35. package/packages/openwrite-bridge/lib/contracts-generated.js +1764 -0
  36. package/packages/openwrite-bridge/lib/dog-delivery.d.ts +12 -0
  37. package/packages/openwrite-bridge/lib/dog-delivery.js +362 -0
  38. package/packages/openwrite-bridge/lib/dog-review.d.ts +50 -0
  39. package/packages/openwrite-bridge/lib/dog-review.js +470 -0
  40. package/packages/openwrite-bridge/lib/domain.d.ts +70 -0
  41. package/packages/openwrite-bridge/lib/domain.js +496 -0
  42. package/packages/openwrite-bridge/lib/index.d.ts +17 -0
  43. package/packages/openwrite-bridge/lib/index.js +89 -0
  44. package/packages/openwrite-bridge/lib/managed-runtime.d.ts +95 -0
  45. package/packages/openwrite-bridge/lib/managed-runtime.js +510 -0
  46. package/packages/openwrite-bridge/lib/preset-tools.d.ts +13 -0
  47. package/packages/openwrite-bridge/lib/preset-tools.js +18 -0
  48. package/packages/openwrite-bridge/lib/tool-policy.d.ts +6 -0
  49. package/packages/openwrite-bridge/lib/tool-policy.js +56 -0
  50. package/packages/openwrite-bridge/lib/tools.d.ts +24 -0
  51. package/packages/openwrite-bridge/lib/tools.js +2404 -0
  52. package/packages/openwrite-bridge/package.json +67 -0
  53. package/packages/studio-panel/LICENSE +21 -0
  54. package/packages/studio-panel/README.md +51 -0
  55. package/packages/studio-panel/cordis.patch.yml +5 -0
  56. package/packages/studio-panel/lib/client.js +158087 -0
  57. package/packages/studio-panel/lib/client.js.map +1 -0
  58. package/packages/studio-panel/lib/index.js +50 -0
  59. package/packages/studio-panel/lib/types/client/AssetEditor.d.ts +122 -0
  60. package/packages/studio-panel/lib/types/client/AssetsView.d.ts +43 -0
  61. package/packages/studio-panel/lib/types/client/BenchmarkView.d.ts +9 -0
  62. package/packages/studio-panel/lib/types/client/ContinuousReader.d.ts +13 -0
  63. package/packages/studio-panel/lib/types/client/CreationView.d.ts +6 -0
  64. package/packages/studio-panel/lib/types/client/DagCanvas.d.ts +11 -0
  65. package/packages/studio-panel/lib/types/client/DiscardDraftDialog.d.ts +8 -0
  66. package/packages/studio-panel/lib/types/client/DomainToolCard.d.ts +9 -0
  67. package/packages/studio-panel/lib/types/client/GraphView.d.ts +46 -0
  68. package/packages/studio-panel/lib/types/client/HeaderChrome.d.ts +18 -0
  69. package/packages/studio-panel/lib/types/client/LaunchOpenWrite.d.ts +13 -0
  70. package/packages/studio-panel/lib/types/client/LibraryView.d.ts +6 -0
  71. package/packages/studio-panel/lib/types/client/MarkdownText.d.ts +3 -0
  72. package/packages/studio-panel/lib/types/client/ModelView.d.ts +9 -0
  73. package/packages/studio-panel/lib/types/client/OperationsView.d.ts +6 -0
  74. package/packages/studio-panel/lib/types/client/OutlinePlans.d.ts +37 -0
  75. package/packages/studio-panel/lib/types/client/OutlineView.d.ts +29 -0
  76. package/packages/studio-panel/lib/types/client/ResearchView.d.ts +7 -0
  77. package/packages/studio-panel/lib/types/client/ReviewCard.d.ts +28 -0
  78. package/packages/studio-panel/lib/types/client/SceneWorkbench.d.ts +55 -0
  79. package/packages/studio-panel/lib/types/client/SearchView.d.ts +33 -0
  80. package/packages/studio-panel/lib/types/client/TasksView.d.ts +11 -0
  81. package/packages/studio-panel/lib/types/client/TransferWorkspaces.d.ts +19 -0
  82. package/packages/studio-panel/lib/types/client/TurnMutationSummary.d.ts +62 -0
  83. package/packages/studio-panel/lib/types/client/VditorBody.d.ts +55 -0
  84. package/packages/studio-panel/lib/types/client/WorkbenchStore.d.ts +121 -0
  85. package/packages/studio-panel/lib/types/client/api.d.ts +72 -0
  86. package/packages/studio-panel/lib/types/client/asset-drafts.d.ts +20 -0
  87. package/packages/studio-panel/lib/types/client/benchmark-options.d.ts +43 -0
  88. package/packages/studio-panel/lib/types/client/draft-store.d.ts +26 -0
  89. package/packages/studio-panel/lib/types/client/dto.d.ts +517 -0
  90. package/packages/studio-panel/lib/types/client/index.d.ts +4 -0
  91. package/packages/studio-panel/lib/types/client/locales.d.ts +15 -0
  92. package/packages/studio-panel/lib/types/client/manuscript-annotations.d.ts +59 -0
  93. package/packages/studio-panel/lib/types/client/manuscript-markers.d.ts +61 -0
  94. package/packages/studio-panel/lib/types/client/manuscript-mentions.d.ts +30 -0
  95. package/packages/studio-panel/lib/types/client/manuscript-overlay-dom.d.ts +7 -0
  96. package/packages/studio-panel/lib/types/client/manuscript-overlay.d.ts +42 -0
  97. package/packages/studio-panel/lib/types/client/manuscript-selection.d.ts +59 -0
  98. package/packages/studio-panel/lib/types/client/model-view-memory.d.ts +17 -0
  99. package/packages/studio-panel/lib/types/client/storage.d.ts +8 -0
  100. package/packages/studio-panel/lib/types/client/workbench-epochs.d.ts +16 -0
  101. package/packages/studio-panel/lib/types/client/workspace-context.d.ts +52 -0
  102. package/packages/studio-panel/lib/types/client/writing-scope.d.ts +7 -0
  103. package/packages/studio-panel/lib/types/index.d.ts +5 -0
  104. package/packages/studio-panel/package.json +105 -0
  105. package/packages/studio-panel/vendor/vditor/LICENSE +21 -0
  106. package/packages/studio-panel/vendor/vditor/dist/css/content-theme/dark.css +123 -0
  107. package/packages/studio-panel/vendor/vditor/dist/css/content-theme/light.css +101 -0
  108. package/packages/studio-panel/vendor/vditor/dist/index.css +1823 -0
  109. package/packages/studio-panel/vendor/vditor/dist/index.min.js +1 -0
  110. package/packages/studio-panel/vendor/vditor/dist/js/i18n/zh_CN.js +86 -0
  111. package/packages/studio-panel/vendor/vditor/dist/js/icons/ant.js +174 -0
  112. package/packages/studio-panel/vendor/vditor/dist/js/lute/lute.min.js +72 -0
  113. package/plugin.d.ts +3 -0
  114. package/plugin.mjs +80 -0
  115. package/presets/README.md +32 -0
  116. package/presets/openwrite/agent.cordis.yml +317 -0
  117. package/presets/openwrite/preset.yml +3 -0
  118. package/presets/openwrite/skills/canon/SKILL.md +15 -0
  119. package/presets/openwrite/skills/dialoguequality/SKILL.md +166 -0
  120. package/presets/openwrite/skills/dog-delivery-query/SKILL.md +40 -0
  121. package/presets/openwrite/skills/dog-import-query/SKILL.md +27 -0
  122. package/presets/openwrite/skills/dog-review-query/SKILL.md +40 -0
  123. package/presets/openwrite/skills/export-book/SKILL.md +14 -0
  124. package/presets/openwrite/skills/foreshadow/SKILL.md +14 -0
  125. package/presets/openwrite/skills/foreshadowing-system/SKILL.md +125 -0
  126. package/presets/openwrite/skills/learn/SKILL.md +24 -0
  127. package/presets/openwrite/skills/novel-creator/SKILL.md +88 -0
  128. package/presets/openwrite/skills/novel-creator/templates/beat_templates.yaml +179 -0
  129. package/presets/openwrite/skills/novel-creator/templates/example_usage.yaml +74 -0
  130. package/presets/openwrite/skills/novel-reviewer/SKILL.md +85 -0
  131. package/presets/openwrite/skills/oh-story-deslop/LICENSE +21 -0
  132. package/presets/openwrite/skills/oh-story-deslop/SKILL.md +36 -0
  133. package/presets/openwrite/skills/oh-story-deslop/agents/openai.yaml +4 -0
  134. package/presets/openwrite/skills/oh-story-deslop/references/method.md +22 -0
  135. package/presets/openwrite/skills/oh-story-long-analyze/LICENSE +21 -0
  136. package/presets/openwrite/skills/oh-story-long-analyze/SKILL.md +37 -0
  137. package/presets/openwrite/skills/oh-story-long-analyze/agents/openai.yaml +4 -0
  138. package/presets/openwrite/skills/oh-story-long-analyze/references/method.md +22 -0
  139. package/presets/openwrite/skills/oh-story-long-scan/LICENSE +21 -0
  140. package/presets/openwrite/skills/oh-story-long-scan/SKILL.md +36 -0
  141. package/presets/openwrite/skills/oh-story-long-scan/agents/openai.yaml +4 -0
  142. package/presets/openwrite/skills/oh-story-long-scan/references/method.md +21 -0
  143. package/presets/openwrite/skills/oh-story-long-write/LICENSE +21 -0
  144. package/presets/openwrite/skills/oh-story-long-write/SKILL.md +37 -0
  145. package/presets/openwrite/skills/oh-story-long-write/agents/openai.yaml +4 -0
  146. package/presets/openwrite/skills/oh-story-long-write/references/method.md +33 -0
  147. package/presets/openwrite/skills/oh-story-review/LICENSE +21 -0
  148. package/presets/openwrite/skills/oh-story-review/SKILL.md +36 -0
  149. package/presets/openwrite/skills/oh-story-review/agents/openai.yaml +4 -0
  150. package/presets/openwrite/skills/oh-story-review/references/method.md +25 -0
  151. package/presets/openwrite/skills/progress/SKILL.md +16 -0
  152. package/presets/openwrite/skills/review-chapter/SKILL.md +17 -0
  153. package/presets/openwrite/skills/revise-span/SKILL.md +16 -0
  154. package/presets/openwrite/skills/style-system/SKILL.md +135 -0
  155. package/presets/openwrite/skills/style-system/prompts/analyze_style.md +214 -0
  156. package/presets/openwrite/skills/style-system/prompts/batch_extract_style.md +66 -0
  157. package/presets/openwrite/skills/style-system/prompts/compose_style.md +83 -0
  158. package/presets/openwrite/skills/style-system/prompts/extract_style.md +84 -0
  159. package/presets/openwrite/skills/style-system/prompts/initialize_style.md +52 -0
  160. package/presets/openwrite/skills/style-system/templates/analysis_report.yaml +78 -0
  161. package/presets/openwrite/skills/style-system/templates/composed_style.md +96 -0
  162. package/presets/openwrite/skills/style-system/templates/extraction_report.yaml +80 -0
  163. package/presets/openwrite/skills/style-system/templates/fingerprint.yaml +61 -0
  164. package/presets/openwrite/skills/style-system/tools/README.md +33 -0
  165. package/presets/openwrite/skills/truth-validation/SKILL.md +119 -0
  166. package/presets/openwrite/skills/workflow-manager/SKILL.md +81 -0
  167. package/presets/openwrite/skills/world-query/SKILL.md +45 -0
  168. package/presets/openwrite/skills/write-next/SKILL.md +17 -0
  169. package/release/core-requirements.in +12 -0
  170. package/release/licenses/@deepseek-ai__cosmokit@1.8.3/LICENSE +21 -0
  171. package/release/licenses/@deepseek-ai__schemastery@3.18.2/LICENSE +21 -0
  172. package/release/licenses/@isaacs__fs-minipass@4.0.1/LICENSE +15 -0
  173. package/release/licenses/@standard-schema__spec@1.1.0/LICENSE +21 -0
  174. package/release/licenses/@types__d3-color@3.1.3/LICENSE +21 -0
  175. package/release/licenses/@types__d3-drag@3.0.7/LICENSE +21 -0
  176. package/release/licenses/@types__d3-interpolate@3.0.4/LICENSE +21 -0
  177. package/release/licenses/@types__d3-selection@3.0.11/LICENSE +21 -0
  178. package/release/licenses/@types__d3-transition@3.0.9/LICENSE +21 -0
  179. package/release/licenses/@types__d3-zoom@3.0.8/LICENSE +21 -0
  180. package/release/licenses/@xyflow__react@12.11.6/LICENSE +21 -0
  181. package/release/licenses/@xyflow__system@0.0.82/LICENSE +21 -0
  182. package/release/licenses/ajv-formats@3.0.1/LICENSE +21 -0
  183. package/release/licenses/ajv@8.20.0/LICENSE +22 -0
  184. package/release/licenses/chownr@3.0.0/LICENSE.md +63 -0
  185. package/release/licenses/classcat@5.0.5/LICENSE.md +7 -0
  186. package/release/licenses/commander@7.2.0/LICENSE +22 -0
  187. package/release/licenses/d3-array@3.2.4/LICENSE +13 -0
  188. package/release/licenses/d3-axis@3.0.0/LICENSE +13 -0
  189. package/release/licenses/d3-brush@3.0.0/LICENSE +13 -0
  190. package/release/licenses/d3-chord@3.0.1/LICENSE +13 -0
  191. package/release/licenses/d3-color@3.1.0/LICENSE +13 -0
  192. package/release/licenses/d3-contour@4.0.2/LICENSE +13 -0
  193. package/release/licenses/d3-delaunay@6.0.4/LICENSE +14 -0
  194. package/release/licenses/d3-dispatch@3.0.1/LICENSE +13 -0
  195. package/release/licenses/d3-drag@3.0.0/LICENSE +13 -0
  196. package/release/licenses/d3-dsv@3.0.1/LICENSE +13 -0
  197. package/release/licenses/d3-ease@3.0.1/LICENSE +28 -0
  198. package/release/licenses/d3-fetch@3.0.1/LICENSE +13 -0
  199. package/release/licenses/d3-force@3.0.0/LICENSE +13 -0
  200. package/release/licenses/d3-format@3.1.2/LICENSE +13 -0
  201. package/release/licenses/d3-geo@3.1.1/LICENSE +34 -0
  202. package/release/licenses/d3-hierarchy@3.1.2/LICENSE +13 -0
  203. package/release/licenses/d3-interpolate@3.0.1/LICENSE +13 -0
  204. package/release/licenses/d3-path@3.1.0/LICENSE +13 -0
  205. package/release/licenses/d3-polygon@3.0.1/LICENSE +13 -0
  206. package/release/licenses/d3-quadtree@3.0.1/LICENSE +13 -0
  207. package/release/licenses/d3-random@3.0.1/LICENSE +13 -0
  208. package/release/licenses/d3-scale-chromatic@3.1.0/LICENSE +28 -0
  209. package/release/licenses/d3-scale@4.0.2/LICENSE +13 -0
  210. package/release/licenses/d3-selection@3.0.0/LICENSE +13 -0
  211. package/release/licenses/d3-shape@3.2.0/LICENSE +13 -0
  212. package/release/licenses/d3-time-format@4.1.0/LICENSE +13 -0
  213. package/release/licenses/d3-time@3.1.0/LICENSE +13 -0
  214. package/release/licenses/d3-timer@3.0.1/LICENSE +13 -0
  215. package/release/licenses/d3-transition@3.0.1/LICENSE +13 -0
  216. package/release/licenses/d3-zoom@3.0.0/LICENSE +13 -0
  217. package/release/licenses/d3@7.9.0/LICENSE +13 -0
  218. package/release/licenses/delaunator@5.1.0/LICENSE +15 -0
  219. package/release/licenses/elkjs@0.12.0/LICENSE.md +263 -0
  220. package/release/licenses/fast-deep-equal@3.1.3/LICENSE +21 -0
  221. package/release/licenses/fast-uri@3.1.7/LICENSE +30 -0
  222. package/release/licenses/fflate@0.8.2/LICENSE +21 -0
  223. package/release/licenses/graceful-fs@4.2.11/LICENSE +15 -0
  224. package/release/licenses/iconv-lite@0.6.3/LICENSE +21 -0
  225. package/release/licenses/internmap@2.0.3/LICENSE +13 -0
  226. package/release/licenses/json-schema-traverse@1.0.0/LICENSE +21 -0
  227. package/release/licenses/lucide-react@0.468.0/LICENSE +15 -0
  228. package/release/licenses/minipass@7.1.3/LICENSE.md +55 -0
  229. package/release/licenses/minizlib@3.1.0/LICENSE +26 -0
  230. package/release/licenses/proper-lockfile@4.1.2/LICENSE +21 -0
  231. package/release/licenses/require-from-string@2.0.2/license +21 -0
  232. package/release/licenses/retry@0.12.0/License +21 -0
  233. package/release/licenses/robust-predicates@3.0.3/LICENSE +24 -0
  234. package/release/licenses/rw@1.3.3/LICENSE +26 -0
  235. package/release/licenses/safer-buffer@2.1.2/LICENSE +21 -0
  236. package/release/licenses/signal-exit@3.0.7/LICENSE.txt +16 -0
  237. package/release/licenses/tar@7.5.7/LICENSE.md +55 -0
  238. package/release/licenses/use-sync-external-store@1.6.0/LICENSE +21 -0
  239. package/release/licenses/yallist@5.0.0/LICENSE.md +63 -0
  240. package/release/licenses/zustand@4.5.7/LICENSE +21 -0
  241. package/release/openwrite-5.8.1-py3-none-any.whl +0 -0
  242. package/release/platform-overrides.in +5 -0
  243. package/release/python-constraints.in +96 -0
  244. package/release/requirements.lock +2927 -0
  245. package/release/runtime-manifest.json +98 -0
  246. package/release/sdk-compatibility.json +240 -0
  247. package/release/source.json +859 -0
  248. package/release/wheels/cryptography-50.0.1-cp312-abi3-macosx_13_0_x86_64.whl +0 -0
  249. package/release/wheels/licenses/LICENSE.txt +177 -0
  250. package/release/wheels/provenance.json +15 -0
  251. package/scripts/dog/delivery-stage.js +32 -0
  252. package/scripts/dog/import-chapter.js +20 -0
  253. package/scripts/dog/import-record.js +35 -0
  254. package/scripts/dog/review-dimension.js +41 -0
  255. package/scripts/dog/review-record.js +42 -0
  256. package/scripts/maintenance.mjs +179 -0
  257. package/scripts/prepare.mjs +21 -0
  258. package/vendor/dsh-dog/LICENSE +29 -0
  259. package/vendor/dsh-dog/README.md +114 -0
  260. package/vendor/dsh-dog/UPSTREAM.md +22 -0
  261. package/vendor/dsh-dog/cordis.patch.yml +14 -0
  262. package/vendor/dsh-dog/lib/client.js +2898 -0
  263. package/vendor/dsh-dog/lib/client.js.map +1 -0
  264. package/vendor/dsh-dog/lib/core-BiEBMLz3.d.ts +495 -0
  265. package/vendor/dsh-dog/lib/core-DdfMcrB4.js +2074 -0
  266. package/vendor/dsh-dog/lib/core.d.ts +2 -0
  267. package/vendor/dsh-dog/lib/core.js +2 -0
  268. package/vendor/dsh-dog/lib/index.d.ts +133 -0
  269. package/vendor/dsh-dog/lib/index.js +967 -0
  270. package/vendor/dsh-dog/package.json +97 -0
  271. package/vendor/dsh-dog/schemas/schema-0.2/graph.schema.json +139 -0
  272. package/vendor/dsh-dog/schemas/schema-0.2/report.schema.json +87 -0
  273. package/vendor/dsh-dog/schemas/schema-0.2/run.schema.json +259 -0
  274. package/vendor/dsh-dog/schemas/schema-0.2/runtime-event.schema.json +105 -0
  275. package/vendor/dsh-dog/schemas/schema-0.2/verification.schema.json +40 -0
@@ -0,0 +1,103 @@
1
+ # 2026-09-08 工作台验证记录
2
+
3
+ 本轮检查针对前端一致性、操作可用性和数据隔离。常规自动化使用离线测试数据与专用 QA 作品;真实链路前置通过已配置的 Flash 抽取了三章事实,后续真实框架小测仅在该作品运行,没有修改用户的真实小说。
4
+
5
+ ## 可复现命令
6
+
7
+ ```bash
8
+ npm run check
9
+ npm run test:dog
10
+ ../OpenWrite/.venv/bin/python -m pytest conductor/test_pipeline_contract.py -q
11
+ npm --prefix packages/studio-panel run test:components -- scripts/components/transfer-workspaces.test.tsx
12
+ OPENWRITE_PROJECT=/private/tmp/dsh-novel-qa-20260908 npm run test:e2e
13
+ ```
14
+
15
+ E2E 依赖本地 dsh web `127.0.0.1:3080` 和 OpenWrite Studio `127.0.0.1:4567`。请先完成构建,再运行 E2E;面板构建会短暂删除 `lib`,与浏览器加载重叠时会出现插件 bundle 无法加载。
16
+
17
+ `OPENWRITE_PROJECT` 必须匹配 Workspace 注册表中的规范路径。在 macOS 上,`/tmp` 会解析为 `/private/tmp`。测试遇到服务或作品缺失时会跳过;跳过不算运行时通过。
18
+
19
+ ## 隔离作品
20
+
21
+ - 目录:`/private/tmp/dsh-novel-qa-20260908`
22
+ - Workspace:`26adc6a8-743c-4b26-b4ea-990a8e9ebad9`
23
+ - Workspace 标题:`dsh-novel-qa-20260908`
24
+ - 已开始的合成会话:`session-5be94ad1-3934-481f-9a23-ae8a110d3c4e`
25
+ - 小说 ID:`qa_harbor`,标题:`QA 测试作品 · 雨港来信`
26
+ - 文件根:`data/novels/qa_harbor`,包含三章正文、对应大纲、两个人物和一个世界资产。
27
+ - 模型测试结果:`bench_qa_20260908`;研究报告:`qa_rain_harbor`。两者明确标记为合成测试数据,来源链接为测试占位,分数和用量不能用于评价真实模型。
28
+ - 临时上下文记录:`/tmp/dsh-novel-qa-20260908-context.json`
29
+
30
+ 为后续有界真实链路测试另补了 `ch_004 · 潮汐留下的地址` 的 300 字章纲,状态为 `planned`,准备阶段没有创建正文。作者意图、创作焦点、背景和基础规则已补齐,`validate_chapter_writable` 返回 `ok=true`。框架测试的前后端均允许 200–12000 字;一个写作 profile、一个评审 profile、重复次数 1 对应一个候选和一个评审单元,完整框架内部可能包含多次模型调用。准备工作只读取配置是否就绪,不启动模型任务。
31
+
32
+ 作品通过 Workspace 绑定的 Studio API 初始化和写入。合成会话使用 DSH 自带的 `SessionStore` 与 `JsonlSessionPersistence` 写入 `turn/start`、一条测试消息和 `turn/end`,随后由 `session.create` 按指定 ID 加载;未执行 agent turn 或模型请求。
33
+
34
+ ### 真实链路前置:正文事实接纳
35
+
36
+ 第一次从界面提交的框架小测 `bench_20260908152827_e9ee0a3c12` 在候选生成前返回 `MANUSCRIPT_FACTS_PENDING`,没有进入模型调用或评审。原因是 API 手工保存的前三章只创建了待接纳操作,尚无事实抽取产物。`validate_chapter_writable` 只验证作者材料与章纲,不能替代正文事实门禁。
37
+
38
+ 通过 `ManuscriptAcceptanceService.start_acceptance` 从 `ch_001` 正常重新捕获全部三章(来源 `manual`,携带原 pending revision),再调用 `/manuscript/acceptance/reconcile`。操作 `accept_20260908153222_213364f25b1d`、任务 `tsk_20260908153229_16e710162b` 已完成三章模型事实抽取以及重建和传播;没有清除接纳状态或伪造事实。核对大纲与正文一致、伏笔 DAG 无既有条目后,通过 `/manuscript/acceptance/ack` 确认这两个影响域。
39
+
40
+ 校验结果:三章均为 `current`,每章的 current、accepted、facts revision 完全一致;`require_current("ch_004")` 和写作就绪检查均通过。第四章上下文 revision 为 `915a1e75924257da`,缺失项为空、保护资料未改动,运行状态中包含前三章增量。第四章正文仍不存在。
41
+
42
+ 手工保存后待接纳属于现有流程,不应隐式把每次自动保存变成模型调用。此次暴露的产品缺口是框架小测未在排队前显示事实接纳门禁,以及在完全没有事实基线时连续新增多章会产生分散操作,而重建要求全书事实。初始化或导入应汇总接纳操作,避免用户逐章恢复时遇到 `FACT_BASELINE_REQUIRED`。
43
+
44
+ 证据保存在 `/tmp/dsh-novel-qa-acceptance-poll-20260908.json` 与 `/tmp/dsh-novel-qa-context-after-acceptance-20260908.json`。
45
+
46
+ ### 真实生成与评审
47
+
48
+ 在界面以 Flash 写作/评审各一个、目标 300 字、重复和并发各 1 提交 `ch_004`。运行 `bench_20260908153450_a90110086f` 通过真实 `execute_write_chapter` 路径生成候选,旧记录报告 313 字(后续核对发现包含内部批注,可读正文实际为 262 字),写作约 11.8 秒;独立评审约 7.8 秒。报告用量为输入 23,165、输出 5,222 tokens,服务端没有报告实际费用,界面显示未知而非零费用。
49
+
50
+ 此次评审覆盖 90%,显示均分 85.56;这个分数只来自已完成的评审部分,不能视为完整质量结论。文笔域的 `language_precision` 和 `structural_naturalness` 均为 `inconclusive`,虽然保留了有效正文引文与理由。7 次审查调用没有 provider error;落盘只有归一化结果,无法确定模型最初返回了明确不确定、缺失状态还是非法枚举。应保留未完成结论,后续后端可增加原始状态与归一化原因以便诊断,不应依赖正向理由自动补分。
51
+
52
+ 真实候选与评审仅写入 benchmark 隔离副本;QA 主作品仍只有前三章正文,第四章仅有计划。证据文件为 `/private/tmp/dsh-novel-qa-20260908/data/novels/qa_harbor/data/benchmarks/bench_20260908153450_a90110086f.json`。
53
+
54
+ ### 后端批注格式与字数修复
55
+
56
+ 真实候选将三条框架人物状态批注放在 `text` 代码围栏内。框架索引按规则跳过代码块,导致原文本解析为零条状态;旧字数同时把内部批注计入。已在 OpenWrite 的 `tools/character_state_index.py`、`tools/agent/writer.py` 和 `tools/model_benchmark.py` 修复:仅解包已闭合、每个非空行都是完整有效元数据的普通文本围栏,其他语言代码、混合、无效和未闭合围栏保留;阅读与导出隐藏纯元数据整块,写作长度检查、重试和 benchmark 均使用同一可读正文计数。
57
+
58
+ 同一历史候选只读验证得到:旧记录字数 313,新口径 262;正规化后索引提取三条状态、无诊断。没有重写历史测试产物或补写模型结论。后端改动使用自动化测试验证,没有再次提交生成或评审。
59
+
60
+ 后端最终 10 个测试文件共 161 项通过,覆盖状态批注、Writer、benchmark、正文工作区、提示约定、深度流水线、大纲约定、正文编辑、阅读顺序及导出预检;ruff 与差异检查通过。独立审查补充了四空格、Tab 和混合缩进代码的防误删守卫,同时保证真正元数据围栏内的缩进不会在正规化后被错当正文。源码改动仅限上述三个工具文件、`tests/test_model_benchmark.py` 和新增 `tests/test_writer_metadata.py`,保留 OpenWrite 中原有的其他未提交改动。
61
+
62
+ 前端已完成最终构建;本轮启动的 Studio 服务已重载最新后端代码,默认项目为 `/Users/jiaoziang/my_novel`,`/api/health` 返回 `{"ok": true}`。最终服务日志:`/tmp/dsh-novel-studio-final-20260908.log`。后端修复没有再做一次收费生成;旧 benchmark 仍作为原始失败与部分评审证据保留。
63
+
64
+ 当前 DSH 将没有 `turn/start` 的会话视为 blank,并隐藏 `conversation.view`。因此仅调用 `session.create` 得到的空会话无法展示小说工作台。E2E 现在从指定 Workspace 中选择 `blank=false` 的会话,不依赖会话列表的排列顺序。这一宿主限制仍会影响新作品的首次进入体验。
65
+
66
+ ## 已修复的恢复预览竞态
67
+
68
+ 复现:请求归档恢复预览后,在响应返回前修改目标目录、小说 ID、引用策略或选中归档。原实现只清空已显示的预览;旧响应返回后仍会重新显示“确认恢复”,其参数对应旧选择。
69
+
70
+ 修复后,输入变化会同步作废请求代次,旧成功或错误响应都不会覆盖当前界面。用户可以立即重新预览,旧请求结束不会解除新请求的忙碌状态;再次预览会先清除旧确认结果,恢复成功后也会清除确认按钮。目录选择对话框的延迟返回不会覆盖后续手工输入。
71
+
72
+ 专属组件回归共 11 项通过,其中新增 7 项。四种输入变化的测试已先在原实现上复现失败;TypeScript 检查与 `git diff --check` 通过。
73
+
74
+ ## 自动化结果
75
+
76
+ - 初始 `npm run check` 全部通过,包括 164 项组件测试、14 项 epoch 测试、90 个桥接工具 smoke、面板 smoke、生命周期与契约检查。最终构建后再次完整检查通过,组件回归增加至 27 个文件、234 项,epoch 仍为 14 项。初始日志:`/tmp/dsh-novel-check-20260908.log`;最终日志:`/tmp/dsh-novel-final-check-20260908.log`。
77
+ - 额外 DoG artifact 7 项和 conductor pipeline 4 项通过。
78
+ - 最终构建完成后,E2E 桌面与 390px 移动端全部 18 项通过,耗时 34.8 秒、退出码 0,无跳过。此前并行构建导致的 bundle 暂时缺失已在稳定构建重跑中消除。日志:`/tmp/dsh-novel-e2e-20260908.log`。
79
+ - 已修正 E2E 的草稿定位假设:测试明确选择种入草稿的章节,不再假定项目默认活动章节总是最后一章。草稿隔离、显式预览、删除和正文不变的断言均保留。
80
+
81
+ E2E 覆盖桌面与 390px 移动端的横向溢出、关键控件、API Key 不回显、模型测试与研究结果只读展示、正文历史/修订、上下文来源与预算、保存队列/重试/冲突/切章,以及本地恢复稿隔离。浏览器测试仍保留真实 API 的 Workspace 身份断言及正文前后比对。
82
+
83
+ ## 前端视觉与交互修复
84
+
85
+ - 模型测试台改为标题说明、紧凑配置、测试记录和结果分区。写作/评审模型采用对等的折叠选择器,默认直接显示已选名称;高级参数、执行阶段和输入来源按需展开。候选和评审宽表在自己的容器内滚动,正文输出保留独立阅读区域。
86
+ - 修复 15 个当前 dsh 主题未提供的颜色变量,包括 `--dsw-alias-border-l`、`--dsw-alias-state-info-primary` 等。原章节输入框在浏览器中实际计算为 `border: 0px none`;修正后为 `1px solid`。焦点环、选中态、表单和分区边框均使用安装版本真实提供的主题 token。
87
+ - 新增主题契约回归,直接读取安装的 dsh 样式清单核对项目所有语义颜色变量,防止构建成功但样式声明被浏览器静默丢弃。
88
+ - 统一导航、按钮、输入框、正文辅助信息的可读性。资料、模型与导入导出按实际面板宽度重排;跨 CSS 模块使用匿名容器查询,避免命名被不同模块分别 hash 后无法匹配。
89
+ - 手工检查了 375、768、1024、1440 像素宽度及明暗主题;375/768 像素检查时页面 `scrollWidth` 与 `clientWidth` 相同。主题检查完成后恢复原浅色设置。
90
+ - 测试提交增加忙碌锁和数字有效范围校验,刷新保留选择;结果切换废弃旧响应。终态以实验 run 为准,避免外层任务完成时误显示实验成功。
91
+ - 框架把部分评审也统计为已结束,因此前端进一步核对评审状态、覆盖率和缺失域;本次 90% 的记录显示“部分完成”“部分评审均分”及缺失的文笔域。尚未查看详情的历史记录采用中性流程状态,不声称评审完整。正文事实未接纳的失败记录提供创作页中的具体恢复步骤,并保留原始错误码。
92
+ - 任务列表修复详情响应串位及重复操作,后台更新保留筛选;搜索替换预览不再跨文档复用旧 token;页头同步失败会显示错误并允许重试。
93
+
94
+ ## 草稿与版本保护
95
+
96
+ - 角色/世界资产分别维护版本号,缓存切换不会串用其他资产的 revision;保存成功同步字段缓存,409 保留正文和关系草稿。
97
+ - 二级导航、资产切换及刷新提供未保存保护。后台资产变化刷新数据,不再重挂编辑器。
98
+ - dsh 顶层页签会卸载非活动页面,因此角色/世界资产新增按 Workspace、规范根路径、资产类型和 ID 隔离的内存恢复;保留原始 revision,服务端内容变化时明确提示冲突。成功保存或显式放弃后清理,旧的保存请求不能删除更新后的草稿。
99
+ - 真实 Vditor 暴露了额外的延迟输入窗口:输入后立即切页时,常规 `input` 回调可能尚未发生。资料正文现于失焦和卸载前读取最新 Markdown,同步写入草稿快照;此行为只在资料编辑器启用,避免改变创作页自动保存流程。未编辑、跨项目切换、保存和放弃后的卸载均有针对性回归。
100
+ - 新增真实 Vditor E2E 在同一浏览器任务中输入后立即点击顶层“任务”,断言原生 `input` 已触发、编辑器在 200ms 内卸载、“任务”确实选中,随后返回“资料”核对完整草稿恢复。桌面与移动端均通过;页内对话框先保留再明确放弃后恢复原文,再次切页也不会复活草稿。测试拦截并断言没有任何 Studio 写请求,同时前后比对服务器资产字段、Markdown、原始文本、revision 及对应源文档,全部不变。
101
+ - 普通资料导航与取消改用页内确认框,支持键盘焦点约束、Escape 保留和明确放弃,避免浏览器原生确认阻塞内嵌页面。
102
+ - 模型页恢复 Chat、Embedding、路由、当前档案及原基线,顶层返回时记住二级页;未完成的保存会等待完成后再开放操作。API Key 仅随表单留在易失内存,不写入 localStorage 或文件。
103
+ - 资产恢复缓存上限为 24 份、共 400 万字符;模型缓存上限为 8 个上下文,离开后保留 60 分钟。页面刷新会清空这些内存缓存;正文编辑器原有的 IndexedDB 恢复机制继续独立工作。新增资产表单和进阶体系尚未接入顶层内存恢复,仅有二级离开保护。
@@ -0,0 +1,24 @@
1
+ # 章节与大纲模型测试验收(2026-09-09)
2
+
3
+ ## 已实现
4
+
5
+ - 章节支持推荐下一章、真实计划章节选择和精确 ID;历史事实不可重建的目标明确禁用。
6
+ - 大纲支持接续现有大纲或指定起始章,按包含起点的章号范围设计 1–20 章。
7
+ - 服务端提供任务能力、范围限制、就绪原因和 DAG;前端使用同一配置,并保留历史运行配置。
8
+ - 大纲调用生产 Architect,验证结构和编号,再进行适用范围内的独立评审。
9
+ - DAG 阶段记录实际状态、依赖、文件证据和校验值;失败候选跳过评审,已消耗用量保留。
10
+ - 多模型候选与评审使用独立产物;章节生产评审也分离工作区,避免覆盖之前的证据。
11
+ - 窄屏使用单列任务卡与主要字段;后台失败原因在结果刷新后仍可见。
12
+
13
+ ## 验证
14
+
15
+ - `npm run check` 完整通过:27 个组件测试文件、258 项组件测试,以及构建、维护、预设、工具 smoke、epoch、契约校验。
16
+ - BenchmarkView 定向 46 项通过,涵盖章节/大纲切换、范围校验、实际产量、DAG 执行证据、历史记录、异步加载和就绪阻塞。
17
+ - 后端框架集成回归 77 项通过;最后就绪状态补丁相关回归 60 项通过。测试使用隔离注册表和模型替身,未连接真实模型服务。
18
+ - 1440px 与 390px 的只读浏览器测试覆盖真实 options、非 next 章、大纲范围、权威 DAG、可读宽度及零正文写入。移动端收起会话导航后表单宽 294px,任务卡与主要字段宽 260px。
19
+
20
+ ## 实际项目检查的边界
21
+
22
+ 在 `~/my_novel` 从页面提交了第 134 章的一章大纲测试。任务 `tsk_20260908162731_9e2e076e45` 在准备阶段被 `ACCEPTANCE_BASELINE_REQUIRED` 拦截:既有正文尚未建立接纳基线。因此本次没有验证真实服务商的大纲生成或评分结果,未绕过事实门禁,也未替作者创建基线。
23
+
24
+ 根据该问题补充了提交前的只读就绪检查。最终实页显示具体原因并禁用开始按钮。正式 `src`、`data/manuscript`、`data/outline` 的 65 个文件逐一核对 SHA-256,无修改或新增。测试 DAG 保留在隔离 benchmark 中,不替换全局 DoG 或标准章节评审蓝图。
@@ -0,0 +1,116 @@
1
+ # 0.2.7 发布验收记录
2
+
3
+ 下载与最终结果以 [Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.7) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.6` / `v0.2.5` 附件。
4
+
5
+ 宿主基线:dsh **0.1.2-rc.1**。Core **5.8.1** / contract 1。
6
+
7
+ ## 本版改动与验收
8
+
9
+ - 未解决批注出现在正文上方「作者选区批注」条,不必先打开右侧「修订」。
10
+ - 正文覆盖层提高不透明度并加彩色下划线。
11
+ - 回归:保存批注后出现 `creation.notes.locate: 查来源` 按钮。
12
+
13
+ 平台矩阵仍以 GitHub `Release artifact validation` 为准。真实模型测量 `not-run`。本机已运行的 dsh 安装默认不自动替换。
14
+
15
+ ## 0.2.6 记录
16
+
17
+ 下载与最终结果以 [v0.2.6 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.6) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.5` / `v0.2.4` 附件。
18
+
19
+ 宿主基线:dsh **0.1.2-rc.1**。Core **5.8.1** / contract 1。
20
+
21
+ ## 本版改动与验收
22
+
23
+ - 批注输入框的 `mousedown` 不再 `preventDefault`,可以获得焦点并输入。颜色按钮和提交仍保留选区。
24
+ - 回归:`lets the author focus and type in the annotation note field`。
25
+
26
+ 平台矩阵仍以 GitHub `Release artifact validation` 为准。真实模型测量 `not-run`。本机已运行的 dsh 安装默认不自动替换。
27
+
28
+ ## 0.2.5 记录
29
+
30
+ 下载与最终结果以 [v0.2.5 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.5) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.4` / `v0.2.3` 附件。
31
+
32
+ 宿主基线:dsh **0.1.2-rc.1**。Core **5.8.1** / contract 1。
33
+
34
+ ## 本版改动与验收
35
+
36
+ - 覆盖层 Range 跨 IR 文本节点拼接,粗体拆分的引文和 `//**…**` 标记能定位。
37
+ - 滚动 `.vditor-ir` 或窗口缩放后重新绘制覆盖层。
38
+ - 「定位」调用编辑器 `revealQuote`,选中并滚到原文。
39
+ - 回归:`manuscript-overlay-dom.test.ts` 拆节点引文/标记、第 n 处 reveal、scroll/resize 解绑;CreationView locate 调用 `revealQuote` 并设置选区。
40
+
41
+ 平台矩阵仍以 GitHub `Release artifact validation` 为准。真实模型测量 `not-run`。本机已运行的 dsh 安装默认不自动替换。
42
+
43
+ ## 0.2.4 记录
44
+
45
+ 下载与最终结果以 [v0.2.4 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.4) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.3` / `v0.2.2` 附件。
46
+
47
+ 宿主基线:dsh **0.1.2-rc.1**。Core **5.8.1** / contract 1。
48
+
49
+ ## 本版改动与验收
50
+
51
+ - 创作工作台 Vditor IR 正文可对选区添加作者批注:保存后绑定 chapter、revision 与精确范围;重复引文不静默取第一处。未保存草稿先保存再核对选区,否则拒绝。脱离原文或多处匹配显示「已脱离原文/需重新定位」,不把颜色或 HTML 写进 Markdown。
52
+ - 批注使用固定调色板;旧记录缺颜色时显示琥珀。状态变化 `//**人物[维度]:旧 -> 新**` 与指向关系 `//**A~>B:关系**` 使用另一组覆盖层颜色。插入标记从当前作品人物选择,同名需明确 id;打开表单不写盘、不调模型。有效内部标记不计入可读字数和默认导出。
53
+ - Core `ManuscriptAnnotationV1` 增加可选 `color`,钉住 `native-core` 的 5.8.1 wheel。v0.2.3 的迁移、子进程环境允许列表和受管理后端恢复行为未回退。
54
+
55
+ 平台矩阵仍以 GitHub `Release artifact validation` 为准。真实模型测量 `not-run`。本机已运行的 dsh 安装默认不自动替换。
56
+
57
+ ## 0.2.3 记录
58
+
59
+ 下载与最终结果以 [v0.2.3 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.3) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.2` / `v0.2.1` 附件。
60
+
61
+ 宿主基线:dsh **0.1.2-rc.1**。
62
+
63
+ ## 本版改动与验收
64
+
65
+ - 自动恢复的 `queueRestart` 失败不再变成未处理拒绝,因此不会把整个 dsh 带退出。
66
+ - 恢复启动失败计入同一退避上限并继续重试;取消或卸载发生在恢复等待中时,不抛未处理错误、不再启动后端。
67
+ - 回归:`recovery start failures retry up to the cap without an unhandled rejection`、`cancel and dispose during recovery wait do not reject unhandled or start a backend`。
68
+
69
+ 平台矩阵仍以 GitHub `Release artifact validation` 为准。真实模型测量 `not-run`。
70
+
71
+ ## 0.2.2 记录
72
+
73
+ 下载与最终结果以 [v0.2.2 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.2) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256、插件提交、Core 提交、宿主版本和原生执行记录。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物,不重新打包。不覆盖 `v0.2.1` 附件。
74
+
75
+ 宿主基线:dsh **0.1.2-rc.1**(npm `latest`/`next` 同此版本;`alpha` 为 `0.1.5-alpha.1`,本版不追随)。Core 5.8.0 / contract 1。
76
+
77
+ ## 本版改动与验收
78
+
79
+ - 旧安装迁移检查 bundle **和** `dependencies`;应用时走宿主 `dsh plugin remove`,先备份、失败恢复。不再只改 bundle 列表而把旧包留给后续 `plugin add` 重新登记(该路径会触发 `duplicate loader entry id: openwrite-bridge`)。作者所有预设按无包装标记识别,不会删除;历史会话不改绑。
80
+ - 受管理后端在 dsh 运行期间对已启动进程的异常退出做有上限退避自动恢复;取消、宿主退出、卸载不复活。恢复只重连服务,不重放写作/评审等付费请求,状态文案不得写成任务已恢复。
81
+ - 安装与 Python 子进程使用允许列表环境,不继承无关 API Key。工具策略测试覆盖只读、计划模式、缺失/伪造 Workspace、过期 revision、未认证请求。文档标明这不是操作系统沙箱。
82
+ - 成本比较方法见 [COST_MEASUREMENT.md](COST_MEASUREMENT.md)。离线 schema 字节继续由测试打印;真实 tokenizer/缓存/费用本版 `not-run`。
83
+
84
+ 平台矩阵、浏览器检查和 GitHub 源码安装仍以本版 CI `Release artifact validation` 为准。真实模型调用本版未授权,记为 `not-run`。
85
+
86
+ ## 0.2.1 记录
87
+
88
+ 下载与最终结果以 [v0.2.1 Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.1) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256、插件提交、Core 提交、宿主版本和原生执行记录。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物,不重新打包。
89
+
90
+ 宿主基线:dsh 0.1.2-rc.1;Core 5.8.0 / contract 1。Core 固定提交和 DoG v1.2.0 来源见 `release/runtime-manifest.json`。构建任务记录插件提交、依赖来源和许可证,最终 `.tgz.manifest.json` 绑定产物 SHA-256。
91
+
92
+ ## 本版改动与验收
93
+
94
+ 修复关系图侧栏中同一人物被多条关系重复列出的问题;正文同名或别名冲突改为候选选择,不再静默打开第一份资料。普通姓名与别名仍按资料身份合并。发布验收还发现并修复了启动入口固定选择旧版本预设的问题:浏览器入口现在从根发布版本生成预设 ID,并以实际安装的预设验证启动流程。前端 266 项组件测试覆盖这些行为及切换 Workspace/章节时清除候选。
95
+
96
+ 以下既有核心功能沿用 0.2.0 的验收基线,最终 0.2.1 产物的重复安装、平台安装与浏览器检查以本版 Release 附件为准。
97
+
98
+ ## 既有功能基线(0.2.0)
99
+
100
+ - macOS arm64 / Node 24.15:实际 `.tgz` 安装进隔离 DSH_HOME,重复安装、自动下载 Python、隔离依赖安装、认证后端握手、编辑器资源和标准卸载通过。没有相邻 Core 路径依赖,没有调用模型。
101
+ - 本机已有作品检查使用 `~/my_novel`:标准预设不出现小说工作台;OpenWrite 入口创建新创作会话,空会话显示工作台,已有正文编辑器成功加载。DoG 默认不浮动占位。作者另外明确要求新建独立文件夹实测;新建作品验证单独记录,不借用已有作品数据。
102
+ - Core 94 项相关回归通过;前端 260 项组件测试、DoG 42 项测试通过。后续新增测试以 CI 最终结果为准。
103
+ - 运行时测试覆盖中断下载、缓存校验、安装锁取消、旧活动记录保留和进程清理;真实 dsh ToolRuntime 验证 90 个小说工具只在创作预设出现,普通预设为 0。
104
+ - 原生工具声明测量:90 个工具共 63,614 UTF-8 字节;PTC 传输声明 944 字节,另有 60,232 字节 SDK。未测 tokenizer token 数,不据此承诺 PTC 缓存或费用收益。
105
+
106
+ ## 原生平台与发布门禁
107
+
108
+ `Release artifact validation` 工作流只构建一次包,Node 24 的 Linux x64、Windows x64、macOS arm64/x64,以及 Linux Node 22.19 / 26 六个原生任务下载同一个产物。Windows 不使用 WSL。真实模型检查单列:0.2.1 发布验收不调用模型,真实正文生成和多模型测试未计为通过。0.2.0 曾完成 DeepSeek 官方的只读 novel_status 调用,历史记录见该版本 Release 附件,不作为本版真实模型验收结果。
109
+
110
+ 安装任务覆盖标准与重复安装、其他插件共存、后端认证、隔离 Python、Core 契约、编辑器静态资源、原生依赖加载、动态端口、多实例、崩溃恢复、进程清理、失败升级保留活动环境、回退与卸载保留数据。浏览器实际完成首次引导、打开 OpenWrite、创建测试作品和切换工作台。GitHub 源码安装另起任务,从不带 `.git` 的源码压缩包自行构建。
111
+
112
+ 构建门禁另外执行权限和计划模式、90 工具预设隔离、安装锁与下载取消、旧安装迁移备份、官方预设并发与自定义内容保护、前端组件和 DoG 回归。Core 回归使用模型替身验证生成、评审、取消、部分结果与费用;这些自动化检查的真实模型调用数为 0。
113
+
114
+ macOS arm64 依赖要求至少 macOS 14,Intel 至少 macOS 13;运行器之外的系统小版本未计为通过。Intel 使用官方 ONNX Runtime 1.23.2 wheel,其他平台使用 1.29.0。cryptography 50.0.1 的 Intel wheel 从同版本源码原生构建,来源、编译工具链、OpenSSL 静态链接检查和校验值见包内清单。
115
+
116
+ 报告保留系统、架构、Node 版本、产物 SHA-256、实际检查和模型调用数。自动化均使用临时 DSH_HOME、配置及 ProjectRegistry。通过前不添加 `dsh-plugin` 发现标签。
@@ -0,0 +1,82 @@
1
+ # 标准章节审稿 DAG
2
+
3
+ 审稿 DAG 由 OpenWrite 定义一次,dsh-novel 对每章只做实例化。章节审稿不再在 Python conductor 和 TypeScript bridge 中各自拼装节点与依赖。
4
+
5
+ ## 权威来源
6
+
7
+ - 蓝图:OpenWrite `tools/review_dag_framework.py`
8
+ - 评分准则:OpenWrite `tools/review_rubric.py`
9
+ - 查询接口:`GET /api/review/framework`
10
+ - dsh 工具:`novel_review_framework`
11
+ - 章节实例:`data/novels/<novel_id>/data/dog/reviews/<chapter_id>/dog-graph.json`
12
+
13
+ 蓝图使用 `openwrite.review-dag-framework.v1` 契约、语义版本和 SHA-256 修订号。每份 `review.json` 都记录 `frameworkId`、`frameworkVersion` 与 `frameworkRevision`,因此历史审稿可以准确追溯到当时的框架。
14
+
15
+ ## 固定拓扑
16
+
17
+ ```mermaid
18
+ flowchart LR
19
+ C[上下文完整性] --> D1[连贯与逻辑]
20
+ C --> D2[角色与关系]
21
+ C --> D3[情节与承诺]
22
+ C --> D4[节奏与场景]
23
+ C --> D5[文风与表达]
24
+ C --> D6[正典与资料]
25
+ C --> G[硬门禁]
26
+ D1 --> A[聚合与交付判定]
27
+ D2 --> A
28
+ D3 --> A
29
+ D4 --> A
30
+ D5 --> A
31
+ D6 --> A
32
+ G --> A
33
+ ```
34
+
35
+ 完整蓝图有 47 个节点、46 条包含边和 14 条执行依赖:
36
+
37
+ - 1 个根节点,负责整章完成条件。
38
+ - 1 个上下文前置节点,校验正文版本与评审基线。
39
+ - 6 个质量域,共 20 条加法评分准则。
40
+ - 36 个质量检查叶节点,兼容既有检查编号。
41
+ - 1 个硬门禁和检查 27;门禁结果不混入质量分。
42
+ - 1 个聚合节点,只消费 OpenWrite 的 `review_v2` 权威判定。
43
+
44
+ 局部审稿仍保留 47 个节点。未请求的检查写成 `inconclusive`,因此不同章节之间可以比较拓扑、覆盖率和历史记录,不会因参数不同生成一张结构不同的图。
45
+
46
+ ## 实例化流程
47
+
48
+ 1. OpenWrite 按评分准则生成 `review_v2`。
49
+ 2. materializer 获取当前蓝图,只绑定 `chapter_id` 和章节产物目录。
50
+ 3. materializer 写入 context、domain、dimension、gate、aggregate 记录。
51
+ 4. DoG verifier 读取这些确定性记录,不再次调用模型,也不重算评分。
52
+ 5. Studio 图谱页显示框架版本、六域、37 项检查和 20 条准则;尚未审稿时也能看到框架身份。
53
+
54
+ Python 与 TypeScript 使用同一份 OpenWrite 蓝图实例化,并有跨语言图结构一致性测试。
55
+
56
+ ## 扩展规则
57
+
58
+ 现有 v1 拓扑保持锁定。日常扩展使用四个明确入口:
59
+
60
+ | 扩展点 | 可以做什么 | 产物约束 |
61
+ |---|---|---|
62
+ | `context-evidence` | 加入时间线、角色状态、资料来源等前置证据 | 增补 `context.json`,保留来源与版本 |
63
+ | `domain-evaluator` | 更换或增加某个质量域的证据提取器 | 按 `rubric.criteria` 返回评分与证据 |
64
+ | `gate-evaluator` | 接入敏感词或其他确定性门禁实现 | 显式返回 pass / blocked / inconclusive |
65
+ | `post-review-policy` | 根据权威判定触发修订、复审或交付 | 消费 `review_v2`,不重新推导结论 |
66
+
67
+ 需要增加节点、删除检查、改变归属或修改依赖时,升级框架版本并重新计算修订号;不能在单章实例里临时改图。需要调整提示词、模型或证据提供器时,使用扩展点,不必改变 DAG。
68
+
69
+ ## 维护检查
70
+
71
+ ```bash
72
+ cd /Users/jiaoziang/OpenWrite
73
+ .venv/bin/pytest -q tests/test_review_dag_framework.py tests/test_review_v2_http.py
74
+
75
+ cd /Users/jiaoziang/dsh-novel
76
+ npm --prefix packages/openwrite-bridge run build
77
+ .venv/bin/python conductor/test_dog_artifacts.py
78
+ npm --prefix packages/openwrite-bridge run smoke
79
+ npm --prefix packages/studio-panel run test:components
80
+ ```
81
+
82
+ 校验会阻止缺失或重复检查、多父节点、悬空边、依赖环、不安全的产物路径,以及 Python/TypeScript 实例不一致。
@@ -0,0 +1,167 @@
1
+ # 用户指定的七个小说项目:源码核查与改进建议
2
+
3
+ 核查日期:2026-09-05。承接 [通用小说工具调研](OPEN_SOURCE_NOVEL_AUDIT.md),本轮只研究用户指定的七个仓库,并对照当前 dsh-novel / OpenWrite 工作树。
4
+
5
+ 项目归属(用户确认):[OpenWrite Core](https://github.com/LiPu-jpg/Openwrite/tree/native-core) 是本团队自己的核心项目;
6
+ `dsh-novel` 是 OpenWrite 的 DeepSeek Harness 插件版本,两者共同构成此次完善对象。
7
+ 下文七个仓库是外部参考,OpenWrite 是自有基线。评估时区分“核心已有、插件尚未接入”和“核心本身需要增强”。
8
+
9
+ | 改进落点 | 对应职责与本轮实例 |
10
+ |---|---|
11
+ | OpenWrite 核心 | 小说领域数据与业务规则:统一 token 估算、上下文约束保护、正文事实接纳、导入恢复与项目归档 |
12
+ | dsh-novel bridge / 预设 | 将核心能力接入 dsh 工具与创作流程:请求/响应契约、revision、Workspace 隔离、失效通知与领域动作暴露 |
13
+ | dsh-novel 工作台 | 作者操作:自动保存竞态修复、版本/diff/恢复入口、上下文检查、伏笔到期清单与编辑导航 |
14
+
15
+ 实现可跨两仓库配合,领域能力仍维护在 OpenWrite 中;工作台未展示某能力,不代表 OpenWrite 没有该能力。
16
+
17
+ **结论:优先参考 Scriverse 的保存与变更审阅、ainovel-cli 的改稿接纳与导入恢复、InkOS 的上下文保护。**
18
+ OpenFic、CharacterArc、MuMuAINovel 分别补充轮次回滚、项目档案和伏笔/修订工作台的具体设计。
19
+ Casting-Workflow 可参考阶段组织,但其公开资源不足以直接完成 README 所描述的全流程。
20
+
21
+ 本轮修正前一轮“主要是界面差距”的判断:界面仍是明显短板,但还要核验正文改动后的事实联动、
22
+ 长任务半完成恢复和不可裁剪的创作约束。这些涉及业务契约,不能只靠增加面板解决。
23
+
24
+ 证据等级:以下“已实现”指找到实际源码及调用入口;七个仓库均已浏览并在临时目录浅克隆。
25
+ 没有安装依赖、执行上游程序、运行上游测试或调用模型,不能据此给出生成质量排名或稳定性保证。
26
+ 本地对照以未提交工作树为准,不把旧 README 或当前 Git HEAD 当作全部现状。
27
+
28
+ ## 1. 固定核查快照
29
+
30
+ 日期统一按北京时间列出;版本取源码包元数据或提交记录,不等同于已验证的发行包。
31
+
32
+ | 项目 | 固定提交 / 日期 | 许可与形态 | 当前状态的实际含义 |
33
+ |---|---|---|---|
34
+ | Casting-Workflow | [`2e1eae2026c546ee6ab0235ead8dfb00def12e60`](https://github.com/dama-cyber/Casting-Workflow/tree/2e1eae2026c546ee6ab0235ead8dfb00def12e60) / 06-23 | README 声明 MIT,树中未见独立 LICENSE;Python 提示组装脚本 | 公开树跟踪 11 个文件,缺少调用所需的阶段模板和所述语料,不是完整自动写作应用 |
35
+ | ainovel-cli | [`47df100f25ab7e6460db526cacb38329b6c36549`](https://github.com/voocel/ainovel-cli/commit/47df100f25ab7e6460db526cacb38329b6c36549) / 09-04 | [Apache-2.0](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/LICENSE);Go TUI / headless | 本轮为主分支快照;确定性引擎、角色工具与持久工件均有实现,最新提交修复骨架弧读取 |
36
+ | Scriverse / 叙界 | [`e5ddeced886a5a38aa543fe6c807346b72d84f41`](https://github.com/musnows/Scriverse/commit/e5ddeced886a5a38aa543fe6c807346b72d84f41) / 09-04 | 当前 [AGPL-3.0-only](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/package.json);Node / Express / SQLite / Web,另有 CLI 和 Docker | main 包版本 1.0.1;README 仍称 MVP、数据结构可能变化,不能以版本号推断接口稳定 |
37
+ | OpenFic | [`809a071e34ed651e5177f31ac1b8a461a589edab`](https://github.com/syrizelink/OpenFic/commit/809a071e34ed651e5177f31ac1b8a461a589edab) / 09-04 | [Apache-2.0](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/LICENSE);FastAPI / React,另有 Electron 构建 | [0.11.0,Python 元数据仍为 Alpha](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/pyproject.toml);有桌面配置不等于各平台安装已验收 |
38
+ | CharacterArc | [`1a81dca0af259f8912cdc745f15848dc8c6ca876`](https://github.com/uu201/character-arc/commit/1a81dca0af259f8912cdc745f15848dc8c6ca876) / 08-31 | [MIT](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/LICENSE);Electron / Vue / SQLite | [1.18.5](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/package.json),近期有缺陷修复;桌面写作与档案管理是主要参考面 |
39
+ | MuMuAINovel | [`600be7038539e4dd0568b63e6e534fdcfaf91687`](https://github.com/xiamuceer-j/MuMuAINovel/commit/600be7038539e4dd0568b63e6e534fdcfaf91687) / 08-31 | [GPL-3.0](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/LICENSE);FastAPI / React / PostgreSQL 部署 | 此提交更新 1.5.5;README 的 TODO 区有大量已勾选项,须按代码而非标题判断完成度 |
40
+ | InkOS | [`091048383f411eb99948a8764f42b6fd13006f9b`](https://github.com/Narcooo/inkos/commit/091048383f411eb99948a8764f42b6fd13006f9b) / 08-26 | [AGPL-3.0-only、1.8.0](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/package.json);TypeScript monorepo,Studio / TUI / CLI | 已有 pi-agent、领域流水线与多种创作形态;本轮聚焦长篇和工程边界,不评价其他形态的生成效果 |
41
+
42
+ 上述许可按本次快照记录。本轮没有复制上游代码;引入具体实现前仍需按目标文件和版本核对复用条件。
43
+
44
+ ## 2. 七个项目分别值得学什么
45
+
46
+ ### Casting-Workflow:阶段契约与多来源比较,不能照搬其质量承诺
47
+
48
+ - `run_pipeline.py` 将阶段映射到模板与前序文件,并组装提示后交由用户手动调用 LLM。可学每阶段的输入/输出展示,但它没有模型 API 执行器,也没有基于内容版本的过期检测。[阶段定义](https://github.com/dama-cyber/Casting-Workflow/blob/2e1eae2026c546ee6ab0235ead8dfb00def12e60/run_pipeline.py#L40)
49
+ - `fusion.py` 并列展示多个来源的特征,提示模型归纳共性和独有设定;适合借鉴“共同技法 / 来源差异 / 不应迁移的设定”界面。所谓公约数由模型判断,代码本身没有计算语义交集。[来源组装](https://github.com/dama-cyber/Casting-Workflow/blob/2e1eae2026c546ee6ab0235ead8dfb00def12e60/tools/fusion.py#L162)
50
+ - 当前公开 `prompt/` 只有映射文档,所需模板缺失会直接退出;前序文本与语料分别截取前 2,000 / 3,000 字符。其原创审计是抽样子串比对,不能证明“100% 原创”,也不是外部检测服务的接入。[缺失模板处理](https://github.com/dama-cyber/Casting-Workflow/blob/2e1eae2026c546ee6ab0235ead8dfb00def12e60/run_pipeline.py#L419)、[截取逻辑](https://github.com/dama-cyber/Casting-Workflow/blob/2e1eae2026c546ee6ab0235ead8dfb00def12e60/run_pipeline.py#L164)、[审计实现](https://github.com/dama-cyber/Casting-Workflow/blob/2e1eae2026c546ee6ab0235ead8dfb00def12e60/tools/audit.py#L61)
51
+
52
+ 本地已有 source analysis、reference-library、风格综合与确认采用。保留这些边界,优先增强来源比较和采用预览,不能退回原文片段拼接。
53
+
54
+ ### ainovel-cli:最值得深入学习改稿后的事实接纳与可恢复导入
55
+
56
+ - 正文提交先固定提交意图、规范化参数和正文快照;恢复沿用首次固定的内容。路由函数根据状态决定下一步,执行与判断分开。可用来审视本地 Chapter Run V2 的重放与半提交窗口。[提交实现](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/internal/tools/commit_chapter.go#L212)、[路由](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/internal/flow/router.go#L90)
57
+ - 用已接纳的正文 SHA 扫描磁盘改动;分析后再次检查 SHA,再接纳修改、重建事实投影、使高层摘要和审阅失效,并给后续规划反馈。这比“正文保存成功”更接近长篇连续性所需的完整业务流程。[扫描](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/internal/revision/scan.go#L22)、[接纳服务](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/internal/revision/service.go#L112)
58
+ - 旧稿导入单独经过源快照、语义切分、确认、逐章事实、全书综合、发布,步骤绑定输入指纹;未完成发布阻止正常创作消费半成品。当前只导入空书、支持 TXT/Markdown,不能当作任意作品合并器。[导入状态机](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/internal/host/imp/state.go#L25)
59
+
60
+ 边界:单文件原子写不等于所有动作都是跨文件事务,架构文档也承认部分硬杀/并发输入窗口。
61
+ 评测文档中的 `--judge`、`--no-judge` 和人工评审层仍属规划;不要据此认定其评审已强于本地独立 reviewer 横评。
62
+ [架构边界](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/docs/architecture.md#L370)、[评测规划](https://github.com/voocel/ainovel-cli/blob/47df100f25ab7e6460db526cacb38329b6c36549/docs/evaluation-system.md#L379)
63
+
64
+ ### Scriverse:保存状态机、可审阅写入和稳定正文引用
65
+
66
+ - `persistChapter` 固定本次 draft、等待在途请求、响应后核对作品/章节身份,只把该快照记为已保存;若当前输入不同则再次排队。它直接提供了本地 autosave 缺陷的设计参考,但本轮未运行该应用,不能保证它所有边界均无缺陷。[保存实现](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/src/public/app.js#L6757-L6843)
67
+ - AI 写入先成为有 before/after 的计划;执行前重新检查目标版本和权限,批量操作进入数据库事务。确认、拒绝、撤销有实际界面接线,适合把本地修订 JSON 变成操作流程。[计划执行](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/src/ai-write-plans.ts#L2021-L2157)、[界面](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/src/public/app.js#L3275-L3346)
68
+ - 稳定行 ID 随编辑调和,批注按身份映射;另有插空行和重复行删除测试。可学评审证据在修稿后怎样重定位;不应把行号或字符串命中当作永久可靠定位。[行身份](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/src/public/chapter-line-id-tracker.js#L87-L150)、[测试源码](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/tests/unit/chapter-line-id-tracker.test.ts)
69
+
70
+ 其上下文计量 UI 分开 system、tools、skills、input、output 与 remaining,也可借鉴。
71
+ 当前浏览器 `app.js` 约 2.1 万行、`ai.ts` 约 1.7 万行;宜提取设计不变量,保持本地模块边界,避免整块移植。
72
+ [计量展示](https://github.com/musnows/Scriverse/blob/e5ddeced886a5a38aa543fe6c807346b72d84f41/src/public/ai-context-meter.js)
73
+
74
+ ### OpenFic:把每轮 AI 的实际改动与索引状态交给作者检查
75
+
76
+ - 变更面板覆盖章、笔记、世界条目与人物,提供行级/并排 diff;可回滚到用户消息前。后端不仅恢复业务快照,也处理会话附件、压缩记录和子运行检查点边界。[变更面板](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/frontend/src/features/assistant/components/agent/agent-changes.tsx)、[回滚服务](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/app/agent_runtime/revisions.py#L843-L1225)
77
+ - 检索显式区分 fresh、stale、needs_rebuild、no_index;正文哈希、Embedding 模型/维度和分块版本参与判断。无索引/需重建不能强行查询;stale 默认拒绝,可以明确 force。值得学的是作者看得懂的状态与修复方式。[查询策略](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/app/agent_runtime/tools/impls/chapter/search_chapters.py#L159-L365)
78
+ - 分块优先保留段落,再用中英文句界切分;上下文组装与会话压缩单独成模块。这有助于把来源、正文定位与压缩结果显示清楚。[分块器](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/app/retrieval/internal/indexing/chunking.py)、[上下文组装](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/app/agent_runtime/context/build_context.py)
79
+
80
+ 边界:本轮没有验证“百万字级”检索表现;本地存储也不代表离线,除了模型调用还有默认开启、可关闭的错误遥测。
81
+ 本地已有检索索引、源 revision、失效与自动同步机制,不应重建第二套 RAG 或把 OpenFic 的 Agent runtime 搬进 OpenWrite。
82
+ [遥测配置](https://github.com/syrizelink/OpenFic/blob/809a071e34ed651e5177f31ac1b8a461a589edab/backend/app/telemetry.py#L20-L53)
83
+
84
+ ### CharacterArc:写作恢复、待应用变更和可携带项目档案
85
+
86
+ - 编辑器按章节保存本地恢复快照,和持久正文比较后提供恢复;有查找、前后跳转、单次/全部替换。另有大纲多选跨卷移动。这里证明的是大纲排序,不能直接推断为完整场景模型。[草稿恢复](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/renderer/src/components/chapterWorkspace/SimpleChapterEditor.vue#L37-L96)、[排序核心](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/renderer/src/features/workspace/outlineReorder.ts)
87
+ - AI 待写入变更有接受/拒绝/提交状态;只写入已接受项,失败保留重试;UI 区分部分失败与“写入成功、刷新失败”。可补本地作者控制感与真实状态反馈。[变更队列](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/electron/main/ai/runtime-v2/staged-changes-store.ts#L305-L374)、[界面反馈](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/renderer/src/components/assistantV2/GlobalAssistantV2Panel.vue#L157-L173)
88
+ - `.carc` 档案打包正文、版本、角色关系、大纲、工作流文档、AI 记录和参考文本;导入可选择模块,补依赖并重映射 ID。比纯正文导出更接近项目迁移。[归档实现](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/electron/main/archive/project-archive.ts#L535-L574)、[导入依赖](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/electron/main/archive/project-archive.ts#L658-L666)
89
+
90
+ 边界:归档代码遇到缺失参考原文会跳过,不能用“导出成功”证明全部资源已备份;本地实现应明确列出缺项。
91
+ 其测试脚本包含 Windows shell 写法,macOS 文档说明未公证;存在打包脚本不代表跨平台验证已完成。
92
+ [包脚本](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/package.json)、[macOS 说明](https://github.com/uu201/character-arc/blob/1a81dca0af259f8912cdc745f15848dc8c6ca876/README.md#L215-L225)
93
+
94
+ ### MuMuAINovel:把评审建议与伏笔管理连接到当前章节
95
+
96
+ - 伏笔上下文分为本章到期、超期、近期参考和待埋入,工作台提供计数与提示。本地已有伏笔 DAG 和目标章节,差距在“本章要处理什么”的直接操作入口。[上下文构造](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/backend/app/services/foreshadow_service.py#L713-L800)、[工作台](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/frontend/src/pages/Foreshadows.tsx#L547-L560)
97
+ - 从分析结果勾选修改建议、补自定义要求和保留元素,再生成并对比应用。这正适合连接本地六域评审与修订服务。[修改输入](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/frontend/src/components/ChapterRegenerationModal.tsx#L64-L105)、[比较界面](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/frontend/src/components/ChapterContentComparison.tsx#L156-L186)
98
+ - 项目 JSON 导入有验证与独立项目恢复入口。可学导入前的内容统计、错误和警告,但默认不含历史/记忆/分析,历史选中后仍最多导出 100 条,不能称无损全库备份。[默认选项](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/backend/app/schemas/import_export.py#L7-L13)、[历史限制](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/backend/app/services/import_export_service.py#L420-L427)
99
+
100
+ 不要照搬其局部重写提交保护:所读接口只检查偏移范围后拼接当前正文,未检查生成所依据的源版本。
101
+ 本地应保留 revision 与原文匹配检查。其 Docker 构建删除 lockfile 后运行 npm install,也不宜沿用为可重复构建策略。
102
+ [局部应用接口](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/backend/app/api/chapters.py#L5210-L5228)、[构建定义](https://github.com/xiamuceer-j/MuMuAINovel/blob/600be7038539e4dd0568b63e6e534fdcfaf91687/Dockerfile#L23-L27)
103
+
104
+ ### InkOS:保护创作约束,记录上下文来源与提交边界
105
+
106
+ - Composer 将上下文分为受保护与可压缩内容;当作者意图、当前焦点、硬状态、活跃伏笔等保护项本身超预算时明确报错,不继续压缩这些项。trace 保存来源、理由、预算、压缩与检索候选,适合借鉴为可检查的创作输入契约。[预算处理](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/agents/composer.ts#L160-L218)、[保护源定义](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/utils/context-assembly.ts#L126-L151)、[trace 模型](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/models/input-governance.ts#L90)
107
+ - 记忆、资料和 skill 参考共用可重建的 SQLite FTS5/BM25 投影;源文件保持权威,段落有位置,中文分词考虑相邻汉字组合。可学统一来源和索引可重建性,不意味着词法检索应替代本地所有语义检索。[检索内核](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/retrieval/local-search.ts)
108
+ - Writer 把正文、状态、伏笔及相关结构化文件组装为一次文件集提交;辅助函数先暂存、备份再替换,错误时回滚,测试源中有第二次替换失败的故障注入。[Writer 提交](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/agents/writer.ts#L663-L723)、[文件集实现](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/utils/atomic-file-set.ts)、[故障测试](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/__tests__/atomic-file-set.test.ts#L56)
109
+
110
+ 边界:上述是某个文件集的异常回滚,外层索引/快照还分步持久化;不能直接等同于整个业务的崩溃一致事务。
111
+ 本轮未运行故障测试,也未验证强杀/断电恢复。多种作品形态和 pi-agent 的采用本身不证明长篇质量优于现有框架。
112
+ [外层持久化](https://github.com/Narcooo/inkos/blob/091048383f411eb99948a8764f42b6fd13006f9b/packages/core/src/pipeline/chapter-persistence.ts)
113
+
114
+ ## 3. 对照本地:保留哪些能力,具体补哪里
115
+
116
+ | 能力 | 当前已经有 | 待补或待核验的真实差距 |
117
+ |---|---|---|
118
+ | 写章/恢复/评审 | [Chapter Run V2](../../OpenWrite/tools/chapter_run_v2.py)、[章节 pipeline](../../OpenWrite/tools/chapter_pipeline.py) 有阶段、输入版本、产物和异常回滚;本地还有独立 reviewer、DoG 证据 | 借 ainovel-cli / InkOS 核验冻结提交内容、半提交恢复、重复执行与跨文件一致性;不新增第二个 Agent 引擎 |
119
+ | 正文保存 | [CreationView](../packages/studio-panel/src/client/CreationView.tsx) 有自动保存和冲突状态 | 前轮已复现请求期间新输入被误标 saved;优先参考 Scriverse 的请求快照/排队,再加 CharacterArc 式恢复入口 |
120
+ | 正文改动后的事实 | [版本存储](../../OpenWrite/tools/manuscript_editing.py)、[修订服务](../../OpenWrite/tools/revision_service.py)、[源同步](../../OpenWrite/tools/source_sync.py) 已有版本/失效处理 | 未发现覆盖任意外部正文变更、事实接纳、跨章派生物失效和续写检查的完整等价链路;须进一步核验所有正文写入口 |
121
+ | AI 改动审阅 | [TurnMutationSummary](../packages/studio-panel/src/client/TurnMutationSummary.tsx) 已汇总工具与目标路径;后端已有修订/确认 | 增加真实 before/after、源 revision、逐项采用和历史入口;轮次回滚必须处理后续修改冲突,不只是撤回聊天消息 |
122
+ | 上下文/检索 | [ContextBuilder](../../OpenWrite/tools/context_builder.py)、[manifest](../../OpenWrite/tools/context_manifest.py)、[project_search](../../OpenWrite/tools/project_search.py) 已有压缩、来源、索引同步和内容版本 | 统一估算器,定义不能静默裁剪的约束;展示来源、压缩、过期与索引刷新状态,不再造 RAG |
123
+ | 旧稿导入/拆书 | [novel_workspace](../../OpenWrite/tools/novel_workspace.py)、[source_analysis](../../OpenWrite/tools/source_analysis.py)、[reference_library](../../OpenWrite/tools/reference_library.py) 已有切分/分析/采用;bridge 有导入和回填 | 将已有步骤连接成带源快照、确认、逐步恢复和发布状态的完整导入工作区,尤其覆盖非规范标题与中断 |
124
+ | 剧情和伏笔 | [narrative_forecast](../../OpenWrite/tools/narrative_forecast.py) 已有非正典分支与过期判断;[GraphView](../packages/studio-panel/src/client/GraphView.tsx) 已有伏笔看板 | 增加本章到期/超期的直接行动入口和上下文去向,避免重复创建 DAG 或分支模型 |
125
+ | 迁移与备份 | 稿件导出和 [asset_package](../../OpenWrite/tools/asset_package.py) 已有 | 学 CharacterArc 的全项目清单、模块依赖与 ID 映射,并明确缺失文件、历史范围、任务迁移与恢复验证 |
126
+
127
+ ### 新确认的本地实现问题:上下文 token 估算不一致
128
+
129
+ `tools/context_manifest.py` 的 `build_context_manifest` 用 `len(rendered) / 1.5`。
130
+ `models/context_package.py` 的 `estimate_text_tokens` 对中文用 `字数 × 1.5`,英文/其他字符用 `× 0.25`。
131
+ 本轮用实际函数处理同一份 1,500 个“中”字,得到:
132
+
133
+ ```text
134
+ 字符数 1500
135
+ manifest 估计 tokens 1000
136
+ 写作预算估计 tokens 2250
137
+ ```
138
+
139
+ 这是两个估算函数口径不一致的确定性证据,不是某个模型真实 tokenizer 的测量结果。
140
+ 若面板直接展示清单数字,会和写作预算判断产生误解;应统一公共估算器、标明估算口径和渲染开销。
141
+ [预算估算器](../../OpenWrite/models/context_package.py)、[清单估算](../../OpenWrite/tools/context_manifest.py)
142
+
143
+ 另一个需要明确的业务策略:当前 `ContextBuilder._force_fit` 在持续超预算时会裁剪 world rules、core documents,
144
+ 之后甚至裁剪 author intent / creative focus。代码说明极小自定义预算的最后清空分支通常不会由公共最小 12K 配置触发。
145
+ 不能据此声称日常输入必然丢失约束;但应定义哪些条目禁止自动裁剪,保护项超限时给出明确原因和可选处理,
146
+ 避免仅以“符合 token 上限”作为输入有效的标准。此处是源码路径确认,尚未运行完整生成路径。
147
+ [本地压缩策略](../../OpenWrite/tools/context_builder.py)
148
+
149
+ ## 4. 建议落地顺序与验收条件
150
+
151
+ 1. **保存正确性与恢复(先做)**:冻结请求的稿件、文档身份和版本;串行保存并排队新输入。延迟保存期间继续输入、失败重试、切章/Workspace、关闭恢复均不误报 saved;迟到响应不污染新文档。
152
+ 2. **上下文计量与保护**:manifest 和执行预算对相同渲染文本使用同一估算器;展示 system/tools/skills/正文等预算组成。不可裁剪项内容和 revision 可检查,超限返回可操作原因;预算压缩不能静默移除必要正典。
153
+ 3. **改稿接纳与事实联动**:以已接纳正文 SHA 为基线检测改动;生成事实差异后再次检查 SHA;确认接纳后使依赖摘要/评审/计划失效;影响未处理时,续写明确提示或按既有规则阻断。手工保存、Agent 编辑、历史恢复、外部编辑器写入都应覆盖。
154
+ 4. **变更与修订工作台**:在现有轮次摘要上接入 before/after、源版本、修改原因、逐项采用、失败重试与历史。恢复/回滚先展示范围,拒绝覆盖之后产生的新修改;状态区分未写入、写入成功、刷新失败。
155
+ 5. **导入与项目归档**:已有导入/分析/回填步骤共用一次导入 manifest,源变更可精确失效;半发布不被当作完成作品。归档预览包含与缺失项,在新路径恢复后验证正文、结构、历史与评审,不以生成 ZIP/JSON 为验收终点。
156
+ 6. **章节导向的日常操作**:伏笔到期/超期清单、稳定证据回跳、跨卷排序、查找替换;场景实体仍按前报告的领域模型建议单独设计,不从大纲拖放推断其已经具备。
157
+
158
+ 上述顺序是设计建议,没有自动更改当前项目的写入权限、评审阈值、正典采用规则或目标状态。
159
+ 沿用 OpenWrite 作为领域后端、dsh 作为唯一交互壳和 Agent 编排层,避免新建平行状态存储。
160
+
161
+ ## 5. 本轮交付与验证边界
162
+
163
+ - 交付此报告,固定七个仓库的 SHA 与源码链接;更新通用调研和 README 的入口。
164
+ - 父代理复核了 Scriverse 保存实现、OpenFic 索引状态及 InkOS 上下文/文件集提交的关键代码。
165
+ - 本地通过实际纯函数复现 token 估算差异;使用合成字符串,没有访问真实稿件、调用模型或写入 OpenWrite 数据。
166
+ - 前轮自动保存缺陷仍待修复,复现入口为 [autosave-race-repro.mjs](research/autosave-race-repro.mjs)。本轮未修改生产代码,未将上游存在测试文件说成测试已通过。
167
+ - 首个可执行开发任务仍是修复 `CreationView.save`;随后统一上下文估算,定义约束保护,再实现正文事实接纳联动。