igneum/docs/plans/release-0.3.5.md
igneum-labs af7314d53e release-0.3.5 plan: master f9ed078 merged (bugs.md only)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 21:38:40 +00:00

14 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 work sits on branch release-0.3.5 (pushed to origin), worktree /Users/joshm/Projects/igneum-wt-release. The morning cut is one command (section 4) after a fast-forward of master.

1. What is in

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/master (4 commits after the branch point, merged twice as they landed) c257444 cc71ed6, ce74626 console: the parsed app-log tail is 400 KB, the last OTA state per machine is remembered (console_ota_memo); two 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 (1175) on the final tip.

Totals against origin/master: 35 files, 5,212 insertions, 274 deletions. Final code tip: cc71ed6 (ce74626 adds only master's bugs.md edit).

2. What is out, and why

Branch State at 21:35 UTC Why it is out
dev-fee not on origin (the local branch dev-fee at 33c430d has no commit beyond its base) nothing to merge yet. The fork side exists as an UNCOMMITTED change in vendor/igneum-node-devfee (branch dev-fee at 3bfe346f = the devnet-v4 head): igneum/miner/src/main.rs, 274 insertions, the --dev-fee <percent> flag (one template in 100 to the dev payout address, default 1, 0 off). That fork branch does NOT contain proving v0 (8c0cff15) or finality v3 (6aa69a45), so a dev-fee miner for 0.3.5 would need the commit, a rebase onto finality-fixes, and a rebuild for Mac and Windows before the cut (section 4, "if dev-fee lands")
miner-latency not on origin (local branch at e7225b7 = its base, no commits) nothing to merge yet. Fork side: vendor/igneum-node-latency branch miner-latency at 0f88b6d6 (one commit over devnet-v4: template subscription, node-side prewarm), no proving or finality v3
miner-reliability not on origin (local branch at f39e240, one commit: watchdog per card and node, src/watchdog.rs, the public GPU bench table, tools/reliability/, site pages) nothing on origin to merge. Fork side: vendor/igneum-node-reliability at 945153ab (three commits over devnet-v4: fault guards as state machines, dead-worker stdin, silent-worker status), no proving or finality v3. When it lands it touches site/ (then node site/build.mjs is part of its check)

The poller (git fetch every 10 minutes, 21:34 to 00:14 UTC) found none of the three on origin; see section 6 for the state when this file was last updated. A branch that appears later is merged the same way (section 5) and this file is updated.

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, 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.

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 (final tip) cc71ed6 ok: 44 + 22, 0 failed, 21:35:34Z ok, 21:35:35Z

Other checks, all 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, and app/igneum-app/ui/app.js all parse
Shell parses bash -n packaging/ota/publish-manifest.sh packaging/ota/publish-jobs.sh packaging/windows/push-build-inputs.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. The three hits in the tree are the unchanged baseline: two comments in check-ps51.ps1 that quote the rule, and ota.rs:1190, which is the Mac helper's bash ($MODE: in bash is plain text)
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 from the folder's manifest); --no-tuning (override kept, tuning dropped); --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 one preflight problem only ("behind origin/master", fixed by the final merge); inputs already live for fork 6aa69a45; the plan prints every step
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 and the file includes it before any stub could); the PC compiles the worker itself at first start, as the ship script notes
Proto workers' Rust unit tests none exist (proto-cuda/nvrtc is C++, proto-metal is Swift; proto-vdf is untouched by these branches) n/a
node site/build.mjs no merged branch changed site/ not needed

4. The morning cut

From the MAIN checkout, on master. release-0.3.5 contains origin/master as of c257444, 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 above, 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-finality \
  --win-release vendor/igneum-node/target-finality-win/x86_64-pc-windows-gnu/release \
  --mac-release vendor/igneum-node/target-finality/release \
  --notes "Efficiency sweep, kernel variant racing, log drawer, build jobs; Windows OTA helper launch fixed"

Why these paths:

Item Value Checked
node fork worktree vendor/igneum-node-finality, branch finality-fixes, commit 6aa69a45: proving v0 (8c0cff15) plus finality v3, 41 commits over the fork's master; clean working tree this is the fork 0.3.4 shipped from (~/.cache/igneum/ship/0.3.4.json: forkCommit 6aa69a45)
Windows node exes vendor/igneum-node/target-finality-win/x86_64-pc-windows-gnu/release/{igneumd,igneum-miner}.exe sha256 cc1d1001... and f1f9a7d9..., byte-identical to what the live payload-inputs.json carries for fork 6aa69a45 (built 20:07Z), so the inputs step reports "already" and no push happens
Mac node binaries vendor/igneum-node/target-finality/release/{igneumd,igneum-miner} igneumd fe982a1d..., the hash docs/plans/finality-v3-rollout-devnet.md section 2 names; the finality worktree itself has no target/ (its builds live under vendor/igneum-node/target-finality*), which is why the two --*-release flags are needed
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 the live 0.3.4 manifest has no consensus.override and no tuning; ship-app.mjs passes neither flag; publish-manifest.sh now 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 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)

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.

If dev-fee lands before the cut and the fee is wanted in 0.3.5's miner: commit the fork change in vendor/igneum-node-devfee, rebase that branch onto finality-fixes (6aa69a45), build igneum-miner for Mac (cargo build --release in a target directory cloned from target-finality) and Windows (proto-cuda/windows-node/cross-build.sh into a clone of target-finality-win), then point --node at that worktree and the two --*-release flags at those directories. igneumd is unchanged by dev-fee. The inputs step then pushes a new payload (the Windows miner hash changes). Without this, 0.3.5 ships the finality-fixes miner, which has no --dev-fee flag; an app engine that passes the flag would need the miner to accept it, so merge the app side only together with the fork side.

5. The two Windows machines (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 written

  • 21:35 UTC: release-0.3.5 at cc71ed6, pushed. 21:40 UTC: master's c257444 (bugs.md only) merged as ce74626, pushed. The poller runs until 00:14 UTC; dev-fee, miner-latency, miner-reliability not on origin.
  • The release worktree carries a built app/igneum-app/target (debug tests, the Windows check, the release signer). It can be removed after the cut: git worktree remove ../igneum-wt-release.