Skip to content

Support solo daemon pools and report node health - #645

Merged
pithead-reviewer[bot] merged 7 commits into
develop-v1.19.0from
astra/528-rigforge
Nov 8, 2026
Merged

pithead-reviewer[bot] merged 7 commits into
develop-v1.19.0from
astra/528-rigforge

Conversation

@pithead-developer

@pithead-developer pithead-developer Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

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

  • Validate and render daemon pools, their two millisecond timers, and the optional ZMQ setting. Infer the required daemon: true flag from a daemon URL; reject explicit false and incompatible settings before apply changes anything.
  • Canonicalize integral numbers for XMRig and keep timers in the exact JSON integer range shared by supported jq versions.
  • Check daemon get_info with bounded curl timeouts and report height and sync state. Add connection.mode: "daemon" to the sister feed while retaining the existing Stratum behavior.
  • Reject daemon socks5 and tls-fingerprint: the pinned miner ignores them. Document its unauthenticated HTTPS transport, the separate CA verification in doctor's probe, node ownership, and the unsupported self-select, submit-to-origin and spend-secret-key fields.
  • tests/prove-daemon.py now 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) reads config.json back with cmp, which blocked forever on the helper's FIFO.
  • Add focused regressions and an opt-in canned-node proof using the pinned miner. Existing test assertions and Stratum contract fixtures are unchanged.

Here is the proof

Head e6f831e85811ed3757dd8487a6f099709b53030f: b72dfd2 plus a merge of develop-v1.19.0 (conflicts in the known-key lists in rigforge.sh and the test includes in tests/run.sh, both resolved by keeping both sides). After the merge: bash tests/test-daemon-pools.sh 141 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 marked b72dfd2 cover the pre-merge head; the jobs for e6f831e follow.

  • 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.sh gives exit 0, 141 passed and 0 failed. The new rows cover the apply-time daemon-down warning and the doctor daemon check while the miner is stopped.

  • FILE_BUDGET_REQUIRE_BASE=1 bash scripts/lint-file-budget.sh passes. 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 120 gives exit 0:

    {"configured_mode": "daemon", "dry_run_forms": {"bare+daemon": "pass", "daemon+http": "pass", "daemon+https": "pass"}, "height": 2286447, "jobs": 3, "slow_doctor_seconds": 5.0, "summary_mode_field": null, "synchronized": true}
    

    The pinned build accepts all three URL forms (daemon+http://, daemon+https://, bare host with daemon: true) under --dry-run with 0% donation. It fetched three jobs from the canned get_block_template node. Doctor reported height 2286447 as synced, and a slow node produced the bounded warning in 5 s. The run fails at f5ba818 (RuntimeError: RigForge renderer timed out, the FIFO hang fixed above).

  • Daemon /2/summary: the pinned XMRig reports a live connection for a daemon pool. The run asserts that connection.pool equals the configured daemon URL, algo is rx/0 and connection.diff is above 0 (tests/prove-daemon.py lines 338-352). It does not report connection.mode (summary_mode_field: null above). That is why RigForge's feed derives connection.mode: "daemon" from the config.

  • Known limit: doctor's daemon branch (util/daemon-pools.sh _doctor_daemon_status) reports the node's get_info, not whether the miner gets block templates. A reachable node with a payout address the node rejects still reads node 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-e2e against the bench stack with Stratum pools. At f5ba818: connect, worker-api and api-impact passed in job 3480, and network passed in job 3487. The red rows are owned by other issues:

    • Job 3480's red row (network and dashboard exited rc=75 with "busy: unknown") is rigforge#653. The api-impact hammer's curl children 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 touch tests/e2e-pithead.sh.
    • Job 3488's red row (dashboard NOT 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.
    • Linking those issues on the rows needs a bench maintainer to run annotate-row on 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 head e6f831e: job 3541 (same phases) and job 3542 (network) both succeeded.

bench-ci job 3541@e6f831e85811ed3757dd8487a6f099709b53030f · rigforge · tier4-e2e

  • options: {"phases": ["connect", "worker-api", "api-impact"]}
  • status: completed · conclusion: success · exit 0 · 4m 50s
  • baseline verified: yes · rig restored: yes
  • node guard: not recorded · no comparison recorded
  • steps: checkout success · reserve success · preflight success · run success · collect success · restore success · cleanup success
  • rows: 11 pass · 0 fail · 0 skip
    Generated by bench-ci evidence 3541@e6f831e85811ed3757dd8487a6f099709b53030f; re-run it to check.

bench-ci job 3542@e6f831e85811ed3757dd8487a6f099709b53030f · rigforge · tier4-e2e

  • options: {"phases": ["network"]}
  • status: completed · conclusion: success · exit 0 · 2m 52s
  • baseline verified: yes · rig restored: yes
  • node guard: not recorded · no comparison recorded
  • steps: checkout success · reserve success · preflight success · run success · collect success · restore success · cleanup success
  • rows: 10 pass · 0 fail · 0 skip
    Generated by bench-ci evidence 3542@e6f831e85811ed3757dd8487a6f099709b53030f; re-run it to check.

bench-ci job 3500@b72dfd20588f92f26979704ffd663f1f0a565015 · rigforge · tier4-e2e

  • options: {"phases": ["connect", "worker-api", "api-impact"]}
  • status: completed · conclusion: success · exit 0 · 4m 42s
  • baseline verified: yes · rig restored: yes
  • node guard: not recorded · no comparison recorded
  • steps: checkout success · reserve success · preflight success · run success · collect success · restore success · cleanup success
  • rows: 11 pass · 0 fail · 0 skip
    Generated by bench-ci evidence 3500@b72dfd20588f92f26979704ffd663f1f0a565015; re-run it to check.

bench-ci job 3501@b72dfd20588f92f26979704ffd663f1f0a565015 · rigforge · tier4-e2e

  • options: {"phases": ["network"]}
  • status: completed · conclusion: success · exit 0 · 2m 30s
  • baseline verified: yes · rig restored: yes
  • node guard: not recorded · no comparison recorded
  • steps: checkout success · reserve success · preflight success · run success · collect success · restore success · cleanup success
  • rows: 9 pass · 0 fail · 0 skip
    Generated by bench-ci evidence 3501@b72dfd20588f92f26979704ffd663f1f0a565015; re-run it to check.

bench-ci job 3480@f5ba81897f5fa546f63195693ee1b8664286bdf7 · rigforge · tier4-e2e

  • options: {"phases": ["connect", "worker-api", "api-impact", "network", "dashboard"]}
  • status: completed · conclusion: failure · exit 1 · 4m 49s
  • 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: 11 pass · 1 fail · 0 skip
  • failed rows:
    • bench-ci: failure at run (exit 1) (no issue linked)
      Generated by bench-ci evidence 3480@f5ba81897f5fa546f63195693ee1b8664286bdf7; re-run it to check.

bench-ci job 3487@f5ba81897f5fa546f63195693ee1b8664286bdf7 · rigforge · tier4-e2e

  • options: {"phases": ["network"]}
  • status: completed · conclusion: success · exit 0 · 2m 33s
  • baseline verified: yes · rig restored: yes
  • node guard: not recorded · no comparison recorded
  • steps: checkout success · reserve success · preflight success · run success · collect success · restore success · cleanup success
  • rows: 9 pass · 0 fail · 0 skip
    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:

    • bench-ci: failure at run (exit 1) (no issue linked)
      Generated by bench-ci evidence 3488@f5ba81897f5fa546f63195693ee1b8664286bdf7; re-run it to check.
  • Not run: a daemon-mode tier4-e2e row (the bench stack serves Stratum only) and the dashboard phase (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

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>
@pithead-developer pithead-developer Bot added the operator-action Needs the operator's hands, not an answer: nothing waits on it and no ruling clears it label Nov 3, 2026
@pithead-developer

Copy link
Copy Markdown
Contributor Author

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.

@pithead-developer pithead-developer Bot added this to the v2.x - post-GA milestone Nov 3, 2026
@pithead-developer pithead-developer Bot added stage/operator parked for the operator and removed operator-action Needs the operator's hands, not an answer: nothing waits on it and no ruling clears it labels Nov 3, 2026
@pithead-developer

Copy link
Copy Markdown
Contributor Author

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.

@pithead-developer pithead-developer Bot added stage/needs-work returned by the reviewer, red CI, or conflicts with the base and removed stage/operator parked for the operator labels Nov 6, 2026
@pithead-developer
pithead-developer Bot changed the base branch from develop to develop-v1.19.0 November 7, 2026 07:23
pithead-developer[bot] and others added 2 commits November 7, 2026 01:24
@pithead-developer pithead-developer Bot added stage/in-progress stage/needs-check and removed stage/needs-work returned by the reviewer, red CI, or conflicts with the base stage/in-progress stage/needs-check labels Nov 7, 2026
pithead-developer[bot] and others added 2 commits November 7, 2026 02:32
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@pithead-reviewer

Copy link
Copy Markdown
Contributor

FAIL

What I investigated

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

  • gh pr view 645: head f5ba818, base develop-v1.19.0 (same commit as origin/develop, b1c25d6), draft, author app/pithead-developer; issue Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528 author VijitSingh97

  • gh pr checks 645 --json: 10 of 10 SUCCESS (test suite, end-to-end Docker, coverage, shellcheck+shfmt, markdownlint, yamllint, both stock-home setups, gitleaks, zizmor); none skipped

  • gh run view 42356157860: headSha f5ba818…, conclusion success; the test suite job log contains all five '== unit: daemon … (Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528) ==' sections (log lines 2853-2995), so tests/daemon-pools.sh runs in CI. tests/run.sh sources it, which is the existing pattern (onion-proxy.sh, test-control-upgrade.sh)

  • bash tests/test-daemon-pools.sh at head: 'daemon pool tests: 141 passed, 0 failed', rc=0

  • same test against a scratch copy with rigforge.sh reverted to b1c25d6 and util/daemon-pools.sh removed: '64 passed, 77 failed', rc=1 (first failure: 'daemon+http URL accepted (Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528)')

  • bench jobs quoted in the PR body: none ('Bench and hardware jobs were not submitted; the worker-to-coordinator hardware contract remains unrun')

  • detect-topology.py over the PR body, PR comments, PR review comments (empty) and Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528 comments: 'clean', rc=0

  • git diff b1c25d6 HEAD (*.sh, *.py): no added explanatory comments (only shellcheck directives); explanatory comments inside the edited hunks were deleted

  • docs/dev/file-budget.tsv unchanged; rigforge.sh 6293 lines (ceiling 6303), tests/run.sh 9552 (ceiling 9557)

  • ls of the PR's locally built XMRig binary: No such file or directory, so the pinned-miner proof cannot be re-run; the Stratum parity harness is also stated as removed

  • PR body, 'Here is the proof': The test counts are stale. The body quotes 138 passed (head) and 66/72 (reverted); at f5ba818 the result is 141/0 and 64/77. Refresh them in place.

  • PR body, Stratum parity and prove-daemon runs: The Stratum byte-identity proof and the pinned-XMRig job/doctor proof rest on temporary scripts and a self-built binary that have been deleted, so neither can be re-run. The body also doesn't answer the issue's open question: does the pinned XMRig report a live connection in /2/summary for a daemon pool? The answer matters because doctor's daemon branch (rigforge.sh:5474, util/daemon-pools.sh:61-81) checks only the node's get_info and never the miner's own status. If the node is reachable but the miner cannot get block templates (a bad payout user, for example), doctor still prints 'node connection live'. Record the answer in the body; the tier4 job should show the Stratum side.

Reviewed head: f5ba81897f5fa546f63195693ee1b8664286bdf7.

What are the gaps

  • rigforge.sh:461: There is no tier4-e2e job on the head. The diff changes how the miner config is rendered (rigforge.sh:461, :467), the sister-feed contract the coordinator reads (rigforge.sh:5310, connection.mode) and the apply/doctor pool checks. Config rendering, miners and the worker-to-coordinator contract need a tier4-e2e job (targeted or matrix) that built and deployed this head. The PR body says no bench job was submitted. Submit one on the current head that covers the RigForge worker against the bench stack, with Stratum pools, and quote its bench-ci evidence <id>@<sha> block. CI's green container e2e and the local parity runs do not replace it.

@pithead-developer pithead-developer Bot added stage/bench-testing its issue waits on a queued or running tier-4 bench job and removed stage/in-review a reviewer session is on it now labels Nov 7, 2026
@pithead-developer pithead-developer Bot removed the stage/bench-testing its issue waits on a queued or running tier-4 bench job label Nov 7, 2026
@pithead-developer pithead-developer Bot added the stage/in-review a reviewer session is on it now label Nov 7, 2026
@pithead-reviewer

Copy link
Copy Markdown
Contributor

FAIL

What I investigated

Review details are in the private record because they contain sensitive information.

Reviewed head: f5ba81897f5fa546f63195693ee1b8664286bdf7.

What are the gaps

  • The worker must address the findings in the private review record.

The atomic config install reads config.json back, which blocks on a FIFO.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@pithead-developer pithead-developer Bot added stage/in-progress stage/bench-testing its issue waits on a queued or running tier-4 bench job and removed stage/in-review a reviewer session is on it now stage/in-progress labels Nov 7, 2026
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@pithead-developer pithead-developer Bot added stage/in-progress stage/bench-testing its issue waits on a queued or running tier-4 bench job stage/in-review a reviewer session is on it now and removed stage/bench-testing its issue waits on a queued or running tier-4 bench job stage/in-progress labels Nov 7, 2026
@pithead-reviewer

Copy link
Copy Markdown
Contributor

PASS

What I investigated

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

  • git cat-file -e f5ba818 succeeded. git log --no-merges f5ba818..e6f831e: only b72dfd2 is the worker's. git branch -r --contains puts cbca1a0, 65f4587 and 39526ae on origin/develop-v1.19.0, and e6f831e^2 == origin/develop-v1.19.0 (cbca1a0).

  • git show b72dfd2: tests/prove-daemon.py no longer uses a FIFO and non-blocking read. It reads config.json as a regular file after the exit-status check. No comments added. py_compile is OK.

  • git show --remerge-diff e6f831e: rigforge.sh _warn_unknown_config_keys keeps shared_host in known and the four daemon keys in known_pool. tests/run.sh keeps the Sister feed: report appliance mode and the baked RIGFORGE_REF stamp, so a coordinator can tell an appliance rig and stop offering it the git upgrade #452 appliance-feed asserts and the daemon-pools include. Both resolutions are correct; no hunk is invented.

  • bench-ci evidence 3541@e6f831e… (exit 0): conclusion success, rows 11 pass, 0 fail. Matches the PR block. bench-ci log 3541 shows checkout of e6f831e in the rig install tree, then connect passed 3, worker-api 5 and api-impact 3 assertions.

  • bench-ci evidence 3542@e6f831e… (exit 0): conclusion success, rows 10 pass, 0 fail. Matches the PR block. The log shows network passed 10 assertions, including the sister /2/summary wire-superset row and the ACCESS_TOKEN and pools[].pass leak sweeps, with the rig restored after.

  • bench-ci evidence 3500@b72dfd2 and 3501@b72dfd2 (exit 0): both success, 11/0 and 9/0. They match the body, which labels them pre-merge.

  • Round 2 return (no tier4-e2e on the head): fixed. Jobs 3541 and 3542 ran on the current head with conclusion success.

  • Round 2 return (3480 red row unowned): answered. gh issue view 653 is OPEN, by the pithead-developer App, titled 'api-impact hammer curls outlive the phase and hold the rig lock, later phases fail rc=75', and cites job 3480@f5ba818 and the 2026-11-03 nightly. The PR does not touch tests/e2e-pithead.sh's hammer.

  • Round 2 return (3488 dashboard NOT RUN, unowned): answered. bench-ci#2404 (prefetched, OPEN, by the pithead-developer App) owns the missing E2E_DASH_URL input and cites job 3488@f5ba818. The phase cannot run on any head until it is fixed.

  • Round 2 note (stale counts): holds. bash tests/test-daemon-pools.sh at the head exits 0 with '141 passed, 0 failed'. With base rigforge.sh dropped into a scratch git archive e6f831e copy, it exits 1 with '64 passed, 77 failed'.

  • Round 2 note (/2/summary and doctor limit): answered in the body. tests/prove-daemon.py:349-352 asserts connection.pool, algo rx/0 and diff>0, and the body states doctor's node-only limit.

  • Round 2 note (pinned-miner run at head): the body now quotes a run at e6f831e with all three URL forms passing. I could not re-run it: no pinned XMRig build exists on this Mac. This remains a note.

  • FILE_BUDGET_REQUIRE_BASE=1 bash scripts/lint-file-budget.sh: 'file budget OK', exit 0.

  • gh pr checks 645 --json: 10/10 pass. These are yamllint, markdownlint, shellcheck+shfmt, Test suite, End-to-end (Docker), Coverage, Stock home setup (historical/current), gitleaks and zizmor. None were skipped.

  • detect-topology.py over the PR body, PR comments, review comments and issue Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528 comments: 'clean', exit 0.

  • Ponytail pass over the diff since f5ba818: the worker's change deletes the FIFO machinery (net -4 lines). Nothing to cut. No comments were added in the edited hunks.

  • PR body, 'Fix reverted' bullet: The quoted revert command bash tests/test-daemon-pools.sh <(git show origin/develop-v1.19.0:rigforge.sh) no longer runs at e6f831e. Base rigforge.sh now sources util/shared-host.sh relative to its own path ('/dev/fd/util/shared-host.sh: No such file or directory'). The quoted counts reproduce only with base rigforge.sh placed in a checkout of the head (64 passed, 77 failed, exit 1). Update the command in place.

  • PR body, evidence blocks for jobs 3480 and 3488: Both red rows still print 'no issue linked'. The owning issues (rigforge#653, bench-ci#2404) are named only in the prose. A bench maintainer should annotate the rows.

  • tests/prove-daemon.py; issue Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum #528 'Bounded proof on the pinned miner': The pinned-miner run at e6f831e rests on a self-built binary that the reviewer cannot reproduce here. No bench job covers daemon mode, because the bench serves only Stratum pools. The body discloses this.

Reviewed head: e6f831e85811ed3757dd8487a6f099709b53030f.

@pithead-reviewer
pithead-reviewer Bot marked this pull request as ready for review November 7, 2026 17:18
@pithead-developer pithead-developer Bot added stage/awaiting-merge the reviewer's PASS is on the head; merging when checks and the base allow and removed stage/in-review a reviewer session is on it now labels Nov 7, 2026
@pithead-reviewer

Copy link
Copy Markdown
Contributor

Owner brief for e6f831e85811

What it does. Lets an operator mine solo straight to their own Monero node by configuring a daemon pool (a daemon+http:// or daemon+https:// URL, or a bare host with daemon: true). Doctor and apply now check the node's get_info and report its height and sync state instead of Stratum "shares accepted" wording. The sister feed adds connection.mode: "daemon" for daemon connections, and Stratum rigs behave as before.

Why. Closes #528 (milestone v2.x - post-GA, low priority, optional advanced mode). Before this, RigForge dropped the daemon keys with an unknown-field warning, rejected scheme-prefixed URLs, and described every connection as Stratum, so solo mining could not be expressed or checked.

Risk. Low. Stratum rigs, including Pithead rigs, take the same paths as before. The change touches pool validation, miner config rendering, and the apply, doctor and feed code in rigforge.sh. Known limit, documented in the PR: doctor reports node health only, so a reachable node that rejects the payout address still reads as live. Daemon HTTPS encrypts but does not authenticate the peer. Nothing irreversible.

Proof. CI: 11 success. Reviewer: PASS at e6f831e by pithead-reviewer, round 3 (recorded 2026-11-07T17:18:10Z). Bench: job 3541: success on the head; job 3542: success on the head; job 3500: success on b72dfd2, not the head; job 3501: success on b72dfd2, not the head; job 3480: failure on f5ba818, not the head; job 3487: success on f5ba818, not the head; and 1 more.

What to check.

  • rigforge.sh:462-472: the new jq pass that infers daemon: true, canonicalizes numbers, and the _validate_pool_url call. This is the Stratum-regression-sensitive spot, because every pool goes through it.
  • rigforge.sh:5318-5319 and _pool_conn_status (about 5364): the feed adds connection.mode only when an active daemon pool is found. Stratum output should stay byte-identical.
  • util/daemon-pools.sh: the new file (97 lines), covering URL validation, the bounded curl get_info call, and the rejection of socks5 and tls-fingerprint on daemon pools.
  • The PR body's revert command no longer runs as written at this head, so the reviewer-verified 64/77 result needs base rigforge.sh placed inside a checkout of the head.

Verdict. merge

@pithead-reviewer
pithead-reviewer Bot merged commit 4ae7fb8 into develop-v1.19.0 Nov 8, 2026
11 checks passed
@pithead-reviewer
pithead-reviewer Bot deleted the astra/528-rigforge branch November 8, 2026 00:56
pithead-developer Bot pushed a commit that referenced this pull request Nov 8, 2026
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>
pithead-developer Bot pushed a commit that referenced this pull request Nov 8, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stage/awaiting-merge the reviewer's PASS is on the head; merging when checks and the base allow

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Solo mining is impossible: daemon, daemon-*, self-select, submit-to-origin, spend-secret-key are dropped and every check assumes Stratum

1 participant