ADR-0053: Единицы СИ для характеристик
Status: accepted Date: 2026-05-09 Deciders: Максим Белканов, Tracium engineering
Контекст
Tracium сравнивает товары, офферы и будущие аналоги по характеристикам. Если
одна система хранит 80 мм, другая 0.08 m, а третья строку 80мм, то
параметрический resolver и fuzzy analog matching начинают сравнивать текст,
а не физические величины. Это ломает подбор по характеристикам и делает
невозможным стабильное ранжирование аналогов.
В публичный API также приходят сметные строки из разных источников: ручной JSON, ERP, CSV, XLS/XLSX-конвертеры. Формат источника не должен определять единицы измерения внутри Tracium.
Решение
Все физические характеристики в canonical layer, нормализованных характеристиках офферов и публичном API должны храниться и передаваться в системе СИ.
Правила:
- значение и единица передаются раздельно:
valueсодержит число,unitсодержит единицу; - масштаб приводится до canonical SI unit до входа в resolver:
80 ммстановится{ "value": 0.08, "unit": "m" },6 кАстановится{ "value": 6000, "unit": "A" }; - в API не принимаем локализованные единицы для характеристик:
А,мм,кВ,кВтдолжны быть преобразованы вA,m,V,W; uomстроки сметы (шт,м,комплект) не считается характеристикой товара и не попадает под это правило;- импортные адаптеры XLS/CSV/ERP обязаны приводить характеристики к этому формату до вызова public API;
- если поставщик отдаёт нестандартизованные единицы, нормализация выполняется в charnorm/ingestion контуре до записи в canonical/normalized read-side.
Последствия
Плюсы
- Характеристики можно сравнивать численно без supplier-specific эвристик.
- Параметрический resolver и будущий analog matching получают стабильную основу для ранжирования.
- Public API становится независимым от формата исходной таблицы.
Минусы
- Импортным адаптерам нужен слой нормализации единиц перед вызовом API.
- Клиентам нельзя просто прокинуть исходную строку
1250Акак характеристику: её нужно разобрать на число и единицу.
Нейтральные последствия
- Исходный текст строки сметы остаётся в
raw_textдля трассировки и fallback text resolver, но не используется как canonical representation характеристики. - В первой версии
POST /v1/estimates/proposalsвалидирует только единицы характеристик на входе; полнота пересчёта и размерности остаются зоной импортного адаптера и charnorm pipeline.
Рассмотренные альтернативы
Хранить единицы как пришли от клиента или поставщика
Отклонено: такой подход переносит проблему сравнения в каждый resolver и делает будущий подбор аналогов нестабильным.
Нормализовать единицы только внутри analog matching
Отклонено: тогда разные слои системы будут читать разные представления одной и той же характеристики. Нормализация должна быть invariant-ом данных, а не локальной эвристикой одного алгоритма.
Ссылки
docs/docs/20-architecture/schemas/api/public-api.openapi.yaml- ADR-0044: LLM gateway + char-pipeline foundation
- ADR-0045: Tier 3 LLM matcher
- ADR-0047: Canonical assignments strategies