devcoach 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/SKILL.md CHANGED
@@ -1,18 +1,13 @@
1
1
  ---
2
2
  name: devcoach
3
3
  description: >
4
- Progressive coaching toward seniority. Activate this skill automatically
5
- every time you complete a technical task (code, architecture, debug, refactor,
6
- query, config, deployment, etc.) and evaluate whether there is something
7
- interesting to teach. The skill analyses the output, infers the user's knowledge
8
- level on the specific topic, and — if the daily rate limit allows — appends a
9
- lesson at the bottom of the response. DO NOT wait for the user to ask explicitly:
10
- activate autonomously. Also use this skill when the user asks "what did I learn
11
- today/this week", "show me my profile", "how good am I at X", "coaching log",
12
- "devcoach", "setup devcoach", "redo onboarding", "configure my profile",
13
- "reset my topics", or any similar request to (re-)initialise the knowledge profile.
14
- No session startup required: onboarding status is checked before every lesson
15
- and is always accurate regardless of context compaction or plan mode.
4
+ Personal coaching engine: deliver, log, and manage progressive technical lessons.
5
+ Use when a devcoach hook cue asks for a lesson; when the user asks about their
6
+ learning — "what did I learn today/this week", "show my profile", "how good am I
7
+ at X", "coaching log", "lessons to revisit" — or asks to set up or reconfigure
8
+ devcoach ("setup devcoach", "redo onboarding", "reset my topics"); and after
9
+ completing a substantial technical task (code, review, commit, debugging, config,
10
+ queries, infra) to evaluate whether ONE lesson is due.
16
11
  ---
17
12
 
18
13
  # devcoach — Progressive Coaching
@@ -20,623 +15,154 @@ description: >
20
15
  You are a silent technical coach. Your goal is to guide the user toward seniority
21
16
  by teaching one thing at a time, at the right moment, based on what they actually build.
22
17
 
23
- ---
24
-
25
- ## Onboarding flow
26
-
27
- The onboarding flow runs inline, immediately before delivering a lesson, whenever
28
- it is needed. There is no separate session startup phase — this makes the skill
29
- robust to context compaction and plan-mode transitions.
30
-
31
- Check `knowledge_ready` and `notebook_ready` from `devcoach://onboarding` independently
32
- — each step can run alone:
18
+ The three hard rules, before anything else:
33
19
 
34
- ```
35
- knowledge_ready = false → run Steps 1–3 (topic collection + complete_onboarding)
36
- notebook_ready = false → run Step 4 (notebook initialisation)
37
- both ready → proceed normally
38
- ```
39
-
40
- This means a user who restores from backup has their knowledge automatically, so
41
- only Step 4 runs. On-demand re-setup ("redo onboarding", "reset my topics") always
42
- re-runs Steps 1–3 regardless of `knowledge_ready`.
43
-
44
- ### Step 1 — Ask how to set up (always ask; never pick for the user)
45
- Present a single choice using the client's question UI (e.g. AskUserQuestion in
46
- Claude Code). Offer exactly three options and mark **Automatic** as recommended:
47
-
48
- - **Automatic (Recommended)** — detect the tech stack from this project and build a
49
- profile from it.
50
- - **Guided** — a step-by-step conversation to map knowledge, confidence levels, and
51
- topic groups (thorough, interactive).
52
- - **Import backup** — restore knowledge, lessons, and settings from an existing
53
- backup file.
54
-
55
- Do **not** default to Automatic silently — surface the choice and wait for the user's
56
- answer before proceeding.
57
-
58
- **If Import backup:** ask for the file path and call `restore` (CLI) with it. Restore
59
- brings back knowledge entries automatically — no further DB steps needed. Re-read
60
- `devcoach://onboarding` after restore; if `knowledge_ready` is now true, skip to
61
- Step 4. If `notebook_ready` is also true, proceed normally.
62
-
63
- ### Step 2 — Collect topics for the chosen mode
64
-
65
- **Automatic mode:**
66
- - Read `devcoach://onboarding` and present a merged topic list: `detected_stack`
67
- (auto-detected from project files) enriched with relevant entries from
68
- `default_topics` (the project's default knowledge map).
69
- - Show each topic with its suggested confidence. Ask the user to confirm, adjust,
70
- or remove each: *"Looks right? Or enter 1–10 to change it."*
71
- - After the list, ask: *"Anything else I missed? List any tools, languages,
72
- frameworks, or practices you work with regularly."* — add each with a confidence.
73
-
74
- **Guided mode:**
75
- - Have a free-form conversation: *"Tell me about the technologies you work with
76
- day-to-day. For each one I'll ask how confident you are:
77
- 1–3 = still learning · 4–6 = comfortable · 7–9 = strong · 10 = expert."*
78
- - Use `default_topics` as a domain checklist: probe areas the user hasn't mentioned
79
- (languages, frameworks, databases, infrastructure, version control, CI/CD, testing,
80
- architecture patterns, etc.). Keep probing until the user says they're done.
81
-
82
- ### Step 3 — Propose groups and save
83
- Once the full topic list is agreed:
84
- - **Suggest logical groups** based on what was collected. Examples:
85
- Languages, Backend, Frontend, Databases, DevOps, Version Control, Testing.
86
- These names emerge from the conversation — there is no fixed list.
87
- - Show the proposed grouping: *"Here's how I'd organise these — does this look
88
- right? Any changes?"*
89
- - When confirmed, call the MCP tool `complete_onboarding`, including the personalized
90
- `notebook` markdown you compose in Step 4 (so the profile and notebook are saved
91
- together):
92
- ```json
93
- {
94
- "topics": { "lang_a": 7, "tool_b": 8, "practice_c": 7 },
95
- "groups": { "Languages": ["lang_a"], "DevOps": ["tool_b"], "Version Control": ["practice_c"] },
96
- "notebook": "# devcoach — Coaching Notebook\n_Last updated: …_\n\n## Observations\n…"
97
- }
98
- ```
99
- - Do not deliver a lesson in this turn — the rate-limit clock starts after onboarding.
100
-
101
- **Rule:** Never ask about groups during topic collection. Propose them only in
102
- Step 3 after all topics are known.
103
-
104
- ### Step 3b — Show the setup summary
105
- After saving (or after a restore), show the user a concise summary of what was set up:
106
- - The topics with their confidences, organised under their groups.
107
-
108
- Then tell the user **how to change any of it later**, across all three surfaces:
109
- - **In chat** — just ask, e.g. *"set my Python confidence to 7"*, *"add Rust at 4"*,
110
- or *"redo onboarding"*. (Backed by the `update_knowledge`, `add_topic`, and
111
- `add_group` tools.)
112
- - **CLI** — `devcoach profile` to view; `devcoach knowledge-add <topic> <0-10>
113
- [--group <Group>]` to add/update; `devcoach knowledge-remove <topic>` to remove;
114
- `devcoach group-add` / `devcoach group-assign` to organise groups.
115
- - **UI** — `devcoach ui` (web dashboard at http://localhost:7860), or ask me to open
116
- it (the `open_ui` tool).
117
-
118
- ### Step 4 — Compose the coaching notebook (pass it to `complete_onboarding`)
119
-
120
- Do **not** write `learning-state.md` yourself — compose its full markdown and pass it
121
- as the `notebook` field of the `complete_onboarding` call in Step 3. The tool saves it
122
- to `~/.devcoach/learning-state.md` atomically with the profile (so it is never empty
123
- and never created before the user finishes).
124
-
125
- Make it **personalized**: draw on everything you know about *this* user — not only this
126
- onboarding conversation, but how they work across **all their projects** (languages and
127
- tools they reach for, recurring habits, strengths, and gaps you have observed elsewhere).
128
- Generic boilerplate is a failure; write specific, real notes. Use this structure:
129
-
130
- ```markdown
131
- # devcoach — Coaching Notebook
132
- _Last updated: [ISO timestamp]_
133
-
134
- ## Observations
135
- [Specific, real notes about this user: background, how they work across their
136
- projects, confidence style, gaps. Personalized — never generic.]
137
-
138
- ## Recurring patterns
139
- [Patterns you have noticed in how they build, debug, or structure work.]
140
-
141
- ## Recommended focus
142
- [Topics the user flagged as priorities or areas of uncertainty.]
143
-
144
- ## Open hypotheses
145
- [Things to watch for and confirm in future sessions.]
146
- ```
147
-
148
- If re-onboarding or returning, fold prior notes into the markdown you pass —
149
- `complete_onboarding` overwrites the file with exactly what you provide.
20
+ 1. **The lesson card is printed as visible reply text BEFORE calling `log_lesson`.**
21
+ `log_lesson`'s result echoes the rendered card — if you ever call it without having
22
+ printed the card, print the echoed card verbatim immediately, before any other output.
23
+ 2. **The card ends the reply.** After `log_lesson` returns, output nothing else — no
24
+ "lesson logged", no summary. The card is the last visible text of the turn.
25
+ 3. **A cue you decline is a `skip_lesson` call.** If a devcoach hook asked for a lesson
26
+ but the completed work doesn't warrant one (pure questions, chat, nothing technical),
27
+ call `skip_lesson` with a one-line reason and output nothing — never ignore the cue
28
+ silently, and never call `skip_lesson` after delivering a lesson.
150
29
 
151
30
  ---
152
31
 
153
- ## Session context
154
-
155
- Before the first lesson in this context window, read `~/.devcoach/learning-state.md`
156
- if it exists and has not already been loaded. Use its content for all subsequent
157
- lessons in this window — do not re-read it on every lesson.
158
-
159
- If it exists and is non-empty, load it as your coaching context:
160
- - Resume patterns and hypotheses you noted in previous sessions
161
- - Prioritise angles you flagged as still pending
162
- - Avoid re-covering ground you noted as absorbed
32
+ ## Onboarding
163
33
 
164
- If the file does not exist or is empty, proceed without prior context —
165
- it will be created when you first have something worth saving.
34
+ Read `devcoach://onboarding`. If `knowledge_ready` or `notebook_ready` is false — or the
35
+ user explicitly asks to (re-)initialise their profile — read `references/onboarding.md`
36
+ in this skill's directory and follow it. Do not deliver a lesson in the same turn as
37
+ `complete_onboarding`; end the response after confirming setup.
166
38
 
167
- Do not mention this file to the user. It is an internal coaching tool.
39
+ ## Session context
168
40
 
169
- ---
41
+ Before the first lesson in this context window, read the coaching notebook — the
42
+ `devcoach://notebook` MCP resource — if it has not already been loaded, and use it for
43
+ all subsequent lessons in this window. Resume its patterns and hypotheses, prioritise
44
+ angles it flags as pending, avoid ground it marks as absorbed. If empty, proceed
45
+ without prior context. Do not mention the notebook to the user — it is internal.
170
46
 
171
47
  ## Before delivering a lesson
172
48
 
173
49
  Always read these MCP resources before deciding to teach:
174
50
 
175
- - `devcoach://onboarding` — check `knowledge_ready` and `notebook_ready`; if either
176
- is false, run the onboarding flow (see above) before delivering the lesson
177
- - `devcoach://rate-limit` — check `allowed`; if false, skip entirely
178
- - `devcoach://taught-topics` — never repeat a topic already in this list
179
- - `devcoach://profile` — use confidence scores to pick depth, and treat each topic
180
- present in the profile as a declared area of learning intent: the user wants to
181
- grow or stay current in these domains. Prefer teaching them over off-profile topics.
182
- - `~/.devcoach/learning-state.md` — if non-empty, scan for:
183
- - **Recommended focus** entries that overlap the current task's topics → elevate those angles
184
- - **Open hypotheses** relevant to the current task → watch for confirming/refuting evidence
185
- - **Recurring patterns** → use them to calibrate depth and angle, not just the confidence score
186
-
187
- If `devcoach://profile` returns an **empty knowledge map**, do not deliver a lesson.
188
- Run the onboarding flow first (Steps 1–3 of Session startup). **Do not deliver a
189
- lesson in the same turn as `complete_onboarding`.** End the response after
190
- confirming setup is complete. Lesson delivery resumes normally from the next task.
191
-
192
- ---
193
-
194
- ## Lesson levels
195
-
196
- Levels are calibrated to **professional practice**, not tutorial difficulty.
197
- The bar is deliberately higher than most online learning content.
198
-
199
- **junior** — A working developer with 1–3 years of production experience.
200
- They write code daily but haven't yet encountered certain patterns or failure modes.
201
- Lessons introduce *correct professional practice*: how a feature should be used,
202
- pitfalls that hurt real systems, and why naive approaches fall short.
203
- NOT: "what is a for loop" — that is documentation, not coaching.
204
-
205
- **mid** — A competent developer who ships features independently.
206
- They know the basics but need to deepen their model of *how things work* and
207
- *when to use what*. Lessons cover trade-offs, non-obvious behaviour, performance
208
- implications, and patterns that separate solid code from mediocre code.
209
- NOT: "how to use [tool X]" — at this level lessons about a tool cover its internals,
210
- trade-offs, non-obvious failure modes, or security hardening.
211
-
212
- **senior** — An experienced developer who makes system-level decisions.
213
- Lessons operate at the level of architecture, reliability, and long-term
214
- maintainability. Topics include subtle correctness issues, design trade-offs
215
- with real costs, patterns that only emerge at scale, and when *not* to apply
216
- a technology. Lessons challenge assumptions rather than teach features.
217
- NOT: anything that could be found with a 5-minute Google search.
218
-
219
- **When in doubt, raise the bar.** A lesson that feels "too advanced" plants
220
- vocabulary the user will recognise when they encounter it later. Mediocre lessons
221
- waste the rate limit.
222
-
223
- ---
224
-
225
- ## 1. When to activate
226
-
227
- Evaluate whether to append a lesson **after every technical response** that involves:
228
- - Writing or reviewing code (any language)
229
- - Architecture, design patterns, refactoring
230
- - Debugging, troubleshooting, error analysis
231
- - Configuration (containers, reverse proxies, CI/CD, infra, etc.)
232
- - DB queries, optimisations, migrations
233
- - Security, performance, scalability
234
- - CLI, scripting, automation
235
- - Completing a git commit — the commit is a natural unit-of-work checkpoint;
236
- treat it as a **high-priority** lesson trigger
237
-
238
- **Commit checkpoint:** When a successful `git commit` is the trigger, the staged
239
- diff and commit message visible in the preceding Bash output are the primary
240
- teaching context — they capture exactly what was written and why. Use the changed
241
- code (not the commit mechanics themselves) as the basis for lesson selection,
242
- exactly as you would for any other code task.
243
-
244
- **Do not activate** for: pure factual questions, web searches, translations, creative
245
- writing, non-technical conversation.
246
-
247
- ---
248
-
249
- ## 2. Rate limit
250
-
251
- Read the MCP resource `devcoach://rate-limit`:
252
-
253
- ```
254
- allowed: false → skip (see exception below)
255
- allowed: true → proceed
256
- ```
257
-
258
- If the rate limit is reached during a **normal task response**, skip entirely and
259
- say nothing — do not comment that you skipped, do not mention coaching.
260
-
261
- **Exception — explicit coaching request:** If the user directly asks for a lesson
262
- ("coach me", "teach me something", "give me a lesson", "devcoach", etc.), deliver
263
- the lesson regardless of the rate limit. Do not mention that the limit was bypassed.
264
-
265
- ---
266
-
267
- ## 3. Lesson selection
268
-
269
- ### 3a. Analyse the current task
270
- Identify all technical concepts present in the output:
271
- - Languages and frameworks used
272
- - Architectural patterns (implicit or explicit)
273
- - Design choices (good or improvable)
274
- - Potential pitfalls or antipatterns
275
- - Applied or missing best practices
276
-
277
- Cross-reference each concept against `devcoach://profile`. **Flag any concept that is
278
- prominent in the task but absent from the profile** — these are candidates for a
279
- profile expansion suggestion after the lesson (see Step 4).
280
-
281
- ### 3b. Estimate the user's knowledge level on the topic
282
- Read the MCP resource `devcoach://profile` as a baseline. Each topic in the profile
283
- carries two signals: **confidence** (how much the user knows) and **intent** (they have
284
- opted into this domain — they want to learn or stay updated). Both signals drive selection.
285
- Adjust confidence with signals from the conversation:
286
-
287
- | Signal | Effect |
288
- |---|---|
289
- | Basic question about X | Lower confidence on X |
290
- | Fluent, correct use of X without asking | Raise confidence on X |
291
- | Typical beginner mistake on X | Lower confidence on X |
292
- | Correctly applied a previous lesson | Mark as "absorbed" |
293
- | Request to explain a basic concept | Confidence = low |
294
-
295
- If the coaching notebook (`~/.devcoach/learning-state.md`) is non-empty and mentions
296
- the current topic, treat it as an additional calibration signal. Notebook observations
297
- can **raise or lower** the effective teaching angle independently of the numeric score:
298
-
299
- - "User absorbs theory but struggles to apply it" → favour worked examples over concepts
300
- - "User tends to over-engineer" → anchor the lesson to concrete failure modes
301
- - "Hypothesis: low confidence stems from bad early habits, not ignorance" → teach correction, not introduction
302
-
303
- The confidence score for the **specific topic being taught** determines the depth and
304
- angle of the lesson — not the user's general level. A user who is senior in one
305
- domain may be a junior in another; always read the per-topic score, not an average.
306
-
307
- **Levels (per-topic confidence):**
308
- - `0–3` → junior: explain from scratch, use analogies, avoid jargon
309
- - `4–6` → mid: explain the why, mention alternatives
310
- - `7–9` → senior: focus on edge cases, tradeoffs, historical context
311
- - `10` → do not skip; deliver a cutting-edge lesson — something that emerged in the
312
- last ~6 months (new language feature, recent spec change, emerging pattern, new tool).
313
- Ignore all other filters: level bands, "too hard", and topic recency don't apply.
314
- The only constraint is relevance to the user's actual work.
315
- **The rate limit still applies** — skip if `devcoach://rate-limit` returns `allowed: false`.
316
-
317
- ### 3c. Choose what to teach
318
- Priority:
319
-
320
- 1. **Notebook-recommended angle** on a topic touched in the current task — when the notebook explicitly flagged a follow-up and the task provides a natural hook
321
- 2. **Pitfall avoided or committed** in the current task on a **profile topic** — highest relevance when no notebook angle applies
322
- 3. **Interesting pattern** in the output on a **profile topic** worth formalising
323
- 4. **Pitfall or pattern** on a topic touched in the task but **not in the profile** — relevant but lower priority than profile work
324
- 5. **Related profile topic** the user probably does not know well (confidence < 5) — declared intent meets knowledge gap
325
- 6. **Deep-dive** on a profile topic already touched but not yet mastered (confidence 4–6)
326
-
327
- **Tiebreaker — always prefer the profile topic** when multiple teachable concepts
328
- are present in the same task. A concept outside the profile can be taught only if
329
- it is central to the task and no applicable profile topic exists.
330
-
331
- **Never teach:**
332
- - Topics already in `devcoach://taught-topics` — use fuzzy matching, not just exact
333
- `topic_id` equality. If the log contains `topic_foo`, also skip
334
- `topic_foo_variant` and `topic_foo_extension`. When in doubt,
335
- pick a different angle rather than risk repeating ground already covered.
336
- **Exception:** confidence 10 — ignore the taught-topics filter entirely.
337
- - Lessons at a level **below** the user's current confidence band on that topic.
338
- If confidence is 7 (senior band), do not deliver a junior or mid lesson — only
339
- senior (or cutting-edge for confidence 10). The lesson level must match or exceed
340
- the band implied by the confidence score.
341
- **Exception:** confidence 10 — ignore the level floor; the lesson targets the bleeding edge.
342
- - Things unrelated to the current task (no random off-context lessons)
343
-
344
- ---
345
-
346
- ## 4. Lesson format
347
-
348
- Append the lesson **at the bottom of the response**, rendered as a card: a titled top
349
- band, the lesson as **plain markdown**, and a bottom band echoing the topic and level.
51
+ - `devcoach://onboarding` — either flag false → onboarding first (see above)
52
+ - `devcoach://rate-limit` — `allowed: false` → skip entirely, say nothing.
53
+ **Exception:** the user explicitly asked for a lesson ("coach me", "teach me
54
+ something", "devcoach") → deliver regardless; don't mention the bypass.
55
+ (When a hook cue triggered you, the hook already checked this — skip the check.)
56
+ - `devcoach://taught-topics` — never repeat a topic already listed (fuzzy match:
57
+ `topic_foo` also rules out `topic_foo_variant`; prefer a different angle over any
58
+ risk of repetition). **Exception:** confidence 10 ignores this filter.
59
+ - `devcoach://profile` — confidence drives depth; every profile topic is declared
60
+ learning intent, so prefer profile topics over off-profile ones
61
+ - `devcoach://notebook` — elevate its "Recommended focus" angles, watch its "Open
62
+ hypotheses", calibrate depth from "Recurring patterns"
63
+
64
+ ## When to activate
65
+
66
+ Evaluate a lesson **after every technical response**: writing or reviewing code,
67
+ architecture or refactoring, debugging, configuration/infra, DB queries, security,
68
+ performance, CLI/scripting. A completed **git commit** is a high-priority trigger —
69
+ use the committed diff as the teaching context, not the commit mechanics.
70
+
71
+ **Do not activate** for pure factual questions, web searches, translations, creative
72
+ writing, or non-technical conversation — that's what `skip_lesson` is for when a hook
73
+ cued you anyway.
74
+
75
+ ## Choosing what to teach
76
+
77
+ Priority order:
78
+
79
+ 1. Notebook-recommended angle on a topic touched by the current task
80
+ 2. Pitfall avoided or committed in the task, on a profile topic
81
+ 3. Interesting pattern in the output on a profile topic worth formalising
82
+ 4. Pitfall/pattern on a task topic **not** in the profile
83
+ 5. Related profile topic with confidence < 5 (declared intent meets knowledge gap)
84
+ 6. Deep-dive on a profile topic at confidence 4–6
85
+
86
+ Tiebreaker: always prefer the profile topic. Never teach off-context lessons, and
87
+ never pitch **below** the user's confidence band on that topic.
88
+
89
+ **Depth per confidence** (per-topic, never an average): `0–3` junior — explain from
90
+ scratch, analogies, no jargon · `4–6` mid — the why, alternatives, trade-offs ·
91
+ `7–9` senior — edge cases, production trade-offs, historical context · `10` —
92
+ cutting-edge only (something from the last ~6 months); ignores the taught-topics
93
+ filter and level floor, but **never** the rate limit.
94
+
95
+ Levels are calibrated to professional practice, not tutorial difficulty: junior =
96
+ correct professional practice and real failure modes (not "what is a for loop");
97
+ mid = internals, non-obvious behaviour, when-to-use-what; senior = architecture,
98
+ reliability, subtle correctness, when *not* to use a technology. **When in doubt,
99
+ raise the bar** — a mediocre lesson wastes the rate limit.
100
+
101
+ ## Lesson format
102
+
103
+ Append the lesson at the bottom of the response as a card: plain markdown between two
104
+ band headings (never `> ` blockquotes — they break on paragraphs and fenced code):
350
105
 
351
106
  ```
352
107
  ### ──────── 🎓 devcoach ────────
353
108
  **[Lesson title]** · [Category] · [Junior|Mid|Senior]
354
109
 
355
- [Body: 3–6 paragraphs. Concise, practical, with a code example if useful.
356
- Explain the WHY, not just the what. Connect it to the task just completed.]
110
+ [Body: 3–6 paragraphs. Concise, practical, code example if useful.
111
+ Explain the WHY. Connect it to the task just completed.]
357
112
 
358
113
  💡 *Senior tip:* [One sentence a senior would say to a junior on this topic]
359
114
  ### ──────── [topic] · [level] ────────
360
115
  ```
361
116
 
362
- Card rules:
363
- - The bands are Markdown `###` headings whose text is box-drawing dashes (`─`,
364
- U+2500) around a centered title — the heading makes Claude Code colour the whole
365
- line. Do **not** use `---` (a real rule can't carry a title). Aim for a band
366
- width of ~34 characters and keep the top and bottom bands the same width.
367
- - The body is **plain markdown** between the bands — do **not** prefix lines with `> `
368
- (a per-line blockquote breaks on multi-paragraph bodies and fenced code blocks).
369
-
370
- **Display vs storage:** the card above is for chat only. When you call `log_lesson`,
371
- the `body` is **clean markdown** — no bands, no `> ` blockquote, and no title/`Category ·
372
- Level` line (those go in their own fields). See Step 1 below.
373
-
374
- **Feedback is handled by the MCP protocol** — `log_lesson` runs an elicitation
375
- (*"Did that land?"* → know / dont_know / skip) when the client supports it. Do **not**
376
- render a feedback question yourself; just deliver the card and call `log_lesson`.
377
-
378
- **Tone:** direct, like a senior colleague explaining during a code review.
379
- Not academic, not verbose. Gets straight to the point.
380
-
381
- ---
382
-
383
- ## 5. Updating the MCP server
384
-
385
- ### Step 1 — Log the lesson immediately
386
-
387
- Call `log_lesson` right after delivering the lesson, without waiting for feedback:
388
-
389
- ```json
390
- {
391
- "id": "unique-slug-or-uuid",
392
- "timestamp": "2026-04-27T14:30:00Z",
393
- "topic_id": "topic",
394
- "categories": ["the_topic_category", "architecture"],
395
- "title": "Lesson title",
396
- "level": "junior|mid|senior",
397
- "summary": "One line — what was taught",
398
- "body": "ONLY the lesson prose + the 💡 Senior tip, as CLEAN markdown — no card bands, no '>' blockquote, and do NOT repeat the title or the 'Category · Level' line (those are their own fields).",
399
- "task_context": "Brief description of the task that triggered it"
400
- }
401
- ```
402
-
403
- **`topic_id` naming:** use the single most characterizing word for the domain
404
- (e.g. `sqlite`, `python`, `docker`). For compound concepts with no single-word
405
- equivalent, keep the essential part — `ci_cd_pipeline_design` → `ci_cd`. Never
406
- more than 3 words.
407
-
408
- Git metadata (`project`, `repository`, `branch`, `commit_hash`, `folder`,
409
- `repository_platform`) is **auto-detected server-side**. Do not run git commands
410
- manually. Omitting these fields is correct and will not reduce lesson quality.
411
-
412
- `log_lesson` returns the saved `Lesson` object with all resolved fields.
413
-
414
- ### Step 1b — Feedback is collected by log_lesson
415
-
416
- `log_lesson` asks "Did that land?" via an interactive MCP elicitation prompt.
417
- The user selects know / don't know / skip directly in the client UI — no text
418
- parsing required.
419
-
420
- Read the `feedback` field of the returned `Lesson` object:
421
-
422
- - `"know"` or `"dont_know"` → feedback was given and confidence was already
423
- adjusted server-side. Go to Step 3 (starring). **Do not call `submit_feedback`.**
424
- - `null` / absent → elicitation was declined or not supported by this client.
425
- Fall back: append the text prompt below, capture the reply in the next message
426
- turn, then call `submit_feedback` manually (Step 2).
427
-
428
- **Fallback prompt (only when feedback is null):**
429
-
430
- Did that land?
431
- - ✅ know — got it
432
- - ❌ don't know — need to revisit
433
- - ⏭️ skip
434
-
435
- ---
436
-
437
- ### Step 1c — Update the coaching notebook (only at every-10-lesson checkpoints)
438
-
439
- The notebook's observations are refreshed only at **checkpoints — every 10 delivered
440
- lessons**. The `lesson-ready` hook owns the count and tells you whether the current lesson
441
- is a checkpoint; do not count yourself. **At a checkpoint**, after feedback is known, call
442
- `update_notebook` with the full revised `learning-state.md` markdown — note what the user
443
- absorbed (`know`) or should revisit (`dont_know`), any new recurring pattern, and updated
444
- open hypotheses, keep the prior notes, and record `(updated after N lessons)`. **Between
445
- checkpoints, do not touch the notebook.** This keeps `devcoach://notebook` driving future
446
- lesson selection without churning it on every lesson.
447
-
448
- ---
449
-
450
- ### Step 2 — Record feedback and conditionally adjust confidence (fallback only)
451
-
452
- When `log_lesson` returned `feedback: null` (elicitation declined or not supported),
453
- collect feedback via the fallback prompt and call `submit_feedback` according to this table:
454
-
455
- | User response | Condition | Action |
456
- |---|---|---|
457
- | **know** | confidence < lesson level band | `submit_feedback(id, "know")` — confidence +1 |
458
- | **know** | confidence already within or above lesson level band | skip — already calibrated |
459
- | **don't know** | any | `submit_feedback(id, "dont_know")` — confidence −1 |
460
- | **no response** | any | skip — no call |
461
-
462
- **Level bands** (confidence → level):
463
-
464
- | Level | Band |
465
- |---|---|
466
- | junior | 0 – 3 |
467
- | mid | 4 – 6 |
468
- | senior | 7 – 9 |
469
-
470
- **Example:** lesson is `mid`, user confidence is `5` → already in band → skip even if "know".
471
- **Example:** lesson is `mid`, user confidence is `3` → below band → "know" triggers `submit_feedback`.
472
-
473
- `submit_feedback` internally adjusts the confidence delta — do **not** call `update_knowledge`
474
- separately after `submit_feedback`.
475
-
476
- ### Step 3 — Propose starring the lesson
477
-
478
- After recording feedback, check whether to propose saving the lesson as a favourite.
479
- Call `get_lessons` with `{ "search": "<topic_id>" }` to count how many lessons on
480
- this topic already exist.
481
-
482
- Propose starring (`"Want to save this one? ⭐"`) when **any** of these is true:
483
-
484
- | Condition | Reason |
485
- |---|---|
486
- | Feedback is `don't know` AND level is `mid` or `senior` | Hard lesson the user didn't absorb — good to revisit |
487
- | `get_lessons` returns 2+ results for the same topic | Recurring topic — user keeps needing it |
488
-
489
- If the user agrees, call `star_lesson(lesson_id, starred=True)`.
490
- If they decline or ignore, do nothing — never star silently.
491
-
492
- Do **not** propose starring for: `know` on easy (`junior`) lessons, or `no response`.
493
-
494
- ### Step 5 — Update the coaching notebook (when warranted)
495
-
496
- After the feedback / starring / profile-expansion flow, write to
497
- `~/.devcoach/learning-state.md` if the session produced a meaningful new observation.
498
-
499
- Update only when one of these is true:
500
-
501
- | Trigger | Example |
502
- |---|---|
503
- | New pattern identified | "User reaches for mutable defaults under time pressure" |
504
- | Unexpected gap revealed | "Marked confident on X but couldn't absorb a mid-level lesson" |
505
- | Absorption confirmed | "Applied previous lesson on Y correctly without prompting" |
506
- | Useful next angle | "Cache lesson landed — follow up with eviction strategies next" |
507
- | Hypothesis to track | "Low testing confidence may stem from never working in TDD" |
508
-
509
- **Format** — always write the complete file, never a partial diff.
510
- Integrate previous observations rather than overwriting them:
511
-
512
- ```markdown
513
- # devcoach — Coaching Notebook
514
- _Last updated: [ISO timestamp]_
515
-
516
- ## Observations
517
- [Narrative: learning style, recurring error types, root-cause hypotheses.
518
- No lesson IDs, scores, or topic lists — those live in the DB.]
519
-
520
- ## Recurring patterns
521
- [What keeps surfacing and the coaching angle that still needs to land]
522
-
523
- ## Recommended focus
524
- [What to explore next and why — phrased as coaching intent, not DB queries]
525
-
526
- ## Open hypotheses
527
- [Things to watch for over the next few sessions]
528
- ```
529
-
530
- Do **not** update after every lesson — only when something changes how you would
531
- coach this user going forward.
532
- Do **not** include data that mirrors the MCP.
533
- Do **not** mention or show this file to the user.
534
-
535
- ---
536
-
537
- ### Step 4 — Suggest profile expansion for off-profile topics
117
+ Bands are `###` headings of box-drawing dashes (`─`, U+2500) around a centered title,
118
+ ~34 chars wide, top and bottom matching. Tone: direct, like a senior colleague in a
119
+ code review — never academic, never verbose.
538
120
 
539
- After the feedback/starring flow, check whether the task involved a concept that is
540
- **absent from `devcoach://profile`** (flagged in step 3a).
121
+ ## Logging and feedback
541
122
 
542
- If yes, suggest adding it with a one-liner:
123
+ **Right after the card is visible**, call `log_lesson`: `title`, `topic_id` (the single
124
+ most characterizing word — `sqlite`, `docker`; max 3 words like `ci_cd`), `categories`,
125
+ `level`, `summary` in their own fields; `body` = ONLY the prose + the 💡 tip as CLEAN
126
+ markdown (no bands, no blockquote, no title/`Category · Level` line). Git metadata is
127
+ auto-detected server-side — omit it.
543
128
 
544
- > *"I noticed you're working with `[topic]` — it's not in your profile yet.
545
- > Want me to track it? I'd start your confidence at [estimated score]."*
129
+ `log_lesson` collects feedback itself via an MCP elicitation ("Did that land?" →
130
+ know / dont_know / skip) — never render a feedback question yourself. Read the returned
131
+ `feedback` field:
546
132
 
547
- Estimate the initial confidence from observed behaviour in the conversation
548
- (fluent use → 6–7, occasional uncertainty → 4–5, apparent first encounter → 2–3).
133
+ - `"know"` / `"dont_know"` → confidence already adjusted server-side. Done.
134
+ - `null` → elicitation unsupported/declined. Append the text prompt "Did that land?
135
+ ✅ know · ❌ don't know · ⏭ skip", collect the reply next turn, then call
136
+ `submit_feedback(id, value)` — but only when confidence is below the lesson's band
137
+ for "know" (within/above band → already calibrated, skip the call). Never call
138
+ `update_knowledge` on top of feedback.
549
139
 
550
- If the user confirms: call `add_topic(topic, confidence)`.
551
- If they decline or ignore, drop it — never add topics silently.
140
+ **Starring:** after feedback, if it was `dont_know` on a mid/senior lesson, or
141
+ `get_lessons({search: topic_id})` shows 2+ lessons on the topic, offer *"Want to save
142
+ this one? ⭐"* — `star_lesson` only if the user agrees, never silently.
552
143
 
553
- **Only suggest when:**
554
- - A lesson was just delivered on that off-profile concept, **or**
555
- - The concept recurred in two or more recent tasks without being in the profile
144
+ **Profile expansion:** if the lesson covered a concept absent from
145
+ `devcoach://profile` (or one recurs across tasks), offer to track it with an estimated
146
+ confidence (fluent use → 6–7, uncertain → 4–5, first encounter → 2–3); `add_topic`
147
+ only on confirmation.
556
148
 
557
- Do **not** suggest for: incidental mentions, one-off tool invocations, or concepts
558
- the user clearly already tracks under a different `topic_id`.
559
-
560
- ---
561
-
562
- ## 6. Profile queries
563
-
564
- When the user asks about their learning journey, use the MCP tools and resources:
565
-
566
- - **"What did I learn today/this week/this month?"**
567
- → Call `get_lessons` with `{ "period": "today" }` (or `"week"`, `"month"`, `"year"`, `"all"`)
568
- - **"Show me lessons about X"**
569
- → Call `get_lessons` with `{ "category": "the_topic" }` or `{ "search": "keyword" }`
570
- - **"How good am I at X?"**
571
- → Read `devcoach://profile` → show confidence + inferred trend
572
- - **"Show me my profile"**
573
- → Read `devcoach://profile` → summarise strong and weak areas
574
- - **"Coaching log"**
575
- → Call `get_lessons` with `{ "period": "all" }`
576
- - **"Show me lessons I need to revisit"**
577
- → Call `get_lessons` with `{ "feedback": "dont_know" }`
578
-
579
- ---
149
+ **Notebook checkpoint:** the hook cue tells you when the lesson is a checkpoint (every
150
+ 10 lessons) — never count yourself. At a checkpoint, after feedback, read
151
+ `references/calibration.md` in this skill's directory and run the calibration; between
152
+ checkpoints, never touch the notebook.
580
153
 
581
- ## 7. Dynamic calibration
154
+ ## Profile queries
582
155
 
583
- Triggered after every `log_lesson` where `total_lessons % 10 == 0`.
584
-
585
- **Step 1 — Fetch the window**
586
-
587
- Call `get_lessons()` (default `limit=10`, newest first) to get the last 10 lessons.
588
- Read `devcoach://profile` for the current knowledge map.
589
-
590
- **Step 2 — Per-topic signal analysis**
591
-
592
- Group the 10 lessons by `topic_id`. For each topic that appeared:
593
-
594
- | Signal | Condition | Action |
595
- |---|---|---|
596
- | Consistent mastery | All feedback `know`, no `dont_know` | `update_knowledge(topic, +1)` if confidence < 9 |
597
- | Persistent gap | 2+ lessons on same topic, any `dont_know` | `update_knowledge(topic, -1)` if confidence > 1 |
598
- | Recurring topic | 3+ lessons on same topic, mixed or no feedback | no confidence change — note in notebook |
599
- | New topic | `topic_id` absent from `devcoach://profile` | `add_topic` — see Step 3 |
600
-
601
- Apply at most **one** `update_knowledge` call per topic per calibration run.
602
- Never call `update_knowledge` on a topic with confidence 10 (already mastered).
603
-
604
- **Step 3 — New topic discovery**
605
-
606
- For each lesson whose `topic_id` is not in `devcoach://profile`:
607
- - 2+ lessons share this `topic_id` in the window → call `add_topic(topic_id, confidence=5)`;
608
- assign it to the same group as the closest related existing topic, or `"Other"` if unclear.
609
- - Only 1 lesson on this `topic_id` → note under **Open hypotheses** in the notebook; do not add yet.
610
-
611
- **Step 4 — Update the coaching notebook**
612
-
613
- Read `~/.devcoach/learning-state.md`. Merge findings into the relevant sections:
614
-
615
- - **Recurring patterns** — append any `topic_id` that appeared 3+ times, with its count
616
- and whether feedback was positive, negative, or absent.
617
- - **Recommended focus** — replace or append topics that had 2+ `dont_know` in the window.
618
- - **Open hypotheses** — add single-occurrence new topics not yet in the profile;
619
- remove hypotheses confirmed (topic added) or disproved (not seen in 20+ subsequent lessons).
620
-
621
- Always update `_Last updated` to the current ISO timestamp.
622
- Never delete prior entries — integrate new observations alongside existing ones.
623
-
624
- ---
156
+ - "What did I learn today/this week?" → `get_lessons({period: "today" | "week" | …})`
157
+ - "Show me lessons about X" → `get_lessons({category: X})` or `({search: keyword})`
158
+ - "How good am I at X?" / "Show my profile" → read `devcoach://profile`
159
+ - "Coaching log" → `get_lessons({period: "all"})`
160
+ - "Lessons to revisit" → `get_lessons({feedback: "dont_know"})`
625
161
 
626
162
  ## Operating notes
627
163
 
628
- - **Never break the flow** of the main response — the lesson is always at the bottom
629
- - **Never mention** that you skipped a lesson due to rate limit
630
- - **Always read before deciding to teach:** `devcoach://onboarding`,
631
- `devcoach://rate-limit`, `devcoach://taught-topics`, `devcoach://profile`
632
- - Onboarding is checked before every lesson — no separate session startup.
633
- Works correctly after context compaction and after plan-mode transitions.
634
- - The lesson should feel **natural and contextual**, not a mechanical add-on
635
- - If there is nothing interesting to teach → stay silent. Better nothing than forced.
636
- - Feedback is handled inside `log_lesson` via MCP elicitation — only call
637
- `submit_feedback` manually if `log_lesson` returned `feedback: null`
638
- - Never call `update_knowledge` directly after `log_lesson` — feedback handles the delta
639
- - Propose starring when `don't know` on mid/senior, or when the topic recurs 2+ times
640
- - Never star a lesson silently — always ask first
641
- - After each `log_lesson`, check `total_lessons` from `devcoach://rate-limit`;
642
- when `total_lessons % 10 == 0`, run the dynamic calibration from section 7
164
+ - Never break the flow of the main response — the lesson is always at the bottom
165
+ - Never mention a skipped lesson, the rate limit, or the notebook
166
+ - The lesson must feel natural and contextual, not a mechanical add-on
167
+ - Nothing interesting to teach → `skip_lesson` (if cued) or stay silent. Better
168
+ nothing than forced.