Skip to content

fix: φ_grad 将未评分提交按 0 分计入,导致进步梯度方向反转 - #58

Merged
XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
linxi123-A:fix/maturity-phi-grad-unscored
Sep 19, 2026
Merged

XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
linxi123-A:fix/maturity-phi-grad-unscored

Conversation

@linxi123-A

@linxi123-A linxi123-A commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

问题

成熟度分量 φ_grad(进步梯度)把提交序列按时间切前后两半,比较两半平均分。Submission.score 统一为百分制 0–100 且可空(models.pyscore = db.Column(db.Integer),无 default),"已提交但尚未评分"的提交 score=None 是真实数据状态;成熟度历史公式按 0–5 制计算,公式内部用 normalize_mixed_score(score)/20 换算。

当前实现把 None 过滤出分子,却除以整半长度(分母),等价于把未评分提交当 0 分。两半缺失率不同时,梯度不仅数值错,连方向都会反。注:提交 3c58c32 已把过滤条件从 truthy 改为 is not None 并加了 /20 换算,但分母仍是整半长度,本缺陷依然存在。

复现输入

按时间升序的 4 条提交分数(None = 未评分,百分制;公式内 /20 换算为 0–5):

输入 真实语义 修复前 φ_grad 修复后
[40, 40, None, 43] 40 → 43,进步(0–5 制 +0.15) 40.75(后半 2.15/2=1.075,成长 −0.925,报成退步) 51.5
[None, 43, 40, 40] 43 → 40,小幅退步 59.25(前半 2.15/2=1.075,报成进步) 48.5
[None, None, 80, 80] 前半无已评分提交 90(前半被当 0,后半 4.0) 50

根因

分子与分母口径不一致:分子只累加已评分提交,分母用整半提交数。两半未评分率不同 → 均值稀释程度不同 → 成长斜率方向反转。

改动

  • utils/maturity_calculator.pycalculate_maturity_components 的 φ_grad 段——前后两半分别只收集 score is not None 的提交(保留 /20 的 0–5 换算),分子分母基于同一批已评分提交;任一半没有可评分提交时没有可比较均值,保持中性默认 50(同时消除空序列除零)。
  • tests/test_maturity_phi_grad.py:新增 8 个测试,轻量内存假对象,仅标准库+pytest,不 import Flask、不连数据库/Redis、不访问网络。

验证(实际结果)

基于最新 main(2f1c987):

  • RED(修复前,保留上游实现):pytest tests/test_maturity_phi_grad.py -q → 3 failed, 5 passed(实测 40.75 / 59.25 / 90.0)
  • GREEN(修复后):同命令 → 8 passed
  • 全量回归:pytest tests -q808 passed, 0 failed(14 分钟;退出码末尾有沙箱拦截 D 盘 pycache 写入的报错,pytest 摘要行为 808 passed)

边界覆盖:全部未评分、仅一半有评分、少于 4 条提交均保持中性 50;正常路径 [40,40,80,80] → 70;真实 0 分([0,80,80,80])按 0 参与计算 → 70,不会被当成缺失丢弃。

AI 辅助说明

AI 仅用于检索调用链与解释。采纳:"同一序列内过滤 + 计数"(分子分母同口径)与"空序列守卫";拒绝:"用 0 填充 None"(0 是真实分数值,填充会再次混淆两种语义)。

未验证范围

  • 仅纯函数级验证,未启动 Flask 做页面/路由集成验证。
  • 不涉及其他三个分量(φ_avg/φ_freq/φ_std)、数据库结构、权限与部署文件。

回退

单提交、改动集中在一个函数段,revert 该提交即可。

@XiaoCow666 XiaoCow666 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeSense 自动评审

φ_grad 现在仅以已评分提交计算两半均值,并在任一半无可评分数据时保持中性值,修复了 None 被等价按 0 分计入而可能反转梯度方向的问题。改动覆盖了真实 0 分、缺失评分和正常路径,未发现阻塞性问题。

已有验证信息

  • PR 描述提供的定向测试证据:pytest tests/test_maturity_phi_grad.py -q 在修复后为 8 passed。
  • PR 描述提供的全量测试证据:pytest tests -q 摘要为 777 passed、0 failed;描述同时说明命令末尾存在沙箱写入限制报错。

评审事件:online-review:#58:b557c0bacd0477eeb122f963fad9c3c8afb7f4bc:2982967

@linxi123-A
linxi123-A force-pushed the fix/maturity-phi-grad-unscored branch from b557c0b to 9cf5f7a Compare September 19, 2026 01:42

@XiaoCow666 XiaoCow666 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeSense 自动评审

修复将未评分提交从梯度均值的分子和分母中一致排除,并在任一半缺少已评分提交时保持中性值,符合 PR 的核心目标。0 分仍作为有效分数参与计算,新增测试覆盖了主要回归与边界场景。

已有验证信息

  • PR 描述报告:修复后执行 pytest tests/test_maturity_phi_grad.py -q 得到 8 passed。
  • PR 描述报告:执行 pytest tests -q 得到 777 passed、0 failed;其中提到退出末尾存在沙箱写入限制报错。
  • 新增测试覆盖:前后半段分别存在未评分提交、全部未评分、单侧无评分、少于 4 条提交及有效 0 分。

评审事件:61c7e7e0-b3cb-11f1-9630-d2dbe7284f92

@XiaoCow666
XiaoCow666 merged commit 4af13b1 into XiaoCow666:main Sep 19, 2026
1 check passed
XiaoCow666 pushed a commit that referenced this pull request Sep 22, 2026
* docs: add same-cohort aggregation check method from PR #58

* docs: force-add guide tracked like other docs/ subfolders
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants