90 lines
6.5 KiB
Python
90 lines
6.5 KiB
Python
#!/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()
|