Erro bizarro de off-by-one após atualização

Estou tentando atualizar um conjunto de posts em um script no Rails. Parece que há um comportamento estranho de “off-by-one”, onde um post é atualizado com o valor do post anterior.

Movi todas essas atualizações para fazer diretamente um post.raw.gsub() para “resolver” esse problema nos posts dentro do loop interno (que anteriormente estavam pegando o valor do post do tópico), mas agora o post do tópico do tópico N é atualizado com o raw do último post anterior do tópico N-1.

Estou extra duplamente confuso agora, pois o primeiro post (ou seja, o do tópico) é atualizado com tpost.raw.gsub! com o valor de post.raw.gsub!(preg,"#{$2}") da iteração anterior.

EDIT: Bem, nunca descobri o que estava errado na última versão, mas aqui está uma versão de um script de atualização de alguns posts que cria uma revisão:

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