Преглед изворни кода

Merge remote-tracking branch 'origin/cfclub' into cfclub-local-sync

Sisyphus Agent пре 4 дана
родитељ
комит
9feed0a19f

+ 125 - 0
docs/superpowers/specs/2026-11-09-diet-recommendation-health-questionnaire-adjust.md

@@ -0,0 +1,125 @@
+# 需求变更 · 食材推荐按健康问卷个性化调整
+
+> **来源**:用户 2026-11-09 拍板(`@skill:tdd-orchestrator`):报告解析出的食材推荐,还要根据用户健康问卷中的**饮食习惯、过敏反应、用药情况、主要健康体症**做个性化调整。
+> **最新复盘数据**:2026-11-09 00:39 只读核查实证(见 §1 行号引用)。
+> **涉及时面**:后端 `FoodRecommendService` / `HealthFilterService` / `BeijingNutritionService` + 前端 `cfc-frontend/pages/diet/recommendation.vue`。
+> **状态**:新需求,RED 入池待派发(非契约补建)。
+> **总开发目标锚点**:用户场景(`tests/user-scenarios/应用场景总览.md`)端到端跑通。
+
+## 1. 现状数据流(2026-11-09 只读核查实证)
+
+「用户在报告中看到的食材推荐」= **报告解析产出 → food_recommend_idx → `/api/health/foods` 展示**,全程**未经健康问卷过滤**:
+
+```
+报告确认/解析 → FoodRecommendService.recalculateForUser (L97-237)
+  ├─ 优先 foodService.listByReportId(report.getId()) (L116)
+  ├─ 空则回退 report_food_suitability (L118-138)
+  └─ 写入 food_recommend_idx(foodId + indexScore,L151-220)
+
+前端 recommendation.vue loadFoods() (L491-523)
+  └─ POST /api/health/foods(无 reportId,L497)
+       → HealthReportController.listFoods (L1964-1981)
+            └─ 无 reportId 分支:getCurrentFoodsAsFoodList(memberId ?? JWT userId) (L1978)
+                 → FoodRecommendService.getCurrentFoods (L283-317)
+                      └─ food_recommend_idx join foods → List<Food>
+                           (仅 name/category/score/protein/fat/carbs/fiber/energyKj,L300-314)
+前端 filteredFoods computed (L285-334):按 score 分「适合(>=0)/戒备(<0)」
+```
+
+**缺口实证**:
+1. `FoodRecommendService.getCurrentFoods`(L283-317)**从未调用** `HealthFilterService`——过敏/用药/疾病/体症/饮食习惯五个维度全部缺位。
+2. `HealthFilterService`(L39-320)已具备完整三级规则引擎:`loadProfile`(L89-136,HealthStatus 疾病/用药 + DietPreferences 过敏)、`checkProductBlocks`(L169-205,商品级硬拦截)、`checkDrugInteractions`(L210-238,药物-食物风险分级 risk1 硬拦截/risk2-3 软警告)、`isFoodHardBlocked`(L243-253,disease_intake_limits.block_foods)——**已可用,只需接入**。
+3. `HealthFilterService.loadProfile` 未读 `HealthStatus.lifestyle.allergySymptoms`(过敏症状,L50 实体注释)——体症/症状维度未入画像。
+4. `BeijingNutritionService.generateIngredientList`(饮食首页降级菜单链,L577-820)已做过敏/绝对避免过滤(L713)+ 疾病硬拦截(L714),但**未调用 `checkDrugInteractions`**(用药维度缺位)、未做宗教饮食(Food.dietType)与 mustEat 饮食习惯标记——与报告页口径不一致。
+5. `Food.dietType`(L45,none/清真/halal/素食/vegan)、`Food.allergens`(L35)字段存在但当前推荐链未用。
+6. 前端 `loadFoods` map(L511-516)只透传 score/status,无任何调整提示字段。
+
+## 2. 健康问卷四维度 → 调整规则映射(单一事实源)
+
+「健康问卷」= `health_status`(主要健康体症/疾病史/用药,实体 `HealthStatus.java` L14-63)+ `diet_preferences`(饮食习惯/过敏/避免/必须吃,实体 `DietPreferences.java` L12-34)。
+
+| # | 维度 | 数据源字段 | 调整规则 | 等级 |
+|---|---|---|---|---|
+| D1 | 过敏反应 | `diet_preferences.allergies`(JSON[string]);`health_status.lifestyle.allergySymptoms`(对象内字段) | 食材名或 `foods.allergens` 命中过敏原 → 标记 `blocked`,原因「过敏原 X 命中,建议不食」 | 硬拦截(blocked) |
+| D2 | 用药情况 | `health_status.medications`(JSON[{name,note}]) | `drug_interactions` 命中:risk_level=1 → `blocked`(药物-食物禁忌硬拦截);risk_level=3 → `warning`(「药物 X 与 Y 需间隔 N 分钟」);risk_level=2 → `warning`(建议咨询医生) | blocked / warning |
+| D3 | 主要健康体症 | `health_status.disease_history`(JSON[{name,note}]) | 命中 `disease_intake_limits.block_foods` → `blocked`(「疾病 X 禁忌食用」);疾病-营养素阈值超限在菜单聚合侧提示(本期不落) | 硬拦截(blocked) |
+| D4 | 饮食习惯 | `diet_preferences.absolute_avoid`(JSON[string]) | 食材名命中 → `blocked`「该成员明确不吃」 | 硬拦截(blocked) |
+| D5 | 饮食习惯 | `diet_preferences.religious_diet`(如 素食/清真) | 与 `foods.diet_type` 不匹配 → `blocked`「饮食禁忌(宗教/素食)」;`none` 或空 → 不拦 | 硬拦截(blocked) |
+| D6 | 饮食习惯 | `diet_preferences.must_eat`(JSON[string]) | 食材名命中 → `boost`「符合饮食习惯偏好」,前端置顶/高亮 | 提升(boost) |
+| D7 | 饮食习惯 | `diet_preferences.diet_structure`({vegetableFruit,dairy,sugaryDrinks}) | 供前端展示「饮食结构提醒」文本(本期只透传,不做排序干预) | 展示(warning 文本) |
+| D8 | 年龄体症 | `family_members.age` + 食材名(蜂蜜/整粒坚果) | <1 岁蜂蜜、<3 岁整粒坚果 → `blocked`(现有 AGE_BLOCK_RULES L56-60 复用) | 硬拦截(blocked) |
+
+> 分级语义(叠加在现有 score「适合/戒备」之上的**第二层个性化调整**):
+> - `adjustment=blocked`:健康问卷硬性不建议,前端红色提示 + 「适合」Tab 降到底部
+> - `adjustment=warning`:软警告/间隔提示,前端黄色提示,位置不变
+> - `adjustment=boost`:明确偏好,前端绿色高亮/置顶
+> - `adjustment=normal`:无调整
+
+## 3. 实现落点
+
+### 后端(主改,任务 A:`diet.food.healthAdjust`)
+
+**A1. `HealthFilterService` 增「按食材检查」便捷方法(复用既有规则,适配 Food)**
+- `public List<String> checkFoodBlocks(HealthProfile profile, Food food)`:逻辑对齐 `checkProductBlocks`(L169-205)——`food.name`/`food.allergens`(L35)作为命中面,疾病(+block_foods 需另走 `isFoodHardBlocked` L243-253)、用药(`checkDrugInteractions` 参数改为 {name, allergenTags} 或轻量适配)、年龄禁忌(AGE_BLOCK_RULES L56-60)全部复用。
+- `public List<String> checkDietPreferenceAdjust(HealthProfile profile, DietPreferences prefs, Food food)`:D4 绝对避免 / D5 宗教饮食(`food.dietType` 与 prefs.religiousDiet 匹配,`none`/空⇢不拦)/ D6 mustEat boost 判定,返回结构化结果(block 原因列表 + boost 布尔)。
+- `loadProfile`(L89-136)补充:`HealthStatus.lifestyle` 解析 `allergySymptoms` 并入 `allergies`(体症维度入画像),兼容 lifestyle 为 JSON 对象。解析失败静默(现有 try/catch 风格)。
+
+**A2. `FoodRecommendService.getCurrentFoods`(L283-317)接入调整**
+- 起始解析目标成员:入参 userId(可能为 memberId)经 `resolveFoodIndexUserId`(L78-95)归一为写侧键;`loadProfile(memberId, userId, age)` 取 `HealthProfile`;`dietPreferencesMapper` 按 familyMemberId 取 `DietPreferences`(同 `generateIngredientList` L643-647 取法)。memberId 需从 userId 反查(family_members.user_id → id),无则退回 userId 级画像。
+- 每个食材构建 Map 时(L300-314)追加:
+  - `adjustment`(normal/blocked/warning/boost,D1-D8 规则按序判定,blocked 优先)
+  - `adjustmentReason`(String,命中首条原因;多条用「;」连接)
+- 顺序:blocked(D1/D2-risk1/D3/D4/D5/D8)> warning(D2-risk2/3)> boost(D6)> normal。
+- **不删除食材**(保留前端「戒备」语义与报告快照完整),仅打标。
+
+**A3. `getCurrentFoodsAsFoodList`(L320-342)透传标记**
+- `Food` 实体加 `@TableField(exist = false)` 瞬态字段 `adjustment` / `adjustmentReason`(不动库表),此处 new Food 时同步 set。
+
+**A4. `HealthReportController.listFoods`(L1964-1981)**
+- **无改动**。有 `reportId` 分支(报告详情页展示,`foodService.listByReportId` L1972)保持「报告原始解析快照」不变——个性化调整只作用于用户「当前推荐」链(无 reportId 分支),避免报告详情与历史快照失真。
+
+**A5. 口径一致性(mouth一致性):`BeijingNutritionService.generateIngredientList`(L577-820)补齐**
+- L708 循环内补调 `checkDrugInteractions`(用药维度):食物名/`food.allergens` 命中交互 → risk1 剔除或降权、risk2/3 提示。
+- 宗教饮食过滤:`Food.dietType` vs 参与者 `DietPreferences.religiousDiet` 合并集(任一参与者不匹配即剔除;现有 L713 过敏/避免同款合并口径)。
+- 保持现有分类配额(L764-795)与 Top10-12 截断(L782-795)不变。
+
+### 前端(任务 B:`diet.food.healthAdjustUi`)
+
+**B1. `loadFoods`(recommendation.vue L511-516)**:map 透传 `adjustment` / `adjustmentReason`(旁置现有 scoreClass/statusText 映射 L512-514)。
+
+**B2. 食物卡片(L104-123)**:按 `item.adjustment` 渲染提示条:
+- `blocked` → 红条「⚠ 健康问卷不建议:{adjustmentReason}」
+- `warning` → 黄条「注意:{adjustmentReason}」
+- `boost` → 绿条「✓ 符合饮食习惯偏好」
+- `normal`/空 → 不渲染。
+
+**B3. `filteredFoods`(L285-334)**:
+- `suitable` Tab:`adjustment==='blocked'` 项排到列表末尾(保持可见但不置顶)。
+- `unsuitable` / `all`:位置不变,仅带提示条。
+- 排序逻辑(L322-331)不变,仅 stable 分组:非 blocked 在前。
+
+## 4. 验收判据(V/C)
+
+1. 成员在饮食偏好填过敏原「花生」→ `/api/health/foods` 返回食材「花生」`adjustment=blocked`、`adjustmentReason` 含「过敏原花生」,前端红条提示;`suitable` Tab 排末尾。
+2. 成员 health_status 在服「二甲双胍」且 foods/allergens 命中 `drug_interactions` 对应食物(如西柚)→ risk1 返回 `blocked`;risk3/2 返回 `warning` + 间隔分钟/咨询医生文案。
+3. 成员疾病史「痛风」命中 `disease_intake_limits.block_foods`(如动物内脏)→ `blocked` + 「疾病痛风禁忌食用」。
+4. 绝对避免「香菜」→ `blocked`「该成员明确不吃」;`must_eat` 含「鸡蛋」→ 鸡蛋 `boost`。
+5. 宗教饮食「素食」时,`foods.diet_type` 为荤食的食材 → `blocked`;`diet_type` 为 none 的食材不受影响。
+6. 前端三种提示条正确渲染;「适合」Tab 无红色 blocked 项置顶;菜品生成链不受影响。
+7. `reportId` 分支(报告详情页)返回与改造前一致(快照不动)。
+8. `--clean-check` 干净;实现/文档提交已推 origin/cfclub;`py_compile`(若涉编排脚本)通过。
+
+## 5. 任务拆解(TDD 池)
+
+| 键 | 覆盖 | 阶段 | 溯源 |
+|---|---|---|---|
+| `diet.food.healthAdjust` | 后端 A1-A5(HealthFilterService 扩展 + FoodRecommendService 接入 + Food 瞬态字段 + generateIngredientList 口径补齐 + 单测) | RED | requirement:本文档 §1-2;design:本文档 §3(方法/行号)+ `HealthFilterService.java` L39-320 + `FoodRecommendService.java` L283-342 + `BeijingNutritionService.java` L577-820 |
+| `diet.food.healthAdjustUi` | 前端 B1-B3(recommendation.vue 透传 + 提示条 + filteredFoods 分组) | RED | requirement:本文档 §3 前端;design:本文档 §3 B1-B3 + `cfc-frontend/pages/diet/recommendation.vue` L104-123/L285-334/L491-523 |
+
+> 派发顺序约束:Ui 依赖后端 `adjustment`/`adjustmentReason` 字段契约(A2/A3),**必须串行派发**(healthAdjust 先合入 origin/cfclub,healthAdjustUi 后派)。
+
+## 6. 备注
+
+- 调整层去重与语义:`blocked` 优先于 `warning`/`boost`;同一食材多原因合并且原因最长取 2 条展示。
+- 不新增库表、不迁移数据;`health_status.lifestyle` 结构保持 `{mood, sleepDuration, bedtime, bowelFrequency, bowelForm, antibioticHistory, allergySymptoms}`(实体 L49-50 既有注释)。
+- 数据敏感:health_status / diet_preferences 属健康隐私数据,仅本成员/家庭上下文读取,接口不新增越权面(沿用 controller 既有 userId/familyId 属性鉴权)。

+ 188 - 0
docs/tdd/orchestration/report-dev-2026-11-09-0054.md

@@ -0,0 +1,188 @@
+# 研发负责人工作汇报(2026-11-09 0054 轮 · TDD 闭环巡检)
+
+> 汇报人:研发负责人(本自动化 298dcf47,经 tdd-orchestrator + git-workflow 技能)|汇报周期:2026-11-09 0054 轮(时间戳唯一标识)|负责模块:TDD 编排全域(研发负责人职责:检查 / 调度 / 汇总,不代写实现)
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 研发负责人(自动化 298dcf47) |
+| 汇报周期 | 2026-11-09 0054 轮(时间戳唯一,非全局第 N 轮) |
+| 负责模块/单元范围 | TDD 编排全域(状态机 / 任务账本 / 会话调度 / SC 覆盖矩阵 / 主理人协调清单) |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 问题接收与处置
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **收到的测试反馈问题数*** | 0 个(本实例) | 本环境只读核查,未直连测试台账逐条核验;远端测试团队 R90–R93(2026-11-08 20:08–22:27)持续登记并闭环 B-61/B-55/B-54/B-74/B-75/B-76,详见 §三 |
+| **已解决问题数*** | 0 个(本实例) | 本实例不代写实现;RED→YELLOW→GREEN 收口由 hub 派发会话 + 测试团队执行,证据以 git 真理为准 |
+| **待解决研发问题数** | 3 项(均非本实例可独立闭环) | ① 11 个 dispatched RED 任务已 git 实证完成、待测试侧 `--mark-red` 收口(P0 流程衔接);② 7 个 pending 任务待 hub 派发(P1);③ 226 个未跑通 SC 缺三类流执行证据(P0 主线,测试侧按 O-7 节奏补证) |
+
+### 1.2 任务分发与会话管理
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **分派任务数*** | 0 个(本实例) | 本环境派发通道由独立 hub 自动化(xaf_agent_hub)执行,本实例仅检查 / 调度 / 汇报,不直接派发;派发动作留 hub 避免触动主工作树 313 处他人 WIP |
+| **恢复智能体会话数*** | 0 个(本实例) | 会话恢复属 hub 职责;本轮 `--inspect` 显示 5 开发节点 **busy=0 / interrupted=0**,无 wedged/swallowed/upstream_err,无需恢复 |
+| **当前在用会话数** | 7 实例(hub 管理) | 5 开发节点(lan-189 / lan-204 / local-lan-4090 / mes-local-45278 / pub-iwintrue)+ 2 部署节点(production=prod-etotem / testing=pub-iwintrue) |
+| **会话平均利用率** | 本轮末偏低(lull) | 11 个 dispatched RED 任务的会话已完成契约单测并提交回归空闲;空闲位待 hub 拾取 7 个 pending 任务 + 下一批准入 |
+
+### 1.2b 各会话当前工作状态列表
+
+> 数据来源:`--inspect --role 测试负责人`(只读,2026-11-09 00:57 快照)。本环境直连 opencode 通道现已可用,5 节点均枚举成功。状态取值见模板 §1.2b 速查表。
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| mes-local-45278 | 本地开发首选 | `idle` | 11 个 dispatched RED 任务已完成(git 实证),待测试 mark-red | — | 不干净(主工作树 WIP 不动) | 本仓 E:/cfc;按 `.tdd/config.json#client_directories` 隔离 |
+| lan-189 | 远程开发 | `idle` | 同上;189 通道根因已修复(736d7f9a1)持续可用 | — | 不干净 | hub 调度中 |
+| lan-204 | 远程开发 | `idle` | guhe/diet/team 批次在途已完成 | — | 不干净(D:/cfc) | hub 调度中 |
+| local-lan-4090 | 局域网节点 | `idle` | guhe/diet 实现批次在途 | — | 不干净(/sc-data/cfc) | hub 调度中 |
+| pub-iwintrue | 云端 testing 部署 | `idle` | testing 部署批次已完成 | — | 不干净(/sc-data/cfc) | deploy_sessions.testing 节点 |
+| prod-etotem | 生产部署(仅研发负责人) | `idle` | 生产部署(confirm 门,按次) | — | 不干净(/root/cfc) | confirm_required,本实例未触发 |
+| testing-deploy | ses_e4804838… | `idle` | 部署链待 7 个 pending 收口 | — | — | 部署在途 pending 7 / confirmed 37 |
+
+> **R2「不留空闲」核验结论**:5 开发节点当前全 `idle` 为**任务完成后的自然回落**(11 个 dispatched RED 任务的契约单测提交均已推 origin/cfclub,见 §1.4 实证),非「会话空闲且无任务可派」的浪费;7 个 pending 任务 + 下一批准入应由 hub 拾取。无 wedged/swallowed/stalled 实例。
+
+### 1.3 变更感知与新任务建立
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **感知需求/设计变更数*** | 200 提交 / 236 文件(7d 窗口) | `--changes --days 7` 检出(设计 70 / 用例 20 / 其他 146),全部为既有键内容变化 |
+| **新增能力键数** | 0 个(2d 窗口)/ 0 个(本轮) | `--changes --days 2` 检出来源键 **0 → 0**;目标池 ⏳=0,无新 SRS 缺口键 |
+| **新增入池任务数*** | 0 个(本轮) | 0 新增能力键;guhe_v2×15 + diet×2 的 RED 已于 2026-11-08 入池(ac7116d4f / b07bc4d0a),本轮无需重复入池 |
+| **既有键状态流转数** | 0 次(本实例) | 流转由 hub 派发会话 + 测试团队推进,本实例只读跟踪 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+> 编排侧只认「已推送远端」的提交为推进证据。本轮核验 11 个 dispatched RED 任务的契约单测提交均已推 origin/cfclub(`git merge-base --is-ancestor` 可核验)。
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| `3b0ec73b2` / `999aaeae7` | S-cfc-80 · diet.recommendation.participantSelect | RED | 测试 | cfclub | 是 | 共餐人多选默认全选 + 个人 currentMemberId |
+| `ec90b7b93` | S-cfc-83 · guhe.kb.versionSense | RED | 测试 | cfclub | 是 | KB 版本感知 T9 L2-1 |
+| `53502b042` | S-cfc-84 · guhe.l1.versionSplit | RED | 测试 | cfclub | 是 | 报告格式版本拆分 T8 L1-3 |
+| `b29147a77` | S-cfc-85 · guhe.l4.noPathMap | RED | 测试 | cfclub | 是 | 五维 no_path 映射 T4 L4 |
+| `801902f2e` | S-cfc-86 · guhe.lowSide.noSupplement | RED | 测试 | cfclub | 是 | 低侧不补剂红线 T4 L4-3 |
+| `a14a09e13` | S-cfc-87 · guhe.kb.fieldExpose | RED | 测试 | cfclub | 是 | 知识库字段暴露 T10 L2-3 |
+| `65eaf03d7` | S-cfc-88 · guhe.p3.lowSideAggregate | RED | 测试 | cfclub | 是 | P3 跨例聚合 T15 |
+| `15c7ce949` | S-cfc-89 · guhe.l1.shellGuard | RED | 测试 | cfclub | 是 | 空壳率护栏 T13 L1-4 |
+| `ceb2f4314` | S-cfc-90 · guhe.l1.guheV2Route | RED | 测试 | cfclub | 是 | guhe_v2 指纹路由 T7 |
+| `2438bb283` / `fb1e335e9` | S-cfc-79 · diet.recommendation.uiRework | RED | 测试 | cfclub | 是 | 24 项 UI 重写契约单测 |
+
+> 本地 `HEAD` 落后 origin/cfclub(主工作树为带大量他人 WIP 的陈旧检出,按纪律④不 pull、不代提交);本汇报经 hash-object 单文件推 origin/cfclub,独立于本地分支。
+
+### 1.5 状态机阶段分布与部署状态
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | — |
+| RED | 19 | guhe_v2×15 + diet.recommendation×2 + diet.food.healthAdjust / healthAdjustUi(契约单测已落,待 hub 派发实现使 YELLOW) |
+| YELLOW | 27 | 实现已落地(yellow_sha 已回填 IN CHAIN 复核),待测试侧 mark-green 复验 |
+| GREEN | 8 | health.report.createReport / dan.assessment.getActiveMaterial / admin.auth.login / health.report.upload / task.history.view / growth.history.view / sleep.config.tags / achievement.grid.fiveCol |
+| DONE | 14 | auth.guest.* / dimension.registry.* / family.familyMembers.* / task.parent.* / reward.cfEstimate.expectedCf 等 |
+
+| 部署项 | 值 | 说明 |
+|--------|-----|------|
+| 本轮部署次数 | 0 次(本实例) | 部署由 deploy_sessions 节点执行;本实例未触发 |
+| 部署在途 | pending 7 / confirmed 37 | testing@c22382b3, f1d3e663, dc1b83a6… |
+| GREEN 部署链验证 | 待部署侧收口 | 27 YELLOW 待测试 green + 7 部署 pending 收口 |
+
+> 状态机总数 **68 键**(本地 `.tdd/state.json`,编排侧本地事实源,不入库),较 2026-11-08 2259 轮(66 键)新增 2 RED(diet.food.healthAdjust / healthAdjustUi),部署 pending 18→7。
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | 目标池无新 ⏳ 键(guhe/diet RED 由计划文档溯源入池,非 SRS ⏳ 自动派生) |
+| 契约常量(contract) | 正常 | 正常 | O-9 已纳入 cfc-langgraph/src 归口 |
+| 测试用例引用(test_case_map) | 正常 | 正常 | — |
+| 执行结果回填(case_results) | 正常 | 正常 | 测试侧持续回填 |
+
+---
+
+## 二、场景覆盖矩阵(DEV_GOAL 顶层验收口径 · 必列)
+
+> 单一事实源:`docs/tdd/orchestration/sc-key-map.md`(241 SC 全量,唯一「SC 跑通」计数来源)。
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 场景总数 | 241 | A25/G12/P96/C26/T32/S11/X22/B10/H7 = 241(O-8 归一后) |
+| 累计已跑通 | **15** | O-3 收口 5 SC + 2026-11-07 游客域补证 10 SC(sc-key-map.md 行 23 权威记录) |
+| 本轮新增跑通 | 0 | 本轮无新三类流执行证据落地;27 YELLOW + 8 GREEN 键为下一批准入候选 |
+| 失败 | 0 | — |
+| 阻塞 | 0 | — |
+| 未跟踪(待三类流证据) | 226 | 全部为「实现/契约已落地、缺正常/异常/权限三类流执行证据」,非「未实现/缺契约」真缺口(防假 RED) |
+
+> **本轮推进的 SC 与证据 sha**:无新增跑通。在途候选键(yellow_sha 已 IN CHAIN):`admin.auth.login`/`health.report.upload`/`dan.assessment.getActiveMaterial`/`health.report.createReport`/`task.history.view`/`growth.history.view`/`sleep.config.tags`/`achievement.grid.fiveCol`(GREEN 8)+ 27 YELLOW 键。待测试侧补三类流执行证据后转正。
+
+---
+
+## 三、阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| 11 个 dispatched RED 任务会话已完成但账本仍标 `dispatched`、状态机仍 RED,未回写 `--mark-red` | guhe_v2×15 + diet×2 收口 | 测试(流程衔接) | RED 契约单测提交已推 origin/cfclub(§1.4 实证 10 项),待测试角色 `--mark-red` 回写 | 转测试团队 R 轮 mark-red |
+| 7 个 pending 任务(含 S-cfc-91 guhe.gate.evidenceIsolate)无活跃会话承接 | guhe 域收口尾部 | 研发(派发) | hub 应拾取 pending 派发;本实例不直派避免触动 313 WIP | hub 自动拾取 |
+| 226 未跑通 SC 缺三类流执行证据 | 顶层目标 241/241 | 测试(证据补建) | 按 O-7 契约补建节奏(契约定一批→映射入池→测试补证据),游客域已补证 10 SC | 测试团队按主链优先级推进 |
+| B-65 连续多轮未修 / B-75 签名横屏 SRS 待实现 | 部分 SC 证据链 | 研发/需求 | 历史登记待排期 | 主理人/研发排期 |
+
+> **主理人协调清单(pending.md)状态**:O-1 ~ O-17 **全部已裁决 / 已裁决生效**,无「待裁决」遗留项(O-3/O-4/O-5 正文含「待裁决」字样系诉求列历史引用,状态列均为已裁决)。本实例无需新开 O-* 裁决;对「dispatched→mark-red 衔接」「pending→hub 派发」两项 operational 决策按研发负责人职责先行裁定(见 §四)。
+
+---
+
+## 四、下一步需要研发处理的事项 / 研发负责人裁决
+
+> 三条事项遵循「事项 → 依赖 → 预估」三要素。本轮需主理人裁决的事项均已裁决,以下为研发负责人对本轮 operational 间隙的先行裁定。
+
+| 序号 | 事项描述 | 依赖/前置条件 | 预估完成时间 | 优先级 | 状态 |
+|------|----------|---------------|--------------|--------|------|
+| 1 | **裁决:11 个 dispatched RED 任务已 git 实证完成 → 判定为 RED 阶段达成**,转测试角色 `--mark-red` 回写状态机(不重复派发实现,避免假 YELLOW) | 测试团队 R 轮执行 `--mark-red` | 2026-11-09 当轮 | P0 | 已裁决(转测试) |
+| 2 | **裁决:7 个 pending 任务交由 hub 拾取派发**(不本实例直派,保护主工作树 313 WIP),含 S-cfc-91 guhe.gate.evidenceIsolate | hub 自动巡检拾取 | 2026-11-09 当轮 | P1 | 已裁决(转 hub) |
+| 3 | **设计下一优先新任务(按 DEV_GOAL §四 主链优先级)**:① 19 RED 键(guhe_v2×15+diet×4)经 hub 派发实现使 YELLOW;② 27 YELLOW + 8 GREEN 键经测试 mark-green + 三类流证据补建;③ 226 未跑通 SC 按「登录/鉴权→家庭成员与双角色→任务/心愿→五维能量→健康报告解析→测评订单→商城/会员→文章审核→跨角色 E2E→运营/服务商」主链批次补证 | 测试侧 O-7 契约补建节奏 + hub 派发额度 | 持续(每轮推进一批) | P0 | 设计中(优先级已排定) |
+| 4 | B-65 / B-75 排期修复 | 主理人/研发排期 | 待排期 | P1 | 待启动 |
+
+---
+
+## 五、下轮工作规划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 涉及会话标签 | 备注 |
+|--------|--------------|----------|--------------|------|
+| 19 RED 键实现使 YELLOW(guhe_v2×15 + diet×4) | 2026-11-09~11 | hub 派发 | 5 开发节点 | 契约单测已落,实现派发 |
+| 27 YELLOW + 8 GREEN 键 mark-green + 部署收口 | 2026-11-09~11 | 测试 mark-green + 部署节点 | testing-deploy | 待测试侧复验 |
+| 226 未跑通 SC 主链批次补证(首批:登录/鉴权/家庭成员) | 持续 | O-7 契约补建 | 测试团队 | 游客域已补证 10 为样板 |
+| 7 pending 任务派发 | 2026-11-09 当轮 | hub 拾取 | hub | 不直派 |
+
+---
+
+## 附录
+
+### 附录 A:收到的测试反馈问题明细
+> 本实例未直连测试台账逐条核验;远端 R90–R93 持续闭环 B-*,详见 blockers.md。本轮本实例收到 0 条需本实例直处的问题。
+
+### 附录 B:任务分派与会话恢复明细
+| 任务号 | 目标会话标签 | 任务类型 | 分派时间 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| S-cfc-79~90(11 个) | hub 派发各节点 | TDD-RED | 2026-11-08 | dispatched(RED 提交已推远端,待 mark-red) | — | — | — |
+| S-cfc-91 等(7 个) | 待 hub 拾取 | TDD-RED | — | pending | — | — | — |
+
+### 附录 C:新增入池任务明细
+> 本轮 0 新增入池(guhe_v2/diet RED 已于 2026-11-08 入池,含完整 `--requirement`+`--design` 溯源锚点)。
+
+### 附录 D:变更感知明细(来自 `--changes`)
+| 变更文档 | 文档类型 | 变更日期 | 新增能力键 | 是否已入池 |
+|----------|----------|----------|------------|------------|
+| docs/tdd/ci/CI_READINESS_2026-11-05.md 等 57 个 | 其他 | 2026-11-08 | 0 | — |
+| docs/tdd/test/automation-run-2026-11-07-*.md 等 20 个 | 测试用例 | 2026-11-07 | 0 | 既有键变化 |
+| cfc-backend/** 等 146 个 | 其他/设计 | 2026-11-07~08 | 0 | 既有键变化 |
+
+---
+
+**模板版本**:v1.1(2026-11-03,新增各会话当前工作状态列表 + git 证据 + 状态机分布 + 部署状态 + 数据源健康度)
+**适用对象**:研发负责人 / 开发角色会话
+**填写周期**:本轮 TDD 闭环巡检(2026-11-09 0054 轮)