猶予期間の編集は「skip_review_media_groups」のメディアレビューをバイパスする

概要

「メディアレビュー」チェック(skip_review_media_groups サイト設定)は、NewPostManager における投稿作成時のみ適用されます。編集は PostRevisor を通じて行われますが、これはメディアチェックを実行しません。そのため、ユーザーはまずプレーンテキストを投稿して(レビューを通過し)、その後編集で画像を追加することができます。この場合、投稿はレビューキューに送られることはありません。

さらに悪いことに、編集が editing_grace_period(デフォルト5分)以内に行われ、差分が editing_grace_period_max_diff(デフォルト100文字——単一のアップロード画像のマークダウン行は約40〜60文字)より小さい場合、その編集は改訂履歴や鉛筆アイコンを作成しません。そのため、この回避行動はUI上完全に不可視となります。

再現手順

  1. skip_review_media_groups を設定し、一般ユーザー(例:TL0/TL1)が除外されないようにします。メディアを含む投稿は承認が必要となります。
  2. 一般ユーザーとして、テキストのみを含む投稿を作成します。通常通り承認/投稿されます(メディアなし → レビュー不要)。
  3. グレース期間内に投稿を編集し、アップロードした画像を挿入します。

期待される結果

(現在メディアを含む)投稿はレビューキューに送られるか、少なくとも編集は投稿作成時と同じメディアチェックの対象となるはずです。

実際の結果

  • 画像付きの投稿が公開され、レビューキューには送られません。
  • 改訂履歴は作成されず、編集のインジケーターも表示されません。

証拠(本番インスタンス)

p.version                                   # => 1
PostRevision.where(post_id: p.id).count     # => 0
p.created_at                                # => 2026-07-30 07:33:28 UTC
p.updated_at                                # => 2026-07-30 07:34:00 UTC
UploadReference.where(target: p).pluck(:created_at)
                                            # => [2026-07-30 07:34:01 UTC]

07:33:28 にテキストのみで投稿が作成され、約32秒後に編集で画像が追加されました。可視の編集履歴はなく、レビューも発生していません。

関連コード

  • lib/new_post_manager.rb — post_needs_approval?contains_embedded_media? を通じて :contains_media を返しますが、これは新規投稿時のみ実行されます。
  • app/models/post_analyzer.rb#embedded_media_count — メディアカウントのロジック。
  • PostRevisor — 編集時に同等のメディアチェックがありません。

提案される修正

PostRevisor でも contains_media チェックを実行してください(編集がメディアを導入し、編集者が skip_review_media_groups に属さず、スタッフでもない場合)。編集された投稿の ReviewablePost をキューに投入します。

「いいね!」 2

報告ありがとうございます @Editor0732 :+1: 以下のPRで修正されます

このPRをデプロイしてみて、新規投稿編集の間でメディアモデレーションの仕組みに非対称性があることに気づきました。この問題について提起させていただきます:

メディアを含む新規投稿 — ReviewableQueuedPost(公開前にレビュー)

  • 投稿は全く作成されません。承認されるまで、コンテンツはレビュー対象のペイロード内に保持されます
  • 投稿者はトピックページで「承認待ち」セクション(pending_posts)を確認できます
  • モデレーターが承認すると(perform_approve_postPostCreator)、初めて投稿が全員に可視化されます
  • 拒否の場合、コンテンツは破棄されます。一度も公開されたことはありません

メディアを追加する編集 — ReviewablePost(まず公開し、その後レビュー)

  • 編集は即時に反映されます。新しいバージョン(画像を含む)は瞬時に全員に可視化されます
  • 投稿者には**「レビュー中」の通知がありません**。また、グレース期間内の編集ではリビジョンも作成されないため、UI上に元のコンテンツの痕跡は残されません
  • 拒否の場合、投稿は削除されます(perform_reject_and_delete)。前のリビジョンから復元可能です

懸念点

現在のアプローチでは、モデレーターが対応する前に問題のある画像が公開状態になります。レビューの処理時間によっては、長時間公開される可能性があります。これはskip_review_media_groupsの本来の目的を弱めるように思えます。この設定の説明では、メディアを含む投稿は「スタッフによるレビューのために送られます」とされており、これはその間公開されないことを意味しているように読めます。

改善案

  1. 編集内容を適用するのではなく、キューに追加する(こちらの方が良いと考えます)。編集で新しいメディアが導入された場合、投稿は変更せず、投稿者に対して新しい編集がレビュー待ちであることを通知し、モデレーターが承認した後にのみ編集内容を投稿に適用します。拒否の場合は破棄します。これにより、新規投稿の動作に可能な限り近づけます。(実装面では、既存の投稿に対してreviseを実行する承認処理を行うレビュー可能バリアントが必要になります。)

  2. 編集で新しいメディアが導入された場合、投稿を非表示にする。これにより、投稿者だけが「承認待ち」の通知付きで投稿を見ることができ、承認時には既存のperform_approve_and_unhideアクションを使用します。ReviewablePostのアクションは既にこれをサポートしています。

この件を検証していただき、ありがとうございます。私も同意しますが、現在のレビューシステムは「レビュー中/保留中の編集」を適切に処理できるようには構築されていません :thinking:

これはかなり複雑な課題であり、計画を立てて対応するにはもう少し時間が必要になるでしょう。