pmx-canvas 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/Readme.md +19 -6
  3. package/dist/canvas/global.css +123 -2
  4. package/dist/canvas/index.js +103 -68
  5. package/dist/json-render/index.js +109 -109
  6. package/dist/types/client/canvas/CanvasViewport.d.ts +1 -1
  7. package/dist/types/client/icons.d.ts +2 -0
  8. package/dist/types/client/nodes/HtmlNode.d.ts +12 -1
  9. package/dist/types/client/state/canvas-store.d.ts +2 -0
  10. package/dist/types/client/types.d.ts +3 -2
  11. package/dist/types/json-render/charts/components.d.ts +5 -1
  12. package/dist/types/json-render/renderer/index.d.ts +1 -0
  13. package/dist/types/json-render/server.d.ts +1 -0
  14. package/dist/types/mcp/canvas-access.d.ts +3 -0
  15. package/dist/types/server/canvas-operations.d.ts +4 -0
  16. package/dist/types/server/canvas-schema.d.ts +19 -3
  17. package/dist/types/server/canvas-serialization.d.ts +1 -0
  18. package/dist/types/server/canvas-state.d.ts +6 -2
  19. package/dist/types/server/html-node-summary.d.ts +2 -0
  20. package/dist/types/server/html-primitives.d.ts +42 -0
  21. package/dist/types/server/index.d.ts +26 -0
  22. package/docs/cli.md +4 -1
  23. package/docs/http-api.md +11 -1
  24. package/docs/mcp.md +10 -4
  25. package/docs/node-types.md +54 -4
  26. package/docs/screenshot.png +0 -0
  27. package/docs/sdk.md +12 -0
  28. package/package.json +1 -1
  29. package/skills/pmx-canvas/SKILL.md +17 -3
  30. package/skills/pmx-canvas/references/html-primitives.md +132 -0
  31. package/src/cli/agent.ts +159 -5
  32. package/src/cli/index.ts +1 -1
  33. package/src/client/App.tsx +21 -2
  34. package/src/client/canvas/AnnotationLayer.tsx +33 -12
  35. package/src/client/canvas/CanvasViewport.tsx +88 -7
  36. package/src/client/canvas/CommandPalette.tsx +2 -2
  37. package/src/client/canvas/ContextMenu.tsx +2 -2
  38. package/src/client/canvas/ExpandedNodeOverlay.tsx +112 -3
  39. package/src/client/canvas/auto-fit.ts +5 -1
  40. package/src/client/icons.tsx +13 -0
  41. package/src/client/nodes/HtmlNode.tsx +125 -13
  42. package/src/client/nodes/McpAppNode.tsx +12 -4
  43. package/src/client/state/canvas-store.ts +15 -5
  44. package/src/client/state/sse-bridge.ts +5 -4
  45. package/src/client/theme/global.css +123 -2
  46. package/src/client/types.ts +2 -1
  47. package/src/json-render/charts/components.tsx +41 -7
  48. package/src/json-render/charts/extra-components.tsx +13 -12
  49. package/src/json-render/renderer/index.tsx +1 -0
  50. package/src/json-render/server.ts +3 -1
  51. package/src/mcp/canvas-access.ts +54 -1
  52. package/src/mcp/server.ts +98 -28
  53. package/src/server/agent-context.ts +39 -0
  54. package/src/server/canvas-operations.ts +99 -38
  55. package/src/server/canvas-provenance.ts +8 -6
  56. package/src/server/canvas-schema.ts +94 -3
  57. package/src/server/canvas-serialization.ts +16 -4
  58. package/src/server/canvas-state.ts +9 -4
  59. package/src/server/demo-state.json +1143 -0
  60. package/src/server/demo.ts +25 -777
  61. package/src/server/html-node-summary.ts +141 -0
  62. package/src/server/html-primitives.ts +1300 -0
  63. package/src/server/index.ts +63 -3
  64. package/src/server/server.ts +154 -17
  65. package/src/server/spatial-analysis.ts +5 -3
@@ -0,0 +1,1143 @@
1
+ {
2
+ "version": 1,
3
+ "snapshot": {
4
+ "id": "snap-mo0xsd9u-0zzq",
5
+ "name": "Full single-batch build",
6
+ "createdAt": "2026-04-16T03:45:37.074Z",
7
+ "nodeCount": 19,
8
+ "edgeCount": 6
9
+ },
10
+ "viewport": {
11
+ "x": 0,
12
+ "y": 0,
13
+ "scale": 1
14
+ },
15
+ "nodes": [
16
+ {
17
+ "id": "node-mo0xsd9l-jobh",
18
+ "type": "markdown",
19
+ "position": {
20
+ "x": 40,
21
+ "y": 40
22
+ },
23
+ "size": {
24
+ "width": 2800,
25
+ "height": 140
26
+ },
27
+ "zIndex": 1,
28
+ "collapsed": false,
29
+ "pinned": false,
30
+ "dockPosition": null,
31
+ "data": {
32
+ "title": "Tech Enabling OKRs + DX — C1 2026",
33
+ "content": "# Tech Enabling Canvas\n\n**Teams:** DVT · DCP | **Cycle:** C1 2026 | **DX:** Dec 2025 (120 respondents, 93%)",
34
+ "arrangeLocked": true
35
+ }
36
+ },
37
+ {
38
+ "id": "node-mo0xsd9m-a1t5",
39
+ "type": "markdown",
40
+ "position": {
41
+ "x": 40,
42
+ "y": 240
43
+ },
44
+ "size": {
45
+ "width": 600,
46
+ "height": 200
47
+ },
48
+ "zIndex": 1,
49
+ "collapsed": false,
50
+ "pinned": false,
51
+ "dockPosition": null,
52
+ "data": {
53
+ "title": "DVT O1 — Self-service",
54
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| +1/5 CSAT | 100% | 5/10 |\n| 3 interfaces | 100% | 5/10 |\n| 5 use cases | 100% | 5/10 |",
55
+ "parentGroup": "group-mo0xsd9s-payr"
56
+ }
57
+ },
58
+ {
59
+ "id": "node-mo0xsd9m-hp10",
60
+ "type": "markdown",
61
+ "position": {
62
+ "x": 40,
63
+ "y": 540
64
+ },
65
+ "size": {
66
+ "width": 600,
67
+ "height": 200
68
+ },
69
+ "zIndex": 1,
70
+ "collapsed": false,
71
+ "pinned": false,
72
+ "dockPosition": null,
73
+ "data": {
74
+ "title": "DVT O2 — Dependabot",
75
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| 30% drop vulns | 100% | 5/10 |\n| +50 PRs | 100% | 5/10 |\n| 26 teams scan | 100% | 5/10 |\n| 5 auto-merge | 100% | 5/10 |\n| 15 close vulns | 100% | 5/10 |",
76
+ "parentGroup": "group-mo0xsd9s-payr"
77
+ }
78
+ },
79
+ {
80
+ "id": "node-mo0xsd9m-5iut",
81
+ "type": "markdown",
82
+ "position": {
83
+ "x": 40,
84
+ "y": 900
85
+ },
86
+ "size": {
87
+ "width": 600,
88
+ "height": 200
89
+ },
90
+ "zIndex": 1,
91
+ "collapsed": false,
92
+ "pinned": false,
93
+ "dockPosition": null,
94
+ "data": {
95
+ "title": "DVT O3 — GitOps",
96
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| 2+ teams change deploy | 100% | 5/10 |\n| 1+ step removed | 100% | 5/10 |\n| 3 teams faster loop | 100% | 5/10 |",
97
+ "parentGroup": "group-mo0xsd9s-payr"
98
+ }
99
+ },
100
+ {
101
+ "id": "node-mo0xsd9m-9f5s",
102
+ "type": "markdown",
103
+ "position": {
104
+ "x": 40,
105
+ "y": 1200
106
+ },
107
+ "size": {
108
+ "width": 600,
109
+ "height": 200
110
+ },
111
+ "zIndex": 1,
112
+ "collapsed": false,
113
+ "pinned": false,
114
+ "dockPosition": null,
115
+ "data": {
116
+ "title": "DVT O4 — FDE/Catalog",
117
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| Golden paths | 100% | 5/10 |\n| Highest value | 100% | 5/10 |\n| TBD | - | 5/10 |",
118
+ "parentGroup": "group-mo0xsd9s-payr"
119
+ }
120
+ },
121
+ {
122
+ "id": "node-mo0xsd9m-e9jc",
123
+ "type": "markdown",
124
+ "position": {
125
+ "x": 680,
126
+ "y": 240
127
+ },
128
+ "size": {
129
+ "width": 600,
130
+ "height": 200
131
+ },
132
+ "zIndex": 1,
133
+ "collapsed": false,
134
+ "pinned": false,
135
+ "dockPosition": null,
136
+ "data": {
137
+ "title": "DCP O1 — AWS PIM",
138
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| Reduce no-PIM | TBD | 8/10 |\n| Role model | 1 | TBD |",
139
+ "parentGroup": "group-mo0xsd9t-p8g1"
140
+ }
141
+ },
142
+ {
143
+ "id": "node-mo0xsd9m-5dkm",
144
+ "type": "markdown",
145
+ "position": {
146
+ "x": 680,
147
+ "y": 500
148
+ },
149
+ "size": {
150
+ "width": 600,
151
+ "height": 200
152
+ },
153
+ "zIndex": 1,
154
+ "collapsed": false,
155
+ "pinned": false,
156
+ "dockPosition": null,
157
+ "data": {
158
+ "title": "DCP O2 — V2 Pilot",
159
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| Manual V2 | 100% | 10/10 |\n| EKS GitOps | 100% | 5/10 |\n| v1→v2 docs | TBD | 6/10 |\n| DVT workload | 1 | 6/10 |",
160
+ "parentGroup": "group-mo0xsd9t-p8g1"
161
+ }
162
+ },
163
+ {
164
+ "id": "node-mo0xsd9m-u0cb",
165
+ "type": "markdown",
166
+ "position": {
167
+ "x": 680,
168
+ "y": 820
169
+ },
170
+ "size": {
171
+ "width": 600,
172
+ "height": 200
173
+ },
174
+ "zIndex": 1,
175
+ "collapsed": false,
176
+ "pinned": false,
177
+ "dockPosition": null,
178
+ "data": {
179
+ "title": "DCP O3 — V2 Arch",
180
+ "content": "| KR | Target | Conf |\n|----|--------|------|\n| Architecture | 100% | 8/10 |\n| Shared resp | 100% | 7/10 |\n| Tenant | 100% | 10/10 |\n| Deps mapped | 100% | 8/10 |\n| Golden path | 100% | 8/10 |",
181
+ "parentGroup": "group-mo0xsd9t-p8g1"
182
+ }
183
+ },
184
+ {
185
+ "id": "graph-mo0xsd9q-lssn",
186
+ "type": "graph",
187
+ "position": {
188
+ "x": 1320,
189
+ "y": 240
190
+ },
191
+ "size": {
192
+ "width": 760,
193
+ "height": 520
194
+ },
195
+ "zIndex": 1,
196
+ "collapsed": false,
197
+ "pinned": false,
198
+ "dockPosition": null,
199
+ "data": {
200
+ "title": "DVT critical (0-100)",
201
+ "spec": {
202
+ "root": "card",
203
+ "elements": {
204
+ "card": {
205
+ "type": "Card",
206
+ "props": {
207
+ "title": "DVT critical (0-100)",
208
+ "maxWidth": "full",
209
+ "centered": false
210
+ },
211
+ "children": [
212
+ "chart"
213
+ ]
214
+ },
215
+ "chart": {
216
+ "type": "BarChart",
217
+ "props": {
218
+ "data": [
219
+ {
220
+ "metric": "Red tape",
221
+ "score": 0
222
+ },
223
+ {
224
+ "metric": "Deep work",
225
+ "score": 17
226
+ },
227
+ {
228
+ "metric": "Meeting",
229
+ "score": 33
230
+ },
231
+ {
232
+ "metric": "Info-seek",
233
+ "score": 50
234
+ },
235
+ {
236
+ "metric": "Review wait",
237
+ "score": 50
238
+ },
239
+ {
240
+ "metric": "Deploy lead",
241
+ "score": 25
242
+ }
243
+ ],
244
+ "height": 480,
245
+ "xKey": "metric",
246
+ "yKey": "score",
247
+ "color": "#ef4444"
248
+ },
249
+ "children": []
250
+ }
251
+ }
252
+ },
253
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9q-lssn",
254
+ "trustedDomain": true,
255
+ "sourceServer": "pmx-canvas",
256
+ "hostMode": "hosted",
257
+ "viewerType": "graph",
258
+ "graphConfig": {
259
+ "title": "DVT critical (0-100)",
260
+ "graphType": "bar",
261
+ "data": [
262
+ {
263
+ "metric": "Red tape",
264
+ "score": 0
265
+ },
266
+ {
267
+ "metric": "Deep work",
268
+ "score": 17
269
+ },
270
+ {
271
+ "metric": "Meeting",
272
+ "score": 33
273
+ },
274
+ {
275
+ "metric": "Info-seek",
276
+ "score": 50
277
+ },
278
+ {
279
+ "metric": "Review wait",
280
+ "score": 50
281
+ },
282
+ {
283
+ "metric": "Deploy lead",
284
+ "score": 25
285
+ }
286
+ ],
287
+ "xKey": "metric",
288
+ "yKey": "score",
289
+ "color": "#ef4444",
290
+ "height": 480
291
+ },
292
+ "parentGroup": "group-mo0xsd9t-cpwj"
293
+ }
294
+ },
295
+ {
296
+ "id": "graph-mo0xsd9r-yu51",
297
+ "type": "graph",
298
+ "position": {
299
+ "x": 1320,
300
+ "y": 760
301
+ },
302
+ "size": {
303
+ "width": 760,
304
+ "height": 520
305
+ },
306
+ "zIndex": 1,
307
+ "collapsed": false,
308
+ "pinned": false,
309
+ "dockPosition": null,
310
+ "data": {
311
+ "title": "DVT wins (delta)",
312
+ "spec": {
313
+ "root": "card",
314
+ "elements": {
315
+ "card": {
316
+ "type": "Card",
317
+ "props": {
318
+ "title": "DVT wins (delta)",
319
+ "maxWidth": "full",
320
+ "centered": false
321
+ },
322
+ "children": [
323
+ "chart"
324
+ ]
325
+ },
326
+ "chart": {
327
+ "type": "BarChart",
328
+ "props": {
329
+ "data": [
330
+ {
331
+ "metric": "Docs",
332
+ "delta": 50
333
+ },
334
+ {
335
+ "metric": "Release",
336
+ "delta": 50
337
+ },
338
+ {
339
+ "metric": "Speed",
340
+ "delta": 33
341
+ },
342
+ {
343
+ "metric": "Planning",
344
+ "delta": 33
345
+ },
346
+ {
347
+ "metric": "Prod debug",
348
+ "delta": 30
349
+ },
350
+ {
351
+ "metric": "Deploy freq",
352
+ "delta": 25
353
+ }
354
+ ],
355
+ "height": 480,
356
+ "xKey": "metric",
357
+ "yKey": "delta",
358
+ "color": "#22c55e"
359
+ },
360
+ "children": []
361
+ }
362
+ }
363
+ },
364
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9r-yu51",
365
+ "trustedDomain": true,
366
+ "sourceServer": "pmx-canvas",
367
+ "hostMode": "hosted",
368
+ "viewerType": "graph",
369
+ "graphConfig": {
370
+ "title": "DVT wins (delta)",
371
+ "graphType": "bar",
372
+ "data": [
373
+ {
374
+ "metric": "Docs",
375
+ "delta": 50
376
+ },
377
+ {
378
+ "metric": "Release",
379
+ "delta": 50
380
+ },
381
+ {
382
+ "metric": "Speed",
383
+ "delta": 33
384
+ },
385
+ {
386
+ "metric": "Planning",
387
+ "delta": 33
388
+ },
389
+ {
390
+ "metric": "Prod debug",
391
+ "delta": 30
392
+ },
393
+ {
394
+ "metric": "Deploy freq",
395
+ "delta": 25
396
+ }
397
+ ],
398
+ "xKey": "metric",
399
+ "yKey": "delta",
400
+ "color": "#22c55e",
401
+ "height": 480
402
+ },
403
+ "parentGroup": "group-mo0xsd9t-cpwj"
404
+ }
405
+ },
406
+ {
407
+ "id": "graph-mo0xsd9r-dk02",
408
+ "type": "graph",
409
+ "position": {
410
+ "x": 1320,
411
+ "y": 1280
412
+ },
413
+ "size": {
414
+ "width": 760,
415
+ "height": 520
416
+ },
417
+ "zIndex": 1,
418
+ "collapsed": false,
419
+ "pinned": false,
420
+ "dockPosition": null,
421
+ "data": {
422
+ "title": "DCP critical (0-100)",
423
+ "spec": {
424
+ "root": "card",
425
+ "elements": {
426
+ "card": {
427
+ "type": "Card",
428
+ "props": {
429
+ "title": "DCP critical (0-100)",
430
+ "maxWidth": "full",
431
+ "centered": false
432
+ },
433
+ "children": [
434
+ "chart"
435
+ ]
436
+ },
437
+ "chart": {
438
+ "type": "BarChart",
439
+ "props": {
440
+ "data": [
441
+ {
442
+ "metric": "Interrupts",
443
+ "score": 0
444
+ },
445
+ {
446
+ "metric": "Dev reload",
447
+ "score": 0
448
+ },
449
+ {
450
+ "metric": "Decisions",
451
+ "score": 20
452
+ },
453
+ {
454
+ "metric": "Prod debug",
455
+ "score": 20
456
+ },
457
+ {
458
+ "metric": "Speed",
459
+ "score": 25
460
+ },
461
+ {
462
+ "metric": "Dev env",
463
+ "score": 40
464
+ }
465
+ ],
466
+ "height": 480,
467
+ "xKey": "metric",
468
+ "yKey": "score",
469
+ "color": "#ef4444"
470
+ },
471
+ "children": []
472
+ }
473
+ }
474
+ },
475
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9r-dk02",
476
+ "trustedDomain": true,
477
+ "sourceServer": "pmx-canvas",
478
+ "hostMode": "hosted",
479
+ "viewerType": "graph",
480
+ "graphConfig": {
481
+ "title": "DCP critical (0-100)",
482
+ "graphType": "bar",
483
+ "data": [
484
+ {
485
+ "metric": "Interrupts",
486
+ "score": 0
487
+ },
488
+ {
489
+ "metric": "Dev reload",
490
+ "score": 0
491
+ },
492
+ {
493
+ "metric": "Decisions",
494
+ "score": 20
495
+ },
496
+ {
497
+ "metric": "Prod debug",
498
+ "score": 20
499
+ },
500
+ {
501
+ "metric": "Speed",
502
+ "score": 25
503
+ },
504
+ {
505
+ "metric": "Dev env",
506
+ "score": 40
507
+ }
508
+ ],
509
+ "xKey": "metric",
510
+ "yKey": "score",
511
+ "color": "#ef4444",
512
+ "height": 480
513
+ },
514
+ "parentGroup": "group-mo0xsd9t-cpwj"
515
+ }
516
+ },
517
+ {
518
+ "id": "graph-mo0xsd9r-4ptf",
519
+ "type": "graph",
520
+ "position": {
521
+ "x": 1320,
522
+ "y": 1800
523
+ },
524
+ "size": {
525
+ "width": 760,
526
+ "height": 520
527
+ },
528
+ "zIndex": 1,
529
+ "collapsed": false,
530
+ "pinned": false,
531
+ "dockPosition": null,
532
+ "data": {
533
+ "title": "DCP strong (0-100)",
534
+ "spec": {
535
+ "root": "card",
536
+ "elements": {
537
+ "card": {
538
+ "type": "Card",
539
+ "props": {
540
+ "title": "DCP strong (0-100)",
541
+ "maxWidth": "full",
542
+ "centered": false
543
+ },
544
+ "children": [
545
+ "chart"
546
+ ]
547
+ },
548
+ "chart": {
549
+ "type": "BarChart",
550
+ "props": {
551
+ "data": [
552
+ {
553
+ "metric": "AI code",
554
+ "score": 100
555
+ },
556
+ {
557
+ "metric": "AI time",
558
+ "score": 100
559
+ },
560
+ {
561
+ "metric": "Review",
562
+ "score": 100
563
+ },
564
+ {
565
+ "metric": "Comprehension",
566
+ "score": 100
567
+ },
568
+ {
569
+ "metric": "Meeting",
570
+ "score": 100
571
+ },
572
+ {
573
+ "metric": "Info-seek",
574
+ "score": 100
575
+ }
576
+ ],
577
+ "height": 480,
578
+ "xKey": "metric",
579
+ "yKey": "score",
580
+ "color": "#22c55e"
581
+ },
582
+ "children": []
583
+ }
584
+ }
585
+ },
586
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9r-4ptf",
587
+ "trustedDomain": true,
588
+ "sourceServer": "pmx-canvas",
589
+ "hostMode": "hosted",
590
+ "viewerType": "graph",
591
+ "graphConfig": {
592
+ "title": "DCP strong (0-100)",
593
+ "graphType": "bar",
594
+ "data": [
595
+ {
596
+ "metric": "AI code",
597
+ "score": 100
598
+ },
599
+ {
600
+ "metric": "AI time",
601
+ "score": 100
602
+ },
603
+ {
604
+ "metric": "Review",
605
+ "score": 100
606
+ },
607
+ {
608
+ "metric": "Comprehension",
609
+ "score": 100
610
+ },
611
+ {
612
+ "metric": "Meeting",
613
+ "score": 100
614
+ },
615
+ {
616
+ "metric": "Info-seek",
617
+ "score": 100
618
+ }
619
+ ],
620
+ "xKey": "metric",
621
+ "yKey": "score",
622
+ "color": "#22c55e",
623
+ "height": 480
624
+ },
625
+ "parentGroup": "group-mo0xsd9t-cpwj"
626
+ }
627
+ },
628
+ {
629
+ "id": "graph-mo0xsd9s-099f",
630
+ "type": "graph",
631
+ "position": {
632
+ "x": 2120,
633
+ "y": 240
634
+ },
635
+ "size": {
636
+ "width": 720,
637
+ "height": 520
638
+ },
639
+ "zIndex": 1,
640
+ "collapsed": false,
641
+ "pinned": false,
642
+ "dockPosition": null,
643
+ "data": {
644
+ "title": "AI-authored code %",
645
+ "spec": {
646
+ "root": "card",
647
+ "elements": {
648
+ "card": {
649
+ "type": "Card",
650
+ "props": {
651
+ "title": "AI-authored code %",
652
+ "maxWidth": "full",
653
+ "centered": false
654
+ },
655
+ "children": [
656
+ "chart"
657
+ ]
658
+ },
659
+ "chart": {
660
+ "type": "BarChart",
661
+ "props": {
662
+ "data": [
663
+ {
664
+ "team": "DCP",
665
+ "pct": 30.5
666
+ },
667
+ {
668
+ "team": "Org avg",
669
+ "pct": 15
670
+ },
671
+ {
672
+ "team": "DVT",
673
+ "pct": 14.5
674
+ }
675
+ ],
676
+ "height": 480,
677
+ "xKey": "team",
678
+ "yKey": "pct",
679
+ "color": "#8b5cf6"
680
+ },
681
+ "children": []
682
+ }
683
+ }
684
+ },
685
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9s-099f",
686
+ "trustedDomain": true,
687
+ "sourceServer": "pmx-canvas",
688
+ "hostMode": "hosted",
689
+ "viewerType": "graph",
690
+ "graphConfig": {
691
+ "title": "AI-authored code %",
692
+ "graphType": "bar",
693
+ "data": [
694
+ {
695
+ "team": "DCP",
696
+ "pct": 30.5
697
+ },
698
+ {
699
+ "team": "Org avg",
700
+ "pct": 15
701
+ },
702
+ {
703
+ "team": "DVT",
704
+ "pct": 14.5
705
+ }
706
+ ],
707
+ "xKey": "team",
708
+ "yKey": "pct",
709
+ "color": "#8b5cf6",
710
+ "height": 480
711
+ },
712
+ "parentGroup": "group-mo0xsd9t-cpwj"
713
+ }
714
+ },
715
+ {
716
+ "id": "graph-mo0xsd9s-eaqs",
717
+ "type": "graph",
718
+ "position": {
719
+ "x": 2120,
720
+ "y": 760
721
+ },
722
+ "size": {
723
+ "width": 720,
724
+ "height": 520
725
+ },
726
+ "zIndex": 1,
727
+ "collapsed": false,
728
+ "pinned": false,
729
+ "dockPosition": null,
730
+ "data": {
731
+ "title": "Deep work trend",
732
+ "spec": {
733
+ "root": "card",
734
+ "elements": {
735
+ "card": {
736
+ "type": "Card",
737
+ "props": {
738
+ "title": "Deep work trend",
739
+ "maxWidth": "full",
740
+ "centered": false
741
+ },
742
+ "children": [
743
+ "chart"
744
+ ]
745
+ },
746
+ "chart": {
747
+ "type": "LineChart",
748
+ "props": {
749
+ "data": [
750
+ {
751
+ "snap": "Oct DVT",
752
+ "score": 17
753
+ },
754
+ {
755
+ "snap": "Dec DVT",
756
+ "score": 17
757
+ },
758
+ {
759
+ "snap": "Oct DCP",
760
+ "score": 33
761
+ },
762
+ {
763
+ "snap": "Dec DCP",
764
+ "score": 20
765
+ }
766
+ ],
767
+ "height": 480,
768
+ "xKey": "snap",
769
+ "yKey": "score",
770
+ "color": "#f59e0b"
771
+ },
772
+ "children": []
773
+ }
774
+ }
775
+ },
776
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9s-eaqs",
777
+ "trustedDomain": true,
778
+ "sourceServer": "pmx-canvas",
779
+ "hostMode": "hosted",
780
+ "viewerType": "graph",
781
+ "graphConfig": {
782
+ "title": "Deep work trend",
783
+ "graphType": "line",
784
+ "data": [
785
+ {
786
+ "snap": "Oct DVT",
787
+ "score": 17
788
+ },
789
+ {
790
+ "snap": "Dec DVT",
791
+ "score": 17
792
+ },
793
+ {
794
+ "snap": "Oct DCP",
795
+ "score": 33
796
+ },
797
+ {
798
+ "snap": "Dec DCP",
799
+ "score": 20
800
+ }
801
+ ],
802
+ "xKey": "snap",
803
+ "yKey": "score",
804
+ "color": "#f59e0b",
805
+ "height": 480
806
+ },
807
+ "parentGroup": "group-mo0xsd9t-cpwj"
808
+ }
809
+ },
810
+ {
811
+ "id": "graph-mo0xsd9s-sm0g",
812
+ "type": "graph",
813
+ "position": {
814
+ "x": 2120,
815
+ "y": 1280
816
+ },
817
+ "size": {
818
+ "width": 720,
819
+ "height": 520
820
+ },
821
+ "zIndex": 1,
822
+ "collapsed": false,
823
+ "pinned": false,
824
+ "dockPosition": null,
825
+ "data": {
826
+ "title": "DCP interruptions/day",
827
+ "spec": {
828
+ "root": "card",
829
+ "elements": {
830
+ "card": {
831
+ "type": "Card",
832
+ "props": {
833
+ "title": "DCP interruptions/day",
834
+ "maxWidth": "full",
835
+ "centered": false
836
+ },
837
+ "children": [
838
+ "chart"
839
+ ]
840
+ },
841
+ "chart": {
842
+ "type": "LineChart",
843
+ "props": {
844
+ "data": [
845
+ {
846
+ "snap": "Apr 25",
847
+ "perDay": 3.5
848
+ },
849
+ {
850
+ "snap": "Oct 25",
851
+ "perDay": 4.25
852
+ },
853
+ {
854
+ "snap": "Dec 25",
855
+ "perDay": 8.5
856
+ }
857
+ ],
858
+ "height": 480,
859
+ "xKey": "snap",
860
+ "yKey": "perDay",
861
+ "color": "#dc2626"
862
+ },
863
+ "children": []
864
+ }
865
+ }
866
+ },
867
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9s-sm0g",
868
+ "trustedDomain": true,
869
+ "sourceServer": "pmx-canvas",
870
+ "hostMode": "hosted",
871
+ "viewerType": "graph",
872
+ "graphConfig": {
873
+ "title": "DCP interruptions/day",
874
+ "graphType": "line",
875
+ "data": [
876
+ {
877
+ "snap": "Apr 25",
878
+ "perDay": 3.5
879
+ },
880
+ {
881
+ "snap": "Oct 25",
882
+ "perDay": 4.25
883
+ },
884
+ {
885
+ "snap": "Dec 25",
886
+ "perDay": 8.5
887
+ }
888
+ ],
889
+ "xKey": "snap",
890
+ "yKey": "perDay",
891
+ "color": "#dc2626",
892
+ "height": 480
893
+ },
894
+ "parentGroup": "group-mo0xsd9t-cpwj"
895
+ }
896
+ },
897
+ {
898
+ "id": "graph-mo0xsd9s-ft44",
899
+ "type": "graph",
900
+ "position": {
901
+ "x": 2120,
902
+ "y": 1800
903
+ },
904
+ "size": {
905
+ "width": 720,
906
+ "height": 520
907
+ },
908
+ "zIndex": 1,
909
+ "collapsed": false,
910
+ "pinned": false,
911
+ "dockPosition": null,
912
+ "data": {
913
+ "title": "CSAT comparison",
914
+ "spec": {
915
+ "root": "card",
916
+ "elements": {
917
+ "card": {
918
+ "type": "Card",
919
+ "props": {
920
+ "title": "CSAT comparison",
921
+ "maxWidth": "full",
922
+ "centered": false
923
+ },
924
+ "children": [
925
+ "chart"
926
+ ]
927
+ },
928
+ "chart": {
929
+ "type": "BarChart",
930
+ "props": {
931
+ "data": [
932
+ {
933
+ "tool": "Copilot DCP",
934
+ "score": 100
935
+ },
936
+ {
937
+ "tool": "Copilot DVT",
938
+ "score": 100
939
+ },
940
+ {
941
+ "tool": "Datadog",
942
+ "score": 67
943
+ },
944
+ {
945
+ "tool": "Confluence",
946
+ "score": 33
947
+ },
948
+ {
949
+ "tool": "Jira DCP",
950
+ "score": 0
951
+ }
952
+ ],
953
+ "height": 480,
954
+ "xKey": "tool",
955
+ "yKey": "score",
956
+ "color": "#06b6d4"
957
+ },
958
+ "children": []
959
+ }
960
+ }
961
+ },
962
+ "url": "/api/canvas/json-render/view?nodeId=graph-mo0xsd9s-ft44",
963
+ "trustedDomain": true,
964
+ "sourceServer": "pmx-canvas",
965
+ "hostMode": "hosted",
966
+ "viewerType": "graph",
967
+ "graphConfig": {
968
+ "title": "CSAT comparison",
969
+ "graphType": "bar",
970
+ "data": [
971
+ {
972
+ "tool": "Copilot DCP",
973
+ "score": 100
974
+ },
975
+ {
976
+ "tool": "Copilot DVT",
977
+ "score": 100
978
+ },
979
+ {
980
+ "tool": "Datadog",
981
+ "score": 67
982
+ },
983
+ {
984
+ "tool": "Confluence",
985
+ "score": 33
986
+ },
987
+ {
988
+ "tool": "Jira DCP",
989
+ "score": 0
990
+ }
991
+ ],
992
+ "xKey": "tool",
993
+ "yKey": "score",
994
+ "color": "#06b6d4",
995
+ "height": 480
996
+ },
997
+ "parentGroup": "group-mo0xsd9t-cpwj"
998
+ }
999
+ },
1000
+ {
1001
+ "id": "group-mo0xsd9s-payr",
1002
+ "type": "group",
1003
+ "position": {
1004
+ "x": 0,
1005
+ "y": 168
1006
+ },
1007
+ "size": {
1008
+ "width": 680,
1009
+ "height": 1272
1010
+ },
1011
+ "zIndex": 0,
1012
+ "collapsed": false,
1013
+ "pinned": false,
1014
+ "dockPosition": null,
1015
+ "data": {
1016
+ "title": "DVT OKRs",
1017
+ "children": [
1018
+ "node-mo0xsd9m-a1t5",
1019
+ "node-mo0xsd9m-hp10",
1020
+ "node-mo0xsd9m-5iut",
1021
+ "node-mo0xsd9m-9f5s"
1022
+ ],
1023
+ "frameMode": "fit",
1024
+ "color": "#6ea8ff",
1025
+ "arrangeLocked": true
1026
+ }
1027
+ },
1028
+ {
1029
+ "id": "group-mo0xsd9t-p8g1",
1030
+ "type": "group",
1031
+ "position": {
1032
+ "x": 640,
1033
+ "y": 168
1034
+ },
1035
+ "size": {
1036
+ "width": 680,
1037
+ "height": 892
1038
+ },
1039
+ "zIndex": 0,
1040
+ "collapsed": false,
1041
+ "pinned": false,
1042
+ "dockPosition": null,
1043
+ "data": {
1044
+ "title": "DCP OKRs",
1045
+ "children": [
1046
+ "node-mo0xsd9m-e9jc",
1047
+ "node-mo0xsd9m-5dkm",
1048
+ "node-mo0xsd9m-u0cb"
1049
+ ],
1050
+ "frameMode": "fit",
1051
+ "color": "#f59e0b",
1052
+ "arrangeLocked": true
1053
+ }
1054
+ },
1055
+ {
1056
+ "id": "group-mo0xsd9t-cpwj",
1057
+ "type": "group",
1058
+ "position": {
1059
+ "x": 1280,
1060
+ "y": 168
1061
+ },
1062
+ "size": {
1063
+ "width": 1600,
1064
+ "height": 2192
1065
+ },
1066
+ "zIndex": 0,
1067
+ "collapsed": false,
1068
+ "pinned": false,
1069
+ "dockPosition": null,
1070
+ "data": {
1071
+ "title": "DX Dec 2025",
1072
+ "children": [
1073
+ "graph-mo0xsd9q-lssn",
1074
+ "graph-mo0xsd9r-yu51",
1075
+ "graph-mo0xsd9r-dk02",
1076
+ "graph-mo0xsd9r-4ptf",
1077
+ "graph-mo0xsd9s-099f",
1078
+ "graph-mo0xsd9s-eaqs",
1079
+ "graph-mo0xsd9s-sm0g",
1080
+ "graph-mo0xsd9s-ft44"
1081
+ ],
1082
+ "frameMode": "fit",
1083
+ "color": "#22c55e",
1084
+ "arrangeLocked": true
1085
+ }
1086
+ }
1087
+ ],
1088
+ "edges": [
1089
+ {
1090
+ "id": "edge-mo0xsd9u-apq0",
1091
+ "from": "node-mo0xsd9m-a1t5",
1092
+ "to": "graph-mo0xsd9s-099f",
1093
+ "type": "references",
1094
+ "label": "AI gap",
1095
+ "style": "dashed"
1096
+ },
1097
+ {
1098
+ "id": "edge-mo0xsd9u-lin2",
1099
+ "from": "node-mo0xsd9m-hp10",
1100
+ "to": "graph-mo0xsd9q-lssn",
1101
+ "type": "references",
1102
+ "label": "build 100",
1103
+ "style": "dashed"
1104
+ },
1105
+ {
1106
+ "id": "edge-mo0xsd9u-oxi9",
1107
+ "from": "node-mo0xsd9m-5iut",
1108
+ "to": "graph-mo0xsd9r-yu51",
1109
+ "type": "references",
1110
+ "label": "deploy +25",
1111
+ "style": "dotted"
1112
+ },
1113
+ {
1114
+ "id": "edge-mo0xsd9u-g44m",
1115
+ "from": "node-mo0xsd9m-5dkm",
1116
+ "to": "graph-mo0xsd9s-sm0g",
1117
+ "type": "references",
1118
+ "label": "8.5/day",
1119
+ "style": "dashed",
1120
+ "animated": true
1121
+ },
1122
+ {
1123
+ "id": "edge-mo0xsd9u-p4nw",
1124
+ "from": "node-mo0xsd9m-5dkm",
1125
+ "to": "graph-mo0xsd9s-eaqs",
1126
+ "type": "references",
1127
+ "label": "deep work 20",
1128
+ "style": "dashed"
1129
+ },
1130
+ {
1131
+ "id": "edge-mo0xsd9u-ysd4",
1132
+ "from": "node-mo0xsd9m-u0cb",
1133
+ "to": "graph-mo0xsd9r-dk02",
1134
+ "type": "references",
1135
+ "label": "decisions 20",
1136
+ "style": "dashed"
1137
+ }
1138
+ ],
1139
+ "contextPins": [
1140
+ "node-mo0xsd9m-5dkm",
1141
+ "graph-mo0xsd9s-sm0g"
1142
+ ]
1143
+ }