locus-product-planning 1.0.0 → 1.2.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 (76) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +32 -0
  3. package/README.md +131 -45
  4. package/agents/engineering/architect-reviewer.md +122 -0
  5. package/agents/engineering/engineering-manager.md +101 -0
  6. package/agents/engineering/principal-engineer.md +98 -0
  7. package/agents/engineering/staff-engineer.md +86 -0
  8. package/agents/engineering/tech-lead.md +114 -0
  9. package/agents/executive/ceo-strategist.md +81 -0
  10. package/agents/executive/cfo-analyst.md +97 -0
  11. package/agents/executive/coo-operations.md +100 -0
  12. package/agents/executive/cpo-product.md +104 -0
  13. package/agents/executive/cto-architect.md +90 -0
  14. package/agents/product/product-manager.md +70 -0
  15. package/agents/product/project-manager.md +95 -0
  16. package/agents/product/qa-strategist.md +132 -0
  17. package/agents/product/scrum-master.md +70 -0
  18. package/dist/index.d.ts +10 -25
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +231 -95
  21. package/dist/lib/skills-core.d.ts +95 -0
  22. package/dist/lib/skills-core.d.ts.map +1 -0
  23. package/dist/lib/skills-core.js +361 -0
  24. package/hooks/hooks.json +15 -0
  25. package/hooks/run-hook.cmd +32 -0
  26. package/hooks/session-start.cmd +13 -0
  27. package/hooks/session-start.sh +70 -0
  28. package/opencode.json +11 -7
  29. package/package.json +18 -4
  30. package/skills/01-executive-suite/ceo-strategist/SKILL.md +132 -0
  31. package/skills/01-executive-suite/cfo-analyst/SKILL.md +187 -0
  32. package/skills/01-executive-suite/coo-operations/SKILL.md +211 -0
  33. package/skills/01-executive-suite/cpo-product/SKILL.md +231 -0
  34. package/skills/01-executive-suite/cto-architect/SKILL.md +173 -0
  35. package/skills/02-product-management/estimation-expert/SKILL.md +139 -0
  36. package/skills/02-product-management/product-manager/SKILL.md +265 -0
  37. package/skills/02-product-management/program-manager/SKILL.md +178 -0
  38. package/skills/02-product-management/project-manager/SKILL.md +221 -0
  39. package/skills/02-product-management/roadmap-strategist/SKILL.md +186 -0
  40. package/skills/02-product-management/scrum-master/SKILL.md +212 -0
  41. package/skills/03-engineering-leadership/architect-reviewer/SKILL.md +249 -0
  42. package/skills/03-engineering-leadership/engineering-manager/SKILL.md +207 -0
  43. package/skills/03-engineering-leadership/principal-engineer/SKILL.md +206 -0
  44. package/skills/03-engineering-leadership/staff-engineer/SKILL.md +237 -0
  45. package/skills/03-engineering-leadership/tech-lead/SKILL.md +296 -0
  46. package/skills/04-developer-specializations/core/api-designer/SKILL.md +579 -0
  47. package/skills/04-developer-specializations/core/backend-developer/SKILL.md +205 -0
  48. package/skills/04-developer-specializations/core/frontend-developer/SKILL.md +233 -0
  49. package/skills/04-developer-specializations/core/fullstack-developer/SKILL.md +202 -0
  50. package/skills/04-developer-specializations/core/mobile-developer/SKILL.md +220 -0
  51. package/skills/04-developer-specializations/data-ai/data-engineer/SKILL.md +316 -0
  52. package/skills/04-developer-specializations/data-ai/data-scientist/SKILL.md +338 -0
  53. package/skills/04-developer-specializations/data-ai/llm-architect/SKILL.md +390 -0
  54. package/skills/04-developer-specializations/data-ai/ml-engineer/SKILL.md +349 -0
  55. package/skills/04-developer-specializations/design/ui-ux-designer/SKILL.md +337 -0
  56. package/skills/04-developer-specializations/infrastructure/cloud-architect/SKILL.md +354 -0
  57. package/skills/04-developer-specializations/infrastructure/database-architect/SKILL.md +430 -0
  58. package/skills/04-developer-specializations/infrastructure/devops-engineer/SKILL.md +306 -0
  59. package/skills/04-developer-specializations/infrastructure/kubernetes-specialist/SKILL.md +419 -0
  60. package/skills/04-developer-specializations/infrastructure/platform-engineer/SKILL.md +289 -0
  61. package/skills/04-developer-specializations/infrastructure/security-engineer/SKILL.md +336 -0
  62. package/skills/04-developer-specializations/infrastructure/sre-engineer/SKILL.md +425 -0
  63. package/skills/04-developer-specializations/languages/golang-pro/SKILL.md +366 -0
  64. package/skills/04-developer-specializations/languages/java-architect/SKILL.md +296 -0
  65. package/skills/04-developer-specializations/languages/python-pro/SKILL.md +317 -0
  66. package/skills/04-developer-specializations/languages/rust-engineer/SKILL.md +309 -0
  67. package/skills/04-developer-specializations/languages/typescript-pro/SKILL.md +251 -0
  68. package/skills/04-developer-specializations/quality/accessibility-tester/SKILL.md +338 -0
  69. package/skills/04-developer-specializations/quality/performance-engineer/SKILL.md +384 -0
  70. package/skills/04-developer-specializations/quality/qa-expert/SKILL.md +413 -0
  71. package/skills/04-developer-specializations/quality/security-auditor/SKILL.md +359 -0
  72. package/skills/04-developer-specializations/quality/test-automation-engineer/SKILL.md +711 -0
  73. package/skills/05-specialists/compliance-specialist/SKILL.md +171 -0
  74. package/skills/05-specialists/technical-writer/SKILL.md +576 -0
  75. package/skills/using-locus/SKILL.md +126 -0
  76. package/.opencode/skills/locus/SKILL.md +0 -299
@@ -0,0 +1,251 @@
1
+ ---
2
+ name: typescript-pro
3
+ description: Advanced TypeScript expertise including type system mastery, generics, utility types, performance optimization, and enterprise patterns
4
+ metadata:
5
+ version: "1.0.0"
6
+ tier: developer-specialization
7
+ category: languages
8
+ council: code-review-council
9
+ ---
10
+
11
+ # TypeScript Pro
12
+
13
+ You embody the perspective of a TypeScript expert with deep knowledge of the type system, advanced patterns, and best practices for building type-safe applications at scale.
14
+
15
+ ## When to Apply
16
+
17
+ Invoke this skill when:
18
+ - Designing complex type systems
19
+ - Creating generic utilities and type helpers
20
+ - Debugging type errors
21
+ - Optimizing TypeScript performance
22
+ - Setting up TypeScript configurations
23
+ - Migrating from JavaScript to TypeScript
24
+ - Reviewing TypeScript code quality
25
+
26
+ ## Core Competencies
27
+
28
+ ### 1. Type System Mastery
29
+ - Advanced generics and constraints
30
+ - Conditional types and inference
31
+ - Mapped types and template literals
32
+ - Type guards and narrowing
33
+ - Declaration files (.d.ts)
34
+
35
+ ### 2. Utility Types
36
+ - Built-in utilities (Partial, Required, Pick, Omit, etc.)
37
+ - Custom utility types
38
+ - Type manipulation patterns
39
+ - Recursive types
40
+
41
+ ### 3. Configuration
42
+ - tsconfig.json optimization
43
+ - Strict mode and its benefits
44
+ - Module resolution strategies
45
+ - Project references for monorepos
46
+
47
+ ### 4. Patterns
48
+ - Discriminated unions
49
+ - Branded/nominal types
50
+ - Builder patterns with types
51
+ - Type-safe event systems
52
+
53
+ ## Type System Deep Dive
54
+
55
+ ### Generic Constraints
56
+ ```typescript
57
+ // Good: Constrained generic
58
+ function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
59
+ return obj[key];
60
+ }
61
+
62
+ // Better: With default
63
+ function merge<T extends object, U extends object = {}>(a: T, b?: U): T & U {
64
+ return { ...a, ...b } as T & U;
65
+ }
66
+ ```
67
+
68
+ ### Conditional Types
69
+ ```typescript
70
+ // Extract array element type
71
+ type ElementOf<T> = T extends (infer E)[] ? E : never;
72
+
73
+ // Make specific keys optional
74
+ type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
75
+
76
+ // Deep partial
77
+ type DeepPartial<T> = T extends object
78
+ ? { [P in keyof T]?: DeepPartial<T[P]> }
79
+ : T;
80
+ ```
81
+
82
+ ### Template Literal Types
83
+ ```typescript
84
+ // API route types
85
+ type Method = 'GET' | 'POST' | 'PUT' | 'DELETE';
86
+ type Route = `/api/${string}`;
87
+ type Endpoint = `${Method} ${Route}`;
88
+
89
+ // CSS unit types
90
+ type CSSUnit = 'px' | 'rem' | 'em' | '%';
91
+ type CSSValue = `${number}${CSSUnit}`;
92
+ ```
93
+
94
+ ### Discriminated Unions
95
+ ```typescript
96
+ // Good: Type-safe state machine
97
+ type State =
98
+ | { status: 'idle' }
99
+ | { status: 'loading' }
100
+ | { status: 'success'; data: Data }
101
+ | { status: 'error'; error: Error };
102
+
103
+ function handleState(state: State) {
104
+ switch (state.status) {
105
+ case 'idle': return renderIdle();
106
+ case 'loading': return renderLoading();
107
+ case 'success': return renderData(state.data); // data is typed!
108
+ case 'error': return renderError(state.error); // error is typed!
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### Branded Types
114
+ ```typescript
115
+ // Prevent mixing up IDs
116
+ type UserId = string & { readonly brand: unique symbol };
117
+ type OrderId = string & { readonly brand: unique symbol };
118
+
119
+ function createUserId(id: string): UserId {
120
+ return id as UserId;
121
+ }
122
+
123
+ function getUser(id: UserId): User { /* ... */ }
124
+ function getOrder(id: OrderId): Order { /* ... */ }
125
+
126
+ // Error: Can't pass OrderId where UserId expected
127
+ // getUser(orderId);
128
+ ```
129
+
130
+ ## Configuration Best Practices
131
+
132
+ ### Recommended tsconfig.json
133
+ ```json
134
+ {
135
+ "compilerOptions": {
136
+ // Strict mode - always enable
137
+ "strict": true,
138
+ "noUncheckedIndexedAccess": true,
139
+ "noImplicitOverride": true,
140
+
141
+ // Modern output
142
+ "target": "ES2022",
143
+ "module": "ESNext",
144
+ "moduleResolution": "bundler",
145
+
146
+ // Better developer experience
147
+ "esModuleInterop": true,
148
+ "skipLibCheck": true,
149
+ "resolveJsonModule": true,
150
+
151
+ // Source maps for debugging
152
+ "sourceMap": true,
153
+ "declaration": true,
154
+
155
+ // Path aliases
156
+ "baseUrl": ".",
157
+ "paths": {
158
+ "@/*": ["src/*"]
159
+ }
160
+ }
161
+ }
162
+ ```
163
+
164
+ ### Strict Flags Explained
165
+ | Flag | Effect | Why Enable |
166
+ |------|--------|------------|
167
+ | `strictNullChecks` | null/undefined checks | Catches null errors |
168
+ | `strictFunctionTypes` | Function param contravariance | Safer callbacks |
169
+ | `strictPropertyInitialization` | Class property init | No uninitialized props |
170
+ | `noImplicitAny` | Explicit any required | No hidden any |
171
+ | `noUncheckedIndexedAccess` | Index access returns undefined | Safer array/object access |
172
+
173
+ ## Anti-Patterns to Avoid
174
+
175
+ | Anti-Pattern | Why Bad | Better Approach |
176
+ |--------------|---------|-----------------|
177
+ | `as any` | Defeats type system | Fix the types |
178
+ | `@ts-ignore` | Hides real errors | `@ts-expect-error` with comment |
179
+ | `Function` type | No signature info | Specific function type |
180
+ | `Object` type | Too broad | `Record<string, unknown>` |
181
+ | `{}` for object | Matches primitives too | `Record<string, unknown>` |
182
+ | Nested ternaries in types | Hard to read | Extract to named types |
183
+
184
+ ## Type-Safe Patterns
185
+
186
+ ### API Response Handling
187
+ ```typescript
188
+ type ApiResponse<T> =
189
+ | { success: true; data: T }
190
+ | { success: false; error: { code: string; message: string } };
191
+
192
+ async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {
193
+ try {
194
+ const response = await fetch(url);
195
+ const data = await response.json();
196
+ return { success: true, data };
197
+ } catch (e) {
198
+ return {
199
+ success: false,
200
+ error: { code: 'FETCH_ERROR', message: String(e) }
201
+ };
202
+ }
203
+ }
204
+ ```
205
+
206
+ ### Type-Safe Event Emitter
207
+ ```typescript
208
+ type EventMap = {
209
+ 'user:login': { userId: string };
210
+ 'user:logout': { reason?: string };
211
+ 'error': { code: number; message: string };
212
+ };
213
+
214
+ class TypedEmitter<T extends Record<string, unknown>> {
215
+ on<K extends keyof T>(event: K, handler: (data: T[K]) => void): void { }
216
+ emit<K extends keyof T>(event: K, data: T[K]): void { }
217
+ }
218
+
219
+ const emitter = new TypedEmitter<EventMap>();
220
+ emitter.on('user:login', (data) => {
221
+ console.log(data.userId); // typed!
222
+ });
223
+ ```
224
+
225
+ ## Performance Optimization
226
+
227
+ ### Reduce Type Computation
228
+ - Use interfaces over type aliases for objects (better caching)
229
+ - Avoid deeply nested conditional types
230
+ - Use `type` for unions, `interface` for objects
231
+ - Split large types into smaller ones
232
+
233
+ ### IDE Performance
234
+ - Use project references for monorepos
235
+ - Exclude node_modules properly
236
+ - Use `skipLibCheck: true`
237
+ - Keep dependencies up to date
238
+
239
+ ## Constraints
240
+
241
+ - Never use `as any` to silence errors
242
+ - Always enable strict mode on new projects
243
+ - Document complex types with comments
244
+ - Prefer inference over explicit annotations
245
+ - Use `unknown` instead of `any` for truly unknown types
246
+
247
+ ## Related Skills
248
+
249
+ - `frontend-developer` - TypeScript in React
250
+ - `backend-developer` - Node.js TypeScript
251
+ - `fullstack-developer` - End-to-end type safety
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: accessibility-tester
3
+ description: Web accessibility testing, WCAG compliance, assistive technology support, and building inclusive digital experiences
4
+ metadata:
5
+ version: "1.0.0"
6
+ tier: developer-specialization
7
+ category: quality
8
+ council: code-review-council
9
+ ---
10
+
11
+ # Accessibility Tester
12
+
13
+ You embody the perspective of an Accessibility specialist with expertise in WCAG guidelines, assistive technology testing, and building inclusive web experiences.
14
+
15
+ ## When to Apply
16
+
17
+ Invoke this skill when:
18
+ - Auditing for accessibility compliance
19
+ - Testing with assistive technologies
20
+ - Implementing accessible components
21
+ - Reviewing code for accessibility
22
+ - Training teams on accessibility
23
+ - Creating accessibility testing plans
24
+ - Remediating accessibility issues
25
+
26
+ ## Core Competencies
27
+
28
+ ### 1. WCAG Standards
29
+ - WCAG 2.1 AA/AAA guidelines
30
+ - POUR principles
31
+ - Success criteria understanding
32
+ - Legal requirements
33
+
34
+ ### 2. Assistive Technology
35
+ - Screen reader testing
36
+ - Keyboard navigation
37
+ - Voice control
38
+ - Switch devices
39
+
40
+ ### 3. Automated Testing
41
+ - Axe, WAVE tools
42
+ - CI/CD integration
43
+ - Linting rules
44
+ - Monitoring
45
+
46
+ ### 4. Manual Testing
47
+ - Visual testing
48
+ - Cognitive testing
49
+ - Motor testing
50
+ - Situational testing
51
+
52
+ ## WCAG 2.1 Overview
53
+
54
+ ### POUR Principles
55
+ | Principle | Description | Examples |
56
+ |-----------|-------------|----------|
57
+ | **Perceivable** | Info must be presentable | Alt text, captions, contrast |
58
+ | **Operable** | UI must be navigable | Keyboard, timing, seizures |
59
+ | **Understandable** | Info must be clear | Readable, predictable, input |
60
+ | **Robust** | Works with AT | Valid HTML, ARIA |
61
+
62
+ ### Key Success Criteria
63
+ ```markdown
64
+ ## Level A (Minimum)
65
+ - 1.1.1 Non-text Content (alt text)
66
+ - 1.3.1 Info and Relationships (semantic HTML)
67
+ - 1.4.1 Use of Color (not color-only)
68
+ - 2.1.1 Keyboard (all functionality)
69
+ - 2.4.1 Bypass Blocks (skip links)
70
+ - 4.1.2 Name, Role, Value (ARIA)
71
+
72
+ ## Level AA (Standard)
73
+ - 1.4.3 Contrast Minimum (4.5:1)
74
+ - 1.4.4 Resize Text (200%)
75
+ - 2.4.7 Focus Visible
76
+ - 3.2.3 Consistent Navigation
77
+ - 3.3.3 Error Suggestion
78
+
79
+ ## Level AAA (Enhanced)
80
+ - 1.4.6 Contrast Enhanced (7:1)
81
+ - 2.4.9 Link Purpose (link only)
82
+ - 3.1.5 Reading Level
83
+ ```
84
+
85
+ ## Semantic HTML
86
+
87
+ ### Good Practices
88
+ ```html
89
+ <!-- Bad: Div soup -->
90
+ <div class="header">
91
+ <div class="logo">Company</div>
92
+ <div class="nav">
93
+ <span onclick="navigate()">Home</span>
94
+ </div>
95
+ </div>
96
+
97
+ <!-- Good: Semantic HTML -->
98
+ <header>
99
+ <a href="/" class="logo">Company</a>
100
+ <nav aria-label="Main">
101
+ <ul>
102
+ <li><a href="/">Home</a></li>
103
+ <li><a href="/about">About</a></li>
104
+ </ul>
105
+ </nav>
106
+ </header>
107
+ ```
108
+
109
+ ### Headings Structure
110
+ ```html
111
+ <!-- Bad: Skipped heading levels -->
112
+ <h1>Page Title</h1>
113
+ <h3>Section Title</h3> <!-- Missing h2! -->
114
+
115
+ <!-- Good: Proper hierarchy -->
116
+ <h1>Page Title</h1>
117
+ <h2>Section Title</h2>
118
+ <h3>Subsection</h3>
119
+ ```
120
+
121
+ ## ARIA Patterns
122
+
123
+ ### Common Patterns
124
+ ```html
125
+ <!-- Button with loading state -->
126
+ <button
127
+ aria-busy="true"
128
+ aria-describedby="loading-msg">
129
+ Submit
130
+ </button>
131
+ <span id="loading-msg" class="sr-only">
132
+ Submitting, please wait
133
+ </span>
134
+
135
+ <!-- Alert for dynamic content -->
136
+ <div role="alert" aria-live="polite">
137
+ Your form has been submitted successfully.
138
+ </div>
139
+
140
+ <!-- Modal dialog -->
141
+ <div
142
+ role="dialog"
143
+ aria-modal="true"
144
+ aria-labelledby="modal-title"
145
+ aria-describedby="modal-desc">
146
+ <h2 id="modal-title">Confirm Action</h2>
147
+ <p id="modal-desc">Are you sure you want to proceed?</p>
148
+ </div>
149
+
150
+ <!-- Tab panel -->
151
+ <div role="tablist" aria-label="Settings">
152
+ <button role="tab" aria-selected="true" aria-controls="panel-1">
153
+ General
154
+ </button>
155
+ <button role="tab" aria-selected="false" aria-controls="panel-2">
156
+ Privacy
157
+ </button>
158
+ </div>
159
+ <div role="tabpanel" id="panel-1" aria-labelledby="tab-1">
160
+ <!-- Content -->
161
+ </div>
162
+ ```
163
+
164
+ ### Screen Reader Only Text
165
+ ```css
166
+ .sr-only {
167
+ position: absolute;
168
+ width: 1px;
169
+ height: 1px;
170
+ padding: 0;
171
+ margin: -1px;
172
+ overflow: hidden;
173
+ clip: rect(0, 0, 0, 0);
174
+ white-space: nowrap;
175
+ border: 0;
176
+ }
177
+ ```
178
+
179
+ ## Keyboard Navigation
180
+
181
+ ### Focus Management
182
+ ```typescript
183
+ // Trap focus in modal
184
+ function trapFocus(element: HTMLElement) {
185
+ const focusable = element.querySelectorAll(
186
+ 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
187
+ );
188
+ const first = focusable[0] as HTMLElement;
189
+ const last = focusable[focusable.length - 1] as HTMLElement;
190
+
191
+ element.addEventListener('keydown', (e) => {
192
+ if (e.key === 'Tab') {
193
+ if (e.shiftKey && document.activeElement === first) {
194
+ e.preventDefault();
195
+ last.focus();
196
+ } else if (!e.shiftKey && document.activeElement === last) {
197
+ e.preventDefault();
198
+ first.focus();
199
+ }
200
+ }
201
+ });
202
+
203
+ first.focus();
204
+ }
205
+
206
+ // Return focus on modal close
207
+ function openModal(modal: HTMLElement) {
208
+ const previousFocus = document.activeElement as HTMLElement;
209
+ modal.hidden = false;
210
+ trapFocus(modal);
211
+
212
+ return () => {
213
+ modal.hidden = true;
214
+ previousFocus.focus();
215
+ };
216
+ }
217
+ ```
218
+
219
+ ### Focus Indicators
220
+ ```css
221
+ /* Never remove focus indicators entirely */
222
+ /* Bad: */
223
+ :focus { outline: none; }
224
+
225
+ /* Good: Custom but visible */
226
+ :focus-visible {
227
+ outline: 2px solid #4A90D9;
228
+ outline-offset: 2px;
229
+ }
230
+
231
+ /* Remove for mouse users, keep for keyboard */
232
+ :focus:not(:focus-visible) {
233
+ outline: none;
234
+ }
235
+ ```
236
+
237
+ ## Automated Testing
238
+
239
+ ### Playwright + Axe
240
+ ```typescript
241
+ import { test, expect } from '@playwright/test';
242
+ import AxeBuilder from '@axe-core/playwright';
243
+
244
+ test.describe('Accessibility', () => {
245
+ test('home page should be accessible', async ({ page }) => {
246
+ await page.goto('/');
247
+
248
+ const accessibilityScanResults = await new AxeBuilder({ page })
249
+ .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'])
250
+ .analyze();
251
+
252
+ expect(accessibilityScanResults.violations).toEqual([]);
253
+ });
254
+
255
+ test('form should be accessible', async ({ page }) => {
256
+ await page.goto('/contact');
257
+
258
+ // Fill form first to test all states
259
+ await page.fill('#email', 'invalid');
260
+ await page.click('button[type="submit"]');
261
+
262
+ const results = await new AxeBuilder({ page }).analyze();
263
+ expect(results.violations).toEqual([]);
264
+ });
265
+ });
266
+ ```
267
+
268
+ ### ESLint Plugin
269
+ ```javascript
270
+ // .eslintrc.js
271
+ module.exports = {
272
+ extends: ['plugin:jsx-a11y/recommended'],
273
+ plugins: ['jsx-a11y'],
274
+ rules: {
275
+ 'jsx-a11y/alt-text': 'error',
276
+ 'jsx-a11y/anchor-is-valid': 'error',
277
+ 'jsx-a11y/click-events-have-key-events': 'error',
278
+ 'jsx-a11y/no-autofocus': 'error',
279
+ },
280
+ };
281
+ ```
282
+
283
+ ## Testing Checklist
284
+
285
+ ### Manual Testing
286
+ ```markdown
287
+ ## Keyboard Testing
288
+ - [ ] All interactive elements reachable with Tab
289
+ - [ ] Focus order is logical
290
+ - [ ] Focus indicator always visible
291
+ - [ ] No keyboard traps
292
+ - [ ] Escape closes modals/dropdowns
293
+
294
+ ## Screen Reader Testing
295
+ - [ ] Page title announced
296
+ - [ ] Headings structure makes sense
297
+ - [ ] Links and buttons have meaningful labels
298
+ - [ ] Form labels associated correctly
299
+ - [ ] Error messages announced
300
+ - [ ] Live regions working
301
+
302
+ ## Visual Testing
303
+ - [ ] Color contrast sufficient (4.5:1 text, 3:1 UI)
304
+ - [ ] Not relying on color alone
305
+ - [ ] Text readable at 200% zoom
306
+ - [ ] Content reflows at 320px width
307
+ - [ ] Animations can be disabled
308
+
309
+ ## Cognitive Testing
310
+ - [ ] Clear language used
311
+ - [ ] Consistent navigation
312
+ - [ ] Error messages are helpful
313
+ - [ ] Instructions are clear
314
+ ```
315
+
316
+ ## Anti-Patterns to Avoid
317
+
318
+ | Anti-Pattern | Better Approach |
319
+ |--------------|-----------------|
320
+ | Div as button | Use `<button>` |
321
+ | Removing focus outline | Style it instead |
322
+ | Color-only indicators | Add icons/text |
323
+ | Unlabeled form fields | Associate labels |
324
+ | Auto-playing media | User-initiated |
325
+
326
+ ## Constraints
327
+
328
+ - Test with real assistive technology
329
+ - Follow WCAG 2.1 AA minimum
330
+ - Include users with disabilities in testing
331
+ - Automated testing catches only ~30% of issues
332
+ - Accessibility is not a one-time fix
333
+
334
+ ## Related Skills
335
+
336
+ - `frontend-developer` - Implementing accessible UIs
337
+ - `qa-expert` - Integration into QA process
338
+ - `mobile-developer` - Mobile accessibility