Răsfoiți Sursa

docs: add gut flora report schema fix implementation plan for dev engineer

Sisyphus 4 luni în urmă
părinte
comite
d4aebf7a93

+ 560 - 0
docs/superpowers/plans/2026-06-22-菌群报告Schema补全计划.md

@@ -0,0 +1,560 @@
+# 菌群报告 Schema 补全方案
+
+## TL;DR
+
+> **Quick Summary**: 为 `health_reports` 新增 6 列存储菌群摘要指标,为 `health_indicators` 新增 `symptoms` 列存储过量/缺乏症状文本,修复 schema SQL 与 entity 的不一致。
+
+> **Deliverables**:
+> - `health_reports` 表新增 6 列(菌群摘要 + 总分评级)
+> - `health_indicators` 表新增 `symptoms` TEXT 列
+> - Entity 类同步更新 + getter/setter
+> - `HealthReportController.createReport` 支持接收新字段
+> - `HealthAnalysisService.analyze()` 读取新字段
+> - `schema.sql` 中 `health_reports` 的错误 `idx_child_id` 索引改为 `idx_user_id`
+> - 数据库迁移脚本(ALTER TABLE)
+
+> **Estimated Effort**: Short
+> **Parallel Execution**: NO — sequential DDL → entity → service → controller
+> **Critical Path**: Task 1 → Task 2 → Task 3 → Task 4 → Task 5 → Task 6 → Task 7
+
+---
+
+## Context
+
+### Original Request
+用户要求:从远程更新,解析菌群报告样例内容,探索是否所有内容都已保存到数据库中。
+
+分析结果(基于 `pdf_content.txt`):
+- 匿名用户 530010234 的 143 页肠道菌群健康评估报告(募极生物)
+- 前 9 页已提取,发现多处数据未持久化
+
+### Interview Summary
+
+**Key Discussions**:
+- `pdf_content.txt` 包含报告前 9 页文本(基本信息、疾病风险、营养状况、肠道屏障、短链脂肪酸、神经递质、抗生素耐药)
+- Pages 10-142 内容未提取,暂不纳入范围
+- 致病菌(幽门螺杆菌等)存储位置歧义:现有 `health_gut_flora.category` 仅支持"有益菌/有害菌/中性菌",不包含"致病菌"
+
+**Research Findings**:
+- `health_reports` entity: 13 个字段,缺少菌群摘要 5 项 + 总分评级
+- `health_indicators` entity: 10 个字段,缺少 `symptoms` 症状文本字段
+- `schema.sql` 中 `health_reports` 有 `INDEX idx_child_id (child_id)` 但表中无 `child_id` 列(应用 `user_id`)
+- `DatabaseInitializer.java` 通过 JDBC 创建 `health_gut_flora` 和 `health_disease_risk`,不经过 schema.sql
+
+### Metis Review
+Metis 超时。基于自身分析处理:
+
+**Identified Gaps (addressed)**:
+- Gap 1: 6 个菌群摘要字段无 DB 列 → 新增 DDL + entity 字段
+- Gap 2: `symptoms` 症状字段缺失 → 新增 DDL + entity 字段
+- Gap 3: schema.sql 中 `idx_child_id` 错误 → 修正为 `idx_user_id`
+- Gap 4: 致病菌 category 歧义 → 确认存入 `health_gut_flora`,category="致病菌"(无 DDL 变更,纯值扩展)
+
+---
+
+## Work Objectives
+
+### Core Objective
+补全菌群报告数据的数据库存储,确保 AI 营养分析能读到完整的报告摘要。
+
+### Concrete Deliverables
+1. `ALTER TABLE health_reports ADD COLUMN (gut_balance_score INT COMMENT '菌群平衡分(0-100)', gut_diversity_score INT COMMENT '菌群多样性分(0-100)', beneficial_bacteria_score INT COMMENT '有益菌分(0-100)', harmful_bacteria_score INT COMMENT '有害菌分(0-100)', core_species_score INT COMMENT '核心菌属分(0-100)', health_rating VARCHAR(100) COMMENT '总分评级,如亚健康/优秀等')`
+2. `ALTER TABLE health_indicators ADD COLUMN symptoms TEXT COMMENT '过量/缺乏相关症状描述'`
+3. Entity 更新:`HealthReport.java` 新增 6 个字段,`HealthIndicator.java` 新增 `symptoms` 字段
+4. `HealthReportController.createReport` 支持接收新字段
+5. `HealthAnalysisService.analyze()` 读取新字段用于分析
+6. `schema.sql` 修正 `idx_child_id` → `idx_user_id`
+7. 数据库迁移验证
+
+### Definition of Done
+- [ ] `mvn clean compile` 通过
+- [ ] 数据库表新增列已创建
+- [ ] 新字段能被正确读写
+
+### Must Have
+- `health_reports` 新增 6 列(菌群摘要 + 总分评级)
+- `health_indicators` 新增 `symptoms` 列
+- Entity 同步更新
+- `createReport` API 支持新字段
+- `HealthAnalysisService` 读取新字段
+
+### Must NOT Have (Guardrails)
+- 不修改 `health_gut_flora` 的 DDL(category 纯值扩展无需 DDL)
+- 不触碰 `DanAssessmentResult` 相关代码
+- 不涉及 Dify 知识库修改
+- 不提取 Pages 10-142 内容(超出范围)
+
+---
+
+## Verification Strategy
+
+### Test Decision
+- **Infrastructure exists**: YES (Spring Boot test infra)
+- **Automated tests**: None
+- **Framework**: N/A
+- **QA Policy**: Agent-executed QA — 直接启动后端 `mvn spring-boot:run`,curl 测试 API
+
+### QA Policy
+- `curl` 测试 `POST /api/health/report/create` 携带新字段,验证存储和返回
+- `curl` 测试 `POST /api/health/report/latest` 验证新字段能被读取
+- 证据保存到 `.sisyphus/evidence/task-{N}-*.txt`
+
+---
+
+## Execution Strategy
+
+```
+Wave 1 (Sequential - DB schema first, then code):
+├── Task 1: DatabaseInitializer.java — 新增 health_reports 6列 + health_indicators symptoms列
+├── Task 2: schema.sql — 修正 idx_child_id → idx_user_id
+├── Task 3: HealthReport.java entity — 新增 6 个字段
+├── Task 4: HealthIndicator.java entity — 新增 symptoms 字段
+├── Task 5: HealthReportController — createReport 支持新字段
+├── Task 6: HealthAnalysisService — analyze() 读取新字段
+└── Task 7: 编译验证 + API 测试
+
+Critical Path: Task 1 → Task 3 → Task 5 → Task 7
+```
+
+---
+
+## TODOs
+
+- [ ] 1. DatabaseInitializer — 新增 health_reports 6列 + health_indicators symptoms列
+
+  **What to do**:
+  - 在 `DatabaseInitializer.java` 中,在现有的 `health_reports` 表创建块之后,新增 6 个 ALTER TABLE 语句添加列
+  - 在现有的 `health_indicators` 表创建块之后(或单独新建块),新增 ALTER TABLE 添加 `symptoms` 列
+  - 使用 `jdbcTemplate.execute()` 包裹,catch 异常打印 warn(表/列可能已存在)
+
+  新增 health_reports 列:
+  ```sql
+  ALTER TABLE health_reports ADD COLUMN gut_balance_score INT COMMENT '菌群平衡分(0-100)'
+  ALTER TABLE health_reports ADD COLUMN gut_diversity_score INT COMMENT '菌群多样性分(0-100)'
+  ALTER TABLE health_reports ADD COLUMN beneficial_bacteria_score INT COMMENT '有益菌分(0-100)'
+  ALTER TABLE health_reports ADD COLUMN harmful_bacteria_score INT COMMENT '有害菌分(0-100)'
+  ALTER TABLE health_reports ADD COLUMN core_species_score INT COMMENT '核心菌属分(0-100)'
+  ALTER TABLE health_reports ADD COLUMN health_rating VARCHAR(100) COMMENT '总分评级,如亚健康/优秀等'
+  ```
+
+  新增 health_indicators 列:
+  ```sql
+  ALTER TABLE health_indicators ADD COLUMN symptoms TEXT COMMENT '过量/缺乏相关症状描述'
+  ```
+
+  **Must NOT do**:
+  - 不修改已有的表创建块逻辑
+  - 不触碰 DanAssessmentResult 相关代码
+  - 不修改 health_gut_flora 的 DDL
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+  - **Reason**: 纯 SQL/DDL 增删,无复杂业务逻辑
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 必须先执行此任务才能验证 entity 变更
+  - **Blocks**: Tasks 2, 3, 4, 5, 6, 7
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java:1386-1436` — 现有 health_gut_flora/disease_risk 表的创建代码,复制其 try/catch 结构
+  - `cfc-backend/src/main/java/com/etotem/cfc/entity/HealthReport.java` — entity 当前字段,参考 @TableField 风格
+
+  **Acceptance Criteria**:
+  - [ ] mvn compile 通过
+  - [ ] 启动后数据库 health_reports 表有新 6 列
+  - [ ] 启动后数据库 health_indicators 表有 symptoms 列
+
+  **QA Scenarios**:
+
+  Scenario: 数据库列创建验证
+    Tool: Bash
+    Preconditions: MySQL running, app started
+    Steps:
+      1. `mysql -h 192.168.16.251 -u cfc -pcfc@123 cfc -e "DESCRIBE health_reports;" | grep -E "gut_balance_score|gut_diversity_score|beneficial_bacteria_score|harmful_bacteria_score|core_species_score|health_rating"`
+      2. `mysql -h 192.168.16.251 -u cfc -pcfc@123 cfc -e "DESCRIBE health_indicators;" | grep symptoms`
+    Expected Result: 所有 7 个新列都存在于表中
+    Failure Indicators: 列不存在则 ALTER TABLE 未执行
+    Evidence: .sisyphus/evidence/task-1-columns-exist.txt
+
+  **Commit**: YES (grouped with all tasks)
+  - Message: `feat(entity): add gut flora summary fields to health_reports and symptoms to health_indicators`
+  - Files: DatabaseInitializer.java, schema.sql, HealthReport.java, HealthIndicator.java
+
+---
+
+- [ ] 2. schema.sql — 修正 idx_child_id → idx_user_id
+
+  **What to do**:
+  - 读取 `cfc-backend/src/main/resources/schema.sql` 第 1376-1396 行(health_reports 表创建块)
+  - 将 `INDEX idx_child_id (child_id)` 改为 `INDEX idx_user_id (user_id)`
+  - 健康总分说明注释掉的旧 index 也一并检查修正
+
+  **Must NOT do**:
+  - 不修改 health_reports 表其他内容
+  - 不添加新表
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 依赖 Task 1 的 DB 初始化逻辑已存在
+  - **Blocks**: None
+
+  **References**:
+  - `cfc-backend/src/main/resources/schema.sql:1376-1396` — health_reports 表当前定义
+
+  **Acceptance Criteria**:
+  - [ ] schema.sql 中 idx_child_id 已改为 idx_user_id
+
+  **QA Scenarios**:
+
+  Scenario: schema.sql 索引修正验证
+    Tool: grep
+    Steps:
+      1. `grep -n "idx_child_id" cfc-backend/src/main/resources/schema.sql` (应无结果)
+      2. `grep -n "idx_user_id" cfc-backend/src/main/resources/schema.sql` (应有结果)
+    Expected Result: idx_child_id 不存在,idx_user_id 存在
+    Evidence: .sisyphus/evidence/task-2-index-fix.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+- [ ] 3. HealthReport.java — 新增 6 个菌群摘要字段
+
+  **What to do**:
+  - 在 `HealthReport.java` 中,在 `gutType` 字段后,新增 6 个 private 字段:
+  ```java
+  /** 菌群平衡分 (0-100) */
+  private Integer gutBalanceScore;
+
+  /** 菌群多样性分 (0-100) */
+  private Integer gutDiversityScore;
+
+  /** 有益菌分 (0-100) */
+  private Integer beneficialBacteriaScore;
+
+  /** 有害菌分 (0-100) */
+  private Integer harmfulBacteriaScore;
+
+  /** 核心菌属分 (0-100) */
+  private Integer coreSpeciesScore;
+
+  /** 总分评级文字,如"亚健康及营养饮食不合理" */
+  private String healthRating;
+  ```
+  - 使用 `@TableField` 注解确保列名匹配 snake_case
+  - 注意:entity 使用 Lombok @Data,所以只需加字段声明(setter/getter 由 Lombok 生成)
+
+  **Must NOT do**:
+  - 不修改现有字段类型或注解
+  - 不添加新方法
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 依赖 Task 1 的 DDL
+  - **Blocks**: Tasks 4, 5, 6
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/entity/HealthReport.java:1-65` — 现有字段风格
+  - MyBatis-Plus 列名映射规则:camelCase → snake_case 自动转换(Lombok @TableField 可覆盖)
+
+  **Acceptance Criteria**:
+  - [ ] HealthReport.java 有 6 个新字段声明
+  - [ ] mvn compile 通过
+
+  **QA Scenarios**:
+
+  Scenario: 编译验证
+    Tool: Bash
+    Steps:
+      1. `cd cfc-backend && mvn clean compile -q 2>&1 | tail -5`
+    Expected Result: BUILD SUCCESS
+    Evidence: .sisyphus/evidence/task-3-compile.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+- [ ] 4. HealthIndicator.java — 新增 symptoms 字段
+
+  **What to do**:
+  - 在 `HealthIndicator.java` 中,`status` 字段后新增:
+  ```java
+  /** 过量/缺乏相关症状描述文本 */
+  private String symptoms;
+  ```
+  - 使用 `@TableField("symptoms")` 显式指定列名
+
+  **Must NOT do**:
+  - 不修改现有字段
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: YES — 独立 entity,不与其他任务共享文件
+  - **Blocks**: Tasks 5, 6
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/entity/HealthIndicator.java` — 现有字段风格
+
+  **Acceptance Criteria**:
+  - [ ] HealthIndicator.java 有 symptoms 字段
+  - [ ] mvn compile 通过
+
+  **QA Scenarios**:
+
+  Scenario: 编译验证
+    Tool: Bash
+    Steps:
+      1. `cd cfc-backend && mvn clean compile -q 2>&1 | tail -5`
+    Expected Result: BUILD SUCCESS
+    Evidence: .sisyphus/evidence/task-4-compile.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+- [ ] 5. HealthReportController — createReport 支持新字段
+
+  **What to do**:
+  - 读取 `HealthReportController.java` 的 `createReport` 方法
+  - 在构建 `HealthReport` 对象时,增加对新字段的提取:
+  ```java
+  report.setGutBalanceScore(params.get("gutBalanceScore") != null
+          ? Integer.valueOf(params.get("gutBalanceScore").toString()) : null);
+  report.setGutDiversityScore(params.get("gutDiversityScore") != null
+          ? Integer.valueOf(params.get("gutDiversityScore").toString()) : null);
+  report.setBeneficialBacteriaScore(params.get("beneficialBacteriaScore") != null
+          ? Integer.valueOf(params.get("beneficialBacteriaScore").toString()) : null);
+  report.setHarmfulBacteriaScore(params.get("harmfulBacteriaScore") != null
+          ? Integer.valueOf(params.get("harmfulBacteriaScore").toString()) : null);
+  report.setCoreSpeciesScore(params.get("coreSpeciesScore") != null
+          ? Integer.valueOf(params.get("coreSpeciesScore").toString()) : null);
+  report.setHealthRating((String) params.get("healthRating"));
+  ```
+  - 参考现有 `overallScore`、`gutHealthScore` 等字段的提取方式,保持一致
+
+  **Must NOT do**:
+  - 不修改已有的指标(indicators)处理逻辑
+  - 不新增端点
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 依赖 Task 3 (entity 更新)
+  - **Blocks**: Task 7
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java:46-90` — createReport 方法完整逻辑
+
+  **Acceptance Criteria**:
+  - [ ] createReport 接受并设置所有 6 个新字段
+  - [ ] mvn compile 通过
+
+  **QA Scenarios**:
+
+  Scenario: 创建含新字段的报告
+    Tool: Bash
+    Preconditions: mvn spring-boot:run 已在 localhost:9082 启动
+    Steps:
+      1. 先获取 token: `curl -s -X POST http://localhost:9082/api/auth/login -H "Content-Type: application/json" -d '{"phone":"test","code":"123456"}'`
+      2. `curl -s -X POST http://localhost:9082/api/health/report/create -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"childId":1,"reportType":"gut_flora","overallScore":68,"gutBalanceScore":31,"gutDiversityScore":37,"beneficialBacteriaScore":34,"harmfulBacteriaScore":78,"coreSpeciesScore":77,"healthRating":"亚健康及营养饮食不合理"}'`
+    Expected Result: code=200, data.gutBalanceScore=31, data.gutDiversityScore=37, data.beneficialBacteriaScore=34, data.harmfulBacteriaScore=78, data.coreSpeciesScore=77, data.healthRating="亚健康及营养饮食不合理"
+    Failure Indicators: 新字段返回 null
+    Evidence: .sisyphus/evidence/task-5-api-test.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+- [ ] 6. HealthAnalysisService — analyze() 读取新字段
+
+  **What to do**:
+  - 读取 `HealthAnalysisService.java` 的 `analyze()` 方法
+  - 在组装 `HealthAnalysisResult` 时,增加对新字段的利用:
+    - 如果 `gutBalanceScore` 偏低(如 < 40),追加 finding 和 suggestion
+    - 如果 `gutDiversityScore` 偏低,追加 finding
+    - 如果 `beneficialBacteriaScore` 偏低,追加 finding
+    - 如果 `harmfulBacteriaScore` 偏高,追加 finding
+    - 如果 `coreSpeciesScore` 偏低,追加 finding
+    - 如果 `healthRating` 包含"亚健康",追加到 findings
+  - 在 `HealthAnalysisResult` 中使用新字段作为分析输入,而非仅作为输出
+
+  **Must NOT do**:
+  - 不修改 `getReportDetail` 的返回结构(不破坏现有 API 兼容性)
+  - 不新增端点
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 依赖 Task 3 (entity)
+  - **Blocks**: Task 7
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/service/HealthAnalysisService.java:38-125` — 当前 analyze() 逻辑
+  - `cfc-backend/src/main/java/com/etotem/cfc/dto/HealthAnalysisResult.java` — result DTO 结构
+
+  **Acceptance Criteria**:
+  - [ ] HealthAnalysisService.analyze() 使用新字段进行分析
+  - [ ] mvn compile 通过
+
+  **QA Scenarios**:
+
+  Scenario: 分析服务使用新字段
+    Tool: Bash
+    Preconditions: Task 5 已完成(报告已创建)
+    Steps:
+      1. `curl -s -X POST http://localhost:9082/api/ai/nutrition/analyze -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"reportId":1}'` 或直接调用内部 analyze 方法
+    Expected Result: 分析结果包含基于新字段的 findings
+    Evidence: .sisyphus/evidence/task-6-analysis-test.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+- [ ] 7. 编译验证 + API 端到端测试
+
+  **What to do**:
+  - `mvn clean compile` 验证所有修改通过
+  - `mvn spring-boot:run` 启动应用
+  - 执行以下端到端测试:
+    1. 创建含所有新字段的报告 → 验证存储成功
+    2. 读取报告 → 验证所有 6 个新字段返回
+    3. 创建含 symptoms 的指标 → 验证症状文本存储
+    4. 读取指标列表 → 验证 symptoms 字段存在
+  - 所有测试命令和结果保存为 evidence 文件
+
+  **Must NOT do**:
+  - 不修改任何代码
+
+  **Recommended Agent Profile**:
+  - **Category**: `quick`
+  - **Skills**: []
+
+  **Parallelization**:
+  - **Can Run In Parallel**: NO — 最终验证阶段
+  - **Blocks**: None
+
+  **References**:
+  - `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java` — API 端点
+  - `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java:126-138` — indicator list 端点
+
+  **Acceptance Criteria**:
+  - [ ] mvn clean compile → BUILD SUCCESS
+  - [ ] mvn spring-boot:run → Started 消息
+  - [ ] 所有 curl 测试通过
+
+  **QA Scenarios**:
+
+  Scenario: 端到端验证
+    Tool: Bash
+    Preconditions: mvn spring-boot:run 启动完成
+    Steps:
+      1. 创建报告: `curl -s -X POST http://localhost:9082/api/health/report/create -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"childId":1,"reportType":"gut_flora","overallScore":68,"gutBalanceScore":31,"gutDiversityScore":37,"beneficialBacteriaScore":34,"harmfulBacteriaScore":78,"coreSpeciesScore":77,"healthRating":"亚健康"}'`
+      2. 读取报告: `curl -s -X POST http://localhost:9082/api/health/report/latest -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"childId":1}'`
+      3. 创建指标: `curl -s -X POST http://localhost:9082/api/health/report/create -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"childId":1,"reportType":"gut_flora","indicators":[{"category":"肠道屏障","indicatorName":"对甲酚","indicatorValue":"89","status":"过多","refRange":"0-85","symptoms":"尿毒症毒素,慢性肾病"}]}'`
+      4. 读取指标: `curl -s -X POST http://localhost:9082/api/health/indicator/list -H "Authorization: Bearer {token}" -H "Content-Type: application/json" -d '{"reportId":1}'`
+    Expected Result: 所有新字段正确存储和返回
+    Evidence: .sisyphus/evidence/task-7-e2e.txt
+
+  **Commit**: YES (grouped)
+
+---
+
+## Final Verification Wave (MANDATORY — after ALL implementation tasks)
+
+- [ ] F1. **Plan Compliance Audit** — `oracle`
+  Read the plan end-to-end. For each "Must Have": verify implementation exists. For each "Must NOT Have": search codebase for forbidden patterns. Check evidence files exist in .sisyphus/evidence/.
+  Output: `Must Have [7/7] | Must NOT Have [3/3] | Tasks [7/7] | VERDICT: APPROVE/REJECT`
+
+- [ ] F2. **Code Quality Review** — `unspecified-high`
+  Run `mvn clean compile` (not spring-boot:run, just compile). Review all changed files for: `as any`/`@ts-ignore`, empty catches, console.log in prod, commented-out code, unused imports. Check AI slop: excessive comments, over-abstraction.
+  Output: `Build [PASS/FAIL] | Files [N clean/N issues] | VERDICT`
+
+- [ ] F3. **Real Manual QA** — `unspecified-high`
+  Start from clean state. Execute EVERY QA scenario from EVERY task — follow exact steps, capture evidence. Test cross-task integration (features working together, not isolation). Test edge cases: null values for new fields, empty symptoms string.
+  Output: `Scenarios [N/N pass] | Integration [N/N] | Edge Cases [N tested] | VERDICT`
+
+- [ ] F4. **Scope Fidelity Check** — `deep`
+  For each task: read "What to do", read actual diff (git log/diff). Verify 1:1 — everything in spec was built (no missing), nothing beyond spec was built (no creep). Check "Must NOT do" compliance.
+  Output: `Tasks [N/N compliant] | Contamination [CLEAN/N issues] | Unaccounted [CLEAN/N files] | VERDICT`
+
+---
+
+## Commit Strategy
+
+- **1**: `feat(entity): add gut flora summary fields to health_reports and symptoms to health_indicators`
+  - Files: DatabaseInitializer.java, schema.sql, HealthReport.java, HealthIndicator.java, HealthReportController.java, HealthAnalysisService.java
+  - Pre-commit: `mvn clean compile`
+
+---
+
+## Success Criteria
+- **1**: `feat(entity): add gut flora summary fields to health_reports and symptoms to health_indicators`
+  - Files: HealthReport.java, HealthIndicator.java, DatabaseInitializer.java, schema.sql
+  - Pre-commit: `mvn clean compile`
+
+---
+
+## Success Criteria
+
+### Verification Commands
+```bash
+# 1. 编译通过
+cd cfc-backend && mvn clean compile
+
+# 2. 后端启动验证
+mvn spring-boot:run
+# Expected: Started CfcApplication in X seconds
+
+# 3. 创建报告含新字段
+curl -X POST http://localhost:9082/api/health/report/create \
+  -H "Authorization: Bearer {token}" \
+  -H "Content-Type: application/json" \
+  -d '{"childId":1,"reportType":"gut_flora","overallScore":68,"gutHealthScore":53,"gutBalanceScore":31,"gutDiversityScore":37,"beneficialBacteriaScore":34,"harmfulBacteriaScore":78,"coreSpeciesScore":77,"healthRating":"亚健康及营养饮食不合理"}'
+# Expected: code=200, data contains all submitted fields
+
+# 4. 读取报告含新字段
+curl -X POST http://localhost:9082/api/health/report/latest \
+  -H "Authorization: Bearer {token}" \
+  -H "Content-Type: application/json" \
+  -d '{"childId":1}'
+# Expected: data.gutBalanceScore=31, data.gutDiversityScore=37, etc.
+
+# 5. 创建含症状的指标
+curl -X POST http://localhost:9082/api/health/report/create \
+  -H "Authorization: Bearer {token}" \
+  -H "Content-Type: application/json" \
+  -d '{"childId":1,"reportType":"gut_flora","indicators":[{"category":"肠道屏障","indicatorName":"对甲酚","indicatorValue":"89","status":"过多","refRange":"0-85","symptoms":"尿毒症毒素,慢性肾病,神经行为疾病,结直肠癌,自闭症"}]}'
+# Expected: code=200
+
+# 6. 读取指标含症状
+curl -X POST http://localhost:9082/api/health/indicator/list \
+  -H "Authorization: Bearer {token}" \
+  -H "Content-Type: application/json" \
+  -d '{"reportId":1}'
+# Expected: data[0].symptoms contains symptom text
+```
+
+### Final Checklist
+- [ ] health_reports 表有 gut_balance_score, gut_diversity_score, beneficial_bacteria_score, harmful_bacteria_score, core_species_score, health_rating 列
+- [ ] health_indicators 表有 symptoms 列
+- [ ] HealthReport.java has all 6 new fields with @TableField annotation
+- [ ] HealthIndicator.java has symptoms field with @TableField annotation
+- [ ] createReport API accepts and stores new fields
+- [ ] latest report API returns new fields
+- [ ] HealthAnalysisService.analyze() uses new fields if present
+- [ ] schema.sql idx_child_id corrected to idx_user_id
+- [ ] mvn clean compile passes