A Claude Code skill that acts as a personal Socratic tutor, living inside an Obsidian + Quartz vault. Dave helps you learn topics deeply through active recall, A/B/U structured writing, and deliberate grappling. It never gives you the answer — it points at the gap and waits.
See Dave in action → Alex's scrapbook page
Learning = clearing debris + expanding agency. The enemy is double ignorance (false closure, not absence of knowledge). Struggle is the signal. Dave uses a Feynman-Russell persona: warm, rigorous, unwilling to let fuzzy thinking pass.
A/B/U framework:
- A: New learnings that seem true and useful, but not yet empirically backed — Dave's primary interrogation target
- B: A items that have since received empirical backing; more settled
- U: Things encountered that didn't land or resonate — the honest frontier
Dave probes A's first (false closure hides here), revisits U's second, opens new territory last.
stateDiagram-v2
direction LR
A : A — seems true, not yet backed
B : B — confirmed
U : U — didn't land
[*] --> A : new learning arrives
A --> B : empirically backed
A --> U : probed — can't explain
U --> A : revisited — integrates
B --> [*] : settled
| Command | Purpose |
|---|---|
/dave init |
Onboarding interview, ZPD calibration, primer generation, folder scaffolding |
/dave hello |
Context load (log → primer → git diff), session contract, action menu |
/dave end |
Close ritual: A/B/U reflection, pride score, log append, homepage update |
| (in-session) | Socratic interaction, A interrogation, vagueness naming, U mapping, transcript append |
Dave is installed as a Claude Code skill at ~/.claude/skills/dave/. Each topic lives in its own folder inside your learning directory.
- Create a topic folder in your learning directory and
cdinto it - Run
/dave init— Dave interviews you, calibrates to your level (ZPD), and generates a primer - Run
/dave helloto start a session — Dave loads context, surfaces a continuity note if you bailed last time, and presents a session contract - Grapple. Dave interrogates your beliefs, names your vagueness, maps your gaps. You can ask Dave to read your notes. It will never give you the subject-matter answer.
- Run
/dave end— structured A/B/U reflection, pride score (1–5), log and homepage updated
flowchart TD
Start([Start new topic]) --> Init["/dave init"]
Init --> I1[Onboarding interview\n& ZPD calibration]
I1 --> I2[Primer generated]
I2 --> Hello
Hello["/dave hello"] --> H1[Load log · primer · git diff]
H1 --> H2{Unclosed\nsession?}
H2 -- Yes --> H3[Log as incomplete\non homepage]
H3 --> H4
H2 -- No --> H4[Session contract\n& action menu]
H4 --> Grapple
Grapple[Grapple] --> S1{"/dave end?"}
S1 -- Bail --> S2["Detected next\n/dave hello"]
S2 --> Hello
S1 -- Yes --> End["/dave end"]
End --> E1[A/B/U reflection\n& pride score]
E1 --> E2[Log + homepage updated]
E2 --> E3{Another\nsession?}
E3 -- Yes --> Hello
E3 -- No --> Done([Done])
Every Dave turn follows the same interrogation logic:
flowchart TD
Open([Session opens]) --> Menu[Action menu:\nProbe A · Revisit U · New territory]
Menu --> Turn[Alex sends a message]
Turn --> Dave{Dave reads\nthe message}
Dave -- Vague language --> NameVague[Name the hedge,\ndemand precision]
Dave -- Asks Dave for answer --> Withhold[Withhold — ask what\nAlex thinks instead]
Dave -- Concept gap surfaces --> MapU[Name it as a U,\nadd to session list]
Dave -- Structural claim --> Sketch[Prompt a paper sketch]
Dave -- Progress made --> Advance[Probe deeper or\nmove to next item]
NameVague --> Again{/dave end?}
Withhold --> Again
MapU --> Again
Sketch --> Again
Advance --> Again
Again -- No --> Turn
Again -- Yes --> Close([→ /dave end])
For each topic, Dave creates:
<topic-folder>/
├── Dave Primer - <Topic>.md # Dave's knowledge source (generated or user-provided)
├── Dave Log - <Topic>.md # Persistent A/B/U state + session history
├── sessions/
│ └── <Topic> Dave session N.md # Session transcripts (0-indexed, incremental append)
└── notes/ # Your dialogical notes (read by Dave on demand)
Plus a cross-topic homepage at ../Alex and Dave.md (one level up from the topic folder), published via Quartz.
- Incremental append writes — every Dave turn is appended to the transcript immediately via bash heredoc. No read-then-write. A crash mid-session leaves all prior content intact.
- Context scoped per topic — Dave never loads your full vault; only the log, primer, and
git difffor the current folder. - Git as epistemological memory —
git diffat session start shows what changed since your last commit. Your commit history is your intellectual development record. - Hard behavioural constraints — enforced at the skill level, not subject to LLM drift. Dave cannot be argued into giving answers.
- Early exit detection — if you close without running
/dave end, the next/dave hellodetects it, logs the incomplete session, and surfaces a continuity note.
The skill files live at ~/.claude/skills/dave/:
~/.claude/skills/dave/
├── SKILL.md
├── workflow.md # Persona, hard constraints, conventions, dispatch
└── steps/
├── step-init.md # /dave init
├── step-hello.md # /dave hello
├── step-session.md # In-session behaviour
└── step-close.md # /dave end
Design and planning documents are in _bmad-output/:
| File | Contents |
|---|---|
prd.md |
Full PRD — 37 functional requirements, 11 non-functional requirements |
architecture.md |
Architecture decisions — file schemas, write mechanisms, path resolution |
epics.md |
12 stories across 4 epics |
product-brief-dave.md |
Original product brief |
product-brief-dave-distillate.md |
LLM-distilled brief (token-optimised) |
research/ |
Domain research: active learning, visual design |
brainstorming/ |
Brainstorming session notes |
MVP complete (all 12 stories). Currently in active testing inside the scrapbook Obsidian vault.
Post-MVP features planned (from PRD):
- FR17: Feynman-style session (learner explains, Dave presses)
- FR18: Confused-student essay mode
- FR19: Before/after review since last session