feat: per-job command timeout with global default

Add an optional per-job run timeout following the overlap_policy inherit
pattern: Job.TimeoutSeconds (0 = inherit) resolves against a new
Config.DefaultTimeoutSeconds (default 30s), replacing the hard-coded 30s
guard in runner.RunJob.

- domain/storage: new fields, default 30, load-time normalization
- runner: RunJob takes an explicit timeout; StartOnly stays untimed so it
  keeps measuring launch latency only
- app: effectiveTimeout resolves under mu into runEnv, threaded to runJob;
  seam signature and validation updated; DisplayTimeout helper
- ui: Timeout entry in the job dialog, Default timeout in Settings, and a
  Timeout row in the details panel
- tests + docs (ARCHITECTURE, STANDARDS, ROADMAP, CHANGELOG) updated;
  version bumped to 0.12.0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
mixeme
2026-07-25 23:24:50 +03:00
parent f4221f6ce4
commit 48faddb3bd
23 changed files with 270 additions and 87 deletions
-12
View File
@@ -5,18 +5,6 @@ Completed work is recorded in [CHANGELOG.md](CHANGELOG.md), not here.
## Open Items
### Per-job command timeout
`runner.RunJob` applies a fixed **30s** timeout to every command (`commandTimeout`
in `src/runner/runner.go`). Long-running or interactive scripts need a longer
limit; quick health checks may need a shorter one.
Add an optional per-job timeout (seconds) on `domain.Job`, with a global default
in `gosentry.json` for jobs that leave the field empty — the same inherit pattern
as `overlap_policy`. Wire the value through `RunJob`; expose it in the job dialog
and Settings; validate on save. `StartOnly` jobs should keep measuring launch
latency only and remain unaffected by the run timeout.
### Window size persistence *(frozen)*
Window size is currently **not** saved on quit or close. Saving was disabled