From efb5b330dd18c214c2ed29419dbd00e646a2d27c Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:34:09 +0000 Subject: [PATCH] Explorer: a chain block whose plan the observer has not read says so (the scene's wording rule of 7 October 2026) Co-Authored-By: Claude Fable 5.1 --- site/block.html | 2 +- site/explorer.html | 2 +- site/tx.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/site/block.html b/site/block.html index 50c4cf94e..289b8f06e 100644 --- a/site/block.html +++ b/site/block.html @@ -357,7 +357,7 @@ async function load() { const chips = [b.chain ? (b.chain_now === false ? 'chain block, replaced' : 'chain block') : `${esc(b.color)}`, `class ${esc(b.class ? b.class.class : 'v4')}`]; if (j.checkpoint) chips.push(`checkpoint ${j.checkpoint.index}, ${esc(j.checkpoint.state)}`); chips.push(b.lock && b.lock.final ? `final under lock ${int(b.lock.index)}` : `not under a lock yet`); - if (b.chain) chips.push(sum.total ? `${sum.paid} of ${sum.total} shards paid` : 'no shard plan yet'); + if (b.chain) chips.push(sum.total ? `${sum.paid} of ${sum.total} shards paid` : 'plan not read yet'); if (b.proof_records) chips.push(`carries ${b.proof_records} proof record${b.proof_records === 1 ? '' : 's'}`); if (j.txs.length) chips.push(`${j.txs.length} transaction${j.txs.length === 1 ? '' : 's'} executed`); $('chips').innerHTML = chips.join(''); diff --git a/site/explorer.html b/site/explorer.html index 9f3343d59..854b000b5 100644 --- a/site/explorer.html +++ b/site/explorer.html @@ -477,7 +477,7 @@ function drawDag() { lanes.forEach((m, i) => ctx.fillText(m, 4, padY + i * lh + lh / 2 - 7)); } function nearest(ev) { const cv = $('dag'), r = cv.getBoundingClientRect(), x = ev.clientX - r.left, y = ev.clientY - r.top; let best = null, bd = 144; for (const p of dagPos.values()) { const d = (p.x - x) ** 2 + (p.y - y) ** 2; if (d < bd) { bd = d; best = p; } } return best; } -$('dag').addEventListener('mousemove', ev => { const p = nearest(ev); if (!p) { dagTip.style.display = 'none'; return; } const b = p.b, s = b.shards; dagTip.style.display = 'block'; dagTip.style.left = Math.min(p.x + 12, $('dag').clientWidth - 310) + 'px'; dagTip.style.top = (p.y + 12) + 'px'; dagTip.innerHTML = `${esc(shortHash(b.hash, 10, 6))}
${b.chain ? (b.chain_now === false ? 'replaced chain block ' + int(b.number) : 'chain block ' + int(b.number)) : esc(b.color)}, blue score ${int(b.blue_score)}, DAA ${int(b.daa)}
miner ${esc(b.miner_id || '?')}, class ${esc(b.class || 'v4')}, ${b.parents} parent${b.parents === 1 ? '' : 's'}
${s && s.total ? `${s.paid} of ${s.total} shards paid` : (b.chain ? 'no shard plan yet' : 'no shards (not a chain block)')}${b.final ? ', under a lock' : ''}`; }); +$('dag').addEventListener('mousemove', ev => { const p = nearest(ev); if (!p) { dagTip.style.display = 'none'; return; } const b = p.b, s = b.shards; dagTip.style.display = 'block'; dagTip.style.left = Math.min(p.x + 12, $('dag').clientWidth - 310) + 'px'; dagTip.style.top = (p.y + 12) + 'px'; dagTip.innerHTML = `${esc(shortHash(b.hash, 10, 6))}
${b.chain ? (b.chain_now === false ? 'replaced chain block ' + int(b.number) : 'chain block ' + int(b.number)) : esc(b.color)}, blue score ${int(b.blue_score)}, DAA ${int(b.daa)}
miner ${esc(b.miner_id || '?')}, class ${esc(b.class || 'v4')}, ${b.parents} parent${b.parents === 1 ? '' : 's'}
${s && s.total ? `${s.paid} of ${s.total} shards paid` : (b.chain ? 'plan not read yet' : 'no shards (not a chain block)')}${b.final ? ', under a lock' : ''}`; }); $('dag').addEventListener('mouseleave', () => { dagTip.style.display = 'none'; }); $('dag').addEventListener('click', ev => { const p = nearest(ev); if (p) location.href = '/block/' + p.b.hash; }); async function loadDag() { const j = await fetch('/api/explorer?dag=150').then(r => r.json()); if (!j.ok) throw new Error(j.error); dagBlocks = j.blocks; $('dag-eyebrow').textContent = `the newest ${j.blocks.length} blocks, one lane per miner, read ${stamp(j.now)}`; drawDag(); } diff --git a/site/tx.html b/site/tx.html index 47e97d42f..956a77e59 100644 --- a/site/tx.html +++ b/site/tx.html @@ -370,7 +370,7 @@ async function load() { ['Blue score', int(b.blue_score)], ['DAA score', int(b.daa)], ['Class', esc(b.class || 'v4')], ['Miner', addr(b.evm_miner)], ['Lock state', b.lock ? `${b.lock.final ? 'final' : 'not final'} ${esc(b.lock.reason)}` : 'n/a'], - ['Proof', b.shards && b.shards.total ? `${b.shards.paid} of ${b.shards.total} shards paid${b.shards.median_lag !== null ? `, median lag ${int(b.shards.median_lag)} DAA` : ''} ${b.shards.proving} proving, ${b.shards.verified} verified, ${b.shards.planned} planned` : 'no shard plan yet'], + ['Proof', b.shards && b.shards.total ? `${b.shards.paid} of ${b.shards.total} shards paid${b.shards.median_lag !== null ? `, median lag ${int(b.shards.median_lag)} DAA` : ''} ${b.shards.proving} proving, ${b.shards.verified} verified, ${b.shards.planned} planned` : 'plan not read yet'], ]); } else { $('blk-eyebrow').textContent = 'outside the observer window'; $('blk').innerHTML = dl([['Block', `${esc(t.block_hash)}`], ['Note', esc(b && b.note ? b.note : 'the observer keeps one day of blocks')]]); } const logs = t.logs || [];