skilldrop-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/bin/skilldrop.js +338 -0
  4. package/model-routing.json +147 -0
  5. package/package.json +36 -0
  6. package/packs.json +90 -0
  7. package/skills/accessibility-audit/SKILL.md +74 -0
  8. package/skills/accessibility-audit/examples/login-form.md +76 -0
  9. package/skills/accessibility-audit/manifest.json +11 -0
  10. package/skills/accessibility-audit/reference.md +69 -0
  11. package/skills/adr-generator/SKILL.md +49 -0
  12. package/skills/adr-generator/manifest.json +11 -0
  13. package/skills/adr-generator/templates/madr.md +56 -0
  14. package/skills/adr-generator/templates/nygard.md +19 -0
  15. package/skills/ai-usage-report/SKILL.md +111 -0
  16. package/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
  17. package/skills/ai-usage-report/manifest.json +11 -0
  18. package/skills/ai-usage-report/scripts/build_report.py +436 -0
  19. package/skills/ai-usage-report/templates/report-per-user.md +42 -0
  20. package/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
  21. package/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
  22. package/skills/api-contract-draft/SKILL.md +69 -0
  23. package/skills/api-contract-draft/manifest.json +11 -0
  24. package/skills/api-contract-draft/reference.md +73 -0
  25. package/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
  26. package/skills/architecture-diagrams/SKILL.md +66 -0
  27. package/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
  28. package/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
  29. package/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
  30. package/skills/architecture-diagrams/manifest.json +28 -0
  31. package/skills/architecture-diagrams/templates/c4-container.puml +31 -0
  32. package/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
  33. package/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
  34. package/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
  35. package/skills/audience-profile/SKILL.md +73 -0
  36. package/skills/audience-profile/manifest.json +11 -0
  37. package/skills/audience-profile/reference.md +175 -0
  38. package/skills/brief-intake/SKILL.md +78 -0
  39. package/skills/brief-intake/manifest.json +11 -0
  40. package/skills/brief-intake/templates/brief-adr.md +41 -0
  41. package/skills/brief-intake/templates/brief-decision-log.md +35 -0
  42. package/skills/brief-intake/templates/brief-deck.md +43 -0
  43. package/skills/brief-intake/templates/brief-design-doc.md +48 -0
  44. package/skills/brief-intake/templates/brief-exec-summary.md +47 -0
  45. package/skills/brief-intake/templates/brief-generic.md +45 -0
  46. package/skills/brief-intake/templates/brief-runbook.md +44 -0
  47. package/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
  48. package/skills/bug-triage/SKILL.md +67 -0
  49. package/skills/bug-triage/manifest.json +11 -0
  50. package/skills/bug-triage/templates/bug-ticket.md +86 -0
  51. package/skills/business-case/SKILL.md +64 -0
  52. package/skills/business-case/manifest.json +11 -0
  53. package/skills/business-case/templates/business-case.md +60 -0
  54. package/skills/capacity-cost-model/SKILL.md +64 -0
  55. package/skills/capacity-cost-model/manifest.json +11 -0
  56. package/skills/capacity-cost-model/reference.md +54 -0
  57. package/skills/capacity-cost-model/templates/cost-model.md +68 -0
  58. package/skills/council-review/SKILL.md +106 -0
  59. package/skills/council-review/examples/redis-cache-decision.md +75 -0
  60. package/skills/council-review/manifest.json +11 -0
  61. package/skills/council-review/reference.md +76 -0
  62. package/skills/council-review/seats/architect.md +29 -0
  63. package/skills/council-review/seats/bench.md +39 -0
  64. package/skills/council-review/seats/operator.md +27 -0
  65. package/skills/council-review/seats/pragmatist.md +29 -0
  66. package/skills/council-review/seats/security-engineer.md +29 -0
  67. package/skills/council-review/seats/user-advocate.md +27 -0
  68. package/skills/council-review/templates/council-review.md +59 -0
  69. package/skills/data-contract/SKILL.md +67 -0
  70. package/skills/data-contract/manifest.json +11 -0
  71. package/skills/data-contract/reference.md +46 -0
  72. package/skills/data-contract/templates/data-contract.md +69 -0
  73. package/skills/db-schema-design/SKILL.md +68 -0
  74. package/skills/db-schema-design/manifest.json +11 -0
  75. package/skills/db-schema-design/reference.md +56 -0
  76. package/skills/db-schema-design/templates/schema-design.md +75 -0
  77. package/skills/decision-log/SKILL.md +67 -0
  78. package/skills/decision-log/manifest.json +11 -0
  79. package/skills/deck-builder/SKILL.md +114 -0
  80. package/skills/deck-builder/examples/exec-board-update.md +108 -0
  81. package/skills/deck-builder/manifest.json +17 -0
  82. package/skills/deck-builder/reference.md +92 -0
  83. package/skills/deck-builder/requirements.txt +1 -0
  84. package/skills/deck-builder/scripts/build_deck.py +309 -0
  85. package/skills/deck-builder/templates/deck-spec.json +97 -0
  86. package/skills/deck-builder/templates/palettes.json +59 -0
  87. package/skills/design-doc/SKILL.md +49 -0
  88. package/skills/design-doc/manifest.json +11 -0
  89. package/skills/design-doc/templates/design-doc.md +98 -0
  90. package/skills/devils-advocate/SKILL.md +142 -0
  91. package/skills/devils-advocate/lenses/adversarial-review.md +88 -0
  92. package/skills/devils-advocate/lenses/edge-cases.md +95 -0
  93. package/skills/devils-advocate/lenses/future-proofing.md +75 -0
  94. package/skills/devils-advocate/lenses/test-coverage.md +90 -0
  95. package/skills/devils-advocate/manifest.json +11 -0
  96. package/skills/devils-advocate/templates/challenge.md +118 -0
  97. package/skills/doc-critique/SKILL.md +119 -0
  98. package/skills/doc-critique/manifest.json +11 -0
  99. package/skills/doc-critique/rubrics/adr.md +36 -0
  100. package/skills/doc-critique/rubrics/decision-log.md +39 -0
  101. package/skills/doc-critique/rubrics/deck.md +45 -0
  102. package/skills/doc-critique/rubrics/design-doc.md +42 -0
  103. package/skills/doc-critique/rubrics/exec-summary.md +41 -0
  104. package/skills/doc-critique/rubrics/generic.md +40 -0
  105. package/skills/doc-critique/rubrics/runbook.md +42 -0
  106. package/skills/doc-critique/rubrics/tech-comparison.md +40 -0
  107. package/skills/doc-critique/templates/critique.md +49 -0
  108. package/skills/exec-summary/SKILL.md +45 -0
  109. package/skills/exec-summary/manifest.json +11 -0
  110. package/skills/exec-summary/templates/exec-summary.md +48 -0
  111. package/skills/feature-implement-loop/SKILL.md +83 -0
  112. package/skills/feature-implement-loop/manifest.json +11 -0
  113. package/skills/figma-diagrams/SKILL.md +85 -0
  114. package/skills/figma-diagrams/manifest.json +35 -0
  115. package/skills/figma-diagrams/reference.md +91 -0
  116. package/skills/figma-diagrams/requirements.txt +1 -0
  117. package/skills/figma-diagrams/scripts/_figma_client.py +71 -0
  118. package/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
  119. package/skills/figma-diagrams/scripts/inspect_file.py +46 -0
  120. package/skills/figma-diagrams/scripts/list_comments.py +35 -0
  121. package/skills/figma-diagrams/scripts/post_comment.py +52 -0
  122. package/skills/figma-diagrams/templates/figjam-import.json +20 -0
  123. package/skills/guide-builder/SKILL.md +76 -0
  124. package/skills/guide-builder/examples/local-setup-guide.md +127 -0
  125. package/skills/guide-builder/manifest.json +11 -0
  126. package/skills/guide-builder/templates/api-reference.md +120 -0
  127. package/skills/guide-builder/templates/design-walkthrough.md +72 -0
  128. package/skills/guide-builder/templates/setup-guide.md +109 -0
  129. package/skills/incident-comms/SKILL.md +68 -0
  130. package/skills/incident-comms/manifest.json +11 -0
  131. package/skills/incident-comms/reference.md +43 -0
  132. package/skills/incident-comms/templates/messages.md +82 -0
  133. package/skills/llm-eval-harness/SKILL.md +73 -0
  134. package/skills/llm-eval-harness/manifest.json +11 -0
  135. package/skills/llm-eval-harness/reference.md +58 -0
  136. package/skills/llm-eval-harness/templates/eval-plan.md +63 -0
  137. package/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
  138. package/skills/migration-plan/SKILL.md +68 -0
  139. package/skills/migration-plan/manifest.json +11 -0
  140. package/skills/migration-plan/templates/migration-plan.md +68 -0
  141. package/skills/nfr-spec/SKILL.md +63 -0
  142. package/skills/nfr-spec/manifest.json +11 -0
  143. package/skills/nfr-spec/reference.md +74 -0
  144. package/skills/nfr-spec/templates/nfr-spec.md +56 -0
  145. package/skills/observability-plan/SKILL.md +70 -0
  146. package/skills/observability-plan/manifest.json +11 -0
  147. package/skills/observability-plan/reference.md +67 -0
  148. package/skills/observability-plan/templates/observability-plan.md +62 -0
  149. package/skills/okr-cascade/SKILL.md +59 -0
  150. package/skills/okr-cascade/evals/eval_queries.json +12 -0
  151. package/skills/okr-cascade/evals/evals.json +28 -0
  152. package/skills/okr-cascade/manifest.json +11 -0
  153. package/skills/okr-cascade/templates/okr-cascade.md +46 -0
  154. package/skills/postmortem-generator/SKILL.md +65 -0
  155. package/skills/postmortem-generator/manifest.json +11 -0
  156. package/skills/postmortem-generator/templates/postmortem.md +67 -0
  157. package/skills/prd-draft/SKILL.md +62 -0
  158. package/skills/prd-draft/manifest.json +11 -0
  159. package/skills/prd-draft/templates/prd.md +66 -0
  160. package/skills/prfaq/SKILL.md +75 -0
  161. package/skills/prfaq/evals/eval_queries.json +13 -0
  162. package/skills/prfaq/evals/evals.json +32 -0
  163. package/skills/prfaq/manifest.json +11 -0
  164. package/skills/prfaq/templates/prfaq.md +60 -0
  165. package/skills/release-notes/SKILL.md +61 -0
  166. package/skills/release-notes/manifest.json +11 -0
  167. package/skills/release-notes/templates/release-notes.md +83 -0
  168. package/skills/requirements-interview/SKILL.md +61 -0
  169. package/skills/requirements-interview/manifest.json +11 -0
  170. package/skills/requirements-interview/templates/interview-kit.md +63 -0
  171. package/skills/reverse-architecture/SKILL.md +103 -0
  172. package/skills/reverse-architecture/manifest.json +11 -0
  173. package/skills/reverse-architecture/reference.md +150 -0
  174. package/skills/reverse-architecture/templates/description.md +52 -0
  175. package/skills/reverse-architecture/templates/extraction.md +55 -0
  176. package/skills/runbook-generator/SKILL.md +42 -0
  177. package/skills/runbook-generator/manifest.json +11 -0
  178. package/skills/runbook-generator/templates/runbook.md +109 -0
  179. package/skills/slide-outliner/SKILL.md +58 -0
  180. package/skills/slide-outliner/manifest.json +11 -0
  181. package/skills/slide-outliner/templates/deck-outline.md +131 -0
  182. package/skills/sonar-onboard/SKILL.md +170 -0
  183. package/skills/sonar-onboard/manifest.json +11 -0
  184. package/skills/sonar-onboard/reference.md +151 -0
  185. package/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
  186. package/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
  187. package/skills/sonar-onboard/templates/readme-snippet.md +38 -0
  188. package/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
  189. package/skills/sonar-review/SKILL.md +220 -0
  190. package/skills/sonar-review/lenses/bugs.md +48 -0
  191. package/skills/sonar-review/lenses/code-smells.md +64 -0
  192. package/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
  193. package/skills/sonar-review/lenses/security-hotspots.md +56 -0
  194. package/skills/sonar-review/lenses/vulnerabilities.md +52 -0
  195. package/skills/sonar-review/manifest.json +37 -0
  196. package/skills/sonar-review/reference.md +167 -0
  197. package/skills/sonar-review/templates/report.md +84 -0
  198. package/skills/strategy-analysis/SKILL.md +63 -0
  199. package/skills/strategy-analysis/evals/eval_queries.json +13 -0
  200. package/skills/strategy-analysis/evals/evals.json +36 -0
  201. package/skills/strategy-analysis/manifest.json +11 -0
  202. package/skills/success-metrics/SKILL.md +63 -0
  203. package/skills/success-metrics/evals/eval_queries.json +11 -0
  204. package/skills/success-metrics/evals/evals.json +27 -0
  205. package/skills/success-metrics/manifest.json +11 -0
  206. package/skills/success-metrics/templates/metrics-plan.md +55 -0
  207. package/skills/tech-comparison-matrix/SKILL.md +56 -0
  208. package/skills/tech-comparison-matrix/manifest.json +11 -0
  209. package/skills/tech-comparison-matrix/templates/matrix.md +45 -0
  210. package/skills/test-plan-generator/SKILL.md +59 -0
  211. package/skills/test-plan-generator/manifest.json +11 -0
  212. package/skills/test-plan-generator/templates/test-plan.md +83 -0
  213. package/skills/threat-model/SKILL.md +65 -0
  214. package/skills/threat-model/examples/document-upload.md +56 -0
  215. package/skills/threat-model/manifest.json +11 -0
  216. package/skills/threat-model/reference.md +69 -0
  217. package/skills/user-journey-map/SKILL.md +64 -0
  218. package/skills/user-journey-map/evals/eval_queries.json +12 -0
  219. package/skills/user-journey-map/evals/evals.json +30 -0
  220. package/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
  221. package/skills/user-journey-map/manifest.json +11 -0
  222. package/skills/user-journey-map/templates/journey-map.md +47 -0
  223. package/skills/user-story-splitter/SKILL.md +88 -0
  224. package/skills/user-story-splitter/examples/notifications-epic.md +123 -0
  225. package/skills/user-story-splitter/manifest.json +11 -0
  226. package/skills/user-story-splitter/templates/story.md +40 -0
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: accessibility-audit
3
+ description: Adversarially audit a UI (component code, page markup, screenshot, or flow) against WCAG 2.2 AA — findings cited to specific success criteria, centered on the user and assistive tech each one blocks, severity-tagged, with a concrete fix and what a scanner would miss. Use when the user wants an accessibility review, a11y audit, WCAG check, or to find what blocks screen-reader / keyboard / low-vision users before shipping.
4
+ ---
5
+
6
+ # accessibility-audit
7
+
8
+ Finds the barriers that lock real people out of a UI — and cites the exact success criterion, names the assistive tech that hits the wall, and separates what an automated scanner catches from what only a human with a screen reader will. The UI counterpart to `devils-advocate` (code), `doc-critique` (docs), and `threat-model` (designs): one adversarial pass, severity-tagged, evidence-first. Automated tools catch perhaps a third of WCAG issues; this audit is built for the other two thirds.
9
+
10
+ ## How to respond
11
+
12
+ 1. **Establish what's auditable from the input, and say what isn't.** Inputs vary in what they reveal:
13
+ - **Component/page code or markup** — the richest: roles, labels, semantics, focus management, tab order are all inspectable.
14
+ - **Screenshot/image** — visual only: contrast, target size, text-as-image, visible focus *if* captured. Keyboard behavior, screen-reader output, and focus order are **not** observable — list them as "must verify with live AT", never guess a pass.
15
+ - **A described flow** — reason about it, flag the checks that need the real thing.
16
+ Default standard is **WCAG 2.2 level AA**; note if the user wants A or AAA. State the input's coverage limits up front so a clean section never reads as a guarantee it can't be.
17
+
18
+ 2. **Sweep all four POUR principles** using the success-criterion catalog in [`reference.md`](reference.md) — Perceivable, Operable, Understandable, Robust. Don't transcribe the catalog; run it as a lens and report only what the UI actually fails or can't be verified for. The high-yield manual checks scanners miss, swept explicitly: **keyboard-only operability** (every interactive element reachable and operable, visible focus, no traps, logical order), **screen-reader semantics** (name/role/value, headings, landmarks, alt-text *quality* not just presence), **meaningful sequence and focus order**, **error identification and recovery**, **reflow/zoom to 400%**, **target size (2.2)**, and **motion/animation** preferences.
19
+
20
+ 3. **Center every finding on the user it blocks and the AT involved.** A finding without a victim is abstract. ✅ *"Submit button is a `<div>` with a click handler — keyboard users cannot reach or activate it (Tab skips it, Enter does nothing), and a screen reader announces nothing actionable. Blocks: keyboard-only and screen-reader users from completing checkout."* — ❌ *"Button not accessible."* Name the assistive tech (VoiceOver/NVDA/JAWS, keyboard-only, 400% zoom, switch control, reduced-motion) so the fix is testable.
21
+
22
+ 4. **Cite the specific success criterion** — number, name, level — for every finding: `1.4.3 Contrast (Minimum) [AA]`, `2.1.1 Keyboard [A]`, `4.1.2 Name, Role, Value [A]`, `2.4.7 Focus Visible [AA]`, `2.5.8 Target Size (Minimum) [AA]`. "Make it accessible" is not a finding; a criterion citation is what makes it actionable and arguable.
23
+
24
+ 5. **Severity-tag with the shared markers**, by impact on task completion:
25
+ - 🟥 **blocker** — a user group cannot complete the task at all (keyboard trap, unlabeled critical control, contrast that renders text unreadable, a form that can't be submitted via keyboard).
26
+ - 🟧 **major** — significant barrier with a painful workaround (poor focus order, vague link text, missing error association).
27
+ - 🟨 **minor** — friction, not a wall (redundant alt text, a non-essential decorative image with empty-but-present alt).
28
+ - ⚪ **nit** — best-practice polish.
29
+ If everything is a blocker, the severity call failed — calibrate to whether the task can actually be completed.
30
+
31
+ 6. **Compute contrast and sizes where the input allows it.** Given colors, state the actual ratio against the 4.5:1 (normal) / 3:1 (large) threshold: ✅ *"`#767676` on `#fff` = 4.54:1, passes AA for normal text by a hair; fails for the 14px placeholder which needs the same 4.5:1 and gets it — but `#999` on `#fff` = 2.85:1 fails."* Numbers, not eyeballing.
32
+
33
+ 7. **Separate scanner-catchable from human-only**, explicitly, per finding (tag `[auto]` vs `[manual]`). It tells the team what to gate in CI (axe/Lighthouse) and what needs the screen-reader pass that no tool replaces — and it's honest that the audit's manual findings are the ones a pipeline won't keep catching. End with a **"what's solid"** section (the patterns done right, so they're preserved on refactor) and a prioritized fix order.
34
+
35
+ 8. **Emit in one message**: coverage note (input limits), findings grouped by severity with SC citation + affected user/AT + `[auto]`/`[manual]` + concrete fix, contrast/size computations, what's solid, and the must-verify-with-live-AT checklist for anything the input couldn't confirm.
36
+
37
+ ## Useful references in this skill
38
+
39
+ - [`reference.md`](reference.md) — the WCAG 2.2 AA success-criterion catalog by POUR, the affected-user/assistive-tech map, the severity rubric, and the "what automated tools miss" list
40
+ - [`examples/login-form.md`](examples/login-form.md) — worked example: a login form component audited to severity-tagged findings
41
+
42
+ ## Quality bar
43
+
44
+ - **Every finding cites a specific success criterion** (number + name + level). Uncited "issues" are opinions.
45
+ - **Every finding names the user group and assistive tech it blocks.** No victim, no finding.
46
+ - **Severity reflects task-completion impact**, calibrated — not everything is a blocker, and a real keyboard trap is never a minor.
47
+ - **Contrast and target-size claims are computed numbers** against the threshold, not visual guesses.
48
+ - **Coverage limits are stated** and unverifiable checks are listed as must-test-with-AT, never silently passed. A screenshot audit never claims keyboard operability is fine.
49
+ - **`[auto]` vs `[manual]` is tagged**, so CI-gateable findings are separated from the human-only ones.
50
+ - **"What's solid" is present**, so good semantics survive the next refactor.
51
+
52
+ ## When to use this skill
53
+
54
+ - ✅ Auditing a component, page, or flow against WCAG before shipping
55
+ - ✅ "Is this accessible? / find the a11y issues" for real markup, a screenshot, or a flow
56
+ - ✅ Pre-launch accessibility gate, or fixing a failed audit
57
+ - ✅ Reviewing a design/screenshot for the accessibility issues catchable before build
58
+
59
+ ## When NOT to use this skill
60
+
61
+ - ❌ Setting the accessibility *target* (which WCAG level, on which scope) — that's `nfr-spec`
62
+ - ❌ General code correctness/security review — that's `devils-advocate`
63
+ - ❌ Writing the component — fix findings in your normal build loop, or hand to `feature-implement-loop`
64
+ - ❌ A full certified VPAT/conformance attestation — this audit feeds one, but legal sign-off is a formal process beyond a review
65
+
66
+ ## Anti-patterns to avoid
67
+
68
+ - ❌ **"Make it accessible" findings.** Uncited, unactionable, unarguable. Every finding pins a success criterion.
69
+ - ❌ **Faulting alt-text presence, not quality.** `alt="image"` passes a scanner and fails a human; `alt="chart"` on a data chart conveys nothing. Audit what the alt *says*.
70
+ - ❌ **Claiming keyboard/SR passes from a screenshot.** You cannot see focus order or AT output in a PNG — list them as must-verify, don't invent a pass.
71
+ - ❌ **Severity inflation.** Tagging a decorative-image nit as a blocker burns the credibility the real keyboard trap needs.
72
+ - ❌ **Eyeballing contrast.** "Looks low" isn't a finding; "2.85:1, fails 4.5:1 AA" is.
73
+ - ❌ **Scanner-only thinking.** Reporting only what axe would catch and calling it an audit — the two-thirds it misses (focus order, label accuracy, meaningful sequence, error recovery) is where users actually get stuck.
74
+ - ❌ **Color as the only signal flagged once.** Reliance on color (1.4.1) shows up in status, charts, form errors, links-in-text — sweep every instance, not the first one.
@@ -0,0 +1,76 @@
1
+ # Worked example — login form component → severity-tagged audit
2
+
3
+ ## Input (React component, verbatim)
4
+
5
+ ```jsx
6
+ function LoginForm() {
7
+ const [err, setErr] = useState(false);
8
+ return (
9
+ <div className="login">
10
+ <div className="title" style={{fontSize: 22, fontWeight: 700}}>Sign in</div>
11
+ <input type="text" placeholder="Email" style={{color: '#999'}} />
12
+ <input type="password" placeholder="Password" />
13
+ {err && <span style={{color: 'red'}}>✕</span>}
14
+ <div className="btn" onClick={submit} style={{background:'#5b9', color:'#fff', padding:'6px 10px'}}>
15
+ Log in
16
+ </div>
17
+ <span className="link" onClick={forgot}>Forgot?</span>
18
+ </div>
19
+ );
20
+ }
21
+ ```
22
+
23
+ ## Output
24
+
25
+ ### Coverage note
26
+ Audited from component code: semantics, labels, roles, keyboard reachability, and contrast (from inline styles) are inspectable. Live focus-order and screen-reader output still need a real AT pass — flagged below.
27
+
28
+ ### 🟥 Blockers
29
+
30
+ **A11Y-1 — Submit control is a `<div>`, unreachable and unoperable by keyboard** · `2.1.1 Keyboard [A]`, `4.1.2 Name, Role, Value [A]` · `[auto]`+`[manual]`
31
+ A `<div onClick>` is not in the tab order, doesn't fire on Enter/Space, and exposes no button role or name to AT.
32
+ Blocks: keyboard-only and screen-reader users from logging in at all — there is no other submit path.
33
+ Fix: use `<button type="submit">Log in</button>` inside a `<form onSubmit>`. Same for `Forgot?` → `<button>` (or `<a href>` if it navigates).
34
+
35
+ **A11Y-2 — Inputs have no programmatic label** · `3.3.2 Labels or Instructions [A]`, `1.3.1 Info and Relationships [A]`, `4.1.2 [A]` · `[auto]`
36
+ Placeholders are not labels: they vanish on input and many screen readers don't announce them reliably. A screen-reader user hears "edit text, blank".
37
+ Fix: add `<label htmlFor>` tied to each input (visible label preferred), or at minimum `aria-label`. Placeholders stay as hints, not the only label.
38
+
39
+ ### 🟧 Major
40
+
41
+ **A11Y-3 — Error is conveyed by color and an icon glyph only, not associated with a field** · `1.4.1 Use of Color [A]`, `3.3.1 Error Identification [A]`, `4.1.3 Status Messages [AA]` · `[manual]`
42
+ A red `✕` with no text tells a blind or color-blind user nothing about what failed or which field. It's also not announced (no live region) and not linked to an input.
43
+ Blocks: blind users get no error info; color-blind users may miss the signal.
44
+ Fix: render text ("Incorrect email or password"), associate via `aria-describedby` on the relevant input, and put the message in `role="alert"` so it's announced.
45
+
46
+ **A11Y-4 — Email input text contrast fails AA** · `1.4.3 Contrast (Minimum) [AA]` · `[auto]`
47
+ `#999` on `#fff` = **2.85:1**, below the 4.5:1 minimum for normal text. Low-vision users can't read typed input.
48
+ Fix: darken to ≥ `#767676` (4.54:1) or darker.
49
+
50
+ ### 🟨 Minor
51
+
52
+ **A11Y-5 — Submit button color contrast borderline / unverifiable focus ring** · `1.4.3 [AA]`, `2.4.7 Focus Visible [AA]` · `[auto]`+`[manual]`
53
+ White text `#fff` on `#5b9` (`#55bb99`) = **2.35:1** — fails 4.5:1 for the button label. Also, once it's a real `<button>`, confirm a visible focus indicator exists (can't verify from static code).
54
+ Fix: darken the button background to clear 4.5:1 — e.g. `#1f7a57` = 5.28:1 (`#2e8b6f` is only 4.17:1 and still fails, the classic "looks dark enough" trap) — and ensure a visible `:focus-visible` outline.
55
+
56
+ ### ⚪ Nits
57
+
58
+ **A11Y-6 — Title is a styled `<div>`, not a heading** · `1.3.1 [A]`, `2.4.6 [AA]`
59
+ Screen-reader users navigate by headings; a visual-only "Sign in" isn't in the outline.
60
+ Fix: `<h1>` (or appropriate level) instead of `<div className="title">`.
61
+
62
+ ### What's solid
63
+ - `type="password"` is correct (masking + manager integration).
64
+ - Touch targets: padding gives the button adequate size once it's a real control — keep ≥ 24×24 (`2.5.8`).
65
+
66
+ ### Must verify with live AT
67
+ - Focus **order** through the form (DOM order looks correct, but confirm).
68
+ - Screen-reader announcement of the error live region after a failed submit.
69
+ - Visible focus indicator on all controls (`2.4.7`) once they're focusable.
70
+ - Behavior at 400% zoom / reflow (`1.4.10`).
71
+
72
+ ### Fix order
73
+ 1. A11Y-1, A11Y-2 (blockers — nobody can log in via AT).
74
+ 2. A11Y-3 (error semantics).
75
+ 3. A11Y-4, A11Y-5 (contrast — quick CSS).
76
+ 4. A11Y-6 (heading).
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "accessibility-audit",
3
+ "version": "0.1.0",
4
+ "description": "Adversarially audit a UI (component code, page markup, screenshot, or flow) against WCAG 2.2 AA — findings cited to specific success criteria, centered on the user and assistive tech each one blocks, severity-tagged, with a concrete fix and what a scanner would miss. Use when the user wants an accessibility review, a11y audit, WCAG check, or to find what blocks screen-reader / keyboard / low-vision users before shipping.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": ["devils-advocate", "doc-critique", "feature-implement-loop", "nfr-spec", "threat-model"],
9
+ "tags": ["accessibility", "a11y", "wcag", "audit", "review", "inclusive-design"],
10
+ "model": { "tier": "heavy", "rationale": "Adversarial review against WCAG success criteria — cheaper models fault alt-text presence over quality, under-call severity, miss focus-order/name-role-value issues, and claim AT passes from screenshots. Never downgrade." }
11
+ }
@@ -0,0 +1,69 @@
1
+ # accessibility-audit reference — WCAG 2.2 AA catalog, AT map, severity, scanner gaps
2
+
3
+ Run the catalog as a lens, not a transcript. Report only what the UI fails or what the input can't verify. Citations use the SC number + name + level.
4
+
5
+ ## The high-yield success criteria by POUR (WCAG 2.2, A + AA)
6
+
7
+ ### Perceivable
8
+ - **1.1.1 Non-text Content [A]** — every image/icon/control has a text alternative; decorative images have empty alt; alt *says something useful* (not "image").
9
+ - **1.3.1 Info and Relationships [A]** — structure conveyed visually is in the markup: headings are `<h*>`, lists are lists, labels are programmatically associated, tables have headers.
10
+ - **1.3.2 Meaningful Sequence [A]** — DOM/reading order matches the intended order (CSS can lie; screen readers follow DOM).
11
+ - **1.3.5 Identify Input Purpose [AA]** — inputs use `autocomplete` for known data (name, email).
12
+ - **1.4.1 Use of Color [A]** — color is never the *only* way info is conveyed (errors, status, chart series, links in body text).
13
+ - **1.4.3 Contrast (Minimum) [AA]** — text ≥ 4.5:1; large text (≥24px, or ≥19px bold) ≥ 3:1.
14
+ - **1.4.4 Resize Text [AA]** / **1.4.10 Reflow [AA]** — usable at 200% text and 400% zoom with no loss of content/function, no horizontal scroll at 320px-equivalent.
15
+ - **1.4.11 Non-text Contrast [AA]** — UI components and graphical objects (input borders, icons, focus rings) ≥ 3:1.
16
+ - **1.4.12 Text Spacing [AA]** — no clipping when users override line/letter/word spacing.
17
+ - **1.4.13 Content on Hover/Focus [AA]** — tooltips/popovers are dismissable, hoverable, persistent.
18
+
19
+ ### Operable
20
+ - **2.1.1 Keyboard [A]** — all functionality available from the keyboard.
21
+ - **2.1.2 No Keyboard Trap [A]** — focus can always move away.
22
+ - **2.1.4 Character Key Shortcuts [A]** — single-key shortcuts can be turned off/remapped.
23
+ - **2.4.3 Focus Order [A]** — tab order is logical and meaningful.
24
+ - **2.4.4 Link Purpose [A]** — link text makes sense (no bare "click here"/"read more" islands).
25
+ - **2.4.6 Headings and Labels [AA]** — descriptive; **2.4.7 Focus Visible [AA]** — a visible focus indicator on every focusable element.
26
+ - **2.4.11 Focus Not Obscured (Minimum) [AA, new in 2.2]** — focused element isn't hidden behind sticky headers/footers.
27
+ - **2.5.3 Label in Name [A]** — the accessible name contains the visible label text (voice control).
28
+ - **2.5.7 Dragging Movements [AA, 2.2]** — drag actions have a single-pointer alternative.
29
+ - **2.5.8 Target Size (Minimum) [AA, 2.2]** — targets ≥ 24×24 CSS px (or adequate spacing).
30
+
31
+ ### Understandable
32
+ - **3.1.1 Language of Page [A]** — `lang` set.
33
+ - **3.2.1 On Focus / 3.2.2 On Input [A]** — focus/input doesn't trigger surprise context changes.
34
+ - **3.2.6 Consistent Help [A, 2.2]** — help mechanisms appear consistently.
35
+ - **3.3.1 Error Identification [A]** — errors are described in text, programmatically associated with their field.
36
+ - **3.3.2 Labels or Instructions [A]** — inputs have visible labels/instructions.
37
+ - **3.3.3 Error Suggestion [AA]** — fixable errors offer a suggestion.
38
+ - **3.3.7 Redundant Entry [A, 2.2]** / **3.3.8 Accessible Authentication (Minimum) [AA, 2.2]** — don't force re-entry; don't require a cognitive function test (e.g. solving a puzzle) with no alternative.
39
+
40
+ ### Robust
41
+ - **4.1.2 Name, Role, Value [A]** — every UI component exposes a correct name, role, and state to AT (the #1 source of custom-widget failures).
42
+ - **4.1.3 Status Messages [AA]** — dynamic status (toasts, validation, live results) announced via `role="status"`/`aria-live` without moving focus.
43
+
44
+ ## Affected-user / assistive-tech map (name the victim)
45
+
46
+ | Barrier | Who it blocks | Tech that hits it |
47
+ |---|---|---|
48
+ | No keyboard access / trap / no focus ring | motor-impaired, power users, anyone without a mouse | keyboard-only, switch control |
49
+ | Missing/wrong name-role-value, bad alt | blind, low-vision | VoiceOver, NVDA, JAWS |
50
+ | Low contrast, color-only signal | low-vision, color-blind, sunlight/poor-screen users | screen magnifier, everyone outdoors |
51
+ | No reflow / breaks at zoom | low-vision | 200–400% zoom, mobile |
52
+ | Surprise context change, complex auth | cognitive, low-literacy, anxiety | all |
53
+ | Tiny targets, drag-only | motor, tremor, touch | touch, switch, eye-tracking |
54
+ | Unannounced dynamic updates | blind | screen readers |
55
+
56
+ ## Severity rubric (by task-completion impact)
57
+
58
+ - 🟥 **blocker** — a group cannot complete the core task at all.
59
+ - 🟧 **major** — significant barrier; a painful or non-obvious workaround exists.
60
+ - 🟨 **minor** — friction or confusion, task still completable.
61
+ - ⚪ **nit** — best practice / polish.
62
+
63
+ Calibrate: a keyboard trap on the only submit path is 🟥; `alt` slightly verbose is ⚪. If everything is 🟥, recheck against "can the task be completed?"
64
+
65
+ ## What automated scanners catch vs miss (tag findings [auto] / [manual])
66
+
67
+ **Caught by axe/Lighthouse [auto]** (~30–40% of issues): missing alt attribute, missing form label, low text contrast (computed), missing `lang`, duplicate IDs, ARIA attribute misuse, empty buttons/links, missing document title.
68
+
69
+ **Human + AT only [manual]** (the majority): alt-text *quality*, label *accuracy* (right label on right field), logical focus *order*, meaningful reading sequence, keyboard *operability* of custom widgets, focus *visibility* in practice, error-recovery *usability*, whether color is the *only* signal, reflow at zoom, sensible heading *outline*, live-region *announcements* firing correctly, whether a context change is *surprising*. These don't stay fixed without a recurring manual pass — say so.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: adr-generator
3
+ description: Generate an Architecture Decision Record (ADR) from a context-decision-consequences brief. Supports the two common formats — MADR (Markdown Any Decision Records) and Michael Nygard's original ADR template. Use whenever the user wants to capture an architectural decision, write an ADR, or document a "we decided X because Y" moment.
4
+ ---
5
+
6
+ # adr-generator
7
+
8
+ You help the user produce a clean, properly-numbered Architecture Decision Record.
9
+
10
+ ## How to respond
11
+
12
+ 1. **Pick the format.** Default to **MADR** (richer, has decision drivers + pros/cons per option). Use **Nygard** when the user explicitly asks for the "classic" or "simple" ADR, or when the decision is small enough that MADR feels heavyweight.
13
+
14
+ 2. **Gather the essentials.** Before drafting, make sure you know:
15
+ - **The decision being made** (one sentence — what changed)
16
+ - **The context / forces** (why was a decision needed?)
17
+ - **The options that were considered** (at least 2 — if only one option exists, this isn't really a decision)
18
+ - **Why the chosen option won** (the trade-off)
19
+
20
+ Ask at most 2 clarifying questions if essentials are missing. Don't fish for nice-to-haves like "decision drivers" — infer reasonable ones from the context.
21
+
22
+ 3. **Number it correctly.** ADRs are numbered sequentially starting at `0001`. Ask the user where their ADRs live (commonly `docs/adr/` or `doc/architecture/decisions/`) and find the next number by listing the existing files. If no ADRs exist yet, start at `0001`.
23
+
24
+ 4. **Pick the filename.** Use the slug form: `NNNN-short-title-in-kebab-case.md`. Examples:
25
+ - `0001-record-architecture-decisions.md`
26
+ - `0007-use-postgres-as-primary-datastore.md`
27
+ - `0014-adopt-event-driven-checkout.md`
28
+
29
+ 5. **Output.** Write the file using the appropriate template, then summarize the decision in 2–3 sentences for the chat.
30
+
31
+ ## Templates
32
+
33
+ - [`templates/madr.md`](templates/madr.md) — MADR 3.0 format (recommended)
34
+ - [`templates/nygard.md`](templates/nygard.md) — Nygard's original (simpler, 4 sections)
35
+
36
+ ## Quality bar
37
+
38
+ - **Status** must be one of: `Proposed`, `Accepted`, `Deprecated`, `Superseded by ADR-NNNN`. Default to `Proposed` unless the user says it's already been agreed.
39
+ - **Title is a noun phrase**, not a verb phrase. ✅ "Use Postgres as primary datastore" — ❌ "Decide what database to use".
40
+ - **Consequences must include trade-offs, not just upsides.** If you can't list a downside, the decision wasn't real.
41
+ - **Reference previous ADRs by number**, not by URL, so the cross-references survive folder restructures.
42
+ - **Don't editorialize.** An ADR records what was decided, not what you (the AI) think was wisest.
43
+
44
+ ## Anti-patterns to avoid
45
+
46
+ - ❌ Writing an ADR for a non-decision ("use industry best practices"). If the title could appear in a textbook, it's not a decision record.
47
+ - ❌ Listing 6 options when only 2 were seriously considered. Cut the noise.
48
+ - ❌ "Pros: it's better" with no "Cons:" line.
49
+ - ❌ Embedding implementation detail (code snippets, table schemas) — ADRs are about *why*, not *how*.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "adr-generator",
3
+ "version": "0.1.0",
4
+ "description": "Generate an Architecture Decision Record (ADR) from a context-decision-consequences brief. Supports the two common formats — MADR (Markdown Any Decision Records) and Michael Nygard's original ADR template. Use whenever the user wants to capture an architectural decision, write an ADR, or document a \"we decided X because Y\" moment.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": [],
9
+ "tags": ["adr", "documentation", "decisions", "architecture"],
10
+ "model": { "tier": "standard", "rationale": "Structures a decision into MADR/Nygard. Bounded judgment, not adversarial." }
11
+ }
@@ -0,0 +1,56 @@
1
+ # {Short noun phrase — the decision, not the question}
2
+
3
+ - Status: {Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](nnnn-...md)}
4
+ - Date: {YYYY-MM-DD}
5
+ - Deciders: {names or roles}
6
+ - Tags: {comma-separated, optional}
7
+
8
+ ## Context and Problem Statement
9
+
10
+ {Two to four sentences. What forces are at play? Why does a decision need to be made *now*? Use neutral language — the context is the same regardless of which option is chosen.}
11
+
12
+ ## Decision Drivers
13
+
14
+ - {Driver — e.g. "must run on existing AWS estate"}
15
+ - {Driver — e.g. "team has 5 years of Postgres expertise"}
16
+ - {Driver — e.g. "must support 10k QPS at p99 < 50ms"}
17
+
18
+ ## Considered Options
19
+
20
+ - {Option 1}
21
+ - {Option 2}
22
+ - {Option 3}
23
+
24
+ ## Decision Outcome
25
+
26
+ Chosen option: **{Option N}**, because {one-sentence rationale tied to the decision drivers above}.
27
+
28
+ ### Consequences
29
+
30
+ - ✅ {Positive — what becomes easier?}
31
+ - ⚠️ {Trade-off — what's acceptable but worth noting?}
32
+ - ❌ {Negative — what becomes harder or constrains future choices?}
33
+
34
+ ## Pros and Cons of the Options
35
+
36
+ ### {Option 1}
37
+
38
+ - ✅ Good, because {reason}
39
+ - ✅ Good, because {reason}
40
+ - ❌ Bad, because {reason}
41
+
42
+ ### {Option 2}
43
+
44
+ - ✅ Good, because {reason}
45
+ - ❌ Bad, because {reason}
46
+ - ❌ Bad, because {reason}
47
+
48
+ ### {Option 3}
49
+
50
+ - ✅ Good, because {reason}
51
+ - ❌ Bad, because {reason}
52
+
53
+ ## Links
54
+
55
+ - {Related ADR — e.g. [ADR-0003](0003-...md)}
56
+ - {External reference — e.g. RFC, vendor doc, benchmark}
@@ -0,0 +1,19 @@
1
+ # {NNNN}. {Short noun phrase — the decision}
2
+
3
+ Date: {YYYY-MM-DD}
4
+
5
+ ## Status
6
+
7
+ {Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](nnnn-...md)}
8
+
9
+ ## Context
10
+
11
+ {What is the issue that we're seeing that is motivating this decision or change? Describe the forces at play, including technological, political, social, and project-local. Use value-neutral language.}
12
+
13
+ ## Decision
14
+
15
+ {What is the change that we're actually proposing or doing?}
16
+
17
+ ## Consequences
18
+
19
+ {What becomes easier or more difficult to do because of this change? List both positive and negative consequences. If you can't list a downside, you haven't thought hard enough.}
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: ai-usage-report
3
+ description: Generate a per-user or team-level report on how AI tools are being used — volume, breadth, and effectiveness signals (e.g. whether AI outputs landed in shipped artifacts vs were generated and discarded). Consumes usage-event logs exported from an MCP server or other telemetry source. Use when a manager or team lead needs to understand AI adoption beyond raw counts — including spotting "AI theater" where people invoke AI to claim usage but don't act on the outputs.
4
+ ---
5
+
6
+ # ai-usage-report
7
+
8
+ You help the user turn a raw AI-usage log into a readable, useful report — one that distinguishes "people doing real work with AI" from "people pressing the button to be seen pressing the button."
9
+
10
+ This skill **consumes** telemetry that someone else collected (an MCP server, an IDE telemetry pipeline, a manual CSV export). It does **not** collect the data itself. Your job is to:
11
+
12
+ 1. Take the input file from the user.
13
+ 2. Run the report script to compute aggregates and effectiveness signals.
14
+ 3. Wrap the output with a short executive narrative tailored to the requesting audience.
15
+
16
+ ## How to respond
17
+
18
+ 1. **Confirm three inputs** before generating anything:
19
+
20
+ - **Input file.** A CSV or JSONL of usage events. Schema lives in [`templates/usage-event-schema.md`](templates/usage-event-schema.md). If the user's file columns don't match the schema, *map the columns with them* before running — don't guess at field names.
21
+
22
+ - **Reporting period.** `week`, `month`, or explicit `--from <date> --to <date>`. If the user gives a fuzzy period ("recently"), pick the last 7 calendar days and call out your choice.
23
+
24
+ - **View.** Exactly one of:
25
+ - `per-user` — named breakdown, manager view, includes effectiveness scores
26
+ - `team-rollup` — aggregate-only, no individual names, safe for staff/exec audiences
27
+ - `effectiveness` — focused on AI-theater flags and outputs-not-consumed signals
28
+
29
+ If the user hasn't picked a view, **ask**. Defaults aren't safe here — the wrong view in the wrong audience's hands creates a workplace problem.
30
+
31
+ 2. **Call out what the data does NOT support before running.** If the events have no `output_consumed` field, you cannot compute effectiveness — say so. If `session_id` is missing, you cannot compute breadth-per-session. The report should not invent numbers it doesn't have evidence for. Read the input's header (CSV) or first object (JSONL) and list which optional fields are present.
32
+
33
+ 3. **Run the build script.**
34
+
35
+ ```bash
36
+ # Claude Code
37
+ python3 "${CLAUDE_SKILL_DIR}/scripts/build_report.py" /path/to/events.csv \
38
+ --view per-user --period week --out ./out/ai-usage-week.md
39
+
40
+ # Other IDEs (from the skill folder)
41
+ cd path/to/ai-usage-report && python3 scripts/build_report.py /path/to/events.csv \
42
+ --view per-user --period week --out ./out/ai-usage-week.md
43
+ ```
44
+
45
+ The script writes a markdown file using the matching template in `templates/`. Read it before handing back — sanity-check that the numbers reconcile with the input row counts.
46
+
47
+ 4. **Add a 3-sentence handoff** above the report when delivering:
48
+ - **One sentence on volume** — total invocations, distinct users, period covered.
49
+ - **One sentence on what the data does and doesn't show** — flag missing signals explicitly.
50
+ - **One sentence on the most actionable pattern** — usually either "X users haven't engaged" or "Y% of outputs were generated but never consumed."
51
+
52
+ Then the report itself.
53
+
54
+ 5. **Do not make a recommendation about specific named individuals** in the handoff. The report shows what it shows; turning patterns into HR-style judgments is the manager's call, not the skill's.
55
+
56
+ ## Useful references in this skill
57
+
58
+ - [`templates/usage-event-schema.md`](templates/usage-event-schema.md) — the input event schema (required vs optional fields, graceful-degradation rules)
59
+ - [`templates/report-per-user.md`](templates/report-per-user.md) — per-user named-report layout
60
+ - [`templates/report-team-rollup.md`](templates/report-team-rollup.md) — aggregate team-level layout
61
+ - [`examples/weekly-engineering-team.md`](examples/weekly-engineering-team.md) — worked example: stub events → both report views
62
+ - [`scripts/build_report.py`](scripts/build_report.py) — the generator (stdlib only)
63
+
64
+ ## Effectiveness signals (what "performative vs effective" actually means here)
65
+
66
+ The skill has **no magic classifier**. It exposes a set of signals the user interprets. Each signal is a column or counter in the report.
67
+
68
+ | Signal | What it means | When it's reliable |
69
+ |---|---|---|
70
+ | **`output_consumed` rate** | % of AI invocations whose output landed in a shipped artifact (commit, PR, doc) | Only if telemetry tracks downstream consumption. If absent, this column is omitted, not faked. |
71
+ | **Single-shot rate** | % of sessions with exactly one invocation and no follow-up | High single-shot + low effectiveness = a starting place to ask about engagement |
72
+ | **Breadth** | Number of distinct tools/skills the user invoked | Low breadth + high volume = one-trick usage pattern |
73
+ | **Session depth** | Avg invocations per session | High depth often correlates with iterative, engaged use |
74
+ | **Output-to-shipped lag** | Median hours between AI invocation and artifact ship | Only meaningful if downstream consumption is tracked |
75
+ | **Discard rate** | % of outputs explicitly rejected (IDE-level signal) | Requires IDE instrumentation; many sources lack this |
76
+
77
+ **None of these signals is a verdict.** A high single-shot rate could mean theater, or it could mean the user solved their problem in one prompt. Low breadth could mean focused expertise. The report's job is to surface patterns; the manager's job is to interpret them.
78
+
79
+ ## Quality bar
80
+
81
+ - **Numbers are computed from the input, not estimated.** If the script cannot compute a metric (missing field), the column is omitted with a note. Never fill with `~` or `est.` placeholders.
82
+ - **Per-user reports include only users present in the input.** Don't infer missing users from elsewhere.
83
+ - **The "AI theater" framing lives in section headers, not in per-user judgments.** Say "Single-shot rate: 87%" — never "Alice is doing AI theater."
84
+ - **Privacy posture matches the view.** `per-user` names individuals; `team-rollup` never names anyone, even in passing.
85
+ - **Recommendations target patterns, not people.** "Consider a deeper-engagement workshop for the team" — never "Coach Alice to engage more deeply."
86
+ - **Period is explicit on the report header.** Every report shows the dates it covers.
87
+ - **Sample size is honored.** If `n_users < 5` in a team-rollup, the report is no longer anonymous — refuse to generate the team-rollup view and tell the user why.
88
+
89
+ ## When to use this skill
90
+
91
+ - ✅ A manager has a CSV/JSONL of AI usage events and wants a weekly/monthly read.
92
+ - ✅ A team lead wants to spot adoption gaps without naming individuals.
93
+ - ✅ An exec needs an AI-adoption rollup that doesn't read like a control panel.
94
+ - ✅ Building a baseline before/after rolling out a new AI tool or training.
95
+
96
+ ## When NOT to use this skill
97
+
98
+ - ❌ You don't have usage telemetry yet — the skill consumes data, doesn't collect it. See [[ai-usage-telemetry-design]] for the collection side.
99
+ - ❌ You want to *judge* specific named people. The skill surfaces patterns; performance judgments based on AI usage are a different (and harder) decision.
100
+ - ❌ The input lacks every effectiveness field. You can still produce a volume report, but call out the limitation explicitly — don't ship a report that looks like effectiveness analysis when it isn't.
101
+ - ❌ Your team is < 5 people *and* the view is team-rollup. Aggregate views aren't anonymous at that size.
102
+
103
+ ## Anti-patterns to avoid
104
+
105
+ - ❌ Inferring effectiveness from prompt length, prompt count, or session count alone. These measure *activity*, not *value*.
106
+ - ❌ Naming individuals in a team-rollup report — once a name appears in aggregate context, the report has crossed into per-user territory.
107
+ - ❌ Reporting on periods with too little data ("Mon–Tue only") and presenting it as a trend.
108
+ - ❌ Faking effectiveness columns when the input lacks them. Omit, don't estimate.
109
+ - ❌ Generating an "AI theater leaderboard" of named users. That's a workplace incident, not a report.
110
+ - ❌ Embedding the input prompts verbatim in the report. Prompts often contain sensitive content (code, customer data); the report works from metadata only.
111
+ - ❌ Comparing two periods that aren't normalized (e.g. a 7-day week against a 10-business-day window). If the script can't normalize, say so.
@@ -0,0 +1,133 @@
1
+ # Example: Weekly engineering-team rollup
2
+
3
+ A small synthetic event log demonstrating the three views — including graceful degradation when optional fields are missing and the privacy-floor refusal on `team-rollup` for small teams.
4
+
5
+ ## Input — `events.csv`
6
+
7
+ ```csv
8
+ timestamp,user,tool,session_id,output_consumed,consumed_at,outcome
9
+ 2026-05-19T09:14:23Z,alice@acme.com,claude-code,sess-001,1,2026-05-19T11:02:00Z,success
10
+ 2026-05-19T09:14:55Z,alice@acme.com,claude-code,sess-001,1,2026-05-19T11:02:00Z,success
11
+ 2026-05-19T09:18:02Z,alice@acme.com,deck-builder,sess-001,1,2026-05-19T14:30:00Z,success
12
+ 2026-05-19T10:01:11Z,bob@acme.com,cursor,sess-014,0,,success
13
+ 2026-05-19T10:01:30Z,bob@acme.com,cursor,sess-015,0,,success
14
+ 2026-05-19T10:02:11Z,bob@acme.com,cursor,sess-016,0,,success
15
+ 2026-05-19T10:03:11Z,bob@acme.com,cursor,sess-017,0,,success
16
+ 2026-05-19T10:04:11Z,bob@acme.com,cursor,sess-018,0,,success
17
+ 2026-05-20T14:22:08Z,carol@acme.com,claude-code,sess-029,1,2026-05-22T08:11:00Z,success
18
+ 2026-05-20T15:22:08Z,carol@acme.com,adr-generator,sess-029,1,2026-05-22T08:11:00Z,success
19
+ 2026-05-20T16:22:08Z,carol@acme.com,design-doc,sess-030,1,2026-05-22T08:11:00Z,success
20
+ 2026-05-19T11:14:23Z,dan@acme.com,claude-code,sess-101,1,2026-05-19T13:00:00Z,success
21
+ 2026-05-19T11:15:23Z,dan@acme.com,claude-code,sess-101,0,,success
22
+ 2026-05-20T08:14:23Z,eve@acme.com,claude-code,sess-201,1,2026-05-20T09:00:00Z,success
23
+ 2026-05-20T08:15:23Z,eve@acme.com,claude-code,sess-201,1,2026-05-20T09:00:00Z,success
24
+ 2026-05-20T08:16:23Z,eve@acme.com,cursor,sess-202,1,2026-05-20T10:00:00Z,success
25
+ ```
26
+
27
+ 16 events, 5 users, 5 tools, period 2026-05-19 → 2026-05-20.
28
+
29
+ ## Generate the three views
30
+
31
+ ```bash
32
+ # Per-user (manager view, names individuals)
33
+ python3 scripts/build_report.py events.csv \
34
+ --view per-user --from 2026-05-18 --to 2026-05-21 \
35
+ --team-name "Acme Eng" -o out/per-user.md
36
+
37
+ # Team-rollup (aggregate, no names, safe for skip-level/exec)
38
+ python3 scripts/build_report.py events.csv \
39
+ --view team-rollup --from 2026-05-18 --to 2026-05-21 \
40
+ --team-name "Acme Eng" -o out/team-rollup.md
41
+
42
+ # Effectiveness (per-user template, sorted by descending single-shot rate)
43
+ python3 scripts/build_report.py events.csv \
44
+ --view effectiveness --from 2026-05-18 --to 2026-05-21 \
45
+ --team-name "Acme Eng" -o out/effectiveness.md
46
+ ```
47
+
48
+ ## Output — per-user view (excerpt)
49
+
50
+ ```markdown
51
+ # AI Usage Report — Acme Eng
52
+
53
+ **Period:** 2026-05-18 → 2026-05-21 (3 days)
54
+ **Users in scope:** 5
55
+ **Total invocations:** 16
56
+
57
+ | User | Invocations | Sessions | Avg / session | Distinct tools | Effectiveness rate | Single-shot rate |
58
+ |---|---:|---:|---:|---:|---:|---:|
59
+ | alice@acme.com | 3 | 1 | 3.0 | 2 | 100% | 0% |
60
+ | bob@acme.com | 5 | 5 | 1.0 | 1 | 0% | 100% |
61
+ | carol@acme.com | 3 | 2 | 1.5 | 3 | 100% | 50% |
62
+ | dan@acme.com | 2 | 1 | 2.0 | 1 | 50% | 0% |
63
+ | eve@acme.com | 3 | 2 | 1.5 | 2 | 100% | 50% |
64
+ ```
65
+
66
+ **Reading the data:**
67
+ - **Alice** — 3 invocations in 1 session, all consumed, 2 tools. Deep, engaged use.
68
+ - **Bob** — 5 invocations across 5 different sessions, 0% consumed, 1 tool only. **This is the AI-theater pattern**: high single-shot rate + low effectiveness + low breadth. Worth a conversation — *but the conversation, not the verdict.*
69
+ - **Carol** — varied tools, mixed effectiveness. Healthy exploratory pattern.
70
+ - **Dan** — small sample. Don't over-read.
71
+ - **Eve** — engaged use, good breadth.
72
+
73
+ ## Output — team-rollup (excerpt)
74
+
75
+ ```markdown
76
+ # AI Usage Rollup — Acme Eng
77
+
78
+ | Metric | Value |
79
+ |---|---:|
80
+ | Invocations / user / day (median) | 1.0 |
81
+ | Distinct tools per user (median) | 2 |
82
+ | Effectiveness rate (team avg) | 62% |
83
+ | Single-shot session rate (team avg) | 64% |
84
+ | Active users (≥1 invocation in period) | 5 of 5 |
85
+
86
+ | Engagement tier | Users | What it means |
87
+ |---|---:|---|
88
+ | **Heavy** (>20 invocations/week) | 0 | … |
89
+ | **Moderate** (5–20 / week) | 4 | … |
90
+ | **Light** (1–4 / week) | 1 | … |
91
+ | **Inactive** (0 / week) | 0 | … |
92
+ ```
93
+
94
+ No names appear. The "Bob is doing AI theater" insight is invisible from this view by design — if a manager needs that signal, they switch to `per-user` and take ownership of the privacy boundary.
95
+
96
+ ## Demonstrating graceful degradation
97
+
98
+ If the input is missing optional fields, columns drop silently to `—`:
99
+
100
+ ```csv
101
+ timestamp,user,tool
102
+ 2026-05-19T09:14:23Z,alice@acme.com,claude-code
103
+ 2026-05-19T09:14:55Z,alice@acme.com,claude-code
104
+ ```
105
+
106
+ ```markdown
107
+ | User | Invocations | Sessions | Avg / session | Distinct tools | Effectiveness rate | Single-shot rate |
108
+ | alice@acme.com | 2 | — | — | 1 | — | — |
109
+ ```
110
+
111
+ The "Where signals are missing" section then explains *what* couldn't be computed and *why*.
112
+
113
+ ## Demonstrating the privacy floor
114
+
115
+ With fewer than 5 users in scope, `team-rollup` refuses to generate:
116
+
117
+ ```
118
+ $ python3 scripts/build_report.py small_team.csv --view team-rollup ...
119
+ error: team-rollup requires ≥5 users in scope; got 3. Aggregate views aren't
120
+ anonymous at that size. Use --view per-user and treat the output as identifying.
121
+ ```
122
+
123
+ This is the contract — the tool won't be the one to anonymize-by-accident a team that's too small to be anonymous.
124
+
125
+ ## Hand-off to the user (what the agent would say)
126
+
127
+ > Generated `out/per-user.md` — 5 users, 16 invocations, period 2026-05-19 to 2026-05-20.
128
+ >
129
+ > Two things to know before reading:
130
+ > 1. **All optional signals were present**, so the report includes effectiveness and single-shot columns. The numbers are real, not estimated.
131
+ > 2. **The most actionable pattern** is in the single-shot + effectiveness columns. One user shows 100% single-shot and 0% effectiveness — a starting place to ask about engagement, *not* a verdict on intent. The report flags the pattern; interpretation is yours.
132
+ >
133
+ > Want me to also produce the team-rollup view? It hides individual names and is safer for broader audiences.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "ai-usage-report",
3
+ "version": "0.1.0",
4
+ "description": "Generate a per-user or team-level report on how AI tools are being used — volume, breadth, and effectiveness signals (e.g. whether AI outputs landed in shipped artifacts vs were generated and discarded). Consumes usage-event logs exported from an MCP server or other telemetry source. Use when a manager or team lead needs to understand AI adoption beyond raw counts — including spotting \"AI theater\" where people invoke AI to claim usage but don't act on the outputs.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": [],
9
+ "tags": ["ai-usage", "reporting", "telemetry", "adoption", "observability", "manager-tools"],
10
+ "model": { "tier": "standard", "rationale": "Tabulates telemetry; the 'AI theater' effectiveness call needs some judgment." }
11
+ }