diff --git a/openspec/changes/slice-3a-ocr-normalizer/design.md b/openspec/changes/slice-3a-ocr-normalizer/design.md index a7e04c5..6b32a75 100644 --- a/openspec/changes/slice-3a-ocr-normalizer/design.md +++ b/openspec/changes/slice-3a-ocr-normalizer/design.md @@ -174,3 +174,4 @@ docs: bounded-PR (`03-architecture.md`, OQ-137, §11.1 п. 6 и 9, новые OQ | 32 | 2026-10-07 | R-14 (финальное ревью). Локальная запись: `.part` создаётся заново (удаление старого + `O_EXCL`), fallback `os.replace` — только вокруг `os.link`, `EOPNOTSUPP` добавлен к списку | `.part`, оставшийся жёсткой ссылкой на уже опубликованный файл (подавленное удаление, OQ-144), перезаписывался бы на месте и портил файл, который читает ИС; EPERM на записи маскировался `FileNotFoundError` | — | | 33 | 2026-10-07 | R-15 (финальное ревью, T1.3). Загрузчик yaml отклоняет повторяющиеся ключи (`SafeLoader` с проверкой) | спека: «Коды справочника SHALL быть без дублей»; `safe_load` молча перезаписывает дубли, тест `len(set)` тавтологичен; владелец заполняет `fsbu4` вручную | битый справочник не стартует — это и нужно | | 34 | 2026-10-07 | R-16 (финальное ревью I-2). №15 (повтор кода → остаётся первая строка) НЕ меняется: в aep_6 ОФР код 2410 повторён, и оставленная первая строка пуста, а отброшенная (`(649)`) — со значением; выбор «первая с суммой» отложен владельцу как OQ | паритет с Excel-путём 2b (§12 п. 5); эвристика «первая с суммой» для aep_3 даёт иное, чем для aep_6 — нужна проверка на стенде | сумма отброшенной строки остаётся только в `raw/`; предупреждение «код N повторяется» сигнализирует аналитику | +| 35 | 2026-10-07 | R-17. `put` при уже существующем назначении ничего не пишет и не трогает `.part` (при включённой очистке — снимает существующий `.part`); `.part` от прерванной записи перед новой записью удаляется с подавлением ошибки; запись поверх оставшегося `.part` без назначения — только при `st_nlink == 1` | после №32 неудаляемый `.part` (нет права удаления, OQ-144) на повторе задания давал бы `PermissionError` → `RECOGNITION_FAILED` для уже доставленного файла | редкий остаток `.part` в `Tmp` без права удаления |