Fix silent cross-pack cash misroute: buy is a singleton and the last configurer won, so paid cells landed in another pack directory while the phase ledger read zero

This commit is contained in:
Claude (backend session) 2026-08-10 17:11:22 +03:00
parent 488d1d0b8d
commit 4f698106e9

View file

@ -51,6 +51,20 @@ BANK = _load("bank22", REPO / "eval" / "tenant_panel" / "bank.py")
ROSTER = _load("roster22", REPO / "eval" / "tenant_panel" / "roster.py")
ED22 = _load("editors22", REPO / "eval" / "tenant_panel" / "editors.py")
# ⚠⚠ КАССУ ПЕРЕ-НАСТРАИВАЕМ ПОСЛЕ ВСЕХ ЧУЖИХ ЗАГРУЗОК, И ЭТО НЕ ПЕДАНТИЗМ.
# Модуль `buy` — СИНГЛТОН в `sys.modules`, и побеждает тот, кто настроил его последним. `money_d`
# ставил `BUY.OUT` на каталог фазы, а грузившийся следом `panel.py` пака 23 тянул его кассу и
# перебивал обратно на `~/books/editor-tier`. Итог был бесшумным и дорогим: кэш-чек, замок и
# `finally` смотрели в каталог фазы, а РЕЗУЛЬТАТ писался в каталог чужого пака. Семь оплаченных
# клеток ушли туда, касса фазы показывала $0, а цикл покупки 20 минут ждал появления файла,
# который в её каталоге не появился бы никогда. Найдено многоагентным разбирательством 10.08.
MONEY.M22.configure(ZONE=ZONE.parent / "dovodka", OUT=MONEY.OUT, TAGS=MONEY.TAGS,
CEILINGS=MONEY.CEILINGS, PACK_CEILING=MONEY.PACK_CEILING,
GLOB_ALL="dv-*.json", ROSTER=ROSTER)
if MONEY.M22.BUY.OUT != MONEY.OUT: # ассерт, а не надежда
raise SystemExit(f"⛔ buy.OUT={MONEY.M22.BUY.OUT} против кассы {MONEY.OUT}"
"покупки уедут в чужой каталог, СТОП")
OUT = MONEY.OUT
ANCHOR = "deepseek-v4-flash" # якорный черновик
FIXER = "deepseek-v4-pro" # фиксер и критик — боевой редакторский движок
@ -212,6 +226,9 @@ def cmd_selftest() -> int:
tags = {tag(a, u["uid"]) for a in ARMS}
ck("теги армов различны", len(tags) == len(ARMS))
ck("теги покрыты глобом кассы", all(t.startswith(("dv-a-", "dv-f-")) for t in tags))
# ⚠ Главный ассерт этого харнесса: кэш-чек и ЗАПИСЬ результата смотрят в ОДИН каталог.
ck("buy.OUT совпадает с кассой фазы", MONEY.M22.BUY.OUT == MONEY.OUT,
f"{MONEY.M22.BUY.OUT} против {MONEY.OUT}")
print(f"\n{'ХАРНЕСС ГОДЕН' if not bad else f'ПРОВАЛОВ: {bad}'}")
return bad
@ -256,7 +273,11 @@ def cmd_run(which: list[str]) -> None:
MONEY.purchase(led, ct, FIXER, ED22.client(FIXER),
ROSTER.call_kwargs(FIXER, crit_msgs(src, draft)),
role="critic", uid=uid, arm=arm)
found = json.loads((OUT / f"{ct}.json").read_text(encoding="utf-8")).get("content") or ""
cf = OUT / f"{ct}.json"
if not cf.exists(): # оплачено, но файла нет — не падать
print(f" {uid}/{arm}: критик не отдал файл — арм пропущен, объявить в отчёте")
continue
found = json.loads(cf.read_text(encoding="utf-8")).get("content") or ""
places = [ln.strip("- ").strip() for ln in found.splitlines() if ln.strip().startswith("-")]
if not places:
print(f" {uid}/{arm}: критик не нашёл мест — фиксер не зовётся")