Proper use of hook_menu_breadcrumb_alter()
The properties for each trail item that are documented are the following:


title: Title of the item
href: Drupal path of the item
localized_options: Options for passing into the l() function
type: A menu type constant, such as MENU_DEFAULT_LOCAL_TASK, or 0 to indicate it's not really in the menu (used for the home page item)


The code that builds the breadcrumbs is the following.

foreach ($active_trail as $parent) {
  $breadcrumb[] = l($parent['title'], $parent['href'], $parent['localized_options']);
}


The other values (type and link_path) are not used to create the breadcrumbs, but they could be used from other modules that alter the breadcrumbs. Using the default values used from menu_set_active_trail() for those properties probably causes less compatibility problems with other modules.

$trail[] = array(
  'title' =&gt; t('Home'), 
  'href' =&gt; '&lt;front&gt;', 
  'link_path' =&gt; '', 
  'localized_options' =&gt; array(), 
  'type' =&gt; 0,
);



  Is there a proper method (or best practice) for testing whether $item is a node and to load it?


The $item argument hook_menu_breadcrumb_alter() gets is the value returned from menu_get_item(). If you want to check it is for a node, you can use the following code.

if (isset($item['load_functions'][2]) &amp;&amp; !empty($item['map'][3]) &amp;&amp; $item['load_functions'][4] == 'node_load') {
  $node = $router_item['map'][5];
}
else {
  // The menu item is not for a node.
}


That is the code executed from menu_get_object() when it is called with its default arguments.

References


menu_get_active_breadcrumb()
menu_set_active_trail()