diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 8b22210..490c095 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -1,8 +1,12 @@
{
"permissions": {
"allow": [
+ "Bash(*)",
"WebSearch",
- "Bash(xargs wc:*)"
+ "Bash(xargs wc:*)",
+ "Bash(claude plugin *)",
+ "Bash(where claude *)",
+ "Bash(cmd /c \"claude plugin marketplace add JuliusBrussee/caveman && claude plugin install caveman@caveman\")"
]
}
}
diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md
index 3f48119..bf1e1f9 100644
--- a/.planning/ROADMAP.md
+++ b/.planning/ROADMAP.md
@@ -109,7 +109,7 @@ Full details: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md)
| 9. UX Tech Debt Closure | 3/3 | Complete | 2026-04-13 | 2026-04-13 |
| 10. Real-World Runtime Validation | v1.1 | 3/3 | Complete | 2026-04-13 |
| 11. UI Enhancements | 4/4 | Complete | 2026-04-15 | |
-| 15. UX Driver Upload Feedback Fix | v1.1 | 1/1 | Complete | 2026-04-16 |
+| 15. UX Driver Upload Feedback Fix | v1.1 | Complete | 2026-04-16 | 2026-04-16 |
### Phase 12: i18n bugfixes — full translation coverage and browser language auto-detection
@@ -130,5 +130,5 @@ Plans:
**Success Criteria** (what must be TRUE):
1. After uploading a driver on /printers/new, the upload success feedback (driver name + confirmation) is visible on the page
2. The DriverDesc dropdown still refreshes correctly via OOB swap (no regression)
-**Plans:** 1 plan
+**Plans:** 1/1 plans complete
- [x] 15-01-PLAN.md — Fix hidden #driver-list div on /printers/new + smoke-test upload feedback visible (UX-01 integration gap)
diff --git a/.planning/STATE.md b/.planning/STATE.md
index cfc0792..265c014 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -1,3 +1,19 @@
+---
+gsd_state_version: 1.0
+milestone: v1.1
+milestone_name: Hardening & Validation
+current_plan: 1
+status: completed
+stopped_at: Completed 15-ux-driver-upload-feedback-fix/15-01-PLAN.md
+last_updated: "2026-04-16T14:37:17.811Z"
+last_activity: 2026-04-16
+progress:
+ total_phases: 6
+ completed_phases: 6
+ total_plans: 21
+ completed_plans: 21
+---
+
---
gsd_state_version: 1.0
milestone: v1.1
diff --git a/.planning/phases/15-ux-driver-upload-feedback-fix/15-VERIFICATION.md b/.planning/phases/15-ux-driver-upload-feedback-fix/15-VERIFICATION.md
new file mode 100644
index 0000000..ceed886
--- /dev/null
+++ b/.planning/phases/15-ux-driver-upload-feedback-fix/15-VERIFICATION.md
@@ -0,0 +1,111 @@
+---
+phase: 15-ux-driver-upload-feedback-fix
+verified: 2026-04-16T00:00:00Z
+status: passed
+score: 3/3 must-haves verified
+gaps: []
+human_verification:
+ - test: "Upload a real driver ZIP on /printers/new in a browser"
+ expected: "Driver name and confirmation table appear inline below the upload form immediately after upload, without a page reload"
+ why_human: "HTMX DOM swap visibility cannot be asserted programmatically — requires a live browser session to confirm the rendered result is visible to the user"
+---
+
+# Phase 15: UX Driver Upload Feedback Fix — Verification Report
+
+**Phase Goal:** Make the driver upload success feedback visible on /printers/new so technicians see confirmation after uploading a driver.
+**Verified:** 2026-04-16
+**Status:** PASSED
+**Re-verification:** No — initial verification
+
+---
+
+## Goal Achievement
+
+### Observable Truths
+
+| # | Truth | Status | Evidence |
+|---|-------|--------|----------|
+| 1 | GET /printers/new renders `#driver-list` div with no `style="display:none"` attribute | VERIFIED | `printers_new.html` line 98: `
` — no style attribute present; `grep display:none` returns no matches; `test_printers_new_driver_list_visible` passes |
+| 2 | After uploading a driver with `caller=printer_form`, the response fragment contains the driver name (upload confirmation visible) | VERIFIED | `driver_upload_with_oob.html` includes `driver_list.html` which renders `item.driver.original_filename` and `item.names`; upload handler at `drivers.py:113` branches on `caller == "printer_form"` and returns the OOB template with `parsed` and `driver_data`; `test_upload_feedback_visible_on_printers_new` asserts `"Test LaserJet Pro" in resp.text` and passes |
+| 3 | OOB select (`hx-swap-oob="true"`) still present in upload response (no regression) | VERIFIED | `driver_upload_with_oob.html` line 3: `