@ryuxdsgn/design-intelligence 2.9.3 → 2.11.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.
@@ -71,7 +71,7 @@ export const RULES = [
71
71
  notWhen: "This rule is not a reason to drop content the brief implies or to leave a screen looking unfinished: sample content is RX-AS-03, design assumptions are yours to make.",
72
72
  why: "Invented facts turn into promises and bugs that someone has to unwind; a screen trimmed to the brief's literal words reads unfinished and hides what still needs confirming.",
73
73
  basis: `${RUN}: an unconstrained agent invented a 30-day trial and user counts; ryux visual benchmark 2.6 human rater, 2026-10-13: RYUX screens lost on a missing receipt action`,
74
- check: "review",
74
+ check: "compare every product fact on the screen (features, prices, fees, policies, names, integrations) with the brief, DESIGN.md, docs, or repo; each is sourced or labelled as an assumption; fails on one shown as fact without a source",
75
75
  },
76
76
  {
77
77
  num: 3,
@@ -83,7 +83,7 @@ export const RULES = [
83
83
  notWhen: "Monitoring and configuration screens (dashboards, settings) need a clear goal but not a single dominant action; do not invent one to satisfy this rule.",
84
84
  why: "A single clear path shortens the decision and the task.",
85
85
  basis: "Hick's law (Hick 1952; Hyman 1953): more options, longer decisions; NNGroup visual hierarchy",
86
- check: "review",
86
+ check: "name the screen's goal and its primary action, then count the controls styled as primary in the main state; fails when two compete at the same weight",
87
87
  },
88
88
  {
89
89
  num: 4,
@@ -196,6 +196,18 @@ export const RULES = [
196
196
  check: "heuristic_eval H-06",
197
197
  formerly: ["RX-H-06"],
198
198
  },
199
+ {
200
+ num: 10,
201
+ title: "Change what is broken, keep what works",
202
+ notWhen: "a new product or screen with nothing to keep, or a brief that asks to replace the whole design",
203
+ tradeoff: "a redesign can look less new; the gain is in fewer regressions and less relearning",
204
+ level: "required",
205
+ do: "Before changing an existing screen or flow, list what works today (from Analyze, the user, or analytics) and keep it. Every significant change names the problem it fixes and its evidence (a Critique finding, a user report, a metric); a pattern with no named problem stays as it is. Report what was kept as well as what changed.",
206
+ dont: "Replace a working layout, component, or interaction for novelty; restyle parts the brief did not ask to change; or treat \"more modern\" as a problem by itself.",
207
+ why: "A redesign that throws away what people already know costs them relearning and can make the product worse while looking newer.",
208
+ basis: "ryux design principle (owner, 2026-10-19); Jakob's law (people expect a product to work like the ones they already know); ryux run: judge and motion benchmarks 2026-10-18; written for RYUX",
209
+ check: "the change list, each with its problem and evidence; the kept list; review",
210
+ },
199
211
  ]),
200
212
  ...skill("interaction", [
201
213
  {
@@ -209,7 +221,7 @@ export const RULES = [
209
221
  dont: "Ship an action whose in-progress, result, or failure behavior is undefined.",
210
222
  why: "Undefined behavior becomes inconsistent behavior once it is implemented.",
211
223
  basis: "Nielsen heuristics 1 and 9; peak-end rule (Kahneman et al. 1993): people judge an experience largely by its most intense moment and its end; ryux interaction model",
212
- check: "review",
224
+ check: "for each async action, point to its before, during, result, and recovery states in the render or the design file; fails on any that is missing",
213
225
  },
214
226
  {
215
227
  num: 2,
@@ -703,11 +715,11 @@ export const RULES = [
703
715
  title: "A point of view on expressive surfaces",
704
716
  level: "contextual",
705
717
  when: "the surface is expressive: a hero, landing page, onboarding, empty state, or brand moment, or the brief asks for a new look or more personality",
706
- do: "Before designing, make three directions, each with a name, a concept taken from the product's own idea (for a tool about evidence: receipts, citations, marks of proof), and a signature element (type, composition, imagery, or motion). Render them as frames of the main state with the same content, different on at least two structural axes (information order, layout model, interaction model, type class, colour temperature), rate each against criteria taken from the brief, recommend one (RX-PR-09), and let the user choose; then make the rest of the design serve the chosen signature and put its concept in the Visual Brief.",
707
- dont: "Show three directions that differ only in colour or copy, choose for the user without showing them, or let the signature be the category's default (for developer tools a terminal or agent-session panel; for SaaS a dashboard screenshot; copy on the left and product on the right), or relabel that default as a concept. A product screen can support the signature, not be it.",
718
+ do: "Before designing, make three directions, each with a name, a concept taken from the product's own idea (for a tool about evidence: receipts, citations, marks of proof), and a signature element (type, composition, imagery, or motion). Render them as frames of the main state with the same content, different on at least two structural axes (information order, layout model, interaction model, type class, colour temperature), rate each against criteria taken from the brief, recommend one (RX-PR-09), and let the user choose; then make the rest of the design serve the chosen signature and put its concept in the Visual Brief. When the brief names reference products, read each one before it shapes the direction: the principle you borrow, what stays theirs (colours, mascot, signature features), and where you use it.",
719
+ dont: "Show three directions that differ only in colour or copy, choose for the user without showing them, or let the signature be the category's default (for developer tools a terminal or agent-session panel; for SaaS a dashboard screenshot; copy on the left and product on the right), or relabel that default as a concept. A product screen can support the signature, not be it. Turn a named reference into adjectives (\"calm, white, soft\") or copy what belongs to its brand.",
708
720
  why: "Users remember a product by its idea; a correct but generic surface is forgotten and could belong to any competitor.",
709
721
  basis: "brand and art direction practice; RX-UI-05 layout from content; rendered variants on named axes, compared side by side, chosen by the user: pattern also in emilkowalski/skills (MIT) prototype; written for RYUX",
710
- notWhen: "task UI such as forms, tables, settings, and checkout, where restraint and convention win",
722
+ notWhen: "task UI such as forms, tables, settings, and checkout, where restraint and convention win: skip the three directions and keep structure and interaction conventional. A new product's brand layer may still carry one signature from the product's own domain (a mark, the type voice, or one brand moment in the flow), never a layout change and never decoration without a job (RX-AS-05)",
711
723
  tradeoff: "a strong idea takes a decision someone may disagree with; keep it honest and on brand",
712
724
  check: "the swap test (RX-AS-09); review",
713
725
  },
@@ -717,7 +729,7 @@ export const RULES = [
717
729
  level: "contextual",
718
730
  when: "the design needs photos, illustration, 3D, icons, logos, or video",
719
731
  do: "Pick each asset's source in this order: real product screens or the brand's own assets; a licensed library (one icon set, photos whose license you can name); a custom or generated asset made from the Visual Brief and labeled illustrative; otherwise a placeholder that looks like one (RX-AS-03). Record where each asset came from.",
720
- dont: "Draw or imitate another company's logo, mix icon sets, use a photo you cannot license, or fill a gap with a generic stock scene.",
732
+ dont: "Draw or imitate another company's logo, invent the product's own mark (RX-AS-11), mix icon sets, use a photo you cannot license, or fill a gap with a generic stock scene.",
721
733
  why: "Assets carry claims about the product and its users; an unsourced or borrowed asset is a claim nobody can back.",
722
734
  basis: "licensing and trademark practice; RX-UI-07; RX-AS-02",
723
735
  notWhen: "a wireframe or internal prototype where placeholders are expected",
@@ -759,7 +771,7 @@ export const RULES = [
759
771
  dont: "Create a near-duplicate component or pattern for one screen.",
760
772
  why: "Duplicates drift apart, multiply maintenance, and break consistency.",
761
773
  basis: "Design-system practice",
762
- check: "review",
774
+ check: "for each new component or token, name the existing ones searched and why none fits; fails on a new one that duplicates an existing one",
763
775
  },
764
776
  {
765
777
  num: 2,
@@ -830,7 +842,7 @@ export const RULES = [
830
842
  dont: "Build pointer-only actions, or remove focus outlines without an accessible replacement.",
831
843
  why: "Keyboard and switch users navigate and act by focus.",
832
844
  basis: "WCAG 2.2 SC 2.1.1, 2.4.3, and 2.4.7; WAI-ARIA APG dialog pattern",
833
- check: "review",
845
+ check: "tab through the render from the top: every control is reached in reading order and shows a visible focus indicator (3:1 against its background); fails on a skipped control, a focus trap, or an invisible focus",
834
846
  formerly: ["RX-H-13"],
835
847
  },
836
848
  {
@@ -842,7 +854,7 @@ export const RULES = [
842
854
  dont: "Build structure or controls from styled divs, or ship unlabeled icon buttons.",
843
855
  why: "Assistive technology navigates by semantics and announces unlabeled buttons as just \"button\"; native controls bring keyboard and platform behavior for free.",
844
856
  basis: "WCAG 2.2 SC 1.1.1, 1.3.1, and 4.1.2",
845
- check: "review",
857
+ check: "read the accessibility tree (a Playwright accessibility snapshot, or the design file's layer types): every control is a native element or has a role, and every one has a name; headings are in order; fails on an unnamed control or a div acting as a button",
846
858
  },
847
859
  {
848
860
  num: 6,
@@ -962,7 +974,7 @@ export const RULES = [
962
974
  dont: "Hard-code business rules or API behavior nobody specified.",
963
975
  why: "Invented logic ships as real behavior.",
964
976
  basis: "ryux product principle (see RX-PR-02)",
965
- check: "review",
977
+ check: "list each rule the UI code computes (fees, limits, eligibility, rounding, dates) and its source (API, spec, brief); fails on any computed from a guess",
966
978
  },
967
979
  {
968
980
  num: 5,
@@ -1092,7 +1104,7 @@ export const RULES = [
1092
1104
  dont: "Invent \"48.000+ users\", \"4,8★\", or \"+12%\".",
1093
1105
  why: "Invented numbers are false claims, however polished the page.",
1094
1106
  basis: `${RUN}: pen.dev landing without ryux`,
1095
- check: "review",
1107
+ check: "list every number on the screen with its source (brief, docs, data, or a sample label); fails on any number without one",
1096
1108
  formerly: ["RX-C-03"],
1097
1109
  },
1098
1110
  {
@@ -1104,7 +1116,7 @@ export const RULES = [
1104
1116
  dont: "Make up testimonials, reviewers, or customer photos.",
1105
1117
  why: "Fake people are fake endorsements.",
1106
1118
  basis: "ryux anti-slop principle",
1107
- check: "review",
1119
+ check: "list every person, quote, review, and customer logo on the screen with its source or its sample label; fails on any shown as real without a source",
1108
1120
  formerly: ["RX-C-04"],
1109
1121
  },
1110
1122
  {
@@ -1128,7 +1140,7 @@ export const RULES = [
1128
1140
  dont: "Write \"only 2 left\", \"offer ends tonight\", or fake countdowns with nothing behind them.",
1129
1141
  why: "Manufactured pressure erodes trust once users notice.",
1130
1142
  basis: `NNGroup credibility research; ${RUN}: WhatsApp promo`,
1131
- check: "review",
1143
+ check: "find every timer, deadline, stock count, and 'only N left'; each comes from the brief or real data; fails on any without a source",
1132
1144
  formerly: ["RX-N-09", "RX-C-10"],
1133
1145
  },
1134
1146
  {
@@ -1151,7 +1163,7 @@ export const RULES = [
1151
1163
  dont: "Add settings, sections, abstractions, or packages \"for later\", or features because similar products have them.",
1152
1164
  why: "Unneeded complexity costs every user and every future change.",
1153
1165
  basis: "Nielsen heuristic 8; Tesler's law of conserved complexity (Tesler, 1980s): some complexity cannot be removed, only moved; clean-code practice",
1154
- check: "review",
1166
+ check: "list each element, option, state, and dependency the work added and the need it serves; fails on any without one",
1155
1167
  formerly: ["RX-K-05"],
1156
1168
  },
1157
1169
  {
@@ -1184,7 +1196,7 @@ export const RULES = [
1184
1196
  dont: "Treat a tidy, generic layout as done because it passes every other gate; generic restraint is slop too.",
1185
1197
  why: "Removing slop is the floor, not the ceiling; interchangeable design makes the product forgettable.",
1186
1198
  basis: "ryux delivery principle; Critique Design Read: specificity",
1187
- notWhen: "task UI, where familiarity is the point",
1199
+ notWhen: "task UI, where familiarity is the point: the structure stays familiar; on a new product, ask the swap question of the brand layer only (RX-UI-12)",
1188
1200
  tradeoff: "takes a design decision, not only removals",
1189
1201
  check: "swap test; review",
1190
1202
  },
@@ -1193,12 +1205,24 @@ export const RULES = [
1193
1205
  title: "Count before handoff",
1194
1206
  level: "required",
1195
1207
  gate: "lock",
1196
- do: "Before handing off, count on the render or in the design file's variables, and report the counts: accent hues 1 (status colors, and secondary colors the brand defines, are named and excluded); grey families 1; corner radii only from the scale, matching the shape lock; display sizes per screen 1; icon sets 1, in the chosen icon style; emoji in interface chrome 0; gradients without a brand reason 0; labels for the same intent 1. A count over its limit fails unless the brief or DESIGN.md gives the reason.",
1208
+ do: "Before handing off, count on the render or in the design file's variables, and report the counts: accent hues 1 (status colors, and secondary colors the brand defines, are named and excluded); grey families 1; corner radii only from the scale, matching the shape lock; display sizes per screen 1; icon sets 1, in the chosen icon style; emoji in interface chrome 0; invented logos or app icons 0 (RX-AS-11); gradients without a brand reason 0; labels for the same intent 1. A count over its limit fails unless the brief or DESIGN.md gives the reason.",
1197
1209
  dont: "Judge consistency by eye only, or hand off a screen with five accent hues, mixed icon sets, or two labels for one action because it looks fine.",
1198
1210
  why: "Counts are harder to talk past than impressions; a design that passed a by-eye review still shipped five hues and the wrong tab icons.",
1199
1211
  basis: `isolation effect (von Restorff 1933): several accents cancel each other out; pattern also in ${AP}, anti-slop counts; written for RYUX; owner review 2026-10-17: withryux.pen passed RYUX with 5+ hues and wrong tab icons`,
1200
1212
  check: "count on the render or the design file's variables; report in the Delivery Gate",
1201
1213
  },
1214
+ {
1215
+ num: 11,
1216
+ title: "The product's own mark",
1217
+ level: "required",
1218
+ gate: "hard",
1219
+ when: "the design has a logo, wordmark, app icon, or favicon",
1220
+ do: "Use the brand's own file wherever the product's mark appears: look in the repo (public/, assets/, the app icon and favicon), DESIGN.md, the design file's components, and what the user attached, and name the file you used. With no file, set the product name in plain text in the brand's type, or leave a visible [LOGO] placeholder, and list the mark as missing in the handoff.",
1221
+ dont: "Stand in for the mark with initials in a circle, an emoji, a generic shape, an invented SVG, a letter cut into a tile, or the name typeset to look like a logo; generate a favicon or app icon the user did not ask for; or redraw the brand's mark instead of using its file. Designing a mark is its own task, done only when the user asks for it.",
1222
+ why: "An invented mark looks finished and is the first thing a team has to throw away; it also passes for a decision nobody made.",
1223
+ basis: `pattern also in superdesign-skill (MIT), logo invariant; RX-UI-13 asset provenance; ryux owner review 2026-10-18 (the logo and favicon are the owner's to make); written for RYUX`,
1224
+ check: "list every mark slot and the file it uses, or the placeholder; fails on a slot filled by an invented mark",
1225
+ },
1202
1226
  ]),
1203
1227
  ];
1204
1228
  // Rules retired in rules 1.3: merged into another rule, or moved into a skill's guide as guidance.
@@ -1290,10 +1314,10 @@ export const QUALITY_LOCKS = [
1290
1314
  // Contextual activation: load only what the task needs (core is always loaded).
1291
1315
  export const ACTIVATION = [
1292
1316
  { task: "UI implementation", skills: ["product", "ux", "ui", "design-system", "frontend", "visual-qa", "anti-slop"] },
1293
- { task: "Form implementation", skills: ["product", "ux", "forms", "interaction", "accessibility", "edge-cases", "content"] },
1317
+ { task: "Form implementation", skills: ["product", "ux", "forms", "interaction", "accessibility", "edge-cases", "content", "ui", "anti-slop"] },
1294
1318
  { task: "Mobile UI", skills: ["ux", "ui", "responsive", "accessibility", "anti-slop"] },
1295
- { task: "Checkout or payment", skills: ["product", "interaction", "forms", "content", "edge-cases"] },
1296
- { task: "Data-heavy view (list, table, dashboard)", skills: ["ux", "edge-cases", "responsive", "design-system", "frontend"] },
1319
+ { task: "Checkout or payment", skills: ["product", "interaction", "forms", "content", "edge-cases", "ui", "anti-slop"] },
1320
+ { task: "Data-heavy view (list, table, dashboard)", skills: ["ux", "edge-cases", "responsive", "design-system", "frontend", "ui", "anti-slop"] },
1297
1321
  { task: "Frontend logic or utilities (formatting, state, data shown to users)", skills: ["frontend", "content", "edge-cases"] },
1298
1322
  { task: "Copy only (UI text, chat, announcements)", skills: ["content", "anti-slop"] },
1299
1323
  { task: "Visual refinement", skills: ["ui", "design-system", "visual-qa", "anti-slop"] },
@@ -67,7 +67,8 @@ export const DESIGN_BODY = `# RYUX Design
67
67
  questions alone, most consequential first, at most three, in one message, before designing.
68
68
  A product rule that changes which states or actions the screen has (refunds, fees, what happens
69
69
  on failure) is a major decision. When the prompt and DESIGN.md disagree, the prompt wins for
70
- this task; say so.
70
+ this task; say so. A DESIGN.md written for a different product (another name, domain, or
71
+ audience than this brief) sets no direction for this task: say so, and treat direction as unset.
71
72
  **Direction is the user's call:** when neither the prompt nor DESIGN.md sets the UI direction
72
73
  (character, or brand colour and type) or the motion direction, ask for it in that message (it
73
74
  counts toward the three) instead of choosing it yourself. **No DESIGN.md and no product docs is the
@@ -84,14 +85,21 @@ export const DESIGN_BODY = `# RYUX Design
84
85
  2. **Understand what exists.** When there is a screen, product, or design system already, read its
85
86
  analysis or run Analyze first (capabilities/analyze.md). Existing screens, components, and any
86
87
  screenshot or reference provided are your examples: read them before choosing patterns, take
87
- their principles, and never copy their facts. Understand before you design.
88
- 3. **Decide with evidence.** For consequential choices, compare two or three patterns, using
88
+ their principles, and never copy their facts. Understand before you design. When the task
89
+ redesigns or improves what exists, list what works and keep it; change only what has a named
90
+ problem (RX-UX-10).
91
+ 3. **Read the modules the task needs** from the task table before deciding anything, for example ux,
92
+ interaction, forms, and content for a form, or ui and responsive for a layout; for any surface
93
+ with a visual direction, ui and anti-slop as well. The rules shape the first idea, not only the
94
+ review of it.
95
+ 4. **Decide with evidence.** For consequential choices, compare two or three patterns, using
89
96
  reference screens when the ryux MCP is connected (RX-PR-09), and rate the evidence (RX-PR-10).
90
97
  On a complex or ambiguous surface (a new flow, a dashboard, a multi-step form), name the primary
91
98
  task, the one thing that must be seen first, and two or three UX approaches (structure and
92
99
  interaction model) before any visual work, and choose by the task; a small change skips this.
93
- 4. **Direction.** Write the Design Direction below. On task UI, follow conventions and the design
94
- system. On an expressive surface (hero, landing, onboarding, empty state, brand moment), or when
100
+ 5. **Direction.** Write the Design Direction below. On task UI, follow conventions and the design
101
+ system; a new product's brand layer may carry one signature from its own domain, never a layout
102
+ change (RX-UI-12, Not when). On an expressive surface (hero, landing, onboarding, empty state, brand moment), or when
95
103
  the brief asks for a new look or more personality, explore on the canvas before choosing (RX-UI-12):
96
104
  - Render three directions as frames side by side: the main state only, the same content and
97
105
  sample data in each, each labelled with a name and a one-line concept.
@@ -106,8 +114,6 @@ export const DESIGN_BODY = `# RYUX Design
106
114
  - Then stop and let the user choose. Build only the chosen one into the full design (states,
107
115
  widths, Visual Direction, RX-UI-10) and mark the others on the canvas as not chosen. When the
108
116
  user has already said to pick for them, continue with the recommendation and say so.
109
- 5. **Read the modules the task needs** from the task table, for example ux, interaction, forms, and
110
- content for a form, or ui and responsive for a layout.
111
117
  6. **Design in the tool.** Use the Figma MCP or the pen.dev MCP. System first: look for the design
112
118
  system that exists (DESIGN.md, a tokens or theme file in the repo, the design file's variables and
113
119
  components, a linked library) and build from it. Create only what is missing: variables for color
@@ -118,7 +124,7 @@ export const DESIGN_BODY = `# RYUX Design
118
124
  7. **Render and inspect.** Screenshot what you made, check it against the direction and the rules,
119
125
  fix, and render again (capabilities/qa.md). Count the values still literal (color, spacing,
120
126
  radius, type size) and turn each into a variable or name the exception, then run the counts of
121
- RX-AS-10 (accent hues, grey families, radii, display sizes, icon sets, emoji, gradients, labels
127
+ RX-AS-10 (accent hues, grey families, radii, display sizes, icon sets, emoji, invented marks, gradients, labels
122
128
  per intent) and report them in the gate. Run the four hierarchy
123
129
  checks from Critique (control beside its data, primary action that reads as an action, not a tab, no fact
124
130
  twice, grouped by what the user checks together), fix what fails, render again, and check each fix. List where
@@ -539,7 +545,7 @@ or a cut (RX-A11Y-08).
539
545
  | Photography | the brand's own shoot | a licensed library you can name | a stranger presented as a customer |
540
546
  | Illustration and 3D | the brand's system | custom or generated from the brief, labeled | a generic character or blob unrelated to the product |
541
547
  | Icons | the project's set | one set that matches the chosen icon style (for example Tabler, Iconoir, Phosphor, or Material Symbols), or a custom set drawn to that style | mixed sets, or one-off icons outside the style |
542
- | Logos | official files from each owner | the name in plain text | a redrawn or imitated logo |
548
+ | Logos | official files from each owner; the product's own file (RX-AS-11) | the name in plain text, or [LOGO] | a redrawn, imitated, or invented logo; initials or an emoji as a mark; a generated favicon or app icon |
543
549
  | Video | real product footage | a screen recording of the real product | stock footage implying use |
544
550
  | Missing | a placeholder that looks like one (RX-AS-03) | | an invented stand-in |
545
551
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuxdsgn/design-intelligence",
3
- "version": "2.9.3",
3
+ "version": "2.11.0",
4
4
  "description": "RYUX: design intelligence for AI agents and designers. One skill, five entry points: Analyze, Design, Build, Critique, and QA, for Claude Code, Codex, Cursor, Gemini CLI, OpenCode, Cline, Copilot, and more.",
5
5
  "type": "module",
6
6
  "bin": {