双 DB 分裂修复记录(2026-07-11)
问题根因
项目存在两个 rule_engine.db:
D:\openclaw\bossagents\data\rule_engine.db(旧库,471KB):298 类型 / 2821 属性 / 431 关系 / 298 模板 / 无 sciot_rules_v2 表D:\openclaw\bossagents\server\data\rule_engine.db(新库,765KB):616 类型 / 2821 属性 / 431 关系 / 306 模板 / 76 规则
核心代码分裂为两套:
server/utils/SCSAI-tools.js的getSciotDb()用'../../data'(从server/utils出发)= 指向旧库,被unified-create.js、aml.js、relationship-capability.js、itemtype.router.js、capability-pipeline.js等核心创建/读取链路使用。server/core/capability-runtime.js的_initRuleEngine()用'../data'(从server/core出发)= 指向新库,被六能力使用。
这正是此前「validate/repair 偶尔行为不一致、规则数忽多忽少」的隐患根源——两套路径读不同库。
修复
server/utils/SCSAI-tools.js第 41 行:dbPath 由
path.join(__dirname, '..', '..', 'data', 'rule_engine.db')
改为
path.join(__dirname, '..', '..', 'server', 'data', 'rule_engine.db')
→ 统一指向新库。
- 删除孤立旧库:经
tmp_audit_paths.js全树审计,server/内无任何文件运行时解析到旧库(原以为有,实测所有../data从server/core、server/routes等出发均落到server/data/;consistency-check.js的'../../data'从server/boss-scheduler/lib出发也是server/data/)。
data/rule_engine.db 无任何运行时代码引用,确认为纯历史残留。
未直接 rm,移动至 data/_deprecated_rule_engine_db_20260711-184656/ 保留可恢复。
验证(删除旧库 + 重启后)
- server 重启正常(pid 33584),
/api/health返回 ok。 POST /api/unified/create(走 SCSAI-tools.getSciotDb 路径)Part 创建成功落库,server.err 无rule_engine.db 不可用报错。- 六能力全部通过(不回退):
- VALIDATE(既有有 name 对象
50066E...):executed=true blocked=false rules=6 source=rule_engine - OPTIMIZE:found=4 source=rule_engine
- REPAIR:executed=true issues=1 applied=2 SCSAI=true(真实回写)
- IDENTIFY:executed=true matched=true
- COMPARE:executed=true
- GENERATE:executed=true src=fallback
- 关系型创建(Model + sourceId)仍 success=500 修复仍生效;Model 无 sourceId 返回 400 边界正确。
备注
- 刚创建的测试对象
80761D7343DC4F7BAB2371822DA13FFB(name='POST_DEL_CHECK_PART')validate 报 blocked=true「name 不能为空」——属 CREATE 的 name 字段映射历史问题(SCSAI 端 name 未正确落库),非本次删除旧库引入的回退(同法测既有对象 blocked=false 正常)。 - 临时探针脚本(tmp_*.js)已全部清理。
BossAgents