Record cash-desk errors and timestamps in the gemini attempt journal so the order verdict rests on a complete log

This commit is contained in:
heaven 2026-08-14 21:52:42 +03:00
parent 8acb4e4048
commit 6a34d9b5d6

View file

@ -74,7 +74,14 @@ def text_of(uid: str) -> str:
def log_attempt(rec: dict) -> None:
"""Журнал попытки — ДОПИСЫВАЕТСЯ немедленно. Вердикт без него заказ не принимает."""
"""Журнал попытки — ДОПИСЫВАЕТСЯ немедленно. Вердикт без него заказ не принимает.
ВРЕМЯ ОБЯЗАТЕЛЬНО. Первая редакция писала длительность вызова, но не МЕТКУ ВРЕМЕНИ, и
`--status` считал окно журнала как 0.0 ч на любом числе попыток. Заказ принимает вердикт
«модель не отдаёт» ТОЛЬКО по журналу за 24 ч без метки времени доказать окно нечем,
то есть журнал не выполнял свою единственную задачу.
"""
rec.setdefault("ts", time.time())
JOURNAL.parent.mkdir(parents=True, exist_ok=True)
with JOURNAL.open("a", encoding="utf-8") as f:
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
@ -130,6 +137,18 @@ def cmd_run() -> None:
log_attempt(dict(uid=uid, attempt=i + 1, ok=False, code="GUARD",
secs=round(time.time() - t0, 1), cost_usd=0.0))
raise SystemExit(f"⛔ ГАРД ОТКАЗАЛ на {tag(uid)} — СТОП и вопрос владельцу")
# ⚠ ОТКАЗ, ПОЙМАННЫЙ КАССОЙ, — ТОЖЕ ПОПЫТКА. `purchase` перехватывает ошибку API
# сама и пишет карантинную запись `finish="error"`, поэтому мой `except` не
# срабатывает и журнал показывал «отказов 0» при двух реально ошибившихся клетках.
# Вердикт заказа держится на журнале, значит журнал обязан видеть и этот путь.
if rec.get("finish") == "error" or not (rec.get("content") or "").strip():
log_attempt(dict(uid=uid, attempt=i + 1, ok=False,
code=rec.get("finish") or "empty",
err=str(rec.get("error"))[:200],
secs=round(time.time() - t0, 1),
cost_usd=rec.get("cost_usd", 0.0)))
print(f" {uid}: попытка {i + 1} — касса вернула {rec.get('finish')}")
continue
cost = rec.get("cost_usd", 0.0)
log_attempt(dict(uid=uid, attempt=i + 1, ok=True, code=200,
finish=rec.get("finish"), secs=round(time.time() - t0, 1),