diff --git a/docs/RELEASE-0.10-PLAN.md b/docs/RELEASE-0.10-PLAN.md index 1c2057b..af17f72 100644 --- a/docs/RELEASE-0.10-PLAN.md +++ b/docs/RELEASE-0.10-PLAN.md @@ -1,9 +1,10 @@ # 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 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 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. - 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 `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 - (e.g. the details-panel construction or the toolbar/button wiring) while it is - already being edited. + This milestone adds rows to `jobs_view.go` (§1, §2, §4, §6) — split a clean seam + out (e.g. the details-panel construction or the toolbar/button wiring) while it + is already being edited. - **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 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. - **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 - `domain.JobRuntime` and seeded from log files (§2), and any `jobs_view.go` split - (§6 file-size work). + `domain.JobRuntime` and seeded from log files (§2), the persisted global pause + 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 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). 2. §2 execution-time stats (record → runtime aggregate → details row). 3. §4 per-job overlap policy (domain → dispatch → dialog → tests). -4. §5 window sizing. -5. §6 jobs_view split + cleanup (after the §1/§2/§4 edits land). -6. §7 portable archives (Windows `.zip`, Linux `.tar.gz`). -7. Docs: update `docs/ARCHITECTURE.md` (§6); version bump to `0.10.0` +4. §6 persist the global pause state (config → service → UI init). +5. §5 window sizing. +6. §7 jobs_view split + cleanup (after the §1/§2/§4/§6 edits land). +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. ## Verification @@ -161,5 +182,6 @@ have been dropped from the roadmap. full `.log` extension (no `..lo`). - 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. +- "Pause all" survives a restart: a paused install relaunches paused. - The window opens fully visible on a 1366×768 / 720p screen. - Bump and document the release; append any startup re-measure to PERFORMANCE.md. diff --git a/docs/RELEASE-0.10-TASKS.md b/docs/RELEASE-0.10-TASKS.md index defa9c1..541345d 100644 --- a/docs/RELEASE-0.10-TASKS.md +++ b/docs/RELEASE-0.10-TASKS.md @@ -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.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 | |------|-------------|-------|----------| -| 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 | |------|-------------|-------|----------| -| 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.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 | +| 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 — Portable packaging (§7) +## Phase 6 — Refactor + cleanup (§7) | Task | Description | Model | Thinking | |------|-------------|-------|----------| -| T6.1 | `scripts\package-windows.*`: build + bundle `gosentry.exe`, `README.md`, `CHANGELOG.md` into a portable `.zip`. | 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.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 — Release docs + version +## Phase 7 — Portable packaging (§8) | 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.4 — per-job override tests -### Phase 4 — Window sizing -- [ ] T4.1 — 720p-safe default + MinSize +### Phase 4 — Persist global pause state +- [ ] 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 -- [ ] T5.1 — `jobs_view.go` split -- [ ] T5.2 — post-field-test cleanup (keep startup timing) -- [ ] T5.3 — drop YAML→JSON migration -- [ ] T5.4 — ARCHITECTURE.md update +### Phase 5 — Window sizing +- [ ] T5.1 — 720p-safe default + MinSize -### Phase 6 — Portable packaging -- [ ] T6.1 — Windows `.zip` -- [ ] T6.2 — Linux `.tar.gz` (amd64 + arm64) +### Phase 6 — Refactor + cleanup +- [ ] T6.1 — `jobs_view.go` split +- [ ] 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 -- [ ] T7.1 — version bump + CHANGELOG + ROADMAP + PERFORMANCE +### Phase 7 — Portable packaging +- [ ] 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 @@ -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 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