## Why Сегодня знание идентификатора задачи и есть право её читать: всякий вошедший видит любую расшифровку по её идентификатору — свою, соседа, чью угодно. Паспорт обещает приглашённому пользователю обратное: «каждый видит только свои записи». Разграничение стоит первым в очереди не само по себе. На владельце записи стоят список записей, дедупликация, удаление, учёт расхода и квота — всё, что проект собирается делать дальше. Заводить их поверх общей кучи записей значит переделать каждое из них потом. ## What Changes - У записи появляется **владелец** — учётная запись, от имени которой её завели. Назначается он один раз, при приёме, и больше не меняется. - **Опрос готовности отдаёт только свои записи.** Чужая запись по её идентификатору отвечает «не найдено» — тем же ответом, что и несуществующая. Отдельного «доступ запрещён» нет намеренно: по нему перебирается список заведённых задач. - **Приём по HTTP заводит владельца** из предъявленной сессии. Приём без сессии отказывал и раньше, и это не меняется. - **Конвейер владельцем не сужается**: расшифровка идёт для всех записей подряд, как и прежде. Владелец решает, кому запись показывать, а не кому её считать. - **BREAKING** для содержимого базы: колонка владельца добавляется шагом схемы, и записи, заведённые до него, владельца не получают. Данные не переносим — проект заводится с чистого листа, так решено рамками задачи. Записи, пришедшие ботом, владельца здесь не получают: связи чата Telegram с учётной записью приложения ещё нет, её заводит следующая задача. Что это значит для обязательности колонки — развилка, вынесенная в design.md и на чекпоинт. ## Capabilities ### New Capabilities Новых нет: разграничение доступа — это поведение уже заведённой `access`, а не новый домен. ### Modified Capabilities - `access`: появляется владелец записи и правило «чужая запись неотличима от несуществующей». Сегодня спека прямо говорит обратное — «разграничения записей по владельцу здесь нет». - `intake`: приём назначает владельца принятой записи, опрос готовности сужается владельцем. Обе строки спеки, обещающие обратное, снимаются. - `pipeline`: записывается то, что до сих пор было умолчанием, — выборка задачи воркером владельцем не сужается. - `storage`: у задачи в схеме появляется колонка владельца, и заводится она без умолчания. ## Impact - схема хранилища: новый шаг с колонкой владельца в таблице задач; `docs/database.md`; - `internal/entity`, `internal/contract`: у задачи появляется владелец, чтение сужается им; - `internal/adapter/repo/pocketbase`: четыре места правки колонок очереди — `applyToRecord`, `recordToJob`, `acquireColumns`, `acquiredRow`; - `internal/service`: оба метода заведения задачи; - `internal/controller/http`: опрос готовности и приём; - публичный контракт `GET /api/status/{id}`: чужая запись начинает отвечать `404` там, где прежде отдавала содержимое. Форма ответа не меняется.