diff --git a/docs/plans/counter-asic-3-status.md b/docs/plans/counter-asic-3-status.md index 2ac31041..310a177d 100644 --- a/docs/plans/counter-asic-3-status.md +++ b/docs/plans/counter-asic-3-status.md @@ -397,7 +397,7 @@ Self-test PASS on each (FNV-1a 448274a57f508cbc); rates 120 to 142 MH/s with the | v4-era-4 | dd8fdf6ff4f59eed | 115.2 | yes | | v4-era-5 | 8bf40f5cb858d835 | 117.1 | yes | -Self-test PASS on every pack (cache FNV 448274a57f508cbc); both rows in the ledger entry 43c5bf5b. G1 FOR SUB-VERSION 2 IS COMPLETE on three platforms (Metal, Linux CUDA, Windows CUDA), nothing owed. Per tier: the 5090 rate on sub-version 2 is the same band as sub-version 1 (115 to 130 MH/s), so a miner's rate does not move with the class amendment. The lines left for byte 7 by 19:00Z: the attack-pass lane's two gates and 10^6 count on 8bdcbdd8, the node lane's re-pin and the pairing. PC 2 DOWN AGAIN (main, 16:5x UK): the project lead takes PC 2 down for cable work (PC 1 back but his desk); both PCs out of the sweep's waves, each updates on its poller on return; no PC job to PC 1; the Windows G1 completed before the outage, nothing reruns. 0.3.21's SECOND GATE LINE on 55768f88 (sha256 279b1b690e854fc9): the ten-minute mixed-version gate beside the 5899f603 pair, 13:37:40Z to 13:47:52Z, SUMMARY PASS (one digest b0afb2ee on five nodes; 223 new and 381 old blocks accepted by the old hub, 0 rejected; counts equal at 319, 486 and 604 through both clean joins and the restart step at 13:45:22Z; no panic); the node lane's two lines on 0.3.21's first candidate complete, in plan 6.9 on ca3-v4-node; the fleet's set on it (the bare-child 12 GB line, the wipe, the kept read, the cases) is the fleet's. 0.3.21's FIRST GATE LINE on 55768f88 (sha256 279b1b690e854fc9, the string read back; pairing igneum-pow 8c728ca3 at byte 5): the digest gate 13:35:41Z to 13:37:19Z SUMMARY PASS (a89be8a7 on both binaries with the peers; db9a85f9 refused, no peer; the live file's eada4bda unmoved); the ten-minute mixed-version gate from 13:37:40Z, line about 13:50Z. The 0.3.21 order as the shipper sent it: 55768f88; f067f7c1 and 70e4601e; b0444f51; 6eb21fc9; db28d331; then the re-pin from 8bdcbdd8 on the coordinator's word; suites between, the digest read after every one; the mirror's release-0.3.20-node back at the pin c4459193, release-0.3.21-node open at 55768f88. THE LATE-JOIN COMMIT (N9's second half, the node lane): 70e4601e on the box mirror as branch proof-hold-fix, from c4459193, two files (igneum/exec/src/proving.rs, protocol/flows/src/v10/proving.rs); the gap was the fetch side on the joiner (the served record ran the native check against the joiner's trailing exec state before anything was stored, the check refused it, the proof was never held, the body rule read "not held" for 20 s and failed the IBD); the fix holds the proof by hash before the checks (the pool entry still needs them) and the serve side says when it holds fewer than asked; the exec suite 32 passed at 13:26Z with the known-failed shape first, the flows check green 13:28Z, igneumd on build-1 at the 0321 worktree path built 13:32Z, sha256 17649eeb2f7d1290, string read back; with the testnet lane (the resume form, B alone); it joins the 0.3.21 staging as its own commit. THE WIPE CANARY ON c19-1, c4459193 (sha 45be9b02d1b002f5, string read back): FORM END rc 0 at 13:50:53Z. Wipe synced 13:35:50Z (57 minutes, inside the 98-minute class); mining 13:36:00Z to 13:47:07Z, 66 mined, 66 accepted, 0 rejected, isSynced true at the tip throughout; the hub holds 41 of its blocks in its last 700 with 0 rejects (13:47:09Z); the restart on its kept datadir at 13:47:15Z: the old process stopped at once (the new process's first lock line seven seconds after the marker; the watchdog held nothing, the b7cc37e7 fault closed), synced again at 13:48:39Z after 84 s, 109 templates read with max 3,432 ms and 0 timeouts; the kept read on pool-1's 0.3.17 copy on the same pod passed at 13:38Z (the rewrite line once, a clean second start). The pin's set on c4459193: the digest gate PASS, the mixed-version gate PASS, the wipe canary PASS, the kept read PASS, the restart PASS, the 12 GB line proves and verifies (paid is a race, not a gate); CASES END from c20-1 (about 14:50Z) is the last pin line. THE INTEROP FACT stands from the void run: the 5899f603 hub accepted 235 object-byte-5 blocks from the 8097d600 node with 0 rejected, one digest on all five nodes on the live sixteen-field file. The gates: the digest test and the kaspa-pow vector test (the amended devnet epoch-0 id 1a4230699a6b9c60 must equal, c120d7963abdcd96 must differ, the v3 control unchanged) on the box; the mixed-version Devnet 2 gate (the amended 0.3.20 node beside a 5899f603 node for ten minutes on the live file without the v4 fields) after the Mac build; the fresh-join canary the 0.3.20 cut's | +Self-test PASS on every pack (cache FNV 448274a57f508cbc); both rows in the ledger entry 43c5bf5b. G1 FOR SUB-VERSION 2 IS COMPLETE on three platforms (Metal, Linux CUDA, Windows CUDA), nothing owed. Per tier: the 5090 rate on sub-version 2 is the same band as sub-version 1 (115 to 130 MH/s), so a miner's rate does not move with the class amendment. The lines left for byte 7 by 19:00Z: the attack-pass lane's two gates and 10^6 count on 8bdcbdd8, the node lane's re-pin and the pairing. THE 64-SEED GATE ON SUB-VERSION 2 IS HEADING TO FAIL (the attack-pass lane, 13:55Z; its earlier "none over 1.2x at 13 of 64" was not read from the log and is withdrawn): 39 of 64 seeds read, 8 over 1.2x of the window model, worst p23 at 4.82x; 44 minutes for 39 seeds, the finish about 14:25Z; the eight seeds' hottest items and predicted sources being read (a residual constant through a writer the freshness rule still admits, or the window model's tail). The 10^6 exhaustion count at 8bdcbdd8: 630,000 drawn, finish about 14:05Z; the 07a809a7 control 880,000 drawn, finish about 13:59Z; the exhaustion and past-31 counts with the ends. The hot-set gate is F8's 64-seed census alone (F9's table serves the attempt histogram and the exhaustion count only). Sub-version 2 is NOT GREEN. THE EIGHT SEEDS (the attack-pass lane, 14:0xZ): three are the window model's own tail at 2^24 nonces with no predicted source (p4 1.22x, p8 1.38x, p10 1.50x); five are constants the freshness rule cannot see because it tracks lineage, not value: p23 4.82x (zero from xor of a register with itself at instruction 0, item 0x000000 at 41,727 reads), p34 1.25x (sub of a register with itself), p15 2.57x (zero through rotl at 0), p18 2.50x and p19 3.32x (a load whose address is constant delivers one word to the next load; p19 byte for byte the sub-version 1 program, untouched by the rule). (c') cannot catch them: its 164-of-16,384 per-site bound (1 percent) is about fifty times coarser than the gate (p23's item is 0.002 percent of all reads and still 4.8x at the top 0.1 percent). Chip side unchanged: one item at one site, nothing to a chip; it is the auditor's uniformity test that fails. THE EXHAUSTION HALF (AP-F8-2) at 8bdcbdd8: 0 exhausted and 0 panics in 650,000 chain-shaped seeds (the 10^6 finishes about 14:05Z), max attempt 35, nobody at the last resort, past attempt 31 about 3.2e-6 (5 in 1.55 million draws, inside the (2/3)^32 estimate), per-attempt rejection 0.67, mean 2 attempts; seed 331672 accepts at attempt 32; the 07a809a7 control's clean evidence one exhaustion in 331,672 (its later chunks contaminated by a rebuild on the same path, not used); FIXED-AND-PASSED at the 10^6 end if the count stays 0. THE GATE QUESTION (the hash lane to the attack-pass lane): three of the eight are the null's own tail at 2^24 nonces, so a 1.2x-on-every-seed threshold sits below the null's spread and no rule can pass it on 64 seeds; the threshold must be set from the null's measured 64-seed quantile or the nonce count raised; the attack-pass lane asked to state that quantile. SUB-VERSION 3 (the fix shape, the hash lane; new ids, packs, fingerprints, the G1s and the census again): (1) the draw forbids a self-operand on xor, sub and mad (dst == src) in the base program and the shadow block; (2) (c') becomes a per-site bound on the MOST REPEATED source value, any value, over the 16,384 evaluations, set from the gate's sensitivity (a uniform source repeats a value two or three times by chance; a bound of 8 is 0.05 percent of a site's reads, 0.003 percent of all reads, 1.02x at the top 0.1 percent), catching the load-after-load constant, the rotated zero and anything a static rule misses; (a') stays for the or, mul and mulhi classes; (3) the attempt cap and the last resort stay, the last resort's rewrite gaining the self-operand guard (a lossy op with src equal to dst becomes add with the immediate). Clock (UTC): build, re-export, Mac fingerprints and the census by about 14:50; the fleet and PC G1s by about 15:20; the attack-pass 64-seed re-gate about 1.5 hours after the string, green by about 16:45 if the threshold question is settled; inside 19:00Z with no slack for a second miss. PC 2 DOWN AGAIN (main, 16:5x UK): the project lead takes PC 2 down for cable work (PC 1 back but his desk); both PCs out of the sweep's waves, each updates on its poller on return; no PC job to PC 1; the Windows G1 completed before the outage, nothing reruns. 0.3.21's SECOND GATE LINE on 55768f88 (sha256 279b1b690e854fc9): the ten-minute mixed-version gate beside the 5899f603 pair, 13:37:40Z to 13:47:52Z, SUMMARY PASS (one digest b0afb2ee on five nodes; 223 new and 381 old blocks accepted by the old hub, 0 rejected; counts equal at 319, 486 and 604 through both clean joins and the restart step at 13:45:22Z; no panic); the node lane's two lines on 0.3.21's first candidate complete, in plan 6.9 on ca3-v4-node; the fleet's set on it (the bare-child 12 GB line, the wipe, the kept read, the cases) is the fleet's. 0.3.21's FIRST GATE LINE on 55768f88 (sha256 279b1b690e854fc9, the string read back; pairing igneum-pow 8c728ca3 at byte 5): the digest gate 13:35:41Z to 13:37:19Z SUMMARY PASS (a89be8a7 on both binaries with the peers; db9a85f9 refused, no peer; the live file's eada4bda unmoved); the ten-minute mixed-version gate from 13:37:40Z, line about 13:50Z. The 0.3.21 order as the shipper sent it: 55768f88; f067f7c1 and 70e4601e; b0444f51; 6eb21fc9; db28d331; then the re-pin from 8bdcbdd8 on the coordinator's word; suites between, the digest read after every one; the mirror's release-0.3.20-node back at the pin c4459193, release-0.3.21-node open at 55768f88. THE LATE-JOIN COMMIT (N9's second half, the node lane): 70e4601e on the box mirror as branch proof-hold-fix, from c4459193, two files (igneum/exec/src/proving.rs, protocol/flows/src/v10/proving.rs); the gap was the fetch side on the joiner (the served record ran the native check against the joiner's trailing exec state before anything was stored, the check refused it, the proof was never held, the body rule read "not held" for 20 s and failed the IBD); the fix holds the proof by hash before the checks (the pool entry still needs them) and the serve side says when it holds fewer than asked; the exec suite 32 passed at 13:26Z with the known-failed shape first, the flows check green 13:28Z, igneumd on build-1 at the 0321 worktree path built 13:32Z, sha256 17649eeb2f7d1290, string read back; with the testnet lane (the resume form, B alone); it joins the 0.3.21 staging as its own commit. THE WIPE CANARY ON c19-1, c4459193 (sha 45be9b02d1b002f5, string read back): FORM END rc 0 at 13:50:53Z. Wipe synced 13:35:50Z (57 minutes, inside the 98-minute class); mining 13:36:00Z to 13:47:07Z, 66 mined, 66 accepted, 0 rejected, isSynced true at the tip throughout; the hub holds 41 of its blocks in its last 700 with 0 rejects (13:47:09Z); the restart on its kept datadir at 13:47:15Z: the old process stopped at once (the new process's first lock line seven seconds after the marker; the watchdog held nothing, the b7cc37e7 fault closed), synced again at 13:48:39Z after 84 s, 109 templates read with max 3,432 ms and 0 timeouts; the kept read on pool-1's 0.3.17 copy on the same pod passed at 13:38Z (the rewrite line once, a clean second start). The pin's set on c4459193: the digest gate PASS, the mixed-version gate PASS, the wipe canary PASS, the kept read PASS, the restart PASS, the 12 GB line proves and verifies (paid is a race, not a gate); CASES END from c20-1 (about 14:50Z) is the last pin line. THE INTEROP FACT stands from the void run: the 5899f603 hub accepted 235 object-byte-5 blocks from the 8097d600 node with 0 rejected, one digest on all five nodes on the live sixteen-field file. The gates: the digest test and the kaspa-pow vector test (the amended devnet epoch-0 id 1a4230699a6b9c60 must equal, c120d7963abdcd96 must differ, the v3 control unchanged) on the box; the mixed-version Devnet 2 gate (the amended 0.3.20 node beside a 5899f603 node for ten minutes on the live file without the v4 fields) after the Mac build; the fresh-join canary the 0.3.20 cut's | | Main's rulings (7 October, morning) | no generator change to v4 on the live devnet; the record's null is the window model with numbers, sent by the hash lane to the attack-pass lane so AP-F8-1 re-gates against it; a fault beyond the model (a low-entropy source at site 15) stops at the coordinator with the two options priced (a 0.3.19 class amendment before the flip, or the flip held at the floor), nothing shipping without the project lead's word; the tighter tail, an acceptance bound on the hot-set share, is a CLASS V5 item (sent to the v5 lane a6410f3b8abefb762 with the 64-seed census as its gate; the bound's number follows from the model) | ### AP-F4-1, the weak-day MUL draw (the attack-pass lane, 7 October, morning): PASS against v4, a class v5 rule diff --git a/docs/plans/site-ui-5-shots/404__1440-dark.png b/docs/plans/site-ui-5-shots/404__1440-dark.png new file mode 100644 index 00000000..971b69d1 Binary files /dev/null and b/docs/plans/site-ui-5-shots/404__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/404__1440-light.png b/docs/plans/site-ui-5-shots/404__1440-light.png new file mode 100644 index 00000000..0cad44df Binary files /dev/null and b/docs/plans/site-ui-5-shots/404__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/404__390-dark.png b/docs/plans/site-ui-5-shots/404__390-dark.png new file mode 100644 index 00000000..98b0561c Binary files /dev/null and b/docs/plans/site-ui-5-shots/404__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/404__390-light.png b/docs/plans/site-ui-5-shots/404__390-light.png new file mode 100644 index 00000000..e69e7f1a Binary files /dev/null and b/docs/plans/site-ui-5-shots/404__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/app__1440-dark.png b/docs/plans/site-ui-5-shots/app__1440-dark.png new file mode 100644 index 00000000..6f6a9b4d Binary files /dev/null and b/docs/plans/site-ui-5-shots/app__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/app__1440-light.png b/docs/plans/site-ui-5-shots/app__1440-light.png new file mode 100644 index 00000000..7c9077a7 Binary files /dev/null and b/docs/plans/site-ui-5-shots/app__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/app__390-dark.png b/docs/plans/site-ui-5-shots/app__390-dark.png new file mode 100644 index 00000000..80c2052b Binary files /dev/null and b/docs/plans/site-ui-5-shots/app__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/app__390-light.png b/docs/plans/site-ui-5-shots/app__390-light.png new file mode 100644 index 00000000..f5d93367 Binary files /dev/null and b/docs/plans/site-ui-5-shots/app__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/bench__1440-dark.png b/docs/plans/site-ui-5-shots/bench__1440-dark.png new file mode 100644 index 00000000..8d59fa56 Binary files /dev/null and b/docs/plans/site-ui-5-shots/bench__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/bench__1440-light.png b/docs/plans/site-ui-5-shots/bench__1440-light.png new file mode 100644 index 00000000..46f5a0cd Binary files /dev/null and b/docs/plans/site-ui-5-shots/bench__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/bench__390-dark.png b/docs/plans/site-ui-5-shots/bench__390-dark.png new file mode 100644 index 00000000..e57969e4 Binary files /dev/null and b/docs/plans/site-ui-5-shots/bench__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/bench__390-light.png b/docs/plans/site-ui-5-shots/bench__390-light.png new file mode 100644 index 00000000..02835baf Binary files /dev/null and b/docs/plans/site-ui-5-shots/bench__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/claims__1440-dark.png b/docs/plans/site-ui-5-shots/claims__1440-dark.png new file mode 100644 index 00000000..a62362bf Binary files /dev/null and b/docs/plans/site-ui-5-shots/claims__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/claims__1440-light.png b/docs/plans/site-ui-5-shots/claims__1440-light.png new file mode 100644 index 00000000..16d76a31 Binary files /dev/null and b/docs/plans/site-ui-5-shots/claims__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/claims__390-dark.png b/docs/plans/site-ui-5-shots/claims__390-dark.png new file mode 100644 index 00000000..aca29af5 Binary files /dev/null and b/docs/plans/site-ui-5-shots/claims__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/claims__390-light.png b/docs/plans/site-ui-5-shots/claims__390-light.png new file mode 100644 index 00000000..23e20bf0 Binary files /dev/null and b/docs/plans/site-ui-5-shots/claims__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/dev-fee__1440-dark.png b/docs/plans/site-ui-5-shots/dev-fee__1440-dark.png new file mode 100644 index 00000000..5411bc7e Binary files /dev/null and b/docs/plans/site-ui-5-shots/dev-fee__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/dev-fee__1440-light.png b/docs/plans/site-ui-5-shots/dev-fee__1440-light.png new file mode 100644 index 00000000..11d21d3a Binary files /dev/null and b/docs/plans/site-ui-5-shots/dev-fee__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/dev-fee__390-dark.png b/docs/plans/site-ui-5-shots/dev-fee__390-dark.png new file mode 100644 index 00000000..8967d636 Binary files /dev/null and b/docs/plans/site-ui-5-shots/dev-fee__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/dev-fee__390-light.png b/docs/plans/site-ui-5-shots/dev-fee__390-light.png new file mode 100644 index 00000000..623a2c99 Binary files /dev/null and b/docs/plans/site-ui-5-shots/dev-fee__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/download__1440-dark.png b/docs/plans/site-ui-5-shots/download__1440-dark.png new file mode 100644 index 00000000..a652840b Binary files /dev/null and b/docs/plans/site-ui-5-shots/download__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/download__1440-light.png b/docs/plans/site-ui-5-shots/download__1440-light.png new file mode 100644 index 00000000..d67650d8 Binary files /dev/null and b/docs/plans/site-ui-5-shots/download__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/download__390-dark.png b/docs/plans/site-ui-5-shots/download__390-dark.png new file mode 100644 index 00000000..bac29b76 Binary files /dev/null and b/docs/plans/site-ui-5-shots/download__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/download__390-light.png b/docs/plans/site-ui-5-shots/download__390-light.png new file mode 100644 index 00000000..1eff4307 Binary files /dev/null and b/docs/plans/site-ui-5-shots/download__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/evidence__1440-dark.png b/docs/plans/site-ui-5-shots/evidence__1440-dark.png new file mode 100644 index 00000000..90527b73 Binary files /dev/null and b/docs/plans/site-ui-5-shots/evidence__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/evidence__1440-light.png b/docs/plans/site-ui-5-shots/evidence__1440-light.png new file mode 100644 index 00000000..7d8f26f6 Binary files /dev/null and b/docs/plans/site-ui-5-shots/evidence__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/evidence__390-dark.png b/docs/plans/site-ui-5-shots/evidence__390-dark.png new file mode 100644 index 00000000..648b592b Binary files /dev/null and b/docs/plans/site-ui-5-shots/evidence__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/evidence__390-light.png b/docs/plans/site-ui-5-shots/evidence__390-light.png new file mode 100644 index 00000000..b9f50513 Binary files /dev/null and b/docs/plans/site-ui-5-shots/evidence__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/explorer__1440-dark.png b/docs/plans/site-ui-5-shots/explorer__1440-dark.png new file mode 100644 index 00000000..3f202749 Binary files /dev/null and b/docs/plans/site-ui-5-shots/explorer__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/explorer__1440-light.png b/docs/plans/site-ui-5-shots/explorer__1440-light.png new file mode 100644 index 00000000..b45ba48e Binary files /dev/null and b/docs/plans/site-ui-5-shots/explorer__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/explorer__390-dark.png b/docs/plans/site-ui-5-shots/explorer__390-dark.png new file mode 100644 index 00000000..0d19ae84 Binary files /dev/null and b/docs/plans/site-ui-5-shots/explorer__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/explorer__390-light.png b/docs/plans/site-ui-5-shots/explorer__390-light.png new file mode 100644 index 00000000..44e94cf4 Binary files /dev/null and b/docs/plans/site-ui-5-shots/explorer__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/faucet__1440-dark.png b/docs/plans/site-ui-5-shots/faucet__1440-dark.png new file mode 100644 index 00000000..04df2a37 Binary files /dev/null and b/docs/plans/site-ui-5-shots/faucet__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/faucet__1440-light.png b/docs/plans/site-ui-5-shots/faucet__1440-light.png new file mode 100644 index 00000000..131cfb8c Binary files /dev/null and b/docs/plans/site-ui-5-shots/faucet__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/faucet__390-dark.png b/docs/plans/site-ui-5-shots/faucet__390-dark.png new file mode 100644 index 00000000..37546d49 Binary files /dev/null and b/docs/plans/site-ui-5-shots/faucet__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/faucet__390-light.png b/docs/plans/site-ui-5-shots/faucet__390-light.png new file mode 100644 index 00000000..7f4a2688 Binary files /dev/null and b/docs/plans/site-ui-5-shots/faucet__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/home__1440-dark.png b/docs/plans/site-ui-5-shots/home__1440-dark.png index 10cc7272..4e48d69c 100644 Binary files a/docs/plans/site-ui-5-shots/home__1440-dark.png and b/docs/plans/site-ui-5-shots/home__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/home__1440-light.png b/docs/plans/site-ui-5-shots/home__1440-light.png index fe912a6a..0bc50436 100644 Binary files a/docs/plans/site-ui-5-shots/home__1440-light.png and b/docs/plans/site-ui-5-shots/home__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/home__390-dark.png b/docs/plans/site-ui-5-shots/home__390-dark.png index 61a09b67..b05fa186 100644 Binary files a/docs/plans/site-ui-5-shots/home__390-dark.png and b/docs/plans/site-ui-5-shots/home__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/home__390-light.png b/docs/plans/site-ui-5-shots/home__390-light.png index 108a4ba6..01fb4e32 100644 Binary files a/docs/plans/site-ui-5-shots/home__390-light.png and b/docs/plans/site-ui-5-shots/home__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/journey__1440-dark.png b/docs/plans/site-ui-5-shots/journey__1440-dark.png new file mode 100644 index 00000000..d96b43fa Binary files /dev/null and b/docs/plans/site-ui-5-shots/journey__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/journey__1440-light.png b/docs/plans/site-ui-5-shots/journey__1440-light.png new file mode 100644 index 00000000..0a41c221 Binary files /dev/null and b/docs/plans/site-ui-5-shots/journey__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/journey__390-dark.png b/docs/plans/site-ui-5-shots/journey__390-dark.png new file mode 100644 index 00000000..9da013cf Binary files /dev/null and b/docs/plans/site-ui-5-shots/journey__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/journey__390-light.png b/docs/plans/site-ui-5-shots/journey__390-light.png new file mode 100644 index 00000000..4090b909 Binary files /dev/null and b/docs/plans/site-ui-5-shots/journey__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/ledger__1440-dark.png b/docs/plans/site-ui-5-shots/ledger__1440-dark.png new file mode 100644 index 00000000..86947cc9 Binary files /dev/null and b/docs/plans/site-ui-5-shots/ledger__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/ledger__1440-light.png b/docs/plans/site-ui-5-shots/ledger__1440-light.png new file mode 100644 index 00000000..39044082 Binary files /dev/null and b/docs/plans/site-ui-5-shots/ledger__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/ledger__390-dark.png b/docs/plans/site-ui-5-shots/ledger__390-dark.png new file mode 100644 index 00000000..d12a8a75 Binary files /dev/null and b/docs/plans/site-ui-5-shots/ledger__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/ledger__390-light.png b/docs/plans/site-ui-5-shots/ledger__390-light.png new file mode 100644 index 00000000..53c4cab6 Binary files /dev/null and b/docs/plans/site-ui-5-shots/ledger__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/litepaper__1440-dark.png b/docs/plans/site-ui-5-shots/litepaper__1440-dark.png new file mode 100644 index 00000000..6c93b25f Binary files /dev/null and b/docs/plans/site-ui-5-shots/litepaper__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/litepaper__1440-light.png b/docs/plans/site-ui-5-shots/litepaper__1440-light.png new file mode 100644 index 00000000..c33d1a6a Binary files /dev/null and b/docs/plans/site-ui-5-shots/litepaper__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/litepaper__390-dark.png b/docs/plans/site-ui-5-shots/litepaper__390-dark.png new file mode 100644 index 00000000..3ed56dcd Binary files /dev/null and b/docs/plans/site-ui-5-shots/litepaper__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/litepaper__390-light.png b/docs/plans/site-ui-5-shots/litepaper__390-light.png new file mode 100644 index 00000000..9ff24e93 Binary files /dev/null and b/docs/plans/site-ui-5-shots/litepaper__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/live__1440-dark.png b/docs/plans/site-ui-5-shots/live__1440-dark.png new file mode 100644 index 00000000..95589a68 Binary files /dev/null and b/docs/plans/site-ui-5-shots/live__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/live__1440-light.png b/docs/plans/site-ui-5-shots/live__1440-light.png new file mode 100644 index 00000000..a6824336 Binary files /dev/null and b/docs/plans/site-ui-5-shots/live__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/live__390-dark.png b/docs/plans/site-ui-5-shots/live__390-dark.png new file mode 100644 index 00000000..86e6c131 Binary files /dev/null and b/docs/plans/site-ui-5-shots/live__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/live__390-light.png b/docs/plans/site-ui-5-shots/live__390-light.png new file mode 100644 index 00000000..05d417a7 Binary files /dev/null and b/docs/plans/site-ui-5-shots/live__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/metamask__1440-dark.png b/docs/plans/site-ui-5-shots/metamask__1440-dark.png new file mode 100644 index 00000000..67fb3031 Binary files /dev/null and b/docs/plans/site-ui-5-shots/metamask__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/metamask__1440-light.png b/docs/plans/site-ui-5-shots/metamask__1440-light.png new file mode 100644 index 00000000..6e38772d Binary files /dev/null and b/docs/plans/site-ui-5-shots/metamask__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/metamask__390-dark.png b/docs/plans/site-ui-5-shots/metamask__390-dark.png new file mode 100644 index 00000000..60249a6d Binary files /dev/null and b/docs/plans/site-ui-5-shots/metamask__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/metamask__390-light.png b/docs/plans/site-ui-5-shots/metamask__390-light.png new file mode 100644 index 00000000..a9e81934 Binary files /dev/null and b/docs/plans/site-ui-5-shots/metamask__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/miner__1440-dark.png b/docs/plans/site-ui-5-shots/miner__1440-dark.png new file mode 100644 index 00000000..58eeeba1 Binary files /dev/null and b/docs/plans/site-ui-5-shots/miner__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/miner__1440-light.png b/docs/plans/site-ui-5-shots/miner__1440-light.png new file mode 100644 index 00000000..af4a39a8 Binary files /dev/null and b/docs/plans/site-ui-5-shots/miner__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/miner__390-dark.png b/docs/plans/site-ui-5-shots/miner__390-dark.png new file mode 100644 index 00000000..17067bc2 Binary files /dev/null and b/docs/plans/site-ui-5-shots/miner__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/miner__390-light.png b/docs/plans/site-ui-5-shots/miner__390-light.png new file mode 100644 index 00000000..cf97e1da Binary files /dev/null and b/docs/plans/site-ui-5-shots/miner__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/miners__1440-dark.png b/docs/plans/site-ui-5-shots/miners__1440-dark.png new file mode 100644 index 00000000..1d50e22d Binary files /dev/null and b/docs/plans/site-ui-5-shots/miners__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/miners__1440-light.png b/docs/plans/site-ui-5-shots/miners__1440-light.png new file mode 100644 index 00000000..84acf77d Binary files /dev/null and b/docs/plans/site-ui-5-shots/miners__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/miners__390-dark.png b/docs/plans/site-ui-5-shots/miners__390-dark.png new file mode 100644 index 00000000..d3b30ac6 Binary files /dev/null and b/docs/plans/site-ui-5-shots/miners__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/miners__390-light.png b/docs/plans/site-ui-5-shots/miners__390-light.png new file mode 100644 index 00000000..9755c695 Binary files /dev/null and b/docs/plans/site-ui-5-shots/miners__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/provenance__1440-dark.png b/docs/plans/site-ui-5-shots/provenance__1440-dark.png new file mode 100644 index 00000000..17b4a63f Binary files /dev/null and b/docs/plans/site-ui-5-shots/provenance__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/provenance__1440-light.png b/docs/plans/site-ui-5-shots/provenance__1440-light.png new file mode 100644 index 00000000..eb435bbf Binary files /dev/null and b/docs/plans/site-ui-5-shots/provenance__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/provenance__390-dark.png b/docs/plans/site-ui-5-shots/provenance__390-dark.png new file mode 100644 index 00000000..1bc9ec68 Binary files /dev/null and b/docs/plans/site-ui-5-shots/provenance__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/provenance__390-light.png b/docs/plans/site-ui-5-shots/provenance__390-light.png new file mode 100644 index 00000000..e3ccd522 Binary files /dev/null and b/docs/plans/site-ui-5-shots/provenance__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/randomx__1440-dark.png b/docs/plans/site-ui-5-shots/randomx__1440-dark.png new file mode 100644 index 00000000..30775bcb Binary files /dev/null and b/docs/plans/site-ui-5-shots/randomx__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/randomx__1440-light.png b/docs/plans/site-ui-5-shots/randomx__1440-light.png new file mode 100644 index 00000000..6657940e Binary files /dev/null and b/docs/plans/site-ui-5-shots/randomx__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/randomx__390-dark.png b/docs/plans/site-ui-5-shots/randomx__390-dark.png new file mode 100644 index 00000000..d72a607c Binary files /dev/null and b/docs/plans/site-ui-5-shots/randomx__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/randomx__390-light.png b/docs/plans/site-ui-5-shots/randomx__390-light.png new file mode 100644 index 00000000..1d2243a3 Binary files /dev/null and b/docs/plans/site-ui-5-shots/randomx__390-light.png differ diff --git a/docs/plans/site-ui-5-shots/wallet__1440-dark.png b/docs/plans/site-ui-5-shots/wallet__1440-dark.png new file mode 100644 index 00000000..23f0cc51 Binary files /dev/null and b/docs/plans/site-ui-5-shots/wallet__1440-dark.png differ diff --git a/docs/plans/site-ui-5-shots/wallet__1440-light.png b/docs/plans/site-ui-5-shots/wallet__1440-light.png new file mode 100644 index 00000000..13bad7c8 Binary files /dev/null and b/docs/plans/site-ui-5-shots/wallet__1440-light.png differ diff --git a/docs/plans/site-ui-5-shots/wallet__390-dark.png b/docs/plans/site-ui-5-shots/wallet__390-dark.png new file mode 100644 index 00000000..bce819d3 Binary files /dev/null and b/docs/plans/site-ui-5-shots/wallet__390-dark.png differ diff --git a/docs/plans/site-ui-5-shots/wallet__390-light.png b/docs/plans/site-ui-5-shots/wallet__390-light.png new file mode 100644 index 00000000..c1e9d020 Binary files /dev/null and b/docs/plans/site-ui-5-shots/wallet__390-light.png differ diff --git a/scene/README.md b/scene/README.md index e3bcca7c..01b97463 100644 --- a/scene/README.md +++ b/scene/README.md @@ -5,7 +5,7 @@ are ONE renderer fed ONE JSON shape. This folder is the source; everything else | File | What it is | Copies | |---|---|---| -| `live-dag.js` | EMBER 02 `IgneumDag` 2.0.3: lanes per vote key, parent curves, the selected chain, checkpoint bands, proof glow | `site/live-dag.js`, `app/igneum-app/ui/live-dag.js` | +| `live-dag.js` | EMBER 02 `IgneumDag` 2.0.4: lanes per vote key, parent curves, the selected chain, checkpoint bands, proof glow; the box height follows the lanes (`onSize`, `autoHeight`) | `site/live-dag.js`, `app/igneum-app/ui/live-dag.js` | | `proof-core.js` | `IgneumProof` 2.0.0: the selected block's shards | `site/proof-core.js`, `app/igneum-app/ui/proof-core.js` | | `tokens.css` | The fourteen palette tokens the two scripts read from `:root`, dark and light, the brand package's values | the `scene-tokens` block in `site/site.css` and `app/igneum-app/ui/app.css` | | `feed-contract.md`, `feed-contract.json` | The feed shape, in words and as key lists | read by `tools/scene/feed-contract.mjs` and the app's `src/live.rs` test | @@ -25,6 +25,14 @@ option names this machine's vote keys, so its own blocks glow and its lane reads picture, never a second renderer, never a rewritten feed. The phone rule (30 s window, four lanes, bigger nodes) keys on the viewport width under 720 px, not on the canvas width: a 640 px hero on a laptop is not a phone. +The box's height follows the lanes (2.0.4): wanted height = top padding + axis padding + lanes shown times `laneHeight` +(46 px, 40 on a phone, 26 compact; at most `maxLanes` 7, `narrowLanes` 4 on a phone, never under 2). The renderer calls +`onSize(heightPx, {lanes, laneHeight, narrow, compact})` whenever that changes and exposes `getWantedHeight()`; a page that +lays out its own box sets its height from the callback. With `autoHeight` (on by default when the host set no CSS height on +the canvas, forced either way by the option, never in compact mode) the renderer sets `canvas.style.height` itself and shows +every lane up to the cap. Every current host sets a height (/live 420 px, the hero 500 px, the app's card 220 px and its +Inspect view 420 px), so until a page opts in the frames are unchanged. + ## The tests (all in `tools/ci/pre-push.sh`) | Line | What it proves | diff --git a/scene/live-dag.js b/scene/live-dag.js index 0d28305d..7911c044 100644 --- a/scene/live-dag.js +++ b/scene/live-dag.js @@ -1,5 +1,10 @@ /* Igneum DAG / Ember 2.0 (the EMBER 02 renderer pack, 7 Oct 2026). THE SHARED SOURCE: scene/live-dag.js; site/live-dag.js and * app/igneum-app/ui/live-dag.js are byte-equal copies written by tools/scene/sync.mjs (the gate refuses a drifted copy). Edit here. + * 2.0.4 (7 Oct 2026): the box's height follows the lanes. laneHeight (default 46 px, 40 on a phone, 26 compact) times the lanes + * shown (at most maxLanes, narrowLanes on a phone, never under 2) plus the axis and padding is the scene's wanted height; + * onSize(heightPx, {lanes, laneHeight, narrow, compact}) reports it whenever it changes, so a page can size the box, and with + * autoHeight (true by default when the host set no CSS height on the canvas, forced either way by the option; never in + * compact mode, the app's card keeps its own height) the renderer sets canvas.style.height itself and lets every lane through. * 2.0.3 (scene parity, 7 Oct 2026): (1) every push, size and theme change paints the current picture at once; only the motion * loop waits for a visible document and an intersecting canvas (a page that loads with document.hidden true, or whose embedder * never fires visibilitychange, showed a blank canvas while reporting live). (2) The narrow (phone) rule keys on the viewport @@ -61,6 +66,10 @@ // narrowLanes lanes, nodes no smaller than narrowMinNode, hairlines off except the selected chain and the selected block, // checkpoint labels as the percent alone. The owner's call of 7 Oct 2026: faster drift, more gap, on a phone. var narrow=false,narrowBreak=finite(opts.narrowBreak)?opts.narrowBreak:720,narrowWindow=clamp(finite(opts.narrowWindow)?opts.narrowWindow:30,30,300),narrowLanes=clamp(finite(opts.narrowLanes)?opts.narrowLanes:4,2,12),narrowMinNode=finite(opts.narrowMinNode)?opts.narrowMinNode:11,baseWindow=0,windowTouched=false; + // autoHeight: the host set no height on the canvas (its computed height is still the attribute's, 150 by default) and this + // is not the compact card; read before size() touches the attribute + var hostHeightSet=(function(){try{var cs=getComputedStyle(canvas),attr=canvas.getAttribute('height'),h=parseFloat(cs.height);return canvas.style.height!==''||!(finite(h)&&Math.round(h)===(attr===null?150:Number(attr)));}catch(e){return true;}})(); + var autoHeight=opts.autoHeight===true||(opts.autoHeight!==false&&!compact&&!hostHeightSet),laneHeightOpt=finite(opts.laneHeight)?opts.laneHeight:0,wantH=0,laneHNow=46; var maxLanes=clamp(finite(opts.maxLanes)?opts.maxLanes:7,2,12), minNode=finite(opts.minNode)?opts.minNode:9.5, hairAlpha=finite(opts.hairlineAlpha)?opts.hairlineAlpha:.12, laneReach=finite(opts.laneReach)?opts.laneReach:2, othersScale=finite(opts.othersScale)?opts.othersScale:.75, provenGlow=opts.provenGlow!==false; var mq=root.matchMedia?root.matchMedia('(prefers-reduced-motion: reduce)'):null; var reduced=mq?mq.matches:false, manualMotion=true; @@ -112,7 +121,8 @@ padL=compact||W<510?14:W<750?84:106;padR=compact?12:24;padT=compact?29:58;padB=compact?22:38; var start=rightTime()-windowS*1000, end=rightTime()+lag+1000,counts=new Map(),mineKeys=new Set(); blocks.forEach(function(b){if(b.ts>=start && b.ts<=end){counts.set(b.miner,(counts.get(b.miner)||0)+1);if(own(b))mineKeys.add(b.miner);}}); - var capacity=Math.min(narrow?narrowLanes:maxLanes,Math.max(2,Math.floor((H-padT-padB)/(compact?26:narrow?40:46)))),ids=Array.from(counts.keys()); + var laneH=laneHeightOpt||(compact?26:narrow?40:46),cap=narrow?narrowLanes:maxLanes;laneHNow=laneH; + var capacity=autoHeight?cap:Math.min(cap,Math.max(2,Math.floor((H-padT-padB)/laneH))),ids=Array.from(counts.keys()); ids.sort(function(a,b){return (mineKeys.has(b)?1:0)-(mineKeys.has(a)?1:0)||(counts.get(b)-counts.get(a))||a.localeCompare(b);}); var chosen=ids.slice(0,ids.length>capacity?capacity-1:capacity); // Preserve existing key order instead of re-ranking every poll. Always keep the user's lane visible. @@ -121,6 +131,9 @@ keep.sort(function(a,b){return (mineKeys.has(b)?1:0)-(mineKeys.has(a)?1:0);}); lanes=keep;if(ids.length>chosen.length)lanes.push('__others__'); laneOf=new Map();lanes.forEach(function(id,i){laneOf.set(id,i);}); + // the wanted box height for these lanes (2.0.4): reported on change; applied here only under autoHeight + var nextH=padT+padB+Math.max(2,lanes.length)*laneH; + if(nextH!==wantH){wantH=nextH;emit('onSize',wantH,{lanes:lanes.length,laneHeight:laneH,narrow:narrow,compact:compact});if(autoHeight&&canvas.style.height!==wantH+'px')canvas.style.height=wantH+'px';} var now=performance.now(); blocks.forEach(function(b){var i=laneOf.has(b.miner)?laneOf.get(b.miner):Math.max(0,lanes.length-1); var y=padT+(i+.5)*(H-padT-padB)/Math.max(1,lanes.length); @@ -179,7 +192,9 @@ selectedChain:v.filter(function(b){return b.chain;}).length,proven:v.filter(function(b){return b.proven;}).length, own:v.filter(own).length,minerKeys:new Set(v.map(function(b){return b.miner;})).size, lockedCheckpoints:cps.filter(function(c){return c.state==='locked';}).length,paused:paused,following:following,queued:paused?queuedCount:0, - invalidRecords:invalid,omittedRecords:omitted,rendered:blocks.length,frames:frameCount,window:windowS,narrow:narrow,lanes:lanes.length,reducedMotion:reduced||!manualMotion,state:state}; + invalidRecords:invalid,omittedRecords:omitted,rendered:blocks.length,frames:frameCount,window:windowS,narrow:narrow,lanes:lanes.length,reducedMotion:reduced||!manualMotion,state:state, + // the lane geometry (2.0.4), so a page that sizes its own box reads no constants + laneHeight:laneHNow,padT:padT,padB:padB,capacity:narrow?narrowLanes:maxLanes,wantedHeight:wantH,autoHeight:autoHeight}; } function poll(){ if(destroyed||opts.poll===false||doc.hidden)return; @@ -356,11 +371,11 @@ function destroy(){if(destroyed)return;destroyed=true;stopFrame();clearTimeout(pollTimer);clearTimeout(timeout);clearInterval(healthTimer);if(controller)controller.abort();remove.forEach(function(fn){fn();});if(ro)ro.disconnect();if(io)io.disconnect();if(mo)mo.disconnect();if(tip)tip.hidden=true;canvas.classList.remove('engaged'); [['tabindex',initialAttributes.tabindex],['role',initialAttributes.role],['aria-label',initialAttributes.label]].forEach(function(pair){if(pair[1]===null)canvas.removeAttribute(pair[0]);else canvas.setAttribute(pair[0],pair[1]);});canvas.style.touchAction=initialAttributes.touch;canvas.style.cursor=initialAttributes.cursor;instances.delete(canvas);model.clear();view.clear();blocks=[]; } - var api={push:push,setPaused:setPaused,zoom:zoom,engage:engage,getWindow:function(){return windowS;},getState:function(){return {state:state,reason:reason};},redraw:redraw,words:words, + var api={push:push,setPaused:setPaused,zoom:zoom,engage:engage,getWindow:function(){return windowS;},getWantedHeight:function(){return wantH;},getState:function(){return {state:state,reason:reason};},redraw:redraw,words:words, destroy:destroy,follow:follow,setWindow:setWindow,setFilter:setFilter,setMotion:setMotion,select:select,getStats:stats, getViewRange:function(){return {start:rightTime()-windowS*1000,end:rightTime(),filter:filter};},getBlocks:function(){return blocks.map(cloneBlock);},getCheckpoints:function(){return cps.map(function(c){return Object.assign({},c);});}, getSnapshot:function(){return {ok:true,state:{stale:state!=='live'},blocks:blocks.map(cloneBlock),finality:{checkpoints:cps.map(function(c){return Object.assign({},c);})}};}}; instances.set(canvas,api);if(chip)chip.hidden=true;theme();size();emit('onState',state,reason);if(opts.poll!==false)poll();redraw();return api; } - root.IgneumDag={mount:mount,version:'2.0.3'}; + root.IgneumDag={mount:mount,version:'2.0.4'}; })(window); diff --git a/site/app.html b/site/app.html index 39cd0b7b..d9e828df 100644 --- a/site/app.html +++ b/site/app.html @@ -210,7 +210,7 @@

The app you mine with.

Your rate, what it costs a day, and the chain drawn live with your own blocks ringed. One window, four pages, every card one row.

Download the minerThe chain on your screen
-
WindowsmacOSLinux · HiveOSlight and dark
+
WindowsmacOSLinuxHiveOSlight and dark
Overview
diff --git a/site/live-dag.js b/site/live-dag.js index 0d28305d..7911c044 100644 --- a/site/live-dag.js +++ b/site/live-dag.js @@ -1,5 +1,10 @@ /* Igneum DAG / Ember 2.0 (the EMBER 02 renderer pack, 7 Oct 2026). THE SHARED SOURCE: scene/live-dag.js; site/live-dag.js and * app/igneum-app/ui/live-dag.js are byte-equal copies written by tools/scene/sync.mjs (the gate refuses a drifted copy). Edit here. + * 2.0.4 (7 Oct 2026): the box's height follows the lanes. laneHeight (default 46 px, 40 on a phone, 26 compact) times the lanes + * shown (at most maxLanes, narrowLanes on a phone, never under 2) plus the axis and padding is the scene's wanted height; + * onSize(heightPx, {lanes, laneHeight, narrow, compact}) reports it whenever it changes, so a page can size the box, and with + * autoHeight (true by default when the host set no CSS height on the canvas, forced either way by the option; never in + * compact mode, the app's card keeps its own height) the renderer sets canvas.style.height itself and lets every lane through. * 2.0.3 (scene parity, 7 Oct 2026): (1) every push, size and theme change paints the current picture at once; only the motion * loop waits for a visible document and an intersecting canvas (a page that loads with document.hidden true, or whose embedder * never fires visibilitychange, showed a blank canvas while reporting live). (2) The narrow (phone) rule keys on the viewport @@ -61,6 +66,10 @@ // narrowLanes lanes, nodes no smaller than narrowMinNode, hairlines off except the selected chain and the selected block, // checkpoint labels as the percent alone. The owner's call of 7 Oct 2026: faster drift, more gap, on a phone. var narrow=false,narrowBreak=finite(opts.narrowBreak)?opts.narrowBreak:720,narrowWindow=clamp(finite(opts.narrowWindow)?opts.narrowWindow:30,30,300),narrowLanes=clamp(finite(opts.narrowLanes)?opts.narrowLanes:4,2,12),narrowMinNode=finite(opts.narrowMinNode)?opts.narrowMinNode:11,baseWindow=0,windowTouched=false; + // autoHeight: the host set no height on the canvas (its computed height is still the attribute's, 150 by default) and this + // is not the compact card; read before size() touches the attribute + var hostHeightSet=(function(){try{var cs=getComputedStyle(canvas),attr=canvas.getAttribute('height'),h=parseFloat(cs.height);return canvas.style.height!==''||!(finite(h)&&Math.round(h)===(attr===null?150:Number(attr)));}catch(e){return true;}})(); + var autoHeight=opts.autoHeight===true||(opts.autoHeight!==false&&!compact&&!hostHeightSet),laneHeightOpt=finite(opts.laneHeight)?opts.laneHeight:0,wantH=0,laneHNow=46; var maxLanes=clamp(finite(opts.maxLanes)?opts.maxLanes:7,2,12), minNode=finite(opts.minNode)?opts.minNode:9.5, hairAlpha=finite(opts.hairlineAlpha)?opts.hairlineAlpha:.12, laneReach=finite(opts.laneReach)?opts.laneReach:2, othersScale=finite(opts.othersScale)?opts.othersScale:.75, provenGlow=opts.provenGlow!==false; var mq=root.matchMedia?root.matchMedia('(prefers-reduced-motion: reduce)'):null; var reduced=mq?mq.matches:false, manualMotion=true; @@ -112,7 +121,8 @@ padL=compact||W<510?14:W<750?84:106;padR=compact?12:24;padT=compact?29:58;padB=compact?22:38; var start=rightTime()-windowS*1000, end=rightTime()+lag+1000,counts=new Map(),mineKeys=new Set(); blocks.forEach(function(b){if(b.ts>=start && b.ts<=end){counts.set(b.miner,(counts.get(b.miner)||0)+1);if(own(b))mineKeys.add(b.miner);}}); - var capacity=Math.min(narrow?narrowLanes:maxLanes,Math.max(2,Math.floor((H-padT-padB)/(compact?26:narrow?40:46)))),ids=Array.from(counts.keys()); + var laneH=laneHeightOpt||(compact?26:narrow?40:46),cap=narrow?narrowLanes:maxLanes;laneHNow=laneH; + var capacity=autoHeight?cap:Math.min(cap,Math.max(2,Math.floor((H-padT-padB)/laneH))),ids=Array.from(counts.keys()); ids.sort(function(a,b){return (mineKeys.has(b)?1:0)-(mineKeys.has(a)?1:0)||(counts.get(b)-counts.get(a))||a.localeCompare(b);}); var chosen=ids.slice(0,ids.length>capacity?capacity-1:capacity); // Preserve existing key order instead of re-ranking every poll. Always keep the user's lane visible. @@ -121,6 +131,9 @@ keep.sort(function(a,b){return (mineKeys.has(b)?1:0)-(mineKeys.has(a)?1:0);}); lanes=keep;if(ids.length>chosen.length)lanes.push('__others__'); laneOf=new Map();lanes.forEach(function(id,i){laneOf.set(id,i);}); + // the wanted box height for these lanes (2.0.4): reported on change; applied here only under autoHeight + var nextH=padT+padB+Math.max(2,lanes.length)*laneH; + if(nextH!==wantH){wantH=nextH;emit('onSize',wantH,{lanes:lanes.length,laneHeight:laneH,narrow:narrow,compact:compact});if(autoHeight&&canvas.style.height!==wantH+'px')canvas.style.height=wantH+'px';} var now=performance.now(); blocks.forEach(function(b){var i=laneOf.has(b.miner)?laneOf.get(b.miner):Math.max(0,lanes.length-1); var y=padT+(i+.5)*(H-padT-padB)/Math.max(1,lanes.length); @@ -179,7 +192,9 @@ selectedChain:v.filter(function(b){return b.chain;}).length,proven:v.filter(function(b){return b.proven;}).length, own:v.filter(own).length,minerKeys:new Set(v.map(function(b){return b.miner;})).size, lockedCheckpoints:cps.filter(function(c){return c.state==='locked';}).length,paused:paused,following:following,queued:paused?queuedCount:0, - invalidRecords:invalid,omittedRecords:omitted,rendered:blocks.length,frames:frameCount,window:windowS,narrow:narrow,lanes:lanes.length,reducedMotion:reduced||!manualMotion,state:state}; + invalidRecords:invalid,omittedRecords:omitted,rendered:blocks.length,frames:frameCount,window:windowS,narrow:narrow,lanes:lanes.length,reducedMotion:reduced||!manualMotion,state:state, + // the lane geometry (2.0.4), so a page that sizes its own box reads no constants + laneHeight:laneHNow,padT:padT,padB:padB,capacity:narrow?narrowLanes:maxLanes,wantedHeight:wantH,autoHeight:autoHeight}; } function poll(){ if(destroyed||opts.poll===false||doc.hidden)return; @@ -356,11 +371,11 @@ function destroy(){if(destroyed)return;destroyed=true;stopFrame();clearTimeout(pollTimer);clearTimeout(timeout);clearInterval(healthTimer);if(controller)controller.abort();remove.forEach(function(fn){fn();});if(ro)ro.disconnect();if(io)io.disconnect();if(mo)mo.disconnect();if(tip)tip.hidden=true;canvas.classList.remove('engaged'); [['tabindex',initialAttributes.tabindex],['role',initialAttributes.role],['aria-label',initialAttributes.label]].forEach(function(pair){if(pair[1]===null)canvas.removeAttribute(pair[0]);else canvas.setAttribute(pair[0],pair[1]);});canvas.style.touchAction=initialAttributes.touch;canvas.style.cursor=initialAttributes.cursor;instances.delete(canvas);model.clear();view.clear();blocks=[]; } - var api={push:push,setPaused:setPaused,zoom:zoom,engage:engage,getWindow:function(){return windowS;},getState:function(){return {state:state,reason:reason};},redraw:redraw,words:words, + var api={push:push,setPaused:setPaused,zoom:zoom,engage:engage,getWindow:function(){return windowS;},getWantedHeight:function(){return wantH;},getState:function(){return {state:state,reason:reason};},redraw:redraw,words:words, destroy:destroy,follow:follow,setWindow:setWindow,setFilter:setFilter,setMotion:setMotion,select:select,getStats:stats, getViewRange:function(){return {start:rightTime()-windowS*1000,end:rightTime(),filter:filter};},getBlocks:function(){return blocks.map(cloneBlock);},getCheckpoints:function(){return cps.map(function(c){return Object.assign({},c);});}, getSnapshot:function(){return {ok:true,state:{stale:state!=='live'},blocks:blocks.map(cloneBlock),finality:{checkpoints:cps.map(function(c){return Object.assign({},c);})}};}}; instances.set(canvas,api);if(chip)chip.hidden=true;theme();size();emit('onState',state,reason);if(opts.poll!==false)poll();redraw();return api; } - root.IgneumDag={mount:mount,version:'2.0.3'}; + root.IgneumDag={mount:mount,version:'2.0.4'}; })(window); diff --git a/site/live.html b/site/live.html index 23f37b3a..be846a34 100644 --- a/site/live.html +++ b/site/live.html @@ -86,13 +86,20 @@ .tb[aria-pressed="true"]{color:var(--bone);border-color:var(--line-2);background:var(--graphite)} .tb.on{color:var(--ember-text);border-color:var(--ember-40)} .sep{width:1px;height:18px;background:var(--line)} -.graph{display:grid;grid-template-columns:minmax(0,1fr) 295px} +.graph{display:grid;grid-template-columns:minmax(0,1fr) 295px;align-items:start} @media (max-width:1000px){.graph{grid-template-columns:1fr}} .gcol{padding:0;min-width:0;border-right:0;position:relative} @media (max-width:1000px){.gcol{border-right:0;border-bottom:var(--hair)}} .gcol .state{position:absolute;left:25px;top:14px;z-index:3;font-size:10px} .scene{position:relative} -#dag{display:block;width:100%;height:420px;background:var(--row);touch-action:pan-y} +#dag{display:block;width:100%;height:418px;background:var(--row);touch-action:pan-y} +.gtop{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;padding:10px 25px;border-bottom:var(--hair);font:10px/1.7 var(--mono);color:var(--ash)} +.gtop .hint{white-space:nowrap} +.gtop .lg{display:flex;flex-wrap:wrap;gap:6px 10px;flex:1 1 auto;justify-content:center} +.gtop .lg span{display:inline-flex;align-items:center;gap:6px;color:var(--ink-2);font-family:var(--f-sans);font-size:11px;white-space:nowrap} +.gtop .zoom{margin-left:4px} +.gunder{padding:8px 25px 10px;border-top:var(--hair);font:10px/1.7 var(--mono);color:var(--ash)} +@media (max-width:700px){.gtop{padding:10px 16px;gap:8px 12px}.gtop .lg{flex-basis:100%;justify-content:flex-start}.gtop .zoom{margin-left:auto}.gunder{padding:8px 16px 10px}} .tip{position:absolute;left:0;top:0;pointer-events:none;background:var(--graphite);border:1px solid var(--line-2);border-radius:6px;padding:10px 12px;font:400 12px/1.5 var(--f-mono);color:var(--ink-2);white-space:nowrap;z-index:5} .tip[hidden]{display:none} .gfoot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:17px 25px;border-top:var(--hair);font:10px/1.7 var(--mono);color:var(--ash)} @@ -100,14 +107,14 @@ .zoom button{background:transparent;border:0;color:var(--ink-2);font:400 13px/1 var(--f-mono);padding:8px 12px;cursor:pointer} .zoom button:hover{background:var(--hover)} .zoom span{font:400 11px/1 var(--f-mono);color:var(--ash);padding:0 6px;min-width:44px;text-align:center} -.icol{padding:22px;min-width:0;font-size:12px;border-left:var(--hair)} -.icol .ih{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:14px} +.icol{padding:16px 18px;min-width:0;font-size:12px;border-left:var(--hair)} +.icol .ih{display:flex;align-items:center;gap:8px;margin-bottom:10px}.icol .ih .chip{margin-left:auto} .icol .ih .eyebrow{margin:0} .icol .num{font:500 22px/1.2 var(--f-sans);color:var(--bone);margin:6px 0 4px;overflow-wrap:anywhere} .icol .hash{font:400 11px/1.5 var(--f-mono);color:var(--ash);overflow-wrap:anywhere;margin-bottom:14px} .insp{display:grid;grid-template-columns:auto minmax(0,1fr);gap:0 10px;margin:0;border-top:var(--hair);padding-top:8px} -.insp dt{font:11px var(--mono);color:var(--ash);padding:10px 0;border-bottom:var(--hair)} -.insp dd{margin:0;font:11px var(--mono);color:var(--bone);font-weight:500;text-align:right;padding:10px 0;border-bottom:var(--hair);overflow-wrap:anywhere;min-width:0} +.insp dt{font:11px var(--mono);color:var(--ash);padding:7px 0;border-bottom:var(--hair)} +.insp dd{margin:0;font:11px var(--mono);color:var(--bone);font-weight:500;text-align:right;padding:7px 0;border-bottom:var(--hair);overflow-wrap:anywhere;min-width:0} .insp dd.hot{color:var(--molten-text)} .icol .note{font-size:12px;margin-top:14px;padding-top:12px;border-top:var(--hair)} .insp-empty{color:var(--ash);font-size:13px;line-height:1.5;padding:6px 0 2px} @@ -125,7 +132,7 @@ .tab{background:transparent;border:0;color:var(--ash);font:400 12px/1.2 var(--f-sans);padding:6px 10px;border-radius:4px;cursor:pointer} .tab.on{background:var(--row);color:var(--bone)} .ititle{font:500 22px/1.2 var(--f-sans);color:var(--bone);margin:6px 0 4px;letter-spacing:-.01em} -.proof-scene{height:200px;border:var(--hair);border-radius:6px;background:var(--row);margin:12px 0;overflow:hidden} +.proof-scene{height:170px;border:var(--hair);border-radius:6px;background:var(--row);margin:12px 0;overflow:hidden} .proof-scene canvas{display:block;width:100%;height:100%} .proof-head{display:flex;justify-content:space-between;align-items:baseline;font:500 13px/1.3 var(--f-sans);color:var(--bone);margin-bottom:8px} .track{display:flex;gap:3px;height:3px;margin-bottom:10px} @@ -383,15 +390,23 @@ details.tablebar summary{display:flex;align-items:center}
-
connecting to the observer
-
-
- Click to inspect  ·  Drag to explore +
+ Click to inspect  ·  Drag to explore +
+ Included + Excluded + Selected chain + Your block + Proven + Locked checkpoint +
60 s
+
connecting to the observer
+
blue score pending
-
-
- Included - Excluded - Selected chain - Your block - Proven - Locked checkpoint -
- blue score pending -
@@ -623,6 +626,10 @@ details.tablebar summary{display:flex;align-items:center} function uninspect(){sel=null;$('insp-close').hidden=true;$('i-kind').textContent='select a block';$('i-title').textContent='Select a block';$('i-hash').textContent='Click the graph, or a row of the table below.';$('i-shard-count').textContent='not set';$('i-track').innerHTML='';$('i-shards').innerHTML='
  • No block selected.
  • ';['i-incl','i-miner','i-blue','i-daa','i-parents','i-time','i-cp','i-lock'].forEach(function(id){$(id).textContent='not set';});if(proof)proof.setBlock(null);} $('insp-close').addEventListener('click',function(){if(dag)dag.select(null,'clear');uninspect();}); // the four stats above the graph, from the module's own window + // the scene box fits its lanes: the renderer places lanes at 46 px (40 on phones) under a 58 px top band and over a 38 px axis + // (scene/live-dag.js 2.0.3 layout()); one lane per key in view plus the others lane, capped at the renderer's 7 (4 on phones) + var fitH=0; + function fit(st){var c=$('dag');if(!c||!st)return;var cap=st.narrow?4:7,laneH=st.narrow?40:46,keys=Math.max(2,st.minerKeys||0),lanes=Math.min(cap,keys>cap?cap:keys+(keys>cap?1:0));var h=58+lanes*laneH+38;if(h!==fitH){fitH=h;c.style.height=h+'px';}} function miner(st){if(!dag)return;var cps=dag.getCheckpoints(),cp=cps.length?cps[cps.length-1]:null; $('m-blocks').textContent=fmtN(st.blocks);$('m-win').textContent='last '+st.window+' s';$('m-keys').textContent=st.minerKeys+' miner keys · not a card count';$('lane-caption').textContent=st.minerKeys+' keys'; $('m-mine').textContent=mine?fmtN(st.own):'0';$('m-mine').classList.toggle('dim',!mine);$('m-key').textContent=mine||'not set'; @@ -635,7 +642,7 @@ details.tablebar summary{display:flex;align-items:center} onState:function(st,reason){var el=$('dag-state');el.className='state '+(st==='live'?'live':st==='failed'?'bad':'');el.innerHTML=''+(st==='live'?'live devnet':esc(reason||st));if(proof)proof.setPaused(st!=='live'||dag.getStats().paused);}, onPause:function(p){$('dag-follow').classList.toggle('on',!p);if(proof)proof.setPaused(p||dag.getState().state!=='live');}, onFollow:function(f){$('dag-follow').classList.toggle('on',f);}, - onStats:miner, + onStats:function(st){miner(st);fit(st);}, onSelect:function(b,why){if(b){var full=lastD&&(lastD.blocks||[]).filter(function(x){return x.hash===b.hash;})[0];inspect(Object.assign({},b,full?{number:full.number}:{}));}else uninspect();}}); if(window.IgneumProof&&!proof)proof=IgneumProof.mount($('proof')); if(lastD)feed(lastD);} diff --git a/site/miner.html b/site/miner.html index a70321b3..6e07efec 100644 --- a/site/miner.html +++ b/site/miner.html @@ -251,19 +251,19 @@ pre b{color:var(--molten-text);font-weight:500}
    -

    Ember for Windows

    the installer, from the signed manifest

    +

    Ember for Windows

    the installer, from the signed manifest

    Run the installer, press Start. NVIDIA and AMD cards both mine. Setting an NVIDIA power cap asks for administrator rights once.

    Download for Windows v0.3.14 · 45.4 MB
    from dl.igneum.networksha256 08e75effc732f88bca11006b3b7cdf2bc533576f56819f79509fee47a8f5dd59