From 384e0f4e7e045373daff41265c329a28c2b5b972 Mon Sep 17 00:00:00 2001 From: jochen Date: Tue, 1 Sep 2026 23:03:05 +0200 Subject: [PATCH] Current is not caught up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit settled() returned the moment a declaration was current, because the sent digest is recorded at send — so both new tests asserted on a machine still applying, and found containers not created yet and bindings not written. The eternal-waiting fault had been standing in front of this gap the whole time; fixing it is what let the tests get far enough to fall in. Caught up now means the machine's own last report is newer than what was sent to it — two timestamps the mesh recorded itself, read from the `reported` section status now carries. The residual latency between "reported" and "every container answers" stays with the tests' own polls, where it always was. --- test/integration/mesh.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/integration/mesh.test.ts b/test/integration/mesh.test.ts index bde9368..bb44396 100644 --- a/test/integration/mesh.test.ts +++ b/test/integration/mesh.test.ts @@ -135,6 +135,7 @@ async function settled(node: string, withinMs = 240_000): Promise { wrong: { node: string; outcome: string; refused?: string; failed?: { id: string; error: string }[] }[]; waiting: { node: string; never: boolean }[]; + reported: { node: string; outcome: string; at?: string; sent?: string }[]; } | undefined; let said = ""; try { @@ -160,7 +161,15 @@ async function settled(node: string, withinMs = 240_000): Promise { .filter(Boolean).join("\n "); throw new Error(`${node} did not apply what it was sent (${bad.outcome}):\n ${why}`); } - if (!state.waiting.some((w) => w.node === node)) return; + // Current is not caught up. The sent digest is recorded at send, so "not waiting" holds + // from the moment push returns, while the machine is still applying — this test asserted on + // containers the instant the declaration was current and found them not created yet. Caught + // up is the machine's own report being newer than what was sent to it: two timestamps the + // mesh recorded itself, compared. + const word = state.reported.find((r) => r.node === node); + const acted = word?.outcome === "applied" && !!word.at && !!word.sent && + Date.parse(word.at) > Date.parse(word.sent); + if (!state.waiting.some((w) => w.node === node) && acted) return; last = said; // Unhurried on purpose: each poll is an exec into a container on the machine that is busy // applying, and asking four times a minute rather than thirty is the difference between