@ericrisco/rsc 0.1.44 → 0.1.46
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 +192 -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
package/skills/clarify/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clarify
|
|
3
|
-
description: "Use when a spec exists and
|
|
3
|
+
description: "Use when a spec exists and must be de-risked before planning — hunt its ambiguities, unstated assumptions and edge cases, ask the few build-changing questions, bake the answers back into the spec. The rsc SDD gate between `specify` (writes the spec) and `plan` (designs the build). NOT the cross-artifact consistency check (that is `analyze`)."
|
|
4
4
|
tags: [sdd, clarify, questions]
|
|
5
5
|
recommends: [plan]
|
|
6
6
|
profiles: [core, full]
|
|
@@ -11,25 +11,18 @@ origin: risco
|
|
|
11
11
|
|
|
12
12
|
A spec written in one sitting always lies a little. It states what the author *thought of*, and stays silent on everything they didn't — the edge cases, the unstated defaults, the words that mean two things. Those silences don't disappear; they get discovered later, mid-implementation, where they cost ten times as much to fix. **Clarify is the gate that drags those silences into the open while they are still cheap.**
|
|
13
13
|
|
|
14
|
-
This is the fourth phase of the rsc SDD chain. `specify` turned a fuzzy intent into a spec;
|
|
14
|
+
This is the fourth phase of the rsc SDD chain (`constitution` → `specify` → **`clarify`** → `plan` → `tasks` → `analyze` → `implement` → `verify` → `review` → `ship`); the method itself lives in `../sdd/SKILL.md`. `specify` turned a fuzzy intent into a spec; clarify interrogates that spec, asks the user the questions that actually change the build, and writes the answers back so the spec becomes safe to plan from. It produces **no new artifact** — it sharpens the existing one in place. The line is **specify creates, clarify de-risks, plan designs**: if you find yourself proposing how to *build* it, you have left clarify.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
**Model tier: `balanced`** — this phase ranks and asks the few high-leverage questions, it does not design architecture. Resolve and apply it per `../sdd/references/model-routing.md`; routing is off unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
**Accompaniment dial.** Read the level from `02-DOCS/wiki/harness/user-profile.md` (the dial and the `02-DOCS/wiki/` convention are owned by `../harness/SKILL.md`). Clarify is question-heavy, so the dial matters here more than almost anywhere — it sets **how many questions you ask and how you frame them**. With no profile: default to non-technical framing, ask the two gauging questions (technical level + accompaniment) first, then proceed at the stated level.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- The intent is still fuzzy and there is no spec yet → that's **specify** (capture the what & why first; clarify needs something to interrogate).
|
|
28
|
-
- The spec is clear and you want the technical *how* (architecture, interfaces, data flow) → that's **plan**.
|
|
29
|
-
- You want a consistency cross-check across constitution ↔ spec ↔ plan ↔ tasks → that's **analyze** (clarify works on the spec alone, before a plan exists).
|
|
30
|
-
- The thing you're "clarifying" is a runtime bug's root cause → that's **debug**.
|
|
31
|
-
|
|
32
|
-
The line: **specify creates, clarify de-risks, plan designs.** If you find yourself proposing how to *build* it, you've left clarify.
|
|
20
|
+
| Dial | Ask |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| **L0** "cavernícola" | ONLY the questions whose answer changes the architecture or scope. Propose safe defaults for everything else and list them tersely as "assumed unless you object". Minimal prose. |
|
|
23
|
+
| **L1** "breve" | The high-leverage batch, one line of *why* per question. |
|
|
24
|
+
| **L2** "explica decisiones" | The batch plus the trade-off behind each option, so the user chooses informed. |
|
|
25
|
+
| **L3** "acompañamiento total" | Walk the taxonomy out loud, explain what each kind of gap costs if left unresolved, ask broadly (including the medium-leverage questions), and teach the *why* as you go. Ideal for non-technical users who benefit from seeing the hidden decisions. |
|
|
33
26
|
|
|
34
27
|
## Read first — the inputs
|
|
35
28
|
|
|
@@ -37,7 +30,7 @@ Clarify never works blind. Before asking a single question, load three things:
|
|
|
37
30
|
|
|
38
31
|
1. **The spec.** Read the target spec under `02-DOCS/wiki/sdd/specs/<slug>.md` end to end. If the path wasn't given, find the most recently touched spec or ask which one.
|
|
39
32
|
2. **The constitution.** Read `02-DOCS/wiki/sdd/constitution.md` if it exists. Its principles (stack canon, quality bars, conventions) resolve a surprising number of "ambiguities" without bothering the user — if the constitution already fixes the auth method or the data region, that's answered, not open.
|
|
40
|
-
3. **The harness profile.**
|
|
33
|
+
3. **The harness profile.** `02-DOCS/wiki/harness/user-profile.md`, for the dial above.
|
|
41
34
|
|
|
42
35
|
Citing what you read ("checked the constitution — auth is already fixed to OAuth, so that's not an open question") shows your work and prevents re-litigating settled decisions.
|
|
43
36
|
|
|
@@ -68,40 +61,21 @@ Run in order. The discipline is: find many candidate gaps, keep only the ones th
|
|
|
68
61
|
|
|
69
62
|
2. **Resolve what you already can.** For each candidate, check the constitution and the spec's own later sections before asking the user. Many "gaps" are answered elsewhere. Mark each candidate **resolved-internally** (cite the source), **inferable** (a safe default you'll propose, not silently assume), or **must-ask** (only the user can decide).
|
|
70
63
|
|
|
71
|
-
3. **Rank by leverage.** Sort the must-ask list by impact: how much does the build change depending on the answer? A question whose two answers lead to two different architectures ranks above a cosmetic one. Cut low-leverage questions — clarify is not an interrogation, it's the *few* questions that matter. Cap the batch to the dial
|
|
64
|
+
3. **Rank by leverage.** Sort the must-ask list by impact: how much does the build change depending on the answer? A question whose two answers lead to two different architectures ranks above a cosmetic one. Cut low-leverage questions — clarify is not an interrogation, it's the *few* questions that matter. Cap the batch to the dial.
|
|
72
65
|
|
|
73
|
-
4. **Ask — one focused batch,
|
|
66
|
+
4. **Ask — one focused batch, sized to the dial.** How you ask determines whether you get a usable answer:
|
|
67
|
+
- **Make it a decision, not an essay prompt.** "Should deletes be soft (recoverable, hidden) or hard (gone immediately)? I'd recommend soft because the spec mentions an audit trail — confirm?" beats "How should deletion work?".
|
|
68
|
+
- **Carry your own recommendation** when there's a defensible default, matched to the constitution. The user confirms or overrides — far less effort than authoring from scratch.
|
|
69
|
+
- **Quote the spec.** Anchor each question to the exact line or section it came from, so the user sees *why* it's open.
|
|
70
|
+
- **One batch, ranked, then stop.** Don't drip questions one at a time over many turns unless the dial is L3; don't dump thirty at once. Then wait: never ask and answer in the same breath, and never assume the user's intent on a must-ask item.
|
|
74
71
|
|
|
75
|
-
5. **Bake the answers back into the spec.** This is the deliverable. For each resolved item, edit the spec in place:
|
|
72
|
+
5. **Bake the answers back into the spec.** This is the deliverable — an un-baked answer is a lost answer. For each resolved item, edit the spec in place:
|
|
76
73
|
- Tighten the relevant section with the decided behavior.
|
|
77
74
|
- Add or sharpen acceptance criteria so the decision is now observable.
|
|
78
75
|
- Append a `## Clarifications` log to the spec: dated entries of `Q → decision → why`, so the *reasoning* survives, not just the result.
|
|
79
76
|
- Move anything explicitly dropped into an `## Out of scope` section so it's bounded, not dangling.
|
|
80
|
-
Then re-read the spec once more: did resolving one gap open a new one? If so, one more short loop. Otherwise, the gate is passed.
|
|
81
|
-
|
|
82
|
-
## Question-shape rule
|
|
83
|
-
|
|
84
|
-
How you ask determines whether you get a usable answer.
|
|
85
|
-
|
|
86
|
-
- **Make it a decision, not an essay prompt.** "Should deletes be soft (recoverable, hidden) or hard (gone immediately)? I'd recommend soft because the spec mentions an audit trail — confirm?" beats "How should deletion work?".
|
|
87
|
-
- **Carry your own recommendation** when there's a defensible default, matched to the constitution. The user confirms or overrides — far less effort than authoring from scratch.
|
|
88
|
-
- **One batch, ranked, then stop.** Don't drip questions one at a time over many turns unless the dial is L3. Don't dump thirty at once. Ask the few that matter, together.
|
|
89
|
-
- **Quote the spec.** Anchor each question to the exact line or section it came from, so the user sees *why* it's open.
|
|
90
|
-
|
|
91
|
-
## Model tier — `balanced` (opt-in routing)
|
|
92
77
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
## The accompaniment dial
|
|
96
|
-
|
|
97
|
-
Read the level from `02-DOCS/wiki/harness/user-profile.md` and adapt **how many questions and how you frame them** — clarify is question-heavy, so the dial matters here more than almost anywhere:
|
|
98
|
-
|
|
99
|
-
- **L0 (cavernícola)** — ask ONLY the questions whose answer changes the architecture or scope. Propose safe defaults for everything else and list them tersely as "assumed unless you object". Minimal prose.
|
|
100
|
-
- **L1 (breve)** — the high-leverage batch, one line of *why* per question.
|
|
101
|
-
- **L2 (explica decisiones)** — the batch plus the trade-off behind each option, so the user chooses informed.
|
|
102
|
-
- **L3 (acompañamiento total)** — walk the taxonomy out loud, explain what each kind of gap costs if left unresolved, ask broadly (including the medium-leverage questions), and teach the *why* as you go. Ideal for non-technical users who benefit from seeing the hidden decisions.
|
|
103
|
-
|
|
104
|
-
When no profile exists: default to non-technical framing, ask the two gauging questions (technical level + accompaniment) first, then proceed at the stated level.
|
|
78
|
+
Then re-read the spec once more: did resolving one gap open a new one? If so, one more short loop. Otherwise, the gate is passed.
|
|
105
79
|
|
|
106
80
|
## Worked micro-example
|
|
107
81
|
|
|
@@ -124,40 +98,25 @@ Resolved-internally (cite): constitution fixes storage to the project's object s
|
|
|
124
98
|
|
|
125
99
|
After baking back, the spec line becomes a bounded, testable behavior with acceptance criteria ("rejects files >5 MB with a clear message", "accepts PNG/JPG/HEIC only", "replacing a photo deletes the prior file") and a `## Clarifications` entry recording why.
|
|
126
100
|
|
|
127
|
-
## Anti-patterns
|
|
101
|
+
## Anti-patterns
|
|
128
102
|
|
|
129
|
-
|
|
|
103
|
+
| Anti-pattern | Why it breaks the gate / do instead |
|
|
130
104
|
| --- | --- |
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
| "Edge cases are the implementer's problem" | Edge cases are *spec* problems. Resolving them now is the whole point of the gate. |
|
|
138
|
-
| "It's ambiguous but the user is busy, I'll guess" | A wrong guess costs more than a question. Frame it as a one-tap decision with a recommendation. |
|
|
139
|
-
|
|
140
|
-
## Done check — is the gate passed?
|
|
141
|
-
|
|
142
|
-
- [ ] Spec, constitution, and harness profile all read; settled questions cited, not re-asked.
|
|
143
|
-
- [ ] The spec was scanned against the full ambiguity taxonomy (all ten categories considered).
|
|
144
|
-
- [ ] Candidate gaps were ranked by leverage; only the build-changing ones were put to the user.
|
|
145
|
-
- [ ] Questions were framed as decisions with recommendations, in one dial-sized batch.
|
|
146
|
-
- [ ] Every resolved answer is baked into the spec body (behavior tightened, acceptance criteria added).
|
|
147
|
-
- [ ] A dated `## Clarifications` log captures Q → decision → why for each resolved item.
|
|
148
|
-
- [ ] Dropped items are bounded under `## Out of scope`, not left dangling.
|
|
149
|
-
- [ ] A final re-read confirmed resolving gaps didn't open new ones (or a short loop closed them).
|
|
105
|
+
| Skipping clarify because the spec "reads clear enough" | Clear to the author ≠ unambiguous. Run the taxonomy; the gaps you can't see are exactly the expensive ones. |
|
|
106
|
+
| Assuming the sensible default and moving on | An assumption is an unrecorded decision. Either it's resolvable from the constitution (cite it) or it's a must-ask. Silent defaults resurface as bugs — and "the user is busy" is not an exception; a wrong guess costs more than a one-tap question. |
|
|
107
|
+
| Sketching how you'd build it while you're in there | That's `plan`. Clarify decides *what*, not *how*. Proposing architecture means you left the gate. |
|
|
108
|
+
| Asking everything you can think of, to be safe | Thirty questions is noise that buries the three that matter. Rank by leverage, ask the few, default the rest — and batch them once instead of dripping one per turn. |
|
|
109
|
+
| Answering the questions in your head and leaving the spec as-is | The deliverable is the *edited spec* plus the Clarifications log, not a clean conscience. |
|
|
110
|
+
| Leaving edge cases "to the implementer" | Edge cases are *spec* problems. Resolving them now is the whole point of the gate. |
|
|
150
111
|
|
|
151
|
-
##
|
|
112
|
+
## Exit gate
|
|
152
113
|
|
|
153
|
-
|
|
114
|
+
The gate is passed when the spec, constitution and profile were all read (settled questions cited, not re-asked); all ten taxonomy categories were considered; only the build-changing gaps were put to the user, as dial-sized decisions with recommendations; every answer is baked into the spec body with observable acceptance criteria, logged under `## Clarifications` and bounded under `## Out of scope`; and the final re-read opened no new gap.
|
|
154
115
|
|
|
155
|
-
##
|
|
116
|
+
## Next in the chain
|
|
156
117
|
|
|
157
|
-
|
|
158
|
-
- The SDD chain (sibling phases): `specify` (creates the spec clarify interrogates), `plan` (consumes the de-risked spec), `analyze` (cross-checks constitution ↔ spec ↔ plan ↔ tasks), `debug` (root-cause diagnosis, callable any time), `constitution` (the principles clarify reads as guardrails).
|
|
118
|
+
Hand off to **`plan`** — turn the now-sharp spec into a technical implementation plan (architecture, interfaces, data flow, testing strategy, risks), deferring stack specifics to the relevant stack skill. The chain continues: clarify → **plan** → tasks → analyze → implement → verify → review → ship. `debug` is callable any time if what you are "clarifying" turns out to be a runtime fault, not a spec gap.
|
|
159
119
|
|
|
160
120
|
## Orientación (siempre)
|
|
161
121
|
|
|
162
122
|
Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
|
|
163
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clickhouse-analytics
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when running a ClickHouse server for high-volume OLAP: choosing a MergeTree engine and ORDER BY/PARTITION BY keys, ingesting billions of event/log/metric rows, pre-aggregating with materialized views, or fixing a query that scans instead of pruning. NOT in-process file analytics (that is `duckdb`), NOT OLTP CRUD indexing (that is `postgresdb`)."
|
|
4
4
|
tags: [clickhouse, olap, columnar, mergetree, analytics, materialized-views, data-ingestion, sql]
|
|
5
5
|
recommends: [duckdb, postgresdb, dashboard, kpi-framework, reporting, business-intelligence]
|
|
6
6
|
origin: risco
|
|
@@ -10,11 +10,7 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
ClickHouse is a multi-user, always-on, replicated columnar server built to ingest continuous high-volume writes and answer aggregation queries over billions of rows in milliseconds. You reach for it when the workload is "append a firehose of events/logs/metrics, then GROUP BY them for dashboards." Target **26.3 LTS** (v26.3.12.3, 2026-05-22) — several defaults below changed in the 26.x line, so version matters.
|
|
12
12
|
|
|
13
|
-
The
|
|
14
|
-
|
|
15
|
-
- Files on a laptop, in-process, no server, no concurrent writers → that is **duckdb**, not this skill.
|
|
16
|
-
- App CRUD, point updates, foreign keys, row locks, RLS, migrations → that is **postgresdb**.
|
|
17
|
-
- `clickhouse-server`, replication, concurrent writers, 100M+ rows/s ingest → **this skill**.
|
|
13
|
+
The fork before you write any DDL: files on a laptop, in-process, no server, no concurrent writers → `../duckdb/SKILL.md`; app CRUD, point updates, foreign keys, row locks, RLS, migrations → `../postgresdb/SKILL.md`; `clickhouse-server`, replication, concurrent writers, 100M+ rows/s ingest → this skill.
|
|
18
14
|
|
|
19
15
|
Instrumenting capture (GA4/PostHog) is `../analytics/SKILL.md`; charting the result for humans is `../dashboard/SKILL.md`; deciding which metrics matter is `../kpi-framework/SKILL.md`. ClickHouse is the engine underneath all three.
|
|
20
16
|
|
|
@@ -34,8 +30,6 @@ Default to `MergeTree`. Move to `AggregatingMergeTree` only when you are pre-agg
|
|
|
34
30
|
|
|
35
31
|
## Schema rules
|
|
36
32
|
|
|
37
|
-
Each rule, then the one-line reason.
|
|
38
|
-
|
|
39
33
|
1. **`ORDER BY` is your single biggest perf lever — a good one cuts query time ~100x.** It defines the sparse primary index that prunes which granules get read. Get this right above everything else.
|
|
40
34
|
2. **Order the key low-cardinality → high-cardinality, left to right, driven by `WHERE`/`GROUP BY` — never by join keys.** 3–5 columns. The leftmost column should be the one you filter on most; cardinality rises as you go right. Timeseries: put the raw timestamp last, often `(tenant_id, toStartOfDay(ts), event_type, ts)`.
|
|
41
35
|
3. **Treat `ORDER BY` and `PARTITION BY` as immutable.** Changing either almost always means a new table + `INSERT ... SELECT` migration. Decide deliberately now.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: client-onboarding
|
|
3
|
-
description: "Use when a deal
|
|
3
|
+
description: "Use when a deal closed or a user signed up and the first 30 days need an activation plan: sales→delivery handoff, one verifiable activation event, kickoff, and a 30/60/90 or day-0→14 plan with owners, dates and a measurable exit. NOT reactive ticket triage (that is `customer-support`), NOT renewals/churn past the onboarded gate (that is `retention`)."
|
|
4
4
|
tags:
|
|
5
5
|
- onboarding
|
|
6
6
|
- activation
|
|
@@ -32,16 +32,17 @@ lost, (2) define **one verifiable activation event** and the shortest path to
|
|
|
32
32
|
it, (3) run the kickoff (welcome packet, agenda, RACI), and (4) lay a phased
|
|
33
33
|
plan with named owners, dates, and a measurable exit.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
Hand off explicitly: an inbound ticket from an existing customer →
|
|
36
|
+
[`customer-support`](../customer-support/SKILL.md) (you are proactive
|
|
37
|
+
first-30-days, not reactive triage); renewals, churn programs and health
|
|
38
|
+
scoring → [`retention`](../retention/SKILL.md) (you **end** at the onboarded
|
|
39
|
+
gate); the pre-signature proposal/SOW → [`proposals`](../proposals/SKILL.md);
|
|
40
|
+
pre-close stages and forecasting → [`sales-pipeline`](../sales-pipeline/SKILL.md)
|
|
41
|
+
(the handoff is the seam between you); kickoff invites →
|
|
42
|
+
[`calendar-scheduling`](../calendar-scheduling/SKILL.md); e-signing the order
|
|
43
|
+
form → [`e-signature`](../e-signature/SKILL.md); help-center setup docs →
|
|
44
|
+
[`technical-writing`](../technical-writing/SKILL.md). The in-app tour widget is
|
|
45
|
+
a product job — you define the *plan and content*, not the tour UI.
|
|
45
46
|
|
|
46
47
|
## Step 1 — Pick the motion first
|
|
47
48
|
|
|
@@ -159,7 +160,11 @@ opinion in the first 30 days, and ~75% of new users abandon within the first
|
|
|
159
160
|
week if they never hit value. Each phase row carries an **owner + date + exit
|
|
160
161
|
milestone**.
|
|
161
162
|
|
|
162
|
-
High-touch 30/60/90
|
|
163
|
+
High-touch 30/60/90 skeleton below. Fill-in templates for every artifact in
|
|
164
|
+
this skill — handoff checklist, welcome packet, timed kickoff-agenda script,
|
|
165
|
+
worked RACI, the filled 30/60/90, the day-0→day-14 sequence, the exit-gate
|
|
166
|
+
checklist — are in
|
|
167
|
+
[`references/onboarding-playbook.md`](references/onboarding-playbook.md).
|
|
163
168
|
|
|
164
169
|
| Phase | Focus | Owner | Exit milestone |
|
|
165
170
|
| --- | --- | --- | --- |
|
|
@@ -245,10 +250,3 @@ onboarding gets them to first value, retention keeps them past it.
|
|
|
245
250
|
| Front-load nothing, hope for day-60 | ~75% abandon in week 1 without value | Front-load days 1–30 (Step 5) |
|
|
246
251
|
| Same motion for every customer | A call insults self-serve; a nudge insults enterprise | Pick the motion first (Step 1) |
|
|
247
252
|
| Treating activation as adoption | Conflates a one-time event with a long-term state | Define activation; leave adoption to `retention` |
|
|
248
|
-
|
|
249
|
-
## References
|
|
250
|
-
|
|
251
|
-
Full fill-in templates — sales→CS handoff checklist, welcome-packet template,
|
|
252
|
-
the timed kickoff-call agenda script, a worked RACI matrix, a filled 30/60/90
|
|
253
|
-
table, the day-0→day-14 nudge sequence, and the exit-gate checklist — are in
|
|
254
|
-
[`references/onboarding-playbook.md`](references/onboarding-playbook.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cloudflare
|
|
3
|
-
description: "Use when working on Cloudflare's edge platform —
|
|
3
|
+
description: "Use when working on Cloudflare's edge platform — wrangler.jsonc bindings, choosing between D1/KV/R2/Durable Objects/Queues, deploying a Worker or SPA via Static Assets, or designing around a Workers runtime limit. NOT generic CI/release (that is `deployment`), NOT Next.js framework wiring (that is `nextjs`), NOT DNS records (that is `domains-dns`)."
|
|
4
4
|
tags: [cloudflare, workers, edge, r2, d1, kv, queues, wrangler, serverless]
|
|
5
5
|
recommends: [deployment, nextjs, domains-dns, postgresdb, redis, secure-coding]
|
|
6
6
|
origin: risco
|
|
@@ -74,7 +74,7 @@ This is the decision that shapes the architecture. Pick by access pattern and co
|
|
|
74
74
|
| **Durable Objects** | Strongly-consistent coordination, per-entity state, WebSockets | Strong (single-threaded per object) | One object = one serialized actor | Bulk storage; high-fanout reads |
|
|
75
75
|
| **Queues** | Async/batch work, decoupling, retries | At-least-once delivery | Batch ≤100 (default 10) | Synchronous request/response |
|
|
76
76
|
|
|
77
|
-
Rule of thumb: **need read-after-write? Not KV.** Need SQL joins? D1. Need a file? R2. Need a counter or lock? Durable Object.
|
|
77
|
+
Rule of thumb: **need read-after-write? Not KV.** Need SQL joins? D1. Need a file? R2. Need a counter or lock? Durable Object. Per-primitive binding config and code, consistency semantics, the complete limits/pricing tables, and Hyperdrive for external Postgres are in `references/storage-primitives.md`.
|
|
78
78
|
|
|
79
79
|
## Static & full-stack hosting
|
|
80
80
|
|
|
@@ -85,7 +85,7 @@ Workers **Static Assets** is the recommended way to host SPAs and full-stack app
|
|
|
85
85
|
- `assets.not_found_handling` — `"single-page-application"` (serve `index.html` on miss, for client-side routing) or `"404-page"`.
|
|
86
86
|
- `assets.run_worker_first` — run the Worker before serving static assets, e.g. so `/api/*` hits your handler not a file.
|
|
87
87
|
|
|
88
|
-
Do **not** use Workers Sites for new projects — it is deprecated in Wrangler v4 and unsupported by the Cloudflare Vite plugin. Migrating off Pages? Pages still works, but new full-stack work targets Workers; the migration checklist
|
|
88
|
+
Do **not** use Workers Sites for new projects — it is deprecated in Wrangler v4 and unsupported by the Cloudflare Vite plugin. Migrating off Pages? Pages still works, but new full-stack work targets Workers; the asset-routing rules and the migration checklist are in `references/wrangler-config.md`.
|
|
89
89
|
|
|
90
90
|
## Bindings in code
|
|
91
91
|
|
|
@@ -184,8 +184,3 @@ Plan note: the **Workers Paid** plan is a $5/mo minimum bundling Workers, Pages
|
|
|
184
184
|
| Secrets in `vars` or committed | Plaintext in repo / config = leak | `wrangler secret put`; `.dev.vars` (gitignored) for local |
|
|
185
185
|
| Treating D1 like a pooled SQL connection | D1 is accessed over HTTP, not a persistent pool — no transactions across requests, no long-held connections | One prepared statement per call; batch with `db.batch()` |
|
|
186
186
|
| Heavy fan-out to many subrequests | Hits the subrequest cap and fails the request | Cache in KV, batch, or offload to a Queue consumer |
|
|
187
|
-
|
|
188
|
-
## References
|
|
189
|
-
|
|
190
|
-
- `references/storage-primitives.md` — full per-service binding config and code (R2/D1/KV/Queues/Durable Objects), consistency semantics, complete limits/pricing tables, Hyperdrive for external Postgres.
|
|
191
|
-
- `references/wrangler-config.md` — complete annotated `wrangler.jsonc`, environments/routes/custom domains, compatibility flags & dates, Pages→Workers migration checklist, Static Assets routing.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-review
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use to judge a concrete diff, branch, or GitHub PR on its own merits with no rsc-SDD spec/plan chain to key off — the spec-less giving pass behind /code-review: only findings you can defend, one verdict, read-only unless --comment or --fix. NOT the SDD gate keyed to 02-DOCS/wiki/sdd/ that also processes incoming review comments (that is `review`)."
|
|
4
4
|
tags: [code-review, pr-review, quality, correctness]
|
|
5
5
|
recommends: [review, secure-coding, verify]
|
|
6
6
|
origin: risco
|
|
@@ -8,9 +8,7 @@ origin: risco
|
|
|
8
8
|
|
|
9
9
|
# Code review — standalone, spec-less diff judgment
|
|
10
10
|
|
|
11
|
-
You are reviewing a concrete change — a `git diff`, a branch, a GitHub PR, a pasted patch — on its own merits. No rsc-SDD spec/plan/constitution chain is required and you should not pretend one exists. This is the doctrine behind the executable `/code-review` slash command: same evidence bar, written as a discipline you run by hand.
|
|
12
|
-
|
|
13
|
-
> **The one-line disambiguator:** `review` needs `02-DOCS/wiki/sdd/` (spec + plan + constitution) and owns the *receiving* loop. `code-review` needs only the diff. If the user is mid-SDD and wants to process incoming comments, route to `../review/SKILL.md`. If they hand you a naked diff or an inbound third-party PR, this skill.
|
|
11
|
+
You are reviewing a concrete change — a `git diff`, a branch, a GitHub PR, a pasted patch — on its own merits. No rsc-SDD spec/plan/constitution chain is required and you should not pretend one exists. This is the doctrine behind the executable `/code-review` slash command: same evidence bar, written as a discipline you run by hand. If the user is mid-SDD and wants to process *incoming* comments against `02-DOCS/wiki/sdd/`, that is `../review/SKILL.md`; a naked diff or an inbound third-party PR is this skill.
|
|
14
12
|
|
|
15
13
|
**The north star is signal-to-noise.** Report only findings you would stake your name on. A clean diff is `APPROVE`, not a manufactured nit. High-false-positive review gets tuned out by humans in about two weeks; the bar to aim for is the logic-error review where under 1% of findings come back marked wrong. Padding does not make you look thorough — it trains the reader to ignore you.
|
|
16
14
|
|
|
@@ -30,7 +28,7 @@ git diff --stat main...HEAD # see blast radius before reading
|
|
|
30
28
|
# A pasted patch — read it as given
|
|
31
29
|
```
|
|
32
30
|
|
|
33
|
-
A review with no notion of intent is a review of vibes. If no purpose is stated, **infer it from the diff and say what you assumed** ("Assuming this is meant to add idempotency to the webhook handler…") so the reader can correct a wrong premise. Then read the *whole* changed file, not just the green/red lines
|
|
31
|
+
A review with no notion of intent is a review of vibes. If no purpose is stated, **infer it from the diff and say what you assumed** ("Assuming this is meant to add idempotency to the webhook handler…") so the reader can correct a wrong premise — a silent wrong premise produces a confidently wrong review. Then read the *whole* changed file, not just the green/red lines: the structural failure of standalone review is judging a hunk without its context and shipping generic pattern-matched suggestions.
|
|
34
32
|
|
|
35
33
|
## The pass order
|
|
36
34
|
|
|
@@ -47,6 +45,8 @@ Run these in order. Passes 1–5 are correctness/safety and are blocking-eligibl
|
|
|
47
45
|
|
|
48
46
|
Pass 4 is a **boundary** pass — trace untrusted input to its sink and flag the reachable ones. For a real STRIDE/OWASP threat model with exploitability ranking and vulnerable→fixed diffs, hand off to `../secure-coding/SKILL.md`.
|
|
49
47
|
|
|
48
|
+
Adjacent jobs, delegated by name: running the lint/type/test gates until they are green is `../verify/SKILL.md` (this skill judges whether green is *correct*); root-causing one confirmed failure is `../debug/SKILL.md`; cross-checking spec/plan/tasks *before* code exists is `../analyze/SKILL.md`.
|
|
49
|
+
|
|
50
50
|
## Confidence floor and the false-positive skip-list
|
|
51
51
|
|
|
52
52
|
**The 80% rule:** if you are not at least ~80% sure a finding is real, you have two moves — trace the code until you *are* sure, or downgrade it to `[question]`. Never ship a guess dressed as a defect.
|
|
@@ -103,7 +103,7 @@ End every review with exactly one, plainly — no mushy middle:
|
|
|
103
103
|
|
|
104
104
|
## Effort dial
|
|
105
105
|
|
|
106
|
-
Mirror the slash command's effort level: **low/medium** → fewer, high-confidence findings (raise the confidence floor, focus on passes 1–4). **high/max** → broader coverage;
|
|
106
|
+
Mirror the slash command's effort level: **low/medium** → fewer, high-confidence findings (raise the confidence floor, focus on passes 1–4). **high/max** → broader coverage; uncertain findings are allowed but must be labelled `[question]`, never inflated into blockers. This is *coverage vs precision*, not the harness accompaniment dial — it changes what you look at, not how much you narrate.
|
|
107
107
|
|
|
108
108
|
## Emitting comments and applying fixes
|
|
109
109
|
|
|
@@ -120,24 +120,11 @@ gh pr review 1432 --approve -b "APPROVE — correctness and contracts clean."
|
|
|
120
120
|
|
|
121
121
|
Inline line-anchored comments go through the GitHub REST API — see `references/pr-workflow.md` for the JSON shape, fork-PR handling, and large-diff strategy. If `--fix` puts you on the default branch, **branch first**; commit or push **only when the user asks**; git authorship is **Eric** (no Claude co-author or generated footer).
|
|
122
122
|
|
|
123
|
-
## Anti-patterns
|
|
123
|
+
## Anti-patterns
|
|
124
124
|
|
|
125
|
-
|
|
|
125
|
+
| Failure mode | Reality |
|
|
126
126
|
|---|---|
|
|
127
127
|
| "It compiles and the tests pass, so it's correct." | Tests prove green, not correct. Pass 5 asks whether the tests actually exercise the new branch — green for the wrong reason is a finding. |
|
|
128
|
-
|
|
|
129
|
-
| "This looks like a bug." | Looks-like is not a finding. Trace the value to a reachable sink, or file it `[question]`. |
|
|
130
|
-
| "More findings = more thorough." | False positives get you tuned out in two weeks. Signal-to-noise is the metric; one real blocker beats ten nits. |
|
|
131
|
-
| "No PR description, so I'll guess the intent silently." | State the intent you assumed. A wrong silent premise produces a confidently wrong review. |
|
|
128
|
+
| Listing everything you would have done differently. | That is noise. Report defects and reuse wins you can defend; preference is not a finding. |
|
|
132
129
|
| "It's just a dependency bump, skim it." | Bumps carry supply-chain and transitive risk and behaviour changes. Check the changelog/lockfile diff, not just the version string. |
|
|
133
|
-
|
|
|
134
|
-
|
|
135
|
-
## See Also
|
|
136
|
-
|
|
137
|
-
- `../review/SKILL.md` — the rsc-SDD penultimate gate keyed to `02-DOCS/wiki/sdd/`, and the *receiving* loop (process comments, push back with proof).
|
|
138
|
-
- `../secure-coding/SKILL.md` — deep STRIDE/OWASP threat model with vulnerable→fixed diffs; the depth pass 4 defers to.
|
|
139
|
-
- `../verify/SKILL.md` — run lint/type/test/`verify.sh` and prove green (code-review judges whether green is correct).
|
|
140
|
-
- `../debug/SKILL.md` — root-cause one confirmed failure (code-review surveys for latent ones).
|
|
141
|
-
- `../analyze/SKILL.md` — consistency across spec/plan/tasks *before* code exists.
|
|
142
|
-
- `../ship/SKILL.md` — PR/merge/close after approval; consumes this skill's verdict.
|
|
143
|
-
- Stack idiom for the change under review: `../nextjs/SKILL.md`, `../fastapi/SKILL.md`, `../go/SKILL.md`, `../typescript/SKILL.md`, `../python/SKILL.md`.
|
|
130
|
+
| Applying every nit "to be safe" under `--fix`. | Each unrequested edit is scope creep and a regression surface. Apply the agreed findings only. |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codebase-onboarding
|
|
3
|
-
description: "Use when you land in an unfamiliar or inherited codebase and must get productive fast
|
|
3
|
+
description: "Use when you land in an unfamiliar or inherited codebase and must get productive fast: a breadth-first map of entry points, request flow, module ownership, hidden side effects (cron, webhooks, workers) and churn hotspots, committed as CODEBASE-MAP.md. NOT a deep audit of one module (that is `analyze`) or chasing one failure (that is `debug`)."
|
|
4
4
|
tags: [onboarding, codebase, code-mapping, legacy-code, architecture, reverse-engineering, hotspots]
|
|
5
5
|
recommends: [analyze, debug, decision-records, harness, init, knowledge-ops]
|
|
6
6
|
origin: risco
|
|
@@ -68,7 +68,7 @@ git log --format=format: --name-only --since=12.month \
|
|
|
68
68
|
| grep -v '^$' | sort | uniq -c | sort -nr | head -50
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
The richer move is **churn × complexity**: the top-right quadrant (changes constantly *and* is hard to read) is your real danger zone (understandlegacycode.com Hotspots, accessed 2026-06-02). Escalate to that — or to a tree-sitter dependency graph — only when grep + churn is not enough
|
|
71
|
+
The richer move is **churn × complexity**: the top-right quadrant (changes constantly *and* is hard to read) is your real danger zone (understandlegacycode.com Hotspots, accessed 2026-06-02). Escalate to that — or to a tree-sitter dependency graph — only when grep + churn is not enough: `references/recon-playbook.md` has the churn×complexity recipe (code-maat) and when codegraph PageRank / FileScopeMCP earn their setup cost.
|
|
72
72
|
|
|
73
73
|
**g. Confirm hands-on.**
|
|
74
74
|
Run the app, walk one end-user journey, send a real request, watch the logs. Reading alone leaves the map unverified; a single real request validates the whole trace in step c.
|
|
@@ -106,9 +106,6 @@ rg -n "queue|worker|bull|sidekiq|celery|sqs|rabbitmq|kafka|@task" -i
|
|
|
106
106
|
|
|
107
107
|
# Env-driven branches (hidden config-conditional behavior)
|
|
108
108
|
rg -n "process\.env\.|os\.environ|ENV\[|getenv"
|
|
109
|
-
|
|
110
|
-
# Hotspots: churn over the last year
|
|
111
|
-
git log --format=format: --name-only --since=12.month | grep -v '^$' | sort | uniq -c | sort -nr | head -50
|
|
112
109
|
```
|
|
113
110
|
|
|
114
111
|
## Writing & maintaining the map
|
|
@@ -129,5 +126,3 @@ git log --format=format: --name-only --since=12.month | grep -v '^$' | sort | un
|
|
|
129
126
|
| Map lives only in chat | Dies with the session; next agent redoes it | Write & commit `CODEBASE-MAP.md` |
|
|
130
127
|
| Guess instead of grep | Confident-wrong is worse than slow-right | Form the hypothesis, then `rg` to confirm or kill it |
|
|
131
128
|
| Stand up a tree-sitter MCP graph on a 5-file repo | Setup costs more than the whole recon | Reserve graph tools for large monorepos; grep + churn first |
|
|
132
|
-
|
|
133
|
-
See `references/recon-playbook.md` for per-ecosystem entry points and side-effect patterns, the churn×complexity recipe (code-maat), and when a tree-sitter graph (codegraph PageRank, FileScopeMCP) earns its setup cost.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cold-outreach
|
|
3
|
-
description: "Use when writing a cold email or DM to
|
|
3
|
+
description: "Use when writing a cold email or LinkedIn DM to a stranger and its cadence: first-touch copy under a word ceiling, 4-7 step bump sequences, per-inbox volume and warm-up limits, the compliant opt-out footer. NOT SPF/DKIM/DMARC setup (that is email-deliverability), NOT sourcing the list (that is lead-gen), NOT life after a reply (that is sales-pipeline)."
|
|
4
4
|
tags: [cold-email, outreach, sequences, deliverability, sales]
|
|
5
5
|
recommends: [lead-gen, sales-pipeline, email-deliverability, proposals, marketing]
|
|
6
6
|
origin: risco
|
|
@@ -10,20 +10,7 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
*You write the message a stranger actually replies to, and the sending rhythm that keeps the mailbox provider delivering it. You do not set up DNS, source the list, or run the CRM.*
|
|
12
12
|
|
|
13
|
-
This skill owns two things and only two: the **copy** of an unsolicited 1:1 touch (cold email, LinkedIn note/DM) and the **cadence** around it (step count, spacing, per-inbox volume, warm-up ramp, the compliant footer). Everything upstream and downstream belongs to a sibling —
|
|
14
|
-
|
|
15
|
-
## When to use / When NOT
|
|
16
|
-
|
|
17
|
-
Use when:
|
|
18
|
-
|
|
19
|
-
- Writing a cold email or its subject line to a recipient with no prior relationship.
|
|
20
|
-
- Building or fixing a multi-step follow-up sequence (the "bump" cadence) — step count and spacing.
|
|
21
|
-
- Writing a LinkedIn connection note or cold DM sequence.
|
|
22
|
-
- Deciding daily/weekly send volume per inbox, or a new-domain warm-up ramp.
|
|
23
|
-
- Writing the CAN-SPAM/GDPR-compliant footer and one-click opt-out line.
|
|
24
|
-
- Rescuing a cold email that "reads like a template" or gets opens but no replies.
|
|
25
|
-
|
|
26
|
-
Do NOT use when (route to the sibling that owns it):
|
|
13
|
+
This skill owns two things and only two: the **copy** of an unsolicited 1:1 touch (cold email, LinkedIn note/DM) and the **cadence** around it (step count, spacing, per-inbox volume, warm-up ramp, the compliant footer). Everything upstream and downstream belongs to a sibling — route by naming the owner, do not improvise their job:
|
|
27
14
|
|
|
28
15
|
| The ask | Owner | Why it is not here |
|
|
29
16
|
|---|---|---|
|
|
@@ -34,8 +21,6 @@ Do NOT use when (route to the sibling that owns it):
|
|
|
34
21
|
| Inbound launch emails, nurture to an opted-in list, marketing-site copy | `marketing` (`../marketing/SKILL.md`) | Opted-in and broadcast copy is a different game from a 1:1 cold touch. |
|
|
35
22
|
| Actually wire the send through Gmail/an ESP API or a scheduler | `email-connector` / `google-workspace` | This skill produces text + a plan; it does not push the send. |
|
|
36
23
|
|
|
37
|
-
Only `marketing` exists in this catalog today, so it is the only sibling linked as a file. The rest are named by id — route by naming the owner, do not improvise their job.
|
|
38
|
-
|
|
39
24
|
## The reply-rate reality (calibrate before you write)
|
|
40
25
|
|
|
41
26
|
Cold email is a low-yield channel by nature, and most "improve my copy" requests are really "stop fighting the math." Set expectations against the 2026 band:
|
|
@@ -110,7 +95,9 @@ The Good version names a real signal (`{{signal}}`), states one concrete outcome
|
|
|
110
95
|
|
|
111
96
|
The first-touch body is literally lines 2→3→4 in order; line 1 becomes the subject. If the INFER line is generic, the email is generic no matter how many merge fields you add. **Test the INFER line in isolation: would it be false for a competitor in the same situation? If it is true of everyone, it is a platitude — go back to the OBSERVE step and pick a sharper fact.**
|
|
112
97
|
|
|
113
|
-
|
|
98
|
+
Two boundaries on the OBSERVE line, because both are unrecoverable once sent: keep it **professional, public and business-relevant** ("saw you're hiring 3 SREs" is relevant; "saw you were at the lake house last weekend" is surveillance), and **never invent it** — a fabricated "I loved your recent post on X" that does not exist destroys trust on contact.
|
|
99
|
+
|
|
100
|
+
When the user hands you only a company name and no signal, do not invent one. Ask for (or, if you have web access, look up) one of these signal classes, ranked by reply lift: a **hiring/role-change** signal > a **funding/launch/news** signal > a **tech-stack or job-description detail** > a **public number from their own site/report** > a **shared context** (mutual, group, event). A generic industry trend ("AI is changing your space") is not a signal and never clears the INFER test. If no true signal exists at all, that is a `lead-gen` targeting gap, not a copy task. Worked OBSERVE→INFER→BRIDGE→PROVE chains across six industries live in `references/hook-derivation.md`.
|
|
114
101
|
|
|
115
102
|
## The sequence — decision table
|
|
116
103
|
|
|
@@ -144,7 +131,9 @@ Rules that make the table work:
|
|
|
144
131
|
|
|
145
132
|
*(LinkedIn figures: Skylead / Kondo / Expandi 2025-2026 guides, accessed 2026-06-02.)*
|
|
146
133
|
|
|
147
|
-
On LinkedIn the connection note must **not** pitch — earn the connection on a real signal, then make the ask in the first DM after they accept.
|
|
134
|
+
On LinkedIn the connection note must **not** pitch — earn the connection on a real signal, then make the ask in the first DM after they accept.
|
|
135
|
+
|
|
136
|
+
Reusable skeletons for both channels — first-touch + 4-step bump, with every variable slot (`{{signal}}`, `{{outcome}}`, `{{proof}}`) marked — live in `references/templates.md`. Start from a skeleton, then fill every slot with a *real* value before sending. An unfilled slot is a defect, not a placeholder to ship.
|
|
148
137
|
|
|
149
138
|
## Sending cadence & deliverability guardrails
|
|
150
139
|
|
|
@@ -179,12 +168,6 @@ If the user asks you to *configure* the `List-Unsubscribe` header, SPF, or DKIM,
|
|
|
179
168
|
|
|
180
169
|
EU enforcement varies — UK ICO and France CNIL are permissive for B2B; Germany and Poland are stricter (Poland often requires prior consent). When the recipient is in the EU, write the footer for the strictest plausible jurisdiction. The full footer wording, the LIA checklist, and the CASL/Australia matrix → `references/compliance-footer.md`.
|
|
181
170
|
|
|
182
|
-
## Personalization without creepiness
|
|
183
|
-
|
|
184
|
-
- **One real signal, surfaced plainly.** "Saw you're hiring 3 SREs" is relevant; "Saw you were at the lake house last weekend" is surveillance. Stay on professional, public, business-relevant signals. Then run it through the four-line bridge above — a relevant signal with a generic INFER line still reads like a template.
|
|
185
|
-
- **Do not fake personalization with spintax.** Rotating "{Hi|Hey|Hello}" or `{{first_name}}`-only mail-merge is not personalization — it is a template wearing a name tag, and recipients can smell it. If the only variable is the name, the email is generic; add a real `{{signal}}` or do not send.
|
|
186
|
-
- **Never invent the signal.** A fabricated "I loved your recent post on X" that does not exist destroys trust on contact. If you cannot find a true signal, that is a `lead-gen` targeting gap, not a copy task.
|
|
187
|
-
|
|
188
171
|
## Anti-patterns
|
|
189
172
|
|
|
190
173
|
| Anti-pattern | Why it fails | Do instead |
|
|
@@ -193,14 +176,10 @@ EU enforcement varies — UK ICO and France CNIL are permissive for B2B; Germany
|
|
|
193
176
|
| Pitch in sentence one | No earned relevance; reads like a billboard | Lead with the observed signal, earn the ask |
|
|
194
177
|
| Two CTAs ("call OR I'll send a guide") | Splits the decision; lowers reply rate | One binary yes/no ask per email |
|
|
195
178
|
| "Just following up" / "circling back" with no new angle | Adds noise, not value; trains them to ignore you | Each step adds one new angle or it is deleted |
|
|
196
|
-
| Name-only mail merge as "personalization" | Recipients see the template underneath | One true `{{signal}}` per first touch or do not send |
|
|
179
|
+
| Name-only mail merge or spintax (`{Hi\|Hey}`) as "personalization" | Recipients see the template underneath | One true `{{signal}}` per first touch or do not send |
|
|
197
180
|
| No opt-out / no postal address | CAN-SPAM/GDPR violation; complaint-rate spike | Always append the compliant footer |
|
|
198
181
|
| Subject like "Quick question!!" or "FREE" | Clickbait + spam-trigger words land you in spam | ≤6 plain words that read like a coworker wrote them |
|
|
199
182
|
| Padding to 7 steps for completeness | Replies past step 5 are thin; you just annoy | Stop at the breakup unless a real new trigger appears |
|
|
200
183
|
| "I hope this email finds you well" opener | The classic AI/template tell; wastes the first line | Open on the signal — your first 6 words are the hook |
|
|
201
184
|
|
|
202
|
-
## Templates
|
|
203
|
-
|
|
204
|
-
Reusable skeletons — first-touch + 4-step bump for email and LinkedIn, with every variable slot (`{{signal}}`, `{{outcome}}`, `{{proof}}`) marked — live in `references/templates.md`. Start from a skeleton, then fill every slot with a *real* value before sending. An unfilled slot is a defect, not a placeholder to ship.
|
|
205
|
-
|
|
206
185
|
To self-check a drafted email or sequence file, run `scripts/verify.sh path/to/draft.md` — it flags missing opt-out, multiple CTAs, over-ceiling word count, and spam/AI-tell phrases (read-only).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: community
|
|
3
|
-
description: "Use when building or running a persistent two-way community space — Discord, Telegram,
|
|
3
|
+
description: "Use when building or running a persistent two-way community space — Discord, Telegram, Circle: platform choice, structure, onboarding, native→bot→human moderation, rituals, growth loops, health metrics. NOT churn of paying product customers (that is `retention`), NOT broadcast email (that is `newsletter`), NOT one live event (that is `webinar`)."
|
|
4
4
|
tags: [community, discord, telegram, moderation, growth, rituals]
|
|
5
5
|
recommends: [retention, newsletter, social-publisher, brand-voice, whatsapp-telegram, webinar]
|
|
6
6
|
profiles: []
|
|
@@ -11,15 +11,6 @@ origin: risco
|
|
|
11
11
|
|
|
12
12
|
Run the community like a **product with a job**, not a vanity chat room. The space — a Discord server, a Telegram group+channel, a Circle — is the product. **Onboarding is activation, rituals are the feature, moderation is reliability, and one north-star metric tied to your purpose is the only number that matters.** A room with 5,000 silent members is a failed product, not a big one. Design the system around the conversation, not the conversation itself.
|
|
13
13
|
|
|
14
|
-
## When to use
|
|
15
|
-
|
|
16
|
-
- Standing up a new Discord / Telegram / Circle from zero: structure, roles, onboarding, rules.
|
|
17
|
-
- A community exists but is a graveyard — lurkers only, no rhythm, nobody posts — needs rituals + re-activation.
|
|
18
|
-
- Moderation is on fire: spam waves, raids, scam DMs, bans applied by mood, no incident process.
|
|
19
|
-
- Choosing between Discord vs Telegram vs Circle for a given audience, purpose, and monetization model.
|
|
20
|
-
- Designing a growth loop that compounds (referrals, intro rituals, partner cross-posts) instead of buying dead members.
|
|
21
|
-
- Defining community health metrics and targets and instrumenting the few that prove the thing is alive.
|
|
22
|
-
|
|
23
14
|
## When NOT to use — route instead
|
|
24
15
|
|
|
25
16
|
| The ask | Route to |
|
|
@@ -32,9 +23,9 @@ Run the community like a **product with a job**, not a vanity chat room. The spa
|
|
|
32
23
|
| Actually code or host the Discord/Telegram bot (gateway, slash handlers) | `whatsapp-telegram`, `automation-flows` |
|
|
33
24
|
| Define the voice/name/tone the community speaks in | `../brand-voice/SKILL.md` |
|
|
34
25
|
|
|
35
|
-
You own the **persistent, two-way space and its ongoing operating rhythm.** The boundary that bites most: `retention` keeps *buyers of a product* from churning; you keep *members of a shared space* active and contributing. They rhyme (cohorts, re-activation) but the subject differs — a SaaS seat vs a Discord membership.
|
|
26
|
+
You own the **persistent, two-way space and its ongoing operating rhythm.** The boundary that bites most: `retention` keeps *buyers of a product* from churning; you keep *members of a shared space* active and contributing. They rhyme (cohorts, re-activation) but the subject differs — a SaaS seat vs a Discord membership.
|
|
36
27
|
|
|
37
|
-
## Step 0 — Purpose & north-star gate
|
|
28
|
+
## Step 0 — Purpose & north-star gate
|
|
38
29
|
|
|
39
30
|
**Do not design a single channel until you have (a) a one-line purpose and (b) one business metric tied to it.** Why: a community without a job becomes a dead chat — there is no signal to design toward, so you sprawl channels and beg for activity. This is the most common cause of graveyards.
|
|
40
31
|
|
|
@@ -191,7 +182,7 @@ Then validate it:
|
|
|
191
182
|
scripts/verify.sh path/to/moderation-config.yaml
|
|
192
183
|
```
|
|
193
184
|
|
|
194
|
-
`verify.sh` checks the required keys exist, that `north_star_metric` is non-empty, that all three moderation layers are declared, and that at least one ritual has a cadence — it catches the most common defect (a "plan" with no purpose, no mod layers, or no rhythm).
|
|
185
|
+
`verify.sh` checks the required keys exist, that `north_star_metric` is non-empty, that all three moderation layers are declared, and that at least one ritual has a cadence — it catches the most common defect (a "plan" with no purpose, no mod layers, or no rhythm). **Do not go live until it passes and the north-star plus at least one health metric (TTFR or DAU/MAU) are instrumented.**
|
|
195
186
|
|
|
196
187
|
## Anti-patterns
|
|
197
188
|
|
|
@@ -205,21 +196,3 @@ scripts/verify.sh path/to/moderation-config.yaml
|
|
|
205
196
|
| Treating 90% lurkers as permanent | Leaves activation on the table | 90-9-1 is a range; move lurkers up a tier |
|
|
206
197
|
| Monetizing on Circle before activation works | Charging for a dead room churns instantly | Prove rhythm + retention, then gate/monetize |
|
|
207
198
|
| Broadcasting in a two-way space | Wrong tool; kills conversation | One-to-many → `../newsletter/SKILL.md` / `../social-publisher/SKILL.md` |
|
|
208
|
-
|
|
209
|
-
## Launch-readiness checklist
|
|
210
|
-
|
|
211
|
-
Gate before "go live":
|
|
212
|
-
|
|
213
|
-
- [ ] Purpose written in one line **and** one north-star business metric chosen (Step 0).
|
|
214
|
-
- [ ] Platform chosen by decision rule, not vibes.
|
|
215
|
-
- [ ] ≤ ~6 channels/spaces, each justified by the purpose.
|
|
216
|
-
- [ ] Onboarding path wired: role-on-join → rules gate → prompted intro → where-to-ask.
|
|
217
|
-
- [ ] All 3 moderation layers configured (native + bot + human) sized to expected scale.
|
|
218
|
-
- [ ] ≥ 1 ritual scheduled with an explicit cadence.
|
|
219
|
-
- [ ] North-star + ≥ 1 health metric (TTFR or DAU/MAU) instrumented.
|
|
220
|
-
- [ ] `community-plan.md` + `moderation-config.yaml` emitted and `verify.sh` passes.
|
|
221
|
-
|
|
222
|
-
## References
|
|
223
|
-
|
|
224
|
-
- `references/platform-playbooks.md` — per-platform setup depth: Discord (AutoMod filters, verification levels, Rules/Membership Screening, Onboarding, bots by size), Telegram (group+channel hybrid, native anti-spam >200, slow-mode, CAPTCHA bots), Circle (Spaces, 2026 plan ladder + fees, monetization gating).
|
|
225
|
-
- `references/metrics-and-rituals.md` — metric definitions + benchmarks (DAU/WAU/MAU stickiness, cohort retention, TTFR, answered rate, returning-member ratio, the business-metric menu), the 90-9-1 reality, and a ritual template library + sample weekly calendar.
|