Files
gosentry/docs/RELEASE-0.10-TASKS.md
T
2026-06-24 08:26:40 +03:00

140 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Release 0.10.0 — Task List
Execution checklist for [RELEASE-0.10-PLAN.md](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
- [x] T1.1 — compact one-line formatter
- [x] T1.2 — `jobLogs` single-line rows
- [x] T1.3 — History `.log` truncation verified
- [x] T1.4 — formatter tests
### Phase 2 — Execution-time statistics
- [x] T2.1 — `DurationMS` on `RunRecord`
- [x] T2.2 — measure duration in runner
- [x] T2.3 — `duration` log header
- [x] T2.4 — runtime aggregate + `executeRun` update
- [x] T2.5 — seed stats from log files
- [x] T2.6 — `DisplayStats` + Statistics row
- [x] T2.7 — stats tests
### Phase 3 — Per-job run policy
- [ ] T3.1 — `Job.OverlapPolicy` field
- [ ] T3.2 — effective-policy dispatch + inherit
- [ ] T3.3 — dialog select + settings/format wording
- [ ] T3.4 — per-job override tests
### 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 — Window sizing
- [ ] T5.1 — 720p-safe default + MinSize
### 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 — Portable packaging
- [ ] T7.1 — Windows `.zip`
- [ ] T7.2 — Linux `.tar.gz` (amd64 + arm64)
### Phase 8 — Release docs + version
- [x] T8.1 — version bump + CHANGELOG + ROADMAP + PERFORMANCE
## 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`.