From 59feb5134519fa367b39c2989318dbc92638f13d Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 17:56:36 +0000 Subject: [PATCH] The chain key, once (key-22, the project lead's screenshot of the app's key against /live, 7 October 2026): IgneumDag.legend({mine}) and renderLegend(el, {mine}) in scene/live-dag.js (2.0.5) are the one key both pages render: Pending, Included, Excluded, Selected chain, Proven, Locked checkpoint, each with the token the scene draws that state in and the swatch's shape, the app adding Your blocks (ringed, molten) first; the app's key renders from it at mount with the source line kept after the entries (the Included swatch had been ember while the scene draws included blocks in --included, and "pending" was lower-case), its CSS now colours a swatch only from the entry's token; the copies synced; tools/scene/legend.test.mjs on the gate: the export's entries, order, tokens and shapes, every colour the scene draws has an entry, the app key is the export, and the site key must equal it (binding on master, a diagnostic on a release branch whose site tree is frozen; known-failed under SCENE_SYNC_SCOPE=site today: the site's hand-written key lacks Pending and carries Your block) Co-Authored-By: Claude Fable 5.1 --- app/igneum-app/ui/app.css | 15 ++++----- app/igneum-app/ui/app.js | 2 ++ app/igneum-app/ui/index.html | 2 +- app/igneum-app/ui/live-dag.js | 24 +++++++++++++- scene/live-dag.js | 24 +++++++++++++- site/live-dag.js | 24 +++++++++++++- tools/ci/pre-push.sh | 2 +- tools/scene/legend.test.mjs | 59 +++++++++++++++++++++++++++++++++++ 8 files changed, 140 insertions(+), 12 deletions(-) create mode 100644 tools/scene/legend.test.mjs diff --git a/app/igneum-app/ui/app.css b/app/igneum-app/ui/app.css index 8c707b21..76244e79 100644 --- a/app/igneum-app/ui/app.css +++ b/app/igneum-app/ui/app.css @@ -674,13 +674,14 @@ body.drawer-open .toast{bottom:calc(var(--drawer-h) + 16px)} .legend{display:flex;flex-wrap:wrap;gap:8px 16px;margin-top:var(--s-3);font-size:var(--t-sm);color:var(--ash);align-items:center} .legend span{display:inline-flex;align-items:center;gap:7px} /* the DAG legend swatches, scoped to the legend (a bare .lg reached label.switch.lg until 7 October 2026) */ -.legend .lg{width:10px;height:10px;border-radius:3px;display:inline-block;border:1.5px solid var(--ash);background:var(--row)} -.legend .lg.you{border-color:var(--molten);box-shadow:0 0 0 2px var(--molten-40)} -.legend .lg.pending{border-color:var(--ash)} -.legend .lg.included{border-color:var(--ember)} -.legend .lg.excluded{border-color:var(--ash);opacity:.45} -.legend .lg.proven{background:var(--ember);border-color:var(--ember)} -.legend .lg.locked{border-color:var(--ember);border-radius:50%;box-shadow:0 0 0 2px var(--ember-40)} +/* the key's swatches (key-22, 7 October 2026): the entries, order and tokens come from IgneumDag.legend; a swatch takes its + colour from --lg (set by renderLegend to the entry's token) and its shape from the class, so no state is coloured here */ +.legend .lg{--lg:var(--ash);width:10px;height:10px;border-radius:3px;display:inline-block;border:1.5px solid var(--lg);background:var(--lg-fill,var(--row));position:relative;flex:none} +.legend .lg.faded{opacity:.45} +.legend .lg.circle{border-radius:50%;box-shadow:0 0 0 2px color-mix(in srgb,var(--lg) 40%,transparent)} +.legend .lg.ringed{box-shadow:0 0 0 2px color-mix(in srgb,var(--lg) 40%,transparent)} +.legend .lg.tick{border-color:var(--line-2)} +.legend .lg.tick::after{content:"\2713";position:absolute;left:0;top:-4px;font-size:11px;line-height:1;color:var(--lg)} /* Cards: the Tuning strip above the list */ .tune-strip{padding:var(--s-4) var(--card-pad)} .ts-row{display:flex;align-items:center;gap:var(--s-4);flex-wrap:wrap} diff --git a/app/igneum-app/ui/app.js b/app/igneum-app/ui/app.js index d2e928d5..8e995b7d 100644 --- a/app/igneum-app/ui/app.js +++ b/app/igneum-app/ui/app.js @@ -1981,6 +1981,8 @@ if (typeof document !== 'undefined') (function () { } function mountDag() { if (dag || typeof IgneumDag === 'undefined' || !$('dag-live')) return; + // key-22: the key renders from the scene's one legend export (Your blocks first for this machine's view); the source line stays after it + if (IgneumDag.renderLegend) document.querySelectorAll('[data-legend]').forEach(function (el) { IgneumDag.renderLegend(el, { mine: el.getAttribute('data-legend') === 'mine' }); }); try { dag = IgneumDag.mount($('dag-live'), { compact: true, window: 60, fps: 60, poll: false, mine: mineFn, tooltip: $('dag-tip'), chip: $('dag-chip'), pauseButton: $('dag-pause'), onSelect: function (b, why) { if (b && why !== 'update') openFull(b.hash); }, diff --git a/app/igneum-app/ui/index.html b/app/igneum-app/ui/index.html index 242c5280..5d27fb6f 100644 --- a/app/igneum-app/ui/index.html +++ b/app/igneum-app/ui/index.html @@ -246,7 +246,7 @@ -
Your blockspendingIncludedExcludedProvenLocked checkpoint
+