After diving into the bowels of the drupal code I found the spot which did the creating and it seemed to be doing something quite reasonable with the new node ID.
With just a small amount of convincing I managed to get it to do what I wanted.
diff -ru vanilla/drupal-7.12/modules/node/node.module web/drupal/modules/node/node.module
--- vanilla/drupal-7.12/modules/node/node.module 2012-02-02 09:03:14.000000000 +1100
+++ web/drupal/modules/node/node.module 2012-05-28 16:37:36.827171000 +1000
@@ -1095,6 +1095,12 @@
if ($node->is_new) {
// For new nodes, save new records for both the node itself and the node
// revision.
+if(isset($node->request_nid))
+{
+ echo "Requested save new node with nid {$node->request_nid}\n";
+ $node->nid = $node->request_nid;
+ //print_r($node);
+}
drupal_write_record('node', $node);
_node_save_revision($node, $user->uid);
$op = 'insert';
Creating a node can now be done like this:
$node = new stdClass();
$node->type = ...;
node_object_prepare($node);
// fill in node details here...$node->request_nid = $my_nid;
node_save($node);
That seems quite trivial now. I don't know why so many people say it can't be done.