Update verify report: 4 of 5 residual risks resolved

R1 (R4.5 dirty confirm), R2 (default-button touch targets), R3 (polling on
battery), and R5 (pagination dedup) are all resolved by the follow-up
commits. R4 (iOS Safari manual verification) remains -- requires a physical
device pass.
This commit is contained in:
Developer
2026-06-26 15:59:00 +00:00
parent 32fa01cc12
commit b583d5a365
@@ -96,26 +96,30 @@ Each touched page has at least one mobile and one desktop test:
## Residual risks / known gaps
1. **R4.5 dirty-state outside-click confirm** not implemented in `SheetForm`.
The sheet closes on any outside-click/Escape without checking if the form is
dirty. Low impact (user loses unsaved edits, same as closing a browser tab),
but spec R4.5 called for a confirm prompt. Deferred — the `SheetForm`
primitive would need an `isDirty` prop to address this centrally.
1. **R4.5 dirty-state outside-click confirm** — RESOLVED. `SheetForm` gained an
`isDirty` prop; when true, any close path (Cancel, header X, Radix overlay
click, Escape) opens a "Discard changes?" confirm. All four form consumers
(ServicePage, Settings machine editor, message compose, WidgetConfigDialog)
compute and pass `isDirty`.
2. **Default-size text buttons (32px)** remain below 44px height. Icon buttons,
checkboxes, switches, and `size="sm"` buttons were upgraded. If strict
WCAG 2.5.5 on ALL interactive elements is required, a second touch-target
pass on `size="default"` buttons is needed.
2. **Default-size text buttons (32px)** — RESOLVED. A second touch-target pass
applied `.mobile-touch-target` to 32 default-size buttons across 9 files
(Save, Cancel, Delete, Validate SSH, Run job, etc.) plus the shared
`DialogFooter`. Combined with Slice 9, all interactive elements below `md`
now meet the 44px minimum.
3. **Polling on battery** (D8 risk): intervals unchanged. Dashboard polls
every ~30s per widget + 5s queue-status. A `document.visibilityState`
pause-refetch effect (~10 lines) is the recommended follow-up.
3. **Polling on battery** (D8 risk) — RESOLVED. `refetchIntervalInBackground:
false` is now a `QueryClient` default, so all interval polls (widgets ~30s,
queue status 5s, media build progress 1s) pause when the tab is hidden. The
`useMedia` build-progress poll no longer overrides this. Build progress
resumes and catches up on return.
4. **iOS Safari manual verification** not performed in CI. `h-[100dvh]` on
SheetForm, `position: sticky` behavior, and attachment upload from Files
need real-device testing. The flex-column layout (not `position: sticky`)
avoids the known sticky-inside-transform pitfall.
avoids the known sticky-inside-transform pitfall. UNRESOLVED — requires a
physical device pass.
5. **Pagination duplication**: `MediaMobilePagination` duplicates
`DataTablePagination` semantics. Extracting a shared `TablePagination`
component is a follow-up refactor.
5. **Pagination duplication** — RESOLVED. Extracted a shared `TablePagination`
component consumed by both the desktop `DataTable` and the Media mobile
card list. Removes ~90 lines of duplication.