@ericrisco/rsc 0.1.45 → 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/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.45",
2
+ "version": "0.1.46",
3
3
  "counts": {
4
4
  "skills": 258
5
5
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ericrisco/rsc",
3
- "version": "0.1.45",
3
+ "version": "0.1.46",
4
4
  "description": "Eric Risco's agent-skills catalog as a granular, self-recommending CLI installer.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -49,6 +49,13 @@ The goal is the smallest body that still routes correctly. 400 lines is a ceilin
49
49
 
50
50
  - The **anti-patterns table**. The rubric requires one, and it is a different animal from a
51
51
  rationalization table: it names concrete failure modes, not rules already stated above it.
52
+
53
+ **The hybrid case, which is common:** a table titled something like *"Anti-patterns /
54
+ rationalizations — STOP"*, with an *Excuse → Reality* framing. Do not delete it and do not leave
55
+ it as-is. **Keep every row, re-column it to `Anti-pattern | Do instead`, and drop the STOP /
56
+ excuse framing.** The rows are the value; the borrowed urgency wrapper is what dimension 7
57
+ forbids. Handling this the same way everywhere is what keeps the catalog consistent — deleting it
58
+ in one skill and keeping it in the next is worse than either choice applied uniformly.
52
59
  - Decision tables where the flow genuinely branches.
53
60
  - Tables specific to *this* skill's phase (e.g. what to show at each checkpoint) — that is not the
54
61
  generic dial.
@@ -77,18 +84,21 @@ Your worktree has **no `node_modules`**, so:
77
84
  ## Ship
78
85
 
79
86
  Commit only `skills/<id>/`. Subject `refactor(<id>): <what you actually did>`. The body says what you
80
- removed **and why**, and — just as important — what you deliberately **kept** and why. Close with:
87
+ removed **and why**, and — just as important — what you deliberately **kept** and why.
88
+
89
+ **Authorship is Eric, never Claude.** No `Co-Authored-By` for any AI, no "Generated with Claude Code"
90
+ footer, nothing attributing the work to a tool — in the commit *or* the PR body. This is the hard
91
+ rule the `ship` skill enforces (`skills/ship/SKILL.md`), and it applies to this migration like
92
+ everything else in the repo. Verify before pushing:
81
93
 
82
- ```text
83
- Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
94
+ ```bash
95
+ git log -1 --format='%b' | grep -iE 'co-authored-by.*(claude|anthropic|ai)|generated with|claude code' \
96
+ && echo "AUTHORSHIP VIOLATION — strip it" || echo "authorship clean"
84
97
  ```
85
98
 
86
99
  Then `git push -u origin skill/<id>` and `gh pr create`. The PR body carries before/after description
87
- chars, before/after body bytes, what went, what stayed, and the eval-lint result. Close it with:
88
-
89
- ```text
90
- 🤖 Generated with [Claude Code](https://claude.com/claude-code)
91
- ```
100
+ chars, before/after body bytes, what went, what stayed, and the eval-lint result — and no AI
101
+ attribution line.
92
102
 
93
103
  ## Judgment
94
104
 
@@ -96,6 +106,84 @@ If the skill already meets the rubric, **say so and change only the description.
96
106
  diff beats a large invented one. Several skills in the pilot needed 5-line diffs; that is a good
97
107
  outcome, not a failed pass. Never pad, and never cut substance to hit a number.
98
108
 
109
+ ---
110
+
111
+ # For the orchestrator
112
+
113
+ Everything above is for the agent doing one skill. This half is for whoever is driving the fleet.
114
+
115
+ ## Resuming, from nothing
116
+
117
+ There is no state file to keep in sync, on purpose. **The remote branches are the ledger:**
118
+
119
+ ```bash
120
+ # what is done
121
+ git ls-remote --heads origin 'refs/heads/skill/*'
122
+ # what is left = skills/ minus those, minus what is already merged to main
123
+ ```
124
+
125
+ So a cold session resumes with: *read this brief, compute the skills with no `skill/*` branch, launch
126
+ one agent per skill in its own worktree.* Nothing from any previous conversation is required.
127
+
128
+ ## Order: by profile, not alphabetically
129
+
130
+ A skill's `description` is in context for everyone who installs it, so migrate by blast radius:
131
+
132
+ 1. `minimal` profile — in every rsc install.
133
+ 2. `core` profile — the default install (the SDD chain plus the control plane).
134
+ 3. High-install stack skills — `nextjs`, `react`, `fastapi`, `postgresdb`, `design`, `typescript`,
135
+ `python`, `go`, `flutter`, `secure-coding`, `deployment`.
136
+ 4. Everything else.
137
+
138
+ If a run is cut short, this ordering means the part that was finished is the part that everyone pays for.
139
+
140
+ ## Sharp edges (each one cost a real mistake)
141
+
142
+ - **`manifest.json` is derived.** Agents must never touch it — hundreds of parallel edits collide on
143
+ the same lines. Regenerate once, centrally, with `npm run manifest` after merging.
144
+ - **A fresh worktree has no `node_modules`** (it is gitignored, so it is not checked out). `npm test`
145
+ and `npm run validate` cannot run there. `scripts/eval-lint.sh` can — it uses python3.
146
+ - **Result-envelope blocks are asymmetric.** `specify`, `tasks`, `implement`, `verify`, `ship`,
147
+ `parallel` and `sdd` have one; `plan`, `analyze`, `clarify`, `constitution`, `review` and `debug`
148
+ do not. Tell each agent which case it is in, or it will helpfully invent one.
149
+ - **`author-skill` is special.** It teaches how to write skills, so it documented the *old*
150
+ conventions. There, rewriting the guidance IS the migration — and the change has to reach its
151
+ `references/` and `evals/`, which graded produced skills against the old rubric.
152
+ - **Short ids break greps.** `go`, `rag`, `php` match half of `eval-lint`'s output. Give those agents
153
+ an anchored pattern (`grep -E '^go +'`).
154
+ - **Compound bash commands are denied whole.** The `ship-guard` hook rejects the entire call if any
155
+ part matches `git checkout main`, so a chained `commit && push && checkout main` runs *nothing*.
156
+ Split them.
157
+ - **The id `parallel` is unusable in a git command.** A sandbox guard aimed at GNU `parallel` matches
158
+ the substring, so `git checkout -b skill/parallel` is refused. That skill's branch has to be
159
+ created from the pushed commit with `gh api` instead. Any future id containing a blocked tool name
160
+ will behave the same way.
161
+
162
+ ## Content problems found while migrating — do NOT fix them in a format pass
163
+
164
+ Agents surfaced these and correctly left them alone. They need their own change:
165
+
166
+ - `sdd` claims every phase ends with a parseable envelope; six phases have none (see above).
167
+ - **`evals/cases.yaml` files carry stale claims about what the catalog contains, in both
168
+ directions.** Three agents hit this independently: `course-storytelling` routes a negative to
169
+ `deep-research`, which does not exist; `flutter` routes its Compose/SwiftUI negatives to `"none"`
170
+ on the grounds those skills are "not in this catalog", though `compose-multiplatform` and
171
+ `swift-ios` now are; `postgresdb` said the same of ORM traps, stale since `prisma-orm` and
172
+ `drizzle-orm` shipped. This drifts every time the catalog grows.
173
+
174
+ The root cause is that `eval-lint` does not actually verify a `route_to` names a real skill,
175
+ even though the rubric lists exactly that as a deterministic gate — so the gate is decorative.
176
+ (The 1024-char description limit had the same problem; that one is now enforced in
177
+ `schema/frontmatter.schema.json`.) Fixing the linter is worth more than fixing the instances:
178
+ it converts a recurring drift into a build error.
179
+ - `clarify`'s body calls itself "the fourth phase" while the chain it prints puts it third.
180
+ - `cold-outreach` never names `linkedin-outreach` in its route table, though the reverse link exists.
181
+ - `data-policy` says "walk five columns" and then lists six.
182
+ - `marketing/references/seo-geo.md` (20 KB) and marketing's landing-section material substantially
183
+ duplicate the standalone `seo-geo` and `landing-copy` skills. Three skills, one body of content,
184
+ paid for three times by anyone who installs all three. Needs a content-level de-duplication pass,
185
+ not a format one.
186
+
99
187
  ## Return value
100
188
 
101
189
  ```json