textmachine/eval/dovodka/money_d.py

193 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""КАССА ФАЗЫ Д. $0 сама по себе; через неё идут ВСЕ платные вызовы фазы.
Не копия кассы эксп-22, а её НАСТРОЙКА через `configure` — тот же приём, которым пользовался пак
23. Механизм там проверенный и дорого доставшийся: фриз-гейт (покупка отказывает коду, который не
закоммичен или отличается от закоммиченного), атомарный замок клетки `O_CREAT|O_EXCL`, проекционный
сторож перед КАЖДЫМ вызовом по цене ИМЕННО ЭТОЙ модели, два независимых пути счёта. Копирование
размножило бы будущие расхождения вместо того, чтобы их ловить.
ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $5.40 (11.08). История цифры: промт называл $10.00, владелец при
запуске сказал $4.00, затем поднял до $4.50, когда приёмка другого модельного семейства нашла, что
дизайн не отвечает на H-1 и H-4, а починка стоит $0.48. 11.08 ревью 82 находок показало, что смета
занижала фиксера в 2.41× и фаза не влезает в $4.50 ни при каком порядке покупок; владелец выбрал
вариант «всё как заказано» и поднял потолок до $5.40.
РЕЗЕРВ ФАЗЫ $0.00 — и это объявлено риском ДО покупок ВТОРОЙ раз. При $4.50 резерв был $0.03,
и первый же промах сметы остановил ось Д4 на 22 клетках из 32. При $5.40 остатка нет вовсе:
честная смета остатка $4.277 плюс потраченные $1.140 дают $5.417, то есть уже $0.017 сверх
санкции, и Д1 добирает 15 клеток вместо 16 именно поэтому. Резерв 8% на ре-гены (история паков
22/23 — до +16%) потребовал бы $5.85. Сказано ДО покупок, а не после.
Поэтому правило исполнения жёсткое и записано здесь, а не в прозе:
**срабатывание проекционного гарда = СТОП и вопрос владельцу.** Резать ось, панель или кандидата
решением сессии ЗАПРЕЩЕНО заказом; поднимать потолок себе — тем более (пак 23 так и сделал, и это
стоило ему пункта CONFIRM/DENY).
Запуск: money_d.py [--report|--selftest]
"""
from __future__ import annotations
import sys
from pathlib import Path
REPO = Path("/home/ubuntu/projects/textmachine")
ZONE = Path(__file__).resolve().parent
sys.path.insert(0, str(ZONE))
sys.path.insert(0, str(REPO / "eval" / "tenant_panel"))
sys.path.insert(0, str(REPO / "eval" / "role_topology"))
def _load(name: str, path: Path):
"""⚠ Чужое — ТОЛЬКО по пути. `import money` находил кассу эксп-22 или сам себя, смотря по
порядку `sys.path.insert`; пак 23 напоролся на это четырежды, и один раз молча."""
import importlib.util # noqa: PLC0415
spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
sys.modules[name] = mod
spec.loader.exec_module(mod)
return mod
M22 = _load("money22", REPO / "eval" / "tenant_panel" / "money.py")
ROSTER = _load("roster22", REPO / "eval" / "tenant_panel" / "roster.py")
OUT = Path.home() / "books" / "dovodka"
# Теги покупок по фазам. ⚠ Новый тег вписывается СЮДА тем же коммитом, что и код, который его
# заводит: расход мимо глоба невидим для кассы, и эксп-21 напоролся на это трижды, а последний
# раз гейт заниженное число ещё и СЕРТИФИЦИРОВАЛ.
TAGS = {
"ФД-A": ("dv-a-*.json",), # Д4 edit-контур zh: A1 A2 A3 A4 + свой шумовой пол
"ФД-B": ("dv-b-*.json",), # Д3 en→ru несущая ось: банк, контам, армы, пол
"ФД-C": ("dv-c-*.json",), # Д6 ja→ru разведка
"ФД-D": ("dv-d-*.json",), # Д7 микро-проба самооценки
"ФД-E": ("dv-e-*.json",), # Д1 добивка gemini-3.1-pro-preview
"ФД-F": ("dv-f-*.json",), # H-1: A6 dspro-черновик + оба контура
"ФД-G": ("dv-g-*.json",), # H-4: E6 второй редактор на en
}
# ⚠ Потолки фаз = смета `plan.py` плюс МИНИМАЛЬНЫЙ запас, так чтобы их СУММА не превышала
# пакетный потолок. Первая редакция округляла каждый вверх до цента и дала сумму 4.54 > 4.50 —
# то есть фазовые гарды в совокупности разрешали пробить пакетный. Поймано селфтестом кассы
# ДО первой покупки; ровно этот класс («касса охраняет не ту границу») стоил эксп-21 денег трижды.
#
# ⚠⚠ ПЕРЕ-РАСКЛАДКА 11.08 ПОД САНКЦИЮ $5.40. Прежняя раскладка стояла на смете, где фиксер положен
# в 0.60× переписа, а замерен в 2.41× (`plan.py` сверяет прогноз с фактом и печатает расхождение).
# Из-за этого ФД-A исчерпалась на 22 клетках арма A4 из 32, а арм A2 не куплен ни разу. Новая
# раскладка считана по ЗАМЕРЕННЫМ ценам 148 купленных клеток фазы, а не по прогнозу.
#
# ⚠ ПРИОРИТЕТ ВНУТРИ ФД-A ОБЪЯВЛЯЕТСЯ ЗДЕСЬ: ПЕРВЫМ покупается СВОЙ ШУМОВОЙ ПОЛ. Причина не
# бухгалтерская, а решающая: при заимствованном прайоре sd 2.12 и честном квантиле Стьюдента все
# три первичных контраста оси Д4 НЕДОМОЩНЫ (MDE 1.67…2.32 против цели 1.50). Несущей ось делает
# только СВОЙ пол — при sd ≤ 1.91 контрасты A1/A0 и A3/A0 становятся несущими. Покупать армы,
# не зная пола, значит рисковать всей сметой оси, которая может не дать вывода ни при каком исходе.
#
# ⚠ ПОТОЛОК ПОДНЯТ ДО $6.00 (санкция владельца 11.08). При $5.40 за борт выходила 16-я клетка
# gemini, а пре-рег Д0.3 говорит прямо: несущей ось Д1 делают ПОЛНЫЕ 16. При $6.00 влезает всё
# заказанное, включая расширение базы H-1 на новые единицы (без него носитель H-1 при n=16
# недомощен по построению — эррата Э-2/Э-3), и остаётся резерв 3.2%.
#
# ⚠ СУДЕЙСТВО СТОИТ $0 И ЗДЕСЬ НЕ ЗАЛОЖЕНО НИ ЦЕНТА — это норма заказа, подтверждённая владельцем
# 11.08 дословно: «НИКАКИХ ВЫЗОВОВ ПО АПИ, всё локально у нас на харнесах». Судей двое и оба
# бесплатны: агент-сессии (кап 80, `runs.py`) и локальный харнесс Sol 5-6 владельца — второе
# мнение о МОЁМ судействе и моей слепоте. Появление платного судьи в смете = дефект, не оптимизация.
#
# ⚠ ФД-D = РОВНО $0.05, а не $0.055. Заказ несёт единственный явный денежный кэп на платный пункт
# («Д7 — микро-проба самооценки ≤$0.05», промт :119), и прежний запас 10% его пробивал, тогда как
# на всех прочих фазах запас 0.11.1%. Поймано ревью 11.08.
# ⚠ ФД-A 1.660 → 1.680 (санкция владельца 11.08, одна строка «Добро»). Гард отказал на ПОСЛЕДНЕЙ
# клетке арма A1B: свободно было $0.0154 при резервируемом ожидании $0.0159 — не хватило половины
# цента. Причина промаха названа: A1B вышел вдвое дороже A1 ($0.0136 против $0.0069), а смета
# закладывала 1.30× (мест 181 против 74 — промт длиннее, и множитель недооценён на 52%).
# Это ПЕРЕКЛАДКА внутри санкционированного пакета, пакетный потолок $6.00 не двигается; сумма
# фазовых потолков 5.83 ≤ 6.00. Спрошено потому, что срабатывание гарда = вопрос владельцу по
# заказу, а пак 23 потерял пункт CONFIRM/DENY ровно за то, что решил подобное сам.
# ⚠ ПОТОЛОК $6.00 → $6.15 (санкция владельца 11.08, «поднимай»), ФД-A 1.680 → 1.950.
# ПРИЧИНА — ОШИБКА СЕССИИ, И ЭТО ЗАПИСАНО ЗДЕСЬ, А НЕ СМЯГЧЕНО В ОТЧЁТЕ. Первая редакция списка
# мест для арма A1B несла поле `palladius.nonconformant_bank` — счёт строк САМОГО БАНКА, не
# прошедших палладиевскую проверку. К переводу оно не относится: число одинаково во всех единицах,
# и фиксер искал в тексте то, чего в тексте нет. Рассуждение выросло вшестеро против A1 (40 694
# знака против 7 400); 14 клеток из 31 упёрлись в потолок вывода и вернули ПУСТОТУ — $0.170
# впустую. Ещё $0.186 стоили 16 завершившихся клеток, отправленных в карантин ради ОДНОРОДНОСТИ
# арма: они построены на том же отравленном списке и одним армом с починенными быть не могут.
# Без этой ошибки $6.00 хватало. Норма, заведённая ею: **флаг без адреса — не место**, и селфтест
# `contour.py` теперь роняет харнесс, если безадресный флаг попадёт в список фиксеру.
# ⚠ ПОДЪЁМ ФД-B 14.08 ПО САНКЦИИ ВЛАДЕЛЬЦА. Причина названа числом до подъёма: проба контаминации
# по заказу гонится ЖИЛЬЦАМИ, а не дешёвой моделью, и обошлась в $0.147 против грошей на luna
# (жилец `pro` думает по $0.014 за клетку). Английские единицы вдобавок в полтора раза длиннее
# китайских, поэтому клетка дороже сметы на ~21% (замер по базам: $0.140 против $0.116).
# Без подъёма арм E3 — смысловой контур, несущий ставку владельца на китайской оси, — остался бы
# некупленным. Пакетный потолок поднят РОВНО на ту же дельту, чтобы инвариант «сумма фазовых ≤
# пакетного» держался; ось никто не режет и деньги ниоткуда не забирает.
CEILINGS = {"ФД-A": 1.950, "ФД-B": 0.900, "ФД-C": 0.170, "ФД-D": 0.050,
"ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210}
PACK_CEILING = 6.42
M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS,
PACK_CEILING=PACK_CEILING, GLOB_ALL="dv-*.json", ROSTER=ROSTER)
Guarded, Pack, purchase, model_expect = M22.Guarded, M22.Pack, M22.purchase, M22.model_expect
def report() -> None:
print(f"{'фаза':7s}{'потрачено':>12s}{'потолок':>10s} что покупает")
tot = 0.0
what = {"ФД-A": "Д4 edit-контур zh", "ФД-B": "Д3 en→ru несущая", "ФД-C": "Д6 ja разведка",
"ФД-D": "Д7 самооценка", "ФД-E": "Д1 gemini", "ФД-F": "H-1 (A6)", "ФД-G": "H-4 (E6)"}
for ph in TAGS:
sp = Guarded(ph).spent()
tot += sp
mark = " ⛔ ПРОБОЙ" if sp > CEILINGS[ph] + 1e-9 else ""
print(f"{ph:7s}{sp:12.6f}{CEILINGS[ph]:10.2f} {what[ph]}{mark}")
print(f"{'ПАК':7s}{tot:12.6f}{PACK_CEILING:10.2f} резерв {PACK_CEILING - tot:.6f}")
def selftest() -> int:
"""Обязан пройти ДО первой покупки фазы."""
bad = 0
def ck(n: str, ok: bool, d: str = "") -> None:
nonlocal bad
bad += not ok
print(f"[{'OK ' if ok else 'ПРОВАЛ'}] {n}" + (f" {d}" if d else ""))
ck("касса смотрит в СВОЁ сырьё", M22.OUT == OUT, str(M22.OUT))
ck("покупки уходят в каталог фазы", M22.BUY.OUT == OUT, str(M22.BUY.OUT))
ck("фриз-гейт сторожит зону фазы", M22.ZONE == ZONE, str(M22.ZONE))
ck("сумма фазовых потолков не выше пакетного",
sum(CEILINGS.values()) <= PACK_CEILING + 1e-9,
f"{sum(CEILINGS.values()):.2f}{PACK_CEILING:.2f}")
for ph, globs in TAGS.items():
for g in globs:
ck(f"{ph}: тег {g} покрыт глобом пака", g.startswith("dv-"))
# цена обязана считаться для КАЖДОЙ модели, которую фаза может позвать
for m in ("deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "gemini-3.1-pro-preview"):
try:
ck(f"цена считается: {m}", M22.BUY.cost(m, 4500, 0, 2500, 1000, 8000) > 0)
except Exception as e: # noqa: BLE001
ck(f"цена считается: {m}", False, f"{type(e).__name__}: {e}")
# проекционный гард обязан ОТКАЗЫВАТЬ, когда ожидание пробивает потолок
g = Guarded("ФД-D")
g.ceiling = 0.0
ck("проекционный гард отказывает при нулевом потолке", not g.afford()[0])
# и обязан видеть цену ДОРОГОЙ модели, а не p95 прошлого (регрессия на пробой Ф1 эксп-22)
g2 = Guarded("ФД-D")
g2.ceiling = g2.spent() + 0.05
g2.next_model = "gemini-3.1-pro-preview"
ck("гард видит цену дорогой модели, а не прошлое",
not g2.afford()[0], f"ожидание ${model_expect('gemini-3.1-pro-preview'):.4f}")
# фриз-гейт обязан отвергнуть покупку из НЕ-файла
try:
exec(compile("import money22; money22._refuse_unfrozen()", "<s>", "exec"), # noqa: S102
{"__name__": "x"})
ck("фриз-гейт отвергает покупку из НЕ-файла", False)
except SystemExit:
ck("фриз-гейт отвергает покупку из НЕ-файла", True)
print(f"\n{'КАССА ГОДНА' if not bad else f'ПРОВАЛОВ: {bad}'}")
return bad
if __name__ == "__main__":
a = sys.argv[1:] or ["--report"]
if a[0] == "--selftest":
sys.exit(1 if selftest() else 0)
report()