# Discover

> The Discover screen: new entrants from four sources, the 52-week-low screen, candidate states and verdicts, filters and saved screens.

Source: https://investi.live/docs/app/discover

**Exclude holdings and open orders** is checked by default and removes owned names and names on working orders from both tables. **Include seen and dismissed** independently restores historical candidates; it does not bypass the holdings/order exclusion. Every data column sorts from its heading; click again to reverse, or Shift-click to add a second key.

New names and analyses older than seven days enter a durable background refresh queue. The schedule runs every five minutes, processes a bounded batch, and retries failed names without blocking others. It uses the existing research engine and public-data caches, with no paid model calls. The queue status appears below the candidates; completed work refreshes the open page.


Discover runs the 52-week-low screen across US stocks and scores each candidate against your own strategy rules. It is where you find names worth researching. Nothing here places or suggests an order.

Open it from the nav or press `g` then `d`. The command palette (`Cmd+K`) also has "Run 52-week-low screen", which opens `/discover?run=1`.

## Filters

One filter panel sits above both tables and applies to both: New entrants and the 52-week-low screen.

- **Ticker or name**: text that the ticker or the company name contains. Press `/` anywhere on the page to focus it.
- **Green, Yellow, Red**: verdict colors. Each button toggles that color. With none selected, every verdict shows, including flagged, dormant and not yet analyzed. With one or more selected, a row shows only when its verdict is one of those colors. A name with no verdict is hidden while any color is selected.
- **Within N% of 52W low**: Any (the default), 2, 5, 8, 10, 15 or 25 percent. Names without a 52-week low are left out only while a distance is chosen.
- **All sectors**: limit to one sector.
- **Liquidity**: Any liquidity, $5M+/day, $20M+/day, $100M+/day (30-day average dollar volume).

These combine with the source buttons on New entrants and with every column filter in either table: a row shows only when it passes all of them. **Clear** resets the panel and the source button. The whole view lives in the address bar: the panel (`q`, `within`, `sector`, `liq`, `color` as `GREEN`, `YELLOW` and `RED`), the source (`src`), **Include seen and dismissed** (`seen=1`), the holdings/order exclusion (`includeCommitted=1` turns it off), and each table's sort, column filters, hidden columns, order and grouping (`discover_entrants.*`, `discover_screen.*`). Bookmark or share the address to come back to the same view.

**Saved screens** stores the whole view under a name (`POST /api/v1/screens`). Click a name to apply it, or the `×` to delete it.

## Tables

Both tables are the app's standard table: click a header to sort (Shift-click for a second key), use the filter button in a header or **Filter** for every column, **Columns** to show, hide and reorder columns, **Group** by an enum column, **CSV** to export what is on screen and **Reset view** for the defaults. Every row is reachable: the tables scroll inside themselves with a sticky header and a pinned Symbol column, and only the rows in view are drawn, so a list of a thousand names scrolls smoothly. Headers with an (i) explain their column.

## New entrants

The first table answers "which names are new since I last looked". It lists candidates from four sources, explained in full in [Candidate sources](/docs/concepts/candidate-sources):

- **Near low**: within X% of the 52-week low (your near-low distance, 10% by default), from the scan below.
- **Big drop**: down X% or more over N sessions (10% over 1 session by default), $2B or more market cap, and profitable: positive trailing-twelve-month net income and positive operating margin.
- **Strict 1**: passes all 11 Finviz Strict 1 filters, recomputed from SEC filings and daily bars.
- **Uploaded**: from your screener files (Schwab Stock Screener or Finviz exports).

Hover a source button for its definition with your own thresholds and when it last ran. Each button shows its count (after the panel filters) and how long ago the source last ran, or **not run** when it has never run, so a 0 is never ambiguous. A source that ran on a fallback says **fallback**: when Nasdaq's same-session change feed fails, big drops use the one-day change from the last two stored daily closes. The (i) beside the buttons says why a source has no names, and **Held back** lists big drops the quality gate held back on the latest pass, with the reason.

By default the table shows only new names: first seen within your window (7 days by default) or not yet evaluated under your current rules. Tick **Include seen and dismissed** to revisit history. The separate **Exclude holdings and open orders** control still applies. A name in two sources counts in both and appears once. Every entrant arrives with the page, with no paging.

| Column | Meaning |
| --- | --- |
| Symbol | Ticker and company name. Hover for the hover card. |
| Verdict | The latest verdict from your rules. Hover or tap the chip for its reason card. |
| Price, 1D | Last delayed price and the same-session change. |
| Above low | Distance above the 52-week low, with a bar, when the scan has the name. |
| Why | Why the name is here, from its sources: "-18.2% in 5d", "new 52W low", "6.4% above 52W low", "Strict 1: 11/11", "uploaded Nov 4". |
| Source | Every source that has the name. Filtering and sorting use the first. |
| First seen | The earliest sighting across its sources. **New** marks names first seen since your last visit; **Back** marks a dismissed name that has since traded below the price you dismissed it at. |
| Strict 1 | Filters passed out of eleven, when the name has been checked. |
| Own? | Whether you hold it. |
| Sector, $ volume 30D, Mkt cap | Hidden at first; show them from **Columns**. |

Each row has two actions:

- **Analyze** evaluates the name now under your rules (deterministic, no cost) and fills in the verdict.
- **Dismiss** hides the name. Investi remembers the lower of its last price and its 52-week low; if it later trades below that price it comes back as new. With seen and dismissed names showing, **Restore** undoes a dismissal.

Open the arrow at the start of a row for its detail: each source with its first and last sighting, the uploaded file name, the big-drop gate checks, and the Strict 1 checklist with every filter marked Pass, Fail or Unknown, its value and where it came from. Unknown never counts as a pass.

New entrants are evaluated automatically: after a scan and after each close, the analysis queue takes new entrants first. Loading Discover counts as a visit; the Home attention list shows how many new candidates arrived since the last one.

## Running a scan

The header button reads **Run screen** before your first scan and **Rescan and analyze** after. While a run is going, it changes to **Stop**.

A run has two phases:

1. **Scanning prices.** The server builds a universe from Nasdaq's listing: US companies above your screener market-cap floor, priced at $5 or more, with plain ticker symbols, capped at your "max names per scan" setting (both live in [Settings](/docs/app/settings) under Preferences). Names you have traded and names that were nearest their lows last time are scanned first. The browser then steps through the universe 24 names at a time (`POST /api/v1/screener/runs`, then `POST /api/v1/screener/runs/{id}/step`). Each name gets up to two years of daily bars, from which Investi computes the 52-week low, ATR, repeated-low count, trend and returns.
2. **Analyzing new and changed names.** New entrants from every candidate source that have no evaluation under your current rules go first. Then names that are New or Changed, not blocked by a hard rule, and sit within 1.5 times their own ATR-scaled entry gate get a full evaluation (SEC solvency and filing checks, market cap, earnings date and the market regime), four at a time (`POST /api/v1/screener/analyze`). Names whose prior analysis is still valid are reused, not recomputed.

Opening `/discover?run=1` starts a run automatically, once.

> **Note:** The first scan takes a few minutes. Later runs reuse prior work, so they are faster. Price fields come from Nasdaq daily bars (regular session, split-adjusted).

## Research queue

While a run is active or after one finishes, a status block shows a progress bar (`processed / total`) and these counters:

| Counter | Meaning |
| --- | --- |
| Processed | Names whose prices were scanned. |
| Skipped | Names with no resolvable symbol or fewer than 30 daily bars. |
| Failures | Names whose data request failed. Recent failures are listed below. |
| Analyzed | Names given a full evaluation in this run. |
| Reused (no new work) | Names whose prior analysis was still valid. |
| Queue left | Names still waiting for full analysis. |
| Cost | Always `$0.00`. The batch uses deterministic rules only, with no paid model calls. |

The last 14 analyzed names appear as chips with their verdict, marked "changed" if the verdict moved. A name whose analysis failed shows as Insufficient.

## Candidate states

States are not exclusive; a name can be Owned and Changed at once. The State column shows the most important one (Blocked, then Stale, Changed, New, Ordered, Owned, Unchanged). Hover it for the reason.

- **New**: never analyzed under your current record.
- **Changed**: the policy version changed, material inputs changed, or the full analysis is more than seven days old.
- **Unchanged**: the prior analysis is still valid.
- **Owned**: you hold shares. **Ordered**: you have a working order.
- **Blocked**: a hard rule from Settings excludes it.
- **Stale**: data is more than 36 hours old, or there is not enough data to evaluate.

Full detail is in [/docs/concepts/candidate-states](/docs/concepts/candidate-states).

## The 52-week-low screen

The second table lists every scanned name within 25% of its 52-week low, nearest the low first. The panel filters apply here too.

| Column | Meaning |
| --- | --- |
| Verdict | The latest verdict from your rules (or your override). Hover or tap for the reason card. |
| State | The most important candidate state (see above). Hover for the reason. |
| Price, 1D | Last delayed price and day change, updated from the quote stream. |
| 30D | Sparkline of the last 30 closes; sorts by the change across them. |
| 52W low | Lowest close over the trailing 365 days. |
| % above low | Last price relative to that low, with a bar. |
| 14D ATR% | Wilder ATR(14) as a share of price. |
| Last new low | Date of the most recent new low, with a count if several occurred recently. |
| Own?, Pending order | Whether you hold it, and any working order. |
| Why | The state reason, or the hard rules that block it. |

Hidden at first, from **Columns**: $ volume 30D, 50DMA direction, 5D and 1M returns, Mkt cap, Sector and Data through (the last bar date). Click a ticker to open its research page.

## How Discover works

The **How this works** drawer in the page head holds the methodology: each source's definition with your thresholds, where price data comes from (Nasdaq daily bars, regular session, split-adjusted), when full verdicts run (new entrants from every source, and New or Changed names within 1.5 times their own entry gate, with the widest gate from your rules) and how Strict 1 is computed.

## Empty states

- Before any scan: "No scan yet" with a **Run screen** button.
- When the panel filters or the source button hide every row: how many names they hide, with **Clear filters**.
- When a column filter hides every row: "No rows match these filters" with **Clear filters**.
- A source with no names says why (not run yet, or 0 of 161 checked pass).

For how verdicts are decided, see [/docs/concepts/verdicts-and-policy](/docs/concepts/verdicts-and-policy) and [/docs/strategy/rules](/docs/strategy/rules).
