docs(openspec): решения A5 и открытые вопросы части А

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
This commit is contained in:
Andrey Epifancev 2026-10-18 19:29:55 +04:00
parent 70abf87809
commit c2ee31ddbb

View File

@ -74,6 +74,12 @@ Goals и Non-goals — см. `proposal.md`.
| 2026-10-18 | **A6-2.** `names()` — имена без повторов в порядке редакций и появления; `edition_codes` — по всем записям | стабильность подсказки | нет |
| 2026-10-18 | **A6-3.** Если «итого по разделу» только у одного из имён, номер у другого `None` — сравнение только по равенству строк | спека | нет |
| 2026-10-18 | **A6-4.** Пустые справочные имена пропускаются | шум | нет |
| 2026-10-18 | **A5-1.** `FileWarning` наследует `DocumentWarning` (есть также `line_refs`/`column_index`/`field`): схема fileWarning = warning + locator | надмножество брифа, без дублирования полей | нет |
| 2026-10-18 | **A5-2.** `MetricsV2` наследует `Metrics` (переопределяет `warnings`); ветвление в `_metrics_json` идёт по классу конверта, не метрик | изоляция v1/v2 при общей базе метрик | v2-конверт обернул бы уже готовые структуры; покрыто `test_inbox_v2_warnings_kept` |
| 2026-10-18 | **A5-3.** `parse_message`/`parse_result`: не-2 MAJOR отдаётся модели v1, чей шаблон `^1\.\d+$` даёт `ValidationError` (3.0, «banana», нет поля); нечитаемый JSON в `parse_result` — `json.JSONDecodeError` (ValueError), не `ValidationError` | единая точка отказа для неподдерживаемых версий | вызывающий код, ждущий только `ValidationError`, пропустит ошибку чтения JSON (см. открытый вопрос) |
| 2026-10-18 | **A5-4.** У v2-предупреждения без `locator` в метрики пишется как пришло (ключа нет), у LEGACY — `locator: None` | не домысливать данные, не менять пришедшее | потребитель обязан читать `locator` как необязательный (`file_warnings` так и делает) |
| 2026-10-18 | **A5-5.** `RecognitionResultMessageV2` не наследует v1; общие поля вынесены в `_MessageBase` | изоляция `isinstance` между версиями | нет |
| 2026-10-18 | **A5-6.** `file_warnings`: `locator` не-строка/не-null -> объект пропускается | защита от мусора во входящем конверте | потеря предупреждения с некорректным locator |
| 2026-10-18 | **A6-5.** Старые тесты API обновлены под код 1105 в `fsbu4` (yaml дополнен 1105/1130/1140/1530/2460 и вторыми именами) | данные docs | для ГСК-кода 1105 на 66н с датой `fsbu4` появляется пустая строка «Гудвил» (O-2 A6) |
| 2026-10-18 | **A7-1.** `FailedCheck.codes` — поле с default `()`, участвует в сравнении | P3-14 | низкая |
| 2026-10-18 | **A7-2.** `insert_statement` до маппера 2.0 пишет `row_index` = порядковый номер строки черновика | иначе все строки источника стали бы `origin = template` | заменено в A9/части Б |
@ -133,3 +139,7 @@ Goals и Non-goals — см. `proposal.md`.
- **O-9.** Выкладка: PR части А в `main` без снимка контура до части Б; встроенный фронт `arm-core/web` получает новые типы только через `sync-web` после плана 6.
- **O-10.** Метрики `fields_*` ядро не считает по строкам формы (копирует из конверта, `recognition_exchange.FIELD_COUNTERS`). Подтвердить, что спека («метрики `fields_*`») не требует нового расчёта.
- **Наблюдение.** Хранимая вторая ББ теперь входит в ключи автозамещения: файл с ББ на 30.09.2025 и ББ на 31.12.2024 может заместить более старый файл; его ОФР при этом выпадает с предупреждением OQ-154.
- **A5-O1.** `parse_result` на битом JSON бросает `JSONDecodeError`/`UnicodeDecodeError`, а не `ValidationError`: в части Б при переключении `_load_result` ловить `ValueError`.
- **A5-O2.** `statement-code-orders.yaml` не скопирован в `api/contracts` (тест идентичности его не покрывает); при необходимости ядру — скопировать в части Б.
- **A5-O3.** `frontend-api-guide` в docs должен описывать `JobBrief.warnings` как объекты (docs, план 6).
- **Нумерация.** Пропуски в нумерации O-n (O-2, O-5, O-8) закрыты планом/рулингами Р-n.