1. Check any join key (not just the first) for temporal dtype when
validating time grain requirement. Fixes edge case where temporal
key is not the first in the join_keys list.
2. Fix substring matching bugs in timeOffset.ts:
- getTimeOffset: use startsWith for <offset>, pattern
- getOriginalSeries: use startsWith+slice for <offset>, pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>