Files
knowledge-governance/docs/P3_LOCAL_AND_CROSS_ENV_ACCEPTANCE.md
zheromiku dcdc8d1ddd feat: 知识治理平台(含已验证发布/回滚契约)
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环):

- 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口)
- 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入
  parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截
- 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过):
  * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id)
  * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配
  * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数
  * 回滚 job payload 支持 prior_execution_id(strict 解码)
- 三通道发布+回滚演练实测:publish 4/4 verified,检索命中,
  rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false
- 前端 A·Data-console 风格全站统一,120 用例通过
- 门禁:go vet / go test 全包通过,gofmt 干净
2026-09-30 10:54:06 +08:00

5.4 KiB
Raw Permalink Blame History

P3 本地 WeKnora 与测试服务器互测验收

范围

本阶段验证知识治理平台从安全 Spool 制品到 WeKnora 的真实编排链路:

  • 本地 WeKnora 上传、轮询、Chunk 与限定检索;
  • 上传失败终态、人工重试和持久 Worker 恢复;
  • 测试服务器 HTTPS 互测;
  • 530 条 PP 历史 Publication 在线只读核验;
  • API/UI 安全投影及运行资源;
  • 不启用生产 Release Worker,不执行生产发布。

本地真实 E2E

使用 4 份明确无敏感内容的 Markdown 合成制品。每份制品均执行:

spool inspection
→ atomic manual source/content/version/publication/job seed
→ test.upload
→ test.poll
→ test.validate
→ scoped retrieval probe

验收结果:

  • 4/4 Publication completed;
  • 每份文档 Chunk 总数为 1,读取 1/1,Knowledge 归属一致;
  • 限定 Knowledge 检索均返回目标结果;
  • 合成 marker 均在内存中验证命中,报告只保存布尔值;
  • knowledge_exists=passed;
  • chunks_present=passed;
  • 检索阈值未批准,retrieval_hit=manual_required。

技术失败与人工重试

真实故障注入为暂时移走 Spool 制品,不删除文件:

  1. Worker 将 Publication 写为 ingest_state=failed、processing_state=failed;
  2. 只保存固定错误码 upload_artifact_invalid;
  3. API 安全投影返回 can_retry=true;
  4. 恢复制品后调用正式 Retry API,返回 retry_queued;
  5. 同一 Publication 最终完成,retry_count=1;
  6. 原失败 Job 与重试 Job均为 completed/attempt=1。

同时兼容历史不一致状态 ingest=failed, processing=pending,允许通过正式 Retry API 自愈;普通 pending 或 completed Publication 仍不可重试。

持久 Worker 恢复

在 Job 已持久化后让 Worker 多次启动失败,再恢复正确配置:

  • Job 未丢失;
  • Worker 恢复后自动消费;
  • upload、poll、validate 均为 completed/attempt=1;
  • 未重复上传;
  • 恢复后的 Worker 为 running/restarts=0。

测试服务器互测

测试服务器使用 HTTPS weknora-test.dobot.cn,并创建隔离 KB governance-cross-env-test。未写入既有对内、对外或历史 E2E KB。

互测结果:

  • 合成 Markdown 上传成功;
  • remote status completed;
  • Chunk 1/1,归属一致;
  • 限定检索结果 2,目标结果 2;
  • marker_found=true;
  • 最高检索分 0.7180294855048308;
  • 结构验收通过;
  • 语义验收保持 manual_required。

MinerU 阻塞与恢复

首次互测时,测试 WeKnora 的 default Asynq 队列为:

active=10
pending=208
archived=186

测试服务器硬件空闲,但云 MinerU 健康请求超时。GPU 主机日志确认根因为:

OSError: [Errno 24] Too many open files

systemd hard limit 为 524288,但进程 soft limit 只有 1024。仅在 MinerU processing_tasks=0、queued_tasks=0 后执行:

  • 备份 /etc/systemd/system/mineru.service;
  • 在 [Service] 设置 LimitNOFILE=65536;
  • daemon-reload 并重启 MinerU;
  • 验证 soft/hard 均为 65536;
  • 验证 port 8000 listener PID 与 systemd MainPID 一致;
  • 验证 MinerU v3.4.2 health 为 healthy;修复瞬间回读并发为 8;
  • 验证 A10 已加载模型。

恢复后测试 WeKnora 的 pending/active 队列归零,隔离互测文档完成。历史 archived 数为 403;本阶段没有删除、重提或改写这些历史失败任务。

最终状态复核时,MinerU unit 已由另一个独立操作改为并发 2 并显式重启;本阶段没有覆盖该并发变更。LimitNOFILESoft=65536 继续生效,health 保持 healthy。

530 条历史 Publication 在线只读核验

候选查询严格限定为具有 Publication 的 PP 来源,排除所有 manual/future 来源。Dry-run 精确得到 530 条。

使用 API Key 文件、HTTPS、并发 4,每 25 个 completed 抽查 1 个 Chunk:

total=530
existing=530
missing=0
wrong_kb=0
pending=0
processing=0
finalizing=0
completed=530
failed=0
chunk_checked=21
chunk_empty=0
http_errors=0

核验只调用 GET;未重新上传 530 条历史 Knowledge。

API、UI 与密钥边界

  • API/Web 只展示安全 Publication 投影;
  • 页面未出现 Knowledge ID、KB ID、SHA、Spool 路径、API Key或对象存储地址;
  • 测试 WeKnora Key 只以普通 0600 文件提供给普通 Worker;
  • API、Web、Release Worker 不挂载测试 Key;
  • Spool 在 Worker 中只读;
  • RELEASE_WORKER_ENABLED=false;
  • Firefox 1440×900 验收通过左导航、顶部多标签、任务页、统一来源清单、手工验收标签及无横向溢出。

截图:tmp/P3_LOCAL_E2E_FIREFOX.png

自动化门禁

Go tests: 16 packages passed
Go vet: passed
Go race (testweknora): passed
Web tests: 24/24 passed
TypeScript typecheck: passed
Vite production build: passed
PostgreSQL isolated integration tests: passed
Compose config: passed

数据与发布边界

  • Migration 1–4 已应用;
  • 最终治理数据为 618 个 Source Item、535 个 Content、618 个 Version、535 个 Publication 和 69 个 Job;
  • 535/535 Publication completed,69/69 Job completed;
  • 5 个 manual E2E 对象对应 15 条验收记录;
  • 54 个 over_limit 项继续阻断;
  • 不删除 WeKnora Knowledge、源文件、PostgreSQL 数据或命名卷;
  • 不执行 docker compose down -v;
  • 未连接生产 WeKnora;
  • 未启用生产发布;
  • 未 commit、未 push。