This is solid. I've done similar work on the backend side and the trigger approach beats stopping the world. One thing though: watch your trigger performance under load. We hit nasty latency spikes when backfill was still running and production writes started piling up behind the trigger logic.
What helped was making the trigger async (queue to a background worker) rather than synchronous. Lets your app keep moving. Also make sure you're batching the initial backfill smartly—40gb in one pass will lock things up bad.
Did you test rollback? That's the gotcha nobody thinks about until 2am.