From thinking-frameworks-skills
Loads and validates a weekly Substack CSV stats export, reconciles headers against expected schema, and parses post rows + subscriber aggregates. Serves as a fallback when Chrome automation is unavailable for fetch-substack-stats.
How this skill is triggered — by the user, by Claude, or both
Slash command
/thinking-frameworks-skills:ingest-substack-csvThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
Per weekly CSV:
- [ ] Step 1: Read header row; diff against .schema-expected.json
- [ ] Step 2: If load-bearing column missing, halt + emit schema-warning stub
- [ ] Step 3: Parse post rows (load-bearing: views, opens, open_rate, clicks, sent, post_date)
- [ ] Step 4: Parse subscribers aggregate (total, free/paid distribution, activity tiers) — NEVER row-by-row emails
- [ ] Step 5: Emit typed WeekExport object
- [ ] Step 6: On success, move CSV into corpus/stats/YYYY-WW.csv
Posts CSV columns (load-bearing in bold): id, slug, title, post_date, views, opens, open_rate, clicks, click_through_rate, sent, delivered, signups_within_1_day, subscriptions_within_1_day, unsubscribes_within_1_day, signups, subscribes, shares, estimated_value, engagement_rate, reaction_count, comment_count
Subscribers CSV (handled separately, never ingested row-by-row): email, created_at, subscription_type, activity_tier, email_opens_last_30_days, email_opens_last_7_days.
If a load-bearing column is missing:
ops/growth-analyst/YYYY-WW-schema-warning.md with the header diff..schema-expected.json if confirmed."New columns (additions) are accepted silently. Removals of non-load-bearing columns produce a soft note but don't halt.
{
"subscribers_end": int,
"delta_subscribers": int,
"posts": [ {slug, title, post_date, views, opens, open_rate, clicks, sent, ...} ],
"sends_this_week": int,
"free_subs": int,
"paid_subs": int,
"activity_tier_distribution": {active, at-risk, churned}
}
inbox/ after 7 days (privacy posture).npx claudepluginhub lyndonkl/claude --plugin thinking-frameworks-skillsAutomates Substack stats collection via Chrome browser automation, parsing the dashboard for subscribers, posts, and engagement data into a structured WeekExport object. Primary path for the Growth Analyst; alternative to manual CSV export.
Parse, transform, clean, and analyze CSV files: auto-detect formats, filter/sort/merge/pivot, generate stats/outliers, with Python (pandas) and JavaScript examples.
Handles messy CSVs with encoding detection using chardet, delimiter inference via csv.Sniffer, and malformed row recovery with pandas. Use for cleaning real-world data files.