igneum/docs/plans/release-0.3.5.md
igneum-labs 261a6bbdfd release-0.3.5 plan: the second dev-fee merge
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 23:17:07 +00:00

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.5 at 1b287d4 plus this file, pushed. Fork branch release-0.3.5 at 6ef230d5 in vendor/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 in vendor/igneum-node/target-release, target-release-linux, target-release-win (clones; the target-finality* directories of 0.3.4 are untouched). After the cut: git worktree remove ../igneum-wt-release; keep vendor/igneum-node-release as the record of what 0.3.5's node was built from.
  • miner-latency never reached origin (section 2).