diff --git a/eval/dovodka/contour.py b/eval/dovodka/contour.py index f99372a6..7ed6ff3a 100644 --- a/eval/dovodka/contour.py +++ b/eval/dovodka/contour.py @@ -89,7 +89,10 @@ def phase_letter(arm: str) -> str: P = pair() if P.key == "zh-ru": return "f" if arm.startswith("A6") else "a" - return "g" if arm == "E6" else {"en-ru": "b", "ja-ru": "c"}[P.key] + # ⚠ ВТОРОЙ РЕДАКТОР ПАРЫ живёт в СВОЕЙ кассе, а не в кассе оси: он куплен под гипотезу H-4 + # («порядок жильцов — свойство пары»), а не под замер самой оси, и смешивать их потолки + # значит потерять границу того, что санкционировано подо что. E6 — ФД-G (en), J6 — ФД-H (ja). + return {"E6": "g", "J6": "h"}.get(arm) or {"en-ru": "b", "ja-ru": "c"}[P.key] def phase_of(arm: str) -> str: @@ -97,8 +100,8 @@ def phase_of(arm: str) -> str: P = pair() if P.key == "zh-ru": return "ФД-F" if arm.startswith("A6") else "ФД-A" - if arm == "E6": - return "ФД-G" + if arm in ("E6", "J6"): + return {"E6": "ФД-G", "J6": "ФД-H"}[arm] return {"en-ru": "ФД-B", "ja-ru": "ФД-C"}[P.key] @@ -184,7 +187,7 @@ def units_ok() -> list[dict]: def draft_defect(text: str) -> str: """Штатный гейт годности черновика проекта. Пусто = годен.""" - import bakeoff as BO # noqa: PLC0415 + import bakeoff as BO return BO.draft_reject_reason(text or "") @@ -232,13 +235,13 @@ def base_draft2(uid: str) -> str: # ── флаги: детерминированные места, которые фиксер обязан починить ──────────────────────────── def canon_gaps(src: str, out: str) -> list[str]: """Термины банка, чья канонная форма В ВЫХОДЕ встречается реже, чем в исходнике.""" - import re # noqa: PLC0415 + import re gaps = [] for t, v in _bank().items(): n = src.count(t) if not n: continue - if min(len(re.findall(v["rx"], out, re.I)), n) < n: + if min(len(re.findall(v["rx"], out, re.IGNORECASE)), n) < n: gaps.append(f"«{v['dst']}» (в исходнике {t} встречается {n} раз)") return gaps @@ -289,8 +292,8 @@ BATTERY_SAYS = { def battery_flags(u: dict, draft: str) -> list[str]: """Нарушения батареи НА ТЕКСТЕ, каждое с адресом. Падение = дефект, НЕ глотаем.""" - import battery as B # noqa: PLC0415 - import re # noqa: PLC0415 + + import battery as B bank = _bank() unit = B.Unit(source=u["source"], draft=draft, final=draft, bank_dst={v["dst"] for v in bank.values()}, diff --git a/eval/dovodka/ja_axis.py b/eval/dovodka/ja_axis.py index d87b433f..d25b9f75 100644 --- a/eval/dovodka/ja_axis.py +++ b/eval/dovodka/ja_axis.py @@ -18,7 +18,7 @@ MDE оси 2.90 против цели 2.00, то есть несущего вы ⚠ Материал прошёл гардрейл 18+ (0 срабатываний из 48 чанков) и контам-пробу жильцами (0/5 узнавание и 0/5 клоуз у обоих при сработавшем положительном контроле). -Запуск: ja_axis.py --dry | --bases | --arms | --selftest +Запуск: ja_axis.py --dry | --bases | --arms | --j6 | --selftest """ from __future__ import annotations @@ -44,9 +44,11 @@ def _load(name: str, path: Path): C = _load("contour_ja", ZONE / "contour.py") MJ = _load("material_ja_ax", ZONE / "material_ja.py") MONEY, PR, PARA = C.MONEY, C.PR, C.PARA +ROSTER, ED22 = C.ROSTER, C.ED22 # ростер и клиенты — из общего контура, не копией DRAFT_MODEL = "deepseek-v4-flash" EDITOR = "deepseek-v4-pro" +EDITOR2 = "glm-5" # второй редактор пары, носитель H-4 PFX = "dv-c" # ⚠ Японский плотнее китайского на знак, а размышление DeepSeek тарифицируется ВНУТРИ бюджета: # при умолчании рига 16000 три клетки из 27 вернулись пустыми с `finish=length`. @@ -90,6 +92,44 @@ def _law(src: str) -> str | None: return PR.law_block(PR.terms_in(src, bf), bf) +def cmd_j6() -> None: + """J6 — ВТОРОЙ редактор (`glm-5`) поверх той же базы. Касса ФД-H, санкция владельца 15.08. + + ⚠ ЗАЧЕМ, И ЧТО ЭТО НЕ ЗАКРЫВАЕТ. Гипотеза H-4 говорит о ПОРЯДКЕ жильцов между парами, а + порядок нельзя увидеть, имея на паре одного редактора: ось Д6 меряла «помогает ли редактор + вообще», а не «какой лучше». На zh панель есть (эксп-22), на en второй редактор куплен (E6, + 1.31 против 2.72), на ja второго не было — требование заказа (:115) печатать сравнение + порядка между zh/en/ja поэтому не исполнялось. + ⚠ Результат будет ОПИСАТЕЛЬНЫМ и никаким иным: ось объявлена разведочной ДО денег + (`power.FORCED_DESCRIPTIVE`, n=9, MDE 2.90 против цели 2.00). Покупка закрывает букву заказа + и даёт третью точку картины; несущего вывода она не даст ни при каком исходе. + ⚠ `glm-5` — Z.AI, поэтому смена прайса DeepSeek 16.08 16:00 UTC этой строки не касается. + """ + wire() + # ⚠ Ожидание гарда — ЗАМЕРЕННОЕ, а не взятое с запасом: гард отказывает по ОЖИДАЕМОЙ цене, + # и завышенное ожидание останавливает покупку в середине по несуществующему перерасходу + # (в этой фазе так уже вышло трижды). Медиана клетки того же редактора на en — $0.00312 + # (касса ФД-G, 16 клеток); японская единица длиннее, берётся то же 0.006, что японская ось + # использует для своих баз. 9 × 0.006 = 0.054 при потолке ФД-H 0.10. + led = MONEY.Guarded("ФД-H", default_expect=0.006) + for u in units(): + uid, src = u["uid"], u["source"] + draft = base_draft(uid) + if not draft.strip(): + continue + tg = f"dv-h-j6-{uid}" + if text_of(tg).strip(): + continue + rec = MONEY.purchase(led, tg, EDITOR2, ED22.client(EDITOR2), + ROSTER.call_kwargs(EDITOR2, + PR.editor_msgs(src, draft, _law(src), + pair="ja-ru")), + role="editor3", uid=uid, arm="J6") + if rec.get("skipped"): + raise SystemExit(f"⛔ ГАРД ОТКАЗАЛ на {tg} — СТОП и вопрос владельцу") + MONEY.report() + + def cmd_bases() -> None: wire() C.buy_bases("ФД-C", units(), PFX, "D0", "J0", DRAFT_MODEL, EDITOR, "ja-ru", _law, 0.006) @@ -104,11 +144,13 @@ def cmd_refill() -> None: """Карантин пустых клеток и повторная покупка с поднятым бюджетом вывода.""" wire() tags = [f"{PFX}-{a}-{u['uid']}" for u in units() for a in ("d0", "j0", "j2")] + # ⚠ Покупка идёт ВСЕГДА, а не только если карантин что-то забрал этим прогоном. Прежняя + # редакция проверяла `if n:` — и уже лежавшие в карантине клетки не перекупались никогда: + # прогон печатал «в карантин ушло 0» и завершался успехом, оставив ось неполной. n = C.quarantine_length(tags) print(f"в карантин ушло клеток: {n}") - if n: - cmd_bases() - cmd_arms() + cmd_bases() + cmd_arms() def cmd_floor() -> None: @@ -174,6 +216,7 @@ def cmd_selftest() -> int: if __name__ == "__main__": a = sys.argv[1] if len(sys.argv) > 1 else "--dry" - fn = {"--dry": cmd_dry, "--bases": cmd_bases, "--arms": cmd_arms, "--floor": cmd_floor, "--refill": cmd_refill, + fn = {"--dry": cmd_dry, "--bases": cmd_bases, "--arms": cmd_arms, "--floor": cmd_floor, + "--refill": cmd_refill, "--j6": cmd_j6, "--selftest": lambda: sys.exit(1 if cmd_selftest() else 0)}.get(a) fn() if fn else print(__doc__) diff --git a/eval/dovodka/money_d.py b/eval/dovodka/money_d.py index 48661a04..2cb11769 100644 --- a/eval/dovodka/money_d.py +++ b/eval/dovodka/money_d.py @@ -7,11 +7,23 @@ сторож перед КАЖДЫМ вызовом по цене ИМЕННО ЭТОЙ модели, два независимых пути счёта. Копирование размножило бы будущие расхождения вместо того, чтобы их ловить. -ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $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. +ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $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 остатка нет вовсе: @@ -40,7 +52,7 @@ 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 + import importlib.util spec = importlib.util.spec_from_file_location(name, path) mod = importlib.util.module_from_spec(spec) sys.modules[name] = mod @@ -64,6 +76,7 @@ TAGS = { "ФД-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 — @@ -134,9 +147,15 @@ TAGS = { # дефект «близнеца», который в эксп-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 этой строки НЕ касается. CEILINGS = {"ФД-A": 1.950, "ФД-B": 0.950, "ФД-C": 0.420, "ФД-D": 0.050, - "ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210} -PACK_CEILING = 6.74 + "ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210, "ФД-H": 0.100} +PACK_CEILING = 6.85 M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS, PACK_CEILING=PACK_CEILING, GLOB_ALL="dv-*.json", ROSTER=ROSTER) @@ -148,12 +167,13 @@ 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)"} + "ФД-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[ph]}{mark}") + 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}")