diff --git a/README.md b/README.md index 1019a28..7290519 100644 --- a/README.md +++ b/README.md @@ -461,6 +461,39 @@ The one-time fleet setup this pairs with — the GitHub OAuth App, the global **and** switchboard environments — is ePHPm node config, not switchboard's; it is described in [`docs/preview-access-gate.md`](docs/preview-access-gate.md). +### Reconcile (level-triggered convergence) + +The drain/queue path is **edge-triggered** on the `switchboard:gen` counter: a +node only re-walks desired state when the counter advances past its own cursor. +Because `gen` is a *separate* gossip key from the content it guards, an increment +that is lost or not-yet-replicated leaves a node "current" at a generation whose +teardown it never materialized — so the torn-down preview stays served, its +database and `.toml` override on disk, every health check green. This is the +class of fault behind override counts drifting between nodes and orphaned +overrides lingering as 404s. + +The reconcile pass is the **level-triggered** backstop. On its own interval, +independent of `gen`, it reads the KV desired state *directly* and converges this +node's on-disk previews to it. Pruning classifies each preview directory from its +**own** `switchboard:preview: