#!/usr/bin/env python3 """exp12 — пере-генерация глоссария (v2) по консенсусу двух флагманов + мои каллы. Владелец делегировал «перегенерируй без меня». Источник рекомендаций: разборы GPT+Claude (diag/reading/ОЦЕНКА_ФЛАГМАНА.md + вставка владельца). Высокая уверенность — где ОБА флагмана сошлись; контестные (gu-род, культивация/совершенствование, Первопредок/Жэнь-Цзу) ПОМЕЧЕНЫ ⚑ для ратификации владельцем/оркестратором — НЕ финал. Вход: guzhenren-seed.yaml (v1, 49 терминов). Выход: guzhenren-seed-v2.yaml + changelog. НИЧЕГО не идёт в прод без ратификации + resnapshot. Оба файла ВНЕ git. """ from __future__ import annotations import yaml from pathlib import Path BOOK = Path("/home/ubuntu/books/gu-zhenren") SRC = BOOK / "guzhenren-seed.yaml" OUT = BOOK / "guzhenren-seed-v2.yaml" LOG = BOOK / "diag" / "glossary_v2_changelog.md" # --- изменения существующих терминов: src -> (new_dst, forms|None, status|None, rationale, conf) --- CHANGES = { "空窍": ("апертура", ["апертуры","апертуре","апертуру","апертурой","апертуре"], "approved", "оба флагмана — топ-проблема: «врата» ломают грамматику («одни врата»); «апертура» = фан-вики жанра", "HIGH"), "开窍": ("открытие апертуры", ["открытия апертуры","открытию апертуры","открытием апертуры","открытии апертуры"], None, "согласовано с 空窍→апертура; 开窍大典 = Церемония пробуждения/обряд открытия апертуры", "HIGH"), "真元": ("истинная ци", ["истинной ци","истинной ци","истинную ци","истинной ци","истинной ци"], None, "оба: НЕ «истинная энергия» (физикализм); отделить от 元气 (изначальная ци)", "HIGH"), "元海": ("море истинной ци", ["моря истинной ци","морю истинной ци","морем истинной ци","море истинной ци"], None, "согласовано с 真元→истинная ци", "HIGH"), "本命蛊": ("жизненный гу", ["жизненного гу","жизненному гу","жизненного гу","жизненным гу","жизненном гу"], "approved", "оба: НЕ «гу Жизни» (читается как ВИД, как «гу Надежды»); это СТАТУС. ⚑ род «гу» — см. флаг", "HIGH"), "花酒行者": ("Странник Цветов и Вина", ["Странника Цветов и Вина","Страннику Цветов и Вина","Странника Цветов и Вина","Странником Цветов и Вина","Страннике Цветов и Вина"], "approved", "оба: сохранить 花 (=блуд; злодей — насильник 采花大盗); «Винный Странник» терял половину смысла", "HIGH"), "蛊虫": ("гу-червь", ["гу-червя","гу-червю","гу-червя","гу-червём","гу-черве"], None, "«гу-тварь» пейоративно; «гу-червь» или просто «гу». ⚑ род «гу»", "MED"), "元石": ("изначальный камень", ["изначального камня","изначальному камню","изначальный камень","изначальным камнем","изначальном камне"], None, "«первокамень» → «двадцать первокамень» читается как «двадцать первый»; «изначальный» согласован с рядом 元", "MED"), "古月山寨": ("селение Гуюэ", ["селения Гуюэ","селению Гуюэ","селением Гуюэ","селении Гуюэ"], None, "«стан» = воинский лагерь; 山寨 здесь — укреплённое селение/деревня", "MED"), "白家寨": ("селение Бай", ["селения Бай","селению Бай","селением Бай","селении Бай"], None, "согласовано", "MED"), "熊家寨": ("селение Сюн", ["селения Сюн","селению Сюн","селением Сюн","селении Сюн"], None, "согласовано", "MED"), } # --- новые термины (были GAP → модель угадывала) --- ADDITIONS = [ dict(src="长生", dst="бессмертие", type="term", forms=["бессмертия","бессмертию","бессмертие","бессмертием","бессмертии"], note="chángshēng; вечная жизнь/бессмертие — СКВОЗНАЯ тема книги; НЕ «долголетие» (провалили 5/8 вариантов)", conf="HIGH"), dict(src="修炼", dst="культивация", type="term", forms=["культивации","культивации","культивацию","культивацией","культивации"], note="xiūliàn; культивация/культивировать. ⚑ лит.альтернатива «совершенствование» (флагманы для издания) — владельцу", conf="MED⚑"), dict(src="修行", dst="культивация", type="term", forms=["культивации","культивации","культивацию","культивацией","культивации"], note="xiūxíng; практика культивации; согласовано с 修炼. ⚑ см. флаг", conf="MED⚑"), dict(src="人祖", dst="Первопредок", type="name", forms=["Первопредка","Первопредку","Первопредка","Первопредком","Первопредке"], note="Rénzǔ; говорящее имя (Праотец человечества). НЕ «Рен Зу» (англ.релей-ошибка романизации). ⚑ альт-имя «Жэнь Цзу» (Палладица) — владельцу", conf="MED⚑"), dict(src="族长", dst="глава клана", type="title", forms=["главы клана","главе клана","главу клана","главой клана","главе клана"], note="zúzhǎng; глава клана — НАД старейшинами; частая ошибка черновика «старейшина» рушит иерархию сцены", conf="HIGH"), dict(src="家老", dst="старейшина", type="title", forms=["старейшины","старейшине","старейшину","старейшиной","старейшине"], note="jiālǎo; старейшина клана; 学堂家老 = старейшина академии. Развести с 族长", conf="HIGH"), dict(src="困境", dst="Беды", type="term", forms=["Бед","Бедам","Беды","Бедами","Бедах"], note="kùnjìng; стая зверей в легенде о Первопредке; «Беды»/«Невзгоды» живее абстрактных «Трудностей» как имя стаи", conf="MED"), dict(src="炼化", dst="очистить и подчинить", type="term", invariant=True, note="liànhuà; очистить-и-подчинить живого гу; НЕ «переплавить» (слишком металлично). Кратко «очистить»", conf="MED"), ] # ⚑ ТОП-ФЛАГ (не применяю молча): род «гу». GU_GENDER_FLAG = ("⚑ РОД «гу»: сид держит НЕСКЛОНЯЕМЫЙ СРЕДНИЙ; оба флагмана рекомендуют МУЖСКОЙ " "(«этот гу», как «жук»; согласуется с «винный червь — он»). Это меняет согласование во ВСЕХ " "гу-именах — НЕ флипаю молча. В v2 «жизненный гу»/«гу-червь» даны в МУЖСКОМ как рекомендация; " "решение по проекту — за владельцем/оркестратором.") KEEP_FLAGS = [ "蛊师 → «гу-мастер» ОСТАВЛЕН (владелец хотел «Мастер Гу», но это конфликтует с титулом 蛊真人/«Мастер Гу»/«Преподобный Гу») — флаг владельцу.", "甲乙丙丁 → «разряд А/Б/В/Г» ОСТАВЛЕН (Claude одобрил русификацию; лучше латиницы A–D).", "采花大盗 → рекомендация «похититель цветов» + СНОСКА при 1-м употреблении (эвфемизм изнасилования) — но сноски = отдельная задача бэкенда, не в сиде.", ] def main(): data = yaml.safe_load(SRC.read_text(encoding="utf-8")) terms = data["terms"] changed, added = [], [] for t in terms: s = t.get("src") if s in CHANGES: new_dst, forms, status, rat, conf = CHANGES[s] old = t.get("dst") t["dst"] = new_dst if forms is not None: t["decl"] = {"invariant": False, "forms": forms} if status: t["status"] = status t["note"] = f"[v2:{conf}] {rat}. (было: «{old}»). " + t.get("note", "") changed.append((s, old, new_dst, rat, conf)) for a in ADDITIONS: entry = {"src": a["src"], "dst": a["dst"], "type": a["type"], "decl": {"invariant": a.get("invariant", False), "forms": a.get("forms", [])}, "since_ch": 0, "status": "approved", "note": f"[v2-NEW:{a['conf']}] {a['note']}"} terms.append(entry) added.append((a["src"], a["dst"], a["note"], a["conf"])) OUT.write_text(yaml.dump(data, allow_unicode=True, sort_keys=False, width=200), encoding="utf-8") # changelog lg = ["# Глоссарий 蛊真人 — v2 (пере-курация по флагманам, exp12)", "", f"Изменено: {len(changed)} · Добавлено: {len(added)} · Всего терминов: {len(terms)}", "Источник: консенсус GPT+Claude (diag/reading/ОЦЕНКА_ФЛАГМАНА.md). ⚑ = контестно, за владельцем.", "**НЕ финал, НЕ в прод без ратификации + resnapshot.**", "", "## Изменённые термины", "", "| src | было | стало | conf | почему |", "|---|---|---|---|---|"] for s, old, new, rat, conf in changed: lg.append(f"| {s} | {old} | **{new}** | {conf} | {rat} |") lg += ["", "## Новые термины (были GAP — модель угадывала)", "", "| src | dst | conf | note |", "|---|---|---|---|"] for s, dst, note, conf in added: lg.append(f"| {s} | **{dst}** | {conf} | {note} |") lg += ["", "## Оставлено намеренно / флаги", ""] lg.append(f"- {GU_GENDER_FLAG}") for k in KEEP_FLAGS: lg.append(f"- {k}") lg += ["", "## Контестные каллы (⚑ — за владельцем)", "- 修炼/修行 → **культивация** (твоё предпочтение) vs «совершенствование» (флагманы для издания).", "- 人祖 → **Первопредок** (смысл, оба флагмана как минимум допускают) vs имя «Жэнь Цзу» (НЕ «Рен Зу»).", "- род «гу»: **мужской** (рекоменд. флагманов) vs средний (текущий сид).", "- 蛊师 «гу-мастер» vs «Мастер Гу» (конфликт с титулом книги)."] LOG.write_text("\n".join(lg), encoding="utf-8") print(f"v2 seed → {OUT}") print(f"changelog → {LOG}") print(f"изменено {len(changed)}, добавлено {len(added)}, всего {len(terms)}") print("\nИзменения:") for s, old, new, rat, conf in changed: print(f" {s}: «{old}» → «{new}» [{conf}]") print("Новые:") for s, dst, note, conf in added: print(f" {s} → «{dst}» [{conf}]") if __name__ == "__main__": main()