UNIFIED DEBUGGER - Use when tasks disappear, data is lost, things are broken, or bugs need fixing...
IMPORTANT: After completing debugging work, automatically invoke these skills:
Skill(qa-testing) to verify the fix with proper testsSkill(vue-flow-debug) for specialized Vue Flow debuggingSkill(supabase-debugger) for database/auth debugging| Issue Type | Use This Skill Instead |
|---|---|
| Canvas/Vue Flow issues | Skill(vue-flow-debug) |
| Supabase/Auth problems | Skill(supabase-debugger) |
| Port/server conflicts | Skill(ops-port-manager) |
Use THIS skill for: general Vue reactivity, Pinia state bugs, task store CRUD, keyboard shortcuts, memory leaks, performance issues, cross-cutting bugs spanning multiple systems.
Always follow this systematic approach — don't jump to conclusions:
This is a known and critical pattern. When tasks vanish after deletion or sync:
useSyncOrchestrator.ts — The sync queue has historically used wrong column names (_soft_deleted vs is_deleted). If soft-delete fails, the fallback hard-DELETE + tombstone causes permanent loss.supabaseMappers.ts — Field mapping between Pinia camelCase and Supabase snake_case. Bypassing mappers causes silent failures.taskStore.tasks vs taskStore._rawTasks — tasks is actually filteredTasks (applies view/project filters). Components that need ALL tasks must use _rawTasks.FlowState has two parallel keyboard systems:
src/composables/app/useAppShortcuts.ts — App-level shortcuts (Ctrl+Z, etc.)src/utils/globalKeyboardHandlerSimple.ts — Global handlerBoth have shouldIgnoreElement guards that suppress shortcuts when input/textarea is focused. Common causes:
useUndoRedo) not initialized yetuseMagicKeys is used ONLY for canvas modifier tracking, NOT for app shortcutsRead docs/sop/canvas/CANVAS-POSITION-SYSTEM.md for the full invariants. Key rules:
parentId, canvasPosition, positiontask.canvasPosition / group.position are absolute world coordinates in store/DB; Vue Flow child node position is parent-relative. Convert absolute → relative on every node-build/reload/sync path, and persist absolute from computedPosition/recursive parent walk on writes.task.parentId, date-home tasks, spatially adopt tasks, or clear parents; those side effects make tasks look removed and can cause reload drift.useCanvasSync.ts is READ-ONLY — must NEVER call updateTask() or updateGroup()useCanvasOverdueCollector.ts is QUARANTINED — do NOT re-enable (causes position drift)useCanvasFilteredState.ts) must include BOTH task AND group positions, or groups near boundaries hit invisible walls (BUG-1310)When diagnosing sync issues between Pinia stores and Supabase:
pendingWrites (120s timeout, tied to sync completion).upsert({ onConflict: 'id' }), not .insert() (BUG-1212)$attrs passes bare booleans as "" (falsy). SortableJS treats "" as false. ALWAYS use :force-fallback="true" not force-fallback (BUG-1335)preventDefault() in touchstart (Android Chrome drops the gesture). Defer to touchmove after 10px lock threshold. Use { passive: true } on touchstart. (BUG-1453)ZERO TOLERANCE POLICY: Never claim canvas fixes work without comprehensive visual testing.
Before claiming success, MANDATORY:
npm run dev, port 5546)curl shows correct response but browser failsSymptom: Chromium shows MIME type errors for CSS/JS, but curl returns correct content-type.
Root Cause: Cloudflare caches by URL only. Chromium's preload scanner sends Accept: text/html, and Cloudflare serves cached HTML instead of CSS/JS.
Quick Diagnostic:
curl -sI "https://in-theflow.com/assets/index.css" | grep -iE "vary|content-type"
# Must include: vary: Accept-Encoding, Accept
Fix: Add to Caddyfile on VPS:
@static path /assets/*
header @static Vary "Accept-Encoding, Accept"
| Works | Fails | Likely Cause |
|---|---|---|
| Firefox | Chrome/Brave | Cloudflare cache + preload scanner |
| curl | All browsers | Service Worker cache |
| Incognito | Normal mode | Browser cache |
When user reports blank page/chunk errors:
gh run list --limit 5 — common cause: uncommitted imported fileFull reference: references/production-cdn-debugging.md
NEVER claim a bug is "fixed", "resolved", or "working" without user confirmation.
The user is the final authority on whether something is fixed. No exceptions.
| Suite | Command | Engine | What it catches |
|---|---|---|---|
| Vitest (unit) | npm run test |
Node.js | Logic, CSS safety, mappers |
| Playwright (E2E) | ./scripts/run-e2e.sh |
Chromium + Apple WebKit | Functional UI, CRUD, navigation |
| WebDriver (Tauri) | npx wdio tests/webdriver/wdio.conf.ts |
Real WebKitGTK | Tauri-specific rendering bugs |
playwright.config.ts — testDir: './tests/e2e', testMatch: '**/*.spec.ts'playwright@test.flowstate, saves auth to tests/.auth/user.json./scripts/run-e2e.sh (auto-fetches Supabase keys), NOT bare npx playwright test# 1. Build debug binary with automation enabled
TAURI_WEBVIEW_AUTOMATION=true cargo tauri build --debug
# 2. Start tauri-driver (background)
nohup tauri-driver > /tmp/tauri-driver.log 2>&1 &
# 3. Verify it's listening
curl -s http://127.0.0.1:4444/status # should return {"value":{"ready":true,...}}
# 4. Run tests
npx wdio tests/webdriver/wdio.conf.ts
# 5. Screenshots saved to .dev/screenshots/webdriver/
Prerequisites: tauri-driver (cargo install), WebKitWebDriver (webkit2gtk-driver package)
Config: tests/webdriver/wdio.conf.ts — uses debug binary at src-tauri/target/debug/flow-state
Tests: tests/webdriver/specs/webkitgtk-layout-bugs.ts — 15 tests for sidebar, z-index, CSS compat
| Bug | Test | Actual Value | Expected |
|---|---|---|---|
| Project names clipped (BUG-1672) | sidebar project names readable | 24px width | >100px |
| overflow:clip hides content | overflow:clip scrollable content | 1 element | 0 |
sans-seriflocalhost:1420 but debug build embeds frontend — should use relative URLs or the embedded base URLRead these only when needed for the specific issue:
| File | When to read |
|---|---|
references/production-cdn-debugging.md |
Cloudflare/Caddy/VPS debugging in depth |
references/tauri-icon-troubleshooting.md |
Desktop icons not updating after Tauri build |
references/css-layout-debugging.md |
CSS shadow clipping, layout, overflow issues |