textmachine/eval/exp13_seed_signoff.py

90 lines
6.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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