diff --git a/.planning/phases/09-ux-tech-debt-closure/09-RESEARCH.md b/.planning/phases/09-ux-tech-debt-closure/09-RESEARCH.md
new file mode 100644
index 0000000..f4580b7
--- /dev/null
+++ b/.planning/phases/09-ux-tech-debt-closure/09-RESEARCH.md
@@ -0,0 +1,573 @@
+# Phase 9: UX Tech Debt Closure - Research
+
+**Researched:** 2026-04-13
+**Domain:** FastAPI / HTMX / Alpine.js / Playwright — frontend UX defect closure
+**Confidence:** HIGH (all findings grounded in direct codebase inspection)
+
+---
+
+
+## User Constraints (from CONTEXT.md)
+
+### Locked Decisions
+
+**Plan structure (3 plans, sequential):**
+- 09-01: UX-01 + driver upload 500 fix (bundled). TDD: failing pytest first, fix root cause in `imptune/api/drivers.py`, then add inline driver upload to printer form template, HTMX OOB swap refreshes `
+
+---
+
+
+## Phase Requirements
+
+| ID | Description | Research Support |
+|----|-------------|-----------------|
+| UX-01 | After a new driver is uploaded on the printer form, the DriverDesc dropdown refreshes automatically (no manual page reload) — verified live in browser | HTMX OOB swap pattern documented; existing `upload_driver` handler and printer form template inspected; OOB fragment wiring described |
+| UX-02 | PRNT-03 Alpine.js IP→port auto-derivation is verified live in a real browser session, with the verification recorded in VALIDATION.md | Alpine.js `@input` handler already present in `printer_form.html:14`; Playwright + pytest-playwright integration pattern documented |
+| UX-03 | The printer detail page exposes direct download links for each generated script (install / uninstall / detect) in addition to the package export buttons | Script routes ALREADY EXIST in `imptune/api/scripts.py` — only template links are missing; generator functions confirmed reusable |
+
+
+---
+
+## Summary
+
+Phase 9 closes three UX defects carried over from v1.0, plus one HTTP 500 bug blocking UX-01. All work is surgical: two of the three requirements touch existing files in limited ways, and one (UX-03) is nearly complete — the server-side routes already exist, only the template links are missing.
+
+**UX-01** requires the most work. The printer form has no inline upload control today; the upload endpoint works but throws HTTP 500 in at least one code path. The fix requires: (1) diagnosing and TDD-fixing the 500, (2) adding an inline `