Files
brain-of-reese/.agent/phases/todo/42_no_reply_autoscroll/00_phase.md
T
ducoterra 02c76ad328 chore(agent): phase roadmap from TODO.md — 8 phases (40–47), 24 tasks
Converts the 9 TODO items into an executable phase roadmap (Protocol B,
appended after phase 39):

- 40 tuning toggle anonymous flash (TODO L3)
- 41 sync fail-fast + modal when a model is down (TODO L4)
- 42 no reply autoscroll (TODO L5)
- 43 thinking scroll back — user scroll + gated autoscroll (TODO L7)
- 44 markdown tables (TODO L6)
- 45 agent unlimited tool calls behind BOR_AGENT_MAX_ROUNDS (TODO L8)
- 46 mobile hamburger nav (TODO L9)
- 47 quadlet + jinja import formats, A9 revision (TODO L10–L11)

Each phase carries a user story, a dedicated Playwright E2E suite plan,
and owner-locked decisions (R1 A9 format extension, R2 phase-37 budget
revision, A1–A5 scope decisions) confirmed 2026-08-27.

Also records the completed phases 30–39 todo/ -> complete/ moves that
were pending in the working tree. TODO.md is cleared (items now live in
.agent/phases/todo/).
2026-08-27 18:25:53 -04:00

3.5 KiB

Phase 42 — No reply autoscroll

Source: TODO.md L5 — "Get rid of the chat reply autoscroll, it's breaking things like making it impossible for the user to scroll while a reply generates." Story: .agent/user_stories/no-reply-autoscroll.md Context: Phase 18 ("follow-the-bottom", owner choice 2026-08-23) added NEAR_BOTTOM_PX = 200 / isNearBottom() / scrollReveal(wrap, behavior, force) in frontend/assets/app.js: the page auto-scrolls on every thinking / tool / delta frame while the user is within 200px of the bottom. The owner now finds that fighting their own scroll. The gate and the per-frame scrolls are removed; scrolling happens only on explicit user intent (submit, restore landing).

Objective

The chat page never auto-scrolls during a turn. The viewport moves only when the user submits (their message is revealed) or when a persisted conversation is restored (one-shot landing) — both user-initiated.

Dependencies

  • 41_sync_fail_fast_models (todo) — sequential execution only (no code overlap).
  • 18_follow_bottom_scroll (complete) — the code being removed; 14_chat_persistence (complete) — the restore landing that must survive; 17_thinking_display / 11_long_answers (complete) — the thinking window-pin and long-answer behavior this phase must not break.

Tasks

  1. 01_remove_autofollow.md — strip the phase-18 gate + per-frame scrolls from app.js; rewrite the unit pin for the new contract.
  2. 02_no_autoscroll_e2e_and_commit.md — replace the phase-18 E2E with the inverse-contract suite + regressions + commit.

Testing & Quality

  • Unit: tests/unit/test_frontend_scroll.py rewritten — pins the new contract: no NEAR_BOTTOM_PX / isNearBottom in app.js; the scroll helper scrolls unconditionally (smooth / reduced-motion-aware); the user-submit path scrolls; the thinking/tool/delta handlers contain no page-scroll call; the restore landing keeps its one-shot forced scroll.
  • Coverage: frontend-only — app/ TOTAL unchanged, >90%.
  • E2E (mandatory, A16): tests/e2e/test_no_reply_autoscroll.py, run in isolation. tests/e2e/test_follow_bottom_scroll.py is deleted (behavior intentionally removed by owner direction 2026-08-27).

Completion Criteria

  • During thinking / tool / answer streaming, window.scrollY is stable (±1px) while the viewport is scrolled up.
  • Submit still reveals the user's message; reload still lands one-shot on the latest message.
  • uv run pytest green; coverage TOTAL unchanged.
  • uv run pytest tests/e2e/test_no_reply_autoscroll.py -v --no-cov green in isolation (DB up).
  • Regression E2E suites green in isolation: test_chat_rag.py, test_thinking_display.py, test_chat_persistence.py, test_long_answers.py, test_smoke.py.
  • uv run ruff check . && uv run pyright clean.
  • One --no-gpg-sign commit; phase dir moved to .agent/phases/complete/.

Locked decisions

  • Owner direction (2026-08-27, roadmap A1) revises the phase-18 owner choice (2026-08-23): follow-the-bottom auto-follow is removed; submit-reveal + restore-landing are kept. Recorded in the story file and the app.js docstring (PLAN.md §7.4's Scroll row is a PLAN-side revision to be noted by the owner — this phase does not edit PLAN.md).
  • A15 unchanged — the SSE contract is untouched; this is pure client-side behavior.
  • The thinking window's internal pin (textEl.scrollTop, phase 17) is untouched here — phase 43 reworks it separately.
  • A16/A17 honoured — one story E2E suite (replacing the removed one), one atomic commit.