核验智能体:任务 5 独立核验(不信任执行方报告,只读代码 + 独立编译)
日期:2026-10-23
依据:docs/superpowers/plans/2026-10-23-basic-membership-spec-revision.md需求口径表(#2/#5/#6/#9)与「任务 5」节
核验范围:BasicQuotaController.java、BasicQuotaScheduledTasks.java、AdminBasicQuotaController.java、BasicQuotaService.java(对照)、全目录 grep、独立mvn clean compile -q
只核验不修改:本会话未改动任何源码文件,仅新增本核验报告。
| # | 核验项 | 结论 | 证据(文件:行号) |
|---|---|---|---|
| 1 | BasicQuotaController 单查接口调 getQuotaStatus |
PASS | BasicQuotaController.java:22-32:@PostMapping("/status") 方法 getQuotaStatus,第 30 行调 basicQuotaService.getQuotaStatus(userId, quotaType) |
| 1b | status/all 返回 AI_CHAT/FOOD_RECOGNIZE/REPORT_READING 三项,且无 ASSESSMENT_QUOTA |
PASS | BasicQuotaController.java:42-44 仅 put AI_CHAT/FOOD_RECOGNIZE/REPORT_READING 三项;第 36 行注释明确「ASSESSMENT_QUOTA 已移除」。全文件无 ASSESSMENT_QUOTA(grep 确认) |
| 2 | refreshMonthlyQuota 已改名 refreshQuotas;cron 由 0 0 0 1 * ? 改为 0 0 0 * * ? |
PASS | BasicQuotaScheduledTasks.java:27 cron=0 0 0 * * ?(每日 00:00);第 28 行方法 refreshQuotas();第 31 行调 basicQuotaService.refreshQuotas();无旧名/旧 cron 残留 |
| 2b | 语义仅为兜底创建当前周期记录、绝不重置周期内已有用量 | PASS | BasicQuotaService.refreshQuotas() 实现:BasicQuotaService.java:233-237 按 (userId, quotaType, periodStart) 查当前周期记录;第 238 行 if (existing == null) 才进入新建分支;第 248 行 insert。已有记录不进入任何更新分支,全程无对 used 的 update → 回归验算成立:若 10:00 已用 2 次(used=2),00:00 任务执行后当天记录 used 仍为 2 |
| 3 | AdminBasicQuotaController 旧调用已改 refreshQuotas(),注释已修正,不再出现「重置所有用户当月配额」字样 |
PASS | AdminBasicQuotaController.java:25:basicQuotaService.refreshQuotas(); // 兜底创建当前周期配额记录,不重置用量;Javadoc 第 17-19 行「兜底创建当前周期配额记录,不重置用量。运营手动触发用于解决个别用户配额记录缺失问题(应急用)。」;全目录 grep「重置所有用户当月配额 |
| 4 | 全目录 grep 无对 getMonthlyQuota 的非兼容调用(已废弃委托可保留) |
PASS | grep getMonthlyQuota → 0 命中(旧方法名已彻底移除,由 getQuotaStatus 替代,BasicQuotaController.java:30、AdminBasicQuotaController.java:25 均为新方法);grep refreshMonthlyQuota → 仅 BasicQuotaService.java:267 一处 @Deprecated 委托(第 264 行 @deprecated 请改调 refreshQuotas(),第 267-269 行内部委托 refreshQuotas()),属计划允许保留的兼容委托;AdminBasicQuotaController 旧调用已消除 |
| 5 | Java 8 兼容;独立 mvn clean compile -q 退出码 0 |
PASS | 独立运行 Set-Location E:/cfc/cfc-backend; mvn clean compile -q → EXIT_CODE=0(无输出、零 error);代码为 Java 8 惯用写法(HashMap/HashSet/Map.Entry/Calendar,无 var/List.of/record) |
Set-Location E:/cfc/cfc-backend; mvn clean compile -q
退出码:0
| 执行方 claim | 独立核验结果 |
|---|---|
单查为 getQuotaStatus(22-32 行) |
一致,行号吻合 |
| status/all 三项无 ASSESSMENT_QUOTA(42-44 行) | 一致,行号吻合 |
| cron 与方法名已更新(27-28 行) | 一致 |
| refreshQuotas 只建不重置 | 一致——代码路径 existing == null 才 insert,已存在记录不动,回归场景(used=2 不被清零)成立 |
| AdminBasicQuotaController 缺陷(旧方法调用 + 错误注释)已修复 | 一致——第 25 行已改 refreshQuotas(),注释已改为「兜底创建…不重置用量」,旧「重置所有用户当月配额」字样全目录 0 命中 |
| 编译退出码 0 | 一致——核验智能体独立复跑亦为 0 |
BasicQuotaScheduledTasks.java:45-51 的 sendExpiryReminders() 依赖 membershipService.listActiveBasicMemberUserIds(),该接口仍返回空列表(到期提醒空转)——计划文档已声明不在本次范围,不因任务 5 放行而改变。BasicQuotaService.refreshMonthlyQuota()(第 266-269 行)以 @Deprecated 形式保留并委托新方法。按计划「已废弃委托可保留」,当前无调用方(grep 仅剩定义本身),最终清理需另行确认后删除。AdminBasicQuotaController.resetQuota 对 body.get("userId") 为空的入参校验宽松(历史既有代码),非本任务改动点。可以放行。 任务 5 的 5 项核验全部 PASS:
getQuotaStatus;status/all 恰返回 AI_CHAT/FOOD_RECOGNIZE/REPORT_READING 三项,无 ASSESSMENT_QUOTA(BasicQuotaController.java:22-32, 42-44)。refreshMonthlyQuota→refreshQuotas,cron 改每日 0 0 0 * * ?;refreshQuotas 实现只建不重置,日配额跨天回归用例成立(BasicQuotaScheduledTasks.java:27-28 + BasicQuotaService.java:215-257)。AdminBasicQuotaController.java:25 已改调 refreshQuotas() 且注释修正,「重置所有用户当月配额」字样全目录 0 命中。getMonthlyQuota 非兼容调用(0 命中),refreshMonthlyQuota 仅剩允许保留的 @Deprecated 委托。mvn clean compile -q 退出码 0,Java 8 兼容。无阻断性缺陷,可进入后续任务。