Repository navigation
Support solo daemon pools and report node health - #645
Conversation
Part of #528. Implemented by an operator-run GPT session at the owner's request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Operator: this stays a held draft until RigForge 1.18.1 is tagged (due Fri 2026-11-06, Sat 11-07 at the latest). 1.18.1 is cut from develop, so merging this first would widen that release. After the tag: rebase on develop, run the agent review, and request the owner's approval. |
|
Operator: released to the runner (owner 2026-11-06). New work goes to the local Flash-Next model first; Claude only after three local rounds or for sensitive work. |
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
FAIL What I investigatedReviewed PR #645 (head f5ba818, closes #528, solo daemon pools) against the issue's nine acceptance criteria, its checks, a reverted-fix test run, the topology scan and the diff. The code and unit tests hold: 141 pass at the head and 77 fail with the fix reverted. It returns because the diff changes how the miner config is rendered (rigforge.sh) and what the coordinator feed reports, and no tier4-e2e job was run on the head. The PR body says bench jobs were not submitted.
Reviewed head: What are the gaps
|
|
FAIL What I investigatedReview details are in the private record because they contain sensitive information. Reviewed head: What are the gaps
|
The atomic config install reads config.json back, which blocks on a FIFO. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
PASS What I investigatedRound 3 re-review of rigforge PR #645 (#528, daemon pools) at head e6f831e. The last reviewed head, f5ba818, is in this clone. Since then the worker added one commit (b72dfd2, a 2-line fix to the tests/prove-daemon.py helper), and the rest is a merge of develop-v1.19.0 that resolves both conflicts by keeping both sides. Tier4-e2e jobs 3541 (connect, worker-api, api-impact) and 3542 (network) ran on e6f831e and succeeded. The red rows in jobs 3480 and 3488 at the older head now have owning issues: rigforge#653 and bench-ci#2404. CI is green on all ten checks, unit proof holds (141 passing at the head, 64/77 with the fix reverted), and the topology scan is clean.
Reviewed head: |
Owner brief for
|
The base grew solo daemon pools (#645), the source-drift apply-state check (#609) and JSON doctor reports (#606) after the first sync, which the bench caught as a conflict with the tested head. Resolutions: keep the xmrig overlay alongside the new daemon-pools source and pool keys; keep the overlay doctor line next to the new apply-state check; keep the broadened util/ coverage denominator over the individually named helpers. tests/test-config-apply-state.sh gains a validator stub in its fixture because apply now requires a validation executable; its assertions are unchanged. Co-Authored-By: Claude Code <noreply@anthropic.com>
The #609 generated-configuration report was the only doctor output emitted without a check ID, so the #645 daemon-pool doctor-JSON assertions (all IDs nonempty) turned red once both landed on the base. Label it apply-state; human messages and exit codes unchanged. Co-Authored-By: Claude Code <noreply@anthropic.com>
What's the problem
RigForge drops XMRig's daemon pool settings, rejects daemon URL schemes, and describes every connection as Stratum. Operators cannot configure solo mining or get useful node health information.
How I fixed it
daemon: trueflag from a daemon URL; reject explicit false and incompatible settings before apply changes anything.get_infowith bounded curl timeouts and report height and sync state. Addconnection.mode: "daemon"to the sister feed while retaining the existing Stratum behavior.socks5andtls-fingerprint: the pinned miner ignores them. Document its unauthenticated HTTPS transport, the separate CA verification in doctor's probe, node ownership, and the unsupportedself-select,submit-to-originandspend-secret-keyfields.tests/prove-daemon.pynow renders its proof config to a regular file. The atomic config install merged from develop (Preserve the last valid miner configuration when rendering fails #634) readsconfig.jsonback withcmp, which blocked forever on the helper's FIFO.Here is the proof
Head
e6f831e85811ed3757dd8487a6f099709b53030f:b72dfd2plus a merge ofdevelop-v1.19.0(conflicts in the known-key lists inrigforge.shand the test includes intests/run.sh, both resolved by keeping both sides). After the merge:bash tests/test-daemon-pools.sh141 passed, 0 failed; shellcheck, shfmt and the file-budget gate clean; all ten GitHub checks pass and the PR is mergeable. The bench jobs below markedb72dfd2cover the pre-merge head; the jobs fore6f831efollow.Fix reverted (base
rigforge.sh, same tests):bash tests/test-daemon-pools.sh <(git show origin/develop-v1.19.0:rigforge.sh)gives exit 1, 64 passed and 77 failed.With the fix:
bash tests/test-daemon-pools.shgives exit 0, 141 passed and 0 failed. The new rows cover the apply-timedaemon-downwarning and the doctor daemon check while the miner is stopped.FILE_BUDGET_REQUIRE_BASE=1 bash scripts/lint-file-budget.shpasses. GitHub CI passes on all ten checks: lints, Test suite, End-to-end (Docker), Coverage (kcov + diff-cover), both Stock home setup checks, gitleaks and zizmor.Pinned miner, run at this head: XMRig v6.26.0 at
b2ca72480c58d197e18c885d9fc1a0c8d517e60a, built natively on macOS with RigForge's zero-donation patch (OpenCL, CUDA, MSR, DMI and non-RandomX algorithms off).XMRIG_BIN=<that build> timeout -k 10 400 python3 -B tests/prove-daemon.py --runtime 120gives exit 0:The pinned build accepts all three URL forms (
daemon+http://,daemon+https://, bare host withdaemon: true) under--dry-runwith 0% donation. It fetched three jobs from the cannedget_block_templatenode. Doctor reported height 2286447 as synced, and a slow node produced the bounded warning in 5 s. The run fails atf5ba818(RuntimeError: RigForge renderer timed out, the FIFO hang fixed above).Daemon
/2/summary: the pinned XMRig reports a liveconnectionfor a daemon pool. The run asserts thatconnection.poolequals the configured daemon URL,algoisrx/0andconnection.diffis above 0 (tests/prove-daemon.pylines 338-352). It does not reportconnection.mode(summary_mode_field: nullabove). That is why RigForge's feed derivesconnection.mode: "daemon"from the config.Known limit: doctor's daemon branch (
util/daemon-pools.sh_doctor_daemon_status) reports the node'sget_info, not whether the miner gets block templates. A reachable node with a payout address the node rejects still readsnode connection live; the miner's log shows the template error. Shortcut: node health only; add a miner-side check when XMRig exposes a daemon job error in/2/summary.Bench
tier4-e2eagainst the bench stack with Stratum pools. Atf5ba818:connect,worker-apiandapi-impactpassed in job 3480, andnetworkpassed in job 3487. The red rows are owned by other issues:networkanddashboardexited rc=75 with "busy: unknown") is rigforge#653. Theapi-impacthammer'scurlchildren outlive the phase and hold the rig-lock fd. The same failure hits the develop nightly (bench-ci: develop nightly-suite failures #599, 2026-11-03), and this PR does not touchtests/e2e-pithead.sh.dashboardNOT RUN:E2E_DASH_URL not set) is bench-ci#2404: the bench never supplies the dashboard URL, so the phase cannot run on any head.annotate-rowon the bench host; until then the blocks below still say "no issue linked".At
b72dfd2(pre-merge): job 3500 (connect,worker-api,api-impact, api-impact last to avoid rigforge#653) and job 3501 (network) both succeeded. At the merged heade6f831e: job 3541 (same phases) and job 3542 (network) both succeeded.bench-ci job 3541@e6f831e85811ed3757dd8487a6f099709b53030f · rigforge · tier4-e2e
Generated by
bench-ci evidence 3541@e6f831e85811ed3757dd8487a6f099709b53030f; re-run it to check.bench-ci job 3542@e6f831e85811ed3757dd8487a6f099709b53030f · rigforge · tier4-e2e
Generated by
bench-ci evidence 3542@e6f831e85811ed3757dd8487a6f099709b53030f; re-run it to check.bench-ci job 3500@b72dfd20588f92f26979704ffd663f1f0a565015 · rigforge · tier4-e2e
Generated by
bench-ci evidence 3500@b72dfd20588f92f26979704ffd663f1f0a565015; re-run it to check.bench-ci job 3501@b72dfd20588f92f26979704ffd663f1f0a565015 · rigforge · tier4-e2e
Generated by
bench-ci evidence 3501@b72dfd20588f92f26979704ffd663f1f0a565015; re-run it to check.bench-ci job 3480@f5ba81897f5fa546f63195693ee1b8664286bdf7 · rigforge · tier4-e2e
Generated by
bench-ci evidence 3480@f5ba81897f5fa546f63195693ee1b8664286bdf7; re-run it to check.bench-ci job 3487@f5ba81897f5fa546f63195693ee1b8664286bdf7 · rigforge · tier4-e2e
Generated by
bench-ci evidence 3487@f5ba81897f5fa546f63195693ee1b8664286bdf7; re-run it to check.bench-ci job 3488@f5ba81897f5fa546f63195693ee1b8664286bdf7 · rigforge · tier4-e2e
options: {"phases": ["dashboard"]}
status: completed · conclusion: failure · exit 1 · 1m 40s
baseline verified: yes · rig restored: yes
node guard: not recorded · no comparison recorded
steps: checkout success · reserve success · preflight success · run failure · collect success · restore success · cleanup success
rows: 0 pass · 1 fail · 1 skip (missing 1)
failed rows:
Generated by
bench-ci evidence 3488@f5ba81897f5fa546f63195693ee1b8664286bdf7; re-run it to check.Not run: a daemon-mode
tier4-e2erow (the bench stack serves Stratum only) and thedashboardphase (bench-ci#2404).Review pass (ponytail): nothing cut. The changes since the last review are a two-line test-helper fix.
Closes #528
Draft from an operator-run GPT session (owner request, 2026-11-02). The operator gates it before it leaves draft.
🤖 Generated with Claude Code