From 56fcb1f64cbefc54c1049a1d10d97a8d7eea8989 Mon Sep 17 00:00:00 2001 From: bramhanandlingala Date: Thu, 13 Aug 2026 10:54:54 +0530 Subject: [PATCH] Fix Copilot seat organization attribution causing wrong DORA adoption denominator --- backend/plugins/gh-copilot/tasks/metrics_extractor.go | 6 ++++++ backend/plugins/gh-copilot/tasks/seat_extractor.go | 7 ++++++- .../dashboards/mysql/github-copilot-dora-correlation.json | 2 +- .../postgresql/github-copilot-dora-correlation.json | 6 +++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/plugins/gh-copilot/tasks/metrics_extractor.go b/backend/plugins/gh-copilot/tasks/metrics_extractor.go index d89eababde6..0083e7dbaea 100644 --- a/backend/plugins/gh-copilot/tasks/metrics_extractor.go +++ b/backend/plugins/gh-copilot/tasks/metrics_extractor.go @@ -39,6 +39,7 @@ type copilotSeatResponse struct { LastActivityEditor string `json:"last_activity_editor"` Assignee copilotAssignee `json:"assignee"` AssigningTeam *copilotTeam `json:"assigning_team"` + Organization *copilotOrgRef `json:"organization"` } type copilotAssignee struct { @@ -49,6 +50,11 @@ type copilotAssignee struct { Email string `json:"email"` } +type copilotOrgRef struct { + Login string `json:"login"` + Id int64 `json:"id"` +} + type copilotTeam struct { Id int64 `json:"id"` Name string `json:"name"` diff --git a/backend/plugins/gh-copilot/tasks/seat_extractor.go b/backend/plugins/gh-copilot/tasks/seat_extractor.go index 1a1b6b13518..d62a7aec69c 100644 --- a/backend/plugins/gh-copilot/tasks/seat_extractor.go +++ b/backend/plugins/gh-copilot/tasks/seat_extractor.go @@ -91,9 +91,14 @@ func ExtractSeats(taskCtx plugin.SubTaskContext) errors.Error { return nil, err } + seatOrganization := connection.Organization + if seat.Organization != nil && seat.Organization.Login != "" { + seatOrganization = seat.Organization.Login + } + toolSeat := &models.GhCopilotSeat{ ConnectionId: data.Options.ConnectionId, - Organization: connection.Organization, + Organization: seatOrganization, UserLogin: seat.Assignee.Login, UserId: seat.Assignee.Id, UserName: seat.Assignee.Name, diff --git a/grafana/dashboards/mysql/github-copilot-dora-correlation.json b/grafana/dashboards/mysql/github-copilot-dora-correlation.json index 72cf5b01c7f..9922bd1c377 100644 --- a/grafana/dashboards/mysql/github-copilot-dora-correlation.json +++ b/grafana/dashboards/mysql/github-copilot-dora-correlation.json @@ -1 +1 @@ -{"annotations":{"list":[{"builtIn":1,"datasource":{"type":"datasource","uid":"grafana"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"},{"datasource":"mysql","enable":true,"hide":false,"iconColor":"purple","name":"Copilot Implementation Date","rawQuery":"SELECT\n UNIX_TIMESTAMP(implementation_date) * 1000 AS time,\n 'Copilot Rollout' AS text,\n 'Implementation Date' AS title\nFROM _tool_copilot_scopes\nWHERE id = '${scope_id}'\n AND implementation_date IS NOT NULL","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"links":[],"liveNow":false,"panels":[{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":5,"w":24,"x":0,"y":0},"id":1,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"## GitHub Copilot + DORA Correlation Dashboard\n\n**Purpose**: Analyze the **correlation** between GitHub Copilot adoption levels and engineering productivity metrics.\n\n**How it works**:\n- \ud83d\udcc8 **Primary Analysis**: Continuous correlation showing how DORA metrics trend alongside GitHub Copilot adoption intensity\n- \ud83d\udcca **Adoption Tiers**: Metrics grouped by adoption level (<25%, 25-50%, 50-75%, >75% of seats active)\n- \ud83d\udccd **Optional Milestone**: Configure a rollout date to add annotation markers on charts\n\n**Prerequisites**:\n- Ensure **GitHub Copilot metrics** are being collected via the GitHub Copilot plugin\n- Ensure **PR data** exists in DevLake from GitHub/GitLab plugins\n- For DORA metrics (CFR, MTTR): Configure deployments and incidents\n- For Code Quality: Configure SonarQube integration (optional)\n\n**\u26a0\ufe0f Disclaimer**: Correlation does not imply causation. Other factors may influence the metrics shown.","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"Dashboard Introduction","type":"text"},{"datasource":"mysql","description":"Weekly GitHub Copilot adoption percentage (active users / total seats) over time. Higher adoption correlates with expected productivity improvements.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"Adoption %","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":20,"gradientMode":"scheme","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"max":100,"min":0,"thresholds":{"mode":"absolute","steps":[{"color":"blue","value":null},{"color":"green","value":50}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":12,"x":0,"y":14},"id":2,"options":{"legend":{"calcs":["mean","lastNotNull"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, active_users, total_seats,\n ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n ROUND(AVG(adoption_pct), 1) AS adoption_pct,\n ROUND(AVG(active_users), 0) AS avg_active_users,\n ROUND(AVG(total_seats), 0) AS avg_total_seats\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n adoption_pct AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"A"}],"title":"GitHub Copilot Adoption Trend","type":"timeseries"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and PR cycle time. Negative values indicate inverse correlation (higher adoption \u2192 faster PRs). |r| > 0.7 = strong, 0.3-0.7 = moderate, < 0.3 = weak.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"from":-1,"result":{"color":"green","index":0,"text":"Strong \u2193"},"to":-0.7},"type":"range"},{"options":{"from":-0.7,"result":{"color":"yellow","index":1,"text":"Moderate \u2193"},"to":-0.3},"type":"range"},{"options":{"from":-0.3,"result":{"color":"text","index":2,"text":"Weak"},"to":0.3},"type":"range"},{"options":{"from":0.3,"result":{"color":"orange","index":3,"text":"Moderate \u2191"},"to":0.7},"type":"range"},{"options":{"from":0.7,"result":{"color":"red","index":4,"text":"Strong \u2191"},"to":1},"type":"range"}],"noValue":"\u26a0\ufe0f Insufficient data (need 4+ weeks)","thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]},"unit":"none","decimals":2},"overrides":[]},"gridPos":{"h":8,"w":4,"x":20,"y":31},"id":3,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value_and_name","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_correlation_data AS (\n SELECT\n aw.week_start,\n aw.adoption_pct,\n pm.avg_cycle_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\n WHERE aw.adoption_pct IS NOT NULL AND pm.avg_cycle_time_hours IS NOT NULL\n),\n_stats AS (\n SELECT\n COUNT(*) AS n,\n AVG(adoption_pct) AS mean_x,\n AVG(avg_cycle_time_hours) AS mean_y,\n STDDEV_POP(adoption_pct) AS stddev_x,\n STDDEV_POP(avg_cycle_time_hours) AS stddev_y\n FROM _correlation_data\n),\n_pearson AS (\n SELECT\n CASE\n WHEN s.n < 4 THEN NULL\n WHEN s.stddev_x = 0 OR s.stddev_y = 0 THEN 0\n ELSE (\n SELECT\n SUM((cd.adoption_pct - s.mean_x) * (cd.avg_cycle_time_hours - s.mean_y)) / (s.n * s.stddev_x * s.stddev_y)\n FROM _correlation_data cd\n )\n END AS r\n FROM _stats s\n)\nSELECT ROUND(r, 2) AS value FROM _pearson","refId":"A"}],"title":"Adoption vs PR Cycle Time (r)","type":"stat"},{"datasource":"mysql","description":"Current week's GitHub Copilot adoption percentage (active users / total seats)","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"noValue":"No data","thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":25},{"color":"green","value":50},{"color":"dark-green","value":75}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":18,"y":14},"id":5,"options":{"colorMode":"value","graphMode":"area","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS value\nFROM (\n SELECT daily_active_users AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ORDER BY day DESC LIMIT 1\n) _ent\nUNION ALL\nSELECT ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS value\nFROM (\n SELECT total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ORDER BY date DESC LIMIT 1\n) _org\nLIMIT 1","refId":"A"}],"title":"Current Adoption %","type":"stat"},{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":8,"w":6,"x":12,"y":10},"id":6,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"### Interpreting Correlation (r)\n\n| Value | Meaning |\n|-------|--------|\n| **-1 to -0.7** | \ud83d\udfe2 Strong inverse (higher adoption \u2192 faster PRs) |\n| **-0.7 to -0.3** | \ud83d\udfe1 Moderate inverse |\n| **-0.3 to 0.3** | \u26aa Weak/No correlation |\n| **0.3 to 0.7** | \ud83d\udfe0 Moderate positive |\n| **0.7 to 1** | \ud83d\udd34 Strong positive (unexpected) |\n\n*Note: r < 0 is expected (adoption \u2191 = cycle time \u2193)*","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"\ud83d\udcca How to Read Correlation","type":"text"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":30},"id":100,"panels":[],"title":"PR Velocity Impact","type":"row"},{"datasource":"mysql","description":"Percentage difference in PR cycle time between high adoption weeks (>50%) and low adoption weeks (<50%). Negative values indicate improvement (faster PRs during high adoption).","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"noValue":"\u26a0\ufe0f Insufficient data","thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":0},{"color":"red","value":10}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":4,"x":16,"y":31},"id":4,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_pr_joined AS (\n SELECT\n aw.week_start,\n aw.adoption_pct,\n pm.avg_cycle_time_hours,\n CASE\n WHEN aw.adoption_pct >= 50 THEN 'high'\n ELSE 'low'\n END AS adoption_tier\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\n),\n_tier_averages AS (\n SELECT\n adoption_tier,\n AVG(avg_cycle_time_hours) AS avg_cycle_time\n FROM _adoption_pr_joined\n GROUP BY adoption_tier\n)\nSELECT\n ROUND(\n ((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'high') -\n (SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low')) /\n NULLIF((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low'), 0) * 100,\n 1\n ) AS value","refId":"A"}],"title":"PR Cycle Time Change (High vs Low Adoption)","type":"stat"},{"datasource":"mysql","description":"Dual-axis chart showing weekly GitHub Copilot adoption % (left axis) and PR cycle time in hours (right axis). Look for inverse correlation - adoption up, cycle time down.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"max","value":100},{"id":"min","value":0}]},{"matcher":{"id":"byName","options":"PR Cycle Time (hrs)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"orange","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":31},"id":10,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(adoption_pct, 1) AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"Adoption"},{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(avg_cycle_time_hours, 1) AS 'PR Cycle Time (hrs)'\nFROM _pr_metrics_weekly\nORDER BY week_start","refId":"PRTime"}],"title":"Adoption vs PR Cycle Time","type":"timeseries"},{"datasource":"mysql","description":"Average PR cycle time by adoption tier. Lower times in higher adoption tiers suggest positive Copilot impact.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":48}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":4,"x":12,"y":31},"id":14,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":16,"minVizWidth":8,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"metric","valueField":"value"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_pr_joined AS (\n SELECT\n aw.adoption_pct,\n pm.avg_cycle_time_hours,\n CASE\n WHEN aw.adoption_pct < 25 THEN '1. <25%'\n WHEN aw.adoption_pct < 50 THEN '2. 25-50%'\n WHEN aw.adoption_pct < 75 THEN '3. 50-75%'\n ELSE '4. >75%'\n END AS adoption_tier\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\n)\nSELECT\n adoption_tier AS metric,\n ROUND(AVG(avg_cycle_time_hours), 1) AS value\nFROM _adoption_pr_joined\nGROUP BY adoption_tier\nORDER BY adoption_tier","refId":"A"}],"title":"PR Cycle Time by Adoption Tier","type":"bargauge"},{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":6,"w":4,"x":12,"y":35},"id":15,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"**Cycle Time Components** break down PR lifecycle into three phases:\n\n- **Coding Time**: PR creation \u2192 first commit (development speed)\n- **Pickup Time**: PR creation \u2192 first review (reviewer responsiveness)\n- **Review Time**: First review \u2192 merge (actual review duration)\n\nComparing <50% vs \u226550% adoption periods shows which phase improved most with Copilot. For example, if Coding Time shrinks significantly, Copilot accelerates development.","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"Understanding Cycle Time Breakdown","type":"text"},{"datasource":"mysql","description":"Scatter plot showing weekly data points. Each point = one week. X-axis = adoption %, Y-axis = PR cycle time. Downward trend line indicates positive Copilot impact.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"Adoption %","axisPlacement":"auto","hideFrom":{"legend":false,"tooltip":false,"viz":false},"pointSize":{"fixed":10},"scaleDistribution":{"type":"linear"},"show":"points"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[]},"gridPos":{"h":6,"w":12,"x":0,"y":35},"id":11,"options":{"dims":{"x":"adoption_pct"},"legend":{"calcs":[],"displayMode":"list","placement":"bottom","showLegend":false},"series":[],"seriesMapping":"auto","tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n ROUND(aw.adoption_pct, 1) AS adoption_pct,\n ROUND(pm.avg_cycle_time_hours, 1) AS cycle_time_hours\nFROM _adoption_weekly aw\nINNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\nORDER BY aw.adoption_pct","refId":"A"}],"title":"Adoption vs PR Cycle Time (Scatter)","type":"xychart"},{"datasource":"mysql","description":"PR cycle time breakdown during low adoption periods (<50%). Compare with high adoption to see which components improved.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"mappings":[],"unit":"h"},"overrides":[]},"gridPos":{"h":6,"w":4,"x":16,"y":35},"id":12,"options":{"displayLabels":["name","percent"],"legend":{"displayMode":"table","placement":"right","showLegend":true,"values":["value"]},"pieType":"pie","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_low_adoption_weeks AS (\n SELECT week_start FROM _adoption_weekly WHERE adoption_pct < 50\n)\nSELECT\n 'Coding Time' AS component,\n ROUND(AVG(pr_coding_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)\nUNION ALL\nSELECT\n 'Pickup Time' AS component,\n ROUND(AVG(pr_pickup_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)\nUNION ALL\nSELECT\n 'Review Time' AS component,\n ROUND(AVG(pr_review_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)","refId":"A"}],"title":"Cycle Time Components: Low Adoption","type":"piechart"},{"datasource":"mysql","description":"PR cycle time breakdown during high adoption periods (>=50%). Compare with low adoption to see which components improved.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"mappings":[],"unit":"h"},"overrides":[]},"gridPos":{"h":6,"w":4,"x":20,"y":35},"id":13,"options":{"displayLabels":["name","percent"],"legend":{"displayMode":"table","placement":"right","showLegend":true,"values":["value"]},"pieType":"pie","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_high_adoption_weeks AS (\n SELECT week_start FROM _adoption_weekly WHERE adoption_pct >= 50\n)\nSELECT\n 'Coding Time' AS component,\n ROUND(AVG(pr_coding_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)\nUNION ALL\nSELECT\n 'Pickup Time' AS component,\n ROUND(AVG(pr_pickup_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)\nUNION ALL\nSELECT\n 'Review Time' AS component,\n ROUND(AVG(pr_review_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)","refId":"A"}],"title":"Cycle Time Components: High Adoption","type":"piechart"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":45},"id":200,"panels":[],"title":"Deployment Frequency Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and deployment frequency over time. Look for correlation patterns - does higher adoption correlate with more frequent deployments?","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"Deployments"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"short"},{"id":"color","value":{"fixedColor":"orange","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":46},"id":31,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n COALESCE(dw.deploy_count, 0) AS 'Deployments'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Deployment Frequency","type":"timeseries"},{"datasource":"mysql","description":"Deployment frequency grouped by GitHub Copilot adoption tier. Higher adoption should correlate with more frequent deployments if Copilot accelerates development velocity.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"yellow","value":null},{"color":"green","value":5}]},"unit":"short"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":46},"id":32,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["sum"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"Deploys/Week"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(COALESCE(dw.deploy_count, 0)), 1) AS 'Deploys/Week'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"Deployments per Week by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and weekly deployment count. Positive values indicate higher adoption correlates with more deployments.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":0.3},{"color":"green","value":0.7}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":46},"id":33,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n COALESCE(dw.deploy_count, 0) AS deploy_count\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * deploy_count) - SUM(adoption_pct) * SUM(deploy_count)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(deploy_count * deploy_count) - POW(SUM(deploy_count), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined\nWHERE adoption_pct IS NOT NULL","refId":"A"}],"title":"Adoption vs Deployment Frequency (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in deployment frequency between low adoption (<50%) and high adoption (\u226550%) periods.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":0},{"color":"green","value":20}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":50},"id":34,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_adoption_deploy AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n COALESCE(dw.deploy_count, 0) AS deploy_count\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(deploy_count) AS avg_deploys\n FROM _adoption_deploy\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_deploys FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_deploys FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_deploys FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"Deployment Frequency Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":5},"id":250,"panels":[],"title":"Adoption Intensity Analysis","type":"row"},{"datasource":"mysql","description":"Comprehensive comparison of all DORA metrics across GitHub Copilot adoption tiers. Lower values (green) are better for cycle time, CFR, and MTTR. Higher values (green) are better for deployment frequency.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"custom":{"align":"auto","cellOptions":{"type":"auto"},"inspect":false},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[]},"gridPos":{"h":8,"w":24,"x":0,"y":6},"id":72,"options":{"cellHeight":"sm","footer":{"countRows":false,"fields":"","reducer":["sum"],"show":false},"showHeader":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_adoption_tiers AS (\n SELECT\n week_start,\n adoption_pct,\n CASE\n WHEN adoption_pct < 25 THEN '<25%'\n WHEN adoption_pct < 50 THEN '25-50%'\n WHEN adoption_pct < 75 THEN '50-75%'\n ELSE '>75%'\n END AS tier\n FROM _adoption_weekly\n),\n_pr_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time / 60) AS cycle_time_hrs\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND pr_merged_date IS NOT NULL AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_deploy_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_cfr_weekly AS (\n SELECT\n week_start,\n ROUND(failed_deploys * 100.0 / NULLIF(deploy_count, 0), 1) AS cfr_pct\n FROM _deploy_weekly\n),\n_mttr_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_tier_metrics AS (\n SELECT\n at.tier,\n ROUND(AVG(pw.cycle_time_hrs), 1) AS pr_cycle_time,\n ROUND(AVG(dw.deploy_count), 1) AS deploy_freq,\n ROUND(AVG(cfr.cfr_pct), 1) AS cfr_pct,\n ROUND(AVG(mttr.mttr_hours), 1) AS mttr_hours\n FROM _adoption_tiers at\n LEFT JOIN _pr_weekly pw ON at.week_start = pw.week_start\n LEFT JOIN _deploy_weekly dw ON at.week_start = dw.week_start\n LEFT JOIN _cfr_weekly cfr ON at.week_start = cfr.week_start\n LEFT JOIN _mttr_weekly mttr ON at.week_start = mttr.week_start\n GROUP BY at.tier\n)\nSELECT\n tier AS 'Adoption Tier',\n COALESCE(pr_cycle_time, 0) AS 'PR Cycle Time (hrs)',\n COALESCE(deploy_freq, 0) AS 'Deploys/Week',\n COALESCE(cfr_pct, 0) AS 'CFR %',\n COALESCE(mttr_hours, 0) AS 'MTTR (hours)'\nFROM _tier_metrics\nORDER BY FIELD(tier, '<25%', '25-50%', '50-75%', '>75%')","refId":"A"}],"title":"DORA Metrics by Adoption Tier","type":"table"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":54},"id":300,"panels":[],"title":"Change Failure Rate Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and Change Failure Rate over time. CFR should decrease (improve) as adoption increases if Copilot improves code quality.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"CFR %"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"red","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":55},"id":41,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n ROUND(dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0), 1) AS 'CFR %'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Change Failure Rate","type":"timeseries"},{"datasource":"mysql","description":"Change Failure Rate grouped by GitHub Copilot adoption tier. Lower CFR at higher adoption indicates Copilot improves code quality and reduces failures.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":10},{"color":"red","value":15}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":55},"id":42,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"CFR %"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)), 1) AS 'CFR %'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"CFR by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and Change Failure Rate. NEGATIVE values are good - they indicate higher adoption correlates with lower failure rates.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":55},"id":43,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n (dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)) AS cfr_pct\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n WHERE dw.total_deploys > 0\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * cfr_pct) - SUM(adoption_pct) * SUM(cfr_pct)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(cfr_pct * cfr_pct) - POW(SUM(cfr_pct), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs CFR (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in Change Failure Rate between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate improvement.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-10},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":59},"id":44,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_adoption_cfr AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n (dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)) AS cfr_pct\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n WHERE dw.total_deploys > 0\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(cfr_pct) AS avg_cfr\n FROM _adoption_cfr\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_cfr FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_cfr FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_cfr FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"CFR Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":63},"id":400,"panels":[],"title":"Recovery Time (MTTR) Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and Mean Time to Recovery (MTTR) over time. MTTR should decrease (improve) as adoption increases if Copilot helps faster incident resolution.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"MTTR (hours)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"purple","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":64},"id":51,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(adoption_pct, 1) AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"Adoption"},{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(mttr_hours, 1) AS 'MTTR (hours)'\nFROM _incidents_weekly\nORDER BY week_start","refId":"MTTR"}],"title":"Adoption vs MTTR","type":"timeseries"},{"datasource":"mysql","description":"Mean Time to Recovery grouped by GitHub Copilot adoption tier. Lower MTTR at higher adoption indicates Copilot helps faster incident resolution.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":72}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":64},"id":52,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"MTTR (hours)"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(iw.mttr_hours), 1) AS 'MTTR (hours)'\nFROM _adoption_weekly aw\nLEFT JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\nWHERE iw.mttr_hours IS NOT NULL\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"MTTR by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and MTTR. NEGATIVE values are good - they indicate higher adoption correlates with faster recovery.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":64},"id":53,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n iw.mttr_hours\n FROM _adoption_weekly aw\n INNER JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * mttr_hours) - SUM(adoption_pct) * SUM(mttr_hours)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(mttr_hours * mttr_hours) - POW(SUM(mttr_hours), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs MTTR (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in MTTR between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate faster recovery.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-20},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":68},"id":54,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_adoption_mttr AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n iw.mttr_hours\n FROM _adoption_weekly aw\n INNER JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(mttr_hours) AS avg_mttr\n FROM _adoption_mttr\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_mttr FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_mttr FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_mttr FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"MTTR Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":72},"id":500,"panels":[],"title":"Code Review Time Impact","type":"row"},{"datasource":"mysql","description":"Code review time (time from first review request to merge) grouped by GitHub Copilot adoption tier. Shorter review times at higher adoption may indicate Copilot-assisted code is easier to review.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":48}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":73},"id":61,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"Review Time (hours)"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(prw.avg_review_time_hours), 1) AS 'Review Time (hours)'\nFROM _adoption_weekly aw\nLEFT JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\nWHERE prw.avg_review_time_hours IS NOT NULL\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"Review Time by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption % and average code review time over time. Look for patterns indicating whether Copilot-assisted PRs get reviewed faster.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"Review Time (h)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"green","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":73},"id":62,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n ROUND(prw.avg_review_time_hours, 1) AS 'Review Time (h)'\nFROM _adoption_weekly aw\nLEFT JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Review Time Trend","type":"timeseries"},{"datasource":"mysql","description":"Percentage change in code review time between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate faster reviews.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-10},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":77},"id":63,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_review AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n prw.avg_review_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(avg_review_time_hours) AS avg_review\n FROM _adoption_review\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_review FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_review FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_review FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"Review Time Change (High vs Low Adoption)","type":"stat"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and code review time. NEGATIVE values indicate higher adoption correlates with faster reviews.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":73},"id":64,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n prw.avg_review_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * avg_review_time_hours) - SUM(adoption_pct) * SUM(avg_review_time_hours)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(avg_review_time_hours * avg_review_time_hours) - POW(SUM(avg_review_time_hours), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs Review Time (r)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":81},"id":600,"panels":[],"title":"Code Quality Impact (Optional - Requires SonarQube)","type":"row"},{"datasource":"mysql","description":"Bug count per file by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":1},{"color":"red","value":5}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":0,"y":82},"id":80,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_adoption_tiers AS (\n SELECT\n week_start,\n CASE\n WHEN adoption_pct < 25 THEN '<25%'\n WHEN adoption_pct < 50 THEN '25-50%'\n WHEN adoption_pct < 75 THEN '50-75%'\n ELSE '>75%'\n END AS tier\n FROM _adoption_weekly\n)\nSELECT 'N/A - Configure SonarQube' AS Tier, 0 AS 'Bugs/File'\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Bugs per File by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code smell count per file by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":5},{"color":"red","value":20}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":6,"y":82},"id":81,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS 'Code Smells/File'\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Code Smells by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code complexity by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":10},{"color":"red","value":25}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":12,"y":82},"id":82,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS Complexity\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Complexity by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code coverage percentage by GitHub Copilot adoption tier. Higher is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"max":100,"min":0,"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":50},{"color":"green","value":80}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":6,"w":6,"x":18,"y":82},"id":83,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS Coverage\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Coverage by Adoption","type":"bargauge"}],"refresh":"","schemaVersion":38,"tags":["copilot","devlake","impact","dora"],"templating":{"list":[{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY 1","hide":0,"includeAll":false,"label":"Connection ID","multi":false,"name":"connection_id","options":[],"query":"SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY connection_id DESC","refresh":1,"regex":"","skipUrlSync":false,"sort":0,"type":"query"},{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${connection_id}' AS UNSIGNED) ORDER BY 1","hide":0,"includeAll":false,"label":"Scope ID (Organization)","multi":false,"name":"scope_id","options":[],"query":"SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${connection_id}' AS UNSIGNED) ORDER BY 1","refresh":2,"regex":"","skipUrlSync":false,"sort":0,"type":"query"},{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT project_name FROM project_pr_metrics ORDER BY 1","hide":0,"includeAll":false,"label":"Project","multi":false,"name":"project","options":[],"query":"SELECT DISTINCT project_name FROM project_pr_metrics ORDER BY 1","refresh":1,"regex":"","skipUrlSync":false,"sort":1,"type":"query"},{"current":{"selected":false,"text":"2023","value":"2023"},"hide":0,"includeAll":false,"label":"DORA Report","multi":false,"name":"dora_report","options":[{"selected":false,"text":"2021","value":"2021"},{"selected":true,"text":"2023","value":"2023"}],"query":"2021, 2023","skipUrlSync":false,"type":"custom"}]},"time":{"from":"now-90d","to":"now"},"timepicker":{},"timezone":"utc","title":"GitHub Copilot + DORA Correlation","uid":"copilot_impact","version":1,"weekStart":""} \ No newline at end of file +{"annotations":{"list":[{"builtIn":1,"datasource":{"type":"datasource","uid":"grafana"},"enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"},{"datasource":"mysql","enable":true,"hide":false,"iconColor":"purple","name":"Copilot Implementation Date","rawQuery":"SELECT\n UNIX_TIMESTAMP(implementation_date) * 1000 AS time,\n 'Copilot Rollout' AS text,\n 'Implementation Date' AS title\nFROM _tool_copilot_scopes\nWHERE id = '${scope_id}'\n AND implementation_date IS NOT NULL","type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"links":[],"liveNow":false,"panels":[{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":5,"w":24,"x":0,"y":0},"id":1,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"## GitHub Copilot + DORA Correlation Dashboard\n\n**Purpose**: Analyze the **correlation** between GitHub Copilot adoption levels and engineering productivity metrics.\n\n**How it works**:\n- \ud83d\udcc8 **Primary Analysis**: Continuous correlation showing how DORA metrics trend alongside GitHub Copilot adoption intensity\n- \ud83d\udcca **Adoption Tiers**: Metrics grouped by adoption level (<25%, 25-50%, 50-75%, >75% of seats active)\n- \ud83d\udccd **Optional Milestone**: Configure a rollout date to add annotation markers on charts\n\n**Prerequisites**:\n- Ensure **GitHub Copilot metrics** are being collected via the GitHub Copilot plugin\n- Ensure **PR data** exists in DevLake from GitHub/GitLab plugins\n- For DORA metrics (CFR, MTTR): Configure deployments and incidents\n- For Code Quality: Configure SonarQube integration (optional)\n\n**\u26a0\ufe0f Disclaimer**: Correlation does not imply causation. Other factors may influence the metrics shown.","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"Dashboard Introduction","type":"text"},{"datasource":"mysql","description":"Weekly GitHub Copilot adoption percentage (active users / total seats) over time. Higher adoption correlates with expected productivity improvements.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"Adoption %","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":20,"gradientMode":"scheme","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"max":100,"min":0,"thresholds":{"mode":"absolute","steps":[{"color":"blue","value":null},{"color":"green","value":50}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":12,"x":0,"y":14},"id":2,"options":{"legend":{"calcs":["mean","lastNotNull"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, active_users, total_seats,\n ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n ROUND(AVG(adoption_pct), 1) AS adoption_pct,\n ROUND(AVG(active_users), 0) AS avg_active_users,\n ROUND(AVG(total_seats), 0) AS avg_total_seats\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n adoption_pct AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"A"}],"title":"GitHub Copilot Adoption Trend","type":"timeseries"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and PR cycle time. Negative values indicate inverse correlation (higher adoption \u2192 faster PRs). |r| > 0.7 = strong, 0.3-0.7 = moderate, < 0.3 = weak.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"from":-1,"result":{"color":"green","index":0,"text":"Strong \u2193"},"to":-0.7},"type":"range"},{"options":{"from":-0.7,"result":{"color":"yellow","index":1,"text":"Moderate \u2193"},"to":-0.3},"type":"range"},{"options":{"from":-0.3,"result":{"color":"text","index":2,"text":"Weak"},"to":0.3},"type":"range"},{"options":{"from":0.3,"result":{"color":"orange","index":3,"text":"Moderate \u2191"},"to":0.7},"type":"range"},{"options":{"from":0.7,"result":{"color":"red","index":4,"text":"Strong \u2191"},"to":1},"type":"range"}],"noValue":"\u26a0\ufe0f Insufficient data (need 4+ weeks)","thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]},"unit":"none","decimals":2},"overrides":[]},"gridPos":{"h":8,"w":4,"x":20,"y":31},"id":3,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value_and_name","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_correlation_data AS (\n SELECT\n aw.week_start,\n aw.adoption_pct,\n pm.avg_cycle_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\n WHERE aw.adoption_pct IS NOT NULL AND pm.avg_cycle_time_hours IS NOT NULL\n),\n_stats AS (\n SELECT\n COUNT(*) AS n,\n AVG(adoption_pct) AS mean_x,\n AVG(avg_cycle_time_hours) AS mean_y,\n STDDEV_POP(adoption_pct) AS stddev_x,\n STDDEV_POP(avg_cycle_time_hours) AS stddev_y\n FROM _correlation_data\n),\n_pearson AS (\n SELECT\n CASE\n WHEN s.n < 4 THEN NULL\n WHEN s.stddev_x = 0 OR s.stddev_y = 0 THEN 0\n ELSE (\n SELECT\n SUM((cd.adoption_pct - s.mean_x) * (cd.avg_cycle_time_hours - s.mean_y)) / (s.n * s.stddev_x * s.stddev_y)\n FROM _correlation_data cd\n )\n END AS r\n FROM _stats s\n)\nSELECT ROUND(r, 2) AS value FROM _pearson","refId":"A"}],"title":"Adoption vs PR Cycle Time (r)","type":"stat"},{"datasource":"mysql","description":"Current week's GitHub Copilot adoption percentage (active users / total seats)","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"noValue":"No data","thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":25},{"color":"green","value":50},{"color":"dark-green","value":75}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":18,"y":14},"id":5,"options":{"colorMode":"value","graphMode":"area","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS value\nFROM (\n SELECT daily_active_users AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ORDER BY day DESC LIMIT 1\n) _ent\nUNION ALL\nSELECT ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS value\nFROM (\n SELECT total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ORDER BY date DESC LIMIT 1\n) _org\nLIMIT 1","refId":"A"}],"title":"Current Adoption %","type":"stat"},{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":8,"w":6,"x":12,"y":10},"id":6,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"### Interpreting Correlation (r)\n\n| Value | Meaning |\n|-------|--------|\n| **-1 to -0.7** | \ud83d\udfe2 Strong inverse (higher adoption \u2192 faster PRs) |\n| **-0.7 to -0.3** | \ud83d\udfe1 Moderate inverse |\n| **-0.3 to 0.3** | \u26aa Weak/No correlation |\n| **0.3 to 0.7** | \ud83d\udfe0 Moderate positive |\n| **0.7 to 1** | \ud83d\udd34 Strong positive (unexpected) |\n\n*Note: r < 0 is expected (adoption \u2191 = cycle time \u2193)*","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"\ud83d\udcca How to Read Correlation","type":"text"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":30},"id":100,"panels":[],"title":"PR Velocity Impact","type":"row"},{"datasource":"mysql","description":"Percentage difference in PR cycle time between high adoption weeks (>50%) and low adoption weeks (<50%). Negative values indicate improvement (faster PRs during high adoption).","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"noValue":"\u26a0\ufe0f Insufficient data","thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":0},{"color":"red","value":10}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":4,"x":16,"y":31},"id":4,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"value","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_pr_joined AS (\n SELECT\n aw.week_start,\n aw.adoption_pct,\n pm.avg_cycle_time_hours,\n CASE\n WHEN aw.adoption_pct >= 50 THEN 'high'\n WHEN aw.adoption_pct < 50 THEN 'low'\n END AS adoption_tier\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\n),\n_tier_averages AS (\n SELECT\n adoption_tier,\n AVG(avg_cycle_time_hours) AS avg_cycle_time\n FROM _adoption_pr_joined\n GROUP BY adoption_tier\n)\nSELECT\n ROUND(\n ((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'high') -\n (SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low')) /\n NULLIF((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low'), 0) * 100,\n 1\n ) AS value","refId":"A"}],"title":"PR Cycle Time Change (High vs Low Adoption)","type":"stat"},{"datasource":"mysql","description":"Dual-axis chart showing weekly GitHub Copilot adoption % (left axis) and PR cycle time in hours (right axis). Look for inverse correlation - adoption up, cycle time down.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"max","value":100},{"id":"min","value":0}]},{"matcher":{"id":"byName","options":"PR Cycle Time (hrs)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"orange","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":31},"id":10,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(adoption_pct, 1) AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"Adoption"},{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(avg_cycle_time_hours, 1) AS 'PR Cycle Time (hrs)'\nFROM _pr_metrics_weekly\nORDER BY week_start","refId":"PRTime"}],"title":"Adoption vs PR Cycle Time","type":"timeseries"},{"datasource":"mysql","description":"Average PR cycle time by adoption tier. Lower times in higher adoption tiers suggest positive Copilot impact.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":48}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":4,"x":12,"y":31},"id":14,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":16,"minVizWidth":8,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"metric","valueField":"value"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_pr_joined AS (\n SELECT\n aw.adoption_pct,\n pm.avg_cycle_time_hours,\n CASE\n WHEN aw.adoption_pct < 25 THEN '1. <25%'\n WHEN aw.adoption_pct < 50 THEN '2. 25-50%'\n WHEN aw.adoption_pct < 75 THEN '3. 50-75%'\n WHEN aw.adoption_pct >= 75 THEN '4. >75%'\n END AS adoption_tier\n FROM _adoption_weekly aw\n INNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start WHERE aw.adoption_pct IS NOT NULL\n)\nSELECT\n adoption_tier AS metric,\n ROUND(AVG(avg_cycle_time_hours), 1) AS value\nFROM _adoption_pr_joined\nGROUP BY adoption_tier\nORDER BY adoption_tier","refId":"A"}],"title":"PR Cycle Time by Adoption Tier","type":"bargauge"},{"datasource":{"type":"datasource","uid":"grafana"},"gridPos":{"h":6,"w":4,"x":12,"y":35},"id":15,"options":{"code":{"language":"plaintext","showLineNumbers":false,"showMiniMap":false},"content":"**Cycle Time Components** break down PR lifecycle into three phases:\n\n- **Coding Time**: PR creation \u2192 first commit (development speed)\n- **Pickup Time**: PR creation \u2192 first review (reviewer responsiveness)\n- **Review Time**: First review \u2192 merge (actual review duration)\n\nComparing <50% vs \u226550% adoption periods shows which phase improved most with Copilot. For example, if Coding Time shrinks significantly, Copilot accelerates development.","mode":"markdown"},"pluginVersion":"11.0.0","targets":[{"datasource":{"type":"datasource","uid":"grafana"},"queryType":"randomWalk","refId":"A"}],"title":"Understanding Cycle Time Breakdown","type":"text"},{"datasource":"mysql","description":"Scatter plot showing weekly data points. Each point = one week. X-axis = adoption %, Y-axis = PR cycle time. Downward trend line indicates positive Copilot impact.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"Adoption %","axisPlacement":"auto","hideFrom":{"legend":false,"tooltip":false,"viz":false},"pointSize":{"fixed":10},"scaleDistribution":{"type":"linear"},"show":"points"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[]},"gridPos":{"h":6,"w":12,"x":0,"y":35},"id":11,"options":{"dims":{"x":"adoption_pct"},"legend":{"calcs":[],"displayMode":"list","placement":"bottom","showLegend":false},"series":[],"seriesMapping":"auto","tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_metrics_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n ROUND(aw.adoption_pct, 1) AS adoption_pct,\n ROUND(pm.avg_cycle_time_hours, 1) AS cycle_time_hours\nFROM _adoption_weekly aw\nINNER JOIN _pr_metrics_weekly pm ON aw.week_start = pm.week_start\nORDER BY aw.adoption_pct","refId":"A"}],"title":"Adoption vs PR Cycle Time (Scatter)","type":"xychart"},{"datasource":"mysql","description":"PR cycle time breakdown during low adoption periods (<50%). Compare with high adoption to see which components improved.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"mappings":[],"unit":"h"},"overrides":[]},"gridPos":{"h":6,"w":4,"x":16,"y":35},"id":12,"options":{"displayLabels":["name","percent"],"legend":{"displayMode":"table","placement":"right","showLegend":true,"values":["value"]},"pieType":"pie","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_low_adoption_weeks AS (\n SELECT week_start FROM _adoption_weekly WHERE adoption_pct < 50\n)\nSELECT\n 'Coding Time' AS component,\n ROUND(AVG(pr_coding_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)\nUNION ALL\nSELECT\n 'Pickup Time' AS component,\n ROUND(AVG(pr_pickup_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)\nUNION ALL\nSELECT\n 'Review Time' AS component,\n ROUND(AVG(pr_review_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _low_adoption_weeks)","refId":"A"}],"title":"Cycle Time Components: Low Adoption","type":"piechart"},{"datasource":"mysql","description":"PR cycle time breakdown during high adoption periods (>=50%). Compare with low adoption to see which components improved.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"mappings":[],"unit":"h"},"overrides":[]},"gridPos":{"h":6,"w":4,"x":20,"y":35},"id":13,"options":{"displayLabels":["name","percent"],"legend":{"displayMode":"table","placement":"right","showLegend":true,"values":["value"]},"pieType":"pie","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_high_adoption_weeks AS (\n SELECT week_start FROM _adoption_weekly WHERE adoption_pct >= 50\n)\nSELECT\n 'Coding Time' AS component,\n ROUND(AVG(pr_coding_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)\nUNION ALL\nSELECT\n 'Pickup Time' AS component,\n ROUND(AVG(pr_pickup_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)\nUNION ALL\nSELECT\n 'Review Time' AS component,\n ROUND(AVG(pr_review_time) / 60.0, 1) AS value\nFROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) IN (SELECT week_start FROM _high_adoption_weeks)","refId":"A"}],"title":"Cycle Time Components: High Adoption","type":"piechart"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":45},"id":200,"panels":[],"title":"Deployment Frequency Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and deployment frequency over time. Look for correlation patterns - does higher adoption correlate with more frequent deployments?","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"Deployments"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"short"},{"id":"color","value":{"fixedColor":"orange","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":46},"id":31,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n COALESCE(dw.deploy_count, 0) AS 'Deployments'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Deployment Frequency","type":"timeseries"},{"datasource":"mysql","description":"Deployment frequency grouped by GitHub Copilot adoption tier. Higher adoption should correlate with more frequent deployments if Copilot accelerates development velocity.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"yellow","value":null},{"color":"green","value":5}]},"unit":"short"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":46},"id":32,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["sum"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"Deploys/Week"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(COALESCE(dw.deploy_count, 0)), 1) AS 'Deploys/Week'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"Deployments per Week by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and weekly deployment count. Positive values indicate higher adoption correlates with more deployments.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":0.3},{"color":"green","value":0.7}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":46},"id":33,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n COALESCE(dw.deploy_count, 0) AS deploy_count\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * deploy_count) - SUM(adoption_pct) * SUM(deploy_count)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(deploy_count * deploy_count) - POW(SUM(deploy_count), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined\nWHERE adoption_pct IS NOT NULL","refId":"A"}],"title":"Adoption vs Deployment Frequency (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in deployment frequency between low adoption (<50%) and high adoption (\u226550%) periods.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":0},{"color":"green","value":20}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":50},"id":34,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_adoption_deploy AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n COALESCE(dw.deploy_count, 0) AS deploy_count\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(deploy_count) AS avg_deploys\n FROM _adoption_deploy\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_deploys FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_deploys FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_deploys FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"Deployment Frequency Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":5},"id":250,"panels":[],"title":"Adoption Intensity Analysis","type":"row"},{"datasource":"mysql","description":"Comprehensive comparison of all DORA metrics across GitHub Copilot adoption tiers. Lower values (green) are better for cycle time, CFR, and MTTR. Higher values (green) are better for deployment frequency.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"custom":{"align":"auto","cellOptions":{"type":"auto"},"inspect":false},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[]},"gridPos":{"h":8,"w":24,"x":0,"y":6},"id":72,"options":{"cellHeight":"sm","footer":{"countRows":false,"fields":"","reducer":["sum"],"show":false},"showHeader":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_adoption_tiers AS (\n SELECT\n week_start,\n adoption_pct,\n CASE\n WHEN adoption_pct < 25 THEN '<25%'\n WHEN adoption_pct < 50 THEN '25-50%'\n WHEN adoption_pct < 75 THEN '50-75%'\n ELSE '>75%'\n END AS tier\n FROM _adoption_weekly\n),\n_pr_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time / 60) AS cycle_time_hrs\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND pr_merged_date IS NOT NULL AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_deploy_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS deploy_count,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_cfr_weekly AS (\n SELECT\n week_start,\n ROUND(failed_deploys * 100.0 / NULLIF(deploy_count, 0), 1) AS cfr_pct\n FROM _deploy_weekly\n),\n_mttr_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_tier_metrics AS (\n SELECT\n at.tier,\n ROUND(AVG(pw.cycle_time_hrs), 1) AS pr_cycle_time,\n ROUND(AVG(dw.deploy_count), 1) AS deploy_freq,\n ROUND(AVG(cfr.cfr_pct), 1) AS cfr_pct,\n ROUND(AVG(mttr.mttr_hours), 1) AS mttr_hours\n FROM _adoption_tiers at\n LEFT JOIN _pr_weekly pw ON at.week_start = pw.week_start\n LEFT JOIN _deploy_weekly dw ON at.week_start = dw.week_start\n LEFT JOIN _cfr_weekly cfr ON at.week_start = cfr.week_start\n LEFT JOIN _mttr_weekly mttr ON at.week_start = mttr.week_start\n GROUP BY at.tier\n)\nSELECT\n tier AS 'Adoption Tier',\n COALESCE(pr_cycle_time, 0) AS 'PR Cycle Time (hrs)',\n COALESCE(deploy_freq, 0) AS 'Deploys/Week',\n COALESCE(cfr_pct, 0) AS 'CFR %',\n COALESCE(mttr_hours, 0) AS 'MTTR (hours)'\nFROM _tier_metrics\nORDER BY FIELD(tier, '<25%', '25-50%', '50-75%', '>75%')","refId":"A"}],"title":"DORA Metrics by Adoption Tier","type":"table"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":54},"id":300,"panels":[],"title":"Change Failure Rate Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and Change Failure Rate over time. CFR should decrease (improve) as adoption increases if Copilot improves code quality.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"CFR %"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"red","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":55},"id":41,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n ROUND(dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0), 1) AS 'CFR %'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Change Failure Rate","type":"timeseries"},{"datasource":"mysql","description":"Change Failure Rate grouped by GitHub Copilot adoption tier. Lower CFR at higher adoption indicates Copilot improves code quality and reduces failures.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":10},{"color":"red","value":15}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":55},"id":42,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"CFR %"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)), 1) AS 'CFR %'\nFROM _adoption_weekly aw\nLEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"CFR by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and Change Failure Rate. NEGATIVE values are good - they indicate higher adoption correlates with lower failure rates.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":55},"id":43,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n (dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)) AS cfr_pct\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n WHERE dw.total_deploys > 0\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * cfr_pct) - SUM(adoption_pct) * SUM(cfr_pct)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(cfr_pct * cfr_pct) - POW(SUM(cfr_pct), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs CFR (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in Change Failure Rate between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate improvement.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-10},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":59},"id":44,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_deployments_weekly AS (\n SELECT\n DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(*) AS total_deploys,\n SUM(CASE WHEN result = 'FAILURE' THEN 1 ELSE 0 END) AS failed_deploys\n FROM cicd_deployment_commits\n WHERE $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n),\n_adoption_cfr AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n (dw.failed_deploys * 100.0 / NULLIF(dw.total_deploys, 0)) AS cfr_pct\n FROM _adoption_weekly aw\n LEFT JOIN _deployments_weekly dw ON aw.week_start = dw.week_start\n WHERE dw.total_deploys > 0\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(cfr_pct) AS avg_cfr\n FROM _adoption_cfr\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_cfr FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_cfr FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_cfr FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"CFR Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":63},"id":400,"panels":[],"title":"Recovery Time (MTTR) Impact","type":"row"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption percentage and Mean Time to Recovery (MTTR) over time. MTTR should decrease (improve) as adoption increases if Copilot helps faster incident resolution.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"MTTR (hours)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"purple","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":64},"id":51,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(adoption_pct, 1) AS 'Adoption %'\nFROM _adoption_weekly\nORDER BY week_start","refId":"Adoption"},{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n)\nSELECT\n week_start AS time,\n ROUND(mttr_hours, 1) AS 'MTTR (hours)'\nFROM _incidents_weekly\nORDER BY week_start","refId":"MTTR"}],"title":"Adoption vs MTTR","type":"timeseries"},{"datasource":"mysql","description":"Mean Time to Recovery grouped by GitHub Copilot adoption tier. Lower MTTR at higher adoption indicates Copilot helps faster incident resolution.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":72}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":64},"id":52,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"MTTR (hours)"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(iw.mttr_hours), 1) AS 'MTTR (hours)'\nFROM _adoption_weekly aw\nLEFT JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\nWHERE iw.mttr_hours IS NOT NULL\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"MTTR by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and MTTR. NEGATIVE values are good - they indicate higher adoption correlates with faster recovery.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":64},"id":53,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n iw.mttr_hours\n FROM _adoption_weekly aw\n INNER JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * mttr_hours) - SUM(adoption_pct) * SUM(mttr_hours)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(mttr_hours * mttr_hours) - POW(SUM(mttr_hours), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs MTTR (r)","type":"stat"},{"datasource":"mysql","description":"Percentage change in MTTR between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate faster recovery.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-20},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":68},"id":54,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_incidents_weekly AS (\n SELECT\n DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n AVG(TIMESTAMPDIFF(HOUR, created_date, resolution_date)) AS mttr_hours\n FROM issues\n WHERE type = 'INCIDENT'\n AND resolution_date IS NOT NULL\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n),\n_adoption_mttr AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n iw.mttr_hours\n FROM _adoption_weekly aw\n INNER JOIN _incidents_weekly iw ON aw.week_start = iw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(mttr_hours) AS avg_mttr\n FROM _adoption_mttr\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_mttr FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_mttr FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_mttr FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"MTTR Change (High vs Low Adoption)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":72},"id":500,"panels":[],"title":"Code Review Time Impact","type":"row"},{"datasource":"mysql","description":"Code review time (time from first review request to merge) grouped by GitHub Copilot adoption tier. Shorter review times at higher adoption may indicate Copilot-assisted code is easier to review.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":24},{"color":"red","value":48}]},"unit":"h"},"overrides":[]},"gridPos":{"h":8,"w":6,"x":12,"y":73},"id":61,"options":{"displayMode":"gradient","maxVizHeight":300,"minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["mean"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"transformations":[{"id":"rowsToFields","options":{"labelField":"Adoption Tier","valueField":"Review Time (hours)"}}],"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct,\n CASE\n WHEN AVG(adoption_pct) < 25 THEN '1: <25%'\n WHEN AVG(adoption_pct) < 50 THEN '2: 25-50%'\n WHEN AVG(adoption_pct) < 75 THEN '3: 50-75%'\n ELSE '4: >75%'\n END AS adoption_tier\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n aw.adoption_tier AS 'Adoption Tier',\n ROUND(AVG(prw.avg_review_time_hours), 1) AS 'Review Time (hours)'\nFROM _adoption_weekly aw\nLEFT JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\nWHERE prw.avg_review_time_hours IS NOT NULL\nGROUP BY aw.adoption_tier\nORDER BY aw.adoption_tier","refId":"A"}],"title":"Review Time by Adoption Tier","type":"bargauge"},{"datasource":"mysql","description":"Dual-axis chart showing GitHub Copilot adoption % and average code review time over time. Look for patterns indicating whether Copilot-assisted PRs get reviewed faster.","fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":10,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":2,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]}},"overrides":[{"matcher":{"id":"byName","options":"Adoption %"},"properties":[{"id":"custom.axisPlacement","value":"left"},{"id":"unit","value":"percent"},{"id":"color","value":{"fixedColor":"blue","mode":"fixed"}},{"id":"min","value":0},{"id":"max","value":100}]},{"matcher":{"id":"byName","options":"Review Time (h)"},"properties":[{"id":"custom.axisPlacement","value":"right"},{"id":"unit","value":"h"},{"id":"color","value":{"fixedColor":"green","mode":"fixed"}}]}]},"gridPos":{"h":8,"w":12,"x":0,"y":73},"id":62,"options":{"legend":{"calcs":["mean"],"displayMode":"table","placement":"bottom","showLegend":true},"tooltip":{"mode":"multi","sort":"none"}},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"time_series","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n)\nSELECT\n UNIX_TIMESTAMP(aw.week_start) AS time_sec,\n aw.adoption_pct AS 'Adoption %',\n ROUND(prw.avg_review_time_hours, 1) AS 'Review Time (h)'\nFROM _adoption_weekly aw\nLEFT JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\nORDER BY aw.week_start","refId":"A"}],"title":"Adoption vs Review Time Trend","type":"timeseries"},{"datasource":"mysql","description":"Percentage change in code review time between low adoption (<50%) and high adoption (\u226550%) periods. Negative values indicate faster reviews.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-10},{"color":"red","value":0}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":77},"id":63,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_adoption_review AS (\n SELECT\n CASE WHEN aw.adoption_pct < 50 THEN 'low' ELSE 'high' END AS tier,\n prw.avg_review_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\n),\n_tier_avg AS (\n SELECT\n tier,\n AVG(avg_review_time_hours) AS avg_review\n FROM _adoption_review\n GROUP BY tier\n)\nSELECT\n ROUND(\n ((SELECT avg_review FROM _tier_avg WHERE tier = 'high') -\n (SELECT avg_review FROM _tier_avg WHERE tier = 'low')) /\n NULLIF((SELECT avg_review FROM _tier_avg WHERE tier = 'low'), 0) * 100,\n 1\n ) AS change_pct","refId":"A"}],"title":"Review Time Change (High vs Low Adoption)","type":"stat"},{"datasource":"mysql","description":"Pearson correlation coefficient (r) between GitHub Copilot adoption % and code review time. NEGATIVE values indicate higher adoption correlates with faster reviews.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[{"options":{"match":"null","result":{"text":"N/A"}},"type":"special"}],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":-0.3},{"color":"red","value":0}]},"unit":"none"},"overrides":[]},"gridPos":{"h":4,"w":6,"x":18,"y":73},"id":64,"options":{"colorMode":"value","graphMode":"none","justifyMode":"auto","orientation":"auto","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showPercentChange":false,"textMode":"auto","wideLayout":true},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(day)\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}' AND $__timeFilter(date)\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_pr_review_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_review_time) / 60.0 AS avg_review_time_hours\n FROM project_pr_metrics\n WHERE project_name = ${project:sqlstring}\n AND $__timeFilter(pr_merged_date)\n AND pr_review_time > 0\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_joined AS (\n SELECT\n aw.adoption_pct,\n prw.avg_review_time_hours\n FROM _adoption_weekly aw\n INNER JOIN _pr_review_weekly prw ON aw.week_start = prw.week_start\n)\nSELECT\n ROUND(\n (COUNT(*) * SUM(adoption_pct * avg_review_time_hours) - SUM(adoption_pct) * SUM(avg_review_time_hours)) /\n NULLIF(\n SQRT(\n (COUNT(*) * SUM(adoption_pct * adoption_pct) - POW(SUM(adoption_pct), 2)) *\n (COUNT(*) * SUM(avg_review_time_hours * avg_review_time_hours) - POW(SUM(avg_review_time_hours), 2))\n ),\n 0\n ),\n 2\n ) AS correlation_r\nFROM _joined","refId":"A"}],"title":"Adoption vs Review Time (r)","type":"stat"},{"collapsed":false,"gridPos":{"h":1,"w":24,"x":0,"y":81},"id":600,"panels":[],"title":"Code Quality Impact (Optional - Requires SonarQube)","type":"row"},{"datasource":"mysql","description":"Bug count per file by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":1},{"color":"red","value":5}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":0,"y":82},"id":80,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"WITH _copilot_adoption AS (\n SELECT metric_date, ROUND(active_users * 100.0 / NULLIF(total_seats, 0), 1) AS adoption_pct\n FROM (\n SELECT day AS metric_date, SUM(daily_active_users) AS active_users,\n (SELECT COUNT(*) FROM _tool_copilot_seats s WHERE s.connection_id = ${connection_id}\n AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes sc\n WHERE sc.connection_id = ${connection_id} AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n GROUP BY day\n UNION ALL\n SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats\n FROM _tool_copilot_org_daily_metrics\n WHERE connection_id = ${connection_id} AND scope_id = '${scope_id}'\n ) _unified),\n_adoption_weekly AS (\n SELECT\n DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY) AS week_start,\n AVG(adoption_pct) AS adoption_pct\n FROM _copilot_adoption\n GROUP BY DATE_SUB(metric_date, INTERVAL WEEKDAY(metric_date) DAY)\n),\n_adoption_tiers AS (\n SELECT\n week_start,\n CASE\n WHEN adoption_pct < 25 THEN '<25%'\n WHEN adoption_pct < 50 THEN '25-50%'\n WHEN adoption_pct < 75 THEN '50-75%'\n ELSE '>75%'\n END AS tier\n FROM _adoption_weekly\n)\nSELECT 'N/A - Configure SonarQube' AS Tier, 0 AS 'Bugs/File'\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Bugs per File by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code smell count per file by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":5},{"color":"red","value":20}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":6,"y":82},"id":81,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS 'Code Smells/File'\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Code Smells by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code complexity by GitHub Copilot adoption tier. Lower is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"yellow","value":10},{"color":"red","value":25}]}},"overrides":[]},"gridPos":{"h":6,"w":6,"x":12,"y":82},"id":82,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS Complexity\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Complexity by Adoption","type":"bargauge"},{"datasource":"mysql","description":"Code coverage percentage by GitHub Copilot adoption tier. Higher is better. Requires SonarQube integration.","fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"mappings":[],"max":100,"min":0,"thresholds":{"mode":"absolute","steps":[{"color":"red","value":null},{"color":"yellow","value":50},{"color":"green","value":80}]},"unit":"percent"},"overrides":[]},"gridPos":{"h":6,"w":6,"x":18,"y":82},"id":83,"options":{"displayMode":"gradient","minVizHeight":10,"minVizWidth":0,"namePlacement":"auto","orientation":"horizontal","reduceOptions":{"calcs":["lastNotNull"],"fields":"","values":false},"showUnfilled":true,"sizing":"auto","valueMode":"color"},"pluginVersion":"11.0.0","targets":[{"datasource":"mysql","format":"table","rawQuery":true,"rawSql":"SELECT 'N/A - Configure SonarQube' AS Tier, 0 AS Coverage\nFROM (SELECT 1) AS d\nWHERE NOT EXISTS (SELECT 1 FROM cq_file_metrics LIMIT 1)","refId":"A"}],"title":"Coverage by Adoption","type":"bargauge"}],"refresh":"","schemaVersion":38,"tags":["copilot","devlake","impact","dora"],"templating":{"list":[{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY 1","hide":0,"includeAll":false,"label":"Connection ID","multi":false,"name":"connection_id","options":[],"query":"SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY connection_id DESC","refresh":1,"regex":"","skipUrlSync":false,"sort":0,"type":"query"},{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${connection_id}' AS UNSIGNED) ORDER BY 1","hide":0,"includeAll":false,"label":"Scope ID (Organization)","multi":false,"name":"scope_id","options":[],"query":"SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${connection_id}' AS UNSIGNED) ORDER BY 1","refresh":2,"regex":"","skipUrlSync":false,"sort":0,"type":"query"},{"current":{"selected":false,"text":"","value":""},"datasource":"mysql","definition":"SELECT DISTINCT project_name FROM project_pr_metrics ORDER BY 1","hide":0,"includeAll":false,"label":"Project","multi":false,"name":"project","options":[],"query":"SELECT DISTINCT project_name FROM project_pr_metrics ORDER BY 1","refresh":1,"regex":"","skipUrlSync":false,"sort":1,"type":"query"},{"current":{"selected":false,"text":"2023","value":"2023"},"hide":0,"includeAll":false,"label":"DORA Report","multi":false,"name":"dora_report","options":[{"selected":false,"text":"2021","value":"2021"},{"selected":true,"text":"2023","value":"2023"}],"query":"2021, 2023","skipUrlSync":false,"type":"custom"}]},"time":{"from":"now-90d","to":"now"},"timepicker":{},"timezone":"utc","title":"GitHub Copilot + DORA Correlation","uid":"copilot_impact","version":1,"weekStart":""} \ No newline at end of file diff --git a/grafana/dashboards/postgresql/github-copilot-dora-correlation.json b/grafana/dashboards/postgresql/github-copilot-dora-correlation.json index 847f4ec7ead..25bd4dcaabe 100644 --- a/grafana/dashboards/postgresql/github-copilot-dora-correlation.json +++ b/grafana/dashboards/postgresql/github-copilot-dora-correlation.json @@ -460,7 +460,7 @@ "datasource": {"type": "grafana-postgresql-datasource", "uid": "devlake-postgres-api"}, "format": "table", "rawQuery": true, - "rawSql": "WITH _copilot_adoption AS (SELECT metric_date, ROUND(CAST(active_users * 100.0 AS NUMERIC) / NULLIF(NULLIF(total_seats, 0), 0), 1) AS adoption_pct FROM (SELECT day AS metric_date, SUM(daily_active_users) AS active_users, (SELECT COUNT(*) FROM _tool_copilot_seats AS s WHERE ('${connection_id}' = '' OR s.connection_id::text = '${connection_id}') AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes AS sc WHERE ('${connection_id}' = '' OR sc.connection_id::text = '${connection_id}') AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats FROM _tool_copilot_enterprise_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(day) GROUP BY day UNION ALL SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats FROM _tool_copilot_org_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(date)) AS _unified), _adoption_weekly AS (SELECT metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day' AS week_start, AVG(adoption_pct) AS adoption_pct FROM _copilot_adoption GROUP BY metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day'), _pr_metrics_weekly AS (SELECT CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day' AS week_start, CAST(AVG(pr_cycle_time) AS NUMERIC) / NULLIF(60.0, 0) AS avg_cycle_time_hours FROM project_pr_metrics WHERE ('${project:sqlstring}' = '' OR project_name::text = '${project:sqlstring}') AND $__timeFilter(pr_merged_date) GROUP BY CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day'), _adoption_pr_joined AS (SELECT aw.week_start, aw.adoption_pct, pm.avg_cycle_time_hours, CASE WHEN aw.adoption_pct >= 50 THEN 'high' ELSE 'low' END AS adoption_tier FROM _adoption_weekly AS aw INNER JOIN _pr_metrics_weekly AS pm ON aw.week_start = pm.week_start), _tier_averages AS (SELECT adoption_tier, AVG(avg_cycle_time_hours) AS avg_cycle_time FROM _adoption_pr_joined GROUP BY adoption_tier) SELECT ROUND(CAST(((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'high') - (SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low')) AS NUMERIC) / NULLIF(NULLIF((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low'), 0), 0) * 100, 1) AS value", + "rawSql": "WITH _copilot_adoption AS (SELECT metric_date, ROUND(CAST(active_users * 100.0 AS NUMERIC) / NULLIF(NULLIF(total_seats, 0), 0), 1) AS adoption_pct FROM (SELECT day AS metric_date, SUM(daily_active_users) AS active_users, (SELECT COUNT(*) FROM _tool_copilot_seats AS s WHERE ('${connection_id}' = '' OR s.connection_id::text = '${connection_id}') AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes AS sc WHERE ('${connection_id}' = '' OR sc.connection_id::text = '${connection_id}') AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats FROM _tool_copilot_enterprise_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(day) GROUP BY day UNION ALL SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats FROM _tool_copilot_org_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(date)) AS _unified), _adoption_weekly AS (SELECT metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day' AS week_start, AVG(adoption_pct) AS adoption_pct FROM _copilot_adoption GROUP BY metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day'), _pr_metrics_weekly AS (SELECT CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day' AS week_start, CAST(AVG(pr_cycle_time) AS NUMERIC) / NULLIF(60.0, 0) AS avg_cycle_time_hours FROM project_pr_metrics WHERE ('${project:sqlstring}' = '' OR project_name::text = '${project:sqlstring}') AND $__timeFilter(pr_merged_date) GROUP BY CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day'), _adoption_pr_joined AS (SELECT aw.week_start, aw.adoption_pct, pm.avg_cycle_time_hours, CASE WHEN aw.adoption_pct >= 50 THEN 'high' WHEN aw.adoption_pct < 50 THEN 'low' END AS adoption_tier FROM _adoption_weekly AS aw INNER JOIN _pr_metrics_weekly AS pm ON aw.week_start = pm.week_start WHERE aw.adoption_pct IS NOT NULL), _tier_averages AS (SELECT adoption_tier, AVG(avg_cycle_time_hours) AS avg_cycle_time FROM _adoption_pr_joined GROUP BY adoption_tier) SELECT ROUND(CAST(((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'high') - (SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low')) AS NUMERIC) / NULLIF(NULLIF((SELECT avg_cycle_time FROM _tier_averages WHERE adoption_tier = 'low'), 0), 0) * 100, 1) AS value", "refId": "A" } ], @@ -686,7 +686,7 @@ "datasource": {"type": "grafana-postgresql-datasource", "uid": "devlake-postgres-api"}, "format": "table", "rawQuery": true, - "rawSql": "WITH _copilot_adoption AS (SELECT metric_date, ROUND(CAST(active_users * 100.0 AS NUMERIC) / NULLIF(NULLIF(total_seats, 0), 0), 1) AS adoption_pct FROM (SELECT day AS metric_date, SUM(daily_active_users) AS active_users, (SELECT COUNT(*) FROM _tool_copilot_seats AS s WHERE ('${connection_id}' = '' OR s.connection_id::text = '${connection_id}') AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes AS sc WHERE ('${connection_id}' = '' OR sc.connection_id::text = '${connection_id}') AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats FROM _tool_copilot_enterprise_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(day) GROUP BY day UNION ALL SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats FROM _tool_copilot_org_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(date)) AS _unified), _adoption_weekly AS (SELECT metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day' AS week_start, AVG(adoption_pct) AS adoption_pct FROM _copilot_adoption GROUP BY metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day'), _pr_metrics_weekly AS (SELECT CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day' AS week_start, CAST(AVG(pr_cycle_time) AS NUMERIC) / NULLIF(60.0, 0) AS avg_cycle_time_hours FROM project_pr_metrics WHERE ('${project:sqlstring}' = '' OR project_name::text = '${project:sqlstring}') AND $__timeFilter(pr_merged_date) GROUP BY CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day'), _adoption_pr_joined AS (SELECT aw.adoption_pct, pm.avg_cycle_time_hours, CASE WHEN aw.adoption_pct < 25 THEN '1. <25%' WHEN aw.adoption_pct < 50 THEN '2. 25-50%' WHEN aw.adoption_pct < 75 THEN '3. 50-75%' ELSE '4. >75%' END AS adoption_tier FROM _adoption_weekly AS aw INNER JOIN _pr_metrics_weekly AS pm ON aw.week_start = pm.week_start) SELECT adoption_tier AS metric, ROUND(CAST(AVG(avg_cycle_time_hours) AS DECIMAL), 1) AS value FROM _adoption_pr_joined GROUP BY adoption_tier ORDER BY adoption_tier NULLS FIRST", + "rawSql": "WITH _copilot_adoption AS (SELECT metric_date, ROUND(CAST(active_users * 100.0 AS NUMERIC) / NULLIF(NULLIF(total_seats, 0), 0), 1) AS adoption_pct FROM (SELECT day AS metric_date, SUM(daily_active_users) AS active_users, (SELECT COUNT(*) FROM _tool_copilot_seats AS s WHERE ('${connection_id}' = '' OR s.connection_id::text = '${connection_id}') AND COALESCE(s.organization, '') = COALESCE((SELECT sc.organization FROM _tool_copilot_scopes AS sc WHERE ('${connection_id}' = '' OR sc.connection_id::text = '${connection_id}') AND sc.id = '${scope_id}' LIMIT 1), '')) AS total_seats FROM _tool_copilot_enterprise_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(day) GROUP BY day UNION ALL SELECT date AS metric_date, total_active_users AS active_users, seat_total AS total_seats FROM _tool_copilot_org_daily_metrics WHERE ('${connection_id}' = '' OR connection_id::text = '${connection_id}') AND scope_id = '${scope_id}' AND $__timeFilter(date)) AS _unified), _adoption_weekly AS (SELECT metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day' AS week_start, AVG(adoption_pct) AS adoption_pct FROM _copilot_adoption GROUP BY metric_date - (EXTRACT(ISODOW FROM metric_date) - 1) * INTERVAL '1 day'), _pr_metrics_weekly AS (SELECT CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day' AS week_start, CAST(AVG(pr_cycle_time) AS NUMERIC) / NULLIF(60.0, 0) AS avg_cycle_time_hours FROM project_pr_metrics WHERE ('${project:sqlstring}' = '' OR project_name::text = '${project:sqlstring}') AND $__timeFilter(pr_merged_date) GROUP BY CAST(pr_merged_date AS DATE) - (EXTRACT(ISODOW FROM CAST(pr_merged_date AS DATE)) - 1) * INTERVAL '1 day'), _adoption_pr_joined AS (SELECT aw.adoption_pct, pm.avg_cycle_time_hours, CASE WHEN aw.adoption_pct < 25 THEN '1. <25%' WHEN aw.adoption_pct < 50 THEN '2. 25-50%' WHEN aw.adoption_pct < 75 THEN '3. 50-75%' WHEN aw.adoption_pct >= 75 THEN '4. >75%' END AS adoption_tier FROM _adoption_weekly AS aw INNER JOIN _pr_metrics_weekly AS pm ON aw.week_start = pm.week_start WHERE aw.adoption_pct IS NOT NULL) SELECT adoption_tier AS metric, ROUND(CAST(AVG(avg_cycle_time_hours) AS DECIMAL), 1) AS value FROM _adoption_pr_joined GROUP BY adoption_tier ORDER BY adoption_tier NULLS FIRST", "refId": "A" } ], @@ -695,7 +695,7 @@ }, { "datasource": { - "type": "datasource", + "type": "datasource"INNER JOIN _pr_metrics_weekly AS pm ON aw.week_start = pm.week_start WHERE aw.adoption_pct IS NOT NULL) SELECT adoption_tier AS metric "uid": "grafana" }, "gridPos": {