Kresmion · Platform & Methodology

How Kresmion works

What every surface is for, how the numbers are computed at a conceptual level, and which keyboard shortcuts make it fast. Sections deep-link via anchors.

1 · Platform overview

Kresmion brings together the data professional traders consult before placing a trade — filings, alternative data, OSINT, macro regime, on-chain — and puts them on one screen with consistent units, freshness indicators, and watchlist-aware filters.

The dashboard is organised around six top-level sections:

  • Terminal — the multi-widget home screen. Customisable layout; each widget is independently refreshing.
  • Markets — Equities, Macro, Crypto, Forex, Commodities, Futures. Each carries an Overview, Markets table, and a Signals feed scoped to that asset class.
  • Intelligence — OSINT feed, Physical Intelligence map, Compound Signals, Narratives, the Intelligence Feed (grouped + filtered cross-source view), plus specialised feeds for FDA, Earnings, Congress, Insider trades, Activist investors, Lobbying, Patents, OSHA incidents, App ratings, and Web traffic trends.
  • Tools — Position calculator, Drawdown analyser, Relative-strength, Sector rotation, Risk models, Currency strength, Yield curve, Excel export.
  • Data — Capital flows (13F, COT, BIS, TIC), raw data exports, the Screener.
  • Community — Board, Contacts, public profiles.

The Portfolio section holds the personal surfaces — Watchlist, Positions, Vault (on-chain holdings tracker with FIFO cost basis + active positions), Risk & stress testing, and Reports.

2 · Keyboard shortcuts

Press ? (Shift + ?) anywhere on the platform to bring up the live shortcut overlay. The same keystrokes work inside the overlay.

KeysAction
?Show the keyboard-shortcut overlay
EscClose any open modal, drawer, or overlay
⌘K / Ctrl+KOpen the command palette / global search
j / kMove down / up through a list (e.g. Alerts)
EnterOpen the focused item
g tGo to Terminal
g eGo to Equities
g mGo to Macro
g cGo to Crypto
g fGo to Forex
g oGo to Commodities
g iGo to Intelligence overview
g dGo to Intelligence Feed
g nGo to Narratives
g pGo to Physical Intel map
g vGo to Vault
g wGo to Watchlist
g rGo to Portfolio risk
g aGo to Alerts
g qGo to Signal accuracy (quality)
g bGo to Community board
g hGo to Methodology / help
g sGo to Settings

Two-key sequences like g t have a 1.5-second window — the second key cancels if pressed too late.

3 · Signal accuracy

The /signals/accuracy page reports rolling win rates per (signal type × direction). A win is a price move in the predicted direction at the chosen horizon — close at fire vs close N calendar days later (1d, 5d, 30d).

Groups with too few fires are suppressed to keep the distribution honest. A cell labelled ins. histmeans the signal type has zero fires aged into that horizon yet (typical for new signal types); it populates as fires accumulate the required forward window.

Note: Past signal accuracy does not guarantee future returns. Win-rate alone says nothing about magnitude — a 60% win rate with tiny wins and large losses is worse than a 45% win rate with the inverse. Treat the metric as one input, not a recommendation.

4 · OSINT pipelines

Open-source intelligence comes from three lanes — social, curated web outlets, and Telegram — running on independent schedules. Events are deduplicated, language-detected, and (when non-English) translated on ingestion. The original text is always preserved; a "Show original" toggle reveals it inline.

A clustering layer groups related events that arrive close in time and share entities (region, asset, actor). Clusters that cross a relevance threshold are summarised by a local LLM into a one-sentence read with a trend tag and a consensus indicator. The summariser never invents events beyond what the cluster contains; low-confidence or malformed model outputs are dropped and retried on the next tick.

Source credibility is scored on a 0-100 scale based on track record, attribution, and editorial standards. Higher- scored sources carry more weight in cluster aggregation; sources below the platform's credibility floor are excluded entirely.

5 · Compound signals

A compound signal fires when multiple independent source types converge on the same region or asset within a short rolling window. Independent means different source families: OSINT + positioning + price action counts as three independent signals; three OSINT events from the same theme do not.

Conviction (HIGH / MEDIUM / FORMING) is derived from the breadth of source types and the strength of each contributing signal. The full conviction logic + the magnitude floors that filter noise are intentionally not published — they're tuned as the platform learns which combinations led to durable moves.

6 · Macro regime engine

The macro regime engine produces a single daily risk-on / risk-off score that other surfaces hang context off (the daily brief headline, the welcome screen badge, the regime-shift signal type, etc.).

The engine fuses a basket of cross-asset and macro signals: equity-index trend + breadth, credit spreads + high-yield OAS, rates & yield-curve shape, the dollar trend, volatility (VIX, MOVE), commodities (gold, oil), and a net-liquidity aggregate derived from Fed balance-sheet + Treasury cash balance. Each input is z-scored against its own trailing history (~1 year), clipped to suppress extreme outliers, then combined with weights that have been tuned for regime-following stability rather than trade-by-trade alpha.

The raw composite is exponentially smoothed day-over-day so the regime doesn't flip on a single odd close. The smoothed score maps to one of five buckets — Strong Risk-Off, Risk-Off, Neutral, Risk-On, Strong Risk-On — with deliberate hysteresis around the boundaries so the regime label doesn't oscillate.

The engine recomputes on a half-hour cycle during US market hours and at end-of-day; full re-derivation is cheap, so the score on the page is the score for "right now," not a stale midnight snapshot.

Note: The exact factor weights + bucket boundaries are tuned internally and not published. The methodology described here is the general shape; the numerical details are part of what makes Kresmion's regime call distinctive.

7 · 13F institutional tracking

For each tracked filer, every reported position is compared to the same filer's prior-quarter position on the same CIK (not ticker — tickers change with corporate actions; CIKs don't). Position deltas are classified into a small set of buckets — NEW, INCREASED, REDUCED, EXITED, INSTITUTIONAL SURGE, INSTITUTIONAL EXIT — based on share-count change and position magnitude.

Multi-subsidiary filings (a filer reporting the same holding across multiple investment-manager subsidiaries) are aggregated to a single per-cusip line before classification, so big managers like Berkshire show their actual total position rather than just whichever subsidiary the parser saw last.

Market values are reported in whole US dollars; the modern SEC 13F-HR XML schema reports <value>directly in dollars (the platform handles only the modern post-2022 schema).

QoQ percentage display rules (Phase 110). Quant funds (Two Sigma, Point72, Renaissance) frequently hold 1,000-share position-keeper placeholders on liquid names — a memo of "we cover this name". When they actually size up to 1-4M shares the next quarter, the raw (current - prev) / prev * 100 calculation produces percentages like +211,377% which are mathematically correct but visually broken. The platform applies two thresholds:

  • Prior < 100 shares: the column shows a RESUMED badge instead of a percentage. A 4-share base is rounding residue, not a real position, and dividing by it produces a meaningless number.
  • Prior 100-1,000 shares: percentages over 1,000% render as >1000% with the MAJOR_INCREASE / MAJOR_DECREASE classification. Below the cap, the real percentage shows.
  • Prior ≥ 1,000 shares: full percentage displays for legitimate moves (Point72's CVX 9,100 → 103,800 = +1,041% shows in full). Beyond ±5,000% on a real prior, render the sanity cap (almost always means the prior was itself a placeholder; the signal badge does the conveying).

NEW_POSITION vs RESUMED. NEW_POSITION means the filer reported no prior quarter for this CUSIP at all. RESUMED means they had a placeholder prior (<100 shares) that we treat as effectively a new entry. Both render as badges rather than percentages.

8 · Vault & FIFO cost basis

On-chain positions in the Vault use FIFO (first-in, first-out) lot matching. Each direction='in'transaction creates a lot at the USD value at acquisition; direction='out' consumes the oldest lot first. Swaps create a paired disposal of the outgoing token and an acquisition of the incoming token, both at the USD value at swap time. Internal transfers between the user's own wallets are ignored.

Realised P&L from disposals feeds the tax-year report; unrealised P&L on remaining open lots drives the Active Positions tab. Prices come from snapshot data refreshed on a short cycle. If a token has no recent price snapshot the position is shown at cost basis with a "no mark" flag — we never substitute a guessed price.

Note: This is a computational view of public blockchain data, not tax advice. Consult your accountant for jurisdiction-specific treatment (long-term vs short-term, wash sales, like-kind, etc.).

9 · Update frequencies

Cadence per surface. Exact tick intervals vary slightly with load and upstream rate limits; this table is the design target.

SurfaceCadence
Crypto pricesnear real-time
Crypto funding ratesminutes
Crypto whale transactionsminutes
Whale aggregate statsintra-hour
OSINT socialminutes
OSINT webintra-hour
OSINT Telegramminutes
OSINT clustersminutes
OSINT cluster summaries (LLM)hourly
13F filingsdaily
Congressional tradesdaily
Insider trades (Form 4)daily
Compound signalsminutes
Macro regimeintra-hour + end-of-day
Narrative engine (Tier 2)daily 06:00 UTC
Equity-universe refreshweekly
Daily briefdaily 09:00 UTC

A page-level DataFreshness indicator on data pages surfaces the actual last-updated timestamp so users can spot when a pipeline has drifted from its expected cadence (green < 1.5× cadence, amber < 3×, red beyond).

10 · Bond issuance

Bond filings are pulled from SEC EDGAR's full-text search (EFTS) restricted to the 424B prospectus family (424B2/3/4/5). For each candidate filing we run a two-pass parse:

  1. Snippet pass — EFTS returns a small text snippet around the matched phrase. We run a keyword filter to reject equity / fund shelf takedowns that incidentally reference "aggregate principal amount" in their base-prospectus boilerplate.
  2. Document pass — for filings that survive the keyword filter but lack structured fields in the snippet, we fetch the primary prospectus document (cap ≈ 80KB, biased toward filenames containing 424b) and re-run the extractors against the full body. Equity language dominating the body triggers a "not bond" tag and the row is hidden from the user-facing view while kept in the database for audit purposes.

What we surface vs disclose — many shelf takedowns price only a subset of the term sheet inside the snippet. We treat principal / rate / maturity as independent fields: a row may show "disclosed" amount without a rate, or vice versa. The "Disclosed terms only" default surfaces rows where all three are present; power users can flip to the full row set.

Ticker resolution — EDGAR display names often carry the ticker in a parenthesised tail like (NRUC) or (BW, BWNB, BW-PA). We parse the first short-ticker token; when the tail is absent or non-standard we fall back to a normalised name-match against the companies universe (Phase 103 Russell 3000 backbone).

Signal types — three categorical signals fire from rule-based thresholds: LARGE_DEBT_ISSUANCE (≥ $1B principal), ACQUISITION_FINANCING (use-of-proceeds parses as acquisition), and HIGH_RATE_ISSUANCE (coupon ≥ 200bps over the current ICE BofA US High Yield OAS). The HIGH RATE stat card on the page renders the highest observed rate in the window alongside the active threshold.

11 · Activist investors

The activist tracker surfaces SEC Schedule 13D and 13D/A filings — the disclosure form a holder must file when they cross 5% ownership AND have intent to influence. 13G (passive ownership) is ingested for other surfaces but deliberately hidden from this page: by definition a 13G is non-activist.

Classification — every 13D / 13D/A gets a two-factor rating:

  1. Item 4 keyword scan — we fetch the primary filing document, extract the "Item 4 — Purpose of Transaction" section using strict boundary detection (Item 4 → next Item 5/6/7), strip SGML envelope text + exhibit attachments, then look for activist intent keywords (board representation, strategic alternatives, sale of the company, unlock value, proxy contest, etc.). When Item 4 isn't extractable, we return "unclear" rather than guess — never fall back to scanning the whole document.
  2. Filer heuristic — individual filers (named persons without a fund / LP / LLC entity suffix) with director/officer/board markers in Item 4 are classified as insider rather than activist. Insider filings are routine 13Ds from officers crossing the 5% threshold via stock compensation — not activism.

Confidence ladder: high means ≥2 distinct activist keywords AND no passive-investment markers. medium is single-keyword. low means mixed signals (both activist and passive language). Only HIGH confidence rows emit ACTIVIST_STAKE downstream asset_signals.

Filer tier taxonomy — a small curated table of known activist funds keyed on EDGAR CIK. Each entry carries a tier (tier 1 / 2 / 3) and notable past campaigns:

  • Tier 1 — Elliott, Icahn, Pershing Square, Trian, Starboard, Third Point
  • Tier 2 — Saba, Engaged Capital, Cevian, ValueAct, JANA
  • Tier 3 — Politan, Ancora, plus institutional 13D filers like GAMCO, OrbiMed, General Atlantic, Bulldog Investors

The taxonomy is intentionally a finite curated list — new funds are added only after verifying the CIK against EDGAR. Filers not in the table show their bare name with no tier badge.

Coverage caveats — Item 4 extraction fails on ~20% of 13D/A amendments because they reference the prior 13D in passing ("Item 4 is hereby amended to add the following...") without restating the section header. Position size (% of class, aggregate shares) is parsed from Item 5 of the cover-page table when present; some short-form amendments omit it. We surface coverage percentages on the page so users can judge what's observed vs unknown.

12 · Treasury TIC foreign holders

Source. US Treasury "Major Foreign Holders of Treasury Securities" monthly report (home.treasury.gov/data/treasury-international-capital-tic-system). The scraper pulls mfhhis01.txt — the rolling current-year history file Treasury publishes monthly with a ~6-week lag from the report month. December 2025 data publishes mid-February 2026.

Signal classification (Phase 111). Each country's month-over-month change is run through a tiered classifier that considers both magnitude and percentage. The two underlying floors are operator-tunable constants in services/treasury/tic_classifier.py.

  • MAJOR_ACCUMULATION / MAJOR_SELLOFF — abs(Δ$) ≥ $10B AND abs(Δ%) ≥ 3%. Both must trip. Rare; only fires on big positioning shifts in absolute and relative terms.
  • ACCUMULATION / SELLOFF — abs(Δ$) ≥ $5B OR abs(Δ%) ≥ 3%. Either threshold alone trips. Catches large dollar moves on big holders (Japan / UK / China) AND large percentage moves on mid-size holders (Netherlands, Spain, Germany).
  • No signal — both below the standard thresholds. The row still surfaces in the table with muted formatting so the user can scan the full picture.

Why the change. The pre-Phase-111 rule considered only absolute dollar magnitude with a hardcoded 20-country allowlist. That made Netherlands -$9.6B / -12.06% miss because $-change fell $0.4B short of the floor, while Japan -$17.2B / -1.43% triggered because $-change cleared $10B even though the percentage move was small. Spain -$8.7B / -10.57% missed entirely because Spain wasn't on the allowlist. Tiering on both factors gives consistent treatment.

Display. Major moves render bold, full- saturation color. Moderate (signaled) moves render medium-weight, full-color. Sub-threshold moves render muted so the eye picks out actionable positioning shifts first. The page splits visually into top 20 major holders (Treasury's own curated list) and other reporting countries below; both groups share the same Δ thresholds.

Interpretation. Sustained selling from a major holder is typically a rate-differential, FX- intervention, or sovereign-wealth rebalancing signal. Single-month moves are noise — look for 2-3 month trends and cross-reference with the country's currency, central- bank policy stance, and trade balance.

13 · Cross-asset correlation regime

The Correlation Regime Tracker (/tools/correlation-regime) surfaces pairs whose short-term correlation has decoupled from their 12-month baseline. A correlation matrix shows current state; this page shows when state has changed.

Universe. 45 instruments across asset classes — equities (SPY, QQQ, IWM, sector ETFs, indices), bonds (TLT, IEF, HYG, LQD), commodities (GLD, SLV, USO, UNG), forex (DXY), vol (VIX), and 22 major crypto. 990 pair combinations.

Math. For every pair on every snapshot date: the 30-day rolling Pearson on daily simple returns gives the current correlation; the trailing 252-trading-day mean of the same rolling series gives the baseline. Per-pair date alignment handles crypto×equity weekend mismatch — returns are computed on each symbol's own valid dates, then inner-joined per pair before the rolling correlation.

Break definition. A pair is in regime break when |delta| > 0.40 AND one of: sign-flip (the relationship reversed direction), magnitude doubled (|current| ≥ 2·|baseline|), or magnitude halved (|current| ≤ |baseline|/2). Tuned at 0.40 because the natural distribution of |delta| across 990 pairs puts ~5-10% above 0.40 on a typical day — enough to surface real signal without flagging the universe.

Comparables. Each per-pair detail card shows the trailing 252-day chart of current-vs-baseline correlation plus up to 3 historical comparable breaks for the same pair — same direction (Δ same sign), magnitude within ±0.20 of current. Backfilled three years (2022→) so the comparable archive has depth on day one.

14 · Sovereign yield curves

The Sovereign Yield Curve Tracker (/tools/yield-curves) tracks the 2y/10y spread for major sovereigns, with the un-inversion timing as the actual recession lead (3-12 months historically, not the inversion itself).

Universe (v1). United States (FRED DGS2 + DGS10, daily, history to 1976) and Euro area aggregate (ECB Statistical Data Warehouse, changing-composition AAA-rated curve, daily, history to 2004). Per-country Eurozone (Germany, France, Italy) plus UK / Japan / Canada / Australia are deferred to Phase 123.x — each requires separate per-CB ingestion which violates the "clean free APIs only" v1 scope.

Episode catalogue. The page surfaces every historical inversion episode (start date, end date or "ongoing", length in days, deepest spread reached). For the US that's 44 distinct episodes across 50 years, including the famous 2022-07-06 → 2024-08-26 inversion (783 days). Days-since-inversion-start and days-since-un-inversion are computed on read from the historical state changes.

Interpretation. Curve inversion (2y > 10y) signals tight monetary policy relative to long-run growth expectations. Historically every US recession since 1976 was preceded by an inversion followed by re- steepening — the un-inversion is the proximate recession lead, not the inversion itself.

15 · Risk-neutral implied probability

The Risk-Neutral Implied Probability dashboard (/tools/options-implied-probability) decodes live options chains into the probability distribution the market is currently pricing for the underlying at each expiry, via the Breeden-Litzenberger identity:

f(K) = e^(rT) · ∂²C/∂K²

where C(K) is the call price as a function of strike, T is time to expiry, r is the risk-free rate (FRED DGS3MO 3-month T-bill rate), and f(K) is the risk-neutral probability density at strike K.

Universe. 13 tickers: SPY, QQQ, IWM (major index ETFs) + AAPL, MSFT, NVDA, GOOGL, AMZN, META (mega-cap tech) + TSLA, AMD, NFLX, BABA (high-volume single-names). Daily snapshot at 21:00 UTC (post-NYSE close); each ticker covers all listed expiries.

Math (v0). Quartic smoothing spline (scipy.interpolate.UnivariateSpline, k=4) fit through call mid-prices, filtered to strikes where bid > 0, ask > 0, and (ask−bid)/mid < 30%. Numerical 2nd derivative on a 200-point grid, multiplied by e^(rT), negatives clipped to zero. Validation: pre-clip integral must fall within [0.30, 3.0] — wildly outside this range indicates data too dirty for Breeden-Litzenberger. The surfaced cumulative probability uses post-clip+normalised density.

Note: The page surfaces risk-neutral probabilities, not real-world. They bake in the risk premium investors demand and systematically over-price tail risk versus historical frequencies. They are not predictions. The smoothing-spline approach is also a v0; Phase 124.1 will swap to a proper SVI parametric IV-smile fit which is more robust on noisy chains. DTE < 7 expiries are filtered (max(S-K,0) shape gives a delta-spike 2nd derivative that smoothing-spline can't recover).

16 · Insider Form 4 clusters

The Insider Form 4 Cluster Detector (/tools/insider-clusters) surfaces the cases where multiple executives trade the same direction within a narrow window. A single executive buying $50K is noise; three executives buying within 30 days is signal.

Cluster definition. Same ticker + same direction (buy or sell) + at least 3 distinct insiders + all within a rolling 30-day window. Open-market trades only; option exercises, gifts, grants, and 10b5-1 scheduled trades are filtered out via the existing Form 4 transaction-code gating in the ingestion pipeline.

Strength score. log10(value$/1000) × 5 + insider_count × 3 + (CEO/CFO involved ? 15 : 0) − days_since_last × 0.5. The CEO/CFO bonus reflects the asymmetric information weight of executives closest to material non-public information; the recency penalty decays stale clusters so today's activity ranks above last week's. Tuning of the weights is tracked as Phase 125.1.

Historical comparables. Each cluster's detail panel shows up to 3 prior clusters of similar strength for the same (ticker, direction) — "the last time we saw 6 insiders buy at this scale, this is what happened." The comparable archive accumulates from the daily detection tick going forward.

Note: Insider buy clusters historically outperform broad market on a 6-12 month horizon; insider sell clusters are noisier (taxes, rule 10b5-1 plans, scheduled diversification all look like sells in aggregate). Read the per-insider role column on the detail panel before drawing conclusions.

17 · Congressional trading anomalies

The Congressional Trading Anomaly Detector (/tools/congressional-anomalies) surfaces two anomaly types from US Senate + House STOCK Act trade disclosures.

Outliers. A member's trade whose estimated dollar size is at least 3× their median historical trade size. Members need at least 12 disclosed trades to establish a baseline — fewer trades produces statistically meaningless outlier flagging. Looked-back over the last 60 days so the surface stays current.

Multi-member clusters. At least 3 distinct members trading the same ticker in the same direction within a rolling 30-day window. Identical structure to the insider clusters above but applied to the Senate + House universe.

Amount estimation. STOCK Act discloses brackets (e.g. "$1,001 - $15,000", "$50,001 - $100,000"), not exact figures. Each bracket is parsed to its midpoint for size comparison. The top open-ended bracket ("$5,000,001 +") falls back to its floor value, which under-estimates mega-trades — Phase 126.1 will use SEC's actual filed dollar amounts where available.

Political neutrality. No party segmentation in detection or display. The party column exists in the source data and is deliberately ignored.

Note: Disclosure under the STOCK Act and SEC rules does not imply impropriety. Members are required to file these trades publicly; many are spouse-managed accounts, blind trusts, or delegated portfolio decisions. Read the source filing before drawing conclusions about a specific member.

18 · Macro event impact

The Macro Event Impact page (/tools/macro-event-impact) aggregates how major macro instruments historically reacted in the days following each kind of Fed rate decision.

Event detection. Fed action dates derived from changes in FRED DFEDTARU (daily Federal Funds target upper bound). Any day where the value moves from the previous trading day is an action; magnitude_bps = (change × 100). Classified into Cut 50bps+, Cut 25bps, Hike 25bps, Hike 50bps+. "Hold" days don't generate event rows (rate unchanged), since the hold-dovish-vs-hawkish distinction requires meeting-minutes parsing which is out of scope.

Asset universe. SPY, QQQ, TLT, IEF, GLD, DXY, VIX — the major macro instruments. Per-asset return at 1d, 5d, 30d, and 90d horizons is computed from the Kresmion close-price history with up-to-5-day forward-fill for market holidays.

Aggregation. For each (event-type, asset, horizon), the page shows: n historical instances; median return; Q1 and Q3 (interquartile range); min and max; positive vs negative outcome counts. Sample sizes are made deliberately visible — many event types have n < 10 in the current 3-year close-history window.

Note: These are historical statistics, not predictions. Past Fed-decision asset reactions reflect that specific cycle's macro context. Out-of-sample predictability is weak. Sample sizes in the current window are anecdotal (n=3-14); Phase 127.1 will extend asset history to 2000 via yfinance backfill, expanding n into the 40-60 range. NFP / CPI / ECB / BoE / BoJ events are deferred to Phase 127.2-127.5 because a proper surprise classification requires expectations data (Bloomberg / BLS pre-release surveys) not yet ingested.

19 · Data sources

  • SEC EDGAR — 13F-HR filings, Form 4 insider trades, 10-K/10-Q/8-K, the public company ticker map.
  • FRED & the US Treasury — macro indicators (CPI, unemployment, yield curves, Fed balance sheet, Treasury General Account) feeding the macro regime engine.
  • CoinGecko — crypto spot prices and market caps.
  • Binance API — derivatives data (funding rates, open interest, long/short ratios).
  • CFTC — COT (Commitments of Traders) reports for positioning extremes.
  • NASA FIRMS — satellite fire detection for Physical Intelligence.
  • Open-Meteo — weather + commodity-region precipitation and temperature.
  • SWIFT / BIS / IMF COFER — currency-share and dedollarisation tracking.
  • Curated social and Telegram sources — the OSINT pipeline pulls from a vetted list of accounts. The list itself is part of Kresmion's editorial work and is not published.
  • ECB Statistical Data Warehouse — euro area aggregate yield curve (daily) for the sovereign yield curve tracker.
  • yfinance — daily options chains (calls + puts × all listed expiries × all strikes) for the risk-neutral implied probability dashboard, plus the close-price universe used by the correlation regime tracker and macro event impact analysis.

Every outbound API request carries a contact-tagged User-Agent so source operators can reach us if our scraping is misbehaving. We respect documented rate limits, back off on 429s, and stop on opt-out.