Skip to content

Debugging Guide

Table of Contents

Debugging 101

I asked the AI to write what it had learned while going around in circles, unable to consider venturing outside the box.

Two Critical Principles

  1. Verify source before assuming usage - When something is undefined, check where it comes from first
  2. Be systematic - Form multiple hypotheses and test the complete pipeline, don't jump to assumptions

Principle 1: Verify Source First

When something is undefined or not working, ALWAYS check the source first.

The Process

  1. Check where it comes from (imports, destructuring, property access)
  2. Verify it exists on that object (don't assume destructuring is correct)
  3. Then investigate how it's being used

Common Patterns

Destructuring from wrong object:

typescript
// BAD: Assuming destructuring is correct
const { w_s_title_edit } = s;  // But it's on x, not s!

// GOOD: Verify first, then fix
const { w_s_title_edit } = x;  // Correct!

Store access in async functions:

typescript
// BAD: Using $ syntax in async
async function foo() {
    const value = $w_s_title_edit;  // ❌ Doesn't work
}

// GOOD: Capture at function start
async function foo() {
    const s_text_edit = $w_s_title_edit;  // ✅ Capture first
    await something();
    if (s_text_edit) s_text_edit.doSomething();  // Use captured value
}

Source Verification Checklist

  • [ ] Is it imported/destructured correctly?
  • [ ] Does it exist on that object? (use grep or codebase_search to verify)
  • [ ] Is it the right instance/type?
  • [ ] Any typos?

Only after verifying source should you investigate: timing, async/await, reactivity, scope

Principle 2: Be Systematic

Don't jump to assumptions. Form multiple hypotheses and test the complete pipeline.

The Problem

When something appears broken, it's tempting to:

  • Jump to the most obvious solution (e.g., "mathy" fixes for visual issues)
  • Focus on one part of the system
  • Assume other parts are correct
  • Get tunnel vision on the first hypothesis

The Approach

  1. Form multiple hypotheses (rendering setup, data generation, data flow)
  2. Test the complete pipeline (Data → Component → DOM → Visual output)
  3. Don't assume any part is correct - verify each step
  4. Test hypotheses independently - don't get attached to your first guess

Example: Arrow Sizing Bug

Wrong: Assume path coordinates are wrong → spend time fixing math → miss that SVG was missing width/height attributes

Right: Form hypotheses → test rendering setup first → find missing attributes → fix found in 2 minutes

Systematic Checklist

For visual/rendering issues:

  • [ ] Element attributes (width, height, viewBox, etc.)
  • [ ] CSS/styling (transform, scale, positioning)
  • [ ] Data generation (coordinates, calculations)
  • [ ] Data flow between components
  • [ ] Compare working vs non-working cases
  • [ ] Browser dev tools for actual rendered values

Tools

  • grep: grep -r "pattern" src/ - Find definitions
  • codebase_search: Semantic search for usage/definitions
  • read_file: Check actual definitions

Remember

Most common mistakes:

  1. Assuming source is correct → jumping to usage fixes
  2. Not being systematic → jumping to assumptions instead of testing hypotheses

Always verify source first, then test the complete pipeline systematically.