From 3b3e3d17e972bc908e98d4160e1183ad766b3b1e Mon Sep 17 00:00:00 2001 From: Simbiot Harness Date: Sat, 3 Oct 2026 10:14:54 +0000 Subject: [PATCH] =?UTF-8?q?scheduler:=20=D0=B1=D0=B0=D1=82=D1=87-=D1=84?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=A2=D0=9E=D0=9B=D0=AC=D0=9A=D0=9E=20=D0=B5?= =?UTF-8?q?=D1=89=D1=91-running=20(=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9=20?= =?UTF-8?q?=5Flog-=D1=81=D1=82=D0=B0=D0=B1=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Воркер мог сам решить судьбу задачи: complete (done), requeue (ready), close в архив (closed). Дайджест тика больше не перезаписывает его решения TaskCompleted'ом — иначе requeue'd задачи нечестно закрывались бы дайджестом (поверх проверенного результата «последний-победил»). found при e-261003094432 --- harness/scheduler.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/harness/scheduler.py b/harness/scheduler.py index dc59609..ba855cb 100644 --- a/harness/scheduler.py +++ b/harness/scheduler.py @@ -539,19 +539,23 @@ def run_level_tick(level_cfg, seq: int, model: dict): # ЗАКРЫТЬ задачу сам (cli complete) ещё до батч-фазы — его TaskCompleted # содержит целевой ответ; повторный append поверх перезаписал бы answer # дайджестом тика и испортил бы проверенный результат (перезапись - # «последний-победил» в проекции). Закрываем только ещё-running. - _model = es.run_projections() or {} # стаб/None в тестах — не валим - _tasks = _model.get("tasks") or {} - _done = {tid for tid in (claimed or []) - if (_tasks.get(tid) or {}).get("status") == "done"} - _first = True - for tid in (claimed or []): - if tid in _done: - if _first: - _log("skip батч-догзакрытие готовых задач: " - + ", ".join(sorted(_done))) - _first = False - continue + # «последний-победил» в проекции). ЗАКРЫВАЕМ ТОЛЬКО ЕЩЁ-RUNNING: + # воркер мог решить сам — complete (done), requeue (готово) или + # закрыть в архив (closed); дайджест тика не перезаписывает его + # решения (авто-схлопывание фейлов, e-261003094432: без этого фикса + # requeue'd задачи нечестно закрывались бы дайджестом). + _model = es.run_projections() + if _model is None: + # стаб/None в тестах (mocked es) — прежний путь: закрываем все claimed + _resolve = list(claimed or []) + else: + _tasks = _model.get("tasks") or {} + _resolve = [tid for tid in (claimed or []) + if (_tasks.get(tid) or {}).get("status") == "running"] + _skipped = sorted(set(claimed or []) - set(_resolve)) + if _skipped: + _log("skip батч-догзакрытие задач, решённых воркером: " + ", ".join(_skipped)) + for tid in _resolve: es.append_event("task", tid, "TaskCompleted", { "result_ref": trace_id, "answer": (text or "")[:2000], })