Release 0.10.0 — Task List
Execution checklist for RELEASE-0.10-PLAN.md. Each task
names the recommended model and thinking depth. Model: haiku / sonnet / opus.
Thinking: low / medium / high. Section numbers (§) reference the plan.
Build/test note: the GUI needs CGO + MSYS2 UCRT64; the default Bash env has CGO
off. Use scripts\test.bat / scripts\build-windows.bat on Windows; confirm the
Linux test build with GOOS=linux go vet ./....
Phase 1 — Log-name fix + one-line activity (§3, §1)
Done first because both share a compact, single-line record formatter.
| Task |
Description |
Model |
Thinking |
| T1.1 |
app/format.go: add a compact one-line formatter (EventLine) that drops the full log path and uses filepath.Base(e.LogFile); keep verbose EventText for History. |
sonnet |
low |
| T1.2 |
ui/jobs_view.go: set the jobLogs row label Wrapping = fyne.TextTruncate and render via the compact formatter so each entry is one line. |
sonnet |
low |
| T1.3 |
ui/history_view.go: verify column width/truncation never clips .log to ..lo; keep the full path available (tooltip/row). |
sonnet |
low |
| T1.4 |
app/format_test.go: cover the compact formatter (log-file present/absent, base-name output). |
haiku |
low |
Phase 2 — Job execution-time statistics (§2)
| Task |
Description |
Model |
Thinking |
| T2.1 |
domain/record.go: add DurationMS int64 (tag consistent with existing fields). |
haiku |
low |
| T2.2 |
runner/runner.go: measure wall-clock start→finish and set duration on the record; StartOnly jobs record 0. |
sonnet |
medium |
| T2.3 |
runner/logfile.go: write a duration line into the log header. |
haiku |
low |
| T2.4 |
domain/runtime.go + app/run.go: add the aggregate (RunCount, FailCount, LastDurationMS, AvgDurationMS, MaxDurationMS); update it in executeRun. |
sonnet |
medium |
| T2.5 |
Seed stats from existing log files on startup: a runner helper that parses duration/state headers (suffix-matched, bounded by MaxLogFiles, tolerant of duration-less logs), folded into JobRuntime at build time. |
opus |
high |
| T2.6 |
app/format.go DisplayStats(rt) one-line summary + ui/jobs_view.go "Statistics" detail row (refreshed in updateDetails). |
sonnet |
medium |
| T2.7 |
Tests: format_test.go (DisplayStats), app/run_test.go (aggregate updates after fake runs), runner seed test incl. a duration-less legacy log. |
sonnet |
medium |
Phase 3 — Per-job run policy (§4)
| Task |
Description |
Model |
Thinking |
| T3.1 |
domain/job.go: add OverlapPolicy (json:"overlap_policy,omitempty"); empty = inherit global. |
haiku |
low |
| T3.2 |
app/run.go RunDue: resolve the effective policy per job (job value else Config.OverlapPolicy); normalizeJob/normalizeJobs leave empty as inherit. |
opus |
high |
| T3.3 |
ui/job_dialog.go: overlap-policy widget.Select with "(Use global default)" → empty; settings_view.go wording; app/format.go reflects effective policy in details. |
sonnet |
medium |
| T3.4 |
app/run_test.go: per-job queue overrides global skip (and vice versa); empty inherits. |
opus |
high |
Phase 4 — Persist global pause state (§6)
| Task |
Description |
Model |
Thinking |
| T4.1 |
domain/config.go: add Paused bool (json:"paused,omitempty"). |
haiku |
low |
| T4.2 |
app/operations.go SetGlobalPause: persist into s.store.Config + SaveConfig. app/service.go: init s.paused from Config.Paused and apply paused next-run text at startup. |
sonnet |
medium |
| T4.3 |
ui/jobs_view.go: init schedulerPaused, the Pause-all/Resume-all button, and the scheduler-state label from the persisted state. |
sonnet |
low |
| T4.4 |
app/operations_test.go: SetGlobalPause(true) persists; a Service rebuilt from that store starts paused and refuses RunDue/RunNow. |
sonnet |
medium |
Phase 5 — Window sizing (§5)
| Task |
Description |
Model |
Thinking |
| T5.1 |
ui/run.go: lower default to a 720p-safe size (~1024×660) + sensible MinSize; re-check commandOutputScroll min size and minJobsSidebarWidth in jobs_view.go. Manual check on 1366×768. |
sonnet |
medium |
Phase 6 — Refactor + cleanup (§7)
| Task |
Description |
Model |
Thinking |
| T6.1 |
ui/jobs_view.go: split a clean seam (details-panel build or toolbar/button wiring) to bring it back under the size guideline after the §1/§2/§4/§6 edits. |
sonnet |
medium |
| T6.2 |
Post-field-test cleanup sweep: stale diagnostics, over-defensive checks, obsolete autostart-migration code, noisy README notes, ignore rules. Keep the startup-timing History event. |
sonnet |
medium |
| T6.3 |
Drop the one-time YAML→JSON import: shadow structs + importYAML* + legacy branches in storage/store.go; legacy names in paths.go; go.yaml.in/yaml/v4 via go mod tidy; YAML-import tests + writeYAML helper; *.yaml ignore rules. |
sonnet |
medium |
| T6.4 |
docs/ARCHITECTURE.md: document per-job overlap policy, run-time statistics (incl. log-file seeding), the persisted pause flag, and the jobs_view.go split. |
sonnet |
medium |
Phase 7 — Portable packaging (§8)
| Task |
Description |
Model |
Thinking |
| T7.1 |
scripts\package-windows.*: build + bundle gosentry.exe, README.md, CHANGELOG.md into a portable .zip. |
sonnet |
medium |
| T7.2 |
scripts/package-linux.*: build + bundle binary, README.md, CHANGELOG.md into .tar.gz for linux-amd64 and linux-arm64. |
sonnet |
medium |
Phase 8 — Release docs + version
| Task |
Description |
Model |
Thinking |
| T8.1 |
Bump src/app/version.go to 0.10.0; update docs/CHANGELOG.md; tick the addressed docs/ROADMAP.md items; append any startup re-measure to docs/PERFORMANCE.md. |
haiku |
low |
Completion checklist
Phase 1 — Log-name + one-line activity
Phase 2 — Execution-time statistics
Phase 3 — Per-job run policy
Phase 4 — Persist global pause state
Phase 5 — Window sizing
Phase 6 — Refactor + cleanup
Phase 7 — Portable packaging
Phase 8 — Release docs + version
Definition of done
go vet ./... clean; go test ./... green on Windows (CGO) and Linux.
- Activity panel entries are one line; log file names show the base name with a
full
.log extension (no ..lo).
- Details panel shows run-time statistics that update after runs and survive a
restart (seeded from log files).
- A per-job overlap policy overrides the global default; an unset job inherits it.
- "Pause all" survives a restart: a paused install relaunches paused.
- The window opens fully visible on a 1366×768 / 720p screen.
- No YAML→JSON import code remains;
go.yaml.in/yaml/v4 is gone from go.mod.
- Portable
.zip and .tar.gz artifacts build; ARCHITECTURE.md, CHANGELOG, and
ROADMAP reflect the release; version is 0.10.0.