From ad045ddf9c6112e228d5e3d6b2772c028b86cc71 Mon Sep 17 00:00:00 2001 From: yibo Date: Sun, 30 Aug 2026 23:50:16 +0800 Subject: [PATCH] fix(tests): 修掉此前被误判为"环境噪音"的 3 个真单测失败 --- server/services/graph-seed-service.js | 6 ++++-- server/tests/unit/graduation-criteria-reality.test.js | 10 +++++++--- server/tests/unit/graph-engine-extend-budget.test.js | 7 ++++++- system/agents/sdd-planning/SKILL.md | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/server/services/graph-seed-service.js b/server/services/graph-seed-service.js index 5acd307..2ed5080 100644 --- a/server/services/graph-seed-service.js +++ b/server/services/graph-seed-service.js @@ -458,8 +458,10 @@ function seedAgents() { // **只写不降级**:config.json 里的 status 是本体的**出生默认值**,而毕业与否是运行时 // 从磁盘定义学到的事实(promoteDraftIfComplete / reconcile 的 E 分支)。原样 upsert 的话, // 每次进程重启 seedAgents 都会把已经转正的行按 config.json 打回 draft/training —— - // 闸门抬起来一次、下次启动又落下去,而且一处报错都没有(code-planner 的 config.json - // 至今写着 "training")。所以:库里已经脱离未毕业域的行,不许再被推回去;其余照写。 + // 闸门抬起来一次、下次启动又落下去,而且一处报错都没有(真实撞过的样本是 code-planner, + // 它的 config.json 当时写着 "training",见 `graduation-criteria-reality.test.js`; + // 后来 config.json 已经改成了毕业态的 "enabled",这条注释只留问题形状,不再钉死具体值, + // 避免又变成一处会随源码变化过期的死引用)。所以:库里已经脱离未毕业域的行,不许再被推回去;其余照写。 const status = (existing && isUngraduatedStatus(configStatus) && !isUngraduatedStatus(existing.status)) ? existing.status : configStatus; diff --git a/server/tests/unit/graduation-criteria-reality.test.js b/server/tests/unit/graduation-criteria-reality.test.js index 0b331d2..f8c1caf 100644 --- a/server/tests/unit/graduation-criteria-reality.test.js +++ b/server/tests/unit/graduation-criteria-reality.test.js @@ -196,10 +196,14 @@ describe.skipIf(!fs.existsSync(CODE_PLANNER_DIR))('code-planner 能被新公司é expect(r.graduated).toContain('code-planner'); expect(statusOf()).toBe('active'); - // seedAgents 会把 config.json 的 status 原样 upsert —— 它写着 "training"。 - // 不加「只写不降级」的话,这里会把刚转正的行打回去,每次进程重启都重演一遍。 + // seedAgents 会把 config.json 的 status 原样 upsert。「只写不降级」守的是「不许被 + // config.json 推回 draft/training」,**不**保证转正后的值原样不变——config.json 当前 + // 写的是什么已毕业状态("enabled" 也好、别的也好,只要不是 draft/training),upsert 就会 + // 用那个值覆盖,这是设计如此,不是本用例要测的东西(2026-08-30 复核:config.json 已经从 + // 写死的 "training" 改成了 "enabled",不再硬编码具体值,避免这条测试再次因为 config.json + // 内容变化而假红)。 seed.seedAgents(); - expect(statusOf()).toBe('active'); + expect(graphService.isUngraduatedStatus(statusOf())).toBe(false); // 幂等:第二遍没有可转正的行 expect(seed.reconcileDanglingRows().graduated).toEqual([]); diff --git a/server/tests/unit/graph-engine-extend-budget.test.js b/server/tests/unit/graph-engine-extend-budget.test.js index cff16d6..8dd2030 100644 --- a/server/tests/unit/graph-engine-extend-budget.test.js +++ b/server/tests/unit/graph-engine-extend-budget.test.js @@ -36,7 +36,12 @@ describe('extendBudget · 追加预算并结清卡死的墙钟锚点', () => { beforeEach(() => wdb.getDb().prepare('DELETE FROM graph_runs').run()); it('run_b962ea87f58f 的真实形态:追加后立即可用,且锚点被断开', () => { - const stuckStartedAt = '2026-08-23T05:23:52.886Z'; // 距 now() 已远超 2h + // ⚠️ 曾经硬编码成绝对时间戳 '2026-08-23T05:23:52.886Z'(真实事故发生时的时刻)—— + // 这是一颗时间炸弹:随真实时间流逝,这个绝对值与 Date.now() 的差值只会越来越大, + // 迟早会超过下面追加后的 6h 上限,让断言从「追加后立即可用」变成「怎么追加都不够」, + // 而这条红跟被测代码毫无关系。改成相对 Date.now() 回退 3 小时——同时满足 + // 「超过追加前 2h 上限」与「低于追加后 6h 上限」,且不会随时间推移而漂移。 + const stuckStartedAt = new Date(Date.now() - 3 * HOUR).toISOString(); const run = seedRun('r_stuck', { total_agent_calls: 100, total_tokens: 5_000_000, wallclock_ms: 2 * HOUR, spent: { agent_calls: 35, tokens: 249_324, active_ms: 0, started_at: stuckStartedAt }, diff --git a/system/agents/sdd-planning/SKILL.md b/system/agents/sdd-planning/SKILL.md index bb2f18d..c71be79 100644 --- a/system/agents/sdd-planning/SKILL.md +++ b/system/agents/sdd-planning/SKILL.md @@ -3,7 +3,7 @@ > 本版本为 Evolve 训练产出(v1,首次训练)。基线为生产版 `system/agents/sdd-planning/agent.md`, > 仅强化「接口契约」「数据形态」两类的执行深度指导,其余框架(五类东西结构、 > `contract.json`/`attempt-{n}.json` 模板、越权判断)与基线一致,未重写。 -> 训练依据:`../hunt/knowhow_v1.md` + `../digest/benchmark_v1.md`(D2 判据可独立复现性,权重30+封顶)。 +> 训练依据:`train/hunt/knowhow_v1.md` + `train/digest/benchmark_v1.md`(D2 判据可独立复现性,权重30+封顶)。 ## 身份定位 -- libgit2 0.21.4