@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.
Files changed (97) hide show
  1. package/README.md +1 -1
  2. package/manifest.json +110 -86
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -1
  5. package/scripts/skill-migration-brief.md +104 -0
  6. package/skills/ab-testing/SKILL.md +9 -41
  7. package/skills/accessibility/SKILL.md +5 -7
  8. package/skills/ads/SKILL.md +9 -24
  9. package/skills/agent-eval/SKILL.md +7 -33
  10. package/skills/agent-safety/SKILL.md +7 -14
  11. package/skills/ai-media/SKILL.md +4 -20
  12. package/skills/analytics/SKILL.md +8 -30
  13. package/skills/analyze/SKILL.md +24 -59
  14. package/skills/angular/SKILL.md +12 -25
  15. package/skills/api-connector-builder/SKILL.md +10 -27
  16. package/skills/api-design/SKILL.md +7 -14
  17. package/skills/article-writing/SKILL.md +1 -18
  18. package/skills/astro/SKILL.md +36 -54
  19. package/skills/author-skill/SKILL.md +41 -74
  20. package/skills/author-skill/evals/README.md +5 -5
  21. package/skills/author-skill/evals/cases.yaml +8 -8
  22. package/skills/author-skill/references/description-recipe.md +25 -26
  23. package/skills/author-skill/references/eval-authoring.md +1 -1
  24. package/skills/author-skill/references/rsc-conventions.md +1 -1
  25. package/skills/automation-flows/SKILL.md +6 -16
  26. package/skills/automation-strategy/SKILL.md +1 -9
  27. package/skills/aws-essentials/SKILL.md +6 -23
  28. package/skills/backups/SKILL.md +1 -7
  29. package/skills/bash-scripting/SKILL.md +5 -9
  30. package/skills/bookkeeping/SKILL.md +2 -10
  31. package/skills/brand-identity/SKILL.md +18 -44
  32. package/skills/brand-voice/SKILL.md +4 -31
  33. package/skills/building-agents/SKILL.md +20 -103
  34. package/skills/business-intelligence/SKILL.md +9 -23
  35. package/skills/calendar-scheduling/SKILL.md +11 -27
  36. package/skills/case-studies/SKILL.md +3 -8
  37. package/skills/chatbot/SKILL.md +6 -23
  38. package/skills/chrome-extension/SKILL.md +2 -2
  39. package/skills/clarify/SKILL.md +31 -72
  40. package/skills/clickhouse-analytics/SKILL.md +2 -8
  41. package/skills/client-onboarding/SKILL.md +17 -19
  42. package/skills/cloudflare/SKILL.md +3 -8
  43. package/skills/code-review/SKILL.md +10 -23
  44. package/skills/codebase-onboarding/SKILL.md +2 -7
  45. package/skills/cold-outreach/SKILL.md +9 -30
  46. package/skills/community/SKILL.md +4 -31
  47. package/skills/competitor-watch/SKILL.md +20 -35
  48. package/skills/compliance/SKILL.md +10 -37
  49. package/skills/compose-multiplatform/SKILL.md +1 -1
  50. package/skills/constitution/SKILL.md +8 -35
  51. package/skills/content-engine/SKILL.md +4 -16
  52. package/skills/context-budget/SKILL.md +3 -21
  53. package/skills/continuous-learning/SKILL.md +10 -40
  54. package/skills/contracts/SKILL.md +6 -17
  55. package/skills/coolify/SKILL.md +8 -14
  56. package/skills/cost-tracking/SKILL.md +3 -11
  57. package/skills/course-builder/SKILL.md +17 -45
  58. package/skills/course-storytelling/SKILL.md +26 -94
  59. package/skills/cpp/SKILL.md +26 -71
  60. package/skills/csharp-dotnet/SKILL.md +19 -38
  61. package/skills/customer-support/SKILL.md +14 -37
  62. package/skills/dashboard/SKILL.md +6 -26
  63. package/skills/data-cleaning/SKILL.md +37 -63
  64. package/skills/data-policy/SKILL.md +8 -21
  65. package/skills/data-scraper/SKILL.md +1 -7
  66. package/skills/debug/SKILL.md +10 -49
  67. package/skills/deployment/SKILL.md +38 -101
  68. package/skills/design/SKILL.md +34 -116
  69. package/skills/fable-operator/SKILL.md +1 -4
  70. package/skills/fastapi/SKILL.md +50 -82
  71. package/skills/flutter/SKILL.md +41 -89
  72. package/skills/go/SKILL.md +57 -105
  73. package/skills/harness/SKILL.md +52 -68
  74. package/skills/implement/SKILL.md +1 -1
  75. package/skills/init/SKILL.md +152 -168
  76. package/skills/marketing/SKILL.md +30 -80
  77. package/skills/nextjs/SKILL.md +42 -116
  78. package/skills/orient/SKILL.md +25 -20
  79. package/skills/parallel/SKILL.md +9 -75
  80. package/skills/plan/SKILL.md +92 -165
  81. package/skills/postgresdb/SKILL.md +52 -72
  82. package/skills/presentations/SKILL.md +49 -87
  83. package/skills/python/SKILL.md +23 -72
  84. package/skills/react/SKILL.md +19 -67
  85. package/skills/review/SKILL.md +22 -52
  86. package/skills/rust/SKILL.md +40 -115
  87. package/skills/sdd-init/SKILL.md +9 -14
  88. package/skills/secure-coding/SKILL.md +80 -109
  89. package/skills/ship/SKILL.md +25 -55
  90. package/skills/tasks/SKILL.md +37 -61
  91. package/skills/typescript/SKILL.md +22 -55
  92. package/skills/verify/SKILL.md +8 -32
  93. package/skills/viral-score/SKILL.md +122 -0
  94. package/skills/viral-score/evals/README.md +16 -0
  95. package/skills/viral-score/evals/cases.yaml +50 -0
  96. package/skills/vue-nuxt/SKILL.md +45 -106
  97. package/skills/worktrees/SKILL.md +24 -69
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: author-skill
3
- description: "Use when authoring a NEW skill or editing an existing one for the rsc catalog — writing or fixing a SKILL.md, crafting a trigger-rich third-person description that fires on the right prompts, deciding what goes in references/ vs the body, writing evals/cases.yaml + evals/README.md, or wiring a skill into the catalog (tags, recommends, manifest). Triggers: 'write a skill', 'author a skill', 'create a new skill', 'escribe una skill', 'haz una skill nueva', 'edit this skill', 'improve this skill', 'my skill never triggers', 'my skill always fires', 'fix the description', 'the frontmatter is invalid', 'write evals for this skill', 'add this skill to the catalog', 'audit this skill against the rubric', 'progressive disclosure', 'SKILL.md too long'. Knows the rsc conventions: hybrid layout, tags/recommends frontmatter, manifest.json, the npx @ericrisco/rsc CLI, the Knowledge map. NOT building runtime features (that is the SDD chain) and NOT general docs."
3
+ description: "Use when authoring a NEW rsc skill or editing an existing one — scoping it to one job, writing the description that decides whether it ever loads, splitting the body into references/, writing its evals, auditing it against the rubric. NOT building a product feature (that is `specify`) and NOT designing an agent loop (that is `building-agents`)."
4
4
  tags: [skill, authoring, meta]
5
5
  recommends: []
6
6
  origin: risco
@@ -8,38 +8,13 @@ origin: risco
8
8
 
9
9
  # author-skill — write skills that trigger and teach
10
10
 
11
- This is the **meta skill**: it authors and edits the other skills in the rsc catalog. A skill is two things bolted together — a **description that fires at the right moment**, and a **body that makes the agent better once it fires**. Most skills fail on the first. This skill exists to get both right, to the bar the rsc catalog already holds.
11
+ This is the **meta skill**: it authors and edits the other skills in the rsc catalog. A skill is two things bolted together — a **description that fires at the right moment**, and a **body that makes the agent better once it fires**. Most skills fail on the first. Treat them as two separate engineering problems with two separate quality bars.
12
12
 
13
- It lives in `rsc-core` next to `init` and `harness`, the same way those govern the workspace. Where the SDD chain (`specify` → `plan` → … → `ship`) builds *product*, `author-skill` builds *the tools that build product*. Use it whenever a skill is born or edited.
13
+ Where the SDD chain (`specify` → `plan` → … → `ship`) builds *product*, `author-skill` builds *the tools that build product*. Use it whenever a skill is born or edited.
14
14
 
15
- ## When to use / when NOT to use
15
+ **Not this skill — delegate:** a product feature specced or planned → `../specify/SKILL.md`, `../plan/SKILL.md`. An autonomous agent or tool-calling loop → `../building-agents/SKILL.md`. Generic project docs or a wiki article → the `../harness/SKILL.md` 02-DOCS engine. Bootstrapping a workspace or profiling the user → `../init/SKILL.md`.
16
16
 
17
- Use when:
18
-
19
- - Writing a brand-new skill from a one-line intent ("I keep re-explaining how we do X — make it a skill").
20
- - Editing an existing skill: tightening the description, splitting the body into `references/`, adding a checklist or anti-patterns table.
21
- - A skill mis-triggers — never fires when it should, or fires on everything.
22
- - Writing or repairing `evals/cases.yaml` + `evals/README.md`.
23
- - Wiring a finished skill into the catalog — `tags`, `recommends`, and the manifest (the rsc plumbing).
24
- - Auditing a skill against the rubric below before it ships.
25
-
26
- Do NOT use when (delegate or decline):
27
-
28
- - The user wants to *build a product feature* with a written spec/plan — that is the SDD chain (`../specify/SKILL.md` → `../plan/SKILL.md` → …), not a skill.
29
- - The user wants to design an autonomous agent / tool-calling loop — that is `../building-agents/SKILL.md`.
30
- - The user wants generic project docs or a wiki article — that is the `../harness/SKILL.md` 02-DOCS engine.
31
- - Bootstrapping a workspace or profiling the user — that is `../init/SKILL.md`.
32
-
33
- ## Read the user profile first (accompaniment dial)
34
-
35
- Before writing, read `02-DOCS/wiki/harness/user-profile.md` for the technical level and the accompaniment dial, and **adapt**:
36
-
37
- - **L0** — draft the whole skill, show it, move on. Minimal narration.
38
- - **L1** — one line of *why* per major choice (why this trigger, why split that reference).
39
- - **L2** — justify each structural decision as you make it.
40
- - **L3** — explain everything, ask before committing to a name/scope, walk the rubric out loud.
41
-
42
- When no profile exists, default to non-technical framing and ask the two gauging questions (technical level + dial) before going deep. Skill authoring is itself a technical act — many users will want L2/L3 here even if they run L0 elsewhere.
17
+ Read `02-DOCS/wiki/harness/user-profile.md` and work at the accompaniment dial it records; `../init/SKILL.md` owns that dial and sets it. With no profile, default to non-technical framing and ask for the technical level and the dial before going deep — skill authoring is itself a technical act, so many users want more narration here than they do elsewhere.
43
18
 
44
19
  ## What a skill is (the anatomy)
45
20
 
@@ -55,33 +30,33 @@ skills/<id>/
55
30
  └── verify.sh
56
31
  ```
57
32
 
58
- The **frontmatter** decides *if* the skill loads. The **body** decides *how good* the agent is once it does. Treat them as two separate engineering problems with two separate quality bars.
33
+ The **frontmatter** decides *if* the skill loads. The **body** decides *how good* the agent is once it does.
59
34
 
60
35
  ## The description — the single highest-leverage line
61
36
 
62
- The description is the only part of a skill the agent reads at *every* turn to decide whether to pull the skill in. A vague description is a skill that never fires; an over-broad one is a skill that hijacks unrelated turns. Get this right before anything else.
37
+ The description sits in context on **every turn the skill is installed**, invoked or not. The body is only paid for when the skill fires; the description is paid for always. So length here is a cost, never a credit. A vague description is a skill that never fires; an over-broad one hijacks unrelated turns. Get this right before anything else.
63
38
 
64
39
  Rules, all enforced:
65
40
 
66
41
  1. **Third person, present tense.** "Use when authoring a new skill…" — never "I help you…" or "You should…". The agent is reading *about* the skill.
67
- 2. **Trigger-rich.** Lead with a `Use when …` clause naming the *situations* and *symptoms*, then a `Triggers:` list of concrete phrasings — including non-obvious ones and at least one other language the user actually writes in (rsc users mix Spanish/Catalan). The router matches on these.
68
- 3. **Draw the boundary.** End with what it is **NOT** and which sibling owns that instead. Negative space prevents hijacking as much as positive triggers cause firing.
69
- 4. **≤ 1024 characters, valid single-line quoted YAML.** One physical line, wrapped in double quotes, internal quotes escaped or avoided. If it does not parse, the skill does not load.
42
+ 2. **Discriminative, not exhaustive.** Lead with a `Use when …` clause naming the *situation*, then only the capabilities that separate this skill from its neighbours. Do **not** append a `Triggers: '…', '…'` phrase list: the model matches on meaning, so a keyword bank in three languages buys nothing and is charged on every turn. The test is *discrimination, not coverage* — could a reader pick this skill over its nearest sibling from this line alone?
43
+ 3. **Draw the boundary.** End with a `NOT <x> (that is <sibling>)` clause, naming a sibling that actually exists under `skills/`. Negative space prevents hijacking as much as positive matching causes firing.
44
+ 4. **Aim ≤ 350 characters; 1024 is the schema-enforced hard limit.** One physical line, wrapped in double quotes, internal quotes escaped or avoided. If it does not parse, the skill does not load.
70
45
  5. **`origin: risco`** on its own line. This marks it as ours.
71
46
 
72
47
  ```yaml
73
- # Good — situation + symptoms + phrasings + boundary
74
- description: "Use when X happens or the user shows symptom Y — doing A, fixing B, choosing C. Triggers: 'phrase one', 'frase en español', 'a non-obvious one'. NOT Z (that is `sibling`)."
48
+ # Good — situation, the few capabilities that discriminate, a real boundary
49
+ description: "Use when X happens or the user shows symptom Y — doing A, fixing B, choosing C. NOT Z (that is `sibling`)."
75
50
 
76
- # Bad — first person, no triggers, no boundary, would never route well
51
+ # Bad — first person, no situation, no boundary; competes with every sibling on every turn
77
52
  description: "I help you write great skills and make them work."
78
53
  ```
79
54
 
80
- The full description recipe, the character-budget tactics, and a worked before/after → `references/description-recipe.md`.
55
+ The full recipe, the budget tactics, and a worked before/after → `references/description-recipe.md`.
81
56
 
82
57
  ## Progressive disclosure — the body is an index, not an encyclopedia
83
58
 
84
- The body is loaded in full whenever the skill fires, so every line competes for the agent's attention. Keep the body **~120–400 lines**: the method, the rules, the decision points, and *pointers* to depth. Push anything long, reference-like, or rarely-needed into `references/<topic>.md` and link to it inline ("full table → `references/foo.md`").
59
+ The body is loaded in full whenever the skill fires, so every line competes for the agent's attention. Write **the smallest body that still routes correctly**: 400 lines is a ceiling, not a target, and there is no floor — a skill that does its job in 60 lines beats the same skill padded to 200. Push anything long, reference-like, or rarely-needed into `references/<topic>.md` and link it inline at the point of use ("full table → `references/foo.md`").
85
60
 
86
61
  Decide where a paragraph lives:
87
62
 
@@ -92,12 +67,12 @@ Decide where a paragraph lives:
92
67
  | It is short and load-bearing | It is reference detail that would bloat the body |
93
68
  | Cutting it would change behavior | It is an example that illustrates but does not instruct |
94
69
 
95
- If the body creeps past ~400 lines, that is the signal to extract a reference — not to keep scrolling. A skill the agent half-reads is worse than a short one it reads fully.
70
+ Every file under `references/` must be linked from the body. An unlinked reference is never loaded, so it is dead weight in the package — link it or delete it.
96
71
 
97
72
  ## The hybrid structure — when each piece earns its place
98
73
 
99
74
  - **SKILL.md** — always. Frontmatter + focused body.
100
- - **references/** — only when the body genuinely needs offloaded depth. Do not create an empty `references/` to look complete; a 150-line single-file skill is fine.
75
+ - **references/** — only when the body genuinely needs offloaded depth. Do not create an empty `references/` to look complete; a single-file skill is fine.
101
76
  - **evals/** — always. `cases.yaml` + `README.md`. A skill with no evals is unverifiable and does not ship.
102
77
  - **scripts/verify.sh** — only when the skill produces a *checkable artifact* (code, config, copy with a ban-list). **Process skills** — those judged on the safety rails they install in the agent's behavior, like the SDD-phase skills or this one — do **not** ship a `verify.sh`; their evals carry a capability scenario instead.
103
78
 
@@ -119,10 +94,10 @@ The full protocol lives once in the `orient` skill; the footer only references i
119
94
  Run in order. Each step gates the next.
120
95
 
121
96
  1. **Name & scope.** One skill, one job. Pick a short kebab-case `<id>` that is the job, not the domain. If you can not say the job in one sentence, the scope is wrong — split it. Check no sibling already owns this; if one half-owns it, decide *edit the sibling* vs *new skill* before writing.
122
- 2. **Draft the description.** Per the recipe above. This first, because writing it forces the scope clear. → `references/description-recipe.md`.
97
+ 2. **Draft the description.** Per the rules above. This first, because writing it forces the scope clear. → `references/description-recipe.md`.
123
98
  3. **Outline the body.** Method, rules, decision points. Mark what becomes a reference.
124
- 4. **Write the body** in the rsc voice (see below). Tag every code/example fence with a language. Add a copy-able checklist or decision table *only where the flow actually branches* — not as decoration. Add a short anti-patterns table.
125
- 5. **Extract references** for anything long or branch-specific.
99
+ 4. **Write the body** in the rsc voice (see below). Tag every code/example fence with a language. Add a checklist or decision table *only where the flow actually branches* — not as decoration. Add a short anti-patterns table.
100
+ 5. **Extract references** for anything long or branch-specific, and link each one inline.
126
101
  6. **Write the evals** — `cases.yaml` then `README.md`. → `references/eval-authoring.md`.
127
102
  7. **Wire it into the rsc plumbing** (`tags`, `recommends`, `npm run manifest`, and indexing any artifact in `02-DOCS/wiki/index.md` — the Knowledge map; root `CLAUDE.md` keeps only a short pointer). → `references/rsc-conventions.md`.
128
103
  8. **Self-audit against the rubric** (below). Fix every miss or justify it.
@@ -132,7 +107,7 @@ Run in order. Each step gates the next.
132
107
  Match the catalog, do not invent a new register:
133
108
 
134
109
  - Direct, second-person-to-the-agent instruction ("Read the profile first", "Cut any section with no job").
135
- - Rules stated as non-negotiables with a one-line *why*, not a lecture.
110
+ - A rule gets stated where it applies, with a one-line *why* that makes it obviously absolute — not a lecture, and not a shouted NON-NEGOTIABLE.
136
111
  - Concrete over abstract: a number, a path, a Bad→Good pair beats an adjective.
137
112
  - Original prose. Mine ideas from anywhere; the words are Eric's. Do **not** reproduce another ecosystem's signature artifacts or phrasing — no borrowed "1% chance" urgency blocks, no copied rationalization wording, no `*-reviewer-prompt.md` files, no verbatim flowcharts. The rsc identity is its own.
138
113
  - Cross-reference siblings by name or `../<sibling>/SKILL.md`, only ones that actually exist.
@@ -147,27 +122,27 @@ attends to the named token), and can do *worse* than saying nothing at all. Matc
147
122
 
148
123
  | The failure is… | Use this form | Why, and example |
149
124
  | --- | --- | --- |
150
- | **Discipline** — the agent knows the rule but skips it under pressure (time, sunk cost, "just this once") | **Prohibition + rationalization table** (`Anti-patterns → STOP`) | The agent already knows what's right; it needs the excuse pre-refuted at the moment of temptation. This is exactly what the `STOP` tables are for. "I'll skip the failing test to ship" → name the rationalization, kill it. |
125
+ | **Discipline** — the agent knows the rule but skips it under pressure (time, sunk cost, "just this once") | **The rule stated at the step it governs, with its why** — plus one row in the anti-patterns table | A rule in an appendix is skimmed; a rule in context is followed. "Do not ship a failing test — a red test merged is a lie in the suite", written at the ship step. Do not build a separate rationalization bank restating rules already in the flow; it is paid for on every load and read as decoration. |
151
126
  | **Wrong-shaped output** — tone, verbosity, format, structure come out wrong | **Positive recipe / contract** (show the target shape) | A prohibition ("don't be verbose", "no marketing fluff") makes it *more* likely — the model fixates on the banned shape. Give the shape to hit instead: "Reply in ≤3 sentences, lead with the verdict." Demonstrate, don't forbid. |
152
127
  | **Omitted element** — the agent forgets a required piece | **Required structural slot** (a checklist item or a template field it must fill) | You can't prohibit an absence. Make the slot mandatory so its emptiness is visible — a `Done-of-done` checkbox, a template section, a result-envelope field. |
153
128
  | **Conditional behavior** — right action depends on the situation | **Predicate-keyed conditional** ("When X → do Y; otherwise Z") | A flat rule fires in the wrong context. Key the behavior to its trigger so the agent branches correctly instead of over- or under-applying. |
154
129
 
155
- So: keep the `Anti-patterns → STOP` tables — they're the correct tool for *discipline* failures,
156
- which is most of what the SDD-discipline skills guard. But when you catch yourself writing "don't
157
- make it X" about the *shape* of an output, stop and rewrite it as the shape to hit. Prohibition is
158
- a scalpel for one failure type, not the default for all of them.
130
+ So: an anti-patterns table earns its place when it names concrete **failure modes** the flow above
131
+ does not already state. A table that re-lists rules from the body is pure cost — delete it and move
132
+ each rule to its step. And when you catch yourself writing "don't make it X" about the *shape* of an
133
+ output, rewrite it as the shape to hit.
159
134
 
160
135
  ## The best-practice rubric (audit before shipping)
161
136
 
162
137
  A skill ships only when every box is checked or a miss is consciously justified.
163
138
 
164
139
  - [ ] **Frontmatter parses** as YAML; `name` matches the directory `<id>`; `origin: risco` present.
165
- - [ ] **Description ≤ 1024 chars**, third-person, `Use when…` lead, concrete `Triggers:` (incl. a non-obvious and a non-English phrasing), and a `NOT … (that is sibling)` boundary.
140
+ - [ ] **Description** third-person, `Use when…` lead, an explicit `NOT … (that is sibling)` boundary naming a real sibling, ≤ 350 chars target / ≤ 1024 hard limit — judged on discrimination against the nearest sibling, not coverage.
166
141
  - [ ] **One job.** The body never drifts into a second skill's territory; it delegates instead.
167
- - [ ] **Body 120–400 lines**, focused; long/branch-specific material lives in `references/`.
168
- - [ ] **Progressive disclosure** real — references are pointed to inline, not orphaned.
142
+ - [ ] **Body ≤ 400 lines** — a ceiling, not a target, with no floor. Long/branch-specific material lives in `references/`.
143
+ - [ ] **Every `references/` file linked** inline from the body; none orphaned.
169
144
  - [ ] **Every fence language-tagged**; no placeholder/TODO prose; examples concrete.
170
- - [ ] **Checklist/decision table only where a flow branches**; an **anti-patterns table** present.
145
+ - [ ] **Checklist/decision table only where a flow branches**; an **anti-patterns table** present, naming failure modes rather than restating rules.
171
146
  - [ ] **Accompaniment dial honored** — reads the profile, adapts verbosity.
172
147
  - [ ] **Artifacts under `02-DOCS/wiki/`** and indexed in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer), if the skill produces any.
173
148
  - [ ] **Concrete tooling delegated** to the stack skills rather than reinvented.
@@ -199,28 +174,20 @@ only when **both** are green:
199
174
  A failing `lift` means the body adds nothing a bare agent didn't already do — fix the body,
200
175
  don't game the checklist.
201
176
 
202
- ## Anti-patterns / rationalizations → STOP
177
+ ## Anti-patterns
203
178
 
204
- | Rationalization | Reality / fix |
179
+ | Failure mode | Reality / fix |
205
180
  | --- | --- |
206
- | "I'll polish the description later, the body matters more" | The description is *why the body ever runs*. Write it first, to bar. |
207
- | "More triggers = fires more = better" | Over-broad descriptions hijack unrelated turns. Add the `NOT` boundary and prune. |
208
- | "One skill that does specify + plan + implement is convenient" | One skill, one job. A multi-job skill triggers fuzzily and teaches poorly. Split it. |
209
- | "The body is long because the topic is rich" | Past ~400 lines the agent skims. Extract references; keep the body an index. |
210
- | "I'll skip evals, I'll just test it by hand once" | Unverifiable = does not ship. Write `cases.yaml`, including near-misses with `route_to`. |
211
- | "It's basically superpowers' writing-skills, I'll mirror it" | Mine the idea, write it in the rsc voice. Copied artifacts/phrasing are a defect. |
212
- | "I'll add a `references/` folder so it looks thorough" | Empty references are noise. Add depth only where the body points to it. |
213
- | "verify.sh on every skill is more rigorous" | A process skill has no artifact to grep. Its rigor is the capability eval. |
214
- | "Linking `../foo/SKILL.md` is fine even if foo isn't in this repo" | A dead link is a defect. Reference only siblings that exist. |
181
+ | Description written last, once the body is done | The description is *why the body ever runs*, and drafting it first forces the scope clear. Write it first, to bar. |
182
+ | Description padded for coverage — more phrasings, more languages, more verbs | It is in context on every turn, invoked or not. Prune until it discriminates against the nearest sibling and stops. |
183
+ | One skill covering specify + plan + implement | Multi-job skills trigger fuzzily and teach poorly. One skill, one job — split it. |
184
+ | Body grown past ~400 lines "because the topic is rich" | The agent skims what it cannot hold. Extract a reference and link it inline. |
185
+ | A `references/` folder added to look thorough, or a reference nothing links to | An unlinked reference is never loaded — dead weight in the package. Link it at point of use or delete it. |
186
+ | Evals skipped: "I'll just test it by hand once" | Unverifiable = does not ship. Write `cases.yaml`, near-misses with `route_to` included. |
187
+ | `verify.sh` added to a process skill for rigor | A process skill has no artifact to grep. Its rigor is the capability eval. |
188
+ | `../foo/SKILL.md` linked to something not in this repo | A dead link is a defect. Verify the directory exists under `skills/`. |
189
+ | Another catalog mirrored wholesale ("it's basically superpowers' writing-skills") | Mine the idea, write it in the rsc voice. Copied artifacts or phrasing are a defect. |
215
190
 
216
191
  ## Project grounding (02-DOCS + CLAUDE.md)
217
192
 
218
193
  When authoring produces a durable design note (a skill's scope decision, a description rationale worth keeping), persist it under `02-DOCS/wiki/sdd/` and index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer), per the `../harness/SKILL.md` convention — never a stray file at the repo root. The skill's own `evals/` is the executable record of intent; the wiki note is the human-readable why.
219
-
220
- ## See Also
221
-
222
- - `../harness/SKILL.md` — the 02-DOCS Knowledge-map convention these artifacts live in; the bar this catalog holds.
223
- - `../init/SKILL.md` — the front door that profiles the user and sets the dial this skill reads.
224
- - `../building-agents/SKILL.md` — for autonomous agents/tool-loops, a different craft than authoring a skill.
225
- - `../specify/SKILL.md` — when the user wants a *product feature* specced, not a skill authored.
226
- - References: `references/description-recipe.md`, `references/eval-authoring.md`, `references/rsc-conventions.md`.
@@ -44,11 +44,11 @@ the skill — or these rubrics — needs work.
44
44
 
45
45
  What a WITH-skill answer should show that a baseline misses:
46
46
 
47
- - **Description first**, to the recipe: third-person `Use when…` lead, concrete `Triggers:`
48
- (incl. a non-obvious and a non-English phrasing), a `NOT … (sibling)` boundary, valid
49
- single-line quoted YAML ≤ 1024 chars, `origin: risco`.
50
- - **Progressive disclosure** — a focused 120–400 line body that points into `references/`, not
51
- an encyclopedia and not an orphaned references folder.
47
+ - **Description first**, to the recipe: third-person `Use when…` lead, only the capabilities that
48
+ discriminate it from its nearest sibling, a `NOT … (sibling)` boundary, valid single-line quoted
49
+ YAML aiming ≤ 350 chars (1024 hard limit), `origin: risco`.
50
+ - **Progressive disclosure** — the smallest body that still routes (400 lines is a ceiling, not a
51
+ target) pointing into `references/`, not an encyclopedia and not an orphaned references folder.
52
52
  - **evals authored** to the minimums, with `route_to` siblings that actually exist.
53
53
  - **No `verify.sh` on a process skill** — rigor comes from the capability eval.
54
54
  - **rsc wiring** named: `tags` + `recommends` frontmatter, `npm run manifest` regenerated,
@@ -1,8 +1,8 @@
1
1
  skill: author-skill
2
2
 
3
3
  # Cases for the rsc-core "author-skill" meta skill.
4
- # author-skill authors or edits a SKILL.md to the rsc catalog bar: a trigger-rich
5
- # third-person description (<=1024, valid YAML, origin: risco), a focused body with
4
+ # author-skill authors or edits a SKILL.md to the rsc catalog bar: a discriminating
5
+ # third-person description (~350 chars, valid YAML, origin: risco), a focused body with
6
6
  # progressive disclosure into references/, the best-practice rubric, and an
7
7
  # evals/cases.yaml + README for the NEW skill, plus the rsc plumbing (tags,
8
8
  # recommends, manifest.json, Knowledge map). It is NOT for building a
@@ -20,7 +20,7 @@ should_trigger:
20
20
  why: "Non-obvious symptom phrasing (no mention of 'skill authoring') pointing straight at the description craft — diagnosing/repairing a description that fails to route is exactly this skill's highest-leverage area."
21
21
 
22
22
  - prompt: "This SKILL.md is 600 lines and feels bloated. Help me restructure it."
23
- why: "Edit/refactor of an existing skill toward progressive disclosure — author-skill's body-vs-references decision table and the 120-400 line target are the direct fix."
23
+ why: "Edit/refactor of an existing skill toward progressive disclosure — author-skill's body-vs-references decision table and the 400-line ceiling are the direct fix."
24
24
 
25
25
  - prompt: "Write the evals/cases.yaml for the skill I just drafted, with trigger and capability tests."
26
26
  why: "Eval authoring for a skill is squarely owned here (the should_trigger/should_not_trigger/route_to and capability rubric minimums) — a deliberately specific, non-obvious trigger."
@@ -57,8 +57,8 @@ capability:
57
57
  must_include:
58
58
  - "Reads 02-DOCS/wiki/harness/user-profile.md for the accompaniment dial (or asks the two gauging questions if absent) and adapts verbosity"
59
59
  - "Confirms scope is one job and checks no existing sibling already owns PR-description authoring before creating a new skill"
60
- - "Drafts the description FIRST: third-person, 'Use when…' lead, concrete Triggers including a non-obvious symptom phrasing and a non-English one, a 'NOT … (that is `sibling`)' boundary, valid single-line quoted YAML <=1024 chars, with origin: risco"
61
- - "Produces a focused body (~120-400 lines) with progressive disclosure — long/branch-specific detail pushed to references/ and pointed to inline, not an orphaned references/ folder"
60
+ - "Drafts the description FIRST: third-person, 'Use when…' lead, only the capabilities that discriminate it from its nearest sibling, a 'NOT … (that is `sibling`)' boundary, valid single-line quoted YAML aiming <=350 chars (1024 hard limit), with origin: risco"
61
+ - "Produces the smallest body that still routes (400 lines is a ceiling, not a target) with progressive disclosure — long/branch-specific detail pushed to references/ and pointed to inline, not an orphaned references/ folder"
62
62
  - "Language-tags every code/example fence and includes an anti-patterns table; adds a checklist/decision table only where a flow actually branches"
63
63
  - "Writes evals/cases.yaml meeting the minimums (>=5 should_trigger incl. non-obvious, >=4 should_not_trigger each with a real-sibling route_to, >=1 capability with a must_include rubric) plus an honest evals/README.md describing the two-axis run"
64
64
  - "Decides NO scripts/verify.sh because a PR-description skill is a process skill judged on its capability eval, OR includes verify.sh only if it emits a checkable artifact — and justifies the choice"
@@ -67,9 +67,9 @@ capability:
67
67
 
68
68
  - scenario: "A user pastes a skill whose description is 'I help you with deployments' and says 'it fires on everything and also misses real deploy questions — fix the triggering.' Show the description repair."
69
69
  must_include:
70
- - "Diagnoses the two failure modes: first-person + no boundary causes hijacking; no concrete Triggers/situation causes misses"
70
+ - "Diagnoses the two failure modes: first-person + no boundary causes hijacking; no situation clause causes misses"
71
71
  - "Rewrites to third-person with a 'Use when…' situation lead and concrete verb phrases"
72
- - "Adds a Triggers: list of real phrasings including a non-obvious symptom and a non-English one"
72
+ - "Keeps only the capabilities that discriminate deployment work from its nearest siblings, rather than padding a keyword list for coverage"
73
73
  - "Adds a 'NOT … (that is `sibling`)' boundary naming the real sibling(s) that own the excluded turns to stop hijacking"
74
- - "Verifies the result is valid single-line quoted YAML and <=1024 chars (e.g. via the python YAML/length check) and keeps origin: risco"
74
+ - "Verifies the result is valid single-line quoted YAML, aims <=350 chars against the 1024 hard limit, and keeps origin: risco"
75
75
  - "Recommends updating evals/cases.yaml (especially should_not_trigger with route_to) and re-running the triggering eval, since description edits are wording-sensitive"
@@ -1,67 +1,66 @@
1
1
  # The description recipe
2
2
 
3
- The description is the only line the router reads on every turn to decide whether to load the skill. It is a *retrieval problem*, not a marketing problem. Write it to be matched, not admired.
3
+ The description is the only line the router reads on every turn to decide whether to load the skill — and it sits in context on every turn the skill is installed, invoked or not. It is a *retrieval problem*, not a marketing problem. Write it to be matched, not admired, and keep it short: length here is a cost, never a credit.
4
4
 
5
5
  ## The shape
6
6
 
7
7
  ```text
8
8
  "Use when <SITUATION / SYMPTOM> — <verb phrase>, <verb phrase>, <verb phrase>.
9
- Triggers: '<phrase>', '<frase en español>', '<non-obvious phrase>', ….
10
- [Optional one clause naming what it KNOWS / owns.]
11
- NOT <out-of-scope thing> (that is `sibling`) and NOT <other> (that is `sibling`)."
9
+ NOT <out-of-scope thing> (that is `sibling`) [and NOT <other> (that is `sibling`)]."
12
10
  ```
13
11
 
14
- Four moves, in order:
12
+ Three moves, in order:
15
13
 
16
- 1. **Lead with the situation.** The first clause is a `Use when …` that names *when in the user's day* this fires — the moment, the symptom, the pain. The router matches situations better than nouns. "Use when a skill mis-triggers" beats "skill quality tool".
17
- 2. **List concrete verb phrases.** Right after the lead, name the 3–6 things the skill actually does, as verbs ("writing a description", "splitting the body", "repairing cases.yaml"). These are dense match surface.
18
- 3. **Add a `Triggers:` phrase list.** Real phrasings a user types — quoted. Include:
19
- - at least one **non-obvious** phrasing (a symptom, not the skill's name): e.g. "my skill never triggers".
20
- - at least one **non-English** phrasing (rsc users write Spanish/Catalan): e.g. "escribe una skill".
21
- - the slash-command form if relevant.
22
- 4. **Close with the boundary.** One or two `NOT … (that is `sibling`)` clauses. This is not optional decoration — negative space is what stops the skill from hijacking adjacent turns. Name the *real* sibling that owns the excluded job.
14
+ 1. **Lead with the situation.** The first clause is a `Use when …` that names *when in the user's day* this fires — the moment, the symptom, the pain. The model matches situations better than nouns. "Use when a skill mis-triggers" beats "skill quality tool".
15
+ 2. **Name only the discriminating capabilities.** Right after the lead, name the few things the skill does that its neighbours do not, as verbs ("writing a description", "splitting the body", "repairing cases.yaml"). Stop there. Do **not** append a `Triggers: '…', '…'` phrase list: the model matches on meaning, so a keyword bank — especially one repeated in three languages — buys no routing accuracy and is charged on every turn.
16
+ 3. **Close with the boundary.** One or two `NOT … (that is `sibling`)` clauses. This is not optional decoration — negative space is what stops the skill from hijacking adjacent turns. Name the *real* sibling that owns the excluded job, and verify it exists under `skills/`.
17
+
18
+ ## The test: discrimination, not coverage
19
+
20
+ Do not ask "does this cover every way someone might phrase it?" — ask **"could a reader pick this skill over its nearest sibling from this line alone?"** Coverage is what tempts you to pad; discrimination is what actually routes. If two versions route the same, the shorter one is better.
23
21
 
24
22
  ## The hard constraints
25
23
 
26
- - **≤ 1024 characters.** Count them. Over budget = trim verb phrases and trigger duplicates first, never the boundary.
24
+ - **Aim ≤ 350 characters; 1024 is the schema-enforced hard limit.** Over budget = trim verb phrases first, never the boundary.
27
25
  - **Valid single-line quoted YAML.** The description is one physical line wrapped in double quotes. No raw newlines inside the value. Avoid characters that break YAML in double quotes; if you need an apostrophe inside, it is fine (single quotes are literal inside double-quoted YAML). Never put an unescaped `"` inside.
28
26
  - **Third person, present tense.** The agent reads *about* the skill. "Use when…", "Triggers on…", "Knows…". Never "I", never "you should".
29
- - **State triggers and boundary — never the workflow.** The description says *when* to fire and *what it is not*. It must **not** summarize the procedure the body owns (the steps, the phase count, "does X then Y then Z"). This is not a style nit — it changes behavior. A description that pre-summarizes the steps becomes a *substitute* for reading the body: the agent acts on the summary and skips the real instructions. (Observed in the wild: a skill whose description said it runs *two* reviews made the agent run only *one*, because the summary was treated as the spec; deleting the workflow summary made the agent read the body and do both.) The verb phrases in move #2 name *capabilities* ("repairing cases.yaml"), not an ordered recipe ("first lint, then split, then validate"). If your description tells the reader how the skill works step by step, cut it down to triggers + boundary.
27
+ - **State when it fires and where the boundary is — never the workflow.** The description says *when* to fire and *what it is not*. It must **not** summarize the procedure the body owns (the steps, the phase count, "does X then Y then Z"). This is not a style nit — it changes behavior. A description that pre-summarizes the steps becomes a *substitute* for reading the body: the agent acts on the summary and skips the real instructions. (Observed in the wild: a skill whose description said it runs *two* reviews made the agent run only *one*, because the summary was treated as the spec; deleting the workflow summary made the agent read the body and do both.) The verb phrases in move #2 name *capabilities* ("repairing cases.yaml"), not an ordered recipe ("first lint, then split, then validate"). If your description tells the reader how the skill works step by step, cut it back to situation + boundary.
30
28
 
31
- ## Budget tactics when you blow 1024
29
+ ## Budget tactics when you are over
32
30
 
33
31
  In priority order, cut:
34
32
 
35
- 1. Duplicate triggers that match the same situation ("write a skill" + "create a skill" — keep one).
36
- 2. Verb phrases already implied by a trigger phrase.
37
- 3. The optional "Knows…" clause.
33
+ 1. Verb phrases that name a capability the nearest sibling shares — they add no discrimination.
34
+ 2. Verb phrases already implied by the `Use when` lead.
35
+ 3. Any "Knows…" / "Understands…" clause.
38
36
  4. Shorten the boundary to one `NOT` clause naming the single most-confused sibling.
39
37
 
40
- Never cut: the `Use when` lead, at least 3 distinct triggers, one non-English trigger, one `NOT` boundary.
38
+ Never cut: the `Use when` lead, or the last `NOT` boundary.
41
39
 
42
40
  ## Worked before → after
43
41
 
44
- **Before** (first person, no triggers, no boundary — 71 chars, would route badly):
42
+ **Before** (first person, no situation, no boundary — 71 chars, would route badly):
45
43
 
46
44
  ```yaml
47
45
  description: "I help you write and improve skills so they work well."
48
46
  ```
49
47
 
50
- Problems: first person; no `Use when`; zero concrete phrasings for the router; no boundary, so it competes with `building-agents`, `specify`, and `init` on every "make a thing" turn.
48
+ Problems: first person; no `Use when`; nothing that says *when* this fires; no boundary, so it competes with `building-agents`, `specify`, and `init` on every "make a thing" turn.
51
49
 
52
- **After** (third person, situation + verbs + phrasings + boundary, valid YAML, well under 1024):
50
+ **After** (third person, situation + discriminating verbs + boundary, valid YAML, ~300 chars):
53
51
 
54
52
  ```yaml
55
- description: "Use when authoring a NEW skill or editing an existing one — writing a trigger-rich description, splitting a long body into references/, repairing evals/cases.yaml, or fixing a skill that never fires. Triggers: 'write a skill', 'escribe una skill', 'my skill never triggers', 'the description is too broad', 'audit this skill'. NOT building a product feature (that is `specify`) and NOT designing an agent loop (that is `building-agents`)."
53
+ description: "Use when authoring a NEW skill or editing an existing one — writing the description that decides whether it loads, splitting a long body into references/, repairing evals/cases.yaml, or fixing a skill that never fires. NOT building a product feature (that is `specify`) and NOT designing an agent loop (that is `building-agents`)."
56
54
  ```
57
55
 
58
56
  ## Quick test
59
57
 
60
58
  Before committing a description, ask:
61
59
 
62
- - Could the router tell from this line alone *when* to fire it? (situation present)
63
- - Are there phrasings a real user would type, in their language? (triggers present)
64
- - Does it say what it is **not**, naming the sibling? (boundary present)
60
+ - Could the reader tell from this line alone *when* to fire it? (situation present)
61
+ - Could the reader pick it over its nearest sibling from this line alone? (discriminates)
62
+ - Does it say what it is **not**, naming a sibling that exists? (boundary present)
63
+ - Is anything in it there for coverage rather than discrimination? (cut it)
65
64
  - Does it describe *when/what-not*, and **never** the step-by-step procedure? (no workflow summary — if a reader could skip the body and act on the description alone, it leaks the workflow)
66
65
  - Does it parse as YAML and fit 1024? (run the check)
67
66
 
@@ -59,7 +59,7 @@ For `author-skill`, the natural confusables are `specify`/`plan` (building a fea
59
59
 
60
60
  ## Writing good `capability` cases
61
61
 
62
- The `must_include` points are the differentiators — the specific things a *good* answer shows that a baseline answer misses. Make them **gradeable**: name the rule, the file path, the structural choice. "Writes a good skill" is not gradeable; "produces a third-person description ≤1024 with a `Use when` lead, a `NOT … (sibling)` boundary, and at least one non-English trigger" is.
62
+ The `must_include` points are the differentiators — the specific things a *good* answer shows that a baseline answer misses. Make them **gradeable**: name the rule, the file path, the structural choice. "Writes a good skill" is not gradeable; "produces a third-person description under ~350 chars with a `Use when` lead and a `NOT … (sibling)` boundary naming a sibling that exists" is.
63
63
 
64
64
  For a process skill (no `verify.sh`), the capability scenario is the *primary* rigor — it is how you prove the safety rails actually change behavior. Make it count.
65
65
 
@@ -33,7 +33,7 @@ Every `SKILL.md` frontmatter MUST satisfy `schema/frontmatter.schema.json`:
33
33
  ```yaml
34
34
  ---
35
35
  name: my-skill # lowercase-kebab, matches the directory id
36
- description: Use when ... # trigger-rich, third-person
36
+ description: Use when ... # third-person, situation + NOT boundary, ~350 chars
37
37
  tags: [keyword, keyword] # what the consult advisor searches over (≥1)
38
38
  recommends: [sibling-skill] # what the system offers to install next (real ids)
39
39
  profiles: [core, full] # optional: named-profile membership
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: automation-flows
3
- description: "Use when building or fixing a no-code automation on n8n, Make, or Zapier — wiring a trigger to multi-app steps with branching, data mapping, retries, and an error path, or choosing the platform by its billing model. Triggers: 'wire up a Zap / Make scenario / n8n workflow that does X when Y happens', 'new Stripe payment → Notion row → Slack message in n8n', 'my Zap keeps failing silently, add error handling and retries', 'should I use Make or Zapier for 50k runs a month', 'my automation bill exploded', 'give me the JSON to import into n8n', 'automatiza esto en Make sin código', 'munta un workflow a n8n amb gestió d'errors', 'por qué se me dispara el Zap dos veces'. NOT writing a typed API client in code with auth/pagination/backoff (that is api-connector-builder), NOT building the inbound endpoint that receives and verifies webhook events in your own app (that is webhooks), NOT scripting one vendor's SDK directly (that is stripe / notion-connector / google-workspace / whatsapp-telegram)."
3
+ description: "Use when building or fixing a no-code automation on n8n, Make, or Zapier — trigger to multi-app steps with data mapping, dedup, retries and an error path — or picking the platform by billing unit (task vs credit vs execution). NOT a typed API client in code (that is api-connector-builder), NOT a webhook receiver in your own app (that is webhooks)."
4
4
  tags: [automation, n8n, make, zapier, no-code, workflows, error-handling, integrations]
5
5
  recommends: [automation-strategy, n8n, make, zapier, power-automate, webhooks, api-connector-builder, error-handling, stripe, notion-connector, google-workspace, whatsapp-telegram]
6
6
  profiles: []
@@ -9,16 +9,12 @@ origin: risco
9
9
 
10
10
  # Automation flows — glue many SaaS apps on a visual platform, with an error path that actually fires
11
11
 
12
- You are building a working automation on a hosted visual platform: a trigger, a chain of app actions with branching and explicit data mapping, and — non-negotiably — an error-handling and retry strategy. A flow that has no error path is not done. It is a silent failure waiting for the day the API hiccups and nobody notices the orders stopped syncing.
12
+ You are building a working automation on a hosted visual platform: a trigger, a chain of app actions with branching and explicit data mapping, and an error-handling and retry strategy without which the flow is not done.
13
13
 
14
14
  Your job is two things at once: **platform judgement** (pick n8n vs Make vs Zapier by the constraints) and a **buildable artifact** (an importable n8n workflow JSON, or a precise numbered build sheet for Make/Zapier, which have no portable export).
15
15
 
16
16
  This skill stops the moment the right answer is real code. Writing a typed API client → `../api-connector-builder/SKILL.md`. Building the endpoint that *receives* a webhook in your own app → `../webhooks/SKILL.md`. Scripting one vendor directly → `../stripe/SKILL.md`, `../notion-connector/SKILL.md`, `../google-workspace/SKILL.md`, `../whatsapp-telegram/SKILL.md`.
17
17
 
18
- ## The iron rule
19
-
20
- Every flow ships with an error path. Before you call a flow done, you must be able to point at: where a failed run goes, how many times it retries, and who gets told. No exceptions.
21
-
22
18
  ## 1. Pick the platform
23
19
 
24
20
  The single most expensive mistake is choosing on familiarity instead of cost model. The three platforms bill on fundamentally different units, and at volume that gap is 10×.
@@ -60,7 +56,7 @@ Good: Trigger = Airtable "new record" webhook → fires the instant
60
56
 
61
57
  ## 3. Error handling — the spine
62
58
 
63
- This is what separates a toy from production. Full per-platform recipes (including the manual exponential-backoff loop) live in `references/error-handling.md`; here is the working core.
59
+ Every flow ships with an error path, because a flow without one is a silent failure waiting for the day the API hiccups and nobody notices the orders stopped syncing. Before you call a flow done you must be able to point at three things: where a failed run goes, how many times it retries, and who gets told. Full per-platform recipes (including the manual exponential-backoff loop) live in `references/error-handling.md`, and the retry/backoff theory under them in `../error-handling/SKILL.md`; here is the working core.
64
60
 
65
61
  **n8n.** Build a dedicated **Error Workflow** that begins with the **Error Trigger** node — it runs only when a monitored workflow fails. Wire it to Slack/email/a log row, then set it as the main flow's `settings.errorWorkflow`. On risky nodes (anything hitting an external API) toggle **Retry On Fail** (Max Tries 3–5, set a Wait between tries) and, where a single failed item shouldn't kill the run, **Continue On Fail** (the node emits an error object instead of halting). n8n's built-in retry is **linear** — for true exponential backoff you build a wait/loop yourself (recipe in references).
66
62
 
@@ -108,7 +104,9 @@ Good: webhook → lookup event_id in store →
108
104
 
109
105
  **If n8n is chosen, produce an importable workflow JSON** the user can paste into *Import from File/Clipboard*. It must have a non-empty `nodes` array (including a trigger node), a `connections` object, and `settings.errorWorkflow` pointing at the Error Workflow. Reference credentials by the n8n **credential store**, never paste secrets inline. Full schema and a minimal trigger→action→error example: `references/n8n-workflow-json.md`.
110
106
 
111
- **If Make or Zapier is chosen, produce a numbered build sheet** — neither has a portable export you can hand over. One row per step: `# | app | action | field mapping (source → target) | error directive`. End with the trigger type and the dedup key. The capability eval covers these prose sheets; `verify.sh` covers the JSON.
107
+ **If Make or Zapier is chosen, produce a numbered build sheet** — neither has a portable export you can hand over. One row per step: `# | app | action | field mapping (source → target) | error directive`. End with the trigger type and the dedup key.
108
+
109
+ Run `scripts/verify.sh` on any JSON you emit: read-only, no network, no credentials — it parses the file and checks a non-empty `nodes` array, a `connections` object, and ≥1 trigger node (exits 0 on an empty target).
112
110
 
113
111
  ## Anti-patterns
114
112
 
@@ -122,11 +120,3 @@ Good: webhook → lookup event_id in store →
122
120
  | Secrets pasted inline in a node | Leaked in exports, unrotatable, shared everywhere | Use the platform credential store, reference by name |
123
121
  | One mega-flow doing everything | Unreadable, untestable, one failure nukes all | Split: trigger → sub-flow per concern |
124
122
  | Choosing platform by familiarity | Bill 10× higher than the right unit; "my automation bill exploded" | Pick by billing unit (task vs op vs execution) up front |
125
-
126
- ## References & verification
127
-
128
- - `references/error-handling.md` — per-platform error deep dive, the manual exponential-backoff loop for n8n, and the three dedup patterns.
129
- - `references/n8n-workflow-json.md` — importable n8n JSON schema, minimal example, import steps, what `verify.sh` checks.
130
- - `scripts/verify.sh` — read-only; validates any `*.json` workflow you emit (parses, non-empty `nodes`, `connections` object, ≥1 trigger node). No network, no credentials. Exits 0 on an empty target.
131
-
132
- Cross-skills: webhook receiver → `../webhooks/SKILL.md`; typed API client in code → `../api-connector-builder/SKILL.md`; deeper retry/backoff theory → `../error-handling/SKILL.md`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: automation-strategy
3
- description: "Use when deciding whether a process is worth automating, choosing an automation platform, sizing ROI / build-vs-buy, designing an automation strategy, or diagnosing why a fleet of automations keeps breaking — the discipline layer that runs BEFORE anyone builds. Triggers: 'should we automate this?', 'is this worth automating', 'n8n vs Make vs Zapier vs Power Automate — which do we pick', 'custom script or no-code platform', \"what's the ROI on automating X\", 'design our automation strategy', 'our automations keep breaking', 'automating this cost more than it saved', '¿merece la pena automatizar esto?', 'qué plataforma de automatización elegimos'. NOT building the flow on a platform (design + importable artifact is automation-flows; driving a live platform API/MCP is the n8n / make / zapier / power-automate skills), NOT a typed API client with auth/pagination/backoff (api-connector-builder), NOT the inbound endpoint that receives webhook events in your app (webhooks)."
3
+ description: "Use when deciding whether a process is worth automating, sizing ROI and build-vs-buy, choosing an automation platform, or diagnosing why a fleet of automations keeps breaking — the decision layer before anyone builds. NOT building the flow (that is `automation-flows`, or `n8n` / `make` / `zapier` / `power-automate` to drive a live platform)."
4
4
  tags: [automation, strategy, roi, build-vs-buy, platform-selection, orchestration, idempotency, n8n, make, zapier, power-automate]
5
5
  recommends: [automation-flows, n8n, make, zapier, power-automate]
6
6
  profiles: [core, full]
@@ -111,14 +111,6 @@ These are the guarantees every automation must meet regardless of platform. This
111
111
  | **No owner** | Orphaned automations rot; nobody notices the break or knows how it works | Name an owner + a one-page runbook per automation |
112
112
  | **Choosing platform by familiarity** | Bill 10× higher than the right billing unit; "our automation bill exploded" | Pick by billing unit for your run shape (§3) |
113
113
 
114
- ## Related skills
115
-
116
- - `../automation-flows/SKILL.md` — **build layer**: designs the flow and emits the importable artifact once this skill has decided *whether* and *where*. Strategy decides; automation-flows designs.
117
- - `../n8n/SKILL.md`, `../make/SKILL.md`, `../zapier/SKILL.md`, `../power-automate/SKILL.md` — **operate layer**: drive that platform's live API/MCP to CRUD, activate, and run. Route here after §3.
118
- - `../api-connector-builder/SKILL.md` — when the answer is custom code, not a platform: typed client with auth/pagination/backoff.
119
- - `../webhooks/SKILL.md` — when you need to *receive* events in your own app (this skill treats webhooks as triggers, it doesn't build the receiver).
120
- - `../secure-coding/SKILL.md` — secrets/rotation engineering behind the orchestration policy in §4.
121
-
122
114
  ## Checklist
123
115
 
124
116
  - [ ] Ran the §1 gate: frequency × time-saved × error-rate × **stability** — and confirmed the process is standardized, not chaos being paved.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: aws-essentials
3
- description: "Use when standing up the core AWS surface a small product needs — create a private S3 bucket for uploads, provision an encrypted RDS Postgres, choose ECS Fargate vs EC2 for a container, put CloudFront in front of S3, write or tighten an IAM policy, or harden a fresh account (root MFA, no long-lived keys). Triggers: 'set up an S3 bucket for user uploads', 'this role has AdministratorAccess, scope it down', 'spin up Multi-AZ Postgres on RDS', 'my bucket is public and I don't know why', 'this role can do everything', 'I can't encrypt RDS now', 'Fargate or EC2 for a low-traffic app', 'monta un bucket S3 privado', 'permisos mínims a IAM', 'posa CloudFront davant del bucket'. NOT the CI pipeline that ships your container (that is deployment), NOT app-code access-control review (that is secure-coding)."
3
+ description: "Use when standing up the core AWS surface a small product needs: hardening a fresh account, a private S3 bucket, encrypted RDS Postgres, ECS Fargate vs EC2, CloudFront + OAC, or scoping an IAM policy to least privilege. NOT the CI pipeline that ships the container (that is `deployment`), NOT app-code access-control review (that is `secure-coding`)."
4
4
  tags: [aws, cloud, iam, s3, infrastructure]
5
5
  recommends: [deployment, secure-coding, dynamodb, postgresdb]
6
6
  origin: risco
@@ -17,19 +17,6 @@ god-mode app roles, long-lived keys, unencrypted databases). Pick the right tier
17
17
  account hardening → IAM (roles + scoped policies) → S3 (private) / RDS (encrypted) / ECS Fargate → CloudFront (OAC) → infra exists, wired, least-privilege
18
18
  ```
19
19
 
20
- ## Operating posture — three rules
21
-
22
- - **Secure by default: keep the defaults AWS already hardened.** New S3 buckets are private
23
- since April 2023 (Block Public Access on, ACLs disabled, SSE-S3 encryption). Do not undo them.
24
- - **Least privilege: scope every policy, never `"*"` on `"*"`.** A role that can do everything
25
- is a breach waiting for one leaked credential. Start from a managed policy, then tighten.
26
- - **Roles, not keys.** Temporary credentials from a role beat a long-lived `AKIA…` access key
27
- that lives forever in a `.env` and ends up on GitHub. Apps get task roles; CI gets OIDC.
28
-
29
- Boundary in one sentence: **this skill provisions and secures the AWS account and its core
30
- services; `../deployment/SKILL.md` puts your container on it; `../secure-coding/SKILL.md` audits
31
- the code inside it.**
32
-
33
20
  ## Service decision table
34
21
 
35
22
  | Need | Use | Use instead if |
@@ -61,7 +48,9 @@ Do this once, before anything else. Each line has a reason; skip none.
61
48
 
62
49
  Two principal types. **IAM users** = long-lived humans/keys; avoid them for workloads. **Roles**
63
50
  = an identity something *assumes* to get temporary credentials — this is what ECS tasks, Lambda,
64
- CI, and federated humans use. Default to roles.
51
+ CI, and federated humans use. Default to roles: a temporary credential beats a long-lived `AKIA…`
52
+ key that lives forever in a `.env`. (IAM governs who may call AWS APIs; access control *inside*
53
+ your app code is `../secure-coding/SKILL.md`.)
65
54
 
66
55
  A policy is a JSON document. The four parts that matter:
67
56
 
@@ -181,7 +170,8 @@ Two more non-negotiables: the DB security group **references the app's security
181
170
  `0.0.0.0/0` (a DB open to the internet is a breach, not a convenience); credentials live in
182
171
  **Secrets Manager** with managed rotation (`--manage-master-user-password` above), never in task
183
172
  env vars. Use `--multi-az` for production HA. Full recipe (SG wiring, Secrets Manager rotation,
184
- connecting from ECS) → `references/rds-cloudfront-recipes.md`.
173
+ connecting from ECS) → `references/rds-cloudfront-recipes.md`. Schema, indexes and query tuning
174
+ once the instance exists → `../postgresdb/SKILL.md`.
185
175
 
186
176
  ## CloudFront + OAC — public web content, private bucket
187
177
 
@@ -214,10 +204,3 @@ Full CLI: create OAC → distribution → S3 bucket policy JSON → invalidation
214
204
  | Root user for daily ops | Highest blast radius, no per-action attribution | Root only for root-only tasks; admin via Identity Center |
215
205
  | No MFA on root | One phished password = total account loss | Passkey/security-key MFA on root and every human |
216
206
  | Confusing task role and execution role | App gets 403 at runtime, or ECS can't pull the image | Execution = pull image/logs; task = app's runtime perms |
217
-
218
- ## Cross-links
219
-
220
- - `../deployment/SKILL.md` — Dockerfile, CI/CD, OIDC to ECR, the actual ship-the-container step.
221
- - `../secure-coding/SKILL.md` — app-code access control / OWASP (vs cloud IAM here).
222
- - `../postgresdb/SKILL.md` — schema, indexes, query tuning once the RDS instance exists.
223
- - For key-value / single-table serverless data instead of RDS, reach for the `dynamodb` skill.