The memory runtime's catalog fork rewrite spread the caller patch over
the source metadata wholesale. The runtime session host forks with a
{ title: undefined, custom: undefined } patch when the caller names no
metadata, so the spread wiped the source's custom metadata before the
goal-stripping logic ran; a partial custom patch likewise replaced the
source's custom object instead of merging into it. Skip undefined-valued
patch keys and merge custom through the same goal-dropping rule the
local runtime applies, keeping the two runtimes' fork semantics
identical.