agentsclimarketplace

Om troubleshooter

Skill SHGrowth/om-superpowers/skills/om-troubleshooter

Diagnose and fix common issues in Open Mercato standalone apps — errors, modules not loading, widgets missing, failed migrations, build errors. Triggers — "error", "not working", "broken", "fix", "debug", "404", "500", "module not found". When the trace points into `node_modules/@open-mercato/*`, STOP and route to om-cto upstream-bug-triage before proposing any fix or PR.From its SKILL.md

Install
npx -y skills add SHGrowth/om-superpowers --skill om-troubleshooter

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

16.9 KB, as published. Nobody here has run it

Troubleshooter

Diagnose and fix common issues in Open Mercato standalone apps. Follow the systematic approach: identify symptoms, check common causes, verify fixes.

STOP — Upstream bug routing (read first)

Before reading anything else in this skill, check whether the symptom points at OM core. If yes, route to om-cto/references/upstream-bug-triage.md and do NOT propose a downstream fix or "draft an upstream PR" inline.

Trigger conditions — any of these means STOP and route:

  • A stack trace, error log, or breakpoint lands inside node_modules/@open-mercato/* (or a checked-out @open-mercato/* package).
  • You found yourself reading source from node_modules/@open-mercato/* to diagnose. If the diagnostic path went through OM core code, the bug class is "upstream until proven otherwise."
  • A core function returns wrong data, a contract doesn't match its types/JSDoc, or a widget injection / enricher / interceptor / event subscriber doesn't fire when the wiring looks correct.
  • You're about to suggest changes inside node_modules/@open-mercato/* — even mentally framed as "would need to".
  • You're about to offer the user a choice that includes "draft an upstream PR" or "patch upstream".

What "route" means concretely:

  1. Stop the diagnosis hand-off. Do NOT enumerate fix options to the user yet.
  2. Invoke om-cto and load references/upstream-bug-triage.md. Provide the six required inputs (symptom / source location / expected vs actual / repro / proposed workaround sketch / calling agent + task).
  3. Follow the verdict om-cto returns. If the verdict is confirmed-new-bug, the upstream patch handoff is a Write to <om_core_path>/agents/tasks/<YYYY-MM-DD>-<slug>/README.md — NOT a PR opened from the consumer-app session, and NOT an entry appended to <om_core_path>/ISSUE_LOG.md. The drain agent picks up by directory listing, not by log scanning.

Why this exists: in past sessions, the troubleshooter found upstream bugs (e.g., raiseCrudError not handling nested error.message in @open-mercato/ui), offered "draft an upstream PR" as a third option alongside local fixes, and on user redirect appended to ISSUE_LOG.md instead of using agents/tasks/<DATE>-<slug>/README.md. Both bypassed the triage protocol. This block is here so it doesn't happen again.

Table of Contents

  1. Diagnostic Flow
  2. Module Issues
  3. Entity & Migration Issues
  4. API Route Issues
  5. UI & Widget Issues
  6. Build & Type Issues
  7. Extension Issues
  8. Database Issues
  9. Quick Diagnostics

1. Diagnostic Flow

When the developer reports a problem, follow this order:

Step 1: Identify the Layer

SymptomLayerGo to
Module not discovered / route 404Module wiring§2
Database column/table errorsEntity & Migration§3
API returns 500 / wrong dataAPI Route§4
Page blank / component missingUI & Widget§5
Build fails / type errorsBuild & Type§6
Enricher/interceptor/widget not workingExtension§7
Connection refused / query errorsDatabase§8

Step 2: Check Generated Files

Run these commands first — they fix 60%+ of issues:

yarn generate          # Regenerate module discovery files
yarn dev               # Restart dev server

If the issue persists after yarn generate, continue to the specific section.

Step 3: Verify the Basics

# Check module is registered
grep '<module_id>' src/modules.ts

# Check generated files exist
ls .mercato/generated/

# Check for TypeScript errors
yarn typecheck

2. Module Issues

Module not found / not loading

Symptoms: 404 on module routes, module not in sidebar, "module not registered" errors

Checklist:

  1. Is the module registered in src/modules.ts?

    // Must have this entry:
    { id: '<module_id>', from: '@app' }
    

    Fix: Add the entry and run yarn generate.

  2. Did you run yarn generate? Check if .mercato/generated/ contains your module's entries. Fix: Run yarn generate.

  3. Is the module folder named correctly? Must be plural, snake_case: src/modules/<module_id>/ Fix: Rename folder to match module ID.

  4. Does index.ts export metadata?

    export const metadata: ModuleInfo = { name: '<module_id>', ... }
    

    Fix: Add the metadata export.

  5. Is the dev server running with latest changes? Fix: Restart with yarn dev.

Module loads but pages 404

Symptoms: Module appears in generated files but backend pages return 404

Checklist:

  1. Are backend page files in the right location?

    • List page: backend/page.tsx (not backend/index.tsx)
    • Detail page: backend/<entities>/[id].tsx (bracket notation) Fix: Rename to match auto-discovery convention.
  2. Do pages export metadata with requireAuth?

    export const metadata = { requireAuth: true, features: ['<module_id>.view'] }
    

    Fix: Add metadata export.

  3. Does the user have the required ACL features? Check setup.ts has defaultRoleFeatures for the user's role. Fix: Add features to role defaults, re-run setup.


3. Entity & Migration Issues

"Column does not exist" / "Table does not exist"

Symptoms: Database queries fail with missing column/table errors

Checklist:

  1. Did you create a migration after adding/changing the entity?

    yarn db:generate     # Creates migration file
    

    Fix: Run yarn db:generate to create the migration.

  2. Did you apply the migration?

    yarn db:migrate      # Applies pending migrations
    

    Fix: Run yarn db:migrate.

  3. Is the migration file correct? Check src/modules/<module_id>/migrations/ for the latest migration. Verify it has the expected columns and types. Fix: If wrong, delete the migration file, fix the entity, and regenerate.

Migration generation creates unexpected changes

Symptoms: yarn db:generate produces migrations for unrelated modules

Checklist:

  1. Are node_modules up to date?

    yarn install
    
  2. Did you modify a core module entity without ejecting? Never edit node_modules/@open-mercato/*. Fix: Revert changes to node_modules. Use UMES extensions instead, or eject the module.

Entity changes not reflected

Symptoms: Changed entity file but API still returns old schema

Checklist:

  1. Run yarn generate — entity discovery is cached
  2. Run yarn db:generate — schema needs a migration
  3. Run yarn db:migrate — migration needs to be applied
  4. Restart yarn dev — server caches entity metadata

4. API Route Issues

Route returns 404

Checklist:

  1. Is the file in the correct path? src/modules/<module_id>/api/<method>/<route-path>.ts Method folders: get/, post/, put/, delete/

  2. Does it export a default handler?

    export default handler
    
  3. Does it export openApi?

    export const openApi = { summary: '...', tags: ['...'] }
    

    API routes without openApi export are not discovered.

  4. Did you run yarn generate?

Route returns 500

Checklist:

  1. Check server logs — look for the actual error message
  2. Is the entity imported correctly? Verify import path
  3. Is organization_id filtering applied? Required for all tenant-scoped queries
  4. Is the zod schema matching the request body? Schema validation errors return 422, not 500

Route returns 401 / 403

Checklist:

  1. Is the user authenticated? Check session/token
  2. Does the user have required features? Check acl.ts + setup.ts role mapping
  3. Are features assigned to the user's role? Check role configuration in admin

5. UI & Widget Issues

Backend page is blank

Checklist:

  1. Does the page have 'use client' directive? Required for pages with interactivity
  2. Check browser console for errors — React rendering errors appear there
  3. Is the correct import path used? Use @open-mercato/ui/backend/...
  4. Are API calls using apiCall / apiCallOrThrow? Never use raw fetch

DataTable shows no data or missing rows

Checklist:

  1. Is the API path correct? Check apiPath prop matches actual API route
  2. Is the entity ID correct? Check entityId prop
  3. Does the API return data? Test with curl or browser devtools
  4. Does the user have view feature? Check ACL
  5. Are pagination props wired? Without page, pageSize, totalCount, and onPageChange, the table only shows the first page with no pagination controls. Check the API returns totalCount in the response.
  6. Is organization_id scoping correct? Records created without proper organization_id won't appear when the API filters by current org
  7. Are records soft-deleted? Records with deletedAt set are filtered out by default

Sidebar icons broken or wrong

Checklist:

  1. Are icons using lucide-react components? Import from lucide-react (e.g., import { Trophy } from 'lucide-react')
  2. AVOID React.createElement('svg', ...) — inline SVG via React.createElement is fragile in bundler contexts and can produce broken icons after yarn generate
  3. Is the icon defined in page.meta.ts? Export as part of metadata.icon
  4. Did you run yarn generate? The generator reads icon metadata from page.meta.ts

Correct pattern:

// page.meta.ts
import { Trophy } from 'lucide-react'
export const metadata = { icon: <Trophy className="size-4" /> }

CrudForm doesn't save

Checklist:

  1. Check browser network tab — look for the POST/PUT request and response
  2. Is the zod schema matching the form fields? Mismatched field names cause silent failures
  3. Are required fields filled? Check form validation
  4. Does the API route handle the HTTP method? Check api/post/ or api/put/ exists

6. Build & Type Issues

yarn build fails

Checklist:

  1. Run yarn typecheck first — isolates type errors from build errors
  2. Run yarn generate first — regenerates type-dependent files
  3. Check import paths — use @open-mercato/<package>/... for framework imports
  4. Check for circular imports — module A importing from module B importing from module A

Type errors after adding a module

Checklist:

  1. Run yarn generate — updates generated type files
  2. Check entity imports — use correct relative or package paths
  3. Check zod schema matches entity — types derived from zod must align

"Module not found" in imports

Checklist:

  1. Is the package installed? Check package.json dependencies
  2. Is the import path correct? Framework packages use @open-mercato/<package>/...
  3. Is the package built? Run yarn install to link workspace packages

7. Extension Issues

Response Enricher data not appearing

Checklist:

  1. Is data/enrichers.ts exporting enrichers array?

    export const enrichers = [enricher]
    
  2. Did you run yarn generate? Enrichers are auto-discovered

  3. Is targetEntity correct? Must match the target module's entity ID exactly (e.g., customers.person not customers.people)

  4. Is the enricher throwing silently? Check critical: false (default) — errors are swallowed. Temporarily set critical: true to surface errors.

  5. Check enricher id is unique — duplicate IDs cause only one to run

Widget not appearing in target module

Checklist:

  1. Is the widget mapped in injection-table.ts?

    export const widgetInjections = {
      '<spot-id>': { widgetId: '<your-widget-id>', priority: 50 },
    }
    
  2. Is the spot ID correct? Check the exact format:

    • Forms: crud-form:<entityId>:fields
    • Tables: data-table:<tableId>:columns
    • Menus: menu:sidebar:main
  3. Does the widget file export default?

    export default widget
    
  4. Is the widget metadata.id unique? Duplicate IDs cause conflicts

  5. Did you run yarn generate? Widgets are auto-discovered

API Interceptor not running

Checklist:

  1. Is api/interceptors.ts exporting interceptors array?

    export { interceptors }
    
  2. Does targetRoute match? Check exact route path (without /api/ prefix)

  3. Does methods include the HTTP method? e.g., ['GET', 'POST']

  4. Is the interceptor throwing instead of returning { ok: false }? Errors in interceptors are caught silently

  5. Check priority — lower priority runs first. Another interceptor may be blocking

Component replacement not working

Checklist:

  1. Is widgets/components.ts exporting componentOverrides?
  2. Is the componentId handle correct? Use ComponentReplacementHandles helpers
  3. For replacement mode: is propsSchema provided?
  4. Did you run yarn generate?

8. Database Issues

Connection refused

Checklist:

  1. Is PostgreSQL running?

    docker compose ps    # Check container status
    docker compose up -d # Start if stopped
    
  2. Is .env configured correctly? Check DATABASE_URL

  3. Is the database created?

    yarn initialize      # Creates DB + first admin
    

Query timeout / slow queries

Checklist:

  1. Are indexes present on organization_id and tenant_id? Check entity has @Index()
  2. Is the query filtering by organization_id? Missing filter = full table scan
  3. Are enrichers using batch queries? Missing enrichMany causes N+1

9. Quick Diagnostics

The "Fix Everything" Sequence

When nothing else works, run this full reset sequence:

yarn generate          # 1. Regenerate all discovery files
yarn typecheck         # 2. Check for type errors
yarn db:generate       # 3. Check for pending migrations
yarn db:migrate        # 4. Apply any pending migrations
yarn dev               # 5. Restart dev server

Common Error → Fix Table

Error MessageLikely CauseFix
Module '<id>' not foundNot in src/modules.tsAdd entry, yarn generate
Table '<name>' does not existMissing migrationyarn db:generate + yarn db:migrate
Column '<name>' does not existEntity changed without migrationyarn db:generate + yarn db:migrate
Cannot find module '@open-mercato/...'Package not installedyarn install
Route not found / 404Missing openApi export or wrong pathAdd export, yarn generate
401 UnauthorizedMissing auth or session expiredCheck login, check requireAuth
403 ForbiddenUser lacks required featureCheck acl.ts + setup.ts roles
422 Unprocessable EntityZod validation failedCheck request body matches schema
Widget not showingMissing injection-table.ts mappingAdd mapping, yarn generate
Enricher data missingcritical: false hiding errorsSet critical: true temporarily
Interceptor not runningWrong targetRoute or methodsCheck exact route path and methods
ECONNREFUSEDDatabase/service not runningdocker compose up -d
DataTable shows fewer rows than expectedMissing pagination props or API totalCountWire page/pageSize/totalCount/onPageChange props
Sidebar icons broken or wrongInline SVG via React.createElementUse lucide-react components in page.meta.ts
yarn generate changes unexpected filesStale generated filesDelete .mercato/generated/, re-run

Rules

  • ALWAYS run yarn generate as first diagnostic step
  • ALWAYS check server logs / browser console for actual error messages
  • NEVER edit files in .mercato/generated/ or node_modules/
  • NEVER assume the issue — verify with actual error output
  • Fix the root cause, not the symptom — temporary workarounds become permanent bugs
  • NEVER silently patch around suspected OM upstream bugs. See the "STOP — Upstream bug routing" block at the top of this skill for the full protocol. Short version: route to om-cto/references/upstream-bug-triage.md; the upstream patch handoff is a Write to <om_core_path>/agents/tasks/<YYYY-MM-DD>-<slug>/README.md, NOT an entry in ISSUE_LOG.md and NOT a PR from the consumer-app session.
  • When suggesting a fix, include the exact command or code change needed

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.