Runbook: склейка дублей канонических характеристик
Контекст: ADR-0074. Аудит 2026-07-12 нашёл ≥1,237 кодов-дублей
(rated_ac_current/rated_current_ac, conductor_count/core_count/
number_of_cores). Справочник склейки — characteristic_merge_map
(миграция 0244), data-driven по ADR-0072.
Модель
| Колонка | Смысл |
|---|---|
alias_code → survivor_code | lower-код дубля → lower-код канона |
reason | token_signature (перестановка слов) / same_display_name / llm / произвольный |
source | seed / llm / moderator |
status | pending → approved → applied; rejected |
needs_review | true = требует модератора перед approve |
Survivor выбирается по максимуму supplier-маппингов (usage-прокси),
tie-break — старейший created_at.
Процедура
- Seed (идемпотентен):
psql < scripts/characteristic-merge/seed_auto.sql. Классы:token_signature(unit+data_type совпадают → сразуapproved),same_display_name(совпадают →approvedc confidence 0.9; иначеpending+needs_review— height/height_u отфильтрованы юнитом). - Модерация:
pending-строки апрувить вручную (UPDATE ... SET status='approved', needs_review=false WHERE id=...), мусорные —rejected. - Apply (идемпотентен, резюм-safe, off-peak — шаг facts IO-тяжёлый):
psql < scripts/characteristic-merge/apply.sql. Каскад: mappings → supplier_characteristic_map → facts.canonical_key (батчи 20k; row-триггеры сами ведут char_fact_stats и ставят dirty-каноники) → manual-assignments переезжают в свободные слоты → авто-assignments alias’а удаляются → valuenorm-словарь/очередь. Воркер canonical-assignment пересчитает survivor из фактов штатно; manual-строки защищены (ADR-0073). - Контроль:
noteapplied-строк содержитfacts=N manual_moved=N manual_conflicts=N. Конфликтные manual-assignments остаются на alias-характеристике — разобрать руками через admin API и снести пустые alias-строкиcharacteristicsфинальным проходом.
Профилактика
Provisioner (шаг 1.5 EnsureByCanonicalName) не даёт рождаться новым
словопорядковым дублям (expression index characteristic_token_signature);
charnorm-промпт несёт naming-conventions. Семантические синонимы всё ещё
возможны — периодически перезапускать seed + LLM-предложения в справочник.