@intentsolutionsio/tonone 0.9.7
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.
- package/.claude-plugin/CLAUDE.md +11 -0
- package/.claude-plugin/marketplace.json +2178 -0
- package/.claude-plugin/plugin.json +135 -0
- package/LICENSE +21 -0
- package/README.md +462 -0
- package/agents/apex.md +247 -0
- package/agents/atlas.md +181 -0
- package/agents/cortex.md +173 -0
- package/agents/crest.md +130 -0
- package/agents/draft.md +190 -0
- package/agents/echo.md +146 -0
- package/agents/flux.md +145 -0
- package/agents/forge.md +121 -0
- package/agents/form.md +244 -0
- package/agents/helm.md +180 -0
- package/agents/lens.md +145 -0
- package/agents/lumen.md +139 -0
- package/agents/pave.md +169 -0
- package/agents/pitch.md +177 -0
- package/agents/prism.md +181 -0
- package/agents/proof.md +205 -0
- package/agents/relay.md +147 -0
- package/agents/spine.md +207 -0
- package/agents/surge.md +127 -0
- package/agents/touch.md +185 -0
- package/agents/vigil.md +165 -0
- package/agents/volt.md +184 -0
- package/agents/warden.md +172 -0
- package/package.json +48 -0
- package/skills/apex/SKILL.md +32 -0
- package/skills/apex-plan/.claude-plugin/plugin.json +16 -0
- package/skills/apex-plan/SKILL.md +59 -0
- package/skills/apex-recon/.claude-plugin/plugin.json +16 -0
- package/skills/apex-recon/SKILL.md +91 -0
- package/skills/apex-review/.claude-plugin/plugin.json +16 -0
- package/skills/apex-review/SKILL.md +53 -0
- package/skills/apex-status/.claude-plugin/plugin.json +16 -0
- package/skills/apex-status/SKILL.md +42 -0
- package/skills/apex-takeover/.claude-plugin/plugin.json +16 -0
- package/skills/apex-takeover/SKILL.md +50 -0
- package/skills/atlas/SKILL.md +34 -0
- package/skills/atlas-adr/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-adr/SKILL.md +147 -0
- package/skills/atlas-changelog/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-changelog/SKILL.md +156 -0
- package/skills/atlas-map/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-map/SKILL.md +183 -0
- package/skills/atlas-onboard/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-onboard/SKILL.md +138 -0
- package/skills/atlas-present/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-present/SKILL.md +214 -0
- package/skills/atlas-recon/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-recon/SKILL.md +101 -0
- package/skills/atlas-report/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-report/SKILL.md +304 -0
- package/skills/cortex/SKILL.md +32 -0
- package/skills/cortex-eval/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-eval/SKILL.md +143 -0
- package/skills/cortex-integrate/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-integrate/SKILL.md +218 -0
- package/skills/cortex-model/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-model/SKILL.md +138 -0
- package/skills/cortex-prompt/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-prompt/SKILL.md +246 -0
- package/skills/cortex-recon/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-recon/SKILL.md +156 -0
- package/skills/crest/SKILL.md +32 -0
- package/skills/crest-compete/.claude-plugin/plugin.json +16 -0
- package/skills/crest-compete/SKILL.md +158 -0
- package/skills/crest-narrative/.claude-plugin/plugin.json +16 -0
- package/skills/crest-narrative/SKILL.md +124 -0
- package/skills/crest-okr/.claude-plugin/plugin.json +16 -0
- package/skills/crest-okr/SKILL.md +119 -0
- package/skills/crest-recon/.claude-plugin/plugin.json +16 -0
- package/skills/crest-recon/SKILL.md +91 -0
- package/skills/crest-roadmap/.claude-plugin/plugin.json +16 -0
- package/skills/crest-roadmap/SKILL.md +129 -0
- package/skills/draft/SKILL.md +34 -0
- package/skills/draft-flow/.claude-plugin/plugin.json +16 -0
- package/skills/draft-flow/SKILL.md +93 -0
- package/skills/draft-ia/.claude-plugin/plugin.json +16 -0
- package/skills/draft-ia/SKILL.md +204 -0
- package/skills/draft-landing/.claude-plugin/plugin.json +16 -0
- package/skills/draft-landing/SKILL.md +60 -0
- package/skills/draft-patterns/.claude-plugin/plugin.json +16 -0
- package/skills/draft-patterns/SKILL.md +55 -0
- package/skills/draft-recon/.claude-plugin/plugin.json +16 -0
- package/skills/draft-recon/SKILL.md +108 -0
- package/skills/draft-review/.claude-plugin/plugin.json +16 -0
- package/skills/draft-review/SKILL.md +131 -0
- package/skills/draft-wireframe/.claude-plugin/plugin.json +16 -0
- package/skills/draft-wireframe/SKILL.md +167 -0
- package/skills/echo/SKILL.md +32 -0
- package/skills/echo-feedback/.claude-plugin/plugin.json +16 -0
- package/skills/echo-feedback/SKILL.md +129 -0
- package/skills/echo-interview/.claude-plugin/plugin.json +16 -0
- package/skills/echo-interview/SKILL.md +189 -0
- package/skills/echo-jobs/.claude-plugin/plugin.json +16 -0
- package/skills/echo-jobs/SKILL.md +193 -0
- package/skills/echo-recon/.claude-plugin/plugin.json +16 -0
- package/skills/echo-recon/SKILL.md +96 -0
- package/skills/echo-segment/.claude-plugin/plugin.json +16 -0
- package/skills/echo-segment/SKILL.md +105 -0
- package/skills/flux/SKILL.md +33 -0
- package/skills/flux-health/.claude-plugin/plugin.json +16 -0
- package/skills/flux-health/SKILL.md +97 -0
- package/skills/flux-migrate/.claude-plugin/plugin.json +16 -0
- package/skills/flux-migrate/SKILL.md +176 -0
- package/skills/flux-pipeline/.claude-plugin/plugin.json +16 -0
- package/skills/flux-pipeline/SKILL.md +86 -0
- package/skills/flux-query/.claude-plugin/plugin.json +16 -0
- package/skills/flux-query/SKILL.md +87 -0
- package/skills/flux-recon/.claude-plugin/plugin.json +16 -0
- package/skills/flux-recon/SKILL.md +101 -0
- package/skills/flux-schema/.claude-plugin/plugin.json +16 -0
- package/skills/flux-schema/SKILL.md +125 -0
- package/skills/forge/SKILL.md +33 -0
- package/skills/forge-audit/.claude-plugin/plugin.json +16 -0
- package/skills/forge-audit/SKILL.md +117 -0
- package/skills/forge-cost/.claude-plugin/plugin.json +16 -0
- package/skills/forge-cost/SKILL.md +144 -0
- package/skills/forge-diagnose/.claude-plugin/plugin.json +16 -0
- package/skills/forge-diagnose/SKILL.md +122 -0
- package/skills/forge-infra/.claude-plugin/plugin.json +16 -0
- package/skills/forge-infra/SKILL.md +169 -0
- package/skills/forge-network/.claude-plugin/plugin.json +16 -0
- package/skills/forge-network/SKILL.md +106 -0
- package/skills/forge-recon/.claude-plugin/plugin.json +16 -0
- package/skills/forge-recon/SKILL.md +143 -0
- package/skills/form/SKILL.md +40 -0
- package/skills/form-audit/.claude-plugin/plugin.json +16 -0
- package/skills/form-audit/SKILL.md +290 -0
- package/skills/form-brand/.claude-plugin/plugin.json +16 -0
- package/skills/form-brand/SKILL.md +214 -0
- package/skills/form-component/.claude-plugin/plugin.json +16 -0
- package/skills/form-component/SKILL.md +336 -0
- package/skills/form-deck/.claude-plugin/plugin.json +16 -0
- package/skills/form-deck/SKILL.md +263 -0
- package/skills/form-email/.claude-plugin/plugin.json +16 -0
- package/skills/form-email/SKILL.md +304 -0
- package/skills/form-exam/.claude-plugin/plugin.json +16 -0
- package/skills/form-exam/SKILL.md +103 -0
- package/skills/form-logo/.claude-plugin/plugin.json +16 -0
- package/skills/form-logo/SKILL.md +231 -0
- package/skills/form-mobile/.claude-plugin/plugin.json +16 -0
- package/skills/form-mobile/SKILL.md +276 -0
- package/skills/form-palette/.claude-plugin/plugin.json +16 -0
- package/skills/form-palette/SKILL.md +68 -0
- package/skills/form-social/.claude-plugin/plugin.json +16 -0
- package/skills/form-social/SKILL.md +272 -0
- package/skills/form-style/.claude-plugin/plugin.json +16 -0
- package/skills/form-style/SKILL.md +63 -0
- package/skills/form-tokens/.claude-plugin/plugin.json +16 -0
- package/skills/form-tokens/SKILL.md +760 -0
- package/skills/form-web/.claude-plugin/plugin.json +16 -0
- package/skills/form-web/SKILL.md +254 -0
- package/skills/helm/SKILL.md +32 -0
- package/skills/helm-arbiter/.claude-plugin/plugin.json +16 -0
- package/skills/helm-arbiter/SKILL.md +104 -0
- package/skills/helm-brief/.claude-plugin/plugin.json +16 -0
- package/skills/helm-brief/SKILL.md +105 -0
- package/skills/helm-handoff/.claude-plugin/plugin.json +16 -0
- package/skills/helm-handoff/SKILL.md +102 -0
- package/skills/helm-plan/.claude-plugin/plugin.json +16 -0
- package/skills/helm-plan/SKILL.md +73 -0
- package/skills/helm-recon/.claude-plugin/plugin.json +16 -0
- package/skills/helm-recon/SKILL.md +99 -0
- package/skills/lens/SKILL.md +33 -0
- package/skills/lens-audit/.claude-plugin/plugin.json +16 -0
- package/skills/lens-audit/SKILL.md +101 -0
- package/skills/lens-chart/.claude-plugin/plugin.json +16 -0
- package/skills/lens-chart/SKILL.md +59 -0
- package/skills/lens-dashboard/.claude-plugin/plugin.json +16 -0
- package/skills/lens-dashboard/SKILL.md +212 -0
- package/skills/lens-metrics/.claude-plugin/plugin.json +16 -0
- package/skills/lens-metrics/SKILL.md +298 -0
- package/skills/lens-recon/.claude-plugin/plugin.json +16 -0
- package/skills/lens-recon/SKILL.md +106 -0
- package/skills/lens-report/.claude-plugin/plugin.json +16 -0
- package/skills/lens-report/SKILL.md +158 -0
- package/skills/lumen/SKILL.md +32 -0
- package/skills/lumen-abtest/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-abtest/SKILL.md +217 -0
- package/skills/lumen-funnel/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-funnel/SKILL.md +108 -0
- package/skills/lumen-instrument/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-instrument/SKILL.md +130 -0
- package/skills/lumen-metrics/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-metrics/SKILL.md +189 -0
- package/skills/lumen-recon/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-recon/SKILL.md +108 -0
- package/skills/pave/SKILL.md +32 -0
- package/skills/pave-audit/.claude-plugin/plugin.json +16 -0
- package/skills/pave-audit/SKILL.md +109 -0
- package/skills/pave-catalog/.claude-plugin/plugin.json +16 -0
- package/skills/pave-catalog/SKILL.md +202 -0
- package/skills/pave-env/.claude-plugin/plugin.json +16 -0
- package/skills/pave-env/SKILL.md +102 -0
- package/skills/pave-golden/.claude-plugin/plugin.json +16 -0
- package/skills/pave-golden/SKILL.md +173 -0
- package/skills/pave-recon/.claude-plugin/plugin.json +16 -0
- package/skills/pave-recon/SKILL.md +118 -0
- package/skills/pitch/SKILL.md +33 -0
- package/skills/pitch-copy/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-copy/SKILL.md +133 -0
- package/skills/pitch-landing/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-landing/SKILL.md +62 -0
- package/skills/pitch-launch/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-launch/SKILL.md +222 -0
- package/skills/pitch-message/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-message/SKILL.md +98 -0
- package/skills/pitch-position/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-position/SKILL.md +195 -0
- package/skills/pitch-recon/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-recon/SKILL.md +102 -0
- package/skills/prism/SKILL.md +34 -0
- package/skills/prism-audit/.claude-plugin/plugin.json +16 -0
- package/skills/prism-audit/SKILL.md +129 -0
- package/skills/prism-chart/.claude-plugin/plugin.json +16 -0
- package/skills/prism-chart/SKILL.md +56 -0
- package/skills/prism-component/.claude-plugin/plugin.json +16 -0
- package/skills/prism-component/SKILL.md +270 -0
- package/skills/prism-dashboard/.claude-plugin/plugin.json +16 -0
- package/skills/prism-dashboard/SKILL.md +108 -0
- package/skills/prism-recon/.claude-plugin/plugin.json +16 -0
- package/skills/prism-recon/SKILL.md +109 -0
- package/skills/prism-stack/.claude-plugin/plugin.json +16 -0
- package/skills/prism-stack/SKILL.md +58 -0
- package/skills/prism-ui/.claude-plugin/plugin.json +16 -0
- package/skills/prism-ui/SKILL.md +247 -0
- package/skills/proof/SKILL.md +33 -0
- package/skills/proof-api/.claude-plugin/plugin.json +16 -0
- package/skills/proof-api/SKILL.md +86 -0
- package/skills/proof-audit/.claude-plugin/plugin.json +16 -0
- package/skills/proof-audit/SKILL.md +97 -0
- package/skills/proof-design/.claude-plugin/plugin.json +16 -0
- package/skills/proof-design/SKILL.md +133 -0
- package/skills/proof-e2e/.claude-plugin/plugin.json +16 -0
- package/skills/proof-e2e/SKILL.md +309 -0
- package/skills/proof-recon/.claude-plugin/plugin.json +16 -0
- package/skills/proof-recon/SKILL.md +98 -0
- package/skills/proof-strategy/.claude-plugin/plugin.json +16 -0
- package/skills/proof-strategy/SKILL.md +150 -0
- package/skills/relay/SKILL.md +33 -0
- package/skills/relay-audit/.claude-plugin/plugin.json +16 -0
- package/skills/relay-audit/SKILL.md +101 -0
- package/skills/relay-deploy/.claude-plugin/plugin.json +16 -0
- package/skills/relay-deploy/SKILL.md +404 -0
- package/skills/relay-docker/.claude-plugin/plugin.json +16 -0
- package/skills/relay-docker/SKILL.md +73 -0
- package/skills/relay-pipeline/.claude-plugin/plugin.json +16 -0
- package/skills/relay-pipeline/SKILL.md +267 -0
- package/skills/relay-recon/.claude-plugin/plugin.json +16 -0
- package/skills/relay-recon/SKILL.md +108 -0
- package/skills/relay-ship/.claude-plugin/plugin.json +16 -0
- package/skills/relay-ship/SKILL.md +253 -0
- package/skills/spine/SKILL.md +33 -0
- package/skills/spine-api/.claude-plugin/plugin.json +16 -0
- package/skills/spine-api/SKILL.md +184 -0
- package/skills/spine-design/.claude-plugin/plugin.json +16 -0
- package/skills/spine-design/SKILL.md +193 -0
- package/skills/spine-perf/.claude-plugin/plugin.json +16 -0
- package/skills/spine-perf/SKILL.md +120 -0
- package/skills/spine-recon/.claude-plugin/plugin.json +16 -0
- package/skills/spine-recon/SKILL.md +130 -0
- package/skills/spine-review/.claude-plugin/plugin.json +16 -0
- package/skills/spine-review/SKILL.md +122 -0
- package/skills/spine-service/.claude-plugin/plugin.json +16 -0
- package/skills/spine-service/SKILL.md +77 -0
- package/skills/surge/SKILL.md +33 -0
- package/skills/surge-activation/.claude-plugin/plugin.json +16 -0
- package/skills/surge-activation/SKILL.md +130 -0
- package/skills/surge-experiment/.claude-plugin/plugin.json +16 -0
- package/skills/surge-experiment/SKILL.md +134 -0
- package/skills/surge-landing/.claude-plugin/plugin.json +16 -0
- package/skills/surge-landing/SKILL.md +65 -0
- package/skills/surge-plg/.claude-plugin/plugin.json +16 -0
- package/skills/surge-plg/SKILL.md +243 -0
- package/skills/surge-recon/.claude-plugin/plugin.json +16 -0
- package/skills/surge-recon/SKILL.md +109 -0
- package/skills/surge-retention/.claude-plugin/plugin.json +16 -0
- package/skills/surge-retention/SKILL.md +222 -0
- package/skills/tonone-onboard/.claude-plugin/plugin.json +17 -0
- package/skills/tonone-onboard/SKILL.md +158 -0
- package/skills/touch/SKILL.md +33 -0
- package/skills/touch-app/.claude-plugin/plugin.json +16 -0
- package/skills/touch-app/SKILL.md +335 -0
- package/skills/touch-audit/.claude-plugin/plugin.json +16 -0
- package/skills/touch-audit/SKILL.md +190 -0
- package/skills/touch-feature/.claude-plugin/plugin.json +16 -0
- package/skills/touch-feature/SKILL.md +242 -0
- package/skills/touch-recon/.claude-plugin/plugin.json +16 -0
- package/skills/touch-recon/SKILL.md +194 -0
- package/skills/touch-release/.claude-plugin/plugin.json +16 -0
- package/skills/touch-release/SKILL.md +216 -0
- package/skills/touch-ui/.claude-plugin/plugin.json +16 -0
- package/skills/touch-ui/SKILL.md +58 -0
- package/skills/vigil/SKILL.md +32 -0
- package/skills/vigil-alert/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-alert/SKILL.md +291 -0
- package/skills/vigil-check/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-check/SKILL.md +108 -0
- package/skills/vigil-incident/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-incident/SKILL.md +152 -0
- package/skills/vigil-instrument/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-instrument/SKILL.md +324 -0
- package/skills/vigil-recon/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-recon/SKILL.md +114 -0
- package/skills/volt/SKILL.md +32 -0
- package/skills/volt-driver/.claude-plugin/plugin.json +16 -0
- package/skills/volt-driver/SKILL.md +112 -0
- package/skills/volt-firmware/.claude-plugin/plugin.json +16 -0
- package/skills/volt-firmware/SKILL.md +271 -0
- package/skills/volt-ota/.claude-plugin/plugin.json +16 -0
- package/skills/volt-ota/SKILL.md +312 -0
- package/skills/volt-power/.claude-plugin/plugin.json +16 -0
- package/skills/volt-power/SKILL.md +112 -0
- package/skills/volt-recon/.claude-plugin/plugin.json +16 -0
- package/skills/volt-recon/SKILL.md +100 -0
- package/skills/warden/SKILL.md +32 -0
- package/skills/warden-audit/.claude-plugin/plugin.json +16 -0
- package/skills/warden-audit/SKILL.md +103 -0
- package/skills/warden-harden/.claude-plugin/plugin.json +16 -0
- package/skills/warden-harden/SKILL.md +245 -0
- package/skills/warden-iam/.claude-plugin/plugin.json +16 -0
- package/skills/warden-iam/SKILL.md +102 -0
- package/skills/warden-recon/.claude-plugin/plugin.json +16 -0
- package/skills/warden-recon/SKILL.md +115 -0
- package/skills/warden-threat/.claude-plugin/plugin.json +16 -0
- package/skills/warden-threat/SKILL.md +155 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lens-metrics",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Produce a complete metrics definition doc \u2014 metric name, formula, data source, segmentation, SQL or event tracking spec, and what good/bad looks like. Given a product area, outputs the full metrics spec. Use when asked to \"define KPIs\", \"metrics framework\", \"what should we measure\", \"north star metric\", or \"instrument this feature\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"lens",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lens-metrics
|
|
3
|
+
description: Produce a complete metrics definition doc — metric name, formula, data source, segmentation, SQL or event tracking spec, and what good/bad looks like. Given a product area, outputs the full metrics spec. Use when asked to "define KPIs", "metrics framework", "what should we measure", "north star metric", or "instrument this feature".
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
tags: ["ai-agency", "tonone"]
|
|
9
|
+
compatibility: "Designed for Claude Code"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Define and Implement Metrics
|
|
13
|
+
|
|
14
|
+
You are Lens — the data analytics and BI engineer from the Engineering Team. A metric without a precise definition is a guess. A metric nobody acts on is noise.
|
|
15
|
+
|
|
16
|
+
Write the metrics spec. Write the SQL. Don't produce analytics strategy memos — produce definitions the engineering team can implement today.
|
|
17
|
+
|
|
18
|
+
## Steps
|
|
19
|
+
|
|
20
|
+
### Step 0: Detect Environment
|
|
21
|
+
|
|
22
|
+
Scan workspace for data infrastructure:
|
|
23
|
+
|
|
24
|
+
- Database configs — PostgreSQL, BigQuery, Snowflake, ClickHouse, DuckDB
|
|
25
|
+
- ORM/migration files — understand data model and available tables
|
|
26
|
+
- Existing metrics — SQL views, dbt models, analytics queries, dashboard configs
|
|
27
|
+
- `dbt_project.yml` — dbt metrics layer
|
|
28
|
+
- Product analytics tools — Mixpanel, Amplitude, PostHog, GA4 configs
|
|
29
|
+
- Existing definitions — metrics glossary, data dictionary, tracking plan
|
|
30
|
+
|
|
31
|
+
Identify what data is available, what schema exists, and what's already tracked.
|
|
32
|
+
|
|
33
|
+
### Step 1: Run the "So What?" Audit
|
|
34
|
+
|
|
35
|
+
Before defining any metric, answer for each candidate:
|
|
36
|
+
|
|
37
|
+
1. **What decision does this metric inform?** — Who looks at it, what do they do when it moves?
|
|
38
|
+
2. **What would you do if it doubled?** — If "celebrate and keep going", maybe it's a north star.
|
|
39
|
+
3. **What would you do if it halved?** — If a specific investigation path, it's a good operational metric.
|
|
40
|
+
4. **Is it leading or lagging?** — Lagging confirms what happened. Leading predicts what will happen. Need both.
|
|
41
|
+
|
|
42
|
+
Cut any metric where the honest answer is "interesting." Need a decision, not curiosity.
|
|
43
|
+
|
|
44
|
+
### Step 2: Define the North Star Metric
|
|
45
|
+
|
|
46
|
+
The ONE metric that best captures whether product delivers value to users.
|
|
47
|
+
|
|
48
|
+
Write in this exact format:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
North Star: [Metric Name]
|
|
52
|
+
Definition: [Precise definition — what counts, what doesn't, what time window]
|
|
53
|
+
Formula: [count / rate / ratio — expressed unambiguously]
|
|
54
|
+
Data source: [table.column or event name]
|
|
55
|
+
Why this: [how it connects to actual product value delivered]
|
|
56
|
+
Target: [what "good" looks like — absolute or growth rate]
|
|
57
|
+
Alert: [what value triggers investigation]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
North Star: Weekly Active Projects
|
|
64
|
+
Definition: Count of distinct projects with at least one edit, comment, or publish
|
|
65
|
+
event in the last 7 rolling days. Excludes projects owned by internal
|
|
66
|
+
test accounts (domain: @company.com).
|
|
67
|
+
Formula: COUNT(DISTINCT project_id) WHERE last_activity >= NOW() - INTERVAL '7 days'
|
|
68
|
+
Data source: projects table + events table (event_type IN ('edit','comment','publish'))
|
|
69
|
+
Why this: A project being actively worked on means the user is getting value.
|
|
70
|
+
Signups and logins measure intent; project activity measures delivery.
|
|
71
|
+
Target: 15% week-over-week growth in first 6 months
|
|
72
|
+
Alert: < -5% week-over-week for 2 consecutive weeks
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Step 3: Define Supporting KPIs (3–5 max)
|
|
76
|
+
|
|
77
|
+
Levers that explain why the north star moves. Each one in full:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Metric: [Name]
|
|
81
|
+
Definition: [Precise — no wiggle room. "Active" must specify exactly what active means.]
|
|
82
|
+
Formula: [Exact calculation]
|
|
83
|
+
Data source: [table(s) and columns]
|
|
84
|
+
Segment by: [dimensions that matter — plan, cohort, channel, geography, device]
|
|
85
|
+
Leading/lagging: [leading = predicts future | lagging = confirms past]
|
|
86
|
+
Good: [threshold — what triggers positive action]
|
|
87
|
+
Bad: [threshold — what triggers investigation]
|
|
88
|
+
Owner: [team or role responsible for moving this]
|
|
89
|
+
SQL: [see Step 4]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Common KPI categories for product:
|
|
93
|
+
|
|
94
|
+
- **Acquisition:** new signups, activation rate, time-to-first-value
|
|
95
|
+
- **Engagement:** DAU/WAU/MAU ratio, feature adoption rate, session depth
|
|
96
|
+
- **Retention:** D1/D7/D30 retention, weekly cohort retention curves, churn rate
|
|
97
|
+
- **Monetization:** conversion to paid, MRR, expansion revenue, LTV
|
|
98
|
+
- **Quality:** error rate, p95 latency, support ticket volume per active user
|
|
99
|
+
|
|
100
|
+
### Step 4: Write the SQL for Every Metric
|
|
101
|
+
|
|
102
|
+
Write production-quality SQL for each metric. Each query:
|
|
103
|
+
|
|
104
|
+
- Has a comment header with business definition
|
|
105
|
+
- Uses CTEs, not nested subqueries
|
|
106
|
+
- Is parameterized by date range where appropriate
|
|
107
|
+
- Handles NULLs and division-by-zero explicitly
|
|
108
|
+
|
|
109
|
+
**Retention curve (D1/D7/D30):**
|
|
110
|
+
|
|
111
|
+
```sql
|
|
112
|
+
-- User Retention by Signup Cohort
|
|
113
|
+
-- For each weekly cohort, % of users still active at D1, D7, D30
|
|
114
|
+
-- "Active" = any event in the events table (not just login)
|
|
115
|
+
WITH cohorts AS (
|
|
116
|
+
SELECT
|
|
117
|
+
user_id,
|
|
118
|
+
DATE_TRUNC('week', created_at) AS cohort_week
|
|
119
|
+
FROM users
|
|
120
|
+
WHERE created_at >= NOW() - INTERVAL '90 days'
|
|
121
|
+
),
|
|
122
|
+
activity AS (
|
|
123
|
+
SELECT DISTINCT
|
|
124
|
+
e.user_id,
|
|
125
|
+
DATE_TRUNC('day', e.created_at) AS active_day
|
|
126
|
+
FROM events e
|
|
127
|
+
WHERE e.created_at >= NOW() - INTERVAL '90 days'
|
|
128
|
+
)
|
|
129
|
+
SELECT
|
|
130
|
+
c.cohort_week,
|
|
131
|
+
COUNT(DISTINCT c.user_id) AS cohort_size,
|
|
132
|
+
COUNT(DISTINCT CASE
|
|
133
|
+
WHEN a.active_day BETWEEN
|
|
134
|
+
(MIN(u.created_at)::date + 1) AND
|
|
135
|
+
(MIN(u.created_at)::date + 1)
|
|
136
|
+
THEN a.user_id END) AS retained_d1,
|
|
137
|
+
COUNT(DISTINCT CASE
|
|
138
|
+
WHEN a.active_day BETWEEN
|
|
139
|
+
(MIN(u.created_at)::date + 7) AND
|
|
140
|
+
(MIN(u.created_at)::date + 7)
|
|
141
|
+
THEN a.user_id END) AS retained_d7,
|
|
142
|
+
COUNT(DISTINCT CASE
|
|
143
|
+
WHEN a.active_day BETWEEN
|
|
144
|
+
(MIN(u.created_at)::date + 30) AND
|
|
145
|
+
(MIN(u.created_at)::date + 30)
|
|
146
|
+
THEN a.user_id END) AS retained_d30,
|
|
147
|
+
ROUND(COUNT(DISTINCT CASE WHEN a.active_day =
|
|
148
|
+
MIN(u.created_at)::date + 1 THEN a.user_id END)
|
|
149
|
+
::numeric / NULLIF(COUNT(DISTINCT c.user_id), 0) * 100, 1) AS d1_pct,
|
|
150
|
+
ROUND(COUNT(DISTINCT CASE WHEN a.active_day =
|
|
151
|
+
MIN(u.created_at)::date + 7 THEN a.user_id END)
|
|
152
|
+
::numeric / NULLIF(COUNT(DISTINCT c.user_id), 0) * 100, 1) AS d7_pct,
|
|
153
|
+
ROUND(COUNT(DISTINCT CASE WHEN a.active_day =
|
|
154
|
+
MIN(u.created_at)::date + 30 THEN a.user_id END)
|
|
155
|
+
::numeric / NULLIF(COUNT(DISTINCT c.user_id), 0) * 100, 1) AS d30_pct
|
|
156
|
+
FROM cohorts c
|
|
157
|
+
JOIN users u ON u.user_id = c.user_id
|
|
158
|
+
LEFT JOIN activity a ON a.user_id = c.user_id
|
|
159
|
+
GROUP BY 1
|
|
160
|
+
ORDER BY 1 DESC;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Activation rate:**
|
|
164
|
+
|
|
165
|
+
```sql
|
|
166
|
+
-- Activation Rate
|
|
167
|
+
-- Definition: % of users who reach "activated" state within 7 days of signup
|
|
168
|
+
-- "Activated" = completed onboarding + created at least 1 project
|
|
169
|
+
-- Why 7 days: users who don't activate within a week rarely return
|
|
170
|
+
WITH signups AS (
|
|
171
|
+
SELECT user_id, created_at AS signed_up_at
|
|
172
|
+
FROM users
|
|
173
|
+
WHERE created_at >= NOW() - INTERVAL '30 days'
|
|
174
|
+
),
|
|
175
|
+
activations AS (
|
|
176
|
+
SELECT DISTINCT user_id
|
|
177
|
+
FROM events
|
|
178
|
+
WHERE event_type = 'project_created'
|
|
179
|
+
),
|
|
180
|
+
onboarded AS (
|
|
181
|
+
SELECT DISTINCT user_id
|
|
182
|
+
FROM events
|
|
183
|
+
WHERE event_type = 'onboarding_complete'
|
|
184
|
+
)
|
|
185
|
+
SELECT
|
|
186
|
+
COUNT(DISTINCT s.user_id) AS signups,
|
|
187
|
+
COUNT(DISTINCT a.user_id) AS activated,
|
|
188
|
+
ROUND(
|
|
189
|
+
COUNT(DISTINCT a.user_id)::numeric /
|
|
190
|
+
NULLIF(COUNT(DISTINCT s.user_id), 0) * 100, 1
|
|
191
|
+
) AS activation_rate_pct
|
|
192
|
+
FROM signups s
|
|
193
|
+
LEFT JOIN activations a ON a.user_id = s.user_id
|
|
194
|
+
LEFT JOIN onboarded ob ON ob.user_id = s.user_id;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Weekly engagement ratio (DAU/WAU):**
|
|
198
|
+
|
|
199
|
+
```sql
|
|
200
|
+
-- Engagement Ratio: DAU / WAU
|
|
201
|
+
-- Measures stickiness — how often weekly actives return daily
|
|
202
|
+
-- Benchmark: consumer apps target > 20%, B2B SaaS > 15%
|
|
203
|
+
WITH dau AS (
|
|
204
|
+
SELECT COUNT(DISTINCT user_id) AS value
|
|
205
|
+
FROM events
|
|
206
|
+
WHERE created_at::date = CURRENT_DATE - 1 -- yesterday
|
|
207
|
+
),
|
|
208
|
+
wau AS (
|
|
209
|
+
SELECT COUNT(DISTINCT user_id) AS value
|
|
210
|
+
FROM events
|
|
211
|
+
WHERE created_at >= CURRENT_DATE - 7
|
|
212
|
+
)
|
|
213
|
+
SELECT
|
|
214
|
+
dau.value AS dau,
|
|
215
|
+
wau.value AS wau,
|
|
216
|
+
ROUND(dau.value::numeric / NULLIF(wau.value, 0) * 100, 1) AS engagement_ratio_pct
|
|
217
|
+
FROM dau, wau;
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Step 5: Write the Event Tracking Spec (if product analytics tool in use)
|
|
221
|
+
|
|
222
|
+
For each metric requiring instrumented events (Mixpanel, Amplitude, PostHog, GA4), write tracking spec:
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
Event: project_created
|
|
226
|
+
Trigger: user clicks "Create Project" and the project is successfully saved
|
|
227
|
+
Properties:
|
|
228
|
+
- project_id: string (UUID)
|
|
229
|
+
- project_type: enum ['blank', 'template', 'imported']
|
|
230
|
+
- user_id: string (UUID)
|
|
231
|
+
- org_id: string (UUID)
|
|
232
|
+
- plan: enum ['free', 'pro', 'enterprise']
|
|
233
|
+
- created_at: ISO 8601 timestamp
|
|
234
|
+
Do NOT fire: on project duplication (use project_duplicated event instead)
|
|
235
|
+
Owner: [team responsible for instrumentation]
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Step 6: Create SQL Views
|
|
239
|
+
|
|
240
|
+
Create SQL view file for each metric so any BI tool can query it directly:
|
|
241
|
+
|
|
242
|
+
```sql
|
|
243
|
+
-- metrics/activation_rate.sql
|
|
244
|
+
CREATE OR REPLACE VIEW metrics.activation_rate AS
|
|
245
|
+
SELECT
|
|
246
|
+
DATE_TRUNC('week', u.created_at) AS cohort_week,
|
|
247
|
+
COUNT(DISTINCT u.user_id) AS signups,
|
|
248
|
+
COUNT(DISTINCT e.user_id) AS activated,
|
|
249
|
+
ROUND(
|
|
250
|
+
COUNT(DISTINCT e.user_id)::numeric /
|
|
251
|
+
NULLIF(COUNT(DISTINCT u.user_id), 0) * 100,
|
|
252
|
+
1) AS activation_rate_pct
|
|
253
|
+
FROM users u
|
|
254
|
+
LEFT JOIN events e
|
|
255
|
+
ON e.user_id = u.user_id
|
|
256
|
+
AND e.event_type = 'project_created'
|
|
257
|
+
AND e.created_at <= u.created_at + INTERVAL '7 days'
|
|
258
|
+
GROUP BY 1
|
|
259
|
+
ORDER BY 1 DESC;
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Step 7: Deliver the Metrics Spec
|
|
263
|
+
|
|
264
|
+
Output complete metrics definition document. Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
┌─ Metrics Spec: [Product Area] ─────────────────────────┐
|
|
268
|
+
│ Stage: [early/growth/mature] Data source: [stack] │
|
|
269
|
+
└────────────────────────────────────────────────────────┘
|
|
270
|
+
|
|
271
|
+
NORTH STAR
|
|
272
|
+
[Metric Name]
|
|
273
|
+
[Definition in one sentence]
|
|
274
|
+
Target: [value] Alert: [threshold]
|
|
275
|
+
|
|
276
|
+
KPIS (3–5)
|
|
277
|
+
──────────────────────────────────────────────────────────
|
|
278
|
+
Metric Definition Target Owner
|
|
279
|
+
────────────────── ────────────────────── ──────── ─────
|
|
280
|
+
[name] [precise definition] [value] [who]
|
|
281
|
+
[name] [precise definition] [value] [who]
|
|
282
|
+
|
|
283
|
+
IMPLEMENTED
|
|
284
|
+
[N] SQL views → [location]
|
|
285
|
+
[N] Event specs → [tracking plan location]
|
|
286
|
+
Metrics doc → [path]
|
|
287
|
+
|
|
288
|
+
MISSING DATA
|
|
289
|
+
[any metric that requires instrumentation not yet in place]
|
|
290
|
+
|
|
291
|
+
RULE
|
|
292
|
+
Every metric has: precise definition, SQL query, target, owner.
|
|
293
|
+
Missing any one of those? It's not a metric — it's a guess.
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Delivery
|
|
297
|
+
|
|
298
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lens-recon",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Analytics reconnaissance for takeover \u2014 find all analytics tools, inventory what's tracked and dashboarded, assess data freshness and metric definitions, and present a coverage map. Use when asked \"what analytics exist\", \"BI assessment\", or \"what do we track\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"lens",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lens-recon
|
|
3
|
+
description: Analytics reconnaissance for takeover — find all analytics tools, inventory what's tracked and dashboarded, assess data freshness and metric definitions, and present a coverage map. Use when asked "what analytics exist", "BI assessment", or "what do we track".
|
|
4
|
+
allowed-tools: Read, Bash, Glob, Grep, WebFetch, WebSearch, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Analytics Reconnaissance
|
|
11
|
+
|
|
12
|
+
You are Lens — the data analytics and BI engineer from the Engineering Team. Map analytics landscape before building anything new.
|
|
13
|
+
|
|
14
|
+
## Steps
|
|
15
|
+
|
|
16
|
+
### Step 0: Detect Environment
|
|
17
|
+
|
|
18
|
+
Scan workspace broadly for all analytics-related artifacts:
|
|
19
|
+
|
|
20
|
+
- `docker-compose.yml` — Metabase, Grafana, Superset, Redash, ClickHouse, TimescaleDB
|
|
21
|
+
- Config files — check for Looker (`*.lkml`), dbt (`dbt_project.yml`), Evidence (`evidence.config.yaml`)
|
|
22
|
+
- Product analytics — Mixpanel, Amplitude, PostHog, GA4, Heap (check for SDK init, tracking calls, config)
|
|
23
|
+
- Monitoring — Grafana, Datadog, New Relic configs
|
|
24
|
+
- Custom dashboards — Streamlit, Dash, Retool, internal admin panels
|
|
25
|
+
- SQL directories — `analytics/`, `queries/`, `reports/`, `sql/`, `metrics/`
|
|
26
|
+
- Scheduled jobs — cron, Airflow, Prefect, GitHub Actions that touch data
|
|
27
|
+
- Data warehouse — BigQuery, Snowflake, Redshift connection configs
|
|
28
|
+
- Tracking code — event tracking calls in application code (`track()`, `analytics.identify()`, `gtag()`)
|
|
29
|
+
|
|
30
|
+
### Step 1: Inventory What's Tracked
|
|
31
|
+
|
|
32
|
+
Document all data collection:
|
|
33
|
+
|
|
34
|
+
- **Events tracked** — what user actions are captured (page views, clicks, signups, purchases)
|
|
35
|
+
- **Properties captured** — what metadata is attached to events
|
|
36
|
+
- **Server-side tracking** — API logs, database events, webhook data
|
|
37
|
+
- **Third-party data** — payment provider data, email service data, ad platform data
|
|
38
|
+
- **Infrastructure metrics** — CPU, memory, request latency, error rates
|
|
39
|
+
|
|
40
|
+
### Step 2: Inventory What's Dashboarded
|
|
41
|
+
|
|
42
|
+
Document all visualization and reporting:
|
|
43
|
+
|
|
44
|
+
- **Dashboards** — what exists, in what tool, who built it, when last updated
|
|
45
|
+
- **Scheduled reports** — what goes out, to whom, how often
|
|
46
|
+
- **Alerts** — what triggers notifications, who receives them, what thresholds
|
|
47
|
+
- **Ad hoc queries** — saved queries in BI tools or SQL files
|
|
48
|
+
|
|
49
|
+
### Step 3: Assess Quality
|
|
50
|
+
|
|
51
|
+
For each analytics artifact, evaluate:
|
|
52
|
+
|
|
53
|
+
- **Are metrics defined?** — precise definitions, or ambiguous labels?
|
|
54
|
+
- **Is data fresh?** — are pipelines running, is data up to date?
|
|
55
|
+
- **Are dashboards maintained?** — last modified date, does it reflect current product?
|
|
56
|
+
- **Is there automation?** — scheduled refreshes, alerts, or manual pull?
|
|
57
|
+
- **Who has access?** — is analytics self-serve or gated behind one person?
|
|
58
|
+
|
|
59
|
+
### Step 4: Present Coverage Map
|
|
60
|
+
|
|
61
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
## Analytics Reconnaissance
|
|
65
|
+
|
|
66
|
+
### Tools in Use
|
|
67
|
+
| Tool | Purpose | Status |
|
|
68
|
+
|------|---------|--------|
|
|
69
|
+
| [Metabase/Grafana/etc] | [what it's used for] | [active/stale/unused] |
|
|
70
|
+
| ... | ... | ... |
|
|
71
|
+
|
|
72
|
+
### Tracking Coverage
|
|
73
|
+
| Area | What's Tracked | What's Dashboarded | What's Alerted | Gap |
|
|
74
|
+
|------|---------------|-------------------|---------------|-----|
|
|
75
|
+
| User acquisition | [events] | [dashboard?] | [alert?] | [gap?] |
|
|
76
|
+
| User activation | [events] | [dashboard?] | [alert?] | [gap?] |
|
|
77
|
+
| Engagement | [events] | [dashboard?] | [alert?] | [gap?] |
|
|
78
|
+
| Revenue | [events] | [dashboard?] | [alert?] | [gap?] |
|
|
79
|
+
| Infrastructure | [metrics] | [dashboard?] | [alert?] | [gap?] |
|
|
80
|
+
|
|
81
|
+
### Data Infrastructure
|
|
82
|
+
- **Warehouse:** [BigQuery/Snowflake/Postgres/none]
|
|
83
|
+
- **Transformation:** [dbt/custom SQL/none]
|
|
84
|
+
- **Orchestration:** [Airflow/cron/none]
|
|
85
|
+
- **Freshness:** [real-time/hourly/daily/unknown]
|
|
86
|
+
|
|
87
|
+
### Assessment
|
|
88
|
+
- **Defined metrics:** [N] out of [N] dashboard metrics have precise definitions
|
|
89
|
+
- **Data freshness:** [status — pipelines healthy or broken]
|
|
90
|
+
- **Self-serve:** [yes/no — can stakeholders query without engineering help]
|
|
91
|
+
- **Automation:** [N] scheduled reports, [N] alerts configured
|
|
92
|
+
|
|
93
|
+
### Key Gaps
|
|
94
|
+
1. [most critical gap — what's not tracked or dashboarded that should be]
|
|
95
|
+
2. [second gap]
|
|
96
|
+
3. [third gap]
|
|
97
|
+
|
|
98
|
+
### What's Working
|
|
99
|
+
- [positive observation — well-maintained dashboard, good tracking coverage]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Present facts. Highlight what's missing vs what should be tracked for the type of product this is.
|
|
103
|
+
|
|
104
|
+
## Delivery
|
|
105
|
+
|
|
106
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lens-report",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Build a reporting pipeline \u2014 scheduled reports with SQL queries, delivery via Slack or email, threshold alerts, and historical comparison. Use when asked for \"automated reports\", \"scheduled report\", \"email digest\", or \"Slack alerts for metrics\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"lens",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lens-report
|
|
3
|
+
description: Build a reporting pipeline — scheduled reports with SQL queries, delivery via Slack or email, threshold alerts, and historical comparison. Use when asked for "automated reports", "scheduled report", "email digest", or "Slack alerts for metrics".
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
tags: ["ai-agency", "tonone"]
|
|
9
|
+
compatibility: "Designed for Claude Code"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Build Reporting Pipeline
|
|
13
|
+
|
|
14
|
+
You are Lens — the data analytics and BI engineer from the Engineering Team.
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
### Step 0: Detect Environment
|
|
19
|
+
|
|
20
|
+
Scan workspace for data and scheduling infrastructure:
|
|
21
|
+
|
|
22
|
+
- Database configs — connection strings, ORM configs (what data source)
|
|
23
|
+
- `docker-compose.yml` — check for Airflow, Prefect, Dagster, or cron-based scheduling
|
|
24
|
+
- `.github/workflows/` — GitHub Actions (can schedule reports)
|
|
25
|
+
- `crontab`, systemd timers — simple scheduling
|
|
26
|
+
- Slack webhook URLs or bot tokens in config/env
|
|
27
|
+
- Email/SMTP configuration
|
|
28
|
+
- Existing report scripts or SQL queries
|
|
29
|
+
- `dbt_project.yml` — dbt for transformation before reporting
|
|
30
|
+
|
|
31
|
+
Identify: data source, scheduling mechanism, delivery channel.
|
|
32
|
+
|
|
33
|
+
### Step 1: Understand the Report Requirements
|
|
34
|
+
|
|
35
|
+
Determine (from context or by asking):
|
|
36
|
+
|
|
37
|
+
- **What metrics?** — which numbers matter for this report
|
|
38
|
+
- **Who receives it?** — stakeholders, team, leadership
|
|
39
|
+
- **What frequency?** — daily, weekly, monthly (weekly is usually the sweet spot)
|
|
40
|
+
- **What triggers action?** — what should make someone stop and investigate
|
|
41
|
+
- **What format?** — Slack message, email, PDF, dashboard link
|
|
42
|
+
|
|
43
|
+
### Step 2: Build SQL Queries
|
|
44
|
+
|
|
45
|
+
For each metric in the report, create SQL returning:
|
|
46
|
+
|
|
47
|
+
- **Current value** — metric for this reporting period
|
|
48
|
+
- **Previous period** — same metric for last period (week-over-week, month-over-month)
|
|
49
|
+
- **Change** — absolute and percentage change
|
|
50
|
+
- **Threshold status** — above/below target
|
|
51
|
+
|
|
52
|
+
```sql
|
|
53
|
+
-- Example: Weekly active users with comparison
|
|
54
|
+
WITH current_week AS (
|
|
55
|
+
SELECT COUNT(DISTINCT user_id) AS active_users
|
|
56
|
+
FROM events
|
|
57
|
+
WHERE event_date >= current_date - interval '7 days'
|
|
58
|
+
),
|
|
59
|
+
previous_week AS (
|
|
60
|
+
SELECT COUNT(DISTINCT user_id) AS active_users
|
|
61
|
+
FROM events
|
|
62
|
+
WHERE event_date >= current_date - interval '14 days'
|
|
63
|
+
AND event_date < current_date - interval '7 days'
|
|
64
|
+
)
|
|
65
|
+
SELECT
|
|
66
|
+
c.active_users AS current,
|
|
67
|
+
p.active_users AS previous,
|
|
68
|
+
c.active_users - p.active_users AS change,
|
|
69
|
+
ROUND((c.active_users - p.active_users)::numeric / NULLIF(p.active_users, 0) * 100, 1) AS pct_change
|
|
70
|
+
FROM current_week c, previous_week p;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 3: Build the Scheduling Mechanism
|
|
74
|
+
|
|
75
|
+
Choose based on detected infrastructure:
|
|
76
|
+
|
|
77
|
+
- **GitHub Actions** — cron-triggered workflow that runs the report script
|
|
78
|
+
- **Airflow/Prefect/Dagster** — DAG or flow with schedule
|
|
79
|
+
- **Simple cron** — bash or Python script on a schedule
|
|
80
|
+
- **dbt + scheduler** — dbt run then report
|
|
81
|
+
|
|
82
|
+
Create scheduling config with:
|
|
83
|
+
|
|
84
|
+
- Schedule expression (cron syntax)
|
|
85
|
+
- Retry logic on failure
|
|
86
|
+
- Timeout to prevent hung jobs
|
|
87
|
+
- Logging for debugging
|
|
88
|
+
|
|
89
|
+
### Step 4: Build the Delivery
|
|
90
|
+
|
|
91
|
+
Format and send the report:
|
|
92
|
+
|
|
93
|
+
**Slack webhook:**
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Weekly Report — [Date Range]
|
|
97
|
+
|
|
98
|
+
Active Users: 1,234 (+12% vs last week)
|
|
99
|
+
Revenue: $45,678 (-3% vs last week) [BELOW TARGET]
|
|
100
|
+
Conversion: 4.2% (stable)
|
|
101
|
+
|
|
102
|
+
[Link to full dashboard]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Email:** HTML table with metrics, sparklines optional, link to dashboard.
|
|
106
|
+
|
|
107
|
+
Include:
|
|
108
|
+
|
|
109
|
+
- **Historical comparison** — this week vs last week, this month vs last month
|
|
110
|
+
- **Threshold alerts** — highlight metrics that crossed boundaries (above/below target)
|
|
111
|
+
- **Trend indicator** — up/down/stable arrows or text
|
|
112
|
+
- **Link to detail** — always link to full dashboard for drill-down
|
|
113
|
+
|
|
114
|
+
### Step 5: Add Threshold Alerts
|
|
115
|
+
|
|
116
|
+
For critical metrics, add separate alerts (not just in the report):
|
|
117
|
+
|
|
118
|
+
- **Threshold definition** — what value triggers an alert
|
|
119
|
+
- **Alert channel** — Slack DM, channel mention, PagerDuty for critical
|
|
120
|
+
- **Cooldown** — don't alert again for N hours after firing
|
|
121
|
+
- **Context** — include enough data in alert to understand the issue
|
|
122
|
+
|
|
123
|
+
### Step 6: Present Summary
|
|
124
|
+
|
|
125
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
## Reporting Pipeline Built
|
|
129
|
+
|
|
130
|
+
**Metrics:** [N] | **Schedule:** [frequency] | **Delivery:** [Slack/email/both]
|
|
131
|
+
|
|
132
|
+
### Report Contents
|
|
133
|
+
| Metric | Comparison | Threshold |
|
|
134
|
+
|--------|-----------|-----------|
|
|
135
|
+
| [name] | vs last [period] | [target] |
|
|
136
|
+
| ... | ... | ... |
|
|
137
|
+
|
|
138
|
+
### Pipeline
|
|
139
|
+
- Query: [SQL files location]
|
|
140
|
+
- Schedule: [cron expression / scheduler config]
|
|
141
|
+
- Delivery: [Slack webhook / email / both]
|
|
142
|
+
- Alerts: [N] threshold alerts configured
|
|
143
|
+
|
|
144
|
+
### Files Created
|
|
145
|
+
- [path to report script]
|
|
146
|
+
- [path to SQL queries]
|
|
147
|
+
- [path to schedule config]
|
|
148
|
+
|
|
149
|
+
### Next Steps
|
|
150
|
+
- [ ] Set up [Slack webhook / email credentials]
|
|
151
|
+
- [ ] Test with current data
|
|
152
|
+
- [ ] Confirm report recipients
|
|
153
|
+
- [ ] Adjust thresholds after first week of data
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Delivery
|
|
157
|
+
|
|
158
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lumen
|
|
3
|
+
description: Product analyst — metrics architecture, funnel analysis, A/B test design, retention, and growth measurement.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
|
|
5
|
+
version: 0.9.1
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
tags: ["ai-agency", "tonone"]
|
|
9
|
+
compatibility: "Designed for Claude Code"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Lumen — Product Analytics
|
|
13
|
+
|
|
14
|
+
You are Lumen — the product analyst. Design measurement systems, analyze funnels, and run experiments.
|
|
15
|
+
|
|
16
|
+
The user gave you: `{{args}}`
|
|
17
|
+
|
|
18
|
+
Read the request and invoke the right skill with the Skill tool.
|
|
19
|
+
|
|
20
|
+
## Skills
|
|
21
|
+
|
|
22
|
+
| Skill | Use when |
|
|
23
|
+
| ------------------ | ------------------------------------------------------------------------- |
|
|
24
|
+
| `lumen-abtest` | Design an A/B experiment — hypothesis, metric, MDE, sample size, run time |
|
|
25
|
+
| `lumen-funnel` | Funnel analysis — map drop-off points and diagnose conversion issues |
|
|
26
|
+
| `lumen-instrument` | Instrumentation plan — event taxonomy, property schema, tracking plan |
|
|
27
|
+
| `lumen-metrics` | Metrics architecture — North Star, input tree, instrumentation spec |
|
|
28
|
+
| `lumen-recon` | Scan existing event tracking, metric definitions, and dashboards |
|
|
29
|
+
|
|
30
|
+
Default (no args or unclear): `lumen-recon`.
|
|
31
|
+
|
|
32
|
+
Invoke now. Pass `{{args}}` as args.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lumen-abtest",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "A/B test design \u2014 produce an experiment spec with hypothesis, primary metric, MDE, sample size, run time, and decision rule. Also determines when NOT to A/B test and what to do instead. Use when asked to \"design an A/B test\", \"should we test this\", \"experiment design\", \"how do we know if this works\", \"what's the sample size\", or \"set up an experiment\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"lumen",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|