Los archivos adjuntos o cargas antiguas y rotos aparecen como [{nombre del archivo}|attachment](/uploads/default/original/2X/6/{hash sha1 + extensión}) en el texto sin procesar de la publicación. Esto se procesa como href="/uploads/default/original/2X/6/{hash sha1 + extensión}", lo que rompe los archivos adjuntos, pero no las imágenes.
Los archivos adjuntos que funcionan posteriormente aparecen como [{nombre del archivo}|attachment](upload://{sha1 a base62 + extensión}) y se procesan como href="/uploads/short-url/{sha1 a base62 + extensión}".
Escribí un pequeño código en Ruby para recorrer todas las publicaciones del período problemático conocido y reemplazar todas las URLs de carga antiguas con la versión más reciente. Utilicé la función base62_sha1 del modelo Upload para convertir el hash sha1 al nombre de archivo esperado que las URLs cortas de Discourse requieren.
Esto hizo que los archivos adjuntos funcionaran. Luego ejecuté otro rebake solo para confirmar la corrección y parece que sigue funcionando. Parece que el problema residía únicamente en Post.raw y no tenía nada que ver con Upload.