Add skill submission for create-copilot-adoption-dashboard - #258
Add skill submission for create-copilot-adoption-dashboard#258chancecontra wants to merge 5 commits into
Conversation
|
@microsoft-github-policy-service agree |
There was a problem hiding this comment.
Pull request overview
Adds a new submissions/create-copilot-adoption-dashboard/ entry that generates a single-file HTML Microsoft 365 Copilot adoption dashboard by ingesting four Microsoft admin center (MAC) Copilot activity CSV exports, computing framework metrics, and injecting results into a bundled HTML template.
Changes:
- Introduces a new Cowork skill (
SKILL.md) plus a human-facingREADME.mdfor creating a Copilot adoption dashboard from MAC exports. - Adds a standard-library Python builder script to compute KPIs/segments and inject the computed JSON into an HTML template.
- Adds the framework reference doc and the HTML dashboard template asset used for rendering.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| submissions/create-copilot-adoption-dashboard/SKILL.md | Defines the agent skill instructions and execution phases for building the dashboard. |
| submissions/create-copilot-adoption-dashboard/scripts/build_dashboard.py | Computes metrics from CSV exports and injects them into the HTML template; emits JSON run summary. |
| submissions/create-copilot-adoption-dashboard/references/adoption-framework.md | Documents the adoption framework logic, thresholds, and the injected data contract. |
| submissions/create-copilot-adoption-dashboard/README.md | Human-facing usage/setup guidance for running the skill and preparing exports. |
| submissions/create-copilot-adoption-dashboard/metadata.json | Registers the submission metadata (name/description/platform/tags/author/version/dates). |
| submissions/create-copilot-adoption-dashboard/assets/dashboard_template.html | Self-contained HTML/CSS/JS dashboard template to be populated by the build script. |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.
Suppressed comments (5)
submissions/create-copilot-adoption-dashboard/SKILL.md:30
SKILL.mdincludes human-facing sections (Overview / When to Use / Quick Start) that aren’t required for the agent to execute the run. In this repo, that content should live in the submissionREADME.mdand the skill should start directly with the runtime procedure to avoid wasting agent context and to keep the skill purely agent-facing.
## Overview
This skill builds a **Microsoft 365 Copilot adoption dashboard** by feeding four
MAC report exports through the *Copilot Adoption Analysis* framework and
injecting the computed results into a bundled single-file HTML template. The
output is one self-contained `.html` file (no libraries, no network) branded
with the customer's name and logo, carrying only real data — every template
placeholder, sample number, and template label is replaced. Every KPI tile and
submissions/create-copilot-adoption-dashboard/scripts/build_dashboard.py:420
- Chat rows use
norm()for user IDs when excluding licensed users. Sincenorm()removes punctuation, it can collide different UPNs and misclassify licensed users as unlicensed (or vice versa) in the conversion funnel.
for row in rows:
key = norm(row.get(ukey, "")) if ukey else ""
if licensed_users and key and key in licensed_users:
submissions/create-copilot-adoption-dashboard/scripts/build_dashboard.py:296
- User identifiers are added to
licensed_usersusingnorm(), which strips non-alphanumerics. That can cause collisions (e.g.,a.b@contoso.comvsab@contoso.com) and incorrectly exclude/include users when comparing against Chat rows.
This issue also appears on line 418 of the same file.
for row in rows:
if ukey:
users.add(norm(row.get(ukey, "")))
submissions/create-copilot-adoption-dashboard/SKILL.md:88
- The skill instructions tell the agent to request an SVG logo, but SVG is risky to embed in HTML output (active content). If SVG support is removed/blocked for safety, the allowed-logo list here should be updated to match.
1. **Company name + logo:** if not already given, ask with `core-AskUserQuestion`
(company name is required; logo is optional — a PNG/JPG/SVG file). Do not ask
for anything a lookup can answer.
submissions/create-copilot-adoption-dashboard/README.md:30
- README advertises SVG logos, but embedding SVG into the generated HTML is a script-injection risk. If SVG support is removed/blocked in the builder, this list should be updated so users don’t provide SVGs.
Optional: a **logo** file (PNG, JPG, SVG, GIF or WebP). It gets embedded into the
HTML, so the finished dashboard stays a single portable file.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Suppressed comments (3)
submissions/create-copilot-adoption-dashboard/SKILL.md:27
- The
SKILL.mdincludes human-facing adoption/setup content (e.g., "Overview", "When to Use/NOT to Use", and "Quick Start") before the agent’s actual runtime procedure. In this repo,SKILL.mdis meant to be agent-facing run instructions, while human-facing overview/setup guidance should live in the submissionREADME.md. Please move those sections intoREADME.mdand haveSKILL.mdbegin directly with the agent procedure (activation + phases).
## Overview
This skill builds a **Microsoft 365 Copilot adoption dashboard** by feeding four
MAC report exports through the *Copilot Adoption Analysis* framework and
injecting the computed results into a bundled single-file HTML template. The
submissions/create-copilot-adoption-dashboard/SKILL.md:88
SKILL.mdsays the optional logo can be SVG, butencode_logo()explicitly rejects SVG files for security reasons. The supported formats in the skill instructions should match what the script actually accepts.
1. **Company name + logo:** if not already given, ask with `core-AskUserQuestion`
(company name is required; logo is optional — a PNG/JPG/SVG file). Do not ask
for anything a lookup can answer.
submissions/create-copilot-adoption-dashboard/README.md:30
- README lists SVG as a supported logo format, but the build script rejects SVG logos (to avoid active content). Update the README to only list formats that are actually supported.
Optional: a **logo** file (PNG, JPG, SVG, GIF or WebP). It gets embedded into the
HTML, so the finished dashboard stays a single portable file.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Suppressed comments (4)
submissions/create-copilot-adoption-dashboard/SKILL.md:27
SKILL.mdshould be agent-facing runtime instructions; sections like "Overview", "When to Use/NOT to Use", and "Quick Start" are human-facing and should live inREADME.mdinstead (see submissions/README.md:36-41, 74-82). Consider startingSKILL.mddirectly at "Core Instructions".
## Overview
This skill builds a **Microsoft 365 Copilot adoption dashboard** by feeding four
MAC report exports through the *Copilot Adoption Analysis* framework and
injecting the computed results into a bundled single-file HTML template. The
submissions/create-copilot-adoption-dashboard/metadata.json:5
metadata.jsonrequires lowercase tags for search/filtering; the current tags are capitalized and will fail repo validation (see submissions/README.md:113).
"tags": ["Copilot", "Adoption", "Data", "Dashboard", "KPIs", "Measure"],
submissions/create-copilot-adoption-dashboard/SKILL.md:88
- The skill instructs the user that SVG logos are acceptable, but
encode_logo()explicitly rejects SVG for security reasons. Update the accepted logo types here to avoid confusing runs where an SVG is provided and silently dropped.
1. **Company name + logo:** if not already given, ask with `core-AskUserQuestion`
(company name is required; logo is optional — a PNG/JPG/SVG file). Do not ask
for anything a lookup can answer.
submissions/create-copilot-adoption-dashboard/README.md:29
- README says SVG logos are supported, but the build script rejects SVG logos ("can contain active content") and will fall back to the default mark. Update the README to match the actual supported formats.
Optional: a **logo** file (PNG, JPG, SVG, GIF or WebP). It gets embedded into the
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated no new comments.
Suppressed comments (5)
submissions/create-copilot-adoption-dashboard/SKILL.md:30
SKILL.mdcurrently contains human-facing overview/quick-start content (e.g., “## Overview”, “## Quick Start”). Per repo submission guidance, setup/overview/examples should live in the submissionREADME.md(human-facing) so they don’t ship to the agent as runtime context;SKILL.mdshould start directly with the agent’s operating instructions.
## Overview
This skill builds a **Microsoft 365 Copilot adoption dashboard** by feeding four
MAC report exports through the *Copilot Adoption Analysis* framework and
injecting the computed results into a bundled single-file HTML template. The
output is one self-contained `.html` file (no libraries, no network) branded
with the customer's name and logo, carrying only real data — every template
placeholder, sample number, and template label is replaced. Every KPI tile and
submissions/create-copilot-adoption-dashboard/SKILL.md:117
--col-mapis implemented as a path to a JSON file (json.loads(Path(args.col_map).read_text(...))), but the instructions read like inline JSON can be provided. Clarify that--col-maptakes a file path (e.g.--col-map working/col_map.json).
If `warnings` names an unmapped column, write a small `--col-map` JSON (see
the reference) and re-run — do not hand-edit numbers. Confirm
`template_reference_check` is `clean`.
submissions/create-copilot-adoption-dashboard/SKILL.md:88
- The skill instructions say the optional logo can be SVG, but
scripts/build_dashboard.pyexplicitly rejects.svglogos for safety and falls back to the default mark. This mismatch will confuse users and make SVG uploads appear “ignored”.
This issue also appears on line 115 of the same file.
1. **Company name + logo:** if not already given, ask with `core-AskUserQuestion`
(company name is required; logo is optional — a PNG/JPG/SVG file). Do not ask
for anything a lookup can answer.
submissions/create-copilot-adoption-dashboard/README.md:30
- README says SVG logos are supported, but the build script rejects
.svg(warns and uses the default mark). Either support SVG safely or update the README to match the actual behavior.
Optional: a **logo** file (PNG, JPG, SVG, GIF or WebP). It gets embedded into the
HTML, so the finished dashboard stays a single portable file.
submissions/create-copilot-adoption-dashboard/references/adoption-framework.md:182
- This reference describes
--col-mapas “a JSON override”, but in the script it is a file path to JSON. To prevent failed runs, it would help to explicitly say it’s a JSON file passed by path (e.g.--col-map col_map.json).
Header names vary between tenants and export versions, so the script matches
columns by normalised keyword (lower-cased, punctuation/space-stripped), not by
exact string. When a needed column cannot be matched it stops and lists the
available headers so the agent can supply a `--col-map` JSON override, e.g.:
|
Fields/columns of interest in this case can contain either date or be empty (based on https://learn.microsoft.com/en-us/microsoft-365/admin/activity-reports/microsoft-365-copilot-usage?view=o365-worldwide#faq), hence the use case of misinterpretation of active users with N/A or something else is not possible (at least with current version of MAC reports).
Only issue is potential delay of data freshness up to 72h but this is documented as well for the reports.
On 9 Aug 2026, at 12:56, adilei ***@***.***> wrote:
@adilei commented on this pull request.
________________________________
In submissions/create-copilot-adoption-dashboard/scripts/build_dashboard.py<#258 (comment)>:
+ seg_counts = {s: 0 for s in SEGMENT_ORDER}
+ app_active = {a: 0 for a in app_cols}
+ active = habitual = multi_surface = 0
+ users = set()
+
+ for row in rows:
+ if ukey:
+ users.add(norm(row.get(ukey, "")))
+ prompts = to_int(row.get(c_prompts)) if c_prompts else 0
+ days = to_int(row.get(c_days)) if c_days else 0
+ apps_active = 0
+ latest_app = None
+ for disp, col in app_cols.items():
+ d = parse_date(row.get(col))
+ cell = (row.get(col) or "").strip()
+ is_active = bool(cell) and (d is None or (report_date - d).days <= period)
This treats every non-empty value that fails date parsing as recent activity. Common missing-value markers such as - and N/A therefore increment apps_active and app_active, which can classify an otherwise inactive user as Casual and inflate activation/surface metrics. Please count the app as active only when the cell parses as a valid date within the reporting window (and optionally warn on non-empty unparseable values).
—
Reply to this email directly, view it on GitHub<#258?email_source=notifications&email_token=AS5U5KNY4RZMPKS5Y5XHBF35JBKFVA5CNFSNUABKM5UWIORPF5TWS5BNNB2WEL2QOVWGYUTFOF2WK43UKJSXM2LFO4XTIOBZGEYTONZUGE2KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJLDGN5XXIZLSL5RWY2LDNM#pullrequestreview-4891177414>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AS5U5KLKBJ3NTJTOR4PJCY35JBKFVAVCNFSNUABGKJSXA33TNF2G64TZHMYTENJYG4YDENBYGQ5US43TOVSTWNJQG4YDQOBSGY3DHILWAI>.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS<https://github.com/notifications/mobile/ios/AS5U5KPKGPAKNOGGSE2B2OT5JBKFVA5CNFSNUABKM5UWIORPF5TWS5BNNB2WEL2QOVWGYUTFOF2WK43UKJSXM2LFO4XTIOBZGEYTONZUGE2KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJKTGN5XXIZLSL5UW64Y> and Android<https://github.com/notifications/mobile/android/AS5U5KLR677TJIJW4UTUHZT5JBKFVA5CNFSNUABKM5UWIORPF5TWS5BNNB2WEL2QOVWGYUTFOF2WK43UKJSXM2LFO4XTIOBZGEYTONZUGE2KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJLTGN5XXIZLSL5QW4ZDSN5UWI>. Download it today!
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
Hi chancecontra , thanks for this! Sharing with you a couple of notes after an end-to-end test in Copilot Studio against a real MAC Copilot usage export:
Thank you! |
No description provided.