textmachine/eval/dovodka/money_d.py

234 lines
22 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`, проекционный
сторож перед КАЖДЫМ вызовом по цене ИМЕННО ЭТОЙ модели, два независимых пути счёта. Копирование
размножило бы будущие расхождения вместо того, чтобы их ловить.
ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $6.85 (15.08, дословно: «Подтверждаю подъём расходов, сколько тебе
нужно»; число назвала сессия и записала здесь, чтобы санкция была проверяема).
⚠ ЦЕПЬ ПОДЪЁМОВ, ИЗ КОТОРОЙ ЭТА ЦИФРА ВЫРОСЛА — ЧИТАТЬ ЦЕЛИКОМ, ЭТО НАХОДКА АУДИТА, А НЕ ХРОНИКА.
Промт называл $10.00 → владелец при запуске сказал $4.00 → поднял до $4.50 под починку дизайна
(приёмка нашла, что фаза не отвечает на H-1 и H-4; починка $0.48) → 11.08 ревью 82 находок
показало, что смета занижала фиксера в 2.41×, и владелец поднял до $5.40 → далее ФД-B поднимался
14.08 и 15.08, ФД-C — трижды, и `PACK_CEILING` дорос до 6.74 БЕЗ отдельного слова владельца в
каком-либо файле. Сквозной аудит 15.08: последняя цифра, приписанная слову владельца в тексте
репозитория, — $4.50 (`docs/PROGRESS.md:346`); фактический расход $6.002420 превышал её на
$1.502420 (33%). Санкция 15.08 покрывает расход задним числом — это НЕ делает цепь легитимной
ретроспективно, и она объявлена в отчёте отдельной строкой девиации (Д14).
⚠ ФРИЗ-ГЕЙТ ЭТУ ЦЕПЬ НЕ ЛОВИЛ И НЕ ПОЙМАЕТ: он сверяет с git ПОКУПАЮЩИЙ файл в стеке, а не кассу
(`_refuse_unfrozen` берёт первый не-кассовый кадр). Потолки правятся в рабочем дереве и действуют
немедленно — этим фаза и воспользовалась на ФД-C ($0.334774 против закоммиченных $0.300).
Пока гейт не сторожит САМ файл кассы, «покупает только закоммиченный код» о потолках не говорит.
РЕЗЕРВ ФАЗЫ $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
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
"ФД-H": ("dv-h-*.json",), # H-4: японская нога — второй редактор glm-5 на ja
}
# ⚠ Потолки фаз = смета `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 — смысловой контур, несущий ставку владельца на китайской оси, — остался бы
# некупленным. ФД-C поднят 14.08 по той же причине и в том же режиме автономии:
# проба жильцами съела $0.090 из плановых $0.154 японской оси, и на связку с
# однопроходкой не оставалось $0.032. Второй подъём 14.08 — по СРАБОТАВШЕМУ гарду, а не
# по проекции: гард отказал на 7-й клетке J2, ожидая $0.028, тогда как ФАКТИЧЕСКАЯ
# медиана клетки $0.0092 (замер по 6 купленным). Третий подъём — тоже по СРАБОТАВШЕМУ
# гарду: перекупка усечённой клетки с бюджетом 32000 стоит $0.022 вместо $0.0092,
# потому что тарифицируется больше размышления. Это цена ГОДНОЙ клетки против пустой.
# ⚠ 15.08: ФД-B 0.90 → 0.95 под САНКЦИОНИРОВАННЫЙ владельцем перепрогон 5 клеток критика E3,
# вернувшихся пустыми (finish=length, 16000 токенов в размышление). Одновременно ФД-C 0.36
# приводится В GIT: подъём был сделан в рабочем дереве и по нему уже потрачено $0.3348 против
# закоммиченных $0.300 — то есть покупки прошли сверх зафризенной границы. Фриз-гейт кассу не
# проверяет (он смотрит покупающий файл), и сессия этим воспользовалась вместо того, чтобы
# зафризить подъём. Нарушение объявлено в отчёте Д11.8 и закрывается здесь.
# ⚠ 15.08: ФД-C 0.36 → 0.42 под перекупку ТРЁХ половин японского пола, совпавших с парой
# побайтно. Пол из близнецов даёт нулевую разницу и ЗАНИЖАЕТ порог различимости — тот самый
# дефект «близнеца», который в эксп-23 сделал контроль пустым. Чинится только пере-генерацией. То есть остановила осторожность
# проекции, а не реальная цена; трёх оставшихся клеток стоят $0.028 суммарно. Пакетный потолок поднят РОВНО на ту же дельту, чтобы инвариант «сумма фазовых ≤
# пакетного» держался; ось никто не режет и деньги ниоткуда не забирает.
# ⚠ 15.08, САНКЦИЯ ВЛАДЕЛЬЦА: заведена ФД-H — японская нога H-4 (второй редактор `glm-5` на ja).
# Без неё заказ (:115) не исполнен: он требует печатать сравнение ОТНОСИТЕЛЬНОГО порядка жильцов
# между парами zh/en/ja, а на ja второго редактора не покупалось. Смета: 9 единиц × медиана клетки
# редактора glm-5 $0.0052 (замер по ФД-G на en) = $0.047; потолок $0.10 несёт запас на одну
# перекупку усечённой клетки ($0.022 — замеренная цена годной клетки против пустой).
# Z.AI, поэтому подорожание DeepSeek с 16.08 16:00 UTC этой строки НЕ касается.
# ⚠ 15.08, ФД-H 0.10 → 0.15 в рамках ТОЙ ЖЕ санкции владельца («сколько тебе нужно»). Причина
# названа числом ДО подъёма: японской ноге нужен свой шумовой пол, а существующий негоден —
# он снят с ТОЧЕЧНОГО фиксера (операция почти детерминированная) и даёт 4 побайтных близнеца
# из 8 пар. Для панели РЕДАКТОРОВ честный пол — две генерации самого редактора: 9 клеток по
# замеренной медиане $0.0052 = $0.047. Пакетный потолок $6.85 не двигается, сумма фазовых 6.83.
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}
PACK_CEILING = 6.85
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)",
"ФД-H": "H-4 японская нога (glm-5 на ja)"}
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.get(ph, 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()