@ryuxdsgn/design-intelligence 2.10.0 → 2.12.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.
@@ -100,7 +100,7 @@ export const RULES = [
100
100
  num: 5,
101
101
  title: "The product's market first",
102
102
  level: "required",
103
- do: "Start from how users in the product's own market pay, sign in, write addresses, and read money and dates; check a pattern from another market before reusing it. Take the market from the brief or the codebase, and ask when it is unclear.",
103
+ do: "Start from how users in the product's own market pay, sign in, write addresses, and read money and dates; check a pattern from another market before reusing it. Take the market from the brief or the codebase, and ask when it is unclear. When the brief does not name payment methods (or another market-standard capability), show the market's standard set as unconfirmed capabilities, labeled as proposed in Assumptions, rather than leaving them out: a market's table stakes are not \"for later\" (RX-AS-06). Ask when the set would change the flow.",
104
104
  dont: "Import one market's checkout, currency, language, or tax rules into a product built for another market.",
105
105
  why: "Payment, address, and trust habits differ by market (local payment rails, address formats, messaging channels).",
106
106
  basis: "ryux taxonomy of local patterns",
@@ -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
  {
@@ -358,6 +370,19 @@ export const RULES = [
358
370
  basis: `Apple HIG playing haptics; pattern also in ${AP}; written for RYUX`,
359
371
  check: "review the interaction spec",
360
372
  },
373
+ {
374
+ num: 17,
375
+ title: "Choices that change the price sit with the price",
376
+ level: "preferred",
377
+ when: "a screen shows a total that the user's choices change: payment method, insurance, delivery or service tier, add-ons",
378
+ do: "Show each price-changing choice with its current value and its cost inline on the screen that shows the total, so the user sees what they pay for before they confirm.",
379
+ dont: "Hide a choice that changes the price behind a list row or a later screen, or show the total without the choices that make it up.",
380
+ why: "People check a total against the choices behind it; a cost they cannot see next to the total reads as a surprise fee.",
381
+ basis: "ryux run: blind review of a delivery checkout 2026-10-20; NNGroup visual hierarchy; written for RYUX",
382
+ notWhen: "a single fixed price with no choices on the screen",
383
+ tradeoff: "a longer checkout screen; group the choices so the total stays visible",
384
+ check: "review the checkout render: every price-changing choice visible next to the total",
385
+ },
361
386
  ]),
362
387
  ...skill("forms", [
363
388
  {
@@ -464,7 +489,7 @@ export const RULES = [
464
489
  dont: "Ship only the filled, happy-path screen.",
465
490
  why: "Users meet the other states often, and they are where trust is lost.",
466
491
  basis: "Nielsen heuristics 1 and 9",
467
- check: "audit_ui",
492
+ check: "write a matrix in the Delivery Gate: each data view or action × loading / empty / error / success → frame name, or \"cannot happen: reason\"; a blank cell is a FAIL; audit_ui when the ryux MCP is connected",
468
493
  formerly: ["RX-H-14"],
469
494
  },
470
495
  {
@@ -677,7 +702,7 @@ export const RULES = [
677
702
  num: 10,
678
703
  title: "Visual language is chosen, not defaulted",
679
704
  level: "preferred",
680
- do: "Derive the art direction from the brand, the audience, the product context, and reference screens, and write it as a Visual Brief (objective, concept, composition, color, material, lighting, motion, avoid) before designing an expressive surface or generating images, 3D, or motion.",
705
+ do: "Derive the art direction from the brand, the audience, the product context, and reference screens, and write it as a Visual Brief (objective, concept, composition, color, material, lighting, motion, avoid) before designing an expressive surface or generating images, 3D, or motion. For a new product, decide the brand direction before the tokens, task UI included: palette, type, and shape follow from the product's character (fast, warm, trusted, and so on), not from the one accent that passes contrast.",
681
706
  dont: "Reach for the category cliché (coins, money rain, floating dashboards, or gradient blobs for fintech; generic 3D characters for any app), or write an image prompt without a brief (role, concept, composition).",
682
707
  why: "A default visual language makes the product interchangeable with its competitors.",
683
708
  basis: "art direction practice; RX-AS-05 purpose gate",
@@ -703,11 +728,11 @@ export const RULES = [
703
728
  title: "A point of view on expressive surfaces",
704
729
  level: "contextual",
705
730
  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.",
731
+ 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.",
732
+ 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
733
  why: "Users remember a product by its idea; a correct but generic surface is forgotten and could belong to any competitor.",
709
734
  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",
735
+ 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 must carry one signature from the product's own domain (a mark, the type voice, a colour temperature, or one brand moment in the flow), never a layout change and never decoration without a job (RX-AS-05). Record it in the Delivery Gate UI line",
711
736
  tradeoff: "a strong idea takes a decision someone may disagree with; keep it honest and on brand",
712
737
  check: "the swap test (RX-AS-09); review",
713
738
  },
@@ -795,6 +820,19 @@ export const RULES = [
795
820
  basis: `pattern also in ${AS} R-21, R-34; written for RYUX`,
796
821
  check: "render each theme; contrast check",
797
822
  },
823
+ {
824
+ num: 6,
825
+ title: "The component sheet is a spec",
826
+ level: "preferred",
827
+ gate: "lock",
828
+ do: "Lay out each component as a labeled grid: one row per property, one column per state (default, hover on web, pressed, disabled, loading, error), each cell labeled with its variant name, and one line of usage under each component; no overlapping or clipped variants. Render and inspect the sheet like a screen.",
829
+ dont: "Leave variants scattered, unlabeled, or cut off at the frame edge.",
830
+ why: "Developers build from the component sheet; a variant they cannot find or read gets rebuilt or guessed.",
831
+ basis: "ryux run: blind review of a delivery flow 2026-10-20; design-system practice; written for RYUX",
832
+ notWhen: "a single screen with no shared components",
833
+ tradeoff: "takes time to lay out; pays back at handoff",
834
+ check: "render the sheet; every variant visible and labeled",
835
+ },
798
836
  ]),
799
837
  ...skill("accessibility", [
800
838
  {
@@ -1184,7 +1222,7 @@ export const RULES = [
1184
1222
  dont: "Treat a tidy, generic layout as done because it passes every other gate; generic restraint is slop too.",
1185
1223
  why: "Removing slop is the floor, not the ceiling; interchangeable design makes the product forgettable.",
1186
1224
  basis: "ryux delivery principle; Critique Design Read: specificity",
1187
- notWhen: "task UI, where familiarity is the point",
1225
+ notWhen: "task UI, where familiarity is the point: keep the structure familiar, but run the swap test on the brand layer (palette, type, surfaces, iconography, map styling) and report the answer. On a new product, \"only the logo would change\" is a FAIL (RX-UI-12)",
1188
1226
  tradeoff: "takes a design decision, not only removals",
1189
1227
  check: "swap test; review",
1190
1228
  },
@@ -36,7 +36,7 @@ Keep the capabilities apart; do not collapse them into one generic "design" answ
36
36
  | Design | What should we do, and why? | "Keep 24px: it matches the existing layout system." |
37
37
  | Critique | Is this decision right? | "24px leaves the table too sparse at 1440 for daily use." |
38
38
  | QA | Does the build match the intent? | "The build uses 16px where the design says 24px." |`;
39
- export const CORE_PRINCIPLE = `Do not optimize for visual novelty. Optimize for clarity, usability, consistency, product fit,
39
+ export const CORE_PRINCIPLE = `Novelty is not a goal; a recognisable brand layer is: familiar structure, distinct surface. Optimize for clarity, usability, consistency, product fit,
40
40
  accessibility, and intentional decisions. Understand the context before deciding; separate observed
41
41
  facts from assumptions; prefer evidence over aesthetic preference; do not invent requirements;
42
42
  explain meaningful decisions with their trade-off; validate before claiming.`;
@@ -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,7 +85,9 @@ 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
+ 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).
88
91
  3. **Read the modules the task needs** from the task table before deciding anything, for example ux,
89
92
  interaction, forms, and content for a form, or ui and responsive for a layout; for any surface
90
93
  with a visual direction, ui and anti-slop as well. The rules shape the first idea, not only the
@@ -95,7 +98,8 @@ export const DESIGN_BODY = `# RYUX Design
95
98
  task, the one thing that must be seen first, and two or three UX approaches (structure and
96
99
  interaction model) before any visual work, and choose by the task; a small change skips this.
97
100
  5. **Direction.** Write the Design Direction below. On task UI, follow conventions and the design
98
- system. On an expressive surface (hero, landing, onboarding, empty state, brand moment), or when
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
99
103
  the brief asks for a new look or more personality, explore on the canvas before choosing (RX-UI-12):
100
104
  - Render three directions as frames side by side: the main state only, the same content and
101
105
  sample data in each, each labelled with a name and a one-line concept.
@@ -123,18 +127,32 @@ export const DESIGN_BODY = `# RYUX Design
123
127
  RX-AS-10 (accent hues, grey families, radii, display sizes, icon sets, emoji, invented marks, gradients, labels
124
128
  per intent) and report them in the gate. Run the four hierarchy
125
129
  checks from Critique (control beside its data, primary action that reads as an action, not a tab, no fact
126
- twice, grouped by what the user checks together), fix what fails, render again, and check each fix. List where
130
+ twice, grouped by what the user checks together), fix what fails, render again, and check each fix.
131
+ Weight ranking: list the screen's blocks in order of visual weight (size × contrast × surface) and
132
+ compare it with the priority order from step 4. If two blocks of different priority render with the
133
+ same heading style and container, change one. On a checkout or order screen, the choice that sets
134
+ the price and the total rank first and second. A width check is a test, not a deliverable: list
135
+ what broke at each width (wrap, truncation, overflow), fix it or record why it is acceptable, and
136
+ render again; RESPONSIVE PASS names the findings and their fixes. List where
127
137
  the render differs from the Design Direction (hierarchy, states, widths) and fix or record each one. Check the result against the Liveliness you set, and
128
138
  put each prominent or decorative element through the purpose gate (RX-AS-05: purpose,
129
139
  contribution, necessity); on calm task UI, deliberate restraint is a valid answer. Then judge the main state as a
130
140
  reviewer would, not as a checklist: rate Clarity, Hierarchy, and Specificity from the Design Read
131
141
  (capabilities/critique.md), plus Craft (type steps, spacing rhythm, alignment, detail), Strong,
132
- Adequate, or Weak with one reason each, and fix anything Weak before the gate. Generated images and illustrations arrive
142
+ Adequate, or Weak with one reason each, and fix anything Weak before the gate. Reference check:
143
+ put the main state beside two or three reference apps (named in the brief, from the Reference Read,
144
+ or comparable screens from the ryux MCP) and write, per reference, what holds up and what reads
145
+ weaker or more generic in yours (surface, hierarchy, brand layer, assets); no score. Fix what reads
146
+ weaker for the task, and say so when no reference was available. Generated images and illustrations arrive
133
147
  asynchronously: wait until each one has landed and render again before exporting or closing the
134
148
  gate. Never finish with an asset still pending.
135
149
  8. **Fact check, then the gate.** Check every product fact on the canvas (tool and command names,
136
- integrations, platforms, pages, numbers) against the brief or the repo (RX-PR-02), then close
137
- with the Delivery Gate, saying what was not designed, such as other widths or states. If you
150
+ integrations, platforms, pages, numbers) against the brief or the repo (RX-PR-02). Canvas copy is
151
+ for the team, not for RYUX: annotations, state captions, and labels on the canvas use plain
152
+ language ("Shown while prices load; button disabled"); rule IDs, gate results, and Decision
153
+ Receipts go in the Design Direction or the final message, never in frames meant for review or
154
+ handoff. A handoff frame annotates, in plain language, the interaction behaviour, the truncation
155
+ rule for each text that can overflow, and each component's code name. Then close with the Delivery Gate, saying what was not designed, such as other widths or states. If you
138
156
  wrote DESIGN.md, say so in the final message: which file and which fields.
139
157
 
140
158
  ${UNTRUSTED_CONTENT}
@@ -268,7 +286,7 @@ Optional sources (the ryux MCP, Figma, a browser, screenshots, other reference l
268
286
  evidence when connected; none is required.`;
269
287
  export const CORE_HONESTY = `Report what was checked, how, and what was not available. Do not claim "pixel perfect",
270
288
  "fully accessible", "production ready", "senior-level", or "UX optimized" without evidence. Say
271
- "Keyboard and focus checked by hand; no automated accessibility test was available" instead.`;
289
+ "Keyboard and focus checked by hand; no automated accessibility test was available" instead. Rule IDs and gate results belong in your report, never on the design itself.`;
272
290
  export const CORE_DECISION_RECORD = `For consequential choices (RX-PR-09) and deviations, write **Decision**, **Options** compared, **Evidence**,
273
291
  **Trade-off**, and **Choice**. Evidence is Strong (2+ comparable screen_ids), Thin (one, or another context),
274
292
  or None (no screen_id: a judgment call). With None on a consequential choice, show options or ask (RX-PR-10).`;
@@ -725,6 +743,10 @@ run the purpose gate; keep it when the answer is real, as in the last column.
725
743
  | Glass, glow, and blur on every layer | decoration without a job that also lowers contrast | one surface treatment with a purpose (RX-AS-05, RX-A11Y-01) | one overlay needs to show what is behind it |
726
744
  | Stock teamwork or handshake photos | borrowed people implying endorsement | real people with consent, or no people (RX-AS-02, RX-UI-13) | never as evidence of customers |
727
745
  | Cards inside cards, surfaces on surfaces | every nesting level costs a border, a radius, and padding, and the grouping stops meaning anything | one container per real group; separate inside it with spacing or a divider (RX-UI-01) | the inner surface is a distinct object the user acts on, such as a selectable option |
746
+ | Every group boxed in the same white bordered card | the stack of equal boxes flattens priority and reads as a template | one container for the decision the user makes; other groups flat, with a heading and a divider (RX-UI-01) | each box is a selectable option the user compares |
747
+ | One "safe" accent on white with neutral grey everything | the default palette of generated UI; nothing in it is the brand's | colour temperature and surface tone chosen from the product's character (RX-UI-10) | the brand already defines it |
748
+ | A placeholder-grey illustrated map | reads as unfinished, and the map is the product's core visual | a styled map with streets, labels, and the route rendered in the brand palette | wireframe stage, labeled as such |
749
+ | Question headings by default ("Where to?", "What are you sending?") on every step | a generated voice once it repeats; the step's label says less than a plain noun would | a plain label for the field or step; a question only where it is clearest | it is the market's convention, with an observed screen (RX-PR-04) |
728
750
  | One record split into a grid of cards | details that are read together (an order, a profile, a transaction) are scattered into equal boxes | one block with labeled rows or a table (RX-UI-05) | each card is a separate item the user compares or acts on |
729
751
  | A dashboard of KPI tiles and charts that answer no question | decoration in place of the decision the screen supports | lead with what needs attention and the next action; dense tables where people scan (RX-UI-01, RX-UX-01) | each tile drives a decision and links to its detail |
730
752
  | Display-size headings on task UI | a hero-sized title pushes the data and the action below the fold | a heading sized for its rank in the page (RX-UI-01, RX-UI-03) | it is the single message of a marketing or brand page |
package/dist/render.js CHANGED
@@ -37,7 +37,7 @@ export function deliveryGateTemplate() {
37
37
  const lines = [...GATE_AREAS, "FINAL"].map((a) => a === "FINAL"
38
38
  ? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED`
39
39
  : a === "UI"
40
- ? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · point of view: <concept> | task UI`
40
+ ? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · point of view: <concept> | task UI, signature: <signature>`
41
41
  : a === "PRODUCT"
42
42
  ? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · evidence Strong | Thin | None`
43
43
  : `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuxdsgn/design-intelligence",
3
- "version": "2.10.0",
3
+ "version": "2.12.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": {