跳转至

作业截止时间的数据源检查

历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。

日期:2026-10-20。本轮在日程布局排查中检查了真实取数路径,未访问学校接口、真实账号或用户作业内容。

结论

App 的 Learn 后台刷新只检查登录就绪状态,三种模式都会运行;SchedulePage 也无条件使用 Learn 和外部作业 hook。此前的示例浏览器矩阵直接写入 Learn 缓存并开启预览模式,因此不能证明真实 HTTP 请求失败时的数据行为。

实际代码存在独立问题:LearnClient.getAllHomework 对每门课的未交、已交未批、已批请求逐项吞掉错误并返回空数组。这样 429、超时或部分请求失败也可能被当成完整成功结果,进而覆盖旧截止时间快照。已改为任意一项失败则整包拒绝,不向日程、提醒或系统日历发布不完整快照。

state/data.ts 保留同学期的最后完整快照,在失败时报告错误并允许重试。前台与后台请求记录学期 key 和单调版本,切学期、A→B→A、提交作业后的同学期失效都会阻止旧请求回写;后台并发合并按版本区分。保留原有学期选择语义,没有让常驻历史学期标签页相互强制重载。

用户此次“完整模式可见、简洁模式不可见”的直接反馈,主线已从只含数量的运行诊断确认作业条目存在,而简洁页面可用高度为 0,另有列表底部滚动问题。该布局问题由 Schedule 与外壳修复;本数据源修复不能代替布局验收。

验证

  • node tools/learn-snapshot-test.mjs:12 个隔离用例通过,执行真实 LearnClient 与真实 state/data.ts,仅用假 HTTP 和状态依赖。包含全部失败、单项失败、合法空数据、提交状态、真实假 HTTP 429 不覆盖旧快照、前后台学期竞态及同学期失效。
  • node --import ./tools/ts-resolve-register.mjs tools/learn-session-recover-test.mjs:已有会话自证、恢复和并发去重检查通过。
  • node tools/learn-silent-relogin-test.mjs:已有恢复链路检查通过。
  • Desktop 与 Core 的 TypeScript 检查通过;改动文件 git diff --check 通过。

补充发现:Learn 全量包仍需等待通知和文件请求结束才发布;慢文件请求会延后截止时间出现。本轮没有引入第二套数据加载器或部分成功发布策略,以免系统日历误把部分结果当作全量同步。没有真实网络耗时证据,不能把这一点认定为本次用户问题的根因。