#!/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()