139 lines
8.9 KiB
Python
139 lines
8.9 KiB
Python
#!/usr/bin/env python3
|
||
"""КАССА ФАЗЫ Д. $0 сама по себе; через неё идут ВСЕ платные вызовы фазы.
|
||
|
||
Не копия кассы эксп-22, а её НАСТРОЙКА через `configure` — тот же приём, которым пользовался пак
|
||
23. Механизм там проверенный и дорого доставшийся: фриз-гейт (покупка отказывает коду, который не
|
||
закоммичен или отличается от закоммиченного), атомарный замок клетки `O_CREAT|O_EXCL`, проекционный
|
||
сторож перед КАЖДЫМ вызовом по цене ИМЕННО ЭТОЙ модели, два независимых пути счёта. Копирование
|
||
размножило бы будущие расхождения вместо того, чтобы их ловить.
|
||
|
||
ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $4.50 (10.08). История цифры: промт называл $10.00, владелец при
|
||
запуске сказал $4.00, затем поднял до $4.50, когда приёмка другого модельного семейства нашла, что
|
||
дизайн не отвечает на H-1 и H-4, а починка стоит $0.48.
|
||
|
||
⚠ РЕЗЕРВ ФАЗЫ $0.03 — 0.7% пакета, и это объявлено риском ДО покупок (Д0.8). Ре-гены эхо-мины и
|
||
ретраи в паках 22/23 съедали до +16% сверх сметы фазы. Сессия называла честным потолком $4.80;
|
||
владелец выбрал $4.50. Поэтому правило исполнения жёсткое и записано здесь, а не в прозе:
|
||
**срабатывание проекционного гарда = СТОП и вопрос владельцу.** Резать ось, панель или кандидата
|
||
решением сессии ЗАПРЕЩЕНО заказом; поднимать потолок себе — тем более (пак 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 денег трижды.
|
||
CEILINGS = {"ФД-A": 0.885, "ФД-B": 0.560, "ФД-C": 0.155, "ФД-D": 0.055,
|
||
"ФД-E": 2.355, "ФД-F": 0.283, "ФД-G": 0.202}
|
||
PACK_CEILING = 4.50
|
||
|
||
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()
|