Отредактированный пост в DiscourseHub на iOS иногда остаётся устаревшим до обновления

Я столкнулся с периодической проблемой: отредактированное сообщение успешно сохраняется, но уже отрендеренное сообщение в DiscourseHub на iOS иногда остаётся устаревшим, пока я не обновлю тему.

Окружение

Продакшен-сайт — это моя собственная самохостинговая установка Discourse, которую я использую в личных целях как личный архив для учёбы.

В момент, когда я воспроизвёл проблему сегодня:

  • Клиент: DiscourseHub на iPhone
  • iOS: 27.0.1
  • Продакшен Discourse: v2026.10.0-latest +112
  • Сайт: самохостинг, личный архив для учёбы
  • Браузер по умолчанию на iOS: iCab Mobile

Я сменил браузер по умолчанию на iCab Mobile из-за не связанной с этим проблемы с локальными загрузками. Однако это воспроизведение произошло, когда я использовал сайт Discourse внутри DiscourseHub, а не после открытия внешнего браузера, поэтому на данный момент я не считаю, что выбор браузера по умолчанию имеет значение.

Реальный рабочий процесс

Тема, где я заметил это, содержала примерно 50 сообщений, представляющих собой слайды лекций.

Мой обычный рабочий процесс:

  1. создать сообщение с изображением слайда лекции;
  2. позже последовательно пройти по теме;
  3. отредактировать каждое существующее сообщение;
  4. добавить транскрипт OCR / заметки под уже опубликованным изображением слайда;
  5. нажать Сохранить редактирование и перейти к следующему слайду.

Так что это не синтетические быстрые правки: это нормальный учебный рабочий процесс, в котором я последовательно добавляю транскрипты OCR к сообщениям с изображениями слайдов лекций.

Для более ранних сообщений в теме нажатие Сохранить редактирование сразу заменяло отображаемое сообщение на новый отредактированный контент, как и ожидалось.

Позже в той же теме я столкнулся с случаями, когда:

  1. Я отредактировал сообщение и добавил текст OCR.
  2. Нажал Сохранить редактирование.
  3. Редактирование успешно сохранилось.
  4. Сообщение, отображаемое в DiscourseHub, осталось со старым контентом.
  5. Обновление страницы сразу показало уже сохранённое редактирование.

Таким образом, само редактирование, похоже, прошло успешно. Устаревшая часть, похоже, связана с уже загруженным клиентским представлением сообщения.

Тест в среде разработки

Затем я создал полностью чистый экземпляр разработки из текущего upstream main:

833e1576d47 DEV: Update README.md note on self-hosting (#44320)

Я сгенерировал тему с 60 сообщениями, в каждом из которых было изображение, чтобы имитировать структуру продакшен-темы.

Затем я повторил рабочий процесс в Firefox на Linux, редактируя текст в существующих сообщениях с изображениями.

Сначала я заметил возможное устаревшее обновление около сообщения 19 в первом тесте. Однако, после более тщательного повторения эксперимента — включая создание новой темы с 60 сообщениями и последовательное редактирование сообщений — мне не удалось воспроизвести продакшен-поведение в Firefox/Linux на текущем main.

Там редактирования сразу перерисовывали сообщение после нажатия «Сохранить редактирование», включая случаи далеко за пределами первой группы сообщений в теме.

Это снижает мою уверенность в том, что пагинация темы или обычный поток из 20 сообщений является самой причиной.

Следующий тест

Продакшен-воспроизведение было в DiscourseHub на iOS, а не в PWA на домашнем экране.

Поэтому моим следующим запланированным сравнением будет:

  • текущий экземпляр разработки Discourse из upstream;
  • та же тема с 60 изображениями;
  • тот же iPhone с iOS 27.0.1;
  • сначала DiscourseHub;
  • Safari на том же iPhone в качестве контроля;
  • опционально веб-приложение на домашнем экране как ещё одно сравнение;
  • последовательное редактирование сообщений с использованием того же рабочего процесса в стиле OCR.

В данный момент мой ноутбук для разработки находится в сети eduroam, поэтому прямое подключение его локального сервера разработки к iPhone не является простым делом.

Является ли запуск экземпляра разработки с текущим main на том же iPhone в DiscourseHub правильным следующим шагом для сужения области поиска?

Если да, то есть ли предпочтительный способ, который команда Discourse использует для подключения локального экземпляра разработки к iPhone / DiscourseHub для тестирования, желательно по HTTPS?

При следующем возникновении проблемы я также могу оставить устаревшее сообщение без обновления и сделать видеозапись экрана, чтобы можно было напрямую сравнить успешное сохранение/состояние сервера с тем, что отображает уже открытый клиент DiscourseHub.

Возможно, связанное наблюдение

Это поведение на высоком уровне напоминает проблему с устаревшим состоянием клиента, с которой я столкнулся, работая над
PR #43285, «Обновление дат событий в списках тем».

Там был другой путь кода, и я не утверждаю, что это та же ошибка.

Однако наблюдаемый сбой был похож: состояние на стороне сервера могло быть правильным, в то время как уже загруженный клиент продолжал отображать устаревшее состояние, пока не произошло соответствующее обновление/повторное гидратирование.

С проблемой с датами событий мне удалось наблюдать ситуацию A/B на разных уже открытых клиентах в зависимости от времени.

Это заставляет меня задуматься, не находится ли эта проблема с редактированием где-то в цепочке уведомлений / обновления модели / рендеринга, а не в самом сбое редактирования.

Я тоже это замечал (хотя, честно говоря, не читал весь отчёт).