| name | debug-widget |
| description | Use when debugging a Mendix pluggable widget bug — visual glitch, broken scrolling, missing data, stale state, or interaction bugs that need runtime evidence before fixing. |
Debug Widget
Overview
Evidence-first debugging for Mendix pluggable widgets. You MUST reproduce the bug with Playwright before reading source code, and MUST verify the fix with Playwright before declaring success.
REQUIRED BACKGROUND: superpowers:systematic-debugging for general root-cause methodology.
Prerequisites
Before starting, confirm with the user:
- Test project running? The Mendix app must be live at
http://localhost:8080. Ask: "Is the Studio Pro project running?"
- MX_PROJECT_PATH set? Needed for deploying the built widget. Ask if not provided.
- JIRA/bug description? Extract: widget package, symptom, reproduction steps.
Workflow
Phase 1: Reproduce
-
Identify the target from the bug report:
- Widget package (
combobox-web, datagrid-web, …)
- Symptom type — see Bug Categories table below
- Reproduction steps from JIRA
-
Find the page — see page-discovery.md
-
Write a diagnostic Playwright script that follows the JIRA reproduction steps and captures the symptom as a measurable assertion or console output diff.
See diagnostic-patterns.md for templates by bug category.
Save it as: packages/pluggableWidgets/<widget>-web/e2e/<bug-id>-diagnostic.spec.js
-
Run it:
cd packages/pluggableWidgets/<widget>-web
npx playwright test e2e/<bug-id>-diagnostic.spec.js --headed
-
Confirm reproduction:
- Script shows wrong values / assertion fails → proceed to Phase 2
- Script does NOT demonstrate the bug → fix the script (selectors, timing, page URL). Do NOT proceed to Phase 2 until the script confirms the symptom.
Phase 2: Analyze + Fix
Now you may read source code.
-
Trace the reactive chain from DOM symptom to root cause.
See reactive-chain.md.
- Simple widgets (combobox, badge): React props → hooks → component render
- Complex widgets (datagrid, gallery): React props → Gate → MobX stores → Observer components
-
Find root cause using superpowers:systematic-debugging Phase 1–3:
- Read error messages and trace data flow
- Form a single hypothesis, test minimally
- Do NOT attempt a fix without understanding WHY
-
Apply the fix at the root cause, not the symptom.
Phase 3: Build + Deploy
-
Bump the version (patch for bugfixes, minor for new behavior). Two files must stay in sync:
packages/pluggableWidgets/<widget>-web/package.json — "version" field
packages/pluggableWidgets/<widget>-web/src/package.xml — version= attribute on <clientModule>
-
Add a changelog entry in packages/pluggableWidgets/<widget>-web/CHANGELOG.md under the existing ## [Unreleased] section:
### Fixed
- We fixed an issue where <brief description of the bug>.
-
Ensure MX_PROJECT_PATH is set to the Studio Pro project directory (ask the user if not already set).
-
Build and deploy the widget:
export MX_PROJECT_PATH=/Users/<user>/Mendix/<ProjectName>
pnpm --filter @mendix/<widget>-web run build
The build copies the .mpk directly into $MX_PROJECT_PATH/widgets/. If shared packages were modified, build them first — check the widget's AGENTS.md for the dependency list.
-
Once the build succeeds, proceed directly to Phase 4 — no manual browser refresh or Studio Pro action needed.
Phase 4: Verify (GATE — must pass before declaring success)
You CANNOT claim the fix works until the Playwright script confirms it.
-
Re-run the same diagnostic script from Phase 1:
cd packages/pluggableWidgets/<widget>-web
npx playwright test e2e/<bug-id>-diagnostic.spec.js --headed
Playwright's page.goto("http://localhost:8080/...") navigates fresh and picks up the latest deployed widget automatically — no manual browser refresh needed.
-
Evaluate result:
- Assertion passes / console output shows correct values → fix confirmed
- Still failing → return to Phase 2. Do NOT guess another fix. Log what changed, what was expected, what happened. If this is the 3rd failed attempt, question the architecture per
superpowers:systematic-debugging Phase 4.5.
-
After confirmed fix:
- Run unit tests:
cd packages/pluggableWidgets/<widget>-web && pnpm run test
- Convert the diagnostic script into a regression test (change
console.log to expect() assertions), or delete it
- Report findings to user
Build-Verify Loop
Phase 2 (fix) → Phase 3 (build + deploy) → Phase 4 (verify)
│
passes? ──┤
yes: done │
no: ──────→ back to Phase 2
(max 3 attempts, then question architecture)
Bug Categories
| Category | Symptom Signals | Diagnostic Pattern |
|---|
| Layout/CSS | Wrong size, overflow broken, misaligned | Dimensions, CSS custom properties, max-height |
| Data | Missing rows, wrong values, stale content | Row count, datasource status, item text |
| Stale State | Value not updating, external change ignored | Read display → trigger change → read again |
| Interaction | Click/keyboard unresponsive, wrong selection | Event handling, aria-selected, MobX actions |
| Performance | Janky scroll, slow render, high rerender rate | Frame timing, render count, DOM node count |
| Lifecycle | Flash of old content, double render | Gate prop timing, MobX reaction order |
Common Mistakes
- Skip Playwright reproduction — if you didn't reproduce it, you don't understand it. No exceptions.
- Fix the symptom, not the cause — masking at the consumer layer won't hold. Trace to root.
- Skip session cleanup — always call
window.mx.session.logout() after each test. Mendix caps at 5 concurrent sessions.
- Forget to rebuild shared packages — if
widget-plugin-grid or other workspace deps changed, build them first.
- Wrong page config — the widget appears on multiple pages. Match the config to the bug scenario.
- Forget to deploy .mpk — building alone doesn't deploy. Copy the
.mpk to $MX_PROJECT_PATH/widgets/.
Extending This Skill
This skill applies to all pluggable widgets and grows with each debugging session. After fixing a bug, consider adding:
| What to add | Where | When |
|---|
| New bug category / diagnostic pattern | diagnostic-patterns.md | You encountered a symptom type not yet covered |
| Widget-specific selectors | diagnostic-patterns.md (under the relevant pattern's selector table) | You debugged a widget and know its key CSS selectors |
| Widget architecture section | reactive-chain.md | The widget uses DI/MobX and isn't documented there yet |
| New page discovery method | page-discovery.md | Existing tiers didn't work for a specific project setup |
| Widget context file | packages/pluggableWidgets/<widget>-web/AGENTS.md | The widget has no AGENTS.md — create one to document its architecture for future sessions |
Keep patterns widget-agnostic. Use <placeholder> selectors in templates. Add widget-specific selector tables below each pattern so the next developer can reuse your selectors without re-discovering them.
Reference Files