Commit Graph
99 Commits
Author SHA1 Message Date
grenade f7337fe9a1 Merge pull request 'gpu: apply the miner's clock profile only while the miner runs' (#34) from feat/gpu-profile-follows-workload into main
deploy / fetch (push) Successful in 27s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Successful in 1m12s
deploy / deploy-metrics (push) Failing after 9s
Reviewed-on: #34
2026-09-22 13:10:58 +00:00
Rob ThijssenandClaude Opus 5 80bbe12455 gpu: apply the miner's clock profile only while the miner runs
The power limit and 810 MHz memory lock were a host setting, applied at
every boot by nvidia-power-limit.service regardless of what the GPU was
doing. A host switched from mining back to LLM inference kept the lock
with the miner stopped, and inference is memory-bandwidth bound: a 27B
model on 2x RTX 5090 decoded at 3.8 tok/s on a build that had measured
21.9 tok/s. Nothing reported it — a -lmc lock is not a clocks event
reason, and utilisation still reads ~98%.

The profile now follows the workload:

- nvidia-power-limit.sh takes a mode. `miner` applies the configured
  profile as before; `default` resets each card to its own default power
  limit and memory clock.
- nvidia-power-limit.service runs `default` at boot. The miner applies
  `miner` in ExecStartPre and `default` in ExecStopPost (quantus/miner).
- A drop-in for neuron.service makes it conflict with the miner and
  reset to default before starting, so either one can take the host with
  a single systemctl start and the clocks follow.
- infra-setup.sh installs the drop-in, always writes the profile config
  (so removing a host clears it), and applies whichever profile matches
  the running workload instead of restarting the boot unit under a live
  miner.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XViS3RVfGTRaRSopLN68MA
2026-09-22 16:00:32 +03:00
Rob ThijssenandClaude Fable 5.1 404c65a07b deploy: admit named hosts at other sites to a node's RPC
deploy / fetch (push) Successful in 19s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Successful in 56s
deploy / deploy-metrics (push) Successful in 10s
A per-node rpc_extra_sources list of mesh names, each resolved on the node
into a /32 firewalld rich rule for quantus-node-rpc, beside the site-subnet
rule. bob gets oolon.kosherinata.internal: the kosherinata edge proxy that
publishes the node as wss://quantus.blackbeard.observer for the blackbeard
wallet (blackbeard/wallet #53). The rule is already applied on bob by hand
with the same command; this makes the next deploy agree with it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ftBXYuba8ARhQeF74oUgW
2026-09-16 09:10:39 +03:00
grenade 73aaf4119d Merge pull request 'deploy: node 1.0.1' (#33) from node/v1.0.1 into main
deploy / fetch (push) Successful in 22s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Successful in 1m6s
deploy / deploy-metrics (push) Successful in 11s
2026-09-15 09:21:18 +00:00
Rob ThijssenandClaude Fable 5.1 5d179d9984 deploy: node 1.0.1
Upstream released v1.0.0-gm and v1.0.1 on mainnet day; the fleet has run
0.11.1 from the published mainnet.json since the hand cutover. The node-side
delta from 0.11.1 is small: the mainnet spec is embedded (`--chain mainnet`),
command.rs adjusts four lines, and the miner server and consensus client are
untouched. The release notes state any node from v0.11.1 on is valid, so this
is a binary swap on the same chain id, spec file and credentials.

This is also the first push-triggered node deploy since the cutover, which
is the point: prove the CI path upgrades bob without hand intervention.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJp25VomsWVZDPM9Fwmhnq
2026-09-15 12:20:46 +03:00
grenade 1c480f9867 Merge pull request 'doc: record the mainnet cutover as it happened' (#32) from doc/cutover-record into main 2026-09-09 09:05:30 +00:00
Rob ThijssenandClaude Fable 5.1 9581a8da2a doc: record the mainnet cutover as it happened
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 12:05:07 +03:00
grenade dcc1915a14 Merge pull request 'deploy: mainnet values — chain spec, sha256, genesis, bootnodes' (#31) from launch/mainnet-values into main
deploy / fetch (push) Successful in 23s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Successful in 1m1s
deploy / deploy-metrics (push) Failing after 18s
2026-09-09 09:04:27 +00:00
Rob ThijssenandClaude Fable 5.1 654e692f2e deploy: mainnet values — chain spec, sha256, genesis, bootnodes
Mainnet cut over 2026-09-09 09:01 UTC. The spec (sha256 81f048c0…, id
"mainnet", genesis 0xfb5487c0…) is committed under asset/chainspec/ and
the deploy env carries the spec path, its checksum, the expected genesis
and the seven foundation bootnodes, so push-triggered deploys reproduce
the hand cutover exactly and validate asserts the genesis from now on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 12:03:19 +03:00
grenade f56d94400b Merge pull request 'deploy: chain spec from a repo path, with a sha256 check' (#30) from launch/chainspec-from-repo into main
deploy / fetch (push) Has been cancelled
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Has been cancelled
deploy / deploy-metrics (push) Has been cancelled
2026-09-09 08:39:07 +00:00
Rob ThijssenandClaude Fable 5.1 f515c8057b deploy: chain spec from a repo path, with a sha256 check
The mainnet package arrives as files (spec, bootnodes, genesis, checksum
file, readme) with the node staying on 0.11.1, so the spec is committed
under asset/chainspec/ after verification and the deploy takes a repo
path as well as a URL. CHAINSPEC_SHA256 / chainspec_sha256 re-verifies the
file in fetch. The fetch job now checks the repo out.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 11:38:44 +03:00
grenade 5ad19ccb2a Merge pull request 'gpu: lock beast's memory clock at 810 MHz now that it mines' (#29) from gpu/beast-memory-clock into main 2026-09-09 06:27:21 +00:00
Rob ThijssenandClaude Fable 5.1 921f468b2f gpu: lock beast's memory clock at 810 MHz now that it mines
Measured 2026-09-09 with both 5090s at 400 W: 555 -> 567 and 563 -> 573
MH/s, SM clock 2250 -> 2370 MHz. Applied to beast with the gpu role.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 09:27:02 +03:00
grenade c8aef85e24 Merge pull request 'doc: beast enabled and neuron disabled on all mining hosts before launch' (#28) from doc/beast-enabled into main 2026-09-09 06:15:48 +00:00
Rob ThijssenandClaude Fable 5.1 48a20d8138 doc: beast enabled and neuron disabled on all mining hosts before launch
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 09:15:29 +03:00
grenade 4e5d600e59 Merge pull request 'deploy: admit beast on the node's miner link and scrape it' (#27) from deploy/beast-miner into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal beast.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external -… (push) Successful in 1m4s
deploy / deploy-metrics (push) Failing after 48s
2026-09-09 06:14:59 +00:00
Rob ThijssenandClaude Fable 5.1 e1d2bb68db deploy: admit beast on the node's miner link and scrape it
Mainnet call 2026-09-09: beast mines. The node's firewalld rich rule for
the QUIC miner port and Prometheus's miner targets gain beast, matching
quantus/miner's deploy matrix.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 09:14:34 +03:00
grenade 3aeb960345 Merge pull request 'doc: launch is 2026-09-09, announced on Quantus Insiders the day before' (#26) from doc/launch-date into main 2026-09-09 05:08:13 +00:00
Rob ThijssenandClaude Fable 5.1 40bb504c9f doc: launch is 2026-09-09, announced on Quantus Insiders the day before
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 08:07:55 +03:00
grenade c857f0ee62 Merge pull request 'doc: mainnet cutover runbook for 2026-09-10' (#25) from doc/mainnet-cutover into main 2026-09-09 05:07:07 +00:00
Rob ThijssenandClaude Fable 5.1 99a53eb30e doc: mainnet cutover runbook for 2026-09-10
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 08:06:49 +03:00
Rob ThijssenandClaude Fable 5.1 f47efadc9b doc: mainnet cutover runbook for 2026-09-10
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 08:06:25 +03:00
grenade 7a7090b28b Merge pull request 'deploy: node from a chain spec file with genesis assertion, bootnodes as reserved peers, raised peer limits' (#24) from launch/chainspec-deploy into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 56s
deploy / deploy-metrics (push) Successful in 49s
2026-09-09 05:05:34 +00:00
Rob ThijssenandClaude Fable 5.1 6276a0bf98 deploy: run the node from a chain spec file with genesis assertion, bootnodes as reserved peers, raised peer limits
Mainnet launches 2026-09-10 09:09 UTC with the chain spec published as a
file before any binary embeds it. The node deploy can now run from
/etc/quantus-node/chainspec.json (CHAINSPEC_URL or the chainspec_url
input), asserts the started node's block-0 hash against EXPECTED_GENESIS
(required with a spec: it is the only defence against a look-alike), and
prints the spec id, which names <base-path>/chains/<id>/ and is what the
miner deploy must be pointed at; validate checks the miner credentials
exist under it. BOOTNODES are dialled and held as reserved peers.

The unit raises --out-peers to 32 and --in-peers to 64: bob sits at the
default cap of 40 peers today, and launch is a propagation race
(quantus/chain#1). infra-setup grants the runner the chain spec path
(applied to bob 2026-09-09).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-09 08:05:00 +03:00
grenade f3c026623e Merge pull request 'arena: keep author names across restarts and confidence dips; stable duplicate-name suffix' (#23) from arena/sticky-attribution into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 38s
deploy / deploy-metrics (push) Successful in 9s
2026-09-04 08:10:39 +00:00
Rob ThijssenandClaude Fable 5.1 918d576d3d arena: keep author names across restarts and confidence dips; stable duplicate-name suffix
Three sources of author-label churn split the per-author hashrate series
into fragments (lair/quantus#11 follow-up):

- Attribution state lived in memory, so every restart stripped every
  author of its name for a few blocks. Votes, held names and the peer-id
  to name map are now saved to --state-file (the service uses
  /var/lib/quantus-arena/attribution.json) at most every 10 s and
  restored at start.
- A name dropped back to the preimage whenever confidence dipped under
  0.6. A held name now stays until its node has no vote left in the
  20-block window or another node out-votes it outright.
- A duplicate name got its peer-id suffix only once a second node with
  that name was attributed, re-labelling the first. Any name used by more
  than one node on the feed now always carries the suffix.

Dashboard: the hashrate-by-author panel no longer spans nulls, so a label
change shows as a gap rather than a slope drawn between two points.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 11:10:18 +03:00
grenade 6b80666e8d Merge pull request 'grafana: per-author hashrate window follows the dashboard range' (#22) from arena/author-window-variable into main
deploy / fetch (push) Successful in 15s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 37s
deploy / deploy-metrics (push) Successful in 10s
2026-09-04 08:00:02 +00:00
Rob ThijssenandClaude Fable 5.1 270ee55bd6 grafana: per-author hashrate window follows the dashboard range
New interval variable 'author window' (auto: about a quarter of the
range, never under 2 h; or pinned 1h..2d) replaces the fixed 6 h trailing
window in the hashrate-by-author panel, so a week view smooths and a
short view resolves.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 10:59:46 +03:00
grenade 9998cb81c9 Merge pull request 'arena: backfill the rolling window at startup; leaderboard hides zero-block rows' (#21) from arena/backfill-window into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 38s
deploy / deploy-metrics (push) Successful in 8s
2026-09-04 07:24:41 +00:00
Rob ThijssenandClaude Fable 5.1 3d69374c26 arena: backfill the rolling window from chain history at startup; leaderboard hides zero-block rows
After a restart the window started empty, so authors who had not sealed a
block since had no leaderboard row source, no author label series and no
timing caps until they authored again; on the dashboard that showed as
blank author cells for the smaller miners. The first poll now fills the
window (3600 blocks, 15 s against bob) from chain history, window only:
the authored counter is untouched so increase() sees no phantom burst, and
no tip timing is observed for blocks not watched arriving. Capped at 180 s
of wall clock.

The leaderboard's top-20 also drops rows with zero blocks in the range;
they were stale series with nothing to show.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 10:24:22 +03:00
grenade 10953f5535 Merge pull request 'grafana: per-author hashrate history panel' (#20) from arena/author-hashrate-history into main
deploy / fetch (push) Successful in 18s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 35s
deploy / deploy-metrics (push) Successful in 10s
2026-09-04 07:18:58 +00:00
Rob ThijssenandClaude Fable 5.1 4b626754e5 grafana: per-author hashrate history panel
Each author's estimated hashrate over time: share of blocks authored in
the trailing 6 h times the 6 h average network hashrate, legend by the
telemetry node name where attributed, else the abbreviated preimage.
Authors under 10 MH/s are left out. Makes pool growth visible as a trend
rather than a leaderboard snapshot.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 10:18:40 +03:00
grenade 25a5ab6428 Merge pull request 'grafana: leaderboard author label falls back to the last one seen in the range' (#19) from arena/author-range-fallback into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 36s
deploy / deploy-metrics (push) Successful in 10s
2026-09-04 07:12:07 +00:00
Rob ThijssenandClaude Fable 5.1 c10d48da3a grafana: leaderboard author label falls back to the last one seen in the range
The exporter emits quantus_author_node_info only for authors in its rolling
block window, which is rebuilt from live blocks after a restart, while the
leaderboard covers the dashboard range. Authors outside the window showed a
blank author cell. Query G now takes the current series and, for preimages
without one, the last label set seen in the range (one per preimage).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 10:11:50 +03:00
grenade 39ea1d33e2 Merge pull request 'arena: vote author attribution by peer id over a window, follow renames' (#18) from arena/stable-attribution into main
deploy / fetch (push) Successful in 15s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 37s
deploy / deploy-metrics (push) Successful in 9s
2026-09-04 06:57:35 +00:00
Rob ThijssenandClaude Fable 5.1 5067579d86 arena: vote author attribution by peer id over a window, follow renames
Telemetry node ids are per connection: a node that restarts or renames
comes back under a new id, so votes keyed by node id split across the old
and new identity, and with a lifetime attempt count the new identity had to
outvote the whole history before the name came back. Votes are now keyed by
peer id (stable across restarts and renames; node id only when telemetry
gave no peer id), kept for the last 20 blocks per author, and displayed
with the latest name telemetry reported for that peer, so a rename shows
within a block and a restart within a few. Lifetime attempts/attributed
counters are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 09:57:13 +03:00
grenade 933f9870a1 Merge pull request 'arena: name authors from telemetry first-import; leaderboard shows author, drops preimage and ours' (#17) from arena/author-names into main
deploy / fetch (push) Successful in 17s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 37s
deploy / deploy-metrics (push) Successful in 10s
2026-09-04 06:42:50 +00:00
Rob ThijssenandClaude Fable 5.1 86a69889af arena: name authors from telemetry first-import; leaderboard shows author, drops preimage and ours
The exporter ingests the feed's ImportedBlock (code 6) reports and keeps,
per block hash, the first reporter and its lead over the second. Each tip
block is joined with that after 8 s; a reward preimage gets the node's
telemetry name once at least 3 of its blocks were attempted and 60% or more
were first reported by the same node. Emitted as
quantus_author_node_info{preimage,display,node_name,peer_id,self} confidence
with attempts/attributed counters per preimage; display is the name, or
the abbreviated preimage (first 8, last 4) when no confident attribution.

Measured today: leads are 40-100 ms for authors on the feed (the network is
better connected than when 200-700 ms was measured), so the lead threshold
is 20 ms and identity consistency carries the attribution. Validated for
ten minutes against bob: ours -> baba-gorchitsa, 0x2ccf39 -> quanpool-planck,
GUI miners -> QuantusMinerGUI at confidence 1.0.

Dashboard: the leaderboard joins quantus_author_node_info and shows the
display label as "author" in place of the reward preimage; the "ours" column
is gone, so the panel is fit to share. ARENA_DEBUG=1 turns on debug logging
(per-block attribution decisions).

Closes #11.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 09:42:29 +03:00
grenade a865c717f1 Merge pull request 'arena: calibrated quick-follow ratio from arrival times; blank cells stay blank' (#16) from arena/leaderboard-calibrated into main
deploy / fetch (push) Successful in 32s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 42s
deploy / deploy-metrics (push) Successful in 23s
2026-09-04 06:05:54 +00:00
Rob ThijssenandClaude Fable 5.1 4125340be7 arena: arrival-time gap histogram; quick-follow ratio uses it; 1 s poll
Author timestamps are set when the node builds the proposal, right after
the previous block arrives, so gaps between author timestamps measure
proposal timing and flagged our own honest node at 2.8x the network's
quick-follow share. Withheld blocks show in arrival timing instead:
quantus_block_arrival_gap_seconds uses the exporter's observation time
(poll interval now 1 s; telemetry first-seen replaces it under #11). The
leaderboard's quick-follow column and the Author timing panel now use it,
with a 2 s window to sit above the poll resolution.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 09:05:28 +03:00
Rob ThijssenandClaude Fable 5.1 1d1b8d19de dashboard: quick-follow ratio instead of gap p10; transparent base so empty cells stay empty
For a Poisson block process the 10th-percentile gap of an honest author is
about one second by construction, so a fixed threshold flagged everyone.
quick-follow x is the share of an author's blocks arriving within 1 s of
the previous block divided by the network's share: 1 is normal, 2 or more
is withheld-block behaviour; needs 10 samples. Bucket boundaries are
selected as le="1.0" (Prometheus 3 normalises them to float strings).
Threshold bases are transparent so authors without samples show blank
cells, not red or blue.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 09:04:27 +03:00
grenade b17dfaeba1 Merge pull request 'dashboard: visual leaderboard columns — MH/s bar, threshold colours, burst ratio' (#15) from arena/leaderboard-visuals into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 37s
deploy / deploy-metrics (push) Successful in 10s
2026-09-04 06:00:06 +00:00
Rob ThijssenandClaude Fable 5.1 0b117899b7 dashboard: visual leaderboard columns — MH/s bar, threshold colours, burst ratio
est. MH/s as a bar on its own scale; gap p10 and drift median as
threshold-coloured cells (low gap and positive drift are the suspicious
directions); a burst ratio column, consecutive self-blocks over the count
expected from the author's share, coloured amber above 2 and red above 4
and shown only where the expected count exceeds one.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 08:59:43 +03:00
grenade 30e79cbfff Merge pull request 'dashboard: scale the leaderboard's blocks bar to its own column; blank NaN timing cells' (#14) from arena/leaderboard-bar-scale into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 36s
deploy / deploy-metrics (push) Successful in 11s
2026-09-04 05:55:55 +00:00
Rob ThijssenandClaude Fable 5.1 833e414c6d dashboard: scale the leaderboard's blocks bar to its own column; blank NaN timing cells
After the multi-query join Grafana ranged the gauge cell across every numeric
field in the frame, so 31 blocks was drawn against a 675 MH/s maximum.
fieldMinMax on the blocks column restores the per-column scale. The gap and
drift quantiles are filtered with expr == expr so authors without samples in
the range show a blank cell instead of NaN.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 08:55:36 +03:00
grenade af7992f712 Merge pull request 'dashboard: leaderboard gains est. hashrate, gap p10, drift median and consecutive columns' (#13) from arena/leaderboard-columns into main
deploy / fetch (push) Successful in 17s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 34s
deploy / deploy-metrics (push) Successful in 13s
2026-09-04 05:51:19 +00:00
Rob ThijssenandClaude Fable 5.1 3e6985cb4e dashboard: leaderboard gains est. hashrate, gap p10, drift median and consecutive columns
Estimated hashrate is the author's share of blocks over the range times the
network hashrate estimate: statistical, roughly ±10% at a few hundred
blocks, and labelled as such. The timing columns join the new per-author
histograms (lair/quantus#12) on the preimage; outer join filtered to the
top-20 rows from the blocks query so authors without timing data still
appear with blanks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 08:50:53 +03:00
grenade 7cd4f9b50c Merge pull request 'arena: per-author block gap, timestamp drift and consecutive-block series' (#12) from arena/gap-and-drift into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 40s
deploy / deploy-metrics (push) Successful in 26s
2026-09-04 05:38:54 +00:00
Rob ThijssenandClaude Fable 5.1 b57526fdcc arena: per-author block gap, timestamp drift and consecutive-block series
Two signals that expose what other miners are doing, both from data the
exporter already fetches plus one chain_getBlock per tip block:

- quantus_block_gap_seconds{preimage}: histogram of the time between a
  block and the previous one, by the author of the later block, from the
  authors' own timestamps (the Timestamp::set inherent, pallet 1 call 0,
  decoded from the first extrinsic). Bursts in the lowest buckets for one
  author right after others' blocks are withheld blocks.
- quantus_block_timestamp_drift_seconds{preimage}: block timestamp minus
  the time the exporter first saw the block. Negative is propagation and
  poll lag; positive is a future-dated block, which the Homestead-style
  retarget rewards slightly (the inherent allows 30 s).
- quantus_consecutive_self_blocks_total{preimage}: blocks authored directly
  after the same author's previous block.

Same top-N cap as the leaderboard, with "other" merged and "all" for the
network. Validated live against bob for three minutes. Dashboard row
"Author timing" with p10 gap, median drift and consecutive-block rate.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBgs2nSi4H2mdh8kD8vMX5
2026-09-04 08:38:31 +03:00
grenade 8ee003d8d3 Merge pull request 'gpu: lock the memory clock at 810 MHz on the mining hosts (+13% on the 4090)' (#10) from gpu/memory-clock-lock into main
deploy / fetch (push) Successful in 16s
deploy / deploy-node (bob.hanzalova.internal, 0x134e73f06fa9bdb1dbfa909e149c563f5860ceb71a0e7307918f7033970edf59, benjy.hanzalova.internal quadbrat.hanzalova.internal, --public-addr /dns4/nh.thgttg.com/tcp/30333, --unsafe-rpc-external --rpc-methods safe --rpc-c… (push) Successful in 35s
deploy / deploy-metrics (push) Successful in 12s
2026-09-03 15:46:59 +00:00