From 0d51aafee7b211c9e6a85d8141607f60352f78a3 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Sun, 4 Oct 2026 20:19:59 +0000 Subject: [PATCH] Observer: logs the seeded checkpoint states at start and names the earlier state when a lock is recorded over one (index 1319 re-recorded 14 min after its lock at the 20:15 restart) Co-Authored-By: Claude Fable 5.1 --- tools/observer/observer.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/observer/observer.mjs b/tools/observer/observer.mjs index abe90c9da..e46ff9613 100644 --- a/tools/observer/observer.mjs +++ b/tools/observer/observer.mjs @@ -563,7 +563,12 @@ async function finalityTick(rpc) { checkpointStates.set(cp.index, cp.state); if (cp.votesSeen !== undefined) checkpointDetailed.add(cp.index); await upsertCheckpoint(cp); - if (changed && cp.state === 'locked' && prev !== 'locked') await recordLock(cp); + if (changed && cp.state === 'locked' && prev !== 'locked') { + // a lock recorded over a known earlier state is a revisit (4 October 2026, 20:15:59: index 1319, locked 14 min + // before, was recorded again right after a restart; this line says what the seed held for it) + if (prev !== undefined) log(`checkpoint ${cp.index}: locked after a seeded or earlier state '${prev}'`); + await recordLock(cp); + } } else if (cp.state !== 'locked' && (cp.index % 1 === 0)) { // vote counts move while a checkpoint is open: refresh it await upsertCheckpoint(cp); @@ -894,6 +899,7 @@ async function seedFromDb() { const st = await sql(`SELECT difficulty FROM ${TS} WHERE id = 1`); const cps = await sql(`SELECT index, state FROM ${TC} WHERE updated_at > now() - interval '1 day'`); for (const r of cps) checkpointStates.set(Number(r.index), r.state); + { const by = {}; for (const r of cps) by[r.state] = (by[r.state] || 0) + 1; log(`seeded ${cps.length} checkpoint states: ${Object.entries(by).map(([k, v]) => `${k} ${v}`).join(', ') || 'none'}`); } const certs = await sql(`SELECT index, hash FROM ${TX}`); for (const r of certs) storedCerts.set(Number(r.index), r.hash); // proving: keep polling the blocks of the last 10 minutes that are not fully paid, so a restart loses nothing