pmx-canvas 0.11.0 → 0.12.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.
- package/.github/extensions/pmx-canvas/extension.mjs +4 -1
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +440 -18
- package/CHANGELOG.md +51 -0
- package/dist/amp-plugin/pmx-canvas/LICENSE +21 -0
- package/dist/amp-plugin/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
- package/dist/amp-plugin/pmx-canvas/index.js +5445 -0
- package/dist/amp-plugin/pmx-canvas/runtime.json +3 -0
- package/dist/amp-plugin/pmx-canvas/shared-runtime.mjs +194 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/SKILL.md +267 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1168 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/jwt.ts +17 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/login.ts +12 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/middleware.ts +13 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/routes/auth.ts +13 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/investigation-board/src/handlers/users.ts +27 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/mcp.json +36 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/ax-html-control-surface.md +101 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/codex-app-adapter.md +151 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/excalidraw-diagram-authoring.md +150 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/full-reference.md +1839 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/github-copilot-app-adapter.md +223 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/html-primitives.md +139 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/importing-context.md +132 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/installing-pmx-canvas.md +301 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +117 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +908 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-orchestration/SKILL.md +141 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-testing/SKILL.md +266 -0
- package/dist/amp-plugin/pmx-canvas/start-mcp.mjs +14857 -0
- package/dist/amp-plugin/pmx-canvas/tools.json +10963 -0
- package/dist/canvas/chunks/{abnfDiagram-N423BO3Z-p8dtp6va.js → abnfDiagram-N423BO3Z-cwtsds5d.js} +1 -1
- package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
- package/dist/canvas/chunks/{architectureDiagram-T3A2C74G-5jhmxrzf.js → architectureDiagram-T3A2C74G-b4xc9tpz.js} +3 -3
- package/dist/canvas/chunks/{blockDiagram-VBNYF7ZC-pw1fa9yb.js → blockDiagram-VBNYF7ZC-ahp3yxxs.js} +7 -7
- package/dist/canvas/chunks/{c4Diagram-5PPSVZJV-x07nq0tt.js → c4Diagram-5PPSVZJV-nappnay7.js} +4 -4
- package/dist/canvas/chunks/classDiagram-JCYQIIEL-k1j2xc1t.js +1 -0
- package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-33x08xf2.js +1 -0
- package/dist/canvas/chunks/{cose-bilkent-JH36ORCC-nm39npq0.js → cose-bilkent-JH36ORCC-a428syda.js} +1 -1
- package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
- package/dist/canvas/chunks/{cynefinDiagram-MW4NZA55-vdxrwahz.js → cynefinDiagram-MW4NZA55-nspsqebj.js} +1 -1
- package/dist/canvas/chunks/{dagre-VZM6K2ZE-bqdm7wpd.js → dagre-VZM6K2ZE-8y6177fh.js} +2 -2
- package/dist/canvas/chunks/{diagram-7IWD3JNH-gs5gpr93.js → diagram-7IWD3JNH-vym028wn.js} +4 -4
- package/dist/canvas/chunks/{diagram-B4RE2ZJO-cgwjg47s.js → diagram-B4RE2ZJO-jddqb8sy.js} +1 -1
- package/dist/canvas/chunks/{diagram-LBJQPF4R-w3vahpav.js → diagram-LBJQPF4R-bjwbpkrn.js} +1 -1
- package/dist/canvas/chunks/{diagram-Q27KOJAE-42837z6h.js → diagram-Q27KOJAE-j6ph6hcx.js} +2 -2
- package/dist/canvas/chunks/{diagram-UB23O5K3-4fz83q59.js → diagram-UB23O5K3-p09w8jej.js} +1 -1
- package/dist/canvas/chunks/{ebnfDiagram-BXEA7PRR-zphtgegj.js → ebnfDiagram-BXEA7PRR-j975ycq5.js} +1 -1
- package/dist/canvas/chunks/{erDiagram-JOGREHBK-zvbbdxp4.js → erDiagram-JOGREHBK-sxp6hjn8.js} +5 -5
- package/dist/canvas/chunks/eventmodeling-45OFAUF4-xzfgn6xg.js +1 -0
- package/dist/canvas/chunks/flowDiagram-UKHOOZJN-2nsmkskb.js +1 -0
- package/dist/canvas/chunks/{ganttDiagram-PKOTCBZU-282jzycm.js → ganttDiagram-PKOTCBZU-4tv230y2.js} +2 -2
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
- package/dist/canvas/chunks/{gitGraphDiagram-DS77QQ5N-vqqy6p1b.js → gitGraphDiagram-DS77QQ5N-mqgmnw9g.js} +1 -1
- package/dist/canvas/chunks/{index-wgv7en21.js → index-037z5dz2.js} +2 -2
- package/dist/canvas/chunks/{index-w2mra17t.js → index-081n3har.js} +1 -1
- package/dist/canvas/chunks/{index-353m7b0p.js → index-5n03dmb9.js} +1 -1
- package/dist/canvas/chunks/{index-yw8h9vha.js → index-60pgzdqe.js} +1 -1
- package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
- package/dist/canvas/chunks/{index-vv56h019.js → index-8rjes9r6.js} +1 -1
- package/dist/canvas/chunks/{index-nprm96xp.js → index-9022d1n9.js} +1 -1
- package/dist/canvas/chunks/{index-194m3hc3.js → index-9b02042t.js} +1 -1
- package/dist/canvas/chunks/{index-0rk4gp1g.js → index-ap4q4vez.js} +1 -1
- package/dist/canvas/chunks/{index-rh7nv68n.js → index-dyp2nhd3.js} +1 -1
- package/dist/canvas/chunks/index-frvta4tm.js +2 -0
- package/dist/canvas/chunks/{index-s4j678gj.js → index-h9ycj8n2.js} +1 -1
- package/dist/canvas/chunks/{index-fjtdggjn.js → index-mergmj97.js} +2 -2
- package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
- package/dist/canvas/chunks/{index-3cy1bzwh.js → index-nz8qbd1p.js} +1 -1
- package/dist/canvas/chunks/{index-d3b3gqe9.js → index-qhfrazv3.js} +1 -1
- package/dist/canvas/chunks/{index-6qmsnxwy.js → index-v119nznk.js} +4 -4
- package/dist/canvas/chunks/{index-r2fyc9w1.js → index-vpt37m3d.js} +6 -6
- package/dist/canvas/chunks/{index-qj8fxwsf.js → index-y9ma6azy.js} +1 -1
- package/dist/canvas/chunks/{index-tb1wf525.js → index-zx0j3a2z.js} +26 -26
- package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
- package/dist/canvas/chunks/{infoDiagram-6WML65LV-v1yvggqj.js → infoDiagram-6WML65LV-qv97qq6a.js} +2 -2
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
- package/dist/canvas/chunks/{journeyDiagram-NVQOT4AX-zjcffveh.js → journeyDiagram-NVQOT4AX-sv67zats.js} +5 -5
- package/dist/canvas/chunks/{kanban-definition-27J2QSJJ-dakqtfp1.js → kanban-definition-27J2QSJJ-k2pfam6p.js} +1 -1
- package/dist/canvas/chunks/{mermaid.core-j2geswrd.js → mermaid.core-83r0fdce.js} +4 -4
- package/dist/canvas/chunks/{mindmap-definition-FAOFIHXS-142xhr3k.js → mindmap-definition-FAOFIHXS-vg2newm1.js} +1 -1
- package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
- package/dist/canvas/chunks/{pegDiagram-VL7TDLO6-5wvk7vsd.js → pegDiagram-VL7TDLO6-k2h7zc5n.js} +1 -1
- package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
- package/dist/canvas/chunks/{pieDiagram-7S7Q4E2Y-ztdhwycc.js → pieDiagram-7S7Q4E2Y-hg169p1v.js} +2 -2
- package/dist/canvas/chunks/{quadrantDiagram-CIZ2JOQS-c5p9gmg6.js → quadrantDiagram-CIZ2JOQS-bxtvsq0b.js} +5 -5
- package/dist/canvas/chunks/radar-I7S5WNFK-w7ka0drw.js +1 -0
- package/dist/canvas/chunks/railroad-3IZDKUUU-y3vg318x.js +1 -0
- package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-6hqvcz3c.js +1 -0
- package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-vcae260m.js +1 -0
- package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-0dbyme23.js +1 -0
- package/dist/canvas/chunks/{railroadDiagram-AXF67PYL-xkmqkjwf.js → railroadDiagram-AXF67PYL-njyhcp4p.js} +1 -1
- package/dist/canvas/chunks/{requirementDiagram-LRYGKXZP-9wm2dyaw.js → requirementDiagram-LRYGKXZP-2z6v09gm.js} +4 -4
- package/dist/canvas/chunks/{sankeyDiagram-W5VNT64P-2w19etgb.js → sankeyDiagram-W5VNT64P-15mzam0e.js} +1 -1
- package/dist/canvas/chunks/{sequenceDiagram-SI44F4Z6-0jn0vwmz.js → sequenceDiagram-SI44F4Z6-rbshyd2c.js} +12 -12
- package/dist/canvas/chunks/{sizeCapture-X5ZJPWSS-x75epwdq.js → sizeCapture-X5ZJPWSS-sg26xwts.js} +1 -1
- package/dist/canvas/chunks/{stateDiagram-OKZ733FA-schjpy6d.js → stateDiagram-OKZ733FA-6eahp98e.js} +1 -1
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
- package/dist/canvas/chunks/{swimlanes-SLNWSIFB-gkw4xce3.js → swimlanes-SLNWSIFB-ze5db10t.js} +1 -1
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
- package/dist/canvas/chunks/{timeline-definition-Z64GVDOM-x7nkcy01.js → timeline-definition-Z64GVDOM-vnp7jyy8.js} +3 -3
- package/dist/canvas/chunks/treeView-QDETBFTQ-6ysffnm6.js +1 -0
- package/dist/canvas/chunks/treemap-6X3UGDF4-m3h9p066.js +1 -0
- package/dist/canvas/chunks/vennDiagram-T6HMQDX7-0qrnb7mj.js +34 -0
- package/dist/canvas/chunks/wardley-OPB4EBWU-dp37drwx.js +1 -0
- package/dist/canvas/chunks/{wardleyDiagram-T6FBY63Y-t1j52t9r.js → wardleyDiagram-T6FBY63Y-8nxg8wqt.js} +4 -4
- package/dist/canvas/chunks/{xychartDiagram-ELKLHX3M-38t16pme.js → xychartDiagram-ELKLHX3M-nj921e7s.js} +5 -5
- package/dist/canvas/global.css +94 -1
- package/dist/canvas/index.js +154 -145
- package/dist/canvas/mcp-app.html +600 -498
- package/dist/json-render/index.css +1 -1
- package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
- package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
- package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
- package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
- package/dist/types/client/nodes/PromptNode.d.ts +1 -0
- package/dist/types/client/nodes/ViewerFrame.d.ts +1 -1
- package/dist/types/client/nodes/WorkCard.d.ts +7 -0
- package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
- package/dist/types/client/state/canvas-store.d.ts +15 -0
- package/dist/types/client/state/human-store.d.ts +2 -0
- package/dist/types/client/state/intent-bridge.d.ts +4 -2
- package/dist/types/client/state/relation-store.d.ts +11 -0
- package/dist/types/client/types.d.ts +1 -1
- package/dist/types/json-render/catalog.d.ts +2 -2
- package/dist/types/server/agent-presence.d.ts +1 -0
- package/dist/types/server/ax-interaction.d.ts +1 -0
- package/dist/types/server/ax-state-manager.d.ts +10 -2
- package/dist/types/server/board-local.d.ts +4 -0
- package/dist/types/server/board-move.d.ts +38 -0
- package/dist/types/server/canvas-db.d.ts +12 -2
- package/dist/types/server/canvas-operations.d.ts +5 -6
- package/dist/types/server/canvas-provenance.d.ts +1 -1
- package/dist/types/server/canvas-serialization.d.ts +1 -0
- package/dist/types/server/canvas-state.d.ts +84 -20
- package/dist/types/server/card-relocation.d.ts +6 -0
- package/dist/types/server/context-reads.d.ts +3 -1
- package/dist/types/server/human-presence.d.ts +1 -1
- package/dist/types/server/index.d.ts +16 -5
- package/dist/types/server/intent-registry.d.ts +8 -4
- package/dist/types/server/knowledge-lifecycle.d.ts +4 -2
- package/dist/types/server/mutation-history.d.ts +7 -5
- package/dist/types/server/operations/registry.d.ts +2 -0
- package/dist/types/server/trace-manager.d.ts +1 -0
- package/dist/types/shared/ax-kinds.d.ts +6 -0
- package/dist/types/shared/ax-surface-protocol.d.ts +8 -0
- package/dist/types/shared/human-presence.d.ts +1 -0
- package/dist/types/shared/lifecycle-status.d.ts +2 -0
- package/docs/RELEASE.md +21 -14
- package/docs/agent-plugin.md +22 -2
- package/docs/amp-plugin.md +270 -0
- package/docs/cli.md +42 -3
- package/docs/design/GuestName.dc.html +50 -0
- package/docs/design/PluginLogo.svg +7 -0
- package/docs/design/WorkCards.dc.html +39 -0
- package/docs/design/canvas.json +16 -0
- package/docs/design/plugin-logo.png +0 -0
- package/docs/design.md +111 -8
- package/docs/evals/agents-md-sections.md +38 -0
- package/docs/http-api.md +128 -10
- package/docs/mcp.md +61 -9
- package/docs/node-types.md +71 -1
- package/docs/plans/plan-009-tech-debt-backlog.md +1 -1
- package/docs/plans/plan-019-post-0.9-roadmap.md +44 -20
- package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
- package/docs/product-vision-2026-09.md +33 -17
- package/docs/sdk.md +18 -0
- package/package.json +6 -3
- package/plugins/pmx-canvas/assets/preview.png +0 -0
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +4 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +2 -2
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +440 -18
- package/skills/data-analysis/SKILL.md +13 -26
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +3 -0
- package/skills/pmx-canvas/SKILL.md +248 -842
- package/skills/pmx-canvas/evals/evals.json +110 -5
- package/skills/pmx-canvas/references/full-reference.md +142 -28
- package/skills/pmx-canvas/references/html-primitives.md +7 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +61 -11
- package/skills/pmx-canvas/references/tours-and-recording.md +39 -6
- package/skills/pmx-canvas/references/workbench-workflows.md +908 -0
- package/skills/pmx-canvas-testing/SKILL.md +7 -5
- package/skills/published-consumer-e2e/SKILL.md +25 -8
- package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +51 -75
- package/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/web-artifacts-builder/SKILL.md +6 -0
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +2 -2
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +8 -8
- package/src/cli/commands/apps.ts +1 -0
- package/src/cli/commands/boards.ts +30 -0
- package/src/client/App.tsx +20 -4
- package/src/client/canvas/AttentionHistory.tsx +10 -2
- package/src/client/canvas/BoardMoveDialog.tsx +225 -0
- package/src/client/canvas/CanvasNode.tsx +45 -2
- package/src/client/canvas/CanvasViewport.tsx +38 -9
- package/src/client/canvas/ContextMenu.tsx +34 -12
- package/src/client/canvas/EdgeEditor.tsx +149 -0
- package/src/client/canvas/EdgeLayer.tsx +87 -16
- package/src/client/canvas/ExpandedNodeOverlay.tsx +4 -0
- package/src/client/canvas/GroupNavigation.tsx +85 -0
- package/src/client/canvas/RelationsPanel.tsx +9 -0
- package/src/client/canvas/SelectionBar.tsx +21 -0
- package/src/client/canvas/SessionPanel.tsx +35 -1
- package/src/client/canvas/TextPrompt.tsx +18 -1
- package/src/client/canvas/TopBar.tsx +30 -0
- package/src/client/canvas/canvas-area.ts +1 -1
- package/src/client/nodes/ExtAppFrame.tsx +26 -10
- package/src/client/nodes/MarkdownNode.tsx +6 -7
- package/src/client/nodes/PromptNode.tsx +32 -3
- package/src/client/nodes/StatusNode.tsx +12 -0
- package/src/client/nodes/StatusSummary.tsx +11 -0
- package/src/client/nodes/ViewerFrame.tsx +21 -10
- package/src/client/nodes/WorkCard.tsx +175 -0
- package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
- package/src/client/state/attention-bridge.ts +5 -0
- package/src/client/state/attention-store.ts +1 -0
- package/src/client/state/canvas-store.ts +185 -15
- package/src/client/state/human-store.ts +22 -2
- package/src/client/state/intent-bridge.ts +19 -5
- package/src/client/state/relation-store.ts +127 -1
- package/src/client/theme/global.css +94 -1
- package/src/client/types.ts +1 -0
- package/src/mcp/server.ts +13 -3
- package/src/server/agent-presence.ts +43 -23
- package/src/server/ax-flow-loop.ts +6 -0
- package/src/server/ax-gate-ttl.ts +8 -1
- package/src/server/ax-interaction.ts +16 -10
- package/src/server/ax-state-manager.ts +17 -4
- package/src/server/ax-wait.ts +20 -6
- package/src/server/board-export.ts +19 -6
- package/src/server/board-local.ts +20 -0
- package/src/server/board-move.ts +297 -0
- package/src/server/canvas-db.ts +262 -160
- package/src/server/canvas-operations.ts +139 -109
- package/src/server/canvas-schema.ts +21 -0
- package/src/server/canvas-serialization.ts +2 -0
- package/src/server/canvas-state.ts +792 -159
- package/src/server/card-relocation.ts +53 -0
- package/src/server/code-graph.ts +4 -3
- package/src/server/context-reads.ts +83 -55
- package/src/server/demo-state.json +35 -15
- package/src/server/file-watcher.ts +30 -10
- package/src/server/human-presence.ts +18 -5
- package/src/server/index.ts +35 -15
- package/src/server/intent-registry.ts +43 -5
- package/src/server/knowledge-lifecycle.ts +32 -9
- package/src/server/lifecycle-status.ts +29 -1
- package/src/server/mcp-app-runtime.ts +26 -7
- package/src/server/mutation-history.ts +37 -8
- package/src/server/operations/composites.ts +6 -3
- package/src/server/operations/mcp-contracts.ts +15 -0
- package/src/server/operations/mcp.ts +36 -9
- package/src/server/operations/ops/annotation.ts +22 -1
- package/src/server/operations/ops/ax-await.ts +1 -0
- package/src/server/operations/ops/ax-timeline.ts +28 -2
- package/src/server/operations/ops/batch.ts +25 -11
- package/src/server/operations/ops/boards.ts +44 -3
- package/src/server/operations/ops/nodes.ts +70 -0
- package/src/server/operations/ops/query.ts +32 -3
- package/src/server/operations/ops/snapshots.ts +1 -0
- package/src/server/operations/registry.ts +49 -4
- package/src/server/server.ts +62 -16
- package/src/server/tour-control.ts +37 -12
- package/src/server/trace-manager.ts +4 -0
- package/src/server/web-artifacts/scripts/bundle-artifact.sh +2 -2
- package/src/server/web-artifacts/scripts/init-artifact.sh +8 -8
- package/src/shared/agent-context.ts +7 -1
- package/src/shared/auto-arrange.ts +5 -4
- package/src/shared/ax-kinds.ts +13 -0
- package/src/shared/ax-surface-protocol.ts +22 -0
- package/src/shared/human-presence.ts +1 -0
- package/src/shared/lifecycle-status.ts +2 -0
- package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +0 -1
- package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +0 -1
- package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +0 -1
- package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +0 -1
- package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +0 -1
- package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +0 -1
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +0 -1
- package/dist/canvas/chunks/index-1r72hdzb.js +0 -301
- package/dist/canvas/chunks/index-g3pwnqeb.js +0 -2
- package/dist/canvas/chunks/index-rft2hcz5.js +0 -2
- package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +0 -1
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +0 -70
- package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +0 -1
- package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +0 -1
- package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +0 -1
- package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +0 -1
- package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +0 -1
- package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +0 -1
- package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +0 -1
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +0 -1
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +0 -8
- package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +0 -1
- package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +0 -1
- package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +0 -34
- package/dist/canvas/chunks/wardley-OPB4EBWU-44pdddez.js +0 -1
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
# Plan 020: Wave 5, work planning, board moves and the Amp plugin
|
|
2
|
+
|
|
3
|
+
**Status (2026-10-27):** annotation parity is delivered; deliberate work-card authoring
|
|
4
|
+
is implemented, verified and owner-approved with option A's in-card editor.
|
|
5
|
+
Read-only live-task views are implemented and owner-approved. Relations/group
|
|
6
|
+
navigation is implemented, verified and owner-approved. Board moves are implemented;
|
|
7
|
+
the owner approved the state/DB changes and bundled guidance update. Acceptance row 06 passes
|
|
8
|
+
all seven Chromium cases; all four move cases also pass in Linux WebKit. The live portal
|
|
9
|
+
workflow and nine themes at 600/1024/1920 px were exercised and inspected. The approved
|
|
10
|
+
guidance update clears the discovery-reference failure: the full unit suite now passes
|
|
11
|
+
1,575 tests, and the targeted skill/discovery checks pass all 16. The broad browser run had
|
|
12
|
+
three failures, all passing in the focused rerun after a camera/test synchronization fix;
|
|
13
|
+
the two hosted-test timeout causes remain unconfirmed.
|
|
14
|
+
Unit/client and targeted Chromium/WebKit checks pass for the earlier increments. The earlier
|
|
15
|
+
live-card broad browser run had one intermittent hosted-tour failure that passed in isolation.
|
|
16
|
+
The move history and unsupported-binding boundaries below were approved before implementation.
|
|
17
|
+
The owner added the native Amp Canvas plugin to this wave on 2026-10-27. Its project-local
|
|
18
|
+
foundation, bound-board routing and automatic delivery are now pushed, with native acceptance
|
|
19
|
+
for the exercised delivery paths below. Guest naming is delivered; Jev implementation and
|
|
20
|
+
remaining native acceptance are tracked in the checkpoint below.
|
|
21
|
+
This replaces step 4's automatic work-item-to-card conversion and make/inline-board
|
|
22
|
+
pairing in [plan 019](plan-019-post-0.9-roadmap.md). 0.12 is a proposed release number,
|
|
23
|
+
not authorization to publish. Annotation contract changes are recorded in the Unreleased
|
|
24
|
+
changelog and transport docs; verification evidence will accompany the implementation.
|
|
25
|
+
|
|
26
|
+
**2026-10-31 checkpoint:** guest-name entry is pushed and CI-green; external guest access and
|
|
27
|
+
revocation remain unverified. All three Jev uses are implemented locally: opt-in relevance
|
|
28
|
+
ordering of already-compiled optional summaries, plus separately consented on-demand output
|
|
29
|
+
representation and review prioritization. They neither retrieve nor verify content and keep
|
|
30
|
+
pins and receipt accounting unchanged. See [the plugin contract](../amp-plugin.md#optional-context-relevance).
|
|
31
|
+
Native fictional evaluations pass; human-confirmed enablement, sleeping-orb resume and obsolete
|
|
32
|
+
queued-turn cancellation remain unaccepted. Final release-candidate gates are in progress in
|
|
33
|
+
independent orbs; implementation does not imply release approval.
|
|
34
|
+
|
|
35
|
+
**Decision source:** [Wave 5 planning conversation](https://ampcode.com/threads/T-01a17bd4-a7c9-714d-93a1-434f88c3bed7).
|
|
36
|
+
**Amp plugin direction:** [native Canvas plugin discussion](https://ampcode.com/threads/T-01a17d25-69d9-7693-986a-f3991de6a346).
|
|
37
|
+
That discussion establishes product intent and three initial Jev uses, not completed
|
|
38
|
+
implementation or permission to publish a plugin or expose a workspace.
|
|
39
|
+
Visual authority remains [design.md](../design.md), especially
|
|
40
|
+
[Uses](../design/Uses.dc.html), [Flows](../design/Flows.dc.html) and
|
|
41
|
+
[Relations](../design/Relations.dc.html). The owner reaffirmed Uses' Agent flow,
|
|
42
|
+
Dependencies and Decision drawings; the existing group/relation drawings remain the references.
|
|
43
|
+
|
|
44
|
+
## Agreed outcomes and boundaries
|
|
45
|
+
|
|
46
|
+
- Humans and agents can plan work together using ordinary cards and relations: work steps,
|
|
47
|
+
progress, dependencies, alternatives, conditions and illustrated loops.
|
|
48
|
+
- Showing work is deliberate. The agent can choose to present useful work without a separate
|
|
49
|
+
human request for every card. Creating a task, receiving an event or starting a session does
|
|
50
|
+
not automatically populate the canvas.
|
|
51
|
+
- Agents can use the same pen, text annotations and whole-mark eraser as humans. They can
|
|
52
|
+
point things out, circle a concern or write a question beside alternatives when useful,
|
|
53
|
+
alongside existing cards, relations and ghost feedback. Marks are ordinary board content,
|
|
54
|
+
not session records, approval gates or automatically generated commentary.
|
|
55
|
+
- Canvas nodes and edges own the authored plan. Existing session records own running session
|
|
56
|
+
work. Only a card deliberately representing a session task needs a reference to that record;
|
|
57
|
+
do not create hidden sessions or convert every card when a session starts.
|
|
58
|
+
- A linked task has one authoritative live status. The card and panel present that state,
|
|
59
|
+
rather than keeping two independently editable copies. Ordinary card status is authored data.
|
|
60
|
+
- Questions and alternatives can use existing card types. Defer a general `ask` node until a
|
|
61
|
+
concrete interaction needs it. Ordinary planning cards do not approve/reject native-agent work.
|
|
62
|
+
Existing PMX session controls and protections remain available; hiding session UI does not
|
|
63
|
+
cancel pending gates or bypass a fence. The native agent host retains its own approvals.
|
|
64
|
+
- Keep `policy`, `host-capability`, the named command registry, steering, delivery and fleet
|
|
65
|
+
behavior. Preserve explicit ghost previews, veto behavior and automatic ghosts unchanged.
|
|
66
|
+
- **Move to new board** is available from a multi-selection and a group's **⋯** menu. It moves,
|
|
67
|
+
rather than copies, the selected cards and leaves a portal on the source board. Both human
|
|
68
|
+
and agent transports must support the operation under the existing write protections.
|
|
69
|
+
- Opening a group is navigation within its existing board. Breadcrumbs and outside-link stubs
|
|
70
|
+
show its context; opening/closing the group never creates a board or changes card ownership.
|
|
71
|
+
- No reverse move, **Move into this board**, inline-board operation, arbitrary board merge,
|
|
72
|
+
execution scheduler or hosted-account work in Wave 5. The later Amp-plugin increment adds
|
|
73
|
+
board-owned concurrent routing and a private delivery journal, not a second state manager.
|
|
74
|
+
Existing selective-copy behavior is not a substitute for the move and remains separate.
|
|
75
|
+
- The native Amp plugin runs Canvas in an orb through Amp's Portal, connects canvas context
|
|
76
|
+
and steering to the right thread, and supports deliberate sharing and collaboration through
|
|
77
|
+
Amp. Amp owns execution, models, credentials, permissions and threads; PMX owns canvas content
|
|
78
|
+
and relationships. Do not introduce another chat surface, scheduler or required Canvas agent.
|
|
79
|
+
- **Guest identification:** use Amp's existing sharing and access model for now. Add a simple
|
|
80
|
+
way for a guest to enter their name so others can identify them. The name does not change
|
|
81
|
+
access or permissions. Do not build a separate guest-sharing or permission system in this wave.
|
|
82
|
+
- Jev is optional. Its initial uses are optional-context relevance, output representation and
|
|
83
|
+
review prioritization. The integration must remain useful with Jev disabled or unavailable.
|
|
84
|
+
|
|
85
|
+
## What the current code already provides
|
|
86
|
+
|
|
87
|
+
| Owner | Reuse and gap |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `src/client/nodes/StatusNode.tsx`, `StatusSummary.tsx` | Existing status rendering supports phase, detail and progress. Add deliberate human authoring and match the work-step drawing; do not invent a second task node type. |
|
|
90
|
+
| `src/shared/relations.ts` | Research, Dependencies, Decision and Flow vocabularies already exist, including `next`, `if-fails` and `loop`. Complete their interaction/visual treatment instead of building a workflow language. |
|
|
91
|
+
| `src/server/ax-interaction.ts`, `ax-flow-loop.ts`, `src/client/nodes/AxStepControls.tsx` | Explicit AX flows already materialize work and can execute bounded loops. An ordinary drawn loop must not acquire those execution semantics or AX stamps. |
|
|
92
|
+
| `src/server/canvas-state.ts`, `workboard.ts` | Work updates already mirror `axWorkStatus` and refresh requested workboards. Reuse the existing ownership/listener path for optional live views; no competing single-slot listener. |
|
|
93
|
+
| `src/server/operations/ops/boards.ts`, `CanvasStateManager.createBoardFromBoard` | Existing copy creates fresh IDs, resets parts of work state and copies selected assets. A move must not reuse this copy-then-delete path. |
|
|
94
|
+
| `src/shared/memory-graph.ts`, `src/server/memory-graph.ts` | Identities are `(boardId, cardId)`. Card IDs alone are not globally unique. Reuse the graph projection for relations and navigation. |
|
|
95
|
+
| `src/server/canvas-db.ts`, `knowledge-lifecycle.ts`, `context-reads.ts` | Persistence, review audit and read receipts have different lifetimes. Moving must preserve their meaning without inventing a fresh validation or read. |
|
|
96
|
+
| `src/server/mutation-history.ts`, `CanvasStateManager.restoreSnapshot` | Undo uses in-memory closures; snapshots can restore a board's old contents. A cross-board move needs an explicit history boundary, not independent source/destination undo. |
|
|
97
|
+
| `src/server/operations/ops/annotation.ts`, `src/server/index.ts`, `src/client/canvas/AnnotationLayer.tsx` | HTTP and SDK already create freehand/text marks; MCP exposes removal but not creation. Share the existing annotation model and renderer. SDK currently bypasses operation validation; parity must cover behavior, not just tool names. |
|
|
98
|
+
|
|
99
|
+
## Slice 1: author plans and show progress without Sessions
|
|
100
|
+
|
|
101
|
+
**Delivered authoring increment:** existing `status` nodes opt in with `data.workState`; detail
|
|
102
|
+
and nullable progress remain separate. [WorkCards](../design/WorkCards.dc.html)
|
|
103
|
+
records the selected in-card Save/Cancel editor. Creation and editing use ordinary
|
|
104
|
+
node operations. The current increment implements steps 4–5 as read-only live views, selected
|
|
105
|
+
by the owner: Show on board from task rows, no conversion or editing of the linked task
|
|
106
|
+
through the card, and no progress percentage without a source field.
|
|
107
|
+
|
|
108
|
+
The live reference is `data.workItemId` on a separate `status` node. It resolves against
|
|
109
|
+
the active board's existing AX task records, not a newly invented session-run record.
|
|
110
|
+
Derived display fields refresh on task updates, Undo/Redo and board reload. Creation
|
|
111
|
+
waits for the node to reach the browser before focusing it; duplicate task status chips
|
|
112
|
+
are suppressed. Existing selective board copies detach task references and attribution.
|
|
113
|
+
See [live task card contracts](../node-types.md#read-only-live-task-cards).
|
|
114
|
+
|
|
115
|
+
**Owners:** `StatusNode.tsx`, `StatusSummary.tsx`, `ContextMenu.tsx`, `SelectionBar.tsx`,
|
|
116
|
+
`src/client/state/node-factory.ts`, `intent-bridge.ts`, `src/server/canvas-schema.ts`,
|
|
117
|
+
`operations/ops/nodes.ts`, `src/shared/relations.ts` and their current styles.
|
|
118
|
+
|
|
119
|
+
Before adding UI, draw any missing authoring, live-link and move-dialog states in
|
|
120
|
+
`docs/design/` and record their decisions in `docs/design.md`. Reuse the approved drawings'
|
|
121
|
+
layout/tokens; do not treat their static work-step examples as specifications for missing controls.
|
|
122
|
+
|
|
123
|
+
1. Define one structured authored work-state field on the existing status card, using the
|
|
124
|
+
existing work vocabulary (`todo`, `in-progress`, `blocked`, `done`, `cancelled`) where
|
|
125
|
+
applicable. Keep text/detail and optional progress separate. Do not infer work state from
|
|
126
|
+
arbitrary phase text or a card title. Final field names belong to the implementation contract.
|
|
127
|
+
2. Add human creation/editing through existing canvas menus and in-flow controls; use the same
|
|
128
|
+
node mutations for the agent. Show completed/current/next steps using the established shell,
|
|
129
|
+
glyphs and tokens. Preserve existing non-work uses of status cards without a legacy shim.
|
|
130
|
+
3. Build plans from ordinary status, markdown, file, diff and other appropriate existing nodes.
|
|
131
|
+
Store dependencies, conditions and loops as authored relations with reasons. A question or
|
|
132
|
+
rejected alternative is planning content, not permission to run a command.
|
|
133
|
+
4. Starting/stopping a session does not change the authored plan. Provide an explicit path for
|
|
134
|
+
presenting an existing session task, reusing existing task identifiers and attribution.
|
|
135
|
+
Distinguish authored fields from live task fields in the renderer and write route.
|
|
136
|
+
5. Resolve linked live state from its authoritative record. If a persisted display cache is
|
|
137
|
+
needed by existing render/export paths, label it as derived and refresh it from the record;
|
|
138
|
+
do not treat it as independently writable. Missing/ended session references must not silently
|
|
139
|
+
become actionable approvals or restart tasks. Removing a presentation does not cancel work.
|
|
140
|
+
|
|
141
|
+
**Verification:** with Sessions off, human and agent can create/edit the four-step plan shown
|
|
142
|
+
in Uses, connect a failure return path and an intentional loop, reload, and continue editing.
|
|
143
|
+
Assert no session/task/approval records or loop execution were created by ordinary planning.
|
|
144
|
+
Then explicitly link a real session task: status updates appear consistently in card and panel;
|
|
145
|
+
starting a session alone creates no cards and leaves the standalone plan unchanged.
|
|
146
|
+
Existing AX execution, workboard, ghost and gate tests remain controls, not features to remove.
|
|
147
|
+
|
|
148
|
+
### Agent pen, text and eraser parity
|
|
149
|
+
|
|
150
|
+
**Owners:** `src/server/operations/ops/annotation.ts`, `operations/composites.ts`,
|
|
151
|
+
`src/server/index.ts`, `canvas-state.ts`, `canvas-serialization.ts`, the existing CLI
|
|
152
|
+
operation dispatch and `src/client/canvas/AnnotationLayer.tsx` / `CanvasViewport.tsx`.
|
|
153
|
+
|
|
154
|
+
1. Expose creation through an existing MCP composite and CLI operation path. Use the same
|
|
155
|
+
server-owned freehand points, text, color and width as the human tools, in canvas world
|
|
156
|
+
coordinates. Derive bounds on the server and align SDK validation with the operation.
|
|
157
|
+
Do not simulate pointer gestures or add a separate agent drawing store or shape language.
|
|
158
|
+
2. Keep erasing equivalent to the human tool: remove a whole mark by its ID, not part of a
|
|
159
|
+
stroke or the card beneath it. Both human and agent can erase marks from the shared layer,
|
|
160
|
+
subject to existing write protections. Keep compact annotation summaries discoverable;
|
|
161
|
+
provide an explicit geometry read if needed, rather than adding all points to default context.
|
|
162
|
+
3. Preserve shared persistence, SSE, Undo and ghost feedback. Check scope/lock behavior for
|
|
163
|
+
board-space marks explicitly rather than assuming node-only guards cover them. Repeated
|
|
164
|
+
creation with the same explicit ID and content must not duplicate a mark or Undo entry;
|
|
165
|
+
conflicting content must not silently overwrite a human's mark. Define repeated removal
|
|
166
|
+
consistently across transports and document any change to the current not-found response.
|
|
167
|
+
4. Use annotations for informal questions and emphasis. A written question does not suspend
|
|
168
|
+
execution or create a pending request, and erasing a mark does not answer or approve it.
|
|
169
|
+
Humans can reply in the external agent host's composer, such as Amp, Claude Code or Codex,
|
|
170
|
+
whichever agent they use with the canvas. No PMX composer, card or canvas reply is required.
|
|
171
|
+
The host agent receives the reply and uses its existing canvas tools to act on it;
|
|
172
|
+
PMX does not need to capture or synchronize the host conversation.
|
|
173
|
+
Board text and cards remain optional ways to respond. Native-host approvals and optional
|
|
174
|
+
PMX session controls remain separate. Keep canvas ink distinct from
|
|
175
|
+
AX review annotations, which already have their own contract.
|
|
176
|
+
|
|
177
|
+
**Verification:** with Sessions off, the agent draws around one card and writes a question
|
|
178
|
+
beside two alternatives. The human answers in the external host's composer and the agent
|
|
179
|
+
revises the board without using PMX's composer or requiring a reply card or session.
|
|
180
|
+
Also exercise the optional board reply path:
|
|
181
|
+
the human adds a text reply and erases an agent mark; the agent reads
|
|
182
|
+
the reply and erases a specified human mark without changing nearby marks or underlying cards.
|
|
183
|
+
Check real MCP/CLI/HTTP/SDK behavior, persisted reload, Undo, retries and rejected writes.
|
|
184
|
+
Inspect placement at fractional zoom and after pan/Fit, including text contrast across themes.
|
|
185
|
+
No work item, approval, automatic mark feed or implicit answer detection is created.
|
|
186
|
+
|
|
187
|
+
## Slice 2: relations and group navigation
|
|
188
|
+
|
|
189
|
+
**Owners:** `EdgeLayer.tsx`, `ContextMenu.tsx`, `CrossBoardReferences.tsx`,
|
|
190
|
+
`src/client/state/relation-store.ts`, `GroupNode.tsx`, `CanvasViewport.tsx`, `App.tsx`,
|
|
191
|
+
`src/server/memory-graph.ts`, `operations/ops/memory-graph.ts` and the shared relation model.
|
|
192
|
+
|
|
193
|
+
1. Complete the compact inline edge editor, parallel-pair counts, dependency cycle/affected
|
|
194
|
+
counts, Show lineage and Show on canvas. Reuse current per-board vocabularies and query
|
|
195
|
+
semantics. Preserve authored labels, reasons, direction and attribution.
|
|
196
|
+
2. Treat an intentional `loop`/`if-fails` flow as a valid illustrated plan. Do not run generic
|
|
197
|
+
cycle warnings across every edge kind. Dependency warnings and source-staleness warnings
|
|
198
|
+
use their actual semantics; disconnected and merely cited nodes are negative controls.
|
|
199
|
+
3. Render stale-lineage warnings on the affected edges from existing provenance qualification,
|
|
200
|
+
not a second freshness clock. Keep relation meaning, warning glyph/word and agent authorship
|
|
201
|
+
distinguishable, including where the historical drawings predate current token decisions.
|
|
202
|
+
4. Add group drill-in as view state: nested breadcrumb path, parent camera/selection return,
|
|
203
|
+
local focus and outside endpoint stubs. Use the same stored nodes and edges, not copied
|
|
204
|
+
layouts or new boards. Edits inside the focused view target the original nodes.
|
|
205
|
+
5. Outside stubs navigate to the real target and are not editable duplicates. Reconcile a
|
|
206
|
+
removed/moved focused group and a board switch without leaving a stale drill-in path.
|
|
207
|
+
Keep full-board reads distinct from a filtered human view; drill-in must not silently pin,
|
|
208
|
+
unpin, acknowledge a read or hide information from the agent's public read contract.
|
|
209
|
+
|
|
210
|
+
**Verification:** render dependency and decision examples plus the deliberate flow loop;
|
|
211
|
+
exercise keyboard and pointer editing, nested drill-in, Esc/breadcrumb return and outside links.
|
|
212
|
+
Assert board count and ownership are unchanged by navigation, mutations persist on the source
|
|
213
|
+
board, and the agent reads the authored relations. Inspect labels at fractional zoom and Fit.
|
|
214
|
+
|
|
215
|
+
## Slice 3: implement one atomic Move to new board operation
|
|
216
|
+
|
|
217
|
+
**Owners:** `CanvasStateManager`, `canvas-db.ts`, `operations/ops/boards.ts`,
|
|
218
|
+
`canvas-operations.ts`, `src/server/index.ts`, `server.ts`, `src/mcp/server.ts`,
|
|
219
|
+
the existing CLI board commands, board store, selection bar and group menu.
|
|
220
|
+
Extend the existing registry/transport mapping, not a client-side sequence of create/copy/delete.
|
|
221
|
+
|
|
222
|
+
### Proposed operation contract
|
|
223
|
+
|
|
224
|
+
These are implementation proposals, not already shipped API names:
|
|
225
|
+
|
|
226
|
+
- A `board.move-selection` operation targets the explicit active source board and a nonempty
|
|
227
|
+
set of node IDs, with a new board name, expected source revision and durable request ID.
|
|
228
|
+
A group's menu supplies its root ID; the server expands descendants and deduplicates overlapping
|
|
229
|
+
selections. Keep the moved group frame and its identity rather than silently discarding it.
|
|
230
|
+
- Preview and commit share selection, reference and permission validation. Preview creates
|
|
231
|
+
nothing and emits no mutation/ghost events. Commit revalidates immediately before writing.
|
|
232
|
+
- Return the destination board ID, portal ID and moved identities. Repeating the same request
|
|
233
|
+
returns the original result, including after restart; reusing its ID with different input
|
|
234
|
+
is a conflict. Check recorded success before rejecting the now-stale source revision.
|
|
235
|
+
- Human UI asks for the name, explains that this is a move, then opens the destination after
|
|
236
|
+
success. A delayed response must not navigate over a newer human board choice. Agent mutation
|
|
237
|
+
returns the destination without silently moving the human's camera; opening remains explicit.
|
|
238
|
+
- Default the new board to the source folder, theme and relation vocabulary. Preserve relative
|
|
239
|
+
geometry. Place the source portal at the removed selection/group location. Preview must name
|
|
240
|
+
any README, pin, lifecycle, live-session or runtime-content effects before commit.
|
|
241
|
+
|
|
242
|
+
### Persistence and identity invariants
|
|
243
|
+
|
|
244
|
+
| Data | Required result |
|
|
245
|
+
|---|---|
|
|
246
|
+
| Cards and groups | Same card IDs in the fresh destination; preserved content revisions, attribution, explicit lifecycle and nested membership. Keep board revision counters safe for subsequent writes without stamping the move as a content edit. Remove moved members from source parents without deleting unrelated siblings. Source IDs that happen to match IDs on another board remain unrelated. |
|
|
247
|
+
| Relations | Move source-owned edges with their source card. Rewrite local/cross-board endpoints correctly on every affected board, including incoming edges from a third board. Preserve edge identity, kind, reason and authored meaning; regenerate computed projections. |
|
|
248
|
+
| Wiki links, provenance and other references | Retarget stored board-qualified bindings, source observations, anchored references and tour targets where supported. Preserve recorded source revisions and timestamps; a location change is not a content refresh. Inventory references explicitly, not a recursive replacement of every matching string. |
|
|
249
|
+
| Review and retirement | Preserve access to the same audit history and original event attribution/location evidence. Record the relocation without validating, restoring retirement or resetting due clocks. Do not clone review events as new checks. |
|
|
250
|
+
| Pins and read receipts | Move card-pin membership and attribution with the cards. Do not mark destination content as newly read or auto-pin every moved card. Source-board context and README changes must be visible; do not silently pin the new board to compensate. |
|
|
251
|
+
| README and inherited policy | If the source README moves, clear its old designation and designate it on the destination. Inherit source folder policy by default; explicitly account for board-specific effective policy so the move cannot make due content fresh. |
|
|
252
|
+
| Blobs, attachments and viewers | Preserve owned bytes, references and supported reload behavior, including imported-document metadata and spec versions. Never use the copy path's node-type exclusions to silently omit a selected card. |
|
|
253
|
+
| Sessions and runtime handles | Moving a presentation does not move authority, cancel a task or approve a gate. Resolve board-qualified live references explicitly. Preflight must refuse the entire move with an actionable reason if a live runtime binding cannot safely relocate; no silent detach or partial move. |
|
|
254
|
+
|
|
255
|
+
Perform destination creation, source removal, portal creation, reference/audit updates and the
|
|
256
|
+
retry result in one SQLite transaction through `CanvasStateManager`. Account for pending
|
|
257
|
+
debounced saves and all other library writers so a stale save cannot resurrect moved cards or
|
|
258
|
+
overwrite a reference rewrite. Publish memory/SSE/catalog changes only after commit. Recover
|
|
259
|
+
from commit-before-notification interruption by reading committed state, not rerunning effects.
|
|
260
|
+
Do not add another state manager or general lock/journal framework.
|
|
261
|
+
|
|
262
|
+
### Engineering checkpoints before this slice ships
|
|
263
|
+
|
|
264
|
+
These are not additional approved product features. Resolve and document them during the
|
|
265
|
+
state/DB design review before implementing the move UI:
|
|
266
|
+
|
|
267
|
+
1. **Undo and old snapshots:** propose an explicit move boundary. No single-board Undo or
|
|
268
|
+
snapshot restore may recreate a moved identity in its old board or erase updated references.
|
|
269
|
+
Prefer a clear refusal for restores crossing that boundary over a hidden reverse operation.
|
|
270
|
+
Document the user-facing recovery path and affected history before accepting this limitation;
|
|
271
|
+
do not silently discard all snapshots or introduce general durable Undo in this wave.
|
|
272
|
+
2. **Audit location:** choose the smallest durable relocation representation that keeps old
|
|
273
|
+
board-qualified receipts/reviews interpretable and current card history reachable. Preserve
|
|
274
|
+
historical events, not rewritten claims that the card was always on the destination.
|
|
275
|
+
3. **Runtime-bound cards and live tasks:** inventory every existing node type, attachment and
|
|
276
|
+
session binding. State which can move directly and which must be made quiescent first.
|
|
277
|
+
Any proposed unsupported case needs an explicit scope decision, not an unreported omission.
|
|
278
|
+
4. **Revision guards:** a source revision alone cannot protect third-board incoming links or
|
|
279
|
+
reviews. Validate all affected state at commit under the existing owner and serialize the
|
|
280
|
+
transaction against concurrent library writers. Do not overwrite a newer human edit.
|
|
281
|
+
|
|
282
|
+
### Move design checkpoint, 2026-10-27
|
|
283
|
+
|
|
284
|
+
**Status: owner-approved; implementation in progress.** The owner accepted the history
|
|
285
|
+
boundary and all-or-nothing runtime/reference refusals below. Read-only live task cards remain
|
|
286
|
+
supported through their original owning-board binding. No additional approval is needed for
|
|
287
|
+
these limits; state/DB diffs still require review before pushing.
|
|
288
|
+
|
|
289
|
+
**Observed:** `saveStateToDB` reconciles a whole supplied board, including deleting absent rows.
|
|
290
|
+
A disposable two-connection probe used the real persistence functions: after one immediate
|
|
291
|
+
transaction moved a row A → B and retargeted C's incoming edge, saving the old A/C payloads
|
|
292
|
+
recreated the source row and reversed the edge rewrite. Both assertions reproduced. This is
|
|
293
|
+
evidence that a transaction alone is insufficient, not a test of an implemented move API.
|
|
294
|
+
`restoreSnapshot` similarly applies saved board contents; Undo holds in-memory closures.
|
|
295
|
+
MCP app rehydration calls `openMcpApp`, which invokes the original external tool again.
|
|
296
|
+
|
|
297
|
+
**Persistence proposal:**
|
|
298
|
+
|
|
299
|
+
- Keep orchestration in `CanvasStateManager`. Acquire SQLite's immediate writer transaction,
|
|
300
|
+
check the durable request receipt first, validate the current source and affected references,
|
|
301
|
+
then commit the destination, source portal/removal, reference changes and receipt together.
|
|
302
|
+
Do not temporarily activate the destination or call copy/delete operations.
|
|
303
|
+
- Add a storage write-version guard distinct from semantic content revisions. A loaded writer
|
|
304
|
+
must compare its version before saving a board changed by another writer; stale payloads fail
|
|
305
|
+
visibly rather than overwrite committed moves. Apply the same boundary to direct board writers
|
|
306
|
+
and incoming-link updates. Preserve unsaved edits on conflict; no automatic discard/reload.
|
|
307
|
+
The current incremental-save no-op behavior remains a verification control.
|
|
308
|
+
- Fold the owner's pending state into the transaction only after its storage baseline passes.
|
|
309
|
+
Preview stays read-only. Revalidate its affected state at commit, including third-board links,
|
|
310
|
+
current policy and locks; a source content revision alone is not the complete guard.
|
|
311
|
+
- After commit, replace affected in-memory state before any delayed save can run, invalidate
|
|
312
|
+
projections and publish SSE/catalog changes. A retry returns the stored result after restart
|
|
313
|
+
without recreating the portal or changing the board the human currently has open.
|
|
314
|
+
- Preserve card/edge content stamps and freshness dates. Seed destination revision counters
|
|
315
|
+
above preserved stamps, and invalidate delta cursors whose old location is no longer valid.
|
|
316
|
+
Location changes must not become evidence of editing, review or reading.
|
|
317
|
+
|
|
318
|
+
**Approved history and audit boundary:**
|
|
319
|
+
|
|
320
|
+
- A move establishes a durable restore boundary on each board whose content/references changed.
|
|
321
|
+
Clear pre-boundary Undo/Redo closures; allow ordinary post-move Undo. Keep older snapshots
|
|
322
|
+
available for inspection/diff, but refuse restoring across the boundary with an explanation.
|
|
323
|
+
Unaffected boards retain their history. Show this limitation in move preview before commit.
|
|
324
|
+
Recovery is to inspect the old snapshot and reapply desired content to the current card, or
|
|
325
|
+
explicitly restore a whole-library backup. Neither path is an implicit reverse move.
|
|
326
|
+
- Store per-card old/new board locations with the durable move receipt and historical event
|
|
327
|
+
cutoffs. Current-card history follows that relocation chain; original review/read events keep
|
|
328
|
+
their original location, time, actor and observed revisions. Do not copy or rewrite receipts
|
|
329
|
+
as new validations or reads, and do not include later events for reused source IDs. Reads of
|
|
330
|
+
the old board do not become reads of the new board. Repeated card IDs on unrelated boards
|
|
331
|
+
remain unrelated.
|
|
332
|
+
|
|
333
|
+
**Node and binding inventory:** all 18 node types are covered below. Eligibility depends on
|
|
334
|
+
bindings, not a blanket exclusion of a node type. Declared references are handled explicitly;
|
|
335
|
+
arbitrary strings in HTML, recipe inputs and application payloads are not recursively rewritten.
|
|
336
|
+
|
|
337
|
+
| Content | Proposed handling |
|
|
338
|
+
|---|---|
|
|
339
|
+
| `markdown`, `diff`, `mermaid`, `ledger`, `image`, `webpage` | Preserve content, provenance, caches, original paths/URLs and observation dates. Rewrite stored `wikiLinks[].target` and `provenance.sources[]` by qualified identity, including incoming references from other boards. |
|
|
340
|
+
| `file` and imported-document metadata | Preserve bytes and attachment/import identity. Rebind file watchers only after commit. For the first increment, require all dependants of a shared import/attachment to move together; do not silently split `committedNodeIds`, copy the import or discard attribution. |
|
|
341
|
+
| `html`, `json-render`, `graph`, static `mcp-app` | Preserve HTML/specs/blobs, `specVersion` and supported reload behavior. Resolve declared embedded node/URL bindings. Closed standalone viewers can move; active streams, workboards, AX-bound surfaces and external app sessions need the checks below. |
|
|
342
|
+
| `prompt`, `response`, `trace`, `context`, ordinary `status` | Saved content can move when no producer still owns it. Check queued prompt/response routing, trace-manager ownership and adapter-owned `context-main`/`status-main`; a completed-looking status alone does not prove quiescence. |
|
|
343
|
+
| Live task `status` | Preserve task authority on its original board using an explicit board-qualified task binding. Update resolution and refresh across boards. Do not detach, cancel, clone the task or convert the display cache into authored content. |
|
|
344
|
+
| `board`, `group` | Preserve portal targets and nested group/frame identities. Expand group descendants, deduplicate overlap, detach moved roots from remaining source parents and retain unrelated siblings. |
|
|
345
|
+
|
|
346
|
+
**Approved first-increment refusals:** refuse the entire move
|
|
347
|
+
with named blockers if it includes an open JSON stream, active prompt/response routing,
|
|
348
|
+
manager-owned trace/context/status, live/reconnecting MCP app, materialized AX flow/workboard,
|
|
349
|
+
or unresolved action/gate binding that cannot retain its original authority. Never replay an
|
|
350
|
+
external tool just to move its card. Finish or stop the producer first where a supported stop
|
|
351
|
+
exists; otherwise leave the bound presentation in place. Read-only live task cards are supported
|
|
352
|
+
through qualified references, not included in a blanket session-card refusal.
|
|
353
|
+
|
|
354
|
+
Also refuse a partial import/attachment bundle and a declared embedded-viewer, tour or AX-anchor
|
|
355
|
+
reference that would become unresolved across the selection boundary. Preview names the missing
|
|
356
|
+
dependants or reference so the user can adjust the selection. Current tour targets are local
|
|
357
|
+
`nodeId`, `rect` or `viewport`, not cross-board targets. Do not quietly retarget a tour stop to
|
|
358
|
+
the portal, infer annotation ownership from overlap, or rewrite an opaque embedded program.
|
|
359
|
+
Ordinary board-space annotations stay on the source and preview says so.
|
|
360
|
+
|
|
361
|
+
**Implementation order after checkpoint acceptance:** persistence/write guards and public
|
|
362
|
+
operation tests; qualified references/audit/runtime preflight; HTTP/SDK/MCP/CLI parity; then the
|
|
363
|
+
drawn selection/group move UI and acceptance runs. Verify rollback, commit-before-response retry,
|
|
364
|
+
stale source/third-board writers and snapshot/Undo boundaries before adding the UI. Show the
|
|
365
|
+
actual `canvas-state.ts` and `canvas-db.ts` diffs for owner review before any push.
|
|
366
|
+
|
|
367
|
+
**Verification:** use disposable A/B/C boards with repeated card IDs on unrelated boards,
|
|
368
|
+
nested groups, asymmetric inbound/outbound links, provenance, due and retired cards, pins,
|
|
369
|
+
attachments and an explicitly linked session task. Move both a multi-selection and a whole
|
|
370
|
+
group. Check the live portal, destination paint, outside navigation and all persisted records
|
|
371
|
+
after restart. Inject failure before commit and after commit/before response; retry concurrently
|
|
372
|
+
with the same ID and confirm one destination, one portal and no duplicate audit events.
|
|
373
|
+
Exercise stale preview, foreign-board writes, fences, human locks, failed runtime preflight,
|
|
374
|
+
pre-move Undo/restore, and late SSE/save responses as negative cases.
|
|
375
|
+
|
|
376
|
+
## Slice 4: native PMX Canvas plugin for Amp
|
|
377
|
+
|
|
378
|
+
**Status (2026-10-31):** project-local foundation, board-targeted routing, automatic context
|
|
379
|
+
delivery and addressed steering are pushed. Final-source native Amp acceptance passed idle wake,
|
|
380
|
+
busy steering, receipt, bound-board edits through `code_exec`, rendered verification before
|
|
381
|
+
acknowledgment, reload/retry and end cleanup. Busy steering joined the existing active turn,
|
|
382
|
+
without another `agent.start`. Obsolete queued-packet cancellation and sleeping-orb resume
|
|
383
|
+
remain untested. Receipt accounting, uncertain-send recovery and turn binding guards also have
|
|
384
|
+
local regression coverage. Guest name entry is delivered; all three optional Jev uses are
|
|
385
|
+
implemented locally with separate ranking/advice consent and pending native opt-in acceptance.
|
|
386
|
+
The existing `.amp/plugins/pmx-sdlc.ts` is development tooling, not this consumer plugin.
|
|
387
|
+
|
|
388
|
+
**Foundation decisions:** canonical source is `plugins/amp/`; the build emits a self-contained
|
|
389
|
+
directory plugin in `dist/amp-plugin/pmx-canvas/`, included in the npm tarball. Copy that directory
|
|
390
|
+
into the consumer's `.amp/plugins/`, without replacing an existing installation. Global
|
|
391
|
+
publication is not authorized. Baseline host: Amp `0.0.1793119929-g574f34` (2026-10-27), with
|
|
392
|
+
feature checks for directory skills and native Portal actions. The package reuses the canonical
|
|
393
|
+
three PMX skills and MCP bootstrap; only the runtime startup is adapted for supervised orbs.
|
|
394
|
+
|
|
395
|
+
One binding per canonical workspace and invoking thread is stored in a separate atomic file
|
|
396
|
+
under `.pmx-canvas/amp-bindings/`. Many threads may bind the same board. Binding/unbinding never
|
|
397
|
+
activates a board, changes its contents, or rewrites another thread's binding. A deleted board
|
|
398
|
+
is reported missing, not replaced with the active board. Opening shows the shared workbench,
|
|
399
|
+
not a thread-private board view. Bound MCP tool calls retain their board while the human
|
|
400
|
+
navigates; CLI calls and MCP resources still need explicit destinations and expected-board guards.
|
|
401
|
+
The delivery increment uses native Amp turn hooks and append-with-steering, not a new scheduler
|
|
402
|
+
or sleeping-orb keep-alive. See [the plugin contract](../amp-plugin.md) for receipt and retry semantics.
|
|
403
|
+
|
|
404
|
+
**Owners and reuse:** use Amp's supported Plugin API and supervised orb services. Reuse PMX's
|
|
405
|
+
MCP launcher, existing skills, context brief/read accounting, addressed steering, board export
|
|
406
|
+
and write protections. The Copilot adapter under `.github/extensions/pmx-canvas/` is a reference
|
|
407
|
+
for PMX contracts, not an Amp lifecycle implementation. Select the consumer source layout,
|
|
408
|
+
installation scope and distribution destination before writing the plugin; do not hand-edit
|
|
409
|
+
generated files under `plugins/pmx-canvas/` or publish to personal/workspace plugin repositories
|
|
410
|
+
without approval. Load the plugin and skill authoring guidance before changing either package.
|
|
411
|
+
|
|
412
|
+
### Included experience
|
|
413
|
+
|
|
414
|
+
1. **Install, open and resume.** One installation bundles the integration, existing PMX skills
|
|
415
|
+
and MCP launcher. Start or reconnect to the correct workspace's supervised Canvas service,
|
|
416
|
+
open its Amp Portal, and resume persisted boards after orb pause/restart. Verify workspace,
|
|
417
|
+
port and bundle identity; respect normal orb sleep rather than keeping it awake indefinitely.
|
|
418
|
+
2. **Context and steering.** Bind workspace, board, thread and consumer explicitly. Deliver pins,
|
|
419
|
+
selected material and relevant optional context to the intended turn. Route canvas steering
|
|
420
|
+
to its associated thread without navigation redirecting an in-flight write. Preserve the
|
|
421
|
+
distinction between summary delivery, full-content reads and successful actions.
|
|
422
|
+
3. **Create and collect.** Use existing PMX tools and Amp connections to put research, diagrams,
|
|
423
|
+
comparisons, images, code-related results and interactive views on the canvas. Honor explicit
|
|
424
|
+
format requests. Keep source and thread links; support on-request thread overviews, scoped
|
|
425
|
+
parallel work and revisiting outputs when inputs change, without an automatic work-card feed.
|
|
426
|
+
4. **Native interaction and collaboration.** Use supported commands, quick actions, approval
|
|
427
|
+
dialogs, links and actual canvas screenshots. Reuse Amp thread access, multiplayer and Portal
|
|
428
|
+
review comments within their existing access model. Feature-detect API support; documentation
|
|
429
|
+
alone is not proof that the installed Amp version supports a capability.
|
|
430
|
+
5. **Use Amp sharing; add a guest name.** The owner shares through Amp's existing controls.
|
|
431
|
+
A guest with access opens the canvas and can enter a display name so other participants
|
|
432
|
+
know who they are. Reuse existing canvas presence rather than adding accounts. The name is
|
|
433
|
+
self-reported, not verified identity or an access grant. Participation follows the access
|
|
434
|
+
Amp already provides. Do not add a comment/edit permission picker, guest tokens, a separate
|
|
435
|
+
share server, or custom expiry/revocation. Describe Amp's actual sharing scope accurately:
|
|
436
|
+
a Portal can expose a port, not just the board URL. Do not claim board-only isolation or
|
|
437
|
+
bypass native access requirements. Use fictional content for sharing acceptance runs.
|
|
438
|
+
|
|
439
|
+
### Jev's three initial uses
|
|
440
|
+
|
|
441
|
+
| Use | Allowed decision | Boundary |
|
|
442
|
+
|---|---|---|
|
|
443
|
+
| Context relevance | Rank eligible optional material against the task | Apply access restrictions and exclusions first. Preserve explicit pins; disclose overflow instead of silently dropping them. |
|
|
444
|
+
| Output representation | Choose an appropriate existing canvas format | Explicit user format wins. The main agent still creates and verifies the result. |
|
|
445
|
+
| Review prioritization | Order source changes that deserve examination | A score is not evidence that a conclusion is correct, incorrect, verified or complete. |
|
|
446
|
+
|
|
447
|
+
Jev judges bounded supplied facts. It does not retrieve sources, write outputs, decide
|
|
448
|
+
permissions or certify tests. Plugin code controls consequences. Define bounded calls, input
|
|
449
|
+
budgets, deterministic fallbacks and representative evaluations before enabling the choices.
|
|
450
|
+
Duplicate detection, filing/relationship suggestions and contextual follow-ups remain later
|
|
451
|
+
Jev candidates. Custom agents, webhook updates and shipping follow-ups are possible extensions,
|
|
452
|
+
not additional deliverables of this increment.
|
|
453
|
+
|
|
454
|
+
### Decisions and reliability gates before implementation
|
|
455
|
+
|
|
456
|
+
- Choose the minimum supported Amp version, plugin packaging/location and installation flow.
|
|
457
|
+
Test actual plugin loading, qualified skill registration and native MCP discovery/trust.
|
|
458
|
+
- Verify the installed Amp sharing flow and its actual access scope. Add only guest name entry
|
|
459
|
+
and identification, reusing existing presence. Draw those missing Canvas states before UI
|
|
460
|
+
implementation; do not redesign Amp's sharing controls. The owner's simplicity decision
|
|
461
|
+
supersedes the earlier custom guest-sharing proposal and comment-versus-edit question.
|
|
462
|
+
General hosted accounts, organization roles and custom guest authorization remain later work.
|
|
463
|
+
- Define board/thread binding across switches, moves and two simultaneous threads. An explicit
|
|
464
|
+
destination must never silently follow whichever board another thread opens.
|
|
465
|
+
- Define delivery identity and uncertain-send recovery. PMX's current claim reads do not reserve
|
|
466
|
+
messages. Duplicate pumps, interrupted sends and retries must not execute a steer twice or
|
|
467
|
+
silently discard it; do not claim exactly-once execution without a supported receipt boundary.
|
|
468
|
+
- Separate prepared context from delivered context. Current brief cursors advance during
|
|
469
|
+
compilation. Ranking, clipping or failed injection must not consume unseen updates or record
|
|
470
|
+
false reads. Scope any contract changes to the existing context/delivery owners.
|
|
471
|
+
- Draw missing plugin-facing Canvas states in `docs/design/` and record decisions in
|
|
472
|
+
`docs/design.md` before building those surfaces. Native Amp UI stays within supported APIs.
|
|
473
|
+
|
|
474
|
+
**Verification:** install into a clean consumer and exercise a native Amp thread, not only an
|
|
475
|
+
SDK MCP handshake. Run pin → context injection → addressed steer → correct-thread action →
|
|
476
|
+
visible canvas verification → acknowledgment. Include a different-recipient negative control,
|
|
477
|
+
two simultaneous threads, board switching, card relocation, reload/pause/resume, duplicate pumps,
|
|
478
|
+
interruption around send/ack, context clipping and Jev disabled/unavailable. Check explicit
|
|
479
|
+
format requests and representative Jev decisions with independently judged expected behavior.
|
|
480
|
+
For sharing, use a second browser through Amp's supported sharing flow: open the shared canvas,
|
|
481
|
+
enter a name and verify other participants can identify the guest. Check reconnect/reload and
|
|
482
|
+
that a name change neither grants access nor merges two visitors' presence. Verify existing
|
|
483
|
+
native access requirements remain unchanged; report those requirements rather than promise
|
|
484
|
+
anonymous or board-only access. Do not report native-host capabilities that have not run.
|
|
485
|
+
|
|
486
|
+
## Slice 5: transport parity, documentation and acceptance
|
|
487
|
+
|
|
488
|
+
- Keep one mutation contract across HTTP, SDK, MCP and CLI, including validation errors, retry
|
|
489
|
+
identity, group expansion and scope checks. Schema discovery/help must describe the real
|
|
490
|
+
operation. Do not add a standalone MCP tool when an existing composite action fits.
|
|
491
|
+
- Update `docs/http-api.md`, `docs/mcp.md`, `docs/cli.md`, `docs/node-types.md` and
|
|
492
|
+
`docs/api-stability.md` as applicable. Update bundled skill/reference instructions for
|
|
493
|
+
deliberate presentation and the new move action, preserving the ghost-cursor default.
|
|
494
|
+
Skill edits need their required scoped approval before implementation. Do not edit the README.
|
|
495
|
+
- Extend `tests/acceptance/guide.ts`: rows 06 (boards), 09 (cross-board connections),
|
|
496
|
+
12 (relations), 15–17 (lifecycle), 22–23 (protection/persistence), 25 (ghost/gates),
|
|
497
|
+
26 (annotations), 27–28 (nodes/creation) and 30 (work surfaces), checking current row IDs before editing.
|
|
498
|
+
Add criteria and matching tests for standalone planning, valid loops, drill-in and move
|
|
499
|
+
recovery, plus agent/human annotation parity. Keep explicit AX execution tests separate
|
|
500
|
+
from inert planning tests.
|
|
501
|
+
- Add plugin acceptance criteria once the native installation and sharing designs are settled.
|
|
502
|
+
Update the Amp setup and host-adapter contract to describe only implemented behavior, with
|
|
503
|
+
native-host and clean-consumer evidence separate from repository tests. README changes and
|
|
504
|
+
installing/publishing plugin or skill updates still require their scoped authorization.
|
|
505
|
+
- Extend existing `tests/unit/boards*.test.ts`, `canvas-state.test.ts`,
|
|
506
|
+
`relation-revisions.test.ts`, `ax-state-manager.test.ts`, `workboard.test.ts`,
|
|
507
|
+
`tests/client/status-node.test.tsx`, `selection-bar.test.tsx`, and
|
|
508
|
+
`tests/e2e/boards.pw.ts`, `canvas.pw.ts`, `reference-pane.pw.ts` where they own the behavior.
|
|
509
|
+
Add a focused test file only if the new public contract has no appropriate existing owner.
|
|
510
|
+
- Rebuild the demo through `scripts/generate-demo-board.ts` when rendering/primitive output
|
|
511
|
+
changes. Include an authored loop and dependency examples; no real work data in fixtures.
|
|
512
|
+
|
|
513
|
+
## Verification and delivery gates
|
|
514
|
+
|
|
515
|
+
For implementation, run targeted tests per slice, then the combined checks from the
|
|
516
|
+
`pmx-canvas-testing` skill. Expected command set:
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
bun run typecheck
|
|
520
|
+
bun run lint
|
|
521
|
+
bun run test
|
|
522
|
+
bun run test:client
|
|
523
|
+
bun run test:web-canvas:headed
|
|
524
|
+
bun run acceptance
|
|
525
|
+
bun run test:e2e-cli
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
Browser commands rebuild first. Before manual portal acceptance, run `bun run build`, restart
|
|
529
|
+
the supervised canvas service and verify its workspace/version/bundle with `pmx_canvas_health`.
|
|
530
|
+
Exercise the populated board with real pointer and keyboard input; capture and inspect menus,
|
|
531
|
+
editing, drill-in and move results at 600/1024/1920 px and all nine themes. Cover pan, fractional
|
|
532
|
+
zoom, Fit, expand/close, reload and unsaved drafts. Use WebKit for any affected iframe/scaling
|
|
533
|
+
path and state native-host limitations separately. DOM data and agent handshakes alone are not
|
|
534
|
+
visual or native-host acceptance.
|
|
535
|
+
|
|
536
|
+
Before handoff, run the feature's oracle review and resolve findings. Before pushing, show the
|
|
537
|
+
owner changes to `canvas-state.ts`, `canvas-db.ts`, `workbench-auth.ts` if touched, and any
|
|
538
|
+
breaking public-contract changes. This plan does not authorize pushing, migrations on a shared
|
|
539
|
+
database, release publication or deployment. Journal/hosting/evaluations retain plan 019's order.
|
|
540
|
+
|
|
541
|
+
## Definition of done
|
|
542
|
+
|
|
543
|
+
A human and agent can build and revise the illustrated plan without Sessions; intentional
|
|
544
|
+
loops stay inert; an explicitly linked session task has one live state; navigation retains
|
|
545
|
+
outside context; and Move to new board preserves identity and audit through retries/restart.
|
|
546
|
+
Both can draw, write questions and erase marks through the same annotation layer.
|
|
547
|
+
The Amp plugin opens and resumes the correct Canvas Portal, delivers context and steering to
|
|
548
|
+
the intended thread, and reuses Amp sharing with a simple guest name for identification.
|
|
549
|
+
Guest identification does not alter Amp's existing access or permission model.
|
|
550
|
+
Its three Jev decisions have bounded, evaluated behavior and usable fallbacks.
|
|
551
|
+
No automatic work-card feed, no approval UI added to ordinary cards and no reverse move.
|
|
552
|
+
Evidence includes commands, observed results and inspected UI captures, with unavailable checks
|
|
553
|
+
and any approved restrictions stated. Passing this document's checks has not yet been claimed.
|