f935da3(base) → ab79aaf3(head)说明:本报告「修复/新增问题」章节全部来自
codescan_issues_diff的真实数据;对每条结论的真伪判定(是否由本次改动真实引入)为结合 base/head 逐文件问题清单与 diff 的复核结论。
改动围绕一个明确的缺陷:会话时区恒为 UTC(lib/db.ts),此前大量 ::date / date_trunc('week'|'month', now()) / toISOString().slice(0,10) 均按 UTC 分桶,导致北京 00:00–08:00 的提交被算到前一天/上一周/上一月,且趋势图日期标签整体提前一天。本次统一为北京墙钟口径。
| 分类 | 文件 |
|---|---|
| 新增时区纯函数 | lib/work-time.ts(beijingDayKey/MonthKey/WeekStart/MonthStart/MonthStartYM) |
| SQL 分桶片段 | lib/queries.ts(BJ_DAY/BJ_DAY_START/BJ_WEEK_START/BJ_MONTH_START/BJ_TODAY_START/BJ_OFFSET_MS) |
| 查询/聚合改造 | lib/queries.ts(dashboard/team/member/ranking/daily/commit 筛选等 10+ 处 SQL)、lib/scoring/trend.ts、lib/scoring/radar.ts、lib/members-profile.ts |
| 页面/组件 | app/team/page.tsx(内联 SQL 复用 BJ_WEEK_START)、components/feature/ProfilePanel.tsx、components/feature/WorkTimeProfile.tsx |
| 「无明细」展示 | lib/format.ts(MISSING_DETAIL_MARK/NO_DETAIL_HINT)、、 |
结论先行:这是一次方向正确、覆盖面广的口径统一改造,核心表达式已被单测/真库集成测试钉死,风险可控。本次未引入 Critical/High 级问题,新增问题集中为 Low/Medium 风格与既有复杂度告警;但存在若干注释与实现不一致的遗留文档问题值得一并清理。
| 严重度/类型 | 位置(base) | 复核判定 |
|---|---|---|
| Medium/Dependency 高耦合 | lib/members-profile.ts:156(aggregateDomainTimeline,直接依赖 15 个函数) | ✅ 真实修复:改造后用数值 Date.UTC 游标替代 Date 对象 getUTCFullYear()/getUTCMonth() 链式调用,依赖降到阈值内,head 已不再告警 |
| Low/Naming 命名不规范 | lib/queries.ts:1431 | ⚠️ 行号漂移,非真实修复:实为 head lib/queries.ts:1459(MEMBER_SCOPE_FILTER),因头部新增注释块整体下移 28 行被误判为「已修复」 |
| Medium/Complexity 圈复杂度过高 | lib/queries.ts:1919 | ⚠️ 行号漂移,非真实修复:实为 head lib/queries.ts:1947(listCommits,复杂度 13),同一函数仅下移 |
| Medium/Complexity 圈复杂度过高 | lib/queries.ts:2549 | ⚠️ 行号漂移,非真实修复:实为 head lib/queries.ts:2578(getTaskDetail,复杂度 16),同一函数仅下移 |
即:真正被消除的只有 1 条(
members-profile高耦合);其余 3 条是行号偏移导致的「假修复」,对应问题在 head 以「新增」形式重新出现(见下节)。这类按行号匹配的告警在本次「大范围插行」的改动中会产生系统性噪声,解读时需注意。
| 严重度/类型 | 位置 | 说明 |
|---|---|---|
| Low/Maintainability 重复代码块 | lib/__tests__/beijing-day-key.test.ts:28 | 新增测试中两段结构相同的 assert.equal(beijingWeekStart(...).toISOString(), ...) 块,可抽公共断言助手 |
| Low/Maintainability 行过长 | lib/__tests__/beijing-week-month-window.test.ts:52 | 新增测试内 SQL 片段行 >120 字符 |
| Low/Maintainability 行过长 | lib/__tests__/weekly-quality.test.ts:22 | 本次改写的期望表达式字符串(date_trunc('week', now() AT TIME ZONE 'Asia/Shanghai')...)>120 字符 |
| Low/Naming 命名不规范 | lib/queries.ts:13(BJ_DAY) | 误报:BJ_DAY 是有意的模块级常量式箭头函数,规则按「非导出函数」判定要求小写驼峰,与常量命名约定冲突,建议忽略/加白名单 |
| Low/Naming 命名不规范 | lib/queries.ts:15(BJ_DAY_START) | 同上,误报 |
| Medium/Dependency 高耦合 | (,直接依赖 12 个函数) |
| 严重度/类型 | head 位置 | 对应 base |
|---|---|---|
| Low/Naming 命名不规范 | lib/queries.ts:1459(MEMBER_SCOPE_FILTER) | 同 base :1431 |
| Medium/Complexity 圈复杂度过高(13) | lib/queries.ts:1947 | 同 base :1919 |
| Medium/Complexity 圈复杂度过高(16) | lib/queries.ts:2578 | 同 base :2549 |
净评:本次真实新增 6 条(3 条测试风格 + 2 条命名误报 + 1 条耦合越线),其余 3 条为行号噪声,可与「修复」章节的 3 条假修复相互抵消。
以下为结合改动内容的复核发现,未被质检引擎收录,建议一并处理:
口径已统一为北京,但多处注释仍写「UTC」:
lib/scoring/trend.ts 文件头:时区约定(docs/06 §七):一律按 UTC 聚合 —— 与现在全线北京口径矛盾;lib/scoring/trend.ts:28 残留孤立注释 /** 本周一 00:00 UTC */(原 weekStart 已删除,注释未删);lib/queries.ts getCodeOutput 文档:窗口(UTC,与 getDashboardStats 同口径);lib/queries.ts LIST_MEMBER_RANKINGS_SQL 文档:窗口边界:date_trunc('week'/'month', now()) 自然窗口起点(SQL 已改北京);lib/members-profile.ts DomainTimelinePoint 类型注释:month 'YYYY-MM' UTC。建议:全局检索 UTC 注释,统一更新为「北京时间(Asia/Shanghai,无夏令时)」,避免与 docs 口径再次分叉。
lib/__tests__/daily-activity-date.test.ts 第二个用例注释宣称「与同一分桶表达式的 SQL 直算值一致」,但直算 SQL 用的是 c.authored_at::date(会话 UTC 日),而实现用的是 (c.authored_at AT TIME ZONE 'Asia/Shanghai')::date(北京日)。
(c.authored_at AT TIME ZONE 'Asia/Shanghai')::date = DATE '2026-10-08',与实现同源。lib/queries.ts 将 const BJ_DAY/BJ_DAY_START/BJ_OFFSET_MS/BJ_WEEK_START/BJ_MONTH_START/BJ_TODAY_START 声明置于 import 语句之前(第 13–27 行),import 在第 29 行起——ESM 下语义合法但不符合常规可读习惯,建议移到 import 之后;beijingTodayStr() 内联 8 * 3600 * 1000,未复用已定义的 BJ_OFFSET_MS,且 beijingTodayStr 之后存在多余空行。BJ_* 片段被 queries 与 app/team/page.tsx 内联 SQL 共用),并用 beijing-sql-fragments.test.ts 钉死「不得回退为 UTC 写法」;beijing-day-key.test.ts)+ 真库集成测试(beijing-day-bucketing/week-month-window/daily-activity-date)覆盖「北京 0–8 点串天/串周/串月」关键边界,且带非空覆盖断言,属高质量回归防护;rankingWindowStart 与 LIST_MEMBER_RANKINGS_SQL、weeklyQualityClause 的窗口口径已与测试同步,口径一致性风险被有效收敛。| 优先级 | 事项 | 建议 |
|---|---|---|
| P1 | R1 注释仍写 UTC | 随本次发布一并清理,避免下一轮再次口径分叉 |
| P2 | R2 测试 oracle 不同源 | 改为北京分桶直算,消除隐式数据依赖 |
| P2 | 3.1 中 getTeamDailyActivity 高耦合越线 | 可抽出「35 天窗口窗口推导」辅助函数(复用 beijingTodayStr/addDays)降低依赖 |
| P3 | 3.1 测试行过长 / 重复断言块 | 拆分长 SQL 字符串、抽公共断言助手 |
| P3 | 3.1 命名误报(BJ_DAY/BJ_DAY_START) | 视为常量命名,忽略或加入规则白名单 |
| — | 「修复/新增」中的行号漂移条目 | 评审时按函数名对齐,勿将「假修复」计入治理成效 |
本次改动为正确的时区口径统一(UTC → 北京),涉及查询层、评分层、页面层共 18 个文件,并配套补齐 5 个测试文件(含真库集成测试),核心表达式已被测试钉死,未引入 Critical/High 级缺陷。
质检增量结果中:
members-profile 高耦合)为真实修复,其余 3 条为行号漂移;主要遗留项为文档/注释与实现口径不一致(R1)与一处测试 oracle 不同源(R2),均属低风险、改动量小。建议在合并前顺手清理 R1/R2,即可获得一次干净的口径统一发布。
components/feature/CommitRow.tsxapp/members/[id]/commits/page.tsx| 新增测试 | lib/__tests__/beijing-day-bucketing.test.ts、beijing-day-key.test.ts、beijing-sql-fragments.test.ts、beijing-week-month-window.test.ts、daily-activity-date.test.ts |
| 同步测试 | lib/__tests__/weekly-quality.test.ts、lib/scoring/__tests__/ranking-window.test.ts |
lib/queries.ts:1733getTeamDailyActivity真实:本次该函数新增 addDays/beijingTodayStr 调用,依赖数越过 10 的阈值。函数职责本就偏重(团队 35 天聚合),属可容忍的既有耦合在改动后越线 |