Sfoglia il codice sorgente

feat: complete WP14 UAT and handover

马小龙 3 settimane fa
parent
commit
1b92625537

+ 1 - 0
docs/DATAOPS_PHASE1_3_MONTH_WORK_PLAN_20260729.md

@@ -166,6 +166,7 @@ P2 不阻塞第一阶段验收。没有完成的 P2 功能必须保留接口和
 | WP-11 | 工程完成,待企业口径、阈值与真实数据验收 | 实时计算台账完整率、责任覆盖率、实体映射率、问题闭环率和问题复发率;分子、分母、公式及零分母状态明确;按数据源业务域在 SQL 聚合前授权;跨域合并双端可见门禁;五项指标均可下钻到安全明细;固定只读运营看板;OpenAPI 213 项;真实 PostgreSQL 定向验证 | 需要企业确认必填字段、指标阈值、业务域范围和验收样本;当前只覆盖设备治理域,不保存手工快照或历史趋势,不建设综合评分、排名、成熟度、责任人绩效、通用 BI、NL2SQL 或分析开发能力;GOV-12、GOV-13 仍为规划中,PLT-03、PLT-04 成熟度不因固定看板提升 |
 | WP-12 | 工程完成,待企业安全、密钥与保留策略验收 | 数据源凭据密文状态和采集源明文秘密字段检查;全局异常及日志脱敏;登录、采集、实体合并/回滚、语义与质量发布、质量整改、知识问答六类安全审计投影;管理员专用审计工作台;规范化事件根摘要、HMAC-SHA256 签名封存与复核;单次 50,000 条失败关闭;OpenAPI 219 项;真实 PostgreSQL 篡改/回滚定向验证 | 需要企业安全负责人确认审计字段和抽样结果,配置独立生产封存密钥及版本,明确密钥保管/轮换和五年保留策略;当前签名封存用于检测篡改,不阻止数据库管理员修改,不包含外部可信时间戳、WORM/对象锁、SIEM、法务保全或自动归档;部署恢复链已由 WP-13 承接 |
 | WP-13 | 工程完成,待企业环境与灾备策略验收 | `app/database/migrations` 发布副本一致性门禁;稳定应用镜像名和恢复端口隔离;11 镜像、4.2G、全文件 SHA-256 的 Compose 离线包;升级前 Compose/镜像/Alembic 检查;PostgreSQL 逻辑导出和 10 个卷冷快照;精确项目确认、同名拒绝和先验签后恢复;独立项目恢复演练通过,公共表 116/116、审计封存 2/2、设备资产 4/4、Neo4j 节点 3/3、MinIO 对象 1/1,后端/前端/n8n 均返回 200 | 需要企业确认目标主机和 CPU 架构、镜像签名与漏洞基线、配置及密钥的独立加密备份、异地备份介质、RPO/RTO、维护窗口和变更审批;仍需在真实断网干净主机及企业数据上复演,当前不包含 Kubernetes/HA、在线 Neo4j 备份、跨故障域自动容灾或数据库 downgrade |
+| WP-14 | 工程预验收完成,待企业 UAT 与正式移交 | 21 条 WP02~WP13 验收用例,16 条 `PASS_LOCAL`、5 条 `BLOCKED_EXTERNAL`;管理员、编辑者、查看者的浏览器与 API 权限矩阵通过;2 个 P1 缺陷已关闭、P0 为 0;用户指南、运维移交手册、第二阶段待办和验收证据齐备;WP14 文档与前端权限契约 9 项通过 | 需要企业指定验收与运维责任人,使用真实用户和脱敏真实数据完成 UAT;在企业目标环境完成正式制品构建、干净主机安装和 RPO/RTO 恢复演练;完成用户与运维培训、问题确认及产品、业务、技术、运维四方签字;本地工程预验收不能替代企业正式验收 |
 
 ## 7. 12 周执行计划
 

+ 29 - 0
docs/acceptance/WP14_DEFECT_REGISTER.md

@@ -0,0 +1,29 @@
+# WP14 缺陷登记与关闭台账
+
+## 1. 严重等级
+
+| 等级 | 定义 | 处理要求 |
+|---|---|---|
+| P0 | 核心业务不可用、数据严重损坏、权限绕过或无可用替代路径 | 阻断验收,修复并验证后方可继续 |
+| P1 | 关键场景失败、结果误导或重要权限体验不符合预期 | 本阶段关闭,或由业务与技术负责人书面豁免 |
+| P2 | 非关键功能异常,存在明确替代路径 | 评估纳入当前阶段或后续迭代 |
+| P3 | 体验、文案或低风险改进 | 纳入产品待办并排期 |
+
+## 2. 缺陷记录
+
+| 缺陷编号 | 严重度 | 状态 | 发现角色与场景 | 复现与证据 | 根因 | 修复 | 定向验证 | 处置决定 |
+|---|---|---|---|---|---|---|---|---|
+| WP14-DEF-001 | P1 | 已关闭 | 管理员创建用户 | 创建请求返回 HTTP 201 且业务码为 201,用户实际已创建,但前端提示失败且对话框不关闭 | 通用响应拦截器只将业务码 200 视为成功 | 将成功判断修正为完整 2xx 区间 | 前端契约测试通过;浏览器创建编辑者账号后对话框关闭并刷新列表 | 关闭 |
+| WP14-DEF-002 | P1 | 已关闭 | 查看者进入数据研究中心 | 查看者可看到新增摄取和治理评审入口,且没有只读模式说明;服务端虽会拒绝写入,但入口容易造成误解 | 首页入口未按只读角色过滤 | 为写入口增加标识,查看者隐藏写入口并展示只读提示 | 前端权限契约测试通过;浏览器确认入口隐藏、只读提示展示,用户管理页面跳转 404 | 关闭 |
+
+## 3. 缺陷结论
+
+- P0:未发现。
+- P1:发现 2 个,已关闭 2 个,未关闭 0 个。
+- P2/P3:本次工程预验收未登记影响移交的遗留项。
+- 企业正式 UAT 尚未执行的事项登记为外部门禁,不误记为产品缺陷。
+
+## 4. 关闭规则
+
+缺陷关闭必须同时具备明确根因、代码或配置处置、变更面定向测试和可复核的
+用户可见结果。仅有页面存在、接口返回或单项测试通过,不能单独作为关闭依据。

+ 286 - 0
docs/acceptance/WP14_UAT_CASES.json

@@ -0,0 +1,286 @@
+{
+  "schema_version": "1.0",
+  "work_package": "WP-14",
+  "generated_at": "2026-07-30",
+  "result_definitions": {
+    "PASS_LOCAL": "当前本地工程环境已通过,不能据此认定企业正式验收通过",
+    "FAIL": "已执行但不符合预期",
+    "BLOCKED_EXTERNAL": "需要企业人员、数据、环境或签字,当前不能执行",
+    "NOT_RUN": "本轮未执行且不属于外部依赖"
+  },
+  "cases": [
+    {
+      "id": "WP14-UAT-001",
+      "module_ids": ["WP-02"],
+      "title": "管理员创建三级角色账号并正确处理 HTTP 201",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["本地管理员可登录", "用户管理页面可访问"],
+      "steps": ["创建 viewer 账号", "创建 editor 账号并检查列表刷新", "完成角色验收后停用两个账号"],
+      "expected": ["创建窗口关闭并刷新列表", "角色正确", "停用账号不能再次登录"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#角色与权限", "WP14-DEF-001"],
+      "result": "PASS_LOCAL",
+      "notes": "两个临时账号均已停用,重新登录返回 401。"
+    },
+    {
+      "id": "WP14-UAT-002",
+      "module_ids": ["WP-02"],
+      "title": "管理员、编辑者和查看者权限隔离",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["三级角色账号在验收期间为 active", "API 鉴权开启"],
+      "steps": ["三类角色分别读取资产和指标", "分别访问用户与审计接口", "分别提交无效资产导入请求"],
+      "expected": ["三类角色读取返回 200", "只有管理员访问用户与审计返回 200", "查看者写入返回 403,编辑者和管理员进入业务校验"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#角色与权限"],
+      "result": "PASS_LOCAL",
+      "notes": "无效写入仅用于验证权限顺序,不产生资产数据。"
+    },
+    {
+      "id": "WP14-UAT-003",
+      "module_ids": ["WP-02", "WP-05", "WP-06", "WP-07", "WP-08"],
+      "title": "设备治理责任矩阵和唯一最终责任人",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["管理员拥有责任矩阵权限", "四类设备治理对象已配置"],
+      "steps": ["读取责任范围和修订号", "检查每个范围的 asset_manager/accountable", "核对设备字段责任覆盖指标"],
+      "expected": ["设备本体、实体映射、设备质量和质量问题各有一名最终责任人", "台账责任字段本地覆盖率为 4/4"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "企业实际人员名单仍需正式 UAT 替换。"
+    },
+    {
+      "id": "WP14-UAT-004",
+      "module_ids": ["WP-03"],
+      "title": "数据源采集任务、来源证据和失败定位",
+      "actor": "editor",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["本地示范数据源可用", "编辑者具备采集运行权限"],
+      "steps": ["读取采集任务列表", "检查目录快照和审计事件", "核对查看者不能启动采集"],
+      "expected": ["至少存在一条采集任务", "采集审计可定位任务", "查看者无写入入口和权限"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "未在 WP14 重复执行采集,复用 WP03 已形成的不可变证据。"
+    },
+    {
+      "id": "WP14-UAT-005",
+      "module_ids": ["WP-04"],
+      "title": "设备资产目录、来源编码和版本追溯",
+      "actor": "viewer",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["查看者已登录", "示范资产已入账"],
+      "steps": ["打开设备台账", "按名称或来源编码检索", "打开追溯查看来源映射和版本"],
+      "expected": ["显示 4 条资产", "每条资产具有来源编码", "详情可查看来源和版本且无写入按钮"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "本地 4 条资产不能推导企业资产入账率。"
+    },
+    {
+      "id": "WP14-UAT-006",
+      "module_ids": ["WP-05"],
+      "title": "设备语义本体和代码集发布状态",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["设备语义已初始化", "管理员具备发布和复核权限"],
+      "steps": ["读取设备语义画像", "核对本体版本和发布状态", "检查概念、关系和映射覆盖"],
+      "expected": ["本体 v1 为 published", "11 类概念、10 条关系、6 个映射齐备", "发布准备状态为 true"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "企业术语和故障代码仍需设备专家确认。"
+    },
+    {
+      "id": "WP14-UAT-007",
+      "module_ids": ["WP-06"],
+      "title": "实体匹配解释、审核、合并与回滚证据",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["存在跨来源候选", "自动合并默认关闭"],
+      "steps": ["打开实体匹配页面", "检查置信度和逐项信号", "核对已回滚候选的合并和回滚记录"],
+      "expected": ["候选置信度为 95% 且显示 5/6 信号一致", "状态为已回滚", "原资产和来源映射未被物理删除"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "企业阈值需用真实同一/不同设备标注集确认。"
+    },
+    {
+      "id": "WP14-UAT-008",
+      "module_ids": ["WP-07"],
+      "title": "质量策略、运行结果和来源定位",
+      "actor": "editor",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["设备质量策略已发布", "编辑者具备执行权限"],
+      "steps": ["打开设备质量页面", "检查七类规则和发布状态", "读取两次质量运行及违规计数"],
+      "expected": ["策略 v1 已生效", "显示七类规则", "存在 2 次检查并可查看违规与资产得分"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "WP14 不重复运行质量检查,避免改变示范证据。"
+    },
+    {
+      "id": "WP14-UAT-009",
+      "module_ids": ["WP-08"],
+      "title": "质量问题整改、独立复核和关闭时间线",
+      "actor": "editor",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["存在一条质量问题", "整改和复核角色已分离"],
+      "steps": ["打开质量问题列表", "查看问题详情和时间线", "核对创建、分派、开始、提交和关闭审计"],
+      "expected": ["1 条问题状态为已关闭", "时间线完整", "本地闭环率为 1/1"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "首批企业真实问题闭环率仍需真实 UAT 计算。"
+    },
+    {
+      "id": "WP14-UAT-010",
+      "module_ids": ["WP-09"],
+      "title": "设备运行关系和证据不足拒绝确定根因",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["4 条运行事件和 2 条证据关系已存在", "未关联停机事件可查询"],
+      "steps": ["打开设备关系与根因页面", "对未关联停机事件执行分析", "检查约束说明"],
+      "expected": ["页面显示 4 条运行事件", "明确提示证据不足无法确认根因", "不触发自动修复或维修计划"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "根因候选仅为辅助判断。"
+    },
+    {
+      "id": "WP14-UAT-011",
+      "module_ids": ["WP-10"],
+      "title": "设备搜索的数据范围授权",
+      "actor": "viewer",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["两个设备数据源均为空业务域范围", "管理员与查看者均可登录"],
+      "steps": ["管理员按源 ID 精确搜索", "查看者用同一源 ID 搜索", "比较证据数量"],
+      "expected": ["管理员返回 1 条设备证据", "查看者返回 0 条", "服务端授权在检索前生效"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "空范围按设计仅管理员可见。"
+    },
+    {
+      "id": "WP14-UAT-012",
+      "module_ids": ["WP-10", "WP-12"],
+      "title": "模型不可用时拒答、保留授权证据并记录审计",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["设备证据可检索", "本地回答模型未配置"],
+      "steps": ["询问设备责任人", "检查 answer_status 和引用区域", "检查查询审计不保存原始问题"],
+      "expected": ["answer_status 为 model_unavailable", "不生成推测性答案", "展示 1 条授权证据并写入查询审计"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "企业黄金集仍需合规模型环境完成。"
+    },
+    {
+      "id": "WP14-UAT-013",
+      "module_ids": ["WP-11"],
+      "title": "五项治理指标和明细追溯",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["管理员可访问全部本地示范范围", "设备、映射和问题数据已存在"],
+      "steps": ["打开治理运营指标页面", "核对五项分子分母", "检查每项明细入口"],
+      "expected": ["台账完整率 4/4", "责任覆盖率 4/4", "实体映射率 0/4", "问题闭环率 1/1", "复发率 0/1"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "已回滚实体合并不计入有效映射。"
+    },
+    {
+      "id": "WP14-UAT-014",
+      "module_ids": ["WP-12"],
+      "title": "安全检查、六类审计投影和封存证据",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["独立本地封存密钥已配置", "管理员具备审计权限"],
+      "steps": ["打开审计与运行证据页面", "检查六项安全检查", "核对六类操作覆盖和两条封存记录"],
+      "expected": ["六项安全检查通过", "登录、采集、合并、发布、整改和问答审计源均可用", "2 条封存记录可重新校验"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#业务场景"],
+      "result": "PASS_LOCAL",
+      "notes": "本地密钥和封存不替代企业 KMS、WORM 或外部可信时间戳。"
+    },
+    {
+      "id": "WP14-UAT-015",
+      "module_ids": ["WP-13"],
+      "title": "离线安装、备份、恢复和回滚入口",
+      "actor": "admin",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["WP13 本地恢复演练证据已归档", "离线包和备份清单可校验"],
+      "steps": ["复核离线包哈希和 11 个镜像", "复核独立项目恢复结果", "复核源项目清理后健康状态"],
+      "expected": ["公共表 116/116", "审计封存 2/2、资产 4/4、Neo4j 3/3、MinIO 1/1", "前端、后端和 n8n 均返回 200"],
+      "evidence": ["docs/validation/WP13_DEPLOYMENT_BACKUP_RECOVERY_EVIDENCE.md"],
+      "result": "PASS_LOCAL",
+      "notes": "未在 WP14 重复执行 4.2G 离线包恢复演练。"
+    },
+    {
+      "id": "WP14-UAT-016",
+      "module_ids": ["WP-02", "WP-14"],
+      "title": "纯查看者界面隐藏写操作入口并明确只读模式",
+      "actor": "viewer",
+      "acceptance_level": "LOCAL_ENGINEERING",
+      "preconditions": ["查看者登录", "WP14-DEF-002 修复已加载"],
+      "steps": ["打开数据研发中心", "检查可见卡片", "直接访问用户管理页"],
+      "expected": ["隐藏新建采集和治理评审", "显示 viewer 只读提示", "用户管理页跳转 404 且 API 返回 403"],
+      "evidence": ["WP14_UAT_HANDOVER_EVIDENCE.md#角色与权限", "WP14-DEF-002"],
+      "result": "PASS_LOCAL",
+      "notes": "后端权限始终为最终安全边界。"
+    },
+    {
+      "id": "WP14-UAT-017",
+      "module_ids": ["WP-02", "WP-14"],
+      "title": "企业实际用户、角色和责任人配置",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "ENTERPRISE_FORMAL",
+      "preconditions": ["企业提供人员名单", "验收负责人确认职责分工"],
+      "steps": ["创建或导入企业用户", "配置设备资产管理员、治理人员和查看者", "由各角色执行职责内场景"],
+      "expected": ["角色和责任矩阵与企业组织一致", "没有越权或职责空缺"],
+      "evidence": ["企业签字版用户角色矩阵", "企业账号验收记录"],
+      "result": "BLOCKED_EXTERNAL",
+      "notes": "当前只有本地示范账号,不能替代企业人员验收。"
+    },
+    {
+      "id": "WP14-UAT-018",
+      "module_ids": ["WP-03", "WP-04", "WP-05", "WP-06", "WP-07", "WP-08", "WP-09", "WP-11"],
+      "title": "企业真实设备数据端到端治理闭环",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "ENTERPRISE_FORMAL",
+      "preconditions": ["企业只读数据源和脱敏样本到位", "字段映射、质量阈值和责任人已确认"],
+      "steps": ["采集真实设备、维修、故障和告警数据", "完成资产、语义、匹配和质量处理", "关闭首批真实质量问题并核对指标"],
+      "expected": ["资产入账率和责任覆盖率均不低于 95%", "源编码、回滚和来源定位率为 100%", "首批真实问题闭环率不低于 80%"],
+      "evidence": ["企业真实数据 UAT 报告", "差异清单和整改时间线"],
+      "result": "BLOCKED_EXTERNAL",
+      "notes": "本地示范数据不能替代企业真实数据 UAT。"
+    },
+    {
+      "id": "WP14-UAT-019",
+      "module_ids": ["WP-10"],
+      "title": "企业授权范围、合规模型和黄金集验收",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "ENTERPRISE_FORMAL",
+      "preconditions": ["真实业务域授权配置完成", "合规模型环境可用", "十项黄金集已绑定真实对象"],
+      "steps": ["由设备专家执行搜索和问答黄金集", "由越权角色执行禁止访问案例", "复核答案、引用、拒答和查询审计"],
+      "expected": ["有答案场景引用率 100%", "越权证据不返回", "证据不足和模型不可用场景不生成确定性答案"],
+      "evidence": ["企业专家签字的黄金集结果", "授权与审计记录"],
+      "result": "BLOCKED_EXTERNAL",
+      "notes": "当前黄金集仍为待企业绑定模板。"
+    },
+    {
+      "id": "WP14-UAT-020",
+      "module_ids": ["WP-12", "WP-13"],
+      "title": "企业断网主机安装和灾备策略验收",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "ENTERPRISE_FORMAL",
+      "preconditions": ["真实断网干净主机到位", "企业密钥、备份介质、RPO/RTO 和变更窗口已批准"],
+      "steps": ["在真实主机安装签名离线包", "执行企业规模备份恢复", "执行失败回退和安全抽样"],
+      "expected": ["安装和恢复各成功一次", "RPO/RTO 达到企业批准值", "密钥、备份和审计责任完成交接"],
+      "evidence": ["企业环境恢复演练报告", "变更审批和安全签字"],
+      "result": "BLOCKED_EXTERNAL",
+      "notes": "本地恢复演练不能形成企业 RTO 承诺。"
+    },
+    {
+      "id": "WP14-UAT-021",
+      "module_ids": ["WP-14"],
+      "title": "培训、正式签字和生产运维移交",
+      "actor": "enterprise_acceptance",
+      "acceptance_level": "ENTERPRISE_FORMAL",
+      "preconditions": ["企业 UAT 已完成", "P0 缺陷为 0", "接收人名单和发布窗口已批准"],
+      "steps": ["完成用户和运维培训", "逐项核对移交清单", "由产品、验收、技术和运维负责人签字"],
+      "expected": ["培训签到和演练记录齐全", "代码、包、配置、备份和责任全部交接", "正式验收状态有明确签字"],
+      "evidence": ["签字版 UAT 报告", "签字版移交清单和培训记录"],
+      "result": "BLOCKED_EXTERNAL",
+      "notes": "当前已形成材料,等待企业人员实施和签字。"
+    }
+  ]
+}

+ 132 - 0
docs/acceptance/WP14_UAT_PLAN_AND_REPORT.md

@@ -0,0 +1,132 @@
+# WP14 用户验收计划与执行报告
+
+## 1. 文档信息
+
+- 工作包:WP14 用户验收与移交
+- 执行日期:2026-07-30
+- 验收分支:`codex/dataops-phase1-equipment-governance`
+- 验收层级:本地工程预验收
+- 用例清单:`docs/acceptance/WP14_UAT_CASES.json`
+
+## 2. 验收结论
+
+WP14 已完成本地工程预验收。共编制 21 条验收用例,其中 16 条为
+`PASS_LOCAL`,5 条为 `BLOCKED_EXTERNAL`,没有本地失败用例。验收期间发现
+2 个 P1 缺陷,均已修复并完成变更面回归;未发现 P0 缺陷。
+
+本结论证明第一阶段功能在当前演示数据、当前分支和本地运行环境中具备移交给
+企业用户开展正式验收的条件,但不能替代企业真实数据 UAT。企业真实用户、
+真实数据、正式网络与安全策略、培训确认和验收签字仍属于正式验收门禁。
+
+## 3. 验收范围与方式
+
+本次覆盖 WP02 至 WP13 已交付能力,按管理员、编辑者、查看者三类角色验证:
+
+- 设备台账、来源追溯和责任覆盖。
+- 设备语义、本体发布、实体匹配及合并回滚。
+- 质量规则、质量检查、问题整改闭环。
+- 设备运行维护事件、根因分析证据边界。
+- 治理知识检索、问答拒答和证据展示。
+- 治理指标、审计、部署、备份与恢复材料。
+- 用户、角色、治理责任和只读边界。
+
+浏览器场景、角色 API 矩阵、数据检查和文档契约共同作为验收证据。破坏性写入
+只使用临时账号和无效导入请求;临时账号已停用,无效请求未产生业务数据。
+
+## 4. 用例执行汇总
+
+| 验收层级 | 状态 | 数量 | 说明 |
+|---|---:|---:|---|
+| 本地工程预验收 | PASS_LOCAL | 16 | 当前分支、演示数据和本地环境验证通过 |
+| 企业正式验收 | BLOCKED_EXTERNAL | 5 | 需要企业人员、真实数据、正式环境或签字 |
+| 本地工程预验收 | FAIL | 0 | 无遗留失败用例 |
+
+详细步骤、预期结果、实际结果和证据定位见
+`docs/acceptance/WP14_UAT_CASES.json`。
+
+## 5. 第一阶段指标核对
+
+| 指标 | 本地结果 | 企业正式验收要求 | 结论 |
+|---|---|---|---|
+| 核心设备台账录入率 | 4/4,100% | 企业样本不低于 95% | PASS_LOCAL |
+| 设备责任覆盖率 | 4/4,100% | 企业样本不低于 95% | PASS_LOCAL |
+| 来源标识覆盖率 | 4/4,100% | 企业样本 100% | PASS_LOCAL |
+| 已确认合并回滚成功率 | 1/1,100% | 企业确认样本 100% | PASS_LOCAL |
+| 质量问题来源定位 | 可定位规则、对象和整改记录 | 企业问题样本 100% 可定位 | PASS_LOCAL |
+| 首批质量问题闭环率 | 1/1,100% | 企业首批问题不低于 80% | PASS_LOCAL |
+| 知识问答证据边界 | 模型不可用时拒绝推测,并展示检索证据 | 企业知识样本引用率 100% | BLOCKED_EXTERNAL |
+| 关键操作审计覆盖 | 登录、摄取、实体、语义、质量、整改、知识查询均可审计 | 企业关键操作 100% | PASS_LOCAL |
+| 全新环境安装 | 已有本地离线包和安装证据 | 企业目标环境完成 1 次 | BLOCKED_EXTERNAL |
+| 备份恢复 | 本地恢复核对通过 | 企业目标环境完成 1 次 | BLOCKED_EXTERNAL |
+
+本地指标用于证明能力和流程可执行,不作为企业生产数据指标的替代。
+
+## 6. 角色验收结果
+
+| 角色 | 可用能力 | 权限边界 | 结果 |
+|---|---|---|---|
+| 管理员 | 全部业务能力、用户与审计管理 | 可执行管理写操作 | PASS_LOCAL |
+| 编辑者 | 设备治理、质量、运行维护等业务操作 | 用户管理和审计接口返回 403 | PASS_LOCAL |
+| 查看者 | 已授权业务数据只读查询 | 管理页面不可达,写接口返回 403 | PASS_LOCAL |
+
+查看者进入数据研究中心时会看到只读提示,新增摄取和治理评审入口不展示。
+查看者直接访问用户管理页面会跳转到 404,服务端同时保持 403 权限校验。
+
+## 7. 关键业务场景结果
+
+- 设备台账展示 4 条演示资产,并可查看来源标识、版本和追溯入口。
+- 设备语义本体为已发布版本,包含 11 个类别、10 个关系和 6 个映射。
+- 实体匹配候选可展示确定性信号、合并证据和已回滚状态。
+- 质量中心展示 7 条规则、2 次运行和 1 条已关闭整改问题。
+- 运行维护中心可查看 4 条事件;对证据不足的停机事件不会生成确定性根因。
+- 管理员知识问答在模型不可用时明确拒绝推测,并展示 1 条来源证据。
+- 治理指标展示台账完整率、责任覆盖率、实体映射率和问题闭环率。
+- 审计中心的 6 项安全检查通过,关键类别与审计封印可查询。
+
+## 8. 缺陷结论
+
+验收发现并关闭 2 个 P1 缺陷:
+
+1. 用户创建接口返回业务码 201 时,前端将成功响应误判为失败。
+2. 查看者可见新增摄取和治理评审入口,缺少明确的只读提示。
+
+缺陷详情、根因、修复和回归证据见
+`docs/acceptance/WP14_DEFECT_REGISTER.md`。当前未发现 P0,未遗留阻断本地工程
+预验收的缺陷。
+
+## 9. 环境与发布边界
+
+前端源代码构建成功,浏览器场景使用本次构建产物在本地容器中验证。由于外部
+镜像仓库获取 Node 和 Nginx 基础镜像元数据超时,本次没有生成新的最终前端
+镜像;这不影响源代码构建和本地功能验证,但正式发布前仍需在可访问镜像仓库
+的构建环境中重新构建、签名并保存制品证据。
+
+WP13 已完成本地离线包、备份与恢复证据。企业干净主机安装、正式 RPO/RTO
+演练和灾备签字仍需企业环境完成。
+
+## 10. 企业正式 UAT 计划
+
+1. 企业确定验收负责人、业务代表、安全代表和运维代表。
+2. 准备脱敏后的真实设备、质量问题和运行维护样本。
+3. 按 `WP14_UAT_CASES.json` 中 `BLOCKED_EXTERNAL` 用例补录实际结果。
+4. 完成角色映射、安全策略、目标环境安装和备份恢复演练。
+5. 记录 P0/P1 缺陷并按严重等级完成关闭或形成书面豁免。
+6. 完成用户培训、运维培训、移交清单核对和验收签字。
+
+## 11. 正式验收门禁
+
+- P0 缺陷为 0,未关闭 P1 已获得业务与技术负责人书面处置决定。
+- 企业样本指标达到第一阶段验收标准。
+- 正式账号和权限矩阵经企业安全负责人确认。
+- 目标环境安装、备份和恢复演练完成。
+- 用户手册、运维手册和培训记录完成移交。
+- 产品负责人、业务负责人、技术负责人和运维负责人完成签字。
+
+## 12. 签署状态
+
+| 签署角色 | 当前状态 |
+|---|---|
+| 产品负责人 | 待企业正式 UAT 完成后签署 |
+| 业务负责人 | 待企业指定并签署 |
+| 技术负责人 | 待企业指定并签署 |
+| 运维负责人 | 待企业指定并签署 |

+ 120 - 0
docs/guides/DATAOPS_PHASE1_USER_OPERATION_GUIDE.md

@@ -0,0 +1,120 @@
+# 数据运营平台第一阶段用户操作指南
+
+## 1. 适用范围
+
+本指南用于数据运营平台第一阶段设备治理与运营场景,覆盖设备台账、设备语义
+与本体、实体匹配、质量问题整改、设备运行维护、治理知识问答、治理指标和
+平台管理。平台当前专注数据运营与治理,不作为分析开发或 BI 开发平台。
+
+## 2. 角色说明
+
+| 角色 | 主要职责 | 典型权限 |
+|---|---|---|
+| admin 管理员 | 用户、角色、责任、审计和业务治理管理 | 管理与业务读写 |
+| editor 编辑者 | 维护设备治理数据、执行质量检查和整改 | 业务读写,不可管理用户与审计 |
+| viewer 查看者 | 浏览已授权的业务结果与证据 | 只读,不可执行写操作 |
+
+用户使用企业或平台分配的账号登录。第一阶段使用平台本地认证;企业单点登录
+属于后续阶段,正式账号发放、停用和权限调整由企业管理员负责。
+
+## 3. 首页与只读模式
+
+登录后从数据研究中心进入各业务模块。查看者会看到只读提示,新增摄取和治理
+评审等写入口不会显示。若某个页面没有可见数据,应先确认当前角色是否获得
+对应业务域授权,不应把“无权限”和“无数据”混为一谈。
+
+## 4. 设备台账
+
+1. 进入“设备资产”。
+2. 按设备名称、平台统一标识或来源标识筛选。
+3. 查看设备类型、位置、组织、负责人、版本和状态。
+4. 打开追溯入口,核对来源系统、来源记录标识及版本变化。
+5. 管理员或编辑者按受控流程导入或维护设备;查看者仅浏览。
+
+验收重点是设备有稳定的平台统一标识、来源标识和责任人。导入失败时先检查
+字段完整性、枚举值和当前账号写权限。
+
+## 5. 设备语义与本体
+
+1. 进入“设备语义”或本体工作台。
+2. 查看当前草稿、已发布版本、类别、关系和映射。
+3. 编辑者提交变更前核对影响范围和映射完整性。
+4. 发布时记录版本和发布人;已发布版本不得静默覆盖。
+5. 下游查询以已发布版本为准,草稿不应替代正式语义。
+
+## 6. 实体匹配与回滚
+
+1. 进入“实体匹配”,查看候选对、置信度和匹配信号。
+2. 打开证据详情,核对来源标识、属性和确定性规则。
+3. 确认合并前检查是否会影响台账、质量和运行维护关联。
+4. 合并后保留事件记录;发现误合并时执行回滚。
+5. 回滚后再次核对平台统一标识及关联数据。
+
+自动合并默认关闭。置信度只能作为辅助信息,不能代替人员确认和证据核对。
+
+## 7. 质量检查与问题整改
+
+1. 进入“设备质量”,查看已发布规则和规则版本。
+2. 管理员或编辑者执行质量检查。
+3. 从运行结果进入质量问题,查看对象、规则、来源和问题描述。
+4. 分派责任人,记录整改措施、验证结果和关闭说明。
+5. 关闭后通过治理指标检查闭环率和复发情况。
+
+质量问题应可回溯到规则、对象和来源数据。没有验证证据时不得直接标记为关闭。
+
+## 8. 设备运行与维护
+
+1. 进入运行维护中心,查看告警、停机和维护事件。
+2. 按设备、时间和事件类型筛选。
+3. 打开事件证据,核对关联设备、质量问题和维护记录。
+4. 发起根因分析时检查证据完整性。
+5. 当证据不足时,平台会明确提示无法确认根因,不会自动生成维修结论。
+
+平台提供证据组织和治理辅助,不代替现场诊断、维修审批或安全作业流程。
+
+## 9. 治理知识检索与问答
+
+1. 输入设备名称、来源标识或治理问题。
+2. 先查看检索结果及权限范围。
+3. 发起问答后核对回答状态、来源证据和引用。
+4. 模型不可用或证据不足时,平台会拒绝推测性回答。
+5. 需要业务决策时回到原始台账、事件和责任记录复核。
+
+不同角色可能看到不同结果。查看者没有业务域权限时,空结果不代表平台没有
+该数据。
+
+## 10. 治理指标
+
+治理指标中心展示台账完整率、责任覆盖率、实体映射率、质量问题闭环率和
+复发率等指标。点击指标详情查看分子、分母和对象范围。指标下降时应先确认
+统计范围和授权,再进入对应业务模块处理,不能只修改展示结果。
+
+## 11. 管理功能
+
+管理员可使用以下能力:
+
+- 用户和角色:创建、停用用户并分配 admin、editor、viewer 角色。
+- 治理责任:维护业务范围、责任角色和责任人。
+- 审计中心:查看关键操作类别、安全检查和审计封印。
+
+停用账号后应验证无法重新登录。角色变更后应使用目标账号复核页面入口和服务
+端权限,不能只看管理员列表中的角色名称。
+
+## 12. 常见问题
+
+| 现象 | 建议检查 |
+|---|---|
+| 页面没有数据 | 当前角色的业务域授权、筛选条件、来源数据是否存在 |
+| 按钮不可见 | 当前账号是否为 viewer,只读提示是否显示 |
+| 请求返回 403 | 当前角色不具备该操作权限,联系管理员确认职责 |
+| 导入返回 422 | 模板字段、必填值、枚举值和数据格式 |
+| 知识问答无答案 | 模型状态、证据数量、权限范围和问题关键词 |
+| 根因分析拒绝结论 | 关联事件、设备、质量问题或维护证据不充分 |
+
+## 13. 使用约束
+
+- 不在平台中录入明文密码、令牌或不必要的个人敏感信息。
+- 不通过共享管理员账号绕过职责分离。
+- 不把演示数据验证结果当作企业真实数据验收结论。
+- 不把模型生成内容当作无须复核的事实或维修指令。
+- 发现权限越界、数据错误或审计缺失时立即停止相关操作并上报。

+ 43 - 0
docs/roadmap/DATAOPS_PHASE2_BACKLOG.md

@@ -0,0 +1,43 @@
+# 数据运营平台第二阶段及后续待办
+
+## 1. 规划原则
+
+第二阶段继续聚焦数据运营与治理,不扩展为分析开发或 BI 开发平台。启动条件
+是第一阶段企业 UAT 完成、核心设备治理流程稳定,并能以可复用方式支持第二个
+业务域。所有待办必须明确来源模块、优先级、启动条件、验收标准、依赖和目标
+阶段。
+
+## 2. 待办清单
+
+| 待办编号 | 来源模块 | 优先级 | 启动条件 | 验收标准 | 依赖 | 目标阶段 |
+|---|---|---|---|---|---|---|
+| P2-01 | 主动元数据 | P0 | 第二业务域和采集源确定 | 自动采集变更、血缘和影响范围,异常可追踪 | 元数据连接器、调度、审计 | 第二阶段 |
+| P2-02 | 通用术语 | P0 | 企业术语责任人和审批流程确定 | 术语、标准、映射、版本和审批形成闭环 | 责任体系、工作流 | 第二阶段 |
+| P2-03 | 通用质量运营 | P0 | 第二业务域质量规则样本就绪 | 规则模板、运行、问题、整改和趋势可复用 | 规则引擎、任务、指标 | 第二阶段 |
+| P2-04 | 平台可观测 | P0 | 生产 SLI/SLO 和告警渠道确定 | 服务、任务、数据新鲜度和容量统一监控并可升级 | 指标、日志、告警 | 第二阶段 |
+| P2-05 | 统一责任 | P0 | 组织、岗位和数据域边界确认 | 资产、质量、术语和产品共享统一责任模型 | 组织数据、权限 | 第二阶段 |
+| P2-06 | 统一任务 | P0 | 企业通知渠道和时限策略确定 | 待办、提醒、升级、关闭和审计形成统一闭环 | 工作流、消息渠道 | 第二阶段 |
+| P2-07 | 数据产品治理 | P1 | 首批数据产品及服务目录确定 | 产品目录、负责人、SLA、版本、消费和退役可管理 | 资产目录、责任、指标 | 第二阶段 |
+| P2-08 | Agent 治理 | P1 | 企业允许的模型与 Agent 场景确定 | Agent 注册、权限、提示版本、证据、成本和审计可治理 | 模型网关、安全底座 | 第二阶段 |
+| P2-09 | 安全底座 | P0 | 企业安全基线和扫描工具确定 | 密钥、漏洞、镜像、依赖和审计策略可持续执行 | 制品库、扫描服务 | 第二阶段 |
+| P2-10 | 产品工程 | P0 | 正式交付流水线和环境确定 | 构建、测试、签名、发布、回滚和制品证据自动留存 | CI/CD、制品库 | 第二阶段 |
+| P2-11 | 第二业务域验证 | P0 | 企业选择非设备类业务域 | 不修改核心架构即可完成接入、治理、指标和责任闭环 | P2-01 至 P2-06 | 第二阶段 |
+| P2-12 | 治理趋势与事件 | P1 | 指标口径和事件阈值确认 | 趋势、异常、事件、责任和处置记录可追溯 | 指标、统一任务 | 第二阶段 |
+| P3-01 | 企业单点登录 | P0 | 客户明确将 SSO 作为上线前提,提供 IdP 测试环境和管理员 | OIDC 登录、声明映射、组织同步、停用、应急账号和失败降级通过企业验收 | IdP、组织数据、安全审批 | 第三阶段 |
+
+## 3. 阶段门禁
+
+第二阶段完成的判断标准:
+
+- 第二业务域可在不修改核心架构的条件下完成治理闭环。
+- 元数据、术语、质量、责任、任务和指标形成可复用模板。
+- 平台可观测、统一任务和安全底座能够支持持续运营。
+- 数据产品治理和 Agent 治理保持授权、证据和审计边界。
+- 产品工程能够保存从提交到发布和回滚的完整证据。
+
+## 4. 单点登录安排
+
+企业单点登录安排在第三阶段,不占用第一阶段设备治理闭环的交付资源。只有在
+客户明确将 SSO 作为上线前提、IdP 测试环境和管理员就绪、用户与组织声明映射
+确认、应急访问及认证失败降级方案获批后启动。验收需覆盖 OIDC 登录、账号
+停用、组织同步、权限映射、审计和 IdP 不可用时的受控处置。

+ 128 - 0
docs/runbooks/DATAOPS_PHASE1_OPERATIONS_HANDOVER.md

@@ -0,0 +1,128 @@
+# 数据运营平台第一阶段运维移交手册
+
+## 1. 移交范围
+
+本手册面向数据运营平台第一阶段设备治理与运营能力,覆盖服务检查、日常巡检、
+备份恢复、发布回滚、安全管理、故障升级和运维培训。部署、离线包、备份和
+恢复的执行证据见 `docs/validation/WP13_DEPLOYMENT_BACKUP_RECOVERY_EVIDENCE.md`。
+
+本地工程环境已完成恢复核对;企业目标环境的安装、正式 RPO/RTO 演练和签字
+仍需企业运维团队执行。
+
+## 2. 组件与责任
+
+| 组件 | 主要职责 | 企业责任人状态 |
+|---|---|---|
+| 前端 | 用户界面和权限入口控制 | 待企业指定 |
+| 后端 | API、认证授权、业务规则和审计 | 待企业指定 |
+| PostgreSQL | 业务、治理和审计主数据 | 待企业指定 |
+| Neo4j | 受控图关系投影 | 待企业指定 |
+| MinIO | 文件与对象存储 | 待企业指定 |
+| n8n | 受控流程运行 | 待企业指定 |
+
+正式移交时应为每个组件指定主责、备岗和升级联系人,并记录工作时间与非工作
+时间的联系路径。
+
+## 3. 日常巡检
+
+### 每日巡检
+
+- 检查前端、后端和关键依赖的健康状态。
+- 检查登录失败、403 激增、5xx 和任务失败情况。
+- 检查数据库、对象存储容量及最近一次备份结果。
+- 检查设备摄取、质量运行、整改和知识查询的异常记录。
+- 检查关键审计类别是否持续产生记录。
+
+### 每周巡检
+
+- 抽查设备台账来源标识、责任覆盖和版本追溯。
+- 抽查实体合并与回滚、质量问题关闭和运行维护证据。
+- 核对治理指标趋势并确认异常变化有责任人。
+- 验证备份文件可读取、校验值有效且保留周期符合策略。
+- 复核停用账号、管理员账号和高权限变更。
+
+### 每月
+
+- 在隔离环境执行一次抽样恢复。
+- 复核容量、性能、证书、密钥轮换和补丁计划。
+- 汇总故障、缺陷、恢复演练和待办风险。
+- 更新运维联系人、责任矩阵和培训覆盖情况。
+
+## 4. 备份与恢复
+
+备份至少覆盖 PostgreSQL、Neo4j、MinIO、配置文件、密钥引用、发布制品和校验
+清单。生产密钥本身应由企业密钥系统管理,不应明文进入备份包或代码仓库。
+
+恢复流程:
+
+1. 确认恢复目标、恢复点和变更冻结窗口。
+2. 校验备份包完整性并在隔离环境解包。
+3. 按依赖顺序恢复数据库、图数据、对象、配置和服务。
+4. 核对表数量、审计封印、设备数量、图节点关系和对象数量。
+5. 验证前后端健康、登录、只读查询及一条受控业务流程。
+6. 记录实际 RPO、RTO、差异和批准人。
+
+恢复失败时保留现场和日志,不覆盖最后一个可用备份。企业生产恢复必须经过
+变更审批。
+
+## 5. 发布、升级与回滚
+
+1. 发布前确认变更清单、数据库变更、兼容性和定向测试结果。
+2. 在正式构建环境生成镜像或离线制品,记录版本、提交号和校验值。
+3. 备份当前数据与配置,确认回滚窗口和执行人。
+4. 先在预生产环境验证健康、登录、权限和变更场景。
+5. 生产升级后重复关键健康与业务检查。
+6. 出现 P0、数据错误、权限越界或不可接受性能退化时立即回滚。
+
+回滚应恢复上一版制品和兼容数据状态。若数据库迁移不可逆,发布前必须准备
+经验证的数据回退脚本或恢复方案。
+
+## 6. 安全与审计
+
+- 企业环境必须替换演示密码、令牌和默认密钥引用。
+- 管理员账号实行最小授权和职责分离,停用人员账号应及时关闭。
+- 日志不得记录密码、完整令牌或不必要的敏感数据。
+- 定期复核登录、摄取、实体、语义、质量、整改和知识查询审计。
+- 审计封印或关键日志中断应按安全事件处理。
+- 第一阶段使用本地认证;单点登录接入前仍需执行企业账号生命周期管理。
+
+## 7. 故障等级与异常升级
+
+| 等级 | 示例 | 响应与升级 |
+|---|---|---|
+| P0 | 全站不可用、严重数据损坏、权限绕过 | 立即冻结变更,通知技术、业务和安全负责人,启动恢复或回滚 |
+| P1 | 关键流程不可用、关键结果错误 | 当日组织处置,明确替代路径和关闭时间 |
+| P2 | 非关键功能异常、局部性能下降 | 纳入迭代,持续跟踪影响范围 |
+| P3 | 体验或低风险改进 | 纳入产品待办 |
+
+故障记录应包含时间线、影响范围、检测方式、临时处置、根因、永久修复和验证
+证据。未确认根因时不得用推测替代事实。
+
+## 8. 培训计划
+
+用户培训包括角色说明、设备台账、实体匹配、质量整改、运行维护、知识问答和
+治理指标。运维培训包括健康检查、日志定位、备份恢复、发布回滚、安全审计和
+故障升级。
+
+建议现场练习:
+
+1. 查看一台设备的来源、责任和版本。
+2. 解释一个实体匹配候选并完成回滚演练。
+3. 从质量运行定位问题并完成整改闭环。
+4. 对证据不足的运行事件验证拒绝结论。
+5. 执行一次隔离环境恢复并核对关键数据。
+
+培训签到、练习结果、问题记录和补训安排由企业培训负责人保存。
+
+## 9. 移交清单
+
+| 项目 | 当前状态 |
+|---|---|
+| 第一阶段用户操作指南 | 工程材料已就绪 |
+| WP14 验收计划、用例和缺陷台账 | 工程材料已就绪 |
+| WP13 安装、备份与恢复证据 | 本地证据已就绪 |
+| 企业运维主责、备岗和升级联系人 | 待企业指定 |
+| 企业目标环境安装 | 待企业执行 |
+| 企业 RPO/RTO 恢复演练 | 待企业执行 |
+| 用户与运维培训 | 待企业组织 |
+| 正式验收与移交签字 | 待企业 UAT 完成后签署 |

+ 96 - 0
docs/superpowers/plans/2026-07-30-wp14-uat-handover.md

@@ -0,0 +1,96 @@
+# WP14 用户验收与移交实施计划
+
+> 日期:2026-07-30
+> 工作包:WP-14
+> 分支:`codex/dataops-phase1-equipment-governance`
+
+## 1. 目标与完成边界
+
+WP14 将 WP02~WP13 已形成的设备数据运营与治理能力组织成一套可复核、可移交的第一阶段交付包,完成本地工程预验收、缺陷登记、操作培训材料、运维交接材料和第二阶段待办。
+
+本工作包不把本地示范数据、自动化测试、页面截图或开发人员自测等同于企业正式验收。以下外部条件未满足前,WP14 只能标记为“工程完成,待企业 UAT 与正式移交”:
+
+1. 企业验收负责人、业务用户和运维负责人到位;
+2. 企业真实设备、故障、维修、告警等数据完成脱敏接入;
+3. 企业角色、业务域、质量规则、指标阈值和恢复策略完成确认;
+4. 真实场景 UAT 通过,P0 缺陷全部关闭;
+5. 企业验收负责人完成签字,发布和运维责任完成交接。
+
+## 2. 交付物
+
+| 交付物 | 路径 | 用途 |
+|---|---|---|
+| UAT 用例集 | `docs/acceptance/WP14_UAT_CASES.json` | 机器可读的角色、场景、预期和证据契约 |
+| UAT 计划与报告 | `docs/acceptance/WP14_UAT_PLAN_AND_REPORT.md` | 记录范围、环境、结果、外部门禁和签字状态 |
+| 缺陷台账 | `docs/acceptance/WP14_DEFECT_REGISTER.md` | 记录严重度、状态、证据、处置和遗留风险 |
+| 用户操作手册 | `docs/guides/DATAOPS_PHASE1_USER_OPERATION_GUIDE.md` | 面向管理员、编辑者、查看者的业务操作说明 |
+| 运维与培训移交 | `docs/runbooks/DATAOPS_PHASE1_OPERATIONS_HANDOVER.md` | 安装恢复入口、巡检、告警、培训和责任交接 |
+| 第二阶段待办 | `docs/roadmap/DATAOPS_PHASE2_BACKLOG.md` | 将首期边界转为可排序、可验收的后续工作 |
+| WP14 证据 | `docs/validation/WP14_UAT_HANDOVER_EVIDENCE.md` | 汇总测试、页面、接口和文档复核证据 |
+| 交付契约测试 | `tests/test_wp14_delivery_contract.py` | 防止交付物缺失、占位符和成熟度越界 |
+
+## 3. 实施步骤
+
+### 3.1 交付契约先行
+
+先编写 `tests/test_wp14_delivery_contract.py`,要求:
+
+- 用例覆盖 WP02~WP13,至少包含管理员、编辑者和查看者三类角色;
+- 每条用例具有前置条件、步骤、预期、证据、结果和验收层级;
+- 工程预验收与企业正式验收使用不同结果状态;
+- 报告明确示范数据不能代替企业真实 UAT;
+- 缺陷台账包含严重度、状态、证据和处置决定;
+- 第二阶段待办可追溯到现有模块,并保留 SSO 的第三阶段触发条件;
+- 正式交付文档不存在 `TBD`、`TODO` 或模板占位符。
+
+先运行测试并确认因交付物尚未创建而失败,再补齐交付物使测试通过。
+
+### 3.2 本地关键场景预验收
+
+使用当前本地 Compose 环境进行受影响范围内的验收,不执行全量回归。验收覆盖:
+
+1. 管理员:用户与权限、责任矩阵、安全审计和审计封存;
+2. 编辑者:设备数据受控接入、实体候选处理、质量问题整改;
+3. 查看者:资产目录、搜索、质量、关系根因、治理指标只读查看;
+4. 通用场景:授权边界、来源引用、证据不足拒答、指标明细追溯;
+5. 交付场景:离线安装、备份、恢复和回滚入口能够被运维人员找到并复核。
+
+浏览器验证使用页面文本、可见操作和必要截图作为证据,接口验证补充精确状态码。临时验收账号在验证完成后停用,避免保留无必要的活动凭据。
+
+### 3.3 缺陷收口
+
+- P0:阻断核心业务闭环、安全隔离、数据不可恢复或无法部署,必须关闭;
+- P1:核心功能错误但存在受控替代路径,原则上在 WP14 关闭;
+- P2/P3:非阻断优化可经产品和验收负责人确认后转入第二阶段;
+- 每个缺陷记录复现步骤、影响、修复提交、验证证据和最终决定;
+- 若发现代码缺陷,先补失败测试,再做最小修复和定向验证。
+
+### 3.4 培训与移交
+
+用户手册按照角色和业务任务组织,不按代码模块组织。运维手册链接 WP13 已验证的安装、升级、备份和恢复流程,补充每日/每周巡检、异常升级、密钥和备份责任、发布审批以及回退条件。
+
+培训材料至少覆盖:
+
+- 平台边界与三类角色;
+- 设备资产、语义、匹配、质量、整改、关系、问答和指标闭环;
+- 证据与审计的使用方法;
+- 安装恢复和故障升级演练;
+- 企业正式 UAT 的数据、人员和签字准备。
+
+### 3.5 第二阶段待办
+
+第二阶段聚焦设备示范域向可复用数据运营平台演进,包括主动元数据、通用术语标准、通用质量运营、平台可观测、统一责任与待办、数据产品治理、Agent 治理、安全底座和产品工程。
+
+单点登录保持第三阶段能力;仅当明确试点客户把统一认证列为上线前置、提供 IdP 与 Claims 规范、完成故障降级和安全责任确认后,才允许通过范围变更提前。
+
+## 4. 验证与提交
+
+只执行以下定向验证:
+
+1. `tests/test_wp14_delivery_contract.py`;
+2. 与验收过程中实际修复代码直接相关的测试;
+3. 管理员、编辑者、查看者的关键页面与权限场景;
+4. 文档链接、占位符、用例结果和证据路径复核;
+5. `git diff --check` 和最终工作区检查。
+
+验证完成后更新第一阶段工作计划的 WP14 状态,形成 WP14 证据文档并提交到当前本地分支;不推送、不部署生产。

+ 89 - 0
docs/validation/WP14_UAT_HANDOVER_EVIDENCE.md

@@ -0,0 +1,89 @@
+# WP14 用户验收与移交证据
+
+## 1. 文档契约
+
+- `tests/test_wp14_delivery_contract.py` 对 WP14 的七份正式交付物、用例字段、
+  模块覆盖、角色、验收边界和二期范围执行机器校验。
+- `docs/acceptance/WP14_UAT_CASES.json` 共 21 条用例,覆盖 WP02 至 WP13。
+- 结果分类使用 `PASS_LOCAL` 和 `BLOCKED_EXTERNAL`,没有把本地工程验证写成
+  企业正式验收。
+- 验收报告明确 P0 门禁、企业签署要求和“本地证据不替代企业真实 UAT”边界。
+
+## 2. 角色与权限
+
+角色 API 矩阵:
+
+| 角色 | 当前用户 | 设备资产 | 治理指标 | 用户管理 | 审计 | 无效资产导入 |
+|---|---:|---:|---:|---:|---:|---:|
+| admin | 200 | 200 | 200 | 200 | 200 | 422 |
+| editor | 200 | 200 | 200 | 403 | 403 | 422 |
+| viewer | 200 | 200 | 200 | 403 | 403 | 403 |
+
+422 表示管理员和编辑者已通过权限校验,并在数据校验阶段拒绝无效请求;查看者
+在权限层直接被拒绝。无效导入未产生业务数据。
+
+浏览器验证:
+
+- 管理员可进入用户管理并创建临时 editor 和 viewer 账号。
+- 查看者的数据研究中心显示只读提示,新增摄取和治理评审入口已隐藏。
+- 查看者直接访问用户管理页面跳转 404,服务端用户和审计接口同时返回 403。
+- 编辑者可进入设备质量等业务页面,不可进入用户与审计管理。
+- 临时验收账号在测试完成后已停用,重新登录返回 401。
+
+## 3. 业务场景
+
+### 设备资产与责任
+
+- 设备台账 4 条,来源映射 4 条,责任覆盖 4/4。
+- 浏览器可查看来源标识、版本和追溯入口。
+- 治理责任范围覆盖设备映射、设备本体、设备质量和质量问题。
+
+### 设备语义与实体
+
+- 设备本体已引导并发布 v1。
+- 类别 11 个、关系 10 个、映射 6 个,发布检查为可发布。
+- 实体候选 1 条,展示 95% 置信度、5/6 信号和确定性规则。
+- 合并事件和回滚事件各有记录,当前候选状态为已回滚。
+
+### 质量与运行维护
+
+- 质量规则 7 条,质量运行 2 次,质量问题 1 条且已关闭。
+- 运行维护事件 4 条,证据关系 2 条。
+- 对缺少关联证据的停机事件执行分析时,页面返回“证据不足,无法确认根因”,
+  不生成自动修复或维修计划。
+
+### 知识与指标
+
+- 管理员按来源标识检索得到 1 条设备证据。
+- 问答模型不可用时返回 `model_unavailable`,页面提示未生成推测性答案,同时
+  展示设备名称、平台标识、来源标识、位置、组织和负责人等来源证据。
+- 查看者没有对应业务域授权时不返回管理员可见证据,证明检索遵守授权边界。
+- 治理指标共 5 项:台账完整率 100%、责任覆盖率 100%、实体映射率 0%、
+  问题闭环率 100%、复发率 0%。实体映射率为 0% 与已执行回滚的事实一致。
+
+### 审计与恢复
+
+- 审计中心 6 项安全检查通过,关键操作类别可查询,审计封印 2 条。
+- 知识查询完成后可产生对应审计记录。
+- WP13 已提供本地离线包、116/116 公共表、2/2 审计封印、4/4 设备、
+  3/3 图节点以及对象存储恢复核对证据。
+
+## 4. 缺陷结论
+
+- WP14-DEF-001,P1,已关闭:通用前端响应处理现接受完整 HTTP 2xx 业务码。
+- WP14-DEF-002,P1,已关闭:查看者隐藏写入口并显示只读提示。
+- P0 未发现,未关闭 P1 为 0。
+- 两个修复均先由定向契约测试复现,再完成代码修复、变更面测试和浏览器复核。
+
+## 5. 外部门禁
+
+以下项目为 `BLOCKED_EXTERNAL`,不属于当前本地环境可替代的验收活动:
+
+- 使用企业真实用户、真实角色和脱敏真实数据执行 UAT。
+- 在企业目标环境完成干净主机安装和正式制品构建。
+- 按企业 RPO/RTO 完成备份恢复演练并签字。
+- 完成用户培训、运维培训、问题确认和补训。
+- 由产品、业务、技术和运维负责人完成正式验收与移交签署。
+
+本地工程预验收结论仅说明当前分支具备进入企业 UAT 的条件,不表示已经生产
+部署或完成企业正式验收。

+ 1 - 1
frontend/src/utils/request.js

@@ -56,7 +56,7 @@ service.interceptors.response.use(
     if (res.code === 60902) {
       return Promise.reject(res)
     }
-    if (res.code !== 200) {
+    if (res.code < 200 || res.code >= 300) {
       if (res.data && Object.keys(res.data)?.length) {
         return Promise.reject(res)
       }

+ 20 - 5
frontend/src/views/dataGovernance/development/index.vue

@@ -2,7 +2,7 @@
   <div class="pa-6">
     <div class="mb-6"><h1 class="text-h4">数据研发中心</h1><p class="text--secondary">统一采集、治理评审、数据元素与动态本体构建</p></div>
     <v-row>
-      <v-col v-for="entry in entries" :key="entry.title" cols="12" md="4">
+      <v-col v-for="entry in visibleEntries" :key="entry.title" cols="12" md="4">
         <v-card outlined height="180" class="pa-4 d-flex flex-column">
           <v-icon color="primary" large class="align-self-start">{{ entry.icon }}</v-icon>
           <v-card-title class="px-0">{{ entry.title }}</v-card-title>
@@ -19,11 +19,10 @@
 export default {
   name: 'DataResearchCenter',
   data: () => ({
-    readOnly: false,
     entries: [
-      { title: '新建采集', description: '数据库目录、DDL 与文件解析', icon: 'mdi-database-import-outline', path: '/data-governance/development/ingestion' },
+      { title: '新建采集', description: '数据库目录、DDL 与文件解析', icon: 'mdi-database-import-outline', path: '/data-governance/development/ingestion', writeOnly: true },
       { title: '研发任务', description: '查看解析进度、失败阶段与重试状态', icon: 'mdi-progress-clock', path: '/data-governance/development/tasks' },
-      { title: '治理评审', description: '证据预览、批量决策与数据元素生命周期', icon: 'mdi-clipboard-check-outline', path: '/data-governance/development/review' },
+      { title: '治理评审', description: '证据预览、批量决策与数据元素生命周期', icon: 'mdi-clipboard-check-outline', path: '/data-governance/development/review', writeOnly: true },
       { title: '设备台账', description: '设备、部件、测点、告警与维护记录统一追溯', icon: 'mdi-factory', path: '/data-governance/development/device-assets' },
       { title: '实体匹配', description: '跨来源匹配候选、审核、非破坏性合并与回滚', icon: 'mdi-vector-link', path: '/data-governance/development/entity-resolution' },
       { title: '设备质量', description: '规则版本、质量检查、违规样本与资产评分', icon: 'mdi-shield-check-outline', path: '/data-governance/development/device-quality' },
@@ -31,6 +30,22 @@ export default {
       { title: '治理运营指标', description: '实时查看完整率、责任覆盖、实体映射与质量问题闭环', icon: 'mdi-chart-box-outline', path: '/data-governance/development/governance-metrics' },
       { title: '本体中心', description: '跨业务域本体定义、校验、发布与回滚', icon: 'mdi-graph-outline', path: '/data-governance/ontology' }
     ]
-  })
+  }),
+  computed: {
+    isViewerOnly () {
+      const roles = this.$store.state.user.userInfo.roles || []
+      return roles.includes('viewer') &&
+        !roles.includes('editor') &&
+        !roles.includes('admin')
+    },
+    readOnly () {
+      return this.isViewerOnly
+    },
+    visibleEntries () {
+      return this.isViewerOnly
+        ? this.entries.filter(entry => !entry.writeOnly)
+        : this.entries
+    }
+  }
 }
 </script>

+ 164 - 0
tests/test_wp14_delivery_contract.py

@@ -0,0 +1,164 @@
+from __future__ import annotations
+
+import json
+import re
+from pathlib import Path
+
+
+ROOT = Path(__file__).resolve().parents[1]
+UAT_CASES = ROOT / "docs/acceptance/WP14_UAT_CASES.json"
+UAT_REPORT = ROOT / "docs/acceptance/WP14_UAT_PLAN_AND_REPORT.md"
+DEFECT_REGISTER = ROOT / "docs/acceptance/WP14_DEFECT_REGISTER.md"
+USER_GUIDE = ROOT / "docs/guides/DATAOPS_PHASE1_USER_OPERATION_GUIDE.md"
+OPERATIONS_HANDOVER = ROOT / "docs/runbooks/DATAOPS_PHASE1_OPERATIONS_HANDOVER.md"
+PHASE2_BACKLOG = ROOT / "docs/roadmap/DATAOPS_PHASE2_BACKLOG.md"
+EVIDENCE = ROOT / "docs/validation/WP14_UAT_HANDOVER_EVIDENCE.md"
+REQUEST_CLIENT = ROOT / "frontend/src/utils/request.js"
+DEVELOPMENT_CENTER = (
+    ROOT / "frontend/src/views/dataGovernance/development/index.vue"
+)
+
+DELIVERABLES = (
+    UAT_CASES,
+    UAT_REPORT,
+    DEFECT_REGISTER,
+    USER_GUIDE,
+    OPERATIONS_HANDOVER,
+    PHASE2_BACKLOG,
+    EVIDENCE,
+)
+
+
+def _read(path: Path) -> str:
+    return path.read_text(encoding="utf-8")
+
+
+def _cases() -> list[dict]:
+    payload = json.loads(_read(UAT_CASES))
+    assert payload["work_package"] == "WP-14"
+    assert payload["schema_version"] == "1.0"
+    return payload["cases"]
+
+
+def test_wp14_deliverables_exist() -> None:
+    missing = [str(path.relative_to(ROOT)) for path in DELIVERABLES if not path.is_file()]
+    assert not missing, f"WP14 交付物缺失: {missing}"
+
+
+def test_wp14_uat_cases_cover_roles_modules_and_acceptance_boundaries() -> None:
+    cases = _cases()
+    assert len(cases) >= 16
+
+    required_fields = {
+        "id",
+        "module_ids",
+        "title",
+        "actor",
+        "acceptance_level",
+        "preconditions",
+        "steps",
+        "expected",
+        "evidence",
+        "result",
+        "notes",
+    }
+    for case in cases:
+        assert required_fields <= case.keys(), case.get("id")
+        assert case["id"].startswith("WP14-UAT-")
+        assert case["actor"] in {"admin", "editor", "viewer", "enterprise_acceptance"}
+        assert case["acceptance_level"] in {"LOCAL_ENGINEERING", "ENTERPRISE_FORMAL"}
+        assert case["result"] in {"PASS_LOCAL", "FAIL", "BLOCKED_EXTERNAL", "NOT_RUN"}
+        assert case["module_ids"]
+        assert case["preconditions"]
+        assert len(case["steps"]) >= 2
+        assert case["expected"]
+        assert case["evidence"]
+        if case["acceptance_level"] == "ENTERPRISE_FORMAL":
+            assert case["result"] != "PASS_LOCAL"
+
+    covered_modules = {module for case in cases for module in case["module_ids"]}
+    assert {f"WP-{number:02d}" for number in range(2, 14)} <= covered_modules
+    assert {"admin", "editor", "viewer"} <= {case["actor"] for case in cases}
+    assert any(case["acceptance_level"] == "ENTERPRISE_FORMAL" for case in cases)
+    assert any(case["result"] == "BLOCKED_EXTERNAL" for case in cases)
+
+
+def test_wp14_docs_state_real_uat_boundary_and_have_no_placeholders() -> None:
+    report = _read(UAT_REPORT)
+    assert "本地工程预验收" in report
+    assert "企业正式验收" in report
+    assert "不能替代企业真实数据 UAT" in report
+    assert "P0" in report
+    assert "签字" in report
+
+    for path in DELIVERABLES[1:]:
+        content = _read(path)
+        assert not re.search(r"\b(?:TBD|TODO)\b|\{\{[^}]+\}\}", content), path.name
+
+
+def test_wp14_defect_register_is_actionable() -> None:
+    register = _read(DEFECT_REGISTER)
+    for field in ("缺陷编号", "严重度", "状态", "复现与证据", "处置决定"):
+        assert field in register
+    for severity in ("P0", "P1", "P2", "P3"):
+        assert severity in register
+    assert "未发现" in register or "已关闭" in register
+
+
+def test_wp14_user_and_operations_guides_cover_handover_tasks() -> None:
+    user_guide = _read(USER_GUIDE)
+    for role in ("管理员", "编辑者", "查看者"):
+        assert role in user_guide
+    for task in ("设备资产", "实体匹配", "质量问题", "根因", "知识问答", "治理指标"):
+        assert task in user_guide
+
+    operations = _read(OPERATIONS_HANDOVER)
+    for topic in ("每日巡检", "每周巡检", "备份", "恢复", "回滚", "升级", "异常升级", "责任"):
+        assert topic in operations
+    assert "培训" in operations
+    assert "移交清单" in operations
+
+
+def test_wp14_phase2_backlog_preserves_scope_and_sso_gate() -> None:
+    backlog = _read(PHASE2_BACKLOG)
+    for field in ("待办编号", "来源模块", "优先级", "启动条件", "验收标准", "依赖", "目标阶段"):
+        assert field in backlog
+    for scope in (
+        "主动元数据",
+        "通用术语",
+        "通用质量运营",
+        "平台可观测",
+        "统一责任",
+        "统一任务",
+        "数据产品治理",
+        "Agent 治理",
+        "安全底座",
+        "产品工程",
+    ):
+        assert scope in backlog
+    assert "单点登录" in backlog
+    assert "第三阶段" in backlog
+    assert "IdP" in backlog
+
+
+def test_wp14_evidence_links_results_to_commands_and_pages() -> None:
+    evidence = _read(EVIDENCE)
+    for section in ("文档契约", "角色与权限", "业务场景", "缺陷结论", "外部门禁"):
+        assert section in evidence
+    assert "tests/test_wp14_delivery_contract.py" in evidence
+    assert "PASS_LOCAL" in evidence
+    assert "BLOCKED_EXTERNAL" in evidence
+
+
+def test_frontend_accepts_standard_success_envelopes_across_http_2xx() -> None:
+    request_client = _read(REQUEST_CLIENT)
+    assert "res.code < 200 || res.code >= 300" in request_client
+    assert "res.code !== 200" not in request_client
+
+
+def test_viewer_development_center_hides_write_only_entries_and_explains_mode() -> None:
+    development_center = _read(DEVELOPMENT_CENTER)
+    assert 'v-for="entry in visibleEntries"' in development_center
+    assert "writeOnly: true" in development_center
+    assert "isViewerOnly" in development_center
+    assert "当前为 viewer 只读模式" in development_center