omgkit 2.1.0 → 2.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 (56) hide show
  1. package/package.json +1 -1
  2. package/plugin/skills/SKILL_STANDARDS.md +743 -0
  3. package/plugin/skills/databases/mongodb/SKILL.md +797 -28
  4. package/plugin/skills/databases/postgresql/SKILL.md +494 -18
  5. package/plugin/skills/databases/prisma/SKILL.md +776 -30
  6. package/plugin/skills/databases/redis/SKILL.md +885 -25
  7. package/plugin/skills/devops/aws/SKILL.md +686 -28
  8. package/plugin/skills/devops/docker/SKILL.md +466 -18
  9. package/plugin/skills/devops/github-actions/SKILL.md +684 -29
  10. package/plugin/skills/devops/kubernetes/SKILL.md +621 -24
  11. package/plugin/skills/frameworks/django/SKILL.md +920 -20
  12. package/plugin/skills/frameworks/express/SKILL.md +1361 -35
  13. package/plugin/skills/frameworks/fastapi/SKILL.md +1260 -33
  14. package/plugin/skills/frameworks/laravel/SKILL.md +1244 -31
  15. package/plugin/skills/frameworks/nestjs/SKILL.md +1005 -26
  16. package/plugin/skills/frameworks/nextjs/SKILL.md +407 -44
  17. package/plugin/skills/frameworks/rails/SKILL.md +594 -28
  18. package/plugin/skills/frameworks/react/SKILL.md +1006 -32
  19. package/plugin/skills/frameworks/spring/SKILL.md +528 -35
  20. package/plugin/skills/frameworks/vue/SKILL.md +1296 -27
  21. package/plugin/skills/frontend/accessibility/SKILL.md +1108 -34
  22. package/plugin/skills/frontend/frontend-design/SKILL.md +1304 -26
  23. package/plugin/skills/frontend/responsive/SKILL.md +847 -21
  24. package/plugin/skills/frontend/shadcn-ui/SKILL.md +976 -38
  25. package/plugin/skills/frontend/tailwindcss/SKILL.md +831 -35
  26. package/plugin/skills/frontend/threejs/SKILL.md +1298 -29
  27. package/plugin/skills/languages/javascript/SKILL.md +935 -31
  28. package/plugin/skills/languages/python/SKILL.md +489 -25
  29. package/plugin/skills/languages/typescript/SKILL.md +379 -30
  30. package/plugin/skills/methodology/brainstorming/SKILL.md +597 -23
  31. package/plugin/skills/methodology/defense-in-depth/SKILL.md +832 -34
  32. package/plugin/skills/methodology/dispatching-parallel-agents/SKILL.md +665 -31
  33. package/plugin/skills/methodology/executing-plans/SKILL.md +556 -24
  34. package/plugin/skills/methodology/finishing-development-branch/SKILL.md +595 -25
  35. package/plugin/skills/methodology/problem-solving/SKILL.md +429 -61
  36. package/plugin/skills/methodology/receiving-code-review/SKILL.md +536 -24
  37. package/plugin/skills/methodology/requesting-code-review/SKILL.md +632 -21
  38. package/plugin/skills/methodology/root-cause-tracing/SKILL.md +641 -30
  39. package/plugin/skills/methodology/sequential-thinking/SKILL.md +262 -3
  40. package/plugin/skills/methodology/systematic-debugging/SKILL.md +571 -32
  41. package/plugin/skills/methodology/test-driven-development/SKILL.md +779 -24
  42. package/plugin/skills/methodology/testing-anti-patterns/SKILL.md +691 -29
  43. package/plugin/skills/methodology/token-optimization/SKILL.md +598 -29
  44. package/plugin/skills/methodology/verification-before-completion/SKILL.md +543 -22
  45. package/plugin/skills/methodology/writing-plans/SKILL.md +590 -18
  46. package/plugin/skills/omega/omega-architecture/SKILL.md +838 -39
  47. package/plugin/skills/omega/omega-coding/SKILL.md +636 -39
  48. package/plugin/skills/omega/omega-sprint/SKILL.md +855 -48
  49. package/plugin/skills/omega/omega-testing/SKILL.md +940 -41
  50. package/plugin/skills/omega/omega-thinking/SKILL.md +703 -50
  51. package/plugin/skills/security/better-auth/SKILL.md +1065 -28
  52. package/plugin/skills/security/oauth/SKILL.md +968 -31
  53. package/plugin/skills/security/owasp/SKILL.md +894 -33
  54. package/plugin/skills/testing/playwright/SKILL.md +764 -38
  55. package/plugin/skills/testing/pytest/SKILL.md +873 -36
  56. package/plugin/skills/testing/vitest/SKILL.md +980 -35
@@ -1,50 +1,589 @@
1
1
  ---
2
2
  name: systematic-debugging
3
- description: Systematic debugging process. Use when investigating bugs.
3
+ description: Structured debugging with reproduction, isolation, hypothesis testing, and root cause resolution
4
+ category: methodology
5
+ triggers:
6
+ - debugging
7
+ - bug investigation
8
+ - troubleshooting
9
+ - finding bugs
10
+ - fixing issues
11
+ - error analysis
12
+ - bug hunting
4
13
  ---
5
14
 
6
- # Systematic Debugging Skill
15
+ # Systematic Debugging
7
16
 
8
- ## Process
17
+ Master **structured debugging** through methodical investigation, hypothesis testing, and root cause resolution. This skill provides a 95% effective debugging framework used by top engineering teams.
9
18
 
10
- ### 1. Reproduce
11
- - Can you reproduce consistently?
12
- - What are the exact steps?
13
- - What environment?
19
+ ## Purpose
14
20
 
15
- ### 2. Isolate
16
- - What's the smallest case?
17
- - Which component fails?
18
- - When did it start?
21
+ Debug efficiently and prevent recurrence:
19
22
 
20
- ### 3. Hypothesize
21
- Form 3 hypotheses:
22
- 1. [Most likely cause]
23
- 2. [Second possibility]
24
- 3. [Unlikely but possible]
23
+ - Reproduce issues reliably
24
+ - Isolate the problem scope
25
+ - Generate and test hypotheses systematically
26
+ - Find root causes, not just symptoms
27
+ - Fix with confidence
28
+ - Prevent regression through tests
29
+ - Document for future reference
25
30
 
26
- ### 4. Test
27
- - Test each hypothesis
28
- - Use binary search for large codebases
29
- - Add logging strategically
31
+ ## Features
32
+
33
+ ### 1. The 5-Phase Debugging Process
34
+
35
+ ```markdown
36
+ ## Systematic Debugging Framework
37
+
38
+ ┌────────────────────────────────────────────────────────────────┐
39
+ │ PHASE 1: REPRODUCE │
40
+ │ ═══════════════════ │
41
+ │ Goal: Consistently trigger the bug │
42
+ │ │
43
+ │ Questions: │
44
+ │ • What are the exact steps to reproduce? │
45
+ │ • What environment? (OS, browser, version) │
46
+ │ • Is it 100% reproducible or intermittent? │
47
+ │ • When did it start happening? │
48
+ │ • What changed recently? │
49
+ │ │
50
+ │ Output: Reliable reproduction steps │
51
+ └─────────────────────────────────────────────────────────────────┘
52
+
53
+
54
+ ┌────────────────────────────────────────────────────────────────┐
55
+ │ PHASE 2: ISOLATE │
56
+ │ ═══════════════════ │
57
+ │ Goal: Narrow down the problem area │
58
+ │ │
59
+ │ Techniques: │
60
+ │ • Binary search: Disable half the code │
61
+ │ • Minimal repro: Simplest case that fails │
62
+ │ • Environment isolation: Local vs staging vs prod │
63
+ │ • Component isolation: Which module/service? │
64
+ │ • Time isolation: When did it start? │
65
+ │ │
66
+ │ Output: Specific file(s)/line(s) of interest │
67
+ └─────────────────────────────────────────────────────────────────┘
68
+
69
+
70
+ ┌────────────────────────────────────────────────────────────────┐
71
+ │ PHASE 3: HYPOTHESIZE │
72
+ │ ═══════════════════ │
73
+ │ Goal: Form theories about the cause │
74
+ │ │
75
+ │ Generate at least 3 hypotheses: │
76
+ │ H1: [Most likely cause] - Evidence: ___ │
77
+ │ H2: [Second possibility] - Evidence: ___ │
78
+ │ H3: [Less likely but possible] - Evidence: ___ │
79
+ │ │
80
+ │ Prioritize by: │
81
+ │ • Evidence strength (what points to this?) │
82
+ │ • Test cost (how easy to verify?) │
83
+ │ • Likelihood (gut feeling + data) │
84
+ │ │
85
+ │ Output: Ranked list of hypotheses │
86
+ └─────────────────────────────────────────────────────────────────┘
87
+
88
+
89
+ ┌────────────────────────────────────────────────────────────────┐
90
+ │ PHASE 4: TEST │
91
+ │ ═══════════════════ │
92
+ │ Goal: Verify or eliminate hypotheses │
93
+ │ │
94
+ │ For each hypothesis: │
95
+ │ 1. Design a test that would PROVE it │
96
+ │ 2. Design a test that would DISPROVE it │
97
+ │ 3. Run tests, record results │
98
+ │ 4. Move to next hypothesis or dig deeper │
99
+ │ │
100
+ │ Tools: Logging, debugger, profiler, tests │
101
+ │ │
102
+ │ Output: Confirmed root cause │
103
+ └─────────────────────────────────────────────────────────────────┘
104
+
105
+
106
+ ┌────────────────────────────────────────────────────────────────┐
107
+ │ PHASE 5: FIX & VERIFY │
108
+ │ ═══════════════════ │
109
+ │ Goal: Fix correctly and prevent recurrence │
110
+ │ │
111
+ │ Steps: │
112
+ │ 1. Write failing test that reproduces the bug │
113
+ │ 2. Implement minimal fix │
114
+ │ 3. Verify test passes │
115
+ │ 4. Check for related issues │
116
+ │ 5. Document the fix │
117
+ │ │
118
+ │ Output: Fixed code + regression test + documentation │
119
+ └─────────────────────────────────────────────────────────────────┘
120
+ ```
121
+
122
+ ### 2. Reproduction Techniques
123
+
124
+ ```markdown
125
+ ## Reproduction Strategies
126
+
127
+ ### Creating Minimal Reproduction
128
+
129
+ ```typescript
130
+ // Original complex scenario
131
+ async function complexUserFlow() {
132
+ const user = await login('admin@test.com', 'password');
133
+ await navigateToSettings();
134
+ await clickTheme('dark');
135
+ await clickSave();
136
+ await navigateToProfile();
137
+ await uploadAvatar(largeImage);
138
+ await clickSave(); // Bug occurs here
139
+ }
140
+
141
+ // Minimal reproduction - strip away unrelated steps
142
+ async function minimalRepro() {
143
+ // Does uploading any image fail?
144
+ await uploadAvatar(largeImage); // Yes, bug here!
145
+
146
+ // What about small images?
147
+ await uploadAvatar(smallImage); // Works fine
148
+
149
+ // Root cause: Large file handling bug
150
+ }
151
+ ```
152
+
153
+ ### Environment Reproduction
30
154
 
31
- ### 5. Fix
32
- - Minimal fix first
33
- - Add regression test
34
- - Verify fix works
155
+ ```yaml
156
+ # reproduction.yml - Document environment exactly
157
+ environment:
158
+ os: macOS 14.1
159
+ node: 20.10.0
160
+ browser: Chrome 120
161
+ database: PostgreSQL 15.4
35
162
 
36
- ## Tools
163
+ reproduction_steps:
164
+ 1. Clone repo at commit abc123
165
+ 2. Run: npm install
166
+ 3. Run: docker-compose up -d
167
+ 4. Run: npm run seed
168
+ 5. Run: npm run dev
169
+ 6. Navigate to /users
170
+ 7. Click "Export" button
171
+ 8. Observe: Error "Maximum call stack size exceeded"
172
+
173
+ frequency: 100% reproducible
174
+ first_observed: 2024-01-15
175
+ last_known_good: commit def456 (2024-01-14)
176
+ ```
177
+
178
+ ### Intermittent Bug Reproduction
179
+
180
+ ```typescript
181
+ // For race conditions and intermittent bugs
182
+ async function stressTest() {
183
+ const results = [];
184
+
185
+ // Run many times to catch intermittent failures
186
+ for (let i = 0; i < 100; i++) {
187
+ try {
188
+ await performAction();
189
+ results.push({ iteration: i, status: 'success' });
190
+ } catch (error) {
191
+ results.push({ iteration: i, status: 'failure', error });
192
+ }
193
+ }
194
+
195
+ // Analyze failure rate
196
+ const failures = results.filter((r) => r.status === 'failure');
197
+ console.log(`Failure rate: ${failures.length}%`);
198
+ console.log('Failure details:', failures);
199
+ }
200
+ ```
201
+
202
+ ### 3. Isolation Techniques
203
+
204
+ ```markdown
205
+ ## Binary Search Debugging
206
+
207
+ ### Git Bisect for Regression Finding
37
208
  ```bash
209
+ # Start bisect session
38
210
  git bisect start
211
+
212
+ # Mark current (broken) as bad
39
213
  git bisect bad HEAD
40
- git bisect good v1.0.0
214
+
215
+ # Mark last known good commit
216
+ git bisect good v2.0.0
217
+
218
+ # Git checks out middle commit
219
+ # Test and mark as good or bad
220
+ git bisect good # or: git bisect bad
221
+
222
+ # Repeat until culprit found
223
+ # Git will report: "abc123 is the first bad commit"
224
+
225
+ # Automate with a test script
226
+ git bisect run npm test
227
+
228
+ # Clean up
229
+ git bisect reset
41
230
  ```
42
231
 
43
- ## Output
232
+ ### Code Section Isolation
233
+ ```typescript
234
+ // Technique: Comment out half the code at a time
235
+
236
+ async function problematicFunction() {
237
+ // BLOCK A
238
+ await stepA1();
239
+ await stepA2();
240
+ await stepA3();
241
+
242
+ // BLOCK B
243
+ await stepB1();
244
+ await stepB2();
245
+ await stepB3();
246
+
247
+ // Test: Comment out BLOCK B
248
+ // Still fails? Bug is in BLOCK A
249
+ // Works now? Bug is in BLOCK B
250
+ // Repeat binary search within the failing block
251
+ }
252
+ ```
253
+
254
+ ### Component Isolation
255
+ ```typescript
256
+ // Test components in isolation
257
+
258
+ // Instead of testing full flow:
259
+ const result = await fullApiFlow(request);
260
+
261
+ // Test each component separately:
262
+ const validated = await validateRequest(request);
263
+ console.log('Validation:', validated); // Check here
264
+
265
+ const processed = await processData(validated);
266
+ console.log('Processing:', processed); // Check here
267
+
268
+ const stored = await saveToDatabase(processed);
269
+ console.log('Storage:', stored); // Check here
270
+
271
+ const response = await formatResponse(stored);
272
+ console.log('Response:', response); // Check here
273
+ ```
274
+
275
+ ### 4. Hypothesis Generation
276
+
277
+ ```markdown
278
+ ## Hypothesis Categories
279
+
280
+ ### Data Issues
281
+ - Invalid input data
282
+ - Missing required fields
283
+ - Type mismatches
284
+ - Encoding problems (UTF-8, etc.)
285
+ - Stale/cached data
286
+ - Data corruption
287
+
288
+ ### Configuration Issues
289
+ - Wrong environment variables
290
+ - Missing config values
291
+ - Incorrect settings
292
+ - Feature flags
293
+ - Permission misconfig
294
+
295
+ ### Timing Issues
296
+ - Race conditions
297
+ - Timeout too short/long
298
+ - Order of operations
299
+ - Async/await bugs
300
+ - Deadlocks
301
+ - Event loop blocking
302
+
303
+ ### Resource Issues
304
+ - Memory exhaustion
305
+ - Disk space
306
+ - Connection pool exhausted
307
+ - File handles
308
+ - Network limits
309
+ - CPU throttling
310
+
311
+ ### External Dependencies
312
+ - API changes
313
+ - Service downtime
314
+ - Network issues
315
+ - DNS problems
316
+ - Certificate expiry
317
+ - Rate limiting
318
+
319
+ ### Code Logic
320
+ - Off-by-one errors
321
+ - Null pointer
322
+ - Wrong operator
323
+ - Missing edge case
324
+ - Incorrect algorithm
325
+ - State management bug
326
+ ```
327
+
328
+ ### Hypothesis Template
44
329
  ```markdown
45
- ## Debug Report
46
- - Problem: [Description]
47
- - Root Cause: [Actual cause]
48
- - Fix: [What changed]
49
- - Prevention: [How to prevent]
330
+ ## Hypothesis: Race Condition in User Update
331
+
332
+ ### Evidence For
333
+ - Bug is intermittent (50% reproduction rate)
334
+ - Multiple async operations on same resource
335
+ - Logs show overlapping requests
336
+
337
+ ### Evidence Against
338
+ - Works in single-user testing
339
+ - No obvious shared state
340
+
341
+ ### Test Plan
342
+ 1. Add mutex/lock around update
343
+ 2. If fixes: Confirms race condition
344
+ 3. If not: Eliminate hypothesis
345
+
346
+ ### Test Cost: Low (30 min)
347
+ ### Likelihood: High (70%)
348
+ ### Priority: Test First
50
349
  ```
350
+
351
+ ### 5. Debugging Tools Usage
352
+
353
+ ```typescript
354
+ // Strategic Logging
355
+ function debugWithLogging(data: unknown) {
356
+ // Use structured logging with context
357
+ console.log('[DEBUG][UserService][updateProfile]', {
358
+ timestamp: new Date().toISOString(),
359
+ userId: data.userId,
360
+ action: 'start',
361
+ data: sanitize(data), // Remove sensitive info
362
+ });
363
+
364
+ try {
365
+ const result = performUpdate(data);
366
+
367
+ console.log('[DEBUG][UserService][updateProfile]', {
368
+ timestamp: new Date().toISOString(),
369
+ userId: data.userId,
370
+ action: 'success',
371
+ result: summarize(result),
372
+ });
373
+
374
+ return result;
375
+ } catch (error) {
376
+ console.log('[DEBUG][UserService][updateProfile]', {
377
+ timestamp: new Date().toISOString(),
378
+ userId: data.userId,
379
+ action: 'error',
380
+ error: error.message,
381
+ stack: error.stack,
382
+ });
383
+ throw error;
384
+ }
385
+ }
386
+
387
+ // Conditional Breakpoints (Chrome DevTools)
388
+ // Right-click on line number > Add conditional breakpoint
389
+ // Condition: user.id === 'problematic-user-id'
390
+
391
+ // Performance Profiling
392
+ async function profileOperation() {
393
+ console.time('fullOperation');
394
+
395
+ console.time('step1');
396
+ await step1();
397
+ console.timeEnd('step1');
398
+
399
+ console.time('step2');
400
+ await step2();
401
+ console.timeEnd('step2');
402
+
403
+ console.time('step3');
404
+ await step3();
405
+ console.timeEnd('step3');
406
+
407
+ console.timeEnd('fullOperation');
408
+ }
409
+
410
+ // Memory Leak Detection
411
+ function checkForLeaks() {
412
+ const initialMemory = process.memoryUsage().heapUsed;
413
+
414
+ for (let i = 0; i < 10000; i++) {
415
+ performOperation();
416
+ }
417
+
418
+ // Force garbage collection (run with --expose-gc)
419
+ global.gc?.();
420
+
421
+ const finalMemory = process.memoryUsage().heapUsed;
422
+ const leaked = finalMemory - initialMemory;
423
+
424
+ console.log(`Memory difference: ${(leaked / 1024 / 1024).toFixed(2)} MB`);
425
+ }
426
+ ```
427
+
428
+ ### 6. Fix Verification
429
+
430
+ ```typescript
431
+ // Write the failing test FIRST
432
+ describe('User Profile Update', () => {
433
+ it('should handle large avatar uploads', async () => {
434
+ // This test should FAIL before the fix
435
+ const largeImage = generateLargeImage(10_000_000); // 10MB
436
+
437
+ const result = await uploadAvatar(userId, largeImage);
438
+
439
+ expect(result.success).toBe(true);
440
+ expect(result.url).toBeDefined();
441
+ });
442
+
443
+ it('should show error for files exceeding limit', async () => {
444
+ const tooLargeImage = generateLargeImage(50_000_000); // 50MB
445
+
446
+ await expect(uploadAvatar(userId, tooLargeImage)).rejects.toThrow(
447
+ 'File size exceeds 20MB limit'
448
+ );
449
+ });
450
+ });
451
+
452
+ // After implementing fix, tests should pass
453
+ ```
454
+
455
+ ## Use Cases
456
+
457
+ ### Debugging Session Log
458
+
459
+ ```markdown
460
+ ## Debug Session: API Timeout Error
461
+
462
+ ### Problem Report
463
+ - Error: "Request timeout after 30000ms"
464
+ - Endpoint: POST /api/reports/generate
465
+ - Frequency: 60% of requests
466
+ - First reported: 2024-01-15
467
+
468
+ ---
469
+
470
+ ### Phase 1: Reproduce
471
+ **Steps to reproduce:**
472
+ 1. Login as admin
473
+ 2. Navigate to Reports
474
+ 3. Select "Full Export" with date range > 1 year
475
+ 4. Click Generate
476
+
477
+ **Result:** Timeout error after 30s
478
+
479
+ **Reproducibility:** 100% with > 1 year data
480
+
481
+ ---
482
+
483
+ ### Phase 2: Isolate
484
+
485
+ **Binary search results:**
486
+ - With 1 month data: Works (2s)
487
+ - With 6 months data: Works (15s)
488
+ - With 1 year data: Timeout (>30s)
489
+
490
+ **Component isolation:**
491
+ - API handler: Fast
492
+ - Database query: SLOW (found bottleneck!)
493
+ - Report generation: Not reached
494
+
495
+ **Identified:** Database query taking too long
496
+
497
+ ---
498
+
499
+ ### Phase 3: Hypothesize
500
+
501
+ | # | Hypothesis | Evidence | Test Cost | Priority |
502
+ |---|------------|----------|-----------|----------|
503
+ | H1 | Missing index on date column | No index on created_at | Low | 1st |
504
+ | H2 | N+1 query in report | Code shows loop queries | Low | 2nd |
505
+ | H3 | Data volume issue | Works with less data | Med | 3rd |
506
+
507
+ ---
508
+
509
+ ### Phase 4: Test
510
+
511
+ **H1 Test: Check for missing index**
512
+ ```sql
513
+ EXPLAIN ANALYZE SELECT * FROM transactions
514
+ WHERE created_at BETWEEN '2023-01-01' AND '2024-01-01';
515
+
516
+ -- Result: Seq Scan on transactions (cost=0.00..25432.00)
517
+ -- Sequential scan = No index being used!
518
+ ```
519
+ **Result:** CONFIRMED - Missing index
520
+
521
+ **Solution identified:** Add index on created_at
522
+
523
+ ---
524
+
525
+ ### Phase 5: Fix & Verify
526
+
527
+ **Fix:**
528
+ ```sql
529
+ CREATE INDEX idx_transactions_created_at ON transactions(created_at);
530
+ ```
531
+
532
+ **Verification:**
533
+ ```sql
534
+ EXPLAIN ANALYZE SELECT * FROM transactions
535
+ WHERE created_at BETWEEN '2023-01-01' AND '2024-01-01';
536
+
537
+ -- Result: Index Scan using idx_transactions_created_at (cost=0.29..8.53)
538
+ ```
539
+
540
+ **Test results:**
541
+ - 1 year report: 3s (was >30s) ✅
542
+ - 2 year report: 6s ✅
543
+ - Full history: 12s ✅
544
+
545
+ **Regression test added:** ✅
546
+
547
+ ---
548
+
549
+ ### Summary
550
+ - **Root cause:** Missing database index on transactions.created_at
551
+ - **Fix:** Added index
552
+ - **Time to fix:** 2 hours
553
+ - **Prevention:** Add query performance tests to CI
554
+ ```
555
+
556
+ ## Best Practices
557
+
558
+ ### Do's
559
+
560
+ - Always reproduce before debugging
561
+ - Write down hypotheses before testing
562
+ - Test one hypothesis at a time
563
+ - Use binary search for large codebases
564
+ - Add logging strategically
565
+ - Write a failing test before fixing
566
+ - Document the debugging session
567
+ - Check for related issues
568
+ - Add regression tests
569
+ - Share learnings with team
570
+
571
+ ### Don'ts
572
+
573
+ - Don't debug by random code changes
574
+ - Don't skip the reproduction step
575
+ - Don't test multiple hypotheses at once
576
+ - Don't ignore intermittent bugs
577
+ - Don't fix symptoms instead of root cause
578
+ - Don't forget to remove debug code
579
+ - Don't skip the verification step
580
+ - Don't assume cause without evidence
581
+ - Don't keep debugging if stuck (escalate)
582
+ - Don't forget to document the fix
583
+
584
+ ## References
585
+
586
+ - [Debugging: The 9 Indispensable Rules](https://www.amazon.com/Debugging-Indispensable-Software-Hardware-Problems/dp/0814474578)
587
+ - [Why Programs Fail](https://www.whyprogramsfail.com/)
588
+ - [Chrome DevTools Documentation](https://developer.chrome.com/docs/devtools/)
589
+ - [Git Bisect](https://git-scm.com/docs/git-bisect)