#!/usr/bin/env python3 """Пакеты для слепого суда РЕШАЮЩЕГО арма: один проход С МАНДАТОМ ПЕРЕВЁРСТКИ против связки. ⚠ Отличие от `judge_packets.py`, и оно принципиальное: здесь черновик в пакет НЕ кладётся. В сравнении «full-regen против диффа» черновик был нужен как база отсчёта. Здесь он бы РАЗВАЛИЛ СЛЕПОТУ: full-regen сохраняет 65% слов черновика, и судья опознал бы отредактированную версию за секунду. Судья видит только исходник, глоссарий и две готовые версии. Раскладка А/Б чередуется по чётности окна, ключ пишется отдельно и судьям не отдаётся. """ from __future__ import annotations import json import sys from pathlib import Path REPO = Path("/home/ubuntu/projects/textmachine") RAW = Path.home() / "books" / "gu-zhenren" / "editor-harness" OUT = RAW / "judge-reflow" sys.path.insert(0, str(REPO / "eval" / "bank_arbitration")) import editor_wire_probe as P # noqa: E402 from inject_probe import pick_windows # noqa: E402 OFFSET = {"dp": 0, "gl": 1, "lu": 0, "gr": 1} def text_of(tag: str) -> str | None: f = RAW / f"{tag}.json" return json.loads(f.read_text(encoding="utf-8"))["content"] if f.exists() else None def build(ms: str) -> int: OUT.mkdir(parents=True, exist_ok=True) key, n = {}, 0 for k, (_, src, terms) in enumerate(pick_windows()): a_tag, b_tag = f"eh-{ms}-direct-reflow-w{k}", f"eh-{ms}-full-w{k}" # ⚠ ФИКС 05.08: в прошлом раунде правило раскладки было ОДНО на все модели, из-за чего # позиция и арм слиплись (арм в позиции А выиграл 12/12, в Б — 6/12). Здесь у каждой # модели свой сдвиг, поэтому позиция не коррелирует с армом по набору. if (k + OFFSET[ms]) % 2: a_tag, b_tag = b_tag, a_tag ta, tb = text_of(a_tag), text_of(b_tag) if not ta or not tb: print(f" w{k}: пропуск") continue gloss = "\n".join(f"- {t} → «{P.TERMS[t][0]}»" for t in terms) (OUT / f"packet-{ms}-w{k}.md").write_text( f"# Материалы для оценки перевода, окно {k}\n\n" f"## Исходный текст (китайский)\n\n{src}\n\n" f"## Утверждённый глоссарий (канонические формы обязательны)\n\n{gloss}\n\n" f"## Версия А\n\n{ta}\n\n## Версия Б\n\n{tb}\n", encoding="utf-8") key[f"w{k}"] = {"А": a_tag, "Б": b_tag} n += 1 (OUT / f"KEY-{ms}.json").write_text(json.dumps(key, ensure_ascii=False, indent=1), encoding="utf-8") print(f"{ms}: пакетов {n}") return n if __name__ == "__main__": for ms in (sys.argv[1:] or ["dp", "gl", "lu"]): build(ms)