# Alpha

> Schedules start firing. The agent is pinned to a database.

URL: https://bkpdb.com/changelog/2026-05-09/
Date: 2026-05-09
Tag: alpha

---

## Agent

### Added

- Heartbeat dispatch: pending jobs are parsed from the heartbeat response and run through the worker pool. No long-poll, no side channel.
- `run_probe` command handler for live database-connectivity checks; the dispatcher maps it through the same lifecycle as backup and restore.
- `--log-level` flag with debug-level wire tracing for heartbeat and `/config`.
- SOPS-managed key material for builds; the published binary registry is now sourced from a static-musl bash matrix.

### Changed

- `/config` wire shape: `expected_postgres_version` → `postgres_major` (nullable). The probe-result contract carries the detected major back.


## Control plane

### Added

- Schedule firing wired end-to-end. `Schedule` rows synchronise into the django-q2 scheduler on signal, a boot check refuses to start if the two have drifted, a scheduler heartbeat gates `/readyz` for the first three minutes, and a missed-fire detector flips stale `QUEUED` runs so the next cron tick can pick them up.
- Cron → `Job` dispatch and pending-jobs in the heartbeat response.
- Agent ↔ database pinning. Each database is pinned to a single agent in its organisation. The dispatcher refuses to send work to any other agent, and `/config` narrows to the agent's pinned databases only.
- On-demand “Run backup now” from the database detail page, async, with a flash, hidden until the pinned agent has been heard from.
- First-run welcome pages on databases, agents, backups, and storage when an organisation has no rows yet, with the next CTA inside the empty-state hero.
- Redesigned backups list and detail: window / outcome / database facets, cross-field search, fixed-layout responsive rows, and a presigned download link for the encrypted object.
- Newsreader / Inter / JetBrains Mono self-hosted across the console, theme-aware wordmark and favicon on every page, and the canonical overview dashboard built from real organisation data.

### Fixed

- User-defined schedules that never fired because of a stale `next_run` and a leftover second cluster. Q2 is collapsed to one cluster, and Schedule changes drive the row directly.
- Empty-list pages no longer issue duplicate queries; an `EXISTS`-first short-circuit short-circuits the empty case.


