@ericrisco/rsc 0.1.52 → 0.1.54
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 +15 -15
- package/package.json +1 -1
- package/skills/gamedev-shaders/SKILL.md +23 -43
- package/skills/gamedev-shaders/evals/cases.yaml +2 -2
- package/skills/gcp-essentials/SKILL.md +16 -19
- package/skills/hetzner/SKILL.md +18 -36
- package/skills/knowledge-ops/SKILL.md +14 -17
- package/skills/lead-gen/SKILL.md +2 -6
- package/skills/lead-gen/evals/cases.yaml +2 -2
- package/skills/linkedin-carousels/SKILL.md +31 -42
- package/skills/llm-pipeline/SKILL.md +4 -9
- package/skills/medium-publishing/SKILL.md +5 -13
- package/skills/modal/SKILL.md +31 -49
- package/skills/n8n/SKILL.md +37 -65
- package/skills/newsletter/SKILL.md +10 -20
- package/skills/newsletter/references/growth-loops.md +3 -3
- package/skills/notion-connector/SKILL.md +13 -26
- package/skills/planetscale/SKILL.md +18 -43
- package/skills/planetscale/references/no-foreign-keys.md +2 -2
- package/skills/prompt-engineering/SKILL.md +5 -16
- package/skills/prompt-engineering/evals/cases.yaml +1 -1
package/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.54",
|
|
3
3
|
"counts": {
|
|
4
4
|
"skills": 258
|
|
5
5
|
},
|
|
@@ -1950,7 +1950,7 @@
|
|
|
1950
1950
|
},
|
|
1951
1951
|
{
|
|
1952
1952
|
"id": "gamedev-shaders",
|
|
1953
|
-
"description": "Use when
|
|
1953
|
+
"description": "Use when authoring or debugging a shader, material, VFX, or full-screen post-process in a game engine — Godot 4.x `.gdshader`, Unity 6 URP/HDRP, Unreal 5.x Materials, effect recipes, shader performance. NOT gameplay or engine-API code (that is `godot`/`unity`/`unreal`), NOT physics (`gamedev-physics`), NOT build variant stripping (`gamedev-shipping`).",
|
|
1954
1954
|
"tags": [
|
|
1955
1955
|
"shaders",
|
|
1956
1956
|
"vfx",
|
|
@@ -1995,7 +1995,7 @@
|
|
|
1995
1995
|
},
|
|
1996
1996
|
{
|
|
1997
1997
|
"id": "gcp-essentials",
|
|
1998
|
-
"description": "Use when running a small product on
|
|
1998
|
+
"description": "Use when running a small product on core Google Cloud via the gcloud CLI: a project, Cloud Run deploys, a locked-down Cloud Storage bucket, managed Cloud SQL, and least-privilege IAM wiring them together. NOT AWS (that is `aws-essentials`), NOT the CI pipeline that ships the image (that is `deployment`), NOT Postgres schema/query tuning (that is `postgresdb`).",
|
|
1999
1999
|
"tags": [
|
|
2000
2000
|
"gcp",
|
|
2001
2001
|
"cloud-run",
|
|
@@ -2192,7 +2192,7 @@
|
|
|
2192
2192
|
},
|
|
2193
2193
|
{
|
|
2194
2194
|
"id": "hetzner",
|
|
2195
|
-
"description": "Use when provisioning or hardening a Hetzner Cloud VPS
|
|
2195
|
+
"description": "Use when provisioning or hardening a Hetzner Cloud VPS: picking the plan/location (CX/CPX/CAX/CCX), bringing it up reproducibly with hcloud + cloud-init, locking down SSH, and wiring the Cloud Firewall to hand off a Docker-ready host. NOT app deploys on Coolify (that is `coolify`), NOT Dockerfiles (that is `docker`), NOT another provider (that is `digitalocean`).",
|
|
2196
2196
|
"tags": [
|
|
2197
2197
|
"hetzner",
|
|
2198
2198
|
"vps",
|
|
@@ -2439,7 +2439,7 @@
|
|
|
2439
2439
|
},
|
|
2440
2440
|
{
|
|
2441
2441
|
"id": "knowledge-ops",
|
|
2442
|
-
"description": "Use when an already-running 02-DOCS/ wiki needs
|
|
2442
|
+
"description": "Use when an already-running 02-DOCS/ wiki needs gardening judgment — what is worth capturing (default: nothing), where a loose note belongs, whether to split a bloated article or merge near-duplicates, how to link orphans back in, and what retires to _archive (never delete). NOT building or sweeping the wiki engine itself (that is `harness`).",
|
|
2443
2443
|
"tags": [
|
|
2444
2444
|
"knowledge-ops",
|
|
2445
2445
|
"wiki",
|
|
@@ -2549,7 +2549,7 @@
|
|
|
2549
2549
|
},
|
|
2550
2550
|
{
|
|
2551
2551
|
"id": "lead-gen",
|
|
2552
|
-
"description": "Use when
|
|
2552
|
+
"description": "Use when building and qualifying a prospect list before anyone reaches out — a falsifiable ICP, named accounts/contacts from Apollo/ZoomInfo/Clay, deduped against the CRM, tiered by fit+intent+engagement. NOT writing or sending the outreach (that is cold-outreach), NOT tracking the deal after first contact (that is sales-pipeline).",
|
|
2553
2553
|
"tags": [
|
|
2554
2554
|
"lead-generation",
|
|
2555
2555
|
"prospecting",
|
|
@@ -2609,7 +2609,7 @@
|
|
|
2609
2609
|
},
|
|
2610
2610
|
{
|
|
2611
2611
|
"id": "linkedin-carousels",
|
|
2612
|
-
"description": "Use when
|
|
2612
|
+
"description": "Use when building a LinkedIn carousel / document post — the swipeable multi-page PDF — slide by slide: cover hook, narrative arc, one idea per slide, CTA closer, PDF export spec. NOT the account/format plan (that is `linkedin-strategy`), NOT a text or single-image feed post (that is `linkedin-content`), NOT a 16:9 talk deck (that is `presentations`).",
|
|
2613
2613
|
"tags": [
|
|
2614
2614
|
"linkedin",
|
|
2615
2615
|
"carousel",
|
|
@@ -2694,7 +2694,7 @@
|
|
|
2694
2694
|
},
|
|
2695
2695
|
{
|
|
2696
2696
|
"id": "llm-pipeline",
|
|
2697
|
-
"description": "Use when wiring several LLM calls into
|
|
2697
|
+
"description": "Use when wiring several LLM calls into a production flow: typed contracts between steps, a router/gateway so 429s, timeouts and outages fail over instead of taking you down, and cost control via caching, model tiers and abort caps. NOT single-prompt wording (that is `prompt-engineering`), NOT a model-driven tool loop (that is `building-agents`).",
|
|
2698
2698
|
"tags": [
|
|
2699
2699
|
"llm-orchestration",
|
|
2700
2700
|
"llm-gateway",
|
|
@@ -2827,7 +2827,7 @@
|
|
|
2827
2827
|
},
|
|
2828
2828
|
{
|
|
2829
2829
|
"id": "medium-publishing",
|
|
2830
|
-
"description": "Use when
|
|
2830
|
+
"description": "Use when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool failures, the 5-tag cap, pseudo-Markdown gotchas. NOT writing or headlining the piece (that is `medium-writing`), NOT cadence or earnings (that is `medium-strategy`).",
|
|
2831
2831
|
"tags": [
|
|
2832
2832
|
"medium",
|
|
2833
2833
|
"publishing",
|
|
@@ -2912,7 +2912,7 @@
|
|
|
2912
2912
|
},
|
|
2913
2913
|
{
|
|
2914
2914
|
"id": "modal",
|
|
2915
|
-
"description": "Use when running Python
|
|
2915
|
+
"description": "Use when running Python or GPU workloads serverlessly on Modal — modal.App, inline container Images, gpu= on @app.function, Volumes for weight caching, Cron schedules, ASGI endpoints, modal run vs serve vs deploy. NOT managed prediction APIs with no container of your own (that is replicate); NOT SSH-able GPU boxes rented by the hour (that is runpod).",
|
|
2916
2916
|
"tags": [
|
|
2917
2917
|
"modal",
|
|
2918
2918
|
"serverless",
|
|
@@ -2992,7 +2992,7 @@
|
|
|
2992
2992
|
},
|
|
2993
2993
|
{
|
|
2994
2994
|
"id": "n8n",
|
|
2995
|
-
"description": "Use when operating a live n8n instance programmatically —
|
|
2995
|
+
"description": "Use when operating a live n8n instance programmatically — its REST API (`{host}/api/v1`, `X-N8N-API-KEY`) or the n8n-mcp server — to create, validate, test, activate, update, delete workflows and read executions on self-host or n8n.cloud. NOT designing the flow or its importable JSON (that is `automation-flows`), NOT another platform (`make`, `zapier`).",
|
|
2996
2996
|
"tags": [
|
|
2997
2997
|
"n8n",
|
|
2998
2998
|
"automation",
|
|
@@ -3075,7 +3075,7 @@
|
|
|
3075
3075
|
},
|
|
3076
3076
|
{
|
|
3077
3077
|
"id": "newsletter",
|
|
3078
|
-
"description": "Use when running an email newsletter as a recurring publication —
|
|
3078
|
+
"description": "Use when running an email newsletter as a recurring publication — subject + preview pair, issues that turn opens into clicks, the welcome sequence, cadence and engagement tiering, growth loops, and a post-Apple-MPP click scorecard. NOT one-off launch or nurture sends (that is `marketing`), NOT SPF/DKIM/DMARC (that is `email-deliverability`).",
|
|
3079
3079
|
"tags": [
|
|
3080
3080
|
"newsletter",
|
|
3081
3081
|
"email",
|
|
@@ -3177,7 +3177,7 @@
|
|
|
3177
3177
|
},
|
|
3178
3178
|
{
|
|
3179
3179
|
"id": "notion-connector",
|
|
3180
|
-
"description": "Use when wiring
|
|
3180
|
+
"description": "Use when wiring server code or a cron job to Notion as an ops backend over its HTTP API: pushing or mirroring database rows, two-way sync without duplicates, page blocks, or an integration broken by the 2025-09-03 data-source split. NOT generic REST wiring (that is `api-connector-builder`), NOT inbound Notion webhook events (that is `webhooks`).",
|
|
3181
3181
|
"tags": [
|
|
3182
3182
|
"notion",
|
|
3183
3183
|
"ops-backend",
|
|
@@ -3406,7 +3406,7 @@
|
|
|
3406
3406
|
},
|
|
3407
3407
|
{
|
|
3408
3408
|
"id": "planetscale",
|
|
3409
|
-
"description": "Use when operating PlanetScale serverless MySQL
|
|
3409
|
+
"description": "Use when operating PlanetScale (Vitess serverless MySQL) — branches and the `pscale` CLI, schema changes through deploy requests (Online DDL cutover, ~30-min revert window), tables without foreign keys, or the edge HTTP driver. NOT MySQL engine work like EXPLAIN or index choice (that is `mysql`), NOT generic migration theory (that is `db-migrations`).",
|
|
3410
3410
|
"tags": [
|
|
3411
3411
|
"planetscale",
|
|
3412
3412
|
"vitess",
|
|
@@ -3609,7 +3609,7 @@
|
|
|
3609
3609
|
},
|
|
3610
3610
|
{
|
|
3611
3611
|
"id": "prompt-engineering",
|
|
3612
|
-
"description": "Use when one prompt
|
|
3612
|
+
"description": "Use when one prompt must give the same right answer across reruns, models, and pasted-in hostile input: forcing a fixed schema, picking the few-shot set, ordering the prompt blocks, or the inline cases you run while tuning. NOT the agent loop, tools, or retrieval (that is `building-agents`), NOT a standing CI eval harness (that is `agent-eval`).",
|
|
3613
3613
|
"tags": [
|
|
3614
3614
|
"prompts",
|
|
3615
3615
|
"llm",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gamedev-shaders
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when authoring or debugging a shader, material, VFX, or full-screen post-process in a game engine — Godot 4.x `.gdshader`, Unity 6 URP/HDRP, Unreal 5.x Materials, effect recipes, shader performance. NOT gameplay or engine-API code (that is `godot`/`unity`/`unreal`), NOT physics (`gamedev-physics`), NOT build variant stripping (`gamedev-shipping`)."
|
|
4
4
|
tags: [shaders, vfx, materials, post-processing, shadergraph]
|
|
5
5
|
recommends: [godot, unity, unreal, gamedev-shipping]
|
|
6
6
|
profiles: [full]
|
|
@@ -11,8 +11,7 @@ origin: risco
|
|
|
11
11
|
|
|
12
12
|
Author shaders, materials, and full-screen effects across Godot, Unity, and Unreal. One
|
|
13
13
|
mental model — the GPU pipeline — mapped onto each engine's authoring surface, plus recipes
|
|
14
|
-
for the effects people actually ask for.
|
|
15
|
-
building a VFX/post-process effect, or "how do I make X look like Y".
|
|
14
|
+
for the effects people actually ask for.
|
|
16
15
|
|
|
17
16
|
## Version contract — read first
|
|
18
17
|
|
|
@@ -28,22 +27,6 @@ symbol is current, say so rather than guess.
|
|
|
28
27
|
`shader_type` tokens in Godot 4 are exact: `spatial`, `canvas_item` (underscore), `particles`
|
|
29
28
|
(plural), `sky`, `fog`.
|
|
30
29
|
|
|
31
|
-
## When to use / When NOT to use
|
|
32
|
-
|
|
33
|
-
**Use when:** writing or debugging a `.gdshader`/`ShaderMaterial`, a `.shader`/Shader Graph, or
|
|
34
|
-
a UE Material; building a VFX look (dissolve, rim, toon, water, shield, hologram, trails);
|
|
35
|
-
authoring post-processing / screen-space effects; a shader is slow, flickers, or looks wrong;
|
|
36
|
-
choosing per-vertex vs per-pixel; converting an effect between engines.
|
|
37
|
-
|
|
38
|
-
**When NOT to use (delegate):**
|
|
39
|
-
|
|
40
|
-
- Gameplay logic, nodes/components, input, engine APIs, scene setup → [`godot`](../godot/SKILL.md) /
|
|
41
|
-
[`unity`](../unity/SKILL.md) / [`unreal`](../unreal/SKILL.md). This skill owns the *shading*, not the C#/GDScript/Blueprint around it.
|
|
42
|
-
- Physics simulation, collisions, rigid bodies, character controllers → [`gamedev-physics`](../gamedev-physics/SKILL.md).
|
|
43
|
-
(A shader that *fakes* refraction is here; simulating fluid dynamics is not.)
|
|
44
|
-
- Shipping, platform export, shader-variant stripping in the build pipeline → [`gamedev-shipping`](../gamedev-shipping/SKILL.md)
|
|
45
|
-
(this skill keeps the per-shader performance work).
|
|
46
|
-
|
|
47
30
|
## Shader fundamentals (the pipeline)
|
|
48
31
|
|
|
49
32
|
Every engine compiles your material into the same GPU stages. Two you write:
|
|
@@ -131,10 +114,10 @@ for high-end):
|
|
|
131
114
|
blocks; the program goes in an `HLSLPROGRAM … ENDHLSL` block that `#include`s URP's `Core.hlsl`
|
|
132
115
|
/ `Lighting.hlsl`. Use for full control, custom lighting, or compute-driven effects.
|
|
133
116
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
117
|
+
Surface shaders are not an option under URP/HDRP (see the Version contract) — a lit look is an
|
|
118
|
+
HLSL pass or a Shader Graph. Set parameters at runtime through a `MaterialPropertyBlock` or
|
|
119
|
+
`Material.SetFloat/SetColor/SetTexture`. Full URP unlit + lit HLSL pass and a Shader Graph
|
|
120
|
+
mapping → `references/unity-and-unreal-shaders.md`.
|
|
138
121
|
|
|
139
122
|
### Unreal 5.x
|
|
140
123
|
|
|
@@ -216,24 +199,27 @@ per engine → `references/effect-recipes.md`.
|
|
|
216
199
|
- **Mobile / tile GPUs**: bandwidth-bound — keep render targets small, avoid mid-pass framebuffer
|
|
217
200
|
reads, and note that `discard` and large full-screen passes break tile hidden-surface removal.
|
|
218
201
|
|
|
219
|
-
##
|
|
202
|
+
## Anti-patterns
|
|
220
203
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
204
|
+
| Anti-pattern | Do instead |
|
|
205
|
+
| --- | --- |
|
|
206
|
+
| Porting a tutorial verbatim from Godot 3, Built-in RP, or pre-5.0 UE | Translate it through the Version contract table first — retired symbols still compile in old guides, not in your project. |
|
|
207
|
+
| Reading a texture or writing a color without minding linear vs sRGB | Author color uniforms as `source_color` (Godot) / sRGB-marked properties and check the space at every read and output — the #1 "looks washed out / too dark" bug. |
|
|
208
|
+
| Using interpolated normals raw, or a normal map straight from the sample | Re-normalize per pixel; unpack with `×2−1` and mind tangent handedness. |
|
|
209
|
+
| Writing the shader before choosing the target surface | Pick `shader_type` / render pipeline / material domain first (2D vs 3D, URP vs HDRP, Surface vs Post Process) — it decides which built-ins and blend modes exist. |
|
|
210
|
+
| Fresnel, normalization, or lighting math in the vertex stage | Only linearly-interpolating work goes per-vertex; exact math stays per-pixel. |
|
|
211
|
+
| `discard`/`clip` as a cheap "make it invisible" | Cull it or scale to zero — `discard` disables early-Z and breaks tile hidden-surface removal on mobile. |
|
|
212
|
+
| Stacking additive/translucent layers until the look works | Count the overdraw: each layer re-shades the same pixels. Prefer opaque, minimize overlap, keep particle fill low. |
|
|
213
|
+
| Full-screen effects via `OnRenderImage`/`Graphics.Blit`, or `SceneTexture` outside the Post Process domain | Use the engine's supported path — URP Renderer Feature / Fullscreen Shader Graph, UE Post Process material, Godot `ColorRect` + `hint_screen_texture` or `CompositorEffect`. |
|
|
230
214
|
|
|
231
215
|
## Related skills
|
|
232
216
|
|
|
233
|
-
- [`godot`](../godot/SKILL.md) / [`unity`](../unity/SKILL.md) / [`unreal`](../unreal/SKILL.md) —
|
|
234
|
-
|
|
235
|
-
- [`gamedev-physics`](../gamedev-physics/SKILL.md) — simulation, collision, rigid bodies
|
|
236
|
-
|
|
217
|
+
- [`godot`](../godot/SKILL.md) / [`unity`](../unity/SKILL.md) / [`unreal`](../unreal/SKILL.md) — gameplay
|
|
218
|
+
code, nodes/components, input, scene wiring; this skill owns the *shading*, not the C#/GDScript/Blueprint around it.
|
|
219
|
+
- [`gamedev-physics`](../gamedev-physics/SKILL.md) — simulation, collision, rigid bodies, character
|
|
220
|
+
controllers (a shader that *fakes* refraction is here; simulating fluid dynamics is not).
|
|
221
|
+
- [`gamedev-shipping`](../gamedev-shipping/SKILL.md) — platform export and shader-variant stripping in
|
|
222
|
+
the build (this skill keeps the per-shader performance work).
|
|
237
223
|
|
|
238
224
|
## Checklist
|
|
239
225
|
|
|
@@ -244,9 +230,3 @@ per engine → `references/effect-recipes.md`.
|
|
|
244
230
|
- [ ] Uniforms/parameters exposed and driven from code or an animation track — not hard-coded.
|
|
245
231
|
- [ ] Performance sanity: overdraw, sample count, and branching considered; mobile precision set if targeted.
|
|
246
232
|
- [ ] Post-process uses the engine's supported full-screen path (not a retired Built-in-RP mechanism).
|
|
247
|
-
|
|
248
|
-
## References
|
|
249
|
-
|
|
250
|
-
- `references/godot-shading-language.md` — shader types, built-ins per type, render_modes, `varying`, screen/depth reads, ShaderMaterial from code.
|
|
251
|
-
- `references/unity-and-unreal-shaders.md` — Unity URP HLSL pass + Shader Graph mapping; Unreal domains, Custom node HLSL, Material Instances.
|
|
252
|
-
- `references/effect-recipes.md` — dissolve, rim/outline, toon/cel, water/flow, force field, hologram — full code per engine.
|
|
@@ -4,13 +4,13 @@ should_trigger:
|
|
|
4
4
|
- prompt: "Write me a dissolve shader in Godot 4 that burns an object away from bottom to top with a glowing orange edge."
|
|
5
5
|
why: "Dissolve is a named recipe and the core use case; Godot 4 .gdshader authoring is owned here."
|
|
6
6
|
- prompt: "How do I make a rim light / fresnel glow on a 3D character in Unity URP?"
|
|
7
|
-
why: "Rim/fresnel is a named recipe; 'how do I make X effect' is
|
|
7
|
+
why: "Rim/fresnel is a named recipe; 'how do I make X effect' is the core shape of a shader request; Unity shader authoring is per-engine mapped here."
|
|
8
8
|
- prompt: "My translucent particle shader tanks the framerate on mobile. How do I fix the overdraw?"
|
|
9
9
|
why: "Shader performance — overdraw, transparency, mobile — is a dedicated section; symptom-only trigger routes here, not to a generic profiler."
|
|
10
10
|
- prompt: "Set up a full-screen post-process effect in Unreal that reads scene depth and draws outlines."
|
|
11
11
|
why: "Post-processing / full-screen effects per engine is a core section; Unreal Post Process material + SceneTexture is covered."
|
|
12
12
|
- prompt: "Cómo hago un shader de agua con refracción y espuma en los bordes."
|
|
13
|
-
why: "Spanish water/flow recipe request;
|
|
13
|
+
why: "Spanish water/flow recipe request; water/flow is a named recipe and matching is by meaning, not by language."
|
|
14
14
|
- prompt: "Convert this toon/cel shading effect from my Godot project to a Unity Shader Graph."
|
|
15
15
|
why: "Toon/cel is a named recipe and cross-engine conversion is an explicit use case; the skill carries a Godot↔Unity↔Unreal map."
|
|
16
16
|
- prompt: "What coordinate space are NORMAL and VIEW in inside a Godot spatial fragment shader, and why does my world-space fresnel look wrong?"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcp-essentials
|
|
3
|
-
description: "Use when running a small product on
|
|
3
|
+
description: "Use when running a small product on core Google Cloud via the gcloud CLI: a project, Cloud Run deploys, a locked-down Cloud Storage bucket, managed Cloud SQL, and least-privilege IAM wiring them together. NOT AWS (that is `aws-essentials`), NOT the CI pipeline that ships the image (that is `deployment`), NOT Postgres schema/query tuning (that is `postgresdb`)."
|
|
4
4
|
tags: [gcp, cloud-run, cloud-sql, cloud-storage, iam, gcloud, serverless, devops]
|
|
5
5
|
recommends: [aws-essentials, docker, github-actions, secure-coding, postgresdb, deployment, monitoring, backups]
|
|
6
6
|
origin: risco
|
|
@@ -20,12 +20,14 @@ Four primitives carry most products, plus the project/billing scaffold under the
|
|
|
20
20
|
- **Cloud Storage** — object storage (buckets).
|
|
21
21
|
- **Cloud SQL** — managed Postgres/MySQL.
|
|
22
22
|
|
|
23
|
-
Out of scope, route elsewhere: AWS -> `aws-essentials
|
|
24
|
-
|
|
23
|
+
Out of scope, route elsewhere: AWS -> [`../aws-essentials/SKILL.md`](../aws-essentials/SKILL.md).
|
|
24
|
+
Building/shipping the image itself -> [`../docker/SKILL.md`](../docker/SKILL.md)
|
|
25
|
+
/ [`../github-actions/SKILL.md`](../github-actions/SKILL.md) / [`../deployment/SKILL.md`](../deployment/SKILL.md).
|
|
25
26
|
Postgres schema/index/query tuning -> [`../postgresdb/SKILL.md`](../postgresdb/SKILL.md).
|
|
26
27
|
App-level injection/secret-handling review -> [`../secure-coding/SKILL.md`](../secure-coding/SKILL.md).
|
|
27
|
-
Logging/alerting/SLOs as a practice -> `monitoring
|
|
28
|
-
|
|
28
|
+
Logging/alerting/SLOs as a practice -> [`../monitoring/SKILL.md`](../monitoring/SKILL.md).
|
|
29
|
+
Backup strategy as a discipline -> [`../backups/SKILL.md`](../backups/SKILL.md).
|
|
30
|
+
One-click PaaS where you never touch IAM/VPC -> [`../vercel/SKILL.md`](../vercel/SKILL.md)
|
|
29
31
|
/ [`../railway/SKILL.md`](../railway/SKILL.md) / [`../render/SKILL.md`](../render/SKILL.md)
|
|
30
32
|
/ [`../fly-io/SKILL.md`](../fly-io/SKILL.md).
|
|
31
33
|
|
|
@@ -96,8 +98,8 @@ Two hard rules, each with teeth:
|
|
|
96
98
|
Identity Federation for external/CI auth (GitHub Actions). If `... keys create` is
|
|
97
99
|
in your runbook, the runbook is wrong.
|
|
98
100
|
|
|
99
|
-
WIF for keyless CI, SA impersonation, IAM Recommender and
|
|
100
|
-
[`references/iam-and-auth.md`](references/iam-and-auth.md).
|
|
101
|
+
The predefined-role catalog, WIF for keyless CI, SA impersonation, IAM Recommender and
|
|
102
|
+
Conditions live in [`references/iam-and-auth.md`](references/iam-and-auth.md).
|
|
101
103
|
|
|
102
104
|
## 2. Cloud Run
|
|
103
105
|
|
|
@@ -233,8 +235,9 @@ gcloud run deploy api --region=europe-west1 \
|
|
|
233
235
|
```
|
|
234
236
|
|
|
235
237
|
The Cloud SQL **Auth Proxy** (short-lived certs, TLS 1.3) is for connecting from
|
|
236
|
-
*outside* — local dev or a non-serverless host — not for Cloud Run.
|
|
237
|
-
|
|
238
|
+
*outside* — local dev or a non-serverless host — not for Cloud Run. Direct VPC egress vs
|
|
239
|
+
legacy connectors, private IP / PSC, proxy invocation and pooling are in
|
|
240
|
+
[`references/networking-and-sql.md`](references/networking-and-sql.md).
|
|
238
241
|
|
|
239
242
|
## 5. Wire it together
|
|
240
243
|
|
|
@@ -267,6 +270,10 @@ Note the scoping: `cloudsql.client` is project-wide (the role needs it), but the
|
|
|
267
270
|
storage and secret grants are bound to the *specific* bucket and secret, not the
|
|
268
271
|
project. Grant narrow.
|
|
269
272
|
|
|
273
|
+
Copy-paste runbooks for each piece — image build and push, private container deploy,
|
|
274
|
+
attach SQL, mount a secret, full teardown — are in
|
|
275
|
+
[`references/deploy-recipes.md`](references/deploy-recipes.md).
|
|
276
|
+
|
|
270
277
|
## 6. Cost & teardown
|
|
271
278
|
|
|
272
279
|
- Cloud Run scales to zero by default — an idle service costs ~nothing. Keep
|
|
@@ -315,13 +322,3 @@ bash scripts/verify.sh path/to/dir/ # recurse a directory
|
|
|
315
322
|
|
|
316
323
|
It prints `PASS`/`FAIL` per check and exits nonzero on any FAIL. An empty or
|
|
317
324
|
clean target passes (exit 0).
|
|
318
|
-
|
|
319
|
-
## References
|
|
320
|
-
|
|
321
|
-
- [`references/iam-and-auth.md`](references/iam-and-auth.md) — predefined-role catalog,
|
|
322
|
-
Workload Identity Federation for GitHub Actions, SA impersonation, IAM Recommender,
|
|
323
|
-
Conditions.
|
|
324
|
-
- [`references/networking-and-sql.md`](references/networking-and-sql.md) — Direct VPC
|
|
325
|
-
egress vs legacy connectors, Cloud SQL private IP / PSC, Auth Proxy, pooling.
|
|
326
|
-
- [`references/deploy-recipes.md`](references/deploy-recipes.md) — copy-paste runbooks:
|
|
327
|
-
container deploy, attach SQL, mount a secret, budget alert, full teardown.
|
package/skills/hetzner/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hetzner
|
|
3
|
-
description: "Use when provisioning or hardening a Hetzner Cloud VPS
|
|
3
|
+
description: "Use when provisioning or hardening a Hetzner Cloud VPS: picking the plan/location (CX/CPX/CAX/CCX), bringing it up reproducibly with hcloud + cloud-init, locking down SSH, and wiring the Cloud Firewall to hand off a Docker-ready host. NOT app deploys on Coolify (that is `coolify`), NOT Dockerfiles (that is `docker`), NOT another provider (that is `digitalocean`)."
|
|
4
4
|
tags: [hetzner, vps, cloud-firewall, hcloud, ssh-hardening, cloud-init, self-hosting]
|
|
5
5
|
recommends: [coolify, docker, secure-coding, domains-dns, backups, monitoring]
|
|
6
6
|
origin: risco
|
|
@@ -14,17 +14,8 @@ include 20 TB of egress. The risk is that "cheap" becomes "unhardened and
|
|
|
14
14
|
unmonitored" — a root-SSH box on a public IPv4 with password auth on. Your job
|
|
15
15
|
is to make the cheap box **safe** and **reproducible**: every server comes up
|
|
16
16
|
from a committed cloud-init file and a Cloud Firewall ruleset, never from
|
|
17
|
-
click-ops in the console.
|
|
18
|
-
|
|
19
|
-
Operating posture:
|
|
20
|
-
|
|
21
|
-
- **Reproducible by default.** A box you can't recreate from a file isn't a box,
|
|
22
|
-
it's a pet. Bake the non-root user, SSH key, and sshd hardening into first
|
|
23
|
-
boot via cloud-init — not into a post-login checklist you'll forget.
|
|
24
|
-
- **Two firewalls, edge first.** The Hetzner Cloud Firewall stops packets before
|
|
25
|
-
they reach the VM; host `ufw` is defense-in-depth. You need both.
|
|
26
|
-
- **Honest about the trade-off.** No managed DB, no uptime SLA, phone support
|
|
27
|
-
only for dedicated-server customers. Name it; don't pretend it's AWS.
|
|
17
|
+
click-ops in the console. A box you can't recreate from a file isn't a box, it's
|
|
18
|
+
a pet.
|
|
28
19
|
|
|
29
20
|
## Decide before you create
|
|
30
21
|
|
|
@@ -139,8 +130,8 @@ hcloud firewall add-rule app-edge --direction in --protocol tcp --port 22 --s
|
|
|
139
130
|
|
|
140
131
|
## SSH hardening rules
|
|
141
132
|
|
|
142
|
-
- **Key-only auth.** `PasswordAuthentication no`. A
|
|
143
|
-
an ed25519 key is not.
|
|
133
|
+
- **Key-only auth.** `PasswordAuthentication no`, `PubkeyAuthentication yes`. A
|
|
134
|
+
password is brute-forceable; an ed25519 key is not.
|
|
144
135
|
- **No root login.** `PermitRootLogin no` + a sudo user. Root over SSH is the
|
|
145
136
|
single most-targeted login on the internet.
|
|
146
137
|
- **fail2ban on.** Bans IPs after repeated failures — cheap insurance for the
|
|
@@ -149,16 +140,6 @@ hcloud firewall add-rule app-edge --direction in --protocol tcp --port 22 --s
|
|
|
149
140
|
harden anything. Do it if you like clean logs, but never *instead* of key-only
|
|
150
141
|
+ a firewall.
|
|
151
142
|
|
|
152
|
-
Bad → Good:
|
|
153
|
-
|
|
154
|
-
```diff
|
|
155
|
-
- PermitRootLogin yes
|
|
156
|
-
- PasswordAuthentication yes
|
|
157
|
-
+ PermitRootLogin no
|
|
158
|
-
+ PasswordAuthentication no
|
|
159
|
-
+ PubkeyAuthentication yes
|
|
160
|
-
```
|
|
161
|
-
|
|
162
143
|
## Hand off to Docker / Coolify
|
|
163
144
|
|
|
164
145
|
"Host ready" means all of the following are true:
|
|
@@ -169,28 +150,29 @@ Bad → Good:
|
|
|
169
150
|
- [ ] `ufw status` enabled with the same allowlist.
|
|
170
151
|
- [ ] `unattended-upgrades` and `fail2ban` running.
|
|
171
152
|
|
|
172
|
-
Then route the install/deploy:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
image hardening. This skill stops at a clean, hardened host.
|
|
153
|
+
This skill stops at a clean, hardened host. Then route the install/deploy:
|
|
154
|
+
[`coolify`](../coolify/SKILL.md) for the Coolify install + app deploy flow,
|
|
155
|
+
[`docker`](../docker/SKILL.md) for Dockerfiles, compose, and image hardening.
|
|
176
156
|
|
|
177
157
|
## Day-2
|
|
178
158
|
|
|
179
159
|
- **Snapshot ≠ backup.** A snapshot is a one-off manual image you can boot from;
|
|
180
160
|
the **Backups** add-on is automated, rotating, ~20% of the server price. A
|
|
181
|
-
snapshot you took once in March is not a backup strategy — for that, see
|
|
182
|
-
`backups`
|
|
161
|
+
snapshot you took once in March is not a backup strategy — for that, see
|
|
162
|
+
[`backups`](../backups/SKILL.md).
|
|
183
163
|
- **Resize grows, never shrinks.** You can scale the disk up; you cannot scale it
|
|
184
164
|
back down. Size conservatively or you're stuck paying for it.
|
|
185
165
|
- **Volumes** for data you want to outlive/detach from the server. Keep databases
|
|
186
166
|
and uploads on a volume so a server rebuild doesn't take the data with it.
|
|
187
167
|
- **Reverse DNS** must match for outbound mail to be accepted — set the PTR in the
|
|
188
|
-
console/`hcloud` if the box sends email. Forward DNS records belong to
|
|
189
|
-
`domains-dns`
|
|
190
|
-
- **No SLA, no managed DB.** There's no uptime guarantee
|
|
191
|
-
product
|
|
192
|
-
|
|
193
|
-
|
|
168
|
+
console/`hcloud` if the box sends email. Forward DNS records belong to
|
|
169
|
+
[`domains-dns`](../domains-dns/SKILL.md).
|
|
170
|
+
- **No SLA, no managed DB.** There's no uptime guarantee, no managed-database
|
|
171
|
+
product, and phone support only for dedicated-server customers — you run
|
|
172
|
+
Postgres yourself, you monitor it yourself. For monitoring and alerting, see
|
|
173
|
+
[`monitoring`](../monitoring/SKILL.md); treat the box as something you must
|
|
174
|
+
watch, not something Hetzner watches for you. Name the trade-off to the user;
|
|
175
|
+
don't pretend it's AWS.
|
|
194
176
|
|
|
195
177
|
## Anti-patterns
|
|
196
178
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: knowledge-ops
|
|
3
|
-
description: "Use when an already-running 02-DOCS/ wiki needs
|
|
3
|
+
description: "Use when an already-running 02-DOCS/ wiki needs gardening judgment — what is worth capturing (default: nothing), where a loose note belongs, whether to split a bloated article or merge near-duplicates, how to link orphans back in, and what retires to _archive (never delete). NOT building or sweeping the wiki engine itself (that is `harness`)."
|
|
4
4
|
tags: [knowledge-ops, wiki, 02-docs, knowledge-base, curation, cross-linking, pruning, knowledge-meta]
|
|
5
5
|
recommends: [harness, decision-records, meeting-notes, sop-builder, research-ops, codebase-onboarding]
|
|
6
6
|
origin: risco
|
|
@@ -8,7 +8,7 @@ origin: risco
|
|
|
8
8
|
|
|
9
9
|
# Knowledge Ops — Garden the 02-DOCS Wiki
|
|
10
10
|
|
|
11
|
-
*The engine is already running. `harness` built the `02-DOCS/` wiki and owns its automation — the inbox sweep, deterministic lint, scoring, gap detection, the self-improve loop
|
|
11
|
+
*The engine is already running. `harness` built the `02-DOCS/` wiki and owns its automation — the inbox sweep, deterministic lint, scoring, gap detection, the self-improve loop — and changing that machinery or filling the wiki in bulk stays with it. Yours are the four judgments automation deliberately leaves to a human: what is worth capturing, how it should be shaped, how it connects, and what should retire. You are the gardener, not the machinery.*
|
|
12
12
|
|
|
13
13
|
## Before you touch anything
|
|
14
14
|
|
|
@@ -29,7 +29,7 @@ Every gardening request is one of four operations. Identify which before you act
|
|
|
29
29
|
| **Link** | Pages are unreachable or under-connected | `scores.json` orphan_penalty (=5), low inbound count | `## See Also` in articles, `index.md` |
|
|
30
30
|
| **Prune** | Answers are stale, articles superseded, conflicts unresolved, gaps bloated | freshness, conflict annotations, old `[FILLED]` gaps | `_archive/`, `log.md`, `gaps.md` |
|
|
31
31
|
|
|
32
|
-
Whichever you do, record a line in `wiki/log.md
|
|
32
|
+
Whichever you do, record a line in `wiki/log.md` under the reserved-file rule in **Safety rails** below. The exact entry shapes per operation live in `references/gardening-playbook.md`.
|
|
33
33
|
|
|
34
34
|
## Capture — the bar is high
|
|
35
35
|
|
|
@@ -44,7 +44,7 @@ Walk the altitude ladder, lowest rung first; stop at the first that fits:
|
|
|
44
44
|
|
|
45
45
|
Worked examples for each rung are in `references/gardening-playbook.md`.
|
|
46
46
|
|
|
47
|
-
**Topic choice.** Reuse an existing topic before inventing one, and keep `wiki/` exactly **one level of subdirs** deep (the protocol's rule).
|
|
47
|
+
**Topic choice.** Reuse an existing topic before inventing one, and keep `wiki/` exactly **one level of subdirs** deep (the protocol's rule).
|
|
48
48
|
|
|
49
49
|
- Bad: `wiki/payments/stripe/webhooks/retries.md` (four levels deep).
|
|
50
50
|
- Good: `wiki/payments/stripe-webhook-retries.md` (existing `payments/` topic, one level).
|
|
@@ -81,20 +81,19 @@ Every article earns **≥1 inbound link** or is a conscious leaf you can justify
|
|
|
81
81
|
|
|
82
82
|
- **Conflicts:** you **flag** contradictions and the **human arbitrates**. Once they choose a winner, you may apply the resolution and annotate the loser — but you never auto-pick. Why: silently choosing a side is data corruption.
|
|
83
83
|
- **Stale answers:** mark a page or archived copy with a `> ⚠ Stale — superseded YYYY-MM-DD` note rather than rewriting history.
|
|
84
|
-
- **Compaction is bounded:** only `[FILLED YYYY-MM-DD]` gaps **older than 90 days** may be compacted, and only via a single marker prepended to `log.md
|
|
85
|
-
- **Log every prune** by prepending to `wiki/log.md
|
|
84
|
+
- **Compaction is bounded:** only `[FILLED YYYY-MM-DD]` gaps **older than 90 days** may be compacted, and only via a single marker prepended to `log.md` — a gap gets a `[FILLED]` stamp, never a deletion.
|
|
85
|
+
- **Log every prune** by prepending to `wiki/log.md`.
|
|
86
86
|
|
|
87
|
-
A full worked prune session (stale + superseded + conflict + gap compaction, all logged) is in
|
|
87
|
+
A full worked prune session (stale + superseded + conflict + gap compaction, all logged) is in `references/gardening-playbook.md`.
|
|
88
88
|
|
|
89
|
-
## Safety rails
|
|
89
|
+
## Safety rails
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
Inherited from `../harness/references/wiki-protocol.md` — do not override them; each one guards against a loss you cannot undo.
|
|
92
92
|
|
|
93
93
|
1. **Preserve before overwrite.** Never overwrite an article without first copying the old version to `wiki/<topic>/_archive/<article>__YYYY-MM-DD.md`.
|
|
94
94
|
2. **Never auto-resolve a conflict.** Flag it; the human arbitrates.
|
|
95
|
-
3.
|
|
96
|
-
4. **
|
|
97
|
-
5. **Never touch an article whose `timestamp` is < 24h ago** without explicit user say-so. Why: it is likely still being worked. (`timestamp` is the OKF last-meaningful-edit field, ISO 8601 — see `../harness/references/wiki-protocol.md` "## Conventions".)
|
|
95
|
+
3. **The reserved files only grow.** Log every change in `wiki/log.md`, the OKF reserved change-log: new entries are **prepended at the top (newest first)**, ISO 8601 dates. `gaps.md` is the append-only one — new entries go at the bottom. Past entries in either are immutable: a gap gets a `[FILLED YYYY-MM-DD]` stamp, nothing is ever edited out or deleted.
|
|
96
|
+
4. **Never touch an article whose `timestamp` is < 24h ago** without explicit user say-so. Why: it is likely still being worked. (`timestamp` is the OKF last-meaningful-edit field, ISO 8601 — see `../harness/references/wiki-protocol.md` "## Conventions".)
|
|
98
97
|
|
|
99
98
|
## Anti-patterns
|
|
100
99
|
|
|
@@ -117,9 +116,7 @@ Route elsewhere when the request is not gardening an existing wiki:
|
|
|
117
116
|
|---------|----------|
|
|
118
117
|
| Build/bootstrap the wiki, run an inbox sweep, scaffold `01-TOOLS`, generate root `CLAUDE.md` | `harness` (`../harness/SKILL.md`) — it owns the engine |
|
|
119
118
|
| Turn a meeting transcript into a recap with action items + owners | `meeting-notes` (`../meeting-notes/SKILL.md`) |
|
|
120
|
-
| Author a decision record (ADR) with alternatives, status, review cadence | `decision-records` (you may *file* one; that skill *authors* the discipline
|
|
119
|
+
| Author a decision record (ADR) with alternatives, status, review cadence | `decision-records` (`../decision-records/SKILL.md`) — you may *file* one; that skill *authors* the discipline |
|
|
121
120
|
| Document a repeatable procedure step by step | `sop-builder` (`../sop-builder/SKILL.md`) |
|
|
122
|
-
| First-pass walkthrough of an unfamiliar codebase | `codebase-onboarding` |
|
|
123
|
-
| Run a literature / source-gathering research project | `research-ops` |
|
|
124
|
-
|
|
125
|
-
The sharp line: changing the wiki's machinery or filling it in bulk is `harness`. Exercising judgment over what an already-running wiki should contain and how it should be shaped is `knowledge-ops`.
|
|
121
|
+
| First-pass walkthrough of an unfamiliar codebase | `codebase-onboarding` (`../codebase-onboarding/SKILL.md`) |
|
|
122
|
+
| Run a literature / source-gathering research project | `research-ops` (`../research-ops/SKILL.md`) |
|
package/skills/lead-gen/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lead-gen
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when building and qualifying a prospect list before anyone reaches out — a falsifiable ICP, named accounts/contacts from Apollo/ZoomInfo/Clay, deduped against the CRM, tiered by fit+intent+engagement. NOT writing or sending the outreach (that is cold-outreach), NOT tracking the deal after first contact (that is sales-pipeline)."
|
|
4
4
|
tags: [lead-generation, prospecting, icp, lead-scoring, sales]
|
|
5
5
|
recommends: [cold-outreach, sales-pipeline, market-research, data-scraper, spreadsheet-ops, email-deliverability, gdpr-privacy]
|
|
6
6
|
origin: risco
|
|
@@ -8,9 +8,7 @@ origin: risco
|
|
|
8
8
|
|
|
9
9
|
# Lead Gen — The List and the Model That Ranks It
|
|
10
10
|
|
|
11
|
-
*You turn "we sell X to Y" into a deduplicated, scored, compliance-cleared roster of named accounts and people. You define the target, you build the list, you rank it — then you stop.
|
|
12
|
-
|
|
13
|
-
The identity of this skill is **the list and its scoring model**, not the messages sent to it and not the pipeline it becomes. Everything you produce is a *prioritized roster + the rationale that ranked it*. The hand-off is the finish line, not the campaign.
|
|
11
|
+
*You turn "we sell X to Y" into a deduplicated, scored, compliance-cleared roster of named accounts and people. You define the target, you build the list, you rank it — then you stop. What you produce is a prioritized roster plus the rationale that ranked it; the hand-off is the finish line, not the campaign.*
|
|
14
12
|
|
|
15
13
|
## The pipeline — three phases, two gates
|
|
16
14
|
|
|
@@ -151,5 +149,3 @@ This skill stops at a scored, compliance-cleared list. From there:
|
|
|
151
149
|
- The **A/B tiers + persona context** go to `../cold-outreach/SKILL.md` — that skill writes the message and the cadence; you do not.
|
|
152
150
|
- **Accepted leads** (worked and responsive) go to `../sales-pipeline/SKILL.md` — that skill tracks stages, forecasts, and manages the deal; you do not.
|
|
153
151
|
- If the request is really "how big is this market / which segment?" with no named list, that is `../market-research/SKILL.md`, not this skill.
|
|
154
|
-
|
|
155
|
-
When the deliverable would be a message, a pipeline stage, or a market sizing — route. Your job ended at the ranked roster.
|