@ericrisco/rsc 0.1.43 → 0.1.45
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/README.md +1 -1
- package/manifest.json +110 -86
- package/package.json +1 -1
- package/scripts/lib/domains.js +1 -1
- package/scripts/skill-migration-brief.md +104 -0
- package/skills/ab-testing/SKILL.md +9 -41
- package/skills/accessibility/SKILL.md +5 -7
- package/skills/ads/SKILL.md +9 -24
- package/skills/agent-eval/SKILL.md +7 -33
- package/skills/agent-safety/SKILL.md +7 -14
- package/skills/ai-media/SKILL.md +4 -20
- package/skills/analytics/SKILL.md +8 -30
- package/skills/analyze/SKILL.md +24 -59
- package/skills/angular/SKILL.md +12 -25
- package/skills/api-connector-builder/SKILL.md +10 -27
- package/skills/api-design/SKILL.md +7 -14
- package/skills/article-writing/SKILL.md +1 -18
- package/skills/astro/SKILL.md +36 -54
- package/skills/author-skill/SKILL.md +41 -74
- package/skills/author-skill/evals/README.md +5 -5
- package/skills/author-skill/evals/cases.yaml +8 -8
- package/skills/author-skill/references/description-recipe.md +25 -26
- package/skills/author-skill/references/eval-authoring.md +1 -1
- package/skills/author-skill/references/rsc-conventions.md +1 -1
- package/skills/automation-flows/SKILL.md +6 -16
- package/skills/automation-strategy/SKILL.md +1 -9
- package/skills/aws-essentials/SKILL.md +6 -23
- package/skills/backups/SKILL.md +1 -7
- package/skills/bash-scripting/SKILL.md +5 -9
- package/skills/bookkeeping/SKILL.md +2 -10
- package/skills/brand-identity/SKILL.md +18 -44
- package/skills/brand-voice/SKILL.md +4 -31
- package/skills/building-agents/SKILL.md +20 -103
- package/skills/business-intelligence/SKILL.md +9 -23
- package/skills/calendar-scheduling/SKILL.md +11 -27
- package/skills/case-studies/SKILL.md +3 -8
- package/skills/chatbot/SKILL.md +6 -23
- package/skills/chrome-extension/SKILL.md +2 -2
- package/skills/clarify/SKILL.md +31 -72
- package/skills/clickhouse-analytics/SKILL.md +2 -8
- package/skills/client-onboarding/SKILL.md +17 -19
- package/skills/cloudflare/SKILL.md +3 -8
- package/skills/code-review/SKILL.md +10 -23
- package/skills/codebase-onboarding/SKILL.md +2 -7
- package/skills/cold-outreach/SKILL.md +9 -30
- package/skills/community/SKILL.md +4 -31
- package/skills/competitor-watch/SKILL.md +20 -35
- package/skills/compliance/SKILL.md +10 -37
- package/skills/compose-multiplatform/SKILL.md +1 -1
- package/skills/constitution/SKILL.md +8 -35
- package/skills/content-engine/SKILL.md +4 -16
- package/skills/context-budget/SKILL.md +3 -21
- package/skills/continuous-learning/SKILL.md +10 -40
- package/skills/contracts/SKILL.md +6 -17
- package/skills/coolify/SKILL.md +8 -14
- package/skills/cost-tracking/SKILL.md +3 -11
- package/skills/course-builder/SKILL.md +17 -45
- package/skills/course-storytelling/SKILL.md +26 -94
- package/skills/cpp/SKILL.md +26 -71
- package/skills/csharp-dotnet/SKILL.md +19 -38
- package/skills/customer-support/SKILL.md +14 -37
- package/skills/dashboard/SKILL.md +6 -26
- package/skills/data-cleaning/SKILL.md +37 -63
- package/skills/data-policy/SKILL.md +8 -21
- package/skills/data-scraper/SKILL.md +1 -7
- package/skills/debug/SKILL.md +10 -49
- package/skills/deployment/SKILL.md +38 -101
- package/skills/design/SKILL.md +34 -116
- package/skills/fable-operator/SKILL.md +1 -4
- package/skills/fastapi/SKILL.md +50 -82
- package/skills/flutter/SKILL.md +41 -89
- package/skills/go/SKILL.md +57 -105
- package/skills/harness/SKILL.md +52 -68
- package/skills/implement/SKILL.md +1 -1
- package/skills/init/SKILL.md +152 -168
- package/skills/marketing/SKILL.md +30 -80
- package/skills/nextjs/SKILL.md +42 -116
- package/skills/orient/SKILL.md +25 -20
- package/skills/parallel/SKILL.md +9 -75
- package/skills/plan/SKILL.md +92 -165
- package/skills/postgresdb/SKILL.md +52 -72
- package/skills/presentations/SKILL.md +49 -87
- package/skills/python/SKILL.md +23 -72
- package/skills/react/SKILL.md +19 -67
- package/skills/review/SKILL.md +22 -52
- package/skills/rust/SKILL.md +40 -115
- package/skills/sdd-init/SKILL.md +9 -14
- package/skills/secure-coding/SKILL.md +80 -109
- package/skills/ship/SKILL.md +25 -55
- package/skills/tasks/SKILL.md +37 -61
- package/skills/typescript/SKILL.md +22 -55
- package/skills/verify/SKILL.md +8 -32
- package/skills/viral-score/SKILL.md +122 -0
- package/skills/viral-score/evals/README.md +16 -0
- package/skills/viral-score/evals/cases.yaml +50 -0
- package/skills/vue-nuxt/SKILL.md +45 -106
- package/skills/worktrees/SKILL.md +24 -69
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: course-storytelling
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when lesson or course content is correct but forgettable and a concept has to LAND: profiles the learner, breaks the blocking false belief, then rebuilds it as epiphany story → named model → grounded analogy → proof → so-what. NOT outcomes, assessment or module order (that is `course-builder`), NOT slide visuals (that is `presentations`)."
|
|
4
4
|
tags: [course, teaching, storytelling, content]
|
|
5
5
|
recommends: [presentations]
|
|
6
6
|
origin: risco
|
|
@@ -10,75 +10,38 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
*Take a concept the student would forget and turn it into one they can't unhear. Profile the learner first, then run every concept through the Expert Secrets machine: epiphany story → named model → grounded analogy → proof → do-this-now → the so-what.*
|
|
12
12
|
|
|
13
|
-
This skill owns **the teaching narrative**: extracting what a course actually teaches, finding where it stays abstract, and rebuilding each concept so the realization happens *in the student*, emotionally, not just on the slide. It borrows Russell Brunson's *Expert Secrets* frameworks as a **teaching methodology** (this is method, not text reproduction).
|
|
13
|
+
This skill owns **the teaching narrative**: extracting what a course actually teaches, finding where it stays abstract, and rebuilding each concept so the realization happens *in the student*, emotionally, not just on the slide. It borrows Russell Brunson's *Expert Secrets* frameworks as a **teaching methodology** (this is method, not text reproduction).
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Use when:
|
|
18
|
-
|
|
19
|
-
- You have lesson/module/course material (slides, transcript, notes, outline) and the teaching feels flat, abstract, or forgettable.
|
|
20
|
-
- A concept is technically correct but "doesn't click" — students nod and forget.
|
|
21
|
-
- You want a sticky, ownable name + a grounded analogy + a story for an idea.
|
|
22
|
-
- You're sequencing a course and need a belief-building narrative spine, not just a topic list.
|
|
23
|
-
- You want the student to *feel* the epiphany the expert felt, so they trust the teacher.
|
|
24
|
-
|
|
25
|
-
Do NOT use when (delegate or decline):
|
|
26
|
-
|
|
27
|
-
- Designing the slide visuals, layout, or exporting a deck → `presentations` (+ `design` for the visual system).
|
|
28
|
-
- Writing sales/landing copy for the course → `marketing`.
|
|
29
|
-
- Auditing an existing lesson for gaps/redundancy/anachronisms with a written report → a content-audit/review-content pass (run it first; bring its findings here).
|
|
30
|
-
- Pure fact-checking or research of the subject matter → `deep-research`.
|
|
15
|
+
Boundaries: `course-builder` decides what the course must prove — outcomes, assessment, module order — and hands you the skeleton; this skill makes each concept inside it land. `presentations` turns the landed lesson into a deck, `design` owns the pixels, `marketing` owns the words that sell the course, and a content-audit/review-content pass diagnoses an existing lesson (run it first, bring its findings here — that pass audits, this one rebuilds).
|
|
31
16
|
|
|
32
17
|
**Teaching ≠ selling.** Brunson's frameworks here serve comprehension and retention. The "sale" you're closing is *belief in the idea and trust in the teacher* — never bolt a pitch onto a lesson.
|
|
33
18
|
|
|
34
|
-
## Learner grounding (read this first)
|
|
35
|
-
|
|
36
|
-
**Hard rule: never reframe or rewrite teaching without a complete learner + audience profile.** Teaching into a void defaults to your AI-median explainer voice — abstract, jargon-true, emotionally dead. The cure is grounding every concept in a real, persisted profile of *who is learning and what must change in them*. An incomplete profile is a hard STOP, not a warning.
|
|
37
|
-
|
|
38
|
-
Run this gate before reframing a single concept:
|
|
39
|
-
|
|
40
|
-
1. **Locate the teaching profile.** Read the project's root `CLAUDE.md` and follow its short `## Knowledge map` pointer to the full index at `02-DOCS/wiki/index.md`, looking for the entry into `02-DOCS/wiki/teaching/` (the `harness` Karpathy-wiki convention: compiled profile articles live under `02-DOCS/wiki/teaching/`, raw inputs the user pastes live under `02-DOCS/raw/teaching/`). If `CLAUDE.md` is absent, the index entry is missing, or it points nowhere, treat the profile as ABSENT.
|
|
41
|
-
|
|
42
|
-
2. **Check completeness** against the checklist in `references/learner-grounding.md`. The profile is complete only when every dimension is filled: the LEARNER (level, prior knowledge, pains, desires, current false beliefs, what they want to DO after); the AUDIENCE (same as the buyer or not? live vs recorded? size? context?); the target TRANSFORMATION (the one result, before→after); and constraints/format. **Any empty dimension = INCOMPLETE.**
|
|
43
|
-
|
|
44
|
-
3. **If ABSENT or INCOMPLETE, STOP and interview the user.** Ask the question script from `references/learner-grounding.md`, **one focused batch at a time** (do not dump all questions at once; ask, wait, persist, then continue). Then:
|
|
45
|
-
- **a.** Write/update the profile into `02-DOCS/wiki/teaching/` as wiki articles (`learner.md`, `audience.md`, `transformation.md`, `false-beliefs.md`, `constraints.md`, plus an `index.md`), following the article format in `references/learner-grounding.md`. Save any raw material the user pastes (transcripts, outlines, existing slides) verbatim into `02-DOCS/raw/teaching/` and link it from the article's `> Raw:` line. Create the directories if they do not exist.
|
|
46
|
-
- **b.** Index the teaching profile in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer). Ensure root `CLAUDE.md` carries that short pointer to the index, creating `CLAUDE.md` if absent (additive only — never delete existing sections). The exact snippet is in `references/learner-grounding.md`.
|
|
47
|
-
|
|
48
|
-
4. **Only once the profile exists and is complete, proceed.** Cite which articles you used (e.g. "grounded in `02-DOCS/wiki/teaching/learner.md` and `false-beliefs.md`") so every reframing is traceable to a real learner, not an imagined one.
|
|
19
|
+
## Learner grounding (hard gate — read this first)
|
|
49
20
|
|
|
50
|
-
|
|
21
|
+
**Never reframe teaching without a complete learner + audience profile.** Teaching into a void defaults to your AI-median explainer voice — abstract, jargon-true, emotionally dead. An incomplete profile is a hard STOP, not a warning, because everything downstream (which false belief to break, which analogy lands) is derived from it.
|
|
51
22
|
|
|
52
|
-
|
|
23
|
+
1. **Locate the profile.** Read the root `CLAUDE.md`, follow its `## Knowledge map` pointer to `02-DOCS/wiki/index.md`, and look for the entry into `02-DOCS/wiki/teaching/` (the `harness` Karpathy-wiki convention: compiled articles in `02-DOCS/wiki/teaching/`, raw user-pasted material in `02-DOCS/raw/teaching/`). No `CLAUDE.md`, no index entry, or a pointer that goes nowhere = ABSENT.
|
|
24
|
+
2. **Check completeness** against the checklist in `references/learner-grounding.md`: the LEARNER (level, prior knowledge, pains, desires, current false beliefs, what they DO after), the AUDIENCE (same as the buyer? live vs recorded? size? context?), the target TRANSFORMATION (one result, before→after), and constraints/format. **Any empty dimension = INCOMPLETE.**
|
|
25
|
+
3. **If ABSENT or INCOMPLETE, STOP and interview** with the batched question script in `references/learner-grounding.md` — one focused batch at a time, wait, persist, continue. Then write the profile as wiki articles under `02-DOCS/wiki/teaching/` (`learner.md`, `audience.md`, `transformation.md`, `false-beliefs.md`, `constraints.md`, `index.md`), save pasted transcripts/outlines/slides verbatim under `02-DOCS/raw/teaching/` and link them from each article's `> Raw:` line, index the profile in `02-DOCS/wiki/index.md`, and ensure root `CLAUDE.md` carries the short pointer to that index (create it if absent; additive only). Article format and the exact `CLAUDE.md` snippet → `references/learner-grounding.md`.
|
|
26
|
+
4. **Only then proceed**, citing which articles you used ("grounded in `02-DOCS/wiki/teaching/learner.md` and `false-beliefs.md`") so every reframing is traceable to a real learner, not an imagined one.
|
|
53
27
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
These are constraints, not preferences. Violating any one is a defect.
|
|
57
|
-
|
|
58
|
-
1. **Learner profile first.** No reframing before the grounding gate passes (above). Cite the articles you used.
|
|
59
|
-
2. **Every concept gets a story.** A concept taught without a story is a fact the student will forget. Each concept carries at least one Epiphany Bridge beat. (→ `references/brunson-frameworks.md`)
|
|
60
|
-
3. **Every concept gets a name.** An unnamed idea can't be repeated, so it can't be retained. Give each concept a short, ownable, sticky label the student can say out loud. (→ `references/mental-models.md`)
|
|
61
|
-
4. **Every abstraction gets grounded.** No abstract claim ships without a concrete analogy from the learner's own world. "Abstract with no analogy" is a defect. (→ `references/mental-models.md`)
|
|
62
|
-
5. **Break the false belief before installing the new one.** Find the learner's current false belief (vehicle / internal / external), shatter it with a story, *then* teach. Teaching on top of an unbroken false belief bounces off. (→ `references/brunson-frameworks.md`)
|
|
63
|
-
6. **The realization happens in the student.** Tell the epiphany as a journey, don't state the conclusion. The student should *arrive* at the insight, feeling it, not be handed it.
|
|
64
|
-
7. **One Big Domino per module.** Name the single belief that, once believed, makes the rest fall. Build the module to knock it over. (→ `references/brunson-frameworks.md`)
|
|
65
|
-
8. **End every concept on the so-what.** The payoff the student future-paces: what's now possible, what they can do tomorrow. A concept with no so-what is trivia.
|
|
66
|
-
9. **Ground in the learner, not in the expert.** Explain it in the student's world and vocabulary, not the discipline's. Jargon density is a flagged defect. (→ `references/mental-models.md`)
|
|
67
|
-
10. **No fabricated proof or invented credentials.** Stories must be true. If you need a demo/result/proof the user hasn't supplied, mark `[[NEEDS PROOF]]` and ask — never invent a case study or a metric.
|
|
28
|
+
Sole exception: if the user explicitly says "skip the profile, just rough one concept", produce a clearly-labelled `DRAFT (ungrounded — not learner-checked)` and still recommend running the gate before anything ships.
|
|
68
29
|
|
|
69
30
|
## The teaching workflow (one pass)
|
|
70
31
|
|
|
71
32
|
Run in order. Each step feeds the next; skipping one shows up as a flat lesson downstream.
|
|
72
33
|
|
|
73
|
-
1. **Ground.** Pass the
|
|
74
|
-
2. **Analyze the content.** Ingest the material; extract the concept list AND the *existing* narrative spine; map ungrounded / jargon-heavy / story-less gaps. → `references/course-analysis.md`.
|
|
75
|
-
3. **Set the Big Domino.**
|
|
76
|
-
4. **Per concept, find the false belief** the learner holds (vehicle / internal / external) and the epiphany that breaks it. → `references/brunson-frameworks.md`.
|
|
77
|
-
5. **Run the landing recipe** for each concept: hook → epiphany-bridge story → named mental model → grounded analogy → proof/demo → application (do-this-now) → so-what. → `references/concept-landing-recipe.md`.
|
|
78
|
-
6. **Name the models.** Engineer a sticky, ownable name + a concrete analogy for each. → `references/mental-models.md`.
|
|
34
|
+
1. **Ground.** Pass the gate above. Load learner, audience, transformation, false beliefs, constraints from `02-DOCS/wiki/teaching/` and cite them.
|
|
35
|
+
2. **Analyze the content.** Ingest the material; extract the concept list AND the *existing* narrative spine; map the ungrounded / jargon-heavy / story-less gaps. → `references/course-analysis.md`.
|
|
36
|
+
3. **Set the Big Domino.** Name the one belief per module that makes everything else fall, and sequence concepts to build toward it — not every lesson is equally important. → `references/brunson-frameworks.md`, `references/course-analysis.md`.
|
|
37
|
+
4. **Per concept, find the false belief** the learner holds (vehicle / internal / external) and the epiphany that breaks it. Break it *before* teaching: a lesson landing on an unbroken false belief bounces off. → `references/brunson-frameworks.md`.
|
|
38
|
+
5. **Run the landing recipe** for each concept: hook → epiphany-bridge story → named mental model → grounded analogy → proof/demo → application (do-this-now) → so-what. Every concept gets all seven; a concept with no story is forgotten by tomorrow, and one with no so-what is trivia. → `references/concept-landing-recipe.md`.
|
|
39
|
+
6. **Name the models.** Engineer a sticky, ownable name + a concrete analogy for each — an unnamed idea can't be repeated, so it can't be retained, and an abstraction with no analogy from the learner's own world is a defect. → `references/mental-models.md`.
|
|
79
40
|
7. **Rewrite the narrative spine.** Resequence the whole module/course as a belief-building arc (the Hero's Two Journeys), not a topic dump. → `references/brunson-frameworks.md`, `references/course-analysis.md`.
|
|
80
41
|
8. **Run the QA gate** (below) and `scripts/verify.sh`. Fix every flag or justify it.
|
|
81
42
|
|
|
43
|
+
Throughout: tell the epiphany as a journey so the student *arrives* at the insight rather than being handed the conclusion, explain it in the student's vocabulary instead of the discipline's, and **never invent proof** — if a demo, result, metric or credential wasn't supplied by the user, mark it `[[NEEDS PROOF]]` and ask.
|
|
44
|
+
|
|
82
45
|
## The Expert Secrets toolkit (applied to teaching)
|
|
83
46
|
|
|
84
47
|
These are the frameworks you run each concept through. Full templates, scripts, and worked teaching examples → `references/brunson-frameworks.md`. Source-confirmed sequence and naming via Brunson's *Expert Secrets* (see citations in that reference).
|
|
@@ -96,11 +59,11 @@ These are the frameworks you run each concept through. Full templates, scripts,
|
|
|
96
59
|
|
|
97
60
|
## Analyze the course content
|
|
98
61
|
|
|
99
|
-
Before reframing
|
|
62
|
+
Before reframing you must *see* what's there. Ingest the material and produce three artifacts — full method, extraction prompts and the gap-map template → `references/course-analysis.md`:
|
|
100
63
|
|
|
101
64
|
1. **Concept inventory** — every distinct idea the material teaches, in teaching order, with a one-line "what the student should be able to DO after this".
|
|
102
|
-
2. **Existing narrative spine** — the
|
|
103
|
-
3. **Gap map** — per concept, flag
|
|
65
|
+
2. **Existing narrative spine** — the throughline already present (if any): where it hooks, where it goes flat, whether it builds belief or just stacks topics.
|
|
66
|
+
3. **Gap map** — per concept, flag `no-story`, `unnamed`, `no-analogy`, `jargon-dense`, `no-application`, `no-so-what`, `belief-not-broken`. These flags drive the rework and mirror exactly what `scripts/verify.sh` greps for.
|
|
104
67
|
|
|
105
68
|
```text
|
|
106
69
|
GAP MAP (one row per concept)
|
|
@@ -137,9 +100,9 @@ Good (landed) — HOOK: "Ever double-clicked 'Pay' and panicked you'd be charg
|
|
|
137
100
|
SO-WHAT: you can now retry fearlessly — failures stop being scary."
|
|
138
101
|
```
|
|
139
102
|
|
|
140
|
-
## Anti-patterns
|
|
103
|
+
## Anti-patterns
|
|
141
104
|
|
|
142
|
-
|
|
|
105
|
+
| Anti-pattern | Reality / fix |
|
|
143
106
|
| --- | --- |
|
|
144
107
|
| "The concept is clear, it doesn't need a story" | Clear ≠ memorable. No story = forgotten by tomorrow. Add an Epiphany Bridge beat. |
|
|
145
108
|
| "Naming it is cutesy / unnecessary" | Unnamed ideas can't be repeated, so they aren't retained. Give it a sticky, ownable name. |
|
|
@@ -152,24 +115,9 @@ Good (landed) — HOOK: "Ever double-clicked 'Pay' and panicked you'd be charg
|
|
|
152
115
|
| "I'll invent a quick case study to prove it" | Never. Stories must be true. Mark `[[NEEDS PROOF]]` and ask the user. |
|
|
153
116
|
| "Just teach the skill (outer journey)" | The inner journey (identity shift) is why they love the teacher. Teach both. |
|
|
154
117
|
|
|
155
|
-
## Quick reference
|
|
156
|
-
|
|
157
|
-
| Lever | Default | Where |
|
|
158
|
-
| --- | --- | --- |
|
|
159
|
-
| Story per concept | mandatory — ≥1 Epiphany Bridge beat | `references/brunson-frameworks.md` |
|
|
160
|
-
| Epiphany beats | backstory → desire → wall → epiphany → new opportunity → result | `references/brunson-frameworks.md` |
|
|
161
|
-
| False beliefs | break vehicle + internal + external before teaching | `references/brunson-frameworks.md` |
|
|
162
|
-
| Big Domino | one per module; aim the arc at it | `references/brunson-frameworks.md` |
|
|
163
|
-
| Named model | short, ownable, repeatable; one per concept | `references/mental-models.md` |
|
|
164
|
-
| Analogy | concrete, from the learner's world | `references/mental-models.md` |
|
|
165
|
-
| Recipe beats | hook → story → model → analogy → proof → application → so-what | `references/concept-landing-recipe.md` |
|
|
166
|
-
| Jargon | flagged when dense / unglossed | `scripts/verify.sh` |
|
|
167
|
-
| End on | the so-what (future-paced payoff) | `references/concept-landing-recipe.md` |
|
|
168
|
-
| Profile | hard gate before any rework | `references/learner-grounding.md` |
|
|
169
|
-
|
|
170
118
|
## Teaching QA gate ("did it land?")
|
|
171
119
|
|
|
172
|
-
Run before claiming done. `scripts/verify.sh` automates the greppable subset.
|
|
120
|
+
Run before claiming done. `scripts/verify.sh` automates the greppable subset (read-only; warns by default, `--strict` to gate CI).
|
|
173
121
|
|
|
174
122
|
- [ ] Learner + audience profile located, complete, and cited (which articles grounded this).
|
|
175
123
|
- [ ] Big Domino named for the module; the arc is sequenced to knock it over.
|
|
@@ -184,22 +132,6 @@ Run before claiming done. `scripts/verify.sh` automates the greppable subset.
|
|
|
184
132
|
- [ ] No fabricated stories, proof, metrics, or credentials; gaps marked `[[NEEDS PROOF]]`.
|
|
185
133
|
- [ ] The reworked narrative spine builds belief, it doesn't just stack topics.
|
|
186
134
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
## Project grounding (02-DOCS + CLAUDE.md)
|
|
190
|
-
|
|
191
|
-
This skill's 02-DOCS record has two parts, both indexed in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer):
|
|
192
|
-
|
|
193
|
-
- The **learner + audience profile** at `02-DOCS/wiki/teaching/` — a hard gate (see "Learner grounding" above): if the index lacks the entry or any dimension is empty (learner, audience, transformation, false beliefs, constraints), ask until complete, persist it (raw inputs to `02-DOCS/raw/teaching/`), index it in `02-DOCS/wiki/index.md` and ensure root `CLAUDE.md` carries the short pointer to that index (create `CLAUDE.md` if absent), and only then teach.
|
|
194
|
-
- The **course teaching conventions** at `02-DOCS/wiki/stack/course-storytelling.md` (or alongside the profile under `02-DOCS/wiki/teaching/`) — the established narrative spine, the named mental models already coined, the Big Dominoes per module, and the teacher's Attractive Character. Recorded, not gated.
|
|
195
|
-
|
|
196
|
-
Create/update both as decisions are made and keep their entries current in `02-DOCS/wiki/index.md` (root `CLAUDE.md` keeps only a short pointer to it). Read them first on every use and keep every reframing consistent with them. If the project has no `02-DOCS` layer at all, skip this section silently and proceed with the in-session profile.
|
|
197
|
-
|
|
198
|
-
## See Also
|
|
135
|
+
## Project grounding (02-DOCS)
|
|
199
136
|
|
|
200
|
-
-
|
|
201
|
-
- `../presentations/SKILL.md` — turn the landed lesson into a deck (Marp/Slidev/PPTX, speaker notes).
|
|
202
|
-
- `../design/SKILL.md` — the visual system and pixels behind the slides/diagrams.
|
|
203
|
-
- A content-audit / review-content pass — audit an existing lesson/module/notebook for gaps, redundancy, anachronisms, and storytelling problems (run it first; bring its report here). This skill rebuilds; that pass diagnoses.
|
|
204
|
-
- `../harness/SKILL.md` — the `02-DOCS` Karpathy-wiki convention this skill persists the teaching profile into.
|
|
205
|
-
- References: `references/brunson-frameworks.md`, `references/learner-grounding.md`, `references/mental-models.md`, `references/course-analysis.md`, `references/concept-landing-recipe.md`.
|
|
137
|
+
Beyond the gated learner profile, record the **course teaching conventions** at `02-DOCS/wiki/stack/course-storytelling.md` (or alongside the profile under `02-DOCS/wiki/teaching/`): the established narrative spine, the named mental models already coined, the Big Dominoes per module, and the teacher's Attractive Character. Recorded, not gated — update it as decisions are made, keep its entry current in `02-DOCS/wiki/index.md`, read it first on every use, and keep every reframing consistent with it. The wiki convention itself belongs to `../harness/SKILL.md`. If the project has no `02-DOCS` layer, skip this silently and proceed with the in-session profile.
|
package/skills/cpp/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cpp
|
|
3
|
-
description: "Use when writing, reviewing, modernizing, building, or debugging C++ - RAII and resource lifetime, smart-pointer ownership
|
|
3
|
+
description: "Use when writing, reviewing, modernizing, building, or debugging C++ - RAII and resource lifetime, smart-pointer ownership, move semantics and the Rule of Zero/Five, target-based CMake with FetchContent, and killing undefined behavior with ASan/UBSan/TSan plus clang-tidy. NOT borrow-checker / Result-Option / cargo memory safety (that is rust)."
|
|
4
4
|
tags: [cpp, c++, modern-cpp, raii, cmake]
|
|
5
5
|
recommends: [rust, secure-coding, deployment]
|
|
6
6
|
origin: risco
|
|
@@ -23,30 +23,13 @@ behind confirmed compiler support. Compiler matrix:
|
|
|
23
23
|
| Clang | 13–18 progressively | in progress (Clang 23 dev) | `-std=c++23` / `-std=c++2c` |
|
|
24
24
|
| MSVC | latest | partial | `/std:c++23` / `/std:c++latest` |
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- Writing or fixing a **CMake** build (target-based, `FetchContent`, presets).
|
|
34
|
-
- Hunting UB: enabling ASan/UBSan/TSan, reading the report, applying the lifetime/bounds/overflow/race fix.
|
|
35
|
-
- Move semantics / Rule of Zero/Five / value-category and `noexcept` questions.
|
|
36
|
-
|
|
37
|
-
**When NOT to use (delegate):**
|
|
38
|
-
|
|
39
|
-
- Rust borrow-checker, `Result`/`Option`, cargo, ownership-via-compiler -> [`rust`](../rust/SKILL.md).
|
|
40
|
-
C++ buys safety with discipline (RAII + smart pointers + sanitizers); do not conflate the mechanisms.
|
|
41
|
-
- Language-agnostic threat modeling, authz, OWASP-class review -> [`secure-coding`](../secure-coding/SKILL.md)
|
|
42
|
-
(this skill keeps the C++-specific controls: bounds, lifetime, integer overflow, format-string, sanitizers).
|
|
43
|
-
- Containerizing/shipping the binary (Dockerfile, GitHub Actions) -> [`deployment`](../deployment/SKILL.md)
|
|
44
|
-
(this skill stops at the CMake build + a sanitizer-CI note).
|
|
45
|
-
- Recording per-project C++ conventions in a workspace wiki -> [`harness`](../harness/SKILL.md)
|
|
46
|
-
(see "Project grounding" below).
|
|
47
|
-
|
|
48
|
-
The C++-specific memory/UB controls — sanitizers, bounds, lifetime, signed overflow — live
|
|
49
|
-
**here**, not in `secure-coding`.
|
|
26
|
+
Delegate: borrow-checker, `Result`/`Option`, cargo, ownership-via-compiler ->
|
|
27
|
+
[`rust`](../rust/SKILL.md) — C++ buys safety with discipline (RAII + smart pointers +
|
|
28
|
+
sanitizers); do not conflate the mechanisms. Language-agnostic threat modeling, authz,
|
|
29
|
+
OWASP-class review -> [`secure-coding`](../secure-coding/SKILL.md); the C++-specific
|
|
30
|
+
memory/UB controls (bounds, lifetime, integer overflow, format-string, sanitizers) stay
|
|
31
|
+
**here**. Containerizing and shipping the binary -> [`deployment`](../deployment/SKILL.md);
|
|
32
|
+
this skill stops at the CMake build + a sanitizer-CI note.
|
|
50
33
|
|
|
51
34
|
## Decision rules
|
|
52
35
|
|
|
@@ -59,20 +42,19 @@ Apply these on every C++ edit:
|
|
|
59
42
|
only when you need polymorphism, shared lifetime, or a large/stable address. Why: values can't dangle.
|
|
60
43
|
3. **Name the owner.** Exactly one type owns each resource; everyone else borrows. Why: ambiguous
|
|
61
44
|
ownership is how use-after-free is born.
|
|
62
|
-
4. **`make_unique`/`make_shared`, never `new`.**
|
|
63
|
-
|
|
64
|
-
5. **Never an owning raw pointer.** Raw pointers/references are non-owning borrows only. Why: a raw
|
|
65
|
-
pointer that owns is a leak or a double-free waiting on the next early `return`/throw.
|
|
45
|
+
4. **`make_unique`/`make_shared`, never `new`.** So no naked owning pointer ever exists.
|
|
46
|
+
5. **Never an owning raw pointer.** Raw pointers/references are non-owning borrows only.
|
|
66
47
|
6. **Borrow with `span` / `string_view` / `const T&`.** Pass a view, not a copy or an owner, for
|
|
67
|
-
read access. Why: zero-copy and the callee provably can't free what it doesn't own.
|
|
68
|
-
7. **`const` and `constexpr` by default.**
|
|
69
|
-
|
|
48
|
+
read access. Why: zero-copy, and the callee provably can't free what it doesn't own.
|
|
49
|
+
7. **`const` and `constexpr` by default.** Why: the compiler enforces what you don't mutate and
|
|
50
|
+
moves work off the hot path.
|
|
70
51
|
8. **No UB by construction.** No use-after-move, OOB index, signed overflow, uninitialized read, or
|
|
71
|
-
data race.
|
|
52
|
+
data race.
|
|
72
53
|
9. **Sanitizers + warnings-as-errors in CI.** Build and test under `-fsanitize=address,undefined`
|
|
73
|
-
with `-Werror`.
|
|
54
|
+
with `-Werror`.
|
|
74
55
|
10. **Target-based CMake only.** `target_link_libraries` / `target_compile_features`, never
|
|
75
|
-
directory-level `include_directories`/`link_libraries`. Why: directory commands leak flags
|
|
56
|
+
directory-level `include_directories`/`link_libraries`. Why: directory commands leak flags
|
|
57
|
+
globally and break composition.
|
|
76
58
|
|
|
77
59
|
## Ownership & smart pointers
|
|
78
60
|
|
|
@@ -277,7 +259,7 @@ bad index is UB, not an exception.
|
|
|
277
259
|
- **Local gate:** `./scripts/verify.sh` from the project root runs format + an ASan/UBSan,
|
|
278
260
|
warnings-as-errors build + `ctest` + optional tidy/cppcheck. Missing tools are skipped, not failed.
|
|
279
261
|
|
|
280
|
-
## Anti-patterns
|
|
262
|
+
## Anti-patterns
|
|
281
263
|
|
|
282
264
|
| Rationalization | Reality / Do instead |
|
|
283
265
|
| --- | --- |
|
|
@@ -307,41 +289,14 @@ bad index is UB, not an exception.
|
|
|
307
289
|
| Format | `clang-format -i src/*.cpp` |
|
|
308
290
|
| Static analysis | `clang-tidy -p build src/*.cpp` · `cppcheck --enable=warning src/` |
|
|
309
291
|
| Std flag | GCC/Clang `-std=c++23` (C++26: GCC `-std=c++26`, Clang `-std=c++2c`), MSVC `/std:c++23` |
|
|
310
|
-
| Own a resource | `auto p = std::make_unique<T>(...);` |
|
|
311
|
-
| Borrow a range | `std::span<const T>` / `std::string_view` |
|
|
312
292
|
| Local gate | `./scripts/verify.sh` (run in your project root) |
|
|
313
293
|
|
|
314
|
-
## Project grounding (02-DOCS
|
|
315
|
-
|
|
316
|
-
When this skill runs in a project with a `02-DOCS/` layer (the [`harness`](../harness/SKILL.md)
|
|
317
|
-
Karpathy wiki), record this project's C++ decisions there and index them in `02-DOCS/wiki/index.md`,
|
|
318
|
-
so the next agent inherits them instead of re-deriving them.
|
|
319
|
-
|
|
320
|
-
1. **Find the article** `02-DOCS/wiki/stack/cpp.md`, indexed in `02-DOCS/wiki/index.md` (the Knowledge map index; root `CLAUDE.md` points to it).
|
|
321
|
-
2. **If missing or stale**, create/update it with the project's real choices — std version and
|
|
322
|
-
compiler matrix, CMake layout and presets, the sanitizer/warning policy, and the ownership/error
|
|
323
|
-
conventions — then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it).
|
|
324
|
-
3. **Read it first on every use** and stay consistent; when a convention changes, update the article
|
|
325
|
-
(bump its `Updated` date) in the same change.
|
|
326
|
-
|
|
327
|
-
No `02-DOCS/` layer? Skip silently (optionally suggest `harness`). Technical conventions are
|
|
328
|
-
*recorded, not gated* — never block the task on this.
|
|
329
|
-
|
|
330
|
-
## See Also
|
|
331
|
-
|
|
332
|
-
Sibling skills (all resolve under `skills/`):
|
|
333
|
-
|
|
334
|
-
- [`rust`](../rust/SKILL.md) - the other systems language; compiler-enforced ownership instead of
|
|
335
|
-
RAII discipline. Any borrow-checker / `Result`-`Option` / cargo question goes there.
|
|
336
|
-
- [`secure-coding`](../secure-coding/SKILL.md) - language-agnostic threat modeling and authz/abuse
|
|
337
|
-
review (this skill keeps the C++-specific memory/UB controls).
|
|
338
|
-
- [`deployment`](../deployment/SKILL.md) - containerizing and shipping the built binary (this skill
|
|
339
|
-
stops at the CMake build + a sanitizer-CI note).
|
|
340
|
-
- [`harness`](../harness/SKILL.md) - the `02-DOCS/` workspace wiki where per-project C++ conventions
|
|
341
|
-
are recorded (see "Project grounding").
|
|
342
|
-
|
|
343
|
-
Local references (read when):
|
|
294
|
+
## Project grounding (02-DOCS)
|
|
344
295
|
|
|
345
|
-
|
|
346
|
-
-
|
|
347
|
-
|
|
296
|
+
In a project with a `02-DOCS/` layer (the [`harness`](../harness/SKILL.md) Karpathy wiki), read
|
|
297
|
+
`02-DOCS/wiki/stack/cpp.md` first and stay consistent with it. If it is missing or stale, write
|
|
298
|
+
this project's real choices there — std version and compiler matrix, CMake layout and presets, the
|
|
299
|
+
sanitizer/warning policy, the ownership/error conventions — index it in `02-DOCS/wiki/index.md`
|
|
300
|
+
(the Knowledge map; root `CLAUDE.md` keeps only a pointer to it), and bump its `Updated` date in
|
|
301
|
+
the same change as any convention change. No `02-DOCS/` layer? Skip silently (optionally suggest
|
|
302
|
+
`harness`). Conventions are *recorded, not gated* — never block the task on this.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: csharp-dotnet
|
|
3
|
-
description: "Use when writing, reviewing, testing, or shipping C# / .NET code
|
|
3
|
+
description: "Use when writing, reviewing, testing, or shipping C# / .NET code — ASP.NET Core APIs (minimal APIs vs controllers), EF Core data access, async correctness, solution layout in .cs/.csproj/.sln. NOT a Java/Spring backend (that is spring-boot), NOT a Node/TypeScript backend (that is nestjs), NOT framework-neutral REST naming (that is api-design)."
|
|
4
4
|
tags: [csharp, dotnet, aspnetcore, efcore, async]
|
|
5
5
|
recommends: [postgresdb, secure-coding, deployment]
|
|
6
6
|
origin: risco
|
|
@@ -20,17 +20,6 @@ support but shorter-lived. Features gate on the target framework moniker (TFM):
|
|
|
20
20
|
use a C# 14 feature (`field`, extension members, null-conditional assignment), say
|
|
21
21
|
which TFM it requires.
|
|
22
22
|
|
|
23
|
-
## When to use
|
|
24
|
-
|
|
25
|
-
- Authoring/reviewing/refactoring any `.cs`, `.csproj`, or `.sln`.
|
|
26
|
-
- ASP.NET Core: minimal APIs vs controllers, route groups, endpoint filters,
|
|
27
|
-
validation, ProblemDetails, OpenAPI.
|
|
28
|
-
- EF Core: `DbContext` design, LINQ queries, migrations, tracking, N+1.
|
|
29
|
-
- async/await correctness: `CancellationToken` plumbing, `async void`, deadlocks,
|
|
30
|
-
`IAsyncEnumerable`, `ValueTask`.
|
|
31
|
-
- `dotnet` CLI workflow, solution layout, NuGet, central package management.
|
|
32
|
-
- Idiom review: records, pattern matching, nullable reference types (NRT).
|
|
33
|
-
|
|
34
23
|
## When NOT to use — delegate
|
|
35
24
|
|
|
36
25
|
| Situation | Route to |
|
|
@@ -45,29 +34,7 @@ which TFM it requires.
|
|
|
45
34
|
|
|
46
35
|
The .NET *expression* of an API contract and async correctness live HERE. Resource
|
|
47
36
|
naming theory lives in `api-design`; the JVM and Node counterparts are `spring-boot`
|
|
48
|
-
and `nestjs`.
|
|
49
|
-
disk as siblings, so only those are linked as `../<id>/SKILL.md`.
|
|
50
|
-
|
|
51
|
-
## Decision rules — apply on every C# edit
|
|
52
|
-
|
|
53
|
-
1. **NRT on.** `<Nullable>enable</Nullable>` in the csproj. Why: the compiler turns
|
|
54
|
-
whole classes of `NullReferenceException` into build-time warnings. Never disable it
|
|
55
|
-
to silence a warning — fix the nullability.
|
|
56
|
-
2. **Async all the way, flow the token.** I/O methods are `async Task`, every call is
|
|
57
|
-
`await`ed, and a `CancellationToken` threads from the endpoint down to
|
|
58
|
-
`SaveChangesAsync`/queries/HTTP calls. Why: a dropped token means requests keep
|
|
59
|
-
running after the client gives up.
|
|
60
|
-
3. **Records for DTOs and immutable data.** `public record ProductDto(int Id, string Name);`.
|
|
61
|
-
Why: value equality + `with` expressions + concise; never reuse an EF entity as the
|
|
62
|
-
wire DTO (see anti-patterns).
|
|
63
|
-
4. **Parameterize every query.** EF LINQ and `FromSql` interpolation parameterize for
|
|
64
|
-
you; never string-concatenate SQL. Why: SQL injection.
|
|
65
|
-
5. **Deterministic disposal.** `using`/`await using` (or `using` declarations) for
|
|
66
|
-
anything `IDisposable`/`IAsyncDisposable`. Why: leaked connections/handles.
|
|
67
|
-
6. **One `DbContext` per request (scoped).** Why: `DbContext` is not thread-safe;
|
|
68
|
-
sharing across requests corrupts change tracking.
|
|
69
|
-
7. **Minimal APIs for new services** unless you need MVC features (views, model
|
|
70
|
-
binders, action filters at scale). Why: less ceremony, first-class in .NET 10.
|
|
37
|
+
and `nestjs`.
|
|
71
38
|
|
|
72
39
|
## Project & solution layout + dotnet CLI
|
|
73
40
|
|
|
@@ -101,6 +68,10 @@ Central package management: turn it on with `<ManagePackageVersionsCentrally>tru
|
|
|
101
68
|
and list versions once in `Directory.Packages.props`. Why: one source of truth, no
|
|
102
69
|
version drift across projects.
|
|
103
70
|
|
|
71
|
+
NRT on for every project — `<Nullable>enable</Nullable>` in `Directory.Build.props`.
|
|
72
|
+
Why: the compiler turns whole classes of `NullReferenceException` into build-time
|
|
73
|
+
warnings. Never disable it to silence a warning — fix the nullability.
|
|
74
|
+
|
|
104
75
|
## Modern C# idioms (C# 14 / .NET 10)
|
|
105
76
|
|
|
106
77
|
DTO as a record, not a class:
|
|
@@ -113,6 +84,9 @@ public class ProductDto { public int Id { get; set; } public string Name { get;
|
|
|
113
84
|
public record ProductDto(int Id, string Name, decimal Price);
|
|
114
85
|
```
|
|
115
86
|
|
|
87
|
+
Why: value equality, `with` expressions, no boilerplate — and never reuse an EF entity
|
|
88
|
+
as the wire DTO (see anti-patterns).
|
|
89
|
+
|
|
116
90
|
Pattern matching over if-chains:
|
|
117
91
|
|
|
118
92
|
```csharp
|
|
@@ -154,6 +128,9 @@ Prefer NRT annotations over defensive null checks: declare `string? note` when n
|
|
|
154
128
|
valid and let the compiler force callers to handle it, instead of `if (x == null)`
|
|
155
129
|
guards scattered everywhere.
|
|
156
130
|
|
|
131
|
+
Dispose deterministically: `using` / `await using` (or `using` declarations) for
|
|
132
|
+
anything `IDisposable`/`IAsyncDisposable`. Why: leaked connections and handles.
|
|
133
|
+
|
|
157
134
|
## async/await correctness
|
|
158
135
|
|
|
159
136
|
This is the highest-leverage area to get right. Core rules in body; the full catalog
|
|
@@ -173,7 +150,9 @@ public IActionResult Get() => Ok(_svc.LoadAsync().Result);
|
|
|
173
150
|
public async Task<IActionResult> Get(CancellationToken ct) => Ok(await _svc.LoadAsync(ct));
|
|
174
151
|
```
|
|
175
152
|
|
|
176
|
-
- **Flow `CancellationToken`** from the endpoint into every async call
|
|
153
|
+
- **Flow `CancellationToken`** from the endpoint down into every async call —
|
|
154
|
+
`SaveChangesAsync`, queries, outbound HTTP. Why: a dropped token means the request
|
|
155
|
+
keeps running after the client gives up.
|
|
177
156
|
- **`ValueTask` only for hot paths** that usually complete synchronously; default to
|
|
178
157
|
`Task`. Never `await` a `ValueTask` twice.
|
|
179
158
|
- **`IAsyncEnumerable<T>` for streaming** results instead of materializing a huge list.
|
|
@@ -182,6 +161,7 @@ public async Task<IActionResult> Get(CancellationToken ct) => Ok(await _svc.Load
|
|
|
182
161
|
|
|
183
162
|
Decision: **minimal API** for new services; **controllers** only when you need MVC
|
|
184
163
|
machinery (model binding conventions, action filters at scale, views). Both can coexist.
|
|
164
|
+
Why minimal by default: less ceremony, first-class in .NET 10.
|
|
185
165
|
|
|
186
166
|
Production minimal API shape — route group + DataAnnotations validation (built in for
|
|
187
167
|
minimal API parameters in .NET 10) + ProblemDetails + OpenAPI 3.1:
|
|
@@ -215,7 +195,8 @@ app.Run();
|
|
|
215
195
|
```
|
|
216
196
|
|
|
217
197
|
DI lifetimes: `Singleton` (one for the app), `Scoped` (one per request — `DbContext`
|
|
218
|
-
lives here
|
|
198
|
+
lives here; it is not thread-safe, so sharing one across requests corrupts change
|
|
199
|
+
tracking), `Transient` (new each resolve). Never inject a `Scoped` service into a
|
|
219
200
|
`Singleton` (captive dependency — see anti-patterns). Middleware ordering, endpoint
|
|
220
201
|
filters, the options pattern, and auth defaults are in **references/aspnetcore.md**.
|
|
221
202
|
|
|
@@ -252,7 +233,7 @@ Keep only the .NET-specific controls here; threat modeling and OWASP review go t
|
|
|
252
233
|
`../secure-coding/SKILL.md`.
|
|
253
234
|
|
|
254
235
|
- **Parameterized data access** — EF LINQ / parameterized `FromSql` / ADO.NET
|
|
255
|
-
`SqlParameter`. Never concatenate user input into SQL.
|
|
236
|
+
`SqlParameter`. Never concatenate user input into SQL. Why: SQL injection.
|
|
256
237
|
- **Secrets** — `dotnet user-secrets` in dev, Key Vault / environment in prod. Never in
|
|
257
238
|
`appsettings.json` or source.
|
|
258
239
|
- **Antiforgery** for cookie-auth browser POSTs; **Data Protection** for cookies/tokens
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: customer-support
|
|
3
|
-
description: "Use when a support ticket
|
|
3
|
+
description: "Use when a live support ticket needs triage (intent, P1–P4 priority, SLA clock), an on-voice reply, not a raw template, de-escalation of an angry or churn-risk customer, or escalation with a handoff packet. NOT the help-center article it links to (that is `technical-writing`), a win-back program (`retention`), or the auto-answer bot (`chatbot`)."
|
|
4
4
|
tags: [customer-support, helpdesk, ticket-triage, sla, escalation, macros, de-escalation, csat]
|
|
5
5
|
recommends: [technical-writing, client-onboarding, retention, chatbot, rag, brand-voice]
|
|
6
6
|
origin: risco
|
|
@@ -8,22 +8,8 @@ origin: risco
|
|
|
8
8
|
|
|
9
9
|
# Customer Support — Run the Desk on a Live Ticket
|
|
10
10
|
|
|
11
|
-
*A ticket just came in. Triage it, answer it on-voice, escalate it if it needs a human, and keep the SLA from blowing. This skill handles the live ticket — it does not write the article the ticket links to.*
|
|
12
|
-
|
|
13
11
|
You own the **support desk as an operation**: take an incoming ticket, assign priority and intent, start the SLA clock, draft the reply (macro or bespoke), enforce tone, and decide escalation with a clean handoff. The output is a triaged, answered ticket — human judgment, not a code artifact.
|
|
14
12
|
|
|
15
|
-
## What this owns vs. what it does not
|
|
16
|
-
|
|
17
|
-
| You reach for this when | Route elsewhere when |
|
|
18
|
-
|---|---|
|
|
19
|
-
| A ticket needs triage, a reply, an escalation call | Authoring the KB / help-center article a ticket links to → `technical-writing` |
|
|
20
|
-
| One churn-risk ticket needs de-escalation **now** | Running a win-back / renewal **program** → `retention` |
|
|
21
|
-
| You need macros, SLA targets, a handoff packet | Onboarding a brand-new customer (welcome, activation) → `client-onboarding` |
|
|
22
|
-
| A human (or assisted) reply against the brand voice | Building the autonomous auto-answer bot → `chatbot` + `rag` |
|
|
23
|
-
| Applying the voice to this reply | Authoring the voice guide itself → [`../brand-voice/SKILL.md`](../brand-voice/SKILL.md) |
|
|
24
|
-
|
|
25
|
-
The line: **writing the help-center article a ticket links to is `technical-writing`'s job; `customer-support` only handles the live ticket.** This skill *consumes* the KB to answer; it never writes the docs.
|
|
26
|
-
|
|
27
13
|
## The triage-to-reply loop (the spine)
|
|
28
14
|
|
|
29
15
|
Run every ticket through these six steps in order. Skipping triage to "just reply fast" is how you send the wrong tone to a P1.
|
|
@@ -37,29 +23,22 @@ Run every ticket through these six steps in order. Skipping triage to "just repl
|
|
|
37
23
|
6 Escalate or send → trigger met? hand off with the packet. else send + log.
|
|
38
24
|
```
|
|
39
25
|
|
|
40
|
-
|
|
26
|
+
## Priority, SLA, and the escalation call
|
|
41
27
|
|
|
42
|
-
|
|
43
|
-
|---|---|---|---|
|
|
44
|
-
| Production down / data loss / many users blocked | P1 | 15–30 min | Yes → tier-2/eng + the packet |
|
|
45
|
-
| Enterprise/VIP account, or "cancel / refund / lawyer / unacceptable" | P1–P2 | 30 min – 1 h | Yes → owner + tier-2 |
|
|
46
|
-
| One user blocked, no workaround | P2 | 1–2 h | Only if unresolved past target |
|
|
47
|
-
| Question with a workaround, billing query | P3 | 4–8 h | No, unless policy claim is unverifiable |
|
|
48
|
-
| FAQ, cosmetic, feature request | P4 | ~1 business day | No |
|
|
28
|
+
The branch is at step 6. This table sets priority, both SLA clocks, and whether the ticket leaves your hands:
|
|
49
29
|
|
|
50
|
-
|
|
30
|
+
| Signal in the ticket | Priority | First response (FRT) | Resolution target | Escalate? |
|
|
31
|
+
|---|---|---|---|---|
|
|
32
|
+
| Production down / data loss / payments broken / many users blocked | P1 critical | 15–30 min | ASAP, status updates every 30–60 min | Yes → tier-2/eng + the packet |
|
|
33
|
+
| Enterprise/VIP account, or "cancel / refund / lawyer / unacceptable" | P1–P2 | 30 min – 1 h | Same business day | Yes → owner + tier-2 |
|
|
34
|
+
| One user blocked, no workaround | P2 high | 1–2 h | Same business day | Only if unresolved past target |
|
|
35
|
+
| Question with a workaround, billing query | P3 medium | 4–8 h | 1–2 business days | No, unless policy claim is unverifiable |
|
|
36
|
+
| FAQ, cosmetic, feature request | P4 low | ~1 business day | Best effort | No |
|
|
51
37
|
|
|
52
|
-
|
|
38
|
+
**Why pick the FRT target before drafting:** the SLA decides your tone and length. A P1 gets a two-line acknowledgment in 20 minutes, not a polished essay in two hours.
|
|
53
39
|
|
|
54
40
|
Use **3–4 priority tiers, never a flat SLA.** Too many tiers confuse the desk; too few don't differentiate the outage from the typo (Emailmeter / Hiver, 2026-06-02).
|
|
55
41
|
|
|
56
|
-
| Priority | Meaning | First-response (FRT) | Resolution target |
|
|
57
|
-
|---|---|---|---|
|
|
58
|
-
| P1 critical | Outage, data loss, payments broken | 15–30 min | ASAP, status updates every 30–60 min |
|
|
59
|
-
| P2 high | One user blocked, no workaround | 1–2 h | Same business day |
|
|
60
|
-
| P3 medium | Workaround exists, billing/how-to | 4–8 h | 1–2 business days |
|
|
61
|
-
| P4 low | Cosmetic, FAQ, feature request | ~1 business day | Best effort |
|
|
62
|
-
|
|
63
42
|
**Acknowledge fast even when you cannot resolve fast.** First-response and resolution are *separate, linked* SLAs: FRT sets the expectation, resolution is the outcome. 89% of customers feel valued by a fast first response even when the full fix takes longer (getMonetizely / Hiver, 2026-06-02). So: acknowledge inside the FRT window with an honest "here's what I know and when I'll update you," then resolve honestly. Never go silent to wait for a perfect answer.
|
|
64
43
|
|
|
65
44
|
Full P1–P4 matrix by channel (email/chat/phone) lives in [`references/macros-and-sla.md`](references/macros-and-sla.md).
|
|
@@ -126,6 +105,8 @@ Banned phrases — they escalate, not de-escalate:
|
|
|
126
105
|
|
|
127
106
|
Checklist before send: feeling acknowledged · first-person ownership · one timed next step · no banned phrase · no `{{placeholder}}` left.
|
|
128
107
|
|
|
108
|
+
De-escalating *this* ticket is the job here; running a win-back or renewal **program** is `retention`.
|
|
109
|
+
|
|
129
110
|
## Escalation
|
|
130
111
|
|
|
131
112
|
Escalate on **explicit conditions, not vibes.** Standard tiers: T1 frontline/common, T2 specialist/complex, T3 engineering or exec/critical (Kapture / Hiver, 2026-06-02). Hand off when any trigger fires:
|
|
@@ -158,7 +139,7 @@ The full escalation matrix (trigger → tier → owner) is in [`references/macro
|
|
|
158
139
|
- If it is not in the KB, say "let me confirm" and escalate — do not fill the gap with a plausible guess.
|
|
159
140
|
- Deflection is **bounded by KB quality.** Triage-only without a strong KB deflects ~20–30%; well-organized KBs push assisted/auto resolution to 50–80% (Zendesk / Intercom / Fini Labs, 2026-06-02). A bad answer fast is worse than a correct answer slightly slower.
|
|
160
141
|
|
|
161
|
-
If the article the customer needs does not exist,
|
|
142
|
+
This skill *consumes* the KB; it never writes it. If the article the customer needs does not exist, flag the gap — authoring it is a `technical-writing` job, and building the autonomous auto-answer bot on top of the KB is `chatbot` + `rag`.
|
|
162
143
|
|
|
163
144
|
## Metrics — what to watch and when
|
|
164
145
|
|
|
@@ -187,7 +168,3 @@ Rule of thumb: optimize **FRT** for reassurance (the customer feeling handled),
|
|
|
187
168
|
| "Please calm down" / "as I said" | Tells them their feeling is the fault | De-escalation moves; banned-phrase swaps |
|
|
188
169
|
| Promise a fix you can't verify | Breaks trust when it slips | Promise the *next update time*, not the fix |
|
|
189
170
|
| Chase NPS off a single ticket | Wrong altitude metric | CSAT/FCR per ticket; NPS at relationship level |
|
|
190
|
-
|
|
191
|
-
## References
|
|
192
|
-
|
|
193
|
-
- [`references/macros-and-sla.md`](references/macros-and-sla.md) — the full macro skeleton library (10+ ready replies), the complete P1–P4 SLA matrix by channel, and the escalation matrix with the handoff-packet template. Pulled out because it is long, branch-specific lookup material you reach for mid-ticket, not flow you read top-to-bottom.
|