удалён вход Telegram, владелец записи стал обязателен в схеме
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка входа при старте, секция настроек и зависимость go-telegram-bot-api; из конвейера ушла доставка ответа отправителю — исход виден опросом готовности. Колонки адресата и значение источника остались в схеме: применённые шаги не переписываются - шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла; существующие строки он не проверяет, и это принято сознательно — искать их надо запросом до выкладки - ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
This commit is contained in:
@@ -4,14 +4,16 @@
|
||||
[записки разведки](pocketbase.md) отличаются предметом: та мерила, **что даёт
|
||||
панель**, эта — **что библиотека делает молча**, если её не переубедить.
|
||||
|
||||
Все четыре наблюдения нашлись ревью, а не чтением документации: три из них
|
||||
выглядят как «значение по умолчанию — нет ограничения», а значат обратное.
|
||||
Наблюдения нашлись ревью, а не чтением документации, и все об одном роде промаха:
|
||||
объявление библиотеки выглядит как «ограничения нет» либо «ограничение есть», а
|
||||
значит обратное.
|
||||
|
||||
## Как снималось
|
||||
|
||||
Версия **0.39.10**, та же, что у первой записки. Прогоны — на пустом каталоге
|
||||
данных во временном каталоге и на поднятом сервере `127.0.0.1:18099`; боевые
|
||||
данные и ключи не участвовали. Числа ниже сняты 2026-08-11 и 2026-08-12.
|
||||
данные и ключи не участвовали. Числа сняты 2026-08-11 и 2026-08-12, последнее
|
||||
наблюдение — 2026-08-15.
|
||||
|
||||
## Нулевой потолок у поля файла значит 5 МиБ, а не «без предела»
|
||||
|
||||
@@ -86,6 +88,34 @@ core/field_file.go:310 if f.MaxSize <= 0 { return DefaultFileFieldMaxSize }
|
||||
прогоном: при первом запуске строка со ссылкой в журнале есть, после заведения
|
||||
владельца при следующем запуске её нет.
|
||||
|
||||
## Обязательность связи проверяется у записи, а не у колонки
|
||||
|
||||
`Required` у поля связи — правило **проверки записи при сохранении**, а не
|
||||
ограничение таблицы. Шаг схемы, объявляющий колонку обязательной на базе, где уже
|
||||
лежат строки с пустым значением, проходит **зелёным** и такие строки оставляет:
|
||||
|
||||
```
|
||||
core/field_relation.go:156 ColumnType отдаёт TEXT DEFAULT '' NOT NULL — от Required не зависит
|
||||
core/collection_validate.go ни одной проверки, читающей существующие строки
|
||||
```
|
||||
|
||||
Проверено прогоном 2026-08-15 на копии хранилища во временном каталоге: строка с
|
||||
пустым владельцем заведена до шага, шаг применён тем же кодом, что и на подъёме,
|
||||
и вывод:
|
||||
|
||||
```
|
||||
STEP 003 (Required=true) поверх ничьей записи: err=<nil>
|
||||
ПОСЛЕ ШАГА: строка на месте, owner=""
|
||||
Save остановленной ничьей записи: err=failed to update audio record: owner: cannot be blank.
|
||||
```
|
||||
|
||||
Следствие для нас: оставленная строка становится **незакрываемой**. Захват идёт
|
||||
сырым запросом мимо проверки и выдаёт её воркеру, а всякое сохранение отказывает —
|
||||
включая то, которым ставится признак остановки. Искать такие строки надо запросом
|
||||
до выкладки, а не прогоном самого шага: прогон чистую базу от грязной не
|
||||
отличает. Цена решения записана в
|
||||
[adr/ADR-2026-08-15-owner-required-by-schema.md](../adr/ADR-2026-08-15-owner-required-by-schema.md).
|
||||
|
||||
## Чего эта записка не узнала
|
||||
|
||||
- **Во что обходится потолок в 8 ГиБ на диске.** Число выбрано расчётом из
|
||||
@@ -96,3 +126,6 @@ core/field_file.go:310 if f.MaxSize <= 0 { return DefaultFileFieldMaxSize }
|
||||
— нет.
|
||||
- **Поведение под одновременной правкой панели и конвейера в бою.** Проверено
|
||||
тестом на одной машине, не живой нагрузкой.
|
||||
- **Сколько строк с пустой связью выдерживает смена признака обязательности.**
|
||||
Проверено на одной строке: суть наблюдения — сам факт отсутствия проверки, а не
|
||||
её цена на объёме.
|
||||
|
||||
Reference in New Issue
Block a user