Subscription usage
Skill nimrodfisher/data-context-layer-studio/examples/subscription-usage
Complete context for the Subscription Usage domain at LumenFit (fictional) — trial conversion, active subscribers, engagement minutes, and churn for a consumer fitness subscription. Use when a question is about who is subscribed, whether trials convert, how much members use the app, or who is at risk of cancelling. Example skill — definitions still draft, pending owner sign-off.From its SKILL.md
npx -y skills add nimrodfisher/data-context-layer-studio --skill subscription-usageAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
Subscription Usage — Context Skill (example)
This file is a map, not an encyclopedia. It points at files; it doesn't explain things. If you're tempted to explain a metric here, it belongs in
data_context/metrics.yml. Keep this file under ~90 lines.
Status: 🟡 example — definitions draft, pending sign-off · see POPULATING.md
| Piece | State |
|---|---|
data_context/verified_queries/ | 🟢 3 queries (T1, A1, C1), signed 2026-07-18 by [email protected] |
data_context/metrics.yml | 🟡 4 metrics, all decisions captured — pending flip draft → agreed |
data_context/caveats.md | 🟢 6 caveats (C-01–C-06), measured 2026-07-17 |
data_context/semantic_layer/ | 🟢 3 tables mapped — _index.md + one .yml per table |
data_context/table_profiling/ | 🟡 index + per-table stubs — run scripts/profile_table.sql to fill |
What this domain owns
- Metrics:
trial_conversion_rate,active_subscribers,active_minutes,monthly_churn_rate— defined indata_context/metrics.yml. - Tables:
FACT_MEMBER_SESSION,FACT_SUBSCRIPTION_CYCLE,DIM_MEMBER— mapped indata_context/semantic_layer/_index.md. - Boundary: owns subscription status, trial conversion, in-app engagement, and churn. Does not own revenue/MRR (Finance domain), acquisition/ad spend (Growth domain), or content performance (Content domain). For "did engagement drive revenue?", route to Finance.
Non-negotiables
- Check
data_context/verified_queries/before writing any SQL. T1/A1/C1 are signed — swap a date or a plan filter, don't rewrite joins or grain. - Use the metric definition from
metrics.ymlverbatim. Metrics aredraft— flag answers as provisional until an owner flips them toagreed. Never invent a metric. - Read
caveats.mdbefore any query. Mandatory filter:IS_INTERNAL = FALSEon every table (staff accounts skew every number — C-01). - "Active" is ambiguous — always clarify.
active_subscribers(paying) vsactive_minutes(engaged) are different questions. Ask which one they mean (C-04). - Trial rows are not subscriber rows.
SUBSCRIPTION_STATE = 'trialing'is excluded from subscriber counts by default (C-02). - Never
SELECT *. Always a date filter on the fact tables. AlwaysLIMITwhile exploring. - State the grain of the result (per member, per cycle, per session) and any assumption. One line.
- If it isn't defined here, stop and ask. A correct "X is undefined" beats a confident wrong number.
Routing map
| If the question is about… | Read |
|---|---|
| What this product is, who uses it, how it earns | product_context/overview.md |
| "What changed recently", "why did X move" | recent_updates/_index.md, then the month file |
| What a named metric means | data_context/metrics.yml |
| Anything needing SQL — start here | data_context/verified_queries/verified_queries.yml |
| Which table, per-member vs per-cycle grain, how to join | data_context/semantic_layer/_index.md |
| What a column's values actually mean | data_context/table_profiling/<table>.md |
| Known gotchas that change the number | data_context/caveats.md |
| Rules for writing new SQL | guardrails.md |
Load one row. Not the folder.
SQL preflight
1. verified_queries.yml → exact match? run verbatim, stop.
→ near match? swap date/plan filter ONLY, load caveats.md, stop.
→ no match? ↓
2. guardrails.md · caveats.md · semantic_layer/_index.md
· the table yamls you need · their table_profiling files
→ write SQL → propose it back as a verification candidate
Worked examples
"How do we decide which plans to promote?" → product_context/overview.md. No data files.
"Trial-to-paid conversion for the annual plan last quarter?" → verified_queries.yml → T1,
swap the plan filter. Exact-ish match.
"How many active subscribers right now?" → A1. But first confirm: paying subscribers
(A1), or engaged members (that's active_minutes, C-04)?
"Who's about to churn?" → C1 flags at-risk cycles; this domain owns the risk signal, not the revenue impact. For "how much revenue is at risk", name the Finance domain too.
"Did more workouts drive higher revenue?" → Route. This domain owns engagement; Finance
owns revenue. Surface active_minutes and hand off.
What ships with it: 24 files
32.9 KB alongside SKILL.md
data_context/
- caveats.md2.4 KB
- _index.md1.4 KB
- metrics.yml5.0 KB
- semantic_layer/dim_member.yml1.3 KB
- semantic_layer/fact_member_session.yml1.1 KB
- semantic_layer/fact_subscription_cycle.yml1.1 KB
- semantic_layer/_index.md1.1 KB
- table_profiling/dim_member.md565 B
- table_profiling/fact_member_session.md584 B
- table_profiling/fact_subscription_cycle.md614 B
- table_profiling/_index.md645 B
- table_profiling/scripts/profile_table.sql1.1 KB
- verified_queries/_index.md657 B
- verified_queries/verified_queries.yml1.3 KB
product_context/
- glossary.md771 B
- _index.md873 B
- lifecycle.md766 B
- overview.md2.3 KB
- user-segments.md812 B
recent_updates/
- _index.md450 B
- INGESTION.md797 B
- GOVERNANCE.md2.1 KB
- guardrails.md2.5 KB
- POPULATING.md2.9 KB