Error extraño de "off-by-one" después de la actualización

Estoy intentando actualizar un conjunto de publicaciones en un script de Rails. Parece haber un comportamiento extraño de desviación de uno, donde una publicación se actualiza con el valor de la publicación anterior.

He movido todas estas actualizaciones para que hagan directamente un post.raw.gsub() para “resolver” este problema en las publicaciones dentro del bucle interno (que anteriormente obtenían el valor de la publicación del tema), pero ahora la publicación del tema del tema N se actualiza con el raw de la última publicación anterior del tema N-1.

Ahora estoy aún más confundido, ya que la primera publicación (es decir, la del tema) se actualiza con tpost.raw.gsub! con el valor de post.raw.gsub!(preg,"#{$2}") de la iteración anterior.

EDICIÓN: Bueno, nunca llegué a descubrir qué estaba mal con la última versión, pero aquí hay una versión de un script de actualización de algunas publicaciones que crea una revisión:

def fix_slack_posts
  opts = { bypass_rate_limiter: true, bypass_bump: true, skip_validations: true }
  reg=/(\\*\\*)(This topic was automatically generated from Slack. You can find the original thread \\[here\\].+?\\))(\\*\\*\\.)?\\s*?([a-zA-Z, ()]* : )(.*)/m
  preg = /([a-zA-Z, ()]+? : )(.*)/m
  topic_posts = Post.where("raw like '**This topic was automatically%'")
  #topic_posts = Post.where(topic_id: [23934, 23935], post_number: 1)
  topic_posts.each do |tpost|
    begin
      puts "Fixing topic post #{tpost.id} with #{tpost.raw[0..30]}"
      puts tpost.raw.gsub(reg,"1 #{$1}\n2 #{$2}\n3 #{$3}\n4 #{$4}\n 5 #{$5}")
      raw = tpost.raw.gsub(reg,"#{$5}\n\n#{$2}.")
      puts "Fixing topic post #{tpost.id} with #{tpost.raw[0..30]}\n---\u003e#{raw}"
      user = User.find(tpost.user_id)
      if raw.length \u003e 10
        tpost.revise(user,{raw: raw,edit_reason: 'fix slack link location'}, opts)
      end
    rescue
      puts "Can't update topic post #{tpost.raw}"
    end
    posts = Post.where(topic_id: tpost.topic_id).where("post_number \u003e 1")
    posts.each do |post|
      if post.raw.gsub(preg,"#{$2}").length\u003e=10
        begin
          puts "Fixing post #{post.id} with #{post.raw[0..30]}"
          raw = post.raw.gsub(preg,"#{$2}")
          user = User.find(post.user_id)
          post.revise(user,{raw: raw,edit_reason: 'remove user name from text'}, opts)
        rescue
          puts "#{post.id}--cannot save #{post.raw}. "
        end
      end
    end
  end
end