⚠️ ЧЕРНОВИК. Требует проверки юристом до публикации. Это подготовленный текст, а не юридическая консультация. 🔴 Отдельно к проверке — §2: документ писался, когда юрисдикция считалась германской по месту сервера, и ссылки на нормы в нём германские. Решением от 15.08 контролёр — австрийский.
Документ описывает, на каком основании платформа записывает занятия, сколько хранит и как удаляет. Он же — источник текста согласия в приложении. Юристом НЕ проверен: это позиция владельца, записанная так, чтобы юрист мог её оценить, а разработчик — не разойтись с ней в коде.
Только дорожки участников звонка — отдельные аудио- и видеопотоки каждого человека (LiveKit TrackEgress, без сведения в реальном времени). Чат, сообщения и материалы курса записью не затрагиваются.
Записывается ровно тот, кто согласился. Строки согласия нет — дорожки человека не запускаются вовсе. Это не постобработка и не «вырезание из файла»: при выбранной форме записи дорожка либо пишется, либо не существует.
🔴 Юрисдикций здесь не одна, и это надо сказать прямо. Контролёр данных — австрийское лицо (решение владельца 15.08); сервер, на котором физически идёт запись, — в Германии; участники занятия могут находиться где угодно. Документ писался от места сервера, поэтому все ссылки на уголовные нормы в нём германские. Германское право при немецком сервере из картины не исчезает, но первым к контролёру применяется австрийское — и оно здесь не проверено.
LAWYER-QUESTIONS.md).Таблица call_recording_consents (миграция 0069): кто (MAS-субъект + Matrix-id), когда, к какой сессии записи, под какой редакцией текста (policy_version), и кем сделан выбор — самим участником или ведущим за себя в момент старта.
Меняется текст согласия — меняется policy_version (константа RECORDING_CONSENT_POLICY_VERSION). Без этого «он соглашался» через год означает «он соглашался неизвестно на что».
| Что | Срок | Чем обеспечивается |
|---|---|---|
Сырьё записи (дорожки в бакете _recordings/) |
14 дней с остановки; 3 дня после успешного оформления в урок | сборщик в тике RTC (purgeExpiredRecordings) + правило жизненного цикла бакета R2 как последняя страховка |
| Оформленный урок (HLS в бакете доставки) | пока школа его не удалит | это уже контент курса, а не запись занятия |
Строка сессии записи (call_recordings) |
бессрочно, с пометкой удаления | нужна, чтобы объяснить, что было и по какому основанию |
Текущее решение о записи (call_recording_consents) |
живёт вместе с сессией | ON DELETE CASCADE (0072): это рабочее состояние «кого пишем», а не доказательство |
Журнал решений (call_recording_consent_log) |
5 лет с момента решения; удаление записи его не снимает | триггер append-only не даёт стереть строку раньше срока, call_recording_consent_log_purge() убирает после (0072) |
🔴 Почему у сырья ДВА срока (решение владельца 04.08). Сырьё — это отдельные дорожки каждого участника; они занимают в разы больше готового урока и нужны ровно до сведения. После оформления урок лежит в бакете доставки, а дорожки остаются копией, за которую платит диск сервера — тот же, где Postgres домена. Три дня после оформления оставлены на «сведение вышло кривым, переделайте»; 14 дней общего срока — на «руки не дошли оформить». Тридцать дней избыточны: диск переполнится раньше, чем эта копия пригодится.
🔴 Доказательство — журнал решений, а не «текущее согласие». Текущее решение перезаписывается, когда человек передумал: после отзыва в нём лежит «он отказался» и ничего о двадцати минутах до этого, когда его писали законно. Поэтому каждое решение отдельной неизменяемой строкой уходит в журнал, и именно журнал переживает удаление записи. Основание хранения — защита правовых требований (GDPR Art. 17(3)(e)).
🔴 Почему 5 лет, а не «бессрочно». Хранить персональные данные вечно — не строгость, а отсутствие политики: GDPR Art. 5(1)(e) требует названного срока. Считаем его от того самого риска, ради которого храним:
🔴 Обе строки выше — германский вывод, и вместе с юрисдикцией он под вопросом. Пятилетний срок получен из германской санкции через германское правило о давности; у австрийского аналога и санкция, и правило давности свои, и итог может оказаться другим — скорее короче. Мы это не пересчитываем сами: вопрос D5 в LAWYER-QUESTIONS.md.
Срок задан в схеме (call_recording_consent_log_retention()), а не в коде и не в этом тексте: изменить его можно только новой миграцией — решением с датой и обоснованием. Поэтому другое число в ответе юриста будет стоить не правки абзаца, а миграции, и ответ лучше получить до того, как в журнале накопятся живые строки.
Удаление аккаунта запись в журнале не снимает по той же причине. subject_sub — псевдоним MAS, сам по себе личность не раскрывающий.
POST /admin/call-recordings/:id/delete (гейт calls.record).storage_prefix + id/), а не по вычисленному заново: схема именования могла смениться, а удалить надо ровно то, что было.deleted_at; ключи объектов в дорожках обнуляются (они больше ничего не адресуют).consents_kept: true). Он читается и после того, как сессия исчезнет физически: комната записи продублирована в самой строке (0072).Отзыв всегда действует на будущее: дорожки останавливаются немедленно, а уже записанный объект сносится. Но если урок был сведён и выложен ДО отзыва, вырезать из готового микса один голос нечем — это единый файл.
Поэтому такой отзыв не пропадает молча: в панели школы у записи появляется список withdrawn_after_publish — кто отозвал согласие уже после оформления. Решение принимает школа: снять урок, перевыпустить его без этого участника (запись оформляется заново из сырья, пока оно живо) или договориться с человеком. Продуктовое решение владельца 04.08: отзыв исключает из будущих оформлений всегда, а уже проданный урок правит человек, а не автоматика.
Сегодня удаление — операция над сессией целиком, а не над одним участником: сведённый урок — единый файл, из которого нельзя вынуть один голос задним числом. Практический ответ участнику: удаляется вся запись занятия. Поэтому отказ ДО начала (или отзыв во время) — единственный способ не попасть в неё, и интерфейс говорит об этом прямо.