tasks_backlog.json 104 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. [
  2. {
  3. "id": "T15",
  4. "title": "规划师培训认证前端:认证中心/课程/题库管理端 + 小程序培训中心页",
  5. "priority": "P0",
  6. "module": "fullstack",
  7. "instance": "",
  8. "status": "done",
  9. "spec": "docs/superpowers/specs/2026-10-22-planner-learning-assessment-gate-design.md",
  10. "prompt": "规格文档 2026-10-22-planner-learning-assessment-gate-design.md 后端已全量落地(迁移394-401 九表 + PlannerCertificationService 认证状态机 + PlannerCertificationGuard 中央闸门 + 规划师端7接口 + 管理端26接口),但前端缺失,本任务补齐:①小程序规划师端「培训认证」中心页:展示类别(planner/nutritionist/assessor)认证状态、课程列表与学习进度(planner_courses/planner_course_progress)、考试入口(planner_exam_attempts)、线下课打卡(activity_checkins);②cfc-web 管理端三页:认证看板(审批/状态流转,对接管理端26接口)、课程管理(CRUD + 关联类别)、题库管理(题目/试卷维护);③引导计划:认证通过后 Guide.status=active 的联动说明与失败态提示。落点:cfc-frontend/pages/guide/ 新增 training 相关页面并注册 pages.json;cfc-web/src/views/ 新增 admin 认证管理页 + 路由 + perm 配置;utils/api.js 与 cfc-web/src/api/ 增加对应封装。验收要点:后端已存在的 7+26 接口全部被前端调用;认证状态机 init/learning→exam_passed→certified 在小程序可视可操作;管理端可完成课程/题库维护与认证审批;mvn clean compile 与两前端 node --check/build 通过;不触碰后端 Java 代码(除非发现接口缺口,需先回来汇报)。",
  11. "session_id": "ses_e9183f23cffe6q3vnmLOWy9lyq",
  12. "dispatched_at": "2026-10-24 23:16:26",
  13. "dispatched_to": "lan-248",
  14. "model": "axonhub/deepseek",
  15. "done_at": "2026-10-25 00:51:52"
  16. },
  17. {
  18. "id": "T16",
  19. "title": "后台多渠道发货对话框:按 deliveryType 切换快递/同城/自提/虚拟商品",
  20. "priority": "P1",
  21. "module": "fullstack",
  22. "instance": "",
  23. "status": "done",
  24. "spec": "docs/superpowers/specs/2026-10-22-fulfillment-multi-mode-design.md",
  25. "prompt": "规格 2026-10-22-fulfillment-multi-mode-design.md:管理端发货要对齐微信小程序后台四种方式——快递 logistics_type=1 / 同城配送 2(ProductOrder.deliveryMethod 的注释已含 6=同城配送)/ 用户自提 4(不再跳过微信同步)/ 虚拟商品 3(支付成功自动发货 autoShipVirtualOrder 幂等 fail-open)。现后端已具备 ship(orderNo, shipType, ...) 与 WechatService.uploadShippingInfo 按 logisticsType 1/2/3/4 分流;缺口在 cfc-web 发货对话框仍是旧的仅快递/自提二态(OrderManage.vue / OrderDetail.vue 中 deliveryMethod==2 才显示自提)。本任务:①OrderManage.vue 发货对话框按订单 deliveryMethod 切换表单字段(快递=物流公司+单号;同城配送=配送公司+运单;自提=仅确认提示,仍同步微信 logisticsType=4;虚拟商品=展示自动发货状态,按钮置灰并说明);②OrderDetail.vue 配送方式展示扩展为 1/2/3/4/5/6 全编码可读文案与图标;③确认发货后子订单明细同样是微信对照 logisticsType 传参。落点:cfc-web/src/views/admin/OrderManage.vue、OrderDetail.vue,必要时改 src/api/。验收要点:四类订单发货表单正确切换且微信同步参数类型正确(同城走 logistics_type=2 需单号公司、自提=4 无单号、虚拟=3 自动发货不弹表单);deliveryMethod=6 的订单显示「同城配送」而非「快递」;vue-cli-service build SUCCESS;微信 upload_shipping_info URL 带 /wxa 前缀;不改后端接口签名。",
  26. "session_id": "ses_e9183e8f9ffeXVXv6Wiv5TFKhk",
  27. "dispatched_at": "2026-10-24 23:16:28",
  28. "dispatched_to": "lan-248",
  29. "model": "axonhub/deepseek",
  30. "done_at": "2026-10-24 23:58:46"
  31. },
  32. {
  33. "id": "T17",
  34. "title": "报告快速分析:Redis 每日频控(免费1次/日)+ 付费多轮 + 配额联动",
  35. "priority": "P1",
  36. "module": "backend",
  37. "instance": "",
  38. "status": "done",
  39. "spec": "docs/superpowers/specs/2026-09-10-report-quick-analyze-design.md",
  40. "prompt": "规格 2026-09-10-report-quick-analyze-design.md 与扩展版 2026-09-13-report-quick-analyze-extend-design.md:报告详情页快速分析需免费版每日 1 次 Redis 计数、付费版多轮,复用 chat_graph + AiGateway/langgraph,LangGraph 零改动。现状:后端已有 POST /api/chat/report/analyze(AIChatController#report/analyze,与 /chat/send 共用 buildChatInputs),前端 report-detail.vue 已接入报告反馈入口,但「每日限次」与「付费多轮」尚未落地(代码检索未发现 reportAnalyzeLimit/多轮配额逻辑)。本任务:①引入 Redis 依赖与配置(application.yml 已有 redis 配置则复用),新增 ReportAnalyzeQuotaService:免费用户每日 1 次(key=report:analyze:{userId}:{yyyyMMdd},INCR+EXPIRE),会员按 membership levels features/maxDailyAnalyze 配置次数;②超限返回 Result 明确 message(区分「今日已用完/请升级会员」);③前端 report-detail.vue 消费限次结果:展示剩余次数、超限弹窗带升级入口(跳 membership 页);④付费多轮在同一订单/会话内计数,不可重复刷。落点:cfc-backend/src/main/java/com/etotem/cfc/service/ 新增 QuotaService + AIChatController 限流接线;cfc-frontend/pages/health/report-detail.vue 适配。验收要点:免费用户第 2 次调用被拒且 Redis key 到期后恢复;会员次数准确;mvn clean compile 通过;新增 2-3 个纯 Mockito 单测(不依赖真实 Redis,可用模拟);API_REFERENCE 4.x 同步限次语义。",
  41. "session_id": "ses_e9183dc8fffecmHzAeN1UWqMuu",
  42. "dispatched_at": "2026-10-24 23:16:32",
  43. "dispatched_to": "pub-iwintrue",
  44. "model": "etotem/deepseek",
  45. "done_at": "2026-10-25 00:21:24"
  46. },
  47. {
  48. "id": "T18",
  49. "title": "五维自检深度 AI 集成(P1-1 历史趋势解读 + P1-2 Chat 上下文注入)",
  50. "priority": "P1",
  51. "module": "fullstack",
  52. "instance": "",
  53. "status": "done",
  54. "spec": "docs/superpowers/specs/2026-08-31-self-check-ai-integration-design.md",
  55. "prompt": "规格 2026-08-31-self-check-ai-integration-design.md:P0-1 纯AI替换静态建议与 P0-2 用户点击生成健康计划已在 self-check-result.vue 落地(有 AI 解读区块、生成健康计划按钮、self-check-ai.vue AI出题页),P1-1 历史趋势AI解读与 P1-2 Chat 上下文注入未实现。本任务:①P1-1:自检结果页新增「历史趋势」区块,调后端聚合该成员历次自检得分(FiveDimensionSelfCheck 表按维度)→ 组装上下文 → 走 AiGateway/langgraph chat_graph 生成趋势解读(上升/下降/波动 + 建议),展示折线趋势与 AI 解读文字;②P1-2:AIChatController 或统一上下文中注入最近一次自检摘要(维度分 + 低分项),使 /chat/send 能针对自检结果连续对话;③后端零 LangGraph 改动,仅 Java 侧组装 prompt 上下文(遵循 AiGateway 熔断/超时/Fallback 规范)。落点:cfc-backend/src/main/java/com/etotem/cfc/service/ 新增 SelfCheckTrendService(或扩展 FiveDimensionSelfCheckService)+ AIChatController 上下文注入;cfc-frontend/pages/family/self-check-result.vue 新增趋势区块。验收要点:3 次以上自检记录可出趋势解读;无记录时优雅降级(隐藏区块或引导);Chat 提问「我上次自检哪项最低」能答对;mvn clean compile + node --check 通过;新增单测覆盖上下文拼装与历史聚合。",
  56. "session_id": "ses_e9183d076ffegxj0N2urb9YYoQ",
  57. "dispatched_at": "2026-10-24 23:16:34",
  58. "dispatched_to": "pub-iwintrue",
  59. "model": "etotem/deepseek",
  60. "done_at": "2026-10-25 04:29:24"
  61. },
  62. {
  63. "id": "T19-A",
  64. "title": "营养商品标注·A线:Product 营养成分(热量/蛋白质/脂肪/碳水/膳食纤维)+ 管理端录入 + 小程序展示",
  65. "priority": "P2",
  66. "module": "fullstack",
  67. "instance": "pub-iwintrue",
  68. "status": "done",
  69. "spec": "docs/superpowers/specs/2026-10-27-nutrition-product-tagging-prd.md",
  70. "prompt": "A 线(营养成分)。已派发。两条硬约束已写进指令:① 迁移必须写进 DatabaseInitializer.runMigrations()(application.yml 无 schema 自动初始化,只改 schema.sql 线上不建列);② 必须扩展 ProductService.syncFromProduct()(调用点 316/355/592),否则营养侧永远拿不到数据。营养基准加 nutrition_basis 列(默认 per_100g,预留每份)。留空存 NULL 不是 0。无数据整块隐藏。禁止治疗/保健功能宣称。 | 原判定=从未开工,2026-10-27 派发。",
  71. "session_id": "ses_e91745133ffebXvnPFXhnF7SBM",
  72. "dispatched_at": "2026-10-24 23:33:31",
  73. "dispatched_to": "pub-iwintrue",
  74. "model": "axonhub/deepseek",
  75. "done_at": "2026-10-26 12:45",
  76. "note": "已 push origin/feature/nutrition-product-tagging = 328443d43(feat(shop) 迁移417+后台录入+小程序展示)。2026-10-27 复核分支存在,标记 done。原 instance 字段混写会话ID,已拆分。"
  77. },
  78. {
  79. "id": "T20",
  80. "title": "食材营养均衡分析链路落地(diet-ingredient-balance)",
  81. "priority": "P2",
  82. "module": "fullstack",
  83. "instance": "",
  84. "status": "done",
  85. "spec": "docs/superpowers/specs/2026-09-13-diet-ingredient-balance-design.md",
  86. "prompt": "规格 2026-09-13-diet-ingredient-balance-design.md 设计的是饮食均衡分析(按食材类别/营养素覆盖评估家庭成员食谱缺口),目前代码检索未发现对应实现(无 ingredientBalance 相关后端类与前端页面)。本任务按规格落地最小可用的 P0 范围:①后端新增 DietBalanceService:入参家庭成员的饮食偏好/忌口/近期打卡(diet_checkin / diet_preferences),输出五类食材(谷薯/蔬果/肉蛋奶/豆坚果/油盐)覆盖度与缺口建议(缺口建议可调用 AiGateway/langgraph 生成自然语言,失败降级为模板文案);暴露 POST /api/diet/balance 接口(Result 包装 + JWT 鉴权);②小程序新增或复用 diet 页展示均衡结果(雷达/环形 canvas 或纯文本卡片均可),入口放在 dial 打卡页或 diet-index;③涉及新表则优先 DB 迁移幂等,尽量复用现有表。落点:cfc-backend/src/main/java/com/etotem/cfc/service/DietBalanceService.java + controller/diet/DietBalanceController.java + 迁移(如需要);cfc-frontend/pages/diet/ 新增 balance 区块。验收要点:mvn clean compile 通过;接口可按成员返回均衡评分与缺口清单;无打卡数据时给出可用默认分析或友好空态;新增 2 个纯 Mockito 单测;API_REFERENCE 同步新增接口(4.x 递增)。",
  87. "session_id": "ses_e91742972ffeTwqN5eAge61gQp",
  88. "dispatched_at": "2026-10-24 23:33:40",
  89. "dispatched_to": "lan-204",
  90. "model": "axonhub/deepseek",
  91. "done_at": "2026-10-25 00:21:24"
  92. },
  93. {
  94. "id": "T21",
  95. "title": "团队层级树形可视化完善 + 富页面推荐码清理",
  96. "priority": "P2",
  97. "module": "frontend",
  98. "instance": "",
  99. "status": "done",
  100. "spec": "docs/superpowers/specs/2026-09-09-team-hierarchy-design.md",
  101. "prompt": "规格 2026-09-09-team-hierarchy-design.md:团队层级树从下往上生长 + 团队消费额分级统计 + 直推成员消费/CF明细 + 我的推荐人展示 + 去掉富页面推荐码。现状:promotion/team.vue 已有团队统计卡(团队规模/返佣比例/档位)、L1/L2 Tab、成员列表、成长曲线与消费曲线(canvas),后端 CommissionController 已提供 team/team/list/team/consumption/my-referrer/team/tree/team/growth-curve/team/all-members-consumption-curve 等接口;「我的推荐人展示」与「树形生长图」「富页面推荐码移除」未确认落地。本任务:①team.vue 增加「我的推荐人」区块(调 /my-referrer,无推荐人时展示邀请入口);②在现有列表/曲线基础上叠加层级树形视图(用后端 /team/tree 扁平数据递归渲染成员树,方向自下而上为符合规格,如 canvas 成本高可先以嵌套列表+缩进呈现,注明偏离);③检索并移除富(profile)页面的推荐码展示(规格明确要求去掉),并核对 promotion 页不受影响;④消费分级统计(按档位聚合)若接口已存在则前端展示。落点:cfc-frontend/pages/promotion/team.vue、profile 相关页面;必要时补 utils/api.js 封装(后端接口已存在则零后端改动)。验收要点:node --check 通过;我的推荐人/无推荐人引导正确;树形视图数据与 /team/tree 响应一致;富页面不再出现推荐码;不影响现有 L1/L2 列表与曲线。",
  102. "session_id": "ses_e9163b087ffefjmH21pIB4bieD",
  103. "dispatched_at": "2026-10-24 23:51:40",
  104. "dispatched_to": "local-45278",
  105. "model": "axonhub/deepseek",
  106. "done_at": "2026-10-25 10:02:27"
  107. },
  108. {
  109. "id": "T22",
  110. "title": "方案→任务全链路回流传真(plan_json.sections[].tasks 驱动任务中心,含删除/降级兜底验收)",
  111. "priority": "P2",
  112. "module": "fullstack",
  113. "instance": "",
  114. "status": "done",
  115. "spec": "docs/superpowers/plans/2026-09-04-plan-to-task-unification.md",
  116. "prompt": "实现计划 2026-09-04-plan-to-task-unification.md 与本仓库 AGENTS.md 所述:plan_json.sections[].tasks 是唯一事实源,配套 plan-standard-content(2026-08-28)已有 LangGraph 输出 tasks + 正则兜底 + 存量懒加载回填 + 规划师端结构化编辑 UI。任务要求对「方案→任务」全链路做一次端到端确认与收尾:①确认 approveAndPublish 后 HealthPlan 的 plan_json.sections[].tasks 是否正确生成 tasks 实例(source_type=plan,关联 taskId),缺失时是否有懒加载回填兜底;②确认方案删除(2026-10-17 已实施)与每日实例二次删除对 plan 任务同样生效;③确认小程序任务中心 tasks.vue 对 plan 来源任务的展示(来源标签/跳转方案页/完成回写);④管理端/schema:确认无孤儿任务(方案删任务留)与重复生成(重复发布同方案不应重复插任务,应幂等);⑤如发现缺口,修复修复,不做范围外重构。落点:cfc-backend TaskPlanService/GrowthTaskService/HealthPlanService 相关链路 + cfc-frontend/pages/tasks/tasks.vue。验收要点:发布含 tasks 的方案后任务中心可见 plan 任务且不重复;删除方案后其 tasks 级联删除(含每日实例);对存量无 plan_json.tasks 的方案懒加载回填生效;mvn clean compile 通过;补 2-3 个单测覆盖幂等与级联。",
  117. "session_id": "ses_e9163add7ffe5EmrvRRcAB3Adv",
  118. "dispatched_at": "2026-10-24 23:51:41",
  119. "dispatched_to": "local-45278",
  120. "model": "axonhub/deepseek",
  121. "done_at": "2026-10-25 02:23:36"
  122. },
  123. {
  124. "id": "F-8",
  125. "title": "F-8 清理",
  126. "priority": "P2",
  127. "module": "backend",
  128. "instance": "",
  129. "status": "done",
  130. "spec": "docs/superpowers/plans/2026-10-24-cf-value-unification-plan.md",
  131. "prompt": "实现「F-8 清理」。完整规格见仓库内设计文档 docs/superpowers/plans/2026-10-24-cf-value-unification-plan.md(请先读取该文档,定位到「F-8 清理」对应的批次/章节,按其口径实现)。\n\n纪律:\n- git fetch origin cfclub → 基于 origin/cfclub 新建 feature/<slug> 分支(不要合并主干);\n- 只 git add 自己新增/修改的文件;\n- 先 mvn -pl cfc-backend -am compile 通过,再 cfc-web npm run build/lint 通过;\n- 不新增 DB 迁移,除非文档明确要求;\n- 完成后 git push -u origin feature/<slug>,回报 commit 哈希、改动文件清单、编译/构建结果;\n- 不要自行合并 cfclub;\n- 若指定规格文档在 checkout 中不存在,请停止并在回复中说明,不要凭空实现。",
  132. "generated_from": "sync_design_tasks",
  133. "generated_at": "2026-10-25 13:17:06",
  134. "session_id": "ses_e8e7c1499ffe868UgJouwwo1jj",
  135. "dispatched_at": "2026-10-25 13:23:53",
  136. "dispatched_to": "local-45278",
  137. "model": "axonhub/deepseek",
  138. "done_at": "2026-10-25 15:59:37"
  139. },
  140. {
  141. "id": "AL-1",
  142. "title": "后台素材库(asset-library) 恢复续做(上一会话卡死已中断重派)",
  143. "priority": "P1",
  144. "module": "fullstack",
  145. "instance": "",
  146. "status": "done",
  147. "spec": "docs/superpowers/plans/2026-10-26-asset-library-design.md",
  148. "prompt": "规格见 docs/superpowers/plans/2026-10-26-asset-library-design.md;派发指令为 self-contained 内联版(已含 data-layer/后端接口/前端改造/纪律)。上一会话 ses_e8e8cdf6cffeeGoW3oCpGCaTg6 于 lan-248 卡死(24h+无活动、cost=0、未 push)已中断,本会话接手同 worktree /sc-data/cfc/.worktrees/asset-library 续做并 commit+push feature/asset-library。",
  149. "generated_from": "manual-recovery",
  150. "recovered_from": "ses_e8e8cdf6cffeeGoW3oCpGCaTg6",
  151. "session_id": "ses_e8e680a53ffejn9lEv1p5BvFbp",
  152. "dispatched_at": "2026-10-25 13:46:24",
  153. "dispatched_to": "lan-248",
  154. "model": "axonhub/deepseek",
  155. "done_at": "2026-10-25 14:47:13"
  156. },
  157. {
  158. "id": "T23",
  159. "title": "后台报告处理链路追踪 / 归因功能(report-trace)",
  160. "priority": "P1",
  161. "module": "fullstack",
  162. "instance": "会话已结束未回填,但分支有实质产出",
  163. "status": "done",
  164. "spec": "docs/superpowers/plans/2026-10-26-report-trace-design.md",
  165. "prompt": "实现后台「报告处理链路追踪 / 归因」功能。完整规格见仓库内设计文档 docs/superpowers/plans/2026-10-26-report-trace-design.md(请先读取该文档,按其 §四~§五 口径实现)。\n\n背景与根因(已源码确认):用户上传报告后小程序查不到、也无法对应到成员。根因有二——①链路 A(POST /api/report-parser/upload)建 HealthReportDraft 时 familyId=null、memberId=null,导致 ReportCollectService.insertReport 中 matchFamilyMemberByName(name, familyId) 因 familyId=null 恒返 null,健康报告落入 health_reports 时 family_id=null 且 subject_id=null,成为家庭成员维度不可见的孤儿报告;②现有后台 ReportParseAdminController 只查 health_report_drafts,看不到 DAN 上传(dan_report_uploads/dan_assessment_results)与未知上传(report_unknown_upload)的处理状态。\n\n范围(严格按文档):①后端新增 ReportTraceService + ReportTraceAdminController(/api/admin/report-trace 下 list/detail/retry/bind-member/unknown-list/stats 六接口),四表(health_report_drafts / health_reports / dan_report_uploads(+dan_assessment_results) / report_unknown_upload(+report_unknown_cluster))联查归一化为 TraceNode,展示解析服务(parseMethod/langgraph/opencode/dan_java/unknown_llm)、解析状态、是否已归因+原因、落地报告ID、解析数据摘要(指标数/菌群数/疾病风险数/综合分/items数);②健康报告孤儿(subject_id=null 或 family_id=null)可在后台手动归因:bind-member 调 HealthReportService.bindReportToMember + 回填 familyId + 刷新五维/食材推荐(复用 reassignReport 逻辑);③DAN/未知 重试路由:DAN→DanReportUploadService.reparseUpload,未知→重识别后入链;④前端 cfc-web/src/views/admin/ReportTrace.vue(筛选+表格+详情抽屉+重试/归因按钮),新增独立菜单项「报告链路追踪」,不动既有 report-parse 页。\n\n纪律:\n- git fetch origin cfclub → 基于 origin/cfclub 新建 feature/report-trace 分支(不要合并主干);\n- 只 git add 自己新增/修改的文件;不改动 ReportCollectService / DanReportUploadService / ReportParseAdminController 的公开行为(仅调用);\n- 先 mvn -pl cfc-backend -am compile 通过,再 cfc-web npm run build/lint 通过;\n- 不新增 DB 迁移(仅读现有表);\n- 完成后 git push -u origin feature/report-trace,回报 commit 哈希、改动文件清单、编译/构建结果;\n- 不要自行合并 cfclub;\n- 若指定规格文档在 checkout 中不存在,请停止并在回复中说明,不要凭空实现。\n- 关键源码落点(已核对):ReportCollectService.java:668-737(insertReport/matchFamilyMemberByName 调用)、HealthReportDraftService.java、HealthReportService.java:686(matchFamilyMemberByName)/1282(bindReportToMember)/1304(reassignReport)、DanReportUploadService.java:85(uploadAndParse)/296(reparseUpload)/184(confirmUpload)、ReportParseAdminController.java:43(list)、entity HealthReportDraft/HealthReport/DanReportUpload/ReportUnknownUpload/ReportUnknownCluster/ReportTypeRegistry。 | 判定=实质完成:分支 feature/report-trace @ eeea6c5d3,7 文件 +2412 行:ReportTraceService 1386 行 + ReportTraceAdminController 149 + cfc-web ReportTrace.vue 801(统计卡/7天趋势/筛选/表格/详情抽屉/归因弹窗/未知聚类)+ 路由 + API_REFERENCE 登记 6 个新接口。含重试路由(健康草稿异步重跑/DAN reparseUpload/未知指纹重识别重新入链)。未经独立核验。 | 独立核验已完成(2026-10-27): OK 6接口权限校验完备; OK 主链路不变(只读辅助层); OK 无N+1(批量查询); OK API文档一致; WARN 中风险: retryBySource 同步调用LLM无防重入/限流, 管理员频繁点击重试会并发触发, 可能打爆 LangGraph(9000), 合入主线前需加限流(synchronized 或令牌桶); WARN 前端构建/lint 未验证. 核验方违规在 feature/report-trace 多推了1个空commit 5bf862664(--allow-empty), 已核实未混入他人文件.",
  166. "generated_from": "manual",
  167. "generated_at": "2026-10-26",
  168. "session_id": "ses_e8e651be9ffe1nrAL6aVGk07bi",
  169. "dispatched_at": "2026-10-25 13:48:59",
  170. "dispatched_to": "local-45278",
  171. "model": "axonhub/deepseek"
  172. },
  173. {
  174. "id": "T24",
  175. "title": "生产 bug:睡眠打卡 /complete 返回 500 + 双身份任务列表不同",
  176. "priority": "P0",
  177. "module": "fullstack",
  178. "instance": "",
  179. "status": "done",
  180. "spec": "docs/superpowers/plans/2026-10-25-task-complete-500-bug.md",
  181. "prompt": "修复生产环境(cfc.etotem.com.cn)两个关联 bug。完整诊断与证据链见 docs/superpowers/plans/2026-10-25-task-complete-500-bug.md,请先读取。根因一句话:睡眠打卡是每日进度型任务,POST /api/health/sleep/create 落库后由 HealthSleepController.create:76-86 以任务归属为准修正成员并调 TaskService.updateCheckinTaskProgress 自动置 completed(awardTaskCompletionRewards:918-921 真落库),但前端 cfc-frontend/pages/growth/sleep-checkin.vue:448-452 又冗余调 POST /api/tasks/{id}/complete(传 self.memberId);叠加双身份(family_members 同 user_id 存在多条「家长本人」重复记录,见 EnergyService:121/263;JwtInterceptor:177-182 用 LIMIT 1 非确定性解析),导致 /complete 命中 TaskService.completeTask:587(task.familyMemberId≠memberId)或 :591(已 completed)返回 null → TaskController:139 吐 500。\n\n分三块(按风险排序,逐一验收):\nA【后端热修·低危·必做】TaskService.completeTask(585-593) 对「本人已完成任务」幂等返回成功(复用既有 result 结构 pointsEarned=0/newBalance=当前积分/needReview=false/alreadyCompleted=true),不再返回 null→500;覆盖 587 与 591 两种触发。\nB【前端正本清源·低危·必做】删除 sleep-checkin.vue:448-452 冗余 /complete 调用(create 已自动完成);并全量排查 daily-checkin/diet-checkin/exercise-checkin/wealth-sub/checkin/emotion-checkin/body-detail/checkin 等打卡页是否存在「create 自动完成 + 再调 /complete」的同类冗余,一律移除或改为幂等。\nC【数据根治·双身份·中高危·需授权】先在备份/从库只读跑诊断 SQL(文档 §三 给出)确认受影响 (user_id, family_id) 重复行范围;再制定合并迁移方案(保留一条主成员、外键 tasks/task_executions/health_*/points_log 迁到保留行、删重复行、加 UNIQUE(user_id, family_id) 允许 user_id IS NULL 的 local 成员);JwtInterceptor:177-182 的 LIMIT 1 改为确定性取值(优先 status=active 且 userId 匹配的『主成员』);成员切换器(FamilyMemberVO.isSelf)对本人去重。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/task-complete-500 分支(不要合并主干);只 git add 自己新增/修改的文件;先 mvn -pl cfc-backend -am compile 通过,再 cfc-web 与 cfc-frontend 各自 npm run build/lint 通过;A 不新增 DB 迁移,C 的迁移须在文档明确且经授权;任务完成后 git push -u origin feature/task-complete-500,回报 commit 哈希、改动文件清单、编译/构建结果;不要自行合并 cfclub;prod 部署(prod-etotem)属 manual_only,未经主理人显式授权不得 push 到 prod 分支或触发生产发布——本任务只完成代码与(若授权)迁移,生产发布单独拍板。",
  182. "generated_from": "manual",
  183. "generated_at": "2026-10-25",
  184. "session_id": "ses_e8e2fac76ffeHxTIZMUs8B1SN7",
  185. "dispatched_at": "2026-10-25 14:47:21",
  186. "dispatched_to": "lan-248",
  187. "model": "axonhub/deepseek",
  188. "done_at": "2026-10-25 17:01:01"
  189. },
  190. {
  191. "id": "T25",
  192. "title": "统一成员选择器组件(去重双身份,覆盖所有成员选择页)",
  193. "priority": "P1",
  194. "module": "frontend",
  195. "instance": "",
  196. "status": "done",
  197. "spec": "docs/superpowers/plans/2026-10-25-unified-member-selector.md",
  198. "prompt": "实现「统一成员选择器」组件,消除所有页面把同一用户显示成「本人 + 本人所对应的成员」两项的问题。完整设计见 docs/superpowers/plans/2026-10-25-unified-member-selector.md,先读。\n\n核心约束(务必先读 §一.3):纯前端去重会丢数据——两条重复 family_members 行各自挂着不同任务外键,隐藏一行会导致该行业务数据不可达。因此本任务必须与 T24-C 数据合并(合并重复行 + 外键迁移 + UNIQUE(user_id,family_id))配套;在本任务中组件层只做防御性去重,真正消除重复靠数据层。\n\n范围(严格按文档):\n①新增 cfc-frontend/utils/memberNormalize.js:入参(原始成员数组, viewer)→ 折叠同 user_id 多行为一条,canonical memberId 取 isSelf→active→外键最多→id 最小;保证每用户至多一条且 isSelf 唯一;统一身份键为 familyMemberId(id),userId 仅作折叠依据。\n②新增 cfc-frontend/components/MemberSelector.vue,variant 支持 strip(替代 FamilyMemberStrip)/tabs(替代 DimensionMemberTabs)/minimal(替代 food-query 等内联 member-bar,含家庭总览/个人/各成员);内部先 memberNormalize 再渲染;emit select 带 canonical memberId。\n③P1(用户可见 bug 页,必做):food-query.vue 迁 userId→memberId 主键并改用 MemberSelector;tasks.vue 改用 MemberSelector;用 MemberSelector 替代 FamilyMemberStrip(parent-index/child-index/member-home-detail/action-detail) 与 DimensionMemberTabs(body-detail/wisdom-detail/wealth/index/mind-detail),完整保留 FamilyMemberStrip 长按操作菜单(移除/切换/编辑)逻辑。\n④P2(其余内联选择器,文档 §四清单)逐页替换为 MemberSelector,消除 userId 作主键写法。\n⑤后端配合:/api/food/recommendation/members 等返回 familyMemberId 字段;若未合并数据,列表接口应先按 user_id 折叠下发(同 user 多行→一行 canonical id),避免重复。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/unified-member-selector 分支(不合并主干);只 git add 自己新增/修改文件;先 mvn -pl cfc-backend -am compile 通过,再 cfc-frontend node --check / npm run build 通过;不新增 DB 迁移(数据合并在 T24-C);完成后 git push -u origin feature/unified-member-selector,回报 commit 哈希、改动文件清单、编译/构建结果;不要自行合并 cfclub。prod 发布属 manual_only,未经授权不得 push prod 分支。",
  199. "generated_from": "manual",
  200. "generated_at": "2026-10-25",
  201. "session_id": "ses_e8e14dfa7ffeXQdvfhbTOXHCOb",
  202. "dispatched_at": "2026-10-25 15:16:36",
  203. "dispatched_to": "lan-248",
  204. "model": "axonhub/deepseek",
  205. "done_at": "2026-10-25 20:16:33"
  206. },
  207. {
  208. "id": "A1",
  209. "title": "活动时间选择器:选择时即只显示 5 分钟粒度,删除「以 5 分钟为一个单元」提示文案",
  210. "priority": "P1",
  211. "module": "frontend",
  212. "instance": "",
  213. "status": "done",
  214. "spec": "docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md",
  215. "prompt": "改造小程序「创建活动」页的时间选择器,让 5 分钟粒度在【选择过程中】生效,而不是选中后才被改写。完整设计与代码证据见 docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md 的 §一 与 §零 0.1,请先读。\n\n背景(一句话):现在 3 处时间字段都用微信原生 <picker mode=\"time\">,原生时间选择器不支持步长,只能按 60 分钟逐项滚动,选中后再由 onStartTimeChange/onEndTimeChange/onRegTimeChange 调 normalizeTimeTo5Min 把分钟向下取整到 5 的倍数(14:07→14:05);为此页面上还重复写了 3 句提示「以 5 分钟为一个单元(如 14:00、14:05)」(create.vue:27/39/51,另有 CSS 注释 create.vue:677)。用户明确不想要这句话,也不想要「选了 07 分却变 05 分」。\n\n范围(唯一文件 cfc-frontend/pages/activity/create.vue,只做这一件事):\n①把 3 处 <picker mode=\"time\">(行 24/36/48)改为原生 <picker mode=\"multiSelector\" :range=\"[hourOptions, minuteOptions]\" :value=\"[hourIdx, minuteIdx]\">,时列 ['00'..'23'] 共 24 项,分列严格只有 ['00','05','10','15','20','25','30','35','40','45','50','55'] 共 12 项,让用户在选择过程中就无法选中非 5 倍数分钟。\n②data 新增 hourOptions/minuteOptions 与 3 组时间各自的时/分索引(hourIdx/minuteIdx、endHourIdx/endMinuteIdx、regHourIdx/regMinuteIdx);新增 onStartTimeColChange/onEndTimeColChange/onRegTimeColChange(e) 取 e.detail.value(列索引数组)拼成 HH:MM 写入 timePart/endTimePart/regTimePart,再调用既有 syncStartTime/syncEndTime/syncRegDeadline。\n③日期逻辑完全不动:onStartDateChange/onEndDateChange/onRegDateChange → syncXxx 保持现状;提交串必须仍为 YYYY-MM-DDTHH:mm:00、秒恒 00。\n④删除 3 处 <text class=\"picker-hint\">…</text>(行 27/39/51);并删除行 677 那条「活动时间以 5 分钟为一个单元」的 CSS 注释。\n⑤索引与字符串必须双向同步:fmtTime 回填(create.vue:593-599)与 loadDetail 三处回填(create.vue:300-324)在 normalizeTimeTo5Min 之后要按 mi/5 反算分钟索引,否则 picker 会显示默认值 00:00。建议抽一个 applyTimeParts(timePart, hourIdxRef, minuteIdxRef) 供初始化与回填共用。\n⑥normalizeTimeTo5Min 必须保留作为兜底(历史脏数据、后台或接口写入非 5 倍数时仍能收敛),不要删。\n\n明确不做(超出范围,做了一定要停手汇报):不做结束时间≥开始时间、报名截止时间≤开始时间等业务校验(现状本来就没有);不动后台 cfc-web/src/views/admin/ActivityEdit.vue 的 element-ui datetime 面板(element-ui 2.x 不支持分钟步长,维持现状 @change 收敛);不动任何费用字段、不做适用人群(那是 A2/A3)。\n\n验收:①分列恰好 12 项且选择过程中无法选中非 5 倍数分钟;②grep \"以 5 分钟为一个单元\" cfc-frontend/pages/activity/create.vue 零命中(含 CSS 注释);③normalizeTimeTo5Min 1440 分钟全量扫描仍全部正确(可把 <script> 提取为 .mjs 跑 node --check + 全量灌入);④提交串恒为 YYYY-MM-DDTHH:mm:00、秒恒 00;⑤编辑既有活动且历史时间为非 5 倍数(如 14:07)时,回填后 picker 显示与提交值一致(均为 14:05);⑥<template> 经 vue-template-compiler 编译零 error。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/activity-time-picker 分支(不要合并主干);只 git add 自己修改的这一个文件(禁止 git add .);完成后自行 git commit(提交信息写明任务号 A1 与改动摘要)并 git push -u origin feature/activity-time-picker,回报 commit 哈希、改动文件清单与验证结果;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。",
  216. "note": "2026-10-25 22:52 首派 local-45278 与 A2 并行抢同一工作树 E://cfc;实测 A1 会话在中断前已成功 commit 7c0009bf1(multiSelector 双列 5 分钟粒度 + 删 3 处提示文案与 CSS 注释 + normalizeTimeTo5Min 兜底保留),该提交成为 A2 分支基点,未被冲掉,主理人已复核 create.vue 实现完整。7c0009bf1 已推送到远端 feature/activity-time-picker-5min(2026-10-26 校验:3 处 picker 均为 multiSelector,minuteOptions 12 项,picker-hint 零命中)。fill_slots 曾于 00:13 把 A1 重派到 lan-248(ses_e8c29b773ffe4DX2ch95ZhRrcV)属重复会话,已中断并加 72h 冷却锁;A1 完成态以本地提交为准,不需要再合入主干的 A1 工作。",
  217. "session_id": "ses_e8c737725ffeD3CXiKEMJ4whgo",
  218. "dispatched_at": "2026-10-26 00:13:05",
  219. "dispatched_to": "local-45278",
  220. "model": "axonhub/deepseek",
  221. "done_at": "2026-10-26 00:40:17"
  222. },
  223. {
  224. "id": "A2",
  225. "title": "活动适用人群 + 费用模型重构(audienceScope/audienceType + 结算按参与者身份分类 + 仅会员硬门禁)",
  226. "priority": "P1",
  227. "module": "fullstack",
  228. "instance": "",
  229. "status": "done",
  230. "spec": "docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md",
  231. "prompt": "重构活动的人群与费用模型。完整设计、字段表、迁移写法与结算伪代码见 docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md 的 §二(2.1–2.5)与 §零 0.2,请先读。\n\n现状两个必须修的缺陷:\n①两端口径分裂:小程序创建页只填 childFee/childMemberFee/parentFee/parentMemberFee(create.vue:67-85),后台管理端只填 price/memberPrice(cfc-web/.../ActivityEdit.vue:140-153),两套列互不互通,后台设的价小程序填不了、小程序填的价后台改不了。\n②结算语义错误:ActivityOrderService.java:81-84 用 boolean isChild = memberId != null 决定收 childFee 还是 parentFee,快照 type 写死 \"child\"/\"parent\"。在统一成员选择器(T25)之后 memberId 可以是儿童/长者/配偶等任意家庭成员,不能一律当「孩子」收费;快照 type 同理。\n\n实现(按 §二 2.1–2.5):\n①数据层:新增 audience_scope VARCHAR(20) DEFAULT 'all'(取值 all / member_only)、audience_type VARCHAR(20) DEFAULT 'adult'(取值 adult / include_child / include_elder / include_child_elder),用 DatabaseInitializer 既有的 information_schema.COLUMNS 存在性检查范式(参考行 2254-2266 的 visible_scope 迁移),ALTER TABLE 定位 AFTER visible_to。【长者价格列不新增】——长者复用成人价,audienceType 只留长者标签用于展示与筛选(D1 默认口径)。Activity 实体与 ActivityDTO 同步新增两个字段;ActivityRegistration 及报名参数不变。\n②表单(小程序 cfc-frontend/pages/activity/create.vue):新增 audienceScope 单选(全部用户 / 仅会员参加)与 audienceType 多选(成人 / 含儿童 / 含长者,成人恒选);新增「价格(元)」「会员价(元)」两个输入对应 price/memberPrice 并始终可见(当前完全缺失);孩子费用两档仅在 audienceType 含 child 时显示,隐藏时提交写 0;长者不出现独立价格输入。\n③结算(cfc-backend ActivityOrderService.java:81-91):删掉 isChild = memberId != null,改为按参与者身份分类 self(本人,memberId 为空)/child(age<18)/elder(age>=60)/adult(其他成年家庭成员),分别取 price|memberPrice、childFee|childMemberFee、price|memberPrice、price|memberPrice;会员判定沿用现有 membershipService.getMemberLevel(userId) 的 FAMILY/PREMIUM 口径;依据只用 FamilyMember 现有 age/generation/isSpouse,不新增角色字段。快照 type 改为 self/child/elder/adult(去掉 \"parent\" 这个语义)。关键回归点:FamilyMember.age 为空一律回落 adult,绝不可当 child 处理(否则会多收费)。\n④仅会员硬门禁(§二 2.5):audienceScope=member_only 时在下单入口既有校验块(ActivityOrderService.java:55-64)之后追加后端拦截,非会员返回「该活动仅会员可参加」;非登录用户(userId 为空)必须拒绝并走引导登录。前端提示仅作体验优化,不以前端为准。范式对齐 TaskController.java:48 的 task.memberOnly。\n⑤兼容存量(必须实现,§二 2.4):audience_type 为空视为 adult,成人档取值按「优先新列回退旧列」——非会员价 price>0?price:parentFee,会员价 memberPrice>0?memberPrice:parentMemberFee,儿童档 childFee/childMemberFee 原样保留。即 parentFee 降级为「成人非会员价」的历史别名,不做数据回迁,不改存量活动收费。\n\n本任务【不做】展示层改造(活动详情/列表/海报/报名弹窗的展示在 A3,避免两个会话同时改 activity-detail.vue);【不做】任何家长/孩子措辞清理(属 G1);【不做】child_id→member_id 列名迁移(属 G2)。\n\n验收:①information_schema 确认两列已建且 DEFAULT 生效;②mvn -pl cfc-backend -am compile 通过;③audienceScope=member_only + 非会员下单被拒并返回指定文案,非登录用户被引导登录;④报名人 age 为空时按成人档计费(不得误判为儿童);⑤老活动(audience_type 为空)结算金额与改造前逐分一致——用 price/parentFee/memberPrice/parentMemberFee 四个字段各非空、组合覆盖 4 种取值路径各测一例;⑥免费活动(totalAmount==0)的免报名快照分支行为不变;⑦小程序 <script> node --check 通过、模板 vue-template-compiler 零 error。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/activity-audience-fee 分支(不要合并主干);只 git add 自己新增/修改的文件(禁止 git add .);先 mvn -pl cfc-backend -am compile 通过再改前端;完成后自行 git commit(提交信息写明 A2 与改动摘要)并 git push -u origin feature/activity-audience-fee,回报 commit 哈希、改动文件清单、编译结果与验收⑤的四例对比数据;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。\n\n【并行冲突协调(重要,必读)】上个任务 A1 也在改 create.vue(顺序器区块),本任务同样改 create.vue(费用与人群区块),两个会话很可能并行派发。因此:开工先 git fetch origin cfclub,若基线已含 A1 提交(feature/activity-time-picker 或同类提交),就以最新 origin/cfclub 为基线新建分支再做;若 merge/rebase 时 create.vue 出现冲突,只解自己负责的费用/人群区块冲突,必须完整保留 A1 的 multiSelector 时间选择器改造,不得回退或丢弃对方区块;改完全库 grep 确认无冲突标记残留。",
  232. "session_id": "ses_e8c73751effeMCoJwOVQBETEbF",
  233. "dispatched_at": "2026-10-25 22:52:33",
  234. "dispatched_to": "local-45278",
  235. "model": "axonhub/deepseek",
  236. "done_at": "2026-10-26 00:40:17",
  237. "note": "2026-10-26 交付:commit d64617c84 已 push 到 origin/feature/activity-audience-fee(父提交 7c0009bf1=A1,一并推送)。8 文件:Activity.java/ActivityDTO.java(+basePrice 兼容)+DatabaseInitializer.java+schema.sql(audience_scope/audience_type 迁移)ActivityOrderService.java(self/child/elder/adult 分类计费 + 仅会员硬门禁 + 老数据回落)+ create.vue(audienceScope/audienceType/price/memberPrice 表单)+ 2 个单测。mvn clean compile + create.vue 模板编译通过。待主理人决定合入主线。"
  238. },
  239. {
  240. "id": "A3",
  241. "title": "活动费用展示层口径统一(小程序详情/列表/海报/报名弹窗 + 后台管理端适用人群)",
  242. "priority": "P1",
  243. "module": "fullstack",
  244. "instance": "",
  245. "status": "done",
  246. "spec": "docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md",
  247. "prompt": "把活动费用的展示层全部统一到「成人/儿童/长者 × 会员/非会员 + 适用人群」新口径。完整字段表、逐文件改造表与验收见 docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md 的 §二 2.6,请先读。本任务依赖 A2 已合入(audience_scope / audience_type / price / memberPrice / childFee / childMemberFee 字段与后端分类逻辑已就绪),开始前先确认 A2 提交已在分支基线上。\n\n要改的地方(照 §二 2.6 表格逐条):\n①cfc-frontend/pages/activity/activity-detail/activity-detail.vue:61-62 现在恒显「孩子:¥…」「家长:¥…」——改为按 audienceType 条件渲染:成人档恒显,儿童/长者档仅当 audienceType 含该类别且对应价格 > 0 才显示;标签文案用「成人」「儿童」「长者」,不得再出现「家长」「孩子」。\n②同文件 827/829 海报价格文案「(家长)」「(孩子)」→ 按 audienceType 选「(成人)」「(儿童)」「(长者)」。\n③同文件 hasFee(977-985) / hasMemberPrice(982-985) 现在只读 4 个 child/parent 字段,必须纳入 price/memberPrice——否则只填成人价、childFee/parentFee 全 0 的付费活动会被误显为「免费」,这是必须修的真实 bug。\n④同文件 minFeeText(1008-1015) 取 4 费最小值 → 改为取「当前用户可用档位」的最小值(会员用会员价列,非会员用非会员价列)。\n⑤cfc-frontend/pages/activity/index.vue:852-857 normalizeActivity 现在用 4 个 child/parent 费用的最小值覆盖 act.price —— 改为不再覆盖 price,仅在 price 为空时回落 parentFee(兼容老活动)。\n⑥报名弹窗 activity-detail.vue:246-300:报名人目前只有姓名+手机+家庭成员勾选,看不出每个人按哪个价收费——为每个报名人加身份标签(成人/儿童/长者)与对应单价展示。\n⑦后台 cfc-web/src/views/admin/ActivityEdit.vue:在 140-153 的价格区之后追加 audienceScope(单选)与 audienceType(多选)表单项,条件显示儿童费用两档,字段读写对齐 A2 的 DTO 字段名,保存后回显正确;后台与小程序保存出来的活动数据必须一致。\n\n本任务【不做】时间选择器改造(属 A1);【不做】数据层与结算逻辑(属 A2);【不做】其他页面的家长/孩子措辞清理(属 G1,且 G1 明确排除 activity-detail.vue 与 create.vue,避免与本任务冲突)。\n\n验收:①audienceType=adult 的活动详情页完全不出现「儿童」「长者」「孩子」「家长」字样;②只填 price/memberPrice、childFee 与 parentFee 全 0 的付费活动,详情页正确显示价格且不再误显「免费」(这是回归重点);③报名弹窗按报名人身份显示对应单价;④后台可设置并回显 audienceScope/audienceType,两端数据一致;⑤海报价格文案无「家长」「孩子」;⑥小程序 node --check 与模板编译通过、cfc-web vue-cli-service build 通过。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/activity-fee-display 分支(不要合并主干);只 git add 自己新增/修改的文件(禁止 git add .);先编译再构建;完成后自行 git commit(写明 A3 与改动摘要)并 git push -u origin feature/activity-fee-display,回报 commit 哈希、改动文件清单、构建结果与验收②的回归结论;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。\n\n【依赖确认(重要,必读)】本任务要求 A1 与 A2 均已合入 cfclub:开工先 git fetch origin cfclub,确认基线含 A1 的时间选择器 multiSelector 改造与 A2 的 audience_scope/audience_type 字段(实体与 ActivityDTO 已有这两个字段即代表 A2 已合入)。若任一条不满足,不要在回复里自行实现,直接停止并说明缺哪一条。",
  248. "session_id": "ses_e8c734769ffeu8ysluw623VQEk",
  249. "dispatched_at": "2026-10-25 22:52:47",
  250. "dispatched_to": "lan-248",
  251. "model": "axonhub/deepseek",
  252. "note": "2026-10-26 交付:commit 4a202be94 已 push 到 origin/feature/activity-fee-display。4 文件:activity-detail.vue / activity/index.vue / utils/activity-fee.js(新增)/ cfc-web ActivityEdit.vue。已完成 57 用例自检:audienceType=adult 详情页无「儿童/长者/孩子/家长」字样;只填 price/memberPrice 的付费活动不再误显免费;海报文案中性化。⚠ A3 基于旧基线 3582e3580 完成(当时 A2 未合入 cfclub),与 A2 零文件重叠,但 utils/activity-fee.js 依赖 A2 的 DTO 字段——合入顺序必须 A2 先、A3 后,合并时按 feature/activity-audience-fee → feature/activity-fee-display 顺序 rebase/merge,随后全量编译回归。",
  253. "done_at": "2026-10-26 00:40:17"
  254. },
  255. {
  256. "id": "G1",
  257. "title": "全系统「家长/孩子」措辞清查:L1 文案层统一为本人/家庭成员/儿童/长者",
  258. "priority": "P2",
  259. "module": "fullstack",
  260. "instance": "",
  261. "status": "done",
  262. "spec": "docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md",
  263. "prompt": "清理全系统用户可见的「家长」「孩子」措辞,统一为中性口径。现状分布数据、分层策略与排除范围见 docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md 的 §三,请先读。\n\n前提认知(重要):系统身份模型只有【登录用户】与【非登录用户】,家庭成员是家庭成员(FamilyMember 模型已是 nickname/age/generation/isSpouse 的中性口径)。因此「家长」「孩子」这类亲子关系表达只应作为【家庭成员的人群标签】出现(儿童/长者/成人),不应作为系统角色出现。数据模型本身没错,遗留集中在文案、API 名、页面目录名、后端方法名与日志文案。\n\n本任务只做 L1 文案层(低风险):\n①小程序前端 cfc-frontend/pages 与 components 下所有 .vue 的【用户可见文字】:「家长」→「本人」或「家庭成员」,「孩子」→「家庭成员」或按上下文用「儿童」,涉年龄的表述用「成人/儿童/长者」。已知命中较多的文件(cfclub tip 实测):body-detail/dimension-questionnaire.vue(17)、home-pages/parent-index.vue(11)、index-home/index.vue(9)、rewards/rewards.vue(8)、wealth/index.vue(7)、parent/child-detail.vue(6)、child/tasks.vue(6),以及 member-detail、child/rewards、teacher-profile、policy/privacy、mind-detail、wishes/detail、tasks/review、profile/components/ProfileHeader 等。请以 grep 结果为准全量覆盖,不要只看这个清单。\n②后端返回给前端的用户可见文案:toast / Result.error 提示语 / 消息模板 / 订阅消息模板 / 推送文案中的「家长」「孩子」同样替换。已知命中较多的:EnergyService(57)、WishService(28)、TaskService(25)、RewardService(25)、FamilyMemberService(24)、UserService(16)、WechatAlertTemplateService(11)、CircleMatchService(10) 等。DatabaseInitializer.java(66) 命中多但多为种子数据与注释,【只改其中会作为用户可见文案下发的种子字符串】,纯注释与列注释不动。\n\n严格排除(做了就超范围,必须停手汇报):\n①不改 DB 列名、不改 API 路径、不改页面目录、不改 pages.json 路径、不改 Java 方法名与变量名(这些属 G2);\n②不改 cfc-frontend/pages/activity/activity-detail/activity-detail.vue 与 pages/activity/create.vue(A2/A3 正在改这两个文件,会冲突);\n③不改 utils/api.js 的函数名(属 G2);\n④不改 dist/ 与 unpackage/ 构建产物;\n⑤不删除或改写 policy/privacy.vue 中涉及未成年人保护的合规表述(只把「家长」按语境替换为「监护人」这类合规词,如判断不清就保留原样并在回报中列出)。\n\n验收:①grep -rl \"家长\\|孩子\" cfc-frontend/pages cfc-frontend/components --include=\"*.vue\" 结果为空,或仅剩白名单文件(如 policy/privacy.vue 的合规表述)并在回报中逐个说明理由;②后端返回给前端的文案中无「家长」「孩子」(可用 grep 排除列注释后核对);③DB 列名、API 路径、页面目录、pages.json、Java 方法名 git diff 中【零改动】;④mvn -pl cfc-backend -am compile 与小程序 node --check / 模板编译全部通过。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/terminology-neutralize-l1 分支(不要合并主干);只 git add 自己修改的文件(禁止 git add .);完成后自行 git commit(写明 G1 与改动摘要)并 git push -u origin feature/terminology-neutralize-l1,回报 commit 哈希、改动文件清单、验收①的白名单说明、编译结果;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。",
  264. "session_id": "ses_e8c7316daffe0ZGKPTRhzI2jnB",
  265. "dispatched_at": "2026-10-25 22:53:00",
  266. "dispatched_to": "lan-204",
  267. "model": "axonhub/deepseek",
  268. "done_at": "2026-10-26 02:24:19"
  269. },
  270. {
  271. "id": "G2",
  272. "title": "契约/目录/DB 列名中性化(L2 前端契约与页面目录 + L3 后端内部命名)",
  273. "priority": "P3",
  274. "module": "fullstack",
  275. "instance": "",
  276. "status": "done",
  277. "spec": "docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md",
  278. "prompt": "风险最高的一批:把 parent/child 命名从契约层与存储层清掉。必须先读 docs/superpowers/plans/2026-10-26-activity-create-page-ux-and-audience-design.md 的 §三 3.2 与 §三 3.3(冲突面提示),再读 T25 的设计文档 docs/superpowers/plans/2026-10-25-unified-member-selector.md 了解已完成的部分。\n\n前置条件(不满足就停止并回报,不要硬做):①T25「统一成员选择器」所有批次已完全收口合入主线;②G1 文案层已完成合入;③本任务开工前需主理人对 DB 列名迁移方案单独确认(本任务的 L3 包含活动报名表 child_id → member_id 的列迁移,属破坏性变更)。\n\n范围(照 §三 3.2 的 L2 + L3):\nL2 前端契约与页面层:①cfc-frontend/utils/api.js 为遗留函数增加中性别名(getChildren→getFamilyMembers、switchToChild→switchToFamilyMember、switchBackToParent→switchBackToSelf、getParentDashboard→getFamilyDashboard、getChildOverview→getMemberOverview、createChild→addFamilyMember 等),【旧函数名必须保留为转发别名】,不得直接删除(外部可能引用);②pages/parent/、pages/child/ 迁到 pages/family/,pages/home-pages/parent-index.vue 与 child-index.vue 改中性名,pages.json 同步;③【旧路径必须保留跳转壳】(wx.redirectTo 到新路径),因为小程序已发布版本仍在用旧路径;④cfc-web 侧同步(api/、router/index.js、views 下 admin 页面引用)。\nL3 后端内部层:①Java 方法名与变量名中性化(childId→memberId、isChild→isMinorMember、ParentController→FamilyMemberController 等);②ActivityRegistration 的 DB 列 child_id → member_id:新增 member_id 列 + 数据回填 + 双写过渡 + 旧列保留一个版本,外键引用面(activity_registrations 及相关查询)必须先出影响清单再动手;③DatabaseInitializer 中 child 语义的种子数据与列注释同步。\n\n严格禁止:①不得重做成员去重逻辑(T25 已完成,MemberSelector.vue / memberNormalize.js / member_normalize 相关代码只在必要处做重命名,不得改算法);②不得改动与成员语义无关的业务逻辑;③不得动 Activity.childFee/parentFee 的语义(已由 A2 降级为别名,不要再动)。\n\n验收:①旧 API 函数名全部仍可调用且转发到新别名(逐个 grep 确认调用点零断链);②旧页面路径重定向可用;③pages.json 与新目录一致;④child_id→member_id 迁移脚本可重复执行(幂等),迁移前后记录数一致且抽样行内容一致;⑤mvn clean compile、cfc-frontend node --check、cfc-web build 全部通过;⑥报名/取消/退款链路(ActivityRegistrationService.register/cancel/refund)回归通过。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/terminology-neutralize-l2-l3 分支(不要合并主干);只 git add 自己新增/修改的文件(禁止 git add .);开工前先在回复里给出 child_id 影响面清单与迁移方案供主理人确认,确认后再动列名;完成后自行 git commit(写明 G2 与改动摘要)并 git push -u origin feature/terminology-neutralize-l2-l3,回报 commit 哈希、改动文件清单、编译构建结果与回归结论;无需等待主理人确认即可提交代码到特性分支;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。",
  279. "session_id": "ses_e8c72e9c5ffelYziJOL2FYW1Lg",
  280. "dispatched_at": "2026-10-25 22:53:09",
  281. "dispatched_to": "lan-189",
  282. "model": "sensenova/deepseek-v4.1-flash",
  283. "note": "L1 命名已中性化(terminology-neutralize-l1 = 04d87cfd1)+ L2/L3 合约与 DB 列(terminology-neutralize-l2-l3 = b9b24bc8e)均已推送到 origin。本项 done。",
  284. "done_at": "2026-10-26 12:45"
  285. },
  286. {
  287. "id": "U1",
  288. "title": "小程序 UI 令牌收敛:font-scale 补漏+品牌色变量化+AI味文案清理+spacing令牌",
  289. "priority": "P1",
  290. "module": "cfc-frontend",
  291. "instance": "lan-204",
  292. "status": "done",
  293. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  294. "prompt": "见任务书 U1 批次(派发时已全文携带,此处不重复)",
  295. "session_id": "ses_e8a4a1696ffeX0jUo3C8vEzW2c",
  296. "dispatched_at": "2026-10-26 08:56:58",
  297. "dispatched_to": "local-45278",
  298. "model": "axonhub/deepseek",
  299. "session": "ses_e8a510558ffeLL9hENkbQiyGZh",
  300. "done_at": "2026-10-26 09:49:46"
  301. },
  302. {
  303. "id": "U2",
  304. "title": "后台 UI 令牌收敛:#1677FF去硬编码+20px→24px+13px归位+非标圆角收敛",
  305. "priority": "P1",
  306. "module": "cfc-web",
  307. "instance": "pub-iwintrue",
  308. "status": "done",
  309. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  310. "prompt": "见任务书 U2 批次(派发时已全文携带,此处不重复)",
  311. "session_id": "ses_e8a4a0771ffeD6ETns1lX17pqR",
  312. "dispatched_at": "2026-10-26 08:57:01",
  313. "dispatched_to": "lan-248",
  314. "model": "axonhub/deepseek",
  315. "session": "ses_e8a5103edffeOmOX3aScI6mkA7",
  316. "done_at": "2026-10-26 09:39:00"
  317. },
  318. {
  319. "id": "C1",
  320. "title": "今日成长入口补传 taskId:打卡同步完成任务(growth-main → diet/exercise/sleep)",
  321. "priority": "P1",
  322. "module": "frontend",
  323. "instance": "",
  324. "status": "done",
  325. "spec": "docs/superpowers/plans/2026-10-26-checkin-task-growth-linkage-and-diet-multi-meal.md",
  326. "prompt": "完整设计、代码证据链与验收见 docs/superpowers/plans/2026-10-26-checkin-task-growth-linkage-and-diet-multi-meal.md 的 §一.A 与 §二.A,请先读。\n\n背景(一句话):任务列表页 tasks.vue:560-612 navigateByAction 跳 diet/sleep/exercise 打卡页时已带 ?taskId=X&memberId=Y,后端 Health{Meal,Sleep,Exercise}Controller.create 已有带 taskId 的 updateCheckinTaskProgress / completeTask 回写;但今日成长页 growth-main/index.vue:325-332 handleProgressClick 对 diet/exercise/sleep 完全不带 taskId,只能走 updateProgress(taskKey) 兜底,该路径仅命中 isDailyProgress=1 且 title 前缀 [DIET]/[SLEEP]/[EXERCISE] 的每日任务——一次性健康任务通过今日成长入口打卡时不会完成。\n\n范围(唯一文件 cfc-frontend/pages/growth-main/index.vue):\n①在 loadProgressItems(行 398-468)阶段一并查询当日当前成员(this.memberId)未完成的对应类型任务。取数建议:调 getTodayTasks 或等价接口(utils/api.js 已有 getTodayTasks(memberId) 见 loadRecentTasks),筛出 status in ('pending','in_progress') 且 actionType 匹配 diet/exercise/sleep 的任务,按 actionType 索引到对应 progressItem 上(如 item.taskId、item.taskId 为空则保留 undefined)。\n②handleProgressClick(行 325-332):命中 diet/exercise/sleep 时,若有 taskId 则拼 ?taskId=X&memberId=Y(memberId 取 item 对应成员或 this.memberId,保持与 tasks.vue 同口径);无 taskId 时维持现状纯跳转(退化为纯记录打卡,后端走 updateProgress 兜底,不报错)。\n③不要改今日成长完成度判定逻辑(loadProgressItems 基于记录查询的 done 判定保持现状);不要改 onShow 刷新逻辑。\n④三个打卡页(diet/sleep/exercise-checkin.vue)的 taskId 接线与提交逻辑全部保持现状,不要动——它们已经正确透传 taskId 且后端已自动完成。\n⑤后端零改动:updateCheckinTaskProgress / completeTask / updateProgress 三条路径均已存在且幂等。\n\n明确不做(超出范围):不改打卡页、不改后端、不改任务生成器、不改任务完成度判定、不做饮食多选(属 C2)。\n\n验收:①今日成长页点击饮食/运动/睡眠打卡 → 跳转 URL 带 taskId(有当日未完成任务时)→ 打卡成功后返回,该任务在任务中心变 completed;②无当日对应任务时跳转不带 taskId,打卡不报错、记录正常写入;③打卡完成后返回今日成长页,对应 progressItem 变 done(onShow 触发 loadAllData);④小程序 node --check 与模板编译通过。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/growth-checkin-taskid 分支(不要合并主干);只 git add 自己新增/修改的文件(禁止 git add .);完成后自行 git commit(写明 C1 与改动摘要)并 git push -u origin feature/growth-checkin-taskid,回报 commit 哈希、改动文件清单、验收结论;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。",
  327. "generated_from": "manual",
  328. "generated_at": "2026-10-26",
  329. "session_id": "ses_e8a11876effepKN5yQHrqPw3lq",
  330. "dispatched_at": "2026-10-26 09:58:45",
  331. "dispatched_to": "local-45278",
  332. "model": "axonhub/deepseek",
  333. "done_at": "2026-10-26 10:43:32",
  334. "note": "交付 commit a25b49f30 已推 origin/feature/growth-checkin-taskid(基线 origin/cfclub@6b098fe60,仅 1 提交 atop,未合主干)。改动:cfc-frontend/pages/growth-main/index.vue(唯一文件 +45/-5)。实现:新增 fetchTodayTasks() 统一取当日任务(与今日任务预览共用,避免重复请求)+ findTaskByAction() 筛 status in (pending,in_progress) 且 actionType 匹配 + loadProgressItems 内把 taskId/taskMemberId 挂到 diet/exercise/sleep 项 + handleProgressClick 命中三类时拼 ?taskId=X&memberId=Y(无当日任务则退化为纯记录打卡,不报错)。完成度判定仍以记录查询为准,未改;后端零改动。已代码级复核通过。⚠ 主理人 10:13 手动重派到 lan-204 属重复派发(巡检 09:58 已先派发):ses_e8a04a124ffe8XDRQoguOlAYh0 因 --dir 'D:\\cfc' 路径被转义成字面双反斜杠建会话失败(0 消息);重派会话 ses_e89c9782bffeHHGIfq2MM0YWfc 已 interrupt 并写 72h 冷却锁。⚠ 本分支与 C2 分支均修改 cfc-frontend/pages/growth-main/index.vue(C1 改 handleProgressClick/taskId 挂载,C2 改 mealTypeLabel),两分支同基线 6b098fe60,合入主线需 rebase 且 C1 先、C2 后(冲突面:同文件不同函数块,可手工解)。",
  335. "verified_at": "2026-10-26 11:30"
  336. },
  337. {
  338. "id": "C2",
  339. "title": "饮食打卡餐次多选:早/中/晚/加餐 TagChip 多选 + 后端 mealType 逗号拼接 + 展示层适配",
  340. "priority": "P1",
  341. "module": "fullstack",
  342. "instance": "",
  343. "status": "done",
  344. "spec": "docs/superpowers/plans/2026-10-26-checkin-task-growth-linkage-and-diet-multi-meal.md",
  345. "prompt": "完整设计、代码证据链与验收见 docs/superpowers/plans/2026-10-26-checkin-task-growth-linkage-and-diet-multi-meal.md 的 §一.B 与 §二.B,请先读。\n\n背景(一句话):饮食打卡页 diet-checkin.vue 的餐次选择是 TagChip 单选(form.mealType 单值),用户一次只能选一餐;后端 HealthMealRecord.mealType 是单个 String,health_meal_record.meal_type 列是 VARCHAR(32)。需求是让早/中/晚/加餐可多选。关键约束:meal_type VARCHAR(32) 足够存 'breakfast,lunch,dinner'(21 字符)与 'breakfast,lunch,dinner,snack'(25 字符),**无需 schema 迁移**——用逗号拼接单值方案,1 条记录承载多餐次。\n\n范围:\n①前端 cfc-frontend/pages/growth/diet-checkin.vue:data 新增 form.mealTypes 数组(初始 [])与 mealType 计算属性/方法;TagChip 改为 toggle 多选(:active 判断数组包含 m.value,@select 切换数组成员);submitCheckin 校验改为「mealTypes 至少一项」,提交时把 mealTypes 序列化为逗号拼接字符串写入 payload.mealType(保持后端契约不变);历史列表 mealTypeLabel(item.mealType) 改为接收逗号拼接字符串,内部 split(',') 逐项映射后 join('、')(行 283 的 mealTypeLabel 定义改)。\n②前端 cfc-frontend/pages/growth-main/index.vue:386 的 mealTypeLabel 同样改为逗号拼接兼容版(与 ① 保持一致逻辑,可抽到 utils 共用但不强制)。\n③前端 cfc-frontend/pages/diet/records.vue:147-148::class=\"'meal-' + r.mealType\" 改为取逗号拼接的首项(split(',')[0])以保留样式语义;mealLabel(r.mealType) 改为逗号兼容版。\n④前端 cfc-frontend/pages/diet/record-detail.vue:17:现在直接显示 {{ record.mealType }}(原始值),改为显示中文标签(逗号拼接的 label)。\n⑤后端 cfc-backend/src/main/java/com/etotem/cfc/controller/HealthMealController.java create:mealType 非空校验改为「按逗号拆分 trim 去空后至少一项」;其余逻辑(任务回写、CF 发放、补打校验、成员归属修正)全部零改动。\n⑥数据库零改动:health_meal_record.meal_type VARCHAR(32) 够用,不加迁移。\n\n计数语义(已定,不要改):一次提交多餐次计 1 次任务进度(与 RepeatTaskGenerator 每日任务 targetValue=1 一致);CF 发放 1 次(按记录 ID 幂等,现状不变)。\n\n明确不做(超出范围):不做今日成长入口 taskId 补传(属 C1);不做 health/diet-index.vue 另一入口的多选改造(属旧入口,另行评估);不改 RepeatTaskGenerator / TaskService;不拆 N 条记录;不改补打逻辑。\n\n验收:①饮食打卡可多选早/中/晚/加餐任意组合,提交成功,记录 mealType 为逗号拼接字符串;②历史记录列表与详情页正确显示多餐次中文标签(如「早餐、午餐」);③tasks.vue 任务列表或今日成长入口发起的饮食任务,一次多餐打卡后任务进度计 1 次,targetValue=1 时任务立即 completed;④CF 发放 1 次(幂等不变);⑤补打场景不受影响(isBackfill=1 不参与回写);⑥mvn -pl cfc-backend -am compile 与小程序 node --check / 模板编译通过。\n\n纪律:git fetch origin cfclub → 基于 origin/cfclub 新建 feature/diet-multi-meal 分支(不要合并主干);只 git add 自己新增/修改的文件(禁止 git add .);先 mvn -pl cfc-backend -am compile 通过,再小程序 node --check / 模板编译通过;不新增 DB 迁移;完成后自行 git commit(写明 C2 与改动摘要)并 git push -u origin feature/diet-multi-meal,回报 commit 哈希、改动文件清单、编译构建结果与验收结论;无需等待主理人确认即可提交;不要自行合并 cfclub;prod 发布属 manual_only,未经授权不得 push prod。若规格文档在 checkout 中不存在,请停止并在回复中说明。",
  346. "generated_from": "manual",
  347. "generated_at": "2026-10-26",
  348. "session_id": "ses_e8a116c80ffejyHPhbsgKc5r8w",
  349. "dispatched_at": "2026-10-26 09:58:51",
  350. "dispatched_to": "lan-248",
  351. "model": "axonhub/deepseek",
  352. "done_at": "2026-10-26 10:43:32",
  353. "note": "交付 commit df15b7ac9 已推 origin/feature/diet-multi-meal(基线 origin/cfclub@6b098fe60,未合主干)。改动 5 文件 +78/-12:cfc-backend/.../controller/HealthMealController.java(create 校验改为按逗号 split+trim+filter 去空后至少一项,归一化回写;import java.util.* 与 java.util.stream.Collectors 均既有,编译无需新增依赖)+ cfc-frontend/pages/growth/diet-checkin.vue(form.mealType → form.mealTypes 数组 + TagChip toggle 多选 + toggleMealType + mealType 计算属性固定早餐→午餐→晚餐→加餐顺序输出 + 校验改数组非空 + payload.mealType 用计算属性)+ cfc-frontend/pages/diet/records.vue(class 取 split(',')[0] 首项保留样式语义 + mealLabel 逗号兼容)+ cfc-frontend/pages/diet/record-detail.vue(原直显原始值改显中文标签)+ cfc-frontend/pages/growth-main/index.vue(mealTypeLabel 逗号兼容)。DB 零迁移(meal_type VARCHAR(32) 够 25 字符)。计数语义按方案锁定:一次多餐提交计 1 次任务进度(targetValue=1 即 completed)+ CF 发放 1 次(按记录 ID 幂等)。已代码级复核通过。⚠ 与 C1 同基线 6b098fe60 且都改 cfc-frontend/pages/growth-main/index.vue,合入主线须 rebase 且 C1 先、C2 后。",
  354. "verified_at": "2026-10-26 11:30"
  355. },
  356. {
  357. "id": "U3",
  358. "title": "小程序圆角收敛为 4 档(8/16/24/999rpx):消除 10 种值并存的视觉不一致",
  359. "priority": "P0",
  360. "module": "cfc-frontend",
  361. "instance": "lan-204(会话已结束未回填,但分支有实质产出)",
  362. "status": "done",
  363. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  364. "prompt": "全局纪律见任务书首节:基于 origin/cfclub 新建 feature/ui-token-<slug> 分支、禁止 git add .、只改样式不改逻辑、改前后 grep 基线计数、不得改动 admin-tokens.css / uni.scss 既有令牌值、完成后自行 commit+push 自己的分支不需等主理人确认、不要自行合并 cfclub。改前必读任务书对应章节全文。 U3 批次:uni.scss 缺 radius 令牌则按 8/16/24/999rpx 追加;页面 border-radius 按映射归并(4/6rpx→8rpx、10rpx→8rpx、12rpx→16rpx、16rpx 保留、20rpx→24rpx、24rpx 保留、40/44rpx→24rpx),半圆角写法只换数字保留方位,999rpx/50%/circle 保留,JS 内圆角字符串跳过并报告。验收:border-radius 数值种类收敛到 ≤4 种,报告归并前后各档命中数与跳过清单。 | 判定=实质完成:分支 feature/ui-token-u3-radius @ 300dd0765,334 文件 / 1564 处,rpx 数值 37 种→4 种(8/16/24/999)。任务书字面映射 + 主理人批准的就近档扩展均已落地;保留 50%/circle/999rpx/0/px 与 $uni-radius-* 令牌引用;仅样式变更无逻辑/DB 改动。未经独立核验。",
  365. "session_id": "ses_e89ab3f1effeK3fN6pLCzrnxZS",
  366. "dispatched_at": "2026-10-26 11:50:28",
  367. "dispatched_to": "local-45278",
  368. "model": "axonhub/deepseek"
  369. },
  370. {
  371. "id": "U4",
  372. "title": "小程序 30rpx 归并(492 处):安全边距→$uni-space-page,内部间距→24/32rpx 令牌",
  373. "priority": "P1",
  374. "module": "cfc-frontend",
  375. "instance": "",
  376. "status": "done",
  377. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  378. "prompt": "全局纪律见任务书首节:基于 origin/cfclub 新建 feature/ui-token-<slug> 分支、禁止 git add .、只改样式不改逻辑、改前后 grep 基线计数、不得改动 admin-tokens.css / uni.scss 既有令牌值、完成后自行 commit+push 自己的分支不需等主理人确认、不要自行合并 cfclub。改前必读任务书对应章节全文。 U4 批次:区分两种 30rpx——页面安全边距(根容器 padding:30rpx、对称 padding-left/right:30rpx)改用 $uni-space-page 值不变;内部间距(子元素 margin/gap:30rpx)就近归并 $uni-space-lg(24rpx) 默认、明显区块大间距用 $uni-space-xl(32rpx)。本批只处理 30rpx,不扩散到 26/22/18/80rpx。不做像素级救视觉微调。验收:30rpx 总数从 492 大幅下降,剩余逐条说明为安全边距语义保留。",
  379. "session_id": "ses_e89ab2bfdffeF3NmZyf9QItKUT",
  380. "dispatched_at": "2026-10-26 11:50:32",
  381. "dispatched_to": "lan-248",
  382. "model": "axonhub/deepseek",
  383. "done_at": "2026-10-26 12:55:25"
  384. },
  385. {
  386. "id": "U5",
  387. "title": "后台品牌色残余收口:16 处 #1677FF(JS 数据对象/echarts canvas/el-tag color)统一到 colorTokens.js",
  388. "priority": "P1",
  389. "module": "cfc-web",
  390. "instance": "",
  391. "status": "done",
  392. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  393. "prompt": "全局纪律见任务书首节:基于 origin/cfclub 新建 feature/ui-token-<slug> 分支、禁止 git add .、只改样式不改逻辑、改前后 grep 基线计数、不得改动 admin-tokens.css / uni.scss 既有令牌值、完成后自行 commit+push 自己的分支不需等主理人确认、不要自行合并 cfclub。改前必读任务书对应章节全文。 U5 批次:新建 src/utils/colorTokens.js 收敛五维色映射(身#FF8C42/智#1677FF/富#F59E0B/行#10B981/心#FF6B9D)为单一出口;收敛重复定义点 DimensionWeightPicker.vue、admin/Dashboard.vue、EnergyBehaviorConfig.vue、EnergySandbox.vue、admin/org/Dashboard.vue、ProfileManagement.vue、teacher/TeacherTeam.vue、MbtiProfiles.vue;el-tag color 改 class 绑定;echarts/canvas itemStyle.color 与 color 数组走 adminColor() 封装(getComputedStyle 读 --adm-primary,因 canvas 不解析 CSS var);注释里色值不动;admin-tokens.css 不动。验收:grep -rni '#1677ff' views+components 从 16 降到只剩注释与令牌定义。",
  394. "session_id": "ses_e89ab1a7cffeBug0bMNhYu8Ap2",
  395. "dispatched_at": "2026-10-26 11:50:37",
  396. "dispatched_to": "lan-204",
  397. "model": "axonhub/deepseek",
  398. "done_at": "2026-10-26 12:31:28"
  399. },
  400. {
  401. "id": "U6",
  402. "title": "后台间距令牌引用率提升:teacher 全目录 + OrderManage + Dashboard 裸写 px → var(--space-*)",
  403. "priority": "P2",
  404. "module": "cfc-web",
  405. "instance": "",
  406. "status": "done",
  407. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  408. "prompt": "全局纪律见任务书首节:基于 origin/cfclub 新建 feature/ui-token-<slug> 分支、禁止 git add .、只改样式不改逻辑、改前后 grep 基线计数、不得改动 admin-tokens.css / uni.scss 既有令牌值、完成后自行 commit+push 自己的分支不需等主理人确认、不要自行合并 cfclub。改前必读任务书对应章节全文。 U6 批次(控制批次规模,不做全库):只做 src/views/teacher/ 全目录 + src/views/admin/OrderManage.vue + src/views/admin/Dashboard.vue;把 padding/margin 裸写 px 归并到 var(--space-*)(按 8/12/16/20/24/32px 就近匹配,优先 24px 对齐规范方向);不改 border-radius/font-size/width/height/line-height/top/left,不改 admin-tokens.css。验收:报告本批文件前后裸写 px 数,并给出全库新的 var(-- 引用率(基线 21.9%)作为后续批次起点。",
  409. "session_id": "ses_e89ab0a74ffeCpVE1cVLKXH3Zi",
  410. "dispatched_at": "2026-10-26 11:50:43",
  411. "dispatched_to": "lan-189",
  412. "model": "opencode/deepseek-v4.1-flash-free",
  413. "done_at": "2026-10-26 12:31:28"
  414. },
  415. {
  416. "id": "U7",
  417. "title": "小程序大字号段裸值(40~120rpx 共 13 种)+ font-weight 800/900 收口(需真机目检后再派)",
  418. "priority": "P3",
  419. "module": "cfc-frontend",
  420. "instance": "",
  421. "status": "blocked",
  422. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  423. "prompt": "blocked:40~120rpx 有 13 种裸值、font-weight 800×19 + 900×3 超 uni.scss 令牌上限(只到 700),中文系统字体在 20-30rpx 下 800/900 会糊字。归并必然改变视觉重量与醒目度,需先出「值→令牌映射表 + 视觉影响评估」并由主理人确认后再派,禁止盲派批量替换。"
  424. },
  425. {
  426. "id": "U8",
  427. "title": "小程序 16 个 >800 行页面拆分(index-home 3057 行为最重)(需先出拆分方案再派)",
  428. "priority": "P3",
  429. "module": "cfc-frontend",
  430. "instance": "",
  431. "status": "blocked",
  432. "spec": "docs/superpowers/plans/2026-10-26-ui-token-convergence-tasks.md",
  433. "prompt": "blocked:工程结构重构,与 UI 令牌收敛不同域,涉及模板/数据/方法拆分与路由、组件引用链,风险高。需先出「组件抽取清单 + 拆分顺序 + 每步回归范围」方案,主理人确认后按页面逐个拆,禁止一次性批量拆分。"
  434. },
  435. {
  436. "id": "RP-1",
  437. "title": "报告详情页查看态可修改报告日期(严格校验+失败提示+防数据丢失)",
  438. "priority": "P1",
  439. "module": "cfc-backend+cfc-frontend",
  440. "instance": "pub-iwintrue / lan-204",
  441. "status": "done",
  442. "spec": "docs/superpowers/specs/2026-10-26-report-date-editable-design.md",
  443. "prompt": "已完成。分支 feat/report-date-editable @ 2133cfaeb(基于 origin/cfclub be9e539bb,独立可合入,未合主线)。4 commit:3c8d132ec 后端严格解析+未来日期拦截+快照联动+date_source 兜底;18b0dd437 前端查看态日期入口;b3b683f67 修 D1 失败提示被覆盖(.catch 用 err.message,因微信 hideLoading 吞 toast 需重放);2133cfaeb 修 D2 数据丢失(改发最小 payload {type,summary:{reportDate}} 不带三表键→instanceof List 保护缺键即跳过,三表零 SQL,单测 2/2 实证)。mvn -o compile exit 0;前端 387 vue 全三通;audit 0 error。独立只读核验(lan-248 ses_e89b6f683):A 时序同步静态链路通过、运行时不可验(indicator_values 0 行);B 覆盖率确认 0%(indicator_definitions 33 条全 body 域与 1139 行菌群指标 name 精确匹配 0/1139,属测试数据缺口非缺陷);C date_source 列存在(varchar16 default 'unknown')走 UPDATE 分支。明确排除:dan 报告走独立存储;gut-flora-detail/report-result 入口未做(P1-2);批量/管理端未做。残留风险:D3 step7/8 try/catch 吞异常致时序同步可静默失效;D2 通用版(编辑态全量重写仍丢 collectionDate/description/relatedBacteria 3 列)本次仅堵住日期路径。运行时落库联查未跑(未起 9082 服务)。"
  444. },
  445. {
  446. "id": "T01",
  447. "title": "指标多期展示·数据地基 + 变化计算底座(迁移422/423 + collectionDate放开映射 + G3补时序 + IndicatorChangeService + backfill dryRun端点)",
  448. "priority": "P0",
  449. "module": "cfc-backend",
  450. "instance": "lan-248",
  451. "status": "done",
  452. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  453. "prompt": "已完成。分支 feat/indicator-timeline-t01 @ 02892080d(5 commit / 11 文件 / +1214 行,未合主线)。5 项交付齐全:85dcdd06b 迁移422-423;27f2d0de8 collectionDate 放开映射+日期来源/参考范围快照;eff28f10d G3 事后绑定成员补时序 + confirm 链路补写;1d4370a34 IndicatorChangeService+单测;02892080d /api/admin/indicator/backfill(dryRun)。实测覆盖率:测试库 20 份活跃报告全菌群,eligible=6(回填后 6/6),dateFixable=0(payload 内 reportDate 全 null,真实采样日不可恢复),indicator_values 存量 0 行。"
  454. },
  455. {
  456. "id": "T02",
  457. "title": "指标多期展示·后端接口层(/api/health/report/indicators 等 6 接口,两段共用一次性全量部署)",
  458. "priority": "P0",
  459. "module": "cfc-backend",
  460. "instance": "lan-248 / ses_e872b553affe2sPM7YcLmXZM62 / feat/indicator-timeline-t02",
  461. "status": "done",
  462. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  463. "prompt": "设计文档 §2761-2799。依赖 T01(已完成,分支 feat/indicator-timeline-t01 @ 02892080d)。基线必须基于该分支建(否则拿不到迁移/IndicatorChangeService)。后端接口一次性全量部署(接口上线≠功能上线,前端不接即不可见)。注意:HealthIndicator 删 @TableField(exist=false) 依赖 T01 兜底建列;goodDirection/refRange 字典配置是验收要点。 | 派发: lan-248 / ses_e872b553affe2sPM7YcLmXZM62 / feat/indicator-timeline-t02(基线 feat/indicator-timeline-t01 @ 02892080d,模型 axonhub/deepseek)",
  464. "done_at": "2026-10-27 00:25",
  465. "branch": "feat/indicator-timeline-t02",
  466. "note": "会话 ses_e872b553affe2sPM7YcLmXZM62 (lan-248) 10-27 00:24 交付完成,9 commits push 至 origin/feat/indicator-timeline-t02 = ff7ef5b97。注:后端 61 个测试失败为存量(与本次改动无关),详见交付报告。"
  467. },
  468. {
  469. "id": "T03",
  470. "title": "指标多期展示·前端公共底座(utils/indicator-change.js + IndicatorDegrade/IndicatorIncompleteBanner 组件 + 趋势图)",
  471. "priority": "P0",
  472. "module": "cfc-frontend",
  473. "instance": "lan-204 / ses_e872b36b3ffeIM55oXGHWB3aig / feat/indicator-timeline-t03",
  474. "status": "done",
  475. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  476. "prompt": "设计文档 §2800-2831。依赖 T01(只依赖接口契约)。可与 T02 并行(后端 java vs 前端 vue,无文件冲突)。要点:后端下发 trendCode+chartMode,前端禁止自行按 delta 正负推好坏;残缺横幅组件化;sparkline 禁 canvas 用 view 点阵(已挪 P1-2)。 | 派发: lan-204 / ses_e872b36b3ffeIM55oXGHWB3aig / feat/indicator-timeline-t03(基线 feat/indicator-timeline-t01 @ 02892080d,模型 axonhub/deepseek)",
  477. "done_at": "2026-10-26 16:56",
  478. "branch": "feat/indicator-timeline-t03",
  479. "note": "会话 ses_e872b36b3ffeIM55oXGHWB3aig (lan-204, D://cfc) 10-26 16:54 完成,3 commits push 至 origin/feat/indicator-timeline-t03 = 3693d2392,5 项 AC 全部自验通过。"
  480. },
  481. {
  482. "id": "T04",
  483. "title": "指标多期展示·小程序页面改造 + 新建时间轴页(按 D12=B 裁定拆两段:先对照+趋势入口,后时间轴页)",
  484. "priority": "P0",
  485. "module": "cfc-frontend",
  486. "instance": "lan-189(Windows C://code//cfc)",
  487. "status": "done",
  488. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  489. "prompt": "设计文档 §2832-2928。依赖 T02+T03。D12 已裁定=B:第一段=报告详情页对照+趋势入口+bugfix+降级;第二段=新时间轴页。第二段须过三级验收门槛(L1≥85% ∧ L2≥90% ∧ L3 抽样)。只有 T04 按文件拆两次发版,后端只发一次。 | 判定=误派已中断:23:40 巡检 fill_slots 自动派发到 local-45278(本机主工作树 E://cfc,有他人未提交改动,有破坏风险),且依赖的 T02/T03 才刚开工。已 interrupt。依赖满足后改回 pending 再派。",
  490. "session_id": "ses_e850327a1ffe2ioKwfLAzUIaCS",
  491. "dispatched_at": "2026-10-27 09:11",
  492. "dispatched_to": "lan-189",
  493. "model": "axon/deepseek",
  494. "note": "2026-10-27 16:00 复核修订:第一段主体已由并发会话 1f2f9cd01 合入 origin/cfclub;lan-189 会话(ses_e850327a,09:11派发)全量验收 5 文件 + 修复 TrendChart chartRenderConfig 错误导入源(白板 bug),推送 feature/t04-segment1 = 9efb65396(+2/-1 单文件)。编译 391 文件 0 ERROR、反模式 0 ERROR。待办:① 9efb65396 独立核验后合 cfclub;② 第二段(report-detail.vue 改造 + L1/L2/L3 门槛)未派。⚠️ 08:58 并发流程曾把 T04 派到 local-45278(ses_e85227149),该会话实为 backfill 修复无关内容,勿混淆。",
  495. "done_at": "2026-10-27 16:49:35"
  496. },
  497. {
  498. "id": "T05",
  499. "title": "指标多期展示·P1+P2 收尾(体脂秤 G4 sourceId=recordId+upsertMapping 修第二次测量报错、管理端字典治理、sparkline 等)",
  500. "priority": "P1",
  501. "module": "fullstack",
  502. "instance": "lan-248 / ses_e8729178bffeX4QY3HnTLZ6sZf(23:40 巡检派发,已限定范围只做体脂秤 G4)",
  503. "status": "done",
  504. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  505. "prompt": "设计文档 §T05。体脂秤 BodyFatScaleService:253-264 用 insert 撞唯一键→第二次测量整体报错,必须改 sourceId=recordId + upsertMapping。管理端:cfc-web/src/views/admin/indicators/index.vue 默认 status=1 + 待审核 tab + 批量启用/丢弃(T05-5c)。 | 判定=巡检误派但保留(限范围):体脂秤 G4 是独立真 bug(第二次测量整体报错)且不依赖 T02/T03,保留执行;管理端字典治理(IndicatorService.listDefinitions status=1 / admin indicators 页)与 T02 文件重叠,已指令其跳过。",
  506. "session_id": "ses_e8729178bffeX4QY3HnTLZ6sZf",
  507. "dispatched_at": "2026-10-26 23:31:52",
  508. "dispatched_to": "lan-248",
  509. "model": "axonhub/deepseek",
  510. "done_at": "2026-10-27 03:26:07"
  511. },
  512. {
  513. "id": "T28-FIX",
  514. "title": "T28 AC-09 P0 修复:food_recommend_idx 键语义对齐(memberId vs users.id)",
  515. "priority": "P0",
  516. "module": "backend",
  517. "instance": "",
  518. "status": "blocked",
  519. "spec": "docs/superpowers/plans/2026-10-25-food-overview-persistent-min.md",
  520. "prompt": "【T28 核验 P0 返工】独立核验报告(分支 origin/verify/t28-food-overview = 90798afd1,文件 docs/T28食材总览持久化核验报告.md)实锤:AC-09 不通过,T28 不可合入主流程。\n根因:报告确认链路把 family_members.id(memberId)写入 food_recommend_idx.user_id,而家庭总览按 family_members.user_id(users.id)关联,两条键不对齐 → 报告确认触发的总览重算链路完全失效(总览恒 0 行)。\n写侧:HealthReportService.resolveSubjectToMemberId(:1243-1279) 把 subjectId 归一到 family_members.id;HealthReportController(:2062/:2707) 传 confirmedSubjectId 进 recalculateForUser;FoodRecommendService(:127-135) index.setUserId(subjectId) 原样落库;refreshFamilyOverviews(:188-193) 按 family_members.user_id=memberId 反查 → 无行 → 家庭重算不触发。\n读侧:FamilyFoodOverviewService.doRecalculate(:116-156) 成员来源是 family_members.user_id,:154-156 IN(userIds) 批量查 food_recommend_idx → memberId 键行永不命中 → byFood 空 → 总览 0 行。\n⚠️ 本任务需先出方案经主理人裁决,两个方向(核验报告第三章已评估,尚未实施):\n 方向1(写侧统一):recalculateForUser 入库前把 subjectId 归一为成员 user_id 再写; refreshFamilyOverviews 用归一后 userId;历史 memberId 键行需一次性迁移。\n 方向2(读侧兼容):doRecalculate 查询键同时覆盖 user_id 与 family_members.id; refreshFamilyOverviews 反查双轨;总览 memberScores.userId 语义需明确。\n开工要求:① 先读规格与核验报告;② 明确采用哪个方向(若主理人已裁定按裁定执行,未裁定则只出方案文档并 blocked 回报,不要自行实施);③ 涉及历史数据迁移属不可逆操作,必须先回报主理人确认;④ 修复后必须复现核验报告 §三 的 v3 复现步骤(confirm → food_recommend_idx 键 → family_food_overview 行数)验证 AC-09 转通过;⑤ 补单测覆盖键对齐;⑥ 严禁在测试库执行任何 DELETE(核验报告 §四 两起误删事故的教训)。",
  521. "note": "2026-10-26 独立核验发现 AC-09 P0(键语义不对齐),需主理人裁决修复方向后才可开工。",
  522. "generated_at": "2026-10-26 23:30",
  523. "generated_from": "T28-V 独立核验报告 90798afd1"
  524. },
  525. {
  526. "id": "T29-B2",
  527. "title": "报告代传功能修复·第二批:权限越权与安全策略收敛",
  528. "priority": "P0",
  529. "module": "backend",
  530. "instance": "lan-189 / ses_e82f773fcffePaGYPNUK1muSHx / C:////code////cfc (axon/deepseek)",
  531. "status": "done",
  532. "spec": "docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md",
  533. "prompt": "见 out/t29_b2_security_prompt.txt(派发指令文件,自包含纪律++实现要点++验收清单+)。",
  534. "note": "origin/feature/proxy-fix-b2-security = 751145b9d(已 push 到 origin,2026-10-27 17:25 会话完成)。⚠️ 未合入 cfclub,需先派独立核验(已新增 T29-B2V)再合入。改动:B2-1 成员列表 familyId 行级隔离+删 ensureUserFamily 兜底 / B2-2 proxyParsePreview 显式 familyId 绑定校验 / B2-3 proxyConfirm 草稿归属与可确认者校验 / B2-4 FamilyAccessInterceptor 空有效家庭集拒绝(全局策略变更,含带 familyId 路由穷举清单)/ B2-5 proxy-parse+proxy-confirm 移入 LOGIN_REQUIRED_PATHS / B2-6 三层校验编排注释。",
  535. "generated_at": "2026-10-26 23:30",
  536. "generated_from": "T29 三批修复方案 164c9fbc5",
  537. "dispatched_at": "2026-10-27 19:07",
  538. "dispatched_to": "lan-189",
  539. "session_id": "ses_e82f773fcffePaGYPNUK1muSHx",
  540. "model": "axon/deepseek",
  541. "branch": "feature/proxy-fix-b2-security",
  542. "done_at": "2026-10-28 01:33:40"
  543. },
  544. {
  545. "id": "T29-B3",
  546. "title": "报告代传功能修复·第三批:健壮性与体验",
  547. "priority": "P1",
  548. "module": "fullstack",
  549. "instance": "",
  550. "status": "blocked",
  551. "spec": "docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md",
  552. "prompt": "【T29-B3】规格 docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md 的批次 B3(B3-1 ~ B3-6)。基线:origin/cfclub(须已含 T29-B1 与 T29-B2 合入)。分支 feature/proxy-fix-b3-robust。\n内容:① 配额不足/AI 解读失败的 toast 文案前端化;② 草稿过期降级(前端引导重传 + 基于 fileUrl 重新解析,复用 /report/upload + /report/parse 两阶段链路);③ LangGraph 失败本地兜底路径的提示文案(B1 已接 parseLocalFallback,本批补提示);④ teacher 端列表分页修复(/report/list 现只收 size 忽略 page;必须兼容小程序端现有调用,默认不传 page 时行为不变);⑤ 部署文档补 LANGGRAPH_BASE_URL 与 uploads 共享 volume 强制检查项;⑥ updateNote 重命名为 updateRemark 或加注释说明实际写 remark 列(同步所有调用点)。\n⚠️ 依赖 B2 先完成(B2 改了同一批接口)。",
  553. "note": "2026-10-26 23:30 加入。依赖 T29-B2 完成后才能开工。",
  554. "generated_at": "2026-10-26 23:30",
  555. "generated_from": "T29 三批修复方案 164c9fbc5"
  556. },
  557. {
  558. "id": "T29-B1V",
  559. "title": "T29-B1 独立核验:代传主链路打通与数据正确性验收",
  560. "priority": "P1",
  561. "module": "backend",
  562. "instance": "lan-189 / ses_e86e1c8b7ffeZRg1dQtAX0OWqf / C://code//cfc (axon/deepseek)",
  563. "status": "done",
  564. "spec": "docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md",
  565. "prompt": "【T29-B1V 独立核验】核验对象 origin/feature/proxy-fix-b1-core = 7680b21e7。规格 docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md 批次 B1(B1-1 ~ B1-6)。\n⛔ 只做核验不改业务代码;发现问题如实报告。允许写操作仅限切分支、跑构建/测试、造临时测试数据(用完必删)、在独立核验分支写核验报告。\n核验要点:\n① B1-1 proxy-parse 返回 draftId 非 null + payload + extractedName/extractedReportNumber/extractedReportDate;数据库草稿表新增 pending 行且 remark=note;LangGraph 不可用时本地兜底仍可解析;重点核 buildParseResultFromLg 是否补齐 extractedReportNumber/extractedReportDate(规格明确要求,原实现缺这两个 key)。\n② B1-2 代传确认后 health_reports.proxy_upload_note = 代传时填的 note(实测查库,不再 NULL)。\n③ B1-3 正式报告 remark = 草稿 remark(代传场景),非代传草稿 remark 为空时行为不变。\n④ B1-4 两个代传页详情弹窗显示报告ID/类型/编号/日期/总分/菌群分/肠型/肠道年龄/AI解读,不再全 '-'。\n⑤ B1-5 proxy-confirm 返回体含 aiAnalysis(成功)/ aiAnalysisStatus + aiAnalysisMessage(失败);后端日志不再吞掉 analyze 异常。注意:analyze 500 的生产复测不属代码范围,如实标注。\n⑥ B1-6 admin 列表标题/上传时间列有值;teacher 列表报告对象/代上传人列有真实姓名;确认 /report/list 分页结构未被改动(分页属 B3)。\n⑦ 附加:mvn -pl cfc-backend -am compile 通过;cfc-web 构建通过;检查是否引入 AGENTS.md 禁止项;新增 SQL 注入风险;测试数据清理确认(禁止按他表 id 列表做主键 DELETE)。\n回报格式:一行结论 + 逐条 B1 编号验收表(证据)+ 问题清单(按 P0/P1/P2)+ 清理确认。",
  566. "note": "核验完成,结论 CONDITIONAL PASS。报告 origin/feature/t29-b1v-verification = 608f18fbf(T29-B1V_VERIFICATION_REPORT.md,104 行)。通过:B1-1/B1-4/B1-6(admin)/B1-5 错误回传;构建全绿(后端 1948 sources、前端 build)。阻断(均非 B1 代码缺陷):V-01 P0 report_food_suitability.score NOT NULL 无默认 -> confirm 全链路 500;V-02 P0 LangGraph overview 无 report_date 键 -> extractedReportDate 恒 null。V-03/V-04/V-05 为既存技术债(本地兜底异常数值、列表 N+1、admin reportType 前端求值缺陷)。",
  567. "generated_at": "2026-10-26 23:30",
  568. "generated_from": "T29-B1 开发会话 ses_e8caa672dffekrokMchz49dL06",
  569. "done_at": "2026-10-26 19:34",
  570. "branch": "feature/t29-b1v-verification"
  571. },
  572. {
  573. "id": "T19-B",
  574. "title": "营养商品标注·B线:年龄分段 + UL 剂量安全校验(含修无效建表SQL+补迁移+修fail-open+接线+补参考数据)",
  575. "priority": "P2",
  576. "module": "fullstack",
  577. "instance": "",
  578. "status": "blocked",
  579. "spec": "docs/superpowers/specs/2026-10-27-nutrition-product-tagging-prd.md",
  580. "prompt": "❌ 整条延后(2026-10-27 廖总拍板)。阻塞原因:UL/月龄专业参考数据未就绪。已核实的现状(不要重复核查):① validateProductForAgeAndDosage()(L357-368) + validateDosageAgainstUlLimit()(L373-420) 已实现但全仓零调用方=死代码;② 该方法 fail-open:查不到UL就continue、无成分就return true,参考数据为空时恒等于全部通过=假安全,比不做更危险;③ UL 校验完全忽略年龄(按nutrientName查完get(0)取首行),但 nutrition_ul_limit 表有 age_min_months/age_max_months,儿童维生素A UL远低于成人;④ nutrition_age_dosage/nutrition_ul_limit 等7张表在 DatabaseInitializer 迁移数为0,且 application.yml 无 schema 自动初始化 → 大概率从未建成;⑤ nutrition_age_dosage 建表SQL无效(表体无 product_id 列却末尾写 INDEX idx_product(product_id),MySQL ERROR 1072,该表从来没能建成),且该表本就没有产品关联字段。 解阻塞条件:廖总已定「开发先用公开 DRIs 表填充初稿,待专业方审核」→ 数据初稿就绪且专业方审核通过后,才可做 B1(安全数据地基)→B2(接线)。"
  581. },
  582. {
  583. "id": "T19-C",
  584. "title": "合规整改:nutrition_product.efficacy_tags(补钙/补锌/益生菌)与 nutrition_age_dosage.purpose(功效说明)涉嫌保健功能宣称",
  585. "priority": "P2",
  586. "module": "fullstack",
  587. "instance": "",
  588. "status": "blocked",
  589. "spec": "docs/superpowers/specs/2026-10-27-nutrition-product-tagging-prd.md",
  590. "prompt": "2026-10-27 廖总拍板:暂不处理,仅记录风险。普通食品/商品在中国法规下不得宣称保健功能。本轮开发不碰、不扩容这两个字段;已录入内容由业务方自查,必要时另立整改项。风险已在 PRD §7 标红线。另注:B 线产出禁止出现「安全」「可放心服用」「不会过量」等保证性表述(一旦给出保证,法律责任落到平台)。"
  591. },
  592. {
  593. "id": "T29-B1FIX",
  594. "title": "代传前置缺陷修复(解锁 B2):V-01 food_suitability.score NOT NULL 兜底 + V-02 LangGraph report_date 提取",
  595. "priority": "P0",
  596. "module": "cfc-backend + cfc-langgraph",
  597. "status": "done",
  598. "spec": "docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md(核验报告 T29-B1V_VERIFICATION_REPORT.md 第4/7/8章)",
  599. "instance": "lan-204(Windows D://cfc)",
  600. "session_id": "ses_e836fd063ffexZzspMfea0TM5u",
  601. "dispatched_at": "2026-10-27 16:15",
  602. "dispatched_to": "lan-204",
  603. "model": "axonhub/deepseek",
  604. "branch": "feature/proxy-fix-vfix",
  605. "prompt": "见 out/t29_b1fix_vfix_prompt.txt。修复 B1V 实锤的两项 P0 既存缺陷:V-01(report_food_suitability.score NOT NULL 无默认,saveFoodSuitability 插 null → confirm 500,代码层 setScore 空值兜底 0,禁止改 DDL/迁移);V-02(cfc-langgraph pdf_parser parse_overview 正则+_CN_TO_EN_OVERVIEW 映射+REPORT_PARSE_GUT_TEMPLATE 补 report_date,PDF 无日期则保持 null 不造假)。基线 7680b21e7(B1 核心),完成后 push feature/proxy-fix-vfix,不推 cfclub。",
  606. "note": "2026-10-27 完成。产出 c1df0f17d(feature/proxy-fix-vfix,3 文件 +40/-2),已随 T29-B1 合并入 cfclub(4dc706188)。V-01 score 兜底 + V-02 report_date 提取实测生效。",
  607. "done_at": "2026-10-27 18:41"
  608. },
  609. {
  610. "id": "T04-S2",
  611. "title": "指标多期展示·第二段:report-detail.vue 改造(卡片头三档筛选 + 指标行四行形态 + 分组头较上次 + 合规话术 + pendingCount 提示条)+ L1/L2/L3 三级验收门槛",
  612. "priority": "P0",
  613. "module": "cfc-frontend",
  614. "status": "blocked",
  615. "spec": "docs/superpowers/specs/2026-10-25-indicator-timeline-display-design.md",
  616. "prompt": "规格 §2832-2930 T04 第二段。第一段已由 1f2f9cd01 合 cfclub + 9efb65396(feature/t04-segment1) 修复推行待核验。第二段 6 项改动 + 三级验收门槛(L1 报告级时序覆盖率≥85% ∧ L2 成员可用率≥90% ∧ L3 近6个月20份 gut_flora 抽样)未达标不得上线。验算 SQL 见规格 Q1/Q2/Q3。需先确认 backfill 数据到位再开派。",
  617. "note": "2026-10-27 从 T04 拆分承接第二段(T04 主体=第一段,已 done)。第二段硬门槛 L1/L2/L3;依赖 cfclub 已有 indicator_values 回填数据(backfill 相关会话 local-45278 ses_e85227149 曾处理 backfill 缺陷,勿混)。"
  618. },
  619. {
  620. "id": "T04-S2-GATE",
  621. "title": "指标多期展示·第二段门槛验算(L1报告级覆盖率≥85% ∧ L2成员可用率≥90% ∧ L3抽样20份):纯只读 SELECT",
  622. "priority": "P0",
  623. "module": "database-verify(只读)",
  624. "status": "done",
  625. "instance": "lan-189(Windows C://code//cfc)",
  626. "session_id": "ses_e8353bb5affegXXqIcCWUrLu9A",
  627. "dispatched_at": "2026-10-27 16:25",
  628. "dispatched_to": "lan-189",
  629. "model": "axon/deepseek",
  630. "branch": "verify/t04-s2-gate",
  631. "prompt": "见 out/t04_s2_gate_prompt.txt。跑规格 Q1/Q2/Q3 三条只读 SQL(测试库 192.168.16.251),输出 L1/L2/L3 数值与达标判定,不写库不改码。",
  632. "note": "2026-10-27 16:25 派发。判定 T04 第二段(report-detail.vue 改造)可否放行;硬门槛不达标则建议先补 backfill。",
  633. "done_at": "2026-10-27 18:04:57"
  634. },
  635. {
  636. "id": "COUPON-C2",
  637. "title": "优惠券 C2 恢复推送:死表清理(UserCoupon/CouponGrantLog 引用移除)+ used_count 漂移修复",
  638. "priority": "P1",
  639. "module": "cfc-backend",
  640. "instance": "lan-248(会话 ses_e827e5d0 已开发+核验 PASS,未 push)",
  641. "status": "done",
  642. "spec": "docs/优惠券需求设计与实现核查.md",
  643. "prompt": "【COUPON-C2】从 pub-iwintrue 实例恢复已完成的 C2 提交(be16b8eb3 删 UserCoupon.java/UserCouponMapper.java/AdminCouponController 引用 + 3379d4ad1 CouponService used_count 递减 +25行),提取为 patch → push 独立分支 → 派独立核验 → 合入 cfclub。⛔ 若 pub-iwintrue 本地提交已丢失(被 auto-bump 抢跑或仓库重置),则按 docs/优惠券需求设计与实现核查.md §五 C2 重新实现(确认无引用后移除死代码,表不 DROP;revert()/revokeFamilyPopulationCoupons() 还券收回时同步递减 coupon.used_count)。禁止按他表 id 列表做主键 DELETE。",
  644. "note": "origin/feature/coupon-c2 = b8ade0fab(已 push)。清理 UserCoupon/CouponGrantLog 死代码 + CouponService.used_count 还券/收回递减 +39 行。独立核验 ses_e82673d9 PASS(diff 恰 6 文件全在 cfc-backend/src/main)。⚠️ 未合入 cfclub,待合入。",
  645. "generated_at": "2026-10-27 21:06",
  646. "generated_from": "优惠券核查文档 §五 C2(2026-10-24 拍板)",
  647. "session_id": "ses_e81dc285affeWYCUbg9ksBCYSS",
  648. "dispatched_at": "2026-10-28 00:14:00",
  649. "dispatched_to": "lan-248",
  650. "model": "axonhub/deepseek",
  651. "done_at": "2026-10-28 01:19:20",
  652. "branch": "feature/coupon-c2"
  653. },
  654. {
  655. "id": "COUPON-C3",
  656. "title": "优惠券 C3 恢复推送:用户端独立「领券中心」页面(coupon-center.vue + pages.json 分包 + coupons.vue 空状态跳转)",
  657. "priority": "P1",
  658. "module": "cfc-frontend",
  659. "instance": "lan-204(会话 ses_e827e4ae 已开发,未 push)",
  660. "status": "done",
  661. "spec": "docs/优惠券需求设计与实现核查.md",
  662. "prompt": "【COUPON-C3】从 pub-iwintrue 实例恢复已完成的 C3 提交(3379d4ad1 建 coupon-center.vue+pages.json 分包 + 892a7e7c9 coupons.vue 空状态文案改跳转),提取为 patch → push 独立分支 → 派独立核验 → 合入 cfclub。⛔ 若 pub-iwintrue 本地提交已丢失,则按 docs/优惠券需求设计与实现核查.md §五 C3 重新实现(cfc-frontend 新建领券中心页,pages.json 注册,调 /api/coupon/list 拉可取券 + /api/coupon/claim 领取;coupons.vue:55 空状态文案改为跳转真实页面)。",
  663. "note": "origin/feature/coupon-center-c3 = 30bb2255d7(已 push)。新建 cfc-frontend/pages/coupon/coupon-center.vue 领券中心 + pages.json 分包注册 + coupons.vue 空状态文案跳转。⚠️ 未合入 cfclub,待核验+合入。",
  664. "generated_at": "2026-10-27 21:06",
  665. "generated_from": "优惠券核查文档 §五 C3(2026-10-24 拍板)",
  666. "session_id": "ses_e81dc1fbdffevCE0ya8MDDSYwT",
  667. "dispatched_at": "2026-10-28 00:14:04",
  668. "dispatched_to": "lan-204",
  669. "model": "axonhub/deepseek",
  670. "done_at": "2026-10-27 22:45:41",
  671. "branch": "feature/coupon-center-c3"
  672. },
  673. {
  674. "id": "COUPON-REG",
  675. "title": "优惠券注册发券缺失:UserService.register* 无发券钩子,「新用户专享10元券」模板无触发",
  676. "priority": "P1",
  677. "module": "cfc-backend",
  678. "instance": "",
  679. "status": "done",
  680. "spec": "docs/优惠券需求设计与实现核查.md",
  681. "prompt": "【COUPON-REG】优惠券注册发券缺失(核查报告 §3.1/§四 主要缺口③/§五注):UserService.register* 无任何发券钩子;「新用户专享10元券」模板存在但无触发。目标:注册成功(或绑定家庭)后按模板自动发券到家庭维度(family_coupon),走现有 issueToFamily/grantFamily 链路,防重复靠 family_coupon_grant_log 唯一键。⛔ 先看 2026-08-31 家庭维度方案确认发券口径,再动手;禁止新建表。",
  682. "note": "2026-10-27 22:4x 收口:并发会话 ses_e827e7ac(local-45278)已实现并合入 cfclub(commit 055f6da25,8 文件 +84/-6)。按 grant_type=REGISTER 模板发家庭维度券,触发点注册/绑定家庭,@Lazy 规避循环依赖,无 DDL 无新表。远端 28 条任务池未含本条目,本机补录后即收口。",
  683. "generated_at": "2026-10-27 21:06",
  684. "generated_from": "优惠券核查文档 §五注(观察项转正式)",
  685. "session_id": "ses_e827e7ac7ffeMuOceXYSDCw0AN",
  686. "dispatched_at": "2026-10-27 21:16:43",
  687. "dispatched_to": "local-45278",
  688. "model": "axonhub/deepseek",
  689. "done_at": "2026-10-27 23:08",
  690. "branch": "cfclub"
  691. },
  692. {
  693. "id": "COUPON-P2",
  694. "title": "优惠券 P2 技术债打包:后台搜索框失效/假分页 + 枚举标签不全/N+1 + 手写 role 鉴权 + DDL 不一致 + DISCOUNT 分位误差 + apply NPE",
  695. "priority": "P2",
  696. "module": "fullstack",
  697. "instance": "lan-248(会话 ses_e827e6d7 已开发,未 push)",
  698. "status": "done",
  699. "spec": "docs/优惠券需求设计与实现核查.md",
  700. "prompt": "【COUPON-P2】优惠券 P2 技术债打包(核查报告 §四 P2 各项):① AdminCouponController.list 忽略 keyword/page/size(搜索失效+假分页)→ 支持真实分页;② 用户端券类型/适用对象枚举映射不全(PERCENT/PRODUCT 显示原始值)+ CouponGrantLog 家庭名 N+1;③ 后台优惠券接口手写 if(!admin) 而非 @PreAuthorize;④ Coupon.java 缺 family_id 字段(schema.sql:2342 有列,实体未对齐);⑤ DISCOUNT 抵扣整数截断分位误差;⑥ apply:192 applicableTo null 时 NPE。逐项修,前端后端同步,禁止新建表。",
  701. "note": "origin/feature/coupon-p2-tech-debt = 59bc4100b(已 push)。13 文件:后台搜索框真分页 + 枚举标签 + 鉴权 + Coupon.java 补 family_id + DISCOUNT 分位精度 + apply NPE + spring-boot 测试依赖。⚠️ 未合入 cfclub,待核验+合入。与 C2 同改 AdminCouponController/CouponService,合入时需解冲突。",
  702. "generated_at": "2026-10-27 21:06",
  703. "generated_from": "优惠券核查文档 §四 P2 / §五注",
  704. "session_id": "ses_e81cb8e94ffeh9ikZz9pVsvnTv",
  705. "dispatched_at": "2026-10-28 00:32:08",
  706. "dispatched_to": "lan-248",
  707. "model": "axonhub/deepseek",
  708. "done_at": "2026-10-28 02:06:30",
  709. "branch": "feature/coupon-p2-tech-debt"
  710. },
  711. {
  712. "id": "T29-B2V",
  713. "title": "T29-B2 独立核验:权限越权与安全策略收敛验收(B2-1~B2-6 + 路由穷举清单)",
  714. "priority": "P1",
  715. "module": "backend",
  716. "instance": "",
  717. "status": "dispatched",
  718. "spec": "docs/superpowers/plans/2026-10-25-report-proxy-fix-plan.md(B2 章节 + 交付纪律)",
  719. "prompt": "【T29-B2V 独立核验】核验对象 origin/feature/proxy-fix-b2-security = 751145b9d(基线 origin/cfclub)。⛔ 只核验不改业务代码;允许写操作仅限切分支/跑构建测试/造临时测试数据(用完必删)/在独立核验分支写报告。核验要点:① B2-1 /api/family/member/list 支持 familyId + 行级隔离;确认 ensureUserFamily 静默建空家庭兜底已删除且不新建家庭行。② B2-2 proxyParsePreview 显式 familyId 绑定校验(未绑定 teacher 代传→明确错误)。③ B2-3 proxyConfirm 校验草稿 familyId 与 subjectId 归属一致 + 草稿仅创建者/admin 可确认。④ B2-4 FamilyAccessInterceptor 空有效家庭集拒绝:核对报告的带 familyId 路由穷举清单是否逐条给出结论、有无正常业务依赖旧放行行为(若依赖且会话擅自加白名单→P0 退回);复现路径(family_id NULL + teacher_family_ids 空 + familyId=2009)→ 403;不带 familyId 的既有正常请求回归抽查不误伤(报告列表/成员列表/任务等)。⑤ B2-5 无 token 调 proxy-parse → 401。⑥ B2-6 三层校验编排注释块存在且标明返回码。⑦ mvn -pl cfc-backend -am compile 通过;无 AGENTS.md 禁止项;无 SQL 注入;测试数据清理确认(禁止按他表 id 列表做主键 DELETE)。回报:一行结论 + 逐条 B2 编号验收表(证据)+ 问题清单(P0/P1/P2)+ 路由穷举结论表 + 清理确认。",
  720. "note": "2026-10-28 加入。T29-B2 开发完成已 push(751145b9d),核验通过后方可合入 cfclub,随后派 T29-B3。",
  721. "generated_at": "2026-10-28 09:43",
  722. "generated_from": "T29-B2 开发会话 ses_e82f773fcffePaGYPNUK1muSHx",
  723. "session_id": "ses_e7fca6b04ffeYxH60KvsfXV23h",
  724. "dispatched_at": "2026-10-28 09:52:38",
  725. "dispatched_to": "local-45278",
  726. "model": "axonhub/deepseek"
  727. },
  728. {
  729. "id": "T19",
  730. "title": "营养商品标注:Product 营养成分信息 + 管理端录入 + 小程序展示",
  731. "priority": "P2",
  732. "module": "fullstack",
  733. "instance": "",
  734. "status": "dispatched",
  735. "spec": "docs/superpowers/plans/2026-10-12-nutrition-product-tagging.md",
  736. "prompt": "实现计划 2026-10-12-nutrition-product-tagging.md:为商城商品补齐营养成分信息(热量/蛋白质/脂肪/碳水/膳食纤维等)与营养标签,支撑饮食推荐按营养学口径排序。现状:Product 实体无营养字段(grep 无 protein/calorie 等字段),Food 实体有 nutritionTags 与营养成分(AdminFoodController 已透出)但商品侧缺失。本任务:①Product 表迁移新增 nutrition 相关列(如 calories_kcal/protein_g/fat_g/carb_g/fiber_g + nutrition_tags JSON 或复用字符串逗号分隔),同步 schema.sql 与 DatabaseInitializer 幂等迁移;②管理端 ProductEdit.vue 加营养成分表单区块(可空,保存 NULL);③小程序 product-detail.vue 展示营养成分表(无数据隐藏区块),推荐接口可按标签过滤;④商品-营养同步:如 dan 商城已有营养数据可复用则做映射导入。落点:cfc-backend schema.sql/DatabaseInitializer + Product 实体/DTO + AdminProductController 保存链路;cfc-web/src/views/admin/ProductEdit.vue;cfc-frontend/pages/discover-detail/product-detail/product-detail.vue。验收要点:mvn clean compile 通过;迁移幂等可重复执行;管理端可保存/回显营养成分;小程序无值不显示、有值正确展示;新增 2-3 个单测(DTO 映射/默认值)。",
  737. "session_id": "ses_e91745133ffebXvnPFXhnF7SBM",
  738. "dispatched_at": "2026-10-24 23:33:31",
  739. "dispatched_to": "local-45278",
  740. "model": "axonhub/deepseek",
  741. "note": " [2026-10-28 同步保留:本机已拆分为 T19-A,T19-B,T19-C]"
  742. }
  743. ]