数字员工系统审计问题清单 (2026-06-14)
🔴 CRITICAL (3)
P1: boss-scheduler/index.js 模块级提前调用 ensureTables()
- 文件:
server/boss-scheduler/index.js第13-16行 - 代码在模块作用域调用
staffManager.ensureTables(),此时sqlite-compat.init()尚未完成 - 第一次调用
getDb()抛 "sql.js 未初始化"→_db永远为 null - 即使加载流程后续
loadSqliteRoutes()重新调用了ensureTables()并成功设置了_db,
但如果旧 zombie 进程或异步重入先抢到,API 永远返回空
- 修复方案: 将模块级的
ensureTables()移到_loadProfile()或_ensureInit()内部,
或直接删除(server.js 的 loadSqliteRoutes() 已经调了一次)
P2: procurement.js Phase 2 硬编码超时 1 分钟
- 文件:
server/boss-scheduler/workers/procurement.js第159行 waitTimeout: 1, confirmTimeout: 1硬编码为测试值- 应该从
staff.params.waitTimeout读取(local.yaml 中的waitTimeout: 30,单位秒) - 导致用户来不及确认采购就超时
- 修复方案:
{ ...(staff.params || {}), ...(parameters || {}) }取完整 merged 配置,传参时确保覆盖
P3: cost-optimizer.js 使用硬编码模拟数据
- 文件:
server/boss-scheduler/workers/cost-optimizer.js - 整个 worker 不连真实 SCSAI/BOM 数据
mockComponents和recommendations全写死- 与之前决策"禁止模拟数据"矛盾
- 修复方案: 至少添加注释 TODO,API 调用失败时改用日志 fallback 而非 mock,或直接报错
🟠 ARCHITECTURE (3)
P4: staff-manager 和 lite-scheduler 数据库状态不一致
staff-manager用sciot_import.db的digital_staff表lite-scheduler从local.yaml加载 +syncStaffToDb()写入 DB- YAML 覆盖 DB 变更:用户通过前端编辑员工的配置会被
syncStaffToDb()覆盖 - 修复方案:
syncStaffToDb()用合并策略,保留 DB 中已修改的字段
P5: procurement.js 每次请求都 new SCSAIClient
- 文件:
server/boss-scheduler/workers/procurement.js第107-113行 - Phase 1 每次执行都 new SCSAIClient,无连接池复用
- 从环境变量读取相同参数重复 new
- 修复方案: 在模块顶部创建一次 SCSAIClient 实例
P6: procurement.js 默认参数双重硬编码
- local.yaml 中
params.waitTimeout: 30已定义 - procurement.js 第159行又硬编码了
waitTimeout: 1 - 数据流:staff.params → merged (覆盖 params) → runProcurementWorkflowV3({ waitTimeout: 1, ... })
- params 的值在 merged 中被人为覆盖为 1
🟡 BUGS (6)
P7: cost-optimizer.js HTTP API 调用使用 http 非 require('http') 可能不存在
- 文件:
server/boss-scheduler/workers/cost-optimizer.js第62行 - 未处理 API 调用超时(默认是无限等待)
- 如果服务器自己调用自己(ylxt.chat/api/demo/bom-cost-optimize),
当 worker 持有 mutex 时可能死锁
P8: execution-context.js 日志高并发使用 JSON 文件
- 1秒防抖,多个异步操作同时写入同一文件
- 虽用了 tmp+rename,但 JSON.stringify 在 500 条日志(约 2MB)时可能 OOM
- 修复: 考虑限制每行大小或限流
P9: data-caretaker.js poDir 重复声明
- 文件:
server/boss-scheduler/workers/data-caretaker.js第80行 const poDir声明了两次(第68行和80行),运行时抛 SyntaxError- 修复: 删除重复声明
P10: staff-registry.js 和 lite-scheduler.js 的能力字段不一致
toRuntimeStaff()给 staff 设置capabilities数组_resolveStaff()从 DB 加载员工时没设capabilities- 前端编辑的员工不含
capabilities,插件无法使用能力
P11: staff-manager.js queryLogs 用 ISO 字符串,execution-context.js 用时间戳
staff-manager.queryLogs的since参数用 ISO 日期字符串比较execution-context.getStaffLogs的since参数用timestampUnix(数字)- 两套查询 API 格式不一致
P12: lite-scheduler.js 构建 SCSAIClient 时配置硬编码
- 文件:
lite-scheduler.js第87-93行 - SCSAI 配置从
process.env.SCSAI_*或硬编码后备获取 - 和
server.js加载的 SCSAIClient 是两条不同路径,配置可能不同
⚪ CODE QUALITY (5)
P13: digital-staff/index.js 95KB 遗留旧代码
- 仍被
execution-context.js引用(pushLogToSSEClients) - 但已被 lite-scheduler 体系取代
- 建议清理无用导出
P14: server.js routing 中有大量空行调试日志
[DEBUG]和[router] dispatch 进入产生噪音
P15: procurement.js Phase 1 的 staffLog 调用缺失 result 参数
- 文件第155行
staffLog(staff.id, '采购助手启动', ...)只传了 3 个参数 - 但
ctx.staffLog签名是(staffId, action, detail, result, meta)
P16: system-health.js 大量空行
- 第84-88行有大量空行
P17: consistency-check.js 中 getSciotDb 可能未正确 export
- system-health.js 第10行
const { runConsistencyCheck, getSciotDb } = require('../lib/consistency-check'); - 如果
getSciotDb未导出,会返回 undefined
BossAgents