# TASK · 最后一轮回答与点赞 / 踩按钮之间的大段空白(2026-09-26) ## 基线 - `origin/staging` 当前 head。分支 `codex/latest-turn-actions-gap-20260926`。 - 只改 `frontend/src/app/globals.css` 与相关合同测试;不碰 `useConversationScrollAnchor` 的逻辑。与其它在途单不交叉。 ## 事故实证(产品 09-26 真机,iPhone Safari,生时校正会话) 助手正文结束后,点赞 / 踩 / 复制 / 重试一排按钮被推到屏幕下部,中间空出大半屏。 - `frontend/src/app/globals.css`: ```css /* Last turn fills the remaining viewport so a short reply can still pin its head at the top. Variables are written by useConversationScrollAnchor. */ .conversation .message-list > :last-child .message-assistant { min-height: calc(var(--conversation-viewport, 0px) - var(--latest-turn-head-height, 0px)); } ``` - `.message-actions` 是 `.message-assistant` 之后的兄弟节点(`margin: -4px 0 8px 42px`),因此最小高度把它顶到留白之后。普通咨询与生时校正共用同一规则,回答越短空白越大。 - 该留白来自 BUG-930「新一轮开头钉顶」:必须保留,否则短回答时无法把本轮开头停在视口顶部。 ## 根因 留白加在了"助手消息"上,而不是加在"整轮(消息 + 操作按钮 + 追问建议)"之后。 ## 决策记录 - D1 保留 BUG-930 的钉顶留白,**只改位置**:最小高度改加在最后一轮的外层(包含助手消息、`.message-actions`、`.conversation-follow-ups` 的那个 `:last-child` 容器),使操作按钮紧跟正文,空白落在按钮与追问建议之后。 - D2 如果外层容器还包含用户行(按实际 DOM 核对),计算式里需扣除的高度保持由 `useConversationScrollAnchor` 写入的 `--latest-turn-head-height` 口径,不改 hook。 - D3 普通咨询与生时校正两处表现一致。 ## 硬红线 1. 不改 `useConversationScrollAnchor` / `JumpToLatestButton` 行为;BUG-930 / 931 / 932 的钉顶、跳到最新、闲置不写留白全部保持(其测试不得弱化)。 2. 只用现有 token;首页 `○ Static`、gzip ±2%。 3. **真实浏览器验证**(本机 Chrome,CDP 假数据):375 与 1280 宽度,普通咨询与生时校正各一条短回答——操作按钮与正文间距为 `.message-actions` 自身间距;新一轮开头仍钉在视口顶部;长回答时「跳到最新」正常。截图写进 PROGRESS。 4. 全量测试与基线逐条一致、新增 0;改动断言写三栏(写在测试文件里);更新 `frontend/DESIGN.md` 中对应说明。 ## 任务分解 - T1 CSS 调整(D1–D3)+ 合同测试更新(原断言锁的是 `.message-assistant` 选择器,按三栏改为外层容器)。 - T2 浏览器截图与 PROGRESS;BUG 记录:开工时取下一个空号,关联 BUG-930,写明为何当时的骨架页验证没发现(验证只看了开头钉顶,没看操作按钮位置)。