Freeze the buying code for the Japanese leg of H-4: second editor arm, its own cash phase and measured guard expectation

This commit is contained in:
Claude (backend session) 2026-08-15 19:49:38 +03:00
parent e5ba451073
commit 8c68828303
3 changed files with 89 additions and 23 deletions

View file

@ -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()},

View file

@ -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__)

View file

@ -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}")