Here's something interesting to keep in mind the next time you're getting fancy with your nodes during the hook_nodeapi presave step: Don't forget your teaser.
I was having trouble with a Drupal 6 website I've been working on, where it seemed almost as if the body was duplicating part of itself (or sometimes all of itself) on the edit - it looked fine when you were viewing the node, but editing it caused things to duplicate within the body field. I tried the usual suspects for fixing - I searched for nodeapi calls inside of the custom modules we'd written to find the culprit, and then even just started turning off modules, and the theme, one by one, hoping to find the culprit that way.
Eventually I just tried using sql to modify the teaser in node_revisions, and when this modification showed up in the edit form, I started doing a search in the code for 'teaser .' - and I found it in node.pages.inc's node_body_field:
<?phpfunction node_body_field(&$node, $label, $word_count) {
  // Check if we need to restore the teaser at the beginning of the body.  $include = !isset($node->teaser) || ($node->teaser == substr($node->body, 0, strlen($node->teaser)));
...  $form['body'] = array(    '#type' => 'textarea',    '#title' => check_plain($label),    '#default_value' => $include ? $node->body : ($node->teaser . $node->body),    '#rows' => 20,    '#required' => ($word_count > 0),  );?>
The problem is that the edit form for nodes compares the teaser with the start of the body data. If they don't match, then it prepends the teaser to the body data - which is normally used for when the person writing the node splits the teaser/body into two parts.
However, I was changing the body in hook_nodeapi('presave'), which turns out to be after the node teaser was created. The fix was as simple as adding $node->teaser = node_teaser($node->body); to the end of the presave code.