Skip to content

fix(assets): lower the discovery floor to 1M and pin it to the admission floor - #190

Merged
eaitbrahim merged 2 commits into
mainfrom
fix/lower-discovery-floor
Aug 8, 2026
Merged

fix(assets): lower the discovery floor to 1M and pin it to the admission floor#190
eaitbrahim merged 2 commits into
mainfrom
fix/lower-discovery-floor

Conversation

@eaitbrahim

Copy link
Copy Markdown
Contributor

The problem

assets discover's 24h-volume pre-filter was 5,000,000 — five times the liquidity floor the admission gate actually applies (ScreenPolicy.min_median_daily_volume = 1,000,000). Discovery was stricter than the criterion it screens for, so it was hiding assets the gate would have accepted.

Measured, not assumed

On a live sweep (2026-08-08, deployment on v0.5.6):

floor candidates unsettled survivors
5,000,000 (old) 9 1 (ZEC)
1,000,000 (new) 38 ZEC, DOGE, FET + 6 more to triage

Seven assets clear both mechanical gates — 4-year history and the real liquidity criterion — that the old floor never surfaced: FET, AVAX, ICP, ALGO, UNI, CRV, DOT. Each passes assets screen with attestation as its only rejection.

Two cases make the point:

  • FET — $2.94M/24h, invisible to the sweep, while measuring 4.8× the admission floor. It also ranks second of twelve on marginal independence (0.096 vs the book's own internal 0.175), so the old floor was hiding the best new candidate available.
  • DOGE — $3.95M/24h, so it has never appeared in a default sweep, despite being ~30× the admission floor.

The floor, not the market, was the binding constraint on the candidate pipeline.

Why 1,000,000 specifically

It is not a fresh guess — it is ScreenPolicy.min_median_daily_volume. Setting them equal makes the pre-filter exactly as permissive as the gate, which is the most it can be without proposing assets that cannot pass.

The two remain different statistics — a 24h snapshot vs a median over history — which is what --probe-liquidity (#188) exists to reconcile. This pins the numbers, not the methods.

The drift bug found on the way

Three modules carried this default: cli.assets_discover's option, admission.DEFAULT_MIN_QUOTE_24H_VOLUME, and screen.DiscoveryPolicy. Only the first two were pinned to each other — so a caller constructing DiscoveryPolicy directly, which assets_discover itself does, could have drifted from build_discover_report silently. Now all three are pinned, plus a fourth pin to the admission floor.

Scope

No behaviour change to the gate — same criterion, same floor, same verdicts. Only how many candidates a sweep surfaces for a human to consider. TDD: existing pin flipped and watched fail (5000000 != 1000000) before any source change. 2139 passed (+2), ruff and mypy clean across 203 files.

🤖 Generated with Claude Code

eaitbrahim and others added 2 commits August 8, 2026 19:29
`assets discover --probe-liquidity` and `screen.median_daily_quote_volume` are on main but not in
any release, so the deployment (0.5.5) cannot run them. The scout skill now makes the probe the
first step of every sweep, which fails against 0.5.5 -- this closes that gap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ion floor

The sweep's 24h-volume pre-filter was 5,000,000 -- five times the liquidity floor the admission
gate actually applies. Discovery was therefore STRICTER than the criterion it screens for, and
was hiding assets the gate would have accepted.

Measured on a live sweep 2026-08-08: at the 5M floor, 920 venue products -> 9 candidates, of which
exactly one was an unsettled survivor. Lower the floor and seven more clear BOTH mechanical gates
(4-year history AND the real liquidity criterion): FET, AVAX, ICP, ALGO, UNI, CRV, DOT. FET sits at
$2.94M/24h -- invisible to the sweep -- while measuring 4.8x the admission floor. DOGE, at $3.95M,
never appeared in a default sweep at all despite being ~30x the admission floor. The floor, not the
market, was the binding constraint on the candidate pipeline. At 1M the same sweep returns 38.

1,000,000 is not a fresh guess: it is `ScreenPolicy.min_median_daily_volume`. Setting them equal
makes the pre-filter exactly as permissive as the gate, which is the most it can be without
proposing assets that cannot pass. The two remain DIFFERENT STATISTICS -- a 24h snapshot versus a
median over history -- which is what `--probe-liquidity` exists to reconcile; this pins the
numbers, not the methods.

Three modules carried this default (`cli.assets_discover`'s option, admission's
`DEFAULT_MIN_QUOTE_24H_VOLUME`, `screen.DiscoveryPolicy`). Only the first two were pinned to each
other, so a caller constructing `DiscoveryPolicy` directly -- which `assets_discover` does -- could
have drifted from `build_discover_report` silently. Now all three are pinned, plus a fourth pin to
the admission floor, so they move together or the suite fails.

Behaviour of the gate is unchanged: same criterion, same floor, same verdicts. Only how many
candidates a sweep surfaces for a human to consider.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@eaitbrahim
eaitbrahim merged commit 7fa71e4 into main Aug 8, 2026
1 check passed
@eaitbrahim
eaitbrahim deleted the fix/lower-discovery-floor branch August 8, 2026 23:59
eaitbrahim added a commit that referenced this pull request Aug 9, 2026
#190 lowered the `assets discover` 24h pre-filter from 5M to 1M and pinned it to the admission
floor, but the deployment runs 0.5.6 and so still sweeps at 5M -- 9 candidates instead of 38, with
FET and DOGE invisible. This ships it.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant