@ericrisco/rsc 0.1.44 → 0.1.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/manifest.json +110 -86
- package/package.json +1 -1
- package/scripts/lib/domains.js +1 -1
- package/scripts/skill-migration-brief.md +192 -0
- package/skills/ab-testing/SKILL.md +9 -41
- package/skills/accessibility/SKILL.md +5 -7
- package/skills/ads/SKILL.md +9 -24
- package/skills/agent-eval/SKILL.md +7 -33
- package/skills/agent-safety/SKILL.md +7 -14
- package/skills/ai-media/SKILL.md +4 -20
- package/skills/analytics/SKILL.md +8 -30
- package/skills/analyze/SKILL.md +24 -59
- package/skills/angular/SKILL.md +12 -25
- package/skills/api-connector-builder/SKILL.md +10 -27
- package/skills/api-design/SKILL.md +7 -14
- package/skills/article-writing/SKILL.md +1 -18
- package/skills/astro/SKILL.md +36 -54
- package/skills/author-skill/SKILL.md +41 -74
- package/skills/author-skill/evals/README.md +5 -5
- package/skills/author-skill/evals/cases.yaml +8 -8
- package/skills/author-skill/references/description-recipe.md +25 -26
- package/skills/author-skill/references/eval-authoring.md +1 -1
- package/skills/author-skill/references/rsc-conventions.md +1 -1
- package/skills/automation-flows/SKILL.md +6 -16
- package/skills/automation-strategy/SKILL.md +1 -9
- package/skills/aws-essentials/SKILL.md +6 -23
- package/skills/backups/SKILL.md +1 -7
- package/skills/bash-scripting/SKILL.md +5 -9
- package/skills/bookkeeping/SKILL.md +2 -10
- package/skills/brand-identity/SKILL.md +18 -44
- package/skills/brand-voice/SKILL.md +4 -31
- package/skills/building-agents/SKILL.md +20 -103
- package/skills/business-intelligence/SKILL.md +9 -23
- package/skills/calendar-scheduling/SKILL.md +11 -27
- package/skills/case-studies/SKILL.md +3 -8
- package/skills/chatbot/SKILL.md +6 -23
- package/skills/chrome-extension/SKILL.md +2 -2
- package/skills/clarify/SKILL.md +31 -72
- package/skills/clickhouse-analytics/SKILL.md +2 -8
- package/skills/client-onboarding/SKILL.md +17 -19
- package/skills/cloudflare/SKILL.md +3 -8
- package/skills/code-review/SKILL.md +10 -23
- package/skills/codebase-onboarding/SKILL.md +2 -7
- package/skills/cold-outreach/SKILL.md +9 -30
- package/skills/community/SKILL.md +4 -31
- package/skills/competitor-watch/SKILL.md +20 -35
- package/skills/compliance/SKILL.md +10 -37
- package/skills/compose-multiplatform/SKILL.md +1 -1
- package/skills/constitution/SKILL.md +8 -35
- package/skills/content-engine/SKILL.md +4 -16
- package/skills/context-budget/SKILL.md +3 -21
- package/skills/continuous-learning/SKILL.md +10 -40
- package/skills/contracts/SKILL.md +6 -17
- package/skills/coolify/SKILL.md +8 -14
- package/skills/cost-tracking/SKILL.md +3 -11
- package/skills/course-builder/SKILL.md +17 -45
- package/skills/course-storytelling/SKILL.md +26 -94
- package/skills/cpp/SKILL.md +26 -71
- package/skills/csharp-dotnet/SKILL.md +19 -38
- package/skills/customer-support/SKILL.md +14 -37
- package/skills/dashboard/SKILL.md +6 -26
- package/skills/data-cleaning/SKILL.md +37 -63
- package/skills/data-policy/SKILL.md +8 -21
- package/skills/data-scraper/SKILL.md +1 -7
- package/skills/debug/SKILL.md +10 -49
- package/skills/deployment/SKILL.md +38 -101
- package/skills/design/SKILL.md +34 -116
- package/skills/fable-operator/SKILL.md +1 -4
- package/skills/fastapi/SKILL.md +50 -82
- package/skills/flutter/SKILL.md +41 -89
- package/skills/go/SKILL.md +57 -105
- package/skills/harness/SKILL.md +52 -68
- package/skills/implement/SKILL.md +1 -1
- package/skills/init/SKILL.md +152 -168
- package/skills/marketing/SKILL.md +30 -80
- package/skills/nextjs/SKILL.md +42 -116
- package/skills/orient/SKILL.md +25 -20
- package/skills/parallel/SKILL.md +9 -75
- package/skills/plan/SKILL.md +92 -165
- package/skills/postgresdb/SKILL.md +52 -72
- package/skills/presentations/SKILL.md +49 -87
- package/skills/python/SKILL.md +23 -72
- package/skills/react/SKILL.md +19 -67
- package/skills/review/SKILL.md +22 -52
- package/skills/rust/SKILL.md +40 -115
- package/skills/sdd-init/SKILL.md +9 -14
- package/skills/secure-coding/SKILL.md +80 -109
- package/skills/ship/SKILL.md +25 -55
- package/skills/tasks/SKILL.md +37 -61
- package/skills/typescript/SKILL.md +22 -55
- package/skills/verify/SKILL.md +8 -32
- package/skills/viral-score/SKILL.md +122 -0
- package/skills/viral-score/evals/README.md +16 -0
- package/skills/viral-score/evals/cases.yaml +50 -0
- package/skills/vue-nuxt/SKILL.md +45 -106
- package/skills/worktrees/SKILL.md +24 -69
package/skills/debug/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debug
|
|
3
|
-
description: "Use when something is broken
|
|
3
|
+
description: "Use when something is broken — a failing or flaky test, crash, wrong result or regression — and the root cause must be reproduced and proven before any fix. On-demand; callable mid-`implement`. NOT a feature to spec or build (that is `specify`/`implement`), NOT the lint/test gate (that is `verify`), NOT adversarial diff reading (that is `review`)."
|
|
4
4
|
tags: [debug, bug, troubleshoot]
|
|
5
5
|
recommends: []
|
|
6
6
|
profiles: [core, full]
|
|
@@ -20,31 +20,9 @@ The one rule everything else serves: **no fix before a reproduced, isolated, con
|
|
|
20
20
|
you cannot make the bug happen on demand, you cannot know you fixed it — you can only know the
|
|
21
21
|
symptom stopped showing, which is not the same thing.
|
|
22
22
|
|
|
23
|
-
This is a process skill
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
`../secure-coding/SKILL.md`). `debug` owns the *method*; it pulls the *mechanics* from whichever
|
|
27
|
-
stack the failure lives in.
|
|
28
|
-
|
|
29
|
-
## When to use / when not to
|
|
30
|
-
|
|
31
|
-
Use when:
|
|
32
|
-
|
|
33
|
-
- A test fails (or flakes) for a reason you don't fully understand, mid-`implement` or after.
|
|
34
|
-
- A crash, exception, 500, segfault, or wrong output appears and nobody can yet say why.
|
|
35
|
-
- A regression shows up ("this used to work") and you need the commit/change that caused it.
|
|
36
|
-
- A fix was applied and the symptom came back, or a "fix" didn't actually stick.
|
|
37
|
-
- The behavior differs between environments ("works locally, fails in CI").
|
|
38
|
-
|
|
39
|
-
Do NOT use when:
|
|
40
|
-
|
|
41
|
-
- You're writing a *planned* feature task and its expected failing test — that's `implement`'s
|
|
42
|
-
red→green→refactor; no mystery yet.
|
|
43
|
-
- You're running the lint/type/test gate to confirm "done" — that's `verify` (it *reports* failures
|
|
44
|
-
and hands them here; it doesn't diagnose).
|
|
45
|
-
- You're reading a clean diff adversarially for smells a test can't catch — that's `review`.
|
|
46
|
-
- The "bug" is actually an unclear requirement or contradictory spec — that's `clarify`/`analyze`,
|
|
47
|
-
not a code defect.
|
|
23
|
+
This is a process skill: it owns the *method*, never the instruments. The test runner, debugger,
|
|
24
|
+
race detector and profiler belong to whichever stack the failure lives in — pull them from the
|
|
25
|
+
delegation table below.
|
|
48
26
|
|
|
49
27
|
## Model tier — `heavy` (opt-in routing)
|
|
50
28
|
|
|
@@ -53,7 +31,9 @@ This phase's default model tier is **`heavy`** — root-cause diagnosis is deep
|
|
|
53
31
|
## Read the room first (accompaniment dial)
|
|
54
32
|
|
|
55
33
|
Before diagnosing, read `02-DOCS/wiki/harness/user-profile.md` for the technical + accompaniment
|
|
56
|
-
level and match it
|
|
34
|
+
level and match it; with no profile yet, assume non-technical — narrate the reasoning plainly and
|
|
35
|
+
never apply a behavior-changing fix without a quick confirm. The *method* never changes with the
|
|
36
|
+
dial — the volume does.
|
|
57
37
|
|
|
58
38
|
| Level | While diagnosing you show… | Questions you ask |
|
|
59
39
|
| --- | --- | --- |
|
|
@@ -62,10 +42,7 @@ level and match it. The *method* never changes with the dial — the volume does
|
|
|
62
42
|
| **L2** decisions | each step's finding (repro, the half that isolated it, the cause) | confirm before a fix that changes behavior beyond the bug |
|
|
63
43
|
| **L3** full | narrate the whole loop, teach the binary-search reasoning aloud | ask to contextualize the environment, recent changes, expectations |
|
|
64
44
|
|
|
65
|
-
|
|
66
|
-
behavior-changing fix without a quick confirm.
|
|
67
|
-
|
|
68
|
-
## The loop — five steps, in order
|
|
45
|
+
## The loop — five steps, never skipped, never reordered
|
|
69
46
|
|
|
70
47
|
```text
|
|
71
48
|
REPRODUCE → make the bug happen on demand. A reliable repro (or a quantified flake rate) is the
|
|
@@ -84,11 +61,6 @@ VERIFY → re-run the repro: symptom gone. Re-run the new test: green. Re-r
|
|
|
84
61
|
dropped to zero. Only now is it fixed.
|
|
85
62
|
```
|
|
86
63
|
|
|
87
|
-
Never skip a step and never reorder. **Reproduce before isolate** — you can't bisect a bug you can't
|
|
88
|
-
trigger. **Hypothesize before fix** — an edit with no stated cause is a guess wearing a commit
|
|
89
|
-
message. **Verify before "fixed"** — the word *fixed* is a claim about the repro no longer firing
|
|
90
|
-
and the test being green, nothing less.
|
|
91
|
-
|
|
92
64
|
### Reproduce — the entry ticket
|
|
93
65
|
|
|
94
66
|
A bug you cannot reproduce is not a bug you can fix; it's a rumor. Pin it down:
|
|
@@ -169,9 +141,9 @@ Why missed — what let it through, so the class of bug doesn't recur
|
|
|
169
141
|
|
|
170
142
|
Skip the trivial ones (a typo'd variable). Log the cause a future debugger would pay to know.
|
|
171
143
|
|
|
172
|
-
## Anti-patterns
|
|
144
|
+
## Anti-patterns
|
|
173
145
|
|
|
174
|
-
|
|
|
146
|
+
| Anti-pattern | Why it fails |
|
|
175
147
|
| --- | --- |
|
|
176
148
|
| "I see the likely line — let me just change it and see." | That's guess-and-patch. Reproduce first; a fix to an untriggered bug proves nothing. |
|
|
177
149
|
| "It's intermittent, you can't really reproduce it." | "Intermittent" is a rate to measure (k/N), not an excuse. Flakes have causes: state, order, races, time. |
|
|
@@ -185,8 +157,6 @@ Skip the trivial ones (a typo'd variable). Log the cause a future debugger would
|
|
|
185
157
|
|
|
186
158
|
## Red flags — stop and re-route
|
|
187
159
|
|
|
188
|
-
- **You're editing code and you can't yet reproduce the bug** → stop; you're guessing. Get a repro
|
|
189
|
-
(or a measured flake rate) first.
|
|
190
160
|
- **The "bug" is a spec contradiction or unclear requirement**, not a defect → route to
|
|
191
161
|
`clarify` / `analyze`; debugging won't fix an ambiguity.
|
|
192
162
|
- **The fix grows past the cause** (you're refactoring "while you're here") → split it out; keep the
|
|
@@ -210,15 +180,6 @@ Skip the trivial ones (a typo'd variable). Log the cause a future debugger would
|
|
|
210
180
|
- [ ] Handed the whole-gate re-run back to verify; resumed implement where the failure interrupted it
|
|
211
181
|
```
|
|
212
182
|
|
|
213
|
-
## What this skill is NOT
|
|
214
|
-
|
|
215
|
-
- **Not the feature builder.** Once the cause is fixed and verified, planned work resumes in
|
|
216
|
-
`implement` (its red→green→refactor for the *next* task, not this bug).
|
|
217
|
-
- **Not the quality gate.** The lint/type/full-suite/audit run that licenses "done" is `verify`'s
|
|
218
|
-
job; `debug` proves the one bug dead and hands the gate back.
|
|
219
|
-
- **Not a refactor pass.** Keep the fix minimal; broader cleanups are `implement`/`review` territory,
|
|
220
|
-
not smuggled into a bugfix.
|
|
221
|
-
|
|
222
183
|
## Where you are in the chain
|
|
223
184
|
|
|
224
185
|
`debug` is **on-demand**, callable from any phase — most often pulled in mid-`implement` when a test
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: deployment
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when taking an app from source to live: choosing the deploy target from requirements (Hetzner+Coolify vs Vercel vs a third), then wiring container → CI → registry → host with build secrets, healthchecks and rollback. NOT one platform's mechanics (that is `coolify`, `vercel`, `railway`, `render`), NOT the Dockerfile alone (that is `docker`)."
|
|
4
4
|
tags: [deploy, docker, ci, github-actions, coolify]
|
|
5
5
|
recommends: [secure-coding]
|
|
6
6
|
origin: risco
|
|
@@ -10,10 +10,6 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
Take any app in this repo from source → hardened container → green CI/CD → live on the right
|
|
12
12
|
host, with secrets that never leak into image layers or logs, and a defined rollback path.
|
|
13
|
-
The default self-hosted target is **Coolify** (covered in depth); for the *where to host*
|
|
14
|
-
question, this skill also covers **Vercel** (zero-ops serverless/edge, ideal Next.js) and
|
|
15
|
-
**Hetzner** (cheapest control; run Coolify on it for a self-hosted PaaS), plus a decision
|
|
16
|
-
matrix and an "always 3 options" framework — see `references/hosting-targets.md`.
|
|
17
13
|
|
|
18
14
|
```text
|
|
19
15
|
source → Dockerfile (multi-stage) → CI (lint·test·build·scan) → registry (ghcr) → target (Coolify·Vercel·Hetzner, rolling) → live + rollback
|
|
@@ -21,22 +17,10 @@ source → Dockerfile (multi-stage) → CI (lint·test·build·scan) → registr
|
|
|
21
17
|
choose via references/hosting-targets.md
|
|
22
18
|
```
|
|
23
19
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- Authoring or auditing a `Dockerfile`, `.dockerignore`, or `compose.yaml`.
|
|
29
|
-
- Writing or hardening `.github/workflows/*.yml` (build, test, scan, release, deploy).
|
|
30
|
-
- Wiring a service onto Coolify: build-pack choice, env/secrets, domains, healthcheck, auto-deploy, previews, rollback.
|
|
31
|
-
- Designing the secrets flow GitHub → registry → Coolify, or choosing rolling vs blue-green.
|
|
32
|
-
- **Choosing where to host** (Vercel vs Hetzner+Coolify vs a third option) from real requirements — see `references/hosting-targets.md`.
|
|
33
|
-
|
|
34
|
-
**When NOT to use:**
|
|
35
|
-
|
|
36
|
-
- Kubernetes / Helm / ECS / Nomad orchestration → out of scope (this skill targets Docker + GHA, and hosting on Coolify/Vercel/Hetzner-class targets). Say so and stop.
|
|
37
|
-
- Application runtime code, DB schema/migration logic, or business logic → wrong skill (see the per-stack skills below).
|
|
38
|
-
- Cloud IaC (Terraform, Pulumi, CloudFormation) → out of scope; only the GHA↔cloud **OIDC handshake** is covered, not provisioning.
|
|
39
|
-
- Pure local dev with no container ambition → likely overkill; mention the `compose.yaml` option and defer.
|
|
20
|
+
**Out of scope — say so and stop:** Kubernetes / Helm / ECS / Nomad orchestration; cloud IaC
|
|
21
|
+
(Terraform, Pulumi, CloudFormation — only the GHA↔cloud **OIDC handshake** is covered, not
|
|
22
|
+
provisioning); application runtime code and DB schema/migration logic (the per-stack skills at the
|
|
23
|
+
bottom own what runs *inside* the container).
|
|
40
24
|
|
|
41
25
|
## Decision rules
|
|
42
26
|
|
|
@@ -81,21 +65,10 @@ Consult these first. They settle 90% of choices before you write a line.
|
|
|
81
65
|
| Runtime secret | Coolify env (Is Secret) / GHA `secrets` |
|
|
82
66
|
| Cloud auth | OIDC — never a stored key |
|
|
83
67
|
|
|
84
|
-
## Core principles
|
|
85
|
-
|
|
86
|
-
1. Multi-stage always: a fat builder, a minimal runtime — never ship the toolchain.
|
|
87
|
-
2. Pin digests (`FROM img@sha256:…`) on prod base images so a moved tag can't change your runtime.
|
|
88
|
-
3. Non-root + read-only rootfs + `cap_drop: ALL`; add back only `NET_BIND_SERVICE` if you must bind <1024.
|
|
89
|
-
4. One process per container. No supervisord-managed bundles; let the orchestrator scale.
|
|
90
|
-
5. Write `.dockerignore` before the first build — it shrinks context, speeds builds, and keeps secrets out.
|
|
91
|
-
6. Secrets never in layers, logs, or `ARG`; use BuildKit `--mount=type=secret` at build, env injection at runtime.
|
|
92
|
-
7. Copy the lockfile and install deps **before** copying source, so source edits don't bust the dependency cache.
|
|
93
|
-
8. `HEALTHCHECK` hits a real readiness path (`/healthz`), not `/` — it gates the rolling swap.
|
|
94
|
-
9. 12-factor config: env only, validated at boot, fail-fast. No `.env` baked into images.
|
|
95
|
-
10. Least-privilege `GITHUB_TOKEN` (`permissions:` default-deny, escalate per job) and every pipeline runs `scripts/verify.sh`.
|
|
96
|
-
|
|
97
68
|
## Docker — the canonical multi-stage shape
|
|
98
69
|
|
|
70
|
+
One process per container: no supervisord-managed bundles, let the orchestrator scale.
|
|
71
|
+
|
|
99
72
|
```dockerfile
|
|
100
73
|
# syntax=docker/dockerfile:1
|
|
101
74
|
# ---- builder: full toolchain, deps cached before source ----
|
|
@@ -146,7 +119,8 @@ README.md
|
|
|
146
119
|
DOCKER_BUILDKIT=1 docker build --secret id=npm_token,env=NPM_TOKEN -t app:dev .
|
|
147
120
|
```
|
|
148
121
|
|
|
149
|
-
→ full per-stack Dockerfiles: `references/dockerfiles-by-stack.md`
|
|
122
|
+
→ full per-stack Dockerfiles: `references/dockerfiles-by-stack.md` · image-authoring depth
|
|
123
|
+
(shrinking, base-image choice, cache busting): `../docker/SKILL.md`
|
|
150
124
|
|
|
151
125
|
## docker-compose for local dev + Postgres
|
|
152
126
|
|
|
@@ -258,7 +232,8 @@ jobs:
|
|
|
258
232
|
- BAD: blanket `permissions: write-all` — any compromised step can push images or mint tokens.
|
|
259
233
|
- GOOD: third-party actions pinned to a full commit SHA with a version comment (`@<sha> # v0.35.0`). In the March 2026 `trivy-action` supply-chain incident ([GHSA-69fq-xp46-6x23](https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23) / CVE-2026-33634), 76 of 77 tags were force-pushed to credential-stealing malware; the advisory's named known-safe ref is `v0.35.0` (commit `57a97c7e7821a5776cebc9bb87c984fa69cba8f1`), the one clean tag still pointing at the real `master` HEAD. A moving tag would have pulled the malware; this SHA pin does not. Let Dependabot bump the SHA once upstream re-tags cleanly.
|
|
260
234
|
|
|
261
|
-
→ matrix, reusable workflows, OIDC-to-cloud, environments/approvals, releases: `references/github-actions.md`
|
|
235
|
+
→ matrix, reusable workflows, OIDC-to-cloud, environments/approvals, releases: `references/github-actions.md` ·
|
|
236
|
+
workflow-syntax depth: `../github-actions/SKILL.md`
|
|
262
237
|
|
|
263
238
|
## Choosing a deploy target (3 options)
|
|
264
239
|
|
|
@@ -282,17 +257,15 @@ escape hatch — start on Vercel, move to Hetzner+Coolify when the bill grows, s
|
|
|
282
257
|
|
|
283
258
|
→ deep coverage (limits, regions, pricing, decision matrix, worked examples): `references/hosting-targets.md`
|
|
284
259
|
|
|
285
|
-
## Coolify —
|
|
260
|
+
## Coolify — wiring the chosen target
|
|
261
|
+
|
|
262
|
+
Only the parts that touch the pipeline; the platform walkthrough lives elsewhere.
|
|
286
263
|
|
|
287
264
|
- Pick the **Dockerfile** build pack when a Dockerfile exists — same artifact CI builds, full control, prod/CI parity.
|
|
288
265
|
- Set **Ports Exposes** to the container port your app listens on (e.g. `8000`); Traefik routes the domain to it.
|
|
289
|
-
- Mark sensitive env vars **Is Secret** — encrypted at rest, masked in logs and UI.
|
|
290
266
|
- Set the **Health Check** path/port → this is what gates the rolling swap to the new container.
|
|
291
|
-
-
|
|
292
|
-
- Bind a **custom domain** → automatic Let's Encrypt cert + **Force HTTPS**; point DNS A/AAAA at the server.
|
|
267
|
+
- Mark sensitive env vars **Is Secret** — encrypted at rest, masked in logs and UI.
|
|
293
268
|
- Enable **GitHub App auto-deploy** on push, OR call the deploy webhook from CI (one or the other, not both).
|
|
294
|
-
- Turn on **preview deployments** per PR (`{{pr_id}}.{{domain}}`) with non-prod secrets; auto-teardown on PR close.
|
|
295
|
-
- Set **CPU/memory limits + reservations** per resource to prevent noisy-neighbor OOM.
|
|
296
269
|
- **Rollback** = redeploy a previously stored image in one click; pair with backward-compatible migrations.
|
|
297
270
|
|
|
298
271
|
```bash
|
|
@@ -301,7 +274,8 @@ curl --fail -X POST \
|
|
|
301
274
|
"https://coolify.example.com/api/v1/deploy?uuid=$APP_UUID&force=false"
|
|
302
275
|
```
|
|
303
276
|
|
|
304
|
-
→
|
|
277
|
+
→ persistent storage, custom domains + Let's Encrypt, per-PR previews, CPU/memory limits, blue-green:
|
|
278
|
+
`references/coolify.md` and `../coolify/SKILL.md`
|
|
305
279
|
|
|
306
280
|
## Secrets flow (GitHub → registry → Coolify)
|
|
307
281
|
|
|
@@ -321,35 +295,12 @@ GitHub secrets / OIDC ──mint short-lived creds──▶ build pushes to ghcr
|
|
|
321
295
|
|
|
322
296
|
## 12-factor config & observability
|
|
323
297
|
|
|
324
|
-
Config from env, validated at boot, fail-fast — a bad config crashes on startup, never at request
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
from pydantic import PostgresDsn
|
|
328
|
-
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
298
|
+
Config from env, validated at boot, fail-fast — a bad config crashes on startup, never at request
|
|
299
|
+
time. Idiom per stack: pydantic-settings `BaseSettings` (raises at import), zod `envSchema.parse(process.env)`
|
|
300
|
+
(throws at boot), `env.Must(env.ParseAs[Config]())` for Go (exits at boot).
|
|
329
301
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
model_config = SettingsConfigDict(env_file=".env")
|
|
333
|
-
|
|
334
|
-
settings = Settings() # raises at import → fail-fast
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
```typescript
|
|
338
|
-
import { z } from "zod";
|
|
339
|
-
const envSchema = z.object({ DATABASE_URL: z.string().url(), PORT: z.coerce.number().default(3000) });
|
|
340
|
-
export const env = envSchema.parse(process.env); // throws at boot → fail-fast
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
```go
|
|
344
|
-
import "github.com/caarlos0/env/v11"
|
|
345
|
-
type Config struct {
|
|
346
|
-
DatabaseURL string `env:"DATABASE_URL,required"`
|
|
347
|
-
Port int `env:"PORT" envDefault:"8080"`
|
|
348
|
-
}
|
|
349
|
-
cfg := env.Must(env.ParseAs[Config]()) // exits at boot if invalid → fail-fast
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
- Log JSON to stdout (slog for Go, structlog/uvicorn JSON for FastAPI, pino for Next.js); never log secrets; expose `/healthz` (liveness, no deps) + `/readyz` (checks deps).
|
|
302
|
+
Log JSON to stdout (slog for Go, structlog/uvicorn JSON for FastAPI, pino for Next.js); never log
|
|
303
|
+
secrets; expose `/healthz` (liveness, no deps) + `/readyz` (checks deps).
|
|
353
304
|
|
|
354
305
|
```python
|
|
355
306
|
# FastAPI: liveness is dependency-free; readiness probes the DB so a node that
|
|
@@ -368,11 +319,11 @@ async def readyz() -> dict[str, str]:
|
|
|
368
319
|
|
|
369
320
|
| Rationalization | STOP — do this instead |
|
|
370
321
|
| --- | --- |
|
|
371
|
-
| `:latest` is fine for now | Pin tag+digest; `:latest` breaks reproducibility and rollback |
|
|
322
|
+
| `:latest` is fine for now | Pin tag+digest (`FROM img@sha256:…`); `:latest` breaks reproducibility and rollback |
|
|
372
323
|
| I'll pass the token as `ARG` | BuildKit `--mount=type=secret`; `ARG` persists in `docker history` |
|
|
373
324
|
| `permissions: write-all` is simpler | Default-deny; grant per job (`packages: write`, `id-token: write`) |
|
|
374
325
|
| Store a registry password in GHA secrets | Use OIDC / `GITHUB_TOKEN`; no long-lived key |
|
|
375
|
-
| Run as root, it's just a container | Non-root UID + read-only rootfs + `cap_drop: ALL` |
|
|
326
|
+
| Run as root, it's just a container | Non-root UID + read-only rootfs + `cap_drop: ALL` (add back only `NET_BIND_SERVICE` to bind <1024) |
|
|
376
327
|
| Skip the healthcheck, the app boots fast | No healthcheck = no rolling gate = downtime / bad version live |
|
|
377
328
|
| Copy the whole repo then `RUN install` | Copy the lockfile first; cache the deps layer |
|
|
378
329
|
| Nixpacks is easier than my Dockerfile | If a Dockerfile exists, use it — CI/prod parity |
|
|
@@ -389,7 +340,7 @@ async def readyz() -> dict[str, str]:
|
|
|
389
340
|
| Scan image | `trivy image --severity HIGH,CRITICAL --exit-code 1 IMG` |
|
|
390
341
|
| Lint Dockerfile | `hadolint Dockerfile` |
|
|
391
342
|
| Lint workflows | `actionlint` |
|
|
392
|
-
| Run verify gate | `bash scripts/verify.sh` |
|
|
343
|
+
| Run verify gate | `bash scripts/verify.sh` (hadolint+actionlint+trivy+build smoke, local and CI) |
|
|
393
344
|
| Local up | `docker compose up --watch` |
|
|
394
345
|
| Trigger Coolify deploy | `curl --fail -X POST …/api/v1/deploy?uuid=…&force=false` |
|
|
395
346
|
| Roll back | Coolify → redeploy prior image |
|
|
@@ -405,33 +356,19 @@ async def readyz() -> dict[str, str]:
|
|
|
405
356
|
- [ ] trivy clean (no HIGH/CRITICAL)
|
|
406
357
|
- [ ] Rollback path known
|
|
407
358
|
|
|
408
|
-
## Project grounding (02-DOCS
|
|
409
|
-
|
|
410
|
-
When this skill runs in a project with a `02-DOCS/` layer (the
|
|
411
|
-
[`harness`](../harness/SKILL.md) Karpathy wiki), record this
|
|
412
|
-
project's deploy decisions there and index them in `02-DOCS/wiki/index.md`, so the next
|
|
413
|
-
agent inherits the conventions instead of re-deriving them.
|
|
414
|
-
|
|
415
|
-
1. **Find the article** `02-DOCS/wiki/stack/deployment.md`, indexed in `02-DOCS/wiki/index.md` (the Knowledge map index; root `CLAUDE.md` points to it).
|
|
416
|
-
2. **If missing or stale**, create/update it with the project's real choices — the base-image/container choices, the CI pipeline, the Coolify/target config, the secrets flow, and the rollback strategy —
|
|
417
|
-
then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it).
|
|
418
|
-
3. **Read it first on every use** and stay consistent; when a convention changes, update the
|
|
419
|
-
article (bump its `Updated` date) in the same change.
|
|
420
|
-
|
|
421
|
-
No `02-DOCS/` layer? Skip silently (optionally suggest `harness`). Unlike the
|
|
422
|
-
brand study, technical conventions are *recorded, not gated* — never block the task on this.
|
|
423
|
-
|
|
424
|
-
## See Also
|
|
359
|
+
## Project grounding (02-DOCS)
|
|
425
360
|
|
|
426
|
-
|
|
427
|
-
-
|
|
428
|
-
|
|
429
|
-
|
|
361
|
+
In a project with a `02-DOCS/` layer (the [`harness`](../harness/SKILL.md) Karpathy wiki), read
|
|
362
|
+
`02-DOCS/wiki/stack/deployment.md` first and stay consistent with it. Create or update it with this
|
|
363
|
+
project's real choices — base-image/container choices, the CI pipeline, the target config, the
|
|
364
|
+
secrets flow, the rollback strategy — index it in `02-DOCS/wiki/index.md` (the Knowledge map root
|
|
365
|
+
`CLAUDE.md` points to), and bump its `Updated` date in the same change. No `02-DOCS/` layer? Skip
|
|
366
|
+
silently (optionally suggest `harness`) — technical conventions are *recorded, not gated*; never
|
|
367
|
+
block the task on this.
|
|
430
368
|
|
|
431
|
-
##
|
|
369
|
+
## Hand off
|
|
432
370
|
|
|
433
|
-
-
|
|
434
|
-
-
|
|
435
|
-
-
|
|
436
|
-
-
|
|
437
|
-
- `scripts/verify.sh` — the hadolint+actionlint+trivy+build-smoke gate (runs locally and in CI).
|
|
371
|
+
- Platform mechanics once the target is chosen: `../coolify/SKILL.md`, `../vercel/SKILL.md`, `../railway/SKILL.md`, `../render/SKILL.md`, `../fly-io/SKILL.md`, `../hetzner/SKILL.md`.
|
|
372
|
+
- `../secure-coding/SKILL.md` — input validation, authn/z, and secret-handling this skill assumes the app already does.
|
|
373
|
+
- `../harness/SKILL.md` — 01-TOOLS provider creds (Stripe, Postgres, OAuth…) that become runtime env on the target.
|
|
374
|
+
- `../fastapi/SKILL.md`, `../nextjs/SKILL.md`, `../go/SKILL.md`, `../flutter/SKILL.md`, `../postgresdb/SKILL.md` — the application code that runs inside the container; this skill stops at that boundary.
|
package/skills/design/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design
|
|
3
|
-
description: "Use when designing
|
|
3
|
+
description: "Use when designing or refreshing a web UI or landing page — visual concept, type/color/spacing/motion tokens, composition, rescuing a UI that reads AI-generic, or a graded design review. Brand-grounded and research-first; ships Tailwind v4 + Next.js 15 under WCAG 2.2 AA and Core Web Vitals budgets. NOT the words on the page (that is `marketing`), NOT the App Router build (that is `nextjs`)."
|
|
4
4
|
tags: [design, ux, ui, landing, conversion]
|
|
5
5
|
recommends: [nextjs, marketing]
|
|
6
6
|
origin: risco
|
|
@@ -10,64 +10,25 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
*Research the best current work, then ship a premium, accessible, fast, high-converting interface.*
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
> **SDD gate.** If this fired on a **new, non-trivial feature or behaviour change** and there is **no approved spec + plan** under `02-DOCS/wiki/sdd/`, hand off to `../specify/SKILL.md` first — it runs brainstorm → spec → plan → tasks before any code, then routes back here once the plan is approved. Build straight from here only for a genuinely one-line / low-risk change. Method: `../sdd/SKILL.md`.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
**Hand-offs.** The WORDS are `../marketing/SKILL.md`'s: it co-owns the `02-DOCS/wiki/brand/` study (the words dimensions there, the visual ones here), and deep keyword research, GEO, or a technical SEO audit belongs to it — this skill only enforces SEO-aware *structure* in markup. The BUILD (App Router / React 19) is `../nextjs/SKILL.md`'s. Mirroring the brand tokens into a Flutter app is `../flutter/SKILL.md`'s. Pure backend/data/infra with no UI surface: decline — there is nothing to design. Three references live outside this repo and are named for direction only, not invocable here: *frontend-design-direction* for dense internal tooling used daily (never paint a marketing skin on a tool that needs repeated daily use — fold its judgment in via the DIRECTION BRIEF); *liquid-glass-design* for native iOS 26 SwiftUI Liquid Glass (this skill ships the *web* glass approximation only); *motion-ui* / *motion-foundations* for motion-code mechanics (springs, `AnimatePresence` internals, layout animations — this skill sets motion *intent + budget*).
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
## Brand grounding — before you design anything
|
|
18
18
|
|
|
19
|
-
-
|
|
20
|
-
- Doing a redesign or a polish pass on an existing surface.
|
|
21
|
-
- Writing hero, value-prop, pricing, or FAQ copy.
|
|
22
|
-
- Choosing a visual system: type, color, spacing, radius, shadow, motion.
|
|
23
|
-
- Rescuing a UI that "feels generic / AI-slop".
|
|
24
|
-
- Running pre-launch design QA.
|
|
25
|
-
|
|
26
|
-
Do NOT use when (delegate or decline):
|
|
27
|
-
|
|
28
|
-
- Pure backend/data/infra work with no UI surface → decline; there is nothing to design.
|
|
29
|
-
- Dense internal operational tooling used daily (not a sales page) → apply product-domain judgment and do NOT force a landing composition (the *frontend-design-direction* lens, an external reference — not a repo skill).
|
|
30
|
-
- Native iOS/SwiftUI Liquid Glass material → the *liquid-glass-design* reference (external; this skill ships the *web* glass approximation only).
|
|
31
|
-
- Deep motion code mechanics (springs, `AnimatePresence` internals, layout animations) → the *motion-ui* / *motion-foundations* references (external; this skill sets motion *intent + budget*).
|
|
32
|
-
- Deep keyword research, GEO, or a technical SEO audit → the `../marketing/SKILL.md` sibling (it owns SEO-aware structure + keyword/intent; this skill only enforces SEO-aware *structure* in markup).
|
|
33
|
-
|
|
34
|
-
**Tool vs. landing page:** A SaaS operations tool should be dense, quiet, and scannable — never paint a marketing skin on a tool that needs repeated daily use.
|
|
35
|
-
|
|
36
|
-
## Brand grounding (read this first)
|
|
37
|
-
|
|
38
|
-
Before producing ANY landing / web-page / marketing output, ground in the project's brand study. A design with no brand behind it is a guess, and a guess defaults to your AI-generic prior. This step is mandatory and self-reinforcing: **an incomplete brand study is a hard stop, not a warning.**
|
|
19
|
+
A design with no brand behind it is a guess, and a guess defaults to your AI-generic prior. That is why this gate is a hard stop rather than a warning: **an incomplete brand study blocks the work.**
|
|
39
20
|
|
|
40
21
|
Follow the harness 02-DOCS convention (brand study = wiki articles under `02-DOCS/wiki/brand/`, raw inputs under `02-DOCS/raw/brand/`, linked from root `CLAUDE.md`):
|
|
41
22
|
|
|
42
23
|
1. **Locate the brand study.** Read the project root `CLAUDE.md` and look for a `## Brand & voice` section pointing into `02-DOCS/wiki/brand/...`. If present, read those articles.
|
|
43
|
-
2. **If the link is MISSING, or the brand study is ABSENT or INCOMPLETE** (any checklist dimension empty), STOP. Do not design yet.
|
|
44
|
-
- Ask the user the targeted question script — **ONE focused batch at a time**, not a wall of questions — until every dimension in the completeness checklist is filled. (→ `references/brand-grounding.md`)
|
|
45
|
-
- Write/update the brand study into `02-DOCS/wiki/brand/` (and paste any raw inputs the user gives — screenshots, existing palettes, competitor lists — into `02-DOCS/raw/brand/`), following the wiki article format, and update `wiki/index.md` + `wiki/log.md`.
|
|
46
|
-
- Add/update a `## Brand & voice` section in the root `CLAUDE.md` linking to it (create `CLAUDE.md` if absent).
|
|
24
|
+
2. **If the link is MISSING, or the brand study is ABSENT or INCOMPLETE** (any checklist dimension empty), STOP. Do not design yet. Ask the user the targeted question script — **ONE focused batch at a time**, not a wall of questions — until every dimension in the completeness checklist is filled (→ `references/brand-grounding.md`). Write/update the brand study into `02-DOCS/wiki/brand/` (and paste any raw inputs the user gives — screenshots, existing palettes, competitor lists — into `02-DOCS/raw/brand/`), following the wiki article format, update `wiki/index.md` + `wiki/log.md`, and add/update a `## Brand & voice` section in the root `CLAUDE.md` linking to it (create `CLAUDE.md` if absent).
|
|
47
25
|
3. **Only once the brand study exists and is sufficient, proceed** — and cite which brand articles drove which decisions in your output (e.g. "palette from `02-DOCS/wiki/brand/visual-identity.md`").
|
|
48
26
|
|
|
49
27
|
The completeness checklist spans visual identity (OKLCH color system, type pairing & scale, logo, imagery/illustration mood, density, radius/shadow/motion personality), reference/inspiration sites the user loves, layout preferences, dark-mode stance, accessibility & performance constraints, and brand voice/positioning (so copy and design agree). Full checklist + exact question script → `references/brand-grounding.md`.
|
|
50
28
|
|
|
51
|
-
The order is: **brand grounding → trend research → build.**
|
|
29
|
+
The order is: **brand grounding → trend research → build.**
|
|
52
30
|
|
|
53
|
-
##
|
|
54
|
-
|
|
55
|
-
These are constraints, not preferences. Violating any one is a defect, not a style choice.
|
|
56
|
-
|
|
57
|
-
1. **Ground in the brand study before you design.** No `02-DOCS/wiki/brand/` study, or an incomplete one → STOP and complete it. (→ "Brand grounding" above, `references/brand-grounding.md`)
|
|
58
|
-
2. **Research before you prescribe.** Run the research protocol; never ship from stale memory — your default taste skews AI-generic. Pull current 2026 trends with citations + dates. (→ `references/research-method.md`, `references/trends-2026.md`)
|
|
59
|
-
3. **5-second value prop.** What it is, who it's for, and why it's better must be legible above the fold in 5 seconds.
|
|
60
|
-
4. **One `<h1>` per page;** semantic landmarks (`header`/`nav`/`main`/`section`/`footer`).
|
|
61
|
-
5. **Core Web Vitals are design constraints:** LCP < 2.5s, INP < 200ms, CLS < 0.1. (INP replaced FID in March 2024 — measure INP.)
|
|
62
|
-
6. **WCAG 2.2 AA:** 4.5:1 text contrast (3:1 large text / UI), visible focus, `prefers-reduced-motion` honored. Target size: 24×24px is the AA floor (SC 2.5.8 Target Size (Minimum)); 44×44px is the recommended quality bar (Apple HIG / pointer comfort) — aim for 44, never ship below 24.
|
|
63
|
-
7. **Design tokens, never magic numbers.** Tailwind v4 `@theme` → CSS vars.
|
|
64
|
-
8. **Spacing on a 4/8px scale; type on a modular scale; color allocated 60-30-10.**
|
|
65
|
-
9. **Motion must guide attention, communicate state, or preserve continuity** — else delete it.
|
|
66
|
-
10. **Copy is benefit-led and specific.** No hype; the ban-list is enforced. (→ `references/copywriting-frameworks.md`)
|
|
67
|
-
11. **Match the product domain.** Density and composition follow the audience and the job, not a template.
|
|
68
|
-
12. **Commit to a visual concept and one signature element.** A page with no point of view defaults to AI-generic. Name the concept in one sentence; manufacture the ONE distinctive idea (not a gradient); force scale contrast and section rhythm; run the senior-designer crit before shipping. (→ "From competent to premium" below, `references/signature-and-craft.md`)
|
|
69
|
-
|
|
70
|
-
## Decision rules (pick a direction first)
|
|
31
|
+
## Pick a direction first
|
|
71
32
|
|
|
72
33
|
Fill the direction brief before you write a single line of markup:
|
|
73
34
|
|
|
@@ -80,7 +41,7 @@ DIRECTION BRIEF (fill before coding)
|
|
|
80
41
|
5. Constraints ...... framework, a11y, perf budget, existing design system/tokens
|
|
81
42
|
```
|
|
82
43
|
|
|
83
|
-
Then map the project type to composition, density, and motion budget
|
|
44
|
+
Then map the project type to composition, density, and motion budget. Density and composition follow the audience and the job, not a template — a SaaS operations tool should be dense, quiet, and scannable.
|
|
84
45
|
|
|
85
46
|
| Project type | Composition | Density | Motion budget |
|
|
86
47
|
| --- | --- | --- | --- |
|
|
@@ -93,7 +54,7 @@ Then map the project type to composition, density, and motion budget:
|
|
|
93
54
|
|
|
94
55
|
## Research-first protocol
|
|
95
56
|
|
|
96
|
-
Trends churn quarterly and your built-in aesthetic prior is the median of every AI template ever scraped.
|
|
57
|
+
Trends churn quarterly and your built-in aesthetic prior is the median of every AI template ever scraped. Never prescribe from stale memory; counter it with a loop:
|
|
97
58
|
|
|
98
59
|
1. Define 2–3 reference archetypes from the DIRECTION BRIEF (e.g. "Linear-grade dev tool, dark, type-led").
|
|
99
60
|
2. WebSearch award galleries and tier-1 product sites: `awwwards.com`, `godly.website`, `land-book.com`, `mobbin.com`, Refactoring UI, and the tier-1 sites (Linear, Stripe, Vercel, Cursor, Resend).
|
|
@@ -102,46 +63,24 @@ Trends churn quarterly and your built-in aesthetic prior is the median of every
|
|
|
102
63
|
5. Synthesize a one-paragraph DESIGN DIRECTION with citations (which URL contributed what).
|
|
103
64
|
6. Only THEN build; re-check the result against the references in QA.
|
|
104
65
|
|
|
105
|
-
Re-research per project — trends churn, competitors moved, and the domain dictates the reference set.
|
|
66
|
+
Re-research per project — trends churn, competitors moved, and the domain dictates the reference set. Whenever the brand study lacks aesthetic direction or the user asks for "modern" / "2026" / "premium", run this loop, fold the findings into the output **with citations + dates**, and refresh `references/trends-2026.md`. Full loop, source map, and synthesis template → `references/research-method.md`. Current snapshot (dated, cited) → `references/trends-2026.md`.
|
|
106
67
|
|
|
107
68
|
## From competent to premium (the part that earns the score)
|
|
108
69
|
|
|
109
|
-
Obeying every
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
friend. Pick exactly one from a real vocabulary, biased by domain: a hero that *demonstrates not
|
|
120
|
-
describes* (live terminal / real chart / actual diff), an owned type moment, a structural signature
|
|
121
|
-
(asymmetric split, horizontal feature rail, editorial index), a material signature (hairline grid, one
|
|
122
|
-
grain pass, duotone), a motion signature, or a real-number/proof signature. Never default to "a
|
|
123
|
-
gradient". It must be true to the product, and cite the research exemplar that inspired it.
|
|
124
|
-
3. **Force scale contrast.** Generic pages are tonally flat — headline, titles, body all within ~1.5×.
|
|
125
|
-
Make the hero dominant **3–5× the body**, demote eyebrows/labels/metadata smaller and quieter than
|
|
126
|
-
feels comfortable, and allow **one focal point per viewport**. If a section feels flat, add contrast,
|
|
127
|
-
not elements.
|
|
128
|
-
4. **Give the page rhythm.** Ten identical `py-24` white card-grid sections read as one stripe. Vary
|
|
129
|
-
format (full-bleed vs. contained, alternate media sides), background (a dark section between light ones
|
|
130
|
-
anchors a CTA), density (a breathing statement after a dense grid), and container idiom (not everything
|
|
131
|
-
is a bordered card). Inter-section gap > intra-section gap, padding stepping on the scale.
|
|
132
|
-
|
|
133
|
-
Then, **before claiming done, run the senior-designer crit** and make at least one concrete change as a
|
|
134
|
-
result: What is the one idea here (name it in a sentence)? Would this place on Awwwards/Godly or just pass
|
|
135
|
-
review? What is the single most generic element right now — and replace it. Where does the eye land first,
|
|
136
|
-
and is that what should win? If the logo were removed, would anyone know whose product this is? Does every
|
|
137
|
-
section earn its place, or is one there out of habit (cut it)?
|
|
138
|
-
|
|
139
|
-
Full method — concept formula, signature vocabulary, scale/rhythm rules, the crit, and a worked
|
|
140
|
-
generic→signature dev-tool hero — → `references/signature-and-craft.md`.
|
|
70
|
+
Obeying every constraint gets you to *competent* — a page that ships and passes review. It does NOT get you to premium, because every constraint catches an *absence* (no missing `<h1>`, contrast passes), while premium is a *presence*: a point of view. Competent-but-generic is the default failure mode of under-specified design output. Close it with four deliberate moves, in order, before and during the build:
|
|
71
|
+
|
|
72
|
+
1. **Choose a visual concept.** One sentence the whole page answers to — `[feeling] + [structural metaphor] for [audience doing job]` (e.g. "quiet instrument-panel precision for ops engineers"). Drawn from the brand study + research exemplars, never your prior. If you cannot name what makes this surface different from the median SaaS page, you have no concept yet, and the output will default to generic.
|
|
73
|
+
2. **Manufacture the ONE signature element** the brief asks for — the thing you'd describe first to a friend. Pick exactly one from a real vocabulary, biased by domain: a hero that *demonstrates not describes* (live terminal / real chart / actual diff), an owned type moment, a structural signature (asymmetric split, horizontal feature rail, editorial index), a material signature (hairline grid, one grain pass, duotone), a motion signature, or a real-number/proof signature. Never default to "a gradient". It must be true to the product, and cite the research exemplar that inspired it.
|
|
74
|
+
3. **Force scale contrast.** Generic pages are tonally flat — headline, titles, body all within ~1.5×. Make the hero dominant **3–5× the body**, demote eyebrows/labels/metadata smaller and quieter than feels comfortable, and allow **one focal point per viewport**. If a section feels flat, add contrast, not elements.
|
|
75
|
+
4. **Give the page rhythm.** Ten identical `py-24` white card-grid sections read as one stripe. Vary format (full-bleed vs. contained, alternate media sides), background (a dark section between light ones anchors a CTA), density (a breathing statement after a dense grid), and container idiom (not everything is a bordered card). Inter-section gap > intra-section gap, padding stepping on the scale.
|
|
76
|
+
|
|
77
|
+
Then, **before claiming done, run the senior-designer crit** and make at least one concrete change as a result: What is the one idea here (name it in a sentence)? Would this place on Awwwards/Godly or just pass review? What is the single most generic element right now — and replace it. Where does the eye land first, and is that what should win? If the logo were removed, would anyone know whose product this is? Does every section earn its place, or is one there out of habit (cut it)?
|
|
78
|
+
|
|
79
|
+
Concept formula, signature vocabulary, scale/rhythm rules, the crit, and a worked generic→signature dev-tool hero → `references/signature-and-craft.md`.
|
|
141
80
|
|
|
142
81
|
## Visual system in 90 seconds
|
|
143
82
|
|
|
144
|
-
Copy-pasteable foundation. Tokens once, consume everywhere.
|
|
83
|
+
Copy-pasteable foundation. Tokens once, consume everywhere — design tokens, never magic numbers.
|
|
145
84
|
|
|
146
85
|
- Tailwind v4 `@theme` block (OKLCH): tokens become CSS vars and utilities automatically — no `tailwind.config.js`.
|
|
147
86
|
- Type scale via `next/font` (one display + one text face) plus a fluid `clamp()` ladder.
|
|
@@ -227,7 +166,9 @@ Full section-by-section anatomy, CTA cadence, pricing psychology, JSON-LD → `r
|
|
|
227
166
|
|
|
228
167
|
## Conversion copy in one pass
|
|
229
168
|
|
|
230
|
-
|
|
169
|
+
Copy is benefit-led and specific, or the page has no value prop. One `<h1>` per page; semantic landmarks (`header`/`nav`/`main`/`section`/`footer`).
|
|
170
|
+
|
|
171
|
+
- The 5s value-prop test: a stranger reads the hero and can say what it is, who it's for, why it's better — legible above the fold in 5 seconds.
|
|
231
172
|
- Headline formula slots: outcome + timeframe; "X without Y"; the job-to-be-done.
|
|
232
173
|
- Framework picker: PAS for pain-aware cold traffic; AIDA for broad / top-of-funnel; FAB/JTBD for feature → benefit translation.
|
|
233
174
|
- CTA: put the value on the button ("Start free", "Get my estimate"), never "Submit".
|
|
@@ -243,7 +184,7 @@ Frameworks, value-prop canvas, Bad→Good rewrites, VOICE block → `references/
|
|
|
243
184
|
|
|
244
185
|
## Motion & interaction budget
|
|
245
186
|
|
|
246
|
-
- Purposeful-only: motion must guide attention, communicate state, or preserve continuity.
|
|
187
|
+
- Purposeful-only: motion must guide attention, communicate state, or preserve continuity — else delete it.
|
|
247
188
|
- Timing defaults: enter 200–350ms, exit ~150ms, press `scale(0.97)`.
|
|
248
189
|
- Never `transition: all` — it animates layout props and janks.
|
|
249
190
|
- Compositor-only properties: `transform`, `opacity`, `filter`.
|
|
@@ -293,7 +234,7 @@ img { outline: 1px solid oklch(0 0 0 / 0.1); outline-offset: -1px; }
|
|
|
293
234
|
|
|
294
235
|
Depth recipes, glass, noise, concentric math → `references/visual-system.md`.
|
|
295
236
|
|
|
296
|
-
## Anti-patterns
|
|
237
|
+
## Anti-patterns
|
|
297
238
|
|
|
298
239
|
| Rationalization | Reality / Fix |
|
|
299
240
|
| --- | --- |
|
|
@@ -309,6 +250,8 @@ Depth recipes, glass, noise, concentric math → `references/visual-system.md`.
|
|
|
309
250
|
|
|
310
251
|
## Quick reference
|
|
311
252
|
|
|
253
|
+
Accessibility and Core Web Vitals are **design constraints, not post-launch tuning** — violating one is a defect, not a style choice. **WCAG 2.2 AA:** 4.5:1 text contrast (3:1 large text / UI), visible focus, `prefers-reduced-motion` honored. Target size: 24×24px is the AA floor (SC 2.5.8 Target Size (Minimum)); 44×44px is the recommended quality bar (Apple HIG / pointer comfort) — aim for 44, never ship below 24. **Core Web Vitals:** LCP < 2.5s, INP < 200ms, CLS < 0.1. (INP replaced FID in March 2024 — measure INP.)
|
|
254
|
+
|
|
312
255
|
| Lever | Default | Token / where |
|
|
313
256
|
| --- | --- | --- |
|
|
314
257
|
| Type scale ratio | 1.25 | modular scale |
|
|
@@ -366,36 +309,11 @@ The checklist above is pass/fail. When the user asks for a *design review*, a *c
|
|
|
366
309
|
|
|
367
310
|
Score = Σ(dimension × weight), max 115 (normalize to /100 by ×100/115 if you want a percentage). **Bands (on the /115 raw total):** < 69 ships generic — redo; 69–91 competent but improvable — name the lowest two and fix; 92–108 premium; 109+ award-tier. (These are the prior 60/80/95-per-100 cutoffs rescaled to 115.) A surface that scores well on every constraint dimension but low on #1–2 is the classic "competent but generic" result — fix concept and signature first, it has the most leverage. For each dimension below 8, give one concrete, actionable fix (not "improve spacing" but "section padding jumps 48→96px with no 64px step — add `py-16` on mobile"). Cite the brand article or trend source that sets the bar where relevant.
|
|
368
311
|
|
|
369
|
-
##
|
|
370
|
-
|
|
371
|
-
This skill's 02-DOCS record has two parts, both indexed in `02-DOCS/wiki/index.md` (the Knowledge
|
|
372
|
-
map index; root `CLAUDE.md` points to it):
|
|
373
|
-
|
|
374
|
-
- The **brand study** at `02-DOCS/wiki/brand/` — a hard gate (see "Brand grounding" above): if
|
|
375
|
-
missing or incomplete, ask until complete before designing.
|
|
376
|
-
- The **design-system decisions** at `02-DOCS/wiki/stack/design.md` — the chosen tokens
|
|
377
|
-
(color/OKLCH, type scale, spacing, radius, shadow, motion), the 2026 direction picked, and the
|
|
378
|
-
reference sites. Recorded, not gated.
|
|
379
|
-
|
|
380
|
-
Create/update both as decisions are made and index them in `02-DOCS/wiki/index.md` (the Knowledge map;
|
|
381
|
-
root `CLAUDE.md` keeps only a short pointer to it). Read them first on every use and
|
|
382
|
-
keep outputs consistent with them.
|
|
383
|
-
|
|
384
|
-
## See Also
|
|
385
|
-
|
|
386
|
-
**Sibling skills in this repo** (these resolve to real skills you can invoke):
|
|
387
|
-
|
|
388
|
-
- `../marketing/SKILL.md` — the WORDS: value prop, hero/section copy, microcopy, launch, and SEO-aware copy structure + keyword/intent capture. Co-owns the `02-DOCS/wiki/brand/` study (it owns the words dimensions; this skill owns the visual ones). Hand off deep keyword/SEO/GEO work here.
|
|
389
|
-
- `../nextjs/SKILL.md` — the BUILD: App Router / React 19 stack implementation.
|
|
390
|
-
- `../flutter/SKILL.md` — mirror the brand tokens into a Flutter app.
|
|
391
|
-
- `../harness/SKILL.md` — the `02-DOCS` wiki protocol the brand study follows.
|
|
312
|
+
## Recording the decisions (02-DOCS)
|
|
392
313
|
|
|
393
|
-
|
|
314
|
+
Two records, both indexed in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it), both read first on every use so outputs stay consistent with them:
|
|
394
315
|
|
|
395
|
-
-
|
|
396
|
-
-
|
|
397
|
-
- *motion-ui* / *motion-foundations* — deep motion-code mechanics (spring config, `AnimatePresence` internals, layout animations); this skill sets motion *intent + budget* and defers mechanics outward.
|
|
398
|
-
- *product-lens* — validating the "why" before you build.
|
|
399
|
-
- *liquid-glass-design* — native iOS 26 Liquid Glass material (this skill ships the *web* glass approximation only).
|
|
316
|
+
- The **brand study** at `02-DOCS/wiki/brand/` — the hard gate above: missing or incomplete → ask until complete before designing.
|
|
317
|
+
- The **design-system decisions** at `02-DOCS/wiki/stack/design.md` — the chosen tokens (color/OKLCH, type scale, spacing, radius, shadow, motion), the 2026 direction picked, and the reference sites. Recorded, not gated; create/update it as decisions are made.
|
|
400
318
|
|
|
401
|
-
|
|
319
|
+
The wiki article protocol both follow is `../harness/SKILL.md`'s.
|