pmx-canvas 0.8.2 → 0.9.1

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 (338) hide show
  1. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  2. package/.github/extensions/pmx-canvas/tools.json +601 -22
  3. package/CHANGELOG.md +59 -0
  4. package/Readme.md +131 -532
  5. package/dist/canvas/global.css +2724 -476
  6. package/dist/canvas/index.js +168 -107
  7. package/dist/canvas/mcp-app.html +2899 -596
  8. package/dist/json-render/index.js +20 -20
  9. package/dist/types/client/canvas/BarHint.d.ts +12 -2
  10. package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -1
  11. package/dist/types/client/canvas/BoardPinButton.d.ts +10 -0
  12. package/dist/types/client/canvas/BoardSwitcher.d.ts +1 -1
  13. package/dist/types/client/canvas/CanvasViewport.d.ts +1 -1
  14. package/dist/types/client/canvas/CommandBar.d.ts +3 -4
  15. package/dist/types/client/canvas/ConnectionBanner.d.ts +2 -1
  16. package/dist/types/client/canvas/ContextChip.d.ts +3 -0
  17. package/dist/types/client/canvas/CrossBoardReferences.d.ts +5 -0
  18. package/dist/types/client/canvas/EdgeLayer.d.ts +14 -3
  19. package/dist/types/client/canvas/EmptyState.d.ts +4 -4
  20. package/dist/types/client/canvas/HomeGraphView.d.ts +2 -0
  21. package/dist/types/client/canvas/HomeMapView.d.ts +1 -0
  22. package/dist/types/client/canvas/HomeReviewView.d.ts +6 -0
  23. package/dist/types/client/canvas/HomeView.d.ts +9 -7
  24. package/dist/types/client/canvas/KnowledgeDialog.d.ts +4 -0
  25. package/dist/types/client/canvas/LifecycleChrome.d.ts +5 -0
  26. package/dist/types/client/canvas/LifecycleFields.d.ts +7 -0
  27. package/dist/types/client/canvas/LifecyclePanel.d.ts +1 -0
  28. package/dist/types/client/canvas/MemoryInspector.d.ts +7 -0
  29. package/dist/types/client/canvas/NearPinLayer.d.ts +14 -0
  30. package/dist/types/client/canvas/NodeContextMark.d.ts +40 -7
  31. package/dist/types/client/canvas/RelationPresetsDialog.d.ts +4 -0
  32. package/dist/types/client/canvas/RelationsPanel.d.ts +4 -0
  33. package/dist/types/client/canvas/SessionPanel.d.ts +2 -0
  34. package/dist/types/client/canvas/canvas-area.d.ts +1 -1
  35. package/dist/types/client/canvas/graph-geometry.d.ts +27 -0
  36. package/dist/types/client/canvas/graph-model.d.ts +37 -0
  37. package/dist/types/client/canvas/memory-layout.d.ts +23 -0
  38. package/dist/types/client/canvas/use-chrome-height.d.ts +2 -0
  39. package/dist/types/client/canvas/use-focus-trap.d.ts +1 -0
  40. package/dist/types/client/canvas/use-memory-graph.d.ts +8 -0
  41. package/dist/types/client/canvas/use-pan-zoom.d.ts +4 -1
  42. package/dist/types/client/icons.d.ts +0 -10
  43. package/dist/types/client/nodes/AxStepControls.d.ts +1 -1
  44. package/dist/types/client/nodes/InlineMarkdownEditor.d.ts +4 -4
  45. package/dist/types/client/nodes/MarkdownNode.d.ts +5 -1
  46. package/dist/types/client/nodes/McpAppNode.d.ts +4 -4
  47. package/dist/types/client/nodes/viewer-runtime-state.d.ts +1 -1
  48. package/dist/types/client/state/boards-store.d.ts +81 -9
  49. package/dist/types/client/state/canvas-store.d.ts +14 -1
  50. package/dist/types/client/state/context-chip-store.d.ts +22 -0
  51. package/dist/types/client/state/context-status-store.d.ts +35 -0
  52. package/dist/types/client/state/human-store.d.ts +2 -1
  53. package/dist/types/client/state/intent-bridge.d.ts +11 -8
  54. package/dist/types/client/state/knowledge-store.d.ts +22 -0
  55. package/dist/types/client/state/near-pin-store.d.ts +44 -1
  56. package/dist/types/client/state/presence-store.d.ts +4 -4
  57. package/dist/types/client/state/presentation.d.ts +28 -0
  58. package/dist/types/client/state/relation-store.d.ts +10 -0
  59. package/dist/types/client/state/session-store.d.ts +41 -2
  60. package/dist/types/client/state/workspace-settings.d.ts +7 -0
  61. package/dist/types/client/types.d.ts +13 -1
  62. package/dist/types/client/utils/keyboard.d.ts +2 -0
  63. package/dist/types/client/utils/time-ago.d.ts +4 -0
  64. package/dist/types/mcp/context-uri-template.d.ts +3 -1
  65. package/dist/types/server/agent-presence.d.ts +10 -3
  66. package/dist/types/server/ax-context.d.ts +1 -1
  67. package/dist/types/server/canvas-db.d.ts +30 -7
  68. package/dist/types/server/canvas-operations.d.ts +24 -2
  69. package/dist/types/server/canvas-provenance.d.ts +22 -2
  70. package/dist/types/server/canvas-serialization.d.ts +2 -0
  71. package/dist/types/server/canvas-state.d.ts +93 -15
  72. package/dist/types/server/canvas-validation.d.ts +1 -1
  73. package/dist/types/server/context-brief.d.ts +94 -6
  74. package/dist/types/server/context-reads.d.ts +33 -7
  75. package/dist/types/server/edit-summary.d.ts +20 -0
  76. package/dist/types/server/index.d.ts +71 -10
  77. package/dist/types/server/knowledge-lifecycle.d.ts +221 -0
  78. package/dist/types/server/lifecycle-status.d.ts +10 -0
  79. package/dist/types/server/memory-graph.d.ts +9 -0
  80. package/dist/types/server/mutation-history.d.ts +2 -0
  81. package/dist/types/server/operations/ops/ax-shared.d.ts +1 -1
  82. package/dist/types/server/operations/ops/boards.d.ts +2 -1
  83. package/dist/types/server/operations/ops/lifecycle.d.ts +2 -0
  84. package/dist/types/server/operations/ops/memory-graph.d.ts +2 -0
  85. package/dist/types/server/operations/ops/nodes.d.ts +5 -0
  86. package/dist/types/server/operations/ops/query.d.ts +23 -0
  87. package/dist/types/server/operations/registry.d.ts +1 -0
  88. package/dist/types/server/placement.d.ts +7 -0
  89. package/dist/types/server/scope-fence.d.ts +2 -1
  90. package/dist/types/server/spatial-analysis.d.ts +6 -3
  91. package/dist/types/server/tour-control.d.ts +32 -0
  92. package/dist/types/server/wiki-links.d.ts +14 -0
  93. package/dist/types/server/workbench-auth.d.ts +2 -0
  94. package/dist/types/shared/agent-context.d.ts +2 -0
  95. package/dist/types/shared/agent-presence.d.ts +15 -12
  96. package/dist/types/shared/auto-arrange.d.ts +1 -0
  97. package/dist/types/shared/boards.d.ts +4 -4
  98. package/dist/types/shared/knowledge-lifecycle.d.ts +41 -0
  99. package/dist/types/shared/knowledge-presets.d.ts +6 -0
  100. package/dist/types/shared/lifecycle-status.d.ts +24 -0
  101. package/dist/types/shared/memory-graph.d.ts +53 -0
  102. package/dist/types/shared/relations.d.ts +68 -0
  103. package/dist/types/shared/semantic-attention.d.ts +2 -0
  104. package/dist/types/shared/tour.d.ts +38 -0
  105. package/dist/types/shared/workspace-settings.d.ts +11 -0
  106. package/docs/RELEASE.md +21 -3
  107. package/docs/adr-001-bun-only-runtime.md +7 -1
  108. package/docs/adr-002-shared-product-separate-runtimes.md +93 -0
  109. package/docs/api-reference.md +109 -0
  110. package/docs/ax-host-adapter-contract.md +1 -1
  111. package/docs/ax-state-contract.md +5 -4
  112. package/docs/cli.md +153 -15
  113. package/docs/demos/pmx-canvas-demo.mp4 +0 -0
  114. package/docs/design/AgentContext.dc.html +3 -3
  115. package/docs/design/BoardPins.dc.html +37 -22
  116. package/docs/design/Categories.dc.html +208 -0
  117. package/docs/design/CategoryEditor.dc.html +33 -0
  118. package/docs/design/Chrome.dc.html +52 -9
  119. package/docs/design/ContextChip.dc.html +224 -0
  120. package/docs/design/ContextChip600.dc.html +136 -0
  121. package/docs/design/EmptyState.dc.html +45 -0
  122. package/docs/design/Flows.dc.html +23 -1
  123. package/docs/design/HeaderMarks.dc.html +183 -0
  124. package/docs/design/Home.dc.html +19 -1
  125. package/docs/design/HomeGraph.dc.html +86 -202
  126. package/docs/design/HomeMap.dc.html +23 -1
  127. package/docs/design/HomeTeam.dc.html +32 -14
  128. package/docs/design/Lifecycle.dc.html +22 -0
  129. package/docs/design/Lifecycle600.dc.html +18 -0
  130. package/docs/design/LifecycleVariants.dc.html +157 -0
  131. package/docs/design/LinkAuthorship.dc.html +139 -0
  132. package/docs/design/LinksChanged.dc.html +203 -0
  133. package/docs/design/LinksOptions.dc.html +137 -0
  134. package/docs/design/LinksOptions600.dc.html +134 -0
  135. package/docs/design/NearPin.dc.html +9 -10
  136. package/docs/design/Pane600.dc.html +4 -3
  137. package/docs/design/Relations.dc.html +3 -2
  138. package/docs/design/Restore.dc.html +152 -0
  139. package/docs/design/SeeChange.dc.html +267 -0
  140. package/docs/design/Uses.dc.html +12 -6
  141. package/docs/design/canvas.json +146 -19
  142. package/docs/design.md +449 -16
  143. package/docs/environment.md +0 -1
  144. package/docs/evals/curation-effect.md +128 -0
  145. package/docs/http-api.md +459 -37
  146. package/docs/mcp.md +146 -18
  147. package/docs/node-types.md +58 -3
  148. package/docs/plans/design-gaps-2026-10-08.md +53 -0
  149. package/docs/plans/plan-009-tech-debt-backlog.md +379 -0
  150. package/docs/plans/plan-016-context-made-visible-wave-1.md +150 -5
  151. package/docs/plans/plan-017-knowledge-categories-and-lifecycle.md +175 -0
  152. package/docs/plans/plan-018-connected-memory-wave-2.md +594 -0
  153. package/docs/plans/plan-019-post-0.9-roadmap.md +198 -0
  154. package/docs/product-context-vision-2026-09.md +17 -1
  155. package/docs/product-vision-2026-09.md +1082 -43
  156. package/docs/product-vision-review-2026-09.md +13 -1
  157. package/docs/screenshots/workbench-live-dark.png +0 -0
  158. package/docs/screenshots/workbench-live-light.png +0 -0
  159. package/docs/sdk.md +62 -2
  160. package/package.json +1 -1
  161. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  162. package/plugins/pmx-canvas/plugin.json +1 -1
  163. package/plugins/pmx-canvas/runtime.json +1 -1
  164. package/plugins/pmx-canvas/tools.json +601 -22
  165. package/skills/pmx-canvas/SKILL.md +216 -42
  166. package/skills/pmx-canvas/evals/evals.json +224 -0
  167. package/skills/pmx-canvas/references/full-reference.md +120 -21
  168. package/skills/pmx-canvas/references/github-copilot-app-adapter.md +2 -2
  169. package/skills/pmx-canvas/references/importing-context.md +132 -0
  170. package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
  171. package/skills/pmx-canvas/references/tours-and-recording.md +16 -1
  172. package/skills/pmx-canvas-testing/SKILL.md +20 -0
  173. package/src/cli/agent.ts +2 -0
  174. package/src/cli/commands/ax.ts +12 -0
  175. package/src/cli/commands/boards.ts +88 -11
  176. package/src/cli/commands/edges.ts +28 -0
  177. package/src/cli/commands/groups.ts +7 -0
  178. package/src/cli/commands/nodes.ts +1 -0
  179. package/src/cli/commands/query.ts +34 -2
  180. package/src/cli/commands/record.ts +199 -48
  181. package/src/cli/index.ts +6 -1
  182. package/src/client/App.tsx +177 -70
  183. package/src/client/canvas/AttentionHistory.tsx +0 -2
  184. package/src/client/canvas/BarHint.tsx +40 -2
  185. package/src/client/canvas/BoardCopyDialog.tsx +1 -1
  186. package/src/client/canvas/BoardFolderDialog.tsx +7 -7
  187. package/src/client/canvas/BoardLinkDialog.tsx +138 -33
  188. package/src/client/canvas/BoardPinButton.tsx +33 -0
  189. package/src/client/canvas/BoardSwitcher.tsx +26 -40
  190. package/src/client/canvas/CanvasNode.tsx +360 -237
  191. package/src/client/canvas/CanvasViewport.tsx +45 -7
  192. package/src/client/canvas/CommandBar.tsx +29 -23
  193. package/src/client/canvas/CommandPalette.tsx +5 -12
  194. package/src/client/canvas/ConnectionBanner.tsx +3 -3
  195. package/src/client/canvas/ContextChip.tsx +296 -0
  196. package/src/client/canvas/ContextMenu.tsx +63 -5
  197. package/src/client/canvas/CrossBoardReferences.tsx +60 -0
  198. package/src/client/canvas/EdgeLayer.tsx +339 -76
  199. package/src/client/canvas/EmptyState.tsx +33 -18
  200. package/src/client/canvas/ExpandedNodeOverlay.tsx +72 -40
  201. package/src/client/canvas/ExternalWriters.tsx +57 -42
  202. package/src/client/canvas/HomeGraphView.tsx +942 -0
  203. package/src/client/canvas/HomeMapView.tsx +641 -0
  204. package/src/client/canvas/HomeReviewView.tsx +167 -0
  205. package/src/client/canvas/HomeView.tsx +687 -160
  206. package/src/client/canvas/IntentLayer.tsx +19 -12
  207. package/src/client/canvas/KnowledgeDialog.tsx +488 -0
  208. package/src/client/canvas/LifecycleChrome.tsx +133 -0
  209. package/src/client/canvas/LifecycleFields.tsx +91 -0
  210. package/src/client/canvas/LifecyclePanel.tsx +543 -0
  211. package/src/client/canvas/MemoryInspector.tsx +104 -0
  212. package/src/client/canvas/Minimap.tsx +3 -3
  213. package/src/client/canvas/NearPinLayer.tsx +187 -0
  214. package/src/client/canvas/NodeContextMark.tsx +175 -97
  215. package/src/client/canvas/Presentation.tsx +23 -57
  216. package/src/client/canvas/RelationPresetsDialog.tsx +413 -0
  217. package/src/client/canvas/RelationsPanel.tsx +82 -0
  218. package/src/client/canvas/SelectionBar.tsx +3 -6
  219. package/src/client/canvas/SessionPanel.tsx +90 -50
  220. package/src/client/canvas/SessionReceipt.tsx +311 -39
  221. package/src/client/canvas/ShortcutOverlay.tsx +1 -1
  222. package/src/client/canvas/SnapshotPanel.tsx +27 -36
  223. package/src/client/canvas/ToolRail.tsx +367 -192
  224. package/src/client/canvas/TopBar.tsx +354 -124
  225. package/src/client/canvas/canvas-area.ts +10 -3
  226. package/src/client/canvas/graph-geometry.ts +195 -0
  227. package/src/client/canvas/graph-model.ts +254 -0
  228. package/src/client/canvas/memory-layout.ts +106 -0
  229. package/src/client/canvas/use-chrome-height.ts +20 -0
  230. package/src/client/canvas/use-focus-trap.ts +31 -5
  231. package/src/client/canvas/use-memory-graph.ts +58 -0
  232. package/src/client/canvas/use-node-drag.ts +2 -1
  233. package/src/client/canvas/use-pan-zoom.ts +64 -7
  234. package/src/client/icons.tsx +0 -63
  235. package/src/client/mcp-app/style.css +0 -6
  236. package/src/client/nodes/AxStepControls.tsx +74 -50
  237. package/src/client/nodes/BoardNode.tsx +5 -1
  238. package/src/client/nodes/ContextNode.tsx +18 -11
  239. package/src/client/nodes/ExtAppFrame.tsx +6 -3
  240. package/src/client/nodes/FileNode.tsx +46 -42
  241. package/src/client/nodes/HtmlNode.tsx +32 -0
  242. package/src/client/nodes/ImageNode.tsx +1 -1
  243. package/src/client/nodes/InlineFormatBar.tsx +6 -9
  244. package/src/client/nodes/InlineMarkdownEditor.tsx +56 -17
  245. package/src/client/nodes/MarkdownNode.tsx +377 -109
  246. package/src/client/nodes/McpAppNode.tsx +50 -20
  247. package/src/client/nodes/MdFormatBar.tsx +21 -18
  248. package/src/client/nodes/PromptNode.tsx +1 -1
  249. package/src/client/nodes/ResponseNode.tsx +1 -1
  250. package/src/client/nodes/viewer-runtime-state.ts +54 -22
  251. package/src/client/state/attention-bridge.ts +64 -15
  252. package/src/client/state/boards-store.ts +193 -39
  253. package/src/client/state/canvas-store.ts +99 -12
  254. package/src/client/state/context-chip-store.ts +70 -0
  255. package/src/client/state/context-status-store.ts +53 -0
  256. package/src/client/state/human-store.ts +13 -7
  257. package/src/client/state/intent-bridge.ts +51 -30
  258. package/src/client/state/knowledge-store.ts +43 -0
  259. package/src/client/state/near-pin-store.ts +115 -6
  260. package/src/client/state/presence-store.ts +7 -10
  261. package/src/client/state/presentation.ts +91 -0
  262. package/src/client/state/relation-store.ts +81 -0
  263. package/src/client/state/session-store.ts +144 -18
  264. package/src/client/state/sse-bridge.ts +235 -32
  265. package/src/client/state/workspace-settings.ts +11 -0
  266. package/src/client/theme/global.css +2724 -476
  267. package/src/client/types.ts +12 -0
  268. package/src/client/utils/keyboard.ts +10 -0
  269. package/src/client/utils/time-ago.ts +14 -0
  270. package/src/json-render/renderer/index.tsx +31 -0
  271. package/src/mcp/canvas-app.ts +12 -2
  272. package/src/mcp/context-uri-template.ts +7 -4
  273. package/src/mcp/server.ts +63 -41
  274. package/src/mcp/workbench-app.ts +39 -6
  275. package/src/server/agent-presence.ts +128 -28
  276. package/src/server/ax-context.ts +27 -13
  277. package/src/server/board-export.ts +12 -1
  278. package/src/server/canvas-db.ts +331 -42
  279. package/src/server/canvas-operations.ts +195 -83
  280. package/src/server/canvas-provenance.ts +53 -22
  281. package/src/server/canvas-serialization.ts +2 -0
  282. package/src/server/canvas-state.ts +950 -122
  283. package/src/server/canvas-validation.ts +9 -2
  284. package/src/server/context-brief.ts +345 -38
  285. package/src/server/context-reads.ts +178 -30
  286. package/src/server/demo-state.json +355 -24
  287. package/src/server/edit-summary.ts +74 -0
  288. package/src/server/html-surface.ts +8 -1
  289. package/src/server/index.ts +181 -11
  290. package/src/server/knowledge-lifecycle.ts +304 -0
  291. package/src/server/lifecycle-status.ts +232 -0
  292. package/src/server/memory-graph.ts +166 -0
  293. package/src/server/mutation-history.ts +18 -6
  294. package/src/server/operations/composites.ts +32 -11
  295. package/src/server/operations/http.ts +7 -2
  296. package/src/server/operations/index.ts +4 -0
  297. package/src/server/operations/mcp.ts +26 -1
  298. package/src/server/operations/ops/ax-presence.ts +1 -1
  299. package/src/server/operations/ops/ax-read.ts +57 -6
  300. package/src/server/operations/ops/ax-timeline.ts +28 -2
  301. package/src/server/operations/ops/backup.ts +5 -3
  302. package/src/server/operations/ops/batch.ts +35 -4
  303. package/src/server/operations/ops/boards.ts +188 -47
  304. package/src/server/operations/ops/canvas-wire.ts +31 -1
  305. package/src/server/operations/ops/edges.ts +36 -2
  306. package/src/server/operations/ops/groups.ts +6 -1
  307. package/src/server/operations/ops/lifecycle.ts +262 -0
  308. package/src/server/operations/ops/memory-graph.ts +45 -0
  309. package/src/server/operations/ops/nodes.ts +107 -24
  310. package/src/server/operations/ops/query.ts +281 -68
  311. package/src/server/operations/ops/snapshots.ts +73 -1
  312. package/src/server/operations/ops/validate.ts +5 -1
  313. package/src/server/operations/ops/viewport.ts +97 -3
  314. package/src/server/operations/registry.ts +74 -25
  315. package/src/server/placement.ts +29 -0
  316. package/src/server/scope-fence.ts +78 -6
  317. package/src/server/server.ts +115 -16
  318. package/src/server/spatial-analysis.ts +48 -23
  319. package/src/server/tour-control.ts +82 -0
  320. package/src/server/wiki-links.ts +137 -0
  321. package/src/server/workbench-auth.ts +11 -0
  322. package/src/shared/agent-context.ts +3 -0
  323. package/src/shared/agent-presence.ts +15 -15
  324. package/src/shared/auto-arrange.ts +2 -0
  325. package/src/shared/boards.ts +4 -4
  326. package/src/shared/knowledge-lifecycle.ts +22 -0
  327. package/src/shared/knowledge-presets.ts +80 -0
  328. package/src/shared/lifecycle-status.ts +26 -0
  329. package/src/shared/memory-graph.ts +74 -0
  330. package/src/shared/relations.ts +98 -0
  331. package/src/shared/semantic-attention.ts +15 -1
  332. package/src/shared/tour.ts +23 -5
  333. package/src/shared/workspace-settings.ts +13 -0
  334. package/dist/types/client/canvas/ContextPinBar.d.ts +0 -1
  335. package/dist/types/client/canvas/FocusFieldLayer.d.ts +0 -1
  336. package/dist/types/client/canvas/kind-colors.d.ts +0 -3
  337. package/dist/types/server/agent-context.d.ts +0 -22
  338. package/src/client/canvas/ContextPinBar.tsx +0 -25
@@ -0,0 +1,594 @@
1
+ # Wave 2: connected memory
2
+
3
+ **Status:** Implemented and stabilized with the Wave 3 foundation. Not released.
4
+
5
+ Build on the local wave-1 stabilization batch. SQLite remains authoritative; Home is a view,
6
+ not a board, and folders are independent of the many-to-many link graph. The exported
7
+ HomeMap/HomeGraph artboards supply the visual model; newer neutral-folder decisions override
8
+ their category hues, synthetic Home and derived levels.
9
+
10
+ ## Contract
11
+
12
+ - Resolve Markdown `[[Board]]`, `[[Board#Card]]` and optional `|label` aliases on save.
13
+ Store durable, board-qualified targets separately from the authored text. Preserve unchanged
14
+ bindings across renames, never guess an ambiguous title, and keep deleted targets visibly broken.
15
+ Code spans and fenced code do not create links. Unresolved board links offer explicit creation.
16
+ - Extend native edges with an optional target board ID. The source remains on the active board;
17
+ this does not permit writes on another board. Qualify both ends in the graph, including when
18
+ two boards contain the same card ID. Preserve edges in snapshots, undo and persistence.
19
+ - Project boards, cards, membership, portals, wiki links, native edges and previous-board chains
20
+ once on the server. Home Graph, Map, board backlinks and agent graph reads consume it.
21
+ Summaries count as seen, not full reads. Missing targets are explicit and unlinked boards remain visible.
22
+ - Home Map groups boards in neutral folder regions; human-dragged positions persist in SQLite.
23
+ Map and Graph use the existing workspace board pins. Graph supports focus and bounded depth,
24
+ search/type/context filters and direct board/card navigation without switching boards on read.
25
+ - Existing qualified library search stays. The brief discovers linked boards from the same
26
+ projection; wave 3 adds richer kinds, reasons, downstream review and lifecycle.
27
+
28
+ ## Build and verify
29
+
30
+ 1. Durable links/edge persistence and one projection across HTTP, SDK, MCP and CLI.
31
+ Verify renamed, duplicate-ID, ambiguous, missing, inactive-board and restart cases.
32
+ 2. Home Map/Graph and wiki navigation to the drawings, with responsive controls.
33
+ Verify human gestures and agent exploration against the same disposable library.
34
+ 3. Update public contracts and bundled skills; run unit/client/type/lint/build/browser gates,
35
+ inspect rendered states at 600, 1024 and 1920 pixels and in all nine themes, then review.
36
+
37
+ No release or deployment is part of this work. Stabilization changes and unrelated board artifacts
38
+ must be preserved; wave 3 follows this checkpoint as a separate batch.
39
+
40
+ ## Original Wave 2 checkpoint (before the Wave 3 foundation)
41
+
42
+ - `bun run test`: 1,418 passed; `bun run test:client`: 276 passed.
43
+ - `DISPLAY=:88 bash scripts/run-playwright.sh --headed`: 248 passed on the final bundle,
44
+ including the 600, 1024 and 1920 px reference projects and all-nine-theme coverage.
45
+ - Build, typecheck and `git diff --check` pass. Lint has no errors; 64 warnings and 12 infos remain.
46
+ - Live human gestures exercised create/edit/Save, wiki creation and navigation, remote-card
47
+ connection, delete/Undo/Redo, Map drag/reload, Graph discovery/pin/unpin and receipt See change/Undo.
48
+ Source and rich-editor drafts and selections survive agent relation changes and missing/restored
49
+ targets; delayed file-backed previews cannot overwrite a subsequently saved draft.
50
+ - Real CLI graph and stdio MCP exploration match the same library without moving the human's
51
+ active board. Read accounting preserves captured revisions and never acknowledges omitted links.
52
+ - Adversarial review findings were reproduced and fixed; Oracle's final focused follow-up found
53
+ no blocker. Inspected live screenshots are in `.amp/in/artifacts/w2-final-human/`.
54
+
55
+ This checks the orb's real local stack, not a released package or a native host installation.
56
+
57
+ ## Combined stabilization
58
+
59
+ The later foundation exposed reconnect attribution, native save-lineage, board ownership,
60
+ inactive-board scope and catalog replay races. Their fixes are implemented and documented
61
+ in the public contracts. Oracle's final focused follow-up found no remaining race blocker.
62
+ The final unit/client gates pass (1,437/302), and the clean full headed run passes all 266
63
+ cases, including the 600, 1024 and 1920 px reference projects and all-nine-theme coverage.
64
+ Real browser restore/late-ACK and catalog replay probes also pass. The previous full run
65
+ had 264 passes and two failures: its race-test interceptors did not match the new
66
+ board-qualified state URL. Correcting that harness, without a product change, made both
67
+ isolated cases and the subsequent full run pass. Earlier failure evidence is retained.
68
+ `bun run test:coverage` passes with 64.71% lines and 72.10% functions, above the CI floors;
69
+ the fresh-workspace CLI E2E flow passes with headed browser verification. Build, typecheck,
70
+ bundled-skill checks and diff-check pass. Lint has zero errors (64 warnings and 12 infos);
71
+ `CLAUDE.md` and `AGENTS.md` match.
72
+ Live human gestures cover wiki creation/navigation, Map drag/reload, Graph context/details,
73
+ narrow scrolling, daemon reconnect and restored unsaved drafts. Real CLI and stdio MCP
74
+ exploration preserve the active board; lifecycle retain/retire/restore preserves content,
75
+ validation and attributed audit history. Inspected screenshots are in
76
+ `.amp/in/artifacts/w3-final-human/`. Native Copilot/WebKit, native Windows and registry-installed
77
+ execution remain separate unverified surfaces; absent skill mirrors were skipped, not validated.
78
+
79
+ ## Remaining Wave 3 stabilization (2026-10-11)
80
+
81
+ The remaining relationship and lifecycle work starts from the published foundation, with
82
+ `fb3554bddd0565d94a8747c79b30866f4d1c434b` verified as an ancestor. The owner requested
83
+ adversarial self-review instead of Oracle. This batch is unreleased at 0.8.2. Commit and push
84
+ are authorized after stabilization; release, tagging, publishing and deployment are not.
85
+
86
+ Reproduced findings and fixes include lost authored provenance, lifecycle-only changes omitted
87
+ from incremental briefs, stale review drafts acquiring new source preconditions, duplicate
88
+ source entries masking an unavailable observation, and a Markdown due footer below the visible
89
+ card. Live browser inspection also found a scrolling relation legend and Fit placing cards under
90
+ the new controls. Each has a failing reproduction and a passing focused check. A full preliminary
91
+ headed run passed 267 cases and failed the packed-consumer selector: its whole-card text matched
92
+ the new source warning as well as the target card. Targeting the card title fixed that harness.
93
+
94
+ Owner portal feedback caught the preset selector resetting to “Vocabulary…”. The final legend
95
+ keeps all four preset names across reload, reports “Custom vocabulary” after a kind edit, and
96
+ uses the `Uses` drawing's 24 px selector, rounded count chips and one highlight per vocabulary.
97
+ The reset reproduction failed; the corrected headed relation case passes.
98
+
99
+ The latest serial gates pass 1,443 unit and 302 client tests, typecheck, build and lint (zero
100
+ errors, 64 warnings, 12 infos). Unit coverage is 64.68% lines and 72.16% functions, above the CI
101
+ floors. The final full headed suite passes 268 cases; fresh-workspace CLI E2E passes with
102
+ headed browser verification. Bundled-skill checks pass and the guidance twins match. Agent-skill
103
+ mirrors are absent, so that check skipped rather than validated. The post-debt serial run is
104
+ `/tmp/pmx-w3-post-debt.gM8WHG`; its CLI workspace is `/tmp/pmx-canvas-e2e.IyKnoE`.
105
+
106
+ Published foundation CI had failures despite the preceding local passes. Review of
107
+ [that run](https://github.com/pskoett/pmx-canvas/actions/runs/38153215292) found Windows subprocess
108
+ imports using URL pathnames instead of filesystem paths, plus test-order contamination: an MCP
109
+ case replaced the shared intent emitter and then disabled it. The local ordered reproduction
110
+ failed in `/tmp/pmx-w3-ci-order-red.FpSrwd`; the same three cases pass in
111
+ `/tmp/pmx-w3-ci-order-green.QSzLU1` after reading the public workbench event stream instead.
112
+ The subprocess imports now use `fileURLToPath`. No assertions were removed and no retries added.
113
+ These are test-harness fixes, not a native Windows UI verification claim.
114
+
115
+ Live human-style browser gestures cover source editing/Save, relation reason and vocabulary
116
+ editing, preset adoption, category editing, folder inheritance, evidence review, retirement/Undo,
117
+ and explicit recipe handoff. Real stdio MCP and CLI checks cover stale-source rejection,
118
+ qualified briefs and search, retired pinned-resource exclusion, restore preserving validation,
119
+ and relation round-tripping. A second real MCP client reads the human's pinned source and recipe
120
+ steering after restart. Recipe requests do not execute tools or renew validation.
121
+
122
+ Inspected captures in `.amp/in/artifacts/w3-acceptance/` cover 600/1024/1920 px and all nine themes.
123
+ Failed-run evidence remains in separate `/tmp/pmx-w3-*` directories, including `draft-repro`,
124
+ `duplicate-red`, `legend-red`, `footer-red`, `fit-red`, `preset-red` and the preliminary full run.
125
+ The [maintainability review](plan-009-tech-debt-backlog.md#wave-3-maintainability-review-2026-10-11)
126
+ removed repeated request-local qualification/layout reads. Its measured scaling costs and future
127
+ frame-host, move/audit, journal and runtime boundaries are now checkpoints in the vision.
128
+ These are Chromium/source and local-packed-consumer checks, not native Copilot/WebKit, native
129
+ Windows or registry-install verification. No tag, publish, deploy or version bump is authorized.
130
+ After push, the owner still needs to E2E-test the complete change since 0.8.2 from the updated
131
+ checkout. Running the unchanged registry package at 0.8.2 does not exercise these changes.
132
+
133
+ ## Home acceptance integration (2026-10-12)
134
+
135
+ The combined batch starts from `0fbc593ac99a7ba34ed6cc59ccc0c49e14ccc606`, with the requested
136
+ foundation verified as an ancestor. The frozen parent source patch was integrated exactly
137
+ (SHA256 `2046aaa21b8e4f326e7da5c99dd7d9042f8ff7802bd871d9dc432b5cc74428f5`), preserving the
138
+ separately owned HomeMemory/layout/live-update changes. Generated bundles, declarations and
139
+ tool catalogs are rebuilt here. The unrelated SDLC artifact is not part of delivery.
140
+
141
+ Graph now uses live view-local forces, folder outlines and board/card clusters, with counted
142
+ filters, focus/depth, display controls and individual connection reasons. Map preserves saved
143
+ board positions inside collapsible folder regions. Agent edits refresh the projection without
144
+ resetting the human's camera, selection or dragged particles. Board-only controls and native
145
+ paste are unavailable while browsing memory. The parent acceptance fixes add navigation-only
146
+ folder trees, actionable review summaries, safe unused-category deletion, compact settings,
147
+ one-note reviews and ring/hover/legend/Fit corrections. Read, content, validation and relevance
148
+ remain separate clocks.
149
+
150
+ Adversarial self-review and live transport checks found two additional bugs: the advertised
151
+ MCP board-portal type was rejected by a duplicated enum, and the library context chip omitted
152
+ the pinned active board. Both have red/green regressions, retained in
153
+ `/tmp/pmx-combined-portal-{red.89FSEL,green.OSHgsr}` and
154
+ `/tmp/pmx-combined-chip-{red.jZHY9I,green.805Bqn}`. The earlier library/paste regressions are
155
+ retained in `/tmp/pmx-home-live-red.hjJURq` and `/tmp/pmx-home-paste-red.2qNf8V`.
156
+ The [integration debt review](plan-009-tech-debt-backlog.md#home-acceptance-integration-review-2026-10-12)
157
+ and vision record explicit per-tab editor ownership and measured scaling as future checkpoints.
158
+
159
+ Live human gestures on disposable data include Graph drag, force controls and pinning, Map
160
+ collapse, Open board, source editing/Save, review confirmation and Not now, and category
161
+ creation/deletion. Real stdio MCP reads the human's board pin, edits a card, and creates portal
162
+ and wiki connections while Graph stays open with the same camera/selection. The observed DOM
163
+ contains both new link kinds and the updated title (`/tmp/pmx-combined-mcp-observed.kO6Ywo`).
164
+ Review evidence records actor human with content/reviewed revision 24. An aborted graph read
165
+ shows Retry; a successful retry restores 114 board/card nodes. The first scratch selector wait
166
+ timed out, but the inspected error capture and the actual Retry click/recovery succeeded.
167
+
168
+ Inspected renders in `.amp/in/artifacts/combined-acceptance/` include Map/Graph at 600, 1024
169
+ and 1920 px in all nine themes, narrow selected details, collapsed Map, graph failure, category
170
+ scrolling, folder settings and Review. All 54 matrix captures have DPR 2 and no body horizontal
171
+ overflow. Two agent-browser motion recordings failed encoder backlog; their failed files remain
172
+ in `/tmp/pmx-combined-recording-failed*.webm`, not presented as successful video evidence.
173
+
174
+ This is not full Relations/Flows/Uses sketch parity: the inline edge editor, amber lineage
175
+ strokes, pair/cycle badges and lineage actions remain unimplemented as documented in design.md.
176
+ Dense fit-zoom Graph labels still need selection/local focus for detail; this fixture is not a
177
+ large-library capacity claim. The owner's Amp embedded-portal pill-opening report is unverified,
178
+ distinct from the fixed pin count and from the passing Chromium test-host interaction. Native
179
+ Copilot/WebKit, native Windows UI and registry-installed execution remain unverified. Portal
180
+ creation was exercised through MCP/HTTP, not an expansion of generic CLI/typed-SDK add data.
181
+ No release, tag, publish, deployment or version bump is authorized; the owner still needs to
182
+ test the complete changes since 0.8.2 after the approved commit/push.
183
+
184
+ Final serial local gates: `bun run test` passes 1,444; `bun run test:client` passes 306;
185
+ coverage passes at 64.71% lines / 72.23% functions. Build, typecheck, bundled-skill checks,
186
+ guidance-twin comparison and diff-check pass. Lint has zero errors, 63 warnings and 12 infos.
187
+ Absent agent-skill mirrors explicitly skip. The demo generator leaves its fixture unchanged.
188
+ `DISPLAY=:88 PMX_PLAYWRIGHT_DB_PATH=<fresh-db> bash scripts/run-playwright.sh --headed`
189
+ passes all 276 cases. `DISPLAY=:88 PMX_E2E_HEADED=1 PMX_CANVAS_E2E_KEEP_WORKDIR=1 bun run test:e2e-cli`
190
+ passes in `/tmp/pmx-canvas-e2e.bQukul`. Logs are in `/tmp/pmx-combined-final-gates.ijVDni`,
191
+ `/tmp/pmx-combined-final-headed.nIX7dJ` and `/tmp/pmx-combined-delivery-gates.VFWQ4K`.
192
+ After the full browser run, only tool-description prose changed; regenerated catalogs/build,
193
+ typecheck/lint and 47 focused MCP/skill checks passed again before the CLI gate.
194
+
195
+ The additional live two-board vocabulary control sets Platform overview to Dependencies and
196
+ Research index to Flow through the UI. Both retain their own selection after switching and
197
+ reloading; the other 11 boards' vocabularies remain unchanged. Evidence is in
198
+ `/tmp/pmx-combined-vocabulary.SSw0oL` and the inspected vocabulary captures. The full-browser
199
+ context pill opens, but that is not an Amp embedded-portal verification. A scratch Graph click
200
+ ran before Home's asynchronous navigation finished; waiting for Library view before clicking
201
+ completed normally. The inspected final Graph has 114 nodes at DPR 2 with no body horizontal
202
+ overflow; its long sidebar scrolls to the force controls. Board captures retain the existing
203
+ camera, so Fit is still needed when a stored card sits under floating controls.
204
+
205
+ ### Cross-platform startup finding after the combined push
206
+
207
+ The combined commit was pushed as
208
+ [11dc3117](https://github.com/pskoett/pmx-canvas/commit/11dc311732d8c12acc86dda12b269539df8fa5b3).
209
+ [Its CI run](https://github.com/pskoett/pmx-canvas/actions/runs/38213111457) passed Linux,
210
+ CLI E2E and browser E2E, but both macOS and Windows failed the same concurrent pre-folder
211
+ opening test at `openCanvasDb`'s `PRAGMA journal_mode=WAL`: an immediate `SQLITE_BUSY`
212
+ despite `busy_timeout=5000`. macOS reported 1,443 passes and one failure; Windows reported
213
+ 1,422 passes, 21 existing skips and one failure. Full failed job logs remain in
214
+ `/tmp/pmx-combined-ci.fLBUAO/{macos,windows}-failed.log`.
215
+
216
+ SQLite documents both [busy-handler bypass](https://www.sqlite.org/c3ref/busy_handler.html)
217
+ and [WAL open/close contention](https://www.sqlite.org/wal.html#sometimes_queries_return_sqlite_busy_in_wal_mode).
218
+ The fix retries only journal negotiation within the existing five-second budget, restores
219
+ the usual busy timeout after success, and closes the connection on terminal initialization
220
+ failure. Other errors still propagate immediately; arbitrary content writes are not retried.
221
+ No test assertion, platform skip or CI retry policy is weakened.
222
+
223
+ Thirty natural Linux repetitions passed before and after, so they are not claimed as a local
224
+ reproduction of the platform race. A disposable fault-injection probe of the exact immediate
225
+ BUSY fails before (`/tmp/pmx-wal-probe-red.QJ9JfP`) and passes after
226
+ (`/tmp/pmx-wal-probe-green.UwfjJ3`). Its negative controls retain a bounded permanent-BUSY
227
+ failure (about five seconds) and immediate corruption failure. The real concurrent/contended
228
+ open regression remains unchanged in the permanent suite; the injected probe is validation
229
+ evidence, not a mock-based replacement for the native-platform gate.
230
+
231
+ The follow-up headed run also exposed a synchronization race in the file-backed suspended-save
232
+ test. Its trace shows the canonical-content poll arriving at 140508.771 ms, before the test
233
+ registered `waitForResponse` at 140536.895 ms; subsequent incremental polls correctly omitted
234
+ the already-delivered change. The listener now registers before the peer save. The 409 refusal,
235
+ preserved draft, unchanged canonical file and deliberate subsequent-save assertions are intact.
236
+ The failed trace, videos and screenshots remain under
237
+ `/tmp/pmx-wal-final-gates.vWZ0g3/results/boards.pw.ts-save-and-boar-33e76-its-draft-file-backed-true--desktop`.
238
+
239
+ Final local follow-up gates ran serially: build/typecheck, lint (0 errors, 63 warnings,
240
+ 12 infos), 1,444 unit tests, 306 client tests, unit coverage at 64.70% lines / 72.23%
241
+ functions, and fresh-workspace headed CLI E2E all passed. That first browser attempt finished
242
+ with 275 passes and the one listener failure above. After the test correction, typecheck and
243
+ lint passed again, both suspended-save variants passed ten repetitions each (20 cases), and
244
+ the fresh full headed run passed all 276 cases at the configured reference widths. There were
245
+ no browser retries in either local full run. Evidence is retained in
246
+ `/tmp/pmx-wal-final-gates.vWZ0g3`, `/tmp/pmx-wal-corrected-gates.UL7xSE`, and the CLI workspace
247
+ `/tmp/pmx-canvas-e2e.dfySJW`. The client bundle did not change in this follow-up; the combined
248
+ human, real-transport and inspected visual evidence above remains applicable. Native-platform
249
+ CI is still a separate gate, not implied by these Linux results. No release or version change.
250
+
251
+ ### Delivered checkpoint, 2026-10-12
252
+
253
+ The [stabilization follow-up](https://github.com/pskoett/pmx-canvas/commit/fd63c3c611e680864d444532ca3ef7bb79cd171e)
254
+ is pushed on top of the combined implementation. Its
255
+ [CI run](https://github.com/pskoett/pmx-canvas/actions/runs/38218734543) completed successfully
256
+ across all five jobs: Linux, macOS, Windows, browser E2E and CLI E2E. macOS reports
257
+ 1,444 passes and zero failures; Windows reports 1,423 passes, 21 existing skips and zero
258
+ failures. The unchanged concurrent/contended-open regression passes on both platforms.
259
+ Browser CI reports 276 passes with no flaky/retry report. This closes the native-platform
260
+ startup gate above; it does not erase the initial failed runs or their red/green evidence.
261
+
262
+ A focused read-only Oracle review of the follow-up found no blockers in the startup-only
263
+ retry or save-test synchronization. The owner portal runs this build, with all 11 boards
264
+ preserved; restart checks retain the active board, card contents/geometry, edges and camera.
265
+ The owner's step-by-step acceptance guide now records the delivered build and green CI,
266
+ without marking manual tests passed or replacing the owner's notes.
267
+
268
+ This is ready for owner acceptance, not a claim of full sketch parity or release approval.
269
+ The embedded Amp pill-opening, dense Fit-label limits, Relations/Flows/Uses gaps and native
270
+ host/UI/registry-install boundaries above remain explicit. Version is still 0.8.2; no release,
271
+ tag, publication, deployment or version bump was performed. Staged maintenance remains in
272
+ the vision and debt backlog.
273
+
274
+ ### Guest cursor polling latency, 2026-10-12
275
+
276
+ The owner's slow guest-cursor report exposed a PMX transport delay: orb pages select the
277
+ proxy-safe polling path, but that path paused two seconds after every response. Human cursor
278
+ POSTs already throttle at 80 ms and server presence emits coalesce at 16 ms. Neither the
279
+ cursor styling nor the shared board database needed to change.
280
+
281
+ Direct HTTP clients now request a bounded long poll on the existing event ring. A caught-up
282
+ request waits at most 1000 ms, wakes when an event arrives, and cleans up on timeout, abort
283
+ or server stop. An 80 ms client pause bounds busy-stream request rate. Snapshot/ring recovery
284
+ and SSE are preserved; hosted MCP-app tool polling retains its two-second cadence. No new
285
+ presence channel or host-specific styling was added. Self-review covered event ordering,
286
+ waiter cleanup, client generations and the hosted/direct transport distinction.
287
+
288
+ The starting checkout contains the requested
289
+ [docs baseline](https://github.com/pskoett/pmx-canvas/commit/175031013ef6bc31b94cec16d5def56661e866b6)
290
+ and the newer docs-only
291
+ [checkpoint](https://github.com/pskoett/pmx-canvas/commit/3b7a570a98bd6f32b8a50386c04bfc81db2a76e6).
292
+ The same two headed Chromium clients moved the pointer through the real orb portal in both
293
+ directions, one workbench inside a cross-origin iframe, on a disposable one-card board.
294
+ Three 100-point sweeps per direction and build produced:
295
+
296
+ | Observed measure | Unchanged baseline | Fixed build |
297
+ | --- | --- | --- |
298
+ | Remote target updates during movement | 0.47–0.48/s | 11.24–11.54/s |
299
+ | Median target-update gap | 1999–2001 ms | 84 ms |
300
+ | Estimated median rendered lag, including interpolation | 848–934 ms | 213–217 ms |
301
+ | Estimated p95 rendered lag | 1898–2000 ms | 262–266 ms |
302
+ | Receiver animation cadence | about 60 frames/s | about 60 frames/s |
303
+ | Own-cursor count | 0 | 0 |
304
+
305
+ Lag estimates match rendered cursor x positions to a monotonic input sweep, not a network
306
+ round-trip measurement. The final fixed idle client completed eight polls over six seconds.
307
+ Before/after recordings were inspected. An earlier fixed capture needed dense 100 ms frame
308
+ samples and decoded positions to contradict a coarse automated description of pauses.
309
+ The final-build capture also shows continuous movement rather than the baseline's two-second
310
+ jumps. Two final recording attempts at 60 and 30 fps overloaded the encoder and were retained
311
+ as failures; the inspected recording uses 15 fps. Final recordings are
312
+ `.amp/in/artifacts/cursor-latency/before-final.webm` and `after-final.webm`.
313
+
314
+ The public HTTP long-poll regression and two-client rendered-coordinate regression both
315
+ failed on unchanged code, then passed with the fix. The existing two-tab grab/lock/yield
316
+ case also passed with SSE forced as a control. Red evidence is retained under
317
+ `/tmp/pmx-cursor-red.RjuzlZ`; focused green build/typecheck, HTTP and headed evidence under
318
+ `/tmp/pmx-cursor-green.GqytFB`. Repeated portal measurements, served-bundle hashes, input and
319
+ render samples and video-frame analysis are in `/tmp/pmx-cursor-comparison.oZBHTD`.
320
+ Earlier failed recordings/navigation and invalid duplicate-tab or throttled measurements
321
+ were retained separately, not counted as successful runs. The final measurement harness
322
+ selects the agent-browser-owned targets, closes extra test tabs and rejects low frame/input
323
+ cadence or duplicate own cursors.
324
+
325
+ The first full headed run passed 276 cases but timed out in dark HTML refresh continuity.
326
+ Its trace places the stranded poll at 296926.670 ms, between disabling interception at
327
+ 296924.232 ms and reenabling it at 296938.877 ms. Ten unchanged focused reruns passed;
328
+ those did not explain or erase the failure. A standalone headed Chromium + Node HTTP
329
+ probe, with no PMX code, reproduced the interception failure: toggling an unrelated route
330
+ stranded fetch 22 before it reached the server (21 requests received and completed).
331
+ Keeping the route installed let completions progress from 234 to 279 over the final
332
+ observation window. The test now installs its route once, preserves every per-revision
333
+ hold, painted-content assertion and screenshot, and uses the existing context cleanup.
334
+ All 12 repeated HTML/JSON-render dark/light cases passed after that harness correction.
335
+ No viewer or product timeout workaround was added. The initial full-run trace/video is
336
+ retained in `/tmp/pmx-cursor-gates.qGwgtE`; the isolated reproduction and unchanged reruns
337
+ are in `/tmp/pmx-cursor-refresh-investigation.SJzGeg`.
338
+
339
+ The next full headed run passed 276 cases and failed one receipt Undo/Unpin assertion in
340
+ strict mode: bare `[data-node-id]` matched both the card and a transient command-bar chip.
341
+ The card still showed the expected `After B` text. Five card assertions in that case now
342
+ explicitly target `.canvas-node`; the unseen-human-edit and pin-set checks are unchanged.
343
+ Ten consecutive headed repetitions passed. This second failed run, including the DOM trace
344
+ and screenshot, remains in `/tmp/pmx-cursor-final-gates.T08vva`.
345
+
346
+ The third full headed run passed 276 cases and failed the rich-relation hover handoff
347
+ assertion. The trace shows 184 ms between starting the blank-canvas pointer move and reading
348
+ the class, beyond the intentional 120 ms hover grace; the two requested animation frames
349
+ alone took 115 ms. That test now drives real pointer events with controlled 50 ms crossings
350
+ and a 500 ms blank-canvas control, then resumes normal time. Three repetitions passed,
351
+ removing the grace in a test-only served bundle failed at the short-crossing assertion,
352
+ and three more repetitions passed after removing the mutation. The probe asserted a unique
353
+ bundle replacement and a loaded runtime marker; no mutation code remains in the tests.
354
+ No hover/store/CSS production code changed. The real-time cursor measurements above use no
355
+ controlled clock. The third failed run is retained in `/tmp/pmx-cursor-delivery-gates.ozvSAA`;
356
+ hover red/green evidence is in `/tmp/pmx-cursor-hover-clock.Z1UYwU`.
357
+
358
+ The fourth full run passed 274 cases and exposed two product races plus a ghost-test sampling
359
+ gap, retained in `/tmp/pmx-cursor-final-browser.7Mdqdq`:
360
+
361
+ - A painted shortcut overlay could miss immediate Escape while the App keyboard effect still
362
+ closed over its previous state. The keyboard subscription now updates at layout commit.
363
+ - An earlier same-tab Fit camera echo arrived during a newer Fit animation and cancelled it.
364
+ Viewport writes now carry the existing tab identity; only the originating tab ignores that
365
+ echo. Peer tabs and explicit agent commands still apply the camera. This is echo metadata,
366
+ not an authorization mechanism.
367
+ - The ghost test's best rAF sample was 30.5px from the target, and it did not observe the
368
+ `animationend` endpoint before removal. It now also samples that endpoint in capture phase.
369
+ Position/size thresholds and normal frame samples remain; no ghost rendering or timing changed.
370
+
371
+ The keyboard and camera interleavings both failed deterministically before their fixes. The
372
+ camera case rendered a 250px card instead of completing the newer zoom to 312.5px. Afterwards,
373
+ 18 headed checks passed: three each of the two regressions, original Graph and attachment
374
+ cases, ghost settling and two-client cursor motion. The camera regression also checks a peer
375
+ receives both zooms and an agent command still overrides both tabs. Evidence is retained in
376
+ `/tmp/pmx-cursor-races.S1FpCT`.
377
+
378
+ An intermediate measurement repeated the sweeps after the keyboard/camera fixes.
379
+ Its portal-served bundle hash matched that built bundle; six sweeps and an additional recording
380
+ control maintained about 60 receiver frames/s. Those measurements, hash and failed encodes are
381
+ also in `/tmp/pmx-cursor-races.S1FpCT`.
382
+
383
+ The next serial gates in `/tmp/pmx-cursor-stabilized.T2t2MW` passed build/typecheck, lint
384
+ (0 errors, existing 63 warnings/12 infos), 1,445 unit tests, 306 client tests, coverage
385
+ (64.69% lines / 72.29% functions, both floors met) and fresh-workspace headed CLI E2E
386
+ (`/tmp/pmx-canvas-e2e.bf3lLB`). The full headed browser gate finished **278 passed, 1 failed**.
387
+ The failure was `canvas-app.pw.ts`'s curated structured notes / AX host-context case, so that
388
+ run did **not** establish stability.
389
+
390
+ Its trace confirmed a hosted pin-ordering race: poll `since=1378` starts at
391
+ 187162 ms, before Clear all's POST at 187168 ms. The poll returns old pin event 1380, restoring
392
+ the cleared pin in the UI; the intended re-pin at 189205 ms consequently submits `nodeIds:[]`.
393
+ Focus reaches the host, but the pinned card is absent. Pin code and hosted two-second polling
394
+ were not changed here; this was not reproduced against a separate baseline build and is not
395
+ claimed conclusively pre-existing. The trace, failure screenshot and video remain with that
396
+ run; the blocker was reported to the parent orb before further changes.
397
+
398
+ The pin revision fence now covers local writes as well as incoming frames. Poll replies that
399
+ cross a local write or a newer authoritative read skip only their stale pin frames, then read
400
+ the canonical server pin set from the existing event snapshot, without replaying its other
401
+ frames. This costs a snapshot read on pin reconciliation rather than adding a new endpoint.
402
+ The agent-facing pinned-context brief is not authoritative for membership: it filters retired
403
+ cards. Pending writes reconcile after completion, including refused and normalized requests.
404
+ Board changes invalidate old-board continuations. This adds no
405
+ server clock, changes no 20-pin limit and does not suppress later peer or agent writes.
406
+ Both delayed incremental-poll and snapshot regressions failed before the fix
407
+ (`/tmp/pmx-pin-order-red.ahE6cW`), then passed alongside the original hosted-context and restore
408
+ cases (`/tmp/pmx-pin-order-green.K53uol`, four headed passes). Self-review also reproduced and
409
+ fixed an old-board pending-write leak (`/tmp/pmx-pin-board-red.1q5kkz`): a previous board's
410
+ late acknowledgement must not block canonical normalization or release the new board's
411
+ pending Clear all. No test timeout or pin assertion was relaxed.
412
+
413
+ The following full run (`/tmp/pmx-cursor-pin-gates.h4HfvL`) finished 280 passed / 1 failed:
414
+ the camera regression completed both tabs' zoom and agent-override assertions, then its
415
+ `route.fetch` was closed during fixture teardown. The route now drains with
416
+ `unrouteAll({behavior:'wait'})` before the fixture closes; errors are not suppressed.
417
+ During that run, self-review found the filtered-brief/raw-membership distinction above.
418
+ Its built bundles and pre-correction patch are retained separately from the end-of-run
419
+ source. The retired-pin regression failed against that intermediate bundle
420
+ (`/tmp/pmx-pin-retired-red.Qm0kPq`), so that run is not counted as final-build verification.
421
+
422
+ **Final serial gates passed** in `/tmp/pmx-cursor-delivery-final.mwP76f`: build/typecheck,
423
+ lint (0 errors, existing 63 warnings/12 infos), 1,445 unit, 307 client, coverage (64.64% lines /
424
+ 72.25% functions), fresh-workspace headed CLI E2E (`/tmp/pmx-canvas-e2e.5XOntZ`), 12 repeated
425
+ headed pin/camera regressions and all **282 headed browser cases**, including 600/1024/1920
426
+ reference widths. These execute real HTTP and stdio MCP paths as well as human UI gestures.
427
+ The table's final six portal sweeps, idle control and served hash are in
428
+ `/tmp/pmx-cursor-live-final.gi4axw`; the served index SHA256 matches the final build
429
+ `a5f5a1c1f73d43c3254c79601cc9e303c63d839983e1f569f82f0d45c95b229d`.
430
+ The inspected final clip shows continuous movement, without blanking or two-second stalls.
431
+ A live-check setup attempt used the wrong supervised port and inconsistent browser launch
432
+ flags, leaving blank tabs; it was corrected before these measurements, not counted as a run.
433
+
434
+ This demonstrates the PMX-side delay and its fix through an orb portal, not the exact Amp
435
+ embedded container. Native Copilot/WebKit, Windows UI and registry installation were not
436
+ exercised for this batch. The owner's live SQLite content was not used or modified. The
437
+ owner subsequently authorized a combined commit/push from the parent orb after validation;
438
+ this orb hands back source and evidence only. No release, tag or version change is authorized.
439
+
440
+ ### Combined acceptance follow-up, 2026-10-12
441
+
442
+ The parent orb integrated that frozen patch with the owner's card/relation star removal.
443
+ Authorship remains in hints, including bare lines; pins, read marks and the session lens
444
+ are unchanged. Star regressions failed before the removal and passed afterwards. Headed
445
+ 600/1024/1440/1920 width and nine-theme inspections retained the hints. Card corner resizing
446
+ persisted after reload in a disposable database; test 01 means resizing the browser or pane,
447
+ not the card. The live acceptance board has a focused agent review card and relation.
448
+
449
+ The first combined full headed run passed 281 cases and failed attention history. Its trace
450
+ shows pin POST at 231783 ms, an incremental pin frame captured at 231792 ms, and canonical
451
+ snapshot reads at 231796/231817 ms. Revision fencing skipped the older frame correctly but
452
+ canonical reconciliation did not update the semantic attention reducer, so the card stayed
453
+ pinned while its Context updated notice/history disappeared. This is a product regression,
454
+ not a weakened selector or timeout. Feeding only the accepted canonical pin frame into the
455
+ existing attention reducer fixes it without replaying other snapshot frames. The extended
456
+ existing attention test holds the incremental frame: it failed before the fix, then passed
457
+ five consecutive headed repetitions, including later near-pin history. First-failure evidence
458
+ is retained in `/tmp/pmx-combined-acceptance-final`, red proof in `/tmp/pmx-attention-red`,
459
+ and focused green in `/tmp/pmx-attention-green`.
460
+
461
+ Final combined serial gates passed in `/tmp/pmx-combined-acceptance-corrected`: build,
462
+ typecheck, lint (0 errors, 63 existing warnings/12 infos), 1,445 unit, 307 client,
463
+ coverage (64.67% lines/72.25% functions), fresh headed CLI E2E with real HTTP/stdio MCP,
464
+ and all 282 headed browser cases. Agent-skill mirror validation skipped absent trees;
465
+ that skip is not a validation claim. The preceding 281-pass/1-fail run remains recorded.
466
+ The initial CLI invocation used the wrong headed environment key; its successful result is
467
+ not counted as headed proof. The final invocation uses `PMX_E2E_HEADED=1` explicitly.
468
+
469
+ ### Owner rehearsal fixes and shared Home relation presets, 2026-10-13
470
+
471
+ The medium rehearsal orb found five numbered failures: 01 toolbar crowding with two sessions;
472
+ 07 inert expanded Markdown wiki links; 11 narrow Graph Updates/filter/search overlap;
473
+ 14 blank Medium cadence acceptance; and 19 HTML replacement errors displacing healthy paint
474
+ and graph data/spec updates leaving stale charts. Its frozen 15-file patch fixes those
475
+ contracts. It passed 1,445 unit and 307 client cases, headed CLI and 288 headed browser cases
476
+ before the final localized Graph-search CSS correction; nine targeted width/chrome cases
477
+ verify that final worker state. Those counts do not certify the parent's combined changes.
478
+ Intermittent Plex loading and a Flow Start failure passed unchanged focused repetitions and
479
+ the quiet full run, but their causes remain unconfirmed, not diagnosed away.
480
+
481
+ The owner's clarification moves editable relation templates into Home, shared like Categories.
482
+ Explicit application copies a saved template onto a selected board without rewriting edges;
483
+ later template edits/deletion do not retroactively change existing boards. The board dropdown
484
+ filters All relations plus kinds actually present, not preset names or Custom vocabulary.
485
+ The obsolete per-board editor is removed. The same public registry exposes template CRUD
486
+ through HTTP, SDK, CLI and MCP; existing scope fences protect workspace writes. The catalog
487
+ persists in the workspace database's existing meta store, including deleted starter templates.
488
+
489
+ The kept public-operation regression failed before the new operations and passed afterwards.
490
+ It verifies restart persistence without changing cards/connections. Existing transport/fence
491
+ tests now cover the two actions. The browser contract covers Home creation, reload, application,
492
+ deletion, two asymmetric boards, unchanged edges and clearing a vanished kind filter.
493
+ Its first run reached all feature assertions but failed test cleanup on an invented DELETE
494
+ edge URL; the trace proves 404. Cleanup now uses the documented DELETE body. This was a test
495
+ error, not a product refusal, and the failed attempt remains in
496
+ `/tmp/pmx-home-relations-gates/first-focused-failure`.
497
+
498
+ Rendered inspection caught Home's new button clipping at 390 px (right edge 394.17).
499
+ The same executed boundary check failed before toolbar wrapping and passed afterwards
500
+ (right edge 187.61). The browser contract retains that width boundary. Narrow dialog controls
501
+ fit horizontally and remain reachable by scrolling; screenshots are inspected in
502
+ `.amp/in/artifacts/home-relations/`. The owner portal's old bundle stays unchanged while the
503
+ combined tree is built and tested in an isolated local worktree with a separate database.
504
+
505
+ The main vision, context extension, historical review, design contract, public API references
506
+ and acceptance instructions are aligned with this model. Owner results/notes and the live
507
+ review fixture are preserved, not reset. Owner acceptance, curation evaluation, full sketch
508
+ parity and native-host checks remain separate. No release/tag/publish or version bump.
509
+
510
+ The first parent combined full headed gate passed 288 cases and failed JSON-viewer recovery
511
+ in srcdoc mode. Its trace shows interception removed at 886609.9 ms, a poll started at
512
+ 886612.1 ms without completion, and an accepted recovery PATCH at 886615.6 ms. This matches
513
+ the independently reproduced Chromium/Playwright interception-lifetime stall documented
514
+ above. Both HTML/JSON recovery tests now install one route before navigation and toggle
515
+ replacement failure without removing that route; exact retry counts, healthy-paint and
516
+ recovery assertions remain unchanged. The first failure is retained in
517
+ `/tmp/pmx-home-relations-gates/first-full-failure`, not counted as a pass.
518
+
519
+ Final combined serial gates pass in `/tmp/pmx-home-relations-gates`: build/typecheck,
520
+ lint (0 errors, existing 63 warnings/12 infos), **1,446 unit**, **307 client**, coverage
521
+ (64.68% lines / 72.31% functions), fresh headed CLI E2E with real HTTP/stdio MCP,
522
+ 72 focused server/transport/fence cases, five final focused UI cases, and all **289 headed
523
+ browser cases**, including 600/1024/1920 reference widths. The final full run includes the
524
+ 390 px Home wrapping and final Graph-sidebar correction. Main source and the tested isolated
525
+ worktree match byte-for-byte; generated bundles/catalogs are copied from that tested build.
526
+ The preceding CI run passed four jobs but Windows was cancelled. CI for this delivery and
527
+ the owner's requested fresh numbered rehearsal remain separate from these local gates.
528
+
529
+ ### Fresh rehearsal 07: document save before wiki creation, 2026-10-13
530
+
531
+ The exact `f5032c5` delivery subsequently passed all five jobs in
532
+ [CI 38408653667](https://github.com/pskoett/pmx-canvas/actions/runs/38408653667).
533
+ Fresh manual rehearsal still reproduced a wiki-creation failure twice: expanded Source Save,
534
+ Back to document, click an unresolved link, then Create. Rich-editor blur normalized the
535
+ Markdown and PATCHed revision 23; the dialog's captured pre-normalization content then PATCHed
536
+ the same revision 23. The first write advanced the revision, so the second correctly refused
537
+ binding after creating the board. Waiting in Document did not prevent a later blur save.
538
+
539
+ The parent regression reproduces that refusal on unchanged product code. The narrow fix
540
+ finishes the expanded document's blur save queue before opening a wiki dialog or navigating.
541
+ It stops if the board incarnation changes or the save leaves a dirty/refused draft. The
542
+ dialog's source capture and server revision guard are unchanged; a real peer write after
543
+ the dialog opens remains refused and its content is preserved.
544
+
545
+ Local follow-up gates pass in `/tmp/pmx-wiki-blur-gates`: build/typecheck/lint (0 errors,
546
+ 63 existing warnings/12 infos), 1,446 unit, 307 client, all 40 boards/Markdown sanitize and
547
+ native Save/ACK/ABA cases, two inline Markdown cases and five repeated wiki cases. The
548
+ unchanged-product red trace and inspected before/after media are in
549
+ `.amp/in/artifacts/wiki-blur/`. A separate headed real-pointer flow created and opened the
550
+ new board; an independent API read confirmed the source's durable board-ID binding. The
551
+ clip holds the last captured frame for two seconds so the actual destination is readable.
552
+
553
+ At this checkpoint the follow-up is local/uncommitted, with tested index SHA256
554
+ `3c003e08ebd8782c28db46c2cd5c2e777cae1cc23be0afbd9a7138799aa2c233`.
555
+ The owner daemon remains on `f5032c5` while the medium orb completes its full numbered pass.
556
+ Source-only retest handoff precedes combined integration, commit/push and live refresh;
557
+ no current owner results, notes or live database were changed by this isolated validation.
558
+ The medium orb's corrected 390 px evidence establishes the Updates/filter overlap with the
559
+ sidebar **open**, not closed. Two pinned boards and one external writer also push the context
560
+ chip's right edge to 429.09 px in a 390 px viewport. Required 600/1024 controls pass separately.
561
+
562
+ The extended existing browser regression reproduces both defects: an ordinary filter click
563
+ is intercepted by Updates, and with only the positioning fix the context edge remains
564
+ 429.09 px. The local follow-up positions Updates from the measured memory-stage top, so
565
+ wrapped tabs and counts cannot invalidate a fixed header offset. The existing content-based
566
+ compact step now includes external-writer text, preserving avatars, activity access and an
567
+ accessible label. No owner daemon refresh or guide-result reset accompanies these tests.
568
+ First-failure traces and logs are retained in `/tmp/pmx-responsive-gates`.
569
+
570
+ Final same-source serial gates pass in `/tmp/pmx-responsive-gates`: build/typecheck/lint
571
+ (0 errors, existing 63 warnings/12 infos), **1,446 unit**, **307 client**, coverage
572
+ (64.66% lines / 72.31% functions), and all **289 headed browser cases**, including the
573
+ 600/1024/1920 reference projects. The fresh CLI/HTTP/stdio MCP gate also passes with explicit
574
+ `DISPLAY=:88 PMX_E2E_HEADED=1 bash scripts/e2e-cli-coverage.sh`. An earlier invocation omitted
575
+ that flag; its log is retained separately and is not the headed proof.
576
+
577
+ Inspected final media in `.amp/in/artifacts/narrow-chrome/` shows open/closed populated Graph
578
+ at 390 px, all nine themes, and 600/1024/1920 layouts. Real-pointer recording exercises
579
+ filter open/close, search, context, external activity and Updates. Executed measurements keep
580
+ the context chip inside the viewport (right edge 376 px), and the collapsed Updates trigger
581
+ below Filters and clear of search. Open overlay panels intentionally cover the canvas;
582
+ the narrow graph remains cramped with its sidebar open, and dense Fit labels need local
583
+ focus. These checks do not establish touch, native-host or full sketch-parity acceptance.
584
+
585
+ The medium orb independently built the frozen five-file source/test patch against clean
586
+ `f5032c5` in a disposable checkout. Its served index matches the parent tested build:
587
+ SHA256 `a42b09b475b9dad7afda0fc68f0cdec49dd43c9bd57d54b381a1efa2525ac2e0`.
588
+ Manual retests pass trailing-newline creation with durable source binding, refusal after a
589
+ genuine peer edit, and populated Graph interactions at 390/600/760/390. Its read-only live
590
+ preservation comparison confirms unchanged layouts for all 11 boards (96 cards, 63 edges),
591
+ including guide results/notes, pins, cameras and tours. Categories, folders and shared presets
592
+ also match. Read inspection advanced `lastReadAt` on three guide cards, not their content or
593
+ evidence validation. No further check depends on the old live bundle. Disposable cleanup and
594
+ the qualified numbered report remain separate; no owner acceptance results are inferred.