← Ко всем документамEnglish

Запись занятий: основание, хранение, удаление

⚠️ ЧЕРНОВИК. Требует проверки юристом до публикации. Это подготовленный текст, а не юридическая консультация. 🔴 Отдельно к проверке — §2: документ писался, когда юрисдикция считалась германской по месту сервера, и ссылки на нормы в нём германские. Решением от 15.08 контролёр — австрийский.

Документ описывает, на каком основании платформа записывает занятия, сколько хранит и как удаляет. Он же — источник текста согласия в приложении. Юристом НЕ проверен: это позиция владельца, записанная так, чтобы юрист мог её оценить, а разработчик — не разойтись с ней в коде.

1. Что записывается

Только дорожки участников звонка — отдельные аудио- и видеопотоки каждого человека (LiveKit TrackEgress, без сведения в реальном времени). Чат, сообщения и материалы курса записью не затрагиваются.

Записывается ровно тот, кто согласился. Строки согласия нет — дорожки человека не запускаются вовсе. Это не постобработка и не «вырезание из файла»: при выбранной форме записи дорожка либо пишется, либо не существует.

2. Правовое основание

🔴 Юрисдикций здесь не одна, и это надо сказать прямо. Контролёр данных — австрийское лицо (решение владельца 15.08); сервер, на котором физически идёт запись, — в Германии; участники занятия могут находиться где угодно. Документ писался от места сервера, поэтому все ссылки на уголовные нормы в нём германские. Германское право при немецком сервере из картины не исчезает, но первым к контролёру применяется австрийское — и оно здесь не проверено.

Что именно фиксируется

Таблица call_recording_consents (миграция 0069): кто (MAS-субъект + Matrix-id), когда, к какой сессии записи, под какой редакцией текста (policy_version), и кем сделан выбор — самим участником или ведущим за себя в момент старта.

Меняется текст согласия — меняется policy_version (константа RECORDING_CONSENT_POLICY_VERSION). Без этого «он соглашался» через год означает «он соглашался неизвестно на что».

3. Сроки хранения

Что Срок Чем обеспечивается
Сырьё записи (дорожки в бакете _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, сам по себе личность не раскрывающий.

4. Процедура удаления

  1. Школа: панель → комната → «Записи занятий» → выбрать запись → «Удалить». Технически — POST /admin/call-recordings/:id/delete (гейт calls.record).
  2. Объекты записи сносятся из бакета по префиксу, записанному в строке (storage_prefix + id/), а не по вычисленному заново: схема именования могла смениться, а удалить надо ровно то, что было.
  3. Строка сессии помечается deleted_at; ключи объектов в дорожках обнуляются (они больше ничего не адресуют).
  4. Журнал решений остаётся. Ответ роута говорит это прямо (consents_kept: true). Он читается и после того, как сессия исчезнет физически: комната записи продублирована в самой строке (0072).
  5. Уже оформленный урок НЕ удаляется вместе с исходником: это отдельная сущность курса. Чтобы убрать и его — удалить ассет в медиатеке школы.

Отзыв согласия ПОСЛЕ того, как урок уже оформлен

Отзыв всегда действует на будущее: дорожки останавливаются немедленно, а уже записанный объект сносится. Но если урок был сведён и выложен ДО отзыва, вырезать из готового микса один голос нечем — это единый файл.

Поэтому такой отзыв не пропадает молча: в панели школы у записи появляется список withdrawn_after_publish — кто отозвал согласие уже после оформления. Решение принимает школа: снять урок, перевыпустить его без этого участника (запись оформляется заново из сырья, пока оно живо) или договориться с человеком. Продуктовое решение владельца 04.08: отзыв исключает из будущих оформлений всегда, а уже проданный урок правит человек, а не автоматика.

Запрос участника «удалите мою запись»

Сегодня удаление — операция над сессией целиком, а не над одним участником: сведённый урок — единый файл, из которого нельзя вынуть один голос задним числом. Практический ответ участнику: удаляется вся запись занятия. Поэтому отказ ДО начала (или отзыв во время) — единственный способ не попасть в неё, и интерфейс говорит об этом прямо.

5. Что показывается человеку

6. Открытые вопросы к юристу

  1. Достаточно ли согласия в приложении, или требуется отдельная форма (текст + подтверждение) при первом вступлении в школу?
  2. Нужно ли информировать участников до входа в звонок (например, в описании занятия), а не только в момент старта записи?
  3. Срок хранения сырья 14 дней (3 дня после оформления) и журнала решений 5 лет (§ 78 Abs. 3 Nr. 4 StGB — германский вывод, см. §3) — приемлемо ли соотношение, и не короче ли должен быть журнал при обычном занятии без спора? 🔴 И главное: какое число получается у австрийского контролёра?
  4. Запись как товар (урок курса, продающийся дальше) — меняет ли это требования к согласию (в частности, нужно ли отдельное согласие на коммерческое использование)?
  5. Несовершеннолетние участники — требуется ли согласие представителя и как его фиксировать?