Freeze the self-assessment micro-probe before its purchase, with the no-decisions caveat asserted by selftest

This commit is contained in:
heaven 2026-08-14 21:57:46 +03:00
parent 6a34d9b5d6
commit 9847693556

143
eval/dovodka/d7_self.py Normal file
View file

@ -0,0 +1,143 @@
#!/usr/bin/env python3
"""Д7 — МИКРО-ПРОБА САМООЦЕНКИ ЖИЛЬЦОВ (идея владельца). Платный, ≤$0.05.
РЕШЕНИЙ НЕ НЕСЁТ, и это записано ДО покупки. Заказ формулирует прямо: «печатается как
любопытство с оговоркой самооценка моделей ненадёжна; никакие решения на ней не стоят».
Ценность в СВЕРКЕ: модель говорит, что ей будет трудно, а фаза уже знает, что вышло на самом
деле и расхождение между предсказанием модели о себе и фактом само по себе любопытно.
Спрашиваются ОБА жильца обеих ролей по ТРЁМ книгам фазы. Вопрос один и тот же, чтобы ответы
сравнивались между парами: «сможешь ли перевести эту книгу на издательском уровне; что будет
трудным?» Отрывок даётся настоящий из тех же приколотых единиц, что покупала фаза.
Запуск: d7_self.py --dry | --run | --show | --selftest
"""
from __future__ import annotations
import importlib.util
import json
import sys
from pathlib import Path
REPO = Path("/home/ubuntu/projects/textmachine")
ZONE = Path(__file__).resolve().parent
for d in ("dovodka", "editor_tier", "tenant_panel", "role_topology", "bank_arbitration"):
sys.path.insert(0, str(REPO / "eval" / d))
def _load(name: str, path: Path):
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
C = _load("contour_d7", ZONE / "contour.py")
PE = _load("pair_en_d7", REPO / "eval" / "role_topology" / "pair_en.py")
MJ = _load("mat_ja_d7", ZONE / "material_ja.py")
MONEY, ROSTER, ED22 = C.MONEY, C.ROSTER, C.ED22
RESIDENTS = ("deepseek-v4-flash", "deepseek-v4-pro")
PHASE, PFX = "ФД-D", "dv-d"
MAX_OUT = 8000
SYS = ("Ты — переводчик художественной литературы. Тебе дают отрывок книги. Ответь ЧЕСТНО и "
"коротко, двумя абзацами:\n"
"1) Сможешь ли ты перевести ЭТУ книгу на русский на ИЗДАТЕЛЬСКОМ уровне (так, чтобы "
"текст читался как написанный по-русски, а не переведённый)? Ответь прямо: да, нет или "
"с оговорками — и какими.\n"
"2) Что в ЭТОЙ книге будет для тебя самым трудным? Назови конкретные места и явления, "
"а не общие слова про «культурные различия».")
def books() -> dict[str, tuple[str, str]]:
"""{ключ: (язык, отрывок)} — из ПРИКОЛОТЫХ единиц фазы, а не из случайного места книги."""
zh = C.units_ok()[0]["source"]
en = PE.units(8)[0]["source"]
ja = MJ.units()[0]["source"]
return {"zh": ("китайская вебновелла", zh), "en": ("английское тёмное фэнтези", en),
"ja": ("японская веб-новелла", ja)}
def tag(res: str, book: str) -> str:
return f"{PFX}-self-{res.replace('.', '')}-{book}"
def text_of(res: str, book: str) -> str:
f = MONEY.OUT / f"{tag(res, book)}.json"
if not f.exists():
return ""
return json.loads(f.read_text(encoding="utf-8")).get("content") or ""
def cmd_run() -> None:
led = MONEY.Guarded(PHASE, default_expect=0.004)
for res in RESIDENTS:
for book, (what, src) in books().items():
tg = tag(res, book)
if text_of(res, book).strip():
continue
msgs = [{"role": "system", "content": SYS},
{"role": "user", "content": f"Книга: {what}.\n\nОтрывок:\n{src[:2500]}"}]
rec = MONEY.purchase(led, tg, res, ED22.client(res),
ROSTER.call_kwargs(res, msgs, max_out=MAX_OUT),
role="selfassess", book=book, arm="SELF")
if rec.get("skipped"):
raise SystemExit(f"⛔ ГАРД ОТКАЗАЛ на {tg} — СТОП")
MONEY.report()
def cmd_show() -> None:
print("Д7 — САМООЦЕНКА ЖИЛЬЦОВ\n")
print("⚠ САМООЦЕНКА МОДЕЛЕЙ НЕНАДЁЖНА. Печатается как любопытство; никакие решения фазы на "
"этих ответах НЕ стоят — так объявлено ДО покупки.\n")
fact = {"zh": "факт фазы: связка 4.00 ошибок/ед., черновик хуже",
"en": "факт фазы: черновик 2.78 → связка 1.22 ошибок/ед.",
"ja": "факт фазы: черновик 5.44 → связка 2.22 ошибок/ед. (ХУДШИЙ черновик фазы)"}
for res in RESIDENTS:
for book in books():
t = text_of(res, book)
if not t.strip():
continue
print(f"### {res} · {book}{fact[book]}")
print(" " + t.strip().replace("\n", "\n ")[:900] + "\n")
def cmd_dry() -> None:
have = sum(1 for r in RESIDENTS for b in books() if text_of(r, b).strip())
n = len(RESIDENTS) * len(books())
sp = MONEY.Guarded(PHASE).spent()
print(f"Д7 · клеток {have}/{n} · жильцы {' · '.join(RESIDENTS)} · книги zh/en/ja")
print(f" {PHASE}: потрачено ${sp:.4f} · потолок ${MONEY.CEILINGS[PHASE]:.2f} · "
f"смета ${(n - have) * 0.004:.4f}")
def cmd_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 ""))
bk = books()
ck("три книги фазы", len(bk) == 3, " ".join(bk))
ck("отрывки — из приколотых единиц, непустые",
all(len(v[1]) > 500 for v in bk.values()))
ck("тег покрыт глобом кассы ФД-D", tag("m", "zh").startswith("dv-d-"))
ck("вопрос НЕ подсказывает ответ (нет слов «трудно»/«не сможешь» в постановке)",
"не сможешь" not in SYS)
# Оговорка обязана быть в САМОЙ печати, а не в моей памяти: иначе при чтении отчёта
# «любопытство» незаметно превратится в довод.
src = Path(__file__).read_text(encoding="utf-8")
ck("оговорка о ненадёжности зашита в печать", "САМООЦЕНКА МОДЕЛЕЙ НЕНАДЁЖНА" in src)
print(f"\n{'Д7 ГОТОВ' if not bad else f'ПРОВАЛОВ: {bad}'}")
return bad
if __name__ == "__main__":
a = sys.argv[1] if len(sys.argv) > 1 else "--dry"
fn = {"--dry": cmd_dry, "--run": cmd_run, "--show": cmd_show,
"--selftest": lambda: sys.exit(1 if cmd_selftest() else 0)}.get(a)
fn() if fn else print(__doc__)