> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vibelearn.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Learning Loop Metrics

> How VibeLearn measures concept coverage, quiz accuracy, and mastery progression

# Learning Loop Metrics

VibeLearn's learning loop has three measurable outputs: concept coverage (what was extracted from sessions), quiz accuracy (how you perform on questions), and mastery progression (how scores change over time). This page explains what each metric means and how to interpret it.

## Concept Coverage

After each session, VibeLearn extracts concepts via `ConceptExtractor`. Coverage depends on:

* **Files edited**: More Write/Edit observations → more material for concept extraction
* **Stack context**: `StackDetector` provides framework/ORM context that improves concept naming
* **Session length**: Longer sessions with more tool calls produce more concepts

Check what was extracted:

```bash theme={null}
sqlite3 ~/.vibelearn/vibelearn.db \
  "SELECT name, category, difficulty FROM vl_concepts ORDER BY id DESC LIMIT 20;"
```

## Quiz Accuracy

`vl quiz` tracks every answer in `vl_quiz_attempts`. Each attempt records:

| Field              | Description                            |
| ------------------ | -------------------------------------- |
| `is_correct`       | 0 or 1                                 |
| `response_time_ms` | Time to answer                         |
| `hmac_signature`   | Signed with your API key (anti-tamper) |

Your accuracy per concept is visible in:

```bash theme={null}
vl status
# Example output:
# Sessions analyzed: 12
# Total concepts: 87
# Mastered: 34 | In progress: 41 | Not started: 12
```

## Mastery Score

Each concept has a `mastery_score` (0.0–1.0) stored in `vl_developer_profile`. The score is computed server-side from your quiz attempts using a simplified SM-2 algorithm.

**Local value is a cache** — the server overwrites it on each sync.

| Score    | Meaning                                       |
| -------- | --------------------------------------------- |
| `0.0`    | Never answered or all wrong                   |
| `< 0.5`  | In progress — appears in `vl gaps`            |
| `> 0.85` | Mastered — `QuizGenerator` skips this concept |
| `1.0`    | Fully mastered                                |

Check your weakest concepts:

```bash theme={null}
vl gaps
# SQLite WAL Mode            ████░░░░░░  38%  (seen 3x)
# HMAC Token Signing         ███░░░░░░░  28%  (seen 2x)
# React Suspense Boundaries  ██░░░░░░░░  22%  (seen 1x)
```

## Spaced Repetition

VibeLearn uses a simplified SM-2 algorithm. Questions resurface at increasing intervals after correct answers. The interval doubles after each correct answer and resets after an incorrect one.

This means:

* Answering a question correctly 3× in a row → it won't appear again for a long time
* Getting a question wrong resets its interval — it resurfaces in the next quiz session

## Question Types and Accuracy

VibeLearn generates three question types:

| Type              | Format                        | When used             |
| ----------------- | ----------------------------- | --------------------- |
| `multiple_choice` | 4 options (A–D)               | Most concepts         |
| `fill_in_blank`   | Complete the code or sentence | Code patterns, syntax |
| `explain_code`    | Open-ended explanation        | Complex patterns      |

`fill_in_blank` and `explain_code` questions are graded by the LLM in the next analysis pass.

## Checking Raw Data

```bash theme={null}
# Questions per concept category
sqlite3 ~/.vibelearn/vibelearn.db \
  "SELECT c.category, COUNT(q.id) as questions
   FROM vl_concepts c
   JOIN vl_questions q ON q.concept_id = c.id
   GROUP BY c.category
   ORDER BY questions DESC;"

# Mastery scores by concept
sqlite3 ~/.vibelearn/vibelearn.db \
  "SELECT concept_name, mastery_score, encounter_count
   FROM vl_developer_profile
   ORDER BY mastery_score ASC
   LIMIT 10;"
```
