1. Run 03_browser/server.py and open its printed address.
2. Select Search using the keyboard; submit. Check 480.00 / 21 / 22.86.
3. In browser developer tools Network, inspect channel=Search and its JSON.
4. Stop the server, submit again. Old rows/totals disappear; error appears.
5. Restart it and submit again; it recovers and enables the controls.
6. Run 04_qualified. All / qualified / 0 gives 900.00 / 22 / 40.91.
7. Search / qualified / 10 gives Search Spring, 300.00 / 8 / 37.50.
8. Email / qualified / 7 gives an explicit empty state, not a server error.
9. Try -1 or 1.5 in the minimum field; normal form submission is blocked.
10. Directly request /api/report?min_enquiries=-1. Confirm HTTP 400.
11. Inspect a narrow window: filters wrap and the table scrolls horizontally.
12. Keyboard focus stays visible; status announces updates via role=status.
Record your browser/version and actual results; do not assume unit tests
establish these interface outcomes.
