全栈知识治理平台首次入库(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 干净
5.4 KiB
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 制品,不删除文件:
- Worker 将 Publication 写为
ingest_state=failed、processing_state=failed; - 只保存固定错误码
upload_artifact_invalid; - API 安全投影返回
can_retry=true; - 恢复制品后调用正式 Retry API,返回
retry_queued; - 同一 Publication 最终完成,
retry_count=1; - 原失败 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。