@ericrisco/rsc 3.3.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +3 -3
  2. package/manifest.json +43 -22
  3. package/package.json +1 -1
  4. package/scripts/lib/default-skill-floor.js +5 -1
  5. package/scripts/lib/domains.js +2 -2
  6. package/scripts/lib/retired-skills.js +4 -0
  7. package/scripts/rsc.js +1 -1
  8. package/skills/design/SKILL.md +4 -3
  9. package/skills/design/evals/cases.yaml +2 -2
  10. package/skills/ftd/SKILL.md +1 -1
  11. package/skills/react/SKILL.md +2 -1
  12. package/skills/ux/SKILL.md +149 -0
  13. package/skills/ux/THIRD_PARTY.md +32 -0
  14. package/skills/ux/evals/cases.yaml +40 -0
  15. package/skills/ux/references/flows.md +124 -0
  16. package/skills/ux/upstream/UPSTREAM.json +59 -0
  17. package/skills/ux/upstream/ux-designer/GUIDE.md +180 -0
  18. package/skills/ux/upstream/ux-designer/LICENSE +21 -0
  19. package/skills/ux/upstream/ux-designer/references/01-core-principles.md +251 -0
  20. package/skills/ux/upstream/ux-designer/references/02-laws-of-ux.md +330 -0
  21. package/skills/ux/upstream/ux-designer/references/03-accessibility.md +411 -0
  22. package/skills/ux/upstream/ux-designer/references/04-visual-design.md +433 -0
  23. package/skills/ux/upstream/ux-designer/references/05-information-architecture.md +432 -0
  24. package/skills/ux/upstream/ux-designer/references/06-interaction-design.md +495 -0
  25. package/skills/ux/upstream/ux-designer/references/07-forms-and-inputs.md +491 -0
  26. package/skills/ux/upstream/ux-designer/references/08-mobile-ux.md +539 -0
  27. package/skills/ux/upstream/ux-designer/references/09-ux-writing.md +493 -0
  28. package/skills/ux/upstream/ux-designer/references/10-user-research.md +533 -0
  29. package/skills/ux/upstream/ux-designer/references/11-design-systems.md +618 -0
  30. package/skills/ux/upstream/ux-designer/references/12a-presence-awareness.md +395 -0
  31. package/skills/ux/upstream/ux-designer/references/12b-conflict-resolution-sync.md +420 -0
  32. package/skills/ux/upstream/ux-designer/references/13a-canvas-navigation.md +388 -0
  33. package/skills/ux/upstream/ux-designer/references/13b-canvas-objects-performance.md +559 -0
  34. package/skills/ux/upstream/ux-designer/references/14-ai-ux-patterns.md +511 -0
  35. package/skills/ux/upstream/ux-designer/references/15-ethical-design.md +419 -0
  36. package/skills/ux/upstream/ux-designer/references/16-onboarding.md +430 -0
  37. package/skills/ux/upstream/ux-designer/references/17-notifications.md +461 -0
  38. package/skills/ux/upstream/ux-designer/references/18-data-visualization.md +453 -0
  39. package/skills/ux/upstream/ux-designer/references/19-search-ux.md +479 -0
  40. package/skills/ux/upstream/ux-designer/references/20-emotional-design.md +382 -0
  41. package/skills/ux/upstream/ux-designer/references/21-data-tables.md +629 -0
  42. package/skills/ux/upstream/ux-designer/references/22-performance-ux.md +626 -0
  43. package/skills/ux/upstream/ux-designer/references/23-internationalization.md +347 -0
  44. package/skills/ux/upstream/ux-designer/references/24-voice-and-multimodal.md +308 -0
  45. package/skills/ux/upstream/ux-designer/references/25a-barcode-camera-scanning.md +342 -0
  46. package/skills/ux/upstream/ux-designer/references/25b-barcode-scanner-workflows.md +412 -0
  47. package/skills/ux/upstream/ux-designer/references/25c-barcode-display.md +277 -0
  48. package/skills/ux/upstream/ux-usability-foundations/GUIDE.md +285 -0
  49. package/skills/ux/upstream/ux-usability-foundations/LICENSE +21 -0
  50. package/skills/ux/upstream/ux-usability-foundations/references/anti-patterns.md +267 -0
  51. package/skills/ux/upstream/ux-usability-foundations/references/checklists.md +130 -0
  52. package/skills/ux/upstream/ux-usability-foundations/references/decision-prompts.md +340 -0
  53. package/skills/ux/upstream/ux-usability-foundations/references/principle-cards.md +449 -0
  54. package/skills/worktrees/SKILL.md +19 -5
  55. package/targets/branch-guard.mjs +59 -4
  56. package/targets/clone-bootstrap.mjs +1 -1
  57. package/targets/session-memory-adapter.mjs +2 -2
  58. package/targets/team-safe-start.mjs +1 -0
  59. package/targets/worktree-reaper.mjs +14 -1
  60. package/skills/ui-engineering/SKILL.md +0 -113
  61. package/skills/ui-engineering/evals/cases.yaml +0 -38
package/README.md CHANGED
@@ -239,7 +239,7 @@ project. rsc handles four things by default:
239
239
  | | What happens | Turn it off |
240
240
  | --- | --- | --- |
241
241
  | **You choose how the project works** | The install asks once: straight on `main`, or branches and pull requests? With branches, a commit on `main` is refused and the agent asks before each change: this branch, a new one, or unlock `main`? It never opens a branch on its own. | «unlock main», or `rsc main unlock` |
242
- | **One workspace per agent** | If another session works in the same folder, new work goes to `.worktrees/<branch>/`, inside the project and never committed. A `post-merge` hook retires it once the branch lands. | `rsc isolation off` |
242
+ | **One workspace per agent** | If another session works in the same folder, new work goes to `.worktrees/<branch>/` at the root you work in (never inside a project folder) and is never committed. A `post-merge` hook retires it once the branch lands. | `rsc isolation off` |
243
243
  | **The agent picks the method** | FTD for simple changes, SDD for complex ones. The agent decides and says why. | Ask for the other lane |
244
244
  | **Knowledge reaches everyone** | `01-TOOLS/`, `02-DOCS/wiki/` and `02-DOCS/attachments/` travel through one exchange branch, `rsc/knowledge`, and reach `main` inside your normal pull requests. | `rsc knowledge-sync off` |
245
245
 
@@ -564,11 +564,11 @@ whether, what and which platform.
564
564
 
565
565
  ### 🌀 Motion & interface craft
566
566
 
567
- [ui-engineering](skills/ui-engineering/) · [variant-explorer](skills/variant-explorer/) · [scroll-film](skills/scroll-film/)
567
+ [variant-explorer](skills/variant-explorer/) · [scroll-film](skills/scroll-film/)
568
568
 
569
569
  ### 🎨 Design & content craft
570
570
 
571
- [design](skills/design/) · [presentations](skills/presentations/) · [course-storytelling](skills/course-storytelling/) · [course-builder](skills/course-builder/) · [technical-writing](skills/technical-writing/) · [translation-l10n](skills/translation-l10n/)
571
+ [design](skills/design/) · [ux](skills/ux/) · [presentations](skills/presentations/) · [course-storytelling](skills/course-storytelling/) · [course-builder](skills/course-builder/) · [technical-writing](skills/technical-writing/) · [translation-l10n](skills/translation-l10n/)
572
572
 
573
573
  ### 🧠 Knowledge & meta
574
574
 
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.3.1",
2
+ "version": "3.5.0",
3
3
  "counts": {
4
4
  "skills": 269,
5
5
  "agents": 34,
@@ -1311,7 +1311,7 @@
1311
1311
  },
1312
1312
  {
1313
1313
  "id": "design",
1314
- "description": "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT component state (ui-engineering).",
1314
+ "description": "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT flows or usability (ux).",
1315
1315
  "tags": [
1316
1316
  "design",
1317
1317
  "ui",
@@ -1323,7 +1323,7 @@
1323
1323
  ],
1324
1324
  "recommends": [
1325
1325
  "landing-copy",
1326
- "ui-engineering",
1326
+ "ux",
1327
1327
  "accessibility",
1328
1328
  "brand-identity",
1329
1329
  "nextjs"
@@ -5108,25 +5108,6 @@
5108
5108
  ],
5109
5109
  "profiles": []
5110
5110
  },
5111
- {
5112
- "id": "ui-engineering",
5113
- "description": "Use when the question is how interface should be BUILT — component boundaries, state that belongs in the URL vs the component, loading/empty/error states, forms, optimistic updates, build vs adopt. NOT the visual system (`design`), NOT framework mechanics (`react`/`nextjs`).",
5114
- "tags": [
5115
- "interface",
5116
- "frontend",
5117
- "architecture",
5118
- "components",
5119
- "state",
5120
- "craft"
5121
- ],
5122
- "recommends": [
5123
- "design"
5124
- ],
5125
- "profiles": [
5126
- "core",
5127
- "full"
5128
- ]
5129
- },
5130
5111
  {
5131
5112
  "id": "unit-economics",
5132
5113
  "description": "Use when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against current norms, and naming the one lever that fixes the worst number. Covers a blended CAC that hides a bleeding channel, and a model that shows profit while each customer loses money. NOT the multi-year P&L or scenario projection (that is `financial-model`).",
@@ -5242,6 +5223,46 @@
5242
5223
  ],
5243
5224
  "profiles": []
5244
5225
  },
5226
+ {
5227
+ "id": "ux",
5228
+ "description": "Use when an app or SaaS must be easy to use: designing complete user flows, screens and every state, navigation, forms, onboarding, tables, dashboards, search or AI features, or auditing usability and accessibility. Anyone finishes the job without a manual; experts go fast. NOT the visual direction (design), NOT the words (landing-copy).",
5229
+ "tags": [
5230
+ "ux",
5231
+ "usability",
5232
+ "user-flows",
5233
+ "flows",
5234
+ "screens",
5235
+ "states",
5236
+ "empty-state",
5237
+ "signup",
5238
+ "modal",
5239
+ "saas",
5240
+ "app",
5241
+ "product-design",
5242
+ "navigation",
5243
+ "forms",
5244
+ "onboarding",
5245
+ "dashboard",
5246
+ "productivity",
5247
+ "accessibility",
5248
+ "wcag",
5249
+ "interaction-design",
5250
+ "usabilidad",
5251
+ "flujos",
5252
+ "pantallas"
5253
+ ],
5254
+ "recommends": [
5255
+ "design",
5256
+ "accessibility",
5257
+ "landing-copy",
5258
+ "react"
5259
+ ],
5260
+ "profiles": [
5261
+ "minimal",
5262
+ "core",
5263
+ "full"
5264
+ ]
5265
+ },
5245
5266
  {
5246
5267
  "id": "variant-explorer",
5247
5268
  "description": "Use when someone wants OPTIONS rather than an answer — 'show me a few versions', picking between approaches by seeing them. Genuinely different candidates, cheap to throw away, trade-off named. NOT the critique that judges one (`design`), NOT the spec (`specify`).",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ericrisco/rsc",
3
- "version": "3.3.1",
3
+ "version": "3.5.0",
4
4
  "description": "A guided harness builder that turns your goal into a minimal, verified AI-agent setup using strict best practices.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,11 @@
18
18
  // `design` joined in 3.3.0 (spec design-from-scratch): it was `full`-only, so most projects designed
19
19
  // with no design skill at all. Only its description is paid for on other turns; the engine it ships
20
20
  // (scripts and data) is never loaded into context.
21
- export const DEFAULT_SKILL_FLOOR = Object.freeze(['orient', 'suggest', 'unslop', 'ftd', 'connect-tool', 'design']);
21
+ //
22
+ // `ux` joined in 3.4.0: `design` decides how a screen looks, `ux` decides whether people can use it —
23
+ // the whole flow, every state, the browser walk. It replaced `ui-engineering`, which was core-only.
24
+ // Only its description is paid for on other turns; the upstream references load on demand.
25
+ export const DEFAULT_SKILL_FLOOR = Object.freeze(['orient', 'suggest', 'unslop', 'ftd', 'connect-tool', 'design', 'ux']);
22
26
 
23
27
  export function withDefaultSkillFloor(skillIds = []) {
24
28
  return [...new Set([...DEFAULT_SKILL_FLOOR, ...skillIds])];
@@ -24,8 +24,8 @@ export const DOMAINS = [
24
24
  { title: 'Ship & operate — platforms', ids: ['vercel', 'netlify', 'cloudflare', 'railway', 'render', 'fly-io', 'coolify', 'hetzner', 'digitalocean', 'aws-essentials', 'gcp-essentials'] },
25
25
  { title: 'Ship & operate — devops', ids: ['docker', 'github-actions', 'git-workflow', 'domains-dns', 'monitoring', 'email-deliverability', 'scaling', 'deployment', 'deprecation'] },
26
26
  { title: 'Ship & operate — quality & security', ids: ['code-review', 'security-scan', 'secure-coding', 'testing-py', 'testing-web', 'testing-go', 'e2e-testing', 'accessibility', 'performance', 'error-handling', 'observability'] },
27
- { title: 'Motion & interface craft', ids: ['ui-engineering', 'variant-explorer', 'scroll-film'] },
28
- { title: 'Design & content craft', ids: ['design', 'presentations', 'course-storytelling', 'course-builder', 'technical-writing', 'translation-l10n'] },
27
+ { title: 'Motion & interface craft', ids: ['variant-explorer', 'scroll-film'] },
28
+ { title: 'Design & content craft', ids: ['design', 'ux', 'presentations', 'course-storytelling', 'course-builder', 'technical-writing', 'translation-l10n'] },
29
29
  { title: 'Knowledge & meta', ids: ['knowledge-ops', 'codebase-onboarding', 'research-ops', 'decision-records', 'continuous-learning', 'skill-scout', 'context-budget', 'roast-me', 'fable-operator'] },
30
30
  ];
31
31
 
@@ -11,9 +11,13 @@
11
11
  //
12
12
  // `design-loop`, `design-dna` and `motion-craft` folded into the rebuilt `design` in 3.3.0 (spec
13
13
  // design-from-scratch): its engine deals the direction, measures the render and owns the motion layer.
14
+ //
15
+ // `ui-engineering` folded into `ux` in 3.4.0: the screen states and form behaviour it owned are
16
+ // `ux`'s state matrix now, and where component state lives is `react`'s.
14
17
  export const RETIRED_SKILLS = Object.freeze({
15
18
  eli5: 'orient', 'show-me': 'orient', bro: 'unslop',
16
19
  'design-loop': 'design', 'design-dna': 'design', 'motion-craft': 'design',
20
+ 'ui-engineering': 'ux',
17
21
  });
18
22
 
19
23
  const retiredTo = (id) => (Object.hasOwn(RETIRED_SKILLS, id) ? RETIRED_SKILLS[id] : id);
package/scripts/rsc.js CHANGED
@@ -927,7 +927,7 @@ async function main() {
927
927
  : 'rsc main lock: branches and pull requests for this project — the default branch is closed for the agent, and it asks before each code change where it goes. Commit .rsc.json so the team gets the same decision.')
928
928
  : (sub === OFF
929
929
  ? 'rsc isolation off: sessions may share this folder without a worktree. Commit .rsc.json so the team gets the same decision.'
930
- : 'rsc isolation on: with another session active in this folder, new work goes to .worktrees/<branch>/. Commit .rsc.json so the team gets the same decision.'));
930
+ : 'rsc isolation on: with another session active in this folder, new work goes to .worktrees/<branch>/ at the root, never inside a project folder. Commit .rsc.json so the team gets the same decision.'));
931
931
  return;
932
932
  }
933
933
  if (sub === 'status') {
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: design
3
- description: "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT component state (ui-engineering)."
3
+ description: "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT flows or usability (ux)."
4
4
  tags: [design, ui, ux, landing, dashboard, frontend, taste]
5
- recommends: [landing-copy, ui-engineering, accessibility, brand-identity, nextjs]
5
+ recommends: [landing-copy, ux, accessibility, brand-identity, nextjs]
6
6
  profiles: [minimal, core, full]
7
7
  origin: risco
8
8
  ---
@@ -91,7 +91,8 @@ launch. Do not claim a check you did not run.
91
91
  ## Hand-offs
92
92
 
93
93
  - The words on a conversion page → `../landing-copy/SKILL.md`.
94
- - Component boundaries, state, loading and error behaviour → `../ui-engineering/SKILL.md`.
94
+ - Flows, screen states, navigation, forms and usability → `../ux/SKILL.md`.
95
+ - Component code and where state lives → `../react/SKILL.md`.
95
96
  - WCAG conformance work → `../accessibility/SKILL.md`.
96
97
  - A full brand system (logo, print colours, usage rules) → `../brand-identity/SKILL.md`.
97
98
  - The App Router build → `../nextjs/SKILL.md`.
@@ -19,8 +19,8 @@ should_not_trigger:
19
19
  route_to: "landing-copy"
20
20
  why: "The words on a conversion page belong to landing-copy; design builds the page around them."
21
21
  - prompt: "Where should the filter state live, in the URL or in the component, and how do we handle loading and errors?"
22
- route_to: "ui-engineering"
23
- why: "How interface is built (state, boundaries, async states) is ui-engineering, not visual design."
22
+ route_to: "react"
23
+ why: "How interface is built (state, boundaries, async states) is react's (and the states it shows are ux's), not visual design."
24
24
  - prompt: "Make our web app pass WCAG 2.2 AA: fix the axe violations and keyboard traps."
25
25
  route_to: "accessibility"
26
26
  why: "Conformance remediation is the accessibility skill's job."
@@ -73,7 +73,7 @@ says which on every turn) — never a branch opened on your own:
73
73
  is no exception: an unrelated change does not go into it without asking. A new branch is named by
74
74
  intent and closes with a pull request. Unlocking is `rsc main unlock`; never without that answer.
75
75
  - **Docs, wiki or config only** → no question, no branch.
76
- - **Another session working in this same folder** → a worktree in `.worktrees/<branch>/`, never a
76
+ - **Another session working in this same folder** → a worktree in `.worktrees/<branch>/` at the root you work in (never inside a project folder), never a
77
77
  branch switch under the other session. Not a question: rsc tells you when that is the case.
78
78
 
79
79
  A worktree only when another session is there: alone, setting one up costs more than it protects.
@@ -10,7 +10,8 @@ origin: risco
10
10
 
11
11
  **Hand-off — picking dependencies.** Which library to reach for (UI primitives, command menus,
12
12
  toasts, OTP inputs, charts, virtualization, drag and drop, state, styling, theming) is
13
- `../ui-engineering/SKILL.md`'s — build vs adopt is decided there, before hand-rolling a component. The look of a page
13
+ this skill's call: reuse what the project already depends on, then prefer a maintained, accessible library
14
+ over hand-rolling a component. How the screen should behave for people is `../ux/SKILL.md`'s. The look of a page
14
15
  or screen, and its motion layer, is `../design/SKILL.md`'s.
15
16
 
16
17
 
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: ux
3
+ description: "Use when an app or SaaS must be easy to use: designing complete user flows, screens and every state, navigation, forms, onboarding, tables, dashboards, search or AI features, or auditing usability and accessibility. Anyone finishes the job without a manual; experts go fast. NOT the visual direction (design), NOT the words (landing-copy)."
4
+ tags: [ux, usability, user-flows, flows, screens, states, empty-state, signup, modal, saas, app, product-design, navigation, forms, onboarding, dashboard, productivity, accessibility, wcag, interaction-design, usabilidad, flujos, pantallas]
5
+ recommends: [design, accessibility, landing-copy, react]
6
+ profiles: [minimal, core, full]
7
+ origin: risco
8
+ ---
9
+
10
+ # ux
11
+
12
+ The bar: someone who has never seen the product finishes the main job **without asking anyone**,
13
+ someone who uses it every day finishes it **fast**, and nobody loses work when something fails. A
14
+ screen that looks good and misses that bar is not done.
15
+
16
+ - **The flow comes before the screen.** Map the whole journey, from arrival to the job done and back
17
+ again, before drawing anything.
18
+ - **Every screen answers five questions:** where am I, what is this, what can I do, what just
19
+ happened, where do I go next.
20
+ - **Every state is designed,** not only the full one: empty, loading, error, offline, no permission,
21
+ too much data.
22
+ - **You prove it by using it,** in a real browser, with the keyboard, at phone width. Reading the
23
+ code is not a check.
24
+
25
+ The depth ships in `upstream/`, two MIT skills copied unmodified (`THIRD_PARTY.md`). This file is the
26
+ method; load only the reference the task touches (table in **Files**).
27
+
28
+ ## 0. Name the job
29
+
30
+ Write four lines before anything else: **who** (first-time, occasional, daily expert, admin),
31
+ **the job** in their words, **done when** (what they can see), and **the risk** (money, data, legal,
32
+ irreversible). Assume motivated but distracted people with average domain knowledge and imperfect
33
+ memory.
34
+
35
+ Ask one question only when the answer changes the design: the main task is unclear, the action is
36
+ risky or irreversible, novices and experts need different things, the platform is unknown, or the
37
+ request asks for a hidden or manipulative pattern. The ready-made questions, each with its default,
38
+ are in `upstream/ux-usability-foundations/references/decision-prompts.md`. Everything else is
39
+ decided by the defaults in `upstream/ux-usability-foundations/GUIDE.md`.
40
+
41
+ ## 1. Map the whole flow
42
+
43
+ Use [references/flows.md](references/flows.md): the flow map, the lifecycle (sign-up, empty
44
+ account, first value, the daily loop, limits, permissions, failures, offline, leaving and coming
45
+ back), the second role (whoever is invited, not only the admin who set it up), and the step count of
46
+ the core loop. Output a table with one row per step and screen. Missing lifecycle rows are the usual
47
+ reason an app "feels broken".
48
+
49
+ ## 2. Design each screen
50
+
51
+ 1. **One job and one primary action.** The primary action is named with a verb and an object
52
+ ("Send invoice"), it is the strongest element, and the destructive action is never the primary
53
+ one.
54
+ 2. **Pick the pattern from the job:** list, detail, form, wizard, settings, dashboard, search, or an
55
+ overlay. Decision trees (modal, side panel or page; which notification type) are in
56
+ `upstream/ux-designer/GUIDE.md`. Navigation and IA in `05-information-architecture.md`.
57
+ 3. **Fill the state matrix** in `references/flows.md` for every screen: default, loading, empty
58
+ (new account and filtered to zero), partial, error, offline, no permission, overflow, pending.
59
+ 4. **Prevent, then recover:** constraints and safe defaults first, inline validation, input kept
60
+ across every failure, undo for anything reversible, confirmation only for the irreversible.
61
+ Forms in `07-forms-and-inputs.md`.
62
+ 5. **Speed for experts:** keyboard shortcuts, command search, bulk actions, saved views, remembered
63
+ filters, sensible defaults. They never replace the visible route for everyone else.
64
+ 6. **Accessible from the start:** native elements first, keyboard reaches everything, visible focus,
65
+ labels, colour never the only signal, targets of at least 24×24 CSS px. WCAG 2.2 AA in
66
+ `03-accessibility.md`.
67
+
68
+ The rules with their numbers (contrast, type, timing, targets, toasts) are in
69
+ `upstream/ux-designer/GUIDE.md` › *Core rules* and *Reference values*. Use them; do not invent
70
+ others.
71
+
72
+ ## 3. How it looks
73
+
74
+ The visual direction (type, palette, composition, pictures) is `../design/SKILL.md`'s, and it runs its
75
+ engine on the screens this skill has specified. What stays here is the hierarchy that serves the job:
76
+ one dominant element per screen, three levels of emphasis, one spacing scale, colour that means state,
77
+ density chosen by the job (monitoring dense, onboarding calm). The tells of generated interfaces are
78
+ listed in `upstream/ux-designer/GUIDE.md` › *Generated-UI defaults to avoid*, and visual detail in
79
+ `04-visual-design.md`.
80
+
81
+ ## 4. Prove it by using it
82
+
83
+ Walk the main job from a cold start in a real browser (the Chrome DevTools tools, when present): a new
84
+ account, then one with data. Then the extremes: keyboard only, 320px wide, 200% zoom, a long
85
+ translated string, empty data, a lot of data, a slow network, a failed request. Run axe or Lighthouse
86
+ when the browser is there. Write down every hesitation and fix the hesitations before polishing
87
+ anything. A check that could not run is reported as not run.
88
+
89
+ ## Review mode
90
+
91
+ When the task is to audit an existing interface: steps 0 and 4 first, then report findings ranked
92
+ by impact on the job, in the format of `upstream/ux-designer/GUIDE.md` › *Reviewing or auditing a
93
+ UI* (Blocker / Major / Minor, where, fix, reference). Inspection order and the full checklists:
94
+ `upstream/ux-usability-foundations/GUIDE.md` › *Workflow for critiquing* and
95
+ `references/checklists.md`. Split quick wins from structural changes. If nothing serious turns up,
96
+ say so in one line.
97
+
98
+ ## Report
99
+
100
+ Say briefly: the person and the job; the flow map; the screens with their primary action and the
101
+ states covered; what was walked in the browser and what was not; the findings or decisions with
102
+ their reference; what still needs real data or real users to confirm.
103
+
104
+ ## Hand-offs
105
+
106
+ - Visual direction, type, palette, pictures, landing pages → `../design/SKILL.md`.
107
+ - The words on a marketing or conversion page → `../landing-copy/SKILL.md`.
108
+ - A formal WCAG conformance programme or audit → `../accessibility/SKILL.md`.
109
+ - Component code, state and data fetching → `../react/SKILL.md` or `../nextjs/SKILL.md`.
110
+ - Measuring a flow with real users at scale → `../analytics/SKILL.md`, `../ab-testing/SKILL.md`.
111
+
112
+ ## Files
113
+
114
+ | Load when the task involves… | File |
115
+ | --- | --- |
116
+ | The whole journey, lifecycle, roles, state matrix | [references/flows.md](references/flows.md) |
117
+ | Workflows, core rules, numbers, decision trees, generated-UI tells | `upstream/ux-designer/GUIDE.md` |
118
+ | Principles, defaults, questions to ask, critique order | `upstream/ux-usability-foundations/GUIDE.md` |
119
+ | Questions with their recommended default | `upstream/ux-usability-foundations/references/decision-prompts.md` |
120
+ | Principles as cards, full checklists, anti-patterns | `upstream/ux-usability-foundations/references/` › `principle-cards.md`, `checklists.md`, `anti-patterns.md` |
121
+ | Nielsen's heuristics, Gestalt | `upstream/ux-designer/references/01-core-principles.md` |
122
+ | Fitts, Hick, Jakob, Tesler, peak-end | `…/02-laws-of-ux.md` |
123
+ | WCAG 2.2, ARIA, EAA | `…/03-accessibility.md` |
124
+ | Type, colour, spacing, hierarchy, dark mode | `…/04-visual-design.md` |
125
+ | Navigation, sitemaps, card sorting | `…/05-information-architecture.md` |
126
+ | Modals, tooltips, drag and drop, motion timing | `…/06-interaction-design.md` |
127
+ | Forms, validation, input types, errors | `…/07-forms-and-inputs.md` |
128
+ | Touch, gestures, responsive, mobile navigation | `…/08-mobile-ux.md` |
129
+ | Microcopy, error messages, tone | `…/09-ux-writing.md` |
130
+ | Interviews, usability tests, surveys, metrics | `…/10-user-research.md` |
131
+ | Tokens, component APIs, design system docs | `…/11-design-systems.md` |
132
+ | Presence, cursors, avatars | `…/12a-presence-awareness.md` |
133
+ | Conflicts, sync, offline, sharing, history | `…/12b-conflict-resolution-sync.md` |
134
+ | Canvas zoom, pan, selection; layers, snapping, performance | `…/13a-canvas-navigation.md`, `…/13b-canvas-objects-performance.md` |
135
+ | Chat, copilots, agents, generative UI | `…/14-ai-ux-patterns.md` |
136
+ | Dark patterns, consent, DSA and GDPR interface rules | `…/15-ethical-design.md` |
137
+ | First run, activation, empty states, checklists | `…/16-onboarding.md` |
138
+ | Notifications, push, toasts, preferences | `…/17-notifications.md` |
139
+ | Charts and dashboards | `…/18-data-visualization.md` |
140
+ | Search, autocomplete, filters, zero results | `…/19-search-ux.md` |
141
+ | Trust, delight, recovering from errors | `…/20-emotional-design.md` |
142
+ | Tables, sorting, pagination, bulk actions | `…/21-data-tables.md` |
143
+ | Loading, skeletons, optimistic updates, Core Web Vitals | `…/22-performance-ux.md` |
144
+ | Localisation, RTL, `Intl`, plurals | `…/23-internationalization.md` |
145
+ | Voice and multimodal input | `…/24-voice-and-multimodal.md` |
146
+ | Barcodes and QR: scanning, scanner workflows, display | `…/25a-barcode-camera-scanning.md`, `…/25b-barcode-scanner-workflows.md`, `…/25c-barcode-display.md` |
147
+ | Which upstream versions ship here, with file hashes | `upstream/UPSTREAM.json` |
148
+
149
+ `…/` is `upstream/ux-designer/references/`.
@@ -0,0 +1,32 @@
1
+ # Third-party work in this skill
2
+
3
+ Both sources are copied unmodified. The exact commit of each, and the sha256 of every file shipped,
4
+ are in `upstream/UPSTREAM.json`; `tests/ux-upstream.test.js` fails if a shipped file drifts from it.
5
+
6
+ ## ux-designer
7
+
8
+ - **Source:** https://github.com/szilu/ux-designer-skill
9
+ - **Licence:** MIT, Copyright (c) 2026 Szilárd Hajba. Full text: `upstream/ux-designer/LICENSE`.
10
+ - **What is here:** `upstream/ux-designer/references/` (29 files), copied unmodified.
11
+ `upstream/ux-designer/GUIDE.md` is the upstream `SKILL.md` with its YAML front matter removed so it
12
+ is not discovered as a second skill; the text is unchanged.
13
+
14
+ ## ux-usability-foundations
15
+
16
+ - **Source:** https://github.com/hueyexe/frontend-agent-skills (`ux-usability-foundations`)
17
+ - **Licence:** MIT, Copyright (c) 2026 hueyexe. Full text: `upstream/ux-usability-foundations/LICENSE`
18
+ (the repository licence).
19
+ - **What is here:** `upstream/ux-usability-foundations/references/` (4 files), copied unmodified.
20
+ `upstream/ux-usability-foundations/GUIDE.md` is the upstream `SKILL.md` with its YAML front matter
21
+ removed; the text is unchanged.
22
+
23
+ ## Written for rsc
24
+
25
+ `SKILL.md` and `references/flows.md` are original to rsc. They route into the upstream material and
26
+ add what neither source covers in depth: mapping a whole application's flows, its lifecycle, its
27
+ roles and the state matrix per screen.
28
+
29
+ ## Updating
30
+
31
+ Copy a reviewed checkout over `upstream/<name>/`, strip the front matter from its `SKILL.md` into
32
+ `GUIDE.md`, and regenerate the hashes and commit in `UPSTREAM.json`. Never an automatic download.
@@ -0,0 +1,40 @@
1
+ skill: ux
2
+
3
+ should_trigger:
4
+ - prompt: "Diseña todos los flujos de la app: desde que alguien se registra hasta que envía su primera factura."
5
+ why: "A whole application journey, the thing this skill maps before any screen."
6
+ - prompt: "New users sign up, see an empty dashboard and leave. What should they see instead?"
7
+ why: "The empty account and first value, rows of the lifecycle this skill owns."
8
+ - prompt: "Revisa la usabilidad de nuestro panel antes de la demo: que cualquiera entienda cómo usarlo."
9
+ why: "A usability audit by use, reported by severity, in Spanish."
10
+ - prompt: "Should editing a customer open a modal, a side panel or a full page?"
11
+ why: "A pattern decision driven by the job, from the decision trees this skill routes to."
12
+ - prompt: "The signup form wipes everything when the email is already taken. How should it behave?"
13
+ why: "Error prevention and recovery in a form."
14
+ - prompt: "Our power users complain the app is slow to work with. How do we make it more productive?"
15
+ why: "Expert speed: shortcuts, command search, bulk actions, saved views."
16
+ - prompt: "What states does this list screen need besides the loaded one?"
17
+ why: "The state matrix, the checklist that replaced ui-engineering's five states."
18
+
19
+ should_not_trigger:
20
+ - prompt: "Give our landing page a distinctive look: type, palette, hero picture."
21
+ route_to: "design"
22
+ why: "Visual direction for a page; design runs its engine for that."
23
+ - prompt: "Write the headline and the call to action for the pricing page."
24
+ route_to: "landing-copy"
25
+ why: "The words on a conversion page."
26
+ - prompt: "My useEffect fires twice in development. Why?"
27
+ route_to: "react"
28
+ why: "Framework mechanics, not how the interface should behave for people."
29
+ - prompt: "Prepare our WCAG 2.2 conformance report for the public tender."
30
+ route_to: "accessibility"
31
+ why: "A formal conformance programme, not designing a flow."
32
+ - prompt: "Convert this PDF contract into plain text."
33
+ route_to: "none"
34
+ why: "No interface or flow involved."
35
+
36
+ capability:
37
+ - prompt: "We are building a SaaS for clinics to book appointments. Map the complete flows for the receptionist and the invited doctor, with the states of each screen."
38
+ why: "Forces the flow map, the second role and the state matrix, before any visual work."
39
+ - prompt: "Audit this app by using it: a new account creating a client and sending an invoice. Report by severity with fixes and references."
40
+ why: "Forces the browser walk and the finding format instead of a code-only review."
@@ -0,0 +1,124 @@
1
+ # Flows — the whole application, before any screen
2
+
3
+ Most apps that "feel broken" have good screens and missing steps: nobody designed the empty account,
4
+ the invited member, the failed payment or the way back after a week away. Map the journey first;
5
+ the screens fall out of it.
6
+
7
+ ## 1. The flow map
8
+
9
+ One table per job. One row per step. Every row names its screen and the states that screen can be
10
+ in when the person arrives.
11
+
12
+ ```
13
+ Person: Office manager · weekly · average domain knowledge
14
+ Job: Send this month's invoice to a client
15
+ Done when: The client has it and the manager can see "Sent" on the invoice
16
+ Risk: Money and a client relationship — sending is not reversible
17
+ ```
18
+
19
+ | # | Step (the person's words) | Screen | Primary action | States on arrival | Way back / out |
20
+ | --- | --- | --- | --- | --- | --- |
21
+ | 1 | Find the client | Clients list | Open client | empty, filtered to zero, many | — |
22
+ | 2 | Start the invoice | Client detail | New invoice | no invoices yet, has drafts | Back to list, filters kept |
23
+ | 3 | Fill the lines | Invoice form | Review invoice | draft restored, validation error | Save as draft |
24
+ | 4 | Check before sending | Review | Send invoice | missing client email, over plan limit | Edit |
25
+ | 5 | Know it worked | Invoice detail | — (status visible) | sending, sent, bounced | Back to client |
26
+
27
+ Rules for the map:
28
+
29
+ - **Steps in the person's words,** not the system's ("Find the client", not "Query CRM entity").
30
+ - **Every row has a way back.** A step with no way back is a defect, unless it is the irreversible
31
+ action and it said so first.
32
+ - **Count the core loop.** Clicks and decisions from "I want to do this" to "done". Each one earns its
33
+ place: can it be defaulted, inferred, remembered or skipped? The daily job gets the fewest steps.
34
+ - **No step depends on memory.** If step 4 needs something seen in step 1, step 4 shows it.
35
+
36
+ ## 2. The lifecycle — rows people forget
37
+
38
+ Walk every one. A row with no answer is a gap in the design, not an edge case.
39
+
40
+ | Moment | What the person must see |
41
+ | --- | --- |
42
+ | Arrives with no account | What the product does for them, then a sign-up asking for the least it can. |
43
+ | Account just created, nothing exists | An empty state that names the first useful action and shows what it produces. Import or a sample, when that is faster than starting blank. |
44
+ | First value | Proof it worked, and the next most useful step. Not a celebration that blocks the screen. |
45
+ | Daily use | The shortest route to the core job: recent items, saved views, shortcuts, remembered filters. |
46
+ | Near or at a plan limit | A warning before the limit; at it, what is blocked, why, and the one action that unblocks it. Never a silent failure. |
47
+ | No permission | Who can do it and a way to ask them. Actions that this role can never use are hidden, not disabled. |
48
+ | Network lost | Work stays on screen, offline is visible, changes sync when back and say so. |
49
+ | Request fails | What failed, what is safe, input intact, retry in one click. |
50
+ | Long operation | Progress, what is happening, whether they can leave and come back. |
51
+ | Payment fails | What happens to their data and when, and the one action that fixes it. |
52
+ | Coming back after weeks | Things where they left them; what changed while away, if anything did. |
53
+ | Leaving | Export first, then delete; what is removed, what stays, and for how long it can be undone. |
54
+
55
+ ## 3. The second role
56
+
57
+ Whoever set the account up is rarely whoever uses it most. Map the flow again for each role that
58
+ exists:
59
+
60
+ - **The invited member:** arrives from an email, has no context, did not choose the product. Their
61
+ first screen is the thing they were invited to, not the generic dashboard.
62
+ - **The admin:** billing, members, roles, security, audit. Rare tasks, high stakes: clarity over
63
+ speed, consequences written out.
64
+ - **The viewer or guest:** sees only what they can act on. No dead buttons.
65
+ - **Support acting as the user,** when the product allows it: clearly marked, never invisible.
66
+
67
+ ## 4. Flows every SaaS needs
68
+
69
+ Check each exists and is mapped; most products ship without two or three of them.
70
+
71
+ | Flow | The part that is usually missing |
72
+ | --- | --- |
73
+ | Sign-up and sign-in | Password managers and paste working; magic link or SSO path; the expired-link screen. |
74
+ | Onboarding to first value | Skippable, resumable, disappears once done. See `../upstream/ux-designer/references/16-onboarding.md`. |
75
+ | Invite and join | The invited person's first screen; resending; an expired invitation. |
76
+ | Create, edit, delete the core object | Drafts, autosave or an unsaved-changes guard, undo after delete. |
77
+ | Find (search, filter, sort) | Zero results that suggest a way out; filters kept when coming back from detail. |
78
+ | Bulk work | How many items, what will change, undo or a summary of what failed. |
79
+ | Import and export | Preview and mapping before import; a report of what was skipped and why. |
80
+ | Notifications | Severity matches reality; per-channel preferences. See `../upstream/ux-designer/references/17-notifications.md`. |
81
+ | Settings | Grouped by subject; changes say when they take effect; dangerous ones apart, at the end. |
82
+ | Plan, billing, limits | Current plan and usage visible; upgrade from the point of need; downgrade explains what is lost. |
83
+ | Account and data deletion | Export offered first; the consequence spelled out; a grace period when the product can keep one. |
84
+
85
+ ## 5. The state matrix
86
+
87
+ Fill it for every screen in the map. "N/A" is allowed; blank is not.
88
+
89
+ | Screen | Default | Loading | Empty (new) | Empty (filtered) | Partial | Error | Offline | No permission | Overflow | Pending item |
90
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
91
+ | Clients list | | | | | | | | | | |
92
+
93
+ What each state needs:
94
+
95
+ - **Loading:** skeleton in the layout of what is coming, after about 300ms so fast loads do not
96
+ flash; progress and cancel past ten seconds.
97
+ - **Empty (new):** why it is empty, the action that fills it, and what it will look like.
98
+ - **Empty (filtered):** the active filters, and a way to clear them. Never the "new account" message.
99
+ - **Partial:** what loaded, what did not, retry for the part that failed.
100
+ - **Error:** what happened in plain words, what is safe, retry; the request id when support needs it.
101
+ - **Offline:** cached data marked as possibly stale; what can still be done.
102
+ - **No permission:** who can grant it, a way to ask.
103
+ - **Overflow:** long names truncated with the full text reachable, many items paginated or
104
+ virtualised with a count, huge numbers formatted.
105
+ - **Pending item:** the row or card marked as working, the rest of the screen usable.
106
+
107
+ ## 6. Expert speed
108
+
109
+ The person who uses the product every day is the one who decides whether it is "productive". For
110
+ each daily job, decide:
111
+
112
+ - the keyboard shortcut and where it is shown (menus, a `?` overlay);
113
+ - whether a command search (Cmd/Ctrl+K) reaches it;
114
+ - which bulk action replaces doing it item by item;
115
+ - which view or filter should be saved or remembered;
116
+ - which field can default from the last time.
117
+
118
+ None of these replaces the visible route; they sit on top of it.
119
+
120
+ ## 7. Walking the map
121
+
122
+ Before calling the flow done, walk it in a browser twice: once as the new person on an empty
123
+ account, once as the daily user with real-sized data. Keyboard only for one of the walks, phone width
124
+ for the other. Every pause, every "where is…", every re-typed value is a row to fix in the map.