2026-10-18 13:11:49 +04:00

12 KiB
Raw Blame History

Context

Реализация плана 6 сквозного change unified-statement-normalization (../docs/openspec/changes/unified-statement-normalization/, спека specs/arm-web/spec.md). Вся логика экрана — чистые функции в .ts с vitest-тестами, компоненты React только рисуют их результат. Черновик правок аналитика — одна структура StatementDraft, из которой одна функция собирает тело единственного PATCH. Подробный план — docs/superpowers/plans/2026-10-18-statements-v2.md.

Decisions made without discussion

Дата: 2026-10-18. Решения плана, принятые без обсуждения с владельцем; если решение неверно, цена ошибки — в последнем столбце.

Маркер Решение Обоснование Цена ошибки
P6-1 Подсказка кода — StatementOut.edition_lines (справочник строк редакции формы, у формы без даты — всех редакций; план 3 P3-22), затем коды строк ok файла, которых в справочнике нет (имя — reference_name ?? line_name); отдельного запроса нет справочник приходит с ответом формы нет
P6-2 Якорь строки unreadable / missing — строка ok из источника (row_index не null) с наибольшим row_index меньше своего; якорь detail — строка ok из источника с row_index = parent_row_index; нет якоря (в том числе detail с parent_row_index = null или указывающим не на ok) — в начало первого раздела (после ведущих заголовков разделов; у ОФР — в начало таблицы). Вложение встаёт сразу после строки-якоря; несколько вложений одного якоря — по row_index спека arm-web «Раскладка», S-62 («строка detail без родителя на экране — в начале раздела»), P3-17 (тот же порядок вложений в ответе ядра) нет
P6-3 Скрытие (пустые подстроки, расшифровки) применяется после раскладки, фильтром иначе скрытый якорь сдвинул бы вложения к соседу нет
P6-4 Справочное имя (reference_name) — основное; файловое (line_name, после срезания приклеенных заголовков разделов) показывается вторым серым текстом, только если отличается после нормализации: нижний регистр, ё → е, оставлены только буквы и цифры переносы OCR («задолжен-ность») не должны давать ложного «отличается» лишнее или пропущенное второе имя — только показ
P6-5 Маркеры «у места» строятся из всех записей issues (в том числе relation / soft — у них line_ids + column_id); список IssuesPanel показывает только kind = warning; нарушения §7 остаются списком в ChecksPanel (из checks, с акцептом) и получают ссылку «Показать» по line_ids[0]. Запись с column_id без line_ids (например, COLUMN_WITHOUT_DATE) показывается у заголовка колонки; поле шапки, которого нет в блоке шапки, и строки, которых нет в ответе, — у документа одна запись не дублируется в двух списках; заголовок колонки — естественное место для предупреждения о дате колонки нет
P6-6 Подтверждение ячейки — в черновике; доступно, только если у строки есть id и у значения есть id (у достроенных ячеек — нет, ядро ответит UNKNOWN_CELL); сумма в черновике той же ячейки отменяет её подтверждение PATCH: в элементе values ровно одно из amount / confirmed; правка суммы и так снимает needs_review нет
P6-7 Одно действие на строку в черновике (code / detail / confirm), новое заменяет прежнее; пустое поле кода и код, равный текущему, — не действие; у достроенных шаблонных строк (id = null) действий строки нет 422 INVALID_LINE_PATCH при двух действиях; lines[] адресуется только line_id нет
P6-8 Сумма в шаблонную строку по line_code X и назначение кода X другой строке в одном сохранении — ошибка черновика «Код X назначается строке, а в шаблонную строку X введены суммы — сохраните по очереди», запрос не уходит ядро ответит 422 UNKNOWN_CELL (P3-10), а сообщение ядра не говорит, что делать нет
P6-9 Ошибка элемента lines[] (409 LINE_CODE_TAKEN, 422 INVALID_LINE_CODE, INVALID_LINE_PATCH, UNKNOWN_LINE, LINE_CODE_REQUIRED) показывается у поля кода строки detail.line_id (текст сервера в подсказке поля и message.error); строки с этим id на экране нет — текстом над таблицей ядро отдаёт detail.line_id и detail.line_code (план 3 P3-24) нет
P6-10 Строка «неразобранная» для кнопки «Подтвердить данные» — line_status ∈ {unreadable, missing} и хотя бы у одного значения amount !== null или string_value !== null (ровно условие ядра для 409 LINES_UNRESOLVED) кнопка и сервер считают одинаково нет
P6-11 Подтверждение даты отчёта — кнопка «Подтвердить дату» у поля из needs_review_fields (уходит header.report_date тем же значением); дата колонки — поле ГГГГ-ММ-ДД у заголовка колонки (как поле даты отчёта) с кнопкой «Подтвердить дату», если дата есть и у колонки COLUMN_DATE_UNCERTAIN / COLUMN_WITHOUT_DATE перепечатывать ту же дату ради подтверждения неочевидно; формат ввода — как у существующего поля даты нет
P6-12 Панель файлов: у строки документа — значок с числом «предупреждения файла (job.warnings) + issue_counts.error + issue_counts.info» документа, красный при хотя бы одном error (в файле или issue_counts.error > 0); у строки файла без документов — только job.warnings; нуль — значка нет. Клик открывает список: предупреждения файла (message и locator), job.mapping_warnings (как info) и DocumentOut.issues документа, загружаемые при открытии (GET /documents/{id}) DocumentBrief.issue_counts (план 3 P3-23) помечает документ без запроса на каждый; подробности — по клику акцептованное нарушение тоже даёт значок — подробности в списке
P6-13 job.warnings на клиенте нормализуется так же, как ядро: строка → {code: "LEGACY_WARNING", severity: "info", message, locator: null}, объект с code, severity ∈ {error, info}, message — как есть, прочее пропускается, не список → [] экран не падает при ошибке порядка выкладки нет
P6-14 Сценарий T11 — на локальном стенде; строки unreadable / missing / detail и записи issues всех видов подставляются перехватом GET и PATCH …/statement (page.route) из фикстуры плана, пока сервисы шлют 1.x; на реальных формах 1.x — регрессия до шага 5 выкладки 2.0-данных на стенде нет повторный прогон на aep_3 после шага 5 — follow-up
P6-15 Цвета: ячейка needs_review — #fff7e6, исправлено — #e6f4ff, строка unreadable / missing целиком — #fff1f0, строка ok с needs_review — фон ячеек наименования и кода #fff7e6; подтверждённая ячейка — маленькая серая галочка перед суммой; уровень error — красный значок ExclamationCircleOutlined #cf1322, info — синий InfoCircleOutlined #1677ff палитра уже используется на экране и в панели файлов только вид
P6-16 Ячейка кода: ok — код; unreadable — серым line_code_text (пусто — «—»), подсказка «Код не распознан: «<текст>»»; missing — серым «—», подсказка «Кода в строке нет»; detail — пусто, подсказка «Расшифровка — в суммы формы не входит»; у ok в подсказке «Уверенность кода: N%» (если меньше 100 и код не правлен), «Код подтверждён», «Код назначен аналитиком» спека: «в ячейке кода серым — сырой текст с подсказкой» только вид
P6-17 header.source.<поле>.confidence — string | null (строка Decimal, как прочие уверенности API, план 3 P3-20), в подсказке — Number() и округление до целого одно правило для всех уверенностей нет
P6-18 node_modules worktree — симлинк на установленный каталог с eslint, prettier и vitest 3.1.4; поэтому вместо make check (он начинается с npm install и поставил бы пакеты в чужой каталог) гоняется make lint typecheck test build — те же проверки без установки память владельца: симлинк, как в прежних срезах нет; в описании PR сказано, что install пропущен
P6-19 Предупреждения ОСВ-документа (DocumentOut.issues, OSV_*) — блок IssuesPanel над таблицей экрана ОСВ, все записи — у документа (строки ОСВ не адресуются line_ids) спека: «предупреждения листа ОСВ … из DocumentOut.issues[]»; экран документа уже загружает DocumentOut нет

Решения контроллера и исполнителей поверх плана (R-n, O-n) дописываются сюда по ходу исполнения.