WordPress wp_insert_post() returns 0 but not not wp_error

It appears that you can ask wp_insert_post() to return a WP_Error on failure by setting the 2nd parameter to true (it defaults to false).

So if you change

$new_article_id = wp_insert_post($new_article);

to

$new_article_id = wp_insert_post( $new_article, true );

in your code, you should get WP_Error objects back that you can then inspect.