From cf997e766e6fe5a8a80da03cdeb5137e335af5b7 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 14:13:26 +0000 Subject: [PATCH] app-ia-26: the pill's rest word names heat mode; the three UI test files outside the gate line join it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shipper read ui/heat-region.test.mjs red on 7e60442e: the item-1 pill said "Resting" where the heat lane's rule wants "Resting · heat mode" (never a bare rest word on a resting card). The pill reads the rule's words again; the once-test says why. heat-region.test.mjs, fold.test.mjs and ui-ota.test.mjs were not in the gate's UI line, which is how the red passed the gate; they are in it now (both lines of tools/ci/pre-push.sh). Co-Authored-By: Claude Fable 5.1 --- app/igneum-app/ui/app.js | 2 +- app/igneum-app/ui/once.test.mjs | 2 +- tools/ci/pre-push.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/igneum-app/ui/app.js b/app/igneum-app/ui/app.js index 56008598d..7d722f18c 100644 --- a/app/igneum-app/ui/app.js +++ b/app/igneum-app/ui/app.js @@ -818,7 +818,7 @@ var View = (function () { if ((s.jobs && s.jobs.active) || m.state === 'held') return { text: 'Job running', tone: '' }; if (tuningCard(m.cards)) return { text: 'Tuning', tone: 'on' }; if (m.state === 'mining') return { text: 'Mining', tone: 'on' }; - if (s.heat && s.heat.on && s.heat.phase === 'resting') return { text: 'Resting', tone: '' }; + if (s.heat && s.heat.on && s.heat.phase === 'resting') return { text: 'Resting · heat mode', tone: '' }; // never a bare rest word (the heat lane's rule) if (m.state === 'paused') return { text: 'Paused', tone: '' }; if (n.state === 'syncing' || n.state === 'starting') return { text: 'Syncing', tone: '' }; if (n.state === 'restarting' || n.state === 'behind' || n.state === 'no peers' || n.state === 'failed' || n.state === 'stopped' || n.state === 'stub') return { text: 'Node down', tone: 'bad' }; diff --git a/app/igneum-app/ui/once.test.mjs b/app/igneum-app/ui/once.test.mjs index bd0be60b3..58fec11d7 100644 --- a/app/igneum-app/ui/once.test.mjs +++ b/app/igneum-app/ui/once.test.mjs @@ -59,7 +59,7 @@ test('T-R8: the pill is a state word, the rate lives on Mine', () => { assert.deepEqual(V.pill({ ...base, mining: { state: 'mining', hash_total: 100, cards: [] }, jobs: { active: true } }), { text: 'Job running', tone: '' }); for (const st of ['restarting', 'behind', 'no peers', 'failed', 'stopped', 'stub']) assert.deepEqual(V.pill({ ...base, mining: { state: 'waiting', hash_total: 0, cards: [] }, node: { state: st } }), { text: 'Node down', tone: 'bad' }, st); assert.deepEqual(V.pill({ ...base, mining: { state: 'mining', hash_total: 1, cards: [{ state: 'tuning' }] } }), { text: 'Tuning', tone: 'on' }); - assert.deepEqual(V.pill({ ...base, heat: { on: true, phase: 'resting' }, mining: { state: 'paused', hash_total: 0, cards: [] } }), { text: 'Resting', tone: '' }); + assert.deepEqual(V.pill({ ...base, heat: { on: true, phase: 'resting' }, mining: { state: 'paused', hash_total: 0, cards: [] } }), { text: 'Resting · heat mode', tone: '' }, 'a rest names heat mode, never a bare word (heat-region.test.mjs)'); assert.deepEqual(V.pill({ ...base, mining: { state: 'idle', hash_total: 0, cards: [] } }), { text: 'Not mining', tone: '' }); assert.deepEqual(V.pill({ ...base, setup_done: false, detecting: true }), { text: 'Detecting cards', tone: '' }); assert.deepEqual(V.pill({ ...base, quitting: true }), { text: 'Stopping', tone: '' }); diff --git a/tools/ci/pre-push.sh b/tools/ci/pre-push.sh index 3e42c9701..deb27a994 100755 --- a/tools/ci/pre-push.sh +++ b/tools/ci/pre-push.sh @@ -109,11 +109,11 @@ tree_checks() { run "the interface and the app entries are one UI tree (version pair; self-test, then the staged manifest when one is given)" bash -c 'node tools/ui-ota/pair-check.mjs --self-test && { [ -z "${IGNEUM_MANIFEST:-}" ] || node tools/ui-ota/pair-check.mjs "$IGNEUM_MANIFEST"; }' run "heat gate reader self-test (a known hold passes, a known drift fails)" node tools/heat-gate.mjs --self-test run "relay unit tests" node --test relay/test/parse.test.mjs relay/test/auth.test.mjs relay/test/wake.test.mjs relay/test/ember.test.mjs - run "miner app notice strip and update card tests" node --test app/igneum-app/tiers/class-v5-tiers.test.mjs app/igneum-app/ui/notices.test.mjs app/igneum-app/ui/update-card.test.mjs app/igneum-app/ui/view.test.mjs app/igneum-app/ui/once.test.mjs app/igneum-app/ui/tune-line.test.mjs app/igneum-app/ui/ui-ota.test.mjs app/igneum-app/ui/fold.test.mjs + run "miner app notice strip and update card tests" node --test app/igneum-app/tiers/class-v5-tiers.test.mjs app/igneum-app/ui/notices.test.mjs app/igneum-app/ui/update-card.test.mjs app/igneum-app/ui/view.test.mjs app/igneum-app/ui/once.test.mjs app/igneum-app/ui/tune-line.test.mjs app/igneum-app/ui/heat-region.test.mjs app/igneum-app/ui/fold.test.mjs app/igneum-app/ui/ui-ota.test.mjs app/igneum-app/ui/ui-ota.test.mjs app/igneum-app/ui/fold.test.mjs run "the opening window size: the one rule for both hosts (primary work area, 1920 and 16:10 caps, a remembered frame kept only when it fits)" bash -c 'cc -std=c99 -Wall -Wextra -o "${TMPDIR:-/tmp}/opening_size_test.$$" app/windows/opening_size_test.c && "${TMPDIR:-/tmp}/opening_size_test.$$"; rc=$?; rm -f "${TMPDIR:-/tmp}/opening_size_test.$$"; exit $rc' run "the Intel rotate-fold rewrite: Intel gets the shift form, AMD and NVIDIA untouched (proto-opencl/test_intel_rotr.c)" bash -c 'cc -std=c99 -Wall -Wextra -o "${TMPDIR:-/tmp}/test_intel_rotr.$$" proto-opencl/test_intel_rotr.c && "${TMPDIR:-/tmp}/test_intel_rotr.$$"; s=$?; rm -f "${TMPDIR:-/tmp}/test_intel_rotr.$$"; exit $s' run "no secret file names and no 64-hex secrets in the tree" bash -c 'bash tools/ci/no-secrets-check.sh --self-test && bash tools/ci/no-secrets-check.sh' - run "miner app notice strip and update card tests" node --test app/igneum-app/tiers/class-v5-tiers.test.mjs app/igneum-app/ui/notices.test.mjs app/igneum-app/ui/update-card.test.mjs app/igneum-app/ui/view.test.mjs app/igneum-app/ui/once.test.mjs app/igneum-app/ui/tune-line.test.mjs + run "miner app notice strip and update card tests" node --test app/igneum-app/tiers/class-v5-tiers.test.mjs app/igneum-app/ui/notices.test.mjs app/igneum-app/ui/update-card.test.mjs app/igneum-app/ui/view.test.mjs app/igneum-app/ui/once.test.mjs app/igneum-app/ui/tune-line.test.mjs app/igneum-app/ui/heat-region.test.mjs app/igneum-app/ui/fold.test.mjs app/igneum-app/ui/ui-ota.test.mjs run "launch gates: every row with its check, the handoff text clean (self-test, then the tree)" bash -c 'node tools/ci/launch-gates-check.mjs --self-test && node tools/ci/launch-gates-check.mjs' run "income per tier: the public table equals its inputs, the schedule arithmetic" bash -c 'node tools/launch/income-tiers.mjs --check && node --test tools/launch/income-tiers.test.mjs' run "hash-origin report: a known-finished day and a known-failed day" node --test tools/observer/hash-origin.test.mjs