diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index e656d27..b334cad 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -18,7 +18,7 @@ ### UX Tech Debt (UX) -- [ ] **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 +- [x] **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 - [ ] **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 - [x] **UX-03**: The printer detail page exposes direct download links for each generated script (install / uninstall / detect) in addition to the package export buttons @@ -57,7 +57,7 @@ Carried forward from v1.0 Out of Scope — no change. | RTVAL-03 | Phase 10 | Pending | | RTVAL-04 | Phase 10 | Pending | | RTVAL-05 | Phase 10 | Pending | -| UX-01 | Phase 9 | Pending | +| UX-01 | Phase 9 | Complete | | UX-02 | Phase 9 | Pending | | UX-03 | Phase 9 | Complete | | NYQ-01 | Phase 8 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 18de13f..0825ba7 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -89,6 +89,6 @@ Full details: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md) | 6. Wire Icon into .intunewin | v1.0 | 1/1 | Complete | 2026-04-10 | | 7. Dashboard & Nav Polish | v1.0 | 1/1 | Complete | 2026-04-13 | | 8. Nyquist Validation Track | v1.1 | 0/? | Not started | — | -| 9. UX Tech Debt Closure | 1/3 | In Progress| | — | +| 9. UX Tech Debt Closure | 2/3 | In Progress| | — | | 10. Real-World Runtime Validation | v1.1 | 0/? | Not started | — | | 11. Real-World Rollout & Feedback | v1.1 | 0/? | Not started | — | diff --git a/.planning/STATE.md b/.planning/STATE.md index f430335..45e36f5 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v1.1 milestone_name: Hardening & Validation status: Pending (roadmap approved, plans not yet drafted) -stopped_at: Completed 09-ux-tech-debt-closure-09-03-PLAN.md -last_updated: "2026-04-13T08:49:37.022Z" +stopped_at: Completed 09-01-driver-upload-fix-and-inline-oob-PLAN.md +last_updated: "2026-04-13T08:53:01.475Z" last_activity: 2026-04-13 — v1.1 roadmap created, 15/15 requirements mapped across Phases 8–11 progress: total_phases: 4 completed_phases: 0 total_plans: 3 - completed_plans: 1 + completed_plans: 2 --- # Project State @@ -61,6 +61,8 @@ Last activity: 2026-04-13 — v1.1 roadmap created, 15/15 requirements mapped ac Full decision log in PROJECT.md Key Decisions table. Milestone v1.0 decisions archived in `milestones/v1.0-ROADMAP.md`. - [Phase 09-ux-tech-debt-closure]: 09-03: .ps1 routes added as aliases (not renames) to preserve backward compatibility - [Phase 09-ux-tech-debt-closure]: 09-03: Shared _*_response() helper pattern used for route aliases +- [Phase 09]: Sentinel field (caller=printer_form) for OOB branching: chosen over HX-Target header for clarity and testability +- [Phase 09]: HTMX OOB template includes primary fragment + OOB select sibling in driver_upload_with_oob.html ### Pending Todos @@ -70,6 +72,6 @@ Full decision log in PROJECT.md Key Decisions table. Milestone v1.0 decisions ar ## Session Continuity -Last session: 2026-04-13T08:49:37.019Z -Stopped at: Completed 09-ux-tech-debt-closure-09-03-PLAN.md +Last session: 2026-04-13T08:53:01.469Z +Stopped at: Completed 09-01-driver-upload-fix-and-inline-oob-PLAN.md Resume file: None diff --git a/.planning/phases/09-ux-tech-debt-closure/09-01-SUMMARY.md b/.planning/phases/09-ux-tech-debt-closure/09-01-SUMMARY.md new file mode 100644 index 0000000..1eceabd --- /dev/null +++ b/.planning/phases/09-ux-tech-debt-closure/09-01-SUMMARY.md @@ -0,0 +1,130 @@ +--- +phase: 09-ux-tech-debt-closure +plan: "01" +subsystem: ui +tags: [fastapi, htmx, jinja2, oob-swap, driver-upload, pytest] + +# Dependency graph +requires: + - phase: 03-printer-configuration + provides: printer_form.html with Alpine.js x-data and driver for OOB targeting + - caller=printer_form sentinel-based OOB branching in upload handler + - 4 new integration tests (500 regression x2 + OOB contract x2) + 1 printer form test +affects: + - 09-02-playwright-port-autofill (depends on final printer_form.html shape) + - 10-rtval (runtime validation uses driver upload flow) + +# Tech tracking +tech-stack: + added: [] + patterns: + - "HTMX OOB swap via hx-swap-oob=\"true\" on sibling element in same response body" + - "Caller-context sentinel: hidden form field name=caller value=printer_form" + - "FastAPI mixed multipart: UploadFile + Form() parameters in same handler" + - "TDD RED-GREEN: write failing tests, diagnose from output, implement fix" + +key-files: + created: + - imptune/templates/partials/driver_upload_with_oob.html + - tests/test_printer_form.py + modified: + - imptune/api/drivers.py + - imptune/templates/partials/printer_form.html + - tests/test_driver_upload.py + +key-decisions: + - "Sentinel field (caller=printer_form) chosen over HX-Target header for caller detection — explicit and testable without HTTP header manipulation" + - "OOB template includes driver_list.html as primary swap + sibling ` with new driver auto-selected +- Wired inline driver upload form in `printer_form.html`: sibling `
` with `caller=printer_form` sentinel, outside the printer `` to comply with HTML spec +- Added stable `id="printer-form-driver-select"` to driver `