规则引擎 ↔ SCSAI 同步架构与运维手册

规则引擎 ↔ SCSAI 同步架构与运维手册

最后更新:2026-07-23

适用代码:server/core/SCSAI-rule-sync.jsserver/core/rule-engine.jsserver/core/capability-runtime.jsserver/scripts/sync-rules-bidirectional.jsserver.js(漂移自检)


1. 权威源与数据流

  • 权威存储:SCSAI 的 BossAgent_Rule(2000+ 条,前缀 bossagent_* 字段)。
  • 本地副本server/data/rule_engine.dbsciot_rules_v2 表(运行时引擎实际读取的库)。
  • 方向
  • SCSAI → 本地只读拉取(pull),用 item_number(= 本地 rule.id)做幂等 upsert。
  • 本地 → SCSAI回写(push),经 SCSAIRuleSync.syncRuleToSCSAI,写 BossAgent_Rule不再是废弃的 BOS_RULE: Method)。

⚠️ 历史坑(已修复,记录以防回潮)

  • 旧版 SCSAIRuleSync 把规则写进 BOS_RULE: Method(无人读取的死路径)。现已重写为写 BossAgent_Rule
  • 旧版建引擎时未传 SCSAIClientsaveRule 的回写被整体跳过。现 capability-runtime.jsUnifiedRuleEngine 时传入 this.SCSAIClient

2. 字段映射(SCSAI BossAgent_Rule ↔ 本地 sciot_rules_v2

本地列SCSAI 属性说明
iditem_numberupsert key,两端一致
namename
descriptiondescription
scopebossagent_scopevalidate/repair/optimize/compare/generate/identify
item_type_namebossagent_item_type适用对象类,* 表示通用
severitybossagent_severityinfo/warn/error
prioritybossagent_priority整数
condition_scriptbossagent_condition_scriptTEXT,可空
action_typebossagent_action_typesuggest/auto_fix/...
action_configbossagent_action_configJSON 字符串
action_scriptbossagent_generated_amlTEXT,可空
is_activebossagent_is_active0/1
is_builtinbossagent_is_builtin0/1
sourcebossagent_sourcegenerated/builtin/inspect/biz/manual/SCSAI
versionbossagent_version整数
tagsbossagent_tagsCSV 或 JSON 字符串
categorybossagent_category
SCSAI_idid (@_id)SCSAI item 的 GUID,回写凭证

关键归一化:_SCSAIVal()

SCSAI sendAML 返回的空属性不是 null,而是对象 {is_null:"1"};引用属性可能是 {keyed_name:...}。直接在代码里 value || null 兜底不生效(对象 truthy),会把 object 传进 better-sqlite3 → 绑定失败报 Too few parameter values → 整批跳过(这是此前 PULL 长期 0 条的真凶)。

_SCSAIVal(v) 负责归一化:

  • 原始 null/undefinednull
  • 字符串/数字/布尔 → 字符串
  • 对象:含 is_nullnull;含 #text/keyed_name/value → 取之;其它 → JSON.stringify 落 TEXT 列

3. 同步脚本

server/scripts/sync-rules-bidirectional.js

node server/scripts/sync-rules-bidirectional.js            # 默认:pull(SCSAI → 本地)
node server/scripts/sync-rules-bidirectional.js --push    # 本地 → SCSAI(仅 is_builtin=0)
node server/scripts/sync-rules-bidirectional.js --both    # 先 pull 再 push
node server/scripts/sync-rules-bidirectional.js --dry     # 只读漂移检查,不写任一端
  • PULLSCSAIRuleSync.syncRulesFromSCSAI(SCSAIClient, engine),按 item_number upsert。maxRecords 5000。
  • PUSH:遍历本地 is_builtin = 0 行,逐条 syncRuleToSCSAIid 为 NULL 的行会被跳过(无合法 id 无法映射,非 bug)。
  • 漂移自检server.js 启动后约 15s 报告本地与 SCSAI 的 item_number 差异(只读 Warn,不写任一端)。

4. 规则生命周期(CRUD 是否回写)

| 操作位置 | 是否回写 SCSAI | 现状 |

|---|---|---|

| 服务端 BossAgent_Rule 增删改 | 项目只 get 读,从不写 | 服务端改了 → 本地需手动 pull 才生效 |

| 本地管理界面 saveRule | ,写 BossAgent_Rule | 引擎建时传 SCSAIClient 即生效 |

| 本地管理界面 deleteRule | (走 SCSAIRuleSync) | 同上 |

| sync-rules-SCSAI-to-local.js | 只读 pull | 幂等覆盖,会覆盖本地未上 SCSAI 的修改 |

注意:pull 用 item_number 幂等覆盖。若本地有 manual 修改但 SCSAI 端没有对应 item,重跑 pull 不会删除本地多余规则,但会覆盖同名规则——本地独占修改有被覆盖风险,建议通过 push 先上行。


5. 运维要点

  1. 首次/定期对齐:跑 --both 做一次双向收敛。
  2. 确认同步率:查 sciot_rules_v2SCSAI_id 非空的条数;正常应接近本地非垃圾规则总数。
  3. 孤儿规则id IS NULL 的本地规则无法 push,需先赋予语义化 id(如 biz-repair-xxx-001)。
  4. 漂移告警:启动日志搜 [RuleDrift],出现 WARN 即两端分叉,需 --both 修复。
  5. 数据质量action_config/tags 必须是合法 JSON 或 CSV;inspect 类规则的 action_config 允许 key:value 文本(引擎有专门解析)。
  6. rule_engine.db 是运行时产物,被 .gitignore 排除;可随时用 --both 从 SCSAI 重建。

6. 已知遗留

  • 本地 source=builtin 规则(如 BUILTIN-、内置 biz-不回写 SCSAI(设计上 SCSAI 为权威源,内置规则应以 SCSAI 为准)。
  • 无自动/定时同步调度;当前依赖启动漂移自检 + 手动 --both。如需常驻同步可加 cron/定时器调用本脚本。
  • BossAgent_Prompt / BossAgent_Template / BossAgent_BizPrompt 的本地副本仍由 template-sync-service.js 只读拉取,管理界面修改暂不回写 SCSAI(独立待办)。
← 返回案例列表
分享:
🤖 Try Now →
🤖
🎁