Add persisted Pause-all state to 0.10.0 plan and tasks
New feature section: store the global pause in Config so "Pause all" survives restarts (config field, persist in SetGlobalPause, init service and UI from it). Renumber the later plan sections and task phases to fit. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+35
-13
@@ -1,9 +1,10 @@
|
|||||||
# Release 0.10.0 — Milestone Plan
|
# Release 0.10.0 — Milestone Plan
|
||||||
|
|
||||||
This milestone bundles the open [roadmap](ROADMAP.md) follow-ups with five
|
This milestone bundles the open [roadmap](ROADMAP.md) follow-ups with six
|
||||||
feature/bug-fix requests. It is a polish-and-fill release on top of 0.9.0: no new
|
feature/bug-fix requests. It is a polish-and-fill release on top of 0.9.0: no new
|
||||||
storage format and no architectural rework, just per-job run control, run-time
|
storage format and no architectural rework, just per-job run control, run-time
|
||||||
statistics, UI compaction, and screen-fit + packaging groundwork.
|
statistics, UI compaction, persisted pause state, and screen-fit + packaging
|
||||||
|
groundwork.
|
||||||
|
|
||||||
Build/test note: the GUI needs CGO + MSYS2 UCRT64; the default Bash env has CGO
|
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
|
off. Use `scripts\test.bat` / `scripts\build-windows.bat` on Windows. Confirm the
|
||||||
@@ -102,13 +103,32 @@ guarantee and does not have a clean per-job meaning).
|
|||||||
still lays out without forcing horizontal overflow.
|
still lays out without forcing horizontal overflow.
|
||||||
- Manual verification on a 1366×768 display (or a forced-resolution VM).
|
- Manual verification on a 1366×768 display (or a forced-resolution VM).
|
||||||
|
|
||||||
## 6. Roadmap follow-ups (carried from ROADMAP.md)
|
## 6. Persist the global "Pause all" state
|
||||||
|
|
||||||
|
The global pause (`Service.paused`, flipped by `SetGlobalPause` in
|
||||||
|
`src/app/operations.go`) is in-memory only, so "Pause all" is forgotten on restart
|
||||||
|
and the scheduler silently resumes — surprising for a deliberate emergency stop.
|
||||||
|
|
||||||
|
- `src/domain/config.go`: add `Paused bool \`json:"paused,omitempty"\``.
|
||||||
|
- `src/app/operations.go` `SetGlobalPause`: persist the new value into
|
||||||
|
`s.store.Config` and `SaveConfig`, alongside the existing runtime updates and
|
||||||
|
`SchedulerStateChanged` emit.
|
||||||
|
- `src/app/service.go`: initialize `s.paused` from `store.Config.Paused` when the
|
||||||
|
Service is built, and apply the paused next-run text to runtimes at startup so a
|
||||||
|
restored-paused launch shows the right state before the first tick.
|
||||||
|
- `src/ui/jobs_view.go`: initialize the local `schedulerPaused` flag, the
|
||||||
|
"Pause all"/"Resume all" button, and the scheduler-state label from the
|
||||||
|
persisted state instead of hard-coding `false`.
|
||||||
|
- Tests: `src/app/operations_test.go` — `SetGlobalPause(true)` persists to config;
|
||||||
|
a Service rebuilt from that store starts paused and refuses `RunDue`/`RunNow`.
|
||||||
|
|
||||||
|
## 7. Roadmap follow-ups (carried from ROADMAP.md)
|
||||||
|
|
||||||
- **File-size soft limits.** `src/ui/jobs_view.go` (415) and
|
- **File-size soft limits.** `src/ui/jobs_view.go` (415) and
|
||||||
`src/app/operations_test.go` (536) exceed the ~250 UI / ~400 cap guideline.
|
`src/app/operations_test.go` (536) exceed the ~250 UI / ~400 cap guideline.
|
||||||
This milestone adds rows to `jobs_view.go` (§1, §2, §4) — split a clean seam out
|
This milestone adds rows to `jobs_view.go` (§1, §2, §4, §6) — split a clean seam
|
||||||
(e.g. the details-panel construction or the toolbar/button wiring) while it is
|
out (e.g. the details-panel construction or the toolbar/button wiring) while it
|
||||||
already being edited.
|
is already being edited.
|
||||||
- **Post-field-test cleanup.** Sweep for stale diagnostics, over-defensive checks,
|
- **Post-field-test cleanup.** Sweep for stale diagnostics, over-defensive checks,
|
||||||
obsolete autostart-migration code, and noisy README setup notes now that 0.9.0
|
obsolete autostart-migration code, and noisy README setup notes now that 0.9.0
|
||||||
has had field use. Recheck `.gitignore` / Docker / packaging ignore rules.
|
has had field use. Recheck `.gitignore` / Docker / packaging ignore rules.
|
||||||
@@ -127,10 +147,10 @@ guarantee and does not have a clean per-job meaning).
|
|||||||
- `.gitignore` / `.dockerignore`: drop the `*.yaml` import-window ignores.
|
- `.gitignore` / `.dockerignore`: drop the `*.yaml` import-window ignores.
|
||||||
- **Architecture doc update.** Refresh `docs/ARCHITECTURE.md` for this milestone:
|
- **Architecture doc update.** Refresh `docs/ARCHITECTURE.md` for this milestone:
|
||||||
the per-job overlap policy on `domain.Job` (§4), the run-time statistics added to
|
the per-job overlap policy on `domain.Job` (§4), the run-time statistics added to
|
||||||
`domain.JobRuntime` and seeded from log files (§2), and any `jobs_view.go` split
|
`domain.JobRuntime` and seeded from log files (§2), the persisted global pause
|
||||||
(§6 file-size work).
|
flag (§6), and any `jobs_view.go` split (§7 file-size work).
|
||||||
|
|
||||||
## 7. Delivery and packaging (portable only)
|
## 8. Delivery and packaging (portable only)
|
||||||
|
|
||||||
This milestone targets only the portable distribution variants, matching the
|
This milestone targets only the portable distribution variants, matching the
|
||||||
ROADMAP delivery plan. Non-portable installer/package formats are out of scope and
|
ROADMAP delivery plan. Non-portable installer/package formats are out of scope and
|
||||||
@@ -148,10 +168,11 @@ have been dropped from the roadmap.
|
|||||||
1. §3 log-name fix + §1 one-line activity (shared compact formatter).
|
1. §3 log-name fix + §1 one-line activity (shared compact formatter).
|
||||||
2. §2 execution-time stats (record → runtime aggregate → details row).
|
2. §2 execution-time stats (record → runtime aggregate → details row).
|
||||||
3. §4 per-job overlap policy (domain → dispatch → dialog → tests).
|
3. §4 per-job overlap policy (domain → dispatch → dialog → tests).
|
||||||
4. §5 window sizing.
|
4. §6 persist the global pause state (config → service → UI init).
|
||||||
5. §6 jobs_view split + cleanup (after the §1/§2/§4 edits land).
|
5. §5 window sizing.
|
||||||
6. §7 portable archives (Windows `.zip`, Linux `.tar.gz`).
|
6. §7 jobs_view split + cleanup (after the §1/§2/§4/§6 edits land).
|
||||||
7. Docs: update `docs/ARCHITECTURE.md` (§6); version bump to `0.10.0`
|
7. §8 portable archives (Windows `.zip`, Linux `.tar.gz`).
|
||||||
|
8. Docs: update `docs/ARCHITECTURE.md` (§7); version bump to `0.10.0`
|
||||||
(`src/app/version.go`), CHANGELOG, ROADMAP tick-offs.
|
(`src/app/version.go`), CHANGELOG, ROADMAP tick-offs.
|
||||||
|
|
||||||
## Verification
|
## Verification
|
||||||
@@ -161,5 +182,6 @@ have been dropped from the roadmap.
|
|||||||
full `.log` extension (no `..lo`).
|
full `.log` extension (no `..lo`).
|
||||||
- Details panel shows live run-time statistics that update after runs.
|
- Details panel shows live run-time statistics that update after runs.
|
||||||
- A per-job overlap policy overrides the global default; an unset job inherits it.
|
- 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.
|
- The window opens fully visible on a 1366×768 / 720p screen.
|
||||||
- Bump and document the release; append any startup re-measure to PERFORMANCE.md.
|
- Bump and document the release; append any startup re-measure to PERFORMANCE.md.
|
||||||
|
|||||||
+40
-24
@@ -40,33 +40,42 @@ Done first because both share a compact, single-line record formatter.
|
|||||||
| 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.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 |
|
| T3.4 | `app/run_test.go`: per-job `queue` overrides global `skip` (and vice versa); empty inherits. | opus | high |
|
||||||
|
|
||||||
## Phase 4 — Window sizing (§5)
|
## Phase 4 — Persist global pause state (§6)
|
||||||
|
|
||||||
| Task | Description | Model | Thinking |
|
| Task | Description | Model | Thinking |
|
||||||
|------|-------------|-------|----------|
|
|------|-------------|-------|----------|
|
||||||
| T4.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 |
|
| 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 — Refactor + cleanup (§6)
|
## Phase 5 — Window sizing (§5)
|
||||||
|
|
||||||
| Task | Description | Model | Thinking |
|
| Task | Description | Model | Thinking |
|
||||||
|------|-------------|-------|----------|
|
|------|-------------|-------|----------|
|
||||||
| T5.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 §1/§2/§4 edits. | sonnet | medium |
|
| 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 |
|
||||||
| T5.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 |
|
|
||||||
| T5.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 |
|
|
||||||
| T5.4 | `docs/ARCHITECTURE.md`: document per-job overlap policy, run-time statistics (incl. log-file seeding), and the `jobs_view.go` split. | sonnet | medium |
|
|
||||||
|
|
||||||
## Phase 6 — Portable packaging (§7)
|
## Phase 6 — Refactor + cleanup (§7)
|
||||||
|
|
||||||
| Task | Description | Model | Thinking |
|
| Task | Description | Model | Thinking |
|
||||||
|------|-------------|-------|----------|
|
|------|-------------|-------|----------|
|
||||||
| T6.1 | `scripts\package-windows.*`: build + bundle `gosentry.exe`, `README.md`, `CHANGELOG.md` into a portable `.zip`. | sonnet | medium |
|
| 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 | `scripts/package-linux.*`: build + bundle binary, `README.md`, `CHANGELOG.md` into `.tar.gz` for `linux-amd64` and `linux-arm64`. | 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 — Release docs + version
|
## Phase 7 — Portable packaging (§8)
|
||||||
|
|
||||||
| Task | Description | Model | Thinking |
|
| Task | Description | Model | Thinking |
|
||||||
|------|-------------|-------|----------|
|
|------|-------------|-------|----------|
|
||||||
| T7.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 |
|
| 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 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -93,21 +102,27 @@ Done first because both share a compact, single-line record formatter.
|
|||||||
- [ ] T3.3 — dialog select + settings/format wording
|
- [ ] T3.3 — dialog select + settings/format wording
|
||||||
- [ ] T3.4 — per-job override tests
|
- [ ] T3.4 — per-job override tests
|
||||||
|
|
||||||
### Phase 4 — Window sizing
|
### Phase 4 — Persist global pause state
|
||||||
- [ ] T4.1 — 720p-safe default + MinSize
|
- [ ] T4.1 — `Config.Paused` field
|
||||||
|
- [ ] T4.2 — persist in `SetGlobalPause` + init from config
|
||||||
|
- [ ] T4.3 — UI inits from persisted state
|
||||||
|
- [ ] T4.4 — persistence + restored-paused tests
|
||||||
|
|
||||||
### Phase 5 — Refactor + cleanup
|
### Phase 5 — Window sizing
|
||||||
- [ ] T5.1 — `jobs_view.go` split
|
- [ ] T5.1 — 720p-safe default + MinSize
|
||||||
- [ ] T5.2 — post-field-test cleanup (keep startup timing)
|
|
||||||
- [ ] T5.3 — drop YAML→JSON migration
|
|
||||||
- [ ] T5.4 — ARCHITECTURE.md update
|
|
||||||
|
|
||||||
### Phase 6 — Portable packaging
|
### Phase 6 — Refactor + cleanup
|
||||||
- [ ] T6.1 — Windows `.zip`
|
- [ ] T6.1 — `jobs_view.go` split
|
||||||
- [ ] T6.2 — Linux `.tar.gz` (amd64 + arm64)
|
- [ ] T6.2 — post-field-test cleanup (keep startup timing)
|
||||||
|
- [ ] T6.3 — drop YAML→JSON migration
|
||||||
|
- [ ] T6.4 — ARCHITECTURE.md update
|
||||||
|
|
||||||
### Phase 7 — Release docs + version
|
### Phase 7 — Portable packaging
|
||||||
- [ ] T7.1 — version bump + CHANGELOG + ROADMAP + PERFORMANCE
|
- [ ] T7.1 — Windows `.zip`
|
||||||
|
- [ ] T7.2 — Linux `.tar.gz` (amd64 + arm64)
|
||||||
|
|
||||||
|
### Phase 8 — Release docs + version
|
||||||
|
- [ ] T8.1 — version bump + CHANGELOG + ROADMAP + PERFORMANCE
|
||||||
|
|
||||||
## Definition of done
|
## Definition of done
|
||||||
|
|
||||||
@@ -117,6 +132,7 @@ Done first because both share a compact, single-line record formatter.
|
|||||||
- Details panel shows run-time statistics that update after runs and survive a
|
- Details panel shows run-time statistics that update after runs and survive a
|
||||||
restart (seeded from log files).
|
restart (seeded from log files).
|
||||||
- A per-job overlap policy overrides the global default; an unset job inherits it.
|
- 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.
|
- 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`.
|
- 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
|
- Portable `.zip` and `.tar.gz` artifacts build; ARCHITECTURE.md, CHANGELOG, and
|
||||||
|
|||||||
Reference in New Issue
Block a user