# SPQ-v2 Pitfalls (June 2026)

Bugs discovered and fixed during the spq-v2 porting/deployment phase.

## 1. Nested component input focus loss

The `ServiceRow` was defined as a nested function inside `ServicesTable`. Every store update re-rendered `ServicesTable`, recreating `ServiceRow` as a new React component type, destroying and remounting the DOM inputs. Focus lost on every keystroke.

**Fix:** Extracted to file-level `memo`'d component. See `pocketbase-development` skill.

## 2. Subagent-generated bugs

Subagents dispatched to build feature pages consistently produce the same class of bugs:
- **Missing onClick handlers** — buttons rendered without any action (e.g., "Add as custom service")
- **Wrong collection names** — using `repair_orders` when it's `repairOrders`
- **Missing API wiring** — AI functions imported but not connected
- **Nested components** — components defined inside components (causes focus loss)
- **`sort: '-created'`** — references field that doesn't exist on most PB collections

Post-subagent audit checklist:
- [ ] Every button has an onClick handler
- [ ] Every collection name matches the actual PB collection
- [ ] All import functions are actually called somewhere
- [ ] No components defined inside other components
- [ ] All sort fields exist on the target collection

## 3. PocketBase collection naming

| Code uses | Actual PB name | Status |
|-----------|---------------|--------|
| `repair_orders` | `repairOrders` | Wrong — must match |
| `repairOrders` | `repairOrders` | Correct |
| `invoices` | MISSING | Needs collection created |
| `service_advisors` | MISSING | Needs collection created |
| `vehicles` | MISSING | Needs collection created |

## 4. `created` field doesn't exist

PB collections created via the SDK on first insert don't get system `created`/`updated` fields. Use `sort: '-id'` instead. Also, `createdAt` field was used inconsistently — the QuoteGenerator saves `createdAt` but the Dashboard reads `created`.

## 5. Tesseract.js CDN import fails in Vite prod

`import('https://cdn.jsdelivr.net/npm/tesseract.js@5/...')` — Vite can't bundle external URLs. Use `import Tesseract from 'tesseract.js'` (npm package already in package.json).

## 6. RepairOrders JSON field (services)

PB `json` type fields arrive as strings when the collection was created via certain paths. Always guard with `Array.isArray()` and wrap `JSON.parse()` in try/catch.

## 7. Date formatting crashes

`new Date(undefined)` → `Invalid Date` → `RangeError: Invalid time value` when calling `.toLocaleDateString()`. Always guard with `if (!iso) return '—'`.

## 8. Completed → Reopen

Original bug: once a repair order was marked "completed", all status buttons disappeared. Only "Mark Delivered" was shown. Fixed by adding "Reopen" button that sets status back to "active".

## 9. Promised Completion (Due Time)

The original site shows a "Due" column with formatted promised completion times. Added `promisedTime` field to RepairOrder type, `formatDueDate()` formatter, datetime-local input in create/edit modal, and column in the table.
