Small review-sweep fixes: rotation log, metadata invalidation, retry API
Three independent findings from the review, small enough to land together.
tree_keeper's KeyringUpsert handler silently dropped rotation values
smaller than the last-seen one. That's correct behavior (we already
bootstrapped past them), but "silently" leaves no trace when something
actually is out of order. Add a debug log so stray backward replays
surface in traces.
useDirectoryMetadata has its own react-query cache key that tree
mutations never invalidated, so an upload/rename/move would leave the
parent-directory metadata view showing "[Encrypted]" placeholders until
its stale time elapsed. Invalidate the metadata prefix on every tree
mutation's onSettled — keepPreviousData keeps the active view from
flickering, inactive directories are inert refetches.
FileView.handleRetry called window.location.reload(), which nuked the
module-level preview + readme caches and replayed the whole cabinet
bootstrap for a single failed tree load. useDirectory now exposes
retry(): a generation counter bump re-runs loadTree and re-installs
the watcher in place, keeping the plaintext caches intact.