You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking issue for the first public release: node + mining + dashboard, multi-operator.
Wallet and Pay are not in this release (see the note at the end).
Rewritten 2026-08-19; section A, Sequence and the naming decision refreshed 2026-08-23. The public release is v2. Everything below was verified against f3736bc33 and the live fleet on
that date. The previous body was substantially wrong — six of its sections described work that is
already done or decisions that the design had already answered. The corrections are kept at the
bottom so the stale items are not re-raised.
What this release is
You already publish signed releases — v1.11.21 is current and SHA256SUMS.txt.asc verifies.
This is not the first artefact. It is the first release where a stranger can run the 9th node.
That is not a feature goal. It is the only path to a pool that ever pays:
pool 100.1 TH/s (sum of own-received share work, 1h, 2026-08-19)
network 912.5 EH/s (difficulty 127,479,855,693,691 at h963,154)
pool share 0.0000110%
expected 0.0058 blocks/year -> ~173 years to ONE block
shard_settled_blocks = 0, winning_miner on zero rounds. No software change moves this number.
More operators is the mechanism, so the release is scoped around admitting them safely.
The scope rule
One rule decides what is in: anything that is currently safe only because we own all 8 nodes
becomes a blocker the moment someone else runs one. Everything else is deferred.
How admission already works (this was an open question; it is not)
Admission is designed and built, not pending a decision:
Elder = MPC contributor (position 1-101 in the ceremony) main.rs:2880
Any node can contribute - first 101 become elders main.rs:6549
MPC ceremony is ossified (101 contributors reached) main.rs:6573
mpc_contributions is keyed by elder_position INTEGER PRIMARY KEY. Live on vm1: 8 contributions
— our own nodes, holding 8 of 101 slots. Ossification caps the elder set, not participation:
node 102 joins normally, it simply does not get the elder share. Node reward weight is:
Capability
Shares
Proven today?
Archive
5
NO — claimed
GhostPay
4
NO — claimed
PublicMining
3
NO — claimed
Reaper
2
yes
Elder
1
yes
Archive(5) + GhostPay(4) + PublicMining(3) + Reaper(2) + Elder(1) = 15 (payout.rs:4644).
Non-elders also vote: widen_voter_set returns the active set whenever active is a superset of
elders, falling back to elders only otherwise.
A. Trust boundary — the actual release blockers
Refreshed 2026-08-23 (second pass). One issue remains open, and what is left on it is ARMING,
not building.
H-7: challenger /24 subnets are self-reported, so the diversity floor is fabricable (was: capability proofs do not prove the capability) #605 — capability proofs do not prove the capability; 12 of 15 shares are unearned.
The only open item in this section. Capability qualification gates the active voter set
(main.rs:3780) as well as reward, so a node claiming Archive + GhostPay + PublicMining takes
12/15 of node-reward weight and a seat, repeatably, at no cost. Bounded today only because
all eight qualified nodes are ours. What is left is two arming decisions. Both gates are built and dormant:
- ADDRESS_PROOF_HEIGHT (H-7) — basis measured twice, holds. 24h to 2026-08-23 across three
nodes: 3,739 passes / 61 failures, 61 of 61 Unreachable, zero cryptographic failures.
Only a cryptographic failure votes FAIL, so arming cannot strip an honest node's subnet.
- ARCHIVE_TX_PROOF_HEIGHT (H-6) — free to arm. Measured 2026-08-23: archive_mode=false
on all eight, so no node claims Archive and none collects the +5. Arming changes the
qualified set by nothing today and is load-bearing the moment slot nine is a stranger.
⛔ GhostPay's +4 must NOT be built — Ghost Pay is replaced by Ghost Wallet and the +4 moves to
running a Wraith coordinator (L2 removal: capability reweight, the CapabilityType wire hazard, and what it reclaims #736).
Closed since the 08-19 rewrite:#589 (Stage 6 Release B — the shard settles from the chain on
every node), #603 (#742), #625, #647 (#741). #411 retitled and deferred — its premise was wrong,
allocation precedes identity; the DoS found while scoping it became #744 → #746.
B. A stranger must be able to run it
Prove all three mining modes end-to-end on a chain — solo, private pool, public pool.
The code is in: Solo mining cannot produce an approved coinbase on mainnet; build_coinbase_solo_mode is unreachable #592 fixed solo coinbase, and f3736bc33 made private_pool approve its own
payouts (single-operator modes skip BFT, keyed on declared mode, never on a live peer count). None of the three has been proven end-to-end on a chain. Regtest cluster is stopped but intact.
Operator onboarding docs. Config templates now exist and are test-gated
(bins/ghost-pool/tests/shipped_config_templates.rs), including config/mainnet-private-pool.toml.
feat(dashboard): build the real /api/v1/swarm/nodes/* fleet-control API #403 — swarm fleet-control API. The fake-success routes are gone (the config route now saves
atomically, errors on failure and calls request_restart()); confirm the remaining routes and
verify live auth + WS relay on a canary, which has never been done.
D. Renames — pre-release, cheap now and expensive after
Mandated by the master spec §3.1. Doing this after a public release means breaking other people's
systemd units and documentation, so it belongs in this release or nowhere.
ghost-pool -> ghost-mining — binary, systemd unit, installer and docs move together.
Product naming: Ghost Core -> Node, Ghost Pool -> Mining, Ghost Pay -> Pay.
Binaries ghostd and ghost-pay are unchanged.
User-facing vocabulary is six words: Node, Mining, Pay, Vault, Ghost Mode, ghost ID.
Reaper, Haze, Shroud, Exorcism and Glyphs become technical-docs trivia and stop being
load-bearing in UI or marketing copy.
E. Not in this release
Wallet, Pay/ghost-mode protocol, #520 threshold-Schnorr SV2 identity, #542/#545 hazed restart and
reorg, and the page-weight items #686 / #687 / #688.
Deploy.done — v1.11.27 on all eight nodes, both binaries, 2026-08-23.
Arm the dormant gates, one per height, spaced.ADDRESS_PROOF_HEIGHT → MESH_ENVELOPE_V2_HEIGHT → ARCHIVE_TX_PROOF_HEIGHT. ⛔ Nothing near PAYOUT_FROM_SHARD_HEIGHT = 964_100; that must be the only variable when it fires.
Section C operational backlog, section D renames, operator docs, release.
⛔ Stage 6 deletion happens BEFORE the release, not after.docs/SHARE_SHARD_BUILD.md was
corrected 2026-08-22: shipping on a binary that still carries the BFT payout path ossifies it.
Release A (v1.11.26) armed the no-vote gate; Release B is #750, open as a draft, +322 /
−5,011, all six R-items complete.
Open decisions — operator only
Release version naming.DECIDED 2026-08-23: the public release is v2. The tag train
is at v1.11.x, so "v1" collided. Pair the rename in section D with the v2 cut — if binaries are
being renamed and re-versioned anyway, doing it once is far cheaper than twice, and Release must ship a canonical config set and a single binary version — deploys standardise neither today #759 wants a
single version across every shipped binary in the same batch.
Both fired. SHARE_ADDR_BIND_HEIGHT = 961_100 and OBSERVED_SETTLEMENT_HEIGHT = 961_400; tip is 963,154 and the fleet is converged past both.
§4 three stale branches to rebase or abandon
Branches deleted; the repo went 69 -> 10 local branches.
§5 B3 fleet-control API returns fabricated success
Real code. The config route saves atomically, returns SAVE_FAILED on error, warns when no path is set, and calls request_restart(). The two remaining string matches are past-tense comments documenting the fix.
8 A records live. All eight nodes are in the mining DNS.
"The genesis signer set" listed as the longest-lead open decision
Answered by the design. Elders are the first 101 MPC ceremony contributors; participation beyond 101 is unlimited. See the admission section above.
§6 λ-sampling outstanding
On main.
Two of these were re-raised during triage on 2026-08-19 because the checklist was read as current.
That is the reason for this rewrite: an inaccurate checklist costs more than no checklist.
Tracking issue for the first public release: node + mining + dashboard, multi-operator.
Wallet and Pay are not in this release (see the note at the end).
Rewritten 2026-08-19; section A, Sequence and the naming decision refreshed 2026-08-23. The public release is v2. Everything below was verified against
f3736bc33and the live fleet onthat date. The previous body was substantially wrong — six of its sections described work that is
already done or decisions that the design had already answered. The corrections are kept at the
bottom so the stale items are not re-raised.
What this release is
You already publish signed releases —
v1.11.21is current andSHA256SUMS.txt.ascverifies.This is not the first artefact. It is the first release where a stranger can run the 9th node.
That is not a feature goal. It is the only path to a pool that ever pays:
shard_settled_blocks = 0,winning_mineron zero rounds. No software change moves this number.More operators is the mechanism, so the release is scoped around admitting them safely.
The scope rule
One rule decides what is in: anything that is currently safe only because we own all 8 nodes
becomes a blocker the moment someone else runs one. Everything else is deferred.
How admission already works (this was an open question; it is not)
Admission is designed and built, not pending a decision:
mpc_contributionsis keyed byelder_position INTEGER PRIMARY KEY. Live on vm1: 8 contributions— our own nodes, holding 8 of 101 slots. Ossification caps the elder set, not participation:
node 102 joins normally, it simply does not get the elder share. Node reward weight is:
Archive(5) + GhostPay(4) + PublicMining(3) + Reaper(2) + Elder(1) = 15(payout.rs:4644).Non-elders also vote:
widen_voter_setreturns the active set whenever active is a superset ofelders, falling back to elders only otherwise.
A. Trust boundary — the actual release blockers
Refreshed 2026-08-23 (second pass). One issue remains open, and what is left on it is ARMING,
not building.
The only open item in this section. Capability qualification gates the active voter set
(
main.rs:3780) as well as reward, so a node claiming Archive + GhostPay + PublicMining takes12/15 of node-reward weight and a seat, repeatably, at no cost. Bounded today only because
all eight qualified nodes are ours.
What is left is two arming decisions. Both gates are built and dormant:
-
ADDRESS_PROOF_HEIGHT(H-7) — basis measured twice, holds. 24h to 2026-08-23 across threenodes: 3,739 passes / 61 failures, 61 of 61
Unreachable, zero cryptographic failures.Only a cryptographic failure votes FAIL, so arming cannot strip an honest node's subnet.
-
ARCHIVE_TX_PROOF_HEIGHT(H-6) — free to arm. Measured 2026-08-23:archive_mode=falseon all eight, so no node claims Archive and none collects the +5. Arming changes the
qualified set by nothing today and is load-bearing the moment slot nine is a stranger.
⛔ GhostPay's +4 must NOT be built — Ghost Pay is replaced by Ghost Wallet and the +4 moves to
running a Wraith coordinator (L2 removal: capability reweight, the CapabilityType wire hazard, and what it reclaims #736).
(
MAX_INBOUND_PER_IP = 8) and H-11's v2 envelope (mesh: bind timestamp and message type into the envelope signature, and persist per-sender replay floors (H-11) #740). ⚠MESH_ENVELOPE_V2_HEIGHT = u64::MAX— dormant. v1.11.27 (deployed fleet-wide 2026-08-23) is what makes every node able to
VERIFY a v2 envelope; arming is a separate, later change.
Closed since the 08-19 rewrite: #589 (Stage 6 Release B — the shard settles from the chain on
every node), #603 (#742), #625, #647 (#741). #411 retitled and deferred — its premise was wrong,
allocation precedes identity; the DoS found while scoping it became #744 → #746.
B. A stranger must be able to run it
The code is in: Solo mining cannot produce an approved coinbase on mainnet; build_coinbase_solo_mode is unreachable #592 fixed solo coinbase, and
f3736bc33madeprivate_poolapprove its ownpayouts (single-operator modes skip BFT, keyed on declared mode, never on a live peer count).
None of the three has been proven end-to-end on a chain. Regtest cluster is stopped but intact.
Every payout proposal rejected: vm1's node_payout_address is also a miner's address #587; surfacing it in the UI stops an operator recreating it.
(
bins/ghost-pool/tests/shipped_config_templates.rs), includingconfig/mainnet-private-pool.toml.atomically, errors on failure and calls
request_restart()); confirm the remaining routes andverify live auth + WS relay on a canary, which has never been done.
C. Unattended operation
.bakpruning reclaimed ~8.6 GB fleet-wide, and deleting the published UTXO snapshot took vm1from 90% to 73%. Not structurally fixed — nothing prunes the backups automatically.
maxconnectionsas a node setting:4444binds but never applies its difficulty floorintegration_tests_sv2targets compile but never run. ⚠ related and worthreading first: five
ghost-poolregtest tests were passing by skipping — hardcodedcredentials matched no shipped config, and one could never have passed at all. Fixed in Make the regtest integration tests actually run instead of passing by skipping #743.
apt-getstep hanging, not the builds;caching the
.debs(ci: stop a hungapt-getfrom eating a job's entire timeout budget #693, ci(release): cache the .debs here too — #693 never reachedrelease.yml#704) took 45-minute hangs to 1-20s. ⚠ a job that exceedstimeout-minutesreports as cancelled, not failure, which is why this read as flakyrather than slow.
build_webhook_user_identitysplits on the first dot,extract_worker_nameon the last — multi-dot workers collapse #481 closed.D. Renames — pre-release, cheap now and expensive after
Mandated by the master spec §3.1. Doing this after a public release means breaking other people's
systemd units and documentation, so it belongs in this release or nowhere.
ghost-pool->ghost-mining— binary, systemd unit, installer and docs move together.Binaries
ghostdandghost-payare unchanged.Reaper, Haze, Shroud, Exorcism and Glyphs become technical-docs trivia and stop being
load-bearing in UI or marketing copy.
E. Not in this release
Wallet, Pay/ghost-mode protocol, #520 threshold-Schnorr SV2 identity, #542/#545 hazed restart and
reorg, and the page-weight items #686 / #687 / #688.
Sequence
Rewritten 2026-08-23 (second pass).
land the small branches; fix CI is failing on main #685done.Deploy.done — v1.11.27 on all eight nodes, both binaries, 2026-08-23.ADDRESS_PROOF_HEIGHT→MESH_ENVELOPE_V2_HEIGHT→ARCHIVE_TX_PROOF_HEIGHT. ⛔ Nothing nearPAYOUT_FROM_SHARD_HEIGHT = 964_100; that must be the only variable when it fires.BEFORE the public release: the moment a stranger runs node nine, "whatever that operator's file
says" becomes the trust boundary.
⛔ Stage 6 deletion happens BEFORE the release, not after.
docs/SHARE_SHARD_BUILD.mdwascorrected 2026-08-22: shipping on a binary that still carries the BFT payout path ossifies it.
Release A (
v1.11.26) armed the no-vote gate; Release B is #750, open as a draft, +322 /−5,011, all six R-items complete.
Open decisions — operator only
Release version naming.DECIDED 2026-08-23: the public release is v2. The tag trainis at
v1.11.x, so "v1" collided. Pair the rename in section D with the v2 cut — if binaries arebeing renamed and re-versioned anyway, doing it once is far cheaper than twice, and Release must ship a canonical config set and a single binary version — deploys standardise neither today #759 wants a
single version across every shipped binary in the same batch.
result_large_err— unblocks 34 of ci: make clippy blocking (-D warnings) — 221 warnings to clear first #401's remaining lints.build_webhook_user_identitysplits on the first dot,extract_worker_nameon the last — multi-dot workers collapse #481 — does a multi-dot payout address count as INVALID?Corrections to the previous body — do not re-raise these
SHARE_ADDR_BIND_HEIGHT = 961_100andOBSERVED_SETTLEMENT_HEIGHT = 961_400; tip is 963,154 and the fleet is converged past both.SAVE_FAILEDon error, warns when no path is set, and callsrequest_restart(). The two remaining string matches are past-tense comments documenting the fix.pool.bitcoinghost.orgTwo of these were re-raised during triage on 2026-08-19 because the checklist was read as current.
That is the reason for this rewrite: an inaccurate checklist costs more than no checklist.