20 KiB
Igneum Miner 0.3.5: the merge, staged overnight (4 to 5 October 2026)
Prepared by the integration agent while the owner slept. Nothing was deployed, published or merged to master. The
app work sits on branch release-0.3.5 (pushed to origin), worktree /Users/joshm/Projects/igneum-wt-release; the
node work sits on the fork branch release-0.3.5 (local only; the fork has no remote), worktree
vendor/igneum-node-release. The morning cut is one command (section 4) after a fast-forward of master.
1. What is in
1a. The app repository (branch release-0.3.5)
| Merged, in this order | Branch head | Merge commit | What it carries | Conflicts and how they were resolved |
|---|---|---|---|---|
origin/miner-eff |
b80d4c9 |
fcadcc5 |
hash-per-watt sweep in the app engine (src/sweep.rs, config, detect, server, state, UI), relay/playbooks/sweep-5090.ps1, docs/plans/miner-eff.md |
none |
origin/app-ui |
80c99a8 |
112b496 |
the log drawer rebuilt, every screen on one type scale, idle canvas and polling when hidden; tools/ui-mock/ (a recorded-state mock server for UI work) |
ui/app.css: both sides kept; .power .pv takes app-ui's var(--t-sm), the sweep rules from miner-eff stay, .pin moved onto the scale (var(--t-xs)) |
origin/miner-perf |
e9f8847 |
98726f0 |
variant racing in proto-cuda/nvrtc/worker.cpp and proto-metal/main.swift, TUNING records in the engine, the manifest's tuning object (manifest.rs, ota.rs), tools/tuning.mjs, relay/playbooks/race-5090.ps1, docs/design/miner-tuning.md, docs/plans/miner-perf.md, bench-log entries |
state.rs: both field blocks kept (sweep fields, race fields). docs/bench-log.md: both appended entries kept. packaging/ota/publish-manifest.sh: ONE implementation. Master's --override (b84644c: the object carries every height switch; --verify-only, --tries, the retrying byte-identical live check) is the base; miner-perf's --tuning <file> / --no-tuning added, plus its carry-over of consensus.override and tuning from the manifest already in the folder when neither is given. The duplicate --override case the auto-merge produced was removed |
origin/build-job |
4e94f27 |
7eb83ff |
job kind build (jobs.rs, jobrun.rs, new jobbuild.rs): a PC builds the node and the app engine for Linux and Windows inside WSL2; publish-jobs.sh add --kind build, packaging/windows/push-build-inputs.sh, tools/build-job.mjs, tools/relay.mjs |
publish-jobs.sh: master's verify command and --tries kept next to the build kind's arguments; the usage range widened to the merged header |
origin/dev-fee (merged twice: 6b4ec59, then its later tip) |
293fc0b |
49f95de, 1b287d4 |
the miner software's dev fee on the app side: the dev_fee setting (default on, --dev-fee 0 passed when off), DevFeeState and the UI line, fee_total across runs, dev-fee block events; the HiveOS package (packaging/hive/), infra/cross/build-workers-linux.sh, tools/dev-fee/run.mjs, docs/design/miner-dev-fee.md, ledger and site text |
config.rs, state.rs, engine.rs: both sides kept (the sweep fields and installed_at from miner-eff next to dev_fee and fee_total; the engine's settings snapshot sets both and the DevFeeState line stays). The generated site pages were rebuilt afterwards (a91ff81). The second merge (161e48c, 293fc0b: the test-network measurement in the bench log, run.mjs waits for the nodes) conflicted only in bench-log.md and the generated pages: both entries kept, pages rebuilt |
origin/miner-reliability |
59d843f |
f7d2af7 |
the app watchdog per card and per node (src/watchdog.rs), WORKER FAULT and mismatched= read from the miner, the reliability test harness (tools/reliability/), the public GPU bench table (site/miners.html from site/miner-bench.json), bench-log and ledger entries |
engine.rs: the sweep state (miner-eff) and the node watchdog kept together; the STATUS line goes through watchdog::parse_status and still feeds the sweep's rate sample. main.rs: both modules. bench-log.md: both entries. site/build.mjs: master's partial-injected pages kept, the /miners table added through the same page() with active: 'miners'; the Miners link added to site/partials/nav.html; /miners added to the sitemap; every generated page rebuilt (node site/build.mjs) |
origin/master (5 commits after the branch point, merged as they landed) |
e22068f |
cc71ed6, ce74626, 5672a28 |
console: the parsed app-log tail is 400 KB, the last OTA state per machine is remembered (console_ota_memo); bugs.md rows |
none |
Master's fix 0d123b3 (OTA Windows helper: CREATE_NO_WINDOW only, no DETACHED_PROCESS) is the branch point and
survived every merge: grep -n 'creation_flags(0x0800_0000); // CREATE_NO_WINDOW' app/igneum-app/src/ota.rs gives
one line on the final tip (checked after each merge).
Totals against origin/master: @@TOTALS@@. Final tip: 1b287d4.
1b. The node fork (branch release-0.3.5 in vendor/igneum-node-release)
The shipping node is finality-fixes (6aa69a45: proving v0 plus finality v3, the fork 0.3.4 shipped from). The
miner changes of the night live on fork branches based on devnet-v4 (3bfe346f), which has neither proving nor
finality v3, so a release branch was made from finality-fixes and the miner branches merged into it. Neither
finality-fixes nor devnet-v4 was touched.
| Fork merge | Head | Merge commit | What it carries | Conflicts |
|---|---|---|---|---|
dev-fee (local, created from the worktree change) |
a2c7ba83 | 4d3c7482 | igneum-miner --dev-fee <percent> (default 1: one template in 100 is requested with the dev payout address, deterministic by counter; 0 off), dev-fee block lines, igneum-miner payouts (the audit) |
igneum/miner/src/main.rs: both kept, the pub(crate) visibility the proving modules need (finality-fixes) with the fee fields and parameters (fee_extra_data, Template.dev_fee, template(.., fee), submit(.., fee) -> bool); proving.rs: vmine calls both with fee = false |
miner-reliability |
945153ab | 6ef230d5 | igneum/miner/src/guard.rs (fault guards as state machines: interval baseline per worker process, prepare rate limit, CPU re-check stop, restart back-off and exit 43), a dead worker's stdin no longer spins the fill loop, the worker line read waits one status interval |
none |
igneumd is unchanged by both (the miner crate only); the finality v3 and proving text is in every igneumd built
below (checked with strings).
2. What is out, and why
| Branch | State at 23:05 UTC | Why |
|---|---|---|
miner-latency |
not on origin (local app branch at e7225b7 = its base, no commits); fork side vendor/igneum-node-latency branch miner-latency at 0f88b6d6 (one commit over devnet-v4: template subscription, node-side prewarm) |
nothing on origin to merge. If it lands before the cut: merge the app side the same way (section 3's checks), merge the fork branch into the fork's release-0.3.5, rebuild the miner for the three platforms (the scripts in section 4b take about 35 min for the three in parallel) |
Everything else the task named is in. The poller (git fetch every 10 minutes from 21:34 UTC) caught dev-fee at
21:48; miner-reliability (59d843f) was merged at 22:24 as soon as it was reported on origin.
3. Test results, with the command
Every build ran through the main checkout's lock, /Users/joshm/Projects/igneum/tools/lock/with-lock.sh build, at
nice -n 19 with -j 4. The app tests ran in /Users/joshm/Projects/igneum-wt-release/app/igneum-app (target
directory cloned by APFS from the main checkout's). The rustup cargo (1.99.0) is the one on ~/.cargo/bin;
Homebrew's 1.69 cannot read the lock file.
3a. The app engine, after every merge
| After merge | Tip | cargo test -p igneum-app |
cargo check --target x86_64-pc-windows-gnu -p igneum-app |
|---|---|---|---|
| miner-eff | fcadcc5 |
ok: 36 passed (lib) + 19 passed (bin), 0 failed, 21:27:31Z | ok, 21:28:18Z |
| app-ui | 112b496 |
ok: 36 + 19, 0 failed, 21:29:14Z | ok, 21:29:15Z |
| miner-perf | 98726f0 |
ok: 38 + 20, 0 failed, 21:31:46Z | ok, 21:31:50Z |
| build-job | 7eb83ff |
ok: 44 + 22, 0 failed, 21:33:07Z | ok, 21:33:12Z |
| origin/master | cc71ed6 |
ok: 44 + 22, 0 failed, 21:35:34Z | ok, 21:35:35Z |
| dev-fee | 49f95de |
ok: 44 + 22, 0 failed, 21:48:14Z | ok, 21:48:17Z |
| miner-reliability | f7d2af7 |
ok: 55 + 22, 0 failed, 22:25:32Z | ok, 22:25:36Z |
| dev-fee second tip (final tip; no app source changed) | 1b287d4 |
@@TEST8@@ | @@WIN8@@ |
3b. The node fork
Mac build and tests in vendor/igneum-node-release with CARGO_TARGET_DIR=vendor/igneum-node/target-release
(APFS clone of target-finality, 91 s to clone):
| Fork tip | Command | Result |
|---|---|---|
| 4d3c7482 (dev-fee merged) | cargo build --release -j 4 -p kaspad -p igneum-miner --features kaspad/igneum-pow |
ok, 31 min 27 s (22:22:55Z) |
| 4d3c7482 | cargo test -p kaspa-consensus --features igneum-pow -- finality |
ok: 4 passed, 0 failed (88 filtered), 22:49:44Z |
| 4d3c7482 | cargo test -p kaspa-consensus --features igneum-pow -- difficulty |
ok: 15 passed, 0 failed, 22:49:50Z |
| 4d3c7482 | cargo test -p kaspa-pow (the igneum-pow crate) |
ok: 7 passed, 0 failed, 22:55:41Z |
| 4d3c7482 | cargo test -p igneum-miner |
ok: 5 passed, 0 failed (the dev-fee extra-data tests among them), 23:01:04Z |
| 6ef230d5 (miner-reliability merged) | the same release build | @@MAC2_BUILD@@ |
| 6ef230d5 | cargo test -p igneum-miner |
@@MAC2_TESTS@@ |
The consensus, difficulty and pow crates are untouched by the reliability merge (miner crate only), so their 4d3c7482 results stand for 6ef230d5.
3c. The other checks, on the files each merge changed
| Check | Command | Result |
|---|---|---|
| JavaScript parses | node --check on tools/ui-mock/server.mjs, tools/tuning.mjs, tools/build-job.mjs, tools/relay.mjs, relay/api/console.mjs, tools/dev-fee/run.mjs, tools/reliability/*.mjs, site/build.mjs, app/igneum-app/ui/app.js |
all parse |
| Shell parses | bash -n on publish-manifest.sh, publish-jobs.sh, push-build-inputs.sh, infra/cross/build-workers-linux.sh, packaging/hive/*.sh |
ok |
PowerShell parse rule (no $var: inside double quotes; ${var} instead) |
a scanner over every tracked .ps1 and the PowerShell strings in ota.rs, jobrun.rs, jobbuild.rs (scratch script pscheck.py; tools/ci/windows/check-ps51.ps1 needs a PowerShell this Mac lacks) |
0 hits in sweep-5090.ps1, race-5090.ps1, jobrun.rs, jobbuild.rs; dev-fee and reliability changed no .ps1, ota.rs or jobrun.rs. The three hits in the tree are the unchanged baseline: two comments in check-ps51.ps1 that quote the rule, and ota.rs line 1190, the Mac helper's bash ($MODE: in bash is plain text) |
node site/build.mjs |
after dev-fee (site text) and after miner-reliability (the new /miners page) |
built: bench, journey (40 entries), index, litepaper, live, evidence, 404, miners (6 rows); miners.html carries the nav with aria-current on Miners |
publish-manifest.sh after the reconciliation |
four runs against a scratch --dest and --base-url with the real signing key: --override + --tuning given; nothing given (both carried over); --no-tuning; --override '[1]' (must fail) |
the four manifests came out as intended; the bad override exits 1; --verify-only --tries 1 still runs and fails on the unreachable base as it should |
publish-jobs.sh add --kind build |
against a scratch folder, with the signer rebuilt from the branch (cargo build --release --bin igneum-ota-sign; the old signer refused the kind) |
ok: one build job, signed, listed with its budget, targets and zip hash |
tools/ship-app.mjs --check and --self-test |
on the merged tree | 0.3.4 in all 6 version files; all self-test checks passed |
tools/ship-app.mjs 0.3.5 ... --dry-run |
from the release worktree with --branch release-0.3.5 (before the fork rebuild) |
preflight read everything and printed the plan |
| Swift worker typechecks | xcrun swiftc -typecheck proto-metal/main.swift |
0 errors |
| NVRTC worker | clang++ -std=c++17 -fsyntax-only proto-cuda/nvrtc/worker.cpp |
not checkable on this Mac (cuda.h is not installed); the PC compiles the worker itself at first start |
| Proto workers' Rust unit tests | none exist (proto-cuda/nvrtc is C++, proto-metal is Swift; proto-vdf untouched) |
n/a |
| Dev fee present in the built miners | strings -n 8 <miner> | grep -c dev-fee |
Mac, Linux and Windows miners: hits; the finality-fixes miner: 0. finality_v3_activation_daa present in every igneumd |
4. The morning cut
4a. The binaries (built overnight from fork 6ef230d5; the morning command points at them)
| Platform | Path | sha256 | Size | Build |
|---|---|---|---|---|
| Mac arm64 igneumd | vendor/igneum-node/target-release/release/igneumd |
@@MAC_IGNEUMD@@ | @@MAC_IGNEUMD_SIZE@@ | release build, 4 jobs at nice 19 |
| Mac arm64 igneum-miner | vendor/igneum-node/target-release/release/igneum-miner |
@@MAC_MINER@@ | @@MAC_MINER_SIZE@@ | same |
| Windows x86-64 igneumd.exe | vendor/igneum-node/target-release-win/x86_64-pc-windows-gnu/release/igneumd.exe |
@@WIN_IGNEUMD@@ | @@WIN_IGNEUMD_SIZE@@ | proto-cuda/windows-node/cross-build.sh (mingw, static libgcc; libstdc++-6.dll in the import set as in 0.3.4, the payload carries it), target directory cloned from target-finality-win |
| Windows x86-64 igneum-miner.exe | vendor/igneum-node/target-release-win/x86_64-pc-windows-gnu/release/igneum-miner.exe |
@@WIN_MINER@@ | @@WIN_MINER_SIZE@@ | same |
| Linux x86-64 (glibc 2.36) igneumd | infra/cross/out-release-0.3.5/igneumd (from vendor/igneum-node/target-release-linux) |
@@LINUX_IGNEUMD@@ | @@LINUX_IGNEUMD_SIZE@@ | infra/cross/build-linux.sh with cargo-zigbuild, target directory cloned from target-finality-linux; for the seed and the HiveOS package, not part of the app |
| Linux x86-64 igneum-miner | infra/cross/out-release-0.3.5/igneum-miner |
@@LINUX_MINER@@ | @@LINUX_MINER_SIZE@@ | same |
The first round (fork 4d3c7482, dev-fee only, before reliability landed): Windows igneumd.exe e34685d291646bbfb8317920ec19587cc74e69a0fd48c19009a2f55aabd9e31e / igneum-miner.exe 84fa01b9bd95f13c9574e2a26308338fe3c29fff7ec1e696c33ec8173d2ba76e (31 min 13 s); Linux igneumd 695e20fc8053cbecd35f392cf09b6b6155c4789cdb2342549185427ea5aca451 / igneum-miner 9a8169272c87e1aa7ec7809fb5b6e3f55eab2ccb5fe0340ebf1442bf835f6df7 (1,947 s); Mac igneumd 743a56cf26370d5dfb22e4f7016e9bee57771078caead8c16fa6448ebf13e141 / igneum-miner 37d101a03754967b3f8bf3920c660ce0584358d6dc5fb5b3f58eaa06647fe3f1. Superseded by the table above.
4b. The command
From the MAIN checkout, on master. release-0.3.5 contains origin/master as of e22068f, so the merge is a
fast-forward unless master moved again overnight (then merge origin/master into release-0.3.5 first, rerun the
two cargo commands of 3a, and fast-forward).
cd /Users/joshm/Projects/igneum
gh auth switch --user igneum-labs
git fetch origin && git checkout master && git pull --ff-only
git merge --ff-only origin/release-0.3.5
node tools/ship-app.mjs --check # 0.3.4 in all 6 files
node tools/ship-app.mjs 0.3.5 \
--node vendor/igneum-node-release \
--win-release vendor/igneum-node/target-release-win/x86_64-pc-windows-gnu/release \
--mac-release vendor/igneum-node/target-release/release \
--notes "Miner dev fee (1 in 100, off in Settings), fault guards and watchdog, efficiency sweep, kernel variant racing, log drawer, build jobs; Windows OTA helper launch fixed"
Why these values:
| Item | Value | Checked |
|---|---|---|
| node fork worktree | vendor/igneum-node-release, branch release-0.3.5, commit 6ef230d5 = finality-fixes 6aa69a45 + dev-fee + miner-reliability; clean working tree |
the ship script records the fork commit and branch in ~/.cache/igneum/ship/0.3.5.json and in the console item |
| Windows node exes | target-release-win/x86_64-pc-windows-gnu/release/{igneumd,igneum-miner}.exe (4a) |
the fork worktree has no target/ of its own (its builds live under vendor/igneum-node/target-release*), hence the two --*-release flags; the inputs step sees the new miner hash and pushes a fresh payload-inputs.zip (one deploy of the downloads folder, as 0.3.4 did at 20:07Z) |
| Mac node binaries | target-release/release/{igneumd,igneum-miner} (4a) |
igneumd --version = igneumd 2.1.0; igneum-miner --help lists --dev-fee |
| downloads folder | ~/.config/igneum/dlsite-dir = <scratchpad>/dlsite of session cd75457f, linked to Vercel project prj_vxz8Hj... (.vercel/project.json); holds every DMG and installer from 0.1.0 to 0.3.4 and the live manifest |
it is the real folder, 0.3.4 deployed from it; it lives in a session scratchpad, so move it somewhere permanent when there is a quiet moment |
| consensus override and tuning | the live 0.3.4 manifest has no consensus.override and no tuning; ship-app.mjs passes neither flag; publish-manifest.sh carries both over from the folder's manifest when present (nothing to carry today) |
to publish a height switch with 0.3.5, run packaging/ota/publish-manifest.sh --version 0.3.5 --override '{...every switch...}' --deploy after the cut, or pass --activation-height N --deadline-note "..." to the ship command (those two it forwards) |
| prover in the DMG | proving/igneum-prove/target/release/igneum-prove-host and -export are absent in the release worktree; present or not in the main checkout decides |
the DMG ships without the prover unless they are built first (the dry run notes it; 0.3.4 had the same note) |
| GPU workers for Windows | igneum-worker-cuda.exe / -opencl.exe are not in the tree |
the PC builds them itself (a note, not a problem) |
| dev fee default | the app passes nothing when the setting is on (the miner's default is 1%) and --dev-fee 0 when off; the devnet dev address is compiled into the miner (docs/design/miner-dev-fee.md) |
the start line dev fee 1% (1 block in 100) to 0x... shows in the app's log and Settings after the update |
Expected ship duration: the Windows CI run (about 10 to 15 min) and the DMG build under the lock (a few minutes with the engine target cloned; longer if the lock is busy) are the two waits.
5. The Windows machines (hand installs) and PC 2
Every Windows engine from 0.3.0 to 0.3.4 starts the update helper with DETACHED_PROCESS, so PowerShell exits
before ota-apply.ps1 runs and the update sits on "the installer is starting" (docs/bugs.md, 4 Oct 22:25 BST).
0.3.5 carries the fix, so the FIRST install of 0.3.5 on each Windows machine is by hand; every update after it goes
over the air.
| Machine | id | On | What to do |
|---|---|---|---|
| PC 1 | ae432dc7 | 0.3.3 | run Igneum-Miner-Setup-0.3.5.exe by hand (below) |
| US laptop (Intel UHD, OpenCL) | 37ba0461 | 0.3.3 | the same, by its user; send the link |
| PC 2 (the 0.3.4 canary) | 1ccfe586 | 0.3.4 | the same: 0.3.4's helper launch has the same flags, so its 0.3.5 update would also stall |
The hand install: download https://dl.igneum.network/dl/<token>/Igneum-Miner-Setup-0.3.5.exe (the link the
igneum.network download page carries once the cut is live) and run it. It is the per-user installer: no
administrator prompt, the running app is closed and restarted by the installer, the data folder
%LOCALAPPDATA%\igneum (chain, wallet, settings) is untouched. Check: Settings shows 0.3.5 and the console's
Machines card shows the machine back with its hash rate.
Without a keyboard at the machine: the remote run job path launched the helper fine on PC 2 (the dry run
run-ota-helper-dryrun-pc2 in bugs.md: it logged, checked the hash and refused the wrong one as designed), so a
publish-jobs.sh add --kind run --target ae432dc7,1ccfe586 --script <ps1> --stop-miners --deploy whose script
downloads the installer, checks its sha256 against the manifest and runs it with /VERYSILENT would do the
install from here. Untested with a right hash; the hand install is the known path.
6. State when this file was last written
- App branch
release-0.3.5at1b287d4plus this file, pushed. Fork branchrelease-0.3.5at 6ef230d5 invendor/igneum-node-release(local; the fork has no remote). - The release worktree carries a built
app/igneum-app/target(debug tests, the Windows check, the release signer); the fork builds live invendor/igneum-node/target-release,target-release-linux,target-release-win(clones; thetarget-finality*directories of 0.3.4 are untouched). After the cut:git worktree remove ../igneum-wt-release; keepvendor/igneum-node-releaseas the record of what 0.3.5's node was built from. miner-latencynever reached origin (section 2).