Fix PR #48 review finding: Doppler horizon compounding - #50
Merged
Merged
Conversation
Each returning dropped seed doubled one shared horizon (N returns -> 2^N), disabling abandonment. The dropped-key memory (max_seeds keys) also forgot keys before large corpora cycled back, so the horizon never widened at all. Now horizon = max(horizon, 2 x measured revisit gap), with 2^15 remembered keys. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Rvj2gdMAa4HA8MGHULfDJE
Reviewer's GuideFixes Doppler horizon runaway by tracking dropped seeds’ last-touch ticks and setting the horizon from the slowest observed revisit gap, while expanding bounded key retention so large corpus cycles are measured; adds regression coverage and updates documentation. Sequence diagram for Doppler dropped-seed revisit handlingsequenceDiagram
participant Scheduler
participant PowerDoppler
participant DroppedKeys
participant OpenFrames
Scheduler->>PowerDoppler: process seed key
PowerDoppler->>DroppedKeys: pop(seed_key)
alt key was previously dropped
PowerDoppler->>PowerDoppler: compute gap = ticks - touched
PowerDoppler->>PowerDoppler: set _stale_after = max(_stale_after, 2 * gap)
end
PowerDoppler->>OpenFrames: _admit()
alt frame is abandoned
OpenFrames-->>PowerDoppler: old frame and old.touched
PowerDoppler->>DroppedKeys: store seed key -> old.touched
end
Flow diagram for non-compounding Doppler horizonflowchart LR
A[Seed frame is dropped] --> B[Remember key and last-touch tick]
B --> C[Seed returns after measured gap]
C --> D[Compute 2 × gap]
D --> E[Horizon = max current horizon, 2 × gap]
E --> F[Slowest observed revisit gap controls abandonment]
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
daedalus
marked this pull request as ready for review
October 1, 2026 14:33
Contributor
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The fixed LRU capacity preserves the zero-frame failure for unlimited corpora exceeding 32,768 seeds.
Review effort: Balanced
Findings: 1
What changed in this PR
Fixes Doppler horizon compounding and adds bounded dropped-seed tracking.
Changes:
- Derives horizon growth from measured revisit gaps.
- Adds bounded tracking and regression tests.
- Updates schedule documentation and changelog.
| File | Description |
|---|---|
src/fuzzer_tool/core/power_doppler.py |
Revises horizon adaptation and dropped-key retention. |
tests/test_power_doppler.py |
Tests compounding, bounds, and validation. |
docs/DEEP_DIVE.md |
Documents revised behavior. |
CHANGELOG.md |
Records the fix. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+48
to
+50
| # Dropped keys remembered (key -> last-touch tick); must outlast a corpus | ||
| # cycle's worth of drops. ~150 B each bounds it near 5 MiB. | ||
| DEFAULT_MAX_DROPPED = 1 << 15 |
daedalus
pushed a commit
that referenced
this pull request
Oct 1, 2026
The fixed 2^15-key LRU forgot every dropped key once the corpus cycle outgrew it, so revisits were never seen and frames never closed. Remember a crc32-sampled subset instead, halving the sample on overflow: sampled keys are never churned out, memory stays bounded. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Rvj2gdMAa4HA8MGHULfDJE
daedalus
added a commit
that referenced
this pull request
Oct 1, 2026
Fix PR #50 review finding: Doppler drop memory churn
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Addresses the Copilot thread on #48.
Bug (
core/power_doppler.py)max_seedskeys, so with large corpora keys were forgotten before returning — horizon never widened, zero frames closed (200 seeds / 4 slots → 0 ensembles).Fix
max_dropped = 2^15, ~5 MiB).horizon = max(horizon, 2 × gap). Tracks the slowest real revisit gap; never compounds.Tests
test_regression_many_returns_do_not_compound_horizon(falsification, failing before fix): 200 seeds / 4 slots → horizon ≤ 4×cycle and frames close (now 400, 32 ensembles; before 0).test_adversarial_abandoned_keys_do_not_grow_horizon: non-returning keys leave horizon unchanged; memory bounded bymax_dropped.test_power_doppler.py,test_schedules.py); ruff + lizard clean.🤖 Generated with Claude Code
https://claude.ai/code/session_01Rvj2gdMAa4HA8MGHULfDJE
Generated by Claude Code
Summary by Sourcery
Fix Doppler horizon management so slow returning seeds are accommodated without disabling frame abandonment or allowing unbounded state growth.
Bug Fixes:
Documentation:
Tests: