diff --git a/docs/RELEASE-0.10-TASKS.md b/docs/RELEASE-0.10-TASKS.md new file mode 100644 index 0000000..defa9c1 --- /dev/null +++ b/docs/RELEASE-0.10-TASKS.md @@ -0,0 +1,123 @@ +# 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 — Window sizing (§5) + +| 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 | + +## Phase 5 — Refactor + cleanup (§6) + +| 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 | + +## Phase 6 — Portable packaging (§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 | + +## Phase 7 — Release docs + version + +| 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 | + +--- + +## Completion checklist + +### Phase 1 — Log-name + one-line activity +- [ ] T1.1 — compact one-line formatter +- [ ] T1.2 — `jobLogs` single-line rows +- [ ] T1.3 — History `.log` truncation verified +- [ ] T1.4 — formatter tests + +### Phase 2 — Execution-time statistics +- [ ] T2.1 — `DurationMS` on `RunRecord` +- [ ] T2.2 — measure duration in runner +- [ ] T2.3 — `duration` log header +- [ ] T2.4 — runtime aggregate + `executeRun` update +- [ ] T2.5 — seed stats from log files +- [ ] T2.6 — `DisplayStats` + Statistics row +- [ ] 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 — Window sizing +- [ ] T4.1 — 720p-safe default + MinSize + +### 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 6 — Portable packaging +- [ ] T6.1 — Windows `.zip` +- [ ] T6.2 — Linux `.tar.gz` (amd64 + arm64) + +### Phase 7 — Release docs + version +- [ ] T7.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. +- 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`.