Commit 2a3fec8
A failure we provoked is not a failure of the host
Following up on "the data seems thin": it was, and for two reasons worth
separating.
**Of the seed's 85 transfers, six are real and seventy-nine are zero-value
address-poisoning dust.** A 6% signal-to-noise ratio, which the `poisoning`
analyzer already reports and which is the honest reason the number looked
both large and empty.
**And two of those six were something I missed by hand.** Tracing manually I
scanned forward from the exploit block, so I never saw the funding: 1,000
then 115,495 USDC arriving from 0xa16f5ba4…8968 two thousand blocks *before*
the attack, and 116,495 going out to the attack contract. That address is not
just the downstream hop I had it as --- it staked the attacker and took the
proceeds back. The tool found it because it scans a window rather than
following a hunch.
Expanding the counterparties then failed, and the cause was mine. The span
widens on success up to a ceiling; at 40,000 blocks one endpoint times out,
and a timeout is indistinguishable from an unwell host, so it counted toward
the circuit breaker. Four concurrent chunks each provoking one took down a
node answering in under a second.
`CircuitBreaker.forgive` takes back a single recorded failure, for a caller
that caused it and is responding to it. Deliberately not `record_success`,
which clears the tally: a host genuinely failing in between should not have
its slate wiped by an unrelated probe. And the ceiling drops from 40,000 to
20,000, which is a measured value --- the same endpoint served 20,000 in
seconds --- rather than an aspiration.
The breaker call is guarded with `getattr`, because `client` is typed `Any`
and a test double need not carry one. A scan must not fail because the thing
it was being polite to is absent; two tests caught that immediately.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXWQ25VgFeMuuMhGWjvdof1 parent 8764f2a commit 2a3fec8
2 files changed
Lines changed: 38 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
78 | | - | |
79 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
80 | 82 | | |
81 | 83 | | |
82 | 84 | | |
| |||
567 | 569 | | |
568 | 570 | | |
569 | 571 | | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
570 | 583 | | |
571 | 584 | | |
572 | 585 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
219 | 219 | | |
220 | 220 | | |
221 | 221 | | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
222 | 245 | | |
223 | 246 | | |
224 | 247 | | |
| |||
0 commit comments