[Maintainer] Upgrade to v0.19.6
Current version: 0.19.4
Target version: 0.19.6
Upgrade Notes
Wires the fleet registry into the admin dashboard end-to-end so that
production deployments at https://caretaker.cat-herding.net light up
with real heartbeat, alert, webhook, and doctor data. Closes the gap
where every child repo in docs/fleet.yml was effectively invisible to
the admin UI even when it ran caretaker on schedule.
Added
- Persistent
SQLiteFleetRegistryStore (src/caretaker/fleet/sqlite_store.py)
— SQLite-backed implementation of the registry with the same async API
as the in-memory store. Keeps the most recent 32 heartbeats per repo
in a fleet_heartbeats ring buffer plus the latest snapshot in
fleet_clients. Activated by setting CARETAKER_FLEET_DB_PATH
(default location ~/.local/state/caretaker/fleet-registry.db); the
legacy in-memory store remains the default to avoid surprising tests.
Survives backend restarts so dashboard data no longer evaporates on
every pod recycle.
fleet_registry block in setup-templates/templates/config-default.yml
— opt-in template (enabled: false) that points at the production
endpoint with HMAC and timeout pre-wired. Includes a 22-line comment
block explaining the contract.
CARETAKER_FLEET_SECRET env wiring in setup-templates/templates/workflows/maintainer.yml
— exported in all three env: blocks (bootstrap-check, run, and
self-heal-on-failure). Indentation across the workflow normalised to
2-space nesting at the same time.
- Step 2.8 in
setup-templates/SETUP_AGENT.md — guides Copilot
through enabling the fleet registry on each child repo (config edit
- secret + verification command).
docs/fleet-opt-in-runbook.md — operator-facing runbook
enumerating the 12 child repos in docs/fleet.yml with per-repo
caveats and a four-step opt-in checklist.
caretaker fleet status CLI command — local config inspector;
prints the resolved fleet_registry block and notes whether the
signing secret is populated.
caretaker fleet register-self CLI command — sends one
signed heartbeat to verify a repo's registration round-trip;
echoes the dashboard's HTTP response for fast diagnosis.
- Frontend
Alerts page (/alerts) — consumes
/api/admin/fleet/alerts with an "open only" toggle, severity
badges, and links back to per-repo detail. Closes the dead link
from AlertsBanner.tsx.
- Frontend
FleetDetail page (/fleet/:owner/:repo) — per-repo
drill-down with the last 32 heartbeats, enabled-agent pills, and
goal-health/error trends. Reachable from any row of the Fleet page.
FleetClient, FleetClientDetail, FleetAlert,
FleetAlertList types — added to frontend/src/lib/types.ts so
TypeScript builds no longer rely on an implicit FleetAlert import.
Changed
GET /api/admin/fleet/{owner}/{repo} — now accepts
?include_history=true&history_limit=N (max 32) and returns the
per-repo heartbeat ring buffer alongside the client snapshot. Used
by the new Fleet detail page.
fleet/store.py get_store() — picks SQLite backing when
CARETAKER_FLEET_DB_PATH is set; otherwise keeps the in-memory
default. reset_store_for_tests(store=None) accepts an explicit
store override for SQLite test fixtures.
fleet/__init__.py — re-exports SQLiteFleetRegistryStore,
resolve_db_path, and DEFAULT_DB_PATH_ENV.
docs/fleet-registry.md — example endpoint replaced with the
production URL https://caretaker.cat-herding.net/api/fleet/heartbeat;
persistence section rewritten to describe the new SQLite seam.
Fixed
- Dead admin routers wired into the FastAPI app
(src/caretaker/mcp_backend/main.py):
caretaker.admin.health_api — GET /health/doctor now reachable;
configured with the live admin_data, optional graph store, and
fleet store on lifespan.
caretaker.admin.webhooks_api — GET /api/admin/webhooks/deliveries
now reachable, and the github_webhook handler calls
register_delivery() after each ack so the dashboard can show
delivery history.
- Frontend
/alerts 404 — AlertsBanner.tsx linked to a route
that did not exist; the new Alerts page closes that gap.
- Workflow YAML indentation —
setup-templates/templates/workflows/maintainer.yml
had inconsistent 7/9-space indentation on three - name: step
headers and their env: maps. Normalised to 2-space nesting; YAML
now parses cleanly without GitHub Actions' lenient mode.
📋 Full Changelog
@copilot Please apply this upgrade.
See .github/agents/maintainer-upgrade.md for instructions.
FROM: 0.19.4
TO: 0.19.6
BREAKING: False
Steps:
- Update version pins in
pyproject.toml / requirements.txt
- Update any workflow references
- Run tests to verify compatibility
- Update the version in config if applicable
Acceptance criteria:
[Maintainer] Upgrade to v0.19.6
Current version:
0.19.4Target version:
0.19.6Upgrade Notes
Wires the fleet registry into the admin dashboard end-to-end so that
production deployments at
https://caretaker.cat-herding.netlight upwith real heartbeat, alert, webhook, and doctor data. Closes the gap
where every child repo in
docs/fleet.ymlwas effectively invisible tothe admin UI even when it ran caretaker on schedule.
Added
SQLiteFleetRegistryStore(src/caretaker/fleet/sqlite_store.py)— SQLite-backed implementation of the registry with the same async API
as the in-memory store. Keeps the most recent 32 heartbeats per repo
in a
fleet_heartbeatsring buffer plus the latest snapshot infleet_clients. Activated by settingCARETAKER_FLEET_DB_PATH(default location
~/.local/state/caretaker/fleet-registry.db); thelegacy in-memory store remains the default to avoid surprising tests.
Survives backend restarts so dashboard data no longer evaporates on
every pod recycle.
fleet_registryblock insetup-templates/templates/config-default.yml— opt-in template (
enabled: false) that points at the productionendpoint with HMAC and timeout pre-wired. Includes a 22-line comment
block explaining the contract.
CARETAKER_FLEET_SECRETenv wiring insetup-templates/templates/workflows/maintainer.yml— exported in all three
env:blocks (bootstrap-check, run, andself-heal-on-failure). Indentation across the workflow normalised to
2-space nesting at the same time.
setup-templates/SETUP_AGENT.md— guides Copilotthrough enabling the fleet registry on each child repo (config edit
docs/fleet-opt-in-runbook.md— operator-facing runbookenumerating the 12 child repos in
docs/fleet.ymlwith per-repocaveats and a four-step opt-in checklist.
caretaker fleet statusCLI command — local config inspector;prints the resolved
fleet_registryblock and notes whether thesigning secret is populated.
caretaker fleet register-selfCLI command — sends onesigned heartbeat to verify a repo's registration round-trip;
echoes the dashboard's HTTP response for fast diagnosis.
Alertspage (/alerts) — consumes/api/admin/fleet/alertswith an "open only" toggle, severitybadges, and links back to per-repo detail. Closes the dead link
from
AlertsBanner.tsx.FleetDetailpage (/fleet/:owner/:repo) — per-repodrill-down with the last 32 heartbeats, enabled-agent pills, and
goal-health/error trends. Reachable from any row of the Fleet page.
FleetClient,FleetClientDetail,FleetAlert,FleetAlertListtypes — added tofrontend/src/lib/types.tssoTypeScript builds no longer rely on an implicit
FleetAlertimport.Changed
GET /api/admin/fleet/{owner}/{repo}— now accepts?include_history=true&history_limit=N(max 32) and returns theper-repo heartbeat ring buffer alongside the client snapshot. Used
by the new Fleet detail page.
fleet/store.pyget_store()— picks SQLite backing whenCARETAKER_FLEET_DB_PATHis set; otherwise keeps the in-memorydefault.
reset_store_for_tests(store=None)accepts an explicitstore override for SQLite test fixtures.
fleet/__init__.py— re-exportsSQLiteFleetRegistryStore,resolve_db_path, andDEFAULT_DB_PATH_ENV.docs/fleet-registry.md— example endpoint replaced with theproduction URL
https://caretaker.cat-herding.net/api/fleet/heartbeat;persistence section rewritten to describe the new SQLite seam.
Fixed
(
src/caretaker/mcp_backend/main.py):caretaker.admin.health_api—GET /health/doctornow reachable;configured with the live
admin_data, optional graph store, andfleet store on lifespan.
caretaker.admin.webhooks_api—GET /api/admin/webhooks/deliveriesnow reachable, and the
github_webhookhandler callsregister_delivery()after each ack so the dashboard can showdelivery history.
/alerts404 —AlertsBanner.tsxlinked to a routethat did not exist; the new
Alertspage closes that gap.setup-templates/templates/workflows/maintainer.ymlhad inconsistent 7/9-space indentation on three
- name:stepheaders and their
env:maps. Normalised to 2-space nesting; YAMLnow parses cleanly without GitHub Actions' lenient mode.
📋 Full Changelog
@copilot Please apply this upgrade.
See
.github/agents/maintainer-upgrade.mdfor instructions.FROM: 0.19.4
TO: 0.19.6
BREAKING: False
Steps:
pyproject.toml/requirements.txtAcceptance criteria: