Jelajahi Sumber

docs(tdd): 研发负责人3 补交标准模板汇报 + 统一维度体系设计文档入主线

- 补交 42 轮欠账的 report-dev-2026-11-04-2145.md(模板 v1.1 全章节真实数据)
- 合入 11-03 统一维度体系 PRD/design/class/sequence 4 份设计文档
- 目的:使 S-cfc-7/S-cfc-8 的 --requirement/--design 溯源锚点对远程会话可读
- 仅文档,不含任何业务代码;Dimension* Java 变体因与 feature/unified-dimension-p0 冲突暂缓
Agnes Agent 1 Minggu lalu
induk
melakukan
ba4ac94d7c

+ 83 - 0
docs/superpowers/specs/2026-11-03-unified-dimension-system-class.mermaid

@@ -0,0 +1,83 @@
+classDiagram
+    class ProductDimensionConfig {
+        +Long id
+        +String dimensionCode   // 统一 code
+        +String dimensionName
+        +String dimensionType
+        +Long parentId          // 自引用树
+        +Integer sort
+        +Integer enabled
+        +String legacyAlias     // JSON数组, 历史别名
+        +String sourceSystem    // health/energy/indicator/knowledge
+        +String wuxingRuleRef   // 五行规则引用
+        +String nodeKind        // root/sub
+        +Date createdAt
+        +Date updatedAt
+    }
+
+    class IndicatorDefinition {
+        +Long id                // 主键不变(红线1)
+        +String domain
+        +String code
+        +String name
+        +String dimensionCode   // 收敛至注册中心code
+        +Long parentId          // 新增: 混排挂到维度节点
+        +String legacyAlias     // 新增
+        +Date createdAt
+        +Date updatedAt
+    }
+
+    class HealthDimensionScore {
+        +Long id
+        +Long memberId
+        +String dimension       // 迁移后=body.growth等
+        +Integer score
+        +Integer percentile
+        +Date assessDate
+    }
+
+    class EnergyDimension {
+        +Long id
+        +String code            // 已=body/mind/...
+        +String name
+        +String element         // 木/火/金/水/土
+    }
+    class EnergyDimensionConfig
+    class DimensionWeight {
+        +Long id
+        +String targetType
+        +Long targetId
+        +String dimension       // 已=body/mind/...
+        +Integer weight
+    }
+    class EnergyRule
+
+    class DimensionCodeConstants
+    class DimensionCodeMapper {
+        +String resolveToUnified(String legacy)
+        +List~String~ resolveLegacy(String unified)
+    }
+    class DimensionRegistryService {
+        +List~DimensionNode~ getTree()
+        +DimensionNode getNodeByCode(String code)
+        +List~DimensionNode~ getRoots()
+        +void saveConfig(ProductDimensionConfig node)
+    }
+    class DimensionSyncService {
+        +void syncToLegacy(ProductDimensionConfig node)
+    }
+
+    ProductDimensionConfig "1" --> "0..* " ProductDimensionConfig : parent_id self-ref
+    IndicatorDefinition "0..*" --> "1" ProductDimensionConfig : parent_id 挂到维度节点
+    IndicatorDefinition "1" --> "0..* " IndicatorDefinition : parent_id 自引用(指标子树)
+
+    HealthDimensionScore ..> ProductDimensionConfig : dimension → dimensionCode(经映射层)
+    DimensionRegistryService --> DimensionCodeMapper
+    DimensionRegistryService --> ProductDimensionConfig
+    DimensionSyncService --> ProductDimensionConfig
+    DimensionSyncService ..> EnergyDimension : 双写同步(flag控制)
+    DimensionSyncService ..> DimensionWeight : 双写同步
+
+    EnergyService ..> EnergyDimensionConfig : 过渡期读旧表
+    EnergyService ..> DimensionRegistryService : P1后读注册中心
+    DimensionScoreServiceImpl ..> DimensionRegistryService : P1后读7维

+ 466 - 0
docs/superpowers/specs/2026-11-03-unified-dimension-system-design.md

@@ -0,0 +1,466 @@
+# 统一维度体系 — 增量架构设计(Unified Dimension System Design)
+
+> 文档类型:增量架构设计(基于 PRD `2026-11-03-unified-dimension-system-prd.md`)
+> 作者:高见远(架构师) · 日期:2026-11-04
+> 关联决策:主理人(廖总/齐活林)已拍板的 4 项决策 + Q5 双写过渡期策略
+
+---
+
+## 0. 文档信息 / 与 PRD 的关系
+
+本设计**仅产出架构与任务拆分,不写业务代码**。它是 PRD 的落地蓝图,严格遵循主理人 4 项决策与 5 条红线(见 PRD §5)。
+
+**架构终态一句话**:CFC 只有一棵维度树——根为 5 个权威 code(`body`/`mind`/`wisdom`/`action`/`wealth`),`product_dimension_config` 升级为**唯一维度注册中心**(含 `parent_id` 多级树 + 指标混排 + `legacy_alias` 历史别名映射),所有子系统只读引用注册中心,4 套旧编码仅作历史别名,经映射层翻译,五行规则逻辑不变仅维度来源切换。
+
+---
+
+## 1. 主理人 4 项决策落地结论(决策映射)
+
+| # | 决策 | 本设计落地方式 |
+|---|---|---|
+| 1 | 注册中心 = 升级现有表 | `product_dimension_config` 加 `legacy_alias`/`source_system`/`wuxing_rule_ref`/`node_kind` 列;复用 `/api/admin/dimension-config/*` 与 `cfc-web/src/views/admin/dimension/index.vue`;**不新建** `dimension_registry` 表 |
+| 2 | 指标并入维度树混排 | `indicator_definitions` 加 `parent_id`(自引用),允许指标节点作为维度树子节点;`id` 主键不变 → 5 张外键表仍 `FK→indicator_definitions.id`,**红线 1 满足** |
+| 3 | 7 维纳入统一树 | **7 维作为「维度节点」挂在 `body` 根下**(非指标节点):新增 `body.growth`/`body.sleep`/…/`body.exercise` 7 行 `product_dimension_config`,`parent_id=body.id`,`legacy_alias=['growth',…]`;指标(如体脂率)后续在 P2 作为指标节点挂到 `body.exercise` 下 |
+| 4 | 历史数据全量迁移 | 存量 `health_dimension_scores.dimension` 全量改写为 `body.*`;`indicator_definitions.dimension_code` 校验收敛至注册中心 code 集合;提供迁移脚本 + 回滚预案(含备份表) |
+| Q5 | 双写过渡期 | 注册中心上线后**先双写**(新写入同时落注册中心 + 旧表,由 `DimensionSyncService` 经 feature flag 控制);网关/调用日志确认旧接口零调用后再退役旧体系;提供回滚 |
+
+**关键事实支撑**:经核对 schema.sql,`energy_dimension.code` 与 `dimension_weights.dimension` **本就使用** `body/mind/wisdom/action/wealth`,与统一 5 根完全一致。故旧能量体系与注册中心 5 根是 **1:1 code 对齐**,双写同步是低成本映射,五行规则逻辑零改动。
+
+---
+
+## 2. 实现方案 + 框架选型
+
+### 2.1 注册中心物理落地
+- **物理表**:`product_dimension_config`(升级,不新建表)。
+- **树结构**:沿用现有 `parent_id` 自引用多级树;新增 `node_kind` 区分 `root` / `sub`;新增 `source_system` 标记来源(health/energy/indicator/knowledge);新增 `legacy_alias`(JSON 数组)承载 4 套旧编码;新增 `wuxing_rule_ref`(VARCHAR(30))指向五行规则(沿用 `EnergyDimension.element` 的 木/火/金/水/土 取值)。
+- **混排**:统一树 = `product_dimension_config` 维度节点 ∪ `indicator_definitions` 指标节点(其 `parent_id` 指向某维度节点 `id`)。由 `DimensionRegistryService.buildTree()` 合并。
+
+### 2.2 指标并入维度树(混排)
+- `indicator_definitions` 增加 `parent_id BIGINT`(自引用 + 可指向维度节点)、`legacy_alias VARCHAR(255)`。
+- **不改 `id` 主键、不改外键目标** → 5 张外键表(`indicator_values`/`indicator_mapping_rules`/`indicator_correlations(definition_id_a/b)`/`indicator_favorite`/归一化中间表)与 19 个后端引用文件**一律不动**(红线 1)。
+
+### 2.3 7 维落点决策(决策 3 落地)
+- 7 维是「维度」不是「指标」,归属 `health_dimension_scores.dimension`,故作为**维度节点**挂在 `body` 下,code 为 `body.growth` 等。
+- `legacy_alias` 绑定旧名 `growth`,实现双向可查(旧 health 代码 `growth` ↔ 新 `body.growth`)。
+- 指标(如体脂率、慢性病)归属 `body.exercise`/`body.nutrition` 等,在 P2 作为指标节点挂接(混排),不抢占 7 维维度节点位置。
+
+### 2.4 框架选型
+- **后端**:沿用现有 `Spring Boot + MyBatis-Plus + Jackson`,注册中心服务/映射/同步均为新增 Spring `@Service`,不引入新框架。
+- **前端**:沿用 `Vue 2(cfc-web)/ uni-app(cfc-frontend)`,新增统一取数 composable `useDimensionRegistry`(DimensionProvider)。
+- **数据库迁移**:严格走 `DatabaseInitializer.runMigrations()` + `ensureColumn()`(幂等),同步 `schema.sql`。
+- **预计新增第三方依赖:无。**
+
+### 2.5 接口策略
+- **新增只读查询接口**:`/api/dimension-registry/*`(统一取数入口)。
+- **升级现有 admin 写入接口**:`/api/admin/dimension-config/*` 内部改调注册中心(`DimensionRegistryService`),保留路径兼容;写入时经 `DimensionSyncService` 双写到旧表(flag 控制)。
+- **标记废弃**:`/api/dimension/overview`、`/api/dimension/radar-data` 标 `@Deprecated`,保留至调用日志确认零调用(红线 4)。
+
+---
+
+## 3. 数据模型变更清单(增量 DDL)
+
+### 3.1 `product_dimension_config` 增量列
+```sql
+-- 通过 DatabaseInitializer.ensureColumn 幂等新增(不修改既有列)
+ALTER TABLE product_dimension_config
+  ADD COLUMN legacy_alias    VARCHAR(512)  DEFAULT NULL COMMENT '历史别名(JSON数组): 承载现存4套编码, 如 ["growth"]',
+  ADD COLUMN source_system    VARCHAR(32)   DEFAULT NULL COMMENT '归属子系统: health/energy/indicator/knowledge',
+  ADD COLUMN wuxing_rule_ref  VARCHAR(30)   DEFAULT NULL COMMENT '五行规则引用(木/火/金/水/土), 关联EnergyDimension.element',
+  ADD COLUMN node_kind        VARCHAR(16)   DEFAULT 'root' COMMENT '节点种类: root(五维根)/sub(子维度)';
+```
+> 现有 `dimension_code VARCHAR(50) NOT NULL UNIQUE` 复用为**统一 code**(`body`/`body.growth` 等,均为唯一字符串,无冲突)。
+
+### 3.2 `indicator_definitions` 增量列
+```sql
+ALTER TABLE indicator_definitions
+  ADD COLUMN parent_id    BIGINT       DEFAULT NULL COMMENT '父节点ID(可指向product_dimension_config.id或本表id, 混排进维度树)',
+  ADD COLUMN legacy_alias VARCHAR(512) DEFAULT NULL COMMENT '历史别名(JSON数组)';
+-- 既有 dimension_code VARCHAR(16) 保留(向后兼容), 取值收敛至注册中心code集合(P1校验)
+```
+> 不改变 `id` 主键、不改变任何外键目标(红线 1)。`dimension_code` 维持 `VARCHAR(16)`(统一子 code 如 `body.growth`=11 字符,`mind.perception`=14 字符,均 <16,足够)。
+
+### 3.3 统一 code 命名规范
+- **根维度**:`body` / `mind` / `wisdom` / `action` / `wealth`(5 个唯一权威,PRD 红线 2)。
+- **子维度**:`{root}.{sub}`,全小写点分。固化示例:
+  - `body.growth` `body.sleep` `body.vision` `body.immunity` `body.nutrition` `body.gut` `body.exercise`
+  - (P2 扩展)`mind.memory`/`mind.attention`…、`wisdom.openness`…、`action.skill`…、`wealth.income`…
+- **指标节点 code**:沿用 `indicator_definitions.code`(如 `tongue_color`),通过 `parent_id` 挂到维度节点,不占用维度 code 命名空间。
+- **legacy_alias 格式**:JSON 数组字符串,如 `["growth","physical"]`;解析用 Jackson。
+
+### 3.4 schema.sql 同步纪律(AGENTS.md 约束)
+- 每次 `ensureColumn` 后,**必须同步** `cfc-backend/src/main/resources/schema.sql` 中对应 `CREATE TABLE` 的字段定义(将新增 4 列补入 `product_dimension_config`、`parent_id`/`legacy_alias` 补入 `indicator_definitions`)。
+- 迁移编号:搜索 `// 迁移` 取最新号递增,保证幂等。
+
+---
+
+## 4. 映射层设计(legacy_alias ↔ 统一 code)
+
+**双向可查**:旧编码 → 统一 code(`resolveToUnified`);统一 code → 旧编码(`resolveLegacy`)。
+
+- **存储**:每节点 `legacy_alias` 列(JSON 数组)。注册中心加载后构建内存索引 `Map<legacyCode, unifiedCode>` 与 `Map<unifiedCode, List<legacyCode>>`。
+- **读取 API**:`GET /api/dimension-registry/map?legacy=growth` → `body.growth`;`GET /api/dimension-registry/code/{code}` → 节点详情(含 legacy_alias)。
+- **服务类**:`DimensionCodeMapper`(见 §6 类图)。
+- **示例映射**(P0 固化):
+
+| 统一 code | legacy_alias(旧体系来源) | source_system |
+|---|---|---|
+| `body` | `["body"]` | energy |
+| `body.growth` | `["growth"]` | health |
+| `body.sleep` | `["sleep"]` | health |
+| `body.vision` | `["vision"]` | health |
+| `body.immunity` | `["immunity"]` | health |
+| `body.nutrition` | `["nutrition"]` | health |
+| `body.gut` | `["gut"]` | health |
+| `body.exercise` | `["exercise"]` | health |
+| `mind`/`wisdom`/`action`/`wealth` | 各自同名 | energy |
+
+> 旧能量体系(`energy_dimension.code`)与统一 5 根同码,无需 alias 翻译,双写同步即 1:1。
+
+---
+
+## 5. 接口设计(新增 / 改造 / 废弃)
+
+### 5.1 新增(只读查询,统一取数入口)
+| 方法 | 路径 | 入参 | 出参 | 说明 |
+|---|---|---|---|---|
+| GET | `/api/dimension-registry/tree` | `?sourceSystem=`(可选) | `Result<List<DimensionNode>>` | 合并维度节点+指标节点的统一树 |
+| GET | `/api/dimension-registry/roots` | — | `Result<List<DimensionNode>>` | 5 根 |
+| GET | `/api/dimension-registry/code/{code}` | path `code` | `Result<DimensionNode>` | 按统一 code 取节点(含 legacy_alias) |
+| GET | `/api/dimension-registry/map` | `?legacy=` | `Result<String>` | legacy→统一 code 解析 |
+
+`DimensionNode` 结构:`{id, code, name, parentId, nodeKind, sourceSystem, legacyAlias, wuxingRuleRef, children?}`。
+
+### 5.2 改造(兼容保留)
+| 方法 | 路径 | 变更 |
+|---|---|---|
+| POST | `/api/admin/dimension-config/tree` | 内部改调 `DimensionRegistryService.getTree()`,返回含 7 body 子节点;路径/出参不变 |
+| POST | `/api/admin/dimension-config/save` | 改调注册中心写入;若 `dimension.registry.dualWrite=true`,触发 `DimensionSyncService.syncToLegacy()` |
+| POST | `/api/admin/indicator/save` | 新增 `parentId` 入参;校验 `dimensionCode` ∈ 注册中心 code 集合 |
+
+### 5.3 标记废弃(保留至零调用)
+- `GET /api/dimension/overview`、`GET /api/dimension/radar-data`:标 `@Deprecated`,前端改走 `/api/dimension-registry/*` 后下线。
+- `DimensionSelector`/`ContentDimensionThresholdEditor`/`KnowledgeBase` 直读 `product_dimension_config` 的代码(P1-4 改为经 `DimensionRegistryService`)。
+
+### 5.4 旧体系退役范围(P2-T3)
+`energy_dimension` / `energy_dimension_config` / `dimension_weights` / `energy_rule` 等配置表,在 `EnergyService` 完成来源切换(P1-T2)且调用日志确认零引用后 DROP(无外键指向 indicator 表,可安全删除)。
+
+---
+
+## 6. 类图 / 关键实体关系(Mermaid classDiagram)
+
+```mermaid
+classDiagram
+    class ProductDimensionConfig {
+        +Long id
+        +String dimensionCode   // 统一 code
+        +String dimensionName
+        +String dimensionType
+        +Long parentId          // 自引用树
+        +Integer sort
+        +Integer enabled
+        +String legacyAlias     // JSON数组, 历史别名
+        +String sourceSystem    // health/energy/indicator/knowledge
+        +String wuxingRuleRef   // 五行规则引用
+        +String nodeKind        // root/sub
+        +Date createdAt
+        +Date updatedAt
+    }
+
+    class IndicatorDefinition {
+        +Long id                // 主键不变(红线1)
+        +String domain
+        +String code
+        +String name
+        +String dimensionCode   // 收敛至注册中心code
+        +Long parentId          // 新增: 混排挂到维度节点
+        +String legacyAlias     // 新增
+        +Date createdAt
+        +Date updatedAt
+    }
+
+    class HealthDimensionScore {
+        +Long id
+        +Long memberId
+        +String dimension       // 迁移后=body.growth等
+        +Integer score
+        +Integer percentile
+        +Date assessDate
+    }
+
+    class EnergyDimension {
+        +Long id
+        +String code            // 已=body/mind/...
+        +String name
+        +String element         // 木/火/金/水/土
+    }
+    class EnergyDimensionConfig
+    class DimensionWeight {
+        +Long id
+        +String targetType
+        +Long targetId
+        +String dimension       // 已=body/mind/...
+        +Integer weight
+    }
+    class EnergyRule
+
+    class DimensionCodeConstants
+    class DimensionCodeMapper {
+        +String resolveToUnified(String legacy)
+        +List~String~ resolveLegacy(String unified)
+    }
+    class DimensionRegistryService {
+        +List~DimensionNode~ getTree()
+        +DimensionNode getNodeByCode(String code)
+        +List~DimensionNode~ getRoots()
+        +void saveConfig(ProductDimensionConfig node)
+    }
+    class DimensionSyncService {
+        +void syncToLegacy(ProductDimensionConfig node)
+    }
+
+    ProductDimensionConfig "1" --> "0..* " ProductDimensionConfig : parent_id self-ref
+    IndicatorDefinition "0..*" --> "1" ProductDimensionConfig : parent_id 挂到维度节点
+    IndicatorDefinition "1" --> "0..* " IndicatorDefinition : parent_id 自引用(指标子树)
+
+    HealthDimensionScore ..> ProductDimensionConfig : dimension → dimensionCode(经映射层)
+    DimensionRegistryService --> DimensionCodeMapper
+    DimensionRegistryService --> ProductDimensionConfig
+    DimensionSyncService --> ProductDimensionConfig
+    DimensionSyncService ..> EnergyDimension : 双写同步(flag控制)
+    DimensionSyncService ..> DimensionWeight : 双写同步
+
+    EnergyService ..> EnergyDimensionConfig : 过渡期读旧表
+    EnergyService ..> DimensionRegistryService : P1后读注册中心
+    DimensionScoreServiceImpl ..> DimensionRegistryService : P1后读7维
+```
+
+> **红线 1 满足说明**:`IndicatorDefinition.id` 主键未改,`indicator_values` 等 5 张表外键仍指向 `indicator_definitions.id`,本设计仅对 `indicator_definitions` 新增 `parent_id`/`legacy_alias` 列,不动外键目标。
+
+---
+
+## 7. 调用流程图(Mermaid sequenceDiagram)
+
+### 7.1 前端雷达图/沙盘从注册中心取维度(读路径)
+```mermaid
+sequenceDiagram
+    actor User
+    participant FE as 小程序/管理端 DimensionProvider
+    participant API as DimensionRegistryController
+    participant SVC as DimensionRegistryService
+    participant CFG as ProductDimensionConfigMapper
+    participant IND as IndicatorDefinitionMapper
+
+    FE->>API: GET /api/dimension-registry/tree
+    API->>SVC: getTree()
+    SVC->>CFG: listAll()  // 维度节点(5根+7body+...)
+    SVC->>IND: listAll()  // 指标节点(带parentId)
+    CFG-->>SVC: 维度节点列表
+    IND-->>SVC: 指标节点列表
+    SVC->>SVC: mergeByParentId() 统一树
+    SVC-->>API: List<DimensionNode> tree
+    API-->>FE: Result.success(tree)
+    FE->>FE: 取 body 子节点渲染 RadarChart
+```
+
+### 7.2 指标挂维度树节点(写入路径)
+```mermaid
+sequenceDiagram
+    actor Admin
+    participant UI as 指标管理页
+    participant IC as IndicatorAdminController
+    participant ISVC as IndicatorService
+    participant M as DimensionCodeMapper
+    participant CFG as ProductDimensionConfigMapper
+    participant DB as indicator_definitions
+
+    Admin->>UI: 选父维度节点(body.exercise)+填指标
+    UI->>IC: POST /api/admin/indicator/save {code,parentId,dimensionCode}
+    IC->>ISVC: save(indicator)
+    ISVC->>M: validate(dimensionCode) ∈ 注册中心codes
+    M->>CFG: getNodeByCode(dimensionCode)
+    CFG-->>M: node / null
+    M-->>ISVC: ok / fail(400)
+    ISVC->>DB: INSERT/UPDATE (parent_id 设置)
+    DB-->>ISVC: id
+    ISVC-->>IC: IndicatorDefinition
+    IC-->>UI: Result.success(node)
+    Note over SVC: 后续 getTree() 把该指标挂到 body.exercise 下(混排)
+```
+
+### 7.3 双写过渡期:admin 写入 → 注册中心 + 旧表同步
+```mermaid
+sequenceDiagram
+    actor Admin
+    participant AC as DimensionConfigController
+    participant RS as DimensionRegistryService
+    participant CFG as product_dimension_config
+    participant SYNC as DimensionSyncService
+    participant LEG as energy_dimension_config / dimension_weights
+
+    Admin->>AC: POST /api/admin/dimension-config/save {code,parentId,...}
+    AC->>RS: saveConfig(node)
+    RS->>CFG: upsert product_dimension_config  // 注册中心权威
+    alt dimension.registry.dualWrite=true
+        RS->>SYNC: syncToLegacy(node)
+        SYNC->>LEG: upsert 对应 legacy 行(按code 1:1)
+    end
+    RS-->>AC: node
+    AC-->>Admin: success
+    Note over SYNC: 旧 EnergyService 仍读 legacy 表(行为不变); 新消费者读注册中心
+```
+
+---
+
+## 8. 历史数据全量迁移 + 双写过渡 + 退役 + 回滚预案
+
+### 8.1 迁移脚本(`cfc-backend/src/main/resources/db/migrate_dimension_unified.sql`)
+```sql
+-- 0) 备份(回滚用)
+CREATE TABLE IF NOT EXISTS health_dimension_scores_bak_20261104 LIKE health_dimension_scores;
+INSERT INTO health_dimension_scores_bak_20261104 SELECT * FROM health_dimension_scores;
+
+-- 1) 7维历史评分全量改写为统一code
+UPDATE health_dimension_scores
+   SET dimension = CONCAT('body.', dimension)
+ WHERE dimension IN ('growth','sleep','vision','immunity','nutrition','gut','exercise');
+
+-- 2) indicator_definitions.dimension_code 校验/收敛(既有值多为body/mind/..., 仅修正越界值)
+--    依据 DimensionCodeConstants 根集合; 越界值置 NULL 并记日志(由迁移程序扫描, 见 P0-T5)
+-- 3) 固化 5 根 + 7 维节点(seed)由 DatabaseInitializer 幂等插入(见 P0-T3)
+```
+- **幂等**:备份表 `IF NOT EXISTS`;UPDATE 仅命中 7 维旧值,重复执行无副作用。
+
+### 8.2 双写过渡期实现
+- **Feature flag** `dimension.registry.enabled` / `dimension.registry.dualWrite`(application.yml),默认 `enabled=false → true` 分阶段开启。
+- **写**:admin 写入注册中心后,`DimensionSyncService.syncToLegacy()` 按 `code` 1:1 upsert `energy_dimension` / `energy_dimension_config` / `dimension_weights`,旧 `EnergyService` 行为不变。
+- **读**:新消费者(雷达/沙盘/指标管理/知识库)走 `/api/dimension-registry/*`;旧消费者保留旧路径(标记废弃)。
+- **验证**:对比注册中心与旧表逐节点一致性(双写校验任务)。
+
+### 8.3 退役触发条件(P2-T3)
+满足全部方可退役:
+1. `EnergyService`/`DimensionScoreServiceImpl`/前端均已切换读注册中心(P1 完成);
+2. 网关/调用日志统计旧接口(`/api/dimension/overview`、`/api/dimension/radar-data`、`energy_*` 直读)**连续 14 天零调用**;
+3. 双写一致性校验通过(差异率 0)。
+
+退役动作:关闭 `dualWrite` → 删除 `DimensionSyncService` → DROP 旧配置表(`energy_dimension`/`energy_dimension_config`/`dimension_weights`/`energy_rule`)。
+
+### 8.4 回滚预案
+| 风险点 | 回滚动作 |
+|---|---|
+| 注册中心 schema 增量列 | 仅新增列,回滚=停止读取新列;如需还原 `ALTER TABLE ... DROP COLUMN`(另写 `revert` 迁移) |
+| `health_dimension_scores.dimension` 改写 | 由 `health_dimension_scores_bak_20261104` 全量还原:`INSERT ... SELECT` 覆盖;并反向 `UPDATE ... SET dimension=SUBSTRING(dimension,6)` |
+| 双写异常 | feature flag 关 `dualWrite`,旧表仍权威,瞬间回退 |
+| 新消费者读注册中心异常 | flag 关 `dimension.registry.enabled`,前端回落旧接口/兜底 |
+
+---
+
+## 9. 任务列表(P0 → P1 → P2,含文件/依赖/验收)
+
+> 估算文件数见各任务。依赖关系自底向上:P0 地基 → P1 子系统取数 → P2 混排+退役。
+
+### P0 — 地基(先建权威表 + 映射层,不碰旧表旧接口)
+**P0-T1 Schema 增量迁移 + 实体字段(约 4 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java`、`E:/cfc/cfc-backend/src/main/resources/schema.sql`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/entity/ProductDimensionConfig.java`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/entity/IndicatorDefinition.java`
+- 依赖:无
+- 内容:`ensureColumn` 加 `product_dimension_config`(legacy_alias/source_system/wuxing_rule_ref/node_kind) 与 `indicator_definitions`(parent_id/legacy_alias);同步 schema.sql CREATE TABLE;实体加对应字段
+- 验收:启动无 `Unknown column`;schema.sql 与库结构一致;两表新列存在;`mvn compile` 通过
+
+**P0-T2 统一 code 常量 + 映射层 DimensionCodeMapper(约 3 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/common/constant/DimensionCodeConstants.java`(NEW)、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/DimensionCodeMapper.java`(NEW)+ impl
+- 依赖:P0-T1
+- 内容:常量类固化 5 根 + 7 body code;Mapper 提供 `resolveToUnified`/`resolveLegacy`,加载节点 `legacy_alias` 建内存索引
+- 验收:`resolveToUnified("growth")=="body.growth"`;`resolveLegacy("body.growth")` 含 `"growth"`;单测通过
+
+**P0-T3 注册中心服务层 + 种子固化 5 根 7 维(约 3 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/DimensionRegistryService.java`(NEW)、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/mapper/ProductDimensionConfigMapper.java`(按需)、DatabaseInitializer seed 块
+- 依赖:P0-T1、P0-T2
+- 内容:`getTree()`(合并维度+指标节点)、`getNodeByCode()`、`getRoots()`;seed 幂等插入 `body.growth..body.exercise`(parent_id=body、legacy_alias、source_system='health');5 根补 `source_system/wuxing_rule_ref`
+- 验收:`getRoots()` 返回 5;`getTree()` 中 body 有 7 子节点;legacy_alias 已填充;重复启动 seed 幂等
+
+**P0-T4 统一维度树只读接口 + admin 写入升级(约 4 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/controller/DimensionRegistryController.java`(NEW)、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/controller/admin/DimensionConfigController.java`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/ProductDimensionConfigService.java`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/DimensionSyncService.java`(NEW,flag 门控骨架)
+- 依赖:P0-T3
+- 内容:新增 `/api/dimension-registry/tree|roots|code/{code}|map`;升级 `/admin/dimension-config/tree`、`/save` 改调注册中心 + 触发 `syncToLegacy`(flag)
+- 验收:GET `/api/dimension-registry/tree` 返回合并树;admin save 落 `product_dimension_config`;双写仅 flag=true 时触发
+
+**P0-T5 历史数据全量迁移脚本 + 回滚预案(约 2 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/resources/db/migrate_dimension_unified.sql`(NEW)、`E:/cfc/cfc-backend/src/main/resources/db/migrate_dimension_unified_rollback.sql`(NEW)
+- 依赖:P0-T3(注册中心 code 已存在)
+- 内容:备份表 + `health_dimension_scores.dimension` 改写 `body.*` + `indicator_definitions.dimension_code` 越界校验;回滚 SQL(备份还原 + 反向 SUBSTRING)
+- 验收:迁移幂等;执行后 `health_dimension_scores.dimension` 全 `LIKE 'body.%'`;回滚脚本可恢复;提供越界值扫描报告
+
+### P1 — 子系统取数 / 去硬编码
+**P1-T1 健康维度评分子系统改造(约 4 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/impl/DimensionScoreServiceImpl.java`、`E:/cfc/cfc-frontend/composables/useDimensionRegistry.js`(NEW)、`E:/cfc/cfc-frontend/pages/health-main/index.vue`、`E:/cfc/cfc-frontend/components/RadarChart.vue`
+- 依赖:P0-T4、P0-T5
+- 内容:`DimensionScoreServiceImpl` 经 `DimensionCodeMapper` 读 7 维(替换 `DIMENSIONS` 常量,key 改用 `body.growth` 等);前端 `DimensionProvider` 取代硬编码 `demoBodyDims` 与 demo 兜底分
+- 验收:雷达图从注册中心渲染;无 7 维字面硬编码;demo 兜底分移除或经 provider;`DimensionScoreServiceImpl` 单测通过
+
+**P1-T2 能量沙盘改造(约 2 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/EnergyService.java`、`E:/cfc/cfc-frontend/components/wuxing-sandbox.vue`
+- 依赖:P0-T4
+- 内容:`EnergyService` 经 `wuxing_rule_ref`/注册中心读 5 根与权重;**`applyAllRestraints`/`applyAllBoosts` 逻辑零改动**;前端沙盘从注册中心取五维
+- 验收:沙盘读数同注册中心;五行计算与旧版一致(回归测试);红线 3 满足
+
+**P1-T3 指标管理关联收敛 + 树挂接(约 4 文件)**
+- 文件:`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/controller/admin/IndicatorAdminController.java`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/mapper/IndicatorDefinitionMapper.java`、`E:/cfc/cfc-web/src/views/admin/indicators/index.vue`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/IndicatorService.java`
+- 依赖:P0-T3、P0-T4
+- 内容:`/api/admin/indicator/save` 加 `parentId`;`dimensionCode` 校验 ∈ 注册中心 code 集合;管理端维度归属由五维单选改为从注册中心树选择
+- 验收:指标 `parent_id` 落库;越界 `dimensionCode` 被拒;统一树含指标节点
+
+**P1-T4 其他消费方改造(约 3 文件)**
+- 文件:`E:/cfc/cfc-web/src/components/DimensionSelector.vue`、`E:/cfc/cfc-web/src/views/admin/.../ContentDimensionThresholdEditor.vue`、`E:/cfc/cfc-backend/src/main/java/com/etotem/cfc/service/.../KnowledgeBaseService.java`(直读改注册中心)
+- 依赖:P0-T4
+- 内容:移除对 `product_dimension_config` 直读,统一经 `DimensionRegistryService`
+- 验收:代码扫描无直读残留;功能等价
+
+### P2 — 指标并入树 + 退役旧体系
+**P2-T1 指标多级细化 / 混排完整化(约 3 文件)**
+- 文件:`DimensionRegistryService.java`(扩展)、`IndicatorAdminController.java`(挂接 UI)、`cfc-web` 指标树编辑页
+- 依赖:P1-T3
+- 内容:指标子树自引用 + 混排展示;运营可将指标挂到任意维度节点
+- 验收:统一树含指标子节点;UI 可挂接
+
+**P2-T2 评分口径文档化(约 2 文件)**
+- 文件:`docs/superpowers/specs/...scoring-convention.md`(NEW)、`DimensionCodeConstants.java`(扩充)
+- 依赖:P1-T1
+- 内容:percentile/tier/归一化在雷达/沙盘/指标间共享并文档化
+- 验收:文档评审通过;共享常量无歧义
+
+**P2-T3 旧体系退役(约 5 文件)**
+- 文件:`DimensionSyncService.java`(删除)、`EnergyService.java`(移除旧表引用后保留注册中心)、`energy_*` 表 DROP 迁移、调用日志统计脚本、相关 Controller 清理
+- 依赖:P1-T1、P1-T2(全部切换完成)
+- 内容:确认零调用 → 关 `dualWrite` → 删 `DimensionSyncService` → DROP 旧配置表
+- 验收:连续 14 天零旧调用;旧表已删;全量测试绿;红线 4 满足
+
+---
+
+## 10. 依赖包列表
+**本次不引入任何新第三方依赖。**
+- 后端:Spring Boot、MyBatis-Plus、Jackson(均已存在,分别用于服务/ORM/JSON 解析 `legacy_alias`)。
+- 前端:Vue 2 / uni-app 内置能力,无新增 npm 包。
+
+---
+
+## 11. 共享知识 / 跨文件约定
+- **统一 code 常量类**:`com.etotem.cfc.common.constant.DimensionCodeConstants` — 固化 `BODY="body"`、`MIND`…`WEALTH` 及 `BODY_GROWTH="body.growth"` 等;全系统引用,禁止散落字面量。
+- **Mapper 命名**:`DimensionCodeMapper.resolveToUnified(legacy)` / `resolveLegacy(unified)`;统一放 `com.etotem.cfc.service` 包。
+- **注册中心服务**:`DimensionRegistryService`(组合 `ProductDimensionConfigService` + `IndicatorDefinitionService`),统一树与取数入口。
+- **前端 DimensionProvider**:`cfc-frontend/composables/useDimensionRegistry.js`(缓存 `/api/dimension-registry/tree`,暴露 `roots`、`bodyDims`、`resolveAlias`);管理端 `cfc-web` 复用同一接口(可抽 `src/utils/dimensionRegistry.js`)。
+- **Feature flag**:`dimension.registry.enabled`、`dimension.registry.dualWrite`(application.yml),控制读切换与双写。
+- **legacy_alias 存储**:JSON 数组字符串,Jackson 解析;非空判断防 NPE。
+- **统一 code 格式**:`{root}` 或 `{root}.{sub}`,全小写点分;新增子维须入 `DimensionCodeConstants` 并 seed。
+
+---
+
+## 12. 待明确事项(需主理人拍板)
+
+1. **7 维节点类型**:本设计选「维度节点(product_dimension_config)」而非指标节点。请确认是否同意(决策 3 允许两种,需拍板)。
+2. **health_dimension_scores.dimension 是否真改写列值**:决策 4 要求全量改写为 `body.*`,但会连带要求 `DimensionScoreServiceImpl` 的 map key 同步改(P1-T1 工作量)。若主理人倾向**最小爆炸半径**,可改为「列值保留 `growth` + 仅经 `legacy_alias` 逻辑映射」,请二选一。
+3. **认知 5 维 / 心 10 维 / 关系 5 维 / 富 4 维范围**:P0 仅固化 5 根 + 7 body 维;其余是否纳入统一树、何时纳入(建议 P2),请确认范围与优先级。
+4. **退役确认手段与是否真删表**:用「网关日志统计」还是「代码引用扫描」判定零调用?退役是 DROP 旧表还是仅逻辑禁用(`status=0`)?请定调(影响 P2-T3 与红线 4)。
+5. **五行 element 归属口径**:`wuxing_rule_ref` 是否直接复用现有 `EnergyDimension.element`(木/火/金/水/土)映射 body→?,或有新口径?请提供映射表。
+6. **双写过渡期时长 / 退役阈值**:「连续 14 天零调用」是否合适?阈值与过渡期是否需可配置(建议入 feature flag / 配置表)?
+
+---
+*附录:类图与序列图已提取至同级 `2026-11-03-unified-dimension-system-class.mermaid` / `2026-11-03-unified-dimension-system-sequence.mermaid`。*

+ 130 - 0
docs/superpowers/specs/2026-11-03-unified-dimension-system-prd.md

@@ -0,0 +1,130 @@
+# 统一维度体系(Unified Dimension System)增量 PRD
+
+> 文档类型:简单增量 PRD(含现状收敛路径,不含竞品分析)
+> 作者:许清楚(产品经理) · 日期:2026-11-03
+> 关联决策:主理人(廖总/齐活林)拍板——「整个系统最终应有一套统一的维度体系,而不是多套并存」
+
+---
+
+## 0. 项目信息
+
+| 项 | 内容 |
+|---|---|
+| Language | 中文 |
+| 现状技术栈 | 后端 `cfc-backend`(Java / Spring Boot);前端 `cfc-web`(Vue 管理端)+ `cfc-frontend`(uni-app 小程序) |
+| Project Name | `unified_dimension_system` |
+| 文档范围 | 增量 PRD:聚焦"收敛为单一维度注册中心",不重写既有业务 |
+
+**原始需求复述**:CFC 当前存在 4 套互不关联的维度/指标体系,导致雷达图、能量沙盘、指标管理"各说各话"(同一概念在不同页面编码/口径不一致)。主理人决策最终收敛为**单一维度注册中心(dimension registry)**,各子系统只引用它,不再各自定义维度。
+
+---
+
+## 1. 背景与现状(已核实,作为 PRD 事实基础)
+
+| # | 体系 | 权威表 / 接口 | 维度编码 | 关键依赖 |
+|---|---|---|---|---|
+| 1 | **维度配置树** `product_dimension_config` | 表 `product_dimension_config`;`POST /api/admin/dimension-config/tree`(`ProductDimensionConfigService.tree()`,支持多级树) | `dimension_code`:body/mind/wisdom/action/wealth;`parent_id` 支持多级 | 消费:知识库、ContentDimensionThresholdEditor、DimensionSelector |
+| 2 | **全域指标字典** `indicator_definitions` | 表 `indicator_definitions`(扁平、无 parent_id);`POST /api/admin/indicator/*` | `dimension_code` 可空,挂五维 | **强外键依赖 5 张表**:indicator_values、indicator_mapping_rules、indicator_correlations、indicator_favorite、归一化中间表;**19 个后端文件**引用 |
+| 3 | **健康维度评分** `health_dimension_scores` | 表 `health_dimension_scores`;`/api/dimension/overview`、`/api/dimension/radar-data` | 7 维:`growth/sleep/vision/immunity/nutrition/gut/exercise`(硬编码于 `DimensionScoreServiceImpl.DIMENSIONS`) | 前端 `health-main/index.vue` 7 维硬编码 + demo 兜底分;另有认知 5 维、心 10 维、关系 5 维、富 4 维来自不同接口 |
+| 4 | **能量五维体系** `energy_*` | `EnergyController`/`EnergyService`;`POST /api/energy/sandbox` | 五维:body/mind/wisdom/action/wealth | 五行相生相克规则 `applyAllRestraints`/`applyAllBoosts`(EnergyRule/DimensionWeight);依赖 healthReport、DanAssessment、cfBalance 等 |
+
+**核心痛点**:4 套体系"维度编码各自为政"——同属"身"的概念,在体系 1/4 叫 body,在体系 3 被拆成 7 个独立编码,在体系 2 仅作为可空的归属字段;前端多处硬编码维度编码与兜底分值,导致跨页口径冲突、运营无法统一配置。
+
+---
+
+## 2. 产品目标
+
+**一句话目标**:建立**单一维度注册中心(dimension registry)**作为全系统唯一权威维度定义源,把当前 4 套割裂的维度/指标体系收敛为一棵可共享、可追溯、可引用的统一维度树,所有子系统(指标管理、健康雷达、能量沙盘、知识库)只读引用注册中心,杜绝重复定义与口径冲突。
+
+**「统一维度体系」终态定义**:
+> CFC 只有一棵维度树——根为 5 个权威维度 code(`body`/`mind`/`wisdom`/`action`/`wealth`),其下挂载子维度(如 `body` 下挂 `health_dimension_scores` 的 7 维)。所有业务数据(指标值、健康评分、能量分、知识库分类)均以"统一维度 code"为引用键。现存的 4 套维度编码**仅作为历史别名**,通过映射层(mapping layer)翻译为统一 code,不再拥有独立定义权。
+
+**3 个清晰、正交的产品目标**:
+
+1. **单一权威源(Single Source of Truth)**:维度注册中心成为唯一维度定义与编码权,消除 4 套体系的口径分裂。(治理对象:定义权)
+2. **向后兼容收敛(Backward-compatible Convergence)**:以"加映射层 / 注册中心"方式收敛,**不破坏**既有 5 张 indicator 外键表与 19 个后端文件引用,平滑迁移。(治理对象:迁移安全)
+3. **统一取数(Unified Data Access)**:前端雷达图 / 能量沙盘 / 指标管理统一从注册中心取维度与编码,保证跨页展示口径一致。(治理对象:消费一致性)
+
+---
+
+## 3. 用户故事
+
+1. **运营配置维度树**:作为运营,我希望在管理端维护一棵统一维度树(5 根 + 多级子节点),以便各子系统引用同一份维度定义,而不是各自硬编码。
+2. **指标挂到维度树节点**:作为指标管理员,我希望把全域指标字典里的指标挂到维度树的具体节点(如把"体脂率"挂到 `body → exercise` 下),以便指标与维度建立清晰归属。
+3. **能量沙盘取维度**:作为能量沙盘服务,我希望从统一注册中心读取五维及其子维度定义(而非硬编码 `DIMENSIONS` / 直读 wuxing 配置表),以便五行相生相克规则在统一口径下运行。
+4. **健康雷达取维度**:作为健康雷达服务,我希望从注册中心按统一 code 取维度(`body` 根下的 7 维 health 子维),以便雷达图不再依赖前端硬编码的 7 维编码与 demo 兜底分。
+5. **前端统一取数**:作为前端,我希望雷达图 / 能量沙盘 / 指标管理统一通过同一套维度 API 取数与渲染,以便用户在不同页面看到的维度与评分口径一致。
+
+---
+
+## 4. 需求池(P0 / P1 / P2)
+
+### P0 — Must have(先建地基:权威表 + 映射层,不碰旧表旧接口)
+
+- **P0-1 统一维度注册中心数据模型(权威表)**
+  - 以 `product_dimension_config` 为基础**升级**为权威表(或新建 `dimension_registry`,待决策见 §7-Q1),固化 5 个根维度 code(body/mind/wisdom/action/wealth)为唯一权威,支持 `parent_id` 多级树。
+  - 保留 `enabled`/`sort`/`remark`,新增:`source_system`(归属子系统)、`legacy_alias`(历史别名,承载现存 4 套编码)、`wuxing_rule_ref`(指向五行规则,确保能量体系可追溯)。
+- **P0-2 维度树 API(统一取数入口)**
+  - 提供统一维度树读取 / 下发接口(如 `GET /api/dimension-registry/tree`、`GET /api/dimension-registry/code/{code}`),作为各子系统取数入口。
+  - 保留现有 `POST /api/admin/dimension-config/tree` 向后兼容(可内部改调注册中心)。
+- **P0-3 编码映射层(mapping layer)**
+  - 建立"现存 4 套维度编码 → 统一 code"的映射(如 `health_dimension_scores.growth → body.growth`;`energy` 五维 → body/mind/... ),以**视图 / 枚举 / 配置表**实现,**不改动旧表旧接口**。
+  - 映射关系需可回查(alias → 统一 code 双向)。
+- **P0-4 固化 5 根 + 7 维归属(逻辑映射)**
+  - 5 根维度 code 固化为权威常量并文档化;`health_dimension_scores` 的 7 维明确归属 `body` 根下的子维度节点(逻辑映射,不改旧表)。
+
+### P1 — Should have(子系统从注册中心取数 / 去硬编码)
+
+- **P1-1 健康维度评分子系统改造**
+  - 从注册中心取维度 code,替换 `DimensionScoreServiceImpl.DIMENSIONS` 硬编码 + 前端 7 维硬编码 + demo 兜底分;统一经映射层解析。
+- **P1-2 能量沙盘改造**
+  - 从注册中心取五维及子维度定义,替换 `EnergyService` 内硬编码与 wuxing 配置表直读;**保留 `applyAllRestraints`/`applyAllBoosts` 规则逻辑不变**,仅维度来源改为注册中心(配合 `DimensionWeight`/`EnergyRule` 经 `wuxing_rule_ref` 关联)。
+- **P1-3 指标管理关联收敛**
+  - `indicator_definitions.dimension_code` 关联改为指向注册中心维度节点;**不改动外键表结构**,仅确保 `dimension_code` 取值落在注册中心 5 根 / 子维 code 集合内(加校验 + 存量迁移)。
+- **P1-4 其他消费方改造**
+  - 知识库、`ContentDimensionThresholdEditor` 等从注册中心取维度树(替换 `product_dimension_config` 直读)。
+
+### P2 — Nice to have(指标并入维度树 + 退役旧体系)
+
+- **P2-1 指标多级细化**:`indicator_definitions` 支持 `parent_id` / 并入维度树节点体系,允许指标作为维度树子节点被引用(是否混排待决策,见 §7-Q2)。
+- **P2-2 评分口径文档化**:统一维度下的 percentile、tier、归一化定义在雷达 / 沙盘 / 指标间共享并文档化。
+- **P2-3 历史数据迁移工具**:把 `health_dimension_scores`、存量 `indicator_definitions.dimension_code` 批量校验 + 映射写入(策略待决策,见 §7-Q4)。
+- **P2-4 旧体系退役计划**:确认无调用后逐步下线 `/api/admin/dimension-config` 直读、`EnergyDimension`/`EnergyDimensionConfig` 等冗余配置表(节奏待决策,见 §7-Q5)。
+
+---
+
+## 5. 关键约束 / 红线(不可违反)
+
+1. **不得破坏既有 indicator 体系**:`indicator_values` / `indicator_mapping_rules` / `indicator_correlations`(含 `definition_id_a`/`definition_id_b`)/ `indicator_favorite` / 归一化中间表,及 19 个后端文件引用,**一律不动外键与表结构**。收敛只能是"加映射层 / 注册中心",禁止暴力删表改外键。
+2. **维度编码统一**:`body`/`mind`/`wisdom`/`action`/`wealth` 为 5 个根维度 code 的**唯一权威**;`health_dimension_scores` 的 7 维(growth/sleep/vision/immunity/nutrition/gut/exercise)**必须作为 `body` 根下的子维度**,不可另立根。
+3. **五行规则必须保留**:能量沙盘的五行相生相克规则(`EnergyService.applyAllRestraints`/`applyAllBoosts`,含 `EnergyRule`/`EnergyDimensionConfig`/`DimensionWeight`)语义与计算不可变,仅允许其"维度来源"切换至注册中心。
+4. **接口向后兼容**:尽量保留现有接口(可加字段 / 加新接口),**不删旧接口直到确认无调用**(用网关 / 调用日志统计确认)。
+5. **种子数据无损**:既有 `indicator_definitions`(体脂 / 慢性病 / 运动 / 情绪 / 人格 / 认知等几十条种子数据)与 `product_dimension_config` 五维根迁移时须无损,映射关系需可回查。
+
+---
+
+## 6. UI 设计草案
+
+- **管理端「统一维度注册中心」页**:沿用现有 `cfc-web/src/views/admin/dimension/index.vue` + `DimensionSelector` 树形编辑;新增一列「历史别名(legacy_alias)」展示现存 4 套编码映射,便于运营核对。
+- **指标管理页**(`admin/indicators/index.vue`):维度归属由"五维单选"改为"从注册中心维度树选择"(支持子维,如 `body → exercise`),校验取值必须落在注册中心 code 集合内。
+- **前端统一取数层**:小程序 / 管理端引入统一 `DimensionProvider`,从 `/api/dimension-registry` 拉取维度与编码,雷达图(`RadarChart.vue`)、能量沙盘(`wuxing-sandbox.vue`)不再各自硬编码维度编码与兜底分值。
+
+---
+
+## 7. 待确认问题(需主理人决策)
+
+1. **注册中心物理落地方式**:是"升级 `product_dimension_config` 为权威表(加字段复用现有树接口与前端)",还是"新建独立 `dimension_registry` 表"?倾向升级以低成本复用。
+2. **指标是否并入维度树做多级细化(P2)**:`indicator_definitions` 是否加 `parent_id`、与维度节点是否允许混排?还是指标仅"挂"到维度节点、保持独立字典?
+3. **7 维在注册中心的表达**:`health_dimension_scores` 的 7 维是作为 `body` 下固定 7 个子节点(逻辑映射、不动旧表),还是要重命名 / 统一为更稳定的 code?
+4. **历史数据迁移策略**:是否全量迁移 `indicator_definitions.dimension_code` 与存量 `health_dimension_scores`,还是仅做新增校验 + 旧数据保留映射读取?
+5. **旧体系退役节奏**:`EnergyDimension` / `EnergyDimensionConfig` / `DimensionWeight` 与 `product_dimension_config` 在注册中心上线后如何并存 / 切换?是否需要"双写过渡期"?
+
+---
+
+## 附录:已核实事实快照(供架构师 / 开发参考)
+
+- `product_dimension_config.dimension_code`:`VARCHAR(50) NOT NULL UNIQUE`,注释明确 body/mind/wisdom/action/wealth;含 `parent_id` 多级树(schema.sql:5750)。
+- `indicator_definitions`:扁平、`dimension_code VARCHAR(16)` 可空挂五维;外键表 `indicator_values`/`indicator_mapping_rules`/`indicator_correlations`(`definition_id_a`/`definition_id_b`)/`indicator_favorite` 均 `FK→indicator_definitions.id`(schema.sql:2611–6555)。
+- `health_dimension_scores.dimension`:注释 `growth/sleep/vision/immunity/nutrition/gut/exercise`(schema.sql:3996)。
+- `EnergyService.java` 含 `applyAllRestraints` / `applyAllBoosts`(能量五行规则落点)。
+- 前端硬编码点:`cfc-frontend/pages/health-main/index.vue`(7 维 + demo 兜底分)、`DimensionScoreServiceImpl.DIMENSIONS`。

+ 62 - 0
docs/superpowers/specs/2026-11-03-unified-dimension-system-sequence.mermaid

@@ -0,0 +1,62 @@
+%% 7.1 前端雷达图/沙盘从注册中心取维度(读路径)
+sequenceDiagram
+    actor User
+    participant FE as 小程序/管理端 DimensionProvider
+    participant API as DimensionRegistryController
+    participant SVC as DimensionRegistryService
+    participant CFG as ProductDimensionConfigMapper
+    participant IND as IndicatorDefinitionMapper
+
+    FE->>API: GET /api/dimension-registry/tree
+    API->>SVC: getTree()
+    SVC->>CFG: listAll()  // 维度节点(5根+7body+...)
+    SVC->>IND: listAll()  // 指标节点(带parentId)
+    CFG-->>SVC: 维度节点列表
+    IND-->>SVC: 指标节点列表
+    SVC->>SVC: mergeByParentId() 统一树
+    SVC-->>API: List<DimensionNode> tree
+    API-->>FE: Result.success(tree)
+    FE->>FE: 取 body 子节点渲染 RadarChart
+
+%% 7.2 指标挂维度树节点(写入路径)
+sequenceDiagram
+    actor Admin
+    participant UI as 指标管理页
+    participant IC as IndicatorAdminController
+    participant ISVC as IndicatorService
+    participant M as DimensionCodeMapper
+    participant CFG as ProductDimensionConfigMapper
+    participant DB as indicator_definitions
+
+    Admin->>UI: 选父维度节点(body.exercise)+填指标
+    UI->>IC: POST /api/admin/indicator/save {code,parentId,dimensionCode}
+    IC->>ISVC: save(indicator)
+    ISVC->>M: validate(dimensionCode) ∈ 注册中心codes
+    M->>CFG: getNodeByCode(dimensionCode)
+    CFG-->>M: node / null
+    M-->>ISVC: ok / fail(400)
+    ISVC->>DB: INSERT/UPDATE (parent_id 设置)
+    DB-->>ISVC: id
+    ISVC-->>IC: IndicatorDefinition
+    IC-->>UI: Result.success(node)
+    Note over SVC: 后续 getTree() 把该指标挂到 body.exercise 下(混排)
+
+%% 7.3 双写过渡期:admin 写入 → 注册中心 + 旧表同步
+sequenceDiagram
+    actor Admin
+    participant AC as DimensionConfigController
+    participant RS as DimensionRegistryService
+    participant CFG as product_dimension_config
+    participant SYNC as DimensionSyncService
+    participant LEG as energy_dimension_config / dimension_weights
+
+    Admin->>AC: POST /api/admin/dimension-config/save {code,parentId,...}
+    AC->>RS: saveConfig(node)
+    RS->>CFG: upsert product_dimension_config  // 注册中心权威
+    alt dimension.registry.dualWrite=true
+        RS->>SYNC: syncToLegacy(node)
+        SYNC->>LEG: upsert 对应 legacy 行(按code 1:1)
+    end
+    RS-->>AC: node
+    AC-->>Admin: success
+    Note over SYNC: 旧 EnergyService 仍读 legacy 表(行为不变); 新消费者读注册中心

+ 212 - 0
docs/tdd/orchestration/report-dev-2026-11-04-2145.md

@@ -0,0 +1,212 @@
+# 研发负责人工作汇报(TDD 闭环 · 2026-11-04 21:45 补报)
+
+> 汇报人:研发负责人3(自动化 `0b1ecca1-49d9-46bf-8381-6d679390e36b` · 错峰03,本会话)
+> 汇报周期:2026-11-04 21:07 ~ 21:45(第 42 轮 / 自动触发轮,**补报**:此前 41 轮未交标准模板汇报)
+> 负责模块/单元范围:全量(`project_roles` 未配置,无 scope 隔离)
+> 模板版本:v1.1(`assets/templates/研发负责人工作汇报模板.md`)
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 问题接收与处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **收到的测试反馈问题数*** | 7 个 | `docs/tdd/test/blockers.md` 正式通道 B-1~B-7,全部为「研发」类:B-1 surefire 13 红、B-2 admin-auth/login 500、B-3 报告上传 MIME、B-4 butler envelope/commission 400、B-5 冒烟 49 条 REAL_ERR、B-6 createReport 停滞、B-7 getActiveMaterial 停滞。分类:实现缺陷 5(B-1/B-2/B-3/B-4/B-5)、需求/设计口径 0、测试侧误判 0、状态机阶段口径 2(B-6/B-7) |
+| **已解决问题数*** | 0 个 | 本轮未做 `--mark-*` 登记、未改业务代码、未做部署链验证,故本轮闭环数记 0。注:B-2/B-3/B-4/B-5 的代码已由研发负责人1/5 于前序轮次交付并推 origin/cfclub(d936d1b18 / c6acdbd37 / d7cf3346d 等),但**解除动作属测试 `--clear-blocked`,研发不代解除**,台账 7 条状态仍为「待处理」 |
+| **待解决研发问题数** | 7 个 | P0:B-2(安全语义)、B-3(上传校验)|P1:B-1、B-4、B-5|P2:B-6、B-7(两键实现+契约测试均已推远端,仅缺阶段收口,见 1.5)。阻塞原因:B-1/B-4/B-5 需测试侧复验解除;B-6/B-7 需补任务记录或测试 `--mark-green` |
+
+> 分类统计(问题 ID + 来源 + 类型):B-1~B-7 全部来源「测试台账 `blockers.md`」;实现缺陷 5、状态机口径 2。
+> 已解决问题关联 sha:本轮 0(无本轮闭环)。
+> 待解决优先级与预估:P0 2026-11-05、P1 2026-11-06、P2 2026-11-05(随阶段收口一并处理)。
+
+---
+
+### 1.2 任务分发与会话管理
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数*** | 0 个 | 本轮 `--auto` 目标池 0(⏳键 0 / 契约常量 0 / 用例引用∩⏳ 0 / 执行结果回填 0),无 pending 可派;且未手工派发(opencode 黑窗 ACTIVE 至 11-05 08:00,且本轮未获提交范围拍板) |
+| **恢复智能体会话数*** | 0 个 | 未发现需重建/恢复的会话;21:30 巡检 6/6 实例可达,无 interrupted=0 异常 |
+| **当前在用会话数** | 1 个 | 21:30 `tools/xaf_agent_hub/out/patrol_report.md`:6 实例合计 655 个 CFC 会话,**运行中 1 个**(local-45278 GAP-2026-11-03-unified-dimen),其余 5 实例 CFC 运行中均为 0 |
+| **会话平均利用率** | ≈ 3.6 % | = 1 个运行会话 ÷ 6 实例并发上限合计 28(6+4+4+4+4+6)。远低于 60%,原因见下方 |
+
+> **利用率偏低原因(如实说明)**:非「配额耗尽」,而是**任务池枯竭 + 池空未造任务**。
+> - `tools/xaf_agent_hub/tasks_backlog.json`:100 条 = 96 done + 2 dispatched + 2 blocked + **0 pending** → `fill_slots` 只吃 pending,无任务可派。
+> - `lead_backlog.md` 仅剩 T28-FIX(P0)一条,标注「人工决策/派发类,非 fill_slots 自动任务池」,且涉及不可逆生产库迁移,须主理人确认后方可派发。
+> - TDD 侧目标池四类数据源全 0(见 1.6),`--auto` 无 pending。
+> - **根因(研发侧责任)**:SKILL.md §151 规定「任务池已无新任务时,研发负责人应根据需求/设计/测试用例及当前实施进展制定新的开发任务(`--add-task` 带溯源)」。此前 42 轮把「池空」当成收手理由,未造任务 → 空闲会话持续无活。本轮已补做(见 1.3)。
+
+> **分派清单(附录 B)**:本轮 0 条,原因同上。
+> **恢复会话**:本轮 0 条,无中断/超时/swallowed/wedged 触发重建。
+
+### 1.2b 各会话当前工作状态列表(必填)
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| local-45278 | `ses_e5bc32342f…` | `wedged` | GAP-2026-11-03-unified-dimen(统一维度系统) | 10 小时 40 分(>45min,运行标记未消但消息静默) | 不干净(E:\cfc,68 处 WIP) | 唯一运行中 CFC 会话;模型 axonhub/deepseek;末条为「I now have a clear picture…」分析态,建议 nudge 或重建 |
+| lan-248 | 0(idle) | `idle` | — | 21:30 巡检 CFC 运行中 0 | 干净 | 并发上限 4,剩余 4;可接新任务 |
+| lan-204 | 0(idle) | `idle` | — | 21:30 巡检 CFC 运行中 0 | 干净 | 并发上限 4,剩余 4;Windows 实例 `--dir 'D:\cfc'` |
+| lan-189 | 0(idle) | `idle` | — | 21:30 巡检 CFC 运行中 0 | 干净 | 并发上限 4,剩余 4;model_chain 无 `axonhub/*`,须用 `axon/*` |
+| prod-etotem | 0(idle) | `idle` | — | 21:30 巡检 CFC 运行中 0 | 干净 | `manual_only`,三条自动路径无条件跳过 |
+| pub-iwintrue | 0(idle) | `idle` | — | 21:30 巡检 CFC 运行中 0 | 干净 | 并发上限 6,剩余 6;testing 部署会话挂载点 |
+| TDD 编排·local-lan-4090 | 50 个(idle=50) | `idle` | — | 配额占用 0,剩余 3 | 干净 | `--inspect --role 测试` 实测,busy=0 / interrupted=0 |
+| TDD 编排·pub-iwintrue | 50 个(idle=50) | `idle` | — | 配额占用 0,剩余 3 | 干净 | `--inspect --role 测试` 实测,busy=0 / interrupted=0 |
+| 研发负责人3(本会话) | 本自动化会话 | `running` | 第 42 轮 TDD 推进 + 本补报 | 0 min | 不干净(主工作树 68 处 WIP) | 按 E2 铁律「不干净=未完成」,见第三节 |
+
+> 数据来源:`tools/xaf_agent_hub/out/patrol_report.md`(21:30:24,6 实例全量)+ `--inspect --role 测试`(TDD 编排智能体配额)+ `--clean-check`。
+> ⚠ **口径冲突(需技能层修)**:`--inspect` 有角色门禁,仅 `--role 测试` 可执行(研发角色报「阻塞处置/任务检视只能由测试人员执行」),但本模板 1.2b 要求研发负责人逐会话填写 → 建议放行研发只读 `--inspect`,或明确以巡检报告为研发侧数据源。
+> 「工作目录」列按 `--clean-check`:主工作树 68 处未提交 → 不干净;各远程实例目录未在本会话检出,标「干净」为其自身无本会话写入。
+
+---
+
+### 1.3 变更感知与新任务建立
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **感知需求/设计变更数*** | 63 个 | `--changes --days 7 --role 研发负责人`:设计文档 8 个、测试用例文档 55 个、需求文档 0 个(其余「其他」类 114 个,窗口内合计 177 文件变更)。近 7 天窗口按 SKILL.md §142 默认口径 |
+| **新增入池任务数*** | 2 个 | 本轮补做 `--add-task`(详见附录 C):`dimension.registry.getTree`(S-cfc-7)、`dimension.registry.mapLegacyCode`(S-cfc-8),均带 `--requirement` + `--design` 溯源锚点 |
+| **既有键状态流转数** | 0 次 | 本轮 `--auto` 未产生任何 RED↔YELLOW↔GREEN↔DONE 流转;2 个 YELLOW 因无任务台账记录被 `auto_advance` 跳过(见第三节) |
+
+> **感知变更分类**:设计文档 8(含 `docs/flows/badge-microaction-flow.md` 6294d7dc 契约对齐等);测试用例文档 55(`docs/tdd/test/automation-run-2026-11-02-*.md` 台账批次为主);需求文档 0。
+> **`--changes` 报「无新增能力键(0→0)」的真实原因(本轮定位)**:该命令只从 **git 版本历史**检测,而 11-03「统一维度体系」的 4 份设计文档(PRD / design / class / sequence)+ 8 个 `Dimension*` Java 新实现**全部是未提交 `??` 文件**,`git log --all -- "*unified-dimension*"` 查无记录 → 变更感知看不见它们 → 不建能力键 → 目标池空 → 空闲会话无任务。本轮据此手工读取设计文档 §4/§5.1 建立 2 个键,属于 SKILL.md §151「根据需求、设计及当前实施进展制定新任务」的补课。
+
+---
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| 0(本轮无提交) | 0 | — | — | — | — | 本轮未执行 `git add`/`commit`/`push`:工作目录 68 处 WIP 中含 `CfBalanceController.java` 倒退版(见第三节),全量收口有功能回退风险;未获提交范围拍板,按「不可逆操作前确认」暂缓。**按铁律本轮开发产出记 0** |
+
+> 在途/已闭环键的**既有**推送证据(供主理人核验,非本轮产出):
+> | sha | 键 | 阶段 | 已推远端 |
+> |---|---|---|---|
+> | `d8d3329b3f35` | family.familyMembers.addMember | DONE | 是 |
+> | `be255fc4903f` | guide.trainingPlan.getPlanList | DONE | 是 |
+> | `eeabfe6ad919` | family.familyMembers.listMembers | DONE | 是 |
+> | `55caf6966d70` | guide.trainingPlan.getPlanDetail | DONE | 是 |
+> | `81d8883f7` / `1767d4414` | health.report.createReport | RED / YELLOW | 是(origin/cfclub) |
+> | `faf3ca174` / `c3e32460a` | dan.assessment.getActiveMaterial | RED / YELLOW | 是(origin/cfclub) |
+>
+> 判定方式:`git merge-base --is-ancestor <sha> origin/cfclub`。本轮 HEAD `ac2e27300`(2026-11-03 23:44)**落后 origin/cfclub 44 提交**(远端 21:34 为 `4034fd9e3`),提交前须先 `git fetch` 按远端基线核对。
+
+---
+
+### 1.5 状态机阶段分布与部署状态
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 已发现未入池 0 |
+| RED | 2 | 本轮新增 S-cfc-7 / S-cfc-8(待开发实现),**已入池待派发** |
+| YELLOW | 2 | `health.report.createReport`、`dan.assessment.getActiveMaterial`,待测试校验 |
+| GREEN | 0 | 待部署验证 0 |
+| DONE | 4 | addMember / getPlanList / listMembers / getPlanDetail |
+
+| 部署项 | 值 | 说明 |
+|--------|-----|------|
+| 本轮部署次数 | 0 次 | 本轮未派发/未确认 testing 或 production 部署 |
+| 最新 `last_deployed` | `b4ed2eec27c2f022ca1b9768e5a9c2983da07898`(testing,2026-11-04 20:11:11) | 来源 `.tdd/deploy_state.json` confirmed 末条;pending 队列尚有 5 条未回写(05:12 / 07:49 / 11:16 / 13:35 / 14:43) |
+| GREEN 部署链验证 | 不适用 | 本轮无 GREEN 闭环;配置 `deploy_verify=false`,testing 部署目标 `pub-iwintrue`,production 未配置自动目标 |
+
+> 2 个 YELLOW 未自动收口 GREEN→DONE 的根因:`auto_advance`(`tdd_orchestrate.py` ~2856-2863)要求 `doc["tasks"]` 中存在 `tdd_key==key` 的 **done 任务**才进入推进判定,而这两键由测试侧补登(`.workbuddy/tasks.json` 仅 S-cfc-1~6),无对应任务记录 → `done` 为空 → 跳过。属**编排侧识别盲区**,非研发实现阻塞(实现提交已推远端、契约测试 5 例/3 例全绿)。
+
+---
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | **异常(静默为空)** | CFC 的 `docs/tdd/SRS.md` 用「四、未覆盖控制器」表述,未使用 ⏳ 待办标记 → 扫描器识别不到;非「无缺口」,实为口径不匹配 |
+| 契约常量(contract) | 0 | **异常(静默为空)** | 近 7 天契约常量提交未落入扫描范围;`docs/flows/badge-microaction-flow.md` 有契约对齐变更但未被解析为键 |
+| 测试用例引用(test_case_map) | 0 | **异常(静默为空)** | 55 个测试用例文档变更均为台账批次文件(`automation-run-*.md`),未产生新 `test_case_map` 键 |
+| 执行结果回填(case_results) | 0 | **异常(静默为空)** | 本轮无 `--mark-*` / 无执行结果回写 |
+
+> ⚠ **四类数据源同时为 0 是隐蔽风险**:SKILL.md §1.6 明确要求「任一来源为 0 或异常时须说明,避免把静默为空误当无缺口」。此前 42 轮汇报把「目标池 0」直接当作「无任务」,未做此项拆解 → 空闲会话长期无活却无人预警。本轮已定位,建议技能层补口径映射(⏳ ↔ SRS「未覆盖控制器」章节)。
+
+---
+
+## 二、下一步需要研发处理的事项
+
+| 序号 | 事项描述 | 依赖/前置条件 | 预估完成时间 | 优先级 | 状态 |
+|------|----------|---------------|--------------|--------|------|
+| 1 | 分级收口主工作树 68 处 WIP:安全项(`Dimension*` 8 个 Java + 4 份 unified-dimension 设计文档 + 本汇报)入库并 push;危险项 `CfBalanceController.java` 按 `origin/cfclub` 版对齐后再动;临时/私有文件排除 | 主理人拍板提交范围(涉及覆盖其他会话 staged 改动,不可逆);先 `git fetch` 对齐远端基线(本地落后 44 提交) | 2026-11-04 | P0 | 待启动 |
+| 2 | 将 4 份 unified-dimension 设计文档合入 `origin/cfclub`,使 S-cfc-7 / S-cfc-8 的 `--requirement`/`--design` 溯源锚点对远程会话可读(远端按 origin/cfclub 检出) | 事项 1 完成 | 2026-11-04 | P0 | 待启动 |
+| 3 | 派发 S-cfc-7 / S-cfc-8 到空闲会话(lan-248 / lan-204 / lan-189 / pub-iwintrue 均有空槽),写 RED 契约级单测 | 事项 2 完成;opencode 黑窗至 2026-11-05 08:00,期间按 hub 策略链走非 opencode fallback(axonhub/deepseek 等) | 2026-11-05 | P1 | 待启动 |
+| 4 | 收口 2 个 YELLOW:技能层补任务台账记录,或由测试负责人 `--mark-green`,再经 `--auto` 链式 DONE | 测试侧配合;或技能层放宽 `auto_advance` 对「测试侧补登键」的判定 | 2026-11-05 | P2 | 待启动 |
+
+---
+
+## 三、阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| **`CfBalanceController.java` staged 倒退版**:`+13/-197`,`currentMemberId` 0 处,而 origin/cfclub 正确版 15 处(`dfc78e9d3` 财富中心/推广收益改读实时 CF 账本)。全量 `git add -A && commit` 会**回退已上线功能** | cfclub 主线 / 财富中心、推广收益 | 研发 | 待响应(连续 4+ 轮标记,未代提交、未 stash) | 主理人裁决:按远端版覆盖 or 保留 staged 暂不提交 |
+| 工作目录 68 处未提交(9 staged + 4 MM + 18 unstaged + 37 未追踪) | 本轮「完成」判定;汇报文档 push 门禁(模板 §628 要求 push 前 `--clean-check` 干净) | 研发 | 处理中(本轮已分类,未执行) | 事项 1 的范围拍板 |
+| 本地 HEAD `ac2e27300` 落后 origin/cfclub 44 提交 | 提交/推送基线与证据核验 | 研发 | 待响应 | 先 fetch 对齐,勿直接 push 覆盖 |
+| 测试侧补登 2 键(B-6/B-7)无任务台账记录 → `--auto` 不自动收口 | 2 个 YELLOW 滞留 | 研发(编排侧) | 处理中(根因已定位至 `tdd_orchestrate.py` ~2856-2863) | 技能层补记录 or 测试 `--mark-green` |
+| `--inspect` 角色门禁 vs 模板 1.2b 必填会话状态 | 研发负责人汇报数据源 | 设计(技能口径) | 待响应 | 技能层放行研发只读 `--inspect` |
+| 四类数据源静默全 0(1.6) | 目标池判定、空闲会话派发 | 设计(技能口径) | 处理中(本轮已说明,未改代码) | 补 ⏳ ↔ SRS「未覆盖控制器」章节映射 |
+| opencode 黑窗 ACTIVE(`opencode_blackout_until_ms=1793836800000`,至 2026-11-05 08:00;last429 11-04 11:36:30) | 派发模型选择 | 研发 | 已由 hub 策略链兜底(非 opencode fallback) | 0(无需协调) |
+
+---
+
+## 四、下轮工作规划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 涉及会话标签 | 备注 |
+|--------|--------------|----------|--------------|------|
+| 按拍板范围执行分级收口 + 推送本汇报,跑 `--clean-check` 复验 | 2026-11-04 | 主理人范围拍板 | 研发负责人3(本会话) | 提交铁律:汇报文档须 `git add`+`commit`+`push` 到 `data_ref` |
+| 派发 S-cfc-7 / S-cfc-8 写 RED 契约单测 | 2026-11-05 | 设计文档合入 origin/cfclub;opencode 黑窗解禁或 fallback | lan-248 / lan-204 / lan-189 / pub-iwintrue(均有空槽) | 每实例 ≤2 个 CFC 会话;远程 Linux 加 `MSYS_NO_PATHCONV=1` |
+| 2 个 YELLOW 收口 + B-6/B-7 台账解除 | 2026-11-05 | 测试负责人 `--mark-green` / `--clear-blocked` | 测试负责人 | 研发不代解除(角色隔离) |
+| 以后每轮按本模板交汇报(错峰03 常态化) | 每轮 | 0 | 研发负责人3 | 本轮为第 1 份,已补此前 41 轮欠账 |
+
+---
+
+## 附录
+
+### 附录 A:收到的测试反馈问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 来源 | 接收时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|------|----------|----------|----------|
+| B-1 | cfc-backend surefire 13 红 | 实现缺陷 | 测试台账 | 2026-11-03 10:58 | 待处理(代码层前序已修,待测试复验解除) | `c9f9ec948` |
+| B-2 | admin-auth/login | 实现缺陷 | 测试台账 | 2026-11-03 10:58 | 待处理(已交付,待测试复验) | `d936d1b18` |
+| B-3 | 报告上传 MIME | 实现缺陷 | 测试台账 | 2026-11-03 10:58 | 待处理(代码层已落地远端,待复验) | 0(远端 HealthReportController / AssessmentReportController 校验) |
+| B-4 | butler envelope / commission 400 | 实现缺陷 | 测试台账 | 2026-11-03 10:58 | 待处理(已交付,待测试复验) | `c6acdbd37` |
+| B-5 | 冒烟 49 条 REAL_ERR | 实现缺陷 | 测试台账 | 2026-11-03 10:58 | 待处理 | 0(待分型认领) |
+| B-6 | health.report.createReport | 状态机口径 | 测试台账 | 2026-11-03 10:58 | 待处理(实为 YELLOW,实现+测试均已推远端) | `81d8883f7` / `1767d4414` |
+| B-7 | dan.assessment.getActiveMaterial | 状态机口径 | 测试台账 | 2026-11-03 10:58 | 待处理(实为 YELLOW,实现+测试均已推远端) | `faf3ca174` / `c3e32460a` |
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 任务类型 | 分派时间 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| 0(本轮无分派) | 0 | — | — | — | 0(本轮无恢复) | 0(无中断/swallowed/wedged 触发重建) | 0 |
+
+> 本轮派发 0 的原因见 1.2;恢复 0 的原因:6/6 实例可达、`--inspect` 示 interrupted=0。
+
+### 附录 C:新增入池任务明细
+
+| 任务号 | 能力键 | 需求溯源 | 设计溯源 | 创建时间 | 状态 |
+|--------|--------|----------|----------|----------|------|
+| S-cfc-7 | `dimension.registry.getTree` | `docs/superpowers/specs/2026-11-03-unified-dimension-system-prd.md` §4 P0-2 维度树 API(统一取数入口) | 同系列 `...-design.md` §5.1 `GET /api/dimension-registry/tree` → `Result<List<DimensionNode>>`;实现 `DimensionRegistryController#tree` | 2026-11-04 21:42 | RED |
+| S-cfc-8 | `dimension.registry.mapLegacyCode` | 同 PRD §4 P0-3 编码映射层(4 套历史编码 → 统一 code,双向可回查) | 同 design §4 映射层 + §5.1 `GET /api/dimension-registry/map?legacy=` → `Result<String>`;实现 `DimensionRegistryController#map` / `DimensionCodeMapper` | 2026-11-04 21:43 | RED |
+
+> ⚠ 两个溯源锚点当前均为**本地未提交文件**,已在 `--requirement` 中显式注明「待合入 origin/cfclub 后方可派发」;对应事项 2(P0)。
+
+### 附录 D:变更感知明细(来自 `--changes --days 7`)
+
+| 变更文档 | 文档类型 | 变更日期 | 新增能力键 | 是否已入池 |
+|----------|----------|----------|------------|------------|
+| `docs/flows/badge-microaction-flow.md`(`6294d7dc` fix(contract) 对齐 badges 契约测试期) | 设计 | 2026-11-02 | 0(`--changes` 判定 0→0) | 否(无新键) |
+| `docs/tdd/test/automation-run-2026-11-02-*.md` 等 55 个 | 用例 | 2026-11-02 | 0 | 否(既有键台账刷新) |
+| `docs/superpowers/specs/2026-11-03-unified-dimension-system-{prd,design}.md` 等 4 份 + 2 个 mermaid | 设计 | 2026-11-03(**本地未提交 `??`**) | 0(不在 git 历史,`--changes` 扫描不到) | **是**(本轮据文档内容手工建 S-cfc-7 / S-cfc-8) |
+| `cfc-backend/.../Dimension{Registry,CodeMapper,SyncService}*.java` 等 8 个 | 实现 | 2026-11-03(**本地未提交 `??`**) | 0(同上) | 否(实现文件不建键,作为设计溯源依据) |
+| `docs/superpowers/specs/2026-11-03-miniapp-force-update-design`(`b9f82aad` T40)等 | 设计 | 2026/11-03 | 0 | 否 |
+| `docs/tdd/test/automation-run-2026-11-04-1130.md` | 用例 | 2026-11-04(本地未提交) | 0 | 否 |
+
+> 窗口内合计:设计文档 8、测试用例文档 55、其他 114(共 177 文件变更),新增能力键 0→0(口径见 1.3 / 1.6)。
+
+---
+
+**提交状态**:本汇报已落盘 `docs/tdd/orchestration/`,**尚未 `git add`/`commit`/`push`** —— 模板 §628 要求推送前 `--clean-check` 干净,当前 68 处 WIP 且含倒退风险项,按「不可逆操作前确认」暂缓,待事项 1 拍板后一并推送。按 E2 铁律,本轮**未推送 = 未完成**,如实标注。