feat(reports): show chapter progress while a report is being written (BUG-601)

The worker already persists a phase ladder and durable per-section rows;
the waiting screen parsed the progress fields and rendered none of them.
Chapter progress now drives the screen: one cell per chapter rather than
a percentage bar, since the job percent jumps 0->30 and 90->100.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016P5RoqzmUQEbeC2qjAkeGr
This commit is contained in:
Jesse_Chen
2026-09-09 03:30:15 +00:00
co-authored by Claude Fable 5
parent 301eae4b76
commit 848e39e61f
9 changed files with 684 additions and 18 deletions
+21
View File
@@ -478,5 +478,26 @@ Agent 的 live 标记只有 `InlineSpinner` 一种。曾经并存的 canvas 小
首页只揭幕一次。揭幕前的加载屏分两阶段:先取账户、模型目录与会话列表,再并行取当前会话消息、推荐问题、今日星语与校正入口摘要,并预热校正分包;全部就绪或 4 秒预算到期(`BOOTSTRAP_PREPARE_TIMEOUT_MS`)才揭幕。揭幕后不得再出现任何阻塞等待或组件级 spinner:推荐问题未到显示安全默认问题,今日星语未到显示静态文案「今天的星语还没写出来。」(不带 `aria-busy`),校正卡用无摘要文案,内容到达后静默替换。切换到消息尚未缓存的会话时消息区留白并只给 `sr-only` 文案,不转圈;揭幕后按侧栏顺序后台预取最近 5 条会话(`SESSION_PREFETCH_COUNT`)让常见切换零等待。轨道环消失后不得再换一套动效继续等。
### 报告生成等待态
个人报告要写几分钟,属于"等到有实质进度可报"的一类,因此在上表三类之外单独规定:**只有准备阶段用 `InlineSpinner`,进入写作阶段后换成分章进度,不再转圈。**
三个阶段跟随 worker 自己的 phase 阶梯(`queued` / `loading_context` / `generating_report``section:<id>``persisting_report`):
| 阶段 | 屏幕上 | 文案 |
| --- | --- | --- |
| 准备 | `InlineSpinner` | 正在准备你的星盘证据 |
| 写作 | 分章进度条 + 章节清单,无 spinner | 已完成 N / M 章 |
| 收尾 | `InlineSpinner` | 正在整理成文 |
硬规定:
- **进度条按章分格,一格一章,不画百分比。** job 的 percent 在 0→30 和 90→100 是瞬间跳变,只有中段跟随真实工作量;画成线性条等于演出后端没做的动作。格数恒等于章数,条与清单不可能互相矛盾。
- **不做时间插值,不显示预计剩余时间。** 界面上没有任何按定时器推进的东西;后端没动,屏幕就不动。章节耗时被重试放大到两倍以上,报不准比不报更伤。
- **正在写的那一章由行状态判定,不由 phase 名判定。** `section:<id>` 命名的是刚写完的那一章;且章节列表按 `section_id` 字典序返回,不是写作顺序,所以"已完成数 + 1"也会指错。唯一正确的判据是 `pending` 且已被认领。
- **停滞满 90 秒**`REPORT_PROGRESS_STALL_MS`)当前章文案改为「用时较长,仍在写」。不写第几次尝试——`attemptCount` 不出服务端。
- **写作失败的章仍然计入完成数**,进度条照常前进;走到头不等于全部成功,收尾按 `summarizePersonalReportFailure()` 的白名单文案说明。
- 可显示的只有章节名与章节状态(用户交付物的结构)。`attemptCount`、原始错误码、lease、job id、payload 一律不出服务端——与 BUG-043 的边界一致:那条禁止的是把后台评分状态渲染成用户要管理的面板,本处是只读等待屏上的交付物结构。
Admin 的 antd `<Spin>` 是独立设计系统,不在此表。