Просмотр исходного кода

docs(contract): EVD-9 孩子端 26 SC + EVD-12R2 商品服务商域 6 SC 契约核对合入(API_REFERENCE 增补 4.61/4.62 + 2 specs)

Agnes Agent 5 дней назад
Родитель
Сommit
28d918fb80

+ 296 - 0
docs/superpowers/api/API_REFERENCE.md

@@ -2994,3 +2994,299 @@ W0.2 双配置中心合并:`product_config` 已并入 `service_config`(唯
 | SC-A-21 | 舌诊/情绪模型管理 | `POST /api/admin/innate-portrait-config/{list,update,invalidate}` + `POST /api/mind/emotion/{analyze,analyze-url}` 存在;舌诊模型无独立 admin 端点(内联报告解析链) | 端点载体部分存在,需产品侧确认 |
 
 *文档更新:2026-11-07(EVD-11 平台运营 25 SC 契约核对增补「平台运营能力」段落 4.60:管理端登录 / 统计 / 报告解析中台 / 文章审核 / 勋章 / 供应商 / 活动 / 知识库 / 维度 / 迁移 / 用户家庭治理 / 订单退款 / 审核队列 / 审计日志 / 优惠券 / 能量配置 / 睡眠选项 + 契约缺口。完整核验表见 `docs/superpowers/specs/2026-11-07-admin-ops-contract.md`)*
+## 4.61 孩子端(不能登录用户视角)接口(EVD-9 契约核对,2026-11-07)
+> 来源:EVD-9 孩子端 26 SC 契约核对,依据开工包 `docs/tdd/orchestration/child-zone-kickoff-20261107.md`(26 SC,6 个 ⚠ 待核实项已全部实测关闭)。
+> 本节端点由 `cfc-backend` 源码全量提取(1935 个 `@PostMapping`)后逐条比对得出;场景口径另参 `tests/user-scenarios/应用场景总览.md` § 四。
+> 完整核验表 / 能力键建议 / 缺口清单见 `docs/superpowers/specs/2026-11-07-child-zone-contract.md`。
+> 开工包候选载体与实测不一致的 6 处(C-07/C-08/C-12/C-14/C-22/C-24)在下方按实测路径登记。
+> 覆盖 SC-C-01 ~ SC-C-26。统一 `@PostMapping`、响应 `Result<T>`、JWT 鉴权(`JwtInterceptor` 拦 `/api/**`)。
+> **"不能登录用户"没有自己的 JWT**:孩子端写操作都发生在家长会话下,通过 `memberId` / `currentMemberId` 指定被代管成员。
+### 4.61.1 身份与视角切换(SC-C-01 / SC-C-17 / SC-C-18)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/auth/silent-login` | `{code}`(WechatLoginDTO) | `LoginResultDTO`(`token`/`userId`/`role`/...) | 微信静默登录 |
+| `POST /api/auth/wechat-login` | `{code,...}`(WechatLoginDTO) | `LoginResultDTO` | 微信授权登录 |
+| `POST /api/auth/phone-login` | `{phone, code}` | `LoginResultDTO` | 手机号验证码登录 |
+| `POST /api/auth/auto-login` | `{openid,...}` | `LoginResultDTO` | 自动登录 |
+| `POST /api/auth/verify` | 无 body,Header `Authorization: Bearer <token>` | `{userId, role}`;token 无效或用户不存在 → `401` | 会话校验(前端启动探活) |
+| `POST /api/family/member/switch` | `{memberId, source?}` | `SwitchMemberVO{memberId, source, effectiveRole, nickname, isSwitchable}` | **现行切视角端点**:家长切到孩子视角(孩子端入口) |
+| `POST /api/family/user/switch-back-verify` | `{password}` | `Boolean` | 密码校验后切回家长视角 |
+| `POST /api/family/user/switch-to-child` | `{memberId}` | **`410`** | **已废弃**,返回"请使用 /api/family/member/switch" |
+| `POST /api/family/user/switch-back-to-parent` | 无 | **`410`** | **已废弃**,同上 |
+| `POST /api/family/invite/check-family` | 无 | 家庭绑定状态 | 账号是否已绑定家庭 |
+| `POST /api/family/invite/validate` | `{token}` | 校验结果 | 家庭邀请令牌校验 |
+| `POST /api/family/invite/validate-family-code` | `{inviteCode}` | 校验结果 | 家庭邀请码校验 |
+> **缺口**:无 `logout` 端点(JWT 无状态,退出=前端清 token,G-03);无任何设备维度(无 deviceId/设备表/异常设备二次验证,G-04)。
+> **路径缺陷**:前端 `utils/api.js` 仍调 `/api/user/switch-to-child`、`/api/user/switch-back-to-parent`、`/api/user/switch-mode`、`/api/user/roles`、`/api/user/switch-role`,这些 `/api/user/*` 在 `UserController` 中**无映射(404)**(G-08)。
+### 4.61.2 任务 / 打卡 / 方案进度(SC-C-02 / C-05 / C-08 / C-14)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/tasks/today` | `{memberId?, dimensionCode?, category?}` | `Task[]` | 今日任务 |
+| `POST /api/tasks/my-pending` | `{memberId?}` | `Task[]` | 待接受任务 |
+| `POST /api/tasks/accept` | `{taskId, memberId}` | `Boolean` | **⚠ 参数绑定错误**:后端 `@PathVariable Long id` 但路径无 `{id}` → 必抛 `MissingPathVariableException`(G-12) |
+| `POST /api/tasks/reject/{id}` | `{memberId?}` | `Boolean` | 孩子拒接任务 |
+| `POST /api/tasks/{id}/start` | `{memberId?}` | `Boolean`/Task | 开始任务 |
+| `POST /api/tasks/{id}/complete` | `CompleteTaskDTO{memberId?, photoUrl, content, contentType}` | `Map`(奖励/状态) | 打卡提交 |
+| `POST /api/tasks/{id}/complete-minigame` | `{memberId?, completionTime?, score?}` | `Map` | 以小游戏结果完成任务 |
+| `POST /api/tasks/{id}/review` | `{approved? , result?, reason?}` | `Boolean` | 家长审核;`approved=false` → `status` 回 `pending`,孩子可重做(C-14) |
+| `POST /api/tasks/history` | `{memberId?, page, size}` | `Page<Task>` | 任务历史 |
+| `POST /api/daily/checkin/create` | `DailyHealthCheckin`(饮食/运动/睡眠/饮水/心情) | 记录 | 通用每日打卡 |
+| `POST /api/daily/checkin/list` | `{memberId?, date?}` | `DailyHealthCheckin[]` | 打卡列表 |
+| `POST /api/health/plan/list` | `{memberId?, page, size}` | `Page<HealthPlan>` | 成长方案列表 |
+| `POST /api/health/plan/detail` | `{planId}` | `HealthPlan` | 方案详情 |
+| `POST /api/health/plan/tasks` | `{planId}` | `Task[]` | 方案任务与进度(含 `plan.getFamilyId()` 归属校验) |
+| `POST /api/growth-task/list` | `{type?, dimension?}` | `GrowthTask[]` | 成长任务(今日/周期) |
+| `POST /api/growth-task/claim` | `{taskId?}` | `String` | 领取成长任务(奖励在完成时自动发放) |
+### 4.61.3 小游戏与五维能量(SC-C-03 / C-24 / C-25)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/mini-game/list` | `{}`(`familyId` 取自会话) | `MiniGame[]` | 启用的小游戏 |
+| `POST /api/mini-game/complete` | `CompleteGameDTO{memberId, gameCode, completionTime, score}` | `{pointsEarned, ...}` | 成绩上报:加积分 + 写流水 + 写 `game_record` + 能量 |
+| `POST /api/game/record` | `{memberId, gameCode, score, completionTime, difficulty?, pointsEarned?}` | `Map` | 直接写游戏记录(`pointsEarned` 由客户端传入,**存在刷分风险**) |
+| `POST /api/game/history` / `/best` / `/stats` / `/leaderboard` | `{memberId, gameCode?, page?, size?}` | 记录/最高分/统计/排行榜 | 游戏数据查询 |
+| `POST /api/energy/sandbox` | `{view: "personal"|"family", memberId?}` | `{locked, view, personalData, familyData, familyUnlocked, familyGate?}` | 五维能量(个人+全家一次返回);需先过 `SELF_CHECK` 关卡,未过返回 `locked=true` |
+| `POST /api/energy/overview` | `{memberId?}` | `Map`(五维分值/变化) | 五维概览 |
+| `POST /api/energy/logs` | `{memberId?, dimensionCode?, page?, size?}` | `Page<EnergyLog>` | 能量流水 |
+| `POST /api/energy/score-history` | `{memberId?, dimensionCode?, page?, size?}` | `Page`(历史快照) | 分值历史 |
+> **缺口**:`/api/mini-game/complete` 无幂等、`score` 无上限(`score=999999` 可换巨额积分并污染 Redis 排行榜,G-09);`/api/game/record` 的 `pointsEarned` 由前端决定。
+> 能量写入只落 `energy_balance` + `energy_log`,**不写 `five_dimension_score` 快照**;`overview`/`logs` 未校验 `memberId` 归属(跨家庭可读,G-10)。
+### 4.61.4 勋章(SC-C-09 / C-10)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/badges/list` | 无 | `Badge[]` | 启用勋章定义(勋章墙底图) |
+| `POST /api/badges/member/list` | `{memberId}` | `[{memberBadge, badge}]` | 成员已得勋章(收藏优先、获得时间倒序) |
+| `POST /api/badges/statistics/member` | `{memberId}` | 统计(已得数/分类等) | 勋章统计 |
+| `POST /api/badges/ranking/family` | 无(`familyId` 取自会话) | 家庭排行 | 成员勋章排行 |
+| `POST /api/badges/detail` | `{id}` | `Badge` | 勋章详情(达成条件) |
+| `POST /api/badges/favorite` | `{memberId, badgeId}` | `Boolean` | 收藏/取消收藏 |
+| `POST /api/badges/grant` | `{memberId?, badgeId}` | `String` | 授予勋章(管理端/家长);**不写通知** |
+> **缺口**:`BadgeService.grantBadge` 只写 `member_badges`,无 `user_notification`、无推送 → C-10「解锁提醒」未实现(G-01);
+> 无"任务/打卡自动聚合授予"逻辑(场景要求"勋章来自任务/打卡聚合")。判重已满足(重复授予直接 return)。
+### 4.61.5 报告与成长档案(SC-C-06 / C-07 / C-11 / C-20)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/health/report/list` | `{memberId?, reportType?, page, size}` | `Page` | 健康报告列表(详见 4.59.2) |
+| `POST /api/health/report/latest` | `{memberId?, reportType?}` | 最新报告 | 最新报告 |
+| `POST /api/health/report/detail` | `{id}` | 报告详情 | 详情(含 `member-permission` 校验) |
+| `POST /api/dan-report/list` | `{memberId?, page, size}` | `Page` | DAN 测评报告列表(详见 4.59.5.1) |
+| `POST /api/dan-report/{id}` | 路径参数 | 报告详情 | 详情(`canViewMemberReports` 校验) |
+| `POST /api/dan-report/compare` | `{memberId, id1, id2}` | 对比结果 | 两版对比 |
+| `POST /api/growth/record/list` | 无(取 `userId`) | `GrowthRecord[]` | 本人成长档案 |
+| `POST /api/growth/record/child/{memberId}` | 路径参数 | `GrowthRecord[]` | 指定成员档案(**⚠ 无归属校验**,G-11) |
+| `POST /api/growth/record/child-records` | body 为裸 `Long memberId` | `GrowthRecord[]` | 同上(带 `currentMemberId` 缺省逻辑) |
+| `POST /api/growth/record/{id}` | 路径参数 | `GrowthRecord` | 记录详情(**⚠ 无归属校验**,G-11) |
+| `POST /api/user/data-export` | 无 | `Map`(`userInfo`/`children`/`assessmentResults`/`healthReports`/`tasks`) | **仅导出登录用户本人**;无 `memberId` 入参 → 无"家长代导出孩子"(G-05) |
+### 4.61.6 商城 / 心愿 / 积分(SC-C-04 / C-22)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/wishes/create` | `CreateWishDTO{title, description?, category?, imageUrl?, linkUrl?, estimatedPrice?, memberId?, pointsRequired?}` | `Long`(心愿 id) | 提心愿 |
+| `POST /api/wishes/list` | `{memberId?, status?, page?, size?}` | `Wish[]` | 心愿列表 |
+| `POST /api/wishes/{id}` | 路径参数 | `Wish` | 心愿详情 |
+| `POST /api/wishes/{id}/cancel` | 路径参数 | `Boolean` | 撤销心愿 |
+| `POST /api/wishes/pending` | 无 | `Wish[]` | 家长待审批 |
+| `POST /api/wishes/{id}/price` | `{pointsRequired}` | `Boolean` | 家长定价 |
+| `POST /api/wishes/{id}/approve-exchange` | `{approved}` | `Boolean` | 审批兑换 |
+| `POST /api/wishes/{id}/reject` | `{reason}` | `Boolean` | 驳回(驳回后不可兑) |
+| `POST /api/wishes/{id}/fulfill` / `/{id}/confirm` / `/{id}/exchange` | 路径参数 | `Boolean` | 兑现/确认/兑换 |
+| `POST /api/product/list` | `{page, size, domain?, keyword?}` | `Page<Product>` | 商城浏览 |
+| `POST /api/product/detail` | `{id}` | `Product` | 商品详情 |
+| `POST /api/points/exchange/product/list` | `{category?, pageNum?, pageSize?}` | `Page<PointsExchangeProduct>` | 积分兑换商品列表 |
+| `POST /api/points/exchange/product/detail` | `{id}` | `PointsExchangeProduct` | 兑换商品详情 |
+| `POST /api/points/exchange/submit` | `{productId, memberId, quantity?}` | `PointsExchangeRecord` | 提交兑换(积分不足/重复由 Service 拦截) |
+| `POST /api/points/exchange/records` | 无(取 `userId`) | `PointsExchangeRecord[]` | 兑换记录 |
+| `POST /api/points/exchange/stats` | 无(取 `userId`) | `{todayCount}` | 兑换统计 |
+| `POST /api/points/balance` | `{memberId?}` | `{balance, ...}` | 积分余额 |
+| `POST /api/points/logs` | `{memberId, page?, size?}` | `Page<PointsLog>` | 积分流水 |
+### 4.61.7 消息 / 反馈 / 资料(SC-C-15 / C-16 / C-19 / C-23)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/notification/list` | 无(取 `userId`) | `UserNotification[]`(未读优先,`LIMIT 100`) | 站内通知 |
+| `POST /api/notification/read` | `{id?}` / `{ids?}` / 空(全部已读) | `Boolean` | 标记已读 |
+| `POST /api/guide/messages/my` | 无(取 `userId`) | `TeacherMessage[]` | 规划师消息 |
+| `POST /api/guide/messages/unread-count` | 无 | `Long` | 未读数 |
+| `POST /api/user/info` / `/api/auth/info` / `/api/family/user/info` | 无(取 `userId`) | **完整 `User`**(仅 `password` 置空) | 个人资料(**无受限投影**,G-02) |
+| `POST /api/user/update` / `/api/family/user/update` | `UpdateUserDTO`/`User` | `Boolean` | 修改资料 |
+| `POST /api/health/feedback/submit` | 报告反馈 DTO | — | 报告反馈(**仅报告维度**) |
+| `POST /api/activity/feedback/submit` | 活动评价 DTO | — | 活动评价(**仅活动维度**) |
+| `POST /api/feedback/today` / `/read` / `/recent` | 无/`{id}`/`{limit?}` | 每日反馈 | **家长→孩子**方向,与"孩子提意见"相反 |
+> **缺口**:无通用"意见反馈"端点/表/管理端受理(G-06)。
+### 4.61.8 饮食 / AI / 舌诊情绪 / 睡眠(SC-C-12 / C-13 / C-21 / C-26)
+| 路径 | 请求 | 响应 `data` | 说明 |
+|------|------|-------------|------|
+| `POST /api/diet/recommendation/today` | `{date}`(**必填**,空→`Result.error("date不能为空")`) | 今日食谱 | 饮食推荐 |
+| `POST /api/diet/recommendation/generate` | `{date, ...}` | 食谱 | 生成/重新生成 |
+| `POST /api/diet/recommendation/complete` | `{date, ...}` | `Boolean` | 完成标记 |
+| `POST /api/health/meal/daily` / `/weekly` / `/list` | `{memberId?, date?}` | 餐次数据 | 餐次记录 |
+| `POST /api/ai/chat/send` | `{query, conversationId?}` | `Map`(`answer`/`conversationId`/...) | AI 对话(会员门禁 `checkGate`) |
+| `POST /api/ai/chat/conversations` / `/chat/messages` | `{conversationId?}` | 会话/消息列表 | 多轮上下文 |
+| `POST /api/health/report/upload-only` | `multipart(file, memberId?, type=tongue)` | `{type:"tongue", ...}` | 舌诊拍照上传 + 预览(含 `aiGateway.detectTongue` 自动识别分支) |
+| `POST /api/health/report/parse-preview` | `{recordId?, memberId?, type=tongue}` | 舌诊指标预览 | 解析预览 |
+| `POST /api/health/report/confirm` | `{recordId, subjectId/memberId, indicators, type=tongue}` | 入库结果 | 舌诊确认 |
+| `POST /api/health/report/discard` | `{recordId, type=tongue}` | `Boolean` | 放弃草稿 |
+| `POST /api/mind/emotion/analyze` / `/analyze-url` | 图片/URL | 情绪识别结果 | 情绪自拍识别 |
+| `POST /api/mind/checkin/create` / `/list` / `/latest` / `/trend` | 身心打卡 DTO | 记录/列表/趋势 | 情绪打卡记录 |
+| `POST /api/health/sleep/list` | `{memberId?}`(缺省 `currentMemberId`) | `HealthSleepRecord[]` | 睡眠记录 |
+| `POST /api/health/sleep/create` | `HealthSleepRecord{memberId?, sleepTime:"HH:mm", wakeTime:"HH:mm", durationMinutes?, qualityScore?, remark?, taskId?}` | `HealthSleepRecord` | 睡眠打卡(`taskId` 透传自动完成/累计任务) |
+| `POST /api/config/public/value` | `{key}` | `String` | 配置读取;睡眠标签应为 `key=sleep.quality.tags` |
+> **缺口**:`sleep_record` **无 `tags` 列**,标签被前端拼进 `remark` 文本;`/api/health/sleep/tags`、`/api/admin/sleep/tags` 均未实现;key 命名 `sleep.quality.tags`(需求/用例)与 `sleep.config.tags`(sc-key-map)不一致;`sleep-checkin.vue` 仍硬编码 8 项、无「正常」(G-07)。
+> AI 对话无适龄过滤入参;舌诊 confirm 需家长会话代传 `memberId`。
+### 4.61.9 契约缺口汇总(详见 `docs/superpowers/specs/2026-11-07-child-zone-contract.md` § 5)
+| ID | 关联 SC | 一句话 |
+|----|---------|--------|
+| G-01 | C-10 | 勋章解锁无通知/推送(`grantBadge` 不写 `user_notification`) |
+| G-02 | C-16 | 个人资料无受限投影(三处 info 返完整 `User`) |
+| G-03 | C-17 | 无服务端 `logout`(JWT 无状态) |
+| G-04 | C-18 | 无设备绑定/异常设备二次验证 |
+| G-05 | C-20 | 无"家长代导出指定成员";`exportUserData` 只认 `userId` |
+| G-06 | C-23 | 无通用意见反馈端点/表/管理端 |
+| G-07 | C-26 | 睡眠标签无 `tags` 列/无专用端点/无管理端/前端硬编码 |
+| G-08 | C-01/C-17 | 前端 `/api/user/switch-*` 无映射(404);旧 `/api/family/user/switch-to-child` 已 410 |
+| G-09 | C-02/C-03/C-24 | 小游戏上报无幂等、分数无上限、`pointsEarned` 前端可控 |
+| G-10 | C-06/C-24 | `energy/overview`、`energy/logs` 未校验 `memberId` 归属(可跨家庭读) |
+| G-11 | C-11/C-20 | `growth/record/child/{memberId}`、`/record/{id}` 无归属校验 |
+| G-12 | C-02 | `/api/tasks/accept` 的 `@PathVariable id` 与路径不匹配 → 调用必失败 |
+> 统计:**26/26 有承载端点**;场景完整闭环 **19/26**;场景级缺口 **7**(C-10/C-16/C-17/C-18/C-20/C-23/C-26);跨切面缺陷 **5**(G-08 ~ G-12)。
+*文档更新:2026-11-07(EVD-9 孩子端 26 SC 契约核对:4.61.1 身份与视角切换;4.61.2 任务/打卡/方案进度;4.61.3 小游戏与五维能量;4.61.4 勋章;4.61.5 报告与成长档案;4.61.6 商城/心愿/积分;4.61.7 消息/反馈/资料;4.61.8 饮食/AI/舌诊情绪/睡眠;4.61.9 缺口汇总 G-01~G-12)*
+### 4.62 商品服务商域(SC-S-01/05/07/08/10/11,EVD-12R2 契约核对增补)
+> 归属:契约补建计划 P0「商品服务商域」· 核对 2026-11-07(EVD-12R2)
+> 核对方法:类级 `@RequestMapping` + 方法级 `@PostMapping` 实测定位(防假 RED)。SC-S-02/03/04/06 由 EVD-4 商城-会员覆盖;SC-S-09 由 EVD-7R 报告闭环覆盖。
+> 完整核验表见 `docs/superpowers/specs/2026-11-07-service-provider-contract.md`。
+#### 4.62.1 服务商入驻申请(`SupplySystemController /api/admin/supply-system`,SC-S-01 `supplier.apply`)
+> ⚠ 载体置换:开工包候选 `AdminSupplierController /api/admin/supplier`、`EcomSupplierController /api/admin/ecom-supplier` 均标注「【已废弃】请使用 /api/admin/supply-system/list」,活跃载体为 `SupplySystemController`。
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/supply-system/list` | 服务商体系分页(keyword/status/page/size) |
+| `POST /api/admin/supply-system/create` | 服务商体系建档(入驻申请提交) |
+| `POST /api/admin/supply-system/update` | 服务商体系更新 |
+| `POST /api/admin/supply-system/detail` | 服务商体系详情 |
+| `POST /api/admin/supply-system/toggle-status` | 启停审核(入驻审核动作) |
+| `POST /api/admin/supply-system/list-all` | 全量体系(下拉选择) |
+| `POST /api/admin/supply-system/my-system` | 当前用户所属体系 |
+| `POST /api/admin/supply-system/my-teams` | 一人多团队(顶部切换器) |
+| `POST /api/admin/supply-system/member/list` | 体系成员列表 |
+| `POST /api/admin/supply-system/member/add` | 添加体系成员 |
+| `POST /api/admin/supply-system/member/remove` | 移除体系成员 |
+| `POST /api/admin/supply-system/member/change-role` | 成员角色变更 |
+> 边界:体系层级/团队治理(`SupplyManageController /api/admin/supply-manage`:list/detail/create/update/delete/add-role/remove-role/adjust-tier)由 EVD-11 SC-A-06 覆盖,不重复登记。
+#### 4.62.2 库存管理(`AdminInventoryController /api/admin/inventory` + `SupplierProductController /api/admin/supplier/product`,SC-S-05 `supplier.inventory.manage`)
+**AdminInventoryController `/api/admin/inventory`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/inventory/inbound/create` | 入库单创建 |
+| `POST /api/admin/inventory/inbound/list` | 入库单列表 |
+| `POST /api/admin/inventory/inbound/detail` | 入库单详情 |
+| `POST /api/admin/inventory/inbound/confirm` | 入库确认 |
+| `POST /api/admin/inventory/inbound/cancel` | 入库取消 |
+| `POST /api/admin/inventory/outbound/create` | 出库单创建 |
+| `POST /api/admin/inventory/outbound/list` | 出库单列表 |
+| `POST /api/admin/inventory/transactions/list` | 库存流水列表 |
+| `POST /api/admin/inventory/counting/create` | 盘点单创建 |
+| `POST /api/admin/inventory/counting/confirm` | 盘点确认 |
+| `POST /api/admin/inventory/counting/list` | 盘点单列表 |
+| `POST /api/admin/inventory/alert/list` | 库存告警列表 |
+| `POST /api/admin/inventory/product/stock` | 商品库存查询 |
+| `POST /api/admin/inventory/combo/items` | 组合商品项 |
+| `POST /api/admin/inventory/combo/items/list` | 组合商品项列表 |
+**SupplierProductController `/api/admin/supplier/product`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/supplier/product/list` | 服务商商品列表 |
+| `POST /api/admin/supplier/product/create` | 服务商商品创建 |
+| `POST /api/admin/supplier/product/update` | 服务商商品更新 |
+| `POST /api/admin/supplier/product/detail` | 服务商商品详情 |
+| `POST /api/admin/supplier/product/delete` | 服务商商品删除 |
+| `POST /api/admin/supplier/product/shelve` | 服务商商品上/下架 |
+#### 4.62.3 营销活动报名(`ActivityController /api/activity` + `AdminActivityController /api/admin/activity` + `ActivityOrderController /api/activity/order`,SC-S-07 `supplier.activity.signup`)
+**ActivityController `/api/activity`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/activity/list` | 活动列表 |
+| `POST /api/activity/detail` | 活动详情 |
+| `POST /api/activity/create` | 活动创建 |
+| `POST /api/activity/update` | 活动更新 |
+| `POST /api/activity/publish` | 活动发布 |
+| `POST /api/activity/end` | 活动结束 |
+| `POST /api/activity/submit-review` | 提交审核 |
+| `POST /api/activity/register` | 活动报名 |
+| `POST /api/activity/cancel-registration` | 取消报名 |
+| `POST /api/activity/my-registrations` | 我的报名列表 |
+| `POST /api/activity/registration-roster` | 报名名单/核销 |
+| `POST /api/activity/checkin` | 活动签到 |
+| `POST /api/activity/checkin-review` | 签到审核 |
+**AdminActivityController `/api/admin/activity`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/activity/list` | 活动管理列表 |
+| `POST /api/admin/activity/review` | 审核 |
+| `POST /api/admin/activity/detail` | 详情 |
+| `POST /api/admin/activity/submit-review` | 提交审核 |
+| `POST /api/admin/activity/audit` | 审核动作 |
+| `POST /api/admin/activity/backfill-tags` | 标签回填 |
+| `POST /api/admin/activity/withdraw` | 撤回 |
+| `POST /api/admin/activity/re-draft` | 退回草稿 |
+**ActivityOrderController `/api/activity/order`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/activity/order/create` | 报名订单创建 |
+| `POST /api/activity/order/pay` | 报名订单支付 |
+| `POST /api/activity/order/handlePaymentSuccess` | 支付成功回调处理 |
+| `POST /api/activity/order/notify` | 支付通知 |
+| `POST /api/activity/order/status` | 订单状态查询 |
+#### 4.62.4 对账/结算(`AdminSettlementController /api/admin/dan-settlement` + `SupplySettlementController /api/admin/supply-settlement`,SC-S-08 `supplier.settlement.reconcile`)
+**AdminSettlementController `/api/admin/dan-settlement`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/dan-settlement/list` | DAN 结算列表 |
+| `POST /api/admin/dan-settlement/detail/{settlementId}` | DAN 结算详情 |
+| `POST /api/admin/dan-settlement/confirm/{settlementId}` | DAN 结算确认 |
+| `POST /api/admin/dan-settlement/stats` | DAN 结算统计 |
+**SupplySettlementController `/api/admin/supply-settlement`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/admin/supply-settlement/list` | 供货结算列表 |
+| `POST /api/admin/supply-settlement/detail` | 供货结算详情 |
+| `POST /api/admin/supply-settlement/detail-items` | 供货结算明细 |
+| `POST /api/admin/supply-settlement/create` | 供货结算创建 |
+| `POST /api/admin/supply-settlement/confirm` | 供货结算确认 |
+#### 4.62.5 营养/食谱数据供给(`NutritionProductController /api/nutrition/product` + `BeijingNutritionController /api/nutrition/beijing` + `UserNutritionProfileController /api/nutrition/profile`,SC-S-10 `supplier.nutrition.supply`)
+**NutritionProductController `/api/nutrition/product`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/nutrition/product/category/list` | 营养品分类列表 |
+| `POST /api/nutrition/product/brand/list` | 营养品品牌列表 |
+| `POST /api/nutrition/product/search` | 营养品搜索 |
+| `POST /api/nutrition/product/detail` | 营养品详情 |
+| `POST /api/nutrition/product/recommend` | 营养品推荐 |
+| `POST /api/nutrition/product/price-compare` | 营养品价格对比 |
+| `POST /api/nutrition/product/from-product` | 从商品转换 |
+**BeijingNutritionController `/api/nutrition/beijing`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/nutrition/beijing/bacteria/save` | 北京食谱菌群保存 |
+| `POST /api/nutrition/beijing/recommend` | 北京食谱推荐 |
+| `POST /api/nutrition/beijing/recommend/custom` | 北京食谱自定义推荐 |
+| `POST /api/nutrition/beijing/kb/query` | 食谱知识库查询 |
+| `POST /api/nutrition/beijing/kb/list` | 食谱知识库列表 |
+| `POST /api/nutrition/beijing/kb/info` | 食谱知识库详情 |
+| `POST /api/nutrition/beijing/analysis` | 食谱分析 |
+**UserNutritionProfileController `/api/nutrition/profile`**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/nutrition/profile/get` | 营养画像查询 |
+| `POST /api/nutrition/profile/save` | 营养画像保存 |
+#### 4.62.6 数据导出合规(`UserController /api/user` + `ReportMemberPermissionController /api/health/report/member-permission`,SC-S-11 `supplier.export.compliance`)
+**UserController `/api/user`(用户侧自助,个保法数据可携带权)**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/user/data-export` | 导出用户数据(`AccountCleanupService.exportUserData`) |
+| `POST /api/user/deactivate` | 注销账号(数据匿名化,`AccountCleanupService.deactivateAccount`) |
+**ReportMemberPermissionController `/api/health/report/member-permission`(授权使用约束)**
+| 路径 | 说明 |
+|------|------|
+| `POST /api/health/report/member-permission/list` | 报告授权列表 |
+| `POST /api/health/report/member-permission/members/{memberId}` | 指定成员的授权详情 |
+| `POST /api/health/report/member-permission/grant` | 授予报告查看权 |
+| `POST /api/health/report/member-permission/revoke` | 撤销报告查看权 |
+| `POST /api/health/report/member-permission/visible-members` | 可见成员列表 |
+> 边界:EVD-11 SC-A-19 的**运营工单处理**(账号注销/数据导出工单)无端点载体,属平台运营域需产品侧确认;本 SC 为用户侧自助能力。
+*文档更新:2026-11-07(EVD-12R2 商品服务商域 6 SC 契约核对增补「商品服务商域」段落 4.62:服务商入驻 / 库存管理 / 活动报名 / 对账结算 / 营养食谱数据供给 / 数据导出合规 + 边界归位说明。完整核验表见 `docs/superpowers/specs/2026-11-07-service-provider-contract.md`)*

+ 227 - 0
docs/superpowers/specs/2026-11-07-child-zone-contract.md

@@ -0,0 +1,227 @@
+# 孩子端(不能登录用户视角)契约核对 · 26 SC
+
+> 任务号:**EVD-9**(孩子端 26 SC 开工包契约核对)
+> 日期:2026-11-07
+> 基线:`origin/cfclub` @ `cd35657f6`(本次 rebase 后);端点比对在原工作树 `0828de991` 上完成,
+> `git diff 0828de991..cd35657f6 -- cfc-backend/src/main cfc-frontend cfc-web/src` 为空,源码口径一致
+> 核验方式:**开工包逐条比对 + 端点实测**(O-7 契约补建工作流),不写业务实现代码
+> 主要依据:`docs/tdd/orchestration/child-zone-kickoff-20261107.md`(26 SC 开工包,含 6 个 ⚠ 待核实项)
+> 辅助依据:`tests/user-scenarios/应用场景总览.md` § 四(场景目标/流程/边界/模块)、`sc-key-map.md`(能力键状态)
+
+---
+
+## 0. 开工包时序说明
+
+EVD-9 启动时,`docs/tdd/orchestration/child-zone-kickoff-20261107.md` 在 `origin/cfclub` 及全部远端分支中**尚不存在**
+(`git log --all -- "docs/tdd/orchestration/child*"` 为空、目录列举仅 6 个批次包)。
+随后主理人在 `802cbbce4`(研发负责人第 31 轮汇报)补推该开工包,本文件已按开工包**重新逐条复核**,
+下表「候选端点」列保留开工包原写法,「实测端点」列为本会话在源码中实际定位到的路径,两者不一致处标注 **纠偏**。
+
+> 环境偏差:任务要求 `E:/cfc` 为工作目录,本机只有 C 盘(`Get-PSDrive` 仅 C),实际使用隔离 worktree
+> `C:\code\cfc-child-zone-contract`(分支 `feature/child-zone-contract-evd9`,基于 `origin/cfclub` 新建,未合并主干)。
+
+---
+
+## 1. 结论摘要
+
+| 指标 | 结果 |
+|------|------|
+| SC 总数 | 26(SC-C-01 ~ SC-C-26) |
+| **有承载端点** | **26/26**(每个场景至少一个可调用的现有 `@PostMapping`) |
+| **场景完整闭环** | **19/26** |
+| **场景级实现缺口** | **7 个**(C-10 / C-16 / C-17 / C-18 / C-20 / C-23 / C-26) |
+| 开工包 ⚠ 待核实项 | **6 个**(C-03 / C-09 / C-10 / C-18 / C-20 / C-21)→ **已全部给出实测结论**(见 § 3) |
+| 开工包候选载体需纠偏 | **6 个**(C-07 / C-08 / C-12 / C-14 / C-22 / C-24,见 § 3.2) |
+| 跨切面缺陷(权限/幂等/路径/绑定) | **5 项**(G-08 ~ G-12) |
+
+统计口径:
+- "有承载端点"= 该 SC 至少一个端点经源码比对命中(不代表场景已满足);
+- "场景完整闭环"= 目标 + 正常流 + 边界都能被现有端点覆盖;
+- 缺口不代表 RED(O-7:非研发实现型 RED),只作契约登记,转测试侧按现状补用例或转实现任务。
+
+---
+
+## 2. 端点核验表(26/26 有承载端点)
+
+> 全部实测端点从 `cfc-backend/src/main/java/**/*Controller.java` 全量提取(1935 个 `@PostMapping`)后逐条比对,
+> 未做包路径假定。`{id}` / `{memberId}` 为 `@PathVariable`。
+
+| SC | 场景 | 开工包候选载体 | 实测端点(origin/cfclub) | 核验 |
+|----|------|----------------|---------------------------|------|
+| SC-C-01 | 孩子端登录(无家长入口) | `AuthController` `/api/auth/*`;`JwtInterceptor` 角色校验 | `POST /api/auth/silent-login`、`/wechat-login`、`/phone-login`、`/auto-login`、`/verify`;视角切换 **`POST /api/family/member/switch`**(`{memberId,source}` → `SwitchMemberVO`);`JwtInterceptor` 注入 `userId/role/familyId/currentMemberId` | ✅ |
+| SC-C-02 | 执行任务 / 小游戏得积分 | `TaskController` `/api/tasks/*`;`PointsController` `/api/points/*`;小游戏路由 | `POST /api/tasks/today`、`/my-pending`、`/{id}/start`、`/{id}/complete`、`/{id}/complete-minigame`;`POST /api/mini-game/list`、`/mini-game/complete`;`POST /api/points/balance`、`/points/logs` | ✅ |
+| SC-C-03 | 小游戏成绩上报 | 小游戏 Controller(`/api/game*`,⚠ 待核实实际前缀) | **实测双前缀**:`POST /api/mini-game/complete`(`CompleteGameDTO{memberId,gameCode,completionTime,score}`)+ `POST /api/game/record`;查询 `/api/game/history`、`/best`、`/stats`、`/leaderboard` | ✅ |
+| SC-C-04 | 提心愿 | `WishController` `/api/wishes/*` | `POST /api/wishes/create`(`CreateWishDTO`)、`/list`、`/{id}`、`/{id}/cancel`;家长侧 `/{id}/price`、`/{id}/approve-exchange`、`/{id}/reject`、`/{id}/fulfill`、`/{id}/confirm` | ✅ |
+| SC-C-05 | 任务打卡 ⭐ | `TaskController` 完成/打卡;`DailyTaskController` `/api/daily-task/*` | `POST /api/tasks/{id}/complete`(`CompleteTaskDTO{memberId?,photoUrl,content,contentType}`);`POST /api/daily/checkin/create`、`/list`;`POST /api/daily-task/overview` | ✅ |
+| SC-C-06 | 查看能量与报告(只读) | `EnergyController` `/api/energy/*`(overview/logs) | `POST /api/energy/overview`、`/logs`、`/score-history`、`/sandbox`(需过 `SELF_CHECK` 关卡);报告 `POST /api/health/report/list`、`/latest`、`/detail` | ✅ |
+| SC-C-07 | 查看 DAN 测评报告 | `DanAssessmentController` `/api/dan-assessment/*`;`/api/dan-assessment/result` | **纠偏**:`/api/dan-assessment/result`、`/api/dan-assessment/list` 均**不存在**。实测可用:`POST /api/dan-report/list`、`/dan-report/{id}`、`/dan-report/compare`;或 `POST /api/dan-assessment/my-results`、`/child-results`、`/report/child`、`/result/{id}` | ✅ |
+| SC-C-08 | 方案打卡进度 | `HealthPlanController` `/api/health/plan/*`;`GrowthPlanController` `/api/growth/plan/*` | `POST /api/health/plan/list`、`/detail`、`/tasks`(按 `planId`,含家庭归属校验);`POST /api/growth/plan/list`、`/growth/plan/{id}`、`/growth/plan/child/{memberId}`;`POST /api/daily/checkin/list` | ✅ |
+| SC-C-09 | 勋章墙 | 成就/勋章 Controller(`achievement.*`,⚠ 待核实前缀) | **实测无 `AchievementController`**,实际为 `BadgeController` `/api/badges/*`:`POST /api/badges/list`、`/member/list`、`/statistics/member`、`/ranking/family`、`/detail`、`/favorite` | ✅ |
+| SC-C-10 | 勋章解锁提醒 | 同上 + `NotificationController` `/api/notification/*` | 授予 `POST /api/badges/grant`;查询 `/api/badges/member/list`;通知 `POST /api/notification/list`、`/read` —— **但授予不等通知**(见 § 3.2) | ⚠ |
+| SC-C-11 | 成长记录查看(孩子视角) | `GrowthController` `/api/growth/*` | `POST /api/growth/record/list`(本人)、`/record/child/{memberId}`、`/record/child-records`、`/record/{id}` | ⚠ 权限 |
+| SC-C-12 | 饮食食谱查看 | `DietRecommendationController` `/api/diet/recommendation/*`、`/api/diet/meals/*` | **纠偏**:`/api/diet/meals/*` 只有 `config`、`config/save`(配置,不是食谱)。实测食谱:`POST /api/diet/recommendation/today|generate|complete` + `POST /api/health/meal/daily|weekly|list` | ✅ |
+| SC-C-13 | AI 对话(孩子视角) | `AIChatController` `/api/ai/*` | `POST /api/ai/chat/send`、`/chat/conversations`、`/chat/messages`;`POST /api/ai/health-coach/send`、`/health-coach/gate` | ✅ |
+| SC-C-14 | 任务驳回重做 | `TaskController` 审核/驳回;`ReviewController` `/api/review/*` | **纠偏**:`/api/review/*` 实测只有 `order`、`order/detail`、`order/status`(**订单评价**,非任务审核)。实测任务链:`POST /api/tasks/{id}/review`(`approved=false` → `status=pending`)+ `POST /api/tasks/{id}/complete` 重新提交;拒接 `POST /api/tasks/reject/{id}` | ✅ |
+| SC-C-15 | 消息接收 | `NotificationController` `/api/notification/*` | `POST /api/notification/list`(按 `userId`,未读优先,`LIMIT 100`)、`/read`;规划师消息 `POST /api/guide/messages/my` | ✅ |
+| SC-C-16 | 个人资料查看(受限) | `UserController` `/api/user/*`(只读字段白名单) | `POST /api/user/info`、`/api/auth/info`、`/api/family/user/info` —— **均返回完整 `User`,无字段白名单**(见 § 5 G-02) | ⚠ |
+| SC-C-17 | 退出登录 | `AuthController` 登出/token 失效 | **无 logout 端点**;`SecurityConfig` 显式 `logout().disable()`;仅 `POST /api/auth/verify` 校验 token | ⚠ |
+| SC-C-18 | 设备/账号绑定校验 | `AuthController` + 微信登录态校验(⚠ 待核实) | 实测**无设备维度**:`AuthController` 18 个端点均无 `deviceId`;等价物 `POST /api/auth/verify`、`/api/family/invite/check-family`、`/api/family/invite/validate`、`/api/family/user/switch-back-verify` | ⚠ |
+| SC-C-19 | 查看家人/规划师消息通知 | `NotificationController`;`GuideMessage` `/api/guide/messages/*` | `POST /api/notification/list`、`/read`;`POST /api/guide/messages/my`、`/unread-count` | ✅ |
+| SC-C-20 | 成长档案查看/家长代导出 | `GrowthController`;导出端点(⚠ 待核实) | 查看:`POST /api/growth/record/list`、`/record/child/{memberId}`、`/record/{id}`;导出:`POST /api/user/data-export`(**仅本人,无 memberId 入参**) | ⚠ |
+| SC-C-21 | 舌诊/情绪自拍采集(孩子端) | `EmotionCheckinController` `/api/mind/checkin/*`;舌诊采集端点(⚠ 待核实) | 情绪:`POST /api/mind/emotion/analyze`、`/analyze-url`、`/api/mind/checkin/emotion/recognize`、`/mind/checkin/create|list|latest`;舌诊:`POST /api/health/report/upload-only?type=tongue`、`/report/parse-preview?type=tongue`、`/report/confirm?type=tongue`、`/report/discard?type=tongue` | ✅ |
+| SC-C-22 | 商城浏览/积分兑换(孩子端消费) | `ProductController` `/api/product/*`;`/api/admin/product-ppoint`(ppoint 兑换) | **纠偏**:`/api/admin/product-ppoint/*` 是**管理端配置**,非孩子端兑换。实测:`POST /api/product/list`、`/product/detail`;`POST /api/points/exchange/product/list`、`/product/detail`、`/submit`、`/records`、`/stats`;`POST /api/points/balance`、`/logs` | ✅ |
+| SC-C-23 | 意见反馈(孩子端) | `ActivityFeedbackController` `/api/activity/feedback/*` | 实测 `/api/activity/feedback/submit` 为**活动评价**,`/api/feedback/*` 为**家长→孩子**每日反馈,`/api/health/feedback/submit` 为报告反馈 —— **均非通用意见反馈**(见 § 5 G-06) | ⚠ |
+| SC-C-24 | 小游戏/任务得分触发五维增长(仅自身可见) | `EnergyController` 行为计分链 + `AdminEnergyBehaviorConfigController` | **纠偏**:`/api/admin/energy-behavior/*` 是配置 CRUD,不是计分触发。实测触发链:`MiniGameService.completeGame` → `GameRecordService.saveRecord` → `EnergyService.awardEnergy(memberId,"game",...)`;查看 `POST /api/energy/overview|logs|score-history|sandbox` | ✅ |
+| SC-C-25 | 方案任务打卡触发五维增长 | `TaskController` 完成 → Energy 归因链 | `POST /api/tasks/{id}/complete` → `TaskService` 内 `energyService.awardEnergy(memberId,"task",...)`;`GrowthTaskService` 打卡 `awardEnergy(child,"growth_day",...)`;`POST /api/daily/checkin/create` | ✅ |
+| SC-C-26 | 睡眠打卡:「正常」选项且由后台配置驱动 | `sleep.config.tags`(YELLOW);`PublicConfigController` + 后台配置项 | 记录 `POST /api/health/sleep/list`、`/create`;配置读 `POST /api/config/public/value`(`key=sleep.quality.tags`);配置维护 `POST /api/admin/config/list`、`/update`(通用) | ⚠ |
+
+---
+
+## 3. 开工包 ⚠ 项实测结论(6 项,全部关闭)
+
+### 3.1 SC-C-03 小游戏成绩上报
+
+| 项 | 结论 |
+|----|------|
+| 实际前缀 | **两个**:`/api/mini-game/*`(`MiniGameController`)与 `/api/game/*`(`GameRecordController`) |
+| 上报入口 | `POST /api/mini-game/complete`(`CompleteGameDTO`);`POST /api/game/record`(裸 `Map`,可选 `difficulty`、`pointsEarned`) |
+| 落库 | `family_members.total_points`、`points_log`、`game_record`、Redis ZSet 排行榜 |
+| 异常分数拦截 | **缺失**:`calculatePoints` 仅分 `score<60` / `>=60` 两档,无上限;`score=999999` 可换巨额积分并直写排行榜 |
+| 幂等 | **缺失**:`completeGame` 每次调用都加分,无 `(memberId, gameCode, 时间窗)` 判重 |
+| 归属 | 有 `familyMemberMapper.selectById(memberId)` 存在性校验,但未校验 memberId 与当前会话/家庭关系 |
+
+### 3.2 SC-C-09 / SC-C-10 勋章
+
+| 项 | 结论 |
+|----|------|
+| 类名 | 无 `AchievementController`/`MedalController`,实际是 `BadgeController`(`/api/badges`) |
+| 勋章墙(C-09) | `/list`(启用定义)+ `/member/list`(已得,收藏优先+获得时间倒序)+ `/statistics/member` + `/ranking/family` + `/detail` + `/favorite` → **可支撑** |
+| 授予链路 | 仅 `POST /api/badges/grant`(人工);**无任务/打卡自动聚合授予** |
+| 判重 | `grantBadge` 先查 `(memberId,badgeId)`,存在即 return ✅ |
+| 解锁提醒(C-10) | **未实现**:`grantBadge` 只写 `member_badges`,不写 `user_notification`、无推送;`/api/notification/*` 只负责读 |
+| 结论 | C-09 墙成立;C-10 只完成"解锁","提醒/推送"缺失(G-01) |
+
+### 3.3 SC-C-18 绑定校验
+
+| 项 | 结论 |
+|----|------|
+| 场景要求 | "登录设备校验;异常设备二次验证"(模块 `AuthController`) |
+| 实测 | `AuthController` 全部端点无 `deviceId`/设备表/登录设备比对;`JwtInterceptor` 只校验 token 与用户存在性 |
+| 易混淆 | `/api/bind/*`=家庭-规划师绑定;`/api/family/invite/*`=家庭邀请绑定;`/api/health/report/proxy-parse` 的 `canProxyForFamily`=代传家庭校验。三者都**不是设备绑定** |
+| 结论 | 无端点承载,C-18 整条待实现(G-04);建议先由产品确认是"设备绑定"还是"账号绑定" |
+
+### 3.4 SC-C-20 导出
+
+| 项 | 结论 |
+|----|------|
+| 端点 | `POST /api/user/data-export`(需登录) |
+| 实现 | `AccountCleanupService.exportUserData(userId)`:`userInfo` / `children`(`family_members.user_id = userId`)/ `assessmentResults`(按 `familyMemberId = userId`,口径可疑)/ `healthReports` / `tasks` |
+| 代导出 | **不支持**:方法签名无 `memberId`,家长无法指定导出某个孩子;"未成年人导出受限、需家长代办"无落点(G-05) |
+
+### 3.5 SC-C-21 舌诊/情绪采集
+
+| 项 | 结论 |
+|----|------|
+| 舌诊 | `POST /api/health/report/upload-only?type=tongue`(建草稿+预览,含 `aiGateway.detectTongue` 自动识别分支)、`/report/parse-preview?type=tongue`、`/report/confirm?type=tongue`(需 `recordId`+`subjectId`)、`/report/discard?type=tongue` |
+| 情绪 | `POST /api/mind/emotion/analyze`、`/analyze-url`、`/api/mind/checkin/emotion/recognize`;记录 `/api/mind/checkin/create|list|latest|trend|stats|weekly-report` |
+| 边界 | 文件类型/大小白名单在 `upload-only`;"模糊/非照片拒绝"依赖识别服务返回,无显式错误码契约;"隐私标注"属前端文案 |
+| 结论 | 端点齐全,边界需测试侧用真实样本验证 |
+
+### 3.6 开工包结论偏差(载体纠偏 6 项)
+
+| SC | 开工包写法 | 实测结论 |
+|----|-----------|---------|
+| C-07 | `/api/dan-assessment/result` | 该路径不存在;用 `/api/dan-report/*` 或 `/api/dan-assessment/my-results`、`/result/{id}` |
+| C-08 | `/api/growth/plan/*`(通用) | 存在,但无 `/growth/plan/detail`,详情是 `/growth/plan/{id}`;主链路在 `/api/health/plan/*` |
+| C-12 | `/api/diet/meals/*` | 只有 `config`/`config/save`(配置),食谱数据在 `/api/diet/recommendation/*` + `/api/health/meal/*` |
+| C-14 | `ReviewController` `/api/review/*` | 那是**订单评价**;任务驳回重做在 `/api/tasks/{id}/review` |
+| C-22 | `/api/admin/product-ppoint` | 管理端配置;孩子端兑换在 `/api/points/exchange/*` |
+| C-24 | `AdminEnergyBehaviorConfigController` | 配置 CRUD;触发链是任务/游戏完成 → `EnergyService.awardEnergy` |
+
+---
+
+## 4. 建议能力键映射(按开工包 18 键,覆盖 26 SC)
+
+> 以下键取自开工包 `child-zone-kickoff-20261107.md`(权威建议),`sc-key-map.md` 中 26 条 SC-C 的能力键当前均为 `—`(C-26 关联 `sleep.config.tags`)。
+> 命名沿用 `child.*` 命名空间,与既有 `task.parent.*` / `energy.*` / `dimension.*` 不冲突。
+
+| SC | 建议能力键 | 说明 |
+|----|-----------|------|
+| SC-C-01 | `child.login` | 含家长代管切视角 `POST /api/family/member/switch` |
+| SC-C-02 | `child.task.execute` | 任务完成 + 小游戏完成 + 积分流水 |
+| SC-C-03 | `child.game.score` | 成绩上报(需补上限/幂等才可 GREEN) |
+| SC-C-04 | `child.wish.create` | 提心愿 + 撤销 |
+| SC-C-05 | `child.task.execute` | 方案任务打卡 |
+| SC-C-06 | `child.energy.view` | 五维能量只读(需补成员级可见性) |
+| SC-C-07 | `child.dan.report.view` | DAN 报告列表/详情/对比 |
+| SC-C-08 | `child.plan.progress` | 方案任务进度 |
+| SC-C-09 | `child.achievement.view` | 勋章墙 + 统计 + 家庭排行 |
+| SC-C-10 | `child.achievement.view` | 解锁提醒(提醒子能力待实现) |
+| SC-C-11 | `child.growth.view` | 成长记录只读(需补归属校验) |
+| SC-C-12 | `child.diet.view` | 今日食谱/餐次 |
+| SC-C-13 | `child.ai.chat` | AI 对话多轮(适龄过滤待补) |
+| SC-C-14 | `child.task.reject` | 驳回后重做再提交 |
+| SC-C-15 | `child.notification.view` | 站内消息接收/已读 |
+| SC-C-16 | `child.profile.view` | 受限资料投影(待实现) |
+| SC-C-17 | `child.login` | 退出登录(前端清 token,后端待定) |
+| SC-C-18 | `child.login` | 设备/账号绑定校验(待实现) |
+| SC-C-19 | `child.notification.view` | 家人/规划师通知 |
+| SC-C-20 | `child.growth.view` | 档案查看 + 家长代导出(待实现) |
+| SC-C-21 | `child.mind.capture` | 舌诊 + 情绪自拍采集 |
+| SC-C-22 | `child.shop.redeem` | 商城浏览 + 积分兑换 |
+| SC-C-23 | `child.feedback.submit` | 意见反馈(待实现) |
+| SC-C-24 | `child.energy.view` | 游戏得分 → 五维能量 |
+| SC-C-25 | `child.task.execute` | 方案打卡 → 五维能量 |
+| SC-C-26 | `child.sleep.checkin` | 关联既有状态机键 `sleep.config.tags`(别名 `sleep.quality.tags`,见 G-07) |
+
+---
+
+## 5. 实现缺口清单(回传为主,不在本任务修代码)
+
+> 类型:`场景缺口` = 该 SC 目标/边界无法被现有端点满足;`跨切面` = 影响多个 SC 的共性缺陷。
+> 证据列给出 `文件:行`,路径相对 `cfc-backend/src/main/java/com/etotem/cfc/`。
+
+| ID | 类型 | 关联 SC | 缺口描述 | 证据 | 建议 |
+|----|------|---------|----------|------|------|
+| G-01 | 场景缺口 | C-10 | 勋章解锁无通知、无推送;`grantBadge` 只写 `member_badges` | `service/BadgeService.java:76` | `grantBadge` 内写 `user_notification`(type=badge_unlock)+ 订阅消息;或新增 `/api/badges/unlock-notices` |
+| G-02 | 场景缺口 | C-16 | 个人资料无"受限"投影,三个 info 端点返回完整 `User`(仅密码置空) | `controller/UserController.java:80`、`controller/auth/AuthController.java:186`、`controller/family/FamilyUserController.java:47` | 增加 `memberType=local`/`role=child` 的字段裁剪 VO(隐藏 `idCard`/`phone`/`realName`/`openid`) |
+| G-03 | 场景缺口 | C-17 | 无服务端 logout;JWT 无状态 | 全库无 `/logout` 映射;`config/SecurityConfig.java:35` `logout().disable()` | 若需强制下线:加 token 黑名单/版本号;否则在契约中明确"退出=客户端清除" |
+| G-04 | 场景缺口 | C-18 | 无设备绑定/异常设备二次验证 | `controller/auth/AuthController.java`(18 个端点均无设备参数) | 新增 `device_bind` 表 + `/api/auth/device/verify`;或由产品确认该 SC 降级为"账号绑定校验" |
+| G-05 | 场景缺口 | C-20 | 无"家长代导出指定成员";`exportUserData(userId)` 不接受 memberId | `service/AccountCleanupService.java`(`exportUserData`) | `/api/user/data-export` 增加可选 `memberId`(家长/管理员校验);顺手修 `assessmentResults` 查询口径 |
+| G-06 | 场景缺口 | C-23 | 无通用意见反馈端点/表/管理端;现有反馈均为专用方向 | `controller/DailyFeedbackController.java:21`、`controller/ActivityFeedbackController.java:11`、`controller/HealthReportController.java:2660` | 新增 `user_feedback` 表 + `POST /api/user/feedback/submit`(避开 `/api/feedback` 前缀冲突)+ 管理端受理 |
+| G-07 | 场景缺口 | C-26 | ①`sleep_record` 无 `tags` 列,标签被前端 `buildRemark()` 拼进 `remark` TEXT;②`/api/health/sleep/tags` 未实现;③`/api/admin/sleep/tags` 未实现;④key 命名 `sleep.quality.tags`(需求/用例)vs `sleep.config.tags`(sc-key-map);⑤`sleep-checkin.vue` 硬编码 8 项、无「正常」、未拉配置 | `entity/HealthSleepRecord.java`(无 tags)、`resources/schema.sql`(`sleep_record` 无 tags 列)、`controller/HealthSleepController.java`(仅 list/create)、`pages/growth/sleep-checkin.vue:188,405` | 迁移新增 `sleep_record.tags`;统一 key 为 `sleep.quality.tags` 并在 sc-key-map 加别名;补 `/api/health/sleep/tags`(默认 9 项含「正常」);前端拉配置 + 提交 `tags` 数组;补管理端页面 |
+| G-08 | 跨切面 | C-01/C-17 | 前端路径与后端不一致:①`/api/user/switch-to-child`、`/switch-back-to-parent`、`/switch-mode`、`/roles`、`/switch-role` 在 `UserController` **无映射(404)**;②旧 `/api/family/user/switch-*` 已 `@Deprecated` + **410**,现行只有 `/api/family/member/switch`;③`child/tasks.vue`、`child/rewards.vue` 仍调旧 `switchBackToParent()` | `cfc-frontend/utils/api.js:570-592`、`controller/family/FamilyUserController.java:123-136`、`controller/family/FamilyMembersController.java`(`/switch`) | 孩子端两页改调 `switchToFamilyMember(parentMemberId)`;`api.js` 删除废弃函数;`api.test.js:530-536` 同步改断言 |
+| G-09 | 跨切面 | C-02/C-03/C-24 | 小游戏上报无幂等、无分数上限;`/api/game/record` 的 `pointsEarned` 前端可控 | `service/MiniGameService.java`(`completeGame`/`calculatePoints`)、`service/GameRecordService.java`(`saveRecord`) | 加 `(memberId,gameCode,date)` 幂等键;`score` 限 0~100(或按游戏配置);`pointsEarned` 改服务端计算 |
+| G-10 | 跨切面 | C-06/C-24 | 能量读取无成员级/家庭级校验:`/api/energy/overview`、`/logs` 只校验"当前用户有 familyId",随后直接按传入 `memberId` 查 → 可跨家庭读;`/sandbox` 仅同家庭成员可互读 | `controller/EnergyController.java:156-200`、`controller/EnergyController.java:48-122` | overview/logs 校验 `memberId` 归属当前 familyId;sandbox 非家长/非本人返回 403 或裁剪 |
+| G-11 | 跨切面 | C-11/C-20 | `growth/record/child/{memberId}` 与 `/record/{id}` 无归属校验,任一登录用户可按 id 读取他人档案 | `controller/growth/GrowthRecordController.java:136` | 补 `familyId`/`currentMemberId` 归属校验(参考 `HealthPlanController /tasks`) |
+| G-12 | 跨切面 | C-02 | `/api/tasks/accept` 声明 `@PathVariable Long id` 但路径无 `{id}`;前端按 `{taskId, memberId}` 传 body → 必抛 `MissingPathVariableException` | `controller/task/TaskController.java:312-327`、`cfc-frontend/utils/api.js:840`、`cfc-frontend/pages/tasks/tasks.vue:664` | 改读 `@RequestBody.taskId`,或路径改 `/accept/{id}` 并同步前端 |
+
+---
+
+## 6. 转测试侧(O-7 节奏)
+
+1. 按 § 4 的 18 个 `child.*` 键登记 `sc-key-map.md`,**不要整批标 GREEN**:C-10/C-16/C-17/C-18/C-20/C-23/C-26 标 `YELLOW(契约缺口)`。
+2. 三类流用例优先覆盖"已闭环"的 19 个 SC;缺口 7 个先补"现状断言"(如 C-17 断言前端清 token、C-18 断言无设备端点)。
+3. **先修再跑**:G-08(路径 404)、G-12(accept 必失败)、G-09(幂等/上限)会直接导致 e2e 失败。
+4. 本文件与 `API_REFERENCE.md` 4.61 节同批合入后,再按 `--add-task` 入池。
+
+---
+
+## 7. 复现/核验命令
+
+```bash
+# 1) 端点全量提取(1935 个 @PostMapping 实际路径)
+Get-ChildItem -Recurse -Filter "*Controller.java" -Path cfc-backend/src/main/java |
+  ForEach-Object { Get-Content -Raw $_ | Select-String '@RequestMapping|@PostMapping' }
+
+# 2) 开工包 ⚠ 项定位
+git grep -n "@PostMapping(\"/complete\")" -- cfc-backend/src/main/java/com/etotem/cfc/controller/MiniGameController.java
+git grep -n "grantBadge" -- cfc-backend/src/main/java/com/etotem/cfc/service/BadgeService.java
+git grep -n "exportUserData" -- cfc-backend/src/main/java/com/etotem/cfc/service/AccountCleanupService.java
+git grep -n "switch-back-to-parent" -- cfc-frontend cfc-backend
+git grep -n "sleep.quality.tags" -- docs tests cfc-frontend cfc-backend
+```
+
+---
+
+*本文件由 EVD-9 契约核对会话产出;仅文档,不改业务源码、不新增 DB 迁移。*

+ 115 - 0
docs/superpowers/specs/2026-11-07-service-provider-contract.md

@@ -0,0 +1,115 @@
+# 商品服务商域批次 · 契约核对结论(6 SC · 防假 RED)
+
+> 归属:契约补建计划 P0「商品服务商域」· 核对时间 2026-11-07(EVD-12R2,重派)
+> 开工包:`docs/tdd/orchestration/service-provider-kickoff-20261107.md`(origin/cfclub @ 069628810)
+> 核对对象:origin/cfclub `cfc-backend` controller 源码(独立 worktree `feature/evd12r2-svc-contract`,HEAD = origin/cfclub)
+> 核对方法:类级 `@RequestMapping` + 方法级 `@PostMapping` 逐一比对(`grep -rn '@RequestMapping|@PostMapping' cfc-backend/src/main/java/com/etotem/cfc/controller/` 实测定位,**不假定包路径**),逐端点记录存在性;对字面路径缺失/废弃者定位活跃等价载体(防假 RED:契约声明的接口范围必须能在真实源码中找到实现,禁止仅凭开工包候选下结论)
+> 批次范围:SC-S-01 入驻申请 / SC-S-05 库存管理 / SC-S-07 营销活动报名 / SC-S-08 对账结算 / SC-S-10 营养食谱数据供给 / SC-S-11 数据导出合规。SC-S-02/03/04/06(商品/订单/核销/售后)由 EVD-4 商城-会员覆盖;SC-S-09(报告解析接入)由 EVD-7R 报告闭环覆盖。
+
+## 0. 结论摘要
+
+- **6 个 SC 全部存在可用 HTTP 端点载体(端点齐全,无缺口)**,其中 SC-S-01 存在**载体置换**(开工包候选类 `AdminSupplierController`/`EcomSupplierController` 已标注废弃,活跃载体为 `SupplySystemController /api/admin/supply-system`),SC-S-11 的 ⚠「授权语义待核实」已实测回填为 ✅。
+- **端点核对范围内无「假 RED」**:凡开工包候选端点,逐一在真实源码中定位;凡候选类废弃/缺失者,定位活跃等价载体并回填,不虚报存在。
+- 未新增 DB 迁移、未改动业务代码与测试文件、未动 `.tdd/`(本批仅新增本核对文档 + API_REFERENCE 增补段落 4.62)。
+- 与 EVD-11 平台运营域(SC-A-06 供应体系管理 / SC-A-19 账号注销与数据导出工单)**边界已按 SC 语义归位**,避免键重复(见 §3)。
+
+---
+
+## 1. 端点存在性核对(按 SC 清单,6 个)
+
+> 列:SC → 开工包候选载体 → 实测源码端点(`@RequestMapping` 类级 + `@PostMapping` 方法级)→ 结论。
+
+### 1.1 SC-S-01 入驻申请
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `AdminSupplierController /api/admin/supplier/*`:list / save / update / delete(服务商档案 CRUD) | 实际类级前缀 `/api/admin/supplier`:`list`、`save`、`update`、`delete`。**均标注 `@Operation(summary="【已废弃】供应商列表,请使用 /api/admin/supply-system/list")`** | ⚠ **候选类已废弃**,活跃载体见下行 |
+| `EcomSupplierController /api/admin/ecom-supplier/*`:list / all / save / update / delete | 实际类级前缀 `/api/admin/ecom-supplier`:`list`、`all`、`save`、`update`、`delete`。**均标注 `@Operation(summary="【已废弃】供应商列表,请使用 /api/admin/supply-system/list")`** | ⚠ **候选类已废弃**,活跃载体见下行 |
+| (活跃载体实测定位) | **`SupplySystemController /api/admin/supply-system`**:`list`、`create`、`update`、`detail`、`toggle-status`、`list-all`、`my-system`、`my-teams`、`member/list`、`member/add`、`member/remove`、`member/change-role`(13 端点);体系层级治理另由 `SupplyManageController /api/admin/supply-manage`:`list`、`detail`、`create`、`update`、`delete`、`add-role`、`remove-role`、`adjust-tier`(EVD-11 SC-A-06 已覆盖,非本批重复登记) | ✅ **端点齐全(载体置换)**:入驻申请/服务商体系治理由 `supply-system` 承载(`create` 建档、`toggle-status` 启停审核、`my-system`/`my-teams` 一人多团队) |
+
+> **结论 ✅**:SC-S-01 能力可满足。注意:无独立「入驻申请单」端点,入驻/启停由 `supply-system create + toggle-status` 承载;如产品要求独立入驻申请审批流(独立申请单 + 审核记录),需产品侧确认,不在本批实现。
+
+### 1.2 SC-S-05 库存管理
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `AdminInventoryController /api/admin/inventory/*`:inbound/create · inbound/confirm · inbound/cancel · transactions/list · counting/create · counting/confirm · alert/list · product/stock · combo/items | 实际类级前缀 `/api/admin/inventory`:`inbound/create`、`inbound/list`、`inbound/detail`、`inbound/confirm`、`inbound/cancel`、`transactions/list`、`counting/create`、`counting/confirm`、`counting/list`、`alert/list`、`product/stock`、`combo/items`、`combo/items/list`、`outbound/create`、`outbound/list`(15 端点,开工包子集全数命中 + 额外含入库列表/详情、出库、盘点列表、组合列表) | ✅ 端点齐全 |
+| `SupplierProductController /api/admin/supplier/product/*`:list / create / update / detail / delete / shelve | 实际类级前缀 `/api/admin/supplier/product`:`list`、`create`、`update`、`detail`、`delete`、`shelve`(6 端点全命中) | ✅ 端点齐全 |
+
+> **结论 ✅**:SC-S-05 能力可满足(入库/出库/盘点/库存告警/组合商品 + 服务商商品 CRUD/上下架)。
+
+### 1.3 SC-S-07 营销活动报名
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `ActivityController /api/activity/*`:list / detail / register / cancel-registration / my-registrations / registration-roster | 实际类级前缀 `/api/activity`:`list`、`detail`、`create`、`update`、`publish`、`end`、`submit-review`、`register`、`cancel-registration`、`my-registrations`、`registration-roster`、`checkin`、`checkin-review`(13 端点,开工包子集全数命中) | ✅ 端点齐全 |
+| `AdminActivityController /api/admin/activity/*`:review / submit-review | 实际类级前缀 `/api/admin/activity`:`list`、`review`、`detail`、`submit-review`、`audit`、`backfill-tags`、`withdraw`、`re-draft`(8 端点,`review`/`submit-review` 命中) | ✅ 端点齐全 |
+| `ActivityOrderController /api/activity/order` | 实际类级前缀 `/api/activity/order`:`create`、`pay`、`handlePaymentSuccess`、`notify`、`status`(5 端点) | ✅ 端点齐全 |
+
+> **结论 ✅**:SC-S-07 能力可满足(活动报名/取消/我的报名/报名名单 + 管理端审核 + 报名订单支付)。
+
+### 1.4 SC-S-08 对账/结算
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `AdminSettlementController /api/admin/dan-settlement/*`:list / detail/{settlementId} / confirm/{settlementId} / stats | 实际类级前缀 `/api/admin/dan-settlement`:`list`、`detail/{settlementId}`、`confirm/{settlementId}`、`stats`(4 端点全命中) | ✅ 端点齐全 |
+| `SupplySettlementController /api/admin/supply-settlement/*`:list / detail / detail-items / create / confirm | 实际类级前缀 `/api/admin/supply-settlement`:`list`、`detail`、`detail-items`、`create`、`confirm`(5 端点全命中) | ✅ 端点齐全 |
+
+> **结论 ✅**:SC-S-08 能力可满足(DAN 结算 + 供货结算双载体,含结算明细/创建/确认)。
+
+### 1.5 SC-S-10 营养/食谱数据供给
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `NutritionProductController /api/nutrition/product/*`(营养品数据供给) | 实际类级前缀 `/api/nutrition/product`:`category/list`、`brand/list`、`search`、`detail`、`recommend`、`price-compare`、`from-product`(7 端点) | ✅ 端点齐全 |
+| `BeijingNutritionController /api/nutrition/beijing/*`(北京食谱数据) | 实际类级前缀 `/api/nutrition/beijing`:`bacteria/save`、`recommend`、`recommend/custom`、`kb/query`、`kb/list`、`kb/info`、`analysis`(7 端点) | ✅ 端点齐全 |
+| `UserNutritionProfileController /api/nutrition/profile`(营养画像对齐) | 实际类级前缀 `/api/nutrition/profile`:`get`、`save`(2 端点) | ✅ 端点齐全 |
+
+> **结论 ✅**:SC-S-10 能力可满足(营养品数据 + 北京食谱知识库 + 营养画像对齐)。
+
+### 1.6 SC-S-11 数据导出合规(授权使用)⚠ → 回填 ✅
+
+| 开工包候选 | 实测端点 | 结论 |
+|---|---|---|
+| `UserController POST /api/user/data-export`(个保法数据可携带权,`AccountCleanupService.exportUserData`) | 实际类级前缀 `/api/user`:`deactivate`、`data-export`;服务层 `AccountCleanupService.exportUserData(Long userId)` @147、`deactivateAccount(Long)` @52 均在 | ✅ **确认存在**(用户侧自助导出,数据匿名化注销) |
+| 授权使用约束:`ReportMemberPermissionController /api/health/report/member-permission/*` | 实际类级前缀 `/api/health/report/member-permission`:`list`、`members/{memberId}`、`grant`、`revoke`、`visible-members`(5 端点) | ✅ **确认存在**(报告查看授权/可见性治理) |
+
+> **结论 ✅**:SC-S-11 能力可满足。⚠「授权语义待核实」已回填:数据可携带权导出(`/api/user/data-export`)+ 报告授权可见性(`member-permission` grant/revoke/visible-members)双载体均存在。**边界提示**:与 EVD-11 SC-A-19(账号注销/数据导出**工单处理**)不同——本 SC 为用户侧自助能力(`/api/user/data-export`、`/api/user/deactivate`),SC-A-19 的**运营工单处理**无端点载体(属平台运营域,需产品侧确认,不重复登记)。
+
+---
+
+## 2. 建议能力键映射(按 O-2 方案 A,防键重复)
+
+| SC | 建议能力键 | 对应活跃载体 | 备注 |
+|----|-----------|--------------|------|
+| SC-S-01 | `supplier.apply` | `SupplySystemController /api/admin/supply-system`(list/create/update/detail/toggle-status/my-system/my-teams) | 载体置换,候选类已废弃 |
+| SC-S-05 | `supplier.inventory.manage` | `AdminInventoryController /api/admin/inventory` + `SupplierProductController /api/admin/supplier/product` | — |
+| SC-S-07 | `supplier.activity.signup` | `ActivityController /api/activity` + `AdminActivityController /api/admin/activity` + `ActivityOrderController /api/activity/order` | — |
+| SC-S-08 | `supplier.settlement.reconcile` | `AdminSettlementController /api/admin/dan-settlement` + `SupplySettlementController /api/admin/supply-settlement` | — |
+| SC-S-10 | `supplier.nutrition.supply` | `NutritionProductController /api/nutrition/product` + `BeijingNutritionController /api/nutrition/beijing` + `UserNutritionProfileController /api/nutrition/profile` | — |
+| SC-S-11 | `supplier.export.compliance` | `UserController /api/user/data-export` + `ReportMemberPermissionController /api/health/report/member-permission` | 授权可见性治理 |
+
+> 注:以上为**建议映射**,非最终契约键;定稿须逐条对齐 `docs/superpowers/api/API_REFERENCE.md` 与 `tests/test-cases/*.md` 派生用例,避免与既有键冲突(`admin.*` / `energy.*` / `dimension.*` 已存在)。本批为契约核对,不建实现任务、不动 `.tdd/`。
+
+---
+
+## 3. 实现缺口 / 边界归位说明
+
+- **无 SC 级端点缺口**:6 个 SC 均存在可用 HTTP 载体(含 1 处载体置换、1 处 ⚠ 回填为 ✅),无需登记「实现缺口」任务。
+- **载体置换(SC-S-01)**:`AdminSupplierController`/`EcomSupplierController` 均标注「【已废弃】… 请使用 /api/admin/supply-system/list」,活跃载体为 `SupplySystemController`。契约声明以 `supply-system` 为准,不再引用废弃路径。
+- **边界归位**:
+  - 供应体系**层级/团队**治理(`SupplyManageController`、`supply-system my-teams/member/*`)与 EVD-11 SC-A-06 存在交集;本批仅登记 `supply-system` 作为服务商自身业务载体,`supply-manage` 不重复登记(EVD-11 已覆盖)。
+  - 数据导出:本 SC(SC-S-11)为**用户侧自助**(`/api/user/data-export`);EVD-11 SC-A-19 的**运营工单处理**无端点载体,属平台运营域,需产品侧确认,不并入本批。
+- **待产品侧确认项(非本批实现)**:
+  1. SC-S-01 是否要求独立「入驻申请单 + 审核记录」端点(当前 `supply-system create + toggle-status` 承载,无独立申请单流)。
+  2. SC-S-11 是否要求运营侧导出工单处理端点(当前仅用户侧自助,运营工单无载体)。
+
+---
+
+## 4. 交付说明
+
+- 本批新增 2 文件(单文件精确提交):
+  - `docs/superpowers/specs/2026-11-07-service-provider-contract.md`(本核对结论)
+  - `docs/superpowers/api/API_REFERENCE.md`(增补「4.62 商品服务商域」段落)
+- 未改业务代码、未改测试文件、未新增 DB 迁移、未动 `.tdd/`。
+- 核对基准:`origin/cfclub @ 069628810`,worktree `feature/evd12r2-svc-contract`。