pmx-canvas 0.9.3 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +9418 -2016
- package/CHANGELOG.md +54 -1
- package/dist/canvas/chunks/abnfDiagram-N423BO3Z-p8dtp6va.js +1 -0
- package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +1 -0
- package/dist/canvas/chunks/architectureDiagram-T3A2C74G-5jhmxrzf.js +36 -0
- package/dist/canvas/chunks/blockDiagram-VBNYF7ZC-pw1fa9yb.js +132 -0
- package/dist/canvas/chunks/c4Diagram-5PPSVZJV-x07nq0tt.js +10 -0
- package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +1 -0
- package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +1 -0
- package/dist/canvas/chunks/cose-bilkent-JH36ORCC-nm39npq0.js +1 -0
- package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +1 -0
- package/dist/canvas/chunks/cynefinDiagram-MW4NZA55-vdxrwahz.js +62 -0
- package/dist/canvas/chunks/dagre-VZM6K2ZE-bqdm7wpd.js +4 -0
- package/dist/canvas/chunks/diagram-7IWD3JNH-gs5gpr93.js +30 -0
- package/dist/canvas/chunks/diagram-B4RE2ZJO-cgwjg47s.js +3 -0
- package/dist/canvas/chunks/diagram-LBJQPF4R-w3vahpav.js +24 -0
- package/dist/canvas/chunks/diagram-Q27KOJAE-42837z6h.js +24 -0
- package/dist/canvas/chunks/diagram-UB23O5K3-4fz83q59.js +41 -0
- package/dist/canvas/chunks/ebnfDiagram-BXEA7PRR-zphtgegj.js +1 -0
- package/dist/canvas/chunks/erDiagram-JOGREHBK-zvbbdxp4.js +85 -0
- package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +1 -0
- package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +1 -0
- package/dist/canvas/chunks/ganttDiagram-PKOTCBZU-282jzycm.js +292 -0
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +1 -0
- package/dist/canvas/chunks/gitGraphDiagram-DS77QQ5N-vqqy6p1b.js +106 -0
- package/dist/canvas/chunks/index-0rk4gp1g.js +2 -0
- package/dist/canvas/chunks/index-194m3hc3.js +2 -0
- package/dist/canvas/chunks/index-1r72hdzb.js +301 -0
- package/dist/canvas/chunks/index-353m7b0p.js +2 -0
- package/dist/canvas/chunks/index-3cy1bzwh.js +2 -0
- package/dist/canvas/chunks/index-5tv8v1hk.js +1 -0
- package/dist/canvas/chunks/index-6ceya556.js +332 -0
- package/dist/canvas/chunks/index-6qmsnxwy.js +4 -0
- package/dist/canvas/chunks/index-d3b3gqe9.js +2 -0
- package/dist/canvas/chunks/index-fjtdggjn.js +2 -0
- package/dist/canvas/chunks/index-g3pwnqeb.js +2 -0
- package/dist/canvas/chunks/index-gf4e0et4.js +2 -0
- package/dist/canvas/chunks/index-hj99nz1f.js +1 -0
- package/dist/canvas/chunks/index-nprm96xp.js +16 -0
- package/dist/canvas/chunks/index-qj8fxwsf.js +2 -0
- package/dist/canvas/chunks/index-r2fyc9w1.js +89 -0
- package/dist/canvas/chunks/index-rft2hcz5.js +2 -0
- package/dist/canvas/chunks/index-rh7nv68n.js +2 -0
- package/dist/canvas/chunks/index-s4j678gj.js +2 -0
- package/dist/canvas/chunks/index-tb1wf525.js +179 -0
- package/dist/canvas/chunks/index-vv56h019.js +2 -0
- package/dist/canvas/chunks/index-w2mra17t.js +207 -0
- package/dist/canvas/chunks/index-wgv7en21.js +232 -0
- package/dist/canvas/chunks/index-yw8h9vha.js +157 -0
- package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +1 -0
- package/dist/canvas/chunks/infoDiagram-6WML65LV-v1yvggqj.js +2 -0
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +70 -0
- package/dist/canvas/chunks/journeyDiagram-NVQOT4AX-zjcffveh.js +139 -0
- package/dist/canvas/chunks/kanban-definition-27J2QSJJ-dakqtfp1.js +89 -0
- package/dist/canvas/chunks/katex-dmg8k4zm.js +257 -0
- package/dist/canvas/chunks/mermaid.core-j2geswrd.js +12 -0
- package/dist/canvas/chunks/mindmap-definition-FAOFIHXS-142xhr3k.js +96 -0
- package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +1 -0
- package/dist/canvas/chunks/pegDiagram-VL7TDLO6-5wvk7vsd.js +1 -0
- package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +1 -0
- package/dist/canvas/chunks/pieDiagram-7S7Q4E2Y-ztdhwycc.js +39 -0
- package/dist/canvas/chunks/quadrantDiagram-CIZ2JOQS-c5p9gmg6.js +7 -0
- package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +1 -0
- package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +1 -0
- package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +1 -0
- package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +1 -0
- package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +1 -0
- package/dist/canvas/chunks/railroadDiagram-AXF67PYL-xkmqkjwf.js +1 -0
- package/dist/canvas/chunks/requirementDiagram-LRYGKXZP-9wm2dyaw.js +84 -0
- package/dist/canvas/chunks/sankeyDiagram-W5VNT64P-2w19etgb.js +40 -0
- package/dist/canvas/chunks/sequenceDiagram-SI44F4Z6-0jn0vwmz.js +162 -0
- package/dist/canvas/chunks/sizeCapture-X5ZJPWSS-x75epwdq.js +1 -0
- package/dist/canvas/chunks/stateDiagram-OKZ733FA-schjpy6d.js +1 -0
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +1 -0
- package/dist/canvas/chunks/swimlanes-SLNWSIFB-gkw4xce3.js +1 -0
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +8 -0
- package/dist/canvas/chunks/timeline-definition-Z64GVDOM-x7nkcy01.js +120 -0
- package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +1 -0
- package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +1 -0
- package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +34 -0
- package/dist/canvas/chunks/wardley-OPB4EBWU-44pdddez.js +1 -0
- package/dist/canvas/chunks/wardleyDiagram-T6FBY63Y-t1j52t9r.js +78 -0
- package/dist/canvas/chunks/xychartDiagram-ELKLHX3M-38t16pme.js +7 -0
- package/dist/canvas/global.css +389 -229
- package/dist/canvas/index.js +141 -211
- package/dist/canvas/mcp-app.html +4205 -554
- package/dist/canvas/mermaid-entry.js +338 -338
- package/dist/canvas/surface-theme.css +6 -6
- package/dist/json-render/index.css +1 -1
- package/dist/json-render/index.js +49 -49
- package/dist/types/client/canvas/BarHint.d.ts +5 -3
- package/dist/types/client/canvas/CanvasNode.d.ts +0 -11
- package/dist/types/client/canvas/EdgeLayer.d.ts +1 -2
- package/dist/types/client/canvas/auto-fit.d.ts +4 -5
- package/dist/types/client/mermaid-entry.d.ts +1 -2
- package/dist/types/client/mermaid-render.d.ts +1 -0
- package/dist/types/client/nodes/BoardNode.d.ts +1 -1
- package/dist/types/client/nodes/ExtAppFrame.d.ts +7 -90
- package/dist/types/client/nodes/McpAppNode.d.ts +1 -25
- package/dist/types/client/nodes/MermaidNode.d.ts +1 -8
- package/dist/types/client/nodes/ViewerFrame.d.ts +29 -0
- package/dist/types/client/nodes/ViewerHost.d.ts +6 -0
- package/dist/types/client/nodes/iframe-document-url.d.ts +3 -9
- package/dist/types/client/nodes/primitive-copy.d.ts +5 -0
- package/dist/types/client/nodes/use-iframe-content-height.d.ts +1 -1
- package/dist/types/client/nodes/use-surface-frame.d.ts +4 -6
- package/dist/types/client/nodes/viewer-runtime-state.d.ts +2 -1
- package/dist/types/client/state/canvas-store.d.ts +3 -1
- package/dist/types/client/state/intent-bridge.d.ts +1 -0
- package/dist/types/client/state/presentation.d.ts +17 -6
- package/dist/types/json-render/server.d.ts +2 -1
- package/dist/types/mcp/canvas-access.d.ts +1 -12
- package/dist/types/mcp/resource-subscriptions.d.ts +7 -0
- package/dist/types/mcp/server.d.ts +2 -0
- package/dist/types/server/ax-wait.d.ts +1 -0
- package/dist/types/server/canvas-operations.d.ts +1 -0
- package/dist/types/server/canvas-state.d.ts +2 -0
- package/dist/types/server/index.d.ts +11 -6
- package/dist/types/server/operations/http.d.ts +10 -0
- package/dist/types/server/operations/index.d.ts +2 -2
- package/dist/types/server/operations/invoker.d.ts +4 -3
- package/dist/types/server/operations/mcp-contracts.d.ts +20 -0
- package/dist/types/server/operations/mcp.d.ts +2 -0
- package/dist/types/server/operations/ops/batch.d.ts +1 -0
- package/dist/types/server/operations/ops/boards.d.ts +0 -1
- package/dist/types/server/operations/registry.d.ts +2 -2
- package/dist/types/server/operations/types.d.ts +12 -2
- package/dist/types/server/server.d.ts +2 -0
- package/dist/types/server/tour-control.d.ts +13 -3
- package/dist/types/server/webpage-node.d.ts +1 -0
- package/dist/types/shared/ax-surface-protocol.d.ts +0 -9
- package/dist/types/shared/tour.d.ts +8 -0
- package/docs/api-reference.md +2 -2
- package/docs/cli.md +1 -1
- package/docs/design/Chrome.dc.html +32 -6
- package/docs/design/Types1.dc.html +3 -2
- package/docs/design/Types2.dc.html +1 -1
- package/docs/design/Types3.dc.html +1 -1
- package/docs/design/Zoom.dc.html +37 -60
- package/docs/design/canvas.json +1 -1
- package/docs/design.md +169 -4
- package/docs/http-api.md +82 -1
- package/docs/mcp.md +101 -21
- package/docs/node-types.md +38 -3
- package/docs/plans/plan-009-tech-debt-backlog.md +2 -2
- package/docs/plans/plan-019-post-0.9-roadmap.md +402 -13
- package/docs/product-vision-2026-09.md +9 -0
- package/docs/sdk.md +5 -2
- package/package.json +2 -2
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +1 -1
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +9418 -2016
- package/skills/pmx-canvas/SKILL.md +19 -21
- package/skills/pmx-canvas/references/full-reference.md +44 -6
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +7 -7
- package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +3 -5
- package/src/client/canvas/BarHint.tsx +6 -3
- package/src/client/canvas/CanvasNode.tsx +34 -47
- package/src/client/canvas/CanvasViewport.tsx +6 -7
- package/src/client/canvas/ContextMenu.tsx +63 -3
- package/src/client/canvas/EdgeLayer.tsx +365 -169
- package/src/client/canvas/ExpandedNodeOverlay.tsx +1 -2
- package/src/client/canvas/Presentation.tsx +53 -3
- package/src/client/canvas/ToolRail.tsx +2 -0
- package/src/client/canvas/TopBar.tsx +24 -9
- package/src/client/canvas/auto-fit.ts +9 -11
- package/src/client/canvas/canvas-area.ts +1 -1
- package/src/client/canvas/use-focus-trap.ts +6 -1
- package/src/client/mermaid-entry.ts +6 -20
- package/src/client/mermaid-render.ts +39 -0
- package/src/client/nodes/AxStepControls.tsx +45 -69
- package/src/client/nodes/BoardNode.tsx +65 -9
- package/src/client/nodes/ContextNode.tsx +88 -396
- package/src/client/nodes/ExtAppFrame.tsx +283 -1462
- package/src/client/nodes/FileNode.tsx +92 -81
- package/src/client/nodes/HtmlNode.tsx +8 -36
- package/src/client/nodes/LedgerNode.tsx +31 -17
- package/src/client/nodes/MarkdownNode.tsx +8 -17
- package/src/client/nodes/McpAppNode.tsx +48 -154
- package/src/client/nodes/MermaidNode.tsx +80 -69
- package/src/client/nodes/PromptNode.tsx +12 -14
- package/src/client/nodes/ResponseNode.tsx +8 -6
- package/src/client/nodes/StatusNode.tsx +22 -7
- package/src/client/nodes/StatusSummary.tsx +5 -3
- package/src/client/nodes/TraceNode.tsx +8 -8
- package/src/client/nodes/ViewerFrame.tsx +262 -0
- package/src/client/nodes/ViewerHost.tsx +41 -0
- package/src/client/nodes/WebpageNode.tsx +22 -24
- package/src/client/nodes/iframe-document-url.ts +20 -27
- package/src/client/nodes/primitive-copy.ts +97 -0
- package/src/client/nodes/use-iframe-content-height.ts +34 -10
- package/src/client/nodes/use-surface-frame.ts +22 -11
- package/src/client/nodes/viewer-runtime-state.ts +41 -35
- package/src/client/state/canvas-store.ts +18 -12
- package/src/client/state/intent-bridge.ts +1 -0
- package/src/client/state/presentation.ts +135 -15
- package/src/client/state/sse-bridge.ts +18 -19
- package/src/client/theme/global.css +389 -229
- package/src/client/theme/surface-theme.css +6 -6
- package/src/json-render/charts/tufte-components.tsx +44 -2
- package/src/json-render/renderer/index.css +62 -2
- package/src/json-render/renderer/index.tsx +31 -7
- package/src/json-render/server.ts +3 -2
- package/src/mcp/canvas-access.ts +6 -47
- package/src/mcp/resource-subscriptions.ts +181 -0
- package/src/mcp/server.ts +185 -219
- package/src/server/ax-wait.ts +21 -6
- package/src/server/board-export.ts +35 -24
- package/src/server/canvas-geometry.ts +1 -0
- package/src/server/canvas-operations.ts +6 -2
- package/src/server/canvas-state.ts +5 -0
- package/src/server/demo-state.json +106 -100
- package/src/server/html-primitives.ts +3 -9
- package/src/server/html-surface.ts +8 -0
- package/src/server/index.ts +30 -12
- package/src/server/operations/http.ts +69 -21
- package/src/server/operations/index.ts +8 -1
- package/src/server/operations/invoker.ts +53 -5
- package/src/server/operations/mcp-contracts.ts +354 -0
- package/src/server/operations/mcp.ts +153 -18
- package/src/server/operations/ops/ax-await.ts +18 -10
- package/src/server/operations/ops/ax-read.ts +2 -0
- package/src/server/operations/ops/ax-timeline.ts +2 -2
- package/src/server/operations/ops/batch.ts +27 -8
- package/src/server/operations/ops/boards.ts +1 -3
- package/src/server/operations/ops/nodes.ts +18 -3
- package/src/server/operations/ops/viewport.ts +11 -9
- package/src/server/operations/registry.ts +24 -4
- package/src/server/operations/types.ts +16 -2
- package/src/server/server.ts +17 -59
- package/src/server/tour-control.ts +66 -6
- package/src/server/webpage-node.ts +9 -4
- package/src/shared/ax-surface-protocol.ts +0 -11
- package/src/shared/content-height-reporter.ts +4 -3
- package/src/shared/tour.ts +8 -0
|
@@ -72,7 +72,7 @@ The remaining items were re-analyzed with pros/cons and tiered; the maintainer a
|
|
|
72
72
|
|---|---|
|
|
73
73
|
| Windows web-artifacts | The artifact build pipeline is bash-script-backed (POSIX-only); `tests/unit/web-artifacts.test.ts` self-skips on win32 and docs now state the boundary. Decide: port the build scripts to a cross-platform runner, or keep the documented "build on POSIX, render anywhere" stance. |
|
|
74
74
|
| Composite parity no longer machine-checked | Since v0.3.0 removed the legacy standalones, the byte-identical composite-vs-legacy guarantee has no head-to-head test — regressions in `buildInput`/`formatResult` reuse surface only via output-shape assertions. Accepted at review; revisit if a composite drifts. |
|
|
75
|
-
|
|
|
75
|
+
| Native ext-app paint (Finding N) | **Native acceptance open:** the maintainer rejected CSS zoom after it broke iframe layout and paint in WebKit. The original proportional world transform is restored. A separate portal also failed stacking, input and presentation. The shared loading owner replaces the old recovery ladder, but DOM readiness does not establish native WKWebView compositor health. See [the implementation decision](../design.md#011-implementation-notes). |
|
|
76
76
|
|
|
77
77
|
## Added post-0.4.0 (2026-08-04 report cycle)
|
|
78
78
|
|
|
@@ -123,7 +123,7 @@ Logs: `/tmp/pmx-w3-debt-baseline.zPoaEM/log` and `/tmp/pmx-w3-debt-after.iXN2fq/
|
|
|
123
123
|
| Priority / boundary | Evidence and disposition |
|
|
124
124
|
|---|---|
|
|
125
125
|
| Before larger-library scaling | `lifecycle-status.ts` reads every board and each card's full review history even for one-card requests. `KnowledgeSync` reloads workspace qualifications after board changes. Bound narrow reads to the dependency closure, batch/index review summaries, and separate folder aggregates from card detail when scaling this path. Measure populated review histories and long dependency chains as well as empty history. Avoid a TTL cache: cadence, sessions, retirement and source changes have different invalidation clocks. |
|
|
126
|
-
| Wave 4, frame host |
|
|
126
|
+
| Wave 4, frame host | **Implemented locally in the 0.11 candidate:** `ViewerHost` owns preview admission and `RefreshingViewerFrame` owns loading, painted replacement and Retry. `ExtAppFrame` is the protocol adapter, without its former recovery ladder. Draft/refresh, stacking and gesture regressions are covered. Native WebKit acceptance and the self-contained MCP document's additional Mermaid bytes remain explicit limits, not a second deferred recovery implementation. |
|
|
127
127
|
| Wave 5, groups and agent output | Keep board-qualified relation/provenance identities when moving cards into or out of a board. Review records currently outlive snapshots and are keyed by board + card; define their move semantics before adding make-board/inline-board. Do not clone validation as if a new claim had been checked. |
|
|
128
128
|
| Journal and shared/hosted stages | The due evaluator still reads the local `canvasState` singleton. Separate runtime acquisition from qualification when a second runtime needs it, not by speculative package splitting now. Filter authorized sources before summaries, titles and lifecycle reasons are computed. Categories are not permissions. Keep validation audit distinct from an undoable content journal and finish the authoritative mutation-path decision before event sourcing. |
|
|
129
129
|
| Test maintenance | Large integration files remain (`server-api.test.ts`, `canvas.pw.ts`). Split by owning domain when those domains next change, preserving isolation and race cases. Do not replace human browser or real transport checks with source-string assertions to make the suite cheaper. |
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
# Plan 019: After 0.9.0
|
|
2
2
|
|
|
3
|
-
**Status (2026-10-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Later version numbers are proposals, not publication approval; every release must pass
|
|
3
|
+
**Status (2026-10-25):** 0.10.0 is released. Step 3 is implemented and pushed,
|
|
4
|
+
with fresh post-push reviews and all five CI jobs passing. The maintainer authorized
|
|
5
|
+
release of 0.11.0; release metadata and publication gates follow the checkpoint below.
|
|
6
|
+
Versions after 0.11 remain proposals, not publication approval; every release must pass
|
|
8
7
|
the [release gates](../RELEASE.md).
|
|
9
8
|
**Sources:** [product vision](../product-vision-2026-09.md) (moves and the 2026-10-19 sequence),
|
|
10
9
|
[design.md build plan](../design.md#build-plan) (Waves 4, 5, Later),
|
|
@@ -23,8 +22,8 @@ measured; the maintainer carries that risk rather than reinstating an earlier ga
|
|
|
23
22
|
| Step | Proposed version | Scope | Vision | Size |
|
|
24
23
|
|---|---|---|---|---|
|
|
25
24
|
| 1 | 0.9.3 | Cleanup: tour debt, large-board costs, bounded due evaluator, MCP reconnect, lint | 12, 1 | S–M |
|
|
26
|
-
| 2 | 0.10 | MCP hardening
|
|
27
|
-
| 3 | 0.11 | One frame host,
|
|
25
|
+
| 2 | 0.10 | MCP hardening, operation help and bounded discovery-schema reduction | 6a, 1 | M |
|
|
26
|
+
| 3 | 0.11 | One frame host, proportional spatial zoom, Wave-0 design pass | 5, 9 | M–L |
|
|
28
27
|
| 4 | 0.12 | Wave 5: agent output as nodes, make/inline board, group drill-in, relations sketch parity | 3, 0 | L |
|
|
29
28
|
| 5 | later | Trust (M half), journal, concurrent boards, binary | 7, 4, 8 | L–XL |
|
|
30
29
|
| 6 | end | Curation-effect baseline and reruns; skill-prompt benchmark | Part 1 item 4 | S–M |
|
|
@@ -125,6 +124,121 @@ lists the exact locations. These remain outside the narrow behavioral fixes:
|
|
|
125
124
|
[Vision move 6a](../product-vision-2026-09.md#6a-make-the-tool-surface-cheap-s--staged-follow-up)
|
|
126
125
|
and move 1's context delivery, on the current SDK v1.
|
|
127
126
|
|
|
127
|
+
**Local implementation checkpoint (2026-10-24):**
|
|
128
|
+
- All 24 tools advertise output schemas and explicit effect hints. Registry results use
|
|
129
|
+
`{ result: { operation, outcome, data } }`; handwritten interaction, activity and screenshot
|
|
130
|
+
tools retain their direct objects. Existing model-facing text/projections stay unchanged.
|
|
131
|
+
Schemas distinguish batch success, empty failure and retained partial outcomes.
|
|
132
|
+
- Cancellation reaches AX waits and webpage I/O through local and HTTP invokers. Batches
|
|
133
|
+
retain completed receipts and stop before subsequent operations. Progress is opt-in through
|
|
134
|
+
MCP tokens and HTTP NDJSON. External runtime/build calls and local WebView captures remain
|
|
135
|
+
noninterruptible mid-call. Disconnects may lose the response, never undo completed writes.
|
|
136
|
+
- Subscriptions belong to each connection, include exact parameterized URIs, and dispose
|
|
137
|
+
on unsubscribe/close. Local state and workbench events cover library-only changes as well
|
|
138
|
+
as active nodes; remote SSE reconnects invalidate subscribed resources. Notifications never
|
|
139
|
+
record reads or advance cursors. A library-only-change regression failed before integration
|
|
140
|
+
and passes with the shared event source.
|
|
141
|
+
- SDK `getTour()` now returns `{ tour, derived, position }`; `.tour.stops` is documented as
|
|
142
|
+
the minor-version breaking change. No SDK/dependency upgrade or frame-host work.
|
|
143
|
+
|
|
144
|
+
**Approved follow-up, 2026-10-24:** `canvas_help { op }` derives one operation's
|
|
145
|
+
public arguments, required fields, routing selectors and guidance from the registry.
|
|
146
|
+
Omitting `op` lists MCP registry names; internal/human-only and non-registry tools are
|
|
147
|
+
excluded. Metadata reads neither boot a canvas nor record content delivery. The catalog
|
|
148
|
+
now has 25 tools. Conditional handler validation still applies; no lazy host discovery
|
|
149
|
+
or smaller input schemas are claimed.
|
|
150
|
+
|
|
151
|
+
Equivalent success schemas shared by identity are grouped within each tool. Distinct
|
|
152
|
+
payload contracts, error branches and batch partial receipts remain unchanged. Two
|
|
153
|
+
real stdio measurements with `bun run scripts/measure-mcp-catalog.ts` were byte-identical:
|
|
154
|
+
the previous 24-tool candidate's 144,680 UTF-8 JSON bytes become 137,381 for the same
|
|
155
|
+
tools (7,299 fewer, 5.05%). Existing output schemas drop from 77,105 to 69,806 bytes.
|
|
156
|
+
Adding help costs 1,156 catalog bytes including its separator: 138,537 bytes total,
|
|
157
|
+
6,143 fewer than the previous candidate (4.25%). Input-schema byte counts are unchanged.
|
|
158
|
+
This remains larger than published 0.9.3's 65,219 bytes. Bytes are not tokens, latency
|
|
159
|
+
or measured agent effectiveness. `session.start` and composite-input redesign remain deferred.
|
|
160
|
+
|
|
161
|
+
**Follow-up verification:** build, typecheck and `bun run test` pass (1,546 tests).
|
|
162
|
+
Real SDK stdio checks enumerate help for every exposed registry operation, validate
|
|
163
|
+
required fields, aliases and gate selectors, and create/remove a card using returned
|
|
164
|
+
arguments. Schema controls reject mismatched operations, malformed receipts and extra
|
|
165
|
+
envelope fields while accepting extensible payloads. Lint passes with 55 warnings and
|
|
166
|
+
12 infos. The first combined run caught a second frozen tool list still expecting 24;
|
|
167
|
+
that assertion now includes help. Test-fixture/typecheck failures were corrected, with
|
|
168
|
+
first-failure logs retained.
|
|
169
|
+
|
|
170
|
+
**Full candidate rerun requested by the maintainer:** `bun run test:coverage` passes
|
|
171
|
+
1,546 tests (67.27% lines, 73.62% functions, above the 60%/64% floors);
|
|
172
|
+
`bun run test:client` passes 332; `xvfb-run -a bash scripts/run-playwright.sh --headed`
|
|
173
|
+
passes all 333 desktop and 600/1024/1920 reference cases. Headed `test:e2e-cli`,
|
|
174
|
+
`release:smoke`, `pack:dry-run`, build, typecheck, lint and generated-catalog mirror
|
|
175
|
+
checks pass. A fresh packed MCP consumer discovers 25 tools, reads help without
|
|
176
|
+
creating state, and validates add/get results. Its allowed dependency versions
|
|
177
|
+
(SDK 1.32.2, Zod 4.6.7 versus checkout 1.28.0/4.3.6) encode nullable primitive schemas
|
|
178
|
+
as type arrays instead of `anyOf`. The initial byte-identity assertion failed;
|
|
179
|
+
comparison passes when only that equivalent encoding is normalized. No dependency changed.
|
|
180
|
+
|
|
181
|
+
The live portal serves the exact rebuilt bundle. Real stdio help-guided calls and
|
|
182
|
+
headed browser checks pass human pin → notification → explicit read → rendered edit,
|
|
183
|
+
unsubscribe, numeric progress tokens, cancelled approval waits, partial batch receipts
|
|
184
|
+
and refresh persistence. Both minimap toggles leave no tooltip and preserve Settings
|
|
185
|
+
focus. The first recording encoder fell behind; a later recording with the large suite
|
|
186
|
+
finished and a smaller viewport succeeded and was inspected frame by frame.
|
|
187
|
+
Native Amp/Copilot acceptance, Windows/macOS and remote/native reconnect remain unverified.
|
|
188
|
+
|
|
189
|
+
**Initial hardening verification:** build and typecheck pass; `bun run test` passes 1,544 tests and
|
|
190
|
+
`bun run test:client` passes 332. `xvfb-run -a bash scripts/run-playwright.sh --headed`
|
|
191
|
+
passes 333 cases; three pin/viewport/polling controls also pass after the final local
|
|
192
|
+
subscription event hook. `bun run release:smoke` passes on a disposable packed install,
|
|
193
|
+
not a registry publication. Lint passes with the same 55 warnings and 12 infos; generated
|
|
194
|
+
tool catalogs match. Real stdio tests cover local and daemon-attached progress/cancellation
|
|
195
|
+
and resource isolation. Initial test typing/SDK error-envelope failures and the red
|
|
196
|
+
library-notification regression were corrected; this is not a first-run-green claim.
|
|
197
|
+
Native 0.10 host acceptance, Windows/macOS and remote/native reconnect remain unverified.
|
|
198
|
+
Bounded simplify/harden review found no further blockers and made no additional changes.
|
|
199
|
+
|
|
200
|
+
**Independent baseline evidence:** the
|
|
201
|
+
[0.9.3 test thread](https://ampcode.com/threads/T-01a048cf-adb3-71bd-a7c6-472053b691d1)
|
|
202
|
+
reports no new confirmed functional defect after reruns, including installed SDK direct-tour
|
|
203
|
+
compatibility and native Amp pin/read/edit/ack acceptance. It does not establish 0.10 MCP
|
|
204
|
+
structured-output, cancellation or subscription conformance. Its low-severity KaTeX advisory,
|
|
205
|
+
unresolved first-run coverage timeout and remote/native reconnect gap remain separate from
|
|
206
|
+
this candidate; no dependency or reconnect fix is claimed here.
|
|
207
|
+
|
|
208
|
+
**Discovery cost:** `bun run scripts/measure-mcp-catalog.ts` measures UTF-8 bytes of the
|
|
209
|
+
real SDK client's `tools/list` JSON in a disposable stdio workspace, without canvas reads.
|
|
210
|
+
The 0.9.3 baseline is 65,219 bytes; the initial hardening candidate was 144,680 bytes, both 24 tools.
|
|
211
|
+
Output schemas contributed 77,105 bytes before the follow-up above. This is an increase in discovery overhead, not a
|
|
212
|
+
claim of cheaper prompts or a token estimate. Existing result text is unchanged; structured
|
|
213
|
+
results duplicate that projection for machine consumers. Host-specific prompt costs are unmeasured.
|
|
214
|
+
|
|
215
|
+
| Tool | 0.9.3 bytes | Initial hardening bytes |
|
|
216
|
+
|---|---:|---:|
|
|
217
|
+
| `canvas_pin_nodes` | 782 | 2227 |
|
|
218
|
+
| `canvas_invoke_command` | 804 | 2312 |
|
|
219
|
+
| `canvas_batch` | 1367 | 5184 |
|
|
220
|
+
| `canvas_import` | 1152 | 4251 |
|
|
221
|
+
| `canvas_snapshot` | 2238 | 6365 |
|
|
222
|
+
| `canvas_board` | 5859 | 14803 |
|
|
223
|
+
| `canvas_node` | 8184 | 13485 |
|
|
224
|
+
| `canvas_render` | 6321 | 11165 |
|
|
225
|
+
| `canvas_edge` | 2186 | 4423 |
|
|
226
|
+
| `canvas_group` | 1953 | 4532 |
|
|
227
|
+
| `canvas_history` | 494 | 2430 |
|
|
228
|
+
| `canvas_view` | 4341 | 12821 |
|
|
229
|
+
| `canvas_query` | 2476 | 7000 |
|
|
230
|
+
| `canvas_app` | 4729 | 7496 |
|
|
231
|
+
| `canvas_webview` | 1810 | 4834 |
|
|
232
|
+
| `canvas_ax_state` | 4462 | 7652 |
|
|
233
|
+
| `canvas_ax_work` | 2074 | 4527 |
|
|
234
|
+
| `canvas_ax_gate` | 2417 | 8285 |
|
|
235
|
+
| `canvas_ax_timeline` | 2637 | 6135 |
|
|
236
|
+
| `canvas_ax_delivery` | 1366 | 3284 |
|
|
237
|
+
| `canvas_intent` | 3127 | 5453 |
|
|
238
|
+
| `canvas_ax_interaction` | 1460 | 1969 |
|
|
239
|
+
| `canvas_ingest_activity` | 2341 | 2872 |
|
|
240
|
+
| `canvas_screenshot` | 604 | 1140 |
|
|
241
|
+
|
|
128
242
|
1. Remeasure `tools/list` size per tool before any schema change.
|
|
129
243
|
2. `outputSchema` + `structuredContent` for stable results (IDs, revisions, mutation
|
|
130
244
|
outcomes); compact model-facing content; UI-only payloads in `_meta` where supported.
|
|
@@ -137,7 +251,9 @@ and move 1's context delivery, on the current SDK v1.
|
|
|
137
251
|
6. Align SDK tour reads with HTTP/MCP `{ tour, derived, position }`; document the breaking
|
|
138
252
|
change from `.stops` to `.tour.stops` at this minor-version boundary.
|
|
139
253
|
|
|
140
|
-
|
|
254
|
+
7. Approved follow-up: `canvas_help { op }` and bounded output-schema deduplication, as above.
|
|
255
|
+
|
|
256
|
+
Candidates, not automatic scope: `session.start`, composite-input redesign.
|
|
141
257
|
|
|
142
258
|
**Done when**
|
|
143
259
|
- Representative read and mutation results validate against their advertised schemas.
|
|
@@ -152,20 +268,293 @@ Candidates, not automatic scope: `canvas_help { op }`, `session.start`, per-acti
|
|
|
152
268
|
[Vision moves 5 and 9](../product-vision-2026-09.md#5-keep-every-node-type-unify-how-they-render-m),
|
|
153
269
|
[design.md Wave 4](../design.md#build-plan).
|
|
154
270
|
|
|
271
|
+
**Pre-release checkpoint (2026-10-25):** Peter authorized commit, push, review/test
|
|
272
|
+
and release. The reconciled implementation is on `main` in
|
|
273
|
+
[`e92b885f`](https://github.com/pskoett/pmx-canvas/commit/e92b885f711891ec33a9e704630d71fac048ce62),
|
|
274
|
+
including the explicitly authorized historical 0.10 reports and control-room artifact.
|
|
275
|
+
Fresh post-push Oracle and Claude reviews found no runtime blocker. The first CI
|
|
276
|
+
run exposed seven import-order-dependent Markdown tests: `preact/compat` maps
|
|
277
|
+
`onBlur` to `focusout`, while synthetic blur emitted only one event. The test-only
|
|
278
|
+
repair uses native focus transitions and preserves every assertion. Both local
|
|
279
|
+
orders pass 359 tests; [exact-head CI](https://github.com/pskoett/pmx-canvas/actions/runs/40224062810)
|
|
280
|
+
for [`5a1c2696`](https://github.com/pskoett/pmx-canvas/commit/5a1c269632841091f2f199f7a36a169635d0639b)
|
|
281
|
+
passes all five jobs, including 380 browser cases, Windows and macOS units. Frozen
|
|
282
|
+
install, headed CLI coverage, packed release smoke and pack dry-run also pass.
|
|
283
|
+
No failed checks were waived. Native WKWebView, retained memory and post-repair
|
|
284
|
+
performance remain unverified. The checkpoints below retain earlier evidence and
|
|
285
|
+
delivery state; they do not override this later authorization or CI result.
|
|
286
|
+
|
|
287
|
+
**Historical local implementation checkpoint (before release authorization):** the maintainer's 2026-10-25
|
|
288
|
+
correction removes the third target's alternate grid and experimental CSS zoom.
|
|
289
|
+
The native board and its contents scale proportionally using the original matrix.
|
|
290
|
+
The other visual improvements and Markdown README-menu override remain in scope.
|
|
291
|
+
The shared viewer host replaces the ext-app recovery
|
|
292
|
+
ladder, keeps painted content during replacement, and owns explicit Retry for both
|
|
293
|
+
preparation and loading failures. JSON drafts survive theme and focus changes;
|
|
294
|
+
Mermaid's inline and standalone surfaces share the renderer. Preview mounting is
|
|
295
|
+
automatic at every zoom with no lifetime cap; visited documents remain mounted
|
|
296
|
+
for arbitrary app state. Initial documents load without a shared queue or user gate.
|
|
297
|
+
See [implementation decisions](../design.md#011-implementation-notes).
|
|
298
|
+
Oracle and Claude Code reviewed the combined change and its fixes. Claude and
|
|
299
|
+
the owning thread independently reproduced CSS-zoom sizing errors in Linux
|
|
300
|
+
WebKit26; transforms preserve inner dimensions in that probe and Chromium.
|
|
301
|
+
The earlier complete headed aggregate132 passed all 372 tests on the focus
|
|
302
|
+
and file-tooltip fixes, using Chromium 145.0.7632.6 across all four projects.
|
|
303
|
+
The original aggregate120 remains recorded as 371 pass / 1 fail: deferred modal
|
|
304
|
+
focus restoration dismissed a newly opened relation menu. Both that race and
|
|
305
|
+
the fresh Oracle review's file-header tooltip clipping have red/green regressions.
|
|
306
|
+
Oracle's follow-up accepts the repair. After its quota reset, Claude reviewed
|
|
307
|
+
snapshot137 read-only, verified all 531 source-manifest entries, and reported no
|
|
308
|
+
blockers. Its actionable findings are resolved below; review severity does
|
|
309
|
+
not close introduced debt or establish native-host acceptance. Peter requires new
|
|
310
|
+
Oracle and Claude reviews of the final integrated snapshot after its complete gate.
|
|
311
|
+
Aggregate153 remains 372 pass / 1 clipboard-test failure. Retrying the entire
|
|
312
|
+
clipboard read/parse/assertion, seeded with non-JSON text, fixes that test race
|
|
313
|
+
without changing the expected payload or deadline. Aggregate167 remains 372 pass /
|
|
314
|
+
1 startup-focus failure. Its trace and deterministic regression identify an older
|
|
315
|
+
buffered layout overwriting a newer camera while the first catalog is delayed.
|
|
316
|
+
The bounded fix passes the original theme/heading browser case at all three widths
|
|
317
|
+
in171. Aggregate174 remains 372 pass / 1 HTML-refresh failure. It exposed the initial
|
|
318
|
+
document's paint acknowledgement being cancelled when a replacement starts. The
|
|
319
|
+
document-owned readiness repair has controlled red/green unit and browser evidence;
|
|
320
|
+
aggregate182 passed all 373 headed cases. Gate182 passed typecheck, 1,515 unit tests
|
|
321
|
+
and 349 client tests. Bounded Oracle/Claude review183 then identified the additional
|
|
322
|
+
lifecycle interleavings below. Their fixes pass gate191 (typecheck, 1,515 unit tests,
|
|
323
|
+
353 client tests). Aggregate194 remains 374 pass / 2 fail: one forced app click hit
|
|
324
|
+
the loading overlay, and one long poll stalled across the test's `unrouteAll` while
|
|
325
|
+
the node deletion itself returned success. The tests now use ordinary pointer
|
|
326
|
+
actionability and keep interception stable while toggling refusal. Both pass five
|
|
327
|
+
headed repetitions in195. Aggregate196 remains 375 pass / 1 hosted-review failure:
|
|
328
|
+
the test entered evidence before the save's precondition reload finished, and that
|
|
329
|
+
reload correctly cleared the observation. Waiting for the dialog's enabled Save
|
|
330
|
+
control before entering new evidence passes three repetitions in197. The product's
|
|
331
|
+
input-reset behavior is unchanged. Both bounded reviewers confirm a separate,
|
|
332
|
+
pre-existing defect: evidence remains editable during that reload and can be lost.
|
|
333
|
+
`LifecyclePanel.tsx` is unchanged; the harness wait is not a product fix. This test's
|
|
334
|
+
whole-test ceiling was raised from 30 to 60 seconds; assertion deadlines are unchanged.
|
|
335
|
+
Aggregate198 passes all 376 headed cases. Bounded review198 then found that queued
|
|
336
|
+
tour requests can outlive a board activation, and a stalled exit blocks later Present.
|
|
337
|
+
The tour-specific server intent fence below replaces that queue. Build205 and gate207
|
|
338
|
+
pass: typecheck, 1,518 unit tests, 357 client tests and all 378 headed browser cases
|
|
339
|
+
across four projects. The source manifest is unchanged after the run. Fresh complete
|
|
340
|
+
Oracle and Claude reviews209 inspected that passing snapshot independently. Oracle
|
|
341
|
+
requested a generic-viewer theme repair; Claude accepted with a clipboard-permission
|
|
342
|
+
fix recommended. Both accept the bounded repair216, with no required fixes remaining.
|
|
343
|
+
Build213 and nine headed viewer/form cases214 pass. Gate215 passes typecheck,
|
|
344
|
+
1,518 unit tests, 359 client tests and lint; its full headed aggregate passes all
|
|
345
|
+
380 cases across four projects (27.7 minutes). The 537-entry source manifest still
|
|
346
|
+
matches after verification. Final portal218/219/221 serves the same built bundle:
|
|
347
|
+
70 cards, native board and first-stop screenshots at1440/600px, plus a pointer-visible
|
|
348
|
+
Present/Next/Next/Back/Escape recording with settled transitions. The captures and
|
|
349
|
+
full five-frame-per-second contact sheet were inspected. Saved nodes, edges,
|
|
350
|
+
viewport, tour and board/README metadata are unchanged; the unrelated control-room
|
|
351
|
+
artifact is unchanged. Narrow native fit intentionally scales content down rather
|
|
352
|
+
than reflowing it. Resize alone preserves the current camera; invoking Present at
|
|
353
|
+
the new width fits the selected stop. No native-host or performance acceptance is
|
|
354
|
+
inferred from these checks.
|
|
355
|
+
Lint exits zero with
|
|
356
|
+
54 warnings and 12 informational diagnostics, all with baseline identities;
|
|
357
|
+
the earlier McpAppNode void-union warning is gone.
|
|
358
|
+
The earlier populated-viewer slowdown is not reproduced in benchmark180,
|
|
359
|
+
described below. The self-contained MCP document grows from 1.32 MB to 4.78 MB, and
|
|
360
|
+
visited documents retain arbitrary app state and its memory cost. These remain
|
|
361
|
+
explicit tradeoffs; native WKWebView boot and paint are unverified.
|
|
362
|
+
The approved installed-consumer helper repair now stages complete built asset
|
|
363
|
+
trees; its default no-override installed-package case passes. Populated portal
|
|
364
|
+
workflows, current-state primitive copying, eight-stop presentation navigation
|
|
365
|
+
and standalone offline export have been exercised and visually inspected.
|
|
366
|
+
Native host acceptance remains separate. No commit, push or release is implied.
|
|
367
|
+
The dim heading, neighboring offscreen title and focus tooltip observations
|
|
368
|
+
were traced to existing view states. Overview-overlay clearance is superseded
|
|
369
|
+
by removal of the rejected overview, not claimed solved by tile nonoverlap.
|
|
370
|
+
|
|
371
|
+
**Fresh review dispositions (2026-10-25):**
|
|
372
|
+
- **Complete209 and bounded216:** both reviewers verified all 537 source-manifest
|
|
373
|
+
entries. Only JSON/graph use named-theme messages and retain drafts across theme
|
|
374
|
+
changes. Generic hosted viewers again consume dark/light queries and navigate on
|
|
375
|
+
scheme changes, preserving baseline behavior rather than promising draft retention.
|
|
376
|
+
Shared frames default to no delegated permissions; MCP explicitly keeps its existing
|
|
377
|
+
clipboard policy. Client212 reproduces both regressions, client213 passes all21 cases,
|
|
378
|
+
and headed214 passes all9 generic/JSON cases in src/srcdoc modes. Test213's theme
|
|
379
|
+
override intentionally suppressed server changes; removing that test setup error
|
|
380
|
+
preserves the original rendered-theme assertions. Original red evidence is retained.
|
|
381
|
+
- **Security/platform probes211:** three authored Mermaid CSS break-out cases leave
|
|
382
|
+
the body and toolbar visible in headed Chromium145 and Linux WebKit26; captured
|
|
383
|
+
selectors stay diagram-scoped. This does not establish CSS safety in general.
|
|
384
|
+
Card content already has paint containment. Author CSP `script-src 'none'` leaves
|
|
385
|
+
HTML visible without a fallback after11s because the bridge precedes the meta tag.
|
|
386
|
+
Both engines enumerate all37 canvas custom properties. Claude closes those concrete
|
|
387
|
+
cases and the documented full-build export precondition; native WKWebView remains
|
|
388
|
+
unverified. No speculative renderer or export fallback was added.
|
|
389
|
+
- **Fixed repeated edge layout:** the three paint layers predate this work; repeated
|
|
390
|
+
collision placement was introduced here. One shared scale/font/node/edge computation
|
|
391
|
+
now serves all three layers without rebuilding for pan. In three headed Chromium145
|
|
392
|
+
runs of 60 camera updates over 200 cards/150 labelled edges, text measurements fell
|
|
393
|
+
from 54,000 to zero for pan and 17,400 for zoom. All six final paint geometries match.
|
|
394
|
+
Instrumented frame medians overlap: pan155–172 ms before/140–160 ms after,
|
|
395
|
+
zoom449–468 ms before/407–472 ms after. No smoothness, boot-speed or load-cause claim.
|
|
396
|
+
Reproduce with `scripts/benchmark-edge-navigation.mjs`; profiles140/142 are retained.
|
|
397
|
+
- **28% marked-edge case verified:** the populated file/diff mark clears cards and
|
|
398
|
+
hovered handles, remains in the adjacent row gap, and supports pointer/keyboard menus
|
|
399
|
+
through39→28→60→28% plus real wheel/pan. Its side gap is about11px, smaller than
|
|
400
|
+
the14px mark even before clearance, so below-card placement is necessary. The
|
|
401
|
+
emitted paint/hit regression now includes28%. No handle shrinking or speculative
|
|
402
|
+
hover-dependent placement was added. Probe148 preserves the clone's saved state.
|
|
403
|
+
- **Documented source-build precondition:** exports require built CSS, fonts and
|
|
404
|
+
viewer assets; the package includes them. Missing assets are not a supported mode.
|
|
405
|
+
- **Fixed Copy JSON owner coupling:** explicit expanded ownership replaces reverse
|
|
406
|
+
registration order. Regression144 copies the wrong inline draft before the fix;
|
|
407
|
+
145 passes expanded-first, later inline re-registration and close-to-inline fallback.
|
|
408
|
+
The card menu remains behind the modal; this removes incidental ordering without
|
|
409
|
+
inventing a new modal copying flow or weakening sandbox reply validation.
|
|
410
|
+
- **Retained Copy JSON behavior:** an unloaded viewer keeps the action and reports
|
|
411
|
+
an honest failure. It never substitutes stale server data or claims success.
|
|
412
|
+
- **Fixed presentation delivery ordering:** missing tour echoes reproduced dead
|
|
413
|
+
buttons in145. The initial HTTP fallback introduced cross-stream ordering races.
|
|
414
|
+
Steps and exits now share one server sequence, catalog epoch and board generation.
|
|
415
|
+
The client separates observed/applied deliveries and local cancellation/remote
|
|
416
|
+
hiding. Regressions154/158/161/163 reproduce stale steps, stale exits and hidden
|
|
417
|
+
echoes. Client163 and all six headed cases164 pass the final repair, including
|
|
418
|
+
both exit/restart orders. Oracle's bounded recheck found no remaining tour issue.
|
|
419
|
+
Actual-portal173 exercises Present, Next and Escape on the served final bundle;
|
|
420
|
+
inspected wide/narrow captures and pointer recording show control clearance.
|
|
421
|
+
Saved nodes, edges, viewport, tour and board/README metadata remain unchanged.
|
|
422
|
+
- **Fixed startup focus:** the layout/catalog buffering path exists in 0.10.0 by
|
|
423
|
+
source comparison. Aggregate167 exposes it when a focus event overtakes the first
|
|
424
|
+
catalog response. Regression170 reproduces the camera reverting from y=96 to y=-47;
|
|
425
|
+
updating the buffered layout's camera on the newer event makes all 27 board-state
|
|
426
|
+
cases pass. The original theme/heading browser test passes unchanged at 600, 1024
|
|
427
|
+
and 1920px in171. No delayed test focus or longer assertion deadline hides the race.
|
|
428
|
+
- **Fixed initial viewer readiness:** aggregate174 exposed a race introduced by the
|
|
429
|
+
shared host. A replacement cancelled the retained document's first paint reply;
|
|
430
|
+
a late load could also use the replacement's token. Readiness now belongs to each
|
|
431
|
+
document, and only the current load can own Retry. Unit176 and controlled headed
|
|
432
|
+
browser177 fail before the repair; unit180 and both src/srcdoc browser180/181 pass.
|
|
433
|
+
Initial-load-before/after-update controls preserve the replacement's failure banner,
|
|
434
|
+
and an old document error cannot redirect Retry to obsolete content. The prior
|
|
435
|
+
11-case viewer suite179 passes; full integrated acceptance remains separate.
|
|
436
|
+
- **Review183 lifecycle repairs:** Retry now cancels removed entries even when their
|
|
437
|
+
source key is unchanged. The initial tour repair made local Present wait for earlier Exit requests.
|
|
438
|
+
Unit184 reproduces both failures and passes after the fixes; browser187 exercises
|
|
439
|
+
the held-exit restart and all four navigation cases. The exit request race also
|
|
440
|
+
exists in 0.10.0 by source comparison; the readiness leak belongs to the shared host.
|
|
441
|
+
- **Review198 tour request ownership:** both reviewers helped replace the exit wait
|
|
442
|
+
with an atomic server-side document intent fence. Old/duplicate requests emit no
|
|
443
|
+
event, earlier activations cannot affect the current board, and a pending resume
|
|
444
|
+
cannot overtake a newer gesture. Client199 has four red cases before the fix and
|
|
445
|
+
all seven pass after; server199 has two red cases before and all14 pass after.
|
|
446
|
+
Additional capacity, invalid-input, SDK and MCP controls pass in202 (15 cases).
|
|
447
|
+
Headed202 verifies a held-before-execution exit over both HTTP and hosted MCP:
|
|
448
|
+
the restart paints before release, the old exit is superseded, and Next still works.
|
|
449
|
+
Browser199 stalls before restart with the old client. Browser201 reaches the new
|
|
450
|
+
restart but stalls reading Chromium's intercepted response body;202 reads the same
|
|
451
|
+
actual response through route.fetch before fulfilling it. Both attempts are retained.
|
|
452
|
+
The fence is latest-intent-wins within one document, not FIFO or cancellation across
|
|
453
|
+
reloads. Different documents/agents retain arrival-order control. See the
|
|
454
|
+
[public contract](../http-api.md#board-tours); no generic request framework was added.
|
|
455
|
+
Both bounded203 rechecks accept the fence. A current superseded startup now explains
|
|
456
|
+
the missing stop while the catalog is delayed: client/browser204 fail before the
|
|
457
|
+
feedback fix, client205 and headed206/209 pass after. Run205's route-teardown error
|
|
458
|
+
is retained; waiting for pending handlers fixes teardown without changing assertions.
|
|
459
|
+
- **Authored JSON ownership:** readiness and draft ownership have separate lifetimes.
|
|
460
|
+
A retained document may finish painting after a spec change but cannot supply the
|
|
461
|
+
replacement's drafts. Unit185 fails both initial-load orderings before the fix.
|
|
462
|
+
Browser188 passes src/srcdoc with a held initial load; deliberately removing the
|
|
463
|
+
authored-identity check makes both cases copy `Old user draft` into the new spec
|
|
464
|
+
in189. That mutation is removed. Browser187's earlier image-blocking probe instead
|
|
465
|
+
waited for content before the required parent restore; it was a harness error.
|
|
466
|
+
- **Complete connection snapshot:** browser185 reproduces a lost remote tour command
|
|
467
|
+
while the initial catalog HTTP request is held. The shared SSE/poll snapshot now
|
|
468
|
+
sends the catalog before its layout, rather than adding another client event queue.
|
|
469
|
+
The same browser case and the snapshot API test pass in186. This closes the startup
|
|
470
|
+
gap exposed by the new tour identity check, without assuming reordered transport.
|
|
471
|
+
- **Review183 reconciliation:** Claude withdrew hidden-port displacement, hypothetical
|
|
472
|
+
polling reordering and Copy JSON's intentional replacement refusal as defects after
|
|
473
|
+
inspecting the existing profiles, probe148 and supported contracts. Neither reviewer
|
|
474
|
+
found another concrete edge-cache or Copy JSON ownership failure. Zoom layout time
|
|
475
|
+
differs between the profiled bundles; no cause or user-visible slowdown is established.
|
|
476
|
+
- **Populated loading comparison before review183 repairs:** benchmark180 uses identical 70-card states,
|
|
477
|
+
33 visible viewers at18%, headed Chromium145 at1440×900/2x, and alternating builds
|
|
478
|
+
over three cold-browser/warm-reload pairs each. Server/OS caches are warm; no build
|
|
479
|
+
or test suite runs concurrently. Candidate bundle1f19d305 takes7.55–7.82s cold and
|
|
480
|
+
7.86–7.94s warm versus0.10.0's7.63–7.99s and7.95–8.09s. All33 viewers report content
|
|
481
|
+
ready, with no missing viewers, page errors or timeouts; states remain identical.
|
|
482
|
+
This does not reproduce run79's earlier candidate slowdown. Small samples and
|
|
483
|
+
instrumented readiness, rather than native paint, do not establish a speedup,
|
|
484
|
+
equivalence or a cause. The four subsequent lifecycle fixes are not measured by
|
|
485
|
+
this comparison. Reproduce with `scripts/benchmark-populated-canvas.mjs`.
|
|
486
|
+
|
|
487
|
+
**Independent Copilot evidence for released0.10.0, not this source:** its final
|
|
488
|
+
report records source330 pass/1 toolbar-resize failure/2 platform skips and
|
|
489
|
+
registry319 pass/11 teardown failures/2 skips. Unchanged targeted reruns pass;
|
|
490
|
+
the original gates remain red and causes unresolved. Current verification overlaps
|
|
491
|
+
the resized multi-agent toolbar and script-only hosted forms. It cannot explain
|
|
492
|
+
those Mac failures without the raw traces, which remain on Copilot's machine.
|
|
493
|
+
Scoped public contracts, documents and persistence pass separately. Native steering
|
|
494
|
+
queued despite installed immediate-mode send sites; Peter observed manual submission
|
|
495
|
+
was required. The original probe arrived about91 minutes later, with manual send
|
|
496
|
+
versus automatic draining unknown. That is not active-run or idle-wake acceptance.
|
|
497
|
+
Fresh extension activation and native WKWebView remain unverified. This report
|
|
498
|
+
does not justify speculative adapter changes or upgrade current native acceptance.
|
|
499
|
+
|
|
500
|
+
**Independent Codex evidence for released0.10.0, not this source:** its final
|
|
501
|
+
addendum records source325 pass/6 fail/2 platform skips and registry329 pass/1 fail/2
|
|
502
|
+
skips. Unchanged isolated passes do not clear either aggregate. The registry footer
|
|
503
|
+
Home failure (`scrollTop: 3019`) repeats an earlier Amp finding. Source failures
|
|
504
|
+
overlap file saves, hosted draft replay, HTML/Mermaid, hosted Clear and wide Home;
|
|
505
|
+
five are teardown timeouts. Concurrent broad runs confound load attribution.
|
|
506
|
+
|
|
507
|
+
- **C01, reproduced platform defect:** macOS foreground PTY Ctrl-C twice retained
|
|
508
|
+
PNGs but exited1 without `recording.json`; normal-duration capture finalized.
|
|
509
|
+
Linux recording checks do not close this. Introduction and root layer are unknown.
|
|
510
|
+
- **C02, guidance/API mismatch:** swept expired intents permit unlinked leaf writes;
|
|
511
|
+
top-level batch linkage rejects standalone but is discarded attached/HTTP.
|
|
512
|
+
Leaf linkage and veto controls work. This is not an established authorization
|
|
513
|
+
bypass. Correcting those skill promises is separate from the UI changes here.
|
|
514
|
+
- **C03, integration limitation:** terminal progress arrived40/40 on the wire but
|
|
515
|
+
31/40 through SDK1.32.2 callbacks, with nine unknown tokens. SDK cleanup is a
|
|
516
|
+
hypothesis, not an established PMX cause or a durable completion signal.
|
|
517
|
+
- **C04, guidance discoverability:** the main skill needs a response-shape reference
|
|
518
|
+
with direct-tool/help exceptions, not a universal unwrap. No skill edit is implied.
|
|
519
|
+
- **Native scope:** Codex paint/actions, selected inline/expanded drafts and imports
|
|
520
|
+
passed on released code. Configured discovery still shows24 tools/no help versus
|
|
521
|
+
fresh25. Graph Open in tab was unobserved before permission blocked inspection;
|
|
522
|
+
remaining graph/Excalidraw/keyboard checks are incomplete. These results do not
|
|
523
|
+
verify the changed viewer host in native WKWebView. Raw traces remain external.
|
|
524
|
+
|
|
525
|
+
These are separate acceptance findings, not authorization to broaden product fixes
|
|
526
|
+
or weaken the current source gates. Native activation, PTY finalization and aggregate
|
|
527
|
+
reliability remain explicit gaps alongside the current viewer-host limitations.
|
|
528
|
+
|
|
529
|
+
**Inherited 0.10.0 evidence, not 0.11 acceptance:** the [pinned independent audit](https://github.com/pskoett/personalclaude/commit/42b22f863214be48ef8b90b4050323b060ee558f)'s original
|
|
530
|
+
portal aggregate remains 324 pass / 8 fail. Six failures were harness defects; the
|
|
531
|
+
isolated eight-case pass does not replace the aggregate. Footer Home scrolling and
|
|
532
|
+
the lifecycle warning after reload remain unexplained intermittent failures, as
|
|
533
|
+
does the receipt Undo/unpin CI retry. The audit's supplemental portal, renderer,
|
|
534
|
+
nine-theme, extraction, keyboard, minimap and registry-SDLC checks passed. Native
|
|
535
|
+
Amp passed the pin/read/steer/edit/visible-result/ack sequence and negative controls,
|
|
536
|
+
whole-board context, help-guided creation, AX gating and Bun.WebView lifecycle.
|
|
537
|
+
Native reconnect/subscriptions, Copilot/WebKit, idle wake-up, persistent pumps and
|
|
538
|
+
native Skills activation remain unestablished. Existing skill packaging/guidance
|
|
539
|
+
debt and the low KaTeX advisory GHSA-238p-pmpm-9mq7 are outside this UI change.
|
|
540
|
+
No cancellation behavior changes here: aborted MCP requests may suppress final
|
|
541
|
+
responses even when writes already persisted.
|
|
542
|
+
|
|
155
543
|
- **One frame host** for `html`, `mcp-app`, `json-render`, `graph`, `webpage`, `mermaid`: lazy
|
|
156
|
-
mount near the viewport,
|
|
544
|
+
mount near the viewport, independent loading, one loading deadline, one visible fallback with
|
|
157
545
|
retry, full theme tokens passed in. Reuse the shared AX bridge. Replaces the recovery
|
|
158
546
|
machinery in `ExtAppFrame.tsx`. Mermaid renders inline.
|
|
159
|
-
- **
|
|
160
|
-
|
|
547
|
+
- **Native spatial scaling** (maintainer override): restore the common world transform.
|
|
548
|
+
No alternate grid, content enlargement or iframe counter-scaling. The historical native
|
|
549
|
+
WKWebView black-tile issue remains unverified; do not infer compositor health from DOM readiness.
|
|
161
550
|
- **Wave-0 design pass** ([design gaps](design-gaps-2026-10-08.md) suggested order 4): section
|
|
162
551
|
labels (#2), the 44 px floating-chrome lane and Updates chip (#3), node header fill/title
|
|
163
552
|
(#7), then the token sweep (#4 type floor, #5 radii/elevation, #6 Harbor drift, #9 raw
|
|
164
553
|
`rgba()`), then the per-type pass (#8).
|
|
165
554
|
|
|
166
555
|
**Done when**
|
|
167
|
-
-
|
|
168
|
-
|
|
556
|
+
- Viewers inherit the canvas palette and automatically render as their regions become visible.
|
|
557
|
+
Fit-all keeps the same board geometry and proportional contents. Retention costs memory.
|
|
169
558
|
- Authored drafts, input state, offscreen replacements and the painted-refresh handoff still
|
|
170
559
|
pass their existing browser cases.
|
|
171
560
|
- Each design-gap item matches its drawing at 600, 1024 and 1920 px in all nine themes; the
|
|
@@ -522,6 +522,15 @@ shared AX bridge. Preserve authored drafts, input state, offscreen replacements
|
|
|
522
522
|
painted-refresh handoff in the current browser cases. Chromium passes do not establish native
|
|
523
523
|
Copilot/WebKit paint; keep that limitation explicit until separately exercised.
|
|
524
524
|
|
|
525
|
+
**Zoom direction (owner decision, 2026-10-25).** The alternate zoomed-out overview
|
|
526
|
+
is dropped, not deferred. Zoom always shows the native spatial board with its actual
|
|
527
|
+
contents, card positions, groups and connections. Do not replace it with a title/type
|
|
528
|
+
grid, list or other view at a zoom threshold. Card bodies and embedded content scale
|
|
529
|
+
proportionally with the board, without content enlargement or zoom-induced reflow.
|
|
530
|
+
Only header text may receive a modest, bounded readability adjustment. This supersedes
|
|
531
|
+
the alternate overview and content-scaling proposals in earlier drawings and plans;
|
|
532
|
+
the remaining shared-viewer and visual-consistency work stays in scope.
|
|
533
|
+
|
|
525
534
|
### 6a. Make the tool surface cheap (S) — staged follow-up
|
|
526
535
|
|
|
527
536
|
**Current status, 2026-10-12:** direction accepted, not implemented or a gate for
|
package/docs/sdk.md
CHANGED
|
@@ -38,8 +38,11 @@ records retain their reviewed revision, and legacy unversioned evidence remains
|
|
|
38
38
|
|
|
39
39
|
## Board tours
|
|
40
40
|
|
|
41
|
-
`canvas.getTour()` returns
|
|
42
|
-
|
|
41
|
+
`canvas.getTour()` returns `{ tour, derived, position }`, matching HTTP and MCP.
|
|
42
|
+
Read stops from `canvas.getTour().tour.stops`. `derived` is true when stops come
|
|
43
|
+
from group reading order rather than a saved tour. `position` is the current
|
|
44
|
+
stop index, or null outside a tour.
|
|
45
|
+
This is a breaking change in 0.10: replace `.getTour().stops` with `.getTour().tour.stops`.
|
|
43
46
|
`canvas.setTour(tourOrNull)` saves the tour or resets it to derived group order.
|
|
44
47
|
See the [tour contract](http-api.md#board-tours) for navigation and camera moves.
|
|
45
48
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmx-canvas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Spatial canvas workbench for coding agents — infinite 2D canvas with agent-native CLI, MCP integration, nodes, edges, file watching, and snapshots",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/server/index.ts",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dev:demo": "bun run src/cli/index.ts --demo",
|
|
34
34
|
"dev:portless": "portless run --name pmx --app-port 4313 bun run src/cli/index.ts --no-open --port=4313",
|
|
35
35
|
"dev:portless:demo": "portless run --name pmx --app-port 4313 bun run src/cli/index.ts --no-open --port=4313 --demo",
|
|
36
|
-
"build:client": "bun build src/client/index.tsx --outdir dist/canvas --minify && bun build src/client/mermaid-entry.ts --outdir dist/canvas --minify && cp src/client/theme/global.css dist/canvas/global.css && cp src/client/theme/surface-theme.css dist/canvas/surface-theme.css && bun run scripts/copy-fonts.ts",
|
|
36
|
+
"build:client": "rm -rf dist/canvas/chunks && bun build src/client/index.tsx --outdir dist/canvas --minify --splitting --chunk-naming 'chunks/[name]-[hash].[ext]' && bun build src/client/mermaid-entry.ts --outdir dist/canvas --minify && cp src/client/theme/global.css dist/canvas/global.css && cp src/client/theme/surface-theme.css dist/canvas/surface-theme.css && bun run scripts/copy-fonts.ts",
|
|
37
37
|
"build:mcp-app": "bun run scripts/build-mcp-app.ts",
|
|
38
38
|
"build:json-render": "bash scripts/build-json-render.sh",
|
|
39
39
|
"build:types": "tsc -p tsconfig.types.json",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "pmx-canvas",
|
|
4
4
|
"description": "PMX Canvas spatial workbench and MCP tools, with a native canvas panel in the GitHub Copilot app.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.11.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "pskoett",
|
|
8
8
|
"url": "https://github.com/pskoett"
|