Repository navigation
Open
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/infrastructureInfrastructure / host-portability workInfrastructure / host-portability workpriority/highImportant and time-sensitiveImportant and time-sensitivequeue/claimedQueue worker lifecycle stateQueue worker lifecycle statesource/queue-workerFiled or worked by the queue/worker pilotFiled or worked by the queue/worker pilotstatus/in-progressQueue worker lifecycle stateQueue worker lifecycle statetask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle stateQueue worker lifecycle state
Description
Why
The PM stack still depends on the laptop as the only runtime/data host. Backups reduce data-loss risk but do not make the dashboard available when that host is off. Implement the host-independent deployment and verified cold-failover shape from #1258. Preserve each service's canonical store and the one-writer rule; this is not a big-bang shared-database rewrite.
Scope
- Move the aggregator, Kaneo/PostgreSQL, Grist, and Pad runtime to the approved cluster/alternate host as their canonical deployment; keep the laptop as an operator/development client.
- Keep aggregator-owned mutable data on the Supabase
muse-dev2path defined by Long-term: migrate the pm stack into Supabase — refactor component state into schemas for central management #3142/aggregator(dashboard): comment API accepts self-asserted author identities — anyone can post as Drew into the orchestrator/GitHub flow (PR #920) #941; retain service-owned Kaneo, Grist, and Pad stores in their approved persistent homes. - Configure persistent storage, backup/restore integration, and health/freshness reporting so no unique record is held only in laptop-local JSON or Docker volumes. Coordinate with pm-stack databases (Kaneo Postgres, Grist, Pad) have no backup routine — docker volumes are the only copy #1514 and pm-stack backups silently produced empty day-dirs for 3 days (stale container names; no alarm) #3869; do not duplicate their backup implementation.
- Keep the stable Cloudflare Access URL. Route it to the active host; store host credentials by name in Bitwarden/SOPS and do not commit plaintext secrets.
- Implement explicit single-writer fencing and a cold-restore runbook; do not add automatic multi-writer failover.
Acceptance criteria
- A documented deployment target and ownership map exists for aggregator, Kaneo, Grist, and Pad; each service has one named canonical data home and one active writer.
- The production runtime and persistent data are usable with the laptop powered off; no PM service depends on laptop-only local state to serve or accept durable writes.
- Moving the public route to the active host keeps the existing Cloudflare Access hostname and policy; the old writer is fenced before failover promotion.
- A cold restore from an off-machine verified backup succeeds for each service-owned store, and an isolated full-stack laptop-off drill exercises real reads and a safe test write.
- Measured RTO/RPO are recorded in
doc/pm-stack/restore-drills/YYYY-MM.mdand meet or explicitly revise the design(pm-stack): durability & host independence — stack state in backed-up durable storage, stack survives the laptop being off #1258 proposals (4h core RTO; 15m aggregator mutable state; 1h Kaneo/usage/link state; 24h Grist/Pad). - Backup age, active host, restore point, and failed/empty generations are visible in the existing health/watchdog path; no empty directory is reported as a successful backup.
- Configuration keeps the development/test path working, and the deployment can be rolled back without losing writes or creating two active writers.
Boundaries
- Long-term: migrate the pm stack into Supabase — refactor component state into schemas for central management #3142 owns the phased aggregator schema migration; aggregator(dashboard): comment API accepts self-asserted author identities — anyone can post as Drew into the orchestrator/GitHub flow (PR #920) #941/fix(acp): clear stale cancellation markers on every terminal path (#4618) #4642 own identity/provenance semantics. This issue consumes those contracts, not redesigns them.
- pm-stack databases (Kaneo Postgres, Grist, Pad) have no backup routine — docker volumes are the only copy #1514 owns the application-database backup routine; pm-stack backups silently produced empty day-dirs for 3 days (stale container names; no alarm) #3869 owns silent empty-day/container-name failure handling.
- pm-stack: make Project #4 auditable — scheduled export of fields, views, item counts, status/area distribution #1218 owns GitHub Project audit export. GitHub remains canonical for GitHub data.
- No secrets, copied production data, or raw private records in this repository or drill reports.
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/infrastructureInfrastructure / host-portability workInfrastructure / host-portability workpriority/highImportant and time-sensitiveImportant and time-sensitivequeue/claimedQueue worker lifecycle stateQueue worker lifecycle statesource/queue-workerFiled or worked by the queue/worker pilotFiled or worked by the queue/worker pilotstatus/in-progressQueue worker lifecycle stateQueue worker lifecycle statetask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle stateQueue worker lifecycle state
Activity
dezren39 commentedon Nov 1, 2026
🤖 Agent note · filed
dezren39 commentedon Nov 3, 2026
agent-note:v1
state: reviewed (coverage loop-back)
Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 7423 (triage, queued, priority 50) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
Found via: coverage loop-back 2026-11-03
12 remaining items
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
Picked up as task 8946 by lane code-c (repo-queue worker) and handed off to the opencode execution lane per the execution-lane assignment for task 8946. The laptop claimant launches the bound opencode session for task 8946; this lane does not work issue #3989 directly. Note: task 8946 is at attempts 19/32; repeated handoffs — claimant throughput is the constraint.
dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
opencodedezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
agent-note:v1
state: handed off
task: 8946 (repo-health-code-pilot, worker repo-worker-code)
session: ses_e5e5586f1beffetw9oVEKvILNf
found via: queue claim; execution lane opencode
launch: session created on the laptop OpenCode server at verified primary location /home/user/git/code, bound atomically before the prompt was sent.
next: the bound session documents only the verified current-state ownership map for #3989 slice 1; no service moves, deployment changes, writer fencing, or backup/schema implementation. Unruled target/failover/RTO-RPO decisions remain open questions.
links: task 8946 · issue #3989 · design #1258
docs(pm-stack): add current ownership map for #3989