From 3ca49362126b902bb6e63681d34de9276345f38e Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 16 Aug 2026 22:27:32 +0300 Subject: [PATCH] Raise the run ceilings to the re-priced estimate and trim closed phases to actuals --- eval/dovodka/SESSION2-LOG.md | 44 +++++++++++++++++++++++++++++++++ eval/dovodka/money_d.py | 27 +++++++++++++++++--- eval/dovodka/zakhod.py | 48 ++++++++++++++++++++++++++++++++---- 3 files changed, 110 insertions(+), 9 deletions(-) diff --git a/eval/dovodka/SESSION2-LOG.md b/eval/dovodka/SESSION2-LOG.md index 5e69cec9..7a1e4851 100644 --- a/eval/dovodka/SESSION2-LOG.md +++ b/eval/dovodka/SESSION2-LOG.md @@ -413,3 +413,47 @@ zh Спирмен +0.80 (прокси держится, но `A3` — ставк **Пре-рег Д17** записан в отчёт ДО покупок: панель, правило решения, формула порога, мощность, статус осей, чего заход не может. Правило расхождения эндпойнтов объявлено ДО данных: при расхождении счёта и чтения побеждает ЧТЕНИЕ (приоритет владельца «живой язык»). + +## 13. БЭКЛОГ: ЭКОНОМИКА МОДЕЛЕЙ ПОСЛЕ ПОДОРОЖАНИЯ (16.08) — НЕ основная линия + +Записано по указанию владельца: «это всё можно в какой-то бэклог занести… но нам важно по плану +идти». Ниже — замер, а не мнение; к основному вопросу фазы (мерит ли счёт то, что нужно продукту) +он отношения не имеет и работу не двигает. + +**Ростер пере-пинен** (`eval/tenant_panel/roster.py`, отдельным коммитом с заголовком чужого пака): +DeepSeek на пик `flash $0.44/$1.32/кэш $0.014` · `pro $1.32/$3.96/кэш $0.044`. Гейты эксп-22 +пере-сняты после правки — `verify22.py` «ВСЕ ЧИСЛА ОТЧЁТА СХОДЯТСЯ», `itog22.py` зелен: числа +чужого пака не поехали, потому что `cost_usd` записан в клетку при покупке, а не вычисляется. + +**Пере-оценка КАЖДОЙ замеренной клетки по сегодняшнему прайсу (медианы):** + +| роль | модель | было $/клетка | стало | рост | +|---|---|---|---|---| +| черновик | `gpt-5.6-luna` | 0.00358 | 0.00358 | — | +| черновик | `gemini-3.1-flash-lite` | 0.00383 | 0.00383 | — | +| черновик | **`deepseek-v4-flash`** | **0.00097** | **0.00444** | ×4.59 | +| редактор | `glm-5` | 0.01163 | 0.01163 | — | +| редактор | **`deepseek-v4-pro`** | **0.00537** | **0.02235** | ×4.16 | + +**Вывод 1 — правило ничьей на ЧЕРНОВОЙ роли пере-решается.** Эксп-22 Ф2 дал ничью по качеству +шести моделей, и роль ушла к самому дешёвому (правило D39.117). Flash был в 3.7× дешевле +следующего; теперь он ДОРОЖЕ и `gpt-5.6-luna`, и `gemini-3.1-flash-lite`. По букве нашего же +правила черновая роль обязана быть пере-выбрана. ⚠ Перед этим — эхо-проба альтернатив: у flash +эхо-мина есть и она перевооружается ослабленным thinking, у остальных не мерена НИ РАЗУ. + +**Вывод 2 — редакторская роль правилом ничьей НЕ решается**, качество там не равно: `dspro` +лучше `glm-5` на zh (−2.12) и en (−1.41), не различимо на ja. Но выбор перестал быть бесплатным: +было «лучше И вдвое дешевле», стало «лучше, но вдвое дороже». Это продуктовое решение владельца, +а не вывод полигона. + +**Себестоимость главы** (черновик + перепис): было $0.0063 → сейчас той же связкой $0.0268 → +на паре `flash-lite + glm-5` $0.0155. На книге в 1500 глав: $9.5 → $40.2 → $23.2. + +**Дыра, которую замер не закрывает: вендор-риск не мерился вовсе.** 16.08 он материализовался — +кончился баланс одного провайдера, встал весь заход (96 отказов `402`, $0). Не проверялось: +держит ли пайплайн смену жильца без правки промтов; есть ли у альтернатив своя эхо-мина. + +**Почему внутри захода Д17 модель всё равно одна.** Заход меряет АРХИТЕКТУРУ (число проходов, +что кому подаётся). Контраст мерит топологию только при модели-константе — иначе это конфаундер +эксп-19. Цена этого: вывод честно звучит «какая архитектура лучше ДЛЯ ЭТОЙ модели». Переносимость +закрывается отдельным дешёвым замером ПОСЛЕ захода: победившая архитектура на `glm-5`. diff --git a/eval/dovodka/money_d.py b/eval/dovodka/money_d.py index 88142d2e..6fac9d9d 100644 --- a/eval/dovodka/money_d.py +++ b/eval/dovodka/money_d.py @@ -173,10 +173,29 @@ TAGS = { # после перелома, пока `roster.py` не пере-пинен, — иначе касса начнёт печатать неправду. # ⚠ ПАКЕТНЫЙ ПОТОЛОК $6.85 → $8.15 РОВНО НА ДЕЛЬТУ новых фаз плюс $0.02, чтобы инвариант # «сумма фазовых ≤ пакетного» держался (8.12 ≤ 8.15). Ни одна прежняя фаза не двигается. -CEILINGS = {"ФД-A": 1.950, "ФД-B": 0.950, "ФД-C": 0.420, "ФД-D": 0.050, - "ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210, "ФД-H": 0.150, - "ФД-I": 0.650, "ФД-J": 0.650} -PACK_CEILING = 8.15 +# ⚠⚠ ПОДЪЁМ 16.08 ПОСЛЕ ПЕРЕЛОМА ПРАЙСА DeepSeek — И ЭТО ПЕРЕСЕЧЕНИЕ РАМКИ ЗАКАЗА, СКАЗАННОЕ +# ВСЛУХ. Заказ (:20) ставил пакетный потолок фазы $10.00. Смета остатка захода, пере-считанная по +# ПИКОВОМУ пину (`zakhod.price_of`, из токенов уже купленных клеток): zh $2.80 + en $1.66 = $4.46. +# С потраченными $6.25 это $10.71 — то есть на $0.71 выше рамки заказа. +# ⚠ ЧТО ЗДЕСЬ ФАКТ, А ЧТО ОЦЕНКА: спишется вдвое меньше. Вендорские пиковые часы — 01:00–04:00 и +# 06:00–10:00 UTC, покупка идёт в офф-пик, где цена ровно половинная ⇒ фактический расход остатка +# ~$2.23, фактический итог фазы ~$8.5. Касса при этом БУКИРУЕТ пик осознанно (D39.136): потолок +# обязан срабатывать раньше, а не позже, и переплата резерва — цена плоской схемы. +# ⚠ ОСНОВАНИЕ, ДОСЛОВНО И БЕЗ УКРАШЕНИЙ. Санкции владельца: 15.08 «Подтверждаю подъём расходов, +# сколько тебе нужно»; 16.08 «Новые траты я разрешаю, перепровести эксп я разрешаю»; 16.08 он +# пополнил баланс DeepSeek специально под продолжение. Число $4.46 и пересечение рамки $10.00 были +# названы ему В СООБЩЕНИИ ДО подъёма; ответ был «нам важно по плану идти». Прямого «да» на само +# число не прозвучало — записываю это как есть, а не как одобрение, потому что цепь подъёмов +# фазы уже однажды прошла все самопроверки именно на таких формулировках (см. шапку файла). +# ⚠ ЗАКРЫТЫЕ ФАЗЫ ПОДРЕЗАНЫ ДО ФАКТА, И ЭТО УЖЕСТОЧЕНИЕ, А НЕ ПОСЛАБЛЕНИЕ. Инвариант кассы — +# «сумма фазовых потолков ≤ пакетного»; при живых потолках закрытых фаз он требовал пакетного +# 11.72, то есть разрешал тратить запас осей, которые давно куплены и больше ничего не купят. +# Подрезка до факта +1 цент возвращает инварианту смысл: максимум возможного расхода фазы теперь +# равен фактически потраченному плюс то, что нужно заходу, и ни центом больше. +CEILINGS = {"ФД-A": 1.910, "ФД-B": 0.900, "ФД-C": 0.370, "ФД-D": 0.050, + "ФД-E": 2.290, "ФД-F": 0.500, "ФД-G": 0.060, "ФД-H": 0.090, + "ФД-I": 2.950, "ФД-J": 1.800} +PACK_CEILING = 11.00 M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS, PACK_CEILING=PACK_CEILING, GLOB_ALL="dv-*.json", ROSTER=ROSTER) diff --git a/eval/dovodka/zakhod.py b/eval/dovodka/zakhod.py index b5b50733..9bf4d3c7 100644 --- a/eval/dovodka/zakhod.py +++ b/eval/dovodka/zakhod.py @@ -502,7 +502,39 @@ def buy(p: str, which: list[str]) -> None: # ── СМЕТА И ПРОВЕРКИ ────────────────────────────────────────────────────────────────────────── -PRICE = {"Z8": 0.00060, "Z8R": 0.00790, "Z1": 0.00900, "Z7": 0.00758, "ZF": 0.00790} +# ⚠ СМЕТА СЧИТАЕТСЯ ПО ТЕКУЩЕМУ ПРАЙСУ, А НЕ ПО ЗАШИТЫМ МЕДИАНАМ (починка 16.08). Первая +# редакция несла медианы, снятые при ИЮЛЬСКОМ пине, и после пере-пина продолжала печатать те же +# числа со строкой «по действующему прайсу» — то есть смета врала вчетверо и врала уверенно. +# Теперь цена арма выводится из ЗАМЕРЕННЫХ ТОКЕНОВ уже купленных клеток той же роли и +# пере-оценивается ростером; зашитых цен в файле не остаётся вовсе. +ROLE_OF = {"Z8": "translator", "Z8R": "editor", "Z1": "editor", "Z7": "fixer", "ZF": "floor2"} +MODEL_OF = {"Z8": DRAFT_MODEL, "Z8R": EDITOR, "Z1": EDITOR, "Z7": EDITOR, "ZF": EDITOR} + + +def price_of(arm: str) -> float: + """Ожидаемая цена клетки арма по ТЕКУЩЕМУ прайсу, из токенов уже купленных клеток той же роли.""" + import statistics as _st + m, role = MODEL_OF[arm], ROLE_OF[arm] + toks = [] + for f in OUT.glob("dv-*.json"): + if any(x in f.name for x in ("ERROR", "ЭХО", "LENGTH", "probe")): + continue + try: + r = json.loads(f.read_text(encoding="utf-8")) + except Exception: # noqa: BLE001 + continue + if not isinstance(r, dict) or r.get("model") != m or not r.get("prompt_tokens"): + continue + if r.get("role") not in (role, "editor" if role == "floor2" else role): + continue + toks.append((r["prompt_tokens"], + r.get("cached_tokens") or r.get("prompt_cache_hit_tokens") or 0, + r.get("completion_tokens") or 0, r.get("reasoning_tokens") or 0, + r.get("total_tokens") or 0)) + if not toks: + return 0.02 + med = [_st.median([x[i] for x in toks]) for i in range(5)] + return ROSTER.cost(m, int(med[0]), int(med[1]), int(med[2]), int(med[3]), int(med[4])) WHAT = {"Z8": "обогащённый черновик (flash + мандат перевёрстки)", "Z8R": "Z8 + боевой перепис — «лучше ли связка на лучшем черновике»", "Z1": "критик → ПОЛНЫЙ перепис по его замечаниям", @@ -525,9 +557,10 @@ def cmd_dry() -> None: for a in ARMS: have = sum(1 for u in us if cell(tag(p, a, u["uid"])).strip()) need = len(us) - have - cost = need * PRICE[a] + pr = price_of(a) + cost = need * pr sub += cost - print(f" {a:4s} есть {have:2d} · надо {need:2d} · ${PRICE[a]:.5f}/кл · " + print(f" {a:4s} есть {have:2d} · надо {need:2d} · ${pr:.5f}/кл · " f"смета ${cost:.4f} {WHAT[a]}") ph = _pair(p)["phase"] sp = MONEY.Guarded(ph).spent() if ph in MONEY.CEILINGS else 0.0 @@ -535,8 +568,13 @@ def cmd_dry() -> None: mark = "ВЛЕЗАЕТ" if sub <= ceil - sp else f"НЕ ВЛЕЗАЕТ (не хватает ${sub - (ceil - sp):.4f})" print(f" ИТОГО ${sub:.4f} · потолок {ph} ${ceil:.2f} · потрачено ${sp:.4f} → {mark}") tot += sub - print(f"\nВЕСЬ ЗАХОД: ${tot:.4f} по действующему (июльскому) прайсу DeepSeek.") - print(f"После перелома 16:00 UTC 16.08 та же работа стоила бы ${tot * 3.0:.4f} (пик ×3).") + now = dt.datetime.now(dt.timezone.utc) + peak = now.hour in tuple(range(1, 4)) + tuple(range(6, 10)) + print(f"\nВЕСЬ ЗАХОД: ${tot:.4f} по ТЕКУЩЕМУ пину ростера (пик).") + print(f" Сейчас {now:%H:%M} UTC — {'ПИК' if peak else 'ОФФ-ПИК'}; вендорский офф-пик ровно " + f"вдвое дешевле, то есть фактически спишется около ${tot if peak else tot / 2:.4f}.") + print(" ⚠ Касса пишет ПИКОВУЮ цену осознанно (политика D39.136): потолок срабатывает раньше,\n" + " а не позже; переплата резерва в офф-пик — цена простоты плоской схемы.") def cmd_selftest() -> int: