Chat-Magics — Usage Dashboard

Inventory of %magic commands defined in msdata/A365/chat-magics with production usage from Kusto.
⚠ Data scope — 100% from BBC VHD validation CI runner. All 188,800 ChatMagics telemetry events in this dashboard (last 90 d) come from a single Geneva MDS tenant, A365BBCRunner. Real-user telemetry from Fabric/Synapse customer Spark sessions routes to different Geneva tenants and is not captured by this Kusto endpoint. Treat the numbers below as CI test coverage, not adoption. See the Evidence section at the bottom for the proof.
Magics defined in code
17
+ 7 documented but not registered
Active in last 30 d
distinct commands with ≥ 1 invocation
Invocations (30 d)
sum of Telemetry: command=* log rows
Unique workspaces (30 d)
workspaces emitting at least one magic
Magics defined in chat_magics.py
# Magic Kind Source Telemetry name Seen in 90 d?
Documented but not registered as magics in the current revision: %set_language %%fix_errors %set_processor %set_model %optimize_code %pin %unpin  — present only in README docstrings and/or EventCommandNames enum.
Usage by command (30 d)
Command Invocations From runner From real users Unique workspaces Unique artifacts Share
From runner = events emitted by Geneva MDS tenant A365BBCRunner (BBC VHD validation CI). From real users = everything else in this Kusto table. KQL source: Q1 · Evidence.
Total reach + lifecycle (90 d)
Command Invocations From runner From real users First seen Last seen Notes
From runner = events emitted by Geneva MDS tenant A365BBCRunner (BBC VHD validation CI). From real users = everything else in this Kusto table. See Evidence below.
Invocations per day (last 30 d)
Validate these numbers in Kusto
Cluster https://analytics365prod.kusto.windows.net · Database Analytics365SparkPROD · Table SynapseMLLogs
EU equivalent: analytics365prodeu.westeurope.kusto.windows.net / Analytics365SparkPROD
Permission: SG Redmond\\Arcadia Dev. Column casing note: TIMESTAMP is uppercase.
Q1 · Usage by command (30 d)
Q2 · 90-day reach
Q3 · Daily trend
Q4 · Probe / raw rows
Q5 · All event categories
Drives the "Usage by command (30 d)" table above — includes Runner/RealUser split.
▶ Open in ADX
SynapseMLLogs
| where TIMESTAMP > ago(30d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend Command  = extract(strcat(@"Telemetry: command=", @"(\w+)"), 1, tostring(Message))
| where isnotempty(Command)
| extend IsRunner = (Tenant == "A365BBCRunner")
| extend AppInfo  = parse_json(TelemetryApplicationInfo)
| summarize
    Invocations      = count(),
    Runner           = countif(IsRunner),
    RealUser         = countif(not(IsRunner)),
    UniqueWorkspaces = dcount(Workspace),
    UniqueArtifacts  = dcount(tostring(AppInfo.ArtifactId)),
    Versions         = make_set(tostring(AppInfo.ApplicationVersion), 5)
    by Command
| extend PctRunner = round(100.0 * Runner / Invocations, 1)
| order by Invocations desc
Drives the "Total reach + lifecycle (90 d)" table.
▶ Open in ADX
SynapseMLLogs
| where TIMESTAMP > ago(90d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend Command = extract(strcat(@"Telemetry: command=", @"(\w+)"), 1, tostring(Message))
| where isnotempty(Command)
| summarize Invocations = count(),
            FirstSeen   = min(TIMESTAMP),
            LastSeen    = max(TIMESTAMP)
    by Command
| order by Invocations desc
Drives the daily trend chart.
▶ Open in ADX
SynapseMLLogs
| where TIMESTAMP > ago(30d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend Command = extract(strcat(@"Telemetry: command=", @"(\w+)"), 1, tostring(Message))
| where isnotempty(Command)
| summarize Count = count() by Day = startofday(TIMESTAMP), Command
| order by Day asc, Count desc
| render columnchart with (kind=stacked, xcolumn=Day, ycolumns=Count, series=Command)
Use this to sanity-check a single row before trusting the aggregates.
▶ Open in ADX
// Probe — most-recent 20 raw command rows
SynapseMLLogs
| where TIMESTAMP > ago(1d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend AppInfo = parse_json(TelemetryApplicationInfo)
| project TIMESTAMP,
          Workspace,
          ArtifactId      = tostring(AppInfo.ArtifactId),
          ArtifactType    = tostring(AppInfo.ArtifactType),
          AppVersion      = tostring(AppInfo.ApplicationVersion),
          Command         = extract(strcat(@"Telemetry: command=", @"(\w+)"), 1, tostring(Message)),
          Message
| order by TIMESTAMP desc
| take 20
Distinct telemetry event categories beyond command= (e.g. import, initialization, SCHEMA_FETCH_*).
▶ Open in ADX
SynapseMLLogs
| where TIMESTAMP > ago(7d)
| where TelemetryApplicationInfo has "ChatMagics"
| extend EventName = extract(@"Telemetry:\s*(\w+)=", 1, tostring(Message))
| where isnotempty(EventName)
| summarize Count = count(), Sample = take_any(Message) by EventName
| order by Count desc
Why we're confident this is 100% from a CI runner

Every ChatMagics telemetry event in this Kusto endpoint over the last 90 days — 188,800 events across 11 commands — carries Tenant = A365BBCRunner. That tenant is Microsoft's internal BBC (Build/VHD validation) CI runner, used to validate Spark/Fabric VHD images before release. The chat-magics package is shipped into those VHDs via the ADO feed BBC-VHD_PublicPackages (see .pipelines/chat-magics-Official.yml:19) and validated by re-running test notebooks against each new VHD build.

Evidence A — only one MDS tenant emits ChatMagics here (90 d)

TenantEnvironmentTypeEventsShare
A365BBCRunnerTRIPROD180,52495.6%
A365BBCRunnerPROD4,6682.5%
A365BBCRunnerTriPROD3,6081.9%
(any other tenant)00.00%

Evidence B — per-command runner-vs-real-user split (90 d)

Command Runner events Runner notebooks Real-user events Real-user notebooks % Runner
“Runner notebooks” = unique ArtifactId values seen from A365BBCRunner over 90 d. The runner spins up many short-lived notebooks per VHD build, which is why the artifact counts are high but per-notebook event counts are low.

Evidence C — CI infrastructure fingerprints on every row

A single raw row from the table reveals the CI stack:

TIMESTAMP = 2026-02-25 01:40:00 Tenant = A365BBCRunner ← BBC VHD CI runner identity EnvironmentType = TRIPROD Region = westus2 Role = LinuxVMs ← dedicated test VM role RoleInstance = LinuxVM3 ← specific test VM Host = vm-97c12794 ← CI VM hostname VhdId = 2e71bbc7-cc3f-41fd-9ea2-3e105e110a54 ← the VHD build being validated SourceNamespace = ArcadiaSparkPROD ApplicationName = ChatMagics ApplicationVersion = 0.1.25.2.28 ArtifactType = SynapseNotebook ArtifactId = 7b4842e1-965d-4cb1-8b0a-e426e0734fc4 ← ephemeral test notebook Message = Telemetry: command=ignore
Real customer Spark sessions never carry VhdId, RoleInstance=LinuxVM3, or the A365BBCRunner tenant label.

Evidence D — rolling VHD builds, not human sessions

  • 211 unique VhdId values over 31 days (Feb 16 — Mar 18) — a new VHD validated every ~3.5 hours.
  • 7,624 unique notebooks in the same window, ~245 ephemeral notebooks created per day.
  • 47% of notebooks finished all their events in < 5 min (single CI run), and another 23% finished within 30 min — classic short-lived test fixture lifetime, not human exploration.
  • Top-traffic VHD 2db9f8fa… ran 15,604 %ignore calls against 805 different notebooks over 12 days, then was retired and replaced by the next VHD.
  • Same tenant emits %chat, %code, %refresh_context alongside %ignore — it's exercising the whole chat-magics surface as a smoke test, with %%ignore wrapped around every cell.

Evidence E — chat-magics pipeline publishes to BBC-VHD feed

.pipelines/chat-magics-Official.yml:19ADO_FEEDS: "chat-magics-fabric,BBC-VHD_PublicPackages" ADO

BBC-VHD pulls the chat-magics package from this feed, bakes it into Spark/Fabric runtime VHD images, then runs validation notebooks (e.g. tests/magics/DataSummaries.ipynb) on each new VHD build. That validation suite is what produces all the telemetry visible here.

Validation KQL — reproduce these claims

Run any of these against analytics365prod / Analytics365SparkPROD.
▶ Open in ADX
// 1) All distinct Tenants emitting ChatMagics (90 d) — only A365BBCRunner shows up
SynapseMLLogs
| where TIMESTAMP between (datetime(2026-02-11) .. datetime(2026-05-12))
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| summarize Count = count() by Tenant, EnvironmentType
| order by Count desc

// 2) Per-command runner-vs-real-user split (90 d)
SynapseMLLogs
| where TIMESTAMP between (datetime(2026-02-11) .. datetime(2026-05-12))
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend Command  = extract(@"Telemetry: command=(\w+)", 1, Message)
| extend IsRunner = (Tenant == "A365BBCRunner")
| summarize Total     = count(),
            Runner    = countif(IsRunner),
            RealUser  = countif(not(IsRunner)),
            RunnerArt = dcountif(tostring(parse_json(TelemetryApplicationInfo).ArtifactId), IsRunner),
            RealArt   = dcountif(tostring(parse_json(TelemetryApplicationInfo).ArtifactId), not(IsRunner))
            by Command
| extend PctRunner = round(100.0 * Runner / Total, 1)
| order by Total desc

// 3) VHD rotation — 211 unique VhdId in 31 d during peak
SynapseMLLogs
| where TIMESTAMP between (datetime(2026-02-16) .. datetime(2026-03-19))
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command=ignore"
| summarize Count = count(),
            Notebooks = dcount(tostring(parse_json(TelemetryApplicationInfo).ArtifactId))
            by VhdId
| top 20 by Count desc

// 4) Filter OUT the runner if you ever want a real-user-only view
SynapseMLLogs
| where TIMESTAMP > ago(30d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| where Tenant != "A365BBCRunner"   // strip CI noise
| extend Command = extract(@"Telemetry: command=(\w+)", 1, Message)
| summarize Count = count() by Command
| order by Count desc

// 5) 30-day runner-vs-real-user split per command — drives the "Usage by command (30 d)" table
SynapseMLLogs
| where TIMESTAMP > ago(30d)
| where TelemetryApplicationInfo has "ChatMagics"
| where Message has "Telemetry: command="
| extend Command  = extract(@"Telemetry: command=(\w+)", 1, Message)
| where isnotempty(Command)
| extend IsRunner = (Tenant == "A365BBCRunner")
| extend AppInfo  = parse_json(TelemetryApplicationInfo)
| summarize Total              = count(),
            Runner             = countif(IsRunner),
            RealUser           = countif(not(IsRunner)),
            UniqueWorkspaces   = dcount(Workspace),
            UniqueArtifacts    = dcount(tostring(AppInfo.ArtifactId)),
            RunnerArtifacts    = dcountif(tostring(AppInfo.ArtifactId), IsRunner),
            RealUserArtifacts  = dcountif(tostring(AppInfo.ArtifactId), not(IsRunner))
    by Command
| extend PctRunner = round(100.0 * Runner / Total, 1)
| order by Total desc
⚠ What this dashboard does NOT show: real customer Spark sessions in Fabric/Synapse route through different Geneva MDS endpoints and land in different Kusto clusters. To get real-user adoption numbers, query the MWC region clusters or whichever endpoint receives the customer-tenant's Geneva pipeline output. The chat-magics package itself emits telemetry on every log_telemetry() call (chat_magics.py:925) — if real users are running it, the events exist somewhere; they're just not in Analytics365SparkPROD.SynapseMLLogs.
Source & docs