igneum-labs
ea3e7193a6
release-0.3.22 plan: main's yes with two conditions; the app side's shape (the packaged devnet-3 suffix, no override file, a fresh node datadir)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:44:07 +00:00
igneum-labs
ee60c8eba6
release-0.3.22 plan: main's ruling on the nine switches; the fleet's Devnet 3 set standing, the cutover and gate scripts, the capacity plan
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:42:34 +00:00
igneum-labs
c6f9e6e9f7
release-0.3.22 plan: section 1, the candidate fa7f854f and the Devnet 3 object; build-1's Devnet 3 processes staged
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:41:52 +00:00
igneum-labs
eda005504c
0.3.21: the Windows node-source pin at 96161037 (written by push-inputs with the payload)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:39:10 +00:00
igneum-labs
67ff8b97e1
release-0.3.22 plan: the frozen sub-version 3 object ( 017e7037, byte 7, id a785001687d8688a, the fingerprints, both gates green)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:31:39 +00:00
igneum-labs
1851b0d410
powertask: the registration test asserts the Power Helper's action is the app's own windowless exe (the Rust part of update-return dbbf0483; the relay/clients half lands through master on the relay line)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:31:07 +00:00
igneum-labs
7686f08a88
Merge remote-tracking branch 'origin/currency-21' into release-0.3.21
2026-10-07 16:29:12 +00:00
igneum-labs
b1165dbcbe
release-0.3.22 plan: Devnet 3 by 18:30 BST (main's order), the node line, the gates, the staged seed and hands, era VDF clean on 96161037
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:28:31 +00:00
igneum-labs
e8112f4e51
Site currency (currency-21): site/money.js is the app's currency rules for the site (tables generated from app.js, site/lib/money-regen.mjs rewrites them, site/lib/money.test.mjs fails on drift and runs in the pre-push gate); the card picker (yourcard.js, on /miner and /app) follows navigator.language, shows the card's electricity a day at the region's typical tariff through the one Intl formatter, with a currency switch saved in localStorage; watts per card from the Ember table and the bench log, Apple silicon says no power reading; the review shots from build-2 (Earnings in euro dark and light with de-DE placement, Settings with the picker, the first-run step on a fr-CA machine, the Overview in euro)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:27:27 +00:00
igneum-labs
d73cba9a68
Currency by locale (the project lead, 7 October 2026: "£/day is for UK; we need other currencies"): no IP lookup; the web view's language (the OS locale) picks the region, its currency and its default tariff at first run (GBP, EUR, USD, CAD, AUD and the long tail by ISO region through ISO_CURRENCY, names from Intl.DisplayNames, an EU member on the euro takes the EU average), a currency picker in Settings and on the first-run step whose override lives in the engine's settings file (config.rs currency, state.rs, Cmd::Region's third field, api/region currency; the Rust round-trip test) and wins over the locale; a region with no currency row falls back to USD with the prompt visible; every money line goes through one formatter (fmtMoney: Intl.NumberFormat with the code, narrowSymbol, the symbol placed as the locale places it); the user's own tariff is the number, so no exchange rate anywhere (the rent line says so for a currency without a USD rate); zero-decimal currencies typed in the unit (priceFactor), the price field's ceiling 100,000; three view tests known-failed first (de-DE reads EUR with the Eurostat tariff; the override wins and survives restart; a locale with no row asks); the mock's euro scenario
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:22:37 +00:00
igneum-labs
2534849578
release-0.3.21 plan: 96161037's hands and seed pairs, the Mac's binaries and DMG
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:20:15 +00:00
igneum-labs
dff16f3745
release-0.3.21 plan: the injector's nine steps PASS on 0.3.21's binaries; the register merged
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:14:50 +00:00
igneum-labs
91db40be36
Merge remote-tracking branch 'origin/miner-reliability-21' into release-0.3.21
2026-10-07 16:14:50 +00:00
igneum-labs
4bc5e050c1
miner-faults register: the 0.3.21 injector run (nine steps green on app 786c3d37 and node c4459193, kept-datadir included)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:14:03 +00:00
igneum-labs
3a4419e561
release-0.3.21 plan: 96161037's two node gates PASS, the prover pair stands, the builds running
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:12:53 +00:00
igneum-labs
8a2cbcc927
release-0.3.21 plan: section 6, the node line staged at 96161037 with its suite lines and the two box-input rules
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:56:12 +00:00
igneum-labs
0fcebf1f44
reliability injector: catch-up after a kept datadir reads the readiness line before the first worker start (the record exists from the first second there)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:48:32 +00:00
igneum-labs
64ccb16e5b
release-0.3.21 plan: the final node order with c631c64b first, the whole-crate suite rule
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:35:25 +00:00
igneum-labs
cf85c9f80f
release-0.3.21 plan: update-return-21b, first-block-21 (seen once), the reliability register in
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:21:50 +00:00
igneum-labs
8a77336545
Merge remote-tracking branch 'origin/miner-reliability-21' into release-0.3.21
2026-10-07 15:21:29 +00:00
igneum-labs
dc3d763822
Merge remote-tracking branch 'origin/first-block-21' into release-0.3.21
2026-10-07 15:21:29 +00:00
igneum-labs
815d49f503
miner-faults: MF-11 in the update-return lane's words (the helper owns the return, the relay service, the ping, the tuner's ceiling) and MF-13 (the Power Helper's stale-command count); the external card kind noted
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:09:50 +00:00
igneum-labs
7c065d100c
first-block-21, main's reading "seen once": the first-block card waits until a window has shown it. The flag first_block_shown is set when the page reports the card displayed or dismissed (POST api/card/seen with the milestone's count and at, ladder.rs card_seen; the window hiding to the tray with the card up counts as the dismiss), never when the card is raised; an unseen card survives restarts and auto-updates (start_run drops a card only once milestone_seen), so a first block found overnight greets the miner the first time they open the app and never again. Every other rule stands: the lifetime count 0 to 1 raises it, identities and card swaps leave it, a kept directory at 0 shows it on the first block, a count that starts over raises nothing, a 0.3.20 record (schema 0, no flag) whose first block already came takes the flag and loses its card. The view trusts a 0.3.21 engine (the ladder carries first_block_shown) and keeps the uptime refusal only against a 0.3.20 engine. Tests: ladder.rs eight (a_first_block_found_with_no_window_greets_the_miner_at_the_first_open_and_never_again added: no window, a restart, the first open shows it once, a second open does not; the round-trip helper gets one temp dir per call, the shared path let parallel tests wipe each other's file), the view test re-cut, the mock's firstblock card unseen (the capture's mock log shows the page's api/card/seen). Lines: build-2 app gate 255 + 32 + 8; UI 67; pre-push 56 green; captures re-taken to ~/Desktop/igneum-previews-2026-10-07/first-block.
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:09:20 +00:00
igneum-labs
da38a6aca5
MF-11 follow-ups on release-0.3.21 (the app half of update-return 2d3d211a and 0b423697): the external card kind from a USB4 or Thunderbolt router in the device's parent chain (PC 2's RTX 5060 Ti in a Razer Core X V2 reads eGPU, not discrete); the Power Helper's registered probe wants the task enabled and its action exe on disk; a helper that gives no heartbeat or no line inside its window is a FAULT power-helper line with the registration re-read; a same-length rewrite of the command file is a new command (effective_skip; PC 2, 7 October 2026: every tune refused since the 14:35Z boot)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:07:17 +00:00
igneum-labs
6ffb825cf0
release-0.3.21 plan: first-block-21 in
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:59:10 +00:00
igneum-labs
371d7dfcf0
first-block-21 (the project lead, 7 October 2026: "the 'you got your first block' situation only shows for the miner's first ever block"): the first-block card once in the app's life. Engine: ladder.rs carries a persisted first_block_shown flag set when the lifetime count settings.json holds crosses from 0 to 1 (survives restarts, updates and a kept data directory; never touched by a key changing identities or a card swap; a count that starts over on a shown record raises nothing); Ladder::start_run at engine start drops a milestone an earlier run persisted (a card is for the run that raised it) and takes the flag on a 0.3.20 record whose first block already came; the new-card card never fires at a count of 1; the state carries started_at (the run's wall-clock start). View: blockCard refuses a milestone raised before this run (staleCard, a minute of slack, uptime_s when the engine has no started_at), firstWait keeps the count-up off once the ladder records a first block, the first rung reads the flag. Tests: seven in ladder.rs (the known-failed second run first: a 0.3.20 record with the card persisted and the count at 1 showed it again; the first ever block; a restart at 1; an update at 1 over the older shape; a kept directory at 0 with the flag unset; a count that starts over; block 2 ordinary) and one view test in the same order. Mock: the secondblock scenario and started_at. Lines: build-2 app gate 254 + 32 + 8 (test --release); UI 67; pre-push 56 green; captures in ~/Desktop/igneum-previews-2026-10-07/first-block.
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:57:34 +00:00
igneum-labs
24ef8d6545
release-0.3.21 plan: update-return-21 in
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:32:15 +00:00
igneum-labs
49f9aa773c
Merge remote-tracking branch 'origin/update-return-21' into release-0.3.21
2026-10-07 14:32:13 +00:00
igneum-labs
3989a0cec9
release-0.3.21 plan: update-return's app half rides (main's word), the host.cpp compile as a named gate line, the relay half through master
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:30:38 +00:00
igneum-labs
d834055eac
MF-11 update-return (0.3.21), the app half on release-0.3.21: the Windows update helper owns the return (the exe set kept beside the app, the app launched by the helper, api/state polled 120 s, the kept set restored when nothing answers, one intake line either way; the installer stays silent under /IGNOTA=2), the window host restarts a dead engine and answers the Restart Manager, the first act after an update is the read-back line and a FAULT pc-restart line when the PC came up from a power loss; the tuner never asks above a card's measured efficient point (the 5090 at 308 W, floored at the vendor's 400 W) unless Power control is on and the user raised the cap, and a refused cap is asked again at 2 and 10 min then reported as FAULT power-cap; the job-channel ping on every wake request (7 October 2026, PC 2 lost power at 10:46Z; the relay half stays on update-return)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:29:41 +00:00
igneum-labs
687e6d02a2
release-0.3.21 plan: the app reports its vote key hashes to the intake (main's item)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:21:41 +00:00
igneum-labs
9e2926047b
release-0.3.21 plan: the prove-instead switch in, N15 on the node line, the final node order
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:16:23 +00:00
igneum-labs
571368caf6
Prove instead of mining (main's routing, 7 October 2026): on a machine whose every NVIDIA card is under 12 GB the Settings switch prove_instead lets the prover run with those cards' miners held off (Cmd::ProveHold through the cards path, the restore choices kept, given back when proving or the switch goes off); the Prove page's row shows only on such a machine with the sentence naming the choice; provedefault::prove_instead_cards and prove_instead_line with their test, proving.under_12gb on the state, api/prove/instead, the view test; the fleet's 3080 hour: a 10 GB card completes the compressed step alone at 8.6 GB and never beside its miner
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:16:23 +00:00
igneum-labs
53919ce85b
release-0.3.21 plan: pool-finish-21 in; the app side's state
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:06:21 +00:00
igneum-labs
682d9bc3a2
Merge remote-tracking branch 'origin/pool-finish-21' into release-0.3.21
2026-10-07 14:05:59 +00:00
igneum-labs
48085fc628
release-0.3.21 plan: scene-parity-21-sizing in (live-dag.js 2.0.4)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:04:32 +00:00
igneum-labs
a586b94985
Merge remote-tracking branch 'origin/scene-parity-21-sizing' into release-0.3.21
2026-10-07 14:04:32 +00:00
igneum-labs
7bf8717d6d
release-0.3.21 plan: f95178a1 last in the node order, the overlap lane closed, the UI row updated
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:04:11 +00:00
igneum-labs
7fa81e8b28
Pool daemon: --template-parallel (default 2) bounds the template fetches in flight against the node (the ten-member window on pool-1, 7 October 2026: ten parallel getBlockTemplate calls on one gRPC connection queued past the client's request timeout from 12:54Z, no job for 36 minutes); pool.md 10.5a records the window's two stacked faults
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:03:05 +00:00
igneum-labs
46dd0b4214
docs/plans/pool.md 10.5: the open-pool gate on igneum-build-1 (100 members, 10 daemons, 4 nodes, PASS: 90 of 90 honest members paid by the coinbase rule, first payout p50 3.6 s p90 7.0 s after the first share, 0 withheld shares seen, 0 honest blocks paying a withheld address, stale 9.6 percent), the two failed runs and their lessons, consequences by tier
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit cb2c3ee0c7 )
2026-10-07 14:03:05 +00:00
igneum-labs
271c89d31c
Open pool: the seeds check accepts another node's view of an epoch when its seed is a block the member's node holds at the seed depth (a DAG settling below the lead), the node's epochs kept by span; the gate harness starts the nodes in sequence with --addpeer and reads their peers and DAA scores by RPC before and during the run (the first box run was three DAG partitions)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 0a4437195c )
2026-10-07 14:03:05 +00:00
igneum-labs
6d21a512a1
Open pool: the retarget clamps against the window's mean (never compounded share by share), the ceiling in u128 (a 2^49 first target shifted by 20 wrapped to 0 on the box), a deeper reorg depth and a progressive sync when parents are missing; the fast-time file carries pool_split_activation_daa (never); the gate runs on build-1
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit af9849a618 )
2026-10-07 14:03:05 +00:00
igneum-labs
77f1076d3e
Open pool: the share chain's first target as a chain constant, the retarget on the window's mean target with a ceiling, withheld shares kept out of sync replies, the share line carries the cache rule for verify-share, the gate harness cleans up after itself and reads the first payout to 5 s
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 5f5be5676a )
2026-10-07 14:03:05 +00:00
igneum-labs
cadaed7fcd
Pool finished (mission item 11): pool-0's fee published beside the dev fee, TLS 1.3 on the member port with the authorize binding (spec 9.3, O-9.7 closed), the page rows Q68 to Q73, and the open pool: a share sidechain with no operator (spec 9.12)
...
Pool-0: welcome carries software_dev_fee_percent beside the pool fee, the page's Fees row and site/miner.html say pool-0 charges the same 1 percent as the solo dev fee; jobs and seeds carry the latency ladder's rung for 0.3.19.
TLS (pool/src/tls.rs): --tls-cert/--tls-key or --tls-self-signed (a P-256 pair under the data dir, the certificate pin printed at start); the binding is the member's BLS signature over this connection's exporter (label EXPORTER-igneum-pool-binding, context the chain id), refused on any other connection; testnet and mainnet refuse the clear without --allow-plain. HiveOS: pools:// and POOL_PIN.
Page rows: node state in words (Q68), one formatter set and luck in MiningPoolStats' convention (Q69), samples and check costs persisted (Q70), payments under the lookup (Q71), hourly history with a sparkline, --alert-webhook, /metrics, /health on the node (Q72), the network's finality state beside "payouts follow blue confirmation, not finality" (Q73).
The open pool (pool/src/sidechain.rs, open.rs, p2p.rs; igneum-pool --open): the member's own node and daemon, no payout key, no balance; every coinbase carries the member's own address, the share chain's parent (IGNS) and the window's split (IGNP); templates re-stamped on a new chain tip without a node call; shares gossiped and checked by every member (structure, the node's seeds, the PoW); heaviest work wins, a fork's loser is stale; the dev fee as one split entry; shares.log and verify-share for the drop proof; the gate harness pool/tools/open-gate.mjs. The node side (the executor's split from pool_split_activation_daa) is on the fork branch pool-finish-node.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 1cbafd7e74 )
2026-10-07 14:03:05 +00:00
igneum-labs
5a50a7f0fd
Pool vardiff: the idle easing no longer consumes the sized first correction; docs/plans/pool.md 9.3: the re-run's close and the member rows
...
pm-1, 7 October 2026: the member was idle for four intervals while its worker compiled, the first-phase idle easing
set first_done, and the measured 190 shares a second then walked down one step per 30 s for 5.5 minutes (the share
check at 10 to 11 ms on pool-1's cores). The sized correction now stays owed through idle easings (test
an_idle_easing_does_not_consume_the_sized_first_correction). Section 9.3: 207 found / 144 confirmed / 56 own orphans
under 2f6c0358, the residual as the node's 1 to 1.6 s template latency (a node-lane row), the member findings.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 4f875dd868 )
2026-10-07 14:03:05 +00:00
igneum-labs
8913282f4c
Pool daemon: the confirmation walk on its own gRPC connection, never restarted from the pruning point, bounded per tick
...
7 October 2026, 06:01Z and 06:12:55Z on pool-1: confirm_loop restarted its chain walk from the pruning point on any
failed getVirtualChainFromBlock and then fetched every chain block since (about 120,000) over the one connection the
templates used; one timed-out request under four parallel template fetches started it, every template request after it
timed out, no job was issued, 105 blocks on stale templates were orphans. Now: a second GrpcClient (pool.walker) for the
walk and the network numbers; a failed chain call keeps its cursor (the sink only when the node no longer knows it;
cursor_after_failure, node::walk_tests); at most 600 chain blocks per tick with a line saying so; a start with pending
blocks walks from the sink and says that older ones resolve by the orphan rule. docs/plans/pool.md section 9.2: the
re-run's record (the class question closed on pm-1 and pm-2, 71,240 shares, 0 mismatches), the cause, what stays open.
Suite 24 of 24 on igneum-build-1. Protocol and API unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit c686d8fc2e )
2026-10-07 14:03:05 +00:00
igneum-labs
19d0588aac
Pool daemon: --template-timeout-s (default 20, was a fixed 5 s): pool-1's node builds a template in 1.6 to 1.8 s under load, four parallel member fetches overran 5 s and no job was issued for 7 minutes (7 October 2026, 06:08Z)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit d1f146af12 )
2026-10-07 14:03:05 +00:00
igneum-labs
64be384d57
Pool daemon: refuses to start half-alive (listeners bound first, exit 2; a node that answers no template, exit 3; a STATUS line every 30 s)
...
The fleet agent's row from the 6 October night: the daemon ran 20 minutes as a process serving nothing while its node
answered no template and its member port had been held. Now main binds the member and API listeners before anything
else (server::bind_listener; a failure is "POOL NOT STARTED: cannot bind the members listener on <addr>: <os error>",
exit 2), probes the node for a template with pow_epoch, retried for --node-wait-secs (default 60) with a line per
attempt, else exit 3, and prints a STATUS line every 30 s (members, jobs issued, shares, blocks, template failures, the
node's state: ok, NODE NOT ANSWERING, NO TEMPLATE YET). fetch_job counts template failures and the last success.
Test server::bind_tests: a held port is refused with the address in the message, the freed port binds. Suite 23 of 23
on igneum-build-1. Protocol and API unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 9473e01320 )
2026-10-07 14:03:05 +00:00
igneum-labs
639302e3a1
Chain scene 2.0.4: the box's height follows the lanes (onSize, autoHeight, the lane geometry in stats) (7 October 2026, 16:3x UK)
...
the project lead's /live screenshot: a fixed tall box with the lanes in its top third and dead space under them. The renderer now knows
the height it wants: top padding + axis padding + lanes shown (at most maxLanes 7, narrowLanes 4 on a phone, never under 2)
times laneHeight (46 px, 40 on a phone, 26 compact; the mount option laneHeight overrides). It reports it through
onSize(heightPx, {lanes, laneHeight, narrow, compact}) whenever it changes and through getWantedHeight(); stats() carries
laneHeight, padT, padB, capacity, wantedHeight and autoHeight, so a page that sizes its own box reads no constants. With
autoHeight (on by default when the host set no CSS height on the canvas, which is read before the first size(); 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 instead of fitting the lanes to the box. Every current host sets a height (/live 420, the hero
500, the app's card 220 and its Inspect view 420), so the frames are unchanged: the parity test on build-2 stayed equal on
every comparison. The site lane switches /live and the home fold to the hook.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 1546b61fa1 )
2026-10-07 14:02:19 +00:00
igneum-labs
c3fb95e3be
release-0.3.21 plan: scene-parity-21 in (live-dag.js 2.0.3, the parity gate)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:54:49 +00:00