Convert ci-test-shard.mjs's vitest invocation path from blocking spawnSync to
async spawn through scripts/lib/run-vitest-watchdog.mjs. Each shard command gets
a per-class budget (shard ceiling 30min) tightened by aggregated timings only
when the snapshot is fresh; quick non-test commands stay synchronous.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>