/analytics -- Vault Content Analytics
Analyse the vault as a dataset — file metadata (names, dates, paths, counts), not file contents. Answers "how is my system performing?" rather than "what did I learn from this conversation?"
Standalone skill — no dependency on ops-base or ops-config.
Key distinction from /insights: The insights skill extracts knowledge from conversations (decisions, learnings, patterns about people and projects). This skill analyses the vault itself — creation velocity, skill adoption, engagement frequency, content distribution.
Design Principles
- Metadata and structured fields only. Read filenames, paths, dates, and file sizes. Never read prose content — the only in-file reads allowed are lightweight classification (H1 heading, first line) and structured-field scans for the pipeline subcommand: regex-matching
date:/type: lines in _insights.yaml, created: lines in _tasks.yaml, and - **YYMMDD: bullets in CHANGELOG.md. Field values only; summaries, rationale, and notes are never read.
- Non-destructive. Only writes to
_analytics/ — never modifies existing files.
- Snapshot-based. Each run produces a dated snapshot. Historical snapshots enable trend comparison.
- Privacy-aware. Contact names appear in analytics (they are folder names, not extracted content). Mark private contacts with
private: true in _meta.yaml to exclude them from output.
Output Location
All output goes to {vault_root}/_analytics/:
_analytics/
├── YYMMDD-vault-overview.md <- /analytics overview
├── YYMMDD-skill-adoption.md <- /analytics skills
├── YYMMDD-contact-engagement.md <- /analytics contacts
├── YYMMDD-pipeline-report.md <- /analytics pipeline
├── YYMMDD-backlog-report.md <- /analytics backlog
└── .archive/ <- older snapshots (auto-archived)
Archive policy: When writing a new snapshot, move any existing file of the same type to .archive/ with its date prefix preserved. Keep the latest of each type at the top level.
Vault Detection
Determine vault root:
- Walk up from cwd looking for
_contacts/ or _projects/ markers
- Fallback:
$OBSIDIAN_VAULT environment variable
- Fallback: cwd itself
File Discovery
The core scanning step shared by all subcommands.
YYMMDD File Detection
Scan vault recursively (max depth 8, skip .archive/, .handoff/, .git/, node_modules/, clones/). Match files where the basename starts with 6 digits followed by a separator:
Pattern: /^(\d{6})[-_ ]/
Validate the 6 digits as a plausible date:
- Year (positions 1-2): 22-29 (2022-2029)
- Month (positions 3-4): 01-12
- Day (positions 5-6): 01-31
Metadata Collected Per File
| Field |
Source |
date |
Filename prefix (YYMMDD) |
path |
Relative path from vault root |
directory |
Parent directory (2 levels from vault root) |
extension |
File extension (.md, .txt, .pptx, etc.) |
skill_type |
Classified by path and filename keywords (see below) |
contact |
Extracted from _contacts/{name}/ path segment, if present |
Skill Classification
Classify each file by path first, keywords second:
Step 1 — Path-based classification (highest confidence):
| Path contains |
Classification |
_inbox/ |
inbox |
_analytics/ |
analytics (skip — don't count own output) |
_outbox/ |
outbox |
Step 2 — Keyword-based classification (filename, case-insensitive):
| Keywords |
Classification |
samtal, call, transcript |
transcript |
agenda, facilitator |
agenda (dual-mode docs, CR-018 — check before preparation) |
förberedelse, preparation, prep- |
preparation |
meeting, möte, standup, board, alignment, kickoff, weekly, sprint, retro, sync, sammanfattning, summary |
ops/meeting |
Step 3 — Directory-context classification (for files that didn't match keywords):
| Directory pattern |
Classification |
meetings/ or moten/ or möten/ anywhere in path |
ops/meeting |
ops/ anywhere in path |
ops |
_resor/ or resor/ |
travel |
ppc/ or marketing/ or marknads |
marketing |
.txt extension |
raw-text |
.pptx, .pdf, .docx, .xlsx |
office-doc |
.png, .jpg, .jpeg, .heic |
image |
Step 4 — Fallback: uncategorized
Privacy Filtering (CR-009)
Before including a contact in named output:
Resolve classification for the contact folder:
- If
_meta.yaml exists and has classification field: use it
- Else if
_meta.yaml exists and has private: true: treat as personal
- Else check folder name against
privacy_defaults in base.yaml:
_contacts/a1-* or _contacts/a2* → family
- Else default:
professional
Apply filtering by subcommand:
/analytics contacts: Exclude family and personal contacts from output
/analytics overview, /analytics skills: Include all files in aggregate counts without contact attribution
/analytics backlog: Include all files (backlog is about content gaps, not people)
Never expose family/personal contact names in any output file. Aggregate their files into totals only.
Subcommands
overview -- Vault-wide metrics snapshot
Trigger: /analytics overview or /analytics (default subcommand)
Steps:
- Run file discovery (scan vault)
- Compute summary metrics:
- Total YYMMDD files, date range, unique active dates, active months
- Current pace (files/day for current quarter)
- Active-day density — active days / calendar days for the current quarter (e.g.
84/91), plus files per active day. The gap between files/day and files/active-day shows whether growth comes from busier days or from fewer idle days.
- Trend direction (current quarter rate vs previous quarter rate)
- Compute yearly totals with year-over-year growth multiplier
- Compute content type × quarter pivot — the core analytical view showing how each skill type's volume evolves over time. Columns: transcript, ops/meeting, preparation, ops, travel, raw-text, uncategorized, other. Use
· for zero cells.
- Compute content type × month pivot (last 12 months) — same columns, monthly granularity for recent trends
- Compute monthly activity bar chart (last 12 months)
- Compute quarterly trend table with deltas
- Compute distributions:
- By skill type — table with count and percentage
- By top-level directory — top 15 areas with count (private contacts aggregated as single anonymous row)
- By file extension — count per extension
- By day of week — weekday vs weekend pattern with bar chart
- Compute top 5 busiest dates — date, day of week, count
- Write to
_analytics/YYMMDD-vault-overview.md
Output format:
# Vault Analytics — Overview
Generated: YYYY-MM-DD
---
## Summary
| Metric | Value |
|--------|-------|
| Total files | N |
| Date range | YYYY-MM-DD → YYYY-MM-DD |
| Active months | N |
| Avg files/month | N.N |
| Unique dates | N |
| Current pace | N.N files/day (QN YYYY) |
| Active days (current quarter) | N/N |
| Files per active day | N.N |
| Trend | ↑ N% vs previous quarter |
---
## Yearly Growth
| Year | Files | Growth |
|------|------:|-------:|
| YYYY | N | — |
| YYYY | N | N.Nx |
---
## Content Type × Quarter
| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | **Total** |
|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:|
| YYYY-QN | N| N| ·| N| ·| N| N| ·| **N** |
| YYYY-QN * | N| N| N| ·| N| ·| N| N| **N** |
\* partial quarter
---
## Content Type × Month (Last 12)
| Month | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | **Total** |
|-------|------:|------:|------:|------:|------:|------:|------:|------:|------:|
| YYYY-MM | N| N| ·| N| ·| N| N| ·| **N** |
---
## Monthly Activity (Last 12 Months)
| Month | Files | |
|-------|------:|---|
| YYYY-MM | N | ████████████ |
---
## Quarterly Trend
| Quarter | Files | Delta |
|---------|------:|------:|
| YYYY-QN | N | — |
| YYYY-QN | N | +N |
| YYYY-QN (partial) | N | -N |
---
## Content Distribution
### By Skill Type
| Type | Files | % |
|------|------:|----:|
| ops/meeting | N | N% |
| transcript | N | N% |
| preparation | N | N% |
| ... | | |
### By Directory (Top 15)
| Directory | Files |
|-----------|------:|
| org/meetings | N |
| *(private contacts, N folders)* | *N* |
### By File Extension
| Extension | Files |
|-----------|------:|
| .md | N |
| .txt | N |
### By Day of Week
| Day | Files | |
|-----|------:|---|
| Monday | N | █████████████ |
---
## Busiest Dates
| Date | Day | Files |
|------|-----|------:|
| YYYY-MM-DD | Thu | N |
skills -- Skill adoption analysis
Trigger: /analytics skills
Steps:
- Run file discovery
- Build skill share pivot (absolute) — same columns as the overview pivot (transcript, ops/meeting, preparation, ops, travel, raw-text, uncategorized, other), one row per quarter. Use
· for zero cells.
- Build skill share pivot (percentage) — same layout but percentages per quarter.
- For each skill type, compute per-skill summary:
- First appeared — which quarter the skill type first produced files
- Total files across all time
- Current share — percentage in the most recent full quarter, with ↑/↓/→ arrow vs previous quarter
- Peak quarter — quarter with most files from this skill
- Compute structured vs unstructured ratio by quarter. Structured = transcript + ops/meeting + preparation + ops. Unstructured = everything else. Show absolute counts, and a trend line from first to last full quarter.
- Write to
_analytics/YYMMDD-skill-adoption.md
Output format:
# Vault Analytics — Skill Adoption
Generated: YYYY-MM-DD
---
## Skill Share Over Time (absolute)
| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | Total |
|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:|
| YYYY-QN | N| N| ·| N| ·| N| N| ·| N |
| YYYY-QN * | N| N| N| ·| N| ·| N| N| N |
## Skill Share Over Time (%)
| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other |
|---------|------:|------:|------:|------:|------:|------:|------:|------:|
| YYYY-QN | N%| N%| ·| N%| ·| N%| N%| · |
---
## Per-Skill Trends
### transcript
- First appeared: YYYY-QN
- Total files: N
- Current share: N% (↑ vs previous quarter N%)
- Peak quarter: YYYY-QN (N files)
### ops/meeting
[Same structure for each skill with >0 files]
---
## Structured vs Unstructured
| Quarter | Structured | Unstructured | Structured % |
|---------|----------:|-------------:|-------------:|
| YYYY-QN | N | N | N% |
Trend: Structured content share grew from **N%** (YYYY-QN) to **N%** (YYYY-QN).
contacts -- Contact engagement analysis
Trigger: /analytics contacts
Steps:
- Run file discovery, filtered to
_contacts/ paths
- Apply privacy filter — resolve
classification per contact (see Privacy Filtering section). Exclude family and personal contacts from named output. Report count and total files of excluded contacts as an anonymous summary line.
- For each remaining (professional) contact, compute:
- Total file count
- First and last file dates (as YYYY-MM)
- Active months count
- Peak month (month with most files, with count)
- Average files per active month
- Quarterly activity map (for timeline visualisation)
- Compute contact lifecycle metrics:
- New contacts by year — when contacts first appeared, with cumulative total
- Active contacts per quarter — contacts with at least 1 file in the quarter
- Sort contacts by total file count descending
- Generate activity timelines — a monospace block showing quarterly engagement density for top 20 contacts using heat notation:
· = 0, ░ = 1-2, ▒ = 3-5, ▓ = 6-10, █ = 11+
- Write to
_analytics/YYMMDD-contact-engagement.md
Output format:
# Vault Analytics — Contact Engagement
Generated: YYYY-MM-DD
*N private contacts excluded (N files in aggregate totals only)*
---
## Top Contacts (by file count)
| Contact | Files | Span | Active mo | Peak month | Avg/mo |
|---------|------:|------|----------:|-----------|-------:|
| name | N | YYYY-MM → YYYY-MM | N | YYYY-MM (N) | N.N |
---
## Activity Timelines
Contact Q4 Q1 Q2 Q3 Q4 Q1 Q2
contact-name (N) · ░ ▒ ▓ █ ▒ ·
Legend: · = 0 ░ = 1-2 ▒ = 3-5 ▓ = 6-10 █ = 11+
---
## Network Growth
| Year | New contacts | Cumulative |
|------|------------:|----------:|
| YYYY | N | N |
## Active Contacts Per Quarter
| Quarter | Active contacts |
|---------|----------------:|
| YYYY-QN | N |
pipeline -- Input → meeting docs → outcomes over time
Trigger: /analytics pipeline
The document counts alone are not the full picture — a meeting's outcomes live in structured files the other subcommands never touch. This subcommand traces the whole chain: what came in, what was documented, and what it produced.
Data sources (structured fields only — never prose):
| Layer |
Source |
Field scanned |
| Insights |
_insights.yaml (all folders) |
date: + preceding type: per entry |
| Tasks created |
_tasks.yaml (v2, all folders) |
created: per task. Folders declaring workflows.task_ledger.mode other than local are excluded and listed separately as external ledger (CR-041) |
| CHANGELOG entries |
CHANGELOG.md (all folders) |
- **YYMMDD: bullet dates |
| Outbox packages |
_outbox/** file discovery |
filename YYMMDD prefix |
| New contacts |
_contacts/<name>/ |
earliest YYMMDD file per folder |
Steps:
- Run file discovery (same scan as overview)
- Scan the structured sources above
- Build the grouped chain table — quarters as columns (metrics as row groups, so the whole chain aligns vertically). Collapse quarters before the first meaningful year into a single
≤YYYY column to keep width manageable. Row groups:
- INPUT: transcripts, raw text (.txt)
- MEETING DOCS: summaries/notes, agenda/facilitator, preparations
- OUTCOMES: insights total + one row per insight type (largest types first, small ones aggregated as "other"), tasks created, CHANGELOG entries, outbox packages, new contact folders
- Compute derived ratios for quarters where the systems are fully active: insights per meeting+transcript, tasks per meeting+transcript, CHANGELOG entries per meeting+transcript.
Exclude folders whose task ledger is not
local (CR-041) from the tasks-per-meeting ratio, and name them under the table as external ledger: work tracked in <system>. Their zero is a correct pipeline, not a gap -- counting it drags the ratio down and reports a healthy project as failing. This skill does not read the external system: counting items in a repo registry or an issue tracker is a different and much larger job, and the ratio simply excludes what it cannot see.
- Compute per-day averages by quarter: active days / calendar days, files/day, meetings+transcripts/day, insights/day, tasks/day, files per active day (partial quarters use elapsed days)
- Write to
_analytics/YYMMDD-pipeline-report.md
Report structure — two parts, mandatory:
- Part 1 — Overview: headline totals table, a numbered list of interpreted findings (adoption inflections, ratio shifts, what converged or diverged — written as conclusions, not table prose), and the measurement notes.
- Part 2 — Deep dive: the grouped chain table, derived ratios, per-day averages, and any monthly detail.
Measurement notes (mandatory in every pipeline report):
- Outcome systems have adoption dates: a
· before a system existed means "not yet measured", not "nothing happened". State each source's start-of-record explicitly (e.g. insights backfilled with extraction dates, tasks v2 introduction).
- CHANGELOG entries carry the original meeting date and are therefore the best longitudinal outcome proxy.
- Action items inside summary tables are NOT counted (would require prose reads); the task count is the nearest proxy.
- Mark partial quarters/months and use elapsed days for their per-day rates.
Output format (Part 2 core table):
| Group / metric | ≤YYYY | YY-Q1 | YY-Q2 | ... | **Total** |
|---|---:|---:|---:|---:|---:|
| **INPUT** | | | | | |
| Transcripts | N | N | N | ... | **N** |
| Raw text (.txt) | N | N | N | ... | **N** |
| **MEETING DOCS** | | | | | |
| Summaries / notes | N | N | N | ... | **N** |
| Agenda/facilitator | · | N | N | ... | **N** |
| Preparations | · | N | N | ... | **N** |
| **OUTCOMES** | | | | | |
| Insights (total) | · | · | N | ... | **N** |
| — learning | · | · | N | ... | **N** |
| — pattern | · | · | N | ... | **N** |
| Tasks created | · | · | N | ... | **N** |
| CHANGELOG entries | N | N | N | ... | **N** |
| Outbox packages | · | · | N | ... | **N** |
| New contact folders | N | N | N | ... | **N** |
Per-day averages table:
| Metric | YY-Q1 | YY-Q2 | ... |
|---|---:|---:|---:|
| Active days (≥1 file) | N/N | N/N | ... |
| Files/day | N.N | N.N | ... |
| Meetings+transcripts/day | N.N | N.N | ... |
| Insights/day | · | N.N | ... |
| Tasks/day | · | N.N | ... |
| Files per active day | N.N | N.N | ... |
backlog -- Unprocessed content detection
Trigger: /analytics backlog
Identifies content that may benefit from processing through existing skills.
Steps:
- Run file discovery
- Detect unprocessed transcriptions:
- Find
.txt files with YYMMDD prefix (classified as raw-text)
- These are likely raw transcriptions that haven't been processed through
/transcript
- Group by directory, sorted by count descending, show count and date range
- Detect orphaned content:
- Find directories containing YYMMDD-prefixed files but no
CHANGELOG.md
- Only include directories with 2+ files (single files are likely intentional one-offs)
- Show top 15 by file count, with
*(+ N more)* if truncated
- Detect stale inbox items:
- Read
_inbox/_inbox.yaml if it exists
- Count items with
status: pending
- Report age of oldest pending item
- Detect insight gaps:
- Find folders with
CHANGELOG.md but no _insights.yaml
- Count YYMMDD-prefixed files in each (potential insight yield)
- Only include folders with 1+ transcript files
- Show top 15 by transcript count, with
*(+ N more)* if truncated
- Write summary table at top with all four categories and suggested actions
- Write to
_analytics/YYMMDD-backlog-report.md
Output format:
# Vault Analytics — Backlog Report
Generated: YYYY-MM-DD
---
## Summary
| Category | Items | Potential action |
|----------|------:|-----------------|
| Raw text files (.txt) | N | `/transcript` or `/inbox` |
| Folders without CHANGELOG | N dirs, N files | Manual triage |
| Pending inbox items | N | `/inbox` process |
| Folders missing _insights.yaml | N dirs, ~N transcripts | `/insights reprocess` |
---
## Raw Text Files (Likely Unprocessed Transcriptions)
| Directory | Count | Date range |
|-----------|------:|-----------|
| _contacts/name | N | YYMMDD → YYMMDD |
| _projects/name | N | YYMMDD → YYMMDD |
---
## Folders Without CHANGELOG
| Folder | YYMMDD files |
|--------|-------------:|
| org/meetings/area | N |
| _contacts/name/subfolder | N |
| *(+ N more)* | |
---
## Pending Inbox Items
N items pending. Oldest: YYYY-MM-DD
(or: No pending items.)
---
## Insight Reprocessing Opportunities
| Folder | Transcripts | Has _insights.yaml |
|--------|------------:|-------------------:|
| _contacts/name | N | No |
| org/_projects/name | N | No |
| *(+ N more)* | | |
help -- Usage guide
Trigger: /analytics help
Output:
/analytics -- Vault Content Analytics
======================================
Analyse the vault as a dataset -- file metadata, not contents.
Usage:
/analytics Vault overview (default)
/analytics overview Same as above
/analytics skills Skill adoption over time
/analytics contacts Contact engagement timelines
/analytics pipeline Input -> meeting docs -> outcomes chain
/analytics backlog Unprocessed content detection
/analytics help This guide
Output: _analytics/ folder in vault root (one snapshot per run).
Data flow:
YYMMDD-*.* files ──> /analytics ──> _analytics/YYMMDD-*.md
(read filenames, (classify, (markdown snapshots,
paths, dates) aggregate) one per subcommand)
Related skills:
/insights Extract knowledge FROM file contents
/insights status Count _insights.yaml coverage
/daily-dashboard Daily view (today's meetings + tasks)
/analytics Longitudinal view (trends over time)
Language
Output language follows the same resolution as other standalone skills:
- If vault root
CLAUDE.md specifies a language policy, follow it
- Default: Swedish for section headers and labels, English for technical terms
- Swedish text MUST use correct å, ä, ö characters
Notes
- The
_analytics/ folder is created automatically on first run
- Old snapshots are archived to
_analytics/.archive/ — never deleted
- This skill reads
_insights.yaml/_tasks.yaml/CHANGELOG.md at field level only (dates and type enums for the pipeline subcommand) — entry contents (summaries, rationale, notes) remain the visualisation app's domain
- This skill does NOT read file prose (except optional H1 heading for display)
- Contact privacy is respected via
_meta.yaml private: true
- The skill classification algorithm uses path first, keywords second — this avoids the ~17% miscount that pure keyword matching produces (e.g., acme/meetings/ files with descriptive names)
- Quarterly comparisons handle partial quarters gracefully — the current quarter is annualised for trend comparison
1---2name: analytics3description: Vault-level content analytics — file creation trends, skill adoption, contact engagement, content distribution, pipeline outcome metrics (insights/tasks/changelog per meeting), and unprocessed backlog detection. Outputs to _analytics/ folder.4---56# /analytics -- Vault Content Analytics78Analyse the vault as a dataset — file metadata (names, dates, paths, counts), not file contents. Answers "how is my system performing?" rather than "what did I learn from this conversation?"910**Standalone skill** — no dependency on ops-base or ops-config.1112**Key distinction from `/insights`:** The insights skill extracts *knowledge from conversations* (decisions, learnings, patterns about people and projects). This skill analyses *the vault itself* — creation velocity, skill adoption, engagement frequency, content distribution.1314---1516## Design Principles1718- **Metadata and structured fields only.** Read filenames, paths, dates, and file sizes. Never read prose content — the only in-file reads allowed are lightweight classification (H1 heading, first line) and **structured-field scans** for the pipeline subcommand: regex-matching `date:`/`type:` lines in `_insights.yaml`, `created:` lines in `_tasks.yaml`, and `- **YYMMDD:` bullets in `CHANGELOG.md`. Field values only; summaries, rationale, and notes are never read.19- **Non-destructive.** Only writes to `_analytics/` — never modifies existing files.20- **Snapshot-based.** Each run produces a dated snapshot. Historical snapshots enable trend comparison.21- **Privacy-aware.** Contact names appear in analytics (they are folder names, not extracted content). Mark private contacts with `private: true` in `_meta.yaml` to exclude them from output.2223---2425## Output Location2627All output goes to `{vault_root}/_analytics/`:2829```30_analytics/31├── YYMMDD-vault-overview.md <- /analytics overview32├── YYMMDD-skill-adoption.md <- /analytics skills33├── YYMMDD-contact-engagement.md <- /analytics contacts34├── YYMMDD-pipeline-report.md <- /analytics pipeline35├── YYMMDD-backlog-report.md <- /analytics backlog36└── .archive/ <- older snapshots (auto-archived)37```3839**Archive policy:** When writing a new snapshot, move any existing file of the same type to `.archive/` with its date prefix preserved. Keep the latest of each type at the top level.4041---4243## Vault Detection4445Determine vault root:46471. Walk up from cwd looking for `_contacts/` or `_projects/` markers482. Fallback: `$OBSIDIAN_VAULT` environment variable493. Fallback: cwd itself5051---5253## File Discovery5455The core scanning step shared by all subcommands.5657### YYMMDD File Detection5859Scan vault recursively (max depth 8, skip `.archive/`, `.handoff/`, `.git/`, `node_modules/`, `clones/`). Match files where the basename starts with 6 digits followed by a separator:6061```62Pattern: /^(\d{6})[-_ ]/63```6465Validate the 6 digits as a plausible date:66- Year (positions 1-2): 22-29 (2022-2029)67- Month (positions 3-4): 01-1268- Day (positions 5-6): 01-316970### Metadata Collected Per File7172| Field | Source |73|-------|--------|74| `date` | Filename prefix (YYMMDD) |75| `path` | Relative path from vault root |76| `directory` | Parent directory (2 levels from vault root) |77| `extension` | File extension (.md, .txt, .pptx, etc.) |78| `skill_type` | Classified by path and filename keywords (see below) |79| `contact` | Extracted from `_contacts/{name}/` path segment, if present |8081### Skill Classification8283Classify each file by **path first, keywords second**:8485**Step 1 — Path-based classification** (highest confidence):8687| Path contains | Classification |88|---------------|---------------|89| `_inbox/` | `inbox` |90| `_analytics/` | `analytics` (skip — don't count own output) |91| `_outbox/` | `outbox` |9293**Step 2 — Keyword-based classification** (filename, case-insensitive):9495| Keywords | Classification |96|----------|---------------|97| `samtal`, `call`, `transcript` | `transcript` |98| `agenda`, `facilitator` | `agenda` (dual-mode docs, CR-018 — check before preparation) |99| `förberedelse`, `preparation`, `prep-` | `preparation` |100| `meeting`, `möte`, `standup`, `board`, `alignment`, `kickoff`, `weekly`, `sprint`, `retro`, `sync`, `sammanfattning`, `summary` | `ops/meeting` |101102**Step 3 — Directory-context classification** (for files that didn't match keywords):103104| Directory pattern | Classification |105|-------------------|---------------|106| `meetings/` or `moten/` or `möten/` anywhere in path | `ops/meeting` |107| `ops/` anywhere in path | `ops` |108| `_resor/` or `resor/` | `travel` |109| `ppc/` or `marketing/` or `marknads` | `marketing` |110| `.txt` extension | `raw-text` |111| `.pptx`, `.pdf`, `.docx`, `.xlsx` | `office-doc` |112| `.png`, `.jpg`, `.jpeg`, `.heic` | `image` |113114**Step 4 — Fallback:** `uncategorized`115116### Privacy Filtering (CR-009)117118Before including a contact in named output:1191201. **Resolve classification** for the contact folder:121 - If `_meta.yaml` exists and has `classification` field: use it122 - Else if `_meta.yaml` exists and has `private: true`: treat as `personal`123 - Else check folder name against `privacy_defaults` in `base.yaml`:124 - `_contacts/a1-*` or `_contacts/a2*` → `family`125 - Else default: `professional`1261272. **Apply filtering by subcommand:**128 - `/analytics contacts`: Exclude `family` and `personal` contacts from output129 - `/analytics overview`, `/analytics skills`: Include all files in aggregate counts without contact attribution130 - `/analytics backlog`: Include all files (backlog is about content gaps, not people)1311323. **Never expose family/personal contact names** in any output file. Aggregate their files into totals only.133134---135136## Subcommands137138### `overview` -- Vault-wide metrics snapshot139140**Trigger:** `/analytics overview` or `/analytics` (default subcommand)141142**Steps:**1431441. Run file discovery (scan vault)1452. Compute summary metrics:146 - Total YYMMDD files, date range, unique active dates, active months147 - Current pace (files/day for current quarter)148 - **Active-day density** — active days / calendar days for the current quarter (e.g. `84/91`), plus files per *active* day. The gap between files/day and files/active-day shows whether growth comes from busier days or from fewer idle days.149 - Trend direction (current quarter rate vs previous quarter rate)1503. Compute yearly totals with year-over-year growth multiplier1514. Compute **content type × quarter pivot** — the core analytical view showing how each skill type's volume evolves over time. Columns: transcript, ops/meeting, preparation, ops, travel, raw-text, uncategorized, other. Use `·` for zero cells.1525. Compute **content type × month pivot** (last 12 months) — same columns, monthly granularity for recent trends1536. Compute monthly activity bar chart (last 12 months)1547. Compute quarterly trend table with deltas1558. Compute distributions:156 - **By skill type** — table with count and percentage157 - **By top-level directory** — top 15 areas with count (private contacts aggregated as single anonymous row)158 - **By file extension** — count per extension159 - **By day of week** — weekday vs weekend pattern with bar chart1609. Compute **top 5 busiest dates** — date, day of week, count16110. Write to `_analytics/YYMMDD-vault-overview.md`162163**Output format:**164165```markdown166# Vault Analytics — Overview167Generated: YYYY-MM-DD168169---170171## Summary172173| Metric | Value |174|--------|-------|175| Total files | N |176| Date range | YYYY-MM-DD → YYYY-MM-DD |177| Active months | N |178| Avg files/month | N.N |179| Unique dates | N |180| Current pace | N.N files/day (QN YYYY) |181| Active days (current quarter) | N/N |182| Files per active day | N.N |183| Trend | ↑ N% vs previous quarter |184185---186187## Yearly Growth188189| Year | Files | Growth |190|------|------:|-------:|191| YYYY | N | — |192| YYYY | N | N.Nx |193194---195196## Content Type × Quarter197198| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | **Total** |199|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:|200| YYYY-QN | N| N| ·| N| ·| N| N| ·| **N** |201| YYYY-QN * | N| N| N| ·| N| ·| N| N| **N** |202203\* partial quarter204205---206207## Content Type × Month (Last 12)208209| Month | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | **Total** |210|-------|------:|------:|------:|------:|------:|------:|------:|------:|------:|211| YYYY-MM | N| N| ·| N| ·| N| N| ·| **N** |212213---214215## Monthly Activity (Last 12 Months)216217| Month | Files | |218|-------|------:|---|219| YYYY-MM | N | ████████████ |220221---222223## Quarterly Trend224225| Quarter | Files | Delta |226|---------|------:|------:|227| YYYY-QN | N | — |228| YYYY-QN | N | +N |229| YYYY-QN (partial) | N | -N |230231---232233## Content Distribution234235### By Skill Type236237| Type | Files | % |238|------|------:|----:|239| ops/meeting | N | N% |240| transcript | N | N% |241| preparation | N | N% |242| ... | | |243244### By Directory (Top 15)245246| Directory | Files |247|-----------|------:|248| org/meetings | N |249| *(private contacts, N folders)* | *N* |250251### By File Extension252253| Extension | Files |254|-----------|------:|255| .md | N |256| .txt | N |257258### By Day of Week259260| Day | Files | |261|-----|------:|---|262| Monday | N | █████████████ |263264---265266## Busiest Dates267268| Date | Day | Files |269|------|-----|------:|270| YYYY-MM-DD | Thu | N |271```272273---274275### `skills` -- Skill adoption analysis276277**Trigger:** `/analytics skills`278279**Steps:**2802811. Run file discovery2822. Build **skill share pivot (absolute)** — same columns as the overview pivot (transcript, ops/meeting, preparation, ops, travel, raw-text, uncategorized, other), one row per quarter. Use `·` for zero cells.2833. Build **skill share pivot (percentage)** — same layout but percentages per quarter.2844. For each skill type, compute per-skill summary:285 - **First appeared** — which quarter the skill type first produced files286 - **Total files** across all time287 - **Current share** — percentage in the most recent full quarter, with ↑/↓/→ arrow vs previous quarter288 - **Peak quarter** — quarter with most files from this skill2895. Compute **structured vs unstructured ratio** by quarter. Structured = transcript + ops/meeting + preparation + ops. Unstructured = everything else. Show absolute counts, and a trend line from first to last full quarter.2906. Write to `_analytics/YYMMDD-skill-adoption.md`291292**Output format:**293294```markdown295# Vault Analytics — Skill Adoption296Generated: YYYY-MM-DD297298---299300## Skill Share Over Time (absolute)301302| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other | Total |303|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:|304| YYYY-QN | N| N| ·| N| ·| N| N| ·| N |305| YYYY-QN * | N| N| N| ·| N| ·| N| N| N |306307## Skill Share Over Time (%)308309| Quarter | transcript | ops/meeting | preparation | ops | travel | raw-text | uncategorized | other |310|---------|------:|------:|------:|------:|------:|------:|------:|------:|311| YYYY-QN | N%| N%| ·| N%| ·| N%| N%| · |312313---314315## Per-Skill Trends316317### transcript318- First appeared: YYYY-QN319- Total files: N320- Current share: N% (↑ vs previous quarter N%)321- Peak quarter: YYYY-QN (N files)322323### ops/meeting324[Same structure for each skill with >0 files]325326---327328## Structured vs Unstructured329330| Quarter | Structured | Unstructured | Structured % |331|---------|----------:|-------------:|-------------:|332| YYYY-QN | N | N | N% |333334Trend: Structured content share grew from **N%** (YYYY-QN) to **N%** (YYYY-QN).335```336337---338339### `contacts` -- Contact engagement analysis340341**Trigger:** `/analytics contacts`342343**Steps:**3443451. Run file discovery, filtered to `_contacts/` paths3462. Apply privacy filter — resolve `classification` per contact (see Privacy Filtering section). Exclude `family` and `personal` contacts from named output. Report count and total files of excluded contacts as an anonymous summary line.3473. For each remaining (professional) contact, compute:348 - Total file count349 - First and last file dates (as YYYY-MM)350 - Active months count351 - Peak month (month with most files, with count)352 - Average files per active month353 - Quarterly activity map (for timeline visualisation)3544. Compute contact lifecycle metrics:355 - **New contacts by year** — when contacts first appeared, with cumulative total356 - **Active contacts per quarter** — contacts with at least 1 file in the quarter3575. Sort contacts by total file count descending3586. Generate **activity timelines** — a monospace block showing quarterly engagement density for top 20 contacts using heat notation: `·` = 0, `░` = 1-2, `▒` = 3-5, `▓` = 6-10, `█` = 11+3597. Write to `_analytics/YYMMDD-contact-engagement.md`360361**Output format:**362363```markdown364# Vault Analytics — Contact Engagement365Generated: YYYY-MM-DD366367*N private contacts excluded (N files in aggregate totals only)*368369---370371## Top Contacts (by file count)372373| Contact | Files | Span | Active mo | Peak month | Avg/mo |374|---------|------:|------|----------:|-----------|-------:|375| name | N | YYYY-MM → YYYY-MM | N | YYYY-MM (N) | N.N |376377---378379## Activity Timelines380381```382Contact Q4 Q1 Q2 Q3 Q4 Q1 Q2383contact-name (N) · ░ ▒ ▓ █ ▒ ·384385Legend: · = 0 ░ = 1-2 ▒ = 3-5 ▓ = 6-10 █ = 11+386```387388---389390## Network Growth391392| Year | New contacts | Cumulative |393|------|------------:|----------:|394| YYYY | N | N |395396## Active Contacts Per Quarter397398| Quarter | Active contacts |399|---------|----------------:|400| YYYY-QN | N |401```402403---404405### `pipeline` -- Input → meeting docs → outcomes over time406407**Trigger:** `/analytics pipeline`408409The document counts alone are not the full picture — a meeting's *outcomes* live in structured files the other subcommands never touch. This subcommand traces the whole chain: what came in, what was documented, and what it produced.410411**Data sources (structured fields only — never prose):**412413| Layer | Source | Field scanned |414|-------|--------|---------------|415| Insights | `_insights.yaml` (all folders) | `date:` + preceding `type:` per entry |416| Tasks created | `_tasks.yaml` (v2, all folders) | `created:` per task. Folders declaring `workflows.task_ledger.mode` other than `local` are **excluded** and listed separately as *external ledger* (CR-041) |417| CHANGELOG entries | `CHANGELOG.md` (all folders) | `- **YYMMDD:` bullet dates |418| Outbox packages | `_outbox/**` file discovery | filename YYMMDD prefix |419| New contacts | `_contacts/<name>/` | earliest YYMMDD file per folder |420421**Steps:**4224231. Run file discovery (same scan as overview)4242. Scan the structured sources above4253. Build the **grouped chain table — quarters as columns** (metrics as row groups, so the whole chain aligns vertically). Collapse quarters before the first meaningful year into a single `≤YYYY` column to keep width manageable. Row groups:426 - **INPUT:** transcripts, raw text (.txt)427 - **MEETING DOCS:** summaries/notes, agenda/facilitator, preparations428 - **OUTCOMES:** insights total + one row per insight type (largest types first, small ones aggregated as "other"), tasks created, CHANGELOG entries, outbox packages, new contact folders4294. Compute **derived ratios** for quarters where the systems are fully active: insights per meeting+transcript, tasks per meeting+transcript, CHANGELOG entries per meeting+transcript.430 **Exclude folders whose task ledger is not `local` (CR-041)** from the tasks-per-meeting ratio, and name them under the table as *external ledger: work tracked in `<system>`*. Their zero is a correct pipeline, not a gap -- counting it drags the ratio down and reports a healthy project as failing. This skill does **not** read the external system: counting items in a repo registry or an issue tracker is a different and much larger job, and the ratio simply excludes what it cannot see.4315. Compute **per-day averages by quarter:** active days / calendar days, files/day, meetings+transcripts/day, insights/day, tasks/day, files per active day (partial quarters use elapsed days)4326. Write to `_analytics/YYMMDD-pipeline-report.md`433434**Report structure — two parts, mandatory:**435436- **Part 1 — Overview:** headline totals table, a numbered list of *interpreted* findings (adoption inflections, ratio shifts, what converged or diverged — written as conclusions, not table prose), and the **measurement notes**.437- **Part 2 — Deep dive:** the grouped chain table, derived ratios, per-day averages, and any monthly detail.438439**Measurement notes (mandatory in every pipeline report):**440441- Outcome systems have adoption dates: a `·` before a system existed means "not yet measured", not "nothing happened". State each source's start-of-record explicitly (e.g. insights backfilled with extraction dates, tasks v2 introduction).442- CHANGELOG entries carry the original meeting date and are therefore the best longitudinal outcome proxy.443- Action items inside summary tables are NOT counted (would require prose reads); the task count is the nearest proxy.444- Mark partial quarters/months and use elapsed days for their per-day rates.445446**Output format (Part 2 core table):**447448```markdown449| Group / metric | ≤YYYY | YY-Q1 | YY-Q2 | ... | **Total** |450|---|---:|---:|---:|---:|---:|451| **INPUT** | | | | | |452| Transcripts | N | N | N | ... | **N** |453| Raw text (.txt) | N | N | N | ... | **N** |454| **MEETING DOCS** | | | | | |455| Summaries / notes | N | N | N | ... | **N** |456| Agenda/facilitator | · | N | N | ... | **N** |457| Preparations | · | N | N | ... | **N** |458| **OUTCOMES** | | | | | |459| Insights (total) | · | · | N | ... | **N** |460| — learning | · | · | N | ... | **N** |461| — pattern | · | · | N | ... | **N** |462| Tasks created | · | · | N | ... | **N** |463| CHANGELOG entries | N | N | N | ... | **N** |464| Outbox packages | · | · | N | ... | **N** |465| New contact folders | N | N | N | ... | **N** |466```467468Per-day averages table:469470```markdown471| Metric | YY-Q1 | YY-Q2 | ... |472|---|---:|---:|---:|473| Active days (≥1 file) | N/N | N/N | ... |474| Files/day | N.N | N.N | ... |475| Meetings+transcripts/day | N.N | N.N | ... |476| Insights/day | · | N.N | ... |477| Tasks/day | · | N.N | ... |478| Files per active day | N.N | N.N | ... |479```480481---482483### `backlog` -- Unprocessed content detection484485**Trigger:** `/analytics backlog`486487Identifies content that may benefit from processing through existing skills.488489**Steps:**4904911. Run file discovery4922. **Detect unprocessed transcriptions:**493 - Find `.txt` files with YYMMDD prefix (classified as `raw-text`)494 - These are likely raw transcriptions that haven't been processed through `/transcript`495 - Group by directory, sorted by count descending, show count and date range4963. **Detect orphaned content:**497 - Find directories containing YYMMDD-prefixed files but no `CHANGELOG.md`498 - Only include directories with 2+ files (single files are likely intentional one-offs)499 - Show top 15 by file count, with `*(+ N more)*` if truncated5004. **Detect stale inbox items:**501 - Read `_inbox/_inbox.yaml` if it exists502 - Count items with `status: pending`503 - Report age of oldest pending item5045. **Detect insight gaps:**505 - Find folders with `CHANGELOG.md` but no `_insights.yaml`506 - Count YYMMDD-prefixed files in each (potential insight yield)507 - Only include folders with 1+ transcript files508 - Show top 15 by transcript count, with `*(+ N more)*` if truncated5096. Write summary table at top with all four categories and suggested actions5107. Write to `_analytics/YYMMDD-backlog-report.md`511512**Output format:**513514```markdown515# Vault Analytics — Backlog Report516Generated: YYYY-MM-DD517518---519520## Summary521522| Category | Items | Potential action |523|----------|------:|-----------------|524| Raw text files (.txt) | N | `/transcript` or `/inbox` |525| Folders without CHANGELOG | N dirs, N files | Manual triage |526| Pending inbox items | N | `/inbox` process |527| Folders missing _insights.yaml | N dirs, ~N transcripts | `/insights reprocess` |528529---530531## Raw Text Files (Likely Unprocessed Transcriptions)532533| Directory | Count | Date range |534|-----------|------:|-----------|535| _contacts/name | N | YYMMDD → YYMMDD |536| _projects/name | N | YYMMDD → YYMMDD |537538---539540## Folders Without CHANGELOG541542| Folder | YYMMDD files |543|--------|-------------:|544| org/meetings/area | N |545| _contacts/name/subfolder | N |546| *(+ N more)* | |547548---549550## Pending Inbox Items551552N items pending. Oldest: YYYY-MM-DD553(or: No pending items.)554555---556557## Insight Reprocessing Opportunities558559| Folder | Transcripts | Has _insights.yaml |560|--------|------------:|-------------------:|561| _contacts/name | N | No |562| org/_projects/name | N | No |563| *(+ N more)* | | |564```565566---567568### `help` -- Usage guide569570**Trigger:** `/analytics help`571572**Output:**573574```575/analytics -- Vault Content Analytics576======================================577578Analyse the vault as a dataset -- file metadata, not contents.579580Usage:581 /analytics Vault overview (default)582 /analytics overview Same as above583 /analytics skills Skill adoption over time584 /analytics contacts Contact engagement timelines585 /analytics pipeline Input -> meeting docs -> outcomes chain586 /analytics backlog Unprocessed content detection587 /analytics help This guide588589Output: _analytics/ folder in vault root (one snapshot per run).590591Data flow:592 YYMMDD-*.* files ──> /analytics ──> _analytics/YYMMDD-*.md593 (read filenames, (classify, (markdown snapshots,594 paths, dates) aggregate) one per subcommand)595596Related skills:597 /insights Extract knowledge FROM file contents598 /insights status Count _insights.yaml coverage599 /daily-dashboard Daily view (today's meetings + tasks)600 /analytics Longitudinal view (trends over time)601```602603---604605## Language606607Output language follows the same resolution as other standalone skills:6086091. If vault root `CLAUDE.md` specifies a language policy, follow it6102. Default: Swedish for section headers and labels, English for technical terms6113. Swedish text MUST use correct å, ä, ö characters612613---614615## Notes616617- The `_analytics/` folder is created automatically on first run618- Old snapshots are archived to `_analytics/.archive/` — never deleted619- This skill reads `_insights.yaml`/`_tasks.yaml`/`CHANGELOG.md` at **field level only** (dates and type enums for the pipeline subcommand) — entry contents (summaries, rationale, notes) remain the visualisation app's domain620- This skill does NOT read file prose (except optional H1 heading for display)621- Contact privacy is respected via `_meta.yaml` `private: true`622- The skill classification algorithm uses **path first, keywords second** — this avoids the ~17% miscount that pure keyword matching produces (e.g., acme/meetings/ files with descriptive names)623- Quarterly comparisons handle partial quarters gracefully — the current quarter is annualised for trend comparison