From ffdb709bbf8a2b37776945d1e0ca879c44fa5b21 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:27:45 +0000 Subject: [PATCH] The wallet's History row: a block under a locked checkpoint is finalised even in a pause; the window audit records the founder's v2.0.1 calls docs/spec/finality-guarantees.md section 9: one vocabulary, included, executed, proven, finalised; the network's pause is the network's word, never a transaction's. The wallet's History row read the node's "finality not active" word for a transaction under a locked checkpoint while finality was paused; it reads "finalised" now, with the pause in the why ("under a locked checkpoint, not yet verified here; finality is paused on the network above it"). Known-failed first on build-2 (view.test.mjs: the row's word and the vocabulary set); 21 wallet UI tests green. docs/design/app-audit-2026-10-08.md gains section 7: the founder's reversals and additions for v2.0.1 (the Cards tab back, the first-block card once per address, the four words, one positioning line, the watchdog's waiting words), each with where it lands (branch cards-201 on release-2.0.1; this branch for the wallet). Co-Authored-By: Claude Fable 5.1 --- app/igneum-wallet/ui/app.js | 4 +++- app/igneum-wallet/ui/view.test.mjs | 7 +++++-- docs/design/app-audit-2026-10-08.md | 13 +++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/igneum-wallet/ui/app.js b/app/igneum-wallet/ui/app.js index 82c7a6853..8712fca48 100644 --- a/app/igneum-wallet/ui/app.js +++ b/app/igneum-wallet/ui/app.js @@ -141,7 +141,9 @@ var View = (function () { case 'executed': return { word: 'executed', tone: 'ink', why: 'in ' + blk }; case 'proven': return { word: 'proven', tone: 'ink', why: 'in ' + blk + ', proof paid' }; case 'finalised': return { word: 'finalised', tone: 'ink', why: 'under a locked checkpoint, not yet verified here' }; - case 'finality not active': return { word: 'finality not active', tone: 'ink', why: 'under a locked checkpoint; finality is paused on the network' }; + // section 9 of docs/spec/finality-guarantees.md: a block under a locked checkpoint is finalised even while the network's + // finality is paused; the pause is the network's word, never a transaction's + case 'finality not active': return { word: 'finalised', tone: 'ink', why: 'under a locked checkpoint, not yet verified here; finality is paused on the network above it' }; case 'unknown': return { word: 'pending', tone: '', why: 'not in any block the node holds' }; } if (e.finality === 'in_block') return { word: 'included', tone: '', why: 'in ' + blk }; diff --git a/app/igneum-wallet/ui/view.test.mjs b/app/igneum-wallet/ui/view.test.mjs index 5c91f76cd..f8d71f8d2 100644 --- a/app/igneum-wallet/ui/view.test.mjs +++ b/app/igneum-wallet/ui/view.test.mjs @@ -103,7 +103,10 @@ test('one state word per row: the wallet\'s verified final wins, failed from the assert.deepEqual(V.stateWord(e, 'proven'), { word: 'proven', tone: 'ink', why: 'in block 140,262, proof paid' }); // the node says finalised but this wallet has not verified the certificate: the word, not the molten tone assert.deepEqual(V.stateWord(e, 'finalised'), { word: 'finalised', tone: 'ink', why: 'under a locked checkpoint, not yet verified here' }); - assert.deepEqual(V.stateWord(e, 'finality not active'), { word: 'finality not active', tone: 'ink', why: 'under a locked checkpoint; finality is paused on the network' }); + // section 9 of docs/spec/finality-guarantees.md (8 October 2026): a block under a locked checkpoint is finalised even while + // the network's finality is paused; the pause is the network's state word, never a transaction's. Known-failed first: the + // node's "finality not active" word was shown on the row. + assert.deepEqual(V.stateWord(e, 'finality not active'), { word: 'finalised', tone: 'ink', why: 'under a locked checkpoint, not yet verified here; finality is paused on the network above it' }); assert.equal(V.stateWord(e, 'unknown').word, 'pending'); // no node word yet (the public RPC, or not asked): the wallet's label assert.deepEqual(V.stateWord(e, ''), { word: 'included', tone: '', why: 'in block 140,262' }); @@ -114,7 +117,7 @@ test('one state word per row: the wallet\'s verified final wins, failed from the assert.deepEqual(V.stateWord(r, ''), { word: 'executed', tone: 'ink', why: 'in block 140,201' }); assert.equal(V.stateWord(entry({ hash: 'proving-1-0', kind: 'proving', finality: 'final', checkpoint: 9 }), '').word, 'finalised'); // never a stronger word than the chain's: the words the row can show are exactly the node's plus failed - const words = new Set(['pending', 'included', 'executed', 'proven', 'finalised', 'finality not active', 'failed']); + const words = new Set(['pending', 'included', 'executed', 'proven', 'finalised', 'failed']); for (const w of ['pending', 'included', 'executed', 'proven', 'finalised', 'finality not active', 'unknown', '']) assert.ok(words.has(V.stateWord(e, w).word), w); }); diff --git a/docs/design/app-audit-2026-10-08.md b/docs/design/app-audit-2026-10-08.md index 951864631..0ee224f67 100644 --- a/docs/design/app-audit-2026-10-08.md +++ b/docs/design/app-audit-2026-10-08.md @@ -346,3 +346,16 @@ Defaults stand unless a word comes by the time given. | D5 | The chain scene stays on Mine as the live graph; the block inspector stays behind Inspect | stays | 17:00 BST | Captures: `~/Desktop/igneum-previews-2026-10-08/audit/01-overview-live-dark.png` to `13-settings-light.png`. + +## 7. The founder's reversals and additions, v2.0.1 (8 October 2026, 18:1x BST) + +Recorded as the founder's call, read through the shipper; they override section 4 where they touch it. + +| Id | Call | What changes | Where | +|---|---|---|---| +| F1 | The Cards tab is back in the rail as its own page | every card row moves out of Mine into Cards: the state, the hash rate, the power, the temperature, the tune state (one line, the Tune page's words), the enable switch, the 16 GB proving note; Mine keeps the headline rate and the chain status (the hero tiles, the chain scene, the node line, Activity); D4 of section 6 is reversed | `app/igneum-app/ui` on release-2.0.1, branch cards-201; `View.cardsRowWords`; the once-test "v2.0.1: the Cards page holds every card row" | +| F2 | The first-block celebration shows once per payout address, ever | keyed on the lower-case address and persisted in settings.json (`first_block_shown[address] = {hash, at}`), so it survives runs, updates and a reinstall that keeps the wallet; a new address shows it once again; a dev-fee block never raises it | `app/igneum-app/src/config.rs`, `ladder.rs`, `engine.rs`, `server.rs` on the same branch | +| F3 | The four interface words on the wallet and the window | included, executed, proven, finalised (docs/spec/finality-guarantees.md section 9); a locked block is finalised even in a pause, the pause sits on the status strip, no block reads "finality not active" | the window's block inspector and the scene's words (cards-201); the wallet's History row (`app/igneum-wallet/ui/app.js` stateWord, branch wallet-words-20 on master) | +| F4 | One positioning line | the hero keeps it; `#s-positioning` under Updates is gone | cards-201 | +| F5 | The watchdog's words while the node serves no epoch state stream | "waiting for the node's execution state for this epoch", never "the worker did not load its program" | `app/igneum-app/src/watchdog.rs` on cards-201 | +