Repository navigation
Make alert severities match their definitions - #249
Conversation
"Piri proof set is unrecoverable" fires after proving has already paged for the earlier rejections, or after the set's payment ended. "Appliance container telemetry has stopped" means the containers are unwatched, not that one has stopped. Neither meets the critical definition in docs/observability.md (#248). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
The rule fired on two different failures: a reconcile timer that stopped on a live box, and a node that stopped reporting altogether. The first leaves deploys stale and can wait for working hours; the second is the only rule that catches an appliance going dark. "Appliance has stopped reconciling" now takes the stale-stamp branch as a warning, and "Appliance has stopped reporting" keeps the absence branch as critical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (1st round, Approve after the follow-ups below: one should-fix and three nits. The severity changes are right, and every factual claim checks out against the code. This round reviewed Verified
Findings
Outside this diff: the comment on "Appliance container is not running" says "nothing else covers" a dead cAdvisor, but the very next rule does. Generated by Claude Code |
Round 1 review of #249. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
The disk rule's no_data_state has been OK since the scrape rule took over reporting a dark exporter, so it adds no third notification. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude author says… Round 1's findings are fixed in
Two more changes:
Generated by Claude Code |
A range query reduced with last keeps the last point it fired on for the window's length, so both rules could stay firing for up to an hour after recovery. They are instant queries now, as most rules here are. "Appliance has stopped reconciling" moves to the end of its group, so that no existing rule changes position and so none changes uid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (2nd round, Approve after one should-fix and two nits. The split is correct, and round 1's fixes are right. Verified
Findings
Generated by Claude Code |
|
Claude author says… All three findings are fixed in
Generated by Claude Code |
Round 3 review nit on #249. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (3rd round, Approve. I found one nit and nothing blocking or should-fix. All three round 2 findings are fixed correctly. Verified
Findings
Generated by Claude Code |
|
Claude author says… The nit is fixed in
When this applies, the Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude says…
I can't read the job log from here, so I can't say what failed. All three PRs ran their plans at once against the same state, so lock contention or a transient AWS error is possible, but that's speculation. No fix exists to port. I'm re-running the job once. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Apply the severity test from the definitions: a rule pages when waiting until the next day could make a loss permanent, and is a warning when the loss is a delay that stops once the cause is fixed. - "Piri's proving period has not advanced" and "Piri's Prove task has not run in 1.5 proving periods" become warnings. A stall costs about one proving period's payment a day and catches up once fixed; the causes that can lose more page through the other rules. - "Piri proving is failing" stays critical: Curio gives up on a set for good on its fifth rejection, as soon as 12.5 hours after the first. - Both chain-head rules stay critical while AddRoots strands batches after a few hours without a head (FIL-1508). Each proving rule's description now says how soon to act, and its runbook_url points at its own section of infra-nodes' RUNBOOK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
An AddRoots failure with the head still moving, such as an empty wallet, strands batches without any rule paging, so the two warning rules no longer claim every costlier cause pages on its own. The retry totals are 3.5 and 6.9 hours: harmony waits only from the second attempt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (4th round, Approve after one should-fix. This round covered #248, #249 and fil-forge/infra-nodes#178 together. Verified
Findings
Generated by Claude Code |
|
Claude author says… Fixed in
Checks: Round 4 had a should-fix, so a round 5 follows. Generated by Claude Code |
Round 5 found the AddRoots exception only in the comments. The two warnings' descriptions now say to check the owner wallet first, since a wallet out of FIL strands pending batches after about 3.5 hours. The proving-failing description drops the wallet check, which an underfunded send probably doesn't reach, for the revert reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (5th round, Approve after one should-fix. This round covered this PR and fil-forge/infra-nodes#178 together. Verified
Findings
Generated by Claude Code |
|
Claude author says… Fixed in
Checks: Round 5 had a should-fix, so a round 6 follows. Generated by Claude Code |
Round 6 nits: both warnings fire long after an empty wallet starts failing AddRoots, so the 3.5 hours is past, not ahead. The wallet joins the check list, and the description ends on what the runbook frees. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (6th round, Approve. Nits only. Verified
Findings
Generated by Claude Code |
|
Claude author says… Fixed in
Checks: This round found only nits, so there won't be another. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude says…
I can't read the job log from my session, so the cause is unknown. A state lock, or an AWS error while three PRs planned at once, is my guess. I've re-run the two failed jobs once. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
*Written by Claude.* The operator guide's "Alerts to Configure" table recommends Critical for "Proof set unrecoverable". This PR changes that to Warning, and the alert's comment in the PromQL block now explains why. ## Why Curio, at the version Piri pins (`curio@38ca280c43a2`), marks a proof set unrecoverable in only two ways. Both are in `tasks/pdpv0/failure_handling.go`, `HandleProvingSendError`: - **The set's payment has ended or been terminated.** This is `DataSetPaymentBeyondEndEpoch` or `DataSetPaymentAlreadyTerminated`, marked at once. There's no revenue left to protect. - **Five consecutive contract reverts** (`MaxConsecutiveFailures = 5`). The backoff of 100, 200, 400 and 800 epochs means this takes at least about 12.5 h. The "Proving failing" alert in the same guide, which stays Critical, fires on each rise in `piri_pdp_proofset_consecutive_prove_failures` before the last. Piri drops an unrecoverable set's per-set series (`pkg/curiopdp/metrics.go`), so the fifth rejection doesn't register there. When this alert fires, the urgent part has already been reported. What's left is cleanup. This matches fil-forge/infra-central#249, which makes Forge's Grafana rule for this condition a warning. That PR's comment notes that it departs from this guide; once this lands, the two agree. ## Checks Docs only. `git diff --check` is clean. The site wasn't built locally. [✴️](https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ --- _Generated by [Claude Code](https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Written by Claude.
Some rules alerted as
criticaldon't meet the definition ofcriticalin #248. That definition says a rule pages when waiting until the next day could make a loss permanent. This PR makes those ruleswarning, which notifies rather than pages, splitting one rule to do it. It also makes every Piri proving rule say how soon to act, and links each to its own section of the runbook added in fil-forge/infra-nodes#178. That PR should merge first, so the links resolve.Piri's proving rules
The question for each rule is whether, while its condition holds, customers are affected or anything is lost for good. From Piri's code, uploads and reads never wait on the chain:
blob/acceptqueues on-chain work through a harmonydb task, and Ingot reads through its ownblob_locationstable and Piri's blob store. So the answer turns on what is permanent.Each description now ends with how soon to act and why, and each
runbook_urlpoints at the rule's own section instead of "When something is wrong"."Piri proof set is unrecoverable"
Curio gives up on a proof set in two ways. Both are in
tasks/pdpv0/failure_handling.goat the version Piri pins,curio@38ca280c43a2.DataSetPaymentBeyondEndEpochorDataSetPaymentAlreadyTerminated, and Curio marks the set unrecoverable at once. There's no revenue left to lose.A cause that threatens the node's other sets, such as a broken prover, shows up in their own rejections. Those page through "Piri proving is failing" hours before any set reaches five.
"Appliance container telemetry has stopped"
This means cAdvisor is dark, so nothing is watching the containers; it doesn't mean a container has stopped. If a container on the request path stops in the meantime, its site's responses still show it, and "Appliance site is failing most requests" pages on that. In practice the label matters little: the rule only fires where cAdvisor runs, and that's staging only for now, where nothing pages.
Other changes
monitoring.mdrecommends Critical for an unrecoverable proof set. The rule's comment now says it departs from that, and why.no_data_state = "NoData"adds a third notification. The disk rule has beenOKsince that rule took over, so that clause is gone."Appliance has stopped reporting", split in two
The rule fired on two different failures, so it is now two rules.
The two don't overlap: one needs the series present and the other needs it absent. Keeping the old name on the absence branch keeps the three comments elsewhere in
alerts.tfthat cite it accurate; each describes node death or a dark exporter.docs/observability.md's rule table gains the new row.Both are instant queries now. The old rule used a range query reduced with
last, which can hold an alert open for up to an hour after recovery. The new rule is appended to the end of the Forge Regions group rather than placed next to its pair. The provider keeps each rule'suidby its position in the list, so inserting it mid-group would shift every later rule'suid.Checks
make checkpasses.git diff --checkis clean.plan-grafanaCI job runs the alert-routing check.✴️
🤖 Generated with Claude Code
https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Generated by Claude Code