Grace period 편집이 `skip_review_media_groups` 미디어 검토를 우회합니다

요약

“리뷰 미디어” 체크(skip_review_media_groups 사이트 설정)는 포스트 생성 시점에만 NewPostManager에서 적용됩니다. 수정은 PostRevisor를 통해 이루어지며, 여기서 미디어 체크가 실행되지 않습니다. 따라서 사용자는 먼저 순수 텍스트만 게시(리뷰 통과)한 뒤, 수정을 통해 이미지를 추가할 수 있으며, 이렇게 하면 해당 포스트가 리뷰 대기열에 들어가지 않습니다.

더 큰 문제는, 수정이 editing_grace_period(기본값 5분) 내에 이루어지고 diff가 editing_grace_period_max_diff(기본값 100자 — 업로드된 이미지 마크다운 한 줄은 약 40~60자)보다 작을 경우, 수정 이력(revision)이나 연필 아이콘이 생성되지 않아 UI에서 우회가 완전히 보이지 않는다는 점입니다.

재현 방법

  1. 일반 사용자(예: TL0/TL1)가 면제되지 않도록 skip_review_media_groups를 구성합니다. 미디어가 포함된 포스트는 승인이 필요해야 합니다.
  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)을 볼 수 있습니다.
  • 게시물은 moderater가 승인한 후에야(perform_approve_postPostCreator) 모든 사용자에게 표시됩니다.
  • 거부 시 콘텐츠는 폐기됩니다 — 공개된 적이 없었기 때문입니다.

미디어를 추가하는 편집 — ReviewablePost (먼저 게시, 나중에 검토)

  • 편집은 즉시 적용됩니다. 새 버전(이미지 포함)은 즉시 모든 사용자에게 표시됩니다.
  • 작성자에게 “검토 중” 알림이 없습니다 — 그리고 유예 기간 내 편집의 경우 리비전이 생성되지도 않아 원래 콘텐츠가 UI에 흔적을 남기지 않습니다.
  • 거부 시 게시물이 삭제됩니다(perform_reject_and_delete). 이전 리비전을 통해 복구할 수 있습니다.

우려 사항

현재 방식으로는 문제 있는 이미지가 moderater가 조치할 수 있기 전에 공개적으로 노출될 수 있으며, 검토 소요 시간에 따라 상당한 시간 동안 그럴 수 있습니다. 이는 skip_review_media_groups 설정의 본질을 약화시키는 것으로 보입니다. 해당 설정의 설명에는 미디어가 포함된 게시물이 "스태프 검토를 위해 전송된다"고 되어 있는데, 이는 그 사이에 공개되어서는 안 된다는 의미로 읽힙니다.

개선 제안

  1. 편집 내용을 적용하는 대신 대기열에 넣기. (이 방식이 더 좋다고 생각합니다) 편집이 새 미디어를 도입할 경우, 게시물은 변경되지 않은 상태로 유지하고, 작성자에게 새 편집이 검토 대기 중임을 알림하며, moderater가 승인한 후에야 편집된 내용을 게시물에 적용하고 — 거부 시 폐기합니다. 이는 새 게시물 동작과 최대한 유사하게 합니다. (구현 측면에서, 이는 새 게시물을 생성하는 대신 기존 게시물에 revise를 수행하는 승인 로직을 가진 검토 가능 변형체가 필요합니다.)

  2. 편집이 새 미디어를 도입할 때 게시물을 숨기기로, 작성자에게만 “승인 대기 중” 알림과 함께 표시되고, 승인 시 기존 perform_approve_and_unhide 작업을 사용합니다 — ReviewablePost 작업은 이미 이를 지원합니다.

테스트해 주셔서 감사합니다. 저도 동의하는데, 전체 리뷰 시스템이 "리뷰 대기 중/보류 중인 편집"을 올바르게 처리하도록 구성되지 않은 것 같습니다. :thinking:

이 작업이 훨씬 더 복잡할 것이며, 계획과 작업에 더 많은 시간이 필요할 것 같습니다.