Land seed v2 signoff transform script: reproducible provenance for owner-signed glossary v2 term statuses (D34.1)

This commit is contained in:
Claude (backend session) 2026-07-11 15:58:46 +03:00
parent b49ce2b36a
commit 3c113d72ce

View file

@ -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()