@joekytc/dsh-swarm 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (567) hide show
  1. package/README.md +3 -3
  2. package/README.zh-CN.md +3 -3
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +71 -0
  5. package/client/ConfigSelect.tsx +69 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +2 -26
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +51 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +19 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +10 -1
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +358 -53
  18. package/lib/config.d.ts +8 -1
  19. package/lib/config.js +6 -1
  20. package/lib/dispatcher/agent-runner.d.ts +28 -6
  21. package/lib/dispatcher/agent-runner.js +175 -62
  22. package/lib/dispatcher/chain-auditor.js +4 -1
  23. package/lib/dispatcher/dispatcher.d.ts +62 -3
  24. package/lib/dispatcher/dispatcher.js +243 -20
  25. package/lib/dispatcher/session-events.d.ts +11 -15
  26. package/lib/dispatcher/session-events.js +17 -5
  27. package/lib/dispatcher/v-orchestrator.d.ts +42 -9
  28. package/lib/dispatcher/v-orchestrator.js +236 -28
  29. package/lib/domain/config-override.d.ts +38 -0
  30. package/lib/domain/config-override.js +101 -0
  31. package/lib/domain/delivery-contract.d.ts +3 -2
  32. package/lib/domain/delivery-contract.js +28 -16
  33. package/lib/domain/gate-policy.d.ts +26 -0
  34. package/lib/domain/gate-policy.js +44 -0
  35. package/lib/domain/kanban-service.d.ts +16 -3
  36. package/lib/domain/kanban-service.js +41 -6
  37. package/lib/domain/permissions.js +1 -1
  38. package/lib/domain/planning-checklist.d.ts +5 -0
  39. package/lib/domain/planning-checklist.js +80 -6
  40. package/lib/domain/projection.js +2 -1
  41. package/lib/domain/review-evidence.js +1 -1
  42. package/lib/domain/state-machine.js +2 -1
  43. package/lib/domain/types.d.ts +2 -2
  44. package/lib/index.js +19 -21
  45. package/lib/roles/clean-fs-tools.d.ts +22 -0
  46. package/lib/roles/clean-fs-tools.js +118 -0
  47. package/lib/roles/skill-installer.d.ts +6 -0
  48. package/lib/roles/skill-installer.js +32 -0
  49. package/lib/roles/toolsets.d.ts +13 -1
  50. package/lib/roles/toolsets.js +163 -31
  51. package/lib/roles/wiki-worker.d.ts +1 -0
  52. package/lib/roles/wiki-worker.js +10 -2
  53. package/lib/routes/kanban-http.d.ts +5 -2
  54. package/lib/routes/kanban-http.js +36 -3
  55. package/lib/routes/planning-driver.d.ts +3 -1
  56. package/lib/routes/planning-driver.js +10 -6
  57. package/lib/routes/prefix-router.d.ts +16 -0
  58. package/lib/routes/prefix-router.js +37 -2
  59. package/lib/services/config-provider.d.ts +42 -0
  60. package/lib/services/config-provider.js +94 -0
  61. package/lib/services/gate-runner.d.ts +24 -0
  62. package/lib/services/gate-runner.js +87 -0
  63. package/lib/services/kanban-provider.d.ts +5 -1
  64. package/lib/services/kanban-provider.js +40 -2
  65. package/lib/services/llm-catalog.d.ts +35 -0
  66. package/lib/services/llm-catalog.js +19 -0
  67. package/lib/tools/kanban-tools.js +1 -0
  68. package/lib/tools/main-session-tools.d.ts +17 -2
  69. package/lib/tools/main-session-tools.js +88 -21
  70. package/lib/tools/planning-tools.d.ts +4 -0
  71. package/lib/tools/planning-tools.js +39 -12
  72. package/lib/tools/prefetch-tools.js +1 -0
  73. package/lib/tools/spec-card-tools.js +1 -0
  74. package/lib/tools/wiki-tools.js +5 -4
  75. package/lib/wiki/kb-linkage.d.ts +9 -2
  76. package/lib/wiki/kb-linkage.js +3 -3
  77. package/lib/wiki/local-kb-client.d.ts +14 -0
  78. package/lib/wiki/local-kb-client.js +101 -0
  79. package/lib/wiki/local-kb.d.ts +6 -0
  80. package/lib/wiki/local-kb.js +25 -0
  81. package/lib/wiki/memory-recall.d.ts +14 -6
  82. package/lib/wiki/memory-recall.js +17 -13
  83. package/lib/wiki/page-path.d.ts +9 -3
  84. package/lib/wiki/page-path.js +29 -11
  85. package/lib/wiki/wiki-vault-client.d.ts +3 -3
  86. package/lib/wiki/wiki-vault-client.js +6 -6
  87. package/package.json +16 -11
  88. package/personas/kanban-d/preset.yml +1 -1
  89. package/personas/kanban-dt/agent.cordis.yml +2 -2
  90. package/personas/kanban-dt/preset.yml +1 -1
  91. package/personas/kanban-p/agent.cordis.yml +16 -0
  92. package/personas/kanban-p/preset.yml +1 -1
  93. package/personas/kanban-pt/agent.cordis.yml +38 -8
  94. package/personas/kanban-pt/preset.yml +1 -1
  95. package/personas/kanban-w/agent.cordis.yml +35 -16
  96. package/personas/kanban-w/preset.yml +1 -1
  97. package/personas/persona-dt.md +1 -1
  98. package/personas/persona-p.md +4 -1
  99. package/personas/persona-pt.md +13 -6
  100. package/personas/persona-w.md +11 -9
  101. package/skills/grill-me/SKILL.md +71 -0
  102. package/skills/llm-wiki-skill/.mise.toml +2 -0
  103. package/skills/llm-wiki-skill/.nvmrc +1 -0
  104. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  105. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  106. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  107. package/skills/llm-wiki-skill/HERMES.md +44 -0
  108. package/skills/llm-wiki-skill/README.en.md +261 -0
  109. package/skills/llm-wiki-skill/README.md +291 -0
  110. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  111. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  112. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  113. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  114. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  115. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  116. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  117. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  118. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  119. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  120. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  121. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  122. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  123. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  124. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  125. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  126. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  127. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  128. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  129. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  130. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  131. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  132. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  133. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  134. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  135. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  136. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  137. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  138. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  139. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  140. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  141. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  142. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  143. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  144. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  145. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  146. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  147. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  148. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  149. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  150. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  151. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  152. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  153. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  154. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  155. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  156. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  157. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  158. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  159. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  160. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  161. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  162. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  163. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  164. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  165. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  166. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  167. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  168. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  169. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  170. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  171. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  172. package/skills/llm-wiki-skill/install.ps1 +87 -0
  173. package/skills/llm-wiki-skill/install.sh +722 -0
  174. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  175. package/skills/llm-wiki-skill/package.json +24 -0
  176. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  177. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  178. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  179. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  180. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  181. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  182. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  183. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  184. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  185. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  186. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  187. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  188. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  189. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  190. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  191. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  192. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  193. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  194. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  195. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  196. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  197. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  198. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  199. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  200. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  201. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  202. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  203. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  204. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  205. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  206. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  207. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  208. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  209. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  210. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  211. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  295. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  296. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  297. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  298. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  299. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  300. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  301. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  302. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  303. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  304. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  305. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  306. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  307. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  308. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  309. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  310. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  311. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  312. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  313. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  314. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  315. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  316. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  317. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  318. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  319. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  320. package/skills/llm-wiki-skill/setup.sh +8 -0
  321. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  322. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  323. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  324. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  325. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  326. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  327. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  328. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  329. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  330. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  331. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  332. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  333. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  334. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  335. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  336. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  337. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  338. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  339. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  340. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  341. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  342. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  343. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  344. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  345. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  346. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  347. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  348. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  349. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  350. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  351. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  352. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  353. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  354. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  355. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  356. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  357. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  358. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  359. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  360. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  361. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  362. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  363. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  364. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  365. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  366. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  367. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  368. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  369. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  370. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  371. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  372. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  373. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  374. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  375. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  376. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  377. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  378. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  379. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  380. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  381. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  382. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  383. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  384. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  385. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  386. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  387. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  388. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  389. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  390. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  391. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  392. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  393. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  394. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  395. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  396. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  397. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  398. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  399. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  400. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  401. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  402. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  403. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  404. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  405. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  406. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  407. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  408. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  409. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  410. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  411. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  412. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  413. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  414. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  415. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  416. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  417. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  418. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  419. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  420. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  421. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  422. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  423. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  424. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  425. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  426. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  427. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  428. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  429. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  430. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  431. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  432. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  433. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  434. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  435. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  436. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  437. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  438. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  439. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  440. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  441. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  442. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  443. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  444. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  445. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  446. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  447. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  448. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  449. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  450. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  451. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  452. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  453. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  454. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  455. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  456. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  457. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  458. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  459. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  460. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  461. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  462. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  463. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  464. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  465. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  466. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  467. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  468. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  469. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  470. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  471. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  472. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  473. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  474. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  475. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  476. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  477. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  478. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  479. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  480. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  481. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  482. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  483. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  484. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  485. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  486. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  487. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  488. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  489. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  490. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  491. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  492. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  493. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  494. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  495. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  496. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  497. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  498. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  499. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  500. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  501. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  502. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  503. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  504. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  505. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  506. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  507. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  508. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  509. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  510. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  511. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  512. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  526. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  527. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  528. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  529. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  530. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  531. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  532. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  533. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  534. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  535. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  536. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  537. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  538. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  539. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  540. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  541. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  542. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  543. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  544. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  545. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  546. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  547. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  548. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  549. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  550. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  551. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  552. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  553. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  554. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  555. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  556. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  557. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  558. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  559. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  560. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  561. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  562. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  563. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  564. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  565. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  566. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  567. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -0,0 +1,68 @@
1
+ # 结果评审
2
+
3
+ ## 来源包
4
+
5
+ - Brief:`.briefpilot/graph-html-redesign/design-brief.json`
6
+ - DESIGN.md:`.briefpilot/graph-html-redesign/DESIGN.md`
7
+ - 已选策略:东方编辑部 × 数字山水
8
+ - 目标工具:generic
9
+
10
+ ## 评审证据
11
+
12
+ - 证据类型:local_file + screenshot_reference
13
+ - 证据路径:`.briefpilot/graph-html-redesign/oriental-editorial-atlas.html`
14
+ - 视觉证据:`/tmp/oriental-atlas-desktop.png`、`/tmp/oriental-atlas-tablet.png`、`/tmp/oriental-atlas-mobile.png`、`/tmp/oriental-atlas-mobile-lower.png`
15
+ - 摘要:本地 HTML 页面已打开并截图检查。桌面宽度 1440、平板宽度 768、手机宽度 375 均无控制台错误、无横向溢出。页面整体采用米白纸面、墨色文字、朱砂强调、青绿/夜青辅助,包含左侧文献索引、中间图谱、右侧札记详情、搜索、筛选、置信度、状态切换和响应式降级。
16
+
17
+ ## 保留点
18
+
19
+ - 视觉方向基本命中:首屏明显比 demo 更像成熟产品,东方编辑部气质来自文献索引、纸面、朱砂线、札记详情,而不是廉价纹样。
20
+ - 信息结构完整:左侧导航、中间图谱、右侧详情三栏清楚,搜索、社区、学习队列、推荐起点、图例、洞察、相邻节点都有入口。
21
+ - 设计 token 大体遵循 DESIGN.md:米白、墨色、朱砂、青绿、夜青、旧地图线和细边框体系一致。
22
+ - 落地性较好:单文件 HTML,无外部网络资源;图谱、状态面板和交互用 vanilla HTML/CSS/JS 实现。
23
+ - 技术检查通过:桌面、平板、手机截图无横向溢出;控制台无错误。
24
+
25
+ ## 问题
26
+
27
+ | 严重程度 | Brief 依据 | 问题 | 证据 | 建议修改 |
28
+ |---|---|---|---|---|
29
+ | medium | `review-checklist.md`:触控目标至少 44px;`DESIGN.md` Responsive Behavior | 移动端部分按钮高度只有 36px,低于 44px 触控目标。 | 浏览器检查显示 `.segmented button` 和 `.state-button` 在 375px 下高 36px,`空` 按钮宽 34px。 | 将所有移动端交互按钮 `min-height` 调整到 44px;状态按钮在窄屏下用 2x2 或单行横向滚动,不要缩成 34x36。 |
30
+ | medium | `design-brief.json`:首屏要看出“东方编辑部 × 数字山水”;移动端可降级但不能丢主信息 | 手机首屏只看到标题和文献索引,中央图谱和数字山水舞台要下滑很久才出现,移动端第一眼缺少“数字山水”。 | `/tmp/oriental-atlas-mobile.png` 首屏只显示 topbar、搜索、社区和学习队列,未露出图谱。 | 移动端在文献索引上方或标题下方加入一张紧凑“图谱预览卡”,或把主内容顺序改为标题 → 图谱预览 → 文献索引 → 详情。 |
31
+ | low | `DESIGN.md` Components:Node 有 disabled/unavailable、error 状态;Buttons 有 pressed、disabled、error 状态 | 状态覆盖主要集中在 loading/empty/error,按钮和节点的 disabled/unavailable 展示不够明确。 | 源码有 loading/empty/error 和 selected/focus/hover,但未看到清楚的 disabled/unavailable 示例。 | 增加一个不可用节点或不可用来源示例,并补 `.is-disabled` / `[disabled]` 的视觉规则。 |
32
+ | low | `review-checklist.md`:截图/GIF 有记忆点,适合 README | 桌面首屏很稳,但“数字山水”的视觉记忆点仍偏背景层,整体更像东方编辑部而不是混合方向。 | `/tmp/oriental-atlas-desktop.png` 中图谱背景线条克制,山水/星图层次存在但不强。 | 可以适度强化中图的地貌层:增加 1-2 层更有识别度的等高线/星点路径,但保持低对比,不遮挡节点。 |
33
+
34
+ ## 视觉评审
35
+
36
+ - 状态:available_model_image
37
+ - 来源:本地 HTML 截图 `/tmp/oriental-atlas-desktop.png`、`/tmp/oriental-atlas-tablet.png`、`/tmp/oriental-atlas-mobile.png`、`/tmp/oriental-atlas-mobile-lower.png`
38
+ - 说明:已使用截图进行视觉检查。桌面版符合度高;移动端无横向溢出,但首屏策略弱化了图谱主角,部分按钮小于 44px。
39
+
40
+ ## 决定
41
+
42
+ - 决定:tweak
43
+ - 策略是否保留:true
44
+ - 策略变化原因:无需改变策略,问题是局部响应式和状态覆盖不完整。
45
+ - 提示意图:targeted_modification
46
+
47
+ ## 下一轮提示摘要
48
+
49
+ 保留:
50
+
51
+ - 保留米白纸面、墨色文字、朱砂强调、青绿/夜青辅助的视觉系统。
52
+ - 保留左侧文献索引、中间知识舆图、右侧札记详情的桌面三栏结构。
53
+ - 保留状态面板、置信度图例、社区导航、学习队列和推荐起点。
54
+ - 保留无外部依赖、单文件 HTML、vanilla CSS/JS 的落地方式。
55
+
56
+ 修改:
57
+
58
+ - 修正移动端触控目标,所有按钮和可点卡片至少 44px 高,窄按钮至少 44px 宽。
59
+ - 调整移动端内容顺序或增加图谱预览卡,让 375px 首屏能看到“数字山水图谱”的存在。
60
+ - 增加 disabled/unavailable 节点、来源或按钮状态示例。
61
+ - 稍微强化中央图谱的山水/星图视觉记忆点,但不要遮挡节点和边。
62
+
63
+ 验收检查:
64
+
65
+ - 375px 截图首屏能看到标题、关键状态和图谱预览,不只看到文献索引。
66
+ - 所有 `button/input/a` 在移动端可点击区域不小于 44px。
67
+ - 1440、768、375 三档无横向滚动,无控制台错误。
68
+ - loading、empty、error、selected、focus、disabled/unavailable 状态都能被看见或触发。
@@ -0,0 +1,88 @@
1
+ # Graph Interaction Risk Audit
2
+
3
+ 日期:2026-06-16
4
+
5
+ 适用计划:`docs/plans/2026-06-16-graph-six-layer-architecture-phased-plan.md`
6
+
7
+ ## 审计目标
8
+
9
+ 这份审计把本轮图谱重构要覆盖的交互风险集中记录下来。它不是普通 bug list,而是后续每个阶段的验收清单:每个风险都要明确期望行为、owner layer、验证方法和目标阶段。
10
+
11
+ 核心原则:
12
+
13
+ - 图谱拥有自己的交互空间。节点、边、社区色块、空白画布上的滚轮、拖拽、hover、点击、键盘取消都先进入图谱交互链路。
14
+ - 浏览器默认行为只在明确允许的文本、输入、阅读区域发生。
15
+ - 命中、坐标、状态、渲染不能各算各的。
16
+ - 工作台和离线 HTML 是同等目标,不能只修其中一个。
17
+
18
+ ## Owner Layer 约定
19
+
20
+ | Owner layer | 负责范围 |
21
+ |---|---|
22
+ | GraphGestures | 原始 pointer、wheel、keyboard、touch 事件;点击/拖拽/缩放意图;阻止浏览器默认行为 |
23
+ | SpatialIndex / GraphLayout | 节点、边、社区色块、空白图谱区域命中;布局边界;社区色块软边界 |
24
+ | GraphViewport | 世界坐标、屏幕坐标、小地图坐标转换;相机缩放、平移、fit、resize anchor |
25
+ | GraphState | hover、selection、active drag、pins、positions、viewport 等图谱运行状态 |
26
+ | GraphRenderer | 节点、边、社区色块、小地图、hover 卡片、工具栏、离线 reader 的绘制 |
27
+ | GraphFacade | workbench/offline 公开 API、宿主回调、持久化 pin、抽屉/选择语义协调 |
28
+
29
+ ## 风险矩阵
30
+
31
+ | 风险 | 期望行为 | Owner layer | 验证方法 | 目标阶段 |
32
+ |---|---|---|---|---|
33
+ | Trackpad wheel 在图谱内被页面滚动或页面缩放抢走 | 鼠标或触控板停在节点、边、社区色块、空白画布上时,wheel 都只改变图谱相机;页面尺寸、页面滚动位置和浏览器缩放不变 | GraphGestures + GraphViewport | Node test 覆盖 wheel target policy;workbench/offline browser 脚本记录 transform 变化、root scroll、页面 viewport 指标 | Phase 2 |
34
+ | `ctrl/meta + wheel` 触发浏览器页面缩放 | 图谱拥有的 surface 内,pinch-like wheel 被图谱接管;输入框、阅读正文等 blocker 内不接管 | GraphGestures | Browser 脚本 dispatch cancelable wheel,记录 `visualViewport.scale`、`devicePixelRatio`、clientWidth 和 graph transform | Phase 2 |
35
+ | 鼠标在节点上滚轮不能缩放 | 节点命中优先,但节点上的 wheel 仍走 graph zoom,不因为节点可点击/可拖拽而阻断缩放 | GraphGestures + SpatialIndex | `gestures.test.ts` 覆盖 node target wheel;workbench/offline 真实节点上滚轮验证 transform 改变 | Phase 2 |
36
+ | 鼠标在社区色块上滚轮不能缩放 | 社区色块可点击选择整个社区,但 wheel 仍走 graph zoom;点击和滚轮互不抢语义 | GraphGestures + SpatialIndex | `gestures.test.ts` 覆盖 community target wheel;community wash browser regression | Phase 2 |
37
+ | 空白拖动画布时选中工具栏或页面文字 | active pan/drag 期间禁止 native selection;结束或取消后清理锁定状态 | GraphGestures + GraphRenderer | Browser 脚本拖动画布后断言 `window.getSelection().toString()` 为空、toolbar/search 文本未被选中、root dataset 无 stuck active | Phase 2 |
38
+ | 原生 drag selection 或页面 scroll 泄漏进图谱 | 图谱 owned surface 在 active gesture 期间阻止默认拖选、滚动和 scroll chaining;root scroll 被复位 | GraphGestures | Browser 脚本拖拽空白、拖节点、拖社区色块,检查 root scroll、document selection、body scroll | Phase 2 |
39
+ | 快速松开节点后节点回到原位 | drag end intent 必须带最终 pointer 坐标;即使最后一帧 move 没来得及提交,release 坐标也会提交成 pin | GraphGestures + GraphViewport + GraphState + GraphFacade | State machine test 覆盖 final screen point;browser 脚本快速 mouse down/move/up,检查节点位置和 pinned 状态 | Phase 2 |
40
+ | 节点拖拽不跟手或跳到别处 | 拖拽以 grabbed offset 为基准,屏幕点经 GraphViewport 反投影;节点中心不突然吸到鼠标中心,也不使用旧坐标公式 | GraphViewport + GraphState + GraphFacade | `simulation-bridge.test.ts` 覆盖 offset;browser 脚本记录 pointer 与节点中心距离上限 | Phase 3 |
41
+ | 节点被社区色块或固定世界尺寸锁住 | 社区色块是软视觉区域;节点可拖出色块;世界 bounds 由布局和 pin/outlier 推导,不用 `1000x680` 当硬笼子 | GraphLayout + GraphViewport | render model/community wash tests;community wash browser regression 拖出初始 wash 并检查 pin | Phase 3 / Phase 6 |
42
+ | 社区色块无限追随远处离群节点 | 色块可受拖出节点影响,但有上限;不会变成覆盖全屏的巨大色块;社区成员关系不因拖拽改变 | GraphLayout + GraphRenderer | `community-wash.test.ts` 覆盖 outlier cap;browser 脚本检查 wash 大小上限和成员稳定 | Phase 6 |
43
+ | 点击社区和拖动社区阈值冲突 | 小位移点击选中社区并打开选区语义;超过阈值不触发社区点击,也不误启动节点拖拽 | GraphGestures + SpatialIndex | `gestures.test.ts` 覆盖 community move cancel;browser 脚本 move past threshold 后 visible nodes 不变 | Phase 2 / Phase 6 |
44
+ | DOM stacking order 改变后命中不同 | 节点命中优先于边和社区;社区优先于空白;命中来源是 SpatialIndex,不是 `elementFromPoint` 或 DOM 层级 | SpatialIndex / GraphLayout + GraphGestures | 新增 `spatial-index.test.ts`,构造重叠节点/边/社区并打乱 DOM 顺序;renderer boundary test 禁止旧 DOM hit owner | Phase 1 / Phase 7 |
45
+ | Hover 简介位置漂移 | hover anchor 来自节点/边的世界坐标,经 GraphViewport 投影;zoom、pan、drag、resize、drawer open 后重新计算 | GraphViewport + GraphState + GraphRenderer | `overlays.test.ts` 扩展投影;workbench/offline browser 测 preview 和 anchor gap、viewport 内不溢出 | Phase 3 |
46
+ | Hover 卡片与节点不同步 | hover 状态存于 GraphState,Renderer 只绘制;节点位置更新后卡片 anchor 跟随同一状态快照 | GraphState + GraphRenderer | Browser 脚本在拖拽后 hover,记录卡片相对节点距离;state test 覆盖 hover snapshot | Phase 3 |
47
+ | Search 输入框边界误接管 | search 内 wheel、pointer、keyboard 不触发图谱 zoom/pan/shortcut;离开 search 后恢复图谱控制 | GraphGestures + GraphFacade | `gestures.test.ts` blocker 覆盖 search;browser 脚本打开 search 后滚轮不改变图谱 transform | Phase 2 |
48
+ | Toolbar/legend 边界误接管 | 工具栏和图例作为图谱控件:点击按控件语义走;wheel/pointer 不误触发画布 pan;空白点击可关闭 popover | GraphGestures + GraphRenderer | toolbar state tests;browser 脚本覆盖 toolbar panel、legend row、blank close | Phase 2 |
49
+ | Minimap 边界误接管 | minimap 有自己的点击/导航语义;不被 blank pan 或 graph wheel 错认;minimap 投影只走 GraphViewport | GraphGestures + GraphViewport + GraphRenderer | viewport minimap tests;browser 脚本 wheel over minimap 不 zoom graph,minimap click/viewport rect 稳定 | Phase 3 |
50
+ | Drawer/reader 边界误接管 | workbench drawer 和 offline reader 内允许文本阅读/滚动/按钮;不触发 graph drag/zoom;图谱 anchor 不因 drawer resize 漂移 | GraphGestures + GraphFacade + GraphViewport | Browser 脚本 drawer wheel 不 zoom graph,drawer resize 后选中节点保持可见且 hover 不溢出 | Phase 2 / Phase 3 |
51
+ | 数据刷新时正在拖拽 | active drag 期间 diff queue 暂存或合并;释放后以最终 pin/position 重建 layout 和 SpatialIndex,不用旧 snapshot 覆盖用户拖拽 | GraphState + GraphFacade + GraphLayout | GraphDiffQueue tests 已有基础,扩展 active drag release 后 replay;browser 可用 mock refresh 验证无回弹 | Phase 3 |
52
+ | Pointer cancel / lost pointer capture 后状态卡住 | 取消事件只清理 active gesture,不误提交 click/pin;root dataset、cursor、selection lock 都恢复 | GraphGestures + GraphState | `gestures.test.ts` 已覆盖基础,扩展 DOM cleanup;browser 脚本 dispatch pointercancel/lostpointercapture 后继续可操作 | Phase 2 |
53
+ | Escape 行为混乱 | active drag/pan 优先取消当前手势;无 active gesture 时清理 hover/selection/drawer/search,具体语义由 GraphFacade 统一 | GraphGestures + GraphFacade + GraphState | State machine test;workbench/offline browser 脚本覆盖 drawer、selection、search、active drag | Phase 2 / Phase 4 |
54
+ | 键盘快捷键抢输入框 | search、drawer、text-control 内的 Tab/Enter/Space/Arrow/plus/minus/zero 不触发图谱快捷键;图谱 focus 内才响应 | GraphGestures + GraphFacade | gestures blocker tests;browser 脚本聚焦 search/drawer 按键验证不改变 graph transform/selection | Phase 2 |
55
+ | Graph focus 不明确 | 点击/Tab 进入图谱后键盘归图谱;离开图谱或进入文本控件后键盘归宿主/浏览器 | GraphGestures + GraphFacade | Browser 脚本检查 focus ring、keyboard commands only under graph focus | Phase 4 |
56
+ | Touch 一指拖动画布和拖节点不稳定 | 支持 pointer events 的触摸:一指空白 pan、一指节点 drag;pointercancel 清理;没有复杂多指编辑时提供按钮 fallback | GraphGestures + GraphViewport | Browser 脚本模拟 pointerType touch;Node state machine test 覆盖 touch-like pointer sequence | Phase 2 |
57
+ | 双击或连续点击语义散落 | 双击 fit/reset 或其他图谱命令必须由 GraphGestures 发 intent,Renderer 不直接绑定 root dblclick | GraphGestures + GraphFacade | Final cleanup `rg` 检查 static-renderer 不再绑定 root dblclick;browser 脚本覆盖 reset/fit | Phase 5 / Phase 7 |
58
+ | 旧 renderer 继续偷偷拥有交互 | `static-renderer.ts` 终态只能是 composition/compat shell;不能保留 root wheel/pointer/dblclick/keydown/hit-test/coordinate owner | GraphFacade + GraphRenderer | Final cleanup `rg` 检查;renderer-boundary test 用 runtime contract 防止换文件名复发 | Phase 5 / Phase 7 |
59
+ | Workbench 与离线 HTML 行为分叉 | graph-engine 内的行为同源;workbench 只负责宿主抽屉和能力,offline 只负责离线 reader;核心交互测试两端都跑 | GraphFacade | `tests/graph-workbench-interactions.regression-1.sh` 和 `tests/graph-offline-phase-6.regression-1.sh` 同时通过 | Phase 7 |
60
+
61
+ ## 当前覆盖与缺口
62
+
63
+ 已有覆盖:
64
+
65
+ - `packages/graph-engine/test/gestures.test.ts` 已覆盖基础 target 分类、节点拖拽、社区点击取消、空白 pan、pointer cancel、Escape。
66
+ - `packages/graph-engine/test/viewport.test.ts` 已覆盖 zoom/pan/fit/minimap/resize anchor。
67
+ - `packages/graph-engine/test/simulation-bridge.test.ts` 已覆盖 dragged point under pointer 和 off-world drag 不被投影层 clamp。
68
+ - `packages/graph-engine/test/community-wash.test.ts` 与 `render-model.test.ts` 已覆盖社区色块 outlier cap、拖出后成员稳定。
69
+ - `tests/browser/graph-workbench-interactions.mjs`、`graph-offline-phase-6.mjs`、`graph-community-wash-interactions.mjs` 已有真实浏览器检查基础。
70
+
71
+ 必须补齐:
72
+
73
+ - SpatialIndex 作为真实命中来源,而不是 DOM target 的接口包装。
74
+ - 图谱内 `ctrl/meta + wheel` 和 trackpad pinch-like wheel 不改变浏览器页面 zoom 的浏览器证据。
75
+ - 空白 pan、节点 drag 后无 native text selection 的浏览器证据。
76
+ - 快速 release 用最终 pointer 坐标提交 pin 的浏览器证据。
77
+ - hover preview 在 drag、zoom、pan、drawer resize 后仍锚定节点/边的浏览器证据。
78
+ - renderer boundary 检查,防止旧 `static-renderer.ts` 或新 renderer 文件重新接管交互。
79
+
80
+ ## 阶段入口条件
81
+
82
+ Phase 1 之前必须满足:
83
+
84
+ - 本审计文档已提交。
85
+ - 进度账本记录 Phase 0 task 0.2 的验证和提交号。
86
+ - 不开始行为改动,直到 task 0.3 把现有测试与缺口映射到目标阶段。
87
+
88
+ 后续每阶段完成时,progress 文件必须把本审计中的相关风险标成已有验证证据,不能只写“实现完成”。
@@ -0,0 +1,212 @@
1
+ # Graph Interaction Test Coverage Map
2
+
3
+ 日期:2026-06-16
4
+
5
+ 适用计划:`docs/plans/2026-06-16-graph-six-layer-architecture-phased-plan.md`
6
+
7
+ 前置审计:`docs/graph/2026-06-16-interaction-risk-audit.md`
8
+
9
+ ## 目标
10
+
11
+ 这份文档把交互风险映射到现有测试、缺口测试和后续阶段。它用于防止后续重构只移动代码、不建立保护网。
12
+
13
+ 判定规则:
14
+
15
+ - `Covered`:已有单元测试或浏览器脚本能直接防住该风险。
16
+ - `Partial`:已有测试覆盖了核心数学或状态,但没有覆盖真实浏览器行为或最终架构边界。
17
+ - `Missing`:当前没有明确测试,必须在目标阶段新增。
18
+
19
+ ## 覆盖总览
20
+
21
+ | 风险组 | 当前状态 | 已有保护 | 必补保护 | 目标阶段 |
22
+ |---|---|---|---|---|
23
+ | 节点/边/社区/空白 wheel zoom | Partial | `gestures.test.ts` target policy;`graph-workbench-interactions.mjs` 和 `graph-offline-phase-6.mjs` 覆盖部分 wheel target | trackpad-like wheel、`ctrl/meta + wheel` 不触发页面 zoom 的浏览器证据 | Phase 2 |
24
+ | 浏览器默认行为隔离 | Missing | root scroll reset 有部分浏览器检查 | native selection、body scroll、root scroll、browser zoom 指标统一记录 | Phase 2 |
25
+ | 点击/拖拽状态机 | Partial | `gestures.test.ts` 覆盖阈值、cancel、Escape;`simulation-bridge.test.ts` 覆盖 grabbed offset | 快速 release 用 final pointer 坐标提交 pin 的浏览器证据 | Phase 2 |
26
+ | SpatialIndex 命中 | Missing | 现有 target classifier 不依赖 DOM mock,但仍不是真实空间命中 | 新增 `spatial-index.test.ts`,覆盖节点、边、社区、空白、重叠优先级、旧世界外命中 | Phase 1 |
27
+ | 坐标和相机 | Partial | `geometry.test.ts`、`viewport.test.ts`、`simulation-bridge.test.ts`、`overlays.test.ts` | layout-driven world bounds、drawer resize 后 hover/selection anchor 的浏览器证据 | Phase 3 |
28
+ | 图谱运行状态 | Partial | `runtime-state.test.ts`、`queue.test.ts` 覆盖基础状态和 diff queue | 数据刷新期间 active drag 的最终 pin 不被 stale snapshot 覆盖 | Phase 3 |
29
+ | 社区色块软边界 | Partial | `community-wash.test.ts`、`render-model.test.ts`、`graph-community-wash-interactions.mjs` | SpatialIndex priority 接管社区命中;expanded bounds 下 cap 不无限放大 | Phase 6 |
30
+ | 工具栏/search/legend/minimap/drawer 边界 | Partial | `gestures.test.ts` blocker policy;toolbar tests;workbench/offline browser 覆盖部分 UI | keyboard focus、wheel blocker、pointer blocker、drawer resize anchor 的一组统一回归 | Phase 2 / Phase 3 |
31
+ | hover preview anchor | Partial | `overlays.test.ts` 和 browser hover checks | zoom、pan、drag、drawer resize、community focus 后统一 anchor gap 证据 | Phase 3 |
32
+ | keyboard/touch | Missing | Escape 基础 state machine 覆盖 | graph focus 内快捷键、text-control blocker、touch-like pointer sequence | Phase 2 / Phase 4 |
33
+ | renderer 旧责任清理 | Missing | 计划内 `rg` 命令尚未转成阶段测试 | renderer boundary test + final cleanup `rg`,禁止 root interaction 和 coordinate owner 回到 renderer | Phase 5 / Phase 7 |
34
+ | workbench/offline parity | Partial | `graph-workbench-interactions.mjs`、`graph-offline-phase-6.mjs`、`graph-community-wash-interactions.mjs` | 每个核心交互在两端都留下证据 artifact | Phase 7 |
35
+
36
+ ## 现有测试归位
37
+
38
+ ### GraphGestures
39
+
40
+ 已有:
41
+
42
+ - `packages/graph-engine/test/gestures.test.ts`
43
+ - graph target 分类:blank、node、community wash、edge、minimap、toolbar、search、legend、drawer、text-control。
44
+ - wheel target policy:blank/node/community/edge 可 zoom;controls/drawer/minimap/text-control 阻断。
45
+ - pointerdown target policy:node drag、community click、blank pan、controls blocker。
46
+ - gesture state machine:node click、node drag、community click cancel、blank pan、pointercancel、lostpointercapture、Escape。
47
+
48
+ 缺口:
49
+
50
+ - 当前 `ctrl/meta + wheel` 在单元测试里是 blocked,但本轮设计要求 graph-owned surface 内必须阻止浏览器页面 zoom 并转为图谱意图;Phase 2 必须重做该策略并补浏览器证据。
51
+ - 缺 touch-like pointer sequence。
52
+ - 缺 keyboard focus 和 text-control blocker 的真实浏览器证据。
53
+ - 缺 active gesture 期间 native selection 清理证据。
54
+
55
+ ### GraphViewport / Geometry
56
+
57
+ 已有:
58
+
59
+ - `packages/graph-engine/test/geometry.test.ts`
60
+ - world/screen round trip。
61
+ - drawer-style resize 后 layer point round trip。
62
+ - minimap projection。
63
+ - 不在投影 helper 内静默 clamp。
64
+ - `packages/graph-engine/test/viewport.test.ts`
65
+ - wheel zoom around pointer。
66
+ - pan、fit、center、resize anchor、minimap rect、frame commit coalescing。
67
+ - `packages/graph-engine/test/simulation-bridge.test.ts`
68
+ - grabbed point stays under pointer。
69
+ - drag start 不跳到 pointer center。
70
+ - off-world drag 不在 projection/bridge 层 clamp。
71
+ - `packages/graph-engine/test/overlays.test.ts`
72
+ - node/edge hover anchor 使用投影点。
73
+ - preview card stay inside viewport。
74
+
75
+ 缺口:
76
+
77
+ - GraphViewport 还需要接入 layout-driven world bounds,不再让固定世界尺寸决定拖拽范围。
78
+ - Browser 需要证明 zoom、pan、drag、drawer resize 后 hover preview 仍与节点/边锚定。
79
+ - Minimap 点击和当前 viewport rect 需要在新 world bounds 下验证。
80
+
81
+ ### GraphState / Diff Queue
82
+
83
+ 已有:
84
+
85
+ - `packages/graph-engine/test/runtime-state.test.ts`
86
+ - viewport、hover、selection、focus、pins、positions、active gesture 一处更新。
87
+ - simulation proposal 不直接变成 committed positions。
88
+ - snapshot clone 防止外部改 hidden state。
89
+ - `packages/graph-engine/test/queue.test.ts`
90
+ - graph hidden 时 diff queue 合并。
91
+ - drag 期间 hold diff,释放后 consume。
92
+
93
+ 缺口:
94
+
95
+ - active drag release 同时遇到 data refresh 时,最终 release position 必须优先于 stale replay。
96
+ - GraphState 与 GraphFacade 之间需要一个明确的 commit path 测试,证明 fast release 不回弹。
97
+
98
+ ### GraphLayout / Community Wash
99
+
100
+ 已有:
101
+
102
+ - `packages/graph-engine/test/community-wash.test.ts`
103
+ - small communities remain selectable。
104
+ - dragged outlier influences wash but does not chase it without cap。
105
+ - multi-direction outlier cap。
106
+ - `packages/graph-engine/test/render-model.test.ts`
107
+ - pinned member outside wash cap 时 community membership 稳定。
108
+ - member dragged beyond cap 后 community focus 稳定。
109
+ - `tests/browser/graph-community-wash-interactions.mjs`
110
+ - community wash 上 wheel zoom。
111
+ - 点击 community wash 进入社区。
112
+ - 超过阈值移动取消 community click。
113
+ - 节点可以拖出初始 wash 并提交 pin。
114
+
115
+ 缺口:
116
+
117
+ - SpatialIndex 接管后,community hit 不能再依赖 DOM stacking。
118
+ - expanded layout bounds 下,wash cap 仍然不能无限扩张。
119
+ - 节点拖出 wash 后,wash soft-boundary 更新要和 membership 稳定同时验证。
120
+
121
+ ### GraphRenderer / Boundary
122
+
123
+ 已有:
124
+
125
+ - `packages/graph-engine/test/render-model.test.ts`
126
+ - renderable graph、selected state、density、community focus、pinned positions。
127
+ - `packages/graph-engine/test/toolbar.test.ts`
128
+ - toolbar panel state 和 blank click close。
129
+ - `packages/graph-engine/test/search-and-legend.test.ts`
130
+ - search helpers 和 legend selection。
131
+ - `tests/browser/graph-stage-4-5.mjs`
132
+ - 旧阶段的 wheel、selection、drawer、hover、edge preview、responsive checks。
133
+
134
+ 缺口:
135
+
136
+ - 缺 renderer boundary test:Renderer 不能直接拥有 root wheel/pointer/dblclick/keydown。
137
+ - 缺 final `rg` 检查转成可重复的测试证据。
138
+ - 缺 DOM order 改变但 SpatialIndex 命中不变的测试。
139
+
140
+ ### Workbench / Offline
141
+
142
+ 已有:
143
+
144
+ - `tests/browser/graph-workbench-interactions.mjs`
145
+ - workbench desktop/narrow、wheel targets、blocker targets、hover、drawer resize、community drag、pan/minimap reset。
146
+ - `tests/browser/graph-offline-phase-6.mjs`
147
+ - offline hover、drag under pointer、selection panel、reader boundary、root scroll 等。
148
+ - `tests/browser/graph-community-wash-interactions.mjs`
149
+ - offline community wash 专项。
150
+
151
+ 缺口:
152
+
153
+ - 两端都需要记录页面 zoom 没有变化。
154
+ - 两端都需要记录 native selection 没有泄漏。
155
+ - 两端都需要记录快速 release 后 pin 位置稳定。
156
+ - 两端都需要记录 pointercancel/lostpointercapture 后不留下 stuck state。
157
+
158
+ ## 必须新增或扩展的测试
159
+
160
+ | 测试文件 | 类型 | 覆盖内容 | 目标阶段 |
161
+ |---|---|---|---|
162
+ | `packages/graph-engine/test/spatial-index.test.ts` | Node unit | node/edge/community/blank hit;overlap priority;out-of-old-world hit;DOM order independent fixtures | Phase 1 |
163
+ | `packages/graph-engine/test/gestures.test.ts` | Node unit | graph-owned `ctrl/meta + wheel` policy;touch-like pointer sequence;keyboard focus blocker contract | Phase 2 |
164
+ | `tests/browser/graph-workbench-interactions.mjs` | Browser | graph-owned wheel does not zoom page;native selection stays empty;fast release pin persists;pointercancel cleanup | Phase 2 |
165
+ | `tests/browser/graph-offline-phase-6.mjs` | Browser | same as workbench for offline HTML | Phase 2 / Phase 7 |
166
+ | `packages/graph-engine/test/runtime-state.test.ts` | Node unit | data refresh while dragging keeps final release position | Phase 3 |
167
+ | `packages/graph-engine/test/viewport.test.ts` | Node unit | layout-driven world bounds; minimap and fit under expanded bounds | Phase 3 |
168
+ | `packages/graph-engine/test/overlays.test.ts` | Node unit | hover anchor after viewport resize, zoom, pan, and dragged node update | Phase 3 |
169
+ | `packages/graph-engine/test/facade.test.ts` | Node unit | facade is the only host callback owner; workbench/offline capability contract remains compatible | Phase 4 |
170
+ | `packages/graph-engine/test/renderer-boundary.test.ts` | Node unit / static check | renderer modules do not bind root graph events or perform graph hit testing | Phase 5 / Phase 7 |
171
+ | `tests/browser/graph-community-wash-interactions.mjs` | Browser | SpatialIndex node > community > blank priority; wash cap under expanded bounds | Phase 6 |
172
+
173
+ ## Phase Gate Mapping
174
+
175
+ Phase 1 can pass only when:
176
+
177
+ - SpatialIndex exists as a real hit-testing source.
178
+ - `spatial-index.test.ts` covers nodes, edges, communities, blank, overlap priority, old-world outliers.
179
+
180
+ Phase 2 can pass only when:
181
+
182
+ - Node tests cover graph-owned wheel/pointer/key policy.
183
+ - Workbench and offline browser tests prove graph-owned wheel does not change page zoom.
184
+ - Workbench and offline browser tests prove native selection does not leak during graph gestures.
185
+ - Fast release drag persists the final position.
186
+
187
+ Phase 3 can pass only when:
188
+
189
+ - GraphViewport owns all coordinate conversion under drag, hover, resize, minimap, fit.
190
+ - Layout-driven bounds replace fixed world-size drag cage.
191
+ - Data refresh while dragging cannot overwrite final user intent.
192
+
193
+ Phase 4 can pass only when:
194
+
195
+ - GraphFacade owns host coordination.
196
+ - Workbench and offline use the same graph-engine capability contract.
197
+
198
+ Phase 5 can pass only when:
199
+
200
+ - Renderer modules draw from snapshots and do not decide interaction meaning.
201
+ - `static-renderer.ts` is reduced to compatibility/composition responsibilities.
202
+
203
+ Phase 6 can pass only when:
204
+
205
+ - Community wash remains soft, capped, and non-blocking.
206
+ - SpatialIndex priority drives node/community/blank behavior.
207
+
208
+ Phase 7 can pass only when:
209
+
210
+ - Full command set passes.
211
+ - Browser artifacts exist for workbench, narrow, and offline paths.
212
+ - Static cleanup checks show old renderer-owned interaction paths are gone.
@@ -0,0 +1,86 @@
1
+ # Phase 0.2 Existing Graph Baseline
2
+
3
+ Date: 2026-06-18
4
+ Branch: `codex/large-graph-performance-experience`
5
+ Task: `0.2`
6
+
7
+ ## Scope
8
+
9
+ This report captures the current graph behavior and performance baseline before changing graph behavior for the large-graph performance plan.
10
+
11
+ ## Verification
12
+
13
+ | Check | Result | Evidence |
14
+ |---|---:|---|
15
+ | Graph engine test | Pass | `npm run test --workspace=@llm-wiki/graph-engine`: 274 tests, 58 suites, 0 failures |
16
+ | Graph engine typecheck | Pass | `npm run typecheck --workspace=@llm-wiki/graph-engine` |
17
+ | Graph engine build | Pass | `npm run build --workspace=@llm-wiki/graph-engine` |
18
+ | Workbench web test | Pass | `npm run test --workspace=@llm-wiki-agent/web`: 29 tests, 12 suites, 0 failures |
19
+ | Workbench web typecheck | Pass | `npm run typecheck --workspace=@llm-wiki-agent/web` |
20
+ | Stage 4.5 offline browser regression | Pass | `GRAPH_STAGE_4_5_CHROME_EXECUTABLE=<Playwright Chromium> bash tests/graph-browser-stage-4-5.regression-1.sh --target offline` |
21
+
22
+ ## Browser Artifact
23
+
24
+ Dense wheel artifact:
25
+
26
+ - JSON: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json`
27
+ - Screenshot: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png`
28
+ - Navigation screenshot: `docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png`
29
+
30
+ Recorded sample:
31
+
32
+ | Viewport | Duration | Frames | Idle FPS | Wheel FPS | Minimum FPS | Transform changed |
33
+ |---|---:|---:|---:|---:|---:|---|
34
+ | 1440x960 | 3004 ms | 157 | 13.6 | 52.3 | 12.0 | true |
35
+
36
+ Important limitation: the current dense fixture has 200 nodes and 231 edges. This is useful as a regression baseline, but it does not prove 1000, 5000, or 10000 node smoothness.
37
+
38
+ ## Current Rendering Behavior
39
+
40
+ - The current graph renderer is DOM/SVG.
41
+ - Nodes are DOM `button` elements in a node layer.
42
+ - Edges are SVG `path` elements in an edge layer.
43
+ - Community washes are SVG ellipses.
44
+ - Pan and zoom are applied through one content-layer transform.
45
+ - Motion frames update node positions, edge paths, community wash geometry, and minimap points.
46
+ - Search, type filters, community hover, node selection, reader state, and selection panels are all currently coupled to the same DOM/SVG renderer path.
47
+
48
+ ## Current Interaction Semantics
49
+
50
+ The current behavior remains the pre-new-design behavior:
51
+
52
+ - Plain node click opens the reader-style node detail state.
53
+ - Shift-click builds a multi-node selection.
54
+ - Community legend click selects/focuses community nodes.
55
+ - Blank double-click fits the graph.
56
+ - Escape closes reader/selection state and clears graph highlights.
57
+ - Offline graph uses an in-graph reader panel; workbench graph opens the right drawer.
58
+
59
+ This is intentionally recorded as baseline behavior, not as the desired final interaction model.
60
+
61
+ ## Baseline Bottleneck Class
62
+
63
+ The obvious large-graph risk is DOM/SVG update volume.
64
+
65
+ Reasons:
66
+
67
+ - Every visible node is a live DOM element.
68
+ - Every visible edge is a live SVG path.
69
+ - Rebuild/paint replaces the graph root and remounts controls.
70
+ - Motion frames recompute renderable graph state and update many DOM/SVG attributes.
71
+ - Hover, search, filter, community emphasis, and selection use DOM state/class updates across visible graph elements.
72
+
73
+ For small and medium scoped views, this is still appropriate. For 5000+ or 10000+ global views, the likely bottleneck is not one single function; it is the total cost of DOM node count, SVG path count, repeated attribute/class writes, and full repaint/remount paths.
74
+
75
+ ## Test Harness Note
76
+
77
+ The first run of `tests/graph-browser-stage-4-5.regression-1.sh --target offline` exposed two harness issues:
78
+
79
+ - Playwright's normal click waited indefinitely for the offline theme button to become stable even though the button was visible, stationary, and not covered.
80
+ - The script's default system Chrome path failed in this environment during launch/cleanup. Installing Playwright Chromium and setting `GRAPH_STAGE_4_5_CHROME_EXECUTABLE` to the Playwright browser path produced a passing run.
81
+
82
+ The theme-button step was adjusted in the test harness to use forced click for this specific control. Product behavior was not changed.
83
+
84
+ ## Next Baseline Gap
85
+
86
+ Phase 1 must add deterministic 1000, 5000, 10000, oversized-community, many-small-communities, many-search-hits, and many-Pin fixtures. Until those measurements exist, this report should be treated as the current small/dense-fixture baseline only.
@@ -0,0 +1,85 @@
1
+ # Phase 1.3 DOM/SVG Large Graph Baseline
2
+
3
+ Date: 2026-06-18
4
+ Branch: `codex/large-graph-performance-experience`
5
+ Task: `1.3`
6
+ Renderer: current DOM/SVG
7
+
8
+ ## Scope
9
+
10
+ This report summarizes the current DOM/SVG renderer against the generated large-graph performance fixtures. It does not choose the final renderer route. It turns the raw runner output into provisional thresholds for the next phases.
11
+
12
+ ## Commands
13
+
14
+ - `git log --oneline -15`
15
+ - `npm run test --workspace=@llm-wiki/graph-engine`
16
+ - `GRAPH_LARGE_PERF_ARTIFACT_DIR=/tmp/llm-wiki-graph-large-perf-task-1-3 bash tests/graph-browser-large-performance.regression-1.sh`
17
+
18
+ ## Artifact
19
+
20
+ Machine-readable result:
21
+
22
+ - `/tmp/llm-wiki-graph-large-perf-task-1-3/large-graph-performance-results.json`
23
+
24
+ The artifact contains 47 fixed-schema records across 5 graph shapes.
25
+
26
+ ## Result Table
27
+
28
+ | Shape | Nodes | Edges | DOM nodes | Initial | Wheel | Pan | Hover | Search | Click | Drawer | Community | Return | Cycle |
29
+ |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
30
+ | nodes-1000-sparse | 1000 | 1400 | 7249 | pass (900.4 ms) | pass (1016.8 ms, 60 FPS) | pass (130.5 ms) | pass (65.1 ms) | pass (189.2 ms) | pass (452.8 ms) | pass (857.1 ms) | pass (3122.9 ms) | pass (1389.1 ms) |
31
+ | nodes-1000-dense | 1000 | 12000 | 7249 | pass (1008.4 ms) | pass (1007.2 ms, 59.6 FPS) | pass (129.2 ms) | pass (57.2 ms) | pass (205.2 ms) | pass (519.8 ms) | pass (867.9 ms) | pass (3279.1 ms) | pass (1432 ms) |
32
+ | nodes-5000-sparse | 5000 | 6500 | 27399 | pass (4615.6 ms) | pass (1013.5 ms, 51.3 FPS) | pass (142.5 ms) | pass (145 ms) | pass (942.2 ms) | pass (2488.8 ms) | pass (5229.1 ms) | pass (4022.2 ms) | not run |
33
+ | nodes-10000-aggregation | 10000 | 14000 | 52649 | pass (8836 ms) | pass (1004.9 ms, 36.8 FPS) | fail:timeout (-) | pass (3784.6 ms) | fail:timeout (-) | pass (4390.7 ms) | pass (13895.1 ms) | pass (4387 ms) | not run |
34
+ | oversized-community | 3000 | 7000 | 17224 | pass (15788.6 ms) | pass (1005 ms, 12.9 FPS) | pass (247 ms) | pass (131.5 ms) | pass (3342.5 ms) | pass (8498.3 ms) | pass (27055.3 ms) | pass (9611.6 ms) | not run |
35
+
36
+
37
+ ## Recorded Failures
38
+
39
+ - nodes-10000-aggregation / pan: timeout
40
+ - nodes-10000-aggregation / node_click: timeout
41
+
42
+ ## Bottleneck Class
43
+
44
+ The primary bottleneck class is DOM/SVG update volume. The evidence is structural and measured:
45
+
46
+ - 1000-node global view creates about 7,249 DOM nodes and remains mostly responsive.
47
+ - 5000-node global view creates about 27,399 DOM nodes; it still completes the key actions, but initial render and community entry move into multi-second territory.
48
+ - 10000-node global view creates about 52,649 DOM nodes. In this run, pan and node click timed out, while drawer open and community entry were already multi-second actions in the prior 1.2 run.
49
+ - Oversized community keeps 3000 nodes present and creates about 17,224 DOM nodes; community entry exposes 1800 nodes, which is too large for a card-heavy reading surface.
50
+
51
+ Secondary bottlenecks are interaction-state churn and community focus expansion. Search itself is still comparatively cheap, but click-to-reader, drawer open, enter-community, and return-global become slow because they update many DOM/SVG elements and remount or restyle large visible sets.
52
+
53
+ ## Provisional Thresholds
54
+
55
+ These thresholds are intentionally provisional. They are gates for Phase 4/6 comparison, not final product promises.
56
+
57
+ | Metric | Provisional pass threshold | Notes |
58
+ |---|---:|---|
59
+ | Initial render, 1000 nodes | <= 1500 ms | Current 1000 sparse/dense passed. |
60
+ | Initial render, 5000 nodes | <= 5000 ms | Current 5000 sparse passed but is close enough to watch. |
61
+ | Initial render, 10000 nodes | <= 8000 ms | Current 10000 exceeded this; global path needs degradation or another renderer. |
62
+ | Wheel zoom | >= 30 FPS and p95 <= 35 ms | 1000 and 5000 passed; low FPS is a failure class. |
63
+ | Pan | <= 300 ms or explicit failure class | 10000 timed out in this run. |
64
+ | Hover | <= 500 ms | All measured shapes passed here. |
65
+ | Search highlight | <= 500 ms | Current search is not the first bottleneck. |
66
+ | Node click | <= 800 ms for 1000, <= 1500 ms for 5000, <= 2000 ms for 10000 | 10000 timed out in this run. |
67
+ | Drawer open | <= 1000 ms for 1000, <= 2500 ms for 5000, <= 3000 ms for 10000 | Prior 1.2 result showed 10000 drawer open can reach 7600 ms. |
68
+ | Enter community | <= 1500 ms for normal community, <= 3000 ms for large/oversized community | 10000 and oversized community exceed the target. |
69
+ | Return global | <= 3500 ms for 1000, <= 5000 ms for 5000, <= 5000 ms for 10000 | Current 1000 is already near the limit. |
70
+ | Repeated cycle memory growth | <= 10 MB for 1000-node cycle | Current 1000 cycle showed no growth in available memory field. |
71
+
72
+ ## Interpretation
73
+
74
+ The current renderer is acceptable for small graph and community reading, but it is not a proven 10000+ global renderer. The next implementation phases should keep DOM/SVG for community/detail views while treating 5000/10000 global browsing as requiring budget enforcement, aggregation, or a different global rendering route.
75
+
76
+ ## Phase 4.1 Render Budgets
77
+
78
+ These budgets are the first shared graph-layer caps derived from the DOM/SVG bottleneck class above. They are not the final large-graph renderer decision; they prevent the current renderer from producing card-heavy or edge-heavy global output while Phase 6 evaluates the global route.
79
+
80
+ | View | Max visible nodes | Max visible edges | Max labels | Max full cards | Max interaction-time updates |
81
+ |---|---:|---:|---:|---:|---:|
82
+ | Global | 10000 | 1000 | 40 | 0 | 1200 |
83
+ | Community focus | 2500 | 1500 | 120 | 60 | 1800 |
84
+
85
+ Overflow is reported by the shared render model for nodes, edges, labels, cards, and interaction updates so drawer/list states can expose omitted detail without forcing it onto the canvas. Selection, search results, and Pin hints may promote priority, but they do not raise these caps.