$npx -y skills add kweaver-ai/kweaver-dip --skill bkn-map属性到字段映射 + 覆盖率计算 + 完备性放行。
| 1 | # 属性映射 |
| 2 | |
| 3 | 公约:`../_shared/contract.md` | 映射规则:`references/mapping-rules.md` |
| 4 | |
| 5 | ## 做什么 |
| 6 | |
| 7 | 给定已绑定对象和视图字段 schema,为每个属性确定映射状态,计算覆盖率,判定是否放行。 |
| 8 | |
| 9 | ## 输入 |
| 10 | |
| 11 | - `binding_decision_list`:`bkn-bind` 的输出(仅处理 bound 对象) |
| 12 | - `relation_binding_result`:`bkn-relation-bind` 的输出(仅处理 confirmed 关系) |
| 13 | - `object_draft_list`:对象清单(含属性) |
| 14 | - `view_schema_map`:已绑定视图的字段 schema + 外键信息 |
| 15 | |
| 16 | ## 流程 |
| 17 | |
| 18 | ### 对象属性映射 |
| 19 | |
| 20 | 1. **属性回灌**:以原始文本 + 绑定视图字段为输入,重建属性候选 |
| 21 | - 分层标注:`core_business`(原始文本存在)/ `view_derived`(仅视图中有)/ `technical_excluded`(纯技术字段) |
| 22 | - 输出差异动作:keep / add / rename / merge / drop_candidate |
| 23 | - **属性名对齐**:若 draft 阶段使用的属性名与视图字段名不一致,执行 rename 操作,将 draft 属性名改为视图实际字段名 |
| 24 | - 无已绑定视图时输出空差异,标注原因 |
| 25 | 2. **映射判定**:每个属性三态之一 |
| 26 | - `mapped`:有明确字段来源、语义一致、类型兼容 |
| 27 | - `waived`:有依据的豁免(非必填/业务确认暂不绑定) |
| 28 | - `blocked`:无可接受字段/类型冲突/多候选无法裁决 |
| 29 | 3. **覆盖率**:`coverage = (mapped + waived) / total` |
| 30 | 4. **质量评定**: |
| 31 | - `blocked_count = 0 AND coverage = 100%` → `mapping_quality: full` |
| 32 | - `blocked_count = 0 AND coverage >= 80%` → `mapping_quality: partial`(有豁免项) |
| 33 | - `blocked_count > 0 OR coverage < 80%` → `mapping_quality: needs_work` |
| 34 | |
| 35 | `mapping_quality` 作为评分输入传给 `bkn-review`,不单独阻断 pipeline。Pipeline 放行权由 `bkn-review` 的综合评分决定。 |
| 36 | |
| 37 | `mapping_quality` 非 `full` 时提供互斥策略: |
| 38 | - **A(BKN 优先)**:补映射后重跑 |
| 39 | - **B(视图优先)**:按视图重构属性后重跑 |
| 40 | - **C(混合治理)**:高价值差异增补,其余豁免 |
| 41 | |
| 42 | 详细规则见 `references/mapping-rules.md` |
| 43 | |
| 44 | ### 关系类 View Property 映射(新增) |
| 45 | |
| 46 | 仅处理 `relation_binding_result.data_view_relations` 中 `status: confirmed` 的关系: |
| 47 | |
| 48 | 1. **Source Mapping 映射**: |
| 49 | - 输入:`source_mapping_rules`(起点属性 → 中间视图字段) |
| 50 | - 验证:起点属性存在于起点对象的 Data Properties |
| 51 | - 验证:中间视图字段存在于中间视图 schema |
| 52 | - 映射状态:mapped / blocked |
| 53 | |
| 54 | 2. **Target Mapping 映射**: |
| 55 | - 输入:`target_mapping_rules`(中间视图字段 → 终点属性) |
| 56 | - 验证:中间视图字段存在于中间视图 schema |
| 57 | - 验证:终点属性存在于终点对象的 Data Properties |
| 58 | - 映射状态:mapped / blocked |
| 59 | |
| 60 | 3. **关系映射质量评定**: |
| 61 | - 所有 Source/Target Mapping 都 mapped → `relation_mapping_quality: full` |
| 62 | - 有 blocked → `relation_mapping_quality: partial` |
| 63 | |
| 64 | **跳过条件**: |
| 65 | - `relation_binding_result` 为空或不存在 |
| 66 | - 无 `confirmed` 的 data_view 类型关系 |
| 67 | |
| 68 | ## 输出 |
| 69 | |
| 70 | ```yaml |
| 71 | property_regen_summary: {keep, add, rename, merge, drop_candidate} |
| 72 | property_mapping_draft: |
| 73 | - object_name: "" |
| 74 | mapped_count: 0 |
| 75 | waived_count: 0 |
| 76 | blocked_count: 0 |
| 77 | coverage: 0.0 |
| 78 | rows: [{property_name, status, view_id, field_path, confidence, reason}] |
| 79 | mapping_gate_summary: {coverage, blocked_count, mapping_quality, recommended_strategy} |
| 80 | |
| 81 | # 新增:关系类映射结果 |
| 82 | relation_mapping_draft: |
| 83 | - 关系ID: "" |
| 84 | 关系名称: "" |
| 85 | 关系类型: direct | data_view |
| 86 | intermediate_view_id: "" # 仅 data_view 类型 |
| 87 | source_mapping: |
| 88 | - source_property: "" |
| 89 | view_property: "" |
| 90 | status: mapped | blocked |
| 91 | reason: "" |
| 92 | target_mapping: |
| 93 | - view_property: "" |
| 94 | target_property: "" |
| 95 | status: mapped | blocked |
| 96 | reason: "" |
| 97 | relation_mapping_quality: full | partial | skipped |
| 98 | relation_mapping_summary: |
| 99 | total_relations: 0 |
| 100 | mapped_relations: 0 |
| 101 | blocked_relations: 0 |
| 102 | skipped_relations: 0 # pending 关系,跳过映射 |
| 103 | ``` |
| 104 | |
| 105 | ## 约束 |
| 106 | |
| 107 | - 属性回灌不可跳过,即使绑定率已达标 |
| 108 | - 不将"猜测"标为 mapped |
| 109 | - 不将"暂无字段"标为 waived(waived 是有依据的豁免) |
| 110 | - coverage 必须可追溯到逐属性证据 |
| 111 | - 本 skill 执行完成后,pipeline 负责将 `map_completed: true` 写入 `pipeline_state.yaml`,本 skill 不直接写入该文件 |