Тема
Переход с универсальной записи на протоколы
Решение владельца от 22.09.2026: форму протокола задаёт контракт, а не компания. Семейство records устаревает 2026-12-31; до этой даты судья помечает его инструменты состоянием degraded с причиной deprecated (инструмент остаётся видим модели), с этой даты — excluded. Дату судья берёт из слепка: сервер, выпущенный до заката, о ней не знает; если сервер назвал в _meta более раннюю дату, действует она.
Роли первой волны → поля протокола
| Было | Стало |
|---|---|
роль поля title | title |
роль поля meeting_date | meeting_date |
роль поля source_url | source_url |
роль поля participants | participant_ids |
роль поля organizer | organizer_id |
роль поля status | status |
роль поля agenda | agenda |
роль поля body | body |
роль варианта статуса draft | значение status = draft |
роль варианта статуса done | значение status = done |
роль варианта статуса no_meeting | значение status = no_meeting |
Преемники
| Устаревает | Замена | Пояснение |
|---|---|---|
norm_record_targets | — | целей больше нет: право на протоколы — по инструменту, а не по списку баз |
norm_record_schema | — | схему компания не объявляет: ядро полей протокола зафиксировано в слепке |
norm_record_find | norm_protocols_list | список с фильтром meeting_ids заменяет пакетную проверку «есть ли запись» |
norm_record_hint | norm_protocol_types | подсказки едут в справочнике типов встреч одним ответом |
norm_record_upsert | norm_protocol_upsert | запись протокола ядром полей контракта, поведение записи сохранено |
Поля потребителя первой волны
Каждое поле, которое агент протоколов читал из семейства records, либо получило место в семействе protocols, либо выведено с причиной. Пути проверяются тестом против слепка.
| Поле потребителя | Преемник или причина вывода |
|---|---|
| record_schema → metrics.resolvedTarget | выведено: целей записи больше нет: протокол пишется без выбора базы |
| record_schema → metrics.fields[].key | выведено: состав полей задан слепком, читать его перед записью не нужно |
| record_schema → metrics.fields[].role | выведено: роли полей заменены именованным ядром протокола |
| record_schema → metrics.fields[].options[].hasHint | norm_protocol_types /data/types/items/hint |
| record_schema → metrics.fields[].options[].orgUnitId | norm_protocol_types /data/types/items/unit_id |
| record_schema → metrics.fields[].options[].membershipKind | norm_protocol_types /data/types/items/membership_kind |
| record_schema → metrics.fields[].fallbackHintOptionId | norm_protocol_types /data/fallback_type_id |
| record_schema → metrics.skipped | выведено: схему компания не объявляет, пропускать нечего |
| record_schema → metrics.warnings | выведено: схему компания не объявляет, предупреждать о ней нечего |
| record_schema → metrics.error.code | norm_protocol_types /data/error/code |
| record_find → metrics.records[].exists | norm_protocols_list /data/protocols/items/meeting_id |
| record_find → metrics.records[].key | norm_protocols_list /data/protocols/items/meeting_id |
| record_field_hint → metrics.hint.text | norm_protocol_types /data/types/items/hint/text |
| record_field_hint → metrics.truncated | norm_protocol_types /data/types/items/truncated |
| record_upsert → metrics.url | norm_protocol_upsert /data/url |
| record_upsert → metrics.error.code | norm_protocol_upsert /data/error/code |
| record_upsert → metrics.field (имя непринятого поля) | norm_protocol_upsert /data/rejected_fields/items/key |
| record_upsert → metrics.allowedTargets | выведено: целей записи больше нет |
| record_targets → metrics.targets[].id | выведено: целей записи больше нет; право на протоколы кабинет выводит из инструмента |
| record_targets → metrics.targets[].name | выведено: целей записи больше нет |
| record_targets → metrics.error.code | выведено: целей записи больше нет |