@newrelic/preflight 1.40.0 → 1.41.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.
@@ -0,0 +1,1948 @@
1
+ {
2
+ "name": "AI Coding Assistant — Adoption & Cost",
3
+ "description": "Org-wide adoption, spend, tool/MCP usage, and team leaderboard built entirely from Preflight events. Works on every supported platform with no additional telemetry.",
4
+ "permissions": "PUBLIC_READ_WRITE",
5
+ "pages": [
6
+ {
7
+ "name": "Adoption",
8
+ "description": null,
9
+ "widgets": [
10
+ {
11
+ "title": "About This Page",
12
+ "layout": {
13
+ "column": 1,
14
+ "row": 1,
15
+ "width": 12,
16
+ "height": 1
17
+ },
18
+ "visualization": {
19
+ "id": "viz.markdown"
20
+ },
21
+ "rawConfiguration": {
22
+ "text": "# Adoption\n\nWho is using AI coding assistants, how often, and on which platforms. All widgets read Preflight events (`AiToolCall`, `AiCodingTask`) — no platform-specific telemetry required."
23
+ }
24
+ },
25
+ {
26
+ "title": "Active Developers (30d)",
27
+ "layout": {
28
+ "column": 1,
29
+ "row": 2,
30
+ "width": 3,
31
+ "height": 3
32
+ },
33
+ "visualization": {
34
+ "id": "viz.billboard"
35
+ },
36
+ "rawConfiguration": {
37
+ "facet": {
38
+ "showOtherSeries": false
39
+ },
40
+ "nrqlQueries": [
41
+ {
42
+ "accountIds": [],
43
+ "query": "FROM AiToolCall SELECT uniqueCount(developer) AS 'Developers' SINCE 30 days ago"
44
+ }
45
+ ],
46
+ "platformOptions": {
47
+ "ignoreTimeRange": false
48
+ }
49
+ }
50
+ },
51
+ {
52
+ "title": "Sessions (30d)",
53
+ "layout": {
54
+ "column": 4,
55
+ "row": 2,
56
+ "width": 3,
57
+ "height": 3
58
+ },
59
+ "visualization": {
60
+ "id": "viz.billboard"
61
+ },
62
+ "rawConfiguration": {
63
+ "facet": {
64
+ "showOtherSeries": false
65
+ },
66
+ "nrqlQueries": [
67
+ {
68
+ "accountIds": [],
69
+ "query": "FROM AiToolCall SELECT uniqueCount(session_id) AS 'Sessions' SINCE 30 days ago"
70
+ }
71
+ ],
72
+ "platformOptions": {
73
+ "ignoreTimeRange": false
74
+ }
75
+ }
76
+ },
77
+ {
78
+ "title": "Tool Calls (30d)",
79
+ "layout": {
80
+ "column": 7,
81
+ "row": 2,
82
+ "width": 3,
83
+ "height": 3
84
+ },
85
+ "visualization": {
86
+ "id": "viz.billboard"
87
+ },
88
+ "rawConfiguration": {
89
+ "facet": {
90
+ "showOtherSeries": false
91
+ },
92
+ "nrqlQueries": [
93
+ {
94
+ "accountIds": [],
95
+ "query": "FROM AiToolCall SELECT count(*) AS 'Tool Calls' SINCE 30 days ago"
96
+ }
97
+ ],
98
+ "platformOptions": {
99
+ "ignoreTimeRange": false
100
+ }
101
+ }
102
+ },
103
+ {
104
+ "title": "Tasks Completed (30d)",
105
+ "layout": {
106
+ "column": 10,
107
+ "row": 2,
108
+ "width": 3,
109
+ "height": 3
110
+ },
111
+ "visualization": {
112
+ "id": "viz.billboard"
113
+ },
114
+ "rawConfiguration": {
115
+ "facet": {
116
+ "showOtherSeries": false
117
+ },
118
+ "nrqlQueries": [
119
+ {
120
+ "accountIds": [],
121
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks' SINCE 30 days ago"
122
+ }
123
+ ],
124
+ "platformOptions": {
125
+ "ignoreTimeRange": false
126
+ }
127
+ }
128
+ },
129
+ {
130
+ "title": "Daily Active Developers",
131
+ "layout": {
132
+ "column": 1,
133
+ "row": 5,
134
+ "width": 4,
135
+ "height": 3
136
+ },
137
+ "visualization": {
138
+ "id": "viz.line"
139
+ },
140
+ "rawConfiguration": {
141
+ "facet": {
142
+ "showOtherSeries": false
143
+ },
144
+ "legend": {
145
+ "enabled": true
146
+ },
147
+ "nrqlQueries": [
148
+ {
149
+ "accountIds": [],
150
+ "query": "FROM AiToolCall SELECT uniqueCount(developer) AS 'Developers' SINCE 30 days ago TIMESERIES 1 day"
151
+ }
152
+ ],
153
+ "platformOptions": {
154
+ "ignoreTimeRange": false
155
+ },
156
+ "yAxisLeft": {
157
+ "zero": true
158
+ }
159
+ }
160
+ },
161
+ {
162
+ "title": "Daily Sessions",
163
+ "layout": {
164
+ "column": 5,
165
+ "row": 5,
166
+ "width": 4,
167
+ "height": 3
168
+ },
169
+ "visualization": {
170
+ "id": "viz.line"
171
+ },
172
+ "rawConfiguration": {
173
+ "facet": {
174
+ "showOtherSeries": false
175
+ },
176
+ "legend": {
177
+ "enabled": true
178
+ },
179
+ "nrqlQueries": [
180
+ {
181
+ "accountIds": [],
182
+ "query": "FROM AiToolCall SELECT uniqueCount(session_id) AS 'Sessions' SINCE 30 days ago TIMESERIES 1 day"
183
+ }
184
+ ],
185
+ "platformOptions": {
186
+ "ignoreTimeRange": false
187
+ },
188
+ "yAxisLeft": {
189
+ "zero": true
190
+ }
191
+ }
192
+ },
193
+ {
194
+ "title": "Platform Mix (30d)",
195
+ "layout": {
196
+ "column": 9,
197
+ "row": 5,
198
+ "width": 4,
199
+ "height": 3
200
+ },
201
+ "visualization": {
202
+ "id": "viz.pie"
203
+ },
204
+ "rawConfiguration": {
205
+ "facet": {
206
+ "showOtherSeries": true
207
+ },
208
+ "legend": {
209
+ "enabled": true
210
+ },
211
+ "nrqlQueries": [
212
+ {
213
+ "accountIds": [],
214
+ "query": "FROM AiToolCall SELECT count(*) FACET platform SINCE 30 days ago"
215
+ }
216
+ ],
217
+ "platformOptions": {
218
+ "ignoreTimeRange": false
219
+ }
220
+ }
221
+ },
222
+ {
223
+ "title": "Daily Lines of Code",
224
+ "layout": {
225
+ "column": 1,
226
+ "row": 8,
227
+ "width": 4,
228
+ "height": 3
229
+ },
230
+ "visualization": {
231
+ "id": "viz.line"
232
+ },
233
+ "rawConfiguration": {
234
+ "facet": {
235
+ "showOtherSeries": false
236
+ },
237
+ "legend": {
238
+ "enabled": true
239
+ },
240
+ "nrqlQueries": [
241
+ {
242
+ "accountIds": [],
243
+ "query": "FROM AiCodingTask SELECT sum(lines_added) AS 'Added', sum(lines_removed) AS 'Removed' SINCE 30 days ago TIMESERIES 1 day"
244
+ }
245
+ ],
246
+ "platformOptions": {
247
+ "ignoreTimeRange": false
248
+ },
249
+ "yAxisLeft": {
250
+ "zero": true
251
+ }
252
+ }
253
+ },
254
+ {
255
+ "title": "Daily Tool Calls by Platform",
256
+ "layout": {
257
+ "column": 5,
258
+ "row": 8,
259
+ "width": 4,
260
+ "height": 3
261
+ },
262
+ "visualization": {
263
+ "id": "viz.stacked-bar"
264
+ },
265
+ "rawConfiguration": {
266
+ "facet": {
267
+ "showOtherSeries": false
268
+ },
269
+ "legend": {
270
+ "enabled": true
271
+ },
272
+ "nrqlQueries": [
273
+ {
274
+ "accountIds": [],
275
+ "query": "FROM AiToolCall SELECT count(*) FACET platform SINCE 30 days ago TIMESERIES 1 day"
276
+ }
277
+ ],
278
+ "platformOptions": {
279
+ "ignoreTimeRange": false
280
+ }
281
+ }
282
+ },
283
+ {
284
+ "title": "Active Days per Developer (30d)",
285
+ "layout": {
286
+ "column": 9,
287
+ "row": 8,
288
+ "width": 4,
289
+ "height": 3
290
+ },
291
+ "visualization": {
292
+ "id": "viz.bar"
293
+ },
294
+ "rawConfiguration": {
295
+ "facet": {
296
+ "showOtherSeries": false
297
+ },
298
+ "nrqlQueries": [
299
+ {
300
+ "accountIds": [],
301
+ "query": "FROM AiToolCall SELECT uniqueCount(dateOf(timestamp)) AS 'Active Days' FACET developer SINCE 30 days ago LIMIT 50"
302
+ }
303
+ ],
304
+ "platformOptions": {
305
+ "ignoreTimeRange": false
306
+ }
307
+ }
308
+ }
309
+ ]
310
+ },
311
+ {
312
+ "name": "Cost",
313
+ "description": null,
314
+ "widgets": [
315
+ {
316
+ "title": "How Cost Is Measured",
317
+ "layout": {
318
+ "column": 1,
319
+ "row": 1,
320
+ "width": 12,
321
+ "height": 1
322
+ },
323
+ "visualization": {
324
+ "id": "viz.markdown"
325
+ },
326
+ "rawConfiguration": {
327
+ "text": "# Cost\n\nSpend from `AiCodingTask.estimated_cost_usd` (per-task events, safe to sum). Token and cache widgets show ratios over the session-level `ai.cost.*` gauges — the gauges are cumulative snapshots, so only ratios (not raw sums) are meaningful across sessions. With `companionMode: true` the `ai.cost.*` gauges are suppressed, so the token/cache widgets go quiet and Claude Code's own OTel metrics become the cost authority — task cost events remain and are tagged `cost_authority: 'external'`.\n\n**Blank token widgets?** Cache Hit % and Token Mix % read `ai.cost.*` gauges from the Metric API. Those gauges are emitted only by a live Preflight MCP server with cloud export enabled (`mode: cloud` or `both`, plus a license key). Event-only data — including backfilled or generated data — leaves them blank."
328
+ }
329
+ },
330
+ {
331
+ "title": "Total Cost (30d)",
332
+ "layout": {
333
+ "column": 1,
334
+ "row": 2,
335
+ "width": 3,
336
+ "height": 3
337
+ },
338
+ "visualization": {
339
+ "id": "viz.billboard"
340
+ },
341
+ "rawConfiguration": {
342
+ "facet": {
343
+ "showOtherSeries": false
344
+ },
345
+ "nrqlQueries": [
346
+ {
347
+ "accountIds": [],
348
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' SINCE 30 days ago"
349
+ }
350
+ ],
351
+ "platformOptions": {
352
+ "ignoreTimeRange": false
353
+ }
354
+ }
355
+ },
356
+ {
357
+ "title": "Total Cost (7d)",
358
+ "layout": {
359
+ "column": 4,
360
+ "row": 2,
361
+ "width": 3,
362
+ "height": 3
363
+ },
364
+ "visualization": {
365
+ "id": "viz.billboard"
366
+ },
367
+ "rawConfiguration": {
368
+ "facet": {
369
+ "showOtherSeries": false
370
+ },
371
+ "nrqlQueries": [
372
+ {
373
+ "accountIds": [],
374
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' SINCE 7 days ago"
375
+ }
376
+ ],
377
+ "platformOptions": {
378
+ "ignoreTimeRange": false
379
+ }
380
+ }
381
+ },
382
+ {
383
+ "title": "Avg Cost per Task (7d)",
384
+ "layout": {
385
+ "column": 7,
386
+ "row": 2,
387
+ "width": 3,
388
+ "height": 3
389
+ },
390
+ "visualization": {
391
+ "id": "viz.billboard"
392
+ },
393
+ "rawConfiguration": {
394
+ "facet": {
395
+ "showOtherSeries": false
396
+ },
397
+ "nrqlQueries": [
398
+ {
399
+ "accountIds": [],
400
+ "query": "FROM AiCodingTask SELECT average(estimated_cost_usd) AS 'USD / Task' SINCE 7 days ago"
401
+ }
402
+ ],
403
+ "platformOptions": {
404
+ "ignoreTimeRange": false
405
+ }
406
+ }
407
+ },
408
+ {
409
+ "title": "Cache Hit % (7d)",
410
+ "layout": {
411
+ "column": 10,
412
+ "row": 2,
413
+ "width": 3,
414
+ "height": 3
415
+ },
416
+ "visualization": {
417
+ "id": "viz.billboard"
418
+ },
419
+ "rawConfiguration": {
420
+ "facet": {
421
+ "showOtherSeries": false
422
+ },
423
+ "nrqlQueries": [
424
+ {
425
+ "accountIds": [],
426
+ "query": "FROM Metric SELECT sum(ai.cost.tokens_cache_read) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_cache_read)) * 100 AS 'Cache Hit %' SINCE 7 days ago"
427
+ }
428
+ ],
429
+ "platformOptions": {
430
+ "ignoreTimeRange": false
431
+ }
432
+ }
433
+ },
434
+ {
435
+ "title": "Daily Cost by Developer",
436
+ "layout": {
437
+ "column": 1,
438
+ "row": 5,
439
+ "width": 4,
440
+ "height": 3
441
+ },
442
+ "visualization": {
443
+ "id": "viz.stacked-bar"
444
+ },
445
+ "rawConfiguration": {
446
+ "facet": {
447
+ "showOtherSeries": false
448
+ },
449
+ "legend": {
450
+ "enabled": true
451
+ },
452
+ "nrqlQueries": [
453
+ {
454
+ "accountIds": [],
455
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET developer SINCE 30 days ago TIMESERIES 1 day"
456
+ }
457
+ ],
458
+ "platformOptions": {
459
+ "ignoreTimeRange": false
460
+ }
461
+ }
462
+ },
463
+ {
464
+ "title": "Monthly Cost by Developer",
465
+ "layout": {
466
+ "column": 5,
467
+ "row": 5,
468
+ "width": 4,
469
+ "height": 3
470
+ },
471
+ "visualization": {
472
+ "id": "viz.stacked-bar"
473
+ },
474
+ "rawConfiguration": {
475
+ "facet": {
476
+ "showOtherSeries": false
477
+ },
478
+ "legend": {
479
+ "enabled": true
480
+ },
481
+ "nrqlQueries": [
482
+ {
483
+ "accountIds": [],
484
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET developer SINCE 6 months ago TIMESERIES 1 month"
485
+ }
486
+ ],
487
+ "platformOptions": {
488
+ "ignoreTimeRange": false
489
+ }
490
+ }
491
+ },
492
+ {
493
+ "title": "Cost by Project (30d)",
494
+ "layout": {
495
+ "column": 9,
496
+ "row": 5,
497
+ "width": 4,
498
+ "height": 3
499
+ },
500
+ "visualization": {
501
+ "id": "viz.pie"
502
+ },
503
+ "rawConfiguration": {
504
+ "facet": {
505
+ "showOtherSeries": true
506
+ },
507
+ "legend": {
508
+ "enabled": true
509
+ },
510
+ "nrqlQueries": [
511
+ {
512
+ "accountIds": [],
513
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET project_id SINCE 30 days ago"
514
+ }
515
+ ],
516
+ "platformOptions": {
517
+ "ignoreTimeRange": false
518
+ }
519
+ }
520
+ },
521
+ {
522
+ "title": "Token Mix % (7d)",
523
+ "layout": {
524
+ "column": 1,
525
+ "row": 8,
526
+ "width": 4,
527
+ "height": 3
528
+ },
529
+ "visualization": {
530
+ "id": "viz.bar"
531
+ },
532
+ "rawConfiguration": {
533
+ "facet": {
534
+ "showOtherSeries": false
535
+ },
536
+ "nrqlQueries": [
537
+ {
538
+ "accountIds": [],
539
+ "query": "FROM Metric SELECT sum(ai.cost.tokens_input) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_output) + sum(ai.cost.tokens_thinking) + sum(ai.cost.tokens_cache_read) + sum(ai.cost.tokens_cache_creation)) * 100 AS 'Input %', sum(ai.cost.tokens_output) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_output) + sum(ai.cost.tokens_thinking) + sum(ai.cost.tokens_cache_read) + sum(ai.cost.tokens_cache_creation)) * 100 AS 'Output %', sum(ai.cost.tokens_thinking) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_output) + sum(ai.cost.tokens_thinking) + sum(ai.cost.tokens_cache_read) + sum(ai.cost.tokens_cache_creation)) * 100 AS 'Thinking %', sum(ai.cost.tokens_cache_read) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_output) + sum(ai.cost.tokens_thinking) + sum(ai.cost.tokens_cache_read) + sum(ai.cost.tokens_cache_creation)) * 100 AS 'Cache Read %', sum(ai.cost.tokens_cache_creation) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_output) + sum(ai.cost.tokens_thinking) + sum(ai.cost.tokens_cache_read) + sum(ai.cost.tokens_cache_creation)) * 100 AS 'Cache Write %' SINCE 7 days ago"
540
+ }
541
+ ],
542
+ "platformOptions": {
543
+ "ignoreTimeRange": false
544
+ }
545
+ }
546
+ },
547
+ {
548
+ "title": "Daily Token Volume",
549
+ "layout": {
550
+ "column": 5,
551
+ "row": 8,
552
+ "width": 4,
553
+ "height": 3
554
+ },
555
+ "visualization": {
556
+ "id": "viz.line"
557
+ },
558
+ "rawConfiguration": {
559
+ "facet": {
560
+ "showOtherSeries": false
561
+ },
562
+ "legend": {
563
+ "enabled": true
564
+ },
565
+ "nrqlQueries": [
566
+ {
567
+ "accountIds": [],
568
+ "query": "FROM AiCodingTask SELECT sum(tokens_used) AS 'Tokens' SINCE 30 days ago TIMESERIES 1 day"
569
+ }
570
+ ],
571
+ "platformOptions": {
572
+ "ignoreTimeRange": false
573
+ },
574
+ "yAxisLeft": {
575
+ "zero": true
576
+ }
577
+ }
578
+ },
579
+ {
580
+ "title": "Most Expensive Sessions (7d)",
581
+ "layout": {
582
+ "column": 9,
583
+ "row": 8,
584
+ "width": 4,
585
+ "height": 3
586
+ },
587
+ "visualization": {
588
+ "id": "viz.table"
589
+ },
590
+ "rawConfiguration": {
591
+ "facet": {
592
+ "showOtherSeries": false
593
+ },
594
+ "nrqlQueries": [
595
+ {
596
+ "accountIds": [],
597
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET developer, session_id SINCE 7 days ago LIMIT 10"
598
+ }
599
+ ],
600
+ "platformOptions": {
601
+ "ignoreTimeRange": false
602
+ }
603
+ }
604
+ }
605
+ ]
606
+ },
607
+ {
608
+ "name": "Tools & MCP",
609
+ "description": null,
610
+ "widgets": [
611
+ {
612
+ "title": "Reading MCP Data",
613
+ "layout": {
614
+ "column": 1,
615
+ "row": 1,
616
+ "width": 12,
617
+ "height": 1
618
+ },
619
+ "visualization": {
620
+ "id": "viz.markdown"
621
+ },
622
+ "rawConfiguration": {
623
+ "text": "MCP calls reach New Relic in two shapes depending on how Preflight is deployed. Hook-observed calls (stdio mode, the default) are `AiToolCall` events whose tool name is `mcp__<server>__<tool>`. Proxy-routed calls are `AiMcpToolCall` events with native `server` and `tool` fields. The billboards below count both shapes together; the breakdowns are labeled Hooks or Proxy. A blank breakdown means no MCP traffic of that shape in the window, not a broken widget."
624
+ }
625
+ },
626
+ {
627
+ "title": "Top Tools (7d)",
628
+ "layout": {
629
+ "column": 1,
630
+ "row": 2,
631
+ "width": 4,
632
+ "height": 3
633
+ },
634
+ "visualization": {
635
+ "id": "viz.bar"
636
+ },
637
+ "rawConfiguration": {
638
+ "facet": {
639
+ "showOtherSeries": false
640
+ },
641
+ "nrqlQueries": [
642
+ {
643
+ "accountIds": [],
644
+ "query": "FROM AiToolCall SELECT count(*) AS 'Calls' FACET tool SINCE 7 days ago LIMIT 25"
645
+ }
646
+ ],
647
+ "platformOptions": {
648
+ "ignoreTimeRange": false
649
+ }
650
+ }
651
+ },
652
+ {
653
+ "title": "Tool Reliability (7d)",
654
+ "layout": {
655
+ "column": 5,
656
+ "row": 2,
657
+ "width": 4,
658
+ "height": 3
659
+ },
660
+ "visualization": {
661
+ "id": "viz.table"
662
+ },
663
+ "rawConfiguration": {
664
+ "facet": {
665
+ "showOtherSeries": false
666
+ },
667
+ "nrqlQueries": [
668
+ {
669
+ "accountIds": [],
670
+ "query": "FROM AiToolCall SELECT count(*) AS 'Calls', filter(count(*), WHERE success = false) AS 'Errors', percentage(count(*), WHERE success = false) AS 'Error %' FACET tool SINCE 7 days ago LIMIT 25"
671
+ }
672
+ ],
673
+ "platformOptions": {
674
+ "ignoreTimeRange": false
675
+ }
676
+ }
677
+ },
678
+ {
679
+ "title": "Daily Tool Errors by Type (7d)",
680
+ "layout": {
681
+ "column": 9,
682
+ "row": 2,
683
+ "width": 4,
684
+ "height": 3
685
+ },
686
+ "visualization": {
687
+ "id": "viz.stacked-bar"
688
+ },
689
+ "rawConfiguration": {
690
+ "facet": {
691
+ "showOtherSeries": false
692
+ },
693
+ "legend": {
694
+ "enabled": true
695
+ },
696
+ "nrqlQueries": [
697
+ {
698
+ "accountIds": [],
699
+ "query": "FROM AiToolCall SELECT count(*) AS 'Errors' WHERE success = false FACET error_type SINCE 7 days ago TIMESERIES 1 day"
700
+ }
701
+ ],
702
+ "platformOptions": {
703
+ "ignoreTimeRange": false
704
+ }
705
+ }
706
+ },
707
+ {
708
+ "title": "MCP Calls (7d)",
709
+ "layout": {
710
+ "column": 1,
711
+ "row": 5,
712
+ "width": 4,
713
+ "height": 3
714
+ },
715
+ "visualization": {
716
+ "id": "viz.billboard"
717
+ },
718
+ "rawConfiguration": {
719
+ "facet": {
720
+ "showOtherSeries": false
721
+ },
722
+ "nrqlQueries": [
723
+ {
724
+ "accountIds": [],
725
+ "query": "FROM AiToolCall, AiMcpToolCall SELECT count(*) AS 'MCP Calls' WHERE tool LIKE 'mcp__%' OR eventType() = 'AiMcpToolCall' SINCE 7 days ago"
726
+ }
727
+ ],
728
+ "platformOptions": {
729
+ "ignoreTimeRange": false
730
+ }
731
+ }
732
+ },
733
+ {
734
+ "title": "MCP Error Rate (7d)",
735
+ "layout": {
736
+ "column": 5,
737
+ "row": 5,
738
+ "width": 4,
739
+ "height": 3
740
+ },
741
+ "visualization": {
742
+ "id": "viz.billboard"
743
+ },
744
+ "rawConfiguration": {
745
+ "facet": {
746
+ "showOtherSeries": false
747
+ },
748
+ "nrqlQueries": [
749
+ {
750
+ "accountIds": [],
751
+ "query": "FROM AiToolCall, AiMcpToolCall SELECT percentage(count(*), WHERE success = false) AS 'Error %' WHERE tool LIKE 'mcp__%' OR eventType() = 'AiMcpToolCall' SINCE 7 days ago"
752
+ }
753
+ ],
754
+ "platformOptions": {
755
+ "ignoreTimeRange": false
756
+ }
757
+ }
758
+ },
759
+ {
760
+ "title": "Unique MCP Users (7d)",
761
+ "layout": {
762
+ "column": 9,
763
+ "row": 5,
764
+ "width": 4,
765
+ "height": 3
766
+ },
767
+ "visualization": {
768
+ "id": "viz.billboard"
769
+ },
770
+ "rawConfiguration": {
771
+ "facet": {
772
+ "showOtherSeries": false
773
+ },
774
+ "nrqlQueries": [
775
+ {
776
+ "accountIds": [],
777
+ "query": "FROM AiToolCall, AiMcpToolCall SELECT uniqueCount(developer) AS 'Users' WHERE tool LIKE 'mcp__%' OR eventType() = 'AiMcpToolCall' SINCE 7 days ago"
778
+ }
779
+ ],
780
+ "platformOptions": {
781
+ "ignoreTimeRange": false
782
+ }
783
+ }
784
+ },
785
+ {
786
+ "title": "Top MCP Servers — Hooks (7d)",
787
+ "layout": {
788
+ "column": 1,
789
+ "row": 8,
790
+ "width": 4,
791
+ "height": 3
792
+ },
793
+ "visualization": {
794
+ "id": "viz.bar"
795
+ },
796
+ "rawConfiguration": {
797
+ "facet": {
798
+ "showOtherSeries": false
799
+ },
800
+ "nrqlQueries": [
801
+ {
802
+ "accountIds": [],
803
+ "query": "FROM AiToolCall SELECT count(*) AS 'Calls' WHERE tool LIKE 'mcp__%' FACET aparse(tool, 'mcp__*__%') AS 'MCP Server' SINCE 7 days ago LIMIT 25"
804
+ }
805
+ ],
806
+ "platformOptions": {
807
+ "ignoreTimeRange": false
808
+ }
809
+ }
810
+ },
811
+ {
812
+ "title": "MCP Tools — Hooks (7d)",
813
+ "layout": {
814
+ "column": 1,
815
+ "row": 11,
816
+ "width": 6,
817
+ "height": 3
818
+ },
819
+ "visualization": {
820
+ "id": "viz.table"
821
+ },
822
+ "rawConfiguration": {
823
+ "facet": {
824
+ "showOtherSeries": false
825
+ },
826
+ "nrqlQueries": [
827
+ {
828
+ "accountIds": [],
829
+ "query": "FROM AiToolCall SELECT count(*) AS 'Calls', filter(count(*), WHERE success = false) AS 'Errors', uniqueCount(developer) AS 'Users' WHERE tool LIKE 'mcp__%' FACET aparse(tool, 'mcp__*__%') AS 'MCP Server', aparse(tool, 'mcp__%__*') AS 'Tool' SINCE 7 days ago LIMIT 50"
830
+ }
831
+ ],
832
+ "platformOptions": {
833
+ "ignoreTimeRange": false
834
+ }
835
+ }
836
+ },
837
+ {
838
+ "title": "MCP Servers Over Time (7d)",
839
+ "layout": {
840
+ "column": 9,
841
+ "row": 8,
842
+ "width": 4,
843
+ "height": 3
844
+ },
845
+ "visualization": {
846
+ "id": "viz.line"
847
+ },
848
+ "rawConfiguration": {
849
+ "facet": {
850
+ "showOtherSeries": false
851
+ },
852
+ "legend": {
853
+ "enabled": true
854
+ },
855
+ "nrqlQueries": [
856
+ {
857
+ "accountIds": [],
858
+ "query": "FROM AiToolCall SELECT count(*) WHERE tool LIKE 'mcp__%' FACET aparse(tool, 'mcp__*__%') AS 'MCP Server' SINCE 7 days ago TIMESERIES 1 day LIMIT 10"
859
+ },
860
+ {
861
+ "accountIds": [],
862
+ "query": "FROM AiMcpToolCall SELECT count(*) FACET server AS 'MCP Server (proxy)' SINCE 7 days ago TIMESERIES 1 day LIMIT 10"
863
+ }
864
+ ],
865
+ "platformOptions": {
866
+ "ignoreTimeRange": false
867
+ },
868
+ "yAxisLeft": {
869
+ "zero": true
870
+ }
871
+ }
872
+ },
873
+ {
874
+ "title": "MCP Tools — Proxy (7d)",
875
+ "layout": {
876
+ "column": 7,
877
+ "row": 11,
878
+ "width": 6,
879
+ "height": 3
880
+ },
881
+ "visualization": {
882
+ "id": "viz.table"
883
+ },
884
+ "rawConfiguration": {
885
+ "facet": {
886
+ "showOtherSeries": false
887
+ },
888
+ "legend": {
889
+ "enabled": true
890
+ },
891
+ "nrqlQueries": [
892
+ {
893
+ "accountIds": [],
894
+ "query": "FROM AiMcpToolCall SELECT count(*) AS 'Calls', average(duration_ms) AS 'Avg ms', percentage(count(*), WHERE success = false) AS 'Error %', uniqueCount(developer) AS 'Users' FACET server, tool SINCE 7 days ago LIMIT 50"
895
+ }
896
+ ],
897
+ "platformOptions": {
898
+ "ignoreTimeRange": false
899
+ }
900
+ }
901
+ },
902
+ {
903
+ "title": "Top MCP Servers — Proxy (7d)",
904
+ "layout": {
905
+ "column": 5,
906
+ "row": 8,
907
+ "width": 4,
908
+ "height": 3
909
+ },
910
+ "visualization": {
911
+ "id": "viz.bar"
912
+ },
913
+ "rawConfiguration": {
914
+ "facet": {
915
+ "showOtherSeries": false
916
+ },
917
+ "legend": {
918
+ "enabled": true
919
+ },
920
+ "nrqlQueries": [
921
+ {
922
+ "accountIds": [],
923
+ "query": "FROM AiMcpToolCall SELECT count(*) AS 'Calls' FACET server SINCE 7 days ago LIMIT 25"
924
+ }
925
+ ],
926
+ "platformOptions": {
927
+ "ignoreTimeRange": false
928
+ }
929
+ }
930
+ }
931
+ ]
932
+ },
933
+ {
934
+ "name": "Team Leaderboard",
935
+ "description": null,
936
+ "widgets": [
937
+ {
938
+ "title": "Activity Leaderboard (7d)",
939
+ "layout": {
940
+ "column": 1,
941
+ "row": 1,
942
+ "width": 6,
943
+ "height": 4
944
+ },
945
+ "visualization": {
946
+ "id": "viz.table"
947
+ },
948
+ "rawConfiguration": {
949
+ "facet": {
950
+ "showOtherSeries": false
951
+ },
952
+ "nrqlQueries": [
953
+ {
954
+ "accountIds": [],
955
+ "query": "FROM AiToolCall SELECT uniqueCount(dateOf(timestamp)) AS 'Active Days', uniqueCount(session_id) AS 'Sessions', count(*) AS 'Tool Calls', percentage(count(*), WHERE success = true) AS 'Success %' FACET developer SINCE 7 days ago LIMIT 60"
956
+ }
957
+ ],
958
+ "platformOptions": {
959
+ "ignoreTimeRange": false
960
+ }
961
+ }
962
+ },
963
+ {
964
+ "title": "Outcome Leaderboard (7d)",
965
+ "layout": {
966
+ "column": 7,
967
+ "row": 1,
968
+ "width": 6,
969
+ "height": 4
970
+ },
971
+ "visualization": {
972
+ "id": "viz.table"
973
+ },
974
+ "rawConfiguration": {
975
+ "facet": {
976
+ "showOtherSeries": false
977
+ },
978
+ "nrqlQueries": [
979
+ {
980
+ "accountIds": [],
981
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', sum(estimated_cost_usd) AS 'Cost (USD)', sum(lines_added) AS 'Lines Added', percentage(count(*), WHERE tests_passed > 0) AS 'Tests Passing %' FACET developer SINCE 7 days ago LIMIT 60"
982
+ }
983
+ ],
984
+ "platformOptions": {
985
+ "ignoreTimeRange": false
986
+ }
987
+ }
988
+ },
989
+ {
990
+ "title": "Efficiency Score by Developer (7d)",
991
+ "layout": {
992
+ "column": 1,
993
+ "row": 5,
994
+ "width": 4,
995
+ "height": 3
996
+ },
997
+ "visualization": {
998
+ "id": "viz.bar"
999
+ },
1000
+ "rawConfiguration": {
1001
+ "facet": {
1002
+ "showOtherSeries": false
1003
+ },
1004
+ "nrqlQueries": [
1005
+ {
1006
+ "accountIds": [],
1007
+ "query": "FROM Metric SELECT average(ai.efficiency.score) AS 'Score' FACET developer SINCE 7 days ago"
1008
+ }
1009
+ ],
1010
+ "platformOptions": {
1011
+ "ignoreTimeRange": false
1012
+ }
1013
+ }
1014
+ },
1015
+ {
1016
+ "title": "Anti-Patterns by Developer (7d)",
1017
+ "layout": {
1018
+ "column": 5,
1019
+ "row": 5,
1020
+ "width": 4,
1021
+ "height": 3
1022
+ },
1023
+ "visualization": {
1024
+ "id": "viz.bar"
1025
+ },
1026
+ "rawConfiguration": {
1027
+ "facet": {
1028
+ "showOtherSeries": false
1029
+ },
1030
+ "nrqlQueries": [
1031
+ {
1032
+ "accountIds": [],
1033
+ "query": "FROM AiAntiPattern SELECT count(*) AS 'Anti-Patterns' FACET developer SINCE 7 days ago"
1034
+ }
1035
+ ],
1036
+ "platformOptions": {
1037
+ "ignoreTimeRange": false
1038
+ }
1039
+ }
1040
+ },
1041
+ {
1042
+ "title": "Avg Cost per Task by Developer (7d)",
1043
+ "layout": {
1044
+ "column": 9,
1045
+ "row": 5,
1046
+ "width": 4,
1047
+ "height": 3
1048
+ },
1049
+ "visualization": {
1050
+ "id": "viz.bar"
1051
+ },
1052
+ "rawConfiguration": {
1053
+ "facet": {
1054
+ "showOtherSeries": false
1055
+ },
1056
+ "nrqlQueries": [
1057
+ {
1058
+ "accountIds": [],
1059
+ "query": "FROM AiCodingTask SELECT average(estimated_cost_usd) AS 'USD / Task' FACET developer SINCE 7 days ago"
1060
+ }
1061
+ ],
1062
+ "platformOptions": {
1063
+ "ignoreTimeRange": false
1064
+ }
1065
+ }
1066
+ }
1067
+ ]
1068
+ },
1069
+ {
1070
+ "name": "Team Pulse",
1071
+ "description": null,
1072
+ "widgets": [
1073
+ {
1074
+ "title": "About This Page",
1075
+ "layout": {
1076
+ "column": 1,
1077
+ "row": 1,
1078
+ "width": 12,
1079
+ "height": 2
1080
+ },
1081
+ "visualization": {
1082
+ "id": "viz.markdown"
1083
+ },
1084
+ "rawConfiguration": {
1085
+ "text": "Adoption momentum over 8 weeks and a 60-day look at who is compounding value. Leaderboards are normalized by **active days** (days with at least one recorded task), so a quiet calendar week is not mistaken for a productivity drop. Coding tasks are the output unit: one task is a detected unit of work (a feature, fix, or investigation inside a session). **Git outcomes** (bottom rows) read the `ai.git.*` gauges and the edit-rejection signal — both need a Preflight release recent enough to export them; upgrade with `preflight update` if these rows are empty. The gauges are per-session running totals, so tables show per-session maxima and Cost per PR divides one sum by another (both sums snapshot at the same cadence, so the ratio holds). Edit accept rate counts Edit/Write calls without a 'rejected'/'denied'/'interrupted' error_type. Model-level drill-down lives on the **Models** page."
1086
+ }
1087
+ },
1088
+ {
1089
+ "title": "Weekly Active Developers",
1090
+ "layout": {
1091
+ "column": 1,
1092
+ "row": 3,
1093
+ "width": 4,
1094
+ "height": 3
1095
+ },
1096
+ "visualization": {
1097
+ "id": "viz.line"
1098
+ },
1099
+ "rawConfiguration": {
1100
+ "facet": {
1101
+ "showOtherSeries": false
1102
+ },
1103
+ "legend": {
1104
+ "enabled": true
1105
+ },
1106
+ "nrqlQueries": [
1107
+ {
1108
+ "accountIds": [],
1109
+ "query": "FROM AiToolCall SELECT uniqueCount(developer) AS 'Developers' SINCE 8 weeks ago TIMESERIES 1 week"
1110
+ }
1111
+ ],
1112
+ "platformOptions": {
1113
+ "ignoreTimeRange": false
1114
+ },
1115
+ "yAxisLeft": {
1116
+ "zero": true
1117
+ }
1118
+ }
1119
+ },
1120
+ {
1121
+ "title": "Weekly Sessions",
1122
+ "layout": {
1123
+ "column": 5,
1124
+ "row": 3,
1125
+ "width": 4,
1126
+ "height": 3
1127
+ },
1128
+ "visualization": {
1129
+ "id": "viz.line"
1130
+ },
1131
+ "rawConfiguration": {
1132
+ "facet": {
1133
+ "showOtherSeries": false
1134
+ },
1135
+ "legend": {
1136
+ "enabled": true
1137
+ },
1138
+ "nrqlQueries": [
1139
+ {
1140
+ "accountIds": [],
1141
+ "query": "FROM AiToolCall SELECT uniqueCount(session_id) AS 'Sessions' SINCE 8 weeks ago TIMESERIES 1 week"
1142
+ }
1143
+ ],
1144
+ "platformOptions": {
1145
+ "ignoreTimeRange": false
1146
+ },
1147
+ "yAxisLeft": {
1148
+ "zero": true
1149
+ }
1150
+ }
1151
+ },
1152
+ {
1153
+ "title": "Weekly Cost",
1154
+ "layout": {
1155
+ "column": 9,
1156
+ "row": 3,
1157
+ "width": 4,
1158
+ "height": 3
1159
+ },
1160
+ "visualization": {
1161
+ "id": "viz.line"
1162
+ },
1163
+ "rawConfiguration": {
1164
+ "facet": {
1165
+ "showOtherSeries": false
1166
+ },
1167
+ "legend": {
1168
+ "enabled": true
1169
+ },
1170
+ "nrqlQueries": [
1171
+ {
1172
+ "accountIds": [],
1173
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' SINCE 8 weeks ago TIMESERIES 1 week"
1174
+ }
1175
+ ],
1176
+ "platformOptions": {
1177
+ "ignoreTimeRange": false
1178
+ },
1179
+ "yAxisLeft": {
1180
+ "zero": true
1181
+ }
1182
+ }
1183
+ },
1184
+ {
1185
+ "title": "Weekly Token Volume",
1186
+ "layout": {
1187
+ "column": 1,
1188
+ "row": 6,
1189
+ "width": 4,
1190
+ "height": 3
1191
+ },
1192
+ "visualization": {
1193
+ "id": "viz.line"
1194
+ },
1195
+ "rawConfiguration": {
1196
+ "facet": {
1197
+ "showOtherSeries": false
1198
+ },
1199
+ "legend": {
1200
+ "enabled": true
1201
+ },
1202
+ "nrqlQueries": [
1203
+ {
1204
+ "accountIds": [],
1205
+ "query": "FROM AiCodingTask SELECT sum(tokens_used) AS 'Tokens' SINCE 8 weeks ago TIMESERIES 1 week"
1206
+ }
1207
+ ],
1208
+ "platformOptions": {
1209
+ "ignoreTimeRange": false
1210
+ },
1211
+ "yAxisLeft": {
1212
+ "zero": true
1213
+ }
1214
+ }
1215
+ },
1216
+ {
1217
+ "title": "Avg Cost per Task Trend",
1218
+ "layout": {
1219
+ "column": 5,
1220
+ "row": 6,
1221
+ "width": 4,
1222
+ "height": 3
1223
+ },
1224
+ "visualization": {
1225
+ "id": "viz.line"
1226
+ },
1227
+ "rawConfiguration": {
1228
+ "facet": {
1229
+ "showOtherSeries": false
1230
+ },
1231
+ "legend": {
1232
+ "enabled": true
1233
+ },
1234
+ "nrqlQueries": [
1235
+ {
1236
+ "accountIds": [],
1237
+ "query": "FROM AiCodingTask SELECT average(estimated_cost_usd) AS 'USD / Task' SINCE 8 weeks ago TIMESERIES 1 week"
1238
+ }
1239
+ ],
1240
+ "platformOptions": {
1241
+ "ignoreTimeRange": false
1242
+ },
1243
+ "yAxisLeft": {
1244
+ "zero": true
1245
+ }
1246
+ }
1247
+ },
1248
+ {
1249
+ "title": "Cache Hit % Trend",
1250
+ "layout": {
1251
+ "column": 9,
1252
+ "row": 6,
1253
+ "width": 4,
1254
+ "height": 3
1255
+ },
1256
+ "visualization": {
1257
+ "id": "viz.line"
1258
+ },
1259
+ "rawConfiguration": {
1260
+ "facet": {
1261
+ "showOtherSeries": false
1262
+ },
1263
+ "legend": {
1264
+ "enabled": true
1265
+ },
1266
+ "nrqlQueries": [
1267
+ {
1268
+ "accountIds": [],
1269
+ "query": "FROM Metric SELECT sum(ai.cost.tokens_cache_read) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_cache_read)) * 100 AS 'Cache Hit %' SINCE 8 weeks ago TIMESERIES 1 week"
1270
+ }
1271
+ ],
1272
+ "platformOptions": {
1273
+ "ignoreTimeRange": false
1274
+ },
1275
+ "yAxisLeft": {
1276
+ "zero": true
1277
+ }
1278
+ }
1279
+ },
1280
+ {
1281
+ "title": "Power Users (60d)",
1282
+ "layout": {
1283
+ "column": 1,
1284
+ "row": 9,
1285
+ "width": 12,
1286
+ "height": 4
1287
+ },
1288
+ "visualization": {
1289
+ "id": "viz.table"
1290
+ },
1291
+ "rawConfiguration": {
1292
+ "facet": {
1293
+ "showOtherSeries": false
1294
+ },
1295
+ "legend": {
1296
+ "enabled": true
1297
+ },
1298
+ "nrqlQueries": [
1299
+ {
1300
+ "accountIds": [],
1301
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', sum(estimated_cost_usd) AS 'Cost (USD)', sum(lines_added) AS 'Lines Added', uniqueCount(dateOf(timestamp)) AS 'Active Days', count(*) / uniqueCount(dateOf(timestamp)) AS 'Tasks / Active Day', sum(duration_ms) / 3600000 AS 'Assisted Hours' FACET developer SINCE 60 days ago LIMIT 50"
1302
+ }
1303
+ ],
1304
+ "platformOptions": {
1305
+ "ignoreTimeRange": false
1306
+ }
1307
+ }
1308
+ },
1309
+ {
1310
+ "title": "Tasks by Developer — Last 30d",
1311
+ "layout": {
1312
+ "column": 1,
1313
+ "row": 13,
1314
+ "width": 6,
1315
+ "height": 4
1316
+ },
1317
+ "visualization": {
1318
+ "id": "viz.table"
1319
+ },
1320
+ "rawConfiguration": {
1321
+ "facet": {
1322
+ "showOtherSeries": false
1323
+ },
1324
+ "legend": {
1325
+ "enabled": true
1326
+ },
1327
+ "nrqlQueries": [
1328
+ {
1329
+ "accountIds": [],
1330
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', sum(estimated_cost_usd) AS 'Cost (USD)', uniqueCount(dateOf(timestamp)) AS 'Active Days' FACET developer SINCE 30 days ago LIMIT 25"
1331
+ }
1332
+ ],
1333
+ "platformOptions": {
1334
+ "ignoreTimeRange": false
1335
+ }
1336
+ }
1337
+ },
1338
+ {
1339
+ "title": "Tasks by Developer — Prior 30d",
1340
+ "layout": {
1341
+ "column": 7,
1342
+ "row": 13,
1343
+ "width": 6,
1344
+ "height": 4
1345
+ },
1346
+ "visualization": {
1347
+ "id": "viz.table"
1348
+ },
1349
+ "rawConfiguration": {
1350
+ "facet": {
1351
+ "showOtherSeries": false
1352
+ },
1353
+ "legend": {
1354
+ "enabled": true
1355
+ },
1356
+ "nrqlQueries": [
1357
+ {
1358
+ "accountIds": [],
1359
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', sum(estimated_cost_usd) AS 'Cost (USD)', uniqueCount(dateOf(timestamp)) AS 'Active Days' FACET developer SINCE 60 days ago UNTIL 30 days ago LIMIT 25"
1360
+ }
1361
+ ],
1362
+ "platformOptions": {
1363
+ "ignoreTimeRange": false
1364
+ }
1365
+ }
1366
+ },
1367
+ {
1368
+ "title": "Active Days per Developer (60d)",
1369
+ "layout": {
1370
+ "column": 1,
1371
+ "row": 17,
1372
+ "width": 6,
1373
+ "height": 3
1374
+ },
1375
+ "visualization": {
1376
+ "id": "viz.bar"
1377
+ },
1378
+ "rawConfiguration": {
1379
+ "facet": {
1380
+ "showOtherSeries": false
1381
+ },
1382
+ "legend": {
1383
+ "enabled": true
1384
+ },
1385
+ "nrqlQueries": [
1386
+ {
1387
+ "accountIds": [],
1388
+ "query": "FROM AiToolCall SELECT uniqueCount(dateOf(timestamp)) AS 'Active Days' FACET developer SINCE 60 days ago LIMIT 50"
1389
+ }
1390
+ ],
1391
+ "platformOptions": {
1392
+ "ignoreTimeRange": false
1393
+ }
1394
+ }
1395
+ },
1396
+ {
1397
+ "title": "Assisted Hours per Developer (60d)",
1398
+ "layout": {
1399
+ "column": 7,
1400
+ "row": 17,
1401
+ "width": 6,
1402
+ "height": 3
1403
+ },
1404
+ "visualization": {
1405
+ "id": "viz.bar"
1406
+ },
1407
+ "rawConfiguration": {
1408
+ "facet": {
1409
+ "showOtherSeries": false
1410
+ },
1411
+ "legend": {
1412
+ "enabled": true
1413
+ },
1414
+ "nrqlQueries": [
1415
+ {
1416
+ "accountIds": [],
1417
+ "query": "FROM AiCodingTask SELECT sum(duration_ms) / 3600000 AS 'Assisted Hours' FACET developer SINCE 60 days ago LIMIT 50"
1418
+ }
1419
+ ],
1420
+ "platformOptions": {
1421
+ "ignoreTimeRange": false
1422
+ }
1423
+ }
1424
+ },
1425
+ {
1426
+ "title": "Git Outcomes by Session (7d)",
1427
+ "layout": {
1428
+ "column": 1,
1429
+ "row": 20,
1430
+ "width": 6,
1431
+ "height": 4
1432
+ },
1433
+ "visualization": {
1434
+ "id": "viz.table"
1435
+ },
1436
+ "rawConfiguration": {
1437
+ "facet": {
1438
+ "showOtherSeries": false
1439
+ },
1440
+ "legend": {
1441
+ "enabled": true
1442
+ },
1443
+ "nrqlQueries": [
1444
+ {
1445
+ "accountIds": [],
1446
+ "query": "FROM Metric SELECT max(ai.git.pr_created) AS 'PRs Created', max(ai.git.pr_merged) AS 'PRs Merged', max(ai.git.commit_count) AS 'Commits', max(ai.git.push_count) AS 'Pushes' FACET developer, session_id SINCE 7 days ago LIMIT 50"
1447
+ }
1448
+ ],
1449
+ "platformOptions": {
1450
+ "ignoreTimeRange": false
1451
+ }
1452
+ }
1453
+ },
1454
+ {
1455
+ "title": "Edit Accept Rate (7d)",
1456
+ "layout": {
1457
+ "column": 7,
1458
+ "row": 20,
1459
+ "width": 3,
1460
+ "height": 4
1461
+ },
1462
+ "visualization": {
1463
+ "id": "viz.billboard"
1464
+ },
1465
+ "rawConfiguration": {
1466
+ "facet": {
1467
+ "showOtherSeries": false
1468
+ },
1469
+ "legend": {
1470
+ "enabled": true
1471
+ },
1472
+ "nrqlQueries": [
1473
+ {
1474
+ "accountIds": [],
1475
+ "query": "FROM AiToolCall SELECT percentage(count(*), WHERE error_type IS NULL OR error_type NOT IN ('rejected', 'denied', 'interrupted')) AS 'Accept %' WHERE tool IN ('Edit', 'Write', 'NotebookEdit') SINCE 7 days ago"
1476
+ }
1477
+ ],
1478
+ "platformOptions": {
1479
+ "ignoreTimeRange": false
1480
+ }
1481
+ }
1482
+ },
1483
+ {
1484
+ "title": "Cost per PR (7d)",
1485
+ "layout": {
1486
+ "column": 10,
1487
+ "row": 20,
1488
+ "width": 3,
1489
+ "height": 4
1490
+ },
1491
+ "visualization": {
1492
+ "id": "viz.billboard"
1493
+ },
1494
+ "rawConfiguration": {
1495
+ "facet": {
1496
+ "showOtherSeries": false
1497
+ },
1498
+ "legend": {
1499
+ "enabled": true
1500
+ },
1501
+ "nrqlQueries": [
1502
+ {
1503
+ "accountIds": [],
1504
+ "query": "FROM Metric SELECT sum(ai.cost.session_total_usd) / sum(ai.git.pr_created) AS 'USD / PR' SINCE 7 days ago"
1505
+ }
1506
+ ],
1507
+ "platformOptions": {
1508
+ "ignoreTimeRange": false
1509
+ }
1510
+ }
1511
+ },
1512
+ {
1513
+ "title": "Weekly Cost per PR",
1514
+ "layout": {
1515
+ "column": 1,
1516
+ "row": 24,
1517
+ "width": 6,
1518
+ "height": 3
1519
+ },
1520
+ "visualization": {
1521
+ "id": "viz.line"
1522
+ },
1523
+ "rawConfiguration": {
1524
+ "facet": {
1525
+ "showOtherSeries": false
1526
+ },
1527
+ "legend": {
1528
+ "enabled": true
1529
+ },
1530
+ "nrqlQueries": [
1531
+ {
1532
+ "accountIds": [],
1533
+ "query": "FROM Metric SELECT sum(ai.cost.session_total_usd) / sum(ai.git.pr_created) AS 'USD / PR' SINCE 8 weeks ago TIMESERIES 1 week"
1534
+ }
1535
+ ],
1536
+ "platformOptions": {
1537
+ "ignoreTimeRange": false
1538
+ },
1539
+ "yAxisLeft": {
1540
+ "zero": true
1541
+ }
1542
+ }
1543
+ },
1544
+ {
1545
+ "title": "Weekly Sessions Shipping PRs",
1546
+ "layout": {
1547
+ "column": 7,
1548
+ "row": 24,
1549
+ "width": 6,
1550
+ "height": 3
1551
+ },
1552
+ "visualization": {
1553
+ "id": "viz.line"
1554
+ },
1555
+ "rawConfiguration": {
1556
+ "facet": {
1557
+ "showOtherSeries": false
1558
+ },
1559
+ "legend": {
1560
+ "enabled": true
1561
+ },
1562
+ "nrqlQueries": [
1563
+ {
1564
+ "accountIds": [],
1565
+ "query": "FROM Metric SELECT uniqueCount(session_id) AS 'Sessions with PRs' WHERE ai.git.pr_created > 0 SINCE 8 weeks ago TIMESERIES 1 week"
1566
+ }
1567
+ ],
1568
+ "platformOptions": {
1569
+ "ignoreTimeRange": false
1570
+ },
1571
+ "yAxisLeft": {
1572
+ "zero": true
1573
+ }
1574
+ }
1575
+ }
1576
+ ]
1577
+ },
1578
+ {
1579
+ "name": "Models",
1580
+ "description": null,
1581
+ "widgets": [
1582
+ {
1583
+ "title": "Reading This Page",
1584
+ "layout": {
1585
+ "column": 1,
1586
+ "row": 1,
1587
+ "width": 12,
1588
+ "height": 2
1589
+ },
1590
+ "visualization": {
1591
+ "id": "viz.markdown"
1592
+ },
1593
+ "rawConfiguration": {
1594
+ "text": "Which models are working best for which work. Task-level widgets read the `model` and `outcome_type` attributes on `AiCodingTask` — tasks from versions that don't stamp them appear without them, and a task that switched models mid-flight attributes wholly to the model active at completion. Cache Hit % reads `ai.cost.*` gauges, which exist only when a live server exports metrics. Success % counts tasks whose last test run passed (or that ran no tests)."
1595
+ }
1596
+ },
1597
+ {
1598
+ "title": "Cost by Model (30d)",
1599
+ "layout": {
1600
+ "column": 1,
1601
+ "row": 3,
1602
+ "width": 4,
1603
+ "height": 3
1604
+ },
1605
+ "visualization": {
1606
+ "id": "viz.pie"
1607
+ },
1608
+ "rawConfiguration": {
1609
+ "facet": {
1610
+ "showOtherSeries": false
1611
+ },
1612
+ "legend": {
1613
+ "enabled": true
1614
+ },
1615
+ "nrqlQueries": [
1616
+ {
1617
+ "accountIds": [],
1618
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET model SINCE 30 days ago"
1619
+ }
1620
+ ],
1621
+ "platformOptions": {
1622
+ "ignoreTimeRange": false
1623
+ }
1624
+ }
1625
+ },
1626
+ {
1627
+ "title": "Daily Cost by Model",
1628
+ "layout": {
1629
+ "column": 5,
1630
+ "row": 3,
1631
+ "width": 4,
1632
+ "height": 3
1633
+ },
1634
+ "visualization": {
1635
+ "id": "viz.stacked-bar"
1636
+ },
1637
+ "rawConfiguration": {
1638
+ "facet": {
1639
+ "showOtherSeries": false
1640
+ },
1641
+ "legend": {
1642
+ "enabled": true
1643
+ },
1644
+ "nrqlQueries": [
1645
+ {
1646
+ "accountIds": [],
1647
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET model SINCE 30 days ago TIMESERIES 1 day"
1648
+ }
1649
+ ],
1650
+ "platformOptions": {
1651
+ "ignoreTimeRange": false
1652
+ }
1653
+ }
1654
+ },
1655
+ {
1656
+ "title": "Tasks by Model (30d)",
1657
+ "layout": {
1658
+ "column": 9,
1659
+ "row": 3,
1660
+ "width": 4,
1661
+ "height": 3
1662
+ },
1663
+ "visualization": {
1664
+ "id": "viz.bar"
1665
+ },
1666
+ "rawConfiguration": {
1667
+ "facet": {
1668
+ "showOtherSeries": false
1669
+ },
1670
+ "legend": {
1671
+ "enabled": true
1672
+ },
1673
+ "nrqlQueries": [
1674
+ {
1675
+ "accountIds": [],
1676
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks' FACET model SINCE 30 days ago"
1677
+ }
1678
+ ],
1679
+ "platformOptions": {
1680
+ "ignoreTimeRange": false
1681
+ }
1682
+ }
1683
+ },
1684
+ {
1685
+ "title": "Avg Cost per Task by Model (30d)",
1686
+ "layout": {
1687
+ "column": 1,
1688
+ "row": 6,
1689
+ "width": 4,
1690
+ "height": 3
1691
+ },
1692
+ "visualization": {
1693
+ "id": "viz.bar"
1694
+ },
1695
+ "rawConfiguration": {
1696
+ "facet": {
1697
+ "showOtherSeries": false
1698
+ },
1699
+ "legend": {
1700
+ "enabled": true
1701
+ },
1702
+ "nrqlQueries": [
1703
+ {
1704
+ "accountIds": [],
1705
+ "query": "FROM AiCodingTask SELECT average(estimated_cost_usd) AS 'USD / Task' FACET model SINCE 30 days ago"
1706
+ }
1707
+ ],
1708
+ "platformOptions": {
1709
+ "ignoreTimeRange": false
1710
+ }
1711
+ }
1712
+ },
1713
+ {
1714
+ "title": "Tokens per Task by Model (30d)",
1715
+ "layout": {
1716
+ "column": 5,
1717
+ "row": 6,
1718
+ "width": 4,
1719
+ "height": 3
1720
+ },
1721
+ "visualization": {
1722
+ "id": "viz.bar"
1723
+ },
1724
+ "rawConfiguration": {
1725
+ "facet": {
1726
+ "showOtherSeries": false
1727
+ },
1728
+ "legend": {
1729
+ "enabled": true
1730
+ },
1731
+ "nrqlQueries": [
1732
+ {
1733
+ "accountIds": [],
1734
+ "query": "FROM AiCodingTask SELECT average(tokens_used) AS 'Tokens / Task' FACET model SINCE 30 days ago"
1735
+ }
1736
+ ],
1737
+ "platformOptions": {
1738
+ "ignoreTimeRange": false
1739
+ }
1740
+ }
1741
+ },
1742
+ {
1743
+ "title": "Avg Task Minutes by Model (30d)",
1744
+ "layout": {
1745
+ "column": 9,
1746
+ "row": 6,
1747
+ "width": 4,
1748
+ "height": 3
1749
+ },
1750
+ "visualization": {
1751
+ "id": "viz.bar"
1752
+ },
1753
+ "rawConfiguration": {
1754
+ "facet": {
1755
+ "showOtherSeries": false
1756
+ },
1757
+ "legend": {
1758
+ "enabled": true
1759
+ },
1760
+ "nrqlQueries": [
1761
+ {
1762
+ "accountIds": [],
1763
+ "query": "FROM AiCodingTask SELECT average(duration_ms) / 60000 AS 'Minutes / Task' FACET model SINCE 30 days ago"
1764
+ }
1765
+ ],
1766
+ "platformOptions": {
1767
+ "ignoreTimeRange": false
1768
+ }
1769
+ }
1770
+ },
1771
+ {
1772
+ "title": "Task Success % by Model (30d)",
1773
+ "layout": {
1774
+ "column": 1,
1775
+ "row": 9,
1776
+ "width": 4,
1777
+ "height": 3
1778
+ },
1779
+ "visualization": {
1780
+ "id": "viz.bar"
1781
+ },
1782
+ "rawConfiguration": {
1783
+ "facet": {
1784
+ "showOtherSeries": false
1785
+ },
1786
+ "legend": {
1787
+ "enabled": true
1788
+ },
1789
+ "nrqlQueries": [
1790
+ {
1791
+ "accountIds": [],
1792
+ "query": "FROM AiCodingTask SELECT percentage(count(*), WHERE tests_passed > 0 OR tests_run = 0) AS 'Success %' FACET model SINCE 30 days ago"
1793
+ }
1794
+ ],
1795
+ "platformOptions": {
1796
+ "ignoreTimeRange": false
1797
+ }
1798
+ }
1799
+ },
1800
+ {
1801
+ "title": "Cache Hit % by Model (7d)",
1802
+ "layout": {
1803
+ "column": 5,
1804
+ "row": 9,
1805
+ "width": 4,
1806
+ "height": 3
1807
+ },
1808
+ "visualization": {
1809
+ "id": "viz.bar"
1810
+ },
1811
+ "rawConfiguration": {
1812
+ "facet": {
1813
+ "showOtherSeries": false
1814
+ },
1815
+ "legend": {
1816
+ "enabled": true
1817
+ },
1818
+ "nrqlQueries": [
1819
+ {
1820
+ "accountIds": [],
1821
+ "query": "FROM Metric SELECT sum(ai.cost.tokens_cache_read) / (sum(ai.cost.tokens_input) + sum(ai.cost.tokens_cache_read)) * 100 AS 'Cache Hit %' FACET model SINCE 7 days ago"
1822
+ }
1823
+ ],
1824
+ "platformOptions": {
1825
+ "ignoreTimeRange": false
1826
+ }
1827
+ }
1828
+ },
1829
+ {
1830
+ "title": "Lines of Code per Dollar by Model (30d)",
1831
+ "layout": {
1832
+ "column": 9,
1833
+ "row": 9,
1834
+ "width": 4,
1835
+ "height": 3
1836
+ },
1837
+ "visualization": {
1838
+ "id": "viz.bar"
1839
+ },
1840
+ "rawConfiguration": {
1841
+ "facet": {
1842
+ "showOtherSeries": false
1843
+ },
1844
+ "legend": {
1845
+ "enabled": true
1846
+ },
1847
+ "nrqlQueries": [
1848
+ {
1849
+ "accountIds": [],
1850
+ "query": "FROM AiCodingTask SELECT sum(lines_added) / sum(estimated_cost_usd) AS 'Lines / USD' FACET model SINCE 30 days ago"
1851
+ }
1852
+ ],
1853
+ "platformOptions": {
1854
+ "ignoreTimeRange": false
1855
+ }
1856
+ }
1857
+ },
1858
+ {
1859
+ "title": "Model × Task Type (30d)",
1860
+ "layout": {
1861
+ "column": 1,
1862
+ "row": 12,
1863
+ "width": 12,
1864
+ "height": 4
1865
+ },
1866
+ "visualization": {
1867
+ "id": "viz.table"
1868
+ },
1869
+ "rawConfiguration": {
1870
+ "facet": {
1871
+ "showOtherSeries": false
1872
+ },
1873
+ "legend": {
1874
+ "enabled": true
1875
+ },
1876
+ "nrqlQueries": [
1877
+ {
1878
+ "accountIds": [],
1879
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', average(estimated_cost_usd) AS 'Avg Cost (USD)', average(duration_ms) / 60000 AS 'Avg Minutes', percentage(count(*), WHERE tests_passed > 0 OR tests_run = 0) AS 'Success %' FACET model, outcome_type SINCE 30 days ago LIMIT 100"
1880
+ }
1881
+ ],
1882
+ "platformOptions": {
1883
+ "ignoreTimeRange": false
1884
+ }
1885
+ }
1886
+ },
1887
+ {
1888
+ "title": "Developer × Model (30d)",
1889
+ "layout": {
1890
+ "column": 1,
1891
+ "row": 16,
1892
+ "width": 6,
1893
+ "height": 4
1894
+ },
1895
+ "visualization": {
1896
+ "id": "viz.table"
1897
+ },
1898
+ "rawConfiguration": {
1899
+ "facet": {
1900
+ "showOtherSeries": false
1901
+ },
1902
+ "legend": {
1903
+ "enabled": true
1904
+ },
1905
+ "nrqlQueries": [
1906
+ {
1907
+ "accountIds": [],
1908
+ "query": "FROM AiCodingTask SELECT count(*) AS 'Tasks', sum(estimated_cost_usd) AS 'Cost (USD)', average(estimated_cost_usd) AS 'USD / Task' FACET developer, model SINCE 30 days ago LIMIT 100"
1909
+ }
1910
+ ],
1911
+ "platformOptions": {
1912
+ "ignoreTimeRange": false
1913
+ }
1914
+ }
1915
+ },
1916
+ {
1917
+ "title": "Cost by Task Type (30d)",
1918
+ "layout": {
1919
+ "column": 7,
1920
+ "row": 16,
1921
+ "width": 6,
1922
+ "height": 4
1923
+ },
1924
+ "visualization": {
1925
+ "id": "viz.pie"
1926
+ },
1927
+ "rawConfiguration": {
1928
+ "facet": {
1929
+ "showOtherSeries": false
1930
+ },
1931
+ "legend": {
1932
+ "enabled": true
1933
+ },
1934
+ "nrqlQueries": [
1935
+ {
1936
+ "accountIds": [],
1937
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'USD' FACET outcome_type SINCE 30 days ago"
1938
+ }
1939
+ ],
1940
+ "platformOptions": {
1941
+ "ignoreTimeRange": false
1942
+ }
1943
+ }
1944
+ }
1945
+ ]
1946
+ }
1947
+ ]
1948
+ }