## Context Реализация — PR RSHB/arm-core#114 (AURORA-1537). Шахматка — чистая функция от сводной ОСВ версии, периметра и выбранных счетов; в БД не хранится (инвариант «производные консолидации не хранятся», DECISION-5). ## Decisions 1. Матрица считается поверх `ConsolidatedOsvService.build_with_members` (бывший приватный `_build`): строки свода и участники периметра берутся из того же расчёта, что и сводная ОСВ; в `SourceRow`/`ConsolidatedRow` добавлено `account_id`. 2. Пара `(A, B)`: сторона 1 — дебет ОСВ A по контрагенту B, сторона 2 — кредит ОСВ B по контрагенту A. Расчёт поддерживает показатели `closing`/`turnover`, но в режимах ALL и MANUAL всегда используется конечное сальдо (`closing`). 3. Режим ALL берёт все счета вида `A`/`AP` (дебет) и `P`/`AP` (кредит); MANUAL раскрывает выбранные счета по иерархии `chart_of_account` и фильтрует по виду. 4. Порог расхождения 5 % проверяется по точному значению до округления; суммы в JSON — десятичные строки с двумя знаками (`ROUND_HALF_UP`). 5. Строки пары без `account_id` в суммы не входят и считаются в `skipped_osv_entry_count`. 6. Результирующая таблица — пять фиксированных статей (`RESULT_ARTICLES`) со списками кодов счетов и исключений; отсутствие любого кода в плане счетов — 422 `RESULT_ACCOUNTS_MISSING`. 7. xlsx: имя файла `intercompany-matrix_<ГК>_<год>-<квартал>_v.xlsx`; каждая выгрузка пишет собственное событие `audit_event(EXPORT)`. 8. Сверка с эталоном «Русский бисквит» — только по точным парам счетов и компаний; общая сумма элиминации эталона не приравнивается к минимуму по паре (решение владельца 08.10.2026). ## Known issues Требования ниже описывают текущее поведение; дефекты вынесены в задачи Jira и в этом change не исправляются. - AURORA-1651: `one_sided` считается по наличию исходных записей, а не по суммам и строкам-основаниям — пара «100 млн против строки с нулевым сальдо» не подсвечивается, «0 против 0» подсвечивается ложно; подсветка таких пар в xlsx; режим ALL захватывает забалансовые счета 001–012. - AURORA-1652: `GET …/elimination-rules` пуст до задачи 1536, хотя требование описывает непустой ответ; формат сумм результирующей таблицы `"0"` вместо `"0.00"` (расхождение с форматом матрицы); ссылки на §§ в docstring; ссылка README на гайд фронта. - AURORA-1653: переход «ячейка → сводная ОСВ» — фильтр по паре в `GET …/osv`; `osv_entry_ids_*` содержат ID нулевых строк и не отсортированы. ## Decisions made without discussion - 16.10.2026. Требования автора перенесены из `openspec/specs/*` в дельты `ADDED` дословно, без правки содержания. Обоснование: владелец поручил оформить change процессно, а содержательные замечания ревью уже вынесены в задачи. Цена ошибки: низкая — текст можно поправить в этом же change'е до архивации. - 16.10.2026. Спека фиксирует текущее поведение, включая семантику `one_sided` и формат `"0"` результирующей таблицы; исправление требований идёт вместе с кодом в AURORA-1651/1652/1653 (там же MODIFIED-дельты). Обоснование: иначе спека разойдётся с кодом PR. Цена ошибки: до исправления спека описывает известные дефекты (отмечены в `## Known issues`). - 16.10.2026. Все требования оформлены как `ADDED` в существующих capability, новая capability не заводится. Обоснование: шахматка — отчёт по сводной ОСВ (consolidated-osv), API версий (consolidations-api), справочников и аудита; отдельная capability дробила бы уже согласованную структуру. Цена ошибки: низкая, перенос между capability — правка путей дельт.