docs(archreview): sync PLAN-01 tracker + tasks.json — Wave 1 T2,T5–T12 done (12/23)

This commit is contained in:
Joseph Doherty
2026-07-08 16:14:46 -04:00
parent 6300d6d399
commit 15d91d760f
2 changed files with 175 additions and 25 deletions
@@ -1,29 +1,177 @@
{
"planPath": "archreview/plans/PLAN-01-cluster-host-failover.md",
"tasks": [
{ "id": 1, "subject": "Task 1: Enable the SBR downing provider in BuildHocon", "status": "completed", "blockedBy": [] },
{ "id": 2, "subject": "Task 2: Raise the cluster-leave CoordinatedShutdown phase timeout above the drain budget", "status": "pending", "blockedBy": [1] },
{ "id": 3, "subject": "Task 3: Two-node in-process cluster fixture (the reusable failover rig)", "status": "completed", "blockedBy": [1] },
{ "id": 4, "subject": "Task 4: SBR behavioral proof — DELIVERED as younger-node-crash (SBR downs it, oldest keeps singleton); the planned oldest-crash 'singleton migration' is impossible under 2-node keep-oldest — see master-tracker follow-up", "status": "completed", "blockedBy": [3] },
{ "id": 5, "subject": "Task 5: ClusterActivityEvaluator — single oldest-member \"active node\" definition", "status": "pending", "blockedBy": [] },
{ "id": 6, "subject": "Task 6: Rewire ActiveNodeGate, AkkaClusterNodeProvider and Primary labels onto the evaluator", "status": "pending", "blockedBy": [5] },
{ "id": 7, "subject": "Task 7: Oldest-based /health/active check + require DB reachability for Active", "status": "pending", "blockedBy": [5] },
{ "id": 8, "subject": "Task 8: Divergence proof — restarted first node must NOT become active again", "status": "pending", "blockedBy": [3, 6] },
{ "id": 9, "subject": "Task 9: CentralSingletonRegistrar helper (manager + drain task + proxy)", "status": "pending", "blockedBy": [2] },
{ "id": 10, "subject": "Task 10: Route all seven central singletons through the registrar (adds missing outbox/ingest drains)", "status": "pending", "blockedBy": [9] },
{ "id": 11, "subject": "Task 11: SiteHealthReportAck message + ack semantics in the communication actors", "status": "pending", "blockedBy": [] },
{ "id": 12, "subject": "Task 12: Acked async health-report transport so counter-restore actually fires", "status": "pending", "blockedBy": [11] },
{ "id": 13, "subject": "Task 13: Metrics-staleness signal + status-transition timestamps in the aggregator", "status": "pending", "blockedBy": [] },
{ "id": 14, "subject": "Task 14: Surface metrics-stale + offline-since on the Health dashboard", "status": "pending", "blockedBy": [13] },
{ "id": 15, "subject": "Task 15: Fix the metrics-port seed in appsettings.Site.json + close the validator gap", "status": "pending", "blockedBy": [] },
{ "id": 16, "subject": "Task 16: Single-node installs — explicit AllowSingleNodeCluster instead of phantom seeds", "status": "pending", "blockedBy": [] },
{ "id": 17, "subject": "Task 17: stop_grace_period for all app containers (both topologies)", "status": "pending", "blockedBy": [] },
{ "id": 18, "subject": "Task 18: Evict deleted sites from the health aggregator", "status": "pending", "blockedBy": [13] },
{ "id": 19, "subject": "Task 19: Rate-limit dead-letter warnings", "status": "pending", "blockedBy": [] },
{ "id": 20, "subject": "Task 20: Down-if-alone recovery — exit on unexpected ActorSystem termination + service restart actions", "status": "pending", "blockedBy": [10] },
{ "id": 21, "subject": "Task 21: Docker failover drill script (manual/CI kill test against the real topology)", "status": "pending", "blockedBy": [1, 17] },
{ "id": 22, "subject": "Task 22: Reconcile REQ-HOST-6 (Akka.Hosting) with the hand-rolled bootstrap", "status": "pending", "blockedBy": [1] },
{ "id": 23, "subject": "Task 23: Docs & deploy-config cleanup batch (Traefik doc, NodeName overlays, TLS roadmap note)", "status": "pending", "blockedBy": [7, 16] }
{
"id": 1,
"subject": "Task 1: Enable the SBR downing provider in BuildHocon",
"status": "completed",
"blockedBy": []
},
{
"id": 2,
"subject": "Task 2: Raise the cluster-leave CoordinatedShutdown phase timeout above the drain budget",
"status": "completed",
"blockedBy": [
1
]
},
{
"id": 3,
"subject": "Task 3: Two-node in-process cluster fixture (the reusable failover rig)",
"status": "completed",
"blockedBy": [
1
]
},
{
"id": 4,
"subject": "Task 4: SBR behavioral proof — DELIVERED as younger-node-crash (SBR downs it, oldest keeps singleton); the planned oldest-crash 'singleton migration' is impossible under 2-node keep-oldest — see master-tracker follow-up",
"status": "completed",
"blockedBy": [
3
]
},
{
"id": 5,
"subject": "Task 5: ClusterActivityEvaluator — single oldest-member \"active node\" definition",
"status": "completed",
"blockedBy": []
},
{
"id": 6,
"subject": "Task 6: Rewire ActiveNodeGate, AkkaClusterNodeProvider and Primary labels onto the evaluator",
"status": "completed",
"blockedBy": [
5
]
},
{
"id": 7,
"subject": "Task 7: Oldest-based /health/active check + require DB reachability for Active",
"status": "completed",
"blockedBy": [
5
]
},
{
"id": 8,
"subject": "Task 8: Divergence proof — restarted first node must NOT become active again",
"status": "completed",
"blockedBy": [
3,
6
]
},
{
"id": 9,
"subject": "Task 9: CentralSingletonRegistrar helper (manager + drain task + proxy)",
"status": "completed",
"blockedBy": [
2
]
},
{
"id": 10,
"subject": "Task 10: Route all seven central singletons through the registrar (adds missing outbox/ingest drains)",
"status": "completed",
"blockedBy": [
9
]
},
{
"id": 11,
"subject": "Task 11: SiteHealthReportAck message + ack semantics in the communication actors",
"status": "completed",
"blockedBy": []
},
{
"id": 12,
"subject": "Task 12: Acked async health-report transport so counter-restore actually fires",
"status": "completed",
"blockedBy": [
11
]
},
{
"id": 13,
"subject": "Task 13: Metrics-staleness signal + status-transition timestamps in the aggregator",
"status": "pending",
"blockedBy": []
},
{
"id": 14,
"subject": "Task 14: Surface metrics-stale + offline-since on the Health dashboard",
"status": "pending",
"blockedBy": [
13
]
},
{
"id": 15,
"subject": "Task 15: Fix the metrics-port seed in appsettings.Site.json + close the validator gap",
"status": "pending",
"blockedBy": []
},
{
"id": 16,
"subject": "Task 16: Single-node installs — explicit AllowSingleNodeCluster instead of phantom seeds",
"status": "pending",
"blockedBy": []
},
{
"id": 17,
"subject": "Task 17: stop_grace_period for all app containers (both topologies)",
"status": "pending",
"blockedBy": []
},
{
"id": 18,
"subject": "Task 18: Evict deleted sites from the health aggregator",
"status": "pending",
"blockedBy": [
13
]
},
{
"id": 19,
"subject": "Task 19: Rate-limit dead-letter warnings",
"status": "pending",
"blockedBy": []
},
{
"id": 20,
"subject": "Task 20: Down-if-alone recovery — exit on unexpected ActorSystem termination + service restart actions",
"status": "pending",
"blockedBy": [
10
]
},
{
"id": 21,
"subject": "Task 21: Docker failover drill script (manual/CI kill test against the real topology)",
"status": "pending",
"blockedBy": [
1,
17
]
},
{
"id": 22,
"subject": "Task 22: Reconcile REQ-HOST-6 (Akka.Hosting) with the hand-rolled bootstrap",
"status": "pending",
"blockedBy": [
1
]
},
{
"id": 23,
"subject": "Task 23: Docs & deploy-config cleanup batch (Traefik doc, NodeName overlays, TLS roadmap note)",
"status": "pending",
"blockedBy": [
7,
16
]
}
],
"lastUpdated": "2026-07-08"
}
}