Programmatically add a translation with proper content moderation state
What is the problem you're seeing with the moderation state table? What I think I'm seeing is:

Revision 15 is the initial save of the node.
Revision 16 is the second save, where fr has changes and en does not.

I can't see anything too unusual here, but if you are running into errors later in the lifecycle of the node, that would be helpful information.
One red flag I can see in the code is manually calling setRevisionTranslationAffected and addTranslation. Many of the Content Moderation tests use the following methods to add translations and to create revisions, because that's how additional bits of metadata like the revision_translation_affected column are set:
$storage = \Drupal::entityTypeManager()-&gt;getStorage('node');
// You may try either of these two methods for creating a revision or a translation.
$storage-&gt;createRevision($node);
$storage-&gt;createTranslation($node, 'fr', $node-&gt;toArray());