e330119753
Tailscale, Patchmon, and Semaphore sync jobs all wrote into a shared job_runs table with no retention. With default poll intervals of 15-60 minutes, history grew unbounded. - Add pruneJobRuns(jobId) and pruneAllJobRuns() helpers. - Prune after every completeJobRun() so new runs trim old ones. - Prune once on init() to clean up existing over-cap rows. - Prune in importJobs() so re-imported runs are also capped. - Defensive LIMIT 10 in getJobRuns() for the read path. No UI changes needed — _renderRunList already renders whatever the server returns. No schema migration — only row deletions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>