机房只有部分电脑还是 Chrome 105,其余更新,按最低那档定基线。 - legacy 插件留着:vite 8 的默认 build.target 是 chrome111,比机房高。 modernTargets 不写,用插件自带的 chrome>=105 基线,正好是这一档。 - polyfill 清单按 105 重新探测,63 → 50 项,仍然写死:自动探测要对每个产物 跑 Babel 扫描,构建 3s → 12s。写死后产出的 polyfills chunk 与自动探测同尺寸。 - 删 mermaid-legacy(mermaid@9)、useMermaid 里按 UA 分叉的 v9 回调式 render、 为它存在的 cytoscape UMD→ESM 别名 —— 105 直接用 mermaid 11。 - View Transitions 要 111,darkTransition 的降级分支保留,注释改成 105。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- TIME_ZONE / TIME_ZONE_OFFSET_MINUTES 移到 packages/contract/src/time.ts, 前后端共用一份,不再各写一遍靠注释对齐。 - apps/api/src/time.ts 新增 localTime(列),替换散落 7 处的 `at time zone ${TIME_ZONE_SQL}`;ac-trend 的 where 复用同一个 year 表达式。 - /problems/:displayId/yearly-ac 漏写了时区、按 UTC 切年,被会话时区兜底掩盖; 改为按东八区切(只影响每年 12-31 北京 0–8 点的提交归年)。 - 删掉数据库连接的 TimeZone 和 Dockerfile 的 TZ:正确代码不依赖它们, 它们只会在线上掩盖漏写处、让 dev 与线上答案不同。 - time.ts:calendarDayYearsAgo/pad 并入 shiftMonthsByCalendar,startOfCalendarDay 并入 todayStart,localWeekday 改用 getUTCDay,删掉历史叙述注释。 - 前端 zonedParts 改为固定偏移 + getUTC*(与后端、日期选择器同一写法), 去掉 Intl formatToParts;10 万次 299ms → 11ms。zonedYear 去掉按浏览器时区的兜底。 - 两份 CLAUDE.md 同步;n-date-picker 那条过时说明改成现用法。 验证:新旧「近两年起点」21359 个时刻 0 差异、localWeekday 0 差异、 前端固定偏移与 Intl 在 America/New_York 下 47821 个时刻 0 差异; localTime 在 select/group by/where 复用可用;fix-achievement-hours 预演仍为 148 / 60。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K1d8B3f4SXJwDvUY625eQd