Use this checklist before tagging a release. It is intentionally focused on the user-visible paths that should keep working after upgrades.
Run from the repository root:
git diff --check
CGO_ENABLED=0 go test ./...
CGO_ENABLED=0 go vet ./...
go test -race ./internal/core ./internal/api ./internal/inbound ./internal/delivery ./internal/manifestConfirm release builds still work without CGO:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /tmp/cronplus-linux-amd64 .
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o /tmp/cronplus-linux-arm64 .
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o /tmp/cronplus-darwin-arm64 .
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o /tmp/cronplus-windows-amd64.exe .Confirm the tag's Release workflow completes both GoReleaser and Verify Windows release. The Windows job downloads the published x64 ZIP, verifies its SHA-256 checksum, and checks startup/restart, the embedded UI, API, SQLite, CLI, daemon locking, graceful shutdown, and the embedded release version on Windows.
- Start CronPlus with an existing config directory that contains imported tasks and delivery profiles.
- Confirm
state.dbis created or opened successfully. - Confirm v2.0 upgrade notes clearly state that JSON-only users must run the latest v1.x once before upgrading.
- With an existing
state.db, confirm tasks, delivery profiles, app settings, command log, and recent usable run history are visible after startup. - With only a legacy
state.jsonand nostate.db, confirm v2.0 starts as fresh state and does not import or mutate the JSON file. - On macOS, run
make install, then confirmcommand -v cronpluspoints at the installed stable binary andcronplus --helpdoes not execute a shell wrapper or temporary installer path. - Run
cronplus update --dry-runand confirm it selects the current OS/arch release asset and stable install path. - Run
cronplus autostart install --no-startfrom the stable binary and confirm the generated LaunchAgent points at that binary. - Run negative autostart checks with
--pathvalues for a temporary build path, a shell launcher wrapper, and a non-executable file; confirm each is rejected. - Open the web UI and confirm Dashboard, Tasks, Delivery, Commands, Health, and Settings load without API errors.
Use a small package with managed_venv, structured output, and at least one delivery profile available.
- Import the package through the web UI folder picker or pasted path.
- Confirm import returns immediately and environment setup appears as pending, then ready.
- Run Diagnostic Check and confirm the result appears in the check panel only.
- Confirm the diagnostic check does not create imported-task run history.
- Run Run Now and confirm a real run history row appears.
- Open the run detail page and confirm status, trigger, duration, stdout/stderr, parsed result, diagnosis, cleanup, and delivery results are readable.
- Start a long-running task, confirm it appears on Health with PID/process group, elapsed time, output tail, and run directory, then cancel it and confirm a canceled run record is saved.
- Validate or import a
templates/browserpackage and confirm browser policy validation succeeds. - Run or inspect a browser-enabled task and confirm Health shows Browser Automation counts, retained profile/run directory usage, recent failures, and active browser runs when present.
- Reload the manifest and confirm task ID and run history are preserved.
- Disable and re-enable the task.
- Remove the import and confirm the package files remain on disk.
- Import an upstream task and a downstream task that depends on it.
- Confirm the downstream task detail page shows upstream dependency health and downstream dependents are shown on the upstream task.
- Run the downstream task before the upstream task has a successful imported-task run.
- Confirm CronPlus records a skipped or failed run according to
on_unhealthywithout starting the script. - Run Run Now on the upstream task.
- Refresh dependency health and confirm the downstream task can run when the latest upstream run satisfies status and freshness requirements.
- Create or edit a Telegram delivery profile.
- Send a delivery test message.
- Preview delivery for a task with a latest run.
- Confirm template rendering errors are visible when a template references a missing field.
- Confirm MCP delivery list/read responses do not expose bot tokens or chat IDs.
With the daemon running:
- Call
/api/status,/api/health,/api/tasks, and/api/tasks/{id}/runs. - Confirm run history filters work for
status,trigger,deliveryStatus,q, andlimit. - Call
/api/runs/active,/api/runs/active/{runId},/api/runs/active/{runId}/cancel,/api/retention, and/api/retention/cleanup. - Start
cronplus mcpfrom an MCP-capable client or local harness. - Confirm MCP tools can read status, list/get tasks, start a run, list/get/wait for runs, inspect/cancel active runs, inspect/update/cleanup retention, inspect dependency health, inspect dependents, inspect environment size, rebuild a managed venv, preview schedules, and manage delivery profiles.
- Confirm MCP package/task checks remain diagnostic probes and do not create imported-task run history.
Open the web UI in a browser and inspect desktop and narrow mobile widths:
- Dashboard cards and next-run text do not overlap.
- Task list action buttons remain readable.
- Task detail action buttons, environment card, dependency card, manifest/runtime cards, and package directory card do not overflow.
- Run history filters fit and filtered results update correctly.
- Run detail stdout/stderr blocks scroll instead of stretching the layout.
- Delivery profile forms and edit/test/delete buttons fit.
- Import modal path picker, diagnostic check result, and import actions fit.
- Health storage, daemon, browser automation, active-run, retention, and attention sections are readable.
- Active-run cancel controls fit and retention inputs do not overlap at desktop or narrow widths.
- Settings daemon paths wrap without forcing horizontal page scroll.