1504164ae8
fix(achievement): distinct() 前必须 order_by() 清掉默认排序
...
Submission.Meta 有 ordering=("-create_time",),Django 会把排序字段
并入 DISTINCT,导致 _languages 每条提交各成一行——生产环境实测
某用户 659 条而不是 5 种语言。
recompute 侥幸正确只因 .count() 会清排序,两个实现同一个量却不一致。
三处 distinct() 全部显式加 order_by()。
由 check_achievement_deploy 的自检项发现。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 09:50:19 -06:00
8ada9f72ed
feat(achievement): 添加部署后自检命令
...
只读,覆盖那些错了也不报错的地方:极小值指标对零 AC 用户是否返回 None、
JSONB 阈值比较是否按整数、重算是否重建了增量辅助键、
unlock_count 是否与实际解锁人数一致、是否有疑似配错阈值的成就。
这套系统开发全程无数据库,后端逻辑只经过纸面审查,这些是静态审查抓不到的部分。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 07:27:29 -06:00
1ef681d5e9
fix(achievement): 重算时重建增量辅助键,避免指标回退
2026-08-04 01:39:29 -06:00
13e2f6df08
feat(achievement): 添加全量重算管理命令
...
新增 recompute_achievements 管理命令:全量重算所有指标并按补发语义
解锁成就,用于首次上线补发存量用户、指标口径变更后重算,以及增量
逻辑漂移时的安全网。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:33:20 -06:00
d14251b53d
fix(achievement): 补发标记 backfilled、放宽补发触发条件、校验稀有度
2026-08-04 01:28:31 -06:00
46e5d774f1
feat(achievement): 添加管理侧成就 API 与阈值补发
2026-08-04 01:20:58 -06:00
b9caf55c4c
fix(achievement): 隐藏成就的条件字段一并遮码
2026-08-04 01:14:52 -06:00
1d66e2be1f
feat(achievement): 添加用户侧成就 API
...
新增 achievements 列表、summary、pending 三个用户侧端点,隐藏未解锁成就
在序列化层打码(name/description/icon 替换为占位符,不下发 progress)。
2026-08-04 01:12:16 -06:00
8ce3660c87
fix(achievement): 元指标回写改为重新取锁重读,避免丢失更新
2026-08-04 01:08:06 -06:00
95bf02efbd
feat(achievement): 添加判定核心、通知模块并接入判题链路
2026-08-04 01:02:29 -06:00
c1081e6193
fix(achievement): 指标的 AC 口径改用 is_accepted,与全项目一致
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:56:32 -06:00
d9840910e6
feat(achievement): 添加指标注册表与 16 个内置指标
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:49:49 -06:00
456c435289
feat(achievement): 添加成就系统数据模型
2026-08-04 00:44:35 -06:00