Remove the blanket .agent/ gitignore so the phase roadmap, user stories, reports, and PLAN.md are versioned with the code. Only runtime artifacts (.agent/phase-sessions/, .agent/pipeline.log) remain ignored. Update AGENTS.md git protocol rule to match.
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
01_remove_autofollow.md— strip the phase-18 gate + per-frame scrolls fromapp.js; rewrite the unit pin for the new contract.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.pyrewritten — pins the new contract: noNEAR_BOTTOM_PX/isNearBottominapp.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.pyis deleted (behavior intentionally removed by owner direction 2026-08-27).
Completion Criteria
- During thinking / tool / answer streaming,
window.scrollYis 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 pytestgreen; coverage TOTAL unchanged.uv run pytest tests/e2e/test_no_reply_autoscroll.py -v --no-covgreen 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 pyrightclean.- One
--no-gpg-signcommit; 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.jsdocstring (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.