ducoterra
ba4841a811
Build and Push Containers / build-and-push-app (push) Successful in 2m32s
Build and Push Containers / build-and-push-db (push) Successful in 13s
phase: 143_mobile_keyboard_after_answer
**Phase 143 final verification pass — 100% green, no code changes needed (all work verified in-tree)**
- **Verified implementation:** `COARSE_POINTER` constant (L395, L391-twin `typeof`-guarded shape) + gated finally-block focus `if (!COARSE_POINTER) input.focus({ preventScroll: true })` in `frontend/assets/app.js`; SETTLE lines/anchor untouched; extended unit pin in `test_frontend_scroll.py`; dedicated two-context E2E `tests/e2e/test_mobile_keyboard_focus.py`
- **C1 desktop byte-identical refocus:** ✅ unit pin passes (gated shape keeps `preventScroll`); desktop E2E asserts composer active; `test_loading_feedback.py` 5 passed (phase-06 regression)
- **C2 mobile keyboard stays down:** ✅ `test_mobile_turn_end_keeps_keyboard_down` passes — `pointer: coarse` sanity assert first, composer NOT active after done
- **C3 gates:** ✅ `uv run pytest --cov=app --cov-report=term-missing` → 3359 passed, `app/` TOTAL 99% (>90%); `uv run pytest tests/e2e/test_mobile_keyboard_focus.py -v --no-cov` → 2 passed in isolation; `uv run ruff check .` clean; `uv run pyright` 0 errors
- **C4 no regression:** ✅ full suite green (all frontend source pins: char counter, send flow, never-scroll); `test_stop_generation.py` 3 passed (single settle)
- **Docs:** README.md fully reviewed — all env vars cross-checked against `app/config.py` defaults, routes/endpoints/tools verified in code; AGENTS.md rules + quick reference verified against repo. Consistent — no changes needed
- **No live-infrastructure changes** (dev Postgres container already running)
- **Next pending phase:** `144_modal_back_button`
2026-10-01 07:03:15 -04:00
..
2026-09-07 23:54:41 -04:00
2026-09-14 15:55:13 -04:00
2026-10-01 01:27:46 -04:00
2026-09-07 12:39:01 -04:00
2026-09-13 19:28:05 -04:00
2026-08-28 15:57:59 -04:00
2026-09-07 12:39:01 -04:00
2026-09-10 00:23:08 -04:00
2026-09-30 12:55:23 -04:00
2026-09-10 00:23:08 -04:00
2026-09-16 15:50:48 -04:00
2026-09-16 15:50:48 -04:00
2026-09-28 13:45:31 -04:00
2026-09-30 12:55:23 -04:00
2026-09-25 05:19:18 -04:00
2026-09-12 19:45:00 -04:00
2026-09-27 09:36:40 -04:00
2026-09-16 15:50:48 -04:00
2026-09-13 19:28:05 -04:00
2026-09-14 15:55:13 -04:00
2026-08-21 13:42:21 -04:00
2026-08-21 13:42:21 -04:00
2026-09-13 19:28:05 -04:00
2026-09-12 13:37:19 -04:00
2026-09-01 03:52:03 -04:00
2026-09-25 01:54:23 -04:00
2026-09-16 15:50:48 -04:00
2026-09-08 01:11:45 -04:00
2026-09-27 21:12:25 -04:00
2026-09-28 07:49:37 -04:00
2026-09-14 23:07:56 -04:00
2026-09-30 12:55:23 -04:00
2026-09-28 07:49:37 -04:00
2026-09-15 05:35:05 -04:00
2026-09-28 07:49:37 -04:00
2026-09-28 07:49:37 -04:00
2026-09-08 09:37:33 -04:00
2026-09-13 01:57:40 -04:00
2026-10-01 07:03:15 -04:00
2026-09-28 18:08:11 -04:00
2026-09-30 12:55:23 -04:00
2026-09-15 11:55:59 -04:00
2026-09-08 01:56:37 -04:00
2026-09-28 21:15:03 -04:00
2026-09-28 21:15:03 -04:00
2026-09-28 21:15:03 -04:00
2026-08-27 01:04:16 -04:00
2026-09-28 22:38:54 -04:00
2026-09-08 22:31:45 -04:00
2026-09-08 22:31:45 -04:00
2026-09-28 21:15:03 -04:00
2026-09-06 06:31:31 -04:00
2026-09-06 06:31:31 -04:00
2026-09-13 23:57:54 -04:00
2026-09-29 02:14:46 -04:00
2026-09-26 17:06:09 -04:00
2026-09-28 07:49:37 -04:00
2026-09-13 19:28:05 -04:00
2026-09-09 01:45:42 -04:00
2026-09-12 21:26:30 -04:00
2026-09-30 19:16:35 -04:00
2026-09-25 01:54:23 -04:00
2026-09-13 19:28:05 -04:00
2026-09-28 03:38:14 -04:00
2026-08-26 22:39:14 -04:00
2026-09-03 11:17:47 -04:00
2026-08-25 22:42:10 -04:00
2026-09-30 10:49:40 -04:00
2026-09-12 13:37:19 -04:00
2026-09-27 05:53:12 -04:00
2026-09-08 22:31:45 -04:00
2026-09-11 00:59:35 -04:00
2026-09-27 05:53:12 -04:00
2026-10-01 04:25:03 -04:00
2026-09-10 16:43:08 -04:00
2026-09-30 19:16:35 -04:00
2026-09-30 19:16:35 -04:00
2026-09-30 19:16:35 -04:00
2026-09-30 19:16:35 -04:00
2026-09-25 05:19:18 -04:00
2026-10-01 01:27:46 -04:00
2026-09-16 06:57:49 -04:00
2026-10-01 04:25:03 -04:00
2026-09-07 23:08:46 -04:00
2026-09-30 12:55:23 -04:00
2026-09-30 12:55:23 -04:00
2026-09-12 13:37:19 -04:00
2026-09-13 19:28:05 -04:00
2026-09-16 15:50:48 -04:00
2026-09-28 07:49:37 -04:00
2026-09-25 05:19:18 -04:00
2026-09-03 13:39:15 -04:00
2026-09-30 12:55:23 -04:00
2026-09-25 05:19:18 -04:00
2026-09-08 22:31:45 -04:00
2026-09-12 13:37:19 -04:00
2026-09-28 07:49:37 -04:00
2026-09-28 21:15:03 -04:00
2026-09-02 15:55:33 -04:00
2026-09-13 19:28:05 -04:00
2026-08-30 23:39:15 -04:00
2026-09-25 05:19:18 -04:00
2026-09-28 11:49:55 -04:00
2026-09-06 06:31:31 -04:00
2026-09-13 19:28:05 -04:00
2026-09-06 06:31:31 -04:00
2026-08-25 13:46:32 -04:00
2026-09-01 04:20:26 -04:00
2026-08-25 17:48:37 -04:00
2026-09-13 19:28:05 -04:00
2026-09-28 21:15:03 -04:00
2026-08-27 23:44:35 -04:00
2026-09-08 02:38:45 -04:00
2026-09-10 16:43:08 -04:00
2026-09-10 16:43:08 -04:00
2026-08-28 17:10:02 -04:00
2026-09-07 12:39:01 -04:00
2026-09-12 15:16:02 -04:00
2026-09-30 12:55:23 -04:00
2026-09-10 16:43:08 -04:00
2026-09-25 01:54:23 -04:00