@brunosps00/dev-workflow 0.13.0 โ†’ 1.0.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 (148) hide show
  1. package/README.md +106 -122
  2. package/lib/constants.js +16 -36
  3. package/lib/migrate-skills.js +11 -4
  4. package/lib/removed-commands.js +30 -0
  5. package/package.json +1 -1
  6. package/scaffold/en/agent-instructions.md +27 -16
  7. package/scaffold/en/commands/dw-adr.md +2 -2
  8. package/scaffold/en/commands/dw-analyze-project.md +7 -7
  9. package/scaffold/en/commands/dw-autopilot.md +20 -20
  10. package/scaffold/en/commands/dw-brainstorm.md +160 -9
  11. package/scaffold/en/commands/dw-bugfix.md +7 -6
  12. package/scaffold/en/commands/dw-commit.md +1 -1
  13. package/scaffold/en/commands/dw-dockerize.md +9 -9
  14. package/scaffold/en/commands/dw-find-skills.md +4 -4
  15. package/scaffold/en/commands/dw-functional-doc.md +2 -2
  16. package/scaffold/en/commands/dw-generate-pr.md +4 -4
  17. package/scaffold/en/commands/dw-help.md +95 -351
  18. package/scaffold/en/commands/dw-intel.md +76 -12
  19. package/scaffold/en/commands/dw-new-project.md +9 -9
  20. package/scaffold/en/commands/dw-plan.md +175 -0
  21. package/scaffold/en/commands/dw-qa.md +166 -0
  22. package/scaffold/en/commands/dw-redesign-ui.md +7 -7
  23. package/scaffold/en/commands/dw-review.md +198 -0
  24. package/scaffold/en/commands/dw-run.md +176 -0
  25. package/scaffold/en/commands/dw-secure-audit.md +222 -0
  26. package/scaffold/en/commands/dw-update.md +1 -1
  27. package/scaffold/en/references/playwright-patterns.md +1 -1
  28. package/scaffold/en/references/refactoring-catalog.md +1 -1
  29. package/scaffold/en/templates/brainstorm-matrix.md +1 -1
  30. package/scaffold/en/templates/idea-onepager.md +3 -3
  31. package/scaffold/en/templates/project-onepager.md +5 -5
  32. package/scaffold/pt-br/agent-instructions.md +27 -16
  33. package/scaffold/pt-br/commands/dw-adr.md +2 -2
  34. package/scaffold/pt-br/commands/dw-analyze-project.md +7 -7
  35. package/scaffold/pt-br/commands/dw-autopilot.md +20 -20
  36. package/scaffold/pt-br/commands/dw-brainstorm.md +160 -9
  37. package/scaffold/pt-br/commands/dw-bugfix.md +10 -9
  38. package/scaffold/pt-br/commands/dw-commit.md +1 -1
  39. package/scaffold/pt-br/commands/dw-dockerize.md +9 -9
  40. package/scaffold/pt-br/commands/dw-find-skills.md +4 -4
  41. package/scaffold/pt-br/commands/dw-functional-doc.md +2 -2
  42. package/scaffold/pt-br/commands/dw-generate-pr.md +4 -4
  43. package/scaffold/pt-br/commands/dw-help.md +97 -300
  44. package/scaffold/pt-br/commands/dw-intel.md +77 -13
  45. package/scaffold/pt-br/commands/dw-new-project.md +9 -9
  46. package/scaffold/pt-br/commands/dw-plan.md +175 -0
  47. package/scaffold/pt-br/commands/dw-qa.md +166 -0
  48. package/scaffold/pt-br/commands/dw-redesign-ui.md +7 -7
  49. package/scaffold/pt-br/commands/dw-review.md +198 -0
  50. package/scaffold/pt-br/commands/dw-run.md +176 -0
  51. package/scaffold/pt-br/commands/dw-secure-audit.md +222 -0
  52. package/scaffold/pt-br/commands/dw-update.md +1 -1
  53. package/scaffold/pt-br/references/playwright-patterns.md +1 -1
  54. package/scaffold/pt-br/references/refactoring-catalog.md +1 -1
  55. package/scaffold/pt-br/templates/brainstorm-matrix.md +1 -1
  56. package/scaffold/pt-br/templates/idea-onepager.md +3 -3
  57. package/scaffold/pt-br/templates/project-onepager.md +5 -5
  58. package/scaffold/pt-br/templates/tasks-template.md +1 -1
  59. package/scaffold/skills/api-testing-recipes/SKILL.md +6 -6
  60. package/scaffold/skills/api-testing-recipes/references/auth-patterns.md +1 -1
  61. package/scaffold/skills/api-testing-recipes/references/matrix-conventions.md +1 -1
  62. package/scaffold/skills/api-testing-recipes/references/openapi-driven.md +3 -3
  63. package/scaffold/skills/docker-compose-recipes/SKILL.md +1 -1
  64. package/scaffold/skills/dw-codebase-intel/SKILL.md +9 -9
  65. package/scaffold/skills/dw-codebase-intel/agents/intel-updater.md +4 -4
  66. package/scaffold/skills/dw-codebase-intel/references/api-design-discipline.md +1 -1
  67. package/scaffold/skills/dw-codebase-intel/references/incremental-update.md +5 -5
  68. package/scaffold/skills/dw-codebase-intel/references/intel-format.md +1 -1
  69. package/scaffold/skills/dw-codebase-intel/references/query-patterns.md +3 -3
  70. package/scaffold/skills/dw-council/SKILL.md +2 -2
  71. package/scaffold/skills/dw-debug-protocol/SKILL.md +5 -3
  72. package/scaffold/skills/dw-execute-phase/SKILL.md +16 -16
  73. package/scaffold/skills/dw-execute-phase/agents/executor.md +5 -5
  74. package/scaffold/skills/dw-execute-phase/agents/plan-checker.md +4 -4
  75. package/scaffold/skills/dw-execute-phase/references/atomic-commits.md +1 -1
  76. package/scaffold/skills/dw-execute-phase/references/plan-verification.md +2 -2
  77. package/scaffold/skills/dw-execute-phase/references/wave-coordination.md +1 -1
  78. package/scaffold/skills/dw-git-discipline/SKILL.md +5 -2
  79. package/scaffold/skills/dw-incident-response/SKILL.md +168 -0
  80. package/scaffold/skills/dw-incident-response/references/blameless-discipline.md +126 -0
  81. package/scaffold/skills/dw-incident-response/references/communication-templates.md +107 -0
  82. package/scaffold/skills/dw-incident-response/references/postmortem-template.md +133 -0
  83. package/scaffold/skills/dw-incident-response/references/runbook-templates.md +169 -0
  84. package/scaffold/skills/dw-incident-response/references/severity-and-triage.md +186 -0
  85. package/scaffold/skills/dw-llm-eval/SKILL.md +150 -0
  86. package/scaffold/skills/dw-llm-eval/references/agent-eval.md +252 -0
  87. package/scaffold/skills/dw-llm-eval/references/judge-calibration.md +169 -0
  88. package/scaffold/skills/dw-llm-eval/references/oracle-ladder.md +171 -0
  89. package/scaffold/skills/dw-llm-eval/references/rag-metrics.md +186 -0
  90. package/scaffold/skills/dw-llm-eval/references/reference-dataset.md +190 -0
  91. package/scaffold/skills/dw-memory/SKILL.md +2 -2
  92. package/scaffold/skills/dw-review-rigor/SKILL.md +5 -5
  93. package/scaffold/skills/dw-simplification/SKILL.md +4 -4
  94. package/scaffold/skills/dw-source-grounding/SKILL.md +1 -1
  95. package/scaffold/skills/dw-testing-discipline/SKILL.md +103 -78
  96. package/scaffold/skills/dw-testing-discipline/references/agent-guardrails.md +170 -0
  97. package/scaffold/skills/dw-testing-discipline/references/anti-patterns.md +7 -7
  98. package/scaffold/skills/dw-testing-discipline/references/core-rules.md +128 -0
  99. package/scaffold/skills/dw-testing-discipline/references/flaky-discipline.md +3 -3
  100. package/scaffold/skills/dw-testing-discipline/references/{positive-patterns.md โ†’ patterns.md} +1 -1
  101. package/scaffold/skills/dw-testing-discipline/references/playwright-recipes.md +3 -3
  102. package/scaffold/skills/dw-ui-discipline/SKILL.md +103 -79
  103. package/scaffold/skills/dw-ui-discipline/references/accessibility-floor.md +2 -2
  104. package/scaffold/skills/dw-ui-discipline/references/hard-gate.md +93 -73
  105. package/scaffold/skills/dw-ui-discipline/references/state-matrix.md +1 -1
  106. package/scaffold/skills/dw-ui-discipline/references/visual-slop.md +152 -0
  107. package/scaffold/skills/dw-verify/SKILL.md +4 -4
  108. package/scaffold/skills/humanizer/SKILL.md +1 -7
  109. package/scaffold/skills/remotion-best-practices/SKILL.md +3 -1
  110. package/scaffold/skills/security-review/SKILL.md +1 -1
  111. package/scaffold/skills/security-review/languages/csharp.md +1 -1
  112. package/scaffold/skills/security-review/languages/rust.md +1 -1
  113. package/scaffold/skills/security-review/languages/typescript.md +1 -1
  114. package/scaffold/skills/vercel-react-best-practices/SKILL.md +3 -1
  115. package/scaffold/templates-overrides-readme.md +3 -3
  116. package/scaffold/en/commands/dw-code-review.md +0 -385
  117. package/scaffold/en/commands/dw-create-prd.md +0 -148
  118. package/scaffold/en/commands/dw-create-tasks.md +0 -195
  119. package/scaffold/en/commands/dw-create-techspec.md +0 -210
  120. package/scaffold/en/commands/dw-deep-research.md +0 -418
  121. package/scaffold/en/commands/dw-deps-audit.md +0 -327
  122. package/scaffold/en/commands/dw-fix-qa.md +0 -152
  123. package/scaffold/en/commands/dw-map-codebase.md +0 -125
  124. package/scaffold/en/commands/dw-refactoring-analysis.md +0 -340
  125. package/scaffold/en/commands/dw-revert-task.md +0 -114
  126. package/scaffold/en/commands/dw-review-implementation.md +0 -349
  127. package/scaffold/en/commands/dw-run-plan.md +0 -300
  128. package/scaffold/en/commands/dw-run-qa.md +0 -496
  129. package/scaffold/en/commands/dw-run-task.md +0 -209
  130. package/scaffold/en/commands/dw-security-check.md +0 -271
  131. package/scaffold/pt-br/commands/dw-code-review.md +0 -365
  132. package/scaffold/pt-br/commands/dw-create-prd.md +0 -148
  133. package/scaffold/pt-br/commands/dw-create-tasks.md +0 -195
  134. package/scaffold/pt-br/commands/dw-create-techspec.md +0 -208
  135. package/scaffold/pt-br/commands/dw-deep-research.md +0 -172
  136. package/scaffold/pt-br/commands/dw-deps-audit.md +0 -327
  137. package/scaffold/pt-br/commands/dw-fix-qa.md +0 -152
  138. package/scaffold/pt-br/commands/dw-map-codebase.md +0 -125
  139. package/scaffold/pt-br/commands/dw-refactoring-analysis.md +0 -340
  140. package/scaffold/pt-br/commands/dw-revert-task.md +0 -114
  141. package/scaffold/pt-br/commands/dw-review-implementation.md +0 -337
  142. package/scaffold/pt-br/commands/dw-run-plan.md +0 -296
  143. package/scaffold/pt-br/commands/dw-run-qa.md +0 -494
  144. package/scaffold/pt-br/commands/dw-run-task.md +0 -208
  145. package/scaffold/pt-br/commands/dw-security-check.md +0 -271
  146. package/scaffold/skills/dw-testing-discipline/references/ai-agent-gates.md +0 -170
  147. package/scaffold/skills/dw-testing-discipline/references/iron-laws.md +0 -128
  148. package/scaffold/skills/dw-ui-discipline/references/anti-slop.md +0 -162
@@ -1,128 +0,0 @@
1
- # Six Iron Laws โ€” expanded with examples
2
-
3
- The laws are short for memorization. Each carries nuance that matters in practice.
4
-
5
- ## Law 1: Test the behavior, never the mock
6
-
7
- **What it means:** Your test asserts what the system DOES from the caller's perspective. It does not assert that internal call X was made with internal argument Y.
8
-
9
- **Why it matters:** A test bound to internal calls breaks the day you refactor โ€” even when behavior didn't change. The "test is red, behavior is fine" experience erodes trust in the suite. Soon no one runs the suite.
10
-
11
- **Violation example:**
12
-
13
- ```javascript
14
- // BAD โ€” asserting on mock internals
15
- test('createOrder calls inventory.reserve', () => {
16
- const inventory = { reserve: vi.fn() };
17
- createOrder({ items: [...] }, inventory);
18
- expect(inventory.reserve).toHaveBeenCalledWith(items, 'reserve');
19
- });
20
- ```
21
-
22
- You've asserted that `createOrder` USES the inventory adapter in a specific way. Now the refactor that consolidates `reserve` into `commit-with-reservation` breaks this test even though the order still gets created.
23
-
24
- **Correct version:**
25
-
26
- ```javascript
27
- // GOOD โ€” asserting behavior
28
- test('createOrder reserves inventory before confirming', async () => {
29
- const result = await createOrder({ items: [...] });
30
- expect(result.status).toBe('confirmed');
31
- expect(await getInventoryFor(items[0].sku)).toBe(originalStock - 1);
32
- });
33
- ```
34
-
35
- Now the test cares about the OUTCOME (inventory decremented, order confirmed), not the path.
36
-
37
- ## Law 2: Push every test to the lowest layer that can detect the failure
38
-
39
- **What it means:** If a unit test can catch a bug, use it. If only an integration test can catch it, integration. If only an end-to-end run can catch it, E2E. Don't write E2E for what a unit can prove.
40
-
41
- **Why it matters:** Tests at lower layers run faster, fail more precisely, isolate the cause better. A bug in pure logic caught at unit takes 50ms and tells you the exact function. The same bug caught at E2E takes 30 seconds and tells you "checkout failed."
42
-
43
- **The pyramid resolved:**
44
-
45
- | Layer | Catches | Speed | Cost |
46
- |-------|---------|-------|------|
47
- | Unit | Pure logic, math, parsing, formatters | <100ms | low |
48
- | Integration | Module composition, DB queries, HTTP handlers | 500msโ€“5s | medium |
49
- | Contract | Producer/consumer agreement at API boundary | 1โ€“10s | medium |
50
- | E2E | User journey across multiple services | 10sโ€“60s | high |
51
-
52
- **Rule of thumb:**
53
- - If you can write a unit test for it, do so.
54
- - If unit can't reach it (needs DB, queue, real HTTP), write integration.
55
- - E2E only for journeys that NO lower layer can detect (browser-renders-correctly, third-party-callback-arrives, multi-step session state).
56
-
57
- ## Law 3: When a test fails, fix production first โ€” change the test only after writing why
58
-
59
- **What it means:** A red test is a signal. The first question is "what's wrong with production?" Not "why is the test wrong?"
60
-
61
- **Why it matters:** Tests are weakened to pass FAR more often than they should be. "The behavior is fine; the test is too strict" is the slippery slope that leaves you with a green suite full of meaningless assertions.
62
-
63
- **Process when a test goes red:**
64
-
65
- 1. **Read the failure message.** What invariant did the test claim, and what did it observe?
66
- 2. **Read production code** in the path that produces the observation.
67
- 3. **Decide which is wrong.** If production violates the invariant, fix production. If the test mis-states the invariant, document WHY before relaxing.
68
- 4. **Commit the analysis** in the test's commit message or PR body. "Relaxed assertion from X to Y because <reason>" is auditable; "fix test" is not.
69
-
70
- **Anti-pattern:** Re-run the test until green. Auto-retry on flake. Add `.only` to skip the rest.
71
-
72
- ## Law 4: Real systems gate the merge. Mocks isolate; they do not validate.
73
-
74
- **What it means:** Before code merges to main, at least ONE test path exercised real systems (real DB, real route, real external integration in a sandbox or test account). Mocks are fine for fast unit feedback; they cannot decide "safe to ship."
75
-
76
- **Why it matters:** Mock drift is real. The mocked HTTP response from 3 months ago no longer matches the actual API. Tests pass; production fails on first real call.
77
-
78
- **Practical pattern:**
79
-
80
- - Unit tests: mock the world; run on every keystroke / on every commit.
81
- - Integration tests: real local DB (testcontainers, in-memory if equivalent); run on every PR.
82
- - Contract tests: real producer/consumer agreement check; run on every PR.
83
- - E2E: real preview environment with real services; run on PRs before merge to main.
84
-
85
- The discipline: no merge without a green E2E (or equivalent real-system check) for the touched path.
86
-
87
- ## Law 5: Coverage is a flashlight. Mutation score is a quality probe. Neither is a target.
88
-
89
- **What it means:**
90
- - **Coverage** tells you what lines executed. Useful as a NEGATIVE signal: 30% coverage = lots of dark code. Useless as a positive signal: 95% coverage with weak assertions is decorative.
91
- - **Mutation score** introduces small bugs (mutations) and measures whether tests catch them. A high mutation score means tests are actually probing behavior, not just executing lines.
92
- - Neither should be a number you optimize for. They're diagnostics.
93
-
94
- **Anti-pattern:** "We need 90% coverage to merge." Coverage as a gate produces tests written to pass the gate, not to find bugs.
95
-
96
- **Healthier framing:** "What lines in the touched diff are NOT covered? Why?" Sometimes the answer is "we don't care, it's logging." Sometimes it's "actually that's a critical branch, add a test."
97
-
98
- ## Law 6: No test-only methods, branches, or flags leak into production code
99
-
100
- **What it means:** Production code should not have `if (process.env.NODE_ENV === 'test') { ... }` branches. Should not have `// for testing only` methods exposed on classes. Should not export internals just for assertions.
101
-
102
- **Why it matters:** Production code carrying test-only logic is testing decorations leaking into the artifact users run. Bug surface grows; the test environment diverges from production.
103
-
104
- **Correct patterns:**
105
-
106
- - Need to inject a dependency for testing? Use constructor injection / dependency injection.
107
- - Need to assert on internal state? Add a logging hook or event emission that production also benefits from.
108
- - Need to bypass auth in tests? Use a dedicated test environment with test credentials, not a backdoor flag.
109
-
110
- **Tell tales:**
111
- - `// only used in tests` comments.
112
- - `*ForTesting` suffix on methods.
113
- - `vi.spyOn(module, '_internal')` accessing things prefixed with underscore.
114
- - `process.env.E2E_MODE` reaching into production runtime decisions.
115
-
116
- If you see these, the test design is wrong. Refactor production to be testable, don't add backdoors.
117
-
118
- ## Putting the laws together
119
-
120
- A healthy test:
121
- 1. Asserts behavior visible to a caller (Law 1).
122
- 2. Sits at the lowest layer that can prove that behavior (Law 2).
123
- 3. When red, sends you to read production code (Law 3).
124
- 4. Has a sibling that exercises real systems somewhere in the pipeline (Law 4).
125
- 5. Survives a mutation in the code it claims to cover (Law 5).
126
- 6. Has zero footprint in production code (Law 6).
127
-
128
- Any test that fails โ‰ฅ2 of these is technical debt accumulating. `/dw-code-review` flags them.
@@ -1,162 +0,0 @@
1
- # Anti-slop catalog โ€” 14 patterns + 17 anti-defaults
2
-
3
- Every pattern below is a category of slop that LLMs produce when ungrounded. Detection happens in `/dw-code-review` (UI diffs) and design proposals from `/dw-redesign-ui`.
4
-
5
- ## The 14 patterns
6
-
7
- ### 1. Visual sameness
8
-
9
- **What it looks like:** Every section of the page uses the same card style, same padding, same text size, same emphasis weight. The eye finds no anchor.
10
-
11
- **Why it happens:** LLM defaults to "consistent = good," missing that hierarchy needs deliberate variation.
12
-
13
- **Fix:** Establish one primary section per scroll-height. Use size, weight, color saturation, or whitespace differential to anchor the eye. Everything else recedes.
14
-
15
- **Example violation:** Dashboard with 6 identical-looking metric cards. **Fix:** One hero metric (largest, brightest, top), 3 supporting metrics, 2 minor metrics in a different visual treatment.
16
-
17
- ### 2. Weak hierarchy
18
-
19
- **What it looks like:** Headings barely larger than body. Important CTAs same color as secondary. The user can't tell what to look at first.
20
-
21
- **Why it happens:** Defaults to "elegant restraint" without ensuring guidance still works.
22
-
23
- **Fix:** Verify hierarchy by squinting at the design (literally) โ€” what jumps out? If nothing jumps out, hierarchy is failing. Increase contrast in size, weight, or color for the primary element by at least 30%.
24
-
25
- ### 3. Fake interactivity
26
-
27
- **What it looks like:** Hover states that change opacity but the click does nothing meaningful. Buttons that look interactive but don't have a job. Cards with subtle hover but no on-click handler.
28
-
29
- **Why it happens:** LLM applies hover styles to anything that looks card-shaped.
30
-
31
- **Fix:** Hover state ONLY on elements that have an on-click. If it can't be clicked, don't suggest it can. Use cursor: default explicitly on non-interactive shapes.
32
-
33
- ### 4. Emoji spam
34
-
35
- **What it looks like:** ๐ŸŽฏ Goals ยท ๐Ÿš€ Launch ยท โœจ Features ยท ๐Ÿ“Š Analytics ยท ๐Ÿ”ฅ Trending โ€” emojis as decoration in headers, CTAs, and section labels where they add no information.
36
-
37
- **Why it happens:** LLM training data has tons of "emoji in headers = engaging" patterns.
38
-
39
- **Fix:** Use icons (lucide, heroicons, tabler) for semantic meaning; reserve emojis for genuinely emotive contexts (celebrations, errors that need empathy). If you can remove the emoji and the meaning survives, remove it.
40
-
41
- ### 5. Gradient crutch
42
-
43
- **What it looks like:** Hero with diagonal purple-to-pink gradient. Buttons with subtle gradient. Card backgrounds with mesh gradients. Every empty space gets a gradient.
44
-
45
- **Why it happens:** Stable Diffusion / midjourney aesthetics leaked into UI; gradients hide weak composition.
46
-
47
- **Fix:** A gradient must earn its place โ€” usually for hero zones with poetic copy, never for utility surfaces. Solid colors + good hierarchy beat gradients 9 times out of 10.
48
-
49
- ### 6. Glass everything
50
-
51
- **What it looks like:** Frosted-glass effect on modals, cards, dropdowns, side panels โ€” anywhere a surface can be layered.
52
-
53
- **Why it happens:** Apple's macOS aesthetic. Looks "premium" without effort.
54
-
55
- **Fix:** Glass only when there's meaningful content visible behind the surface (a hero image, a busy dashboard). Glass on top of plain backgrounds adds blur for no reason.
56
-
57
- ### 7. Centered all the things
58
-
59
- **What it looks like:** Body paragraphs center-aligned. Headlines centered. Forms with labels centered above inputs. Every text block reads center.
60
-
61
- **Why it happens:** Marketing-page training data biases toward center-aligned.
62
-
63
- **Fix:** Center-align for hero headlines and small CTA labels only. Body text and forms read better left-aligned (in LTR scripts). Tabular data reads in columns, not centered.
64
-
65
- ### 8. AI gray washing
66
-
67
- **What it looks like:** Neutral gray palette everywhere. `slate-50`, `gray-100`, `zinc-200` for backgrounds, borders, text, accents. Nothing has color personality.
68
-
69
- **Why it happens:** "Neutral = safe" default, plus shadcn/ui's neutral start.
70
-
71
- **Fix:** Establish ONE accent color from the curated defaults or brand. Use it intentionally โ€” primary CTAs, active states, the one place the user looks first. Gray is the canvas, not the painting.
72
-
73
- ### 9. Generic CTAs
74
-
75
- **What it looks like:** "Get Started" ยท "Learn More" ยท "Click Here" ยท "Submit" ยท "OK" buttons.
76
-
77
- **Why it happens:** Default LLM verb library.
78
-
79
- **Fix:** Use the verb the user is actually doing. "Approve refund" not "Submit". "Start free trial" not "Get Started". "Schedule a call" not "Contact us". Generic verbs are tells.
80
-
81
- ### 10. Stock illustration
82
-
83
- **What it looks like:** Figure-with-laptop hero art. Diverse-team-around-table illustration. Abstract floating shapes.
84
-
85
- **Why it happens:** "Illustration = friendly" default. Cheap to produce, generic to consume.
86
-
87
- **Fix:** Either use product screenshots (real screens, real data โ€” sanitized) or skip illustration entirely. A clean hero with strong typography beats a generic illustration every time.
88
-
89
- ### 11. Drop shadow soup
90
-
91
- **What it looks like:** Cards with shadow. Buttons with shadow. Inputs with shadow. Tooltips with shadow on shadows. Borders AND shadows AND gradients on one element.
92
-
93
- **Why it happens:** Material Design leftover; depth as decoration.
94
-
95
- **Fix:** Pick ONE depth mechanism per layer. If cards have shadow, buttons inside should not. If you're using elevation systematically (Material 3), enforce the elevation hierarchy.
96
-
97
- ### 12. Loading spinner default
98
-
99
- **What it looks like:** Spinner overlay for every async operation, regardless of duration or context.
100
-
101
- **Why it happens:** Default fallback in every UI library.
102
-
103
- **Fix:**
104
- - <300ms: don't show anything. Spinner appearing then disappearing instantly is flicker.
105
- - 300ms-2s: skeleton loader (shape of incoming content).
106
- - 2s-10s: spinner + status text ("Loading orders...").
107
- - 10s+: progress bar or step indicator + cancel button.
108
-
109
- ### 13. Empty state void
110
-
111
- **What it looks like:** "No items found." Centered. Nothing else. User has no idea what to do.
112
-
113
- **Why it happens:** Empty state treated as edge case, not a real screen.
114
-
115
- **Fix:** Every empty state must answer: WHY is it empty (no data yet vs filter excluded everything vs error). WHAT should the user do next (CTA: "Create your first invoice"). Show example/illustration if it helps onboard.
116
-
117
- ### 14. Notification-soup tray
118
-
119
- **What it looks like:** Every UI event becomes a toast. Save successful โ†’ toast. Validation error โ†’ toast. Network slow โ†’ toast. Now there are 5 stacked toasts and the user can't read any.
120
-
121
- **Why it happens:** Toast is the default feedback mechanism in component libraries.
122
-
123
- **Fix:** Reserve toasts for actions that need confirmation AWAY from the originating surface (background save completed, deletion can be undone). Inline feedback for form validation. Modal/banner for blocking errors. NEVER stack >2 toasts at once.
124
-
125
- ## The 17 anti-defaults
126
-
127
- Specific values that signal "no thought was put in." Avoid unless you can articulate WHY you picked exactly this:
128
-
129
- | Anti-default | Why it's a tell |
130
- |--------------|-----------------|
131
- | `#3B82F6` (Tailwind blue-500) | The internet's default blue |
132
- | `rounded-lg` everywhere | Universal default; no surface character |
133
- | `shadow-md` on every card | Universal default; no depth hierarchy |
134
- | `bg-gradient-to-br from-purple-500 to-pink-500` | The "AI startup landing page" gradient |
135
- | Inter font as the only choice | Default font of 60% of new SaaS |
136
- | `font-bold` for everything emphasized | Bold is a tool, not the only tool |
137
- | Lucide icons exclusively | One icon family is fine; signature is none |
138
- | Stock "happy team" hero illustration | Generic placeholder energy |
139
- | "Get Started" / "Learn More" CTA copy | Verb-less; says nothing |
140
- | 4px / 8px / 12px / 16px spacing exclusively | The default 4-step scale; no rhythm |
141
- | `border-gray-200` for every divider | Visual whisper; no intentionality |
142
- | Sans-serif headlines + sans-serif body | No typographic contrast |
143
- | Center-aligned everything | See pattern #7 |
144
- | Animated CSS confetti on success | Cheesy; never matches the brand |
145
- | `bg-white dark:bg-gray-900` only | No real dark-mode design pass |
146
- | Single-column form on a wide screen | Vertical scroll where horizontal fits |
147
- | Modal-for-everything | Most modals should be inline editing |
148
-
149
- ## How to use this catalog
150
-
151
- In `/dw-redesign-ui` step 4 (propose) โ€” before presenting design directions, self-check against this list. Flag any pattern you're consciously using AND say why (sometimes it's the right call; "gradient crutch" can be intentional for a marketing hero).
152
-
153
- In `/dw-code-review` UI section โ€” grep the diff for the anti-defaults table values and the patterns. Each hit becomes a finding with `dw-review-rigor` severity:
154
- - Pattern violations on a NEW surface โ†’ `medium` severity.
155
- - Pattern violations spreading EXISTING surface's slop further โ†’ `low` severity (consistency wins).
156
- - Pattern violations on a redesign that was supposed to fix slop โ†’ `high` severity (regression).
157
-
158
- ## When the rules bend
159
-
160
- - **Marketing pages** can use gradients and emojis with more freedom โ€” different surface job.
161
- - **Brand-mandated** anti-defaults override this list (if the brand IS `#3B82F6`, use it).
162
- - **Component libraries** like shadcn ship with neutral defaults โ€” the discipline is to ADD character on top, not remove their neutrality.