Commit graph

144 commits

Author SHA1 Message Date
igneum-labs
e5e1e92e37 Horizon polish for 0.3.16: (Q4) fork_is_close treats a passed activation as not close (every update since the 0.3.14 manifest read it as 0 blocks away and skipped every guard), publish-manifest.sh refuses an activation height at or below the live DAA unless --allow-passed-activation; (Q83, Q84, Q2) the finality pause shown: state.finality.paused, paused_since, reason, held_by, line ("Finality paused since 18:39 UTC: under two thirds of the weight is signing", the node's cause when it carries finality_reason/held_by), on the node line, the Overview's state and the Finality card, no lock called final while paused; tests
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 20:28:23 +00:00
igneum-labs
f3b43179de Ember /api/live: each block and miner row carries "miner", the lane id = the first 8 hex of the vote key hash, the same 8 a card's ids carry (the UI marks "you" by it); test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:52:38 +00:00
igneum-labs
700312688a Updater (0.3.16, Horizon frontier lane): nothing installs while the network's finality is paused (a synced node with no checkpoint lock for 15 min); the update card reads "waiting for finality"; only the signed manifest's own urgent flag installs through a pause, a fork-close or unsupported urgency does not; slot, catch-up and patience rules unchanged; the known-failed case tested
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:48:00 +00:00
igneum-labs
f9c4ac3701 Ember /api/live: the node lane's shape (timestamp_source passed through, header by default; the -32601 "method ... not found" message is the not-carried signal); tests
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:25:17 +00:00
igneum-labs
0276163301 Ember for Miner UI 4 (0.3.16): state.mining.watts_total and pounds_per_day (the fleet's fresh draw, the price from settings), state.address.balance_wei with balance_age_s and balance_note (eth_getBalance through the node's RPC every 30 s), state.address.price_gbp_per_ign null with its one documented source (a signed manifest field); GET /api/live from a local source (src/live.rs: igneum_getRecentBlocks when the node carries it, else the public site's reply cached 60 s, source and age_s on every reply); tests
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:24:38 +00:00
igneum-labs
1f0f7849db Ember for Miner UI 4 (0.3.16): card.tune_floor (the chosen clock is the ladder's floor), persisted as CardPref.sweep_floor
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:48:11 +00:00
igneum-labs
441d1eaf88 Ember for Miner UI 4 (0.3.16): a per-card goal (POST /api/tune/goal {key, goal}; CardPref.tune_goal; card.tune_goal, empty = global; ember::goal_for at the tune's start) and the untuned point of the last full plan on the card (tune_before_watts, tune_before_mhs, kept across confirm plans) so the row can read the saving; tests; next-cut note
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:42:58 +00:00
igneum-labs
0b48c028f3 Ember helper for 0.3.15, the 0.3.14 window's five causes: (B, C) the helper writes a heartbeat every poll, the engine starts the task and waits for a fresh heartbeat before writing any command, the acknowledgement is the helper's own log line; (D) a measure-only card is never set (ember::may_set); (E) an explicit Tune now clears the failure back-off and a held row says when the retry comes (ember::retry_note); tests. The shipped-app window playbook's gate at 0.3.15; relay/playbooks/ember-tune-pc1.ps1 deleted (superseded); the post-mortem table and the 0.3.15 next-cut table in the plan; bench log
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:39:00 +00:00
igneum-labs
0659fab5f2 Ember helper, two bugs from PC 1 on 6 October 2026: (A) a helper acts only on lines added after its start, so a stale quit or remove never kills a later start (commands_after + test); (B) the engine starts the task again before every task-path step and the acknowledgement is the helper's own log line for the sequence (up to 15 s), a missing line fails the step with that reason instead of a blind 4-second ack. Playbooks read the app log from <data root>\logs, where it lives
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:31:38 +00:00
igneum-labs
59631f07c7 Ember: every task command goes to the helper's fixed folder (platform::fixed_data_root, powertask::helper_dir, engine helper_cmd_dir): a scratch-root engine wrote under its own root, where the task never reads; test. The shipped-app window playbook: the installed app tunes itself through the task (AMD ladder, then the NVIDIA climbs), asked and watched over its API, never stopped
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 16:59:33 +00:00
igneum-labs
db0909f72d Ember: a baseline (measure-only) result's row reads Measured, not Tuned; the event line no longer doubles the words; test; next-cut table row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 16:56:24 +00:00
igneum-labs
57de3112b8 Ember: a power step on a card with no limit readback (AMD through ADLX reports an offset, never watts) is applied on the acknowledgement; run 6 aborted the 9070 XT's ladder at its first step on "card reports 0 W"; test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 16:43:26 +00:00
igneum-labs
12e045b64e Ember run 6: the helper registered on the scratch copy, so task_exe prefers the installed exe for every path that is not itself an install candidate, and the helper gains a reregister verb (no path argument; re-points the task at the install folder it finds itself, logs the action read back); the clock ladder and floor go to 45% with the 1% rate tolerance as the guard; a chosen point on the floor says floor, not optimum; the 5090 row (84 W saved for 0.15% of rate) on the fleet page; the re-point and no-prompt proof playbook; run 6 notes, threat note, bench log
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 16:35:03 +00:00
igneum-labs
07f04243d5 Ember 2: the plan's section 6b (the clocks, the hill-climb, the goal, the price, the curve, the fleet prior, what is owed); Settings: the goal, the electricity price, the climb switch; the card detail: £ a day for the tuned point and the measured curve; UI test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:56:22 +00:00
igneum-labs
229ca3f091 Ember 2: the climb's tests (a synthetic memory-bound card converges in five probes; a refused probe backs the knob off for good; each goal picks its point; the £/day formula) and the fleet prior carrying the memory clock (climb records aggregate)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:50:34 +00:00
igneum-labs
0bf27b1d78 state: tune_period_s on the settings state (the manifest's period), so the UI derives the next tune from sweep_at
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:48:44 +00:00
igneum-labs
0ef80a99bd The one approved Power control step on PC 1 failed with exit 1 (15:45:21Z, no cap applied, no helper registered): cmd.exe strips the first and last quote of a /c line that starts with one and holds more than two (two NVIDIA cards, or a cap plus the registration script); both launchers now wrap the line in one outer pair (platform::cmd_c_args, host.cpp runElevated), unit-tested; Ember 2: the memory clock set through nvidia-smi -lmc/-rmc (direct and through the helper's lmc/rmc verbs), the goal, the electricity price and the hill-climb switch in Settings and /api/tune/goal, the chosen point's memory clock and the measured curve on the card
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:48:14 +00:00
igneum-labs
c5e5de6752 Run 5 (15:28 to 15:39Z): the 5090's five power rows in the bench log (the cap does not bind: 0.41 MH/W flat at 310 W); the playbook's watchdog killed the live three-card tune at the first clock step, so: idle = three consecutive status lines reading 0.00 MH/s and 300 s, never a missing match; the after snapshot and the engine-log dump on every exit; an elevated tune engine registers the Igneum Power Helper itself before its first step (the --sweep engine skipped the cap path where the registration lived); Ember 2 groundwork: the memory-clock knob in Point and Limits, the goal, the hill-climb plan (not yet wired to the engine)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:44:06 +00:00
igneum-labs
7ed0d75160 A card never shows 0 MH/s without a reason word (the project lead, 6 October 2026, watching PC 1 during the table run): the Mine row reads 'tuning: step k of n · measuring W W' with the live rate, 'held for a remote job: <title>' while a job holds the miners, and the Tuned line at the end; the big button reads 'Tuning, mining again in about N min'; the strip carries one tune line; a measurement engine prints a TUNE progress line every 10 s and the playbook forwards it (and TUNE chosen as done) to the installed app's POST /api/tune-progress, a post of state, never quit, pause or resume; the rule in ember-tune.md 6a; UI tests for the three states
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:36:07 +00:00
igneum-labs
7bc0e1ce1a powertask: a kit run from a jobs folder registers the INSTALLED exe as the task's action (the 15:28Z run on PC 1 registered jobs\ember-kit-5\igneum-app-ember.exe); the playbook uses a kit only on an app that predates Ember Tune
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:30:42 +00:00
igneum-labs
6099f37ed5 ember: a registered Igneum Power Helper task counts as permission for the tune (an unelevated measurement engine, Power control forced off, still sets NVIDIA limits through the task with no prompt)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 15:11:37 +00:00
igneum-labs
4af1d66917 Merge master 017c7db into ember-tune (0.3.12's version files and the proving-v1 app merge; my own 27c2db6 came back as 4965220) 2026-10-06 15:03:37 +00:00
igneum-labs
0cba03027e lock_permissions: the folder grant is user:(OI)(CI)F WITHOUT /T (measured on PC 1, collect ember-acl-2: /T re-applies /inheritance:r to each file after the propagation and an (OI)(CI) entry on a file is inherit-only, so the copied settings still read as nothing); the playbook prefers ember-kit-5
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 14:50:49 +00:00
igneum-labs
add025fb25 Why every measurement engine on PC 1 ran on defaults: lock_permissions cut the app folder's inheritance with a non-inheritable user:F, which left files COPIED in before the start (settings.json, machine-id, wallet.json) with no ACE at all, unreadable by their owner; the folder grant is now user:(OI)(CI)F with /T (unit test on the argument shape); a --sweep engine never asks for the firewall rule; the playbook copies the firewall flag; the settings fixture test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 14:39:18 +00:00
igneum-labs
f225ccf842 run 4's cause: the playbook's PowerShell JSON round trip rewrote the copied settings (big integers as doubles), the engine read the file as defaults (no payout address, every card off, 96 old remote jobs run in the scratch root). Fix: the copies are verbatim and a --sweep engine applies Settings::for_measurement in memory (remote jobs, updates, proving and Power control off, not paused, tune on, every card due and unpinned); the CI check fails any playbook that rewrites settings.json through ConvertTo-Json; unit test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 14:21:06 +00:00
igneum-labs
5888eea534 One administrator approval, ever (the project lead, 6 October 2026 11:50 UTC): the first Power control approval also registers the per-user scheduled task 'Igneum Power Helper' (RunLevel Highest, no trigger, action = the app's own exe --power-helper); every later cap and every tune's helper starts the task and writes the command file, no prompt, across restarts, updates and reboots; Power control off sends remove and the task unregisters itself; the helper runs only fixed verbs with digit-only nvidia-smi arguments (threat note in ember-tune.md 7a); 4 tests
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 11:50:49 +00:00
igneum-labs
e651e281d4 release 0.3.12: merge proving-v1 app f0a40cd (the segment-aligned prover, the held fresh record, the fresh-record rule harness)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:37:18 +00:00
igneum-labs
4965220bad release 0.3.12: merge ember-tune 27c2db6 (Ember Tune, the quit source, no OTA and no pipe in a second engine, the elevated follow_file, the BOM fix, Power control, job-console's hidden-console builder and spawn check)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:22:22 +00:00
igneum-labs
27c2db64c3 app: every elevated launch through one hidden-console builder; CI check for Windows spawns; PC 1 console watchers
The console-window class (the project lead, 5 October 2026: "Windows Command Processor" windows on PC 1 whenever a remote job runs).
Measured on PC 1 (ae432dc7, Windows 11 Pro 26200, default terminal "Let Windows decide" = Windows Terminal 1.24) with
tools/windows/console-watch.ps1 (job run-20261005-182528): no child a job script starts from the app's headless
console opens a window (powershell, cmd, query, curl, nvidia-smi, wsl --status, a distro, interop cmd and powershell,
powershell -WindowStyle Hidden: 0 windows each); Start-Process in a new console opens a Terminal window (the known-failed
case: 2 windows), the same with -WindowStyle Hidden opens none (the known-finished case). The elevated path
(Start-Process -Verb RunAs -WindowStyle Hidden through the AppInfo service) is the one road left; its watcher
(console-watch-elevated.ps1, job run-20261005-184610) was cancelled at the UAC prompt.

- platform.rs: elevated_ps_line + elevated_command build the one PowerShell line every elevated launch uses (the NVIDIA
  power cap, the sweep helper, the clock sync, an elevated remote job), -WindowStyle Hidden by construction; unit
  tests on the line, the quoting and the Command.
- jobrun.rs: the elevated job path uses it; the relaunch helper's Start-Process carries the reason it has no
  -WindowStyle Hidden (igneum-app.exe is a windows-subsystem program).
- tools/ci/windows-spawn-check.mjs (+ ci.yml): fails when a Command::new in app/igneum-app/src is not quieted,
  a creation_flags is not CREATE_NO_WINDOW alone, a Start-Process the Rust code writes lacks -WindowStyle Hidden or
  -NoNewWindow, or host.cpp spawns without CREATE_NO_WINDOW / SW_HIDE; self-test on known-good and known-bad samples.
- tools/windows/console-watch.ps1, console-watch-bg.ps1, console-watch-elevated.ps1: the watchers (run jobs).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:21:46 +00:00
igneum-labs
563463b35f Merge release-0.3.12 (fda4684) into ember-tune: 0.3.11's six-section View and card order kept, Ember Tune's line and switches re-added on it; the tune fields move into hotplug::apply_pref; the power-cap plan keeps present(); both CI test lists; 132 app tests, 26 UI tests, every gate green
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:20:46 +00:00
igneum-labs
24b42e0509 Igneum Miner 0.3.12: the six version files
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:19:00 +00:00
igneum-labs
622e3c90bb release 0.3.12: merge card-order: the GPU list by performance
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:16:26 +00:00
igneum-labs
328b6088ec release 0.3.12: merge update-catchup: an old update skips the hourly slot
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:16:26 +00:00
igneum-labs
92b109cddb release 0.3.12: merge proving-v1 app: paid_wei as a decimal string
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

# Conflicts:
#	docs/bench-log.md
2026-10-06 08:16:26 +00:00
igneum-labs
50a08e8d50 app: an update published over an hour before the engine started skips the hourly rollout slot
PC 1, 6 October 2026 06:58:47Z: the app came up after the 0.3.11 publish, had the installer verified 44 s
later and sat on "installs at the next safe moment" with its slot at minute 35; the project lead pressed Install now at
07:00:48Z. The slot staggers a fleet through a NEW publish; a machine that was off through the publish has
nothing to stagger. Now: published_at + 3,600 s <= engine start => slot_ok, logged once. The other safe-moment
guards (node synced, miner idle, boundary, network drop) are unchanged. manifest::unix_from_rfc3339 with tests.
For 0.3.12.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:13:51 +00:00
igneum-labs
a113557da2 prover: a segment record the chain rule refuses is held and offered again every pass until the segment's deadline (the fresh-record window on the 0.3.11 rule is one segment length in DAA); the tile counts held records; the fast-time file sets the fresh-rule switch
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:03:46 +00:00
igneum-labs
6de4827ccb a job that cannot mine never burns its budget silently: the elevated job path follows its output file while the script runs (the 5-minute progress reports carry the lines; 0.3.12), and the tune playbook's watchdog fails a run that mines nothing within 120 s of its first status line (the engine's last log line in the RESULT, the tree ended, mining restored by the runner)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 08:03:13 +00:00
igneum-labs
85e7e8e527 app: order the GPU list by performance (usable, discrete before integrated, rate in 5 MH/s buckets, memory)
the project lead, 6 October 2026: on PC 1 the integrated card sat between the 5090 and the 9070 XT. The list now shows
usable cards first, ordered by the measured rate since the start in 5 MH/s buckets (no flicker), discrete,
external and Apple before integrated, then memory; removed and unusable cards last; ties keep the detection
order. The row signature follows the order, so a reorder re-renders. Three UI tests. For 0.3.12.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 07:23:25 +00:00
igneum-labs
3671918fb4 prover: segment-aligned work (proving v1): a free prover claims a whole segment, proves every shard from one export in one chain run, submits the shard records and the segment record; the host's chain mode takes --prev and writes per-shard records with --save-shards
One prover at 2.2% coverage never had 8 consecutive proven blocks (C47, 6 October 2026); claiming whole segments makes it complete about 1 segment in 75 instead of none. The choice is deterministic per key (FNV of first block and key hash) over the untouched whole segments inside their deadline by a margin (240 DAA or 1.5x the last segment's time); the per-block path stays as the fallback. Unit tests for the grid, the grouping, the margin, the attempted set and the per-key order; 120 app tests, 8 core and 9 host tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 07:12:23 +00:00
igneum-labs
3d505766d2 C35 named: PC 1's 22:31 UTC quit was the per-user installer launched by the second engine's own updater (0.3.9 under min_supported_version = urgent, beating auto_update = false); a second engine never runs the updater (IGNEUM_APP_NO_OTA=1, implied by --sweep; the playbooks set it; the CI check demands it); bench log and plan carry the named source
Source: the scratch engine's own log in collect ember-c35-collect-1 (06:59Z): 22:31:02Z '0.3.10 is available: downloading',
22:31:05Z 'update: starting the installer first ... ota-apply.ps1', and the installed app's 'quit:' at 22:31:06Z.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 07:01:57 +00:00
igneum-labs
42f36b3fd3 app: /api/state never answers {} again (paid_wei over u64::MAX broke to_value; the field is a decimal string, the error is logged once)
serde_json's to_value refuses a u128 over u64::MAX (18.45 IGN) and state_json turned the error into json!({}). A paid shard is 1.23 IGN on average, so a proving machine's dashboard went blank about 15 paid shards after every app start. Unit test over the boundary; 114 app tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 00:27:35 +00:00
igneum-labs
d69e1c9fae C35: every quit names its source (Cmd::Quit carries it: the window host's stdin, the host gone, POST /api/quit, the --sweep run's end); the --sweep job never counts as Power control and sets no cap at start (it raised a UAC prompt on PC 1 at 22:30 UTC); the tune playbook's budget quit goes only to its own scratch URL file and says so
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:53:32 +00:00
igneum-labs
794e23c5ac ember: the AMD helper's gmax range is an offset from stock (PC 1's 9070 XT: -500 to 1000), not MHz: the clock knob stays closed on an offset range and the power ladder is bounded by plimit_range (-30 to 10) on a percent scale
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:43:43 +00:00
igneum-labs
123838199f Igneum Miner 0.3.11: the six version files
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:40:42 +00:00
igneum-labs
a2f08e3f70 prover loop: a PermissionDenied from the host names the root-owned GPU-server socket and the fix (the root-socket class); the plan's two times
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:38:22 +00:00
igneum-labs
9f6a4ebc65 App: every worker gets --prepare-packs in the platform's path form and runs with the app data folder as cwd (program class v3: the Metal worker compiles v3 only from a prepared pack; the Macs would have answered need lines at the first v3 epoch)
cargo test --release -p igneum-app under the build lock: 113 + 27 + 8 passed, 0 failed (the prepare_packs_tests,
resume_tests and provedefault tests among them).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:22:44 +00:00
igneum-labs
c4da08d302 App: the resume path re-arms every stopped card, re-exports its pack and checks 90 s later that every enabled card mines (PC 2 at 21:25:11Z and the Mac that afternoon stayed at 0 MH/s after resume); the PC 2 socket-fix job
The known-failed case, from PC 2's 0.3.9 log (run win-1ccfe586-20261005-200114): 1791234223 pause -> 'stopping the
miners (paused)' (every slot's restart_at cleared, the 5090 'off'); 1791235511 '[ok] mining resumed'; then
'0.00 MH/s, waiting' at every 30-s status line until the 0.3.10 restart at 21:49:41Z. Cause: Cmd::Resume re-armed
only slots whose watchdog said faulted; the 5090's slot was healthy and stopped, so nothing restarted it. The test
the_pc2_resume_of_21_25_11z_restarts_under_the_new_rule_and_not_the_old encodes that slot (faulted false, live
false): the old rule returns [] (the defect), the new rule [0]. cargo test -p igneum-app resume: 3 passed;
provedefault: 6 passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 21:56:20 +00:00
igneum-labs
5c808b89e0 Ember Tune: every card tuned for MH per watt out of the box, the fleet prior per card model in the signed manifest, the console and /miners priors table
the project lead, 5 October 2026, 22:45 BST: "make sure we have ember tuning every single card for efficiency out of the box, the
more data = the better the tune, make an awesome system." Built on lever 3 (docs/plans/miner-eff.md), lever 2's signed
tuning section (docs/design/miner-tuning.md), the AMD telemetry helper (423936b, its --tune/--set-gmax/--set-plimit/
--reset contract) and the Power control switch (057f0ec). Design, data flow, tiers and the privacy line:
docs/plans/ember-tune.md.

- src/ember.rs (new): two knobs per card (power limit %, core clock cap MHz; memory clock never touched), the full plan
  (power ladder 100..50%, then the clock ladder 90..60% at the chosen power), the confirm plan (the fleet prior and one
  neighbour), the baseline plan (measure only), the marks (faulted, hot, memory_clock_dropped, unapplied, no_readings),
  the choice (best MH/W within 1% of the top rate, then rate, then draw), the fleet record (a hash of the install id,
  no address), the prior lookup and the kill switch (tuning.ember), the state machine on a fake clock. 9 unit tests.
- engine.rs: tick_sweep schedules every NVIDIA, AMD and Apple card (120 s steady, 600 s to the boundary, no job hold,
  no pause, weekly, again after a driver major or program-class change, never under the manifest kill switch); the
  probe (nvidia-smi clocks.max.gr + driver_version and the direct/helper mode; igneum-gpu-telemetry --tune for AMD);
  tune_apply (nvidia-smi -pl / -lgc 0,<MHz> / -rgc directly or through the helper; the AMD helper per request);
  Cmd::TuneProbe, Cmd::TuneSet; faults from rejected and mismatched hashes mark the step; the TUNE lines and the TUNE
  {json} record, uploaded with the log; the Tuned line on the card state. The NVIDIA helper starts only with Power
  control on: the --sweep job never counts as permission (no prompt on a PC with nobody there).
- sweep.rs: the helper protocol gains lgc/rgc (clock cap and reset) and resets the clocks after 20 idle minutes.
- state.rs, config.rs: the tune fields (clock cap, driver, class, source, the Tuned line); the nvidia-smi telemetry
  query carries clocks.gr and clocks.mem; the AMD sample line's plimit_pct and gmax_mhz are parsed.
- ui: "Tuned: X MH/s at Y W (Z MH/W)" with the point, the source and when; measure-only cards say why; the Ember Tune
  switch; tune-line.test.mjs.
- relay/lib/ember.mjs + relay/test/ember.test.mjs: the aggregation per (card model | driver major | program class):
  median point, MH/W, spread, samples, machines; five samples converge, an outlier does not move the median, baselines
  make no prior, de-duplication, the manifest merge keeps lever 2's cards. api/console.mjs fn=tuning and
  tools/console.mjs tuning; tools/tuning.mjs --priors [--write tuning.json] [--site] [--tuning-off].
- site: the fleet priors table on /miners (site/miner-priors.json), the lever text.
- relay/playbooks/ember-tune-pc1.ps1: the PC 1 run (second engine with --sweep from a scratch copy of the install).

Measured tonight: see the bench log entry that follows the PC 1 run. The 9070 XT left PC 1's bus at 20:40 UTC and the
5090 needs the administrator prompt the project lead cannot answer asleep, so tonight's PC 1 run is the baseline plan on the 5090
through the whole pipeline; the two-knob tune on both cards is owed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 21:25:09 +00:00
igneum-labs
d7c28ec695 prover loop: the CPU path is refused under 32 GB of RAM on every OS with the measured reason, and its tile line names the cost (consequences C22)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 21:12:37 +00:00
igneum-labs
5424c30bba Proving v1: the app's default restores Decision and gb (lost in the tier rewrite), the AMD-only and Apple 'mines and does not prove' line with the CPU prover's measured cost, the plan's AMD/Apple row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 21:03:42 +00:00