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.
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>
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>
josh
scheduled this pull request to auto merge when all checks succeed 2026-06-06 09:27:05 -04:00
josh
merged commit 53fbcbe22c into dev2026-06-06 09:27:05 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.
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