docs(openspec): решение №35 — повтор put при существующем назначении

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
Andrey Epifancev 2026-10-07 03:43:35 +04:00
parent 576ce2c205
commit b411b7e128

View File

@ -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` без права удаления |