feat(all): 数据库模块化拆分与版本化迁移、任务引擎命名体系收敛、物理输出校验加固与用户配置接通

- server/db: 拆 4929 行 db.rs 单体为 db/ 目录,migrations.rs 引入 PRAGMA user_version
    版本化迁移运行器(M1~M13)
  - 任务引擎 Phase 6/7b/7c 改名收敛:EngineStageConfig→PhaseConfig、StagePolicy→ResumePolicy、
    Converged→Completed、删除 task_type 列、success_method 拆 tlusty_/synspec_ 双列、
    新增 tlusty_status/synspec_status 半失败阶段守卫
  - 科学正确性加固:conv_check 任意行 NaN/Inf/溢出判无效(0 行容忍)、新增 spec_is_valid
    校验 SYNSPEC 脏谱、itek_history 逐次迭代全量保真、fmt_abn powf 溢出饱和
  - 用户配置真正接通:tlusty_chain/tlusty_input 由死字段经 调度器→TaskSpec→executor→runner
    透传生效;config 加载期 validate + deny_unknown_fields + 解析失败记 warn
  - 调度修复:H1 活锁(pending_strategies 跳过已失败策略)、种子查找错误不再静默降级冷启动
  - dashboard: 阶段配置面板 tlusty_stage/synspec_stage、"已完成"标签、迭代诊断展示
  - docs: 新增 database_refactor_design.md,同步 database/api/PIPELINE/workflow_detail
This commit is contained in:
fmq
2026-08-06 20:51:21 +08:00
parent cd370d88e7
commit d16b3d3cdc
61 changed files with 10268 additions and 5881 deletions
+35
View File
@@ -117,6 +117,41 @@ test('triggerNow() 立即触发一次并续排', async () => {
stub.restore();
});
test('triggerNow() 与在途 schedule 不并发执行 fninFlight 守卫)', async () => {
const stub = installDocStub();
const timers = captureTimers();
let active = 0; // 当前正在执行的 fn 数(应恒 ≤1)
let maxActive = 0;
let calls = 0;
// fn 是慢异步:用 gate 控制其完成时机,确保 triggerNow 落在它在途时。
let resolveFn = null;
const fn = () => {
active++;
maxActive = Math.max(maxActive, active);
calls++;
return new Promise((resolve) => { resolveFn = resolve; });
};
const p = createPoller(fn, { baseMs: 5000 });
const startP = p.start(); // 触发首次 schedulefn 在途,停在 await
// 让 start 的 schedule 进入 fn()——通过一次微任务边界。
await Promise.resolve();
await Promise.resolve();
// 此时 fn 在途(calls=1active=1)。triggerNow 应受 inFlight 守卫直接 return
// 不再起一个新的 schedule 并发跑 fn。
const triggerP = p.triggerNow();
await Promise.resolve();
await Promise.resolve();
// 完成 fn(在途的 schedule 才会推进)。
resolveFn(true);
await Promise.all([startP, triggerP]);
active = 0; // fn 已完成
assert.equal(calls, 1, 'triggerNow 不得并发触发第二次 fninFlight 守卫)');
assert.equal(maxActive, 1, 'fn 不得并发执行(maxActive 应为 1');
p.stop();
timers.restore();
stub.restore();
});
test('退避上限 maxMs 生效(长时间连续失败不无限增长)', async () => {
const stub = installDocStub();
const timers = captureTimers();