chore(plan): T-7 — pg_dump executor with a proven restore

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 10:43:41 +02:00
co-authored by Claude Opus 5.5
parent 0a5d7f1067
commit f74e6b2b98
2 changed files with 4 additions and 0 deletions
+1
View File
@@ -1,2 +1,3 @@
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06GN6K3C1NQ7WDPM3YXD6BSTZM', 'T-5', '2026-10-19 08:34:39.758', '2026-10-19 08:34:39.758', NULL, 'c01351dc67e02131a9927ff1f0318979', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at >= ticket_idmap.updated_at;
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06GN6K3CM8S6RJDH27S0W8G3WW', 'T-6', '2026-10-19 08:34:39.906', '2026-10-19 08:34:39.906', NULL, 'f11bc08d305977cc16c9dd4628165c16', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at >= ticket_idmap.updated_at;
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06GN6KV0MHDTH18NEK0AYQ9514', 'T-7', '2026-10-19 08:37:53.444', '2026-10-19 08:37:53.444', NULL, 'a33c7a0cee4e1de4ccb60d0969730221', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at >= ticket_idmap.updated_at;
+3
View File
@@ -12,3 +12,6 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat
- `CLAUDE.md` says an unauthenticated call gets a "200-shape" reply; it is a 401 (`main.py:120-131`, confirmed live).
Done when: the docstring and `TASK_REGISTRATION.md` show a working example taken from a real job, and the two `CLAUDE.md` statements match the code.', 'backlog', 'low', NULL, NULL, NULL, '2026-10-19 08:34:39.906', '2026-10-19 08:34:39.906', NULL, 'f2ae9e8f61920cfef5f3662694236132', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at >= tickets.updated_at;
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06GN6KV0MHDTH18NEK0AYQ9514', 'task', NULL, 'pg_dump executor: back up every postgres-shared database, with a proven restore', 'A `pg_dump_executor` that backs up every database on postgres-shared, daily, with one restore proven — the workspace''s databases have no consistent backup today (the nightly config backup tars the live data directory). Driven by workspace T-175; the design is workspace D-68 (`cladmin/governance/decisions/office.md`).
Shape: modelled on `src/executors/portainer_backup_executor.py`; dumps server-side with `docker exec postgres-shared pg_dump -Fc` per database plus `pg_dumpall --globals-only` (the image''s own client is 17.10, the server 16.15); output `/mnt/media/backups/postgres`, 14 days; registered as a daily 01:30 UTC job.', 'backlog', 'high', NULL, NULL, NULL, '2026-10-19 08:37:53.444', '2026-10-19 08:37:53.444', NULL, 'a7fd33e8ccf7734935d6593e818a2f2b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at >= tickets.updated_at;