4d1c957f42
macOS ships bash 3.2 (no wait -n): poll with kill -0 instead. npm spawns vite as a grandchild, so cleanup now recurses pgrep -P to reap the whole subtree — Ctrl-C frees both :8000 and :5173 cleanly. Verified clean-checkout -> dev.sh -> empty self-migrated Postgres -> /healthz 200, and trap teardown. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>