How it works

Anything that can be arithmetic is arithmetic.

The model is the last step, not the first. By the time it sees anything, every figure has already been fetched, stored with its source, and run through code that has no opinions.

1

Twelve tools gather

Prices, fundamentals, statements, shareholding, peers and headlines — each stored with the source that produced it and the period it belongs to.

deterministic
2

Rules and score run

Seven red-flag checks and a five-part weighted score, in plain Python. Same inputs tomorrow, identical answer — asserted 100× per rule in the test suite.

no AI involved
3

The evidence pack is sealed

Everything gathered and computed goes into one object. That object, and nothing else, is what the model receives — no internet in the call, no memory of other stocks.

handoff
4

Every number is audited

After the model writes, a script extracts each figure from its text and checks it appears in the pack. An orphan number fails the audit and the page says so.

verified

The practical consequence: if the AI is switched off, the red flags and the score are completely unaffected. They never depended on it. The quality screen and the entire funds module go further — they contain no call to a model at all, so there is nothing in them to switch off.

Methodology & limitations

What it does, and what it deliberately will not do.

A research tool is only as good as its willingness to say "I don't know". Here is exactly where the numbers come from and where they stop.

Where the numbers come from

Prices, fundamentals, headlines
Yahoo Finance, cached locally with a source tag and timestamp on every row. Five years of daily closes per security, across the NSE, NYSE/NASDAQ, LSE, TSX, Euronext Paris, XETRA, Borsa Italiana, Tokyo, Shanghai, Shenzhen and Hong Kong.
Currencies, and one trap
Every figure stays in its own market's currency — rupees, dollars, pounds, Canadian dollars, euros, yen, yuan, Hong Kong dollars — and is never converted. There is no FX rate to go stale, but it does mean amounts are not directly comparable between markets; percentages are.
London quotes in pence. A London price of 2,450 means £24.50. That is normalised once, at ingest, and recorded — so nothing downstream has to remember which exchange it is looking at, and the charts are not silently a hundred times wrong.
Red flags and the score
Computed in plain Python from those stored rows. No model, no randomness, no network. Reproducibility is asserted in the test suite, not assumed.
SWOT and the debate
Written by Claude from the sealed evidence pack. The model never calculates a figure — it writes the sentence around one the engine already produced.
The quality screen
Twenty thresholds, eight of them on to begin with. It runs over the figures already cached — it fetches nothing of its own, so it answers in a moment and can only see names you have analysed before. Return on equity is used as the provider reports it, or recomputed as net income ÷ shareholders' equity where it does not, and each row says which. The 200-day EMA is computed over the whole stored series, seeded on the first 200 closes and smoothed at 2/201 — the convention charting packages use, so you can check it against a chart.
Size and liquidity are ranks, not amounts. A floor of "5,000" means a different company in Mumbai, New York and London, and converting between them needs an exchange rate that is wrong by the time anyone reads it. So both are a position within the stock's own market — the same rule the rest of this application follows. The row still prints the amount in its own currency, so the rank can be checked against something real.
Tests run cheapest first. Eight read one bulk query; two need a price series and two a stored analysis, so those run on whatever survived. The consequence is worth stating: an early step's counts include names a later step would have removed. The order is in the funnel rather than implied.
Fund NAVs and prices
Indian scheme NAVs come from AMFI, republished by mfapi.in. ETFs use the same price path as any listed security. Both are stored dated, with their source, in the funds database.
What a fund holds
There is no official free API for this. AMCs publish a monthly spreadsheet in a layout each chose for itself; ETF issuers publish a file at a URL that is part of their website rather than a documented interface. The fetcher tries the AMC's own published file first, and everything it parses is sanity-checked before it is stored — weights must sum to something a portfolio could sum to, no single holding may be absurd, the row count must be one a fund could have. A file that fails is rejected with the reason rather than saved. These sources will break, and when one does the page shows an ageing as-of date rather than silence. A disclosure you imported by hand is never overwritten by a fetched one.
Your own transactions
Typed in, planned as a monthly SIP, or imported from a CAMS or KFintech consolidated statement. The statement's password is sent in a request header and never written to a log or a URL. Imports are idempotent on fund, date, kind and amount, so running the same file twice does not double your holding.
Two databases, one wall
Funds live in their own file. The funds module opens the equity database through a read-only connection, so a bug in fund code cannot corrupt five years of cached prices. That is enforced in the connection string and asserted in the test suite, not left to discipline.
Segments and leaders
Ranked from your own cache using SEBI's definition: rank 1–100 large, 101–250 mid, 251+ small — applied separately to each market. Recomputed on every refresh.
When two sources disagree
Reported ratios are cross-checked against ones recomputed from the statements. Where they differ, both values are shown with their derivations. Silently picking a winner is how a research tool starts lying.

Known limits

  • Two rules usually return N/A. Promoter pledge and quarter-by-quarter promoter holding are not published by the price provider for India — and outside India the promoter concept does not exist at all. Those checks report data unavailable rather than a PASS nobody earned. The rule runs throughout: a missing input is reported as missing, never quietly filled with a zero or a default.
  • Figures are as reported, and reports get revised. A number can be stale, restated or simply wrong at the source. Verify anything you act on.
  • The score is one opinion expressed as arithmetic. The weights are a judgement call. Disagree with them — that is why they are adjustable and why the formula is printed next to the result.
  • No recommendations. There is no buy, sell, hold or target price anywhere in the product, and the model is instructed never to use that language. It describes; the decision is yours.
  • A fund disclosure is a photograph, not a feed. Indian schemes publish holdings monthly, so what you are reading describes the fund as it was on the as-of date — a fund can turn over a good deal of its book since then. The page states the date and its age in days rather than presenting it as current.
  • Overlap and look-through only see what was identified. Weight the importer could not match to a known issuer is excluded from every percentage rather than counted as zero, and the share matched on a company name rather than an ISIN is reported separately — name matching is inference, not identification.
  • The screen's thresholds are not a strategy. At the eight defaults it returns almost nothing out of eleven hundred names, and the twelve optional filters are off precisely because switching more on by default would return zero. Profit growth above 50% for one year is one year: a company recovering from a bad year shows a huge number, and that is arithmetic rather than a trend. The debt test treats banks like everyone else, which is a limit of the test rather than a finding about banks. Two of the optional filters read a stored analysis rather than the fundamentals table, so they can only see names that have been analysed — the rest come back untested, which is the honest shape of that limit rather than a hidden one.
  • It cannot see what is not in the data. Management quality, litigation, regulatory shifts and everything else that moves a share price sit outside what any of this measures.

Open the terminal.

Search any listed name and watch twelve tools run, step by step — or search a fund and see what it holds.