diff --git a/eval/exp13_seed_signoff.py b/eval/exp13_seed_signoff.py new file mode 100644 index 0000000..96d760f --- /dev/null +++ b/eval/exp13_seed_signoff.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""exp13 — применение ПОДПИСИ владельца к сиду v2 (D30.5/D32). Провенанс подписи. +Владелец подписал спорные + переопределил часть approved-dst (2026-07-12). Спорные → approved. +Вход/выход: guzhenren-seed-v2.yaml (in-place). Лог: diag/glossary_v2_signoff_applied.md. ВНЕ git. +""" +from __future__ import annotations +import yaml +from pathlib import Path + +BOOK = Path("/home/ubuntu/books/gu-zhenren") +SEED = BOOK / "guzhenren-seed-v2.yaml" +LOG = BOOK / "diag" / "glossary_v2_signoff_applied.md" + +# src -> (new_dst, invariant, forms, note_tag) +DECISIONS = { + "花酒行者": ("Монах Цветочного Вина", False, + ["Монаха Цветочного Вина", "Монаху Цветочного Вина", "Монаха Цветочного Вина", "Монахом Цветочного Вина", "Монахе Цветочного Вина"], + "подпись: НЕ «Странник Цветов и Вина»/«Винный Странник»; 行者=монах, 花酒=цветочное вино"), + "蛊虫": ("гу-червь", False, + ["гу-червя", "гу-червю", "гу-червя", "гу-червём", "гу-черве"], + "подпись: гу-червь (подтверждено)"), + "本命蛊": ("гу Жизни", True, [], + "подпись: «гу Жизни» (возврат к v1-форме; НЕ «жизненный гу»); инвариант как гу+генитив"), + "修炼": ("культивация", False, + ["культивации", "культивации", "культивацию", "культивацией", "культивации"], + "подпись: культивация (НЕ «совершенствование»)"), + "修行": ("культивация", False, + ["культивации", "культивации", "культивацию", "культивацией", "культивации"], + "подпись: согласовано с 修炼=культивация"), + "人祖": ("Жэнь Цзу", True, [], + "подпись: транслит «Жэнь Цзу» (НЕ «Первопредок», НЕ «Рен Зу»); -у → инвариант"), + "古月山寨": ("деревня Гуюэ", False, + ["деревни Гуюэ", "деревне Гуюэ", "деревню Гуюэ", "деревней Гуюэ", "деревне Гуюэ"], + "подпись: «деревня Гуюэ» (НЕ «селение»/«стан»)"), + "白家寨": ("деревня Бай", False, + ["деревни Бай", "деревне Бай", "деревню Бай", "деревней Бай", "деревне Бай"], + "консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"), + "熊家寨": ("деревня Сюн", False, + ["деревни Сюн", "деревне Сюн", "деревню Сюн", "деревней Сюн", "деревне Сюн"], + "консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"), + "空窍": ("апертура", False, + ["апертуры", "апертуре", "апертуру", "апертурой", "апертуре"], + "подпись: апертура (подтверждено)"), + "元海": ("море истинной ци", False, + ["моря истинной ци", "морю истинной ци", "морем истинной ци", "море истинной ци"], + "подпись: море истинной ци (подтверждено)"), + "元石": ("первобытный камень", False, + ["первобытного камня", "первобытному камню", "первобытный камень", "первобытным камнем", "первобытном камне", + "первобытные камни", "первобытных камней", "первобытным камням", "первобытными камнями", "первобытных камнях"], + "подпись: «первобытные камни» → канон.ед. «первобытный камень» (НЕ «изначальный»/«первокамень»); +мн.ч. D24.4"), +} + + +def main(): + data = yaml.safe_load(SEED.read_text(encoding="utf-8")) + applied, missing = [], [] + for t in data["terms"]: + s = t.get("src") + if s in DECISIONS: + new_dst, inv, forms, tag = DECISIONS[s] + old = t.get("dst") + t["dst"] = new_dst + t["decl"] = {"invariant": inv, "forms": list(forms)} + t["status"] = "approved" + t["note"] = f"[signoff:approved] {tag}. (было: «{old}»). " + (t.get("note") or "") + applied.append((s, old, new_dst)) + seen = {t.get("src") for t in data["terms"]} + missing = [s for s in DECISIONS if s not in seen] + + SEED.write_text(yaml.dump(data, allow_unicode=True, sort_keys=False, width=200), encoding="utf-8") + + lg = ["# Глоссарий v2 — ПОДПИСЬ владельца применена (D30.5/D32, 2026-07-12)", "", + f"Применено решений: {len(applied)}. Все → status:approved. Провенанс: `eval/exp13_seed_signoff.py`.", + "**Остаётся открытым (низкий приоритет, не блокирует resnapshot):** род бесплатного «гу» (蛊) — " + "согласование «этот гу» (муж., как «гу-червь») vs «это гу» (сред.). Рекомендация: мужской. `蛊` инвариантен, " + "single-char (не на горячем пути A3) → влияет только на прозу редактора, не на hard-constraint.", "", + "| src | было | стало (approved) |", "|---|---|---|"] + for s, old, new in applied: + lg.append(f"| {s} | {old} | **{new}** |") + if missing: + lg += ["", "⚠ НЕ найдены в сиде (проверить): " + ", ".join(missing)] + LOG.write_text("\n".join(lg), encoding="utf-8") + + print(f"применено: {len(applied)}, ненайдено: {missing}") + for s, old, new in applied: + print(f" {s}: «{old}» → «{new}» [approved]") + + +if __name__ == "__main__": + main()