Files
RiskAgent/.kiro/specs/outsourcing-risk-assessment/tasks.md
T
freedakgmail c670b9e454 外包风险评估系统:领域引擎+前端+服务端持久化与生产部署
- 确定性领域引擎(分类/评分/分级/红线/费用/裁决)+LLM(通义千问)语言理解
- 6步评估向导、服务端草稿持久化(跨设备/编辑草稿保护)
- 工作流(草稿→风控→管理层)、RBAC、报告导出、校准、客户/费率/红线/最低工资管理
- 专业图标体系替换全部emoji、看板美化
- 生产化:API_BASE可配置(同源反代)、auth密钥惰性读取修复RBAC
- 444单测+204前端测试+51 e2e
2026-06-13 01:06:39 +08:00

748 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Implementation Plan: 外包项目风险评估 AI 智能体
## Overview
实现语言为 **TypeScript**,属性化测试库采用 **fast-check**,单元/集成测试运行器采用 **Vitest**
实现策略自底向上、增量推进:先建立项目骨架与核心领域类型 + Data_Provenance 三态工具,再实现配置中心(模板加载/继承/实例化/校验),随后是评分引擎(评分/归一化/分级/红线/热力图/Top N),费用测算引擎、策略引擎、追问引擎、分类器、合规规则集、知识库、外部数据适配层、报告生成、持久化、RBAC 与角色视图,由 Orchestrator 端到端串联;最后实现前端表现层(Design_System 设计系统、数据可视化组件、Wizard 评估流程、响应式适配、可访问性、操作反馈与角色化默认视图),复用领域引擎输出。
每条 Correctness Property(共 81 条:领域逻辑 62 条 + Req 19-25 UI 可属性化 19 条,即 Property 63-81)由单个属性化测试实现,紧邻其实现任务以尽早发现错误。属性测试约束:使用 fast-check、每条属性至少运行 100 次迭代、以注释标注标签 `Feature: outsourcing-risk-assessment, Property {n}: {property_text}`。带 `*` 的子任务为可选测试任务。
## Tasks
- [x] 1. 搭建项目骨架与核心领域类型
- [x] 1.1 初始化 TypeScript 工程与测试框架
- 初始化 `package.json``tsconfig.json`、目录结构(`src/``src/__tests__/`
- 安装并配置 Vitest 与 fast-check(≥100 次迭代默认配置)
- 添加 build / test / lint 脚本
- _Requirements: 基础设施(无直接验收标准)_
- [x] 1.2 定义核心领域类型与接口
- 定义 `RiskModel``Dimension``Indicator``ScoringRule``Redline``Template`
- 定义 `Assessment``ScoringItem``RedlineResult``HeatmapCell``RiskItem`
- 定义 `DataProvenance`(用户输入/外部数据/智能体假设)、`Region``ComplianceRuleSet`
- 定义 `KnowledgeBase``IndustryPartition``ConfigAuditEntry``CostEstimate``Acceptability`
- _Requirements: 2.3, 4.6, 16.4, 17.1, 18.4_
- [x] 1.3 实现 Data_Provenance 三态工具
- 实现 provenance 标注/转移函数,强制"智能体假设"单调永久(一旦标注不可被改回其他取值)
- 实现 Confidence 值域约束([0,1] 两位小数)
- _Requirements: 3.7, 4.6, 18.4_
- [x]* 1.4 编写 Data_Provenance 单调性属性测试
- **Property 16: 智能体假设标注单调永久**
- **Validates: Requirements 3.7**
- [x] 2. 实现 Config_Center 模型配置中心
- [x] 2.1 实现权重归一化 `normalizeWeights`
- 按比例归一化使同级启用项权重之和=100%(两位小数);全零向量拒绝
- _Requirements: 11.2, 11.8_
- [x]* 2.2 编写权重归一化保比例属性测试
- **Property 40: 权重归一化保比例且同级和为 100%**
- **Validates: Requirements 11.2**
- [x]* 2.3 编写权重全零拒绝属性测试
- **Property 44: 同级权重全零拒绝归一化**
- **Validates: Requirements 11.8**
- [x] 2.4 实现模板继承解析 `resolveInheritance`
- 应用父模板全部组成项后以子模板差异项逐项覆盖;检测循环引用与层级>5 报错
- _Requirements: 2.5, 2.7_
- [x]* 2.5 编写模板继承逐项覆盖属性测试
- **Property 9: 模板继承逐项覆盖**
- **Validates: Requirements 2.5**
- [x]* 2.6 编写继承链环与深度防护属性测试
- **Property 10: 继承链环与深度防护**
- **Validates: Requirements 2.7**
- [x] 2.7 实现模板匹配与回退 `loadTemplate`
- 精确匹配优先;无精确匹配回退业务类型默认模板并标注"未匹配行业专用模板";皆无则终止返回无可用模板提示
- _Requirements: 2.1, 2.2, 2.6, 14.3, 14.5_
- [x]* 2.8 编写模板匹配与回退确定性属性测试
- **Property 6: 模板匹配与回退确定性**
- **Validates: Requirements 2.1, 2.2, 2.6, 14.3, 14.5**
- [x] 2.9 实现风险模型实例化与校验 `instantiateRiskModel`
- 保留全部组成项与启停状态;校验必填项完整性与同级权重和=100%,非法则不实例化并终止
- _Requirements: 2.3, 2.4_
- [x]* 2.10 编写实例化结构保持属性测试
- **Property 7: 模板实例化结构保持**
- **Validates: Requirements 2.3**
- [x]* 2.11 编写非法模板拒绝实例化属性测试
- **Property 8: 非法模板必被拒绝实例化**
- **Validates: Requirements 2.4**
- [x] 2.12 实现配置保存、另存模板与启停
- 实现 `saveConfig`(校验 Scoring_Rule 覆盖 1-5、Redline 唯一/必填、权重合法性后保存;失败保留上次有效配置)
- 实现 `saveAsTemplate`/派生;实现 Dimension/Indicator 启用/停用(停用保留配置但不计分)
- _Requirements: 11.1, 11.3, 11.4, 11.5, 11.6, 11.7_
- [x]* 2.13 编写评分规则与红线配置校验属性测试
- **Property 41: 评分规则与红线配置校验**
- **Validates: Requirements 11.3, 11.4**
- [x]* 2.14 编写配置另存为模板可往返属性测试
- **Property 42: 配置另存为模板可往返**
- **Validates: Requirements 11.5**
- [x]* 2.15 编写校验失败保留上次有效配置属性测试
- **Property 43: 校验失败保留上次有效配置**
- **Validates: Requirements 11.6, 11.7**
- [x]* 2.16 编写停用项保留但不计分属性测试
- **Property 39: 停用项保留但不计分**
- **Validates: Requirements 11.1**
- [x] 3. Checkpoint - 确保配置中心测试通过
- Ensure all tests pass, ask the user if questions arise.
- [x] 4. 实现 Scoring_Engine 评分引擎
- [x] 4.1 实现 `scoreIndicator``scoreDimension`
- 评分项得分 = Risk_Level(1-5) × 权重;维度得分 = 启用指标评分项加权求和
- _Requirements: 4.1, 4.2_
- [x]* 4.2 编写评分项得分公式属性测试
- **Property 17: 评分项得分公式**
- **Validates: Requirements 4.1, 4.2**
- [x] 4.3 实现 `computeRiskScore` 归一化
- 线性映射 `round((weightedRaw-1)/4×100)`;仅纳入启用项;无启用项返回评分数据不足错误
- _Requirements: 4.3, 4.4, 4.5_
- [x]* 4.4 编写归一化端点与值域属性测试
- **Property 18: 归一化端点与值域**
- **Validates: Requirements 4.3**
- [x]* 4.5 编写停用项不影响评分属性测试
- **Property 19: 停用项不影响评分**
- **Validates: Requirements 4.4**
- [x]* 4.6 编写无启用项必报错属性测试
- **Property 20: 无启用项必报错**
- **Validates: Requirements 4.5**
- [x] 4.7 实现 `classifyGrade` 风险分级
- 区间 [0,25]→低、(25,50]→中、(50,75]→高、(75,100]→极高,输出且仅输出一个 Risk_Grade
- _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5_
- [x]* 4.8 编写分级区间互斥且完备属性测试
- **Property 22: 分级区间互斥且完备**
- **Validates: Requirements 5.1, 5.2, 5.3, 5.4, 5.5**
- [x] 4.9 实现 `explain` 与评分项来源/置信标注
- 为每个评分项输出非空判定依据(引用 Dimension/Indicator/Scoring_Rule/数据点取值)、风险影响、建议
- 记录 Data_Provenance 与 [0,1] Confidence
- _Requirements: 4.6, 18.1, 18.2, 18.3, 18.4_
- [x]* 4.10 编写评分项来源与置信标注属性测试
- **Property 21: 评分项来源与置信标注**
- **Validates: Requirements 4.6, 18.4**
- [x]* 4.11 编写可解释三要素非空属性测试
- **Property 61: 评分项可解释三要素非空**
- **Validates: Requirements 18.1, 18.2, 18.3**
- [x] 4.12 实现 `checkRedlines` 红线校验
- 独立于 Risk_Score/Risk_Grade 校验全部启用红线;满足触发条件标记命中
- 数据缺失或为"智能体假设"标"待核实"且不计命中
- _Requirements: 6.1, 6.4, 6.5_
- [x]* 4.13 编写红线校验正确且独立于分值属性测试
- **Property 23: 红线校验正确且独立于分值**
- **Validates: Requirements 6.1, 6.4**
- [x]* 4.14 编写红线数据不足标待核实属性测试
- **Property 24: 红线数据不足标待核实**
- **Validates: Requirements 6.5**
- [x] 4.15 实现 `buildHeatmap` 风险热力图
- 为每个启用 Indicator 输出 Dimension 行 × Indicator 列 × Risk_Level(1-5) 单元格
- _Requirements: 7.1_
- [x]* 4.16 编写热力图覆盖全部启用指标属性测试
- **Property 29: 热力图覆盖全部启用指标**
- **Validates: Requirements 7.1**
- [x] 4.17 实现 `topKeyRisks` 关键风险清单
- 得分降序 Top N(N 可配 1-50 默认 10);同分按 Dimension 权重→Indicator 权重→稳定标识消歧;少于 N 输出全部;每项含 Dimension/Indicator/得分/判定依据
- _Requirements: 7.2, 7.3, 7.4, 7.5_
- [x]* 4.18 编写 Top N 确定性排序属性测试
- **Property 30: Top N 确定性排序**
- **Validates: Requirements 7.2, 7.3, 7.4, 7.5**
- [x] 5. Checkpoint - 确保评分引擎测试通过
- Ensure all tests pass, ask the user if questions arise.
- [x] 6. 实现 Cost_Engine 费用测算引擎
- [x] 6.1 实现 `estimate` 费用测算
- 依 Risk_Grade+评分计算风险溢价区间(下界≤上界、随分级单调)
- 计算垫资利息/保险费用/补偿准备金/坏账准备金(非负、标注依据输入项与费率来源)
- 输出基准报价与风险调整后报价(后者≥基准)及拆解一致;缺成本输入兜底默认值标"智能体假设";评分未完成拒绝并提示
- _Requirements: 8.1, 8.2, 8.3, 8.4, 8.5, 8.6_
- [x]* 6.2 编写风险溢价区间合法且单调属性测试
- **Property 31: 风险溢价区间合法且随分级单调**
- **Validates: Requirements 8.1**
- [x]* 6.3 编写费用项非负且标注依据属性测试
- **Property 32: 费用项非负且标注依据**
- **Validates: Requirements 8.2, 8.6**
- [x]* 6.4 编写报价不低于基准且拆解一致属性测试
- **Property 33: 风险调整后报价不低于基准且拆解一致**
- **Validates: Requirements 8.3**
- [x]* 6.5 编写缺失成本输入兜底为假设属性测试
- **Property 34: 缺失成本输入兜底为假设**
- **Validates: Requirements 8.4**
- [x]* 6.6 编写评分未完成拒绝费用测算属性测试
- **Property 35: 评分未完成拒绝费用测算**
- **Validates: Requirements 8.5**
- [x] 7. 实现 Strategy_Engine 应对策略引擎
- [x] 7.1 实现 `decide` 可接受性决策表
- 红线命中→不可接受(优先于 Grade);未命中时 低/中→可接受、高→有条件接受、极高→不可接受
- _Requirements: 6.2, 6.6, 9.1, 9.6, 9.7, 9.8_
- [x]* 7.2 编写可接受性决策表完备且红线最高优先属性测试
- **Property 26: 可接受性决策表完备且红线最高优先**
- **Validates: Requirements 6.2, 6.6, 9.1, 9.6, 9.7, 9.8**
- [x] 7.3 实现管理层面与费用层面应对措施
- 管理措施覆盖合同条款/用工合规整改/退场预案/过程监控四类各≥1
- 费用措施覆盖风险溢价定价/预付保证金/保险转移/账期成本/准备金计提五类各≥1
- _Requirements: 9.3, 9.4_
- [x]* 7.4 编写应对措施类别全覆盖属性测试
- **Property 27: 应对措施类别全覆盖**
- **Validates: Requirements 9.3, 9.4**
- [x] 7.5 实现接受条件清单
- 有条件接受时每个条件关联≥1 关键风险项并输出具体金额/区间的成本影响测算
- _Requirements: 9.2, 9.5_
- [x]* 7.6 编写有条件接受的条件关联与成本影响属性测试
- **Property 28: 有条件接受的条件关联与成本影响**
- **Validates: Requirements 9.2, 9.5**
- [x] 8. 实现 Question_Engine 自适应追问引擎
- [x] 8.1 实现 `identifyGaps` 信息缺口识别
- 缺口集合恰为 {启用 ∧ 依 Scoring_Rule 无法判定 Risk_Level} 的指标
- _Requirements: 3.1_
- [x]* 8.2 编写信息缺口识别准确属性测试
- **Property 11: 信息缺口识别准确**
- **Validates: Requirements 3.1**
- [x] 8.3 实现 `generateQuestions` 追问问题生成
- 仅覆盖缺口指标;按 Indicator 权重降序、同权按 Dimension 权重降序;每问关联真实 Dimension 与 Indicator
- _Requirements: 3.2, 3.8_
- [x]* 8.4 编写追问仅针对缺口且排序确定属性测试
- **Property 12: 追问仅针对缺口且排序确定**
- **Validates: Requirements 3.2, 3.8**
- [x] 8.5 实现 `answerQuestion` 回答处理
- 满足证据要求→移出缺口并更新已知信息;空/不满足证据→保留缺口并返回需补充信息提示
- _Requirements: 3.3, 3.4_
- [x]* 8.6 编写有效回答移出缺口属性测试
- **Property 13: 有效回答移出缺口**
- **Validates: Requirements 3.3**
- [x]* 8.7 编写无效回答保留缺口属性测试
- **Property 14: 无效回答保留缺口**
- **Validates: Requirements 3.4**
- [x] 8.8 实现 `applyDefaultsOnExhaust` 兜底
- 单指标追问轮次不超过可配上限(默认 3);达上限仍缺失采用行业默认值并标注"智能体假设"
- _Requirements: 3.5, 3.6_
- [x]* 8.9 编写追问轮次不超上限并触发兜底属性测试
- **Property 15: 追问轮次不超上限并触发兜底**
- **Validates: Requirements 3.5, 3.6**
- [x] 9. 实现 Classifier 业务类型与行业识别
- [x] 9.1 实现 `classify` 识别与输入校验
- 输入<10 有效字符/空白拒绝;业务类型取五类中 Confidence 最高唯一项;行业不可判定取"未识别"Confidence∈[0,1] 两位小数
- _Requirements: 1.1, 1.2, 1.3, 1.6_
- [x]* 9.2 编写业务类型判定唯一且取最高置信属性测试
- **Property 1: 业务类型判定唯一且取最高置信**
- **Validates: Requirements 1.1**
- [x]* 9.3 编写置信度恒在有效值域内属性测试
- **Property 2: 置信度恒在有效值域内**
- **Validates: Requirements 1.3**
- [x]* 9.4 编写描述信息不足必被拒绝属性测试
- **Property 4: 描述信息不足必被拒绝**
- **Validates: Requirements 1.6**
- [x] 9.5 实现候选列表与确认标志
- Confidence<0.6(行业附加:行业≠"未识别")时返回按 Confidence 降序≤3 项候选并置确认标志
- _Requirements: 1.4, 1.5_
- [x]* 9.6 编写低置信触发候选确认属性测试
- **Property 3: 低置信触发候选确认**
- **Validates: Requirements 1.4, 1.5**
- [x] 9.7 实现 `confirmClassification` 确认值驱动
- 采用评估者确认/修改后的业务类型与行业作为后续加载模板依据
- _Requirements: 1.7_
- [x]* 9.8 编写确认值驱动后续加载属性测试
- **Property 5: 确认值驱动后续加载**
- **Validates: Requirements 1.7**
- [x]* 9.9 编写行业语义识别单元测试
- 代表性描述验证可识别行业与"未识别"分支
- _Requirements: 1.2_
- [x] 10. 实现 Compliance_Rule_Set 地域合规规则集
- [x] 10.1 实现按 Region 加载规则集与 Region 记录/默认
- 创建 Assessment 记录所采用 Region;未指定时默认 CN 并标注系统默认值;无对应规则集拒绝合规处理并提示暂不支持
- _Requirements: 16.4, 16.5, 16.6_
- [x]* 10.2 编写 Region 记录与默认属性测试
- **Property 55: Region 记录与默认**
- **Validates: Requirements 16.4, 16.5**
- [x]* 10.3 编写无规则集地域拒绝合规处理属性测试
- **Property 56: 无规则集地域拒绝合规处理**
- **Validates: Requirements 16.6**
- [x] 10.4 实现 CN 合规判定与费用测算
- 覆盖社保基数、经济补偿 N/N+1、派遣比例上限 10%、当地最低工资;计算经济补偿/社保金额/合规费用并标注规则项与输入项;不满足项标合规不通过
- _Requirements: 16.1, 16.2, 16.3_
- [x]* 10.5 编写合规判定覆盖与计量标注属性测试
- **Property 53: 合规判定覆盖与计量标注**
- **Validates: Requirements 16.1, 16.2**
- [x]* 10.6 编写合规不满足项标注属性测试
- **Property 54: 合规不满足项标注**
- **Validates: Requirements 16.3**
- [x]* 10.7 编写合规算例单元测试
- 给定社保基数/派遣比例/最低工资代表性数值验证 N/N+1 与社保金额计算正确
- _Requirements: 16.2_
- [x] 11. 实现 Knowledge_Base 分行业知识库
- [x] 11.1 实现行业分区存储与完备性校验
- 按行业分区存储 Indicator/权重模板/Redline/典型案例/追问话术五类;缺任一类拒绝创建并指明缺失类别且保持已有分区不变
- _Requirements: 14.1, 14.4_
- [x]* 11.2 编写行业分区内容完备性校验属性测试
- **Property 50: 行业分区内容完备性校验**
- **Validates: Requirements 14.1, 14.4**
- [x]* 11.3 编写知识库行业分区运行时扩展集成测试
- 运行时新增分区后验证其 Template 可被加载、无需修改 Scoring_Engine 源码或重编译
- _Requirements: 14.2_
- [x] 12. 实现 External_Data_Adapter 外部数据适配层
- [x] 12.1 实现适配器接口与来源标注
- 定义可插拔 `DataSourceAdapter` 接口;成功取数标注 Data_Provenance="外部数据" 与 [0,1] Confidence
- _Requirements: 15.1, 15.2, 15.5_
- [x]* 12.2 编写外部数据点来源与置信标注属性测试
- **Property 51: 外部数据点来源与置信标注**
- **Validates: Requirements 15.2**
- [x] 12.3 实现超时/失败降级回退
- 连接失败/超 10 秒/错误响应回退用户输入标"用户输入";回退后仍缺失标"智能体假设"并继续评估不中断
- _Requirements: 15.3, 15.4_
- [x]* 12.4 编写外部数据失败降级回退属性测试
- **Property 52: 外部数据失败降级回退**
- **Validates: Requirements 15.3, 15.4**
- [x]* 12.5 编写外部数据适配集成测试
- mock 数据源验证成功取数路径;注册新适配器验证无需改 Scoring_Engine 源码即可使用
- _Requirements: 15.1, 15.5_
- [x] 13. 实现 Report_Generator 报告生成与导出
- [x] 13.1 实现 `generate` 报告生成与流程门控
- 评分/红线/费用/可接受性结论均完成方可生成;含全部规定章节;未命中红线明确标注"无红线命中";流程未完成拒绝并提示
- _Requirements: 10.1, 10.4_
- [x]* 13.2 编写报告章节完备属性测试
- **Property 36: 报告章节完备**
- **Validates: Requirements 10.1**
- [x]* 13.3 编写流程未完成拒绝报告属性测试
- **Property 38: 流程未完成拒绝报告**
- **Validates: Requirements 10.4**
- [x] 13.4 实现维度明细字段与信息缺口尽调说明
- 各维度明细每个评分项展示评分/判定依据/风险影响/Data_Provenance/Confidence
- "智能体假设"项列入信息缺口说明并附关联 Indicator 的补充尽调建议
- _Requirements: 10.3, 18.5, 18.6_
- [x]* 13.5 编写维度明细字段齐备属性测试
- **Property 37: 维度明细字段齐备**
- **Validates: Requirements 10.3**
- [x]* 13.6 编写假设项进入缺口说明并附尽调建议属性测试
- **Property 62: 假设项进入缺口说明并附尽调建议**
- **Validates: Requirements 18.5, 18.6**
- [x] 13.7 实现命中红线列入报告
- 命中红线评估报告列出每个被命中红线及其被触发条件与判定依据数据
- _Requirements: 6.3_
- [x]* 13.8 编写命中红线列入报告属性测试
- **Property 25: 命中红线列入报告**
- **Validates: Requirements 6.3**
- [x] 13.9 实现 `export` 报告导出
- 30 秒内导出完整自包含可下载文件;失败中止导出、保留已生成报告不变并返回错误
- _Requirements: 10.2, 10.5_
- [x]* 13.10 编写报告导出集成测试
- 验证导出文件自包含且含全部章节、耗时<30 秒;注入导出失败验证报告内容不变
- _Requirements: 10.2, 10.5_
- [x] 14. 实现评估持久化与历史管理
- [x] 14.1 实现 `save` 持久化与元数据
- 完成即持久化输入/评分结果/报告/元数据(含业务类型/行业/Region/Risk_Score/Risk_Grade/创建时间/评估者身份);失败保留会话数据并返回错误
- _Requirements: 17.1, 17.2_
- [x]* 14.2 编写评估持久化往返属性测试
- **Property 57: 评估持久化往返**
- **Validates: Requirements 17.1**
- [x] 14.3 实现 `reassess` 复评
- 基于原输入创建新 Assessment(新标识)且原评估不变;引用不存在评估拒绝并提示
- _Requirements: 17.3, 17.4_
- [x]* 14.4 编写复评保留原评估属性测试
- **Property 58: 复评保留原评估**
- **Validates: Requirements 17.3, 17.4**
- [x] 14.5 实现 `compare` 跨项目对比
- ≥2 个返回各 Risk_Grade/Risk_Score/关键风险对比数据;<2 个拒绝并提示至少需选 2 个
- _Requirements: 17.5, 17.6_
- [x]* 14.6 编写跨项目对比数量约束与内容属性测试
- **Property 59: 跨项目对比的数量约束与内容**
- **Validates: Requirements 17.5, 17.6**
- [x] 14.7 实现 `search` 历史检索
- 按业务类型/行业/Risk_Grade/创建时间范围检索;返回项均满足条件,无匹配返回空集
- _Requirements: 17.7_
- [x]* 14.8 编写检索结果满足过滤条件属性测试
- **Property 60: 检索结果满足过滤条件**
- **Validates: Requirements 17.7**
- [x]* 14.9 编写持久化失败集成测试
- 注入存储失败验证会话数据保留并返回存储失败错误
- _Requirements: 17.2_
- [x] 15. 实现 RBAC 角色权限与角色视图
- [x] 15.1 实现 `requireRole`、非管理员配置拒绝与审计
- 非 Administrator(含 Assessor/未认证/未授权)配置修改一律拒绝、配置不变、返回权限不足
- 成功变更记录操作者/精确到秒变更时间/变更项标识;拒绝记录操作者与请求时间
- _Requirements: 12.1, 12.3, 12.4, 12.5_
- [x]* 15.2 编写非管理员配置修改一律拒绝属性测试
- **Property 45: 非管理员配置修改一律拒绝且配置不变**
- **Validates: Requirements 12.1, 12.3**
- [x]* 15.3 编写配置变更与拒绝均留痕审计属性测试
- **Property 46: 配置变更与拒绝均留痕审计**
- **Validates: Requirements 12.4, 12.5**
- [x] 15.4 实现 `renderView` 角色化视图
- 商务/销售:结论+接受条件+风险调整后报价;风控:评分明细(Risk_Level/依据/Provenance)+红线+缺口尽调;管理层:Grade+热力图+TopN+利润对风险对比
- _Requirements: 13.1, 13.2, 13.3_
- [x]* 15.5 编写角色化视图内容映射属性测试
- **Property 47: 角色化视图内容映射**
- **Validates: Requirements 13.1, 13.2, 13.3**
- [x] 15.6 实现 `renderPortfolio` 组合看板与无角色拒绝
- 管理层组合看板汇总全部评估,空集展示空看板并提示;无角色用户拒绝展示并提示分配角色
- _Requirements: 13.4, 13.5, 13.6_
- [x]* 15.7 编写组合看板汇总与空集处理属性测试
- **Property 48: 组合看板汇总与空集处理**
- **Validates: Requirements 13.4, 13.6**
- [x]* 15.8 编写无角色拒绝展示属性测试
- **Property 49: 无角色拒绝展示**
- **Validates: Requirements 13.5**
- [x]* 15.9 编写 Assessor 可执行评估单元测试
- 示例验证 Assessor 可使用当前 Risk_Model 执行评估的允许路径
- _Requirements: 12.2_
- [x] 16. 集成与端到端串联
- [x] 16.1 实现 Assessment Orchestrator 端到端编排
- 串联分类→模板加载/实例化→追问(含外部数据降级)→评分/红线→费用→策略→报告→持久化,连接全部组件
- _Requirements: 1.7, 2.1, 3.1, 4.3, 8.1, 9.1, 10.1, 16.4, 17.1_
- [x]* 16.2 编写端到端评估流程集成测试
- 自动化测试覆盖从项目描述输入到报告生成与持久化的完整流程
- _Requirements: 10.1, 17.1_
- [x] 17. Checkpoint - 确保领域引擎与持久化全部测试通过
- Ensure all tests pass, ask the user if questions arise.
- [x] 18. 搭建前端工程脚手架与 Design_System 设计系统
- [x] 18.1 初始化前端工程脚手架与 UI 测试工具链
- 初始化 React + TypeScript 前端工程(与既有 TS 工程共用或独立 `web/` 目录),配置打包/路由依赖
- 安装并配置 UI 测试工具:组件测试(Vitest + React Testing Library)、可视化回归快照、自动化可访问性检查(axe,如 `@axe-core/react`/`jest-axe`)、属性化测试 fast-check
- 引入图表库(如 ECharts 或 Recharts/Visx)依赖
- _Requirements: 基础设施(无直接验收标准)_
- [x] 18.2 实现 Design Tokens(排版/间距/图标/Color_Token
- 定义 ≥4 级具名 Typography 层级(各含固定字号与固定行高)
- 定义以 4 像素为基数的间距标度(取值均为 4 的整数倍)
- 定义单一来源图标集 IconSet
- 定义稳定 Color_Token,含 Risk_Grade 四级语义化配色(`color.risk.low/medium/high/critical`)与热力图顺序色 `color.heat.1..5`,每令牌含 Light/Dark 双主题取值
- _Requirements: 19.2, 19.3, 19.4, 19.5_
- [x]* 18.3 编写排版层级完备且文本取自层级属性测试
- **Property 63: 排版层级完备且文本取自层级**
- **Validates: Requirements 19.2**
- [x]* 18.4 编写 Risk_Grade 配色令牌一致且唯一属性测试
- **Property 64: Risk_Grade 配色令牌一致且唯一**
- **Validates: Requirements 19.3**
- [x]* 18.5 编写间距为 4 像素整数倍属性测试
- **Property 65: 间距为 4 像素整数倍**
- **Validates: Requirements 19.4**
- [x] 18.6 实现 Theme Provider 与 `resolveColorToken`CSS Variables
- 以 CSS 自定义属性承载 Color_Token,按 ThemeLight/Dark)切换变量集
- 实现 `resolveColorToken(token, theme)``riskGradeColorToken(grade)``setTheme` 仅替换令牌取值且保留页面已录入数据
- _Requirements: 19.6, 19.7_
- [x]* 18.7 编写主题配色令牌解析正确属性测试
- **Property 66: 主题配色令牌解析正确**
- **Validates: Requirements 19.6**
- [x] 18.8 实现基础组件库(Button/Input/Table/Card/Dialog/Nav/Toast
- 基于 Design Tokens 封装可复用基础组件,同类组件全局外观与交互行为一致,图标统一引用单一图标集
- _Requirements: 19.1, 19.5_
- [x]* 18.9 编写组件库一致性与单一图标集组件测试
- 验证同类组件在不同页面外观/行为一致、全部图标取自单一图标集
- _Requirements: 19.1, 19.5_
- [x] 19. 实现数据可视化组件库(Charts)
- [x] 19.1 实现通用 Chart 容器与状态/图例/标签/非颜色编码
- 实现 `renderChart(spec)` 通用契约:data 为空→Empty_State 提示无可展示数据;data 请求/计算中→Loading_State
- 系列/类别 ≥2 提供图例(标签与数据元素一致);坐标轴/数据点/分区提供非空文本标签
- 类别以颜色之外的文本标签或图案区分(`categoryEncoding`
- 消费 Scoring_Engine 输出(热力图、Top N 数据,见任务 4.15/4.17
- _Requirements: 20.2, 20.3, 20.4, 20.5, 23.6_
- [x] 19.2 实现风险热力图、Risk_Badge 与 Top N 关键风险图
- 热力图按 Dimension×Indicator×Risk_Level 渲染并附数值标签;Risk_Badge 以 Color_Token + 文字标签呈现 Risk_GradeTop N 条形图
- _Requirements: 20.1_
- [x] 19.3 实现风险总分仪表盘(Risk_Score 数值 + Risk_Grade
- 仪表盘同时呈现 Risk_Score 数值与按分级规则对应的 Risk_Grade(与 `classifyGrade` 输出一致)
- _Requirements: 20.1, 20.6_
- [x] 19.4 实现费用拆解图与基准 vs 风险调整后报价对比图
- 费用拆解图;报价对比图同时呈现基准报价、风险调整后报价与二者差额(差额=风险调整后-基准)
- _Requirements: 20.1, 20.7_
- [x] 19.5 实现跨项目组合对比图
- 跨项目组合对比图,消费持久化层 `compare`/组合看板数据
- _Requirements: 20.1_
- [x]* 19.6 编写图表图例与数据系列一致属性测试
- **Property 68: 图表图例与数据系列一致**
- **Validates: Requirements 20.2**
- [x]* 19.7 编写图表文本标签齐备属性测试
- **Property 69: 图表文本标签齐备**
- **Validates: Requirements 20.3**
- [x]* 19.8 编写图表空态与加载态呈现属性测试
- **Property 70: 图表空态与加载态呈现**
- **Validates: Requirements 20.4, 20.5**
- [x]* 19.9 编写仪表盘同时呈现总分与分级属性测试
- **Property 71: 仪表盘同时呈现总分与分级**
- **Validates: Requirements 20.6**
- [x]* 19.10 编写费用对比图三值并呈且差额一致属性测试
- **Property 72: 费用对比图三值并呈且差额一致**
- **Validates: Requirements 20.7**
- [x]* 19.11 编写图表非纯颜色编码属性测试
- **Property 79: 图表非纯颜色编码**
- **Validates: Requirements 23.6**
- [x]* 19.12 编写全套图表组件渲染单元测试
- 验证 Req 20.1 规定的全套图表组件(热力图/仪表盘/Risk_Badge/Top N/费用拆解/报价对比/组合对比)均可渲染
- _Requirements: 20.1_
- [x] 20. 实现 Wizard 向导与评估流程 UI
- [x] 20.1 实现 Wizard 步骤与进度指示
- 将评估流程拆分为有序步骤,呈现当前步骤序号、步骤总数与已完成步骤进度;`advance` 使已完成数单调非减
- _Requirements: 21.1_
- [x] 20.2 实现录入方式切换与一键操作入口
- 对话式追问↔表单录入切换保留切换前已录入数据;为提交评估/保存草稿/导出报告各提供一键触发入口
- _Requirements: 21.2, 21.4_
- [x] 20.3 实现信息缺口提示面板
- 以区别于常规文本的醒目样式呈现全部信息缺口/待补充项,并为每项提供定位至对应录入位置的入口
- _Requirements: 21.3_
- [x] 20.4 实现 Draft 草稿保存、断点续评与未保存离开确认
- 保存草稿持久化为 Draft 保留全部录入数据;打开 Draft 恢复全部数据并定位至保存时步骤;存在未保存修改离开时弹出确认
- _Requirements: 21.5, 21.6, 21.7_
- [x]* 20.5 编写 Wizard 进度正确且单调属性测试
- **Property 73: Wizard 进度正确且单调**
- **Validates: Requirements 21.1**
- [x]* 20.6 编写缺口项醒目呈现并可定位属性测试
- **Property 74: 缺口项醒目呈现并可定位**
- **Validates: Requirements 21.3**
- [x]* 20.7 编写 Draft 往返保真属性测试
- **Property 75: Draft 往返保真**
- **Validates: Requirements 21.5, 21.6**
- [x]* 20.8 编写一键入口与未保存离开确认组件测试
- 验证提交/保存草稿/导出一键入口存在,且未保存修改离开时呈现确认提示
- _Requirements: 21.4, 21.7_
- [x] 21. 实现响应式布局服务与断点适配
- [x] 21.1 实现 `selectLayout` 断点映射与 `onViewportChange`
- 确定性断点映射:≥1280→桌面布局(全部功能)、768-1279→紧凑布局(无横向滚动、内容完整可见)、<768→移动布局(看板保留 Risk_Score/Risk_Grade/Top N
- 跨断点切换应用匹配布局且不丢失已录入数据
- _Requirements: 22.1, 22.2, 22.3, 22.4_
- [x]* 21.2 编写断点布局映射确定性属性测试
- **Property 76: 断点布局映射确定性**
- **Validates: Requirements 22.1, 22.2, 22.3**
- [x]* 21.3 编写 UI 状态转换保留已录入数据属性测试
- **Property 67: UI 状态转换保留已录入数据**
- 覆盖切换 Theme、对话↔表单录入切换、跨断点布局变更后数据不丢失不篡改
- **Validates: Requirements 19.7, 21.2, 22.4**
- [x] 22. 实现可访问性(WCAG 2.1 AA
- [x] 22.1 实现键盘可达、可见焦点、表单标签与无障碍错误
- 全部交互控件可键盘聚焦并触发、聚焦呈现可见焦点指示;每个表单输入控件关联可被辅助技术识别的非空文本标签;校验失败为每个未通过控件呈现可被辅助技术识别的错误提示
- _Requirements: 23.1, 23.2, 23.4, 23.5_
- [x] 22.2 实现 `contrastRatio` 对比度计算
- 计算 WCAG 相对对比度,供正文 ≥4.5:1、大号文本 ≥3:1 达标校验
- _Requirements: 23.3_
- [x]* 22.3 编写文本对比度达标属性测试
- **Property 77: 文本对比度达标**
- **Validates: Requirements 23.3**
- [x]* 22.4 编写表单可访问标注与错误提示属性测试
- **Property 78: 表单可访问标注与错误提示**
- **Validates: Requirements 23.4, 23.5**
- [x]* 22.5 编写 axe 自动化可访问性检查
- 对全部页面运行 axe 规则集,验证键盘可聚焦与可见焦点指示、标签关联与 ARIA 正确性
- _Requirements: 23.1, 23.2_
- [x] 23. 实现操作反馈与角色化默认视图/路由守卫
- [x] 23.1 实现操作状态反馈与导出进度反馈
- `runOperation` 状态映射:处理中→Loading_State、成功→成功反馈、失败→可读错误信息(说明原因+指向修正路径的操作入口)
- 报告导出执行中呈现进度反馈,30 秒内呈现完成或失败终态
- _Requirements: 24.1, 24.2, 24.3, 24.4_
- [x]* 23.2 编写操作状态反馈映射属性测试
- **Property 80: 操作状态反馈映射**
- **Validates: Requirements 24.1, 24.2, 24.3**
- [x] 23.3 实现 `defaultRoute` 角色化默认视图与 RBAC 路由守卫
- 角色默认导航:商务/销售→SalesView、风控→RiskView、管理层→ManagementDashboard;无角色→需分配角色提示视图且不呈现评估数据
- 默认视图首屏将与角色匹配的功能入口呈现于无需额外导航即可见的位置;复用任务 15 的角色化视图(`renderView`/`renderPortfolio`)作为目标视图
- _Requirements: 25.1, 25.2, 25.3, 25.4, 25.5_
- [x]* 23.4 编写角色默认路由确定性属性测试
- **Property 81: 角色默认路由确定性**
- **Validates: Requirements 25.1, 25.2, 25.3, 25.5**
- [x]* 23.5 编写默认视图首屏角色入口可见组件测试
- 验证各角色默认视图首屏呈现与其角色匹配的功能入口
- _Requirements: 25.4_
- [x] 24. 前端 UI 可视化回归与性能检查(非属性化补充)
- [x]* 24.1 编写可视化回归基线快照测试
- 对关键页面与全套图表建立基线快照,覆盖 Light/Dark 双主题与各断点(≥1280/768-1279/<768)布局,验证排版/配色/间距视觉一致与图表标签不被遮挡
- _Requirements: 19.1, 20.3_
- [x]* 24.2 编写主题切换与导出性能检查
- 验证主题切换在 1 秒内对当前页面生效、报告导出在 30 秒内给出完成或失败终态
- _Requirements: 19.7, 24.4_
- [x] 25. 最终 Checkpoint - 确保领域引擎与前端 UI 全部测试通过
- Ensure all tests pass, ask the user if questions arise.
## Notes
- 标记 `*` 的子任务为可选测试任务,可为更快的 MVP 跳过;核心实现任务不可跳过。
- 每条 Correctness Property 由单个属性化测试实现,共 81 条(领域逻辑 62 条 + Req 19-25 UI 可属性化 19 条,即 Property 63-81),全部映射到对应实现任务并紧邻放置。
- 属性测试使用 fast-check、每条至少运行 100 次迭代、标注标签 `Feature: outsourcing-risk-assessment, Property {n}: {property_text}`
- 非属性类标准由单元测试与集成测试覆盖:领域侧(语义识别、外部 IO、导出时延、知识库分区扩展、持久化失败、架构解耦);前端侧(组件一致性、单一图标集、全套图表渲染、一键入口、未保存离开确认、默认视图首屏角色入口)。
- 前端 UI 不适合属性化的标准由组件测试、可视化回归(Light/Dark + 各断点基线快照)、axe 自动化可访问性检查与性能检查(主题切换 1 秒内、导出 30 秒内)覆盖。
- 前端任务(18-24)自底向上:先 Design_System(令牌/主题/组件库)→ 可视化组件 → Wizard 流程 → 响应式 → 可访问性 → 操作反馈与角色路由,复用领域引擎(任务 4 评分/热力图/Top N、任务 13 报告导出、任务 15 角色化视图)输出,避免重复。
- 每个任务引用其对应需求与设计属性编号以保证可追溯性;Checkpoint 用于增量验证。
## Task Dependency Graph
```json
{
"waves": [
{ "id": 0, "tasks": ["1.1"] },
{ "id": 1, "tasks": ["1.2"] },
{ "id": 2, "tasks": ["1.3", "2.1", "4.1", "9.1", "10.1", "11.1", "12.1", "14.1"] },
{ "id": 3, "tasks": ["1.4", "2.2", "2.3", "2.4", "4.2", "4.3", "9.2", "9.3", "9.4", "9.5", "9.9", "10.2", "10.3", "10.4", "11.2", "11.3", "12.2", "12.3", "14.2", "14.3", "15.1"] },
{ "id": 4, "tasks": ["2.5", "2.6", "2.7", "4.4", "4.5", "4.6", "4.7", "9.6", "9.7", "10.5", "10.6", "10.7", "12.4", "12.5", "14.4", "14.5", "15.2", "15.3", "15.9"] },
{ "id": 5, "tasks": ["2.8", "2.9", "4.8", "4.9", "9.8", "14.6", "14.7"] },
{ "id": 6, "tasks": ["2.10", "2.11", "2.12", "4.10", "4.11", "4.12", "8.1", "14.8", "14.9"] },
{ "id": 7, "tasks": ["2.13", "2.14", "2.15", "2.16", "4.13", "4.14", "4.15", "8.2", "8.3"] },
{ "id": 8, "tasks": ["4.16", "4.17", "8.4", "8.5"] },
{ "id": 9, "tasks": ["4.18", "6.1", "7.1", "8.6", "8.7", "8.8"] },
{ "id": 10, "tasks": ["6.2", "6.3", "6.4", "6.5", "6.6", "7.2", "7.3", "8.9"] },
{ "id": 11, "tasks": ["7.4", "7.5"] },
{ "id": 12, "tasks": ["7.6"] },
{ "id": 13, "tasks": ["13.1"] },
{ "id": 14, "tasks": ["13.2", "13.3", "13.4", "15.4"] },
{ "id": 15, "tasks": ["13.5", "13.6", "13.7", "15.5", "15.6"] },
{ "id": 16, "tasks": ["13.8", "13.9", "15.7", "15.8"] },
{ "id": 17, "tasks": ["13.10"] },
{ "id": 18, "tasks": ["16.1"] },
{ "id": 19, "tasks": ["16.2"] },
{ "id": 20, "tasks": ["18.1"] },
{ "id": 21, "tasks": ["18.2"] },
{ "id": 22, "tasks": ["18.3", "18.4", "18.5", "18.6", "18.8"] },
{ "id": 23, "tasks": ["18.7", "18.9", "19.1"] },
{ "id": 24, "tasks": ["19.2", "19.3", "19.4", "19.5"] },
{ "id": 25, "tasks": ["19.6", "19.7", "19.8", "19.9", "19.10", "19.11", "19.12", "20.1"] },
{ "id": 26, "tasks": ["20.2", "20.3", "20.4", "21.1", "22.1", "22.2", "23.1", "23.3"] },
{ "id": 27, "tasks": ["20.5", "20.6", "20.7", "20.8", "21.2", "21.3", "22.3", "22.4", "22.5", "23.2", "23.4", "23.5"] },
{ "id": 28, "tasks": ["24.1", "24.2"] }
]
}
```