--- name: debugging description: Apply systematic debugging methodology. Use when investigating bugs, unexpected behavior, or when user reports issues. Auto-apply when conversation includes "bug", "broken", "not working", "wrong", "glitch", "flickering". --- # Debugging Skill ## Core Principle **Automate first, ask questions never.** If you can write a test to verify behavior, do that instead of asking the user to manually check something. ## Debugging Decision Tree ``` Bug reported │ ▼ Can I reproduce in a test? │ ├─ YES → Write failing test first │ │ │ ▼ │ Does test fail? │ │ │ ├─ YES → Debug the logic │ │ │ └─ NO → Bug is in rendering/CSS layer │ └─ NO → Need more info from user (specific steps, values) ``` ## Systematic Isolation | Question | Test Strategy | |----------|---------------| | Is the calculation correct? | Unit test with known inputs | | Is the rendering correct? | Integration test, inspect CSS | | Is it browser-specific? | Playwright test | | Is it timing-related? | Time progression integration test | | Is it state-related? | Expose `window.__debug`, inspect values | ## Common Bug Patterns ### 1. CSS Transitions + 60fps React **Symptom**: Values correct in test, visual is wrong/flickering in browser. **Cause**: CSS transitions on elements that React updates every frame. **Detection**: ```bash # Find transitions on frequently-updated elements grep -r "transition:" src/ui/*.css ``` **Fix**: Remove CSS transitions from elements in the game loop render path. ### 2. State Not Updating **Symptom**: UI shows stale data. **Test**: ```javascript it('state updates over time', () => { const { rerender } = render(); const value0 = getValue(); rerender(); const value1 = getValue(); expect(value1).not.toEqual(value0); }); ``` ### 3. Calculation Drift **Symptom**: Values slowly diverge from expected over time. **Test**: ```javascript it('no drift over many iterations', () => { let state = initialState; for (let i = 0; i < 10000; i++) { state = update(state, 16); // 16ms per frame } expect(state.value).toBeCloseTo(expected, 2); }); ``` ## Debug State Exposure For browser inspection, expose state in dev mode: ```javascript // In game loop if (import.meta.env.DEV) { window.__debug = { state: world.setLullState, gameTime: world.gameTime, computed: { /* derived values */ } }; } ``` Then in browser console: `window.__debug.state` ## Anti-Patterns | Don't Do This | Do This Instead | |---------------|-----------------| | Add `console.log`, ask user to check | Write Vitest test | | Guess at the problem | Systematically isolate with tests | | Fix symptoms | Find and fix root cause | | Manual browser debugging | Playwright automation | | Change code without understanding | Read and understand first | ## Integration with Testing Skill When debugging, use these test patterns: 1. **Regression test** - Fails without fix, passes with fix 2. **Time progression test** - Simulates frames over time 3. **Edge case test** - Zero, negative, maximum values 4. **Snapshot test** - For complex state objects ## Debugging Checklist - [ ] Can I write a failing test? - [ ] Does the test isolate the bug? - [ ] Have I checked CSS interactions? - [ ] Have I verified state values? - [ ] Is there a timing/animation issue? - [ ] Did I find the root cause (not just symptoms)?