Refs #26 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
3.9 KiB
Spec Delta: recognition-contract
MODIFIED Requirements
Requirement: Файл результата
Файл результата SHALL соответствовать docs/contracts/recognition-result.schema.json v1.2: один файл (stored_file)
→ один job_id → массив documents из osvDocument и/или statementDocument; денежные значения — строки
^-?\d+(\.\d{1,2})?$; confidence — 0–100. Пустой массив documents допустим только при status = error.
У строки osvDocument.rows[] SHALL быть необязательное поле extra — объект «заголовок колонки → строка или null» для
колонок внутри таблицы, не сопоставленных с шестью суммами и ИНН (§1.2 «не терять»). У шапки osvDocument.header SHALL
быть необязательные period_start, period_end (дата или null — границы периода по шапке; для квартала и года —
первое и последнее число, для диапазона месяцев — его границы) и is_from_year_start (boolean или null; is_cumulative
не переопределяется). statementDocument.document_type SHALL допускать DISCLOSURE (расшифровка или иная форма
0710xxx: документ без columns и lines). У statementDocument SHALL быть необязательный объект checks:
relations_failed и soft_relations_failed — массивы {column_index, relation, expected, actual} (нарушенные
соотношения §7 по колонке; expected/actual — money), duplicate_line_codes — массив строк; отсутствие объекта
означает «не проверялось», пустые массивы — «проверено, сошлось». Потребители, не знающие новых полей и значений,
игнорируют их (MINOR). Производитель v1.2 пишет schema_version = "1.2"; файлы v1.0 и v1.1 остаются валидными.
Scenario: Результат валидируется примерами
- WHEN CI сервиса запускает тесты контракта
- THEN все файлы
docs/contracts/examples/result-*.jsonпроходят схему файла результата, а всеrequest-*.json/result-message-*.json— схемы сообщений
Scenario: Лишняя колонка сохранена
- WHEN в ОСВ между ИНН и суммами есть колонка «КПП»
- THEN у строк контрагентов
extra = {"КПП": "<значение>"}, файл проходит схему v1.2 и схему v1.0 (поле игнорируется)
Scenario: Форма из Excel с проверками
- WHEN tabular-parser разобрал книгу с балансом на двух листах, ОФР и пояснениями (
examples/result-statement-excel.json) - THEN файл проходит схему v1.2:
BALANCEсlocatorиз двух имён листов иchecksс нарушением вsoft_relations_failed,INCOMEс пустыми массивамиchecks,DISCLOSUREбезcolumns/lines; тот же файл безchecksи сdocument_type = OTHERвместоDISCLOSUREпроходит схему v1.1
Scenario: Границы периода ОСВ
- WHEN в шапке ОСВ период «Октябрь 2024 г. – Сентябрь 2025 г.»
- THEN
period_start = "2024-10-01",period_end = "2025-09-30",is_from_year_start = false; файл проходит схему v1.2, а потребитель v1.1 читает его без ошибок