# Research data conventions [User guide](usage.md) · [Price comparisons](price-comparisons.md) · [Economic statistics](economics-reference.md) · [Market valuation](valuation-reference.md) From an equity's description pane (`DES`), open the pane menu (`.` or `...`) and choose **Company Research** for Supply Chain, KPIs, Guidance, Credit Documents, Government Awards, Catalysts, Hiring Momentum or App Attention. Each opens for the selected listing, retaining its exchange. Disabled functions are omitted. Source evidence and any free-preview limits belong to the destination pane. Historical-price table CSVs retain the selected listing, requested range, UTC date convention, loading or refresh-failure status, and active integrity warnings. Their numeric values use the provider history units. This table's history contract does not supply general currency or price-basis metadata; the export does not borrow those units from a current quote or a saved holding. Use a chart report when independently sourced listing metadata is needed. Preset research ranges and return cutoffs use UTC dates and times. Changing the computer's timezone does not change the selected observations or correlation samples; source request timestamps still use the source's required exchange timezone. Finite month/year ranges preserve the UTC time and clamp dates absent from the target month: March 31 minus one month reaches February 28, or February 29 in a leap year. Price returns use the latest observation on or before that cutoff; history beginning after it cannot supply the requested return. This reference describes how the terminal calculates and labels research data. Pane bodies show data, units, source dates and blocking failures; recurring methodology belongs here. Active data limitations appear as an amber warning indicator in the existing pane footer. Click it or press `!` in the focused pane to read the details; Escape or Close returns to the research view. The indicator disappears when its warnings clear. Headless reports and shared chart metadata retain source details and limitations. Instrument search keeps broker contract definitions distinct when an underlying symbol represents several expiries, strikes or deliverables. A contract selected from search is retained in that research pane, its followers and saved layout; opening another contract does not reorder the shared ticker's broker definitions. Symbol-only lookups that match several saved contracts require a search selection. Contract-specific prices must come from that contract's data context, rather than the app's symbol-only cache. Broker contract panes and charts are retained in local layouts and exports; public symbol-only sharing is unavailable for them because a recipient's market source cannot be assumed to identify the same contract or broker account. An explicitly selected public listing remains public even when the saved symbol also has broker contracts. The pane retains the selected result's name, venue, currency and instrument type separately from the shared ticker record. Public research shares identify the selected venue in the symbol; the recipient resolves public market data for that listing. A local layout can retain broker routing context, while a public URL does not carry it. A quote needs a finite, positive observation timestamp that is no later than the current clock. Missing, invalid or future source times cannot establish a current price, chart update or quote-derived valuation. Receipt time does not replace source time. Retained observations keep their values and existing stale/error status until valid data arrives; historical statement-price observations remain separate. Earnings estimates, corporate actions, analyst research and historical prices retain the last successful response when a refresh fails, with the failure shown in the footer. A failed refresh does not advance the retrieval time. Changing the ticker, venue or request range clears the previous response; explicit account or access rejection clears denied research. A successful empty response also replaces old data. `EE` keeps quarterly, annual and TTM amounts in the EPS and Revenue columns; Event and Period identify the horizon. EPS Surp is the reported EPS surprise, while YoY Growth is an estimate’s growth against its prior year, labelled EPS or rev. A shared currency appears once above the table. `?` after an amount means its source did not state a currency; mixed currencies stay beside their amounts. Known EPS bases remain in row details; open a row for an unknown basis and the underlying inputs. The TTM row of `EE` and `fn events` shows the trailing diluted EPS that `ticker` prints as EPS (TTM), labelled GAAP diluted, so the two agree for a symbol. It is never the sum of the reported quarter rows above it, which can mix GAAP and adjusted figures: only when all four quarters are adjusted does its detail add their sum (`adj sum`). When no trailing figure is served, the row is the four statement quarters' diluted EPS summed, labelled as statements. That sum can sit a cent from the served figure, because a quarter's EPS is over that quarter's weighted share count and the quarters need not add up to the year (PLTR's four quarters add to 1.17, the trailing figure is 1.16). `gloom events ` names each earnings row's known EPS basis and fiscal quarter with the words `EE` uses, and shows an upcoming estimate to the cent with its date status and analyst count. A company's next report is read the same way by `earnings`, `events`, `EE`, `ERN`, `OSA` and the `next-earnings` column of `options --leaps`: the earnings calendar's date, resolved against the quarters the company has on record. A confirmed date beats an estimated one, whichever source has it, and a next date only the calendar knows is added. A date that has passed reads `reported`, as does a report out today once Gloom Cloud has it out, with the actual EPS once it is known and the estimate it was measured against, never the next quarter's consensus. Once the calendar's date has passed, the next date on record, if any, is the next report; `OSA` and the LEAPS column then show it, or none. ## Charts, comparisons, and correlations See [chart history, retention and cadence](data-quality/chart-history.md) for source limits, calculation lookback, interval fallbacks and snapshot replay. Standalone charts bound to follow a research pane retain their range, studies and comparison series when the selected instrument changes. Followed source series keep their identity across saved layouts, even when the selection temporarily matches a comparison. Deleting those followed sources leaves the remaining comparisons independent; it does not make a comparison follow instead. Fixed charts retain their authored instruments. An unresolved contract selection withholds the followed chart until a contract is selected, while preserving its saved settings. Financial series use their selected date basis. When publication dates are missing, affected observations may use period-end dates; the chart warning identifies that fallback. A period-end date does not establish when the value became public. This limitation stays in shared chart metadata and headless output. Bond history currently has no source-declared price convention. Charts retain its raw observations with unknown price units and do not append a current bond quote: that quote's per-unit or percent-of-par declaration does not establish the basis of a separate historical series. Overview price returns also use the historical observations without appending that quote. A numeric ratio between a quote and an old close cannot establish compatible units. Historical values and current source quotes remain separate; this does not add bond historical coverage or reconstruct yield. Local chart snapshots retain the full selected instrument with its captured quote and history, including multiple contracts that share one public symbol. Reconstruction uses only observations captured for that exact contract; older public-symbol snapshots remain usable for public listings. A missing contract capture may be loaded from the corresponding market source, but another contract’s capture does not supply it. Intraday chart captures retain the earlier observations used to calculate studies separately from the visible session. Replaying an authored chart window uses that captured calculation history without adding later prices. Older captures without this buffer can leave studies unavailable when they lack enough observations. Historical price charts retain explicit listing currency and instrument type independently of a current quote. A rejected stale quote can supply those static facts, with its original source timestamp and stale flag in exported `quoteMetadata`; it cannot add a price observation or daily change. Snapshot reloads retain those facts without a live lookup. When optional enrichment supplies a missing field, `fieldSources` preserves that field's separate provenance. Missing or mismatched metadata remains unknown; no currency, FX conversion, or share/contract basis is inferred from a price's magnitude. Market series build their forming bar from streamed quotes: each quote extends the bar's high, low and close, a new bar opens at its boundary stamped at the bar open like source bars, and volume adds the change in the session's cumulative volume, which starts from zero at a new session. Extended-hours prints do not form intraday bars. Daily, weekly and monthly bars take the regular session's price alone: once the session is over the bar's close is the official close the quote reports, so a closed market's last bar is the one `gloom history` serves, and a pre-market print neither moves it nor opens the next day's bar. Shortly after each boundary the recent window is requested so formed bars settle to the source's version; a request that changes nothing waits twice as long before the next, up to ten minutes, and broker-linked instruments ask at most every two minutes. A chart covered by other windows stops building bars and catches up from the stored quotes when it is uncovered. Normalized price charts show closing-price returns in each listing's currency. They exclude cash distributions, reinvestment, and FX conversion. They are not total-return or investor-currency performance charts. Overview, ticker reports and AI ticker context require dated prices covering each fixed return horizon. A newly listed fund's since-inception change cannot stand in for a one-year or three-year return. These outputs recalculate from available observations rather than trusting undated summary percentages in an older cache. A covered, unchanged price has a zero return; insufficient history remains unavailable. Year boundaries use calendar years, including leap years. Fund overview does not currently model expense ratios, NAV premiums or discounts, fund domicile, or distribution and hedging share-class policies. Listing currency is not fund base currency or hedge policy. Dividend cash yield is separate from SEC yield and total return; see [Dividends](#dividends-and-sectors). Daily, weekly, and monthly comparisons use shared calendar dates, with each market retaining its source timestamps. Intraday comparisons require exact shared timestamps. Exchange closing times may differ; weekly and monthly bars can cover a partial period. See [comparison alignment and baselines](price-comparisons.md). `RETURN` lists price returns for one ticker at a chosen interval: each bar's close against the bar before it (interval) and against the window's base (total). The base is the close of the bar just before the window, so compounding the interval returns gives the total; when that bar was not loaded (the source's history starts inside the window, or the window reaches past what the source keeps at that interval) the window's first bar is the base and has no interval return. Bars use the history Historical Prices and charts use: regular-session bars stamped at the bar's open, times in UTC, prices as served (split-adjusted where the history is), without dividends, so these are not total returns. Windows count back by the UTC calendar from now while the market trades, and from its last session's close while it is shut for the weekend, a holiday or the night, so 5D on a Sunday is Monday to Friday and the footer says `market closed, last session Fri 9 Oct`; spot FX closes at 17:00 New York on Friday, and a coin trades around the clock, so its windows always end now. Daily and longer bars count from the window's start date. 6H and 1D also end at the latest bar when it is earlier, so a venue whose hours the app does not know still shows its last session. `gloom fn RETURN VTI --range 1M --interval 1d` reports the same rows; `--range` takes 6H, 1D, 5D, 1W, 1M, 3M, 6M, 1Y, 5Y or ALL and `--interval` 1m to 1mo, and any other value or option is refused with the ones it takes. An interval the source does not serve for the range, such as 45M, is unavailable and the nearest coarser one is used; ALL starts at the source's first bar, not necessarily the listing date. A bar with contradictory OHLC has no price, and the returns that need it are gaps. Correlation and relationship views calculate close-to-close returns between shared observations. They request daily bars regardless of chart preset resolution and clip buffered history to the selected range. Missing dates are not filled to manufacture a sample. Returns use local prices without cash distributions or currency conversion; different exchanges can close at different times. When a pair mixes closes, such as a US equity against crypto, FX, futures or a foreign listing, `gloom correlation` and `fn GR` add one line with each close in UTC and the offset between them; two US equities get none. The relationship ratio reads to four significant digits, so a ratio of 0.000566 is not rounded to 0.0006. Correlation requires enough shared returns and nonzero variance. `CORR` also takes map series beside tickers, for example `CORR FRO, STNG, GEO:HORMUZ`, using the same `GEO:` spelling and series as `G`. A map series is a daily count (vessel transits through a strait) that can be zero on a given day, where a return or log change is undefined, so CORR correlates its change in level between the same shared dates a price uses for its return: a stock's Friday-to-Monday return pairs with Monday's count minus Friday's, and weekend counts drop out. Pearson correlation is unit-free, so the level change needs no scaling. A map series is daily and usually a few days behind prices, so the shared dates end at its latest day. Enter on a pair with a map series charts both in `G`, since ratio and beta are price measures. When the server has no map series, or one name is not found, that row reads unavailable and every ticker pair still computes. Relationship graph controls sit in the query bar: the time range, the rolling observation window, correlation and the fit line. Each is clickable and shows its current state, and `t`, `p`, `c` and `f` still reach them from the keyboard. In both correlation views, `r` refreshes the selected histories. A failed refresh retains the last complete result with its original retrieval time behind the existing warning indicator; a new relationship pair or range cannot inherit that result. A rolling correlation requires the entire selected observation window and nonzero variance in that window; an older valid correlation does not replace a missing latest value. Headless results retain these limitations and the price-return basis. In narrow panes, `+` means enabled and `−` means disabled. Dated missing closing prices remain gaps through history caching and chart extraction, including responses with no usable prices. An alternate source can recover a gap at the same reported timestamp; unresolved dates remain gaps. Missing prices do not establish usable coverage or advance price freshness. An explicit finite zero or negative source price is retained as reported; individual calculations apply their own eligibility rules. Contradictory OHLC bars are unavailable rather than silently repaired. Charts leave gaps and dependent risk calculations can be unavailable. These are current data problems and remain visible in the terminal. Chart controls: select ranges and intervals above the plot; click a legend entry to hide or restore a series; use **+ add series** to add one. In a narrow legend, scroll over the row or use `[` / `]` to reveal each series; Space toggles the selected series. The existing footer offers **Series**, **Indicators**, **Formulas**, and **Share**, also available with `s`, `i`, `f`, and `y`. `b` opens the bar size picker (the interval), and with a broker that trades the symbol `t` opens Trade. Sharing publishes a chart snapshot; pane sharing is available from the pane menu. ## Seasonality `SEAS ` requests monthly bars over the whole history and keeps the last close of each UTC calendar month. Monthly bars because daily history is only served to five years before a provider's own limits are known, and a longer daily request can come back as weekly bars stamped on Mondays, which would file a week's close under the month it started in. When weekly bars are all there is, each close is filed under the Friday that ends its week, so a month runs from last Friday to last Friday rather than from its exact last session. A month's return runs from the previous month's close to its own, so a month appears only when the month before it is in the history; a year's total runs from the prior year-end close. Returns use local prices without cash distributions or currency conversion. The lookback (5, 10 or 20 calendar years, the current one included) is cut from the loaded history, so changing it does not refetch. The latest month is a return to date until December closes the year: the Returns table shows it untinted and marks its year with `*`, and it stays out of the month's average, median and up share. Those statistics cover completed months in the lookback only; a month with few years of history has few observations, and the headless `count` says how many. The Overlay tab draws each year's return since its prior year-end at each month-end on one January-to-December axis. The average path is the mean of the completed years at each month-end every one of them reached; the running year is drawn but left out of it. The Weekdays tab reads daily bars instead: every session of the last five years, the daily history served everywhere, so it has no lookback, and the footer gives the first and last session counted. It has a row for each weekday that held a session and one for each turn-of-month session (a month's last and the next month's first three); the figures above the table pool those four against every other session. - **Sessions.** A return runs from the previous session's close, so a Monday after a holiday Friday runs from Thursday. A bar is filed under its session date: its label, or the venue's local date for a bar stamped at the open or at local midnight. A session still trading when the history was fetched stays out until it closes; a coin's session is a UTC day. - **Weekends.** A venue that traded on a Saturday or Sunday gets a row for that day, and a Sunday-to-Thursday venue's week starts on Sunday. A row of fewer than 20 sessions, such as a few special Saturday sessions, is shown untinted. - **Turn of month.** A session's place in its month is known only once the month before is in the history, and the latest session could still be its month's last, so the first partial month and the latest session count toward their weekday but not the turn-of-month split. - **Weekly bars.** When most sessions are more than four days apart the bars are weekly or coarser, and the tab shows nothing rather than file a week's move under one day. ## Earnings ripple `RIPL` lists the companies that report earnings in the next 30 days and that one of your holdings is tied to: its customers, and its suppliers. With no tickers it checks every US listing in your portfolios and watchlists (up to 60); `RIPL CRUS QRVO` checks the named ones. - **Where the link comes from.** A seller's filing naming a customer with a share of the seller's **revenue**, as `SPLC` shows it. US rules require a company to disclose any customer above 10% of revenue, so these are the dependencies that matter most. **customer of** rows come from the holding's own filings (*says*): the share is of the holding's revenue. **supplier to** rows come from a supplier's filings that name the holding (*names*): the share is of the supplier's revenue, so `91% of CRUS` beside AAPL means Apple buys 91% of what Cirrus Logic sells. The Revenue share column always names whose revenue it is. Shares of receivables or purchases measure something else and are left out. A share marked `*` covers a segment rather than the whole company. - **Which rows.** One row per holding and customer, from the latest filing period. Anonymous customers ("Customer A") and group concentrations have no ticker and cannot be matched to a report. Customers listed outside the US are left out because the earnings calendar covers US listings. - **The report.** Date and time (BMO before the open, AMC after the close) from the earnings calendar, with the customer's mean absolute move over its last reports. **Holding reports** shows the holding's own date when it falls in the window, so you can see whether it reports before or after its customer. - **Limits.** The share is as of the filing period shown, often a year old. Absence from the list does not mean a holding has no exposure: many companies do not name their customers. Free accounts see the top three customers and suppliers per holding, the same preview as `SPLC`. - **Two hops (Pro).** The **2 hops** tab lists companies one step further out that report in the window: a **supplier's supplier** or a **customer's customer** of a holding, from the supply chain graph behind `SPLC` Graph (one graph request per holding, both hops in one answer). It follows supplier and customer links only, backed by filings, company announcements or earnings calls, the evidence `SPLC` shows by default (the graph's `structured` and `primary` evidence classes). News, other reporting and imported relationships are left out, and so are partners, competitors and investments. **Via** names the company in between. **Share per hop** gives each hop's disclosed share as its reporting company's filing states it, holding to via first, then via to the reporting company; `30% of TSM` is 30% of TSM's revenue, another basis is named (`purchases`, `cost`), and `--` means the source names the relationship without a figure. A column too narrow for both hops leaves the second out (`8% of NVDA purchases › …`) rather than cut its figure from the company it is a share of. A company the holding already has a direct link with, in its own disclosures or in the graph, stays on the **1 hop** tab and is left out here. When both directions reach a company, the higher-scoring route is shown. The graph returns at most 50 companies in each direction per holding, highest score first and counting the ones a hop away; when a holding's graph is cut short by that or another search limit, the footer names the holding, and a company missing from the list may still report. The shares are not multiplied in the pane; `gloom fn RIPL NVDA --tab two-hop` adds the graph's chained exposure estimate where every hop is compatible, under the assumptions in [Supply chain](supply-chain.md#graph-and-path-pro), and reports a cut-short graph as incomplete. Free accounts' graphs stop at one hop, so the tab offers the upgrade and makes no graph requests. ## Reverse DCF `RDCF ` turns a DCF around. A normal DCF assumes a growth rate and gets a value; a reverse DCF takes today's value and finds the growth rate. It answers "what does the price already assume?" - **Cash flow.** Free cash flow over the last twelve months (operating cash flow less capital expenditure), from the latest fundamentals. - **Value.** The enterprise value `valuation` shows: market cap plus debt less cash, so the cash flow and the value both belong to all capital providers. Its equity part is measured at the regular session price, the live price while the session trades and the close after it, never an extended-hours print, and the report is dated by that close (`Thu 15 Oct 2026 20:00 UTC · not a live feed (regular close and reported cash flows)`). An EV more than 5% from market cap + total debt - cash is the provider's, printed `(provider)` with the same reconciliation note `valuation` prints (`EV 436.82B USD (provider) vs 472.37B computed from market cap + total debt - cash (balance sheet 2026-06-30).`), and the pane adds `provider vs 472.37B` beside it; a withdrawn one leaves the model uncomputed with the line saying why (see [Financial statements and valuation](#financial-statements-and-valuation)). - **Model.** The cash flow grows at one rate for ten years, then at 2.5% a year forever (a Gordon terminal value), and every year is discounted at the chosen rate (7% to 12%, 9% by default). The growth rate that makes this sum equal the enterprise value is found by bisection between −50% and +100% a year; a price outside that range reads `< -50%` or `> +100%`. The report's headline names both assumptions: `Implied FCF growth, 10 years 30.9% at 9% discount, 2.5% terminal`. - **Implied revenue.** The line under it turns that growth into revenue in year ten: the trailing free cash flow grown at the implied rate for ten years, divided by a free cash flow margin. The margin is the company's own, trailing free cash flow over trailing revenue from the same fundamentals (twelve months, one currency), and the line says so: `Implied revenue, year 10 1.23T USD at 41.9% FCF margin (company TTM)`. A company that keeps 3% of its revenue as free cash flow therefore needs about ten times the revenue of one that keeps 30% for the same cash flow. The pane's **FCF margin** selector (and `--margin 25` in `fn` and `shot`, 5% to 60%) sets another one: `at 25% FCF margin (chosen; company TTM 41.9%)`, and the selector's first choice is the company's own, with its value in the label (`41.9% (own)`). When revenue is missing, or the margin means nothing (free cash flow or revenue zero or negative, or free cash flow above revenue), the report falls back to 30% and names the reason: `at 30% FCF margin (default; no TTM revenue)`. `--json` carries `fcfMargin`, `fcfMarginSource` (`company`, `chosen` or `default`), `companyFcfMargin` and `fcfMarginGap` in `metadata`. - **Past growth.** The yearly growth between the latest annual free cash flow and the one up to five years earlier, when both are positive. When the priced-in growth is above it, the figure is red: the price needs faster growth than the company has delivered. - **Sensitivity.** The table solves the same growth for each discount rate and for terminal growth of 2%, 2.5% and 3%. Selecting a row sets the discount rate. - **Not computed.** Negative trailing free cash flow has no growth rate that prices it. A listing whose cash flows are reported in another currency than its market value (many ADRs) is not converted, and shows why instead. ## ADR vs home `ADR ` opens DES on its **ADR vs Home** tab, which a listing has only when Gloom Cloud pairs it with a depositary receipt (GGAL and GGAL.BA, TSM and 2330.TW, BHP and BHP.AX). Either side works: the receipt compares with its first home line, a home line with its receipt. - **Ratio.** How many ordinary shares one receipt holds, from Gloom Cloud's depositary reference, which checks each ratio against the depositary's notice and both lines' prices. `ticker`, `quote` and DES's Overview state it on both sides: `1 ADR = 10 ordinary shares of GGAL.BA` on the receipt, `1 GGAL ADR = 10 of these shares` on the home line. - **Prices.** Each line's regular-session price through the same quote path as `quote` (an after-hours print never moves it), dated by its last trade, or by the close once the session is over. A price in a minor unit (pence) is read in its currency. - **Implied rate.** home price × ratio / ADR price, home currency per dollar: GGAL.BA at ARS 6,260, 10 shares a receipt and GGAL at $37.91 imply 1,651 pesos a dollar, the CCL rate, against an official wholesale 1,529. - **Premium.** spot / implied rate - 1: what the receipt costs over the shares it holds, converted at spot. TSM's has run above 10% for long stretches, as foreign buying of Taiwanese shares is limited; Argentina's controls put the peso pairs about 7% under the official rate. - **Timing.** The two prices are compared as they are. When one market is closed while the other trades, or both are closed more than 30 minutes apart (2330.TW's Thursday close against TSM's Friday one), a note above the inputs says which price is from when and how far apart. - `fn ADR ` gives the same figures and inputs, and `--json` the inputs' prices and times in `metadata`. For the peso's CCL and MEP rates from the Buenos Aires dollar lines, see `gloom fx USD/ARS` in the [usage guide](usage.md). ## P/E band `PEB ` draws the weekly close against lines at fixed multiples of trailing EPS, so the price can be read against the stock's own valuation history: on the 20x line it trades at twenty times what it earned over the last year. - **Trailing EPS.** Four consecutive reported quarters summed, through the same statement series the charts use. US filers carry their SEC history, and since 2021 a 10-K reports the year but not its fourth quarter: a trailing year that spans such a quarter is the fiscal year's EPS plus the quarters reported since, less the same quarters a year earlier, so NVDA's to April 2023 is FY2023's 0.174 plus 0.082 less 0.064. A quarter whose EPS is withheld or on an unverified split basis, or one that has none outside a fiscal year end, makes every sum that needs it unavailable, and so does a fiscal year on an unverified basis. A reported fiscal year is itself a trailing twelve-month figure: at a fiscal year end it takes the place of the quarterly sum. Other listings have the few years of statements the snapshot carries. - **When it steps.** Each figure takes effect on the date it became public: its filing date, or for a US listing the company's report of that quarter in its earnings history when that came first; for a sum, the latest of its quarters. A later filing that repeats or restates a figure does not delay it: a figure restated onto a later split's share count takes effect at its original filing, because the price history is split-adjusted the same way, and a restated figure takes effect at its quarter's report with the restated value. A figure with neither a publication date nor a report on record steps at its period end, and a footer warning counts them. An unavailable sum leaves the previous figure in force for up to sixteen months after that figure's period end. - **Bands.** Round multiples (1x, 2x, 5x, 10x and so on apart) across the 5th to 95th percentile of the weekly P/E in the lookback, stretched to take in today's P/E and cut to between half and twice it, so a stock that traded at hundreds of times earnings years ago still gets lines near today's price. The finest spacing that needs four lines or fewer wins, widened to three, and the round multiples on either side of today's P/E are always drawn. A line's value more than one and a half times the highest close (or above the line just over today's P/E, when that is higher) is left off the chart, so the price axis stays fitted to the price. A week whose trailing EPS is zero or negative has no P/E and no band. - **Current P/E.** The latest quote over the trailing EPS in force today. Its percentile is the share of weekly P/E readings in the lookback (5 years, 10 years, or everything on record) at or below it; the figure says when the window is shorter than the lookback, and the headless report gives the first week ranked and how many weeks. Per-share amounts keep three significant digits below 1 (0.0690, not 0.07). The table lists each figure with the close of the week it became known and the P/E then. - **Foreign-currency EPS.** A dollar-priced listing whose EPS is reported in another currency (TSM in Taiwan dollars, ASML in euros, BABA in yuan) has its EPS converted to dollars at the pair's completed daily FX close on or before each date: a week's bar date for the band, the publication date for each row of the table, and the latest completed close for today's P/E. The table keeps the EPS as reported, beside the close it was converted at. The trailing sum is converted at one close, not each quarter at its own, and per-share figures are taken as the statements give them: no ADR ratio is applied. YoY growth is in the reporting currency. - **Not computed.** EPS in another currency when the price is not in dollars (no FX cross is taken), when the pair has no daily closes, or when its latest close is more than a week old: the pane says why instead. A week before the first FX close has no P/E. Pence prices against pound statements are scaled without an FX rate. ## Index and ETF members `MEMB ` lists an ETF's holdings with each holding's return, so an index move can be read name by name. It shows the fund's holdings, not licensed index weights. IVV stands for the S&P 500 (a request for SPX or SPY opens it), IJH for the S&P 400, IJR for the S&P 600, IWM for the Russell 2000 and IWB for the Russell 1000. Any other fund, the Nasdaq-100 included, is not covered. - **Holdings.** Weights come from the fund issuer's published daily holdings file, and the header gives that file's date. A weight is a share of the whole fund, so cash and positions the file leaves out are not rescaled away. Only equity lines are listed; swaps, warrants and other derivatives are left out and counted in a notice. A line without a ticker keeps its name, shares and weight but has no price and does not open. - **Returns.** 1D, 1W, 1M and YTD come from the account's quotes: real-time with Pro, where the footer reads `live` and the pane checks again every 15 seconds, and 15 minutes delayed otherwise. Quotes fill the largest holdings first, so a big fund is priced only in part: the footer reads `1D 164/504 · 81.9% wt`, the holdings with a fresh 1D return and their share of the fund. A holding with no fresh quote shows a dash and is not counted. - **Movers.** A holding's contribution is its fund weight times its 1D return, in percentage points. Contributors and Detractors rank the ten largest each way among the priced holdings. Their sum covers only those holdings and is never rescaled for the missing ones; when it differs from the fund's own 1D move by more than 0.15 pp, the pane says by how much. - **Changes.** Index additions and removals with their effective dates and reasons, for the S&P 500, 400 and 600; the 500 also has its earlier history. The Russell funds have none. ## Macro-day reaction `MDAY ` compares how a US listing moves on the days of the main US releases with how it moves on any other day. It answers "does this name care about CPI day?" - **Release days.** CPI and the Employment Situation (payrolls) come from the BLS news release archives, FOMC statement days (the last day of each scheduled meeting) from the Federal Reserve's meeting calendar. They are the days each release came out, from January 2021, not a forecast schedule: a scheduled date counts once it is published, and releases cancelled or moved, such as those of the 2025 government shutdown, are as published. Gloom Cloud reads the archives every half hour and covers a day once 17:00 ET has passed; the app ships with a copy of the list for when it cannot reach Gloom Cloud. Sessions after the list's last covered day are left out of every figure. The report gives that day as `releasesThrough`, and the pane's footer warns when it is more than 14 days before today. - **Move.** Close to close on the release day: the previous session's close to the release day's close. CPI and payrolls come out at 8:30 ET, before the open, and the FOMC statement at 14:00 ET, before the close, so that close carries either. A release on a weekday the market was shut (payrolls on Good Friday) is read on the next session. A release whose close-to-close would span a gap of more than the release day in the price history is left out. - **Brazil's IPCA.** IBGE's monthly IPCA release days, from Gloom Cloud only (the copy the app ships with has the US releases): the days the release calendar lists as out, from January 2021. They have their own row and Release choice, and are summed up on their own: they are not taken out of the normal days and do not count in Any US release, so a US name's figures are the same with or without them. When Gloom Cloud does not list them, IPCA is left out of the figures. - **Actual, forecast and prior.** Each release day carries what came out where Gloom Cloud has it: CPI as `Inflation Rate YoY`, payrolls as `Non Farm Payrolls` and FOMC as `Fed Interest Rate Decision`, from the economic calendar Gloom Cloud has kept; IPCA as the month's change (`IPCA m/m`) and the month before from the central bank's SGS series 433, with the calendar's consensus as the forecast. Older days have none. A print above the forecast is hot, below it cool, at it in line; the pane's Surprise filter and `--surprise hot|cool|in-line` keep those days and sum them up in their own row (`fn MDAY SPY --release cpi --surprise hot`). - **Normal day.** Every other session in the lookback that is not a US release day. PCE and GDP days are not in the list, so they count as normal days. - **Earnings days.** A release day that is also the reaction session of the company's own earnings report (the report date for a before-open or in-session report, the next session for an after-close one, either when the time is unknown) is marked earnings: its move is the report's, so it stays out of the release figures and the normal days, gets its own Earnings row, and is still listed with its release name and "(earnings)". When the earnings dates cannot be read, the report says so and marks nothing. - **Figures.** Average absolute move and its multiple of a normal day's, average signed move, and the share of release days that closed up. With All selected the figures compare the releases; selecting one shows its own. When CPI and FOMC fall on the same day the move counts for both. - **History.** Five years of daily closes at most. The window starts five years before the last covered day, or at the first day of the available history when that is later, and the reported start names it. A release before that first day is outside the window. ## Price history corrections These rules apply to every symbol. The app keeps no per-company history fixes. - **Coverage boundaries.** A source can declare the first date it vouches for, such as a verified share lineage start or a fund's first allowed bar. An empty response for a window that starts before that date is reported as outside the source's coverage rather than as missing data. When a chart's visible window starts earlier, it keeps the returned prices and shows the boundary in the chart warning. The app does not trim other sources' history to that date. - **Leading zero-volume bars.** A series can begin with bars that have zero volume and one price (open, high, low and close equal), such as an offer price dated before the first trade. Those leading bars are dropped only when the next priced bar reports volume within a week. Series without volume, such as FX and most indices, and long-running indices whose early decades carry no volume keep every bar. Aggregated weekly or monthly bars that already include such a price are kept as reported. - **Cache schema.** Cached quotes and financials carry a schema version, and price history cache keys carry a history version. A record written under another version is ignored and fetched again rather than repaired on read, so a correction reaches cached data after one refresh. ## Statement corrections These rules apply to every issuer. The app keeps no per-company statement, earnings or operating result fixes. - **Declared gaps.** A line a source withholds for a period (revenue, operating revenue, pretax income, tax, the net income lines or EPS) stays unavailable through merges, caches and exports. Another source cannot fill it, and charts never recompute it, for example as the full year less the other quarters; a TTM sum that needs it is unavailable too. - **Restatement guard.** A US filer's fourth quarter is its 10-K year less the nine months in its Q3 10-Q, and vendors derive it the same way. When an earlier period of that year is re-reported with a different amount (beyond rounding) after the nine-month figure was filed, the year and the nine months sit on different bases. That line's fourth quarter is then a gap, in SEC history and in the vendor's quarters, until a restated nine-month comparative is filed. Revenue, the three net income lines, pretax income and tax are checked; a directly reported fourth quarter needs no guard. - **Vendor fourth quarters.** When a vendor's full year is within 0.5% of the SEC figure but its fourth quarter differs by more than 5% from SEC's (reported directly, or the year less nine months), the vendor's quarters use another measure and the fourth quarter absorbed the difference. That fourth quarter is a gap; the SEC amount is not substituted. - **EPS consistency.** Basic EPS must agree, within 2% or 0.01, with income to common holders or net income over basic weighted shares. Otherwise it is unavailable, and so is diluted EPS when it also disagrees with income over diluted shares. Diluted EPS is not checked on its own, because as-converted share classes and operating partnership units legitimately change its numerator. - **Reported operating income.** Where the provider has an as-reported operating income, it replaces the provider's normalized figure, which leaves out items such as impairments and credit losses that some issuers report inside operating expenses. Operating expenses become gross profit less that operating income, so each row stays consistent and matches the filing. Revenue concepts for banks are described in [reported bank revenue in SEC history](data-quality/sec-bank-revenue.md). ## Financial statements and valuation Statements are the latest available source snapshots and may include restatements. Historical as-of values are not reconstructed. A period end identifies the reporting period, not necessarily when every metric became public. Extended SEC history includes filed basic and diluted weighted-average share counts, distinct from shares outstanding at a point in time. Quarterly counts use reported quarters, not year-to-date averages. Counts requiring an unresolved or converted split basis are withheld from the SEC projection, as are issuer-wide denominators for ambiguous share-class listings; they are not inferred from EPS or multiplied by a split ratio. The SEC projection also carries cash, cash plus short-term investments, depreciation and amortization, long-term and current debt, and short-term borrowings. EBITDA is operating income plus D&A, not a normalized figure. Total debt adds the current leg to the noncurrent one, except when a filer only tags the bare `LongTermDebt` concept, which already includes current maturities; commercial paper is added only beside the narrower current-maturities concept, never beside `DebtCurrent`. Cash-flow style concepts (operating cash flow, capital expenditure, D&A) are filed year-to-date in 10-Qs, so consecutive spans sharing a fiscal-year start are differenced into discrete quarters: Q2 is six months minus Q1, Q4 is the full year minus nine months. A directly tagged quarter always wins, a differenced quarter becomes available with the later of its two filings, and a restatement between those filings lands in the residual quarter. Income statement fields are not differenced. Financial charts do not reconstruct missing Q4 EPS or weighted-average shares from annual and earlier-quarter values. Annual EPS is calculated independently, and weighted share counts depend on period lengths, share changes and dilution rules. Subtracting reported quarterly EPS or treating four quarters as equal weights can disagree with the issuer's Q4 disclosure. Reported Q4 values retain their own amounts and dates; missing per-share fields remain unavailable while other eligible flow and closing-balance fields can still be shown. A trailing twelve months that spans such a quarter does not need it: its EPS is the fiscal year's EPS plus the quarters reported since, less the same quarters a year earlier, the standard trailing derivation. It becomes available with the latest of those inputs, and stays unavailable when the quarter declares its EPS unavailable or any input is on an unverified split basis. Common-stockholder income is also kept as reported: annual participating-security allocations can differ from the sum of quarterly allocations, so annual-minus-quarter subtraction cannot establish a missing Q4 common-income amount. TTM sums four reported common-income amounts; it does not force that sum to equal the separately reported annual figure. Incomplete common-income coverage keeps the earnings-per-share fallback unavailable even when parent income is complete. Financial table columns name fiscal periods (`FY2026`, `Q4 FY26`). A fiscal year takes the calendar year it ends in, and the latest annual statement sets the quarter boundaries; a 52/53-week year ending in a month's first week belongs to the month before. Retailers that name their year after the one it starts in (a year ending in January 2026 called fiscal 2025) show a year later than their own filings. A period off the fiscal calendar keeps its end date. The query bar gives the currency, the money unit most rows share (rows in another unit name theirs) and the latest period end. Reports and JSON exports keep period end dates and date-source markers: **P** means a provider period date, which may be approximate; **S** means a SEC-corroborated fiscal date. Filing evidence identifies the period without establishing a publication date for every metric. Mixed or missing reporting currencies are not silently converted. The table's TTM column identifies the ending quarter, including when quarterly coverage lags the latest annual report. When the last four quarters are the latest fiscal year, the year is shown alone. Its JSON export retains the four source periods and their date evidence. Derived field availability requires every input used for that field; opening cash follows the first quarter and closing balances follow the last. Filing dates do not fill missing publication dates for unrelated fields. Monetary growth requires matching known reporting currencies. A source-wide reporting currency can fill missing row metadata only when the statement history does not contradict it; headers and exports use the same qualification, including periods outside the selected table. Each row's own reported currency takes precedence. Share-count growth remains comparable across a reporting-currency change; monetary values remain visible without a growth estimate when units are unknown or incompatible. `FA --period annual` and `FA --period quarterly` reports keep the requested coverage and report it unavailable instead of substituting the other period. Interactive tabs select and visibly identify the available period. Overview and ticker-report monetary fundamentals (trailing EPS, revenue, net income and cash flows) are in the currency Gloom Cloud states for them. Without one they are in the statements' reporting currency only when the listing trades in that currency; on a listing quoted in another (a receipt, or YPFD on BYMA in ARS beside USD statements) and when nothing is known they show **(ccy?)**. The listing currency never stands in. On a depositary receipt or another listing quoted in another currency than the statements, the trailing figures are usually the reporting figures converted to the listing currency. Gloom Cloud then states the listing currency and what they were converted from, and the app shows revenue, income and cash flow at its own rate, the one `fx` reports and every other conversion on the screen uses: `ticker`, `fundamentals` and `valuation` add a line under them, such as `TTM converted from EUR at EUR/USD 1.1612, as of 2026-10-13 21:00 UTC; EPS at report-date rates.` for `ticker SAN`, and the Overview's footer notices say the same, while its Latest Annual and Latest Quarter rows stay in EUR. A trailing block a listing's source states in another currency than the statements, with no conversion (YPFD on BYMA: ARS figures beside USD statements), is labelled with its own currency, and `ticker` says `TTM figures in ARS; the statements in USD.` Revenue, income and cash flow are converted at that one rate, EPS at each report date's rate, so a P/E on it divides a spot price by EPS at older rates and differs from the home listing's by the currency move since the reports (SAN 13.10 in New York against 13.66 in Madrid on 2026-10-11); the reports add `P/E (TTM): spot price over EPS at report-date rates.` beside such a P/E. Some listings keep the reporting currency for revenue and income but state EPS in the listing currency, converted at report-date rates: `ticker CCU` prints revenue and net income in CLP, EPS (TTM) in USD and `EPS (TTM) in USD, converted from CLP at report-date rates.`, as Gloom Cloud states the EPS currency separately. When the EPS is in another currency than the price (`ticker LIN:XETRA`: USD EPS, EUR price), the P/E divides the price by the EPS converted at the current rate, which the reports name (`P/E (TTM): price over EPS converted at 1 USD = 0.8924 EUR.`), and live repricing keeps that conversion. Explicit minor units such as GBp remain attached to the original amounts, including EPS. Ticker reports also label statement amounts with each row's reporting currency. Source-wide statement currency fills missing row units only when the annual and quarterly histories do not contradict it. Share counts remain unitless counts; report JSON preserves the original numbers and currency metadata. Reported EPS keeps two decimal places for ordinary amounts and up to four significant digits below one reported currency unit. Values smaller than 0.0001 use scientific notation so small profits and losses remain visible in narrow financial cells. Overview, financial tables, their exports and ticker reports share this precision; raw structured values remain unchanged. This is display precision, not an estimate of the source's measurement accuracy. Chart-derived P/E, price/sales, EV/sales, EV/EBITDA and price/free-cash-flow require compatible price and statement currencies. A statement's own currency takes precedence; aggregate reporting currency fills missing row metadata only when the other statements do not contradict it. Explicit minor units such as GBp/GBX convert to GBP without an FX assumption. Foreign or unknown currency pairs remain unavailable with a chart and export warning. Separately converted summary fundamentals do not establish historical statement units, and this conversion does not change provider share or depositary-receipt bases. These derived multiples omit the Current observation when its quote is explicitly stale or has an invalid price or timestamp; valid historical ratios remain available. Historical calculations select the latest source price at or before the statement's availability date, then validate it. An invalid selected price leaves a gap instead of borrowing an older close. Contradictory OHLC values and rejected quote inputs remain in export diagnostics, and affected exports are marked incomplete. A quote's regular-session high/low does not constrain a valid after-hours price. Current multiples use the latest available reporting period before evaluating the ratio. A loss, missing denominator, or incompatible currency cannot substitute an older profitable period. Automatic period selection uses TTM input coverage rather than whether the resulting ratio is meaningful; known nonpositive TTM earnings do not trigger an annual fallback. Valid historical ratios retain their original reporting dates. The Current point divides the regular session price, as `valuation` measures it: the live price while the session trades, and after the close (overnight, through a weekend, in the pre-market) the close, dated by that close, never a pre-market or after-hours print. It divides the latest trailing twelve months, also on an annual chart: once quarters after the last fiscal year are reported, they replace it, as a fiscal year is itself the trailing twelve months at its end. The trailing P/E's Current point is the one `valuation`, `DES` and the portfolio columns show, the served P/E at that price, when Gloom Cloud serves one over positive EPS; the statements still decide whether there is one. Its series is labelled `P/E (TTM, regular session)` (`PLTR:XNAS P/E (TTM, regular session)` in `fn GE PLTR`). A forward P/E's Current point uses the same price and time. Historical points stay on the close at or before each statement's availability date and on that period's EPS (each fiscal year on an annual chart): Gloom Cloud serves no history of its trailing P/E, so only the Current point is the served figure. Financial charts retain known reporting periods as gaps when a metric is missing or a ratio is unavailable. An incomplete TTM window also leaves a gap until four compatible quarters are available again. Lines break across these gaps, and observation limits count usable values while retaining intervening and trailing gaps. A real zero remains a value. Entirely absent fiscal periods are not reconstructed. An explicit latest gap leaves the idle legend unavailable; selecting an earlier observation still shows its value. Price markers likewise cannot replace a missing latest bar with an older close. SEC EPS uses corroborated split-adjusted share bases. A split the filings state several times, under different dates, is one factor, and each earlier figure converts from its original filing. Two filings that repeat a period's EPS share a basis when their diluted share counts agree at the coarser filing's rounding (a count in thousands against the same count in millions). Unverified bases are unavailable. Nonpositive P/E values display as **N/M** and are excluded from meaningful P/E rankings. So does a trailing P/E beside zero or negative trailing EPS, even when the source serves a positive multiple from an older, profitable period, and a forward P/E beside a zero or negative forward EPS; a forward P/E without its EPS is judged on its own. PEG at or below zero is **N/M** too. JSON exports such a multiple as `null`, with the reason under `fundamentals.notMeaningful`. `ticker`'s Latest Annual and Latest Quarter list `Cash + ST Inv` (cash, cash equivalents and short-term investments as reported) under `Cash`, and Latest Quarter adds `Cash Runway`: the months that lasts at the quarter's operating cash burn and at the trailing year's, each with the period it is read over, or `no burn` when operating cash flow is zero or positive. Values over 120 months display as `> 120 mo`; a short TTM history reads `< 4 quarters`. Financial firms have no runway. A muted line under the section states the method, and another says when an offering prospectus (424B5 or 424B4) was filed on or after the balance sheet date, with its last three distinct filing dates and the count of earlier dates omitted, since the cash shown does not include it. `--json` carries the figures as `cashRunway` and the prospectuses as `offeringsAfterBalanceSheet`. [Financial ratios](financial-ratios.md#cash-runway) has the method. The `fundamentals`, `valuation` and `ticker` commands label EPS, revenue, net income, operating cash flow and free cash flow `(TTM)`: they cover the same trailing twelve months, ending at the latest cash-flow statement. Free cash flow is operating cash flow less capital expenditure as the statements report it, so a company whose capital expenditure line includes purchases of other assets (Strategy's bitcoin) shows a free cash flow far below its operating cash flow. The enterprise value is the provider's, which Gloom Cloud checks against market cap plus total debt less cash from the latest balance sheet it serves beside it, in the same currency. Within 5% it is shown as is. Further off, but within 0.7x to 1.5x, it is labelled as the provider's: `valuation`, `fundamentals` and `ticker` print `Enterprise Value 61.75B USD (provider)` and `EV 61.75B USD (provider) vs 63.75B computed from market cap + total debt - cash (balance sheet 2026-06-30).` under it, and the `DES` overview adds `provider vs 63.75B` beside the EV where it fits. Outside that band it is withdrawn: the reports print `Enterprise Value unavailable` with the provider's figure and the ratio, the overview shows `—` with the same line in its footer, and RV's EV/sales, reverse DCF and the screener's EV/revenue and EV/EBITDA are unavailable too. Every surface reads the one checked figure. Banks, brokers and insurers, and listings whose statements are in another currency than the market cap, are not checked. Portfolio columns and the `DES` overview reprice market cap, trailing P/E, forward P/E and dividend yield from the live price, using the per-share figure served beside each statistic: shares outstanding, EPS, forward EPS and the annual dividend per share, in the listing's major currency unit. A figure is used only when the statistics block is in the quote's currency and the stored value implies a price within a factor of 1.5 of the current one; a share count must reproduce the stored market cap at a price the listing traded at, within 0.5%. Otherwise the stored value is shown; zero or negative EPS reads **N/M**. A per-share figure stays paired with the multiple or yield it was served with, so one withdrawn by the server is never taken from an older cached response. ### Forward P/E history No source serves the consensus as it stood on an arbitrary past day. The `forwardPE` chart field assembles its history from three legs, each named in the point's period label. At each earnings report date, the price is divided by the sum of the next four quarters' pre-report consensus (the estimate each quarter carried at its own report). This is a final-vintage next-twelve-months figure: later revisions are already in it, so it is not what analysts expected on that day. Once the cloud has observed a listing, its daily consensus observations continue the series: the current and next fiscal-year EPS blended by the fraction of the current year still ahead. Today's consensus, blended the same way against the live quote, is the Current point. The provider's own forward P/E is shown only when no estimate history exists. PEG remains a single provider snapshot. `realizedNtmPE` divides the same report-date prices by the EPS actually reported in the following four quarters. It ends four quarters before the latest report and is hindsight, kept apart from the forward series. Both fields require the estimate and price currencies to match, and an NTM sum at or below zero leaves a gap. Chart-derived P/E preserves finite reported diluted EPS, including zero. When it is absent or unusable, the fallback divides reported common-shareholder income by the first positive share count available: diluted average shares, basic average shares, ordinary shares, then issued shares. Aggregate net income is used only when common income is unavailable. This is a derived income-per-selected-share estimate, not reconstructed reported diluted EPS: the source may omit convertible-claim numerator adjustments or a compatible depositary-receipt basis. The app does not guess those adjustments or deduct preferred/minority claims a second time. Reported EPS and the financial-statement rows remain unchanged. A historical multiple is priced on the date its inputs became public. For EPS restated onto a later split's share count that is its original filing, not the filing that evidenced the split, because the price history is split-adjusted the same way (as in PEB). The EPS series itself keeps the restatement's date, since the value it shows is the restated one. TTM fallback income requires four complete quarters of one numerator field; partial common-income coverage withholds the fallback even if aggregate income is complete. When quarters report weighted-average share counts, the fallback also needs one such share field across all four quarters: a missing Q4 denominator cannot become a year-end ordinary or issued-share snapshot. Those snapshots remain available for capitalization estimates. Complete reported EPS still takes precedence. TTM EPS sums four reported quarterly values (across a fiscal Q4 without EPS, the year's EPS carried forward as above), while TTM average shares use the arithmetic mean of four reported quarterly averages; these approximations do not reconstruct independently calculated annual EPS or a daily weighted annual denominator. Availability follows the selected income and share fields, including every quarterly input used in a derived value. Market capitalization can come from a financial snapshot when a current quote does not supply it. Its retrieval time is not its valuation date. Source and freshness details remain attached to the affected value; market-cap comparisons require a valid currency conversion. Relative Valuation excludes explicitly stale quote prices, changes, and quote market caps from comparisons. Its exports retain the original quote, source timestamp and stale status, and identify incomplete output. Separately reported fundamentals and fallback market caps retain their own source and retrieval time; these are not dated by the rejected quote. ### Relative Valuation peers, columns and currency `gloom fn RV --peers` (and `shot RV --peers`) adds four to six competitors to one symbol. They are the covered equities of the symbol's industry, as its profile names it, closest to it in market cap: the ratio of the two caps counts, so a company half the size is as close as one twice the size. Equities that report no revenue figures (a shell or a treasury vehicle filed in the industry) are left out. A short curated map ties together industries whose labels hide the competitors. Its online learning core (Duolingo, Coursera, Chegg, Nerdy, Stride, Udemy) is compared with itself first: one of them gets the rest of the core that the screener covers, closest in market cap, and Education & Training Services fills the table to six. Any other company filed under application software, infrastructure software or internet content whose profile opens on education (`language learning and digital education`) takes its peers from Education & Training Services by market cap, with the core among the candidates. When fewer than four covered equities can be read, the core is used as a curated list instead. The report's title names the method (`peers by industry: Airlines`, `peers by related industry: Education & Training Services`, `peers: online learning curated core, then Education & Training Services`, `curated peers`), a note under the table says the peers were chosen automatically and which came from the curated core and which from the industry, and a capture's title says `auto peers`. JSON carries the choice as `metadata.peerSelection`, with the core's names in `curatedPeers`. The covered universe is the equity screener's, mostly US listings, so a subject abroad is compared with covered names of its industry. `--columns` adds fields from the paths their own functions read: `shortInterest` is FINRA short interest as a percent of float at the latest settlement (as `SIW` computes it), `nextEarnings` the next report date on the earnings calendar with its timing and whether it is confirmed (as `earnings`), `target` the mean analyst target and the analyst count behind the latest recommendation mix (as `analyst`), and `grossMargin` and `evEbitda` the screener's stored figures. Short interest, earnings dates, gross margin and EV/EBITDA cover US listings; a listing abroad is left blank and the report says so. CSV and NDJSON put each field's source and as-of in the two columns after it, and JSON rows carry the same as `Source` and `AsOf`: the settlement date for short interest, the statement date for the screener's figures, and the retrieval time for the earnings calendar and analyst research, which state no observation date. A column whose source needs Gloom Pro or a sign-in says so under the report instead of failing it. `--currency ` converts every market cap into that currency at the US dollar rate of each currency the app's converted totals use (a pence cap is made pounds first). The status line names each rate as a dealer quotes it and its observation time (`market caps in USD at EUR/USD 1.1210 (2026-10-14 06:30 UTC)`), and JSON keeps the cap as served in `marketCapNative` and `marketCapNativeCurrency`. A currency with no usable rate keeps its rows in their own currency, with a warning. Without the flag every cap stays in its own currency. A table whose peers trade on more than one market dates each market's session in the status line (`US, XETRA and EPA Tue 13 Oct 2026 close`) instead of only the newest row's. The pane converts every cap into the app's base currency (MCAP USD) and its footer names the rates the same way (`MCAP USD at EUR/USD 1.1197 (2026-10-23 11:47 UTC)`); `shot RV` ends with each market's session, the delay and that footer. The report, the pane and a capture also say what the figures run through: `fundamentals through 2026-06-30` is the newest statement period behind the trailing-twelve-month figures (P/E, EV/S, FCF yield, operating margin), with each peer dated otherwise named beside it (`(AAPL 2026-06-27)`). Quarter Revenue YoY (`Q REV%`) is the latest quarter against the same quarter a year earlier: `for that quarter` when that is the quarter the fundamentals run through, else `quarter to 2026-03-31`. An added column dated by its figures says its basis too: `Gross Margin: fiscal year to 2025-12-31`, `EV/EBITDA: statements to 2026-06-30`, `Short % Float: settlement 2026-09-30`. JSON rows carry the dates as `fundamentalsThrough` and `revenueGrowthQuarter`. `--peers` on a word that is no ticker (`fn RV duolingo --peers`) says so and names the search to run, as a list with that word does. Financial statements do not include bank regulatory capital (CET1, risk-weighted assets) or REIT FFO/AFFO. Operating cash flow is not a substitute for FFO/AFFO. Each view shows one market cap, the same in `RV`, `valuation`, `fundamentals`, `ticker` and `financials`. Where the provider's is more than 2% and at most 10% off the shares outstanding shown times the price (an older price, a recent issuance), the views show the product, and the note names the provider's: `Market cap 23.82B AUD is the 1.99B shares shown x 12.00 AUD; the provider's is 24.53B AUD.` (`EVN:ASX`, October 2026). Further off, the count shown is not the cap's (one class's beside an all-class cap), so the provider's stands and the note says so: `Market cap 79.11M USD is the provider's and does not rest on the 72.23M shares shown (x 0.7133 USD = 51.52M).` A blank `RV` cell says why in the table and in the export's `status` column: `not reported`, `quote stale`, `no TTM FCF`, `FCF ccy unstated`, `revenue ccy unstated` (the TTM block names no currency, so a revenue figure is not divided into a cap that may be in another), `EV unavailable`, or the other currency a figure is in (`revenue in USD`). Relative valuation retains stale fundamentals for inspection and marks them through the existing warning indicator, independently of quote freshness. Its CSV export includes quote observation time and fundamentals source, retrieval time, and stale status. Structured reports preserve the same provenance and report incomplete freshness until the source recovers. Retrieval time does not establish a ratio's valuation date. The current overview and peer table do not provide P/B, P/tangible book, CET1, or FFO/AFFO multiples. Financial-statement common equity and ordinary shares are dated balance-sheet inputs; weighted-average EPS shares belong to an earnings period and cannot replace period-end shares in a book-value calculation. A provider's tangible-book amount may differ from the bank's reported tangible common equity because of its adjustment policy. Compare issuer definitions and periods before combining these values. REIT GAAP P/E and generic cash-flow yield do not establish FFO/AFFO valuation or distribution coverage. Statement values that conflict with issuer filings, or with the rest of their row, follow the [statement corrections](#statement-corrections): they are unavailable rather than replaced, and structured reports list them in `unavailableFields` and `unavailableEarnings`. ### SEC income attribution SEC `NetIncomeLoss` supplies parent-attributable net income. `ProfitLoss` is shown separately as **Income incl. NCI**, and `NetIncomeLossAvailableToCommonStockholdersBasic` supplies **Income Common**. These measures are not interchangeable. A period with SEC income coverage retains its concept, unit, accession, start/end dates and filing date per field in structured financial exports. Missing income concepts in those periods remain unavailable through provider/cache merges and derived fourth quarters. Consolidated income is not substituted for parent income. When common income is explicitly unavailable, parent income is not used to estimate earnings per common share or P/E; independently reported EPS remains usable. Income revisions use their own filing evidence, separately from other fields on the same row. Undated or generic vendor income does not establish an SEC attribution basis. This separation does not resolve cross-filing accounting revisions; the [restatement guard](#statement-corrections) only keeps a fourth quarter from mixing them. Latest source data can include restatements; historical publication-time vintages are not reconstructed. ## Insider filings Form 4 values are in US dollars, and every row of `fn INS` carries `currency`. With a base currency other than USD, INS names the dollars as PF names a holding in another currency: a CCY column after Value, Price and Value without the `$`, and the 90-day totals in USD (`1.2M USD`). `fn INS` then labels Price and Value (USD) and adds each value in the base currency at the daily FX close of its transaction day, or of the trading day before it, with that rate, written as markets quote the pair (`USD/CAD`, `EUR/USD`) and named in `fxPair`. INS retains Form 4 and Form 4/A disclosures separately, with their filing accession, source filing date, transaction dates, reporting owners and explanations. An amendment is labeled in the list; opening it retains its declared original filing date, footnotes and remarks. The existing filing action opens the SEC source. Reports preserve those fields and the transaction's footnote references; the text report prints an amendment's original date, remarks and footnotes under its own row. A company's SEC filing list also holds the Form 4s it filed as an owner of another company's shares (a bank buying out a listed subsidiary, a drug maker converting a partner's notes). INS, `fn INS` and `insider` keep only the forms whose issuer CIK is the company's own, so those never read as its insider trades. A company whose newest report is a 20-F, 40-F or 6-K reports as a foreign private issuer; its insiders file no Form 4, and when none of the listed forms is its own, all three say so instead of showing an empty list. A listing outside the US is looked up by its company on its own exchange: Sanofi in Paris reads Sanofi's filings, and a company the SEC lists nothing for says so by name (`CAR Group (ASX) files no SEC reports.`). `filings` reads a venue suffix as `quote` does (`NST.AX` is `NST:ASX`) and, for a listing abroad, ends on the page its exchange publishes company announcements on (ASX's and NZX's page for the company; SEDAR+, TDnet, HKEXnews, RNS, Euronext and the other venues' disclosure search); `fn SEC` does too, and the SEC pane links it in its footer. A company on ASX that files nothing with the SEC lists its latest ASX announcements instead, newest first, with whether ASX marked each price sensitive and its document link; `--count` takes up to 50. A company from abroad with no Form 4 of its own also says that its home market's insider reports are not covered: `Canadian insider reports (SEDI) not covered.` for Royal Bank of Canada, whether asked as `RY:TSX` or as `RY` in New York (the company's country comes from Gloom Cloud's issuer listings, else the listing's exchange). UK PDMR notifications, Australian Appendix 3Y notices and European MAR managers' transactions are named the same way; another country reads `Insider reports filed in Japan not covered.`, and a foreign filer whose country is not known `Home-market insider reports not covered.` `insider` leads with INS's summary of the company's latest 20 Form 4 filings, as `fn INS` gives it in its metadata (`Loaded filings, last 90 days: Common Stock: Sold 236.3k shares ($61,986,736.56)`), then how many Form 4 lines they hold and the newest filing date, with `gloom fn INS ` for the lines; it is dated by that filing. Its holder table and heading facts appear only when the 13F holder list names insiders, so a list that names none never reads as "none reported". `--json` carries the summary as `metadata.form4` (`summary`, `lines`, `filings`, `newestFiled`, `notCovered`). [SEC Form 4, General Instruction 9](https://www.sec.gov/files/form4.pdf) permits amendments that add lines, correct particular lines or explain other changes. Unchanged original lines need not be repeated. The original filing date and owner CIKs can narrow the potentially affected filings, but do not identify transaction lines to replace. INS therefore keeps the disclosures as filed without inventing replacement or additive transactions. Affected security/side totals are unavailable; independent filings remain usable. Missing amendment identity broadens the uncertain scope. Unknown prices remain unknown. The 90-day summary covers non-derivative purchases and sales; INS reads every Form 4 filed in the window, up to the latest 120, and flags the totals as partial only past that cap. Amendment status uses the existing footer. Headless reports retain the candidate original accessions and mark affected output incomplete, including an amendment that contains explanations without transaction lines. Owner filtering preserves amendment context for the selected owner's original filings. The loaded window is limited; this is disclosure history, not a reconstructed position ledger or a guarantee that every later amendment has been loaded. ### Insider activity (INS alone) `INS` with no ticker typed and none active, and `fn INS` without one, rank the companies whose insiders bought, or sold, their own shares in the open market lately. **Buying** and **Selling** switch sides in the query bar (`--side buy` or `sell` in `fn INS`, buying by default); the window is 30 days, or 7 or 90 (`--window 1` to `90`). Each row says why in columns about its lead insider, the one with the most dollars: **Role** (their role, and `+2` when two others traded too), **Nth** (their nth buy, or sale, in the 90 days ending on their last, `1st` for a lone day), **Vs Usual** (their largest day against their usual size, `2.8x`, `100x+` at the cap, a dash without the history to say) and **Stake** (`+56%` of their holding, `6x` for one raised more than fourfold, `NEW` for a new position or one tiny before, `-39%` of the stake sold, `EXITED` for a whole stake sold). An insider who bought and sold in the window, the smaller side a tenth or more of what they traded, is counted on the net: their stake carries a muted `±`, and Nth and Vs Usual show a dash. Every column sorts from its header; a dash sorts last either way. A narrow pane, 640 px or an 80-column terminal, drops Vs Usual first, then Nth, then the company. `fn INS` prints the same columns and fits them in 120 columns; on a narrower table Vs Usual, Nth, the company and the filing day move under the row in that order. `--json` keeps each row's `why` and `reasons` in full sentences beside the structured `whySignals`, adds the columns' figures (`role`, `nth`, `vsUsual`, `stake`, `stakeBothWays`), and lists each row's insiders in `buyers`. Enter or a double click opens the company's own INS in the pane, the same view `INS ` shows, with its ticker and name once in the title and Back in its query bar. It lands on **Insiders** over the ranking's window, the ranking's side's dollars first, since that continues the row: one row per insider in the ranking's columns (Insider, Role, Nth, Vs Usual, Stake, Bought, Sold, Last), each header sorting. **Trades** beside it is INS as before. Esc, Backspace or **Back** returns to the ranking on the same row; with a trade open, Esc closes the trade first. The company stays open when a refreshed ranking no longer lists it. `fn INS` text no longer prints each row's insiders under it: `fn INS --view insiders` prints them, and `--json` keeps every row's insiders in `buyers`. With a ticker typed or active, `INS` opens that company as before. #### A company's insiders (INS on a ticker) INS on a ticker has two views in its query bar: **Trades** (the default: the 90-day totals, the Insider and Type filters, each Form 4 line as filed, Enter opening one) and **Insiders**: one row per insider who bought or sold in the open market over the window (30 days, or 7 or 90), with the ranking's definitions, read from the same server that scores the ranking, so an insider never reads one way in the ranking and another here. Each insider is on the side their trades net to: **Bought** or **Sold** holds the dollars and the other column a dash; one who traded both ways carries the muted `±` on the stake, as in the ranking. **Nth**, **Vs Usual** and **Stake** read and colour as the ranking's, `NEW`, `EXITED` and the dash included, and narrow panes drop Vs Usual, then Nth, as the ranking does, then Last and Role, so a phone keeps both sides' dollars. Any company works, ranked or not: the server answers one company whatever its size and with every insider, where the ranking lists a company's ten largest and leaves out the smallest companies. A company whose insiders did not trade in the open market in the window says so, with Trades a click away. Enter on an insider shows Trades with the Insider filter set to them and the Type filter on buys and sells. `fn INS --view insiders` prints the same table (`--window`, and `--side sell` for the sellers' dollars first); `--view trades` is the default. The filters sit beside the side and window, kept with the pane, and `fn INS` takes them as options: | Filter | Query bar | `fn INS` | |---|---|---| | Whose trades | Role: All, Officers (chief officers, the chair and other officers), Directors, 10% owners | `--role all\|officers\|directors\|owners` | | Size | Min: Any, $100k+, $250k+, $1M+, $10M+ | `--min-value ` | | Several insiders | Cluster | `--cluster` | | New positions (buying) or whole stakes sold (selling) | New, Exited | `--new`, `--exited` (`--new` is a buying filter, `--exited` a selling one) | | Market value | Cap: All, Micro (under $300M), Small ($300M to $2B), Mid ($2B to $10B), Large (over $10B), shown when Gloom Cloud has stored values | `--cap micro\|small\|mid\|large` | Switching sides turns New or Exited off. A narrow pane folds the bar as far as it must for every filter, Cap and `clear` included, to fit its one row: the window becomes a menu, the terminal shortens Side to Buy and Sell, Cluster and New or Exited become one **Only** menu (Any, Cluster, New or Exited, Both), then Side becomes a menu. Ticking a box or switching sides never refolds it. When a side or a set of filters fails to load, the body says so with Retry under the query bar; the rows before it stay on screen only while it loads. The role filter ranks only that group's trades, so its clusters are among that group; the others pick rows from the ranking. `--json` carries the side, the filters and each row's `marketCap` (null when no value is stored). Only open-market purchases (Form 4 code P) and sales (code S), on non-derivative lines, by officers, directors and 10% owners count. Gifts, awards, option exercises, tax withholding and every derivative line are left out, and so are forms a listed company filed as an owner of another company's shares, as in INS for one company, and registered closed-end funds, whose INS shows no insider trades. A sale counts only when the insider chose it that day: not under a Rule 10b5-1 trading plan (the form's box, or a footnote naming one), not shares sold to cover the tax on vesting, not shares from options exercised the same day, and not sold in an offering, into a deal or to a named buyer in a private transaction. A block of $10M or more traded at one price on one day, with no footnote reporting fills, is taken for an offering on either side when the company filed a prospectus or registration within five weekdays of it. An insider who bought and sold in the window counts once, for the difference, on the side it falls. A Form 4/A replaces the trades of the form it amends, and the same trade on two forms counts once. A company's score, 0 to 100, adds what the reasons say: several insiders trading within 30 days, one insider trading again within 90 days, the dollars, the biggest day against the insider's own earlier trades, and the stake (the holding a buy adds to, or the part of everything the insider holds a sale took, units convertible to shares included), weighted by role and halved for every 14 days since the latest filing. Buying weighs chief officers and the chair above other officers and directors, 10% owners least; selling weighs the CEO and CFO most and 10% owners, often a fund trading its book, far less. Small trades count for little: repeat, usual-size and stake points fade out under $250K bought or $1M sold, and selling lists a company from $100K sold ($25K bought). The footer dates the newest filing read; when the window reaches back past the first day of filings read, or holds days an outage left unread, an amber notice says so. ## Institutional holdings HDS lists each holder's shares as of its reporting period. On a US listing Mkt value is those shares at the latest price, so it differs from the value reported in the 13F filing, which is priced at the period end. The 13F pane shows the reported value. On the home line of a company with US depositary receipts (BHP in London or Sydney, Toyota in Tokyo) Gloom Cloud ties each 13F row to the receipts or to the ordinary shares it was filed under and values it at that security's dollar price at the report date, so the report says "x period-end price (USD)" and the values are in dollars even though the line quotes in pence or yen. On a US listing the 13F holders are every filer that reported the security for the latest quarter, from the same SEC 13F holder index `fn 13F ` lists, largest first: the HDS pane loads them 25 at a time as the table scrolls, and `fn HDS`, `holders` and `13f` print the largest 25, or as many as `--limit` asks up to 200, and say "N of M holders" with M the filers in the index (567 for PBR at 2026-06-30, as `fn 13F PBR` counts). Each filer's shares are summed over the ticker's CUSIPs and compared with its own position a quarter earlier when both of its reports are complete; a new position has a change and no percent. The rows keep the units of Gloom Cloud's own list: shares at the latest price, and the stake as a share of the class that list divides by (PBR's receipts stand for the common shares alone), so a filer that is also on that list reads exactly as it did, under that list's spelling of its name; the others keep the name they filed under. Sorted by anything but size, the rows are the largest that were loaded, and the report says so; `--tail N` in `holders` and `13f` is the end of the rows loaded, not the smallest filers, and a warning says so. A page past the first that cannot be read leaves the holders already loaded, with a warning that the rest could not be read. A listing outside the US, and a US listing whose index cannot be read (no 13F CUSIP, Gloom Cloud unreachable), keep Gloom Cloud's list: its largest institutional holders, usually without a count of all holders, so the commands and the HDS report say "top N reported" rather than implying a full list; when it gives a total they say "N of M holders", and since that list stops at ten, the report says so and points to `fn 13F `. Their text opens with one line naming the company, listing, the values' currency and as-of date (HDS leaves the date to its closing line): every money column names its unit, which is the currency Gloom Cloud states for the values, else the listing's (a London line's values are then in pence, GBp, not pounds), and "values in USD" when the two differ. Each row is the holder's latest filed period, so the line claims one "as of" date only when every row shown has it; rows of different quarters read "latest period per holder", and each row keeps its own date (Date in `holders`, Period in HDS, `reportDate` in CSV and JSON, with the distinct dates in `metadata.reportDates`). Holders are ordered by value, and a holder the list gives no value for sorts after every valued one, with a note saying how many. A stake without a reported percentage is the value over the market cap only when both are in one currency. On a listing outside the US the holders are still institutional filings, mostly US 13F; they are not the local share register, and the report says so. Foreign ordinary shares are rarely 13F securities, so such a list is the few filers that report the line at all (CAR Group's ASX line has one, Pacer Advisors with 387 shares): it reads "N holders reported" instead of "top N", and the note says the line's largest holders may be missing. A row held as depositary receipts on such a list is marked `ADR` (a Basis column in text, a badge in the pane), with the ordinary shares per receipt in the notes; on a receipt line itself the notes say the shares are receipts. Many sources report no change against the prior quarter: the HDS report and pane then leave out the CHG columns and point to `fn 13F `, which compares the filed quarters. `holders`, `insider` and `13f` list the holders in the HDS order, largest value first, and their `--csv` and `--json` are the HDS report's rows: the same columns (with the CHG columns when the source gives a change), the value as a number in the currency its header names, shares as a number, and the quarter's change and the stake in percent (`0.59` is 0.59% of the shares outstanding, never the fraction 0.0059 or a shortened `1.19B`; a position that more than doubled reads `108.6`). A figure the source did not give is an empty cell, and `—` in the text report and the pane. `--json` names those units in `metadata.units`. On a US depositary receipt, shares outstanding (and the market cap built on it) is the company's share count expressed in receipts, so `ticker`, `fundamentals` and the overview mark it "ADR equivalent", and the text reports add the ordinary shares behind it when Gloom Cloud gives them ("2.54B (ADR equivalent = 5.08B ordinary shares)"). The label follows the share basis Gloom Cloud states for the record; without one, its depositary-receipt flag; and only when the service states neither (an older service, or a listing it has no evidence for), the instrument type, the name, or a profile that opens by naming the security as an ADR. A flag of false keeps the label off even when the profile mentions receipts, and the ordinary lines abroad never carry it. Statement rows on the receipt basis are labelled the same way: `ticker` marks their diluted shares "ADR equivalent", and `fn FA` puts the share-count lines in ADRs ("Ordinary Shares (bn ADRs)") with a note that EPS is per ADR and the ordinary shares per receipt. A period without a stated basis keeps its source label, and share counts and EPS show no growth across periods on different bases. The 13D/G tab reads Schedule 13D and 13G filings about the issuer from the last four years. Percent of class, shares and the event date are as the filer reported them on its cover page, so a row is the filer's latest disclosed stake, not its holding today; CHG is the difference in percentage points from the same filer's previous report. The percent is as filed: the filer's shares over the share count it used then. When that count (the shares over the filed percent) is no longer today's shares outstanding by more than the filed percent's rounding (0.1 point, or 2% of the stake), a line beneath the row sets the same shares against today's count, such as `about 49.4% on 35.26M sh today` for a 13D filed at 45.0% of 38.74M shares; `holders --form` and `fn HDS --form` show it as `% Today` (`percentToday` in JSON, with today's count as `metadata.sharesOutstanding`). A count more than half again or a third below the filing's base is taken to be another class or unit and gets no estimate, and so does a depositary receipt without the ordinary shares behind it. A row is named by the reporting person whose stake it shows (the highest percent on the cover, then the most shares, the filer's own entry on a tie), in the filer's own spelling when the cover writes that name in capitals; `+N` after the name counts the other reporting persons on the same report, such as a group's members or a fund's adviser and principal. A report that could be read only from the EDGAR index lacks those figures, and they stay blank rather than being estimated; a footer warning counts those reports and any that could not be read at all, and a list whose filings all failed to read says so instead of reporting no filings. A cover whose share count is missing, or is zero beside a positive percent (no count is both), leaves Shares missing (`—` in text and the pane, an empty CSV cell), never 0; a 13G with one reporting person takes the count from its Item 4 instead. A stake reported under 5% is still a stake: it keeps its percentage, marked `<5%`, and the filer has no duty to report further changes. Only a report of zero (0% and no shares, or one of them with the other not given) reads as `EXIT`; 0% beside a share count is not an exit. While some filings could not be read, a filer's row may not be its latest report, and the footer warning says so. History rows (`--history`) carry no previous report, so their change is blank. The 13F column joins the filer to the HDS holder list by the CIK of the holder's matched 13F manager, otherwise by an exactly matching name; a filer that files under another entity name than its 13F manager, or a holder list without quarter changes, leaves it blank. A 13F filing lists a manager's long positions in US-listed equities as of a quarter end and is filed up to 45 days later: shorts, cash and most foreign stocks are absent. A fund's 13F report opens with the period, the date it was filed and how many days after quarter end, and its closing line is dated by that filing. When the latest filing is two or more quarters behind the latest quarter managers have had time to report, the report and the pane's Reported figure say how many quarters old it is, and a fund search names those funds. A fund with no holdings report for the newest quarter past its deadline (45 days after quarter end, moved past a weekend or Presidents' Day) is flagged in its report, the pane's notices and a fund search. The 13F holdings source lists holdings reports only, so Gloom Cloud reads the fund's own EDGAR filing list (cached for half a day) to tell why: a 13F-NT, filed when another manager reports the holdings, names that manager and its CIK from the notice's cover page, with the filing's EDGAR link and date; a report EDGAR has that the source has not loaded yet is said as such; otherwise the line reads `No 13F for Q2 2026, due 14 Aug`. When EDGAR's list could not be read (no answer within 4 seconds, or a failure), nothing is claimed about what the fund filed: the line reads `Q2 2026 13F (due 14 Aug) not in the loaded filings; EDGAR not checked`. A fund search asks EDGAR about the first 10 lagging funds it lists and says when there were more. A manager that filed under several names (PERSHING SQUARE HOLDCO, L.P., then PERSHING SQUARE INC.) is listed once, under the name on its latest filing. Filings report values in dollars, but some managers still report thousands of dollars; Gloom Cloud restates such a filing to dollars (its values, total, weights and the Est P&L that follows from them) when its positions' value per share sits a thousandfold below the quarter-end close, and the fund's text report says "Values restated from thousands" with the quarters it applies to. For 13F option positions, reported values and shares refer to the underlying security (notional). The 13F percentage is the share of reported value, not an option premium or portfolio delta. The holdings table names the position type (CALL or PUT); the text report marks it `CALL*` with a note, the pane says CALL/PUT is underlying value above the holdings of a fund that has any, and exports keep the plain type and this value basis. Congress research uses House Clerk and Senate eFD periodic transaction reports, merged into one index ordered by filing date. Ticker searches filter the trades extracted from each filing window, not the filing index itself. An empty window therefore does not mean that the ticker has no disclosures in that year. The Congress tab and `CG` keep the next window available, and earlier years are requested explicitly. Pending document processing and failed source reads are reported in the footer warning and in structured pagination metadata. Incomplete filing coverage and unreconciled amendments appear in the pane’s warning indicator; open it to inspect the affected reporting periods and filings. ## Treasury auctions AUCT dates are auction dates, not issue or maturity dates. Term sorting uses every component of the published term, including reopening months; nominal day equivalents only order those labels and do not calculate remaining maturity or settlement cash flows. Unavailable metrics and unrecognized terms sort after known values in either direction. A published zero remains zero. The rate column currently exposes bill investment rates and note/bond/TIPS high yields in percentage points. Bill investment rates differ from bill discount rates; TIPS yields are real yields. FRN auction discount margins, fixed spreads, and issue/maturity dates are not currently loaded, so AUCT does not provide an FRN coupon or a settlement cash-flow forecast. Treasury distinguishes these fields in its [auction overview](https://treasurydirect.gov/auctions/) and [FRN description](https://treasurydirect.gov/marketable-securities/floating-rate-notes/). Prices are quoted per $100 principal. ### Search The search takes a security type (bill, note, bond, TIPS, FRN, CMB), a benchmark, a term, a CUSIP or a date (`YYYY-MM-DD`, or the start of one). - A benchmark is `10Y`, `10yr`, `10-year` or `10 year`, and likewise `2Y`, `3Y`, `5Y`, `7Y`, `20Y`, `30Y`, or a bill such as `13W` and `52 week`. A reopening belongs to the benchmark it was auctioned as. Treasury reopens a security with the term it has left, a month or two after the new issue, so any term with a year part rounds up to the next whole year: 9-Year 10-Month is the 10Y, 29-Year 10-Month the 30Y, 19-Year 11-Month the 20Y. The literal term text still matches too, so `9-year` finds the same reopening. - TIPS and FRNs stay out of a benchmark search, so `10Y` lists the 10-year notes and not the 10-year TIPS, and `2Y` the 2-year notes and not the FRN that reopens as 1-Year 10-Month. Name the type to include them: `10Y TIPS`, `tips 10-year`, `frn 2Y`. - A CUSIP matches whole or in part, in any case, from four characters (`91282CRF0`, `82crf`). A reopening repeats the CUSIP of the issue it reopens, so a CUSIP lists the new issue and every reopening. ### History windows The default window is 120 days. `--historyDays` and the pane's History window setting take 30, 90, 120, 365 (1 year), 1825 (5 years), 3650 (10 years) or `all`, every auction Fiscal Data holds, back to its first on 1979-10-31 (about 11,000 auctions). A window in days is requested from Fiscal Data in pages of 1,000 auctions (about 400 auctions a year, four pages for ten years) and cached on its own for an hour, so a ten-year window loads in a few seconds the first time. `all` is two walks: the auctions since 1 January of last year, cached for an hour like the other windows, and the archive before that date, requested in pages of 5,000 (half Fiscal Data's 10,000-row limit, three pages of about 3 MB) and cached for 30 days under that date, since results that old do not change. A refresh refetches only the recent side, and the archive is requested again when the year turns. Both must load: a board without its archive would pass for the whole history. When a window is shorter than `all`, the headless report names the next one (`Older auctions: use --historyDays 365`), and an empty search names the window it looked in. Treasury's data has bid-to-cover regularly from late 1999 and the indirect, direct and dealer split only from 2008-04-07, so nearly every auction before late 1999 has neither and the 1,630 from 2000 to 2008-04-07 have bid-to-cover without the split. Those cells are blank; `—` (`-` in the CLI text) is kept for an announced auction whose results are not out yet. The report's note about blank cells appears whenever a row it lists lacks either. ### Bidders and stop-out Indirect, direct and dealer are each accepted dollars divided by competitive accepted dollars, which leaves out noncompetitive, FIMA and SOMA add-on awards. The three add up to 100% of competitive accepted. Indirect includes customers bidding through a direct submitter. Nothing is shown as a share when a leg or competitive accepted is missing, or competitive accepted is zero. Stop-out vs average (the `VS AVG` column, in basis points) is the high yield minus the average/median yield Treasury publishes for the same auction. Today's single-price auctions publish the amount-weighted median accepted bid. For bills it is the high discount rate minus the average/median discount rate, which is how bills are bid. FRNs and auctions missing either leg show no value. This is not a tail. A tail is the stop-out against the 1 pm when-issued yield, and Fiscal Data does not carry when-issued yields, so AUCT cannot show one. Stop-out vs average says how far the last accepted bids cleared above where most of the auction priced. `catalog tail` and `catalog stop-out` find AUCT. ### Refresh integrity All response pages must declare the same positive integer page count and load successfully before the board replaces cached history. Missing, invalid, or changing page counts, malformed or missing pages, invalid records, or more than twelve declared pages fail the refresh; the last validated board retains its original retrieval time and the active failure appears in the footer and headless errors. A headless report with a failed refresh is incomplete even when retained rows remain usable. A successful refresh clears that failure. Previously cached boards are invalidated when a release adds fields to them, so a cached board never lacks a column the pane shows. This cache validation does not certify that the provider reported every auction or support future rate forecasts. ## Treasury curve `WIRP` and `FFIP` open the same US rate-path pane. Gloom Cloud assembles dated Fed funds (`ZQ`) and quarterly SOFR (`SR3`) futures with FRED effective Fed funds and target bounds. The app makes one Cloud request. A missing endpoint or unavailable contract leaves an explicit unavailable state; a failed refresh retains the last response with its original source dates and a stale warning. The futures are delayed CME quotes: the report ends `Source: CME futures · Mon 12 Oct 2026 09:35 UTC · 10 min delayed`, 10 minutes being CME Group's minimum delay for delayed data. That line describes the contracts alone: the newest contract quote dates it, and an oldest date or a stale count appears only when a contract is itself older or stale. The FRED policy rates keep their own date and stale flag in the Current policy rows. The Fed funds quote implies the month's average EFFR as `100 - price`. The first complete following month without another scheduled decision establishes a post-meeting rate; otherwise calendar-day weighting isolates the rate after the meeting. A current-month decision requires the realized EFFR observations before it. Quote legs pair when they share a New York date or a CME trade date; legs from different sessions use their latest shared daily settlement, dated as such. Missing anchor contracts leave that meeting unavailable, so Cloud fetches one contract past the last displayed meeting as an anchor. SOFR futures describe a quarterly compounded rate and do not supply FOMC probabilities. Rates are percentages; changes are basis points. Futures prices include risk premia and do not establish a forecast. The probability heatmap is a two-outcome model on adjacent 25bp target midpoints, conditional on a constant spread between EFFR and the target midpoint. It is not CME FedWatch or a distribution reconstructed from options. Row probabilities sum to one only where the model is available. Missing probabilities remain unknown. The table's VS NOW changes compare the implied EFFR with today's EFFR, not the previous meeting; MOVES is the same change in 25bp moves (`+0.62` is most of one hike priced by that meeting). P(MOVE) is what is priced at that meeting alone: the step in the implied rate since the previous meeting, or since today's target range for the next meeting, read as odds of one 25bp move under the same two-outcome model. For the next meeting it equals the heatmap's probability for the range one move away, and it is the pane's lead figure. Above 100% means more than one move is priced at that meeting. A meeting after an unavailable one has no P(MOVE). Select a meeting to inspect its source availability through the footer warning. One-year percentiles use the dated history of the same contract or rate, with midpoint ranks for ties and explicit sample counts. A contract with insufficient history has no one-year percentile. Ghost paths use the same future meeting dates with contract observations available at the requested earlier date; they do not fabricate expired contract histories. Missing nodes break the curve. The path and its ghosts are drawn as steps, since the policy rate holds from one meeting to the next. The figure beside it is the change in the implied rate from the next meeting to the last one shown, with its one-year percentile. The chart draws the one-week and one-month ghosts; the one-year path belongs to a different rate regime and would compress the current curve and target band, so its context is carried by the one-year percentiles and the slope readout instead. Year-end SEP medians are plotted as points on the meeting axis at December 31. The current target bounds retain their own FRED dates. Fed Summary of Economic Projections medians are annual target-rate projections published on the displayed date, not market-implied probabilities. The longer-run median has no maturity and appears only in Projections. The backend feed supplies dated daily histories for monthly `ZQ` contracts. The backend feed's daily bars for quarterly `SR3` contracts hold only the current session, so Cloud builds SR3 one-year history from hourly bars grouped by CME trade date, keeping the last close before the 14:00 CT settlement. These are last trades, not official settlements. The FOMC calendar and SEP are maintained source snapshots with their source URLs, verification date and coverage in structured reports. Tentative future meeting dates may change; schedule coverage is never extended by guessing. Missing history or meetings appear in the pane's warning disclosure and exported metadata. GC plots a government bond curve against maturity on a log axis: the US Treasury par curve (UST, the default), TIPS real yields, US breakevens, the euro area AAA curve, German Bunds, UK Gilts, Japanese JGBs and Canada. `GC JGB`, `GC TIPS 2024-01-02` or `GC 2024-01-02` pick the curve and date; the Curve select in the query bar switches it. Each curve comes from its official publisher and keeps the date that publisher gives it, so two curves can show different sessions: | Curve | Publisher and series | Tenors | Out (observed September 2026) | History | |---|---|---|---|---| | UST | US Treasury daily par yield curve | 1M, 6W, 2M, 3M, 4M, 6M, 1Y to 30Y | the same afternoon, by about 3:50 pm New York (quotes taken near 3:30 pm) | 1990 | | TIPS real | US Treasury daily real par yield curve | 5Y, 7Y, 10Y, 20Y, 30Y | the same afternoon | 2003 | | Breakeven | UST minus TIPS real, per tenor | 5Y to 30Y | with both | 2003 | | Euro AAA | ECB euro area yield curve, AAA-rated issuers, Svensson par yields | 3M to 30Y | the next business day | 2004 | | Bund | Bundesbank yields on Federal securities by residual maturity, annual coupons | 1Y to 10Y, 15Y to 30Y | the same day, by about 12:30 Frankfurt | 1997 | | Gilt | Bank of England nominal spot (zero-coupon) curve | 6M to 40Y | the next morning, around 10:00 London | 1979 | | JGB | Ministry of Finance JGB interest rates | 1Y to 10Y, 15Y to 40Y | the next business day | 1974 (10Y from 1986) | | Canada | Bank of Canada Treasury bill yields and benchmark bond yields | 1M to 1Y bills, 2Y to 10Y, 30Y (the long benchmark) | the next business day; bills can land before bonds | 2001 | A publisher's day counts as a curve once it has a 10-year yield, so a day with only bills (Canada) or the oldest JGB rows, which stop at nine years, are not shown as curves. The Gilt curve is a zero-coupon curve: when the curve slopes up it reads a few basis points above par yields at the same maturity, and it is labelled as such in the chart. Italy and France have no free daily source yet, so there is no BTP or OAT curve. Before Treasury's files begin, or when the stored curve cannot be read, UST falls back to FRED's constant-maturity series, which carry the same yields a business day later. A breakeven is the nominal yield minus the real yield at the same tenor on a date both curves have; a date or tenor only one curve has is left out rather than paired with another session. It is the inflation rate that equates the two, not a forecast: it includes inflation risk and TIPS liquidity premia. The figures above the chart are the 2s10s (10Y minus 2Y), 3m10y (10Y minus 3M) and 5s30s (30Y minus 5Y) spreads in basis points, for the spreads the curve's tenors allow. A negative value indicates inversion and is shown as a warning. Each shows its move since the session before and its one-year percentile: the share of the trailing 365 days' sessions with a lower spread, ties counted half. A spread needs both tenors from one session. The table's 1D, 1W and 1M changes compare each tenor with the last session on or before the day before, seven days before and the same day a month before (its last day when the month is shorter); the chart draws the week and month look-backs as ghosts. Missing tenors remain unavailable. ### USD SOFR swaps GC's **Swaps** tab shows daily estimates of USD spot-starting SOFR overnight-indexed swap fixed rates at 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 15Y, 20Y and 30Y. The curve compares the latest trade date with one week and one month earlier. Select a tenor in the table and choose **History**, or press Enter on its row, to see its year of daily rates. The tab, chart view and selected tenor are saved. The estimates use DTCC's public rates trade reports. Only clean USD fixed-versus-SOFR trades with a standard tenor and a spot start qualify; amendments, cancellations and non-vanilla contracts are excluded. A robust notional-weighted median, with each trade’s weight capped at the median inlier notional, estimates each tenor's daily par fixed rate after outlier filtering. This is a daily estimate from reported executions, not an executable quote or a closing market mid. Public notional caps and the timing and mix of trades can affect it. **Trades** is the number of inlier executions behind the point. At least three are required to publish a rate; three or four are marked **Thin** beside the trade count and with dots on the charts. Firm estimates require at least five trades. A missing rate retains its trade count and remains a gap in the curve and history. Rates are percentages, while **1D** and **Spread** are basis points. The daily change needs a rate for both sessions. Swap spread is `(swap rate − same-tenor Treasury par yield) × 100`, using the same date for both legs. Spreads use native quote conventions: annual ACT/360 OIS versus semiannual bond-equivalent Treasury yields, without cash-flow repricing. Treasury publishes no 15Y par tenor, so the 15Y swap spread is blank. Missing Treasury yields are not interpolated or carried from another day. Historical coverage depends on the files DTCC still serves publicly. The displayed as-of date is the trade date; fetch time is separate. Refresh failures keep the last usable curve with a footer error, and stale data is marked there. `gloom fn GC --tab swaps --tenor 10Y` prints the tenor table; `--json` includes comparison curves and the selected tenor's history. `gloom shot GC --tab swaps --tenor 10Y --swap-view history` selects that history chart for a screenshot. The default Swaps chart view is **Curve**. ### Was it a big day? Move ranks After the spreads come the selected tenor's 1D and 1W moves, each with how big it was against every move of the same horizon in that tenor's stored history (`10Y 1D -1bp 16 pctl since 1990`); `fn GC` gives every tenor's ranks as the `1D pctl`, `1W pctl` and `Since` columns. ECST does the same for its daily rates (EFFR, the 10-year and 2-year yields, 2s10s and the 10-year real yield) in its detail, against the FRED series' whole history (`1D -1bp 21 pctl since 1962` for DGS10), whatever the range. - A move uses the same look-backs as the table: 1D is from the last observation on or before the day before, 1W from the last one on or before the same day a week earlier (a calendar week, not five observations, so a holiday week is still a week), each within ten days. A holiday or a blank observation is skipped; a longer gap, such as the years Treasury did not issue a 20-year or 30-year bond, is no move at all. - Ranks are by size: the move's absolute value against the absolute values of every move of that horizon from the start of the history through the session ranked. The figure is the midrank percentile, the share of those moves smaller than this one plus half the ties, so a 1bp day among the many 0bp and 1bp days lands in the middle of its tie. Moves are compared to a hundredth of a basis point. - The year after `since` is where that history starts, and it is said every time because it differs: GC's Treasury curve is stored from 1990, its 20-year tenor from 1993, the 1-month bill from 2001, the 6-week bill from 2025; FRED's DGS10 runs from 1962. A tenor with less than about a year of moves (250) shows its move with no rank. - GC's ranks come from Gloom Cloud, which ranks the stored curve once per session. The FRED fallback and a curve answered by an older server have none, and the figures leave them out. ### Cut-off times The Treasury's par yield curve, and so GC's UST, TIPS real and breakeven curves and FRED's constant-maturity yields (DGS10, DGS2, DFII10 and T10Y2Y, which ECST shows), is read from indicative bid-side quotes the New York Fed collects at or near 15:30 ET. Cboe's Treasury yield indices (`quote ^TNX`, and ^IRX, ^FVX and ^TYX) close at 15:00 ET. On a day yields move after 15:00 the two 10-year numbers for the same date differ, typically by a basis point or two, and both are right. GC's as-of and status line, ECST's reading line and status line for these rates, and `quote` for yield indices name the time beside the date (`US trading day Fri 16 Oct 2026 · 15:30 ET`, `Fri 16 Oct 2026 close · Cboe close 15:00 ET`). `catalog explain ^TNX` and `catalog explain 15:30 ET` say the same in short. `d` edits the as-of date; Enter applies it and `c` returns to the latest curve. A weekend or holiday uses the last session on or before the date within ten days; the requested date and the session shown remain distinct, and the refresh time is not the session date. `v` sets a compare date: a date, or a span back from the session shown (`1W`, `3M`, `1Y`, `2Y`). The chart then draws that curve instead of the look-backs, and the table gives its yield and this curve's change against it. The Diff view draws that change in basis points as one bar per tenor, rises and falls in the same colours as the table's changes. Without a compare date, the 1Y fwd toggle overlays the curve priced for a year from now. For a par curve the par yields are interpolated linearly at each coupon date (twice a year for Treasuries, JGBs and Canada, once for Bunds and the euro curve) and bootstrapped to discount factors; a tenor shorter than one coupon period is a money-market yield discounted simply. Between those dates discount factors are interpolated log-linearly (flat forward rates). The forward yield for tenor T is then the coupon of a par bond starting in one year: coupons per year × (D(1) − D(1 + T)) / the sum of D at its coupon dates, or the simple rate between D(1) and D(1 + T) for a money-market tenor. For the Gilt zero curve it is the forward zero rate ((1 + T) · z(1 + T) − z(1)) / T, treating spot rates as continuously compounded. Only tenors whose end falls inside the curve have a forward (29 years at most on a 30-year curve), and curves that start past one year (TIPS real, breakevens) have none. Forwards include term premia; they are what the curve prices, not a forecast. The World tab lists each market's latest curve on its own session: 2Y, 10Y and 30Y with their moves since that market's session before, the 2s10s spread and its move, and the as-of date. The chart overlays every market's curve; the selected row is the primary, so the readout gives each other market's spread to it at the cursor. Enter opens the market's curve. ## Money markets `BTMM` makes one Gloom Cloud request for FRED funding rates, Treasury bills and liquidity. SOFR, EFFR, IORB and OBFR are published daily rates. The bill tenors are DTB4WK, DTB3, DTB6 and DTB1YR, all secondary-market discount yields, not investment yields or the constant-maturity yields in `GC`. Bill curves require a shared observation date across all four tenors. The 1Y minus 4W slope is in basis points. One-week, one-month and one-year comparisons use the latest shared date at or before the requested date, within seven days, and retain their actual source dates. Missing tenors cannot borrow a different date to complete a curve. Liquidity values use USD billions. WALCL and WDTGAL are Wednesday levels; WRESBAL is a weekly average ending Wednesday and is not a Wednesday closing balance. RRPONTSYD is daily overnight reverse-repurchase usage. Net liquidity is the proxy `WALCL - WDTGAL - RRPONTSYD`, requiring identical observation dates for all three components. It is not bank reserves or an asset-return forecast. The Treasury account uses the Wednesday WDTGAL series, not the weekly-average WTREGEN series. Each board shows the latest available value, source date, one-year percentile and sparkline. Change is versus the previous published observation, identified in the detail, not necessarily the preceding calendar day. One-year ranks use finite observations in the trailing twelve calendar months ending on that row's latest observation; ties receive midpoint ranks and fewer than twenty observations leave the percentile unavailable. These ranks compare that instrument with itself, and a thin sample does not establish a full year of coverage. The detail preserves sample count, range and exact window. Missing observations stay gaps in the history chart. The compact sparkline connects reported observations. Published histories can include revisions and do not reconstruct release-time vintages. Cloud verifies series identity, units, frequency and seasonal adjustment before aggregating. Unknown or contradictory metadata leaves the source unavailable. Daily sources older than seven days and weekly sources older than twenty-one days are stale. The app caches for one hour, retains last good data after a refresh failure, and displays source failures through the existing warning disclosure. An absent endpoint has an explicit unavailable state. Observations retain their individual publication cadence and dates. No database migration is required. BTMM plots the latest bills curve with one-week and one-month comparisons. The one-year curve remains in tenor cursor values and the shared table fallback with its observation date; it does not set the chart axes. Current, weekly and monthly series have explicit theme colours. The board reserves space for its actual rows and gives remaining space to the chart. ## Bond calculator YAS prices regular fixed-coupon bullet bonds per 100 face, redeemed at 100. Coupon dates are unadjusted and anchored backward from maturity. Annual, semiannual and quarterly frequencies use equal coupons of annual coupon percent divided by frequency. End-of-month scheduling is explicit; otherwise the maturity day is retained and clipped in short months. Payments on settlement are excluded. Odd first/last coupons, business-day adjustment, ex-coupon periods, call/put options, default recovery and inflation indexation are outside this calculator. ACT/ACT ICMA uses actual elapsed days divided by the actual coupon-period days for accrual and the remaining first discount period. US 30/360 uses its February and day-31 adjustments, with a regular period of 360 divided by frequency; it is distinct from European 30E/360. On a coupon date, accrued interest is zero and the first future payment discounts by one full coupon period. Coupons discount at the periodic yield using fractional first periods. Clean price equals present value minus accrued interest; dirty price includes accrued interest. Yield is solved by a bracketed bisection and may be negative while its compounding base stays positive. Macaulay duration is present-value-weighted payment time; modified duration divides it by one plus yield per coupon period. Convexity is the analytic second price derivative divided by dirty price. DV01 is dirty price times modified duration divided by 10,000, in price points per 100 face. Yield-shock rows reprice every payment exactly at each shifted yield; return is clean-price change divided by initial dirty price. These are parallel yield shifts at the same settlement, without carry or roll. Cash-flow present values sum to dirty price. Manual hypothetical bonds have no historical percentile sample, so no rank is invented; JSON reports the missing percentile and reason. Settlement is the valuation date on every view. The optional Treasury comparison reuses GC's Gloom Cloud endpoint and its existing cache. It linearly interpolates Treasury par yields at the bond's remaining calendar maturity (actual days divided by 365.25), only between matching dated tenors, without extrapolation. Its observation date is shown separately from settlement. This is a nominal yield spread, not an option-adjusted or zero-curve Z-spread. Missing endpoint, malformed points, mixed bracketing dates and maturity outside the curve leave spread unavailable while retaining local calculations. A failed refresh retains the prior dated benchmark with the error visible. Observations can precede a manually entered settlement date; this does not represent a historical matched-settlement spread. Math checks include the published Excel PRICE example (94.63436162), independent QuantLib 1.43 ACT/ACT ICMA references across leap-year and month-end schedules, price/yield round trips including negative yields, and finite-difference sensitivity checks. The reference package is not an application dependency. ## Central bank rates `CBR`, `ECFC` and `CBRT` use one Gloom Cloud request for the policy observations of the G20 and of Switzerland (SNB), Norway (Norges Bank), Sweden (Riksbank) and New Zealand (RBNZ). FRED supplies the US target bounds (DFEDTARL/DFEDTARU) and the ECB deposit facility rate (ECBDFR), and `gloom fred` prints each of them; official BIS central-bank policy-rate data supplies the other covered jurisdictions in one batch. The older OECD/FRED policy-rate series were discontinued and are not current inputs. BIS publishes daily observations weekly, so each row retains its actual date and calendar-day lag. US bounds must share a date and form a valid range. The board shows the range; its history and percentile use the midpoint, distinct from the effective Fed funds rate. Policy instruments differ. China is the BIS one-year loan prime rate, not its seven-day reverse repo rate. The euro-area row covers France, Germany and Italy and represents euro-area policy within the EU; non-euro EU countries have separate policies. Argentina has had no adopted policy rate since July 10, 2025 according to BIS metadata, so its last historical 29% value is not carried forward. The African Union has no unified policy rate. The board, its warning and its exports leave them out, so `shot`, CSV and JSON count the same rows; the export's notes name each one and why, and they do not make a report incomplete. Last move compares the latest level with the preceding distinct observed rate, not yesterday's unchanged observation. Its date is the first source observation at the new level and need not be the announcement or effective date. A missing change within fetched history remains unknown. The one-year percentile uses daily observations in the twelve calendar months ending on that row's own latest date, midpoint ranks for ties, and a minimum of twenty observations. This measures time spent at historical levels, not a distribution of policy decisions. The detail retains sample count, range and window. Source gaps break the history chart; the compact sparkline connects reported observations. Published histories may contain revisions and do not reconstruct release-time vintages. Cloud caches BIS for six hours and FRED for one hour with shared in-flight requests and independent stale fallback. BIS observations more than fourteen days old and FRED observations more than seven days old are stale; expired fallback data remains stale regardless of observation date. A refresh failure preserves the last usable response and its source dates with a warning. An absent endpoint is explicitly unavailable. India and South Korea report to BIS weeks late. Cloud checks the level on the RBI and BOK homepages: when it matches BIS the row is current and shows when it was confirmed, while keeping BIS's observation date and lag; a different official level keeps the row stale. Argentina and the African Union have no policy rate to show and stay off the board without a warning. No migration is required. Next meetings come from each bank's own published calendar, kept by Gloom Cloud with the page it was read from and the day it was read: the FOMC, ECB, BoJ, BoE, BoC, RBA, RBI, Bank Indonesia, BOK, Banxico, Copom, Bank of Russia, CBRT, SARB, SNB, Norges Bank, Riksbank and RBNZ. The date is the decision or announcement day, not the first day of a two-day meeting; Norges Bank and the Riksbank announce the day after they decide, and the date is the announcement. A decision stays the next one until it is public: at the time the bank states (Copom, Banxico, the Bank of Russia, the SNB, Norges Bank and the Riksbank), or, for a bank that states none, once that day is over in its own zone. On the decision day before then a BIS row's note says the bank decides on that date; only after it does the note say it decided and the row wait for BIS. China has no meeting: its row gives the next monthly 1-year LPR fixing, the 20th or the next business day after a holiday. SAMA publishes no schedule, so Saudi Arabia's says not published. A calendar is never extended by guessing: once its last published date has passed the row says not verified until it is refreshed, and the payload's gaps name the bank. An older Gloom Cloud that returns no meeting reads as not published. Exports are meant to be cited. Every CSV, JSON and text row carries `central_bank`, `source` (BIS or FRED), `series_id`, `source_url`, `as_of`, `last_decision`, the next meeting with its kind (`decision`, or `fixing` for China), calendar page and verification date, a `citation` line such as `Bank Rate 3.75%, BIS series D.GB (https://data.bis.org/topics/CBPOL/BIS,WS_CBPOL,1.0/D.GB), as of 2026-10-05`, and the row's own `notes` (India's bank-site level against BIS, a decision BIS has not reported). `last_decision` is the bank's latest kept decision on or before the observed change, already announced: the BoJ's 18 September hike that BIS first shows on 24 September. It is blank when the kept calendar does not reach back to the change. The US row cites both bounds, and a row the bank's site confirmed says where and when. The CSV keeps the board's columns, with the rate as a number (the US midpoint) and `Range lower` and `Range upper` beside it for a target range, then these. `source` and `as_of` are each row's own, so the export's fixed columns of those names are not repeated; the other fixed columns follow. Notes shared by several rows are said once in the closing lines; the text prints each row's own under its citation. Its closing lines name the central banks as publishers, via BIS and FRED, and give the newest and oldest observation dates, since each row is dated by its own source. JSON leaves out each row's daily history unless `--history` is given, and leaves the BIS series definition, which describes that history, with it. Charting a single bank's rate in `G` (`CAP:policy-rate:ea`) cites the same series and bank. ## Debt maturities (DDIS) DDIS uses Gloom Cloud's cached SEC EDGAR company facts. The backend selects annual 10-K or 20-F principal-maturity facts from one accession, fiscal period end and native currency. Filers that tag the rolling-period principal concepts are read the same way; each fact keeps the concept it was filed under. The chart represents relative fiscal buckets: the next twelve months, years two through five, and Thereafter. These are not calendar-year dates. Thereafter is open ended and supplies neither a maturity date nor a duration. No weighted average maturity or weighted coupon is inferred. Principal total requires all six buckets. Reported zero amounts are retained; absent, negative or contradictory facts are unavailable. The next-three-years amount requires its first three buckets. Concentration ratios require a complete, positive total; they remain unavailable for incomplete or zero totals. These amounts describe reported principal obligations, not balance-sheet carrying debt or a forecast of refinancing needs. Schedule scope may include short-term borrowing and foreign-currency hedges. Native currencies are never converted or mixed. Headline ranks use a ten-year window ending on the latest source period, with at least five comparable annual cohorts and at most one cohort per period end. Interest expense ranks require the same interest concept; cost ranks also require the same debt concepts. History displays this bounded window, while the headless response retains all source history. Each value's as-of is the fiscal period end. The filing date identifies when that observation became public; later collection does not make it current. Amendments can change historical facts, so this is not a point-in-time trading dataset. Annual interest expense can include non-debt expenses depending on the reported concept, which the Filing tab exposes. A borrowing-cost accounting proxy is shown only when debt-only annual interest and explicit, matching opening and closing long-term and short-term balances are available. It is annual debt interest divided by average reported debt, multiplied by 100. It is not a weighted coupon, yield to maturity or a current refinancing rate. A missing proxy remains unavailable even when general annual interest expense exists; it is not a warning. Quarterly reports rarely repeat the maturity schedule, so DDIS adds the latest 10-Q's balance-sheet debt when that 10-Q ends after the annual schedule: current debt (due within a year) and non-current debt, with the period end and filing date. A 10-Q restates the prior year-end beside its own balance, so the filing's latest period end is the one read, and both amounts come from that filing and date. Current debt is `LongTermDebtCurrent`, else `DebtCurrent`, else `LongTermDebtAndCapitalLeaseObligationsCurrent`; non-current debt is `LongTermDebtNoncurrent`, else `LongTermDebtAndCapitalLeaseObligations`. A concept filed twice with different values is unavailable. These are carrying amounts, not principal, so they are never added to the maturity buckets, the total or the ranks. The 10-Q must be in the schedule's currency. An issuer whose newest filing is its 10-K or 20-F shows no 10-Q row. The report's as-of is the newer of the two period ends. Company facts do not cover every maturity disclosure: custom tags and unmapped IFRS statements can leave a partial schedule or no schedule. Current verified examples include USD schedules for MSFT and AAPL and a native EUR principal schedule for ASML. TSM's IFRS reporting is unsupported. Verified examples currently lack the evidence needed for the debt-only cost proxy. Source refresh failures preserve the last dated result with a warning; a missing Cloud endpoint has an explicit unavailable state. ## Revenue by product, segment and region (SEG) SEG, also the Revenue tab of Ticker Research, reads the revenue splits US filers tag in the XBRL of their 10-Q and 10-K filings: products and services, reportable segments, and geographic regions. Gloom Cloud backfills them from SEC's Financial Statement and Notes data sets and reads each new filing's XBRL as soon as EDGAR lists it, so a quarter appears the day it is filed. The Split filter picks products, segments or regions; options a company does not report are disabled. Quarters are the company's fiscal quarters. Fiscal Q4 is the 10-K year less the Q3 10-Q's nine months. Rows are the members that add up to reported revenue in the latest quarter, so subtotals such as Apple's "Products" beside iPhone and Mac are left out, and products reported only inside a segment (Alphabet's YouTube ads) sit beside the segments reported without products. When a filer renames a line in its 10-K, the renamed quarter shows as a gap rather than a guessed value. The latest column is that quarter's revenue; TTM needs four reported quarters spanning a year; % Total is the share of the quarter's reported revenue; YoY compares with the same fiscal quarter a year earlier. Trend scales each row's bars to its own range, so shape is comparable across rows; Actual draws every row on one scale, so size is; Text shows each quarter's value. Values are in USD as filed. Free and signed-out accounts see the two largest rows; Pro shows every row. Companies that tag revenue only with custom axes or concepts, and foreign filers on 20-F, have no breakdown. ## Portfolio analytics P&L for manual portfolios covers current holdings. Manual portfolios have no cash-flow performance history; reconcile corporate actions through **PF → Set position**. Distributions are not automatically credited. Enter the current quantity in **Shares** and the cost per share in **Avg Cost**, using the position's currency. Update quantity and cost yourself after splits or other corporate actions; these values are not automatically adjusted. **AP** can add a ticker to a portfolio without recording a position: leave Shares blank. **Set Portfolio Position** requires a quantity and cost. Broker contracts without a canonical contract ID use their supplied definition, including local symbol, security type, currency, venue, expiry, right, strike, multiplier and trading class. Changing that definition requires its own quotes and history; an older symbol-only cache cannot establish their identity. Broker resync preserves the supplied definition for each position. Older positions without that identity retain a broker route only when their stored declarations match uniquely; resync establishes missing ownership. Independent issuer fields can still use public-symbol enrichment. A missing position cost stays unavailable; it is not zero. Portfolio and ticker views use each lot’s known cost and usable current quote before falling back to that lot’s broker-reported snapshot. Mixed results retain both bases, and one unknown lot prevents a complete P&L total. A Broker P&L column uses snapshots; a Mixed P&L column includes both current calculations and snapshots. Broker snapshot profit does not acquire the live quote’s timestamp; position feeds without a profit timestamp leave it unknown. Missing cost or a zero total cost prevents a percentage return, even when absolute P&L is available. JSON/CSV exports retain the selected P&L basis and cost availability. Older stored zero costs cannot be distinguished from explicit zero: resync the broker position or correct a manual position to establish the intended cost. Sector weights use gross position values and exclude cash. Fund constituents and ETF overlap are not available; funds are grouped separately. Missing position prices or FX prevent complete weights. Sharpe and beta are estimates for a basket of current holdings and weights, rather than a reconstruction of historical account performance. They use price returns and exclude cash, fees, distributions and historical trades. Sharpe assumes a fixed 5% annual risk-free rate and 252 trading sessions per year; beta uses SPY as the benchmark. They require usable price histories for every nonzero holding. Each sample uses the same start and end dates for all holdings at fixed current weights; a newer listing shortens the common window instead of reallocating its missing weight. Dated missing or nonpositive closes break adjacent returns. Beta matches both interval endpoints with SPY, so a multi-session return is not paired with a one-session return sharing only its end date. The displayed dates and count identify the actual samples; absent dates across every source cannot establish an exchange calendar. A contradictory holding history suppresses the basket estimates. An invalid benchmark history suppresses beta independently of Sharpe. Sharpe qualifies the whole sample against published sessions for every holding's requested listing venue. Both endpoints must be sessions with one source observation per date, and no trading session may lie between them. Source timestamps must consistently use midnight-UTC date labels, the same declared-venue wall-clock time on the labelled session date, or verified actual session-close times. This preserves exchange-open labels through DST and the verified regular 16:00/early 13:00 New York close convention, while rejecting sparse cross-midnight intraday observations. Mixed or unverified timestamp conventions remain unavailable. Actual-close schedule coverage is NYSE venues in 2025–2028 and Nasdaq in 2026; other timestamp conventions do not borrow those early-close dates. Legitimate weekend, holiday-reopening and early-close sessions remain in the sample; returns are never filtered to calendar weekdays or rescaled to guess a daily rate. Missing sessions and unsupported calendar coverage withhold Sharpe. Beta checks timestamp eligibility independently for both holdings and SPY, retaining valid endpoint-matched multi-session returns and unknown calendar years when their timestamp conventions are established. Nonmidnight SPY timestamps with no declared venue remain unverified. Routing venues such as SMART do not establish the listing calendar. Published calendar coverage is NYSE/NYSE American/NYSE Arca and named NYSE National/Chicago/Texas venues for 2025–2028, and Nasdaq for 2025–2026, checked September 12, 2026. Sources are the [NYSE 2025–2027 announcement](https://ir.theice.com/press/news-details/2024/NYSE-Group-Announces-2025-2026-and-2027-Holiday-and-Early-Closings-Calendar/default.aspx), [NYSE 2026–2028 schedule](https://www.nyse.com/trade/hours-calendars), [NYSE Carter closure](https://ir.theice.com/press/news-details/2024/The-New-York-Stock-Exchange-Will-Close-Markets-on-January-9-to-Honor-the-Passing-of-Former-President-Jimmy-Carter-on-National-Day-of-Mourning/default.aspx), [Nasdaq 2025 table](https://www.nasdaq.com/docs/2025/01/06/2025holidayandtradinghours.pdf), [Nasdaq 2026 table](https://www.nasdaqtrader.com/Trader.aspx?id=Calendar), and [Nasdaq Carter closure](https://www.nasdaqtrader.com/TraderNews.aspx?id=ETA2024-87). The model retains this source basis and any rejected interval. Coverage includes the January 9, 2025 closure and does not invent a December 31, 2027 closure. It is a bounded published schedule, without a live exceptional-closure feed or inferred coverage for other venues and years. The benchmark request explicitly identifies SPY on NYSE Arca in USD, ISIN US78462F1030, following the [issuer's listing table](https://www.ssga.com/us/en/individual/etfs/state-street-spdr-sp-500-etf-trust-spy) checked September 12, 2026. Beta qualifies timestamps on its actual matching sample only; an unrelated older observation outside that sample cannot invalidate an otherwise valid comparison. The model retains the benchmark identity, source timestamps, matching sample, and qualification results. Broker account-value history includes deposits and withdrawals. Investment returns require cash-flow adjustments. Broker-reported return series may not specify their calculation method. Currency values and percentage returns retain distinct axis labels. Account-value currency comes only from the history source; portfolio/display currency settings do not convert that history or establish its currency. The chart preserves elapsed calendar time and known missing dates. A later row at the same timestamp replaces the earlier row, including withdrawn values; missing values break the line instead of joining observations across the gap. Missing observations and cached data remain identified in the UI. Account summaries and Cash & Margin convert monetary totals only from the broker account's declared currency. Missing source currency or FX leaves those totals unavailable; missing cash is not a zero balance. PORT retains available account summaries and broker history after the last security position is sold. It does not derive a return from changes in account value or add cash-flow-adjusted return methods that the broker has not supplied. ## Dividends and sectors Dividend cash yield excludes taxes and reinvestment. For a bond fund it is a distribution yield, not the SEC yield (see [Bond funds](#bond-funds-sec-yield-tax-equivalent-yield-and-the-munitreasury-ratio)); tax components and future payments are not modeled. Forward yield is an estimate rather than a guaranteed distribution. Dividend amounts and reference prices must use compatible listing currencies and units. `DVD` is a cash-history view, not a next-quarter cash-flow calendar. History rows use ex-dates, not the dates cash reaches an account. Recent cadence is inferred from those ex-dates; it does not establish an announced schedule. The ex-date row shows the next announced ex-date when the source reports one, and otherwise the last ex-date that has passed. A declared distribution is never added to history, the yields or the growth figures, even when Gloom Cloud states its amount. A source-reported upcoming payment date can appear as Next Pay, but is not linked to a projected amount. The provider-backed history supplies ex-dates only. Missing payment dates remain unavailable. Forward/share is the indicated annual rate `fundamentals` uses for its forward yield: the latest regular distribution annualized (HYG's $0.342 monthly distribution is $4.104 a year), dated by that distribution's ex-date. Once the next distribution is declared the rate annualizes that one, and its ex-date is still ahead, so the yield is never shown as of a future day: `fundamentals`, `ticker` and `DVD` name it as the declared distribution with its ex-date, and with its amount and pay date where Gloom Cloud states a declared row for that ex-date (`annualized from the declared $0.98 payable 2026-12-10, ex 2026-11-19`). Not every listing has declared rows; without one the basis gives the dates alone (`annualized from the declared distribution, ex 2026-11-19`, with the pay date in `DVD` when the source states one beside that ex-date). The amount is only ever the stated one, never the rate divided by the cadence. The pane marks the yield `declared` (with the amount when stated) beside Next Ex, and `events` and `EVT` list a declared row at its ex-date, marked declared, apart from the paid distributions. It is not a forecast beyond that distribution. No FX conversion, withholding, or net account income is calculated. A forward yield is shown only while the dividend behind it is current: its latest distribution went ex within the issuer's usual interval plus a grace period. The interval is read from the issuer's own ex-dates: the longest of the last three gaps between them in the two years up to the latest, taken as monthly, quarterly, semiannual or annual, whichever is nearest (the longest, so a special distribution between two regular ones does not shorten it). The grace is half an interval, at least a month and at most three, so a dividend has stopped about two months after a monthly payer's last ex-date, four and a half months after a quarterly payer's, nine after a semiannual payer's and fifteen after an annual payer's, the window after which Gloom Cloud withdraws a lapsed forward yield too. With only two distributions the gap between them may be a regular and a special one, so the interval is at least quarterly; with fewer than two, or no distribution history, the annual window applies. A declared distribution not yet gone ex keeps the dividend current. Once it has stopped, `ticker`, `fundamentals`, `valuation`, `DVD` and the `DES` overview say `no current dividend (last paid 2026-02-27)` (Whirlpool, which declared nothing for its second quarter of 2026) instead of a percentage, the forward rate is withdrawn with it, and the overview's ex-dividend date reads as Last Paid. JSON exports the yield and its rate as `null`, with the last ex-date under `fundamentals.dividendLapse`. The portfolio DIV% column shows no figure for it. The trailing yield stays, labelled trailing. Dividend summary failures are reported independently of cash-history coverage. A failed summary request or invalid reported summary date leaves that information unavailable while preserving valid cash totals and independently reported summary fields. Invalid dates cannot become payment projections or break the report; their failure appears in the existing footer and structured report errors. Cash events require their source's currency and units; a quote or separate summary cannot supply missing history units. A history stated in a currency's sub-unit (GBp, ZAc, ILA) is converted to the major unit once, as it arrives, at the precision its source stated it: Standard Bank's 902.00006 ZAc reads ZAR 9.02 in `DVD`, `events`, EVT and a forward yield's declared distribution alike. Gloom Cloud states the forward rate of such a listing in the major unit too, so its `DVD` forward yield is the one `ticker` shows. Every dividend yield names its basis in the same words. A trailing yield is the `last 12 months of distributions` over the price; a forward yield is the `latest distribution annualized, as of` that distribution's ex-date. `fundamentals`, `ticker`, `valuation`, the `DES` overview's TTM Div Yld and the DIV% column of portfolios and watchlists measure a fund's trailing yield as `DVD` does, from the same cash history (one payment per period, below) over the regular session price, so they show the figure `DVD` prints; only when that history cannot be read whole do they show the yield Gloom Cloud serves, as `DES` and DIV% also do until the history has loaded. EQS shows each company's yield as Gloom Cloud states it, at the price when the screen's data was collected, and names that row's basis in its detail in the same words. A semiannual payer whose interim and final distributions differ (Standard Bank's ZAR 8.78 and ZAR 9.02) therefore has a trailing yield below or above its forward one, and both differ from a screen collected at another price. Invalid or missing records make cash totals, growth, cadence, and the TTM chart unavailable while valid history rows remain visible with a failure status. A confirmed empty history still has zero trailing cash. An unavailable source does not establish zero cash. A separately reported forward rate can remain available when its own currency is known and compatible, even when chart history is unusable; an unknown chart-price denomination cannot supply its yield denominator. On an integrity failure during refresh, retained history rows keep their own units and retrieval time while current cash totals stay unavailable. A confirmed empty response clears those retained rows. Dividend reference prices retain their own source timestamp, including the backend feed's regular-session price when a separate quote is unavailable. The reference price is the regular session's, so once that session is over it is the close and is dated by the close (the session date alone when the venue's calendar has no hour), not by the after-hours print that last updated the quote. The footer prioritizes that timestamp and shows the separate history retrieval time when space permits; exports retain both. Stale prices and missing price timestamps remain explicit. Fetching cash history does not refresh the time of its reference price. TTM cash/share sums reported cash with ex-dates within the trailing calendar year, counting one payment per period for a regular monthly, quarterly, semi-annual or annual cadence. When an ex-date falls a few days earlier in the year than its counterpart a year before, the older payment leaves the total on the new ex-date instead of being counted twice. When it falls later, the older payment stays in the total until the new one goes ex, for at most half a period and never more than 30 days past one year. Irregular cash uses the plain trailing-year window. The chart applies the same rule at each date using only payments known by then, holding each level between changes. Cash growth compares complete trailing-year windows; a positive baseline followed by no cash gives −100%, while a zero or incomplete baseline has no defined growth rate. Special distributions remain part of reported cash. ### Ranking dividend payers `gloom fn DVD KO PEP JNJ SBK.JO` (up to 25 tickers) prints one table ranked by trailing yield, highest first: Yield TTM, Fwd yield, Payout, 1Y growth, 3Y CAGR, Last ex and Pay date. Each figure is the one the single-ticker report shows for that ticker, read the same way: - **Yield TTM** is the trailing twelve-month cash above over the reference price, both in the listing's own currency, so tickers in different currencies rank side by side without conversion. A cash history in a minor unit (ZAc, GBp) is read in its major currency, as the price is. - **Payout** is trailing twelve-month dividends over trailing twelve-month diluted EPS, as the source states it. It is not the payout of the latest fiscal year: EQS's FY payout ratio uses the annual report. - **1Y growth** and **3Y CAGR** compare trailing twelve-month cash per share now with one and three years before; 3Y is a compound annual rate. - **Last ex** is the latest ex-date that has passed. **Pay date** is the pay date of the next declared distribution, or the next pay date the source reports; past distributions carry ex-dates only, so it is blank when nothing is declared. A figure the source does not have reads `—`, never 0. A ticker with no trailing yield ranks below every ticker with one, and a ticker that could not be read ranks last. A read that came back without its cash history (no yields or growth) or without its summary (no forward yield, payout or pay date) is incomplete as the single-ticker report says it is, so its blanks never read as a non-payer's: a Note column appears and names what each such row is missing (`not read`, `no cash history`, `no summary`), the reasons are in the errors, and the report is incomplete (`complete: false`, with those tickers in `unavailableSymbols`, in `--json`). `--json` and `--csv` keep the numbers, ratios to the sixth decimal (a 3.5396% yield is `0.035396` in JSON and `3.5396` in CSV), each JSON row with its currency, `note` and `priceAsOf` (the time of the price its yields are over: after the close, the close), and the metadata says how each column is measured. Every CSV and NDJSON row names its ticker in `symbol_or_series`, `pct` in `currency_or_unit` and that price time in `as_of`, and the closing lines date the report by the newest of those prices. One ticker prints the single-ticker report, as before. `--type` and `--limit` pick rows of one ticker's payment history, which a ranking does not list, so with several tickers they are refused rather than dropped. ### Bond funds: SEC yield, tax-equivalent yield and the muni/Treasury ratio A bond fund's dividend yield is the cash it paid, annualized: a distribution yield. It is not the 30-day SEC yield, the standardized figure a US bond fund reports (net investment income over the last 30 days, after expenses, annualized over the price), and the two differ: on 2026-10-15 MUB's forward distribution yield read 3.27% against a 4.04% SEC yield. For a US-listed bond fund whose sponsor's figures Gloom Cloud reads (iShares, Vanguard and SPDR bond ETFs), every place that shows the distribution yield says so, and the SEC yield follows it with its date: - `fundamentals` and `ticker`: `Distribution Yield (forward, not SEC yield)`, then `30-Day SEC Yield 4.04% (as of 2026-10-15)`, `Yield to Worst` and `Effective Duration` (Vanguard publishes no yield to worst, and an `Average Duration` as of the month end). - `fn DVD`: `Trailing distribution yield (not SEC yield)` and `Forward distribution yield (not SEC yield)`, then the same three figures. The DVD pane reads `TTM dist yld` and `Fwd dist yld`, each `not SEC`, with `SEC yield` beside them. A ranking with a bond fund in it (`fn DVD MUB VTEB KO`) adds to its title that a bond fund's yields are distribution yields, not SEC yield, and puts `SEC yield` and `SEC as of` after `Fwd yield`: blank for any other listing, `secYield` (a ratio, as the other yields are) and `secYieldAsOf` in `--json`, and in `--csv` a percent like the other yields, beside the row's ticker, `pct` and price time. A ranking without one is unchanged. - `DES`: `Fwd Dist Yld` (`not SEC yield`), then `SEC Yield`, `Yld to Worst` and `Eff Duration` or `Avg Duration`, each dated and opening ETF. - `ETF` and `fn ETF`: `SEC yield`, `Yield to worst` and `Effective duration` after net assets, each dated; the report adds the fund's class (`Municipal, national`, `Municipal, CA (single-state)` or `Taxable`). `--json` carries the figures under `bondFund` (`kind`, `state`, and `secYield`, `yieldToWorst` and `duration` with `value`, `asOf`, `source` and, for duration, `measure`). A fund no sponsor source covers (Schwab, Invesco, JPMorgan, First Trust, PIMCO and others) has none, and its yield reads as before. `gloom fn DVD --tax-rate ` and `gloom fundamentals --tax-rate ` add a muni fund's tax-equivalent yield and its muni/Treasury ratio: ``` tax-equivalent yield = yield / (1 - (federal rate + state rate)) muni/Treasury ratio = yield / Treasury par yield at the GC tenor nearest the fund's duration ``` - The yield is the 30-day SEC yield, else the distribution yield, and the line says which. - `--tax-rate` is the federal rate in percent: 40.8 is the 37% top bracket plus the 3.8% net investment income tax. - `--state-rate 13.3 --state CA` adds a state rate only for a single-state muni fund of that state (CMF and VTEC for California, NYF and MUNY for New York), whose income that state does not tax either. A national fund's income is taxed by your state like a taxable bond's, so the state rate cancels out; the tax rate line says why it was not added. - The rates add up without netting a federal deduction for state tax, which the SALT cap mostly removes. This is how iShares computes the tax-equivalent yields it publishes: MUB's 4.04% at 40.8% is 6.83%, and CMF's 3.87% at 40.8% + 13.3% is 8.43%. - The ratio compares pre-tax yields, as muni/Treasury ratios do. Its Treasury is GC's US par curve at its latest session, at the tenor nearest the fund's duration (MUB's 7.13 years: the 7Y); the line names the tenor and the curve's date. - A taxable bond fund gets `no tax-equivalent yield: AGG is a taxable bond fund, its income is taxed`, and a listing with no bond figures says so. `--tax-rate` takes one fund: a ranking of several refuses it, and `shot DVD` refuses it as a report-only option. - In `fn DVD --tax-rate`, a failed quote or fund-facts lookup is a failed bond-fund check, not confirmation that the listing has no bond figures. The tax section names the failed check and the report is incomplete; available cash history remains. Without `--tax-rate`, bond facts remain optional enrichment and a failed lookup leaves the report unchanged. `--json` adds `taxEquivalent`: `federalRate`, `stateRate` (`rate`, `code`, `applied`), `combinedRate`, `basis` (`kind`: `sec` or `distribution`, `value`, `asOf`), `taxEquivalentYield`, `muniTreasuryRatio` (`value`, `tenor`, `treasuryYield`, `treasuryAsOf`, `durationYears`), `notes` and both formulas. There is no AAA muni curve: MMD and BVAL, the curves muni ratios are usually quoted on, are licensed. `gloom catalog muni` (or `municipal`, `tax-exempt`, `tax equivalent`) says so and points to the funds, `DVD`, `fundamentals` and `--tax-rate`; `catalog glossary` explains the tax-equivalent yield, the muni/Treasury ratio, the SEC yield, yield to worst and duration. ### Portfolio income and DRIP `gloom portfolio show ` adds Income and Yield after the allocation columns (after Weight, or after Trade Value when targets are set) when the portfolio holds shares or funds. Income is a holding's trailing twelve-month dividends per share, measured as `DVD` measures them, times the shares held, converted into the portfolio's currency at the same exchange rate its value uses. Yield is that income over the holding's value; on the TOTAL row, the portfolio's income over its whole value, cash included. A short owes each dividend, so its income and yield are negative and count against the total. Coins, bonds, contracts and indices pay no dividends and show none. Each holding's cash history is read through the market-data cache `events` reads it through, so a history read in the last six hours is not asked for again and an older stored one stands in when Gloom Cloud cannot be reached. All the reads share one deadline of four seconds; the report then prints with what it has. A holding whose income is unknown is never counted as $0: its row reads `—`, the TOTAL income and yield are blank, and one line under the table names each cause and its holdings (`no dividend history`, `no ZAR exchange rate`, `dividends not read within 4s`, `dividends not read without a Gloom sign-in`, `dividends not read (offline?)`) with what the other holdings pay. When no holding's income is known (signed out, offline, or nothing read in time), the Income and Yield columns are left out and that line says why. `--json` adds `dividendPerShare`, `dividendCurrency`, `annualIncome` and `incomeYield` to each row, after the existing fields so no CSV column moves, and to the metadata `annualIncome` and `portfolioYield` (null when any holding is unknown), `knownAnnualIncome` (what the known holdings pay), `incomeComplete` and `incomeUnavailable` (each unknown holding with its `cause`: `no-history`, `fx` with the `currency`, or `unread` with `why`); `complete` is false while any income is unknown. `--drip` follows the table with a projection of reinvested dividends: `gloom portfolio show Income --drip --years 3 --withholding 20`. Each year, every holding with a dividend pays its trailing dividend per share on the shares it then holds; the withholding (0 to 100 percent, default 0) comes off; what is left buys more shares at today's price, once, at the year's end. Dividend per share, price and exchange rate are held where they are today: nothing grows, no price moves and no fees or taxes beyond the withholding are taken. Shares therefore compound by `1 + (1 - withholding) x dividend / price` a year, and each year's net income is the shares held at its start times the dividend net of withholding, in the portfolio's currency. `--years` takes 1 to 5 (default 5). The table shows each holding's shares now and after the last year and its net income each year, with totals; one line under it dates the assumptions. A short is netted across its lots and owes its dividend in full every year: the same negative income each year, with nothing withheld and no shares bought or covered. `--json` gives one row per holding and year (`shares`, `addedShares`, `grossIncome`, `withheld` and `netIncome` in the dividend's currency, `netIncomeBase` and `valueBase` in the portfolio's) with the method, the known income and `complete` in the metadata. A holding whose income is unknown, or with no price to reinvest at, is not projected and is named. It is an illustration of reinvestment at today's figures, not a forecast. Sector and industry ETF returns are price returns in the listing currency, without reinvested distributions. Rankings use a shared ending session and calendar-month/year boundaries, using a prior close for holidays. Missing or inconsistent endpoints remain unavailable. A reported baseline still establishes the shared starting session when that ETF lacks an ending price; another ETF cannot use an older start because its peer becomes unavailable. A successful refresh does not make an old quote current. Live prices overlay the stored snapshot and rescale the 1M and 1Y returns from their baselines; before the open the board stays ranked on the completed session, and a fund the stream is not carrying falls back to a one-minute background reload. ## FX matrix The pane settings choose the currencies in any order from 45 (the eight majors by default) or fill the list from a set (Majors, G10, Asia, EMEA, Americas, All); `gloom fn FXC --currencies USD,KRW,asia` takes the same codes and sets, `gloom catalog FXC` lists the codes, and a code the board does not carry fails naming it. A report without `--currencies` says it shows the eight majors. `r` refreshes the selected currencies, and automatic refresh follows the configured interval. `FXC` streams the USD legs and derives every cross from them; a streamed leg replaces the loaded rate only while its own observation is newer, and the reload relaxes only for legs the stream keeps current. Ordinary renders reuse cached rates. A refresh can still return the provider's cached observation; its source date and any stale or failure status remain visible. One unit of the row currency buys the amount in the column currency. Indicative cross rates are calculated through USD legs, whose observation times can differ. Missing, stale, or unknown observation times appear as current status. A rate is stale an hour after its observation (plus any stated feed delay), counting only time the FX market trades, Sunday 17:00 to Friday 17:00 New York. Friday's last rate therefore stays current over the weekend, while a pair that stopped updating before the close is still stale. Portfolio FX status uses the same rule. Market holidays are not part of this calendar. The base-currency axis remains visible during horizontal scrolling; partially covered values are shortened with an ellipsis. CSV export retains the full matrix and appends each currency's raw USD leg, observation time, retrieval time, source, and current status. Each cross uses its row's leg divided by its column's leg; same-currency cells are identity. Exported provenance belongs to the displayed rates, and unknown observation times remain blank rather than being replaced by retrieval time. A cell is tinted green when the row currency gained on the column currency since the previous close, red when it lost, in five steps at 0.05%, 0.15%, 0.3%, 0.6% and 1%; a step holds until the move falls a fifth (at least 0.02%) short of its threshold, so ticks around a boundary do not flicker. The previous close is each pair quote's previous daily close, the one `gloom quote EURUSD=X` measures its change from, with USD as 1. It is read for the leg's rate whether that rate is the quote's own or a loaded rate of the same FX trading day (which rolls at 17:00 New York), so a loaded rate a minute newer than its quote still moves from that close. A cell has no tint when the cross is unchanged or has moved under 0.05%, or when either leg is without a current quote carrying a previous close: a stale quote, a loaded rate of a later trading day than its quote and a pair beyond the stream's symbol limit are never read against one, and the first rate the pane drew is not a reference. Exports carry no tint. `fn FXC` (and Ask Gloom) reads the same legs once instead of streaming them: each leg's loaded rate, replaced by its pair quote when that quote is current and at least as new. It returns one row per ordered cross with the rate, the move since the previous daily close under the tint's rule (empty where either leg has no current pair quote carrying a previous close), its header naming that close as `quote` does (`Move vs Wed 21 Oct close`, `vs mixed closes` when the legs' closes differ; exports keep `Move`, and `--json` has it as `metadata.changeBasis`), the observation time of the older leg (empty when either leg's is unknown) and whether either leg is stale. The metadata lists each USD leg with its rate, previous close, observation and retrieval time. The report is dated by those legs, as the matrix's capture is, so a stale leg counts once however many crosses it is in. Ask Gloom gets the rates to six significant figures and the moves to three decimals, which keeps every cross of all 45 currencies inside its result limit. ## Short interest Short interest is outstanding short positions at each settlement date, not daily short-sale trading volume. FINRA supplies settlement history, average daily volume and days to cover. The backend supplements missing settlement history with current and prior settlement shares only: no other days-to-cover ratio or percentage of float is attached to them. Days to cover is FINRA's everywhere: the shares short over the average daily volume of the settlement period, as FINRA states it for the settlement. `SI`, `SIW`, `EQS`, the overview's "d to cover" and `fundamentals` (`shortRatio` in its JSON) all read it. The overview's Short Float and the short interest `fundamentals` prints (shares short, short % of float, days to cover, with the settlement date, `shortInterestDate` in JSON) are the latest FINRA settlement, the one `SI` and `SIW` show; a listing without one shows none. The float is never above the shares outstanding: a float a few percent above them is shown at them, and one further above, which counts another class or basis, is not shown. Shares outstanding is the latest 10-K or 10-Q cover count (the count the filer states on the cover, with the day it was taken) when the statistics source's own count is an older cover's, and then says so: `fundamentals GME` reads `Shares Outstanding 504.5M (as of 2026-09-03)`, the count of the 10-Q filed 9 September, where the source still served the June cover's 449.1M. The float is the source's own, held within that count (`Float 461.24M`), so GME's short % of float reads 9.25% rather than 9.50% on the stale count; the source does not say when it measured the float, so it is undated, unless it is held at the count itself, which is then dated by it. Where a split may have moved the count since the cover the source's count repeats, the source's count and float stand as they are. A source count that no recent cover states is of unknown age and is shown undated. The overview's Shares Out and Float say `as of` beside a dated count, CSV and JSON carry the day as `Shares Outstanding As Of` / `sharesOutstandingAsOf` (and `Float As Of` / `floatSharesAsOf` for a dated float), and the `holders` 13D/13G legend dates the count `% Today` divides by. A receipt (ADR) keeps the source's count, since a cover counts the filer's ordinary shares. Each row says when FINRA published the settlement (**Published**) and its percentage of float, with the day of the float it is read over where that is known (**Float As Of**): an earlier settlement's is the day of the cover count below, and the newest's is blank unless the statistics date their float. The newest settlement's percentage is the one the statistics give for that settlement (the overview's Short Float), or else its shares short over the current float, as `SIW` reads it. An earlier settlement is read over the float of its own day: the 10-K or 10-Q cover count known when FINRA published it, at the share of today's count that floats (GME's 91.4%: 461.24M of 504.5M). A settlement published before a cover was known, or one whose next cover is on another basis (a split between them), stays blank. `fn SI --as-of 2026-10-14` lists only the settlements published by that day, each over the count known then, the newest included, and dates the report by the newest one listed. Missing float percentages stay unavailable. Average daily volume is not reconstructed from the supplied ratio; FINRA's independently supplied volume remains available. Known zero values remain zero. The date column stays visible during horizontal scrolling, and exports retain every configured financial column. FINRA strikes positions twice a month, on the 15th (the business day before when it is not one) and on the month's last business day, and publishes each count seven business days later. The data carries only the settlement date, so `fn SI` and `fn SIW` read the rest from that rule against the US exchange holidays and say it beside the settlement date they cite: `Source: FINRA · Wed 30 Sep 2026 · published Fri 9 Oct, next settlement Thu 15 Oct, published Mon 26 Oct`. The `SI` and `SIW` pane footers and `shot SI` carry the same publication line, shortened to `published Fri 9 Oct, next Mon 26 Oct` and then `published Fri 9 Oct` where it does not fit. A settlement is therefore not visible on its own date: the 30 September figures could be read from 9 October. Borrow fee, utilization and locate availability are not available: short interest counts shares short, not what they cost to borrow, and no source the terminal reads carries securities-lending data. `catalog glossary short interest` and `fn SI --explain` define the terms the reports use. ### Short squeeze watch (SIW) `SIW` lists every US-listed stock and fund in your portfolios and watchlists; `SIW GME, AMC, CVNA` lists those names instead (up to 60), split by commas, semicolons or blanks, with the quote marks around a name dropped. A share class written `BRK-B` or `BRK.B` is the same name. A name that cannot be read is listed with its reason (`Left out: BTC-USD: not a US ticker symbol; SAN:EPA: not US-listed.`) and a separator left on the end of the list is named too (`Ignored the stray ";" after UPST.`). `gloom fn SIW` exits 1 when no name has data, whether every name was left out or FINRA reports nothing for each, and 0 when some do. Each row reads one name's latest FINRA settlement: - **% Float** is that settlement's shares short over the current float, the same figure the overview and `fundamentals` give for the same settlement; `SI` reads its earlier settlements over the float of their own day. A float under half the shares short is not used (some multi-class tickers report one class's float): the percentage stays blank and days to cover decides alone. - **Days** is FINRA's days to cover: shares short over the settlement period's average daily volume. - **SI Chg%** is the change in shares short from the settlement before. A split between the two settlements is not adjusted. - **1M%** is the latest daily close against the last close on or before the same day a month earlier (the month's last day when it is shorter), from daily closes, price only. A gap of more than four days before that day, or bars that are not daily, leave it blank. A name is **Crowded** when at least 10% of its float is short, or when it would take five or more days of average volume to cover and at least 5% of the float is short; days to cover alone flags thinly traded large caps whose shorts are a sliver of the float. With no float, days to cover decides alone. **Crowded, rising** adds a positive 1M%. The default order puts crowded names that are rising first, then other crowded names, then the rest, each from the highest percent of float down, and names with no settlement last. It is a fixed screen, not a squeeze forecast. The settlement and close dates sit in the query bar when every row shares them, and in columns when they differ. Enter opens the name's `SI` history. ## Credit spreads CRD shows daily closing option-adjusted spreads from FRED for the ICE BofA US Corporate (US IG) and AAA, AA, A and BBB US Corporate indices, the US High Yield index (US HY) and its BB, Single-B and CCC & Lower ratings, and the Euro High Yield index (Euro HY). FRED publishes no ICE BofA euro investment grade spread. `--region us` or `--region euro` lists one region. Source percentages are converted to basis points; 1D is the change from the previous available observation. These are spreads, not bond yields. `gloom fred` prints the same series in basis points, and the data catalog charts each as `FRED:BAMLHE00EHYIOAS` and so on. The board shows no yields: the effective yields of the US Corporate and High Yield indexes, and of the US Corporate index by maturity (1-3, 3-5, 5-7, 7-10, 10-15 and 15+ years) and by rating (AAA, AA, A, BBB), are in `fred` in percent (`fred --list credit`) and in the data catalog (`FRED:BAMLC4A0C710YEY` is the 7-10 year one), so a corporate bond can be read against the Treasury of its tenor. Each series keeps its own observation date. A shared date appears in the footer when all displayed observations agree; otherwise an AS OF column identifies each row's date. Refresh time does not change an observation date. Headless reports retain each FRED series identifier, title, units, frequency, and date. Responses must identify the requested FRED series and daily percentage OAS metadata. An incompatible refresh leaves a usable prior observation in place with its original date and the current failure status; it does not replace the series with another index or erase valid cached history. Credit charts check declared FRED coverage against the returned observations. If usable observations fall outside those dates, the coverage notice withholds the contradictory dates while preserving the observations and any source-declared retention limit. The first and last returned rows do not establish replacement coverage bounds because the request may include a limited window or calculation buffer. ## Single-name CDS CDS displays reported trade activity, with coupon and spread in basis points. Trade times are UTC, written as ISO dates (`2026-10-09 13:21`). DTCC publishes the upfront without saying which side paid it, so it is shown as an absolute amount, unsigned, under `ABS UPFRONT`. DTCC also writes a comma inside a name as `;`; names read and match with the comma (`CCO Holdings, LLC`). Spread notation code 3 is decimal and code 4 is already basis points; explicit percentage notation is converted once. Unlabelled values are assumed decimal for compatibility with the legacy feed. Monetary notation (code 1) and unknown explicit units leave the bp spread unavailable. Trade-level headless rows retain the source spread and notation. Coupon and upfront amounts never establish an unreported spread. With an issuer open, CDS also charts a daily on-the-run 5Y spread. The contract rolls on Mar 20 and Sep 20 to the Jun 20 or Dec 20 date five years out, so the line steps at each roll by the curve between the two contracts (Oracle's Dec 2031 contract traded about 20bp over the Jun 2031 one on the Sep 2026 roll). Each point is the median of that New York trade date's prints on the contract, in the currency the name trades most. Reported spreads count only when a standard coupon reproduces the upfront beside them. Other prints are converted from their upfront with the ISDA standard model (flat hazard, 40% recovery, T+3 cash settlement). The flat rate for USD contracts is the mean of the 2Y and 5Y Treasury yields less 25bp (4% when those yields are unavailable); EUR uses 2.2%, JPY 1% and other currencies 3%. On USD prints that carried both, the conversion matches the reported spread to 0.1bp at the median. A reported spread with no upfront beside it counts only when a converted print the same day lands close to it. The 1W and 1M moves follow CDX's rule: the latest level against the last one a week (or a calendar month) back on the same contract, and across a roll against the contract before, which keeps trading off the run for a while after it, so the step between the two contracts is never read as a move. The moves show only while the level is current: when the line's last level is more than 5 trading days (weekdays) behind the tape's last day, they read `--` and the name ranks after the current ones. Past 2,000bp a name trades on points upfront rather than spread, and a bp figure there mostly measures the model's recovery assumption (at 25% recovery instead of 40%, 2,000bp reads about 1,730bp), so the line is quoted in points upfront on its running coupon, as the index board quotes HY in price: `57.6 pts` on a 500bp coupon for Virgin Media Finance, with its 1W and 1M moves in points and its chart and range too. 2,000bp is about 35 points on a 500bp coupon, where a point is worth about 80bp. DTCC publishes the upfront without a direction, so each amount has one reading on each side of the coupon; the side comes from the day's reported spreads or from prints that allow only one reading, within two weeks, and failing those from the issuer's own level in the days before, while that level sits clear of the coupon. Days nothing anchors are left out rather than guessed. Names that never report a spread may have no line: when every recent print carries an upfront without the side that paid it, CDS says `5Y level not derivable: DTCC prints carry upfront without payer side` (with `after` and the date of the last level a name has, when it has an older one). This is common for European banks quoted on a 100bp coupon. Index trades booked leg by leg at one price across every member, prints with an effective date other than the trade date or the next day, and prints far from the day's median are dropped. The history starts with the oldest daily file DTCC still serves (about two years), not the issuer's full trading history. A ticker becomes the company name its listing carries, or, where the company's CDS references another entity, that entity: `CDS CHTR` reads CCO Holdings, LLC, and `CDS TMUS` T-Mobile USA, Inc. DTCC sometimes names the reference entity only by an ISIN or CUSIP (`US124857AZ68`); such a row takes the name the same code carries on the rest of the tape (Paramount Global), and keeps the identifier when no print names it. With no argument CDS lists the issuers traded in the last 5 days, and each row's 5Y spread is the latest level of that issuer's line within the last month, with its 1W and 1M moves and its date in reports, all from one request; a name without one shows `--`. A name quoted in points upfront shows them under the same `5Y`, `1W` and `1M` columns, and exports write the number with a `pts` unit beside it (`bp` for the others), as `fn CDX` does. Click a column header to rank the list by it; `fn CDS --sort spread`, `--sort 1w` or `--sort 1m` ranks the report widest first, the names quoted in bp first, then those quoted in points, then those without a figure, and the default stays most active. With an issuer, `fn CDS` (text, `--csv` and `--json`) carries the figures the pane heads its chart with: the latest 5Y level and its date, the 1W and 1M moves and the range charted (in points with the coupon, for a name quoted upfront), then the trades and a Daily table of the line's levels with each day's print count and contract, and each day's points beside the spread for a name quoted upfront. `fn CDS F --csv --section daily` exports that table alone; `--days` (30 to 730, default 365) sets how far back it reaches. In `--csv` and `--ndjson` every row is dated by its own day in the [five fixed columns](usage.md#what-every-exported-row-says): each names its issuer, a listed issuer is dated by its 5Y level's day (its last trade without one) in the unit it is quoted in (`bp`, or `pts` for a name quoted upfront), a trade by its time in its currency, and a daily level by its day in the line's unit. A view with no trades names the window and the entity searched. Every CDS view is dated by its last trade, with how many days that is behind. See the [CFTC spread notation specification](https://www.cftc.gov/media/6576/Part43_45TechnicalSpecification093021CLEAN/download) (elements 73–75) and [ICE SEC SBSDR field validations](https://www.theice.com/publicdocs/data/ICE_Trade_Vault_SEC_SBSDR_Field_List_Validations.pdf) (elements 68–70). These define reporting units, not executable quotes or a comparable constant-maturity issuer spread history. ## Options ### Shared volatility calculations The volatility library uses decimal annualized volatility (0.20 means 20%), calendar-year fractions for options and bars per year for realized volatility. The bars per year come from the series' own dates: 365 for a 24/7 series such as crypto (daily bars that include both Saturday and Sunday observations), 252 for exchange sessions. Close-to-close uses the sample variance of log returns. Parkinson uses the squared log high/low range divided by `4 ln(2)`. Garman-Klass subtracts `(2 ln(2) - 1)` times the squared open/close log return from half the squared range. Rogers-Satchell uses `ln(H/O) ln(H/C) + ln(L/O) ln(L/C)`. Yang-Zhang combines sample overnight variance, sample open/close variance and Rogers-Satchell, with `k = 0.34 / (1.34 + (n+1)/(n-1))`. Range estimators assume coherent OHLC prices; daily jumps, splits and missing sessions can affect comparisons. No synthetic missing session is inserted. Dated invalid observations remain gaps and are never skipped to join returns. Repeated timestamps use the last correction. Rolling windows are 10, 20, 30, 60, 90, 180 and 260 bars. HVG and HVT state the bars per year they annualize at (`365 bars/yr` or `252 bars/yr`) in the pane footer and the report's notes. Cone statistics use valid rolling estimates whose ending observations lie within the chosen one- or two-calendar-year lookback. They report the current estimate separately from the historical sample, plus minimum, maximum, mean, median and the current empirical percentile. Percentiles use midpoint ranks for ties, so a constant sample has percentile 50. Missing current volatility stays unavailable even if an older estimate exists. `HVG ` displays selected rolling windows above a separate price panel; `HVT ` opens the cone table and chart for all seven windows. The table's selected row is the chart's cursor: the legend's Min, Max, Mean and Current are that window's figures (the last window's when none is selected), the axis names it (`30 bars`), and hovering or clicking the chart previews or selects a row. `shot HVT` and its JSON say which window the legend reads (`Chart legend: 30-bar window`, `legendWindow`). The shared pane supports close-to-close, Parkinson, Garman-Klass, Rogers-Satchell and Yang-Zhang estimators, with a one- or two-year lookback. It requests daily five-year history so the longest rolling windows have warmup before the displayed lookback. Available sample counts remain in the cone table. An incomplete listing history cannot supply a full historical distribution. Settings and the active view persist per pane, and table CSV exports include percentage values with estimator and source metadata. Headless JSON preserves decimal volatility values. The optional IV overlay reuses the OVDV chain loader and its quote cleaning. It is a single dated current ATM observation with an explicit option tenor, never a historical implied-volatility line. On screen in the regular session it re-reads the chosen expiry's chain once a minute at the live price; if that slice cannot price an ATM level, the dated reference already shown stays. Its caveats are the chosen expiry's own plus any catalogue or Treasury failure; other loaded expiries' warnings do not apply, except that the pane says so when nearer expiries had no usable ATM quotes and the reference fell back to a farther tenor. When the sources have no option chain for the underlying, as for many non-US listings, crypto and FX, the IV line is simply absent. Missing or stale option data do not prevent realized-volatility analysis. Historical IV, IV rank and IV percentile come from the stored history in `HIVG` (see [Implied volatility history](#implied-volatility-history)). The chart composer's Realized vol indicator uses the same estimators, with persisted window and estimator settings and annualization at the series' bars per year (365 for a 24/7 series, 252 for exchange sessions) on source daily price observations. A synthetic live quote appended to the price chart does not become an extra daily observation for volatility. Invalid windows remain gaps through their complete warmup; intraday bars are not treated as daily sessions. OMON HV30 uses this same close-to-close implementation. Put-call parity estimates the forward as `K + exp(rT) (Cmid - Pmid)` from paired two-sided quotes on the nearest two strikes on each side of spot. The median reduces sensitivity to an inconsistent pair. A pair whose forward is more than 5% plus 100% a year of carry (in log terms) away from spot grown at the Treasury rate is discarded: stale quotes left on far strikes, such as contracts listed before a split, otherwise imply forwards several times spot. When every pair is discarded the forward is unavailable. The bound can also reject a genuine forward far from spot, such as a hard-to-borrow name or a short-dated chain around a special dividend. Volatility indices such as ^VIX are exempt, since their options settle on a future that can trade far from the spot index. The result preserves the contributing contracts, warns when the strikes do not bracket spot or quote intervals disagree, and is unavailable if no pair exists. Implied continuous dividend yield is `r - ln(F/S)/T`; it can include borrow effects and American-exercise differences. An unpaired quote does not establish a forward. Delta and strike inversion use the existing European pricer and signed spot delta, including continuous dividend carry. Forward pricing through that pricer sets its underlying to F and its dividend yield equal to r, so discounting is applied exactly once. Smiles fit raw SVI total variance, `w(k) = a + b [rho (k-m) + sqrt((k-m)^2 + sigma^2)]`, with `k = ln(K/F)`. A failed or poorly identified fit falls back to shape-preserving monotone cubic interpolation in log-moneyness. The fit retains its method, fallback reason and volatility residual. Tenor interpolation is linear in total variance `IV^2 T`; outside available tenors it retains the nearest IV and explicitly marks extrapolation. Calendar warnings identify decreasing total variance at fixed forward moneyness; butterfly warnings identify non-convex call prices on an ordered strike grid. Checks report problems without repairing the observed surface or guaranteeing arbitrage freedom between sampled points. 25-delta skew is put IV minus call IV; risk reversal uses call IV minus put IV. The butterfly, the 90/110 skew and the term slope are measured from each expiry's parity forward, not from spot: the butterfly is the average of those wing IVs minus the IV at the forward (ATMF), and the 90/110 skew subtracts the IV at 110% of the forward from the IV at 90%. Measured from spot, a long-dated fly read below zero by construction: a two-year SPY forward sits about 8% over spot, where a skewed smile is a point or more lower, and every move of a pre-market print moved it. Since the two 25-delta conventions are opposite, every skew column in a report names its sign after its name, as ` (pts)`: `put-call` for 25-delta skew (HIVG's `skew25d put-call (pts)`, VCA's `25D skew put-call (pts)`), `call-put` for the risk reversal (HIVG's `rr25d call-put (pts)`, OVDV's `RR call-put (pts)`), `wings-ATM` for the butterfly and `90%-110%` for the 90/110 skew. The headers carry no comma, so a CSV header needs no quoting. Term slope is the decimal change per calendar year in the IV at the forward. OVDV finds each expiry's 25-delta strikes on its fitted smile inside the quoted strikes, as the Table's delta columns do, so the Skew view and the delta columns always agree; a fit that cannot price a far wing it was never quoted at no longer blanks a quoted expiry. Where the clean quotes stop short of a 25-delta strike the fit is not extrapolated, and the risk reversal and butterfly say which wing is missing (`no 25D call`, `no 25D put`, `no 25D quotes`, or `no smile fit` with no fit at all); a 90/110 figure past the quotes reads `not quoted`. The ATM slope out of an expiry under 7 days away is left out (`under 7d`): a few hours of IV change annualised reads in the hundreds of points a year. Expected move reports the nearest paired ATM straddle midpoint and `spot * ATM IV * sqrt(T)` separately, both in price and percentage points of spot. A straddle more than 5% from spot is withheld. Neither measure is a forecast or a confidence guarantee. ### Volatility source coverage Symbol publication and app routing are separate: a published index can still lack a usable route in the app. | Source | Coverage and limitation | |---|---| | Backend index quotes | `^VIX` resolves through the market-data router. `^VIX9D`, `^VIX3M`, `^VIX6M`, `^VIX1Y`, `^VVIX`, `^SKEW`, `^MOVE`, `^VXN`, `^OVX` and `^GVZ` resolve directly, but a previous-day timestamp is rejected by the normal quote freshness rules. Index requests omit equity exchange hints. | | Backend daily histories | The history router returns about one year of daily closes for the main VIX family above, except `^VIX1Y`, which returns one observation. `^VXEEM`, `^VXEWZ`, `^VXAPL`, `^VXAZN`, `^VXGOG`, `^VXGS` and `^VXIBM` also return only one close. One observation supports neither a daily change nor a one-year percentile. `^RVX` and `^EVZ` are unavailable; EVZ has left the board (see below). `^MOVE` returns inconsistent provider name metadata, so its identity requires caution. | | Cloud FRED | Only `VIXCLS` and `VXVCLS` are supported. `VXNCLS`, `RVXCLS`, `OVXCLS`, `GVZCLS`, `EVZCLS`, `VXDCLS`, `VXEEMCLS`, `VXEWZCLS`, `VXAPLCLS`, `VXAZNCLS`, `VXGOGCLS`, `VXGSCLS` and `VXIBMCLS` return `Unsupported FRED series`. | | Public FRED publication | These series are still published except [EVZCLS](https://fred.stlouisfed.org/series/EVZCLS), explicitly discontinued on March 11, 2025. Cboe stopped publishing EVZ itself that day, and its own history ends there too, so the board no longer lists EVZ. An unsupported Cloud route does not imply a discontinued series. Actual observation dates take precedence over lagging series metadata. | | Options chains | Delayed chain snapshots can carry zero bids and asks on every front-expiry contract and lack usable near-ATM markets on later expiries. Availability is time-dependent: later snapshots of the same chains can carry usable two-sided markets, so zero-quote responses are partial or empty-state cases. Nonzero last trades and provider IV placeholders cannot replace a missing midpoint surface. | | Treasury curve | Ten nodes from 1M through 30Y, in percentage units. Divide yields by 100 for decimal rate inputs; short option tenors have no separate 1W Treasury node. | | VIX futures | `FUT` has no VX alias or monthly VX catalogue, and `VX=F` does not resolve. The cash volatility tenor curve is not a futures curve. | Dated daily-close histories can support a volatility board without bypassing quote freshness. Missing chain quotes remain unavailable in both recomputed and provider-IV comparison modes. Source coverage can change; the app reports what each request actually returns. Implied-volatility and surface history come from the stored daily snapshots described under [Implied volatility history](#implied-volatility-history), not from these live sources. ### Option monitor and calculator `OVDV ` loads up to 18 unexpired listed expiries with four concurrent requests. Listings with daily or weekly expiries are thinned so each requested expiry is at least 35% further out than the previous one; this spans the term structure instead of the front month, and a short catalogue is still requested completely. Loading more expiries adds the skipped ones from the longest tenor inward. Its catalogue and per-expiry requests use the same options coordinator as OMON. Scrolling the table near its end or choosing the footer's more-expiries action extends the request by 12 expiries. Each expiry publishes independently; an error in one slice remains visible beside successful slices. A refresh retains the prior view while new requests start. On screen in the regular session, a real-time surface reloads every 15 seconds past the local chain cache and is refitted at the underlying's streamed price; a reload replaces the surface only once complete and keeps the selection and camera. A delayed surface keeps the configured refresh interval. On desktop and web, a reload on the same grid eases the 3D surface into its new shape; a different grid or reduced motion swaps directly. A removed explicitly selected expiry stays unavailable until another is chosen, preventing a calculator from silently switching contracts. The default surface recomputes European IV from quoted midpoints using the shared solver. Cleaning excludes zero bids, crossed markets, spreads greater than 50% of midpoint, mismatched expirations, and stale duplicate contracts when a fresher observation exists at the same strike. A contract with zero open interest is excluded only when other contracts on the same side of that expiry report open interest; missing open interest is unknown and keeps the quote, and so does a side reporting zero throughout, as a feed without counts or a new listing does. When cleaning leaves no call and put at one strike, the expiry's warning lists how many contracts each filter removed. The default stale threshold is five weekdays, a session proxy that does not infer exchange holidays. Bid/ask price choice, spread threshold, stale threshold and provider-IV comparison are pane settings. Provider comparison applies the same quote cleaning and requires a measured parity forward; unavailable markets do not become provider-IV surfaces. Puts below the measured forward and calls above it form a single OTM smile. Rates linearly interpolate available Treasury maturity yields, divided by 100 and used as a continuous-rate approximation. This is a proxy curve, not a bootstrapped zero-coupon curve. Expiries shorter than the 1M bill hold the 1M rate flat, the usual convention; a hold beyond the longest published tenor, or on a curve missing its 1M point, is flagged. Unavailable rates are never silently replaced with a fixed default. Parity-derived forward and dividend carry, contributing contracts, source dates, fit residuals and rejected-quote counts remain in exports. Equity and ETF options can have American exercise effects that this European IV convention does not remove. The 3D view uses listed expiries as evenly spaced rows, labelled with their tenor. By default its columns are spot delta from the 10-delta put through ATM (the spot strike) to the 10-delta call in 5-delta steps; each cell is the fitted smile at the strike with that delta, found only inside the expiry's quoted strike range, so every row spans the same probability range without extrapolation and the surface is a full sheet. The alternative forward-moneyness axis (80% to 120%, `d` in the pane or the 3D surface axis setting) draws each row only within 2.5 ATM standard deviations of its forward (`2.5 x ATM IV x sqrt(T)`); a quoted one-day 90% put has an IV, but that strike carries no probability mass. Adjacent rows of different widths join along their supported endpoints with boundary triangles on existing nodes; internal quote gaps and unavailable expiries stay open. Between grid nodes the drawn surface follows a bounded Catmull-Rom spline through the nodes (it passes exactly through every fitted value and never leaves the range of its neighbours); the wireframe marks the nodes themselves. Colour is the Turbo scale over the 2nd to 98th percentile of plotted cells, shared by the vertical axis and the colour bar; a few wild short-dated wing cells extend above the box rather than flattening the rest. The floor carries a translucent projection of the same colours. Desktop draws the surface on the GPU (WebGL) with per-pixel lighting; dragging rotates with inertia, the wheel or a pinch zooms, and a double click resets the view. Terminals with Kitty graphics use a software renderer over the same geometry, at half resolution while the camera moves. Arrow keys or h/j/k/l rotate, + and - zoom and 0 resets in both. Without bitmap support the shaded table remains keyboard- and mouse-selectable. Where WebGL is unavailable the desktop and web draw the same geometry with the software renderer. The 3D view waits while its first expiries load. Fewer than two neighbouring expiries with usable quotes make no surface: the view then shows the expiry-by-delta grid in the same Turbo colours with its legend and says how many expiries are quoted, and with none it says so. `gloom shot OVDV` waits for every expiry and for the WebGL frame, and reports a capture whose surface is a grid or an empty frame as not usable. The table, smile and skew views keep every cleaned quote. The term chart spaces expiries on a log tenor axis. The default selected expiry is the first at least four weeks out. The table and smile axis can show spot %, forward %, signed delta wings or strikes. Fixed table tenors interpolate total variance at fixed forward moneyness and show I; time extrapolation shows E. Strike extrapolation is withheld in every view, including ATM and delta-wing metrics, so a few far-wing quotes cannot manufacture a near-ATM surface. The surface is valued at one spot, the one OMON values its chain at (see [Greeks spot and time](#greeks-spot-and-time)): a chain quoted in a session that has closed is priced at that session's official close, so the same chain gives the same surface until it refreshes, and the query bar and the report's notes say so (`Spot 766.48, close Mon 19 Oct`); in the regular session it is the latest price. `--json` names it in `metadata.spotBasis` (`basis` `close` with its `sessionDate`, or `last` with the extended session it printed in). A symbol with no option chain at all, a listing that stopped (`TWTR: Delisted Oct 27, 2022`) or a symbol another security took over (`FB now lists ...; Meta Platforms trades as META`), says that line in place of the chain error, as `options` and HIVG do; OSA, OPX and GEX do the same. Use the tabs or the footer's view action to switch surface, table, smile, term, skew and forwards. The expiry selector and [ / ] select an expiry. Smile overlays identify nearby expiries on the same chosen coordinate axis. Term structure shows ATM at spot (distinct from the forward-ATM ridge) and 25-delta wings with each expiry's straddle and one-sigma move below. The forwards table shows the parity forward, its basis to spot, and the implied dividend yield only for expiries at least 30 days out (`under 30d` before then), since annualising a few days of carry is not meaningful. The price action seeds OVME with the selected fitted strike, tenor, rate and carry; a nearby contract's premium is not borrowed for an off-strike cell. The chain action opens OMON at the same expiry. CSV exports from tables include method, filters, rates, source dates and warnings; `gloom fn OVDV AAPL --json` preserves the complete model metadata. `gloom fn OVDV AAPL --tab skew` prints the view `--tab` names: the grid for `surface` and `table`, the selected expiry's clean quotes against its fit for `smile`, ATM and 25-delta IVs with the straddle and one-sigma move for `term`, the skew table with one line each on its sign conventions for `skew`, and the forwards for `forwards`. `--expiration` takes a date (`2027-01-15`) or Unix seconds and selects the listed expiry of that calendar day, as OMON does; a date the chain does not list names the nearest listed ones. `--date 2026-10-09` prints the stored close surface of that session through the same `--tab` views instead of the live chain, as the pane's stored dates do: no current price is needed, the report is dated by the session (`not a live feed (stored close capture)`), its notes say when the capture was taken, and `--expiration` picks among the expiries the capture holds. A date with no capture fails with the stored dates, newest first (past 30 of them, the ten nearest and the span); a capture the account cannot see yet, because it was taken less than 15 minutes ago, says so instead. In `--json` the Skew rows carry `termSlope: null` and `termSlopeHidden: true` under 7 days, a `gap` reason where the risk reversal and butterfly are missing and a `moneynessGap` for 90/110, while `metadata.expiries` keeps the model's own values. Pane sharing uses the standard pane menu. OVME offers European Black-Scholes and American CRR models. The American tree models early exercise and an explicit cash-dividend schedule; the European closed form retains continuous dividend yield. Theta is per day; vega is per volatility percentage point; rho is per rate percentage point. The UI keeps these units beside their values. In the European closed form, a positive input exactly at the discounted zero-volatility payoff has a 0% boundary solution. Nearby prices within the cumulative-normal approximation’s price-error bound cannot resolve IV and remain unavailable; this is not an estimate of quote precision or realized volatility. The asymptotic maximum has no finite IV, and the solver retains its 500% ceiling. Submitted calculator inputs retain their entered precision while editing. OMON HV30 is the annualized sample standard deviation of 30 daily log returns from 31 distinct reported observations, using 252 trading days per year, or 365 for an underlying with weekend observations. A later correction replaces the same timestamp. Missing or nonpositive closes and contradictory OHLC inside that window make HV30 and IV/HV unavailable; they are not skipped to bridge a return. A quote explicitly marked stale cannot seed underlying-dependent Greeks, ATM selection, or the calculator. Contract quotes remain visible with their own timestamps. OVME values are per underlying unit, not a position or contract total. Rates and continuous dividend yield are entered in percent; time uses calendar days, retaining fractional days. A chain expiry date is seeded at 16:00 New York with historical daylight-saving offsets. Verify and edit the time for other settlement schedules or early closes, especially index options. The calculator does not resolve adjusted deliverables or contract multipliers, model multi-leg payoffs, or compute assignment outcomes. American exercise is a theoretical optimal stopping decision, not a forecast of actual assignment. OMON names the selected expiry first in its figures, with the calendar days from the chain's as-of date to it (`Expiry 2028-01-21 (469d)`), so the date stays readable when the expiry strip is scrolled. OMON retains the selected expiration date when a refreshed catalogue reorders or removes other dates. If that selected date is unavailable, the chain names the listed dates nearest it, and its table and calculator remain unavailable until the date recovers or another date is selected. An expiry is live until its last trading session has closed on the listing's clock and calendar: 16:00 New York for a US listing, 13:00 on a published early close, and the session before for an expiry dated on a holiday; a listing abroad closes on its own venue's hours. Once it has closed the expiry leaves every expiry list and picker (`options`, OMON, OSA, OVDV and CSP), and a chain asked for without a date shows the nearest live expiry, even while a source still answers with the one that lapsed (Friday's chain over the weekend). A lapsed date asked for by `--expiration` in `options`, OSA, OVDV or CSP says so and names the next one: `expired on 23 Oct; nearest live: 30 Oct (--expiration 2026-10-30)`. A strategy OSA cannot seed from its chain names the expiry it tried and the next live one to try. OMON and OSA panes opened at a date that has since lapsed open the nearest live one. Enter, a double click or Open Contract in the pane menu opens the selected contract as its own security: its quote, chart and, with a trading-capable broker profile, Trade. A chain from a broker opens the contract on that broker's profile while the profile is on. With such a profile, `b` and `s` open the contract's Trade with a Buy or Sell ticket, and Shift+S opens the volatility surface that `s` opens otherwise. An explicit OMON row/cell selection retains its strike, side and contract symbol within the selected underlying and expiration. Adding other strikes cannot move that choice. If the chosen contract disappears, its calculator action remains unavailable until that contract returns or another contract is explicitly selected. Strike labels and table exports preserve fractional precision; wide values can still require horizontal scrolling. Invalid option volume/open interest is unknown, not zero, and so is missing open interest. A reported zero remains zero. Open interest is an OCC count about two sessions old, taken from the contract list for every contract it counts and dated with its session ([as of](#greeks-spot-and-time)). The real-time quotes carry none, and outside the session the backend's delayed reference can report zero across a whole expiry that has traded for days; Gloom Cloud reads such a blank as unknown. The backend fallback omits volume for contracts that have not traded, so it normalizes that missing volume to zero. It withholds implied volatility for a contract with neither bid nor ask, and at the feed’s 1e-5 solver floor: those values come from a quote-midpoint solver, which can return placeholders after the close. Expiration volume and each put/call ratio require complete inputs for that metric across the returned contracts; missing open interest does not suppress complete volume or IV. These totals describe the supplied selected-expiration rows, not verified whole-market coverage. The existing `options` CLI retains the same source activity availability; `--refresh` bypasses its local chain cache, and a failed refresh that falls back to a stored chain prints a warning with the stored time. OMON has no headless pane report; `gloom fn OMON` reads the rendered chain and takes `--expiration` as `options` does. A calculator opened from a chain uses a saved contract observation. Its quote and last-trade timestamps are separate; neither makes a saved quote executable. The market reference identifies midpoint, last, or manual input. Crossed or one-sided quotes do not supply a valid midpoint. ## Earnings and corporate actions `EE`, the corporate-actions events and `ERN` show one reported EPS per quarter, the same figure in each: for a US listing it is the earnings calendar's actual, measured against that calendar's consensus, and the events feed only fills quarters the calendar does not hold. A feed row dated near a report the calendar knows, but not on it, is not a report and is left out, and so is one in a fiscal quarter a report on record (the calendar's, or a results filing) already holds: WFC's feed lists an After Hours report on 2026-05-29, in the March quarter its 2026-04-14 report holds, that WFC never made. Of two feed rows for a quarter nothing on record holds, the one its statement proves stays, else the earlier. The Period column names each report's fiscal quarter, never its time of day: a report not out yet says when in the day it comes in its Detail (`confirmed, After Hours, 17 analysts`), and an opened row names it as Report time. Each reported figure names its basis by comparing it with the quarter's diluted EPS in the statements: **GAAP** when it is that figure to the cent, **adj** (adjusted) when the calendar's figure differs from it, since the calendar's consensus basis leaves out items the statements include. Adjusted figures follow the consensus provider's definition, which can differ from the company's own non-GAAP EPS. The basis shows as unknown when the statements have no comparable quarter (no statement for it, another currency or share count, a figure that differs by a split ratio) and for an events-feed figure that does not match the statements, which could be adjusted or wrong. A TTM row that sums the four quarters above it says whether that sum is GAAP or adjusted; otherwise TTM EPS is the statements'. Fiscal period ends are not announcement dates. Open an event row for its source inputs and dates. Consensus estimates are forecasts for the stated fiscal period. The provider's prior-year input can itself be an estimate; it does not establish a reported result. Fetched timestamps identify retrieval, not when consensus was revised. Filing evidence corroborates a fiscal period without verifying every reported metric. Split-feed factors may include spinoff price adjustments. Merger terms, spinoff distributions, and security conversions are not covered. Source failures and unavailable event data remain visible rather than appearing as an empty event calendar. An offer price dated before a listing's first trade follows the [leading zero-volume bar rule](#price-history-corrections). This does not establish complete IPO or corporate-action coverage. ## Earnings days and report history (ERN) `ERN` works on the loaded security: typed alone with a ticker active it shows that company's reports. With nothing active, and always as `EVTS`, it lists the reports due today, at the next session and through the rest of that week (the following week once the next session ends one), largest companies first, up to 200 a day; `EVTS ` selects that company's row. Your portfolio names carry a filled dot and watchlist names an open one; **Mine first** ranks them ahead within each day and the **Mine** filter keeps only them over the next three months. `ERN ` shows the upcoming report and up to twelve past ones; with several tickers ERN lists their upcoming reports. An ETF, fund, index, currency pair, cryptocurrency or future reports no earnings, so `ERN` says so rather than show an empty table: `fn ERN SPY` answers ``SPY is an ETF; ETFs have no earnings. Try `fn ERN AAPL`.``, while the pane and its capture say `SPY is an ETF; ETFs have no earnings. Try ERN AAPL.`, the command as typed in the app. Nothing is reported as missing. A stock with no reports on record yet still shows `No earnings reports on record.` **Dates and timing.** Dates and EPS consensus come from a daily earnings calendar. An upcoming date is **confirmed** once the calendar gives it a time, which it does after the company announces the date, and **projected** while it is estimated from the company's past reports; the next report's figure shows which. BMO, DMH and AMC mean before the open, during the session and after the close. A report's time comes from the acceptance time of its SEC 8-K item 2.02 filing when there is one, since calendars often leave it out; a filing accepted after the previous close or before the next open counts as the same report. An upcoming time shown dimmed is expected from the company's last two reports, not announced. Reports before 2024, and those on the few dates the calendar cannot be read for, are known from their filings alone: they show the events feed's figure where it has a row for that report, as `EE` does, sit in the last fiscal quarter that ended 5 to 100 days before them on the company's cycle (the quarter-end months its calendar reports name), and otherwise carry no EPS. An upcoming report the calendar has not placed in a quarter yet is placed the same way. **Implied move.** The at-the-money straddle (the call plus the put at the listed strike nearest spot) on the first expiry that settles at or after the first close following the report, divided by spot; when that expiry did not trade, the next one. Upcoming reports are priced from quote mids through the session, and the price captured from 15:40 New York time in the last session before the report is kept. Past reports since February 2024 are priced from option trade closes, the last trades of that session, so the call and put can have traded at different times; their averages in `ERN ` are trade-close averages. A stock with no listed expiry within about six weeks of the report shows none. When the first expiry is weeks away, the straddle also prices those weeks, so it overstates the event. **Realized move.** The close before the report to the first close after it, on split-adjusted prices: the previous close to the report day's close for BMO and DMH, the report day's close to the next session's for AMC. A report with no known time has no realized move. **Avg move** is the mean absolute move over the company's last eight reports, shown from four. VS IMPL is the move's size over the implied move: above 1x the stock moved more than priced. **Estimates and actuals.** EPS estimate and actual come from the same calendar, so they compare like for like; surprise is actual minus estimate over the estimate's size. BASIS names the actual's basis as in [Earnings and corporate actions](#earnings-and-corporate-actions), and ESTS counts the analysts behind the estimate. The upcoming report's estimate is the analyst consensus for its fiscal quarter that `EE` shows, with that consensus's analyst count, when one is published in dollars; otherwise it is the calendar's. The revenue estimate is the quarter's consensus in US dollars, recorded while the report is upcoming, so past quarters from before September 2026 have none. Revenue actual is the quarterly statement for the report's fiscal quarter. Listings the calendar does not carry, such as those abroad, show their next date and estimates without moves. **Same-day actuals.** The calendar fills in a report's EPS the next day. Until then, for a company on the board, the EPS (and revenue) can come from its own press release, the exhibit to its SEC 8-K item 2.02 filing, read minutes after it is filed, on the basis the consensus is measured on. Gloom Cloud stores nothing when the release does not say plainly which figure that is. Such a figure is **provisional**: it is drawn quieter in `EVTS` and `ERN `, `EE` says so in the row's detail, and reports flag it (`epsActualProvisional`, `revenueActualProvisional`). The calendar's figure replaces it. **On the board.** The market's days, `EVTS` and a ticker list show each report's status, estimate, ESTS and, once reported, EPS ACT, BASIS and EPS SURP exactly as `ERN ` does. MOVE, beside IMPLIED, is the move so far on a report out today, from the close before it: the session's move (the pre-market's before the open) for one out before or during the session, the after-hours print for one out after the close. It comes from the same quotes as every other board, and `ERN ` shows it on today's row until the first close after the report settles the realized move. BASIS, ESTS, EPS SURP and STATUS are the first columns a narrow pane leaves out; without STATUS, WHEN marks a report that is out with ✓ and dims a projected date. MKT CAP, and the ranking by size, is the market cap `RV` shows: the company's latest financials snapshot at the regular session's price, from the newest quote Gloom Cloud holds for it. Outside the session that is the last close, as in `RV`; in the session it follows prices as recent as that quote. A company with no snapshot yet shows the calendar's figure. ## AI research context Ask AI and ticker attachments in the AI workspace come from the [BYOK AI plugin](https://github.com/gloom-sh/gloom-byok-ai) and use the available quote, summary fundamentals, and latest annual statement. Monetary amounts retain their original values and explicit source currency, including minor units such as GBp. The configured base currency is a preference; these inputs are not converted. Listing, summary, and statement currencies remain independent, and unknown units remain unknown. Zero values and numeric precision are preserved; margins, yields, and returns from fundamentals are identified as fractions. The context includes available source, observation, retrieval, stale-state, and statement-history failure information. Retrieval time does not establish a valuation date. Annual period identity, whole-row availability, and individual field availability remain distinct. This attachment is a snapshot of those inputs, not a complete filing or a guarantee that a provider's data is current. ### Filing alert timing Filing event alerts observe House and Senate disclosures and followed funds' 13F submissions, using the existing mobile daily cap, cooldowns, and delivery ledger. A filing that matches several rules notifies once. Rules begin on their creation day; resuming a paused rule starts a new observation window. The evaluator looks back at most 14 days and handles up to 40 event rules per user. House alerts depend on successful PDF parsing and the daily OCR budget; Senate alerts cover electronic reports only. Each chamber scans up to 240 recent filings per source year. Fund filing checks share the 24-hour forms13f cache. Delivery therefore follows source availability and parsing, not the transaction date or a guaranteed real-time schedule. Price alerts continue to use their existing price conditions. Market and research rules come in two families. Event rules (earnings date, filing type, news keyword, analyst change, insider trade) fire once per dated source event inside the 14-day window: a confirmed, non-estimated earnings date, an SEC acceptance instant with an explicit timezone, a story first seen by the news pipeline, an explicit upgrade or downgrade action, or an open-market P or S Form 4 row. Free accounts receive a news keyword match once the story passes the delayed-news cutoff. Observed rules (52-week, unusual volume, short interest change, IV spike) keep one dated reading per rule. A new, edited or resumed rule records a baseline and cannot fire on it; an alert needs a strictly newer observation whose condition is true after one that was false. A crossing held by the cooldown or daily cap waits up to a day. The 52-week test compares a completed session's high or low with the prior 252 completed sessions; unusual volume divides a completed session's share volume by the prior 20 sessions' mean; short interest change compares consecutive FINRA settlements; IV spike compares OPRA implied volatility for one contract and requires Pro. Readings carry their unit, date and a percentile of the same statistic over up to one year of readings, shown once at least 20 readings exist. Delivery history records what the push service accepted, not what the phone displayed. Options flow rules (Pro) match the prints the FLOW scanner records: aggregated fills of $50K or more on the contracts it streams. Cloud checks new prints about every 10 seconds and pushes the largest match of each pass, at most one flow alert every five minutes, within the shared daily cap. Prints older than ten minutes are never pushed, and a rule never fires on prints from before it was created. The scanner streams 500 contracts ranked by premium; names with an active flow rule are always fetched and get part of that budget (up to 100 contracts, 3 to 10 of each name's busiest), so a rule on a quieter name watches its most active contracts, not every strike. A portfolio-and-watchlist rule covers up to 20 of your names, held names first. ## Annual risk-factor reports (RISK) Risk reports use the filing year of a company's Form 10-K, rather than an assumed fiscal year. The filing date identifies the source document; “Report updated” identifies the derived risk report. Risk headings and source excerpts come from the filing, while the overview and notes are analysis. The available comparison is the report's supplied change analysis; a missing annual filing is not synthesized. Foreign issuers filing Form 20-F are not covered by this 10-K report service. Opening RISK follows the newest discovered report. Selecting a year keeps that filing selected when the standard `r` command refreshes discovery. New ticker/year requests clear the preceding report before loading, so its filing action cannot point to another selection. Source dates remain unchanged during refresh. Historical reports can be cached for rereading; a failed refresh can retain the same report with its original retrieval time and an active footer failure. Missing or denied report responses clear that report. The discovery list has a six-hour freshness window; failed forced refreshes are retried on reopening within the same runtime. `gloom fn RISK AAPL --year 2025` reads that specific filing without requiring latest discovery. Omit `--year` (or use `latest`) for the newest discovered report; `--refresh` bypasses the corresponding caches. JSON and text export preserve source dates, the filing URL, source excerpts and separate analysis. A cached latest list after a discovery failure makes the report incomplete and discloses the failure; an independently available explicit historical report does not depend on the discovery list. Retrieval timestamps describe cache freshness and do not move the filing or report-update dates forward. ## SEC filings and 8-K research SEC keeps original and amended filings as separate accession records. Opening an amendment does not replace or reconcile the original filing's contents. Filing calendar dates and SEC-reported acceptance timestamps are distinct; acceptance is not verified public availability or an announcement time. Source timestamps without a timezone remain unconverted, and a filing date does not establish a report-period end. The SEC report export retains the source accession, issuer, document link and available acceptance provenance. The SEC pane lists the filings newest first with their form in its own column. The bar above the list carries the ticker as a badge that opens its description (`d` does the same), the filer and its CIK, and a Form filter: annual and quarterly reports, current reports, insider forms (3, 4, 5 and 144), 13D/13G, proxies, and registrations and offerings, each with its amendments. A ticker SEC maps to more than one filer adds a Filer filter, and each row then names its filer. A bank files a pricing supplement or term sheet for each structured note it sells, hundreds a week (192 of WFC's last 200 filings), so these (424B2, free writing prospectuses, and another 424B prospectus that calls itself a pricing supplement or term sheet) stay out of the list behind a Pricing supplements toggle that counts them among the filings the other filters keep; a 424B3 that does not say so is often a merger or resale prospectus and stays, unless its filer filed at least 20 424B2 or free writing prospectuses within 30 days of it: a structured-note shelf files its note term sheets as plain 424B3 too (JPM, GS, MS), while a company selling bonds files a handful in any two months (AT&T at most 10 since 1994). `fn SEC` and the Recent SEC Filings of `ticker` leave them out the same way and say how many (`164 pricing supplements hidden, --all to show`); `--all` lists them, and `fn SEC --form 8-K` keeps one form and its amendments from every filing listed, as `filings --form` does. A bank or an asset manager also files a 13D or 13G for each company it holds a large stake in, and EDGAR lists those under its own name too (197 of JPM's last 199 schedules are about other companies). The Recent SEC Filings of `ticker` are the company's own, so they leave out a 13D or 13G that does not carry the company's own 005- SEC file number, which only a schedule about the company does, and count them in the same note (`1,113 pricing supplements and 23 ownership reports about other companies hidden, --all to show` for JPM); a filing listed without its file number stays. The SEC pane and `fn SEC` still list every one. Each row says what the filing reports rather than repeating the form's name: an 8-K's items in words (`Results of operations`, `Officer or director change`, with exhibits left out when anything else is reported), a 10-K or 10-Q's period end when its document name carries one, and for the insider forms on screen who traded and how, read from the form itself (`Newstead Jennifer: SELL 2.4k Common Stock @ $332.01`, `John Ternus: proposed sale of 25.4k shares ($8.48M)`). Rows further down are read as they scroll into view; until then they show the form's meaning. The form is coloured by what it can mean for the company: a bankruptcy, delisting notice, non-reliance on past financials or a late-filing notice red; an officer, auditor or control change, an impairment, a planned insider sale (144) or an activist stake (13D) amber; an insider's open-market sale red and purchase green; periodic reports and earnings releases in the accent; routine notices quiet. The form text never changes, so nothing depends on the colour. The colour is a reading of the form and its items, not of the filing's content. The 8-K feed groups model-read headlines and points separately from unread filings. Those summaries are a model's reading of the linked filing, and names are checked against its text; an unread filing is not evidence that no material event occurred. The feed is bounded by the loaded source response. Its Open action always belongs to the selected company's filing. The existing `r` shortcut refreshes 8-K discovery and SEC filing lists. Same-company transient failures retain usable research with the failure in the existing footer. Changing or clearing the company removes the previous company's content and source action. SEC document-index failures remain distinct from successful empty indexes. Refresh retries failed or unreadable selected content and failed/empty document indexes, while successful as-filed content stays cached. Pending SEC requests are joined; refresh after completion makes a new discovery request. The 8-K feed has no independent structured headless report; SEC's existing report exports filing records, not a full document archive or reconciled amendment model. `ETF` opens on the fund's facts as its sponsor publishes them: the expense ratio (net or gross of waivers, as the sponsor states it) or a trust's sponsor fee, NAV, premium or discount, net assets, sponsor, inception and benchmark, each figure with its date beside it and the sponsor named as the source in the footer (`o` opens the sponsor's page). A premium computed from the official close against the NAV of the same session is marked `close` and credited to Gloom Cloud in `fn ETF`; until that session's close is known there is no premium rather than an older one. Vanguard's net assets are its last month end's and read `month-end`. A figure older than the NAV beside it is drawn in the warning colour, and once the newest NAV is more than five days old every dated figure is, with a line saying since when. Facts cover iShares, State Street SPDR, Vanguard and Schwab ETFs and the SPDR gold trusts (about 820 funds). The gold and silver trusts (`GLD`, `GLDM`, `IAU`, `IAUM`, `SLV`) add the metal held in trust after net assets: tonnes and troy ounces as the sponsor's daily holdings state them, dated, and the change on the day before (`Day change`); SPDR's archive gives GLD and GLDM every day since launch, while iShares publishes the newest day only, so IAU, IAUM and SLV show a change from their second stored day (October 2026); any other fund says why it has none (a trust or pool that files as a company, or a sponsor not collected yet) and points to `fn SEC `. The facts load apart from the filings, so a filings failure or sign-in wall leaves them on screen. `fn ETF` prints the facts as a section of their own, each value with its date and publisher, before the filings; `--json` keeps each raw number with its unit. DES shows the same NAV, premium, net assets, fee and inception for a US-listed fund under Fund Facts, each dated and marked as ETF marks them (a narrow column drops the year), each opening ETF. Below the facts, `ETF` is the SEC filings list kept to registered fund forms: registration statements (N-1A, N-2) and their post-effective amendments (485APOS, 485BPOS, 485BXT), prospectus supplements (497, 497J, 497K), shareholder reports (N-CSR, N-CSRS, N-30D), the annual census (N-CEN), monthly portfolio reports (NPORT-P, NPORT-EX) and 24F-2NT notices, with their /A amendments. These are the filings, not holdings data. The filer is the registrant SEC maps the ticker to, so a trust that registers many funds lists every fund's filings, and a ticker SEC does not map to a filer has none. The filter runs over the issuer's 20,000 most recent filings; when an issuer has that many, a footer warning says older fund filings were not searched. Its Form filter narrows the list to shareholder reports, holdings (N-PORT), prospectus and registration filings, or flows and census (24F-2NT, N-CEN). A 24F-2NT row reads the fund's fiscal year from the notice: what it sold and redeemed and the difference, the year's net flow, green when shares were created on balance and red when they were redeemed. ## Fund profiles and ticker reports Daily mutual-fund prices show NAV with its source date and the change from the previous NAV. A NAV remains current until the next session's NAV has had time to publish, allowing 12 hours after that session's published close and respecting holidays and early closes. Overview, ticker reports and AI context identify the security using its reported quote type, then retained quote metadata, then the saved asset category. Blank type fields do not stop that fallback. A broker's generic `STK` category remains part of the stored holding; it does not replace an explicit provider `ETF` classification in the research view. This classification does not establish domicile, fees, fund base currency, hedge policy, distribution policy or total return. A missing current quote does not discard independently available profile details, reported fundamentals or supported dated return summaries from `gloom ticker`. Text retains the quote-unavailable status; structured output has a null quote, a warning and any separately available quote metadata with its source information. Unknown and nonfinite values are not supplied zero, and cached undated return fields alone do not establish usable research coverage. Ticker text uses the same source-qualified market capitalization as Overview and AI context. It keeps the reported value and currency, followed by the figure in the preferred base currency when an exchange rate is available (a capitalization in pence, agorot or cents converts as that hundredth of its currency), and a line under the section names the rate as markets quote the pair (`USD/JPY 149.25`, not `JPY/USD`) and its time. Each rate is stated once, under the first section that used it; a position whose cost was entered with its own rate (`--cost-fx`, `--date`) states that rate on its Cost Basis line, and the rate line excepts it. With a base currency other than USD every amount in the report carries its currency code (`259.36 USD`), since a bare `$` is also the Canadian, Australian and other dollars. Missing capitalization currency is not supplied from the listing. A fundamental snapshot retains its retrieval/stale provenance, separate from the unavailable valuation date. Ticker text and JSON select their latest annual and quarterly rows by the reported calendar period, independently of provider ordering. Latest metric snapshots follow the same rule. Unusable period strings do not become dates; a known zero or partial latest row does not borrow an older value. Equal periods retain the source's last supplied entry, without reconciling amendments or treating publication dates as period ends. Selecting the CLI report does not reorder or rewrite supplied statement rows or change their counts. Analyst price targets retain their declared denomination. A missing denomination is shown as `(ccy?)`, with a null currency in the headless report; the app does not infer USD, convert targets into the account currency, or infer a share-class ratio. Explicit minor currency codes are scaled once for display. The upside calculation compares the average and reference supplied in the same target response; its retrieval time is not an independent target publication date. The analyst recommendation summary selects an explicitly current-month row when provided, otherwise preserving the source's first row and period label. A complete analyst count requires all five reported nonnegative integer buckets. Missing categories and unavailable totals remain unknown, while reported zero counts remain zero. The combined sell count requires both sell buckets. Relative periods remain relative; the app does not invent a dated consensus snapshot. Only a mix taken from an older period is labelled with that period. The pane shows the mix as a Buy/Hold/Sell figure with a split bar, strong buys and strong sells folded into Buy and Sell, and only when every bucket is known. The reported target range, rating, upside reference price, and retrieval age are pane status rather than body content. Headless analyst research resolves the same remembered venue as ticker-bound research before loading a symbol. The analyst target chart is rebuilt from the dated targets in the ratings history, never from a provider consensus for a past day, which no source serves. On each day a firm publishes, it plots the mean of every covered firm's most recent target; a firm leaves that mean once its target is more than a year old, and the undated prior attached to a rating is never plotted. Only the most recent two years of those days are drawn, and a firm's first entry on a day stands for that day. A source that never dated a firm's target cannot put that firm in the mean, so the chart is labelled with the firms it covers and usually ends away from the reported average. Its legend names the line and leaves its level to the axis, so the reported consensus is the one target figure on screen. Fewer than three covered firms, or fewer than three plottable days, leaves the chart out rather than drawing a consensus out of one or two desks. The backend feed keeps an explicitly dated but unavailable metric in its reporting period. A null, omitted, or nonfinite value does not promote an older observation to the latest period, and does not become zero. Malformed or impossible calendar dates are excluded from dated backend statements and latest-metric selection. Annual summary values and margins use one latest annual reporting row, including when an individual metric wholly omits that period. Older values remain in their dated history. Trailing provider measures retain their own source observations; this does not establish common publication dates or a complete current filing. ## Financial growth display Financial tables abbreviate large growth percentages (for example, `+163k%`) so the sign and percent unit fit beside the reported value. Extreme finite values that cannot fit use an explicit bound; an unrepresentable growth rate is unavailable. Structured JSON retains finite numeric growth; formatted text and CSV use the compact display. ## Executive compensation `EXEC` reads compensation from covered annual DEF 14A proxy statements. The year selector identifies the proxy filing year; the statement separately identifies the fiscal year of compensation. Stock and option awards use the filing’s grant-date valuation, which is not the amount eventually realized. Open the source filing through the existing footer action (`o`). No covered proxy means this view has no compensation data for that company; it does not establish that the company pays no executives. Every plan sees each named executive's total pay from the latest proxy. Gloom Cloud Pro adds the breakdown (salary, bonus, stock and option awards, non-equity incentive, pension and other pay), the CEO's pay mix and change from the year before, the pay ratio, say-on-pay support, the filing's key figures and highlights, and earlier proxies. Refresh (`r`) reloads the covered years and selected statement. A temporary failure retains available data; the footer warning gives the failed request and original retrieval time. Missing or denied statements are cleared. A successful refresh removes the warning without changing the filing’s reported dates. 13F research rechecks stale source responses when opened. If both hosted and public reads fail, retained cached rows carry the original retrieval time in the existing warning disclosure; filing and reporting dates are unchanged. A failed refresh is retried on reopening, even inside the normal cache lifetime. Filing reports preserve these warnings in their structured output. ### OMON expiry analytics HV30 in OMON requests a separate daily one-year history buffer from the shared coordinator and rejects detectable weekly or intraday cadence. It does not annualize the generic financial snapshot, which can contain weekly bars. The options monitor reuses its selected cached chain and OVDV cleaning, Treasury interpolation, put-call parity and smile fitting. The straddle move is the nearest clean call-plus-put midpoint at the same strike within 5% of spot, shown in quote currency and as a percentage of the underlying mark. It is a premium measure, not a probability interval. The separate one-sigma move is spot times fitted ATM IV times the square root of time to expiry. A rates or parity failure can leave the quoted straddle available while model-based metrics remain unavailable. The 25-delta P-C skew is put IV minus call IV, displayed in volatility percentage points. Term slope compares the fitted IV at the forward (ATMF) of the selected expiry and of the immediately later listed expiry, as OVDV's slope does, so a print against a closed session's chain does not tilt it. When the later expiry is less than 30 calendar days away, it shows the raw IV difference in volatility points with both expiry dates. At 30 days or more, it divides that difference by the year fraction between the expiries and displays percentage points per year with the destination date. A missing or stale adjacent chain leaves a gap; the monitor never substitutes a farther tenor. Selected-chain, adjacent-chain, spot and rate observation dates remain in the model; source-date differences and cleaning limitations appear through the pane warning disclosure. In the regular session, streamed trades move Last and volume, and each applied quote batch re-solves IV and the Greeks from the live midpoint and the live underlying. The summary strip, expected move, 25-delta skew and term slope follow the stream at most once a second, refitting only the selected smile, and stay dated by the chain snapshot they rest on. A real-time chain on screen reloads its snapshot every 15 seconds in session, past the local chain cache; the previous analytics stay until the new ones are ready. Outside the session the calculation changes only when a new chain response is accepted. Failed, stale, undated, removed or mismatched expiry snapshots cannot provide current enrichment. There is no historical IV rank or percentile. The OMON surface shortcut and OVDV chain shortcut preserve ticker scope and selected expiry. A selected listed expiry is pinned in addition to OVDV's representative geometric sample, so daily listings omitted from the default sample still open at the requested date. Removed catalogue dates remain unavailable. ### OMON strike window and carry **Strikes** picks which strikes of the selected expiry the chain lists. `All` (the default, and what a layout saved before the setting shows) lists every strike. A count, such as `±10`, keeps the strike nearest the money and that many on each side; the money is the held contract's strike on an option ticker, else the underlying's price. A delta band, such as `.70-.90`, keeps each strike whose call or put has an absolute delta in the band, so it lists in-the-money calls below spot and in-the-money puts above it; a delta that prints as the band's edge (`.700`) is in it. The held contract's strike is always kept. The window is read when a chain snapshot arrives, from that snapshot's quotes and the underlying's price at that moment, so streamed quotes never move strikes in or out under the cursor; the next snapshot (every 15 seconds for a real-time chain in session) reads it again. A delta band needs a current underlying quote and a count needs a price: without one the chain lists every strike and the footer says why. The chip in the bar shows a reset while a window narrows the chain. **Spread %** is the bid/ask width over the midpoint, `(ask - bid) / ((bid + ask) / 2)`, for a two-sided quote; a zero bid, a missing ask or a crossed quote has none. **Extrinsic per year** (`EXT/Y`) is what holding the contract costs in time value, against holding the underlying: - intrinsic is `max(0, spot - strike)` for a call and `max(0, strike - spot)` for a put; - extrinsic is the midpoint of a two-sided quote less intrinsic, per share; - extrinsic per year is extrinsic divided by spot, divided by the years to expiry: calendar days to the 16:00 New York close on the expiry date over 365, from the instant the Greeks are valued at. A midpoint below intrinsic, which a wide deep in-the-money quote can have, gives a negative figure rather than zero. Without a two-sided quote or a current underlying price there is no figure, and under a day from expiry there is no yearly figure: cents of time value over hours annualise to noise. `gloom options --leaps` ranks by the same figure, computed by the same code, as do its spread % and delta. **Carry net of financing** (`gloom options --leaps --columns carry-net`, `Net/yr`) is extrinsic per year once the interest and dividends that holding the option instead of the stock moves are counted: - for a call, `(extrinsic - strike x rate x years + spot x dividend yield x years) / spot / years`; - for a put, `(extrinsic + strike x rate x years - spot x dividend yield x years) / spot / years`. A call bought instead of the stock leaves the strike in cash, earning the rate, and forgoes the dividends, so the interest comes off and the dividends go back on. A put's midpoint already holds both the other way round (put-call parity), so for a put the signs turn. By parity, either figure is close to what the opposite contract at the same strike costs per year: the price of the optionality alone. The rate is the 4% every option valuation in the app assumes, the dividend yield is the underlying's, the one its IV and delta are valued at, and years are those of extrinsic per year; interest and dividends are simple, not compounded. When the underlying's dividend yield is unknown (its financials could not be read), carry-net counts no dividends, as delta does, and a warning says so; a stock that pays none has a yield of 0 and no warning. The other figures `--columns` adds read from the same sources as the panes: - **IV** is the contract's implied volatility, solved from its midpoint by the options pane's solver; it is the volatility its delta is valued at. - **IVR** is the underlying's IV rank: its 30-day IV at the latest stored close against the 52 weeks before it, 0 to 100, as OMON and OVDV show it ([implied volatility history](#implied-volatility-history)). One request covers every symbol. A listing outside the US has none. - **Cost** is cash per contract at the midpoint, `(bid + ask) / 2 x 100`, in the contract's currency: the midpoint extrinsic and carry-net are read from. - **Breakeven** (`B/E`) is the underlying's price at expiry that pays that midpoint back, strike plus it for a call and strike less it for a put; `B/E%` is its distance from spot. - **Next earnings** is the underlying's next report date, and **ex-dividend** its latest ex-dividend date (the coming one once it is announced, else the last), both as DES shows them, from the same read of its financials that gives the dividend yield. A fund has no report date and a stock that pays no dividend no ex-date, so neither is missed; otherwise a figure a symbol lacks is a blank cell and one warning line for the symbol. **Cost % of spot** (`P COST%`, put side only) is what a protective put costs against the stock it covers: the put's midpoint over the underlying's current price, `((bid + ask) / 2) / spot`, to three significant digits. The January 2027 SPY 700 put at 5.48/5.51 against 778.57 is 5.495 / 778.57 = 0.706%. A put without a two-sided quote, or a chain without a current underlying price, shows a dash; under 0.001% the column reads `<0.001%`. It is per share, so it is also the premium per contract over the notional one contract covers. [Options scenario analysis](#options-scenario-analysis) turns it into a budget: how many contracts a share of NAV buys. ### VIX curve and cross-asset volatility board `VIX` combines three views: a dated cash-index tenor curve, VIX and VIX 3M history with their ratio, and the cross-asset board. `VOLS` opens the board directly. The views persist independently per pane. These are published index levels and daily closes; the cash-tenor curve is not a VIX futures curve. The history router supplies the cash curve at 9, 30, 93, 184 and 366 calendar days, following [CBOE's constant-maturity definitions](https://cdn-api.cboe.com/api/global/us_indices/governance/Volatility_Index_Methodology_Selected_SPX_Target_Expected_Volatility_Term_Indices.pdf). Histories are requested at daily resolution with bounded concurrency and shared coordinator caching. Source clocks are normalized to their UTC observation date, duplicate dates retain the last correction, and invalid dates or nonpositive levels are excluded. The latest common VIX/3M date anchors the curve. Other tenors must have an observation on that date; missing nodes remain gaps. An old single-observation 1Y index cannot pull the entire curve back in time. If the primary market history is unavailable, the existing aligned two-node FRED curve can appear as an explicitly named fallback. FRED and market-history nodes are never spliced into a single curve. Contango/backwardation describes the 3M index level relative to the 30-day index at the same observation date, not futures roll yield. The pane, `fn VIX` and the glossary name the state with one word, Contango, Backwardation or Flat, and leave it blank when either close is missing. The spread is in index points and the ratio is 3M divided by 30D. The History view, `fn VIX` and the `volatility:vix-term-ratio` catalog series (`fn G CAP:volatility:vix-term-ratio`) read the ratio from the board's own Cboe daily closes of VIX and VIX 3M, with a streamed level for today when the pane has one, so they end on the curve's date. FRED's VIXCLS and VXVCLS republish the same closes a day later; they fill the dates the Cboe history lacks, such as before its one year, and stand in for it when it is unavailable, which the catalog series notes. With neither publisher's pair the series reports an error rather than an empty chart. Each date takes both closes from one publisher, so a ratio never divides one publisher's close by another's, and reports name the publisher of the latest ratio. Dates without a value, such as exchange holidays, stay gaps. Ratio history uses matching dates with no forward fill. Metadata publication dates do not replace observation dates. The board displays each index's own latest level and observation date. The S&P 500 implied correlation rows (COR1M, COR3M) use CBOE's published daily closes through Cloud, because the fallback quote route returns a single print; they measure index option IV against its top 50 constituents, not a volatility level. An isolated feed observation is not labelled a daily close; its source timestamp appears when selected. Daily change requires two consecutive available daily observations; one-row histories have no change. A one-year percentile requires at least 200 positive observations spanning at least 300 calendar days within the trailing calendar year. Empirical ranks use midpoint treatment of ties. Thin coverage retains the observed level while leaving the percentile unavailable. Different volatility indices have different definitions and underlying assets; their levels are not interchangeable. The selected history and source details remain available alongside the table. While visible, the curve and the board stream their index levels, and the History view streams VIX and VIX 3M. A streamed level becomes that index's observation for today, so the level, the change against the previous close, the curve ratio and the one-year percentile follow it, rebuilt at most once a second and labelled intraday with its time. Cboe settles a day's levels at 16:15 New York, 15 minutes after the equity close (13:15 after an early close), because SPX options trade until then; only from that time does the footer call the day's level a close, with its date. Before it, a daily bar of the session still trading, such as one read with streaming off, is labelled today so far. Indices that do not stream are re-read every 15 seconds in the regular session. The correlation rows keep their published daily closes. Daily histories are available for VIX9D, VIX, VIX3M, VIX6M, VVIX, SKEW, MOVE, VXN, OVX and GVZ. Exact daily-resolution routes return no data for VIX1Y, VXEEM, VXEWZ and the Apple, Amazon, Google, Goldman Sachs and IBM indices; RVX and EVZ have no route. With the backend fallback available, VIX1Y, VXEEM, VXEWZ and the five single-name indices resolve to isolated intraday observations, while RVX and EVZ remain unavailable. These sparse values cannot establish daily changes or annual percentiles and do not fill the prior-day cash curve. FRED still publishes VXNCLS, RVXCLS, OVXCLS, GVZCLS, VXDCLS, VXEEMCLS, VXEWZCLS and all five single-name series, but the Cloud FRED allowlist supports only VIXCLS and VXVCLS. These are app-route coverage gaps, not discontinued publications. EVZ is the exception: Cboe stopped publishing it after March 11, 2025, where both its Cboe history and FRED EVZCLS end, so it is no longer on the board. MOVE's provider name metadata is inconsistent with its symbol and is flagged. There is no VX futures alias, monthly contract catalogue or valid VX=F route. The pane does not substitute a cash-index curve or fabricate missing histories. ### Implied volatility history `HIVG ` charts 30 and 90 calendar-day and one-year (IV1Y, 365 days) ATM implied volatility against close-to-close realized volatility (20 or 30 sessions), with the IV minus HV spread in a lower panel. `VCA [tickers]` ranks a list from rich to cheap. Both read the stored daily history behind `/cloud/iv`, which covers US option underlyings from February 2024. Two methods produce the stored readings, and a statistic never mixes them: | Method | Source | Timing | | --- | --- | --- | | Trade close | Daily option trade closes for listed weekly, monthly and long-dated (LEAPS) contracts, with raw stock closes | Every completed session since 2024-02, caught up each evening | | Quote mid | The OVDV pipeline on the chain's quotes: quote cleaning, parity forward, IV solve, SVI fit. Taken once a session and not updated afterwards | 15:40 to 15:58 New York on full trading days | The trade-close forward is the median put-call parity forward over the three strikes nearest spot where both sides traded. IV is solved on the out-of-the-money side and interpolated to the forward in log-moneyness. Constant maturities interpolate total variance between listed expiries and never extrapolate. A session where no call and put at the same strike both traded is a gap. IV1Y interpolates between the expiries either side of one year, read from monthlies 4 to 15 months out and the January, June and December LEAPS, on the coarser strikes long-dated series list. Long-dated contracts trade far less, so IV1Y has more gaps, is noisier (a last trade can be hours older than the stock close), and starts per symbol at its first session with that pair (February 2024 at the earliest), often later than IV30; HIVG says when it starts and how many sessions it has. SPY's 2025 trade-close IV30 correlated 0.990 with VIX and averaged 15.7% against VIX 19.0%; VIX includes skew, so a lower ATM reading is expected. The statistics table ranks each measure's latest value against the prior 52 weeks of the same measure: 52-week low and high, rank `(value - low) / (high - low)` and midrank percentile. Rank and percentile need 120 prior sessions, or 60 for IV1Y (about one session in four of the year, so sparse names still rank once they have a year of history; below that the rank stays empty). IV rank and percentile use trade-close readings only. A newer quote reading appears on its own unranked row, so a method change cannot move the rank. A quote reading is a stored capture, so the panes call it a quote with its session date, never live; the trade close for a session lands after 18:00 New York, so until then the newest quote can be a session ahead of the close the ranks rest on. HV is the shared close-to-close estimator on adjusted daily closes; IV minus HV pairs each trade-close IV30 with HV on the same session. The 30d/90d ratio above 1 is an inverted term structure. `gloom fn HIVG SPY --lookback ALL --csv` prints the daily history one session per row. After `IV-HV` come `skew25d put-call (pts)` and `rr25d call-put (pts)`: that session's 30-day 25-delta put IV minus its 25-delta call IV, from the session's quote capture, and the same difference the other way round, the risk reversal as OVDV signs it, both in vol points. They are blank before the first quote capture, and the report's notes say when skew starts (`skew from 2026-09-23`). CSV and JSON always carry both columns, so a script's header never moves; the text table leaves them out when no session has a skew. A server that sends no wing IVs leaves them blank, and the notes say skew is unavailable from that server. `--event fomc|cpi|jobs --offset ` reads the history around macro releases, from the release calendar MDAY uses: one row per release, with the release, its date, the offset, the session read and that session's IV, HV and skew. `gloom fn HIVG SPY --event fomc --offset -6 --lookback ALL --csv` is IV six sessions before each FOMC decision. Offset 0 is the first session on or after the release day (the release day itself for CPI, payrolls and FOMC, which come out on sessions), `-1` the session before it and `1` the session after. Only closed sessions with a closing reading count: today's session before the close, or one the IV history has not reached yet, is never read. The next scheduled FOMC decision (from the meetings WIRP prices) and CPI release (from the BLS release calendar) are listed too once their session at the offset has closed and been read, so `--offset -6` has the week before the next FOMC as soon as that session's reading is in; payrolls have no schedule here, and the notes say so. A release whose session at that offset has no closing reading yet is left out and named in the notes. Releases before the rows start are counted there: outside the lookback (`--lookback ALL` adds them), or, with the whole history read, before the IV history starts, with its first session. `--offset` needs `--event`, and neither option changes the pane, so `shot` refuses them. `VCA` shows each symbol's latest IV30 with its session and method, IV rank and percentile of the latest close, the latest IV1Y and its percentile (IVP1Y, ranked on the same close as IVP; empty when the 1Y series has no reading on that close or there is no IV1Y beside it), the 30d minus 90d slope, 25-delta put minus call skew from the latest quote capture, HV20 and IV/HV. The skew is the 25-delta put IV minus the 25-delta call IV at a 30-day constant maturity, in vol points, so a positive figure means puts are richer; the 30-90 slope is IV30 minus IV90, also in points. VIX is not on the board but often sits beside it: it is Cboe's 30-day S&P 500 implied volatility from the whole SPX strike strip, skew included, so it usually reads above an at-the-money IV30 such as SPY's. The pane, its shot and the report's notes carry both definitions in one line each. The two readings are dated apart: IV30, the slope, skew and IV/HV carry the date and method of the latest reading (`2026-10-09 quote`), and IVR, IVP and the verdict carry the trade close they are ranked on (`vs 52 weeks to 2026-10-08 close`), so a rank is reproduced from that close, not from the quote beside it. A date every row shares is stated once, in the pane footer and the report title; rows that differ get an As of column, a Rank as of column or a Skew as of column. The report's own as-of line is the newest reading date, not the day the report was fetched. Rich means an IV percentile of 80 or more against the symbol's own year; cheap means 20 or less. This is relative to the symbol's own history, not a fair-value model. The universe is a preset (index and sector ETFs, US mega caps), a linked watchlist or portfolio, or custom symbols, up to 60. Non-US listings are left out rather than queued. About 110 liquid ETFs and stocks are covered from the start. Any other US underlying is queued on its first request and backfills within minutes: about three for half of them, under ten for nine in ten. Backfills pause from 15:30 to 15:58 New York while the day's quotes are captured. HIVG and VCA say for each symbol whether it is queued (since when), backfilling (through which session) or has no options history. A queued symbol says when to look again, ten minutes after it was queued; one with no options history is final, so VCA does not count it as missing. Accounts without realtime entitlement see a quote reading fifteen minutes after capture. Known limits: last trades are not synchronous with the stock close, contracts adjusted for corporate actions are not addressed, 25-delta skew starts with the first quote capture, and IV1Y depends on long-dated trades (see above). ### 13F ticker comparisons and crowding Ticker Research's 13F tab compares current holders and prior-quarter exits. Holder/new/exit counts cover the source indexes; the USD total covers loaded fund pages and grows as the list scrolls. Fund weight is share of reported 13F value. Equity, puts and calls remain separate, and incomplete reports leave changes unknown. A fund with no prior-quarter 13F-HR, such as a first-time filer or one whose manager filed a 13F-NT, also leaves its changes unknown without a warning; a warning names the fund when its report is incomplete or when SEC data shows a filing the provider lacks. On September 22, 2026, the upstream `/holders` index returned HTTP 400 for current periods and its official example; the tab reports that source failure until the provider restores the index. Crowding uses the latest broadly available quarter and the top 25 funds ranked by forms13f.com estimated performance. It is a sample, not the whole market. New and exit counts count distinct funds; DELTA PP sums changes in reported fund weight in percentage points, and COMP counts funds with a valid weight comparison. Options use underlying notional and remain separate from shares. Complete aggregates cache for 24 hours and partial results for five minutes. Mine marks and filters existing portfolio or watchlist tickers without changing the source sample or aggregate denominators. The Performance list shows the provider's estimated quarterly return and the prior three quarters when that fund appeared among each quarter's top 100. Missing ranks and failed or mismatched periods stay blank. This is a survivor-biased ranking history, not a verified fund track record; the provider's opaque `pnl` estimate is not realized fund performance. Fund Overlap matches current disclosed positions by CUSIP, option side and share type, then shows each fund's reported weight. It uses the latest quarter end both funds reported among their two most recent reports, so a fund that has not filed the newest quarter yet is compared one quarter back and each fund's newer quarter is shown beside it. A previous report that failed to load is not used. Overlap excludes exits, preserves unknown weights for incomplete reports, and does not combine puts or calls with equity. It is overlap of public 13F disclosures, not the managers' complete portfolios. Against an ETF (`fn 13F --compare SPY`), the manager's weights are its latest 13F share positions, each line's reported value over their total, with options and principal amounts left out; two lines with one ticker are one name. The ETF's weights are its holdings file as MEMB serves it, renormalized over every line, cash and lines without a ticker included. Names match by ticker, with `.`, `/` and `-` read alike (`BRK.B` is `BRK-B`); a 13F line whose CUSIP has no ticker cannot match and counts as not held. Overlap is the sum over names of the smaller of the two weights. Active share is half the sum of absolute weight differences over every name either holds; with both books summing to one it is one minus the overlap. The 13F is a quarter-end snapshot filed up to 45 days later, while the holdings file is recent, so the comparison spans both dates, and the report gives each. ## Daily short volume (SIV) `SIV AAPL` opens daily FINRA short-sale volume; the existing `SI` pane also has a lazy Daily volume tab beside twice-monthly outstanding short interest. NMS covers consolidated off-exchange regular-hours activity reported to FINRA. OTC Reporting Facility data is a separate scope selected in settings. Neither is total-market volume, and daily short volume cannot be summed into outstanding short interest or days to cover. A high ratio does not establish bearish intent or new short positions. The ratio is 100 times ShortVolume divided by the same file's TotalVolume. ShortExemptVolume is already included in ShortVolume. CNMS already consolidates its facilities, so constituent files are never added again. Exchange volumes and ORF are never added to the denominator. Modern FINRA quantities contain up to six fractional decimal places; Cloud stores exact numeric quantities and sends decimal strings. The table abbreviates quantities, while row detail and structured output retain exact shares. The backend discovers published file links from FINRA monthly indexes, including corrected URLs, before ingestion. Files generally publish by 18:00 Eastern on the trade date; later corrections are possible. Source dates and retrieved times remain distinct. A corrected file atomically replaces its dated scope, including withdrawn rows. A missing file, unreported symbol or zero denominator stays an explicit gap. Daily changes require adjacent published files and discovery of every intervening month. Percentiles use midrank ties and at least 20 finite daily ratios within the latest discovered source date's one-year window. Actual sample count and first/last dates are shown. Incomplete discovery or short symbol history is labelled sample rather than a full one-year rank. Opening the pane reads Cloud aggregation tables and does not fan out to FINRA. Migration 088 and catchup ingestion must be available; otherwise the pane shows a recoverable unavailable state. Refresh failures retain dated observations with a warning. Source symbols preserve case and punctuation. Class shares and warrants spelled with a dot or dash (HEI-A, GEF.B, BRK.B) map to FINRA's slash form (HEI/A). Preferred shares such as ABRpD require their exact FINRA symbol in settings or `gloom fn SIV AAPL --finra-symbol ABRpD`. Preferred shares are never collapsed into common shares. `--scope otc` selects ORF. The report includes exact quantities, coverage, gaps, source URLs and dated percentile statistics. ## Congress summaries and filters Congress pane summaries count distinct loaded transactions, across each filing window and year the reader appends. The API, CLI, and chat aggregates cover all parsed trades in the requested filtered filing window, before its trade-row pagination. Counts and dollar ranges describe disclosures, not current holdings or trade execution sizes. An open-ended or unknown upper bound stays unknown. The amount filter uses the disclosed lower bound, so a range is included only when its minimum meets the threshold. A lag above 45 days is flagged from the transaction and filing dates; it is not a determination of a legal violation. Stock, option, and other categories use the disclosed asset code and description. **Mine** reads existing portfolio/watchlist membership; it does not add a holding. ### Congress returns and member context TX RET% and FILE RET% compare the first available daily close on or within seven days after the transaction or filing date with the latest completed daily close. Current-day prices enter after 5 p.m. New York time. These are hindsight stock-price changes, excluding dividends, fees, execution prices, and option-contract performance. Missing prices and non-stock disclosures stay unknown. The server caches ticker/date results for one hour and retries unavailable prices sooner. The Members median uses priced transaction-date stock returns across all sides. Buy hit rate uses priced buys with a positive return, with the priced trade and buy denominators available in detail and structured output. These are not realized returns or portfolio performance. Pane summaries use the loaded trades, including appended years; headless summaries retain the server's filtered filing-window scope. Party and current committee assignments come from the public unitedstates/congress-legislators YAML, cached server-side for 24 hours. Matching requires name, state/district and a House term covering the filing date. Party follows that term; committees are the current source snapshot. Ambiguous matches remain unknown. Senate reports come from the Senate eFD site, which serves US addresses only and is read through a US egress server. An eFD amendment restates its whole report, so the newest electronic amendment replaces the original; its rows keep the original filing date, which the 45-day late flag uses. Paper reports are scanned images: they are counted in the scan notice (`filingsPaper` in structured output) and not read. Senators are matched to the member directory by last name among sitting senators, with first names deciding shared last names; the directory supplies their state, party and committees. When the Senate source is unreachable, the merged feed serves House filings and reports `senateUnavailable`. ## Futures curves (CTM) `CTM CL`, `CTM ES`, `CTM ZN` and `CTM VX` open a focused curve for a FUT root or VIX; every root FUT lists has one, soybean meal (`CTM ZM`), live cattle, lean hogs, aluminum and lumber included. `CTM BTC`, `CTM ETH`, `CTM SOL` and `CTM XRP` open the CME crypto futures curves, which FUT does not list; the XRP and SOL strips are thinner and can show as partial. `CTM TTF` opens the Dutch TTF gas curve. The board's Equity Sectors group (CME's E-mini S&P Select Sector and Select Industry futures, the PHLX Semiconductor future and the Dow Jones U.S. Real Estate future) has curves too (`CTM XAE`, `CTM SXO`); most quote only their front quarterly month, which the curve says rather than drawing a spread. A typed root always means the future (`CTM ZM` is soybean meal, not Zoom). With no argument, CTM uses the active futures root when recognized, otherwise ES (`gloom fn CTM` has no active ticker, so it shows ES and says so). ZM, KE, LE, HE and ALI are also listed securities, so the ticker under the cursor opens their curve only as the futures symbol (`ZM=F`), never as the bare code; ZL, OJ and LBR have no listed security, so their bare code under the cursor opens them too. A root the table does not list is refused with roots that work. BTC, ETH and SOL are also US equity tickers, so the crypto curves follow the active ticker only as a crypto pair (`BTC-USD`) or a futures symbol (`BTC=F`), never as the bare symbol. The pane settings select another root. Gloom Cloud batches catalogue discovery, quotes and history in one endpoint; the app receives the complete curve from the backend. Curves use actual expiration dates, preserving quote units such as US cents (`USX`) for grains and some soft commodities. Equity index futures quote index points, Treasury futures quote percent of par, VX quotes volatility points, Dutch TTF gas quotes euros per MWh, live cattle, lean hogs and orange juice quote US cents per pound, aluminum quotes US dollars per metric ton and lumber US dollars per 1,000 board feet, with the unit in the chart caption, the pane footer and the report's contract terms. Provider currency remains separate in structured output. Contract rows expose dated prices, their change, volume and open interest; zero counts remain zero, missing counts remain unavailable. The change is LAST less the SETTLE beside it, so every row is measured from the same session. A contract with no trade since that settlement shows none, as does one without a settlement; the report names the untraded ones (`Change blank for ESU27, ESZ27 (no trade since 2026-10-22).`, `noTradeSince` on the row) and the pane counts them in a data warning. A VX price is the settlement itself, and changes from the settlement before it. The main curve and 1W/1M/1Y ghosts follow the same currently listed contracts. A historical ghost is not the strip that was front-month at that past date. Each curve and node retains its actual source date, and missing history stays a gap. Price and front-pair percentiles use the available matching daily observations within a one-year lookback, with the actual sample count and start/end dates shown. Newly listed contracts can have much shorter coverage; one observation is not displayed as a historical rank. Contango means the second expiry is priced above the first; backwardation means below. The spread is the next contract less the front one in the quote's units, labelled with the two contracts it subtracts (`GCF27-GCZ26`). The front is the first contract the market trades: a delivery-month contract holding under a tenth of the next contract's open interest is skipped, so the pair is not always the table's first two rows. Indicative annualized roll yield is `(M1 / M2 - 1) * 365 / daysBetweenExpiries * 100`. It requires positive prices and increasing expirations, and is curve carry rather than a realized strategy return. Missing front prices never cause the calculation to silently substitute later contracts. Stale observations are marked in the footer. The spread subtracts two last trades made within five minutes of each other, or else both contracts' settlements for one session, and says which. If either leg traded fewer than 20 lots in the session, the spread is thin: no contango or backwardation call and no rank. Contract months read with the full year, such as Oct 2026. The Curve tab of the CME crypto roots (BTC, ETH, SOL, XRP) adds the basis against the USD pair (BTC-USD and so on): - **Formula.** VS SPOT is `(Last / spot - 1) * 100` and ANN BASIS is `(Last / spot - 1) * 365 / days * 100`, simple actual/365. Last is the latest trade, not the settlement. - **Same minute.** Spot is the pair's one-minute bar in that trade's UTC minute. With no bar in that minute the cells are blank and the note gives the reason (`spot and print 12 min apart: print 03:52, nearest spot 03:40 UTC`). - **Days.** Fractional, from the trade to final settlement at 16:00 London on the last trading day. - **Under 7 days.** The annualised rate is noise there, so VS SPOT leads and ANN BASIS is greyed, with a note in the report and the pane's `!` popup. - **Exports.** `fn CTM BTC` rows add `spot`, `spotTime`, `daysToExpiry`, `vsSpotPct` and `annualisedBasisPct`; `--csv` adds Spot, Spot Time UTC and Days to Expiry. - **Glossary.** `catalog glossary CCC` explains the crypto composite price spot reads, which is not the CME reference rate. Quotes retain their feed delay and timestamps. Some roots have no provider catalogue. For those, Gloom Cloud checks 72 months of contract months and treats the listing as complete when the last 24 are empty; otherwise the warning gives the date after which contracts were not searched. The curve does not claim exhaustive exchange coverage. Some expired symbols are no longer available from the feed. Official Cboe monthly VX contract files provide daily settlements and open interest, generally published around 10am Central Time on the next trading day. They are neither cash VIX nor intraday futures quotes. Cboe settlement is used instead of Close, which can be zero in early file rows. A currently listed VIX contract generally has no one-year history; its missing comparison is left empty without a warning. An absent cloud endpoint or source failure shows an unavailable state; a failed refresh retains dated cached observations with a warning. CTM charts the contracts expiring within the pane's horizon setting (36 months by default; 12, 24 or every listed contract are available). A crude strip lists a decade of months, and drawn end to end the liquid front two years collapse into a sliver while contracts last quoted years ago shape the curve; the contract table always lists every contract. The legend and footer date the strip by its freshest quote and count the contracts whose quote is more than two weekday sessions old; the structured payload's `asOf` remains the oldest quote. CTM plots the latest strip with one-week and one-month ghosts using explicit theme colours. A one-year comparison remains available in the tenor cursor and shared table fallback with its source date, while it cannot compress the current chart axes. The contract table is capped at the space its rows need; the curve uses the remaining height. Every root lists its contracts in the same columns. SETTLE is the exchange settlement for the session its header dates (`SETTLE 10-09`), and LAST the latest trade with its time under AS OF UTC. A contract without a confirmed settlement for that session shows none rather than an older settlement or its last trade. The latest session's settlement takes the night to arrive: until the morning after, SETTLE shows the session before it. A VX price is Cboe's settlement already, so VX has no separate LAST column. Prices and changes read at the root's tick precision in the pane and in `fn CTM`. For the roots a hedge is usually sized in (metals, energy, grains, softs, equity indices, Treasuries, the main currencies, VX and CME bitcoin and ether), the header adds the contract size and the tick with what it is worth on one contract, the caption and footer name the price unit (`USD / troy oz`, `US cents / bushel`), and the Contracts tab adds each contract's first notice day where the exchange sets one. A contract past first notice, which a long can be assigned delivery on, is shown in the warning colour and named in a data warning. `fn CTM` adds the terms as a Contract terms section and `lastTrade`, `firstNotice`, `inDelivery`, `settlement` and `settlementDate` to each contract row; `quoteUnit` carries the unit. Margins are not shown. On a futures symbol (`GC=F`, a listed contract such as `GCZ26.CMX`, a generic such as `CL1`), `ticker`, `quote` and the ticker's Overview tab add a Settle line, the exchange settlement dated by its session (`Settle $4,216.30 (2026-10-09)`, or `--` while none is confirmed, never the last trade; a settlement older than the session the Change line beside it is measured from also reads `--`, with that session: `Settle -- (2026-10-21 not confirmed yet)`, because the night's settlement arrives the morning after), and a Contract section with the contract the symbol prices and the same terms in the same words. A line with nothing to say, such as a cash-settled root's first notice, is left out, and a short Overview keeps the contract, its size, tick and first notice before the rest. The JSON of `ticker`, and of each futures row of `quote`, adds `futuresContract`. A symbol Gloom Cloud has no terms for shows neither. An energy price reads with what it is per, as a cents price does (`314.95¢/lb`): `€90.30/MWh` for Dutch TTF gas, `$2.761/MMBtu` for natural gas, `$99.96/bbl` for crude, `$3.189/gal` for gasoline and heating oil; TTF, which the exchange sends no terms for, takes its unit (`EUR / MWh`) from the futures board into the Contract section too. A price per MWh adds an In USD line, its dollars per MMBtu at the day's rate, so European gas reads beside Henry Hub: `In USD ≈ $29.710/MMBtu at EUR/USD 1.1226` (1 MWh is 3.412 MMBtu). The `≈` and the rate mark it as a conversion, not a price anyone quoted; `usdPerMmbtu` carries it in JSON. A date in CTM's Date field (or `--date` headless) shows the curve as Gloom Cloud's daily settlement archive held it that day, with the curves a week and a month before it as ghosts; `c` returns to the live curve. These are the curves as they stood then, including contracts that have since expired, so a past front month is on the curve. A date without a session, such as a weekend or holiday, shows the session before it. A contract's archived settlement for that session shows under SETTLE. The archive reads each session the evening it closes and again the next morning, when the settlements are in, so until then the session's prices are its last trades: they show under LAST, and a data warning counts them. A month that did not trade that day keeps its last earlier price under LAST, dated and marked stale. Percentiles and session changes are not archived, so they show as unavailable. The archive began in September 2026 with the contracts listed then, so an earlier date lacks the months that had already expired, and the pane says so; VX settlements go back to 2013. ## Generic futures tickers (CL1, TY1, VX2) A generic ticker follows the nth listed contract of a root and rolls to the next one; it is a series, not a contract anyone can trade. `CL1` is the front WTI generic, `CL2` the second, `ES1`, `NG1`, `VX1` and so on for every root Gloom Cloud archives. Bloomberg codes that differ from the exchange's are accepted: TY, US, FV, TU and WN for Treasuries, CO for Brent, XB for RBOB, LC, LH and FC for livestock, SM, BO and KW for the soy complex and KC wheat, DM for the Dow, FF for fed funds and SFR for SOFR. Generics work wherever a ticker charts or quotes: G, GP and QQ. The roll rule decides when the generic moves on. By default it follows the root's standard roll, the same as its continuous alias (CL=F): one business day before first notice (grains, metals, Treasuries, ICE softs and live cattle) or before last trade (other roots), two for WTI crude and Henry Hub gas (their mini and micro contracts stop a day earlier, so the family rolls together), six for equity index, sector and currency futures (CME's quarterly roll), and after last trade for VX, so CL1 is the nearest contract until then. `OI` follows open interest instead: the session after the next month's open interest passes the current one's, the generic switches, and where open interest is not archived it compares volume. `F5` after the position rolls five business days before first notice (grains, metals, Treasuries, ICE softs and live cattle) or before last trade (cash-settled and other roots); `D15` rolls on that calendar day of the notice month, never later than the notice itself. First notice dates follow each exchange's rule, typed by hand. The adjustment decides what happens to earlier prices at each roll: unadjusted by default, `R` scales them by the ratio and `A` shifts them by the difference between the two contracts on their last common session, so the current contract always shows its own prices. `CL1F5R` is the front WTI generic rolled five days before last trade, ratio adjusted. The chart legend names the rule and adjustment, and the Roll and Adjust controls switch every generic on the chart. A generic quote is its current contract's quote under the generic's name ("WTI Crude Oil 1st generic, now Nov 2026"), without that contract's 52-week range. Intraday charts show the current contract. Daily history comes from Gloom Cloud's settlement archive, which began in September 2026 and holds only contracts listed since. A generic's history starts where the archive holds every contract ahead of it, so second and later generics begin in late September 2026 and grow each day. Before that, front generics continue through the front-month continuation, whose rolls follow the exchange listing rather than the chosen rule; the join counts as a roll for adjustment. VX generics go back to 2013 from Cboe's contract files. ## CFTC positioning (COT) `COT` opens an extremes board of the latest stored CFTC futures-only report, initially ranked by distance from the median one-year net position. The board scope defaults to the major markets (equity index, VIX, Treasury and rate futures, G10 currencies and the dollar index, bitcoin and ether, energy, metals, grains, softs and livestock, 46 verified codes) because ranking all 371 markets by extremeness puts ICE basis and Nodal power contracts ahead of everything a reader is looking for; switch the scope to all markets, or type a search, to reach any market. Search by market name or exact CFTC code and open a row for history. `COT 088691` or `COT GC` opens standard COMEX gold directly; `CFTC` is an alias. Verified root aliases cover ES, ZN, ZQ, CL, GC, SI, SR3 and VX/VIX, and CME crypto: BTC and MBT (bitcoin and micro bitcoin), ETH and MET (ether and micro ether), SOL and XRP. Every other FUT board root the CFTC reports opens by its code as an argument too (`COT NG`, `COT HO`, `COT ZM`, `COT XAE`), with its own future as the front price, except EMD, RX, XAY and HH, whose continuous symbols carry no five years of daily history and show positioning alone; Dutch TTF gas and aluminum are not in the CFTC report, and `COT TTF` says so. With no argument, such a root follows the active ticker only as its futures symbol (`NG=F`) or a code no listed security uses (`ZW`), because NG, ZM and PL are also equity tickers. Only bitcoin and ether chart a front price; the others show positioning alone. With no argument, COT follows the active ticker to a crypto market only as a pair (`BTC-USD`) or a futures symbol (`BTC=F`), because BTC, ETH and MET are also US equity tickers. A market that is neither a root nor a CFTC code is refused with roots and a code that work. `fn COT gold` titles the market with its report date and what one contract is, in the CFTC's own contract units (`GOLD · report date 2026-10-13 · 1 contract = 100 troy ounces`), and lists the weekly positions newest first; `--limit 8` (or `--tail 8`) keeps the newest eight weeks. The detail's footer names the same contract size. Codes preserve leading zeros, letters and a trailing plus used for consolidated markets. A consolidated index market does not borrow an individual contract's front-price mapping. Micros, standard contracts and similar products on different exchanges remain separate markets. Legacy reports classify noncommercial, commercial and nonreportable traders. Disaggregated reports cover physical commodities and classify producer/merchant, swap dealers, managed money, other reportables and nonreportable traders. Financial and VIX contracts use legacy data; noncommercial is not renamed managed money. The tabs select report family, and the class selector or detail table selects a trader class. Net positioning is long minus short; spreading is separately reported and is never added to either side. CFTC quantities aggregate all maturities, so neither positions nor open interest are front-month counts. One- and three-year percentiles compare a trader class with its own corrected stored history in the same report family. Missing or suppressed values remain null, never zero. Ranks require at least 20 usable observations for 1Y and 52 for 3Y. New markets with short coverage carry their actual sample count and partial-window status. A complete window starts within seven days of the requested lookback boundary. Weekly change requires the previous week's dated observation; a gap does not become a multiweek change labelled one week. Charts preserve missing weeks as gaps. All headline dates are the CFTC observation dates, usually Tuesday. Friday's scheduled release time is not an independently established publication timestamp, and download time is separate. The backend ingests current files and annual archives, with idempotent corrections and a catchup ledger. It requires migration 087 and populated history. Until the endpoint or table is present, the pane shows an unavailable state. Failed refreshes retain readable dated observations with a warning. Where an exact product mapping is verified, the detail chart adds continuous front-futures prices from the existing Gloom Cloud history endpoint above net positioning, with a separate price date. This is visual market context, not a backtest or an investable continuous return. Mappings cover the major markets except the dollar index, SOFR and VIX futures; the verified cloud SR3 continuous-price request returns no data. Those and other unmapped products show positioning without a price panel; cash VIX and the cash dollar index are not substituted. History can start after a product's inception and source coverage limits still apply. ## Time and sales (TAS, QR) `TAS AAPL` opens recent trade prints and `QR AAPL` uses the same pane for its NBBO tab. The tape covers US listings only; for a listing abroad, `QR` and `TAS` say where the finest bars are: `No second or tick bars; 1-minute bars: fn GIP RMS:ASX; trades exist for US listings only.` `fn TAS AAPL --from 10:30 --to 10:35` reads a window of the served session instead of the latest prints, to evidence a move mid-session: the times are New York's clock (`14:30Z` for UTC), the session is the latest regular session the tape serves, and its window runs from 04:00 to 20:00 New York time, or to the feed cutoff (now, or 15 minutes back without real-time access) while it trades. The report lists the window's trades and quotes oldest first, up to `--limit` (at most 1,000 trades and 500 quotes from the window's start; a note says when it held more, and through when the list runs), and its Window section sums up the prints in it. A bound outside the served window is refused with the window that is served, such as `--from 03:00:00 ET (07:00:00 UTC) is outside the window TAS serves: Fri 16 Oct 2026, 04:00:00 ET (08:00:00 UTC) to 20:00:00 ET (00:00:00 UTC).` Trades retain source nanosecond timestamps, exact trade IDs, exchange codes, tape and condition codes. Quotes retain separate bid/ask venues and source sizes in round lots, not shares. NBBO is best-quote history, not Level 2 depth. Locked, crossed and one-sided observations stay visible without forcing a positive spread or inferring an aggressor side. Conditions are raw consolidated-tape codes and can differ by tape. The pane loads its initial observations from Gloom Cloud and receives updates through the shared Cloud socket. Pro entitlement provides consolidated trades and quotes in real time; Gloom Cloud enforces a fifteen-minute cutoff for delayed access. An absent endpoint has a clean unavailable state. Failed refreshes and disconnects preserve dated observations with a warning; changing account/feed clears both live and paused copies. The observed buffer contains at most 1,000 trades and 500 quotes. Observed VWAP is sum(price times shares) divided by observed shares after corrections and cancellations. It is not full-session VWAP. Observed high/low and the last-price percentile use only retained prints; percentile needs at least 20 observations and uses midrank for ties. Date/window and source gaps remain explicit; evictions from the bounded buffer show as dropped counts, not warnings. Dash class-share spellings such as BRK-B load the BRK.B tape. Large-print highlighting means at least 10,000 shares; it does not claim institutional activity. Session high/low is separately calculated from completed regular-session minute bars, bounded to the same entitlement cutoff, with its own source timestamp. It can lag the live tape. Space pauses/resumes the display while the bounded subscription continues. Opening a row freezes its details; leaving that detail preserves the paused window until resumed. The structured report exposes observations, session range, capacity, dropped counts, corrections/cancels and source dates. `gloom fn TAS AAPL --limit 100 --json` returns the latest Cloud snapshot. Quote venue/condition dictionaries and Level 2 order-book depth are not inferred. `gloom shot TAS AAPL` and `shot QR AAPL` capture one dated tape bootstrap in the Bun process using the same session as the report. The desktop screenshot consumes that captured snapshot through its tape client without opening a browser-owned live socket. Source IDs, exact timestamps and access delays are unchanged; the footer marks the still image as a snapshot. ### Options scenario analysis OSA sums the existing European Black-Scholes-Merton value and Greeks for each signed option leg. All premiums are per underlying unit; position values and sensitivities multiply each leg by its signed contract count and user-specified contract multiplier. P&L is marked position value less nominal entry cash flow. Theta is currency per calendar day, vega per volatility percentage point, rho per rate percentage point, delta underlying units and gamma delta change per one-unit spot change. Entry financing, transaction costs, exercise, assignment and adjusted deliverables are not inferred. Shares held with the legs (`--shares`, or a collar's) are worth spot each, one share of delta each, and their P&L is spot less the price they were bought at: for typed legs the position's spot (a typed `--spot`, else the market's), for a seeded strategy the spot its quote mids imply (the market's when none is solved), with a typed spot a what-if from it; the dividends they collect are not counted. The scenario grid samples eleven spot levels and five evenly spaced dates from the valuation timestamp through the first option expiry. Dates use the shared 16:00 America/New_York expiry convention, including daylight saving, and retain fractional-day time value. The selected date is bounded to that interval. A parallel additive vol shift applies to every leg, with negative resulting volatility floored to zero and reported. The chart plots the selected-date P&L and the first-expiry P&L, including exact strike kinks in addition to the spot grid. Colors distinguish the selected date from expiry consistently. For different expiries, surviving legs retain their model time value at the first expiry; no path or historical settlement is invented for dates after it. For a common expiry, breakevens and maximum profit/loss are solved on the exact piecewise-linear terminal payoff for all nonnegative spot prices. The solver includes spot zero, every strike and the right-hand tail. Unbounded profit and loss are explicit; finite maximum loss is a nonnegative loss magnitude. Boundaries of a flat zero-P&L interval are included among breakevens. Different-expiry positions have no reported exact terminal maximum or breakevens, since their future settlement paths have not been specified. Already-expired legs require removing the leg or restoring an earlier valuation timestamp. Market inputs reuse the options coordinator used by OMON. The underlying quote must match the ticker/listing and be current; chain-expiry mismatches and stale inputs stay explicit. Treasury rates use the shared surface-tenor interpolation; the dividend yield is a current one fundamentals state for the ticker, which is 0% for a company whose quote affirms it pays no dividend, else, as the options chain reads it (see [Greeks spot and time](#greeks-spot-and-time)), 0% when the underlying's distribution history, current and covering dividends (ten years of them), shows none paid or declared in the last 15 months (a fund that pays none, such as GLD), which the report's Inputs section says beside the 0.00%. A dividend that has stopped by the issuer's own cadence ([dividends](#dividends-and-sectors)) is valued at 0% too, whether the fundamentals still state its forward yield or have withdrawn it, and the Inputs section says `0.00% (no current dividend, last paid 2026-02-27)` in the words the other panes use (WHR, whose 12.91% annualized a payment that did not recur); `gloom options` values its IV and delta at the same 0%. An unknown yield or other missing market assumption requires input rather than silently becoming zero. The chain builder copies a valid midpoint, falling back to the dated last trade when no midpoint exists; every premium and IV remains editable. Headless example strategies require valid two-sided quotes for every leg. Each leg enters at its quote midpoint and takes the IV that midpoint implies against that expiry's put-call parity forward, with the time left at the market timestamp the scenario values at. This holds when the chain also carries a provider IV, which may have been measured at a different time. The pane status and headless position say when the IV is from the quote mid. The forward comes from the chain's own quotes, so a spot that moved after they were taken does not skew the call against the put. The scenario's spot is the one that forward implies at the scenario's rate and dividend yield, so the position starts at zero P&L even when the last print has moved since the quotes, such as an after-hours print against the close's chain; the pane status and headless output show the last price beside it when the two differ. A carry the dividend yield does not capture, such as a high borrow cost, also moves this spot. An explicit spot is kept as a what-if. A leg whose midpoint cannot be solved, because the spot is too far from every parity forward (over 5% plus 100% a year of carry) or the midpoint is below intrinsic value, keeps a usable provider IV; without one it is ineligible, and the strategy is unavailable if no other strike qualifies. Fully specified typed positions are calculated without market fetches, and their screenshots preserve the same immutable inputs. A typed rate or dividend yield replaces the source's, so a source that had none is not reported as missing. The currency is the one typed with `--currency`, else the underlying quote's (from its quote, snapshot or contracts, stale or not), else USD for a US listing, a bare symbol included, since the option chains are US-listed; a listing abroad with nothing naming its currency reads `currency unknown`. Entry prices and spot are per share; value, P&L, maximum profit and loss, the scenario grid and the Greeks in currency are for the whole position, which the pane, the report and the shot label `per contract` for one contract and `for N contracts` otherwise (`metadata.units` in `--json`). The report, a capture and the pane date the figures as `quote` does: by the underlying's quote the position is valued at, with its delay and where its market stands (`Thu 15 Oct 2026 23:30 UTC · 15 min delayed · after hours`, or the close it is, `US trading day Fri 16 Oct 2026 close`); a position typed whole is the reader's own inputs, `not a live feed (scenario)`. The Payoff tab names the legs it values (`Long 1 SPY 695 put`; the legend below it dates the expiry they share, and legs on several expiries each carry theirs, `Long 1 SPY 770 call · 2027-01-15`) and says `valued after hours` (or `pre-market`, `overnight`) when the position is valued at an extended-session print of the market rather than a typed spot. The report's Inputs section shows the spot, rate and dividend yield the scenario was valued at. Historical IV and assignment outcomes are unavailable. Drafts use standard per-pane layout persistence. Named strategies use versioned local plugin state and restore independent copies, including original valuation timestamp, inputs and controls. Corrupt saved entries are skipped with a warning. These are analysis snapshots and do not create broker orders. #### Hedge budget With `--nav` and `--budget-bps` (or the pane's Hedge NAV and Hedge budget settings), OSA sizes the position as a hedge and reports it under **Hedge budget**, in the report and as a second row of figures in the pane, from the same function: - budget = NAV x budget bps / 10,000; 50 bps of 100m is 500,000; - the position is bought in whole sets of its smallest whole ratio (one put, a 1x1 spread, a 2x1 ratio), so it keeps its shape; a set costs its net debit, each leg's price times its signed contracts and multiplier; - the price is the entry price as entered, except for a leg a `--strategy` seed entered at its quote midpoint, which is bought at the ask and sold at the bid (the streamed quote while the pane follows the market), so the budget is never overspent at the midpoint; a seeded leg saved again from the leg editor is priced as typed; the report says which price it used and what one contract costs; - contracts = whole sets the budget buys (rounded down) times the protecting contracts in a set, the long puts, or the long calls when the position holds no long put; premium spent = sets x set cost, also as actual bps of NAV; - notional protected = protecting contracts x multiplier x spot, also as a percent of NAV, where spot is the underlying's last price when the scenario starts at a spot the option quotes imply, and the scenario's spot otherwise; - coverage = notional / `--sleeve` (the equity sleeve the hedge protects); without a sleeve the report says so rather than read against NAV. At 5.51 (the ask), one SPY 700 put costs 551.00; 500,000 buys 907 of them, spending 499,757 (49.98 bps), and covers 907 x 100 x 778.57 = 70.6m, 70.6% of a 100m NAV. Entered at the 5.495 midpoint it buys 909. Amounts take `100m`, `2.5bn`, `250k`, `1,000,000` or `$100m`. The sizing fails, saying why, when one input is missing or not a positive amount, when the position holds no long option or takes in a net credit, and when the budget is below one contract (it names what one costs). `--strategy put` seeds the single long put for this: the put at `--strike` (nearest the money when omitted) of the `--expiration` chain, entered at its midpoint with the IV that midpoint implies, as the other seeds are. Fees, margin and the rolls a dated hedge needs are not modelled, nor is the cap a put spread puts on its protection; the scenario itself stays at the position as entered. #### Collar `--strategy collar` buys one put at `--put-strike` and sells one call at `--call-strike` on the put's expiry of the `--expiration` chain, each at its quote midpoint with the IV that midpoint implies, as the other seeds are. Without a strike the quoted strike nearest 10% below spot is the put and the one nearest 10% above is the call. The position holds the shares the contracts cover, contracts x multiplier (100 for one), bought at the spot the quotes imply; `--shares` sets another count and `--shares 0` values the options alone. A typed put bought and call sold of the same size, expiry and multiplier, held with shares, reads as a collar too. The report's **Collar** section and a row of figures in the pane read the position as entered, per share: | Figure | Definition | |---|---| | Net premium | call price - put price: a credit when positive, a debit when negative; for the position, x multiplier x contracts | | Floor | put strike + net premium: the least the shares and options are worth together at expiry, per share | | Cap | call strike + net premium: the most they are worth | The floor and cap are shown with how far each is from the scenario's spot, and only when the shares match the contracts; without shares the options alone lose without limit above the call. Expiry risk gives the hedged position's breakevens (spot less the net credit, for shares bought at spot), maximum loss (spot less the floor, times the shares) and maximum profit (the cap less spot, times the shares). The GLD September 30, 2027 345 put at 12.95 and 420 call at 25.60 against 100 shares at 381.30: a 12.65 credit, floor 357.65, cap 432.65, breakeven 368.65, maximum loss 2,365 and maximum profit 5,135. Dividends on the shares, early assignment of the call and margin are not modelled. #### Cash-secured put `--strategy csp` sells one put at `--strike` (nearest the money when omitted) of the `--expiration` chain, entered at its quote midpoint with the IV that midpoint implies, as the other seeds are. `--delta` picks the put by delta instead: the one whose spot delta, at the IV its own midpoint implies against that expiry's parity forward, is nearest the delta's negative (0.30 picks the put nearest -0.30), the lower strike on a tie. The report's **Cash-secured put** section and the pane's third row of figures read the position as entered: | Figure | Definition | |---|---| | Cash secured | strike x multiplier x contracts | | Premium received | entry price x multiplier x contracts; the seed's entry price is the quote midpoint, a typed leg's is as typed | | Yield on cash | premium / cash secured | | Annualised yield | yield on cash x 365 / days to expiry (simple, not compounded); none on the expiry day | | Bid, ask | the put's two-sided quote: the chain's, or its streamed quote while the pane follows the market; a typed leg has none | | Spread | ask - bid per share, and as a percent of the midpoint (ask + bid) / 2 | | Premium at the bid | bid x multiplier x contracts: what a sell order fills at without crossing the spread | | Annualised yield at the bid | premium at the bid / cash secured x 365 / days to expiry, the same calculation as the yield at the entry price | | Out of the money | (spot - strike) / spot, against the scenario's spot, which the report names (`implied by option quotes`, `typed`, the last price) | | Break-even | strike - entry price, per share | | Days to expiry | calendar days from the valuation date in New York to the expiry date | | Earnings before expiry | `yes` when the earnings calendar's next report is on or before the expiry date, `no` when after, `unknown` when it has no date on or after the valuation date | KO's November 20, 2026 85 put at 0.67/0.72, valued on 2026-10-13: cash secured 85 x 100 = 8,500.00, premium 0.695 x 100 = 69.50, yield on cash 69.50 / 8,500 = 0.82%, annualised 0.8176% x 365 / 38 = 7.85%, at the bid 67.00 / 8,500 x 365 / 38 = 7.57%, spread 0.05 (7.2% of the mid), break-even 85 - 0.695 = 84.305, and the October 27 report falls before expiry. GS's November 820 put at 5.40/6.75, valued on 2026-10-21, 30 days out: 607.50 / 82,000 x 365 / 30 = 9.01% at the mid, 540.00 / 82,000 x 365 / 30 = 8.01% at the bid, with a spread of 1.35 (22.2% of the mid). Assignment, margin and the interest the cash earns are not modelled. #### Cash-secured put screen `CSP` (`fn CSP JPM GS KO`) runs the `--strategy csp --delta` seed on each name and reads its put with the same Cash-secured put figures, so a name's row and `fn OSA --strategy csp --strike --expiration ` agree: | Figure | Definition | |---|---| | Expiry | each name's listed expiry whose date is nearest the target, the earlier on a tie: `--expiration`, else `--days` calendar days (30) after today in New York | | Strike, delta | the put whose spot delta is nearest -`--delta` (0.30), as above; the delta shown is the put's, per share, valued at the scenario's spot with that IV | | OTM | (spot - strike) / spot, against the spot the option quotes imply | | Mid yield/yr, Bid yield/yr | the annualised yield at the quote midpoint and at the bid | | Spread | (ask - bid) / mid; over `--max-spread` (10%) it is marked `wide` | | IVR | the 30-day IV rank against the prior 52 weeks of stored closes, as VCA and HIVG read it; `--` with the reason in the notes when IV history has none | | Earnings | `before` or `after` with the date of the calendar's next report, `unknown` without one | Names are ranked by annualised yield at the bid, highest first: a wide spread costs a seller the difference between the mid and the bid, so a name priced rich only at the mid does not rank first. A wide put is ranked with the rest and flagged; a name with no chain, no quoted put or no rate to value it by is listed after the ranked ones with the reason. Up to 20 names; `--csv` writes the percents as numbers with `wide spread` and `earnings before expiry` as yes/no columns. The screen reads the chains, quotes and rates OSA reads, and its closing line dates it by the underlying quotes. ### Greeks spot and time A chain's IV and Greeks (`options`, OMON) are valued at one spot and one instant, which the pane and every export name; OVDV values its surface at the same spot: - When the underlying's quote carries the official close of the regular session the chain's quotes were taken in, as it does before the next open and early in it while the chain is still the close's, the spot is that close and time to expiry runs from the chain's time. A pre-market or after-hours print does not move the delta of a chain still quoting the close. - Otherwise the spot is the underlying's latest price, and time runs from the chain's time once its quotes are over an hour old, else from now. Every options pane stamps the spot it priced with the same way: `close Tue 20 Oct` for a session's official close, `pre-market Wed 21 Oct 09:35 UTC` (or `after hours`, `overnight`) for an extended-session print, and nothing extra for the regular session's live price, which the pane's status already dates. OMON's Spot figure is the spot its Greeks, ATM IV, straddle, skew and slope are valued at, so a chain from the close reads `769.05 close Tue 20 Oct`, and an extended print the pane shows beside it is named by its session, `· pre-market 770.65`. OVDV's query bar reads `Spot 769.05 USD · close Tue 20 Oct`. OPX and GEX read the spot Gloom Cloud measured distances and dealer gamma at, stamped by the session its time falls in (`Spot 770.88 pre-market Wed 21 Oct 09:35 UTC`). OSA's Spot figure and footer stamp a scenario valued at an extended-session print the same way. Reports and exports that always date the spot add `last Wed 21 Oct 14:05 UTC` for the regular session's price. The rate is 4% and the dividend yield the underlying's: any its fundamentals state, else, as OSA reads it, 0% when its current distribution history shows no dividend paid or declared in the last 15 months (GLD). A yield neither knows, or a history that takes over five seconds to read, is valued as none and the footer says `dividend yield unknown (valued at 0%)`. A delta can be checked by hand: KO's November 20, 2026 85 put on Monday 12 October's chain is -0.20 at the 89.79 close (IV 21.56%, dividend yield 2.34%, 39.04 days), where Tuesday's pre-market 90.65 would give -0.16. OSA values a seeded strategy at the spot its quote mids imply and names it beside the last price. The chain's open interest is OCC's count, the one OPX lists, and Gloom Cloud dates it with the session whose close it counts: one date for the chain, shown as `OI as of Fri 9 Oct`. A contract OCC has no count for keeps the reference feed's count, which is undated, and when none of the chain's counts is OCC's (the contract list did not answer in time) the label reads `OI date not published`. A chain from a server that does not send the date takes OPX's listed date only when every contract with a count in both agrees; otherwise it reads `OI date not published` (with how many counts differ under `options`), never a borrowed date. VCA's IV readings are Gloom Cloud's: each row's Spot is the underlying price the reading was taken at, on the date the title gives. ## Options valuation models The American model uses a Cox-Ross-Rubinstein recombining log-spot lattice. Between dividend events, risk-neutral up/down expectations are discounted at the entered continuous rate, with continuous dividend yield retained as a separate carry input. Before each scheduled cash jump, the continuation value at `max(spot - cash, 0)` is interpolated linearly in spot on the after-dividend value grid. The intrinsic payoff competes with continuation at each exercise node, including immediately before a cash jump. This models an explicit stock-price jump rather than a spot-minus-present-value approximation. Same-time dividends are summed. The requested default is 400 steps, with 1 to 2,000 accepted and bounded refinement up to 4,096 when carry requires it. Cash dates are mapped to the nearest tree time; spot interpolation and time discretization introduce numerical error, particularly around early-exercise boundaries. Increase the step count to assess convergence. Invalid risk-neutral probabilities trigger bounded step refinement, never probability clipping. Inputs that exceed the supported grid or numerical range return an error. Zero-volatility states use the deterministic carry path, cash jumps and exercise opportunities. At expiry, zero spot and zero strike, boundary payoffs avoid log/division failures. Greeks use numerical repricing in the same model and schedule. Spatial bumps span the lattice spacing to reduce strike-alignment noise; sensitivities remain numerical approximations near exercise and dividend boundaries. Theta advances both time to expiry and the remaining cash-dividend dates. The selected-model IV solver uses the same exercise rule and dividends; premiums outside its identifiable price range remain unavailable. Values and Greeks are per underlying unit with the existing calendar-day, one-volatility-point and one-rate-point units. Surface volatility reuses OVDV's cleaned midpoint fits and Treasury/parity carry. It explicitly loads the actual listed expiries bracketing the requested tenor, interpolates total variance at fixed forward log-moneyness, and rejects stale brackets or requests outside covered strikes/tenors. A fresh underlying quote anchors the observed surface; the calculator's hypothetical spot never moves that anchor. Source quote dates, actual source spot, fit methods, Treasury dates and failures remain in report metadata. Warnings cover the bracketing expiries and surface-wide failures, not the other expiries loaded alongside them. Brackets quoted in different New York sessions are flagged; seconds apart within one session are not. OVDV supplies a European-implied volatility assumption to either pricer; it does not calibrate an American cash-dividend model or discover future ex-dividend payments. Future cash dividends must be entered. Continuous yield remains independent of the schedule: use zero continuous yield when the explicit schedule represents all intended distributions, so the same cash is not counted twice. Discrete dividends are active only in American CRR; European BS uses continuous yield. These models do not predict assignment, settlement fees or broker exercise decisions. OVME screenshots freeze the entered assumptions and any resolved OVDV surface observation before rendering. The pane calculates from that snapshot, and screenshot verification independently reprices the selected model, all five Greeks and implied volatility from the captured inputs. It also checks the effective tree resolution, surface result, warnings and requested assumptions. Zero-valued outputs remain valid observations. An unavailable surface cannot be replaced with entered IV to certify a capture. This verifies that the screenshot represents the specified model; it does not establish the accuracy of the assumptions or market calibration. ## Estimate revisions (EM, EEO, GUID) `EM AAPL` and `EEO AAPL` open consensus estimates by fiscal end and quarterly/annual frequency. Open a period to inspect its current EPS, dated change, high-low analyst range, current up/down revision counts and history. `GUID AAPL` opens cited qualitative guidance. The Surprises tab retains whether each source date means an announcement or fiscal period end. All new data is assembled by one Gloom Cloud endpoint, with independently partial sources and a five-minute cache. Actual Cloud collection days and historical lookbacks supplied by the backend feed appear as distinct series. Provider backfills never count toward the 20 actual observation days required for a percentile. Current September 2026 coverage commonly has only five real collection dates, so percentiles are unavailable until enough daily snapshots accrue. A fiscal roll never joins current-quarter labels across different fiscal ends. Currency is part of the period identity; EPS units come from each period rather than listing currency. Consensus change compares the same fiscal period and currency with the previous actual collection date. Percentage change divides by the absolute prior mean; zero has no percentage change. Analyst dispersion is the reported high-low range, not standard deviation. Up/down counts are current provider revision events over seven or thirty days, not distinct analyst votes or inferred direction from a changing average. No historical breadth percentile is invented. Historical revenue units were not stored separately, so only dated current revenue with its explicit currency is available. Legacy stored currencies and EPS accounting/ADR share basis remain unverified. The guidance text is a dated public transcript summary linked to its source. A listing without a published earnings-call summary shows the Guidance tab's empty state without a warning; a failed transcript read still warns. A numeric guidance-versus-consensus gap requires matched metric, fiscal period, currency and accounting basis; without them it remains unavailable. A quote in a summary is not normalized into a forecast. Surprise is reported actual minus consensus estimate in their declared currency, and its percent divides by the absolute nonzero estimate. Surprise ranks compare matching currency and date type only. History is bounded to the latest 4,000 stored rows within one year, with truncation and source failures disclosed. Missing periods stay missing; an absent endpoint has a recoverable state. Failed refreshes retain dated data. `gloom fn EM AAPL --json` exposes periods, actual snapshots, lookbacks, current revision counts, surprises, guidance sources and coverage separately. `--period YYYY-MM-DD --frequency quarterly|annual` pins a fiscal period in the pane and filters the consensus, revision history and breadth sections in headless reports. Invalid dates and uncovered fiscal periods produce an explicit error. ## Crypto `CRYP` lists the largest crypto assets by market cap: up to 100 coins, with stablecoins and DeFi TVL on their own tabs. Wrapped, staked and bridged copies of a larger coin, and pairs with under $1M of 24h volume, are left out so each market appears once. The universe, prices, 24h volume, supply, 52-week range and the last 30 completed daily closes come from one Gloom Cloud payload that the pane refreshes every 15 seconds. On top of that, the rows on screen subscribe to the shared market socket like any watchlist. A real-time quote moves the price, day change, market cap, 7D, 30D and 1Y returns and the end of the sparkline as it arrives; a streamed quote older than the board's own price is ignored, so a delayed plan's 15-minute-old crypto quotes never replace a current price. The footer shows the time of the newest price. Streaming runs in the background whether or not the window has focus, and pauses only while it is hidden or minimized. CHG% UTC is the change since 00:00 UTC, from the previous UTC day's close, the move `gloom quote` gives a coin; `fn CRYP` heads it `Chg % UTC`, and its `--csv` keeps the `Chg %` header. A coin whose close Gloom Cloud cannot date to the last two days (a source still reporting a weeks-old close) shows a dash rather than a 24-hour move beside the others. 7D% and 30D% compare the price with the close 7 and 30 UTC days earlier, the same basis, so a 7D move includes today's. 1Y% uses the price a year ago implied by the source's 52-week change. VOL 24H is aggregate USD volume across venues. A missing close shows as a dash rather than a zero return. Enter or click opens the coin in the ticker pane for its chart, quote and news. Column headers sort (numbers largest first), `r` refreshes, and narrow panes drop 1Y, the sparkline, 30D, volume and the name in that order. `gloom fn CRYP --json` returns the board; `--list stablecoin` returns the stablecoin tab, and `--list defi` the [DeFi tab](#defi-tvl). Every coin on the board has one symbol, `-USD` (`USDT-USD`, `USDE-USD`), and `quote`, `history`, `GIP` and the ticker pane all read it by that symbol, bare or on its crypto venue. A coin typed without its quote currency (`USDT`, `TETHER`) is not a ticker, and the hint names its symbol: `Did you mean USDT-USD (Tether USDt)?`. A coin's bars run around the clock, weekends included, also for a coin quoted in another currency or coin (`BTC-EUR`, `ETH-BTC`): its day closes at 00:00 UTC and is whole by 00:15 UTC. Hourly or shorter bars that stop hours back are behind, never served as the latest: `history` says `Latest history for BTC-USD is behind`, and the next source with current bars serves them instead, named on the footer's `Source:`. #### Stablecoins and their peg The stablecoin tab is read against each coin's peg. PEG is what the coin holds to: `USD`; a coin on another currency by its target in dollars (`EUR 1.1242`, the latest EUR/USD rate), so EURC at 1.1234 reads as 7bp under its euro rather than a 12% premium to the dollar; `USD yield` for a coin whose yield accrues into its price (USDY, sUSDe-style tokens), which has no par to be off. OFF PEG is the price against that target in basis points, `(price / target - 1) x 10,000` to a tenth: `-12.9bp` for USDT at 0.99871. A yield coin's OFF PEG is blank, never a deviation. Off by 25bp or more either way the cell is shown as a warning, by 100bp or more as a loss; sorting OFF PEG puts the furthest from its peg first, above or below. 24H LOW and 24H HIGH are the lowest and highest trade in the 24 hours to the board's price, from 5-minute bars, each with the UTC time of the first bar that reached it (`Sat 11:30`; the weekday tells the day inside 24 hours), and a newer live price beyond either extends it. A narrow pane drops the returns, the sparkline, the day change, volume, the name and then the high, keeping the peg, OFF PEG and the low with its time. The [supply columns](#stablecoin-supply) all leave before the name: SUP 30D and SUP 7D with the day change, then, after volume, SHARE, SUP 30D%, SUP 7D% and SUPPLY. `--json` carries `peg` (`currency`, `accrues`, the target `price` and its `asOf`), `offPegBp` and the low and high with ISO times. `gloom catalog tether` (or `usdt`, `usdc`, `depeg`, `peg`) and the same words in `search` point to `gloom fn CRYP --list stablecoin`. `quote` prints a coin trading near a dollar to four decimals, as CRYP does. For one session's path, `gloom fn GIP USDT-USD --session 2026-10-17` prints the session low and high with their UTC times under Statistics (`USDT-USD:CCC session low 0.99833 at 2026-10-17 11:30 UTC`); a window of several sessions says low and high, and `--json` carries them as `metadata.sessionRanges`. #### Stablecoin supply The Stablecoins tab opens with the total stablecoin supply, its 7D and 30D change, and a stacked chart of the six largest coins and everything else (Other) over 1M, 3M, 1Y or all history, with the table below. Gloom Cloud reads a public stablecoin dataset once a UTC day: the list of stablecoins, the daily total and the daily supply of the 50 largest coins. It keeps every read it makes, never deleted for age: each read is logged with its URL, time and hash, and the first copy of each URL's answer each UTC day is stored compressed. The app only talks to Gloom Cloud, and supply is free with no account. Every supply figure is read on one day, the newest day of the daily total, and the figures name that date. - **Total supply** is the sum of every stablecoin's circulating supply in USD, all pegs included. 7D and 30D compare it with the total 7 and 30 days earlier. - **SUPPLY** is a coin's circulating supply across chains in USD that day. **SUP 7D** and **SUP 30D** are its change in USD from 7 and 30 days earlier, and **SUP 7D%** and **SUP 30D%** the same change in percent, as the total's are; a coin pegged to another currency moves with that currency too. **SHARE** is the coin's supply as a percent of the total. - **The chart** stacks the six largest coins by supply, bottom up, and Other is the total less them, so the stack adds up to the total. A coin is counted from its first day of supply. The legend reads each coin's own supply, the axis the stacked height; a coin's newest legend value, its SUPPLY and the last point of its `G` series are the same number, and SHARE is that number over the total above the chart. - Coins are matched to the board by symbol; when two coins share one, the larger keeps it. The supply list covers the 50 largest coins, and a stablecoin it does not cover shows dashes. A coin whose supply was not updated that day is left out rather than shown with an older figure. - If the dataset cannot be read, prices are untouched: supply shows the last day Gloom Cloud read, with a notice giving its date. With no supply at all the chart says it is unavailable, the table keeps MCAP without the supply columns, and `fn CRYP` notes the outage while the price report stays complete. `gloom fn CRYP --list stablecoin` prints the total line before the table and adds the supply columns; `--json` carries them per row with each coin's `pegType` (`peggedUSD`, `peggedEUR`), and the total under `metadata.supply`; `--csv` adds a dated section with the total, the six charted coins and Other in USD. Chart the total with `gloom fn G CAP:crypto:stablecoin-supply` and one coin with `gloom fn G CAP:crypto:stablecoin-coin-supply/USDT-USD`. #### DeFi TVL The DeFi tab shows the total value locked in DeFi, its 7D and 30D change, and its daily history over 1M, 3M, 1Y or all of it, above the 25 largest protocols or the 10 largest chains by TVL (List: Protocols or Chains). The figures are DefiLlama's: what counts as locked, and what is left out as double counted, is their definition, and the Source figure names them with the day their history starts (`daily since 2018-02-12`). Gloom Cloud reads DefiLlama's free API once a UTC day and keeps every read it makes, never deleted for age: each read is logged with its URL, time and hash, the first copy of each URL's answer each UTC day is stored compressed, and the figures it serves keep the day they were observed. The app only talks to Gloom Cloud, and the tab is free with no account. It loads the first time it is shown, not with the coin board. - **Total DeFi TVL** is the newest day of DefiLlama's total chart, every chain together, and its date is the tab's as of. 7D and 30D compare it with the same chart 7 and 30 days earlier, in dollars and percent. - **A chain** is read from its own daily chart on that day. 7D and 30D are against the same chart, and SHARE is the chain's TVL over the total the same day. - **A protocol** counts its versions together, as DefiLlama ranks it (Aave is V3, V2, V4 and the rest). Its TVL is the source's latest figure, not a daily close, so the protocol list carries its own time (`as of 2026-10-21 16:17 UTC`). 7D and 30D compare it with DefiLlama's figure a week and a month earlier, and 1D% with a day earlier. Protocols have no share: a liquid staking token deposited in a lending market counts in both. Centralized exchanges are not DeFi and are left off. Over 12 to 18 October 2026 Aave went from 18.46B to 17.88B. - Column headers sort (numbers largest first). A narrow pane drops the chain count, 1D%, the 30D and 7D dollar changes, the category and then 30D%, keeping the name, TVL, 7D% and a chain's SHARE. - If the source cannot be read, the tab keeps the last day Gloom Cloud read, dated; with nothing read yet it says DeFi TVL is unavailable. `gloom fn CRYP --list defi` (or `--list tvl`) prints the total line before the protocols, and `--by chain` lists the chains; `--json` carries the rows, the total under `metadata.total`, `asOf`, `protocolsAsOf` and `historyStart`; `--csv` adds the other list and the total's daily history in USD, a day the source has no figure for left blank. Chart the total with `gloom fn G CAP:crypto:defi-tvl`. `gloom catalog defi` (or `tvl`, `total value locked`, `on-chain`, `aave`, `lido`) and the same words in `search` point to it. Exchange reserves and exchange flows (the coins held on exchanges, and what moves in and out) are not covered: no source for them is in the terminal, and `catalog "exchange reserves"` and `search "exchange reserves"` say so, naming CRYP's DeFi and stablecoin supply as the closest data. #### Crypto news A coin pair's news is the stories filed under its pair. When none are, as for `BTC-USD`, the stories that mention the coin are shown instead and the pane says so (`No stories are filed under BTC-USD; these mention bitcoin.`); `gloom news BTC-USD` heads them `Stories matching "bitcoin" · no stories filed under BTC-USD`, and `ticker` and `fn CN` note it. A major coin is searched by its name (`bitcoin`, `ethereum`), another by its listing's name without the quote currency (`HYPE32196-USD` is `hyperliquid`). A bare code with no listing name is not searched, because a code alone is too often a word. ### Spot crypto ETF flows (ETFF) `ETFF` lists the daily net flows of the US spot bitcoin ETFs (`--asset eth` for ether): one row per US trading day, newest first, with the day's total and each fund's flow in US$ millions, in the order Farside Investors publishes them. Gloom Cloud reads Farside's tables every hour while funds report (20:00 UTC to 14:00 UTC the next morning on trading days) and every six hours otherwise, keeps every page it read, and serves the latest figures. The pane footer names the publisher and `o` opens its table. - **Pending.** The newest day fills in fund by fund. A fund that reported the day before and shows nothing yet reads `pending`, in the table and in `fn ETFF`, and the day's total is Farside's own total so far, not a sum. - **Figures.** Latest day, 5 days and 20 days sum the published daily totals; Since launch is every listed day, from the first fund's launch (2024-01-11 for bitcoin, 2024-07-23 for ether). Days the market was closed are left out. - **Chart and range.** The chart draws the running total since launch, over the range the table lists: 1M, 3M, 1Y or All (keys `1`-`4`). The figures above it always use the whole history. - **Stale.** When no read has succeeded for two days the footer says so, with the date of the last read. `gloom fn ETFF` prints the newest 20 days (`--limit` for more, `--json` for every fund's figure and `pending`), with a summary line and the source. `gloom catalog flows` finds it, and so do `ETF flows`, `bitcoin flows` and `ether flows` in search and the command bar. Searching a category (`bitcoin ETF`, `spot ether ETF`, `HK bitcoin ETF`) or an issuer (`ChinaAMC`, `Bosera`, `Harvest bitcoin`, `iShares bitcoin`) lists the spot funds first: the US funds, the Hong Kong funds with each counter named (`ChinaAMC Bitcoin ETF (HKD counter)`, `(USD counter)`), and the XETRA-listed products. Their descriptions come from the issuer's or the exchange's product page, named under the description with a link; `fn ETF` on a fund listed outside the US says fund facts cover US-listed funds and links the issuer's page. ### Relative rotation (RRG / GRR) The default universe is the eleven US sector ETFs versus SPY. All prices come through Gloom Cloud daily history and listing currency endpoints. History requests are bounded to four concurrent calls; the app caches the assembled result for 30 minutes. Three years of daily closes support the warmup and one-year ranks. This is a transparent relative-strength model, not the proprietary JdK indices. At each completed week, let R be the asset close divided by the benchmark close. Strength is `100 * R / SMA13(R)`; momentum is `100 * strength / strength[4 weeks ago]`. The 100/100 intersection defines Leading (both above), Weakening (strength above, momentum below), Lagging (both below) and Improving (strength below, momentum above). Values on an axis are Neutral. Trails default to six completed weeks; longer histories never expand the plotted axes. Each path retains its chronological edges even when strength reverses direction. The latest eligible benchmark daily observation in each completed Friday-ending week defines the required date for peers. The current week is excluded. The final session must match the existing published NYSE/Nasdaq closure calendar; a Thursday is accepted only for a verified Friday closure. Unknown venues and years are unavailable, and a missing expected weekly close is flagged. Earlier history outside the published calendar does not enter the model. Missing or contradictory closes break continuity; no forward-fill, zero price or cross-currency comparison is allowed. Seventeen consecutive matched weekly closes are needed for momentum. Returned history identity and currency are checked against the requested listing and quote metadata. Stale histories keep explicit source warnings and observation dates. Percentiles use the shared midrank helper over the preceding 365 days through the metric date, require 20 valid weekly values and report sample counts; fewer than 52 are flagged. Identical observations rank at 50, and future observations cannot enter a rank. Provider closes are price observations; dividend reinvestment is not assumed, so this is not a total-return ranking. Delisted instruments, long gaps, calendar mismatches and missing listing currency remain unavailable. ## Portfolio risk depth (PORT, MARS) `PORT` and `MARS` open risk depth for a local portfolio. Previously saved Analytics panes retain their overview; switch the pane's View setting to Risk depth. Current holdings and imported evidence stay local. Cloud receives listing symbols for batch quotes and daily histories, plus the existing FRED requests. The market cache refreshes after two minutes and retains dated data for up to one day after a failed refresh. An absent Cloud endpoint preserves explicit unavailable states. Screenshots freeze the same model used by the report. The default market analysis is a daily rebalanced basket at fixed current equity weights, denominated in USD, or in the portfolio's currency when that is not USD (see below). It is a price-return estimate of the current composition, not the account's historical performance. A holding enters the basket when it has a positive USD listing mark and at least 60 complete, calendar-qualified daily returns; the listing identity, currency, staleness and daily-cadence checks below apply to each holding on its own. The mark is the current quote's regular session: its price while the session trades, and once it is over (after hours, overnight, through a weekend, and in the pre-market while the quote carries the last close) that session's close, the price `portfolio show --close` values the holding at, never a pre-market or after-hours print. When no current quote arrives or the quote is stale, it is the latest completed daily close. A holding marked at a close says so in its evidence (`at 2026-09-21 close`). A US listing venue (NASDAQ, NYSE, NYSE American, Arca, Cboe) establishes USD when no quote confirms it. Factor proxies use their own listing venues; MTUM and QUAL list on Cboe BZX. A listing quoted in another currency enters in USD (see below). Shorts, derivatives and leveraged financing are outside this basket model; stocks, ETFs and depositary receipts (ADRs, ADSs and GDRs, however the asset type is spelled) are inside it. Dated account leverage is not inferred from current lots. Cash is part of the book but never of the basket. It is the broker account's own balances by currency when the account reports them (its summary row left out), else its total cash (in the portfolio currency when the account names none), else the amount set with `portfolio cash set`, each currency valued in the portfolio currency at its current rate. The Holdings view lists each currency's cash as its own row (`TRY cash`, `600,000.00 TRY = 12,075.18 USD; moves with TRY; outside the basket`), in place by value and marked left out, and the notes name it with its share of the book. Cash in another currency than the portfolio's says that its value moves with that currency. A listing quoted in another currency (RELIANCE on NSE in INR, 7203 on the Tokyo exchange in JPY, a London listing in pence) is restated in USD before any return is taken. Its completed daily closes are placed on every NYSE session they span, each multiplied by the daily FX close of that same date (USD per unit, so `JPY=X` is inverted and pence divide by 100 through GBP), and its returns come from that USD series. The series therefore shares the basket's calendar and pairs with SPY and the other holdings interval for interval. On a US session the listing did not trade (its own holiday) the holding is worth its last local close at that day's rate, so its USD value moves with the currency alone, as it does in the account; a US holiday on which the listing traded is spanned by the next interval. Daily closes are taken as of their dates and are not synchronous across markets: a Tokyo close comes hours before the US close of the same date, so the holding reacts to that day's US move in its next return, and a correlation or beta of such a holding to US names reads lower than it is. The `!` list carries a notice for this. The FX close of the same date is hours apart from the local close for the same reason, and there is no intraday alignment. Its mark is the current quote at the current exchange rate, or, with no current quote or rate, the latest converted close. The holding stays left out, with the reason, when its currency has no daily FX pair, the FX history is missing or stale (no completed close in seven days), a US session in the span has no FX close, the listing goes more than ten days without a close (longer than any market holiday), or the latest FX close is more than 20% from the current rate (a wrong or inverted pair). Its row in the Holdings view says `from JPY at daily FX`, and the footer counts the converted holdings: `2 holdings converted from local currency`. A portfolio whose currency is not USD (a lira account, say) has every basket view in that currency. The load adds the currency's current rate and its daily FX history, and each holding's USD daily returns, a converted foreign listing's included, are restated at the account currency's daily FX closes of each return's own start and end dates: the holding's USD value is divided by the USD price of one unit on both dates, so a return r becomes (1 + r) × fx(start) / fx(end) - 1, with fx in USD per unit (`TRY=X` inverted). A yen listing in a lira account therefore converts at the cross of the yen and lira closes of the same date. A holding's value is its USD mark at the current rate (at the latest daily close when no current rate loads), so values, the covered basket and VaR and expected shortfall in money are in the account currency, while the weights are those the same holdings have in a USD account. The risk rows compare the basket with SPY restated the same way; a session the closes do not cover is a gap in that benchmark, not bridged. A holding is left out, with the pair named in the reason, when the account currency has no daily FX pair, its FX history is missing, stale or more than 20% from the current rate, or one of the holding's returns has an endpoint inside the FX history with no close (`USD/TRY daily FX history has gaps on the holding's dates`); returns before the first FX close or after the last are dropped instead, so the series ends with the FX history. Only when nothing qualifies do the views say why instead of estimating, as below. `fn PORT` opens with `Returns in TRY at daily USD/TRY closes.`, Ask Gloom's compact result names the currency and pair under `metadata.accountConversion`, and the pane's footer says it on Risk, Factors, Correlation and Stress. Factor and stress regressions keep their USD inputs (the ETF proxies' USD price returns and the DGS10 and VIXCLS changes) and regress the account-currency basket on them, so a beta is the account-currency move per unit of the factor as it trades. Converting the proxies as well would put the same currency move on both sides of the level factors (market, rates) and pull their betas toward one whatever the holdings are, while the spread factors (size, value, momentum, credit) would barely change. Kept in USD, the currency's own daily moves fall into the residual and lower R², its drift goes into the intercept, and only its co-movement with a factor moves a beta: a lira that weakens when US equities fall lowers the market beta a lira account sees, because its USD holdings gain in lira as they lose in dollars, and that cushion is real exposure of the account. Pair correlations are of account-currency returns, so the currency move every holding shares raises them a little. For a currency with small daily moves, such as the lira, betas, correlations and volatility stay close to a USD account's, while returns, drawdown and tail losses include the currency's drift. Holdings that do not qualify are left out of the basket and never approximated into it: foreign listings without usable daily FX closes, holdings the account currency's daily closes do not cover, shorts, derivatives, holdings without a current USD mark or daily history, and holdings past the size limit. The basket's weights renormalize over the holdings that qualify. The footer leads with the basket's value and its share of the book, then what it leaves out, holdings and cash alike, each with its share: `basket 48,286 USD = 72% of book; left out: TRY cash 18%, BTC-USD 10%`. Up to three are named, past that the two largest and the rest together (`EUR2 4%, TWD1 4%, 7 more 14%`); the percents are whole and add up to 100 (the remainders go to the largest fractions), a share under one percent reads `under 1%`, and the basket's share reads `at most` while a holding or a currency's cash has no value. `fn PORT` puts the same line in the evidence of the tail losses in money; the warnings (`!`) and the Holdings view name each holding and currency's cash left out, with its reason and share of the book. The book is every holding's current gross value in the portfolio currency, and the cash's: the USD mark for a USD listing (at the current rate in a non-USD account), otherwise the listing's own quote or the broker's position value at the current exchange rate. That conversion only sizes what is left out; it never enters a return. Concentration (largest one and five, HHI, effective holdings) needs no return history, so it describes every holding that has a current value, left out of the basket or not, as shares of the holdings' value with the cash aside, which its rows say (`Share of 54,747 USD in priced holdings, cash aside`); the weights of the individual holdings in the Holdings view are the basket's. Below 50% of the holdings' value (cash aside, as the basket could never take it) the qualifying holdings are no longer most of what is invested, and an estimate would mostly describe something else; Risk, Factors, Correlation and Stress then say how much qualifies and the largest reason the rest is left out, instead of estimating, while the Holdings view still lists every holding. Stress keeps the currency and price shocks below (they reprice the book, not the basket), and its footer says why the index, 10Y and VIX scenarios are not there. Performance, Attribution and Greeks come from account evidence and the option book rather than the basket, so the coverage does not apply to them. One load quotes up to 500 holdings, 50 to a request, and requests daily history for the factor proxies and at most the 150 largest qualifying holdings by current USD value, four at a time; the rest are left out as beyond the supported size, and holdings that quote in another currency or cannot enter the basket get no history request. A non-USD account adds one request for its currency's daily FX history, shared with any listing quoted in that currency. Each history request returns up to 18 months of closes and a refresh repeats it after the two-minute cache, so 150 bounds a load at about 160 history requests: with a Cloud answering each in 0.3 seconds that is about 13 seconds, and the basket statistics with 11,175 correlation pairs compute in about 0.3 seconds. The cache keeps daily returns, not the price points behind them. `gloom fn PORT --json` and Ask Gloom's compact result report the same coverage under `metadata.coverage`: the covered share of the book (`share`) and of the holdings alone (`holdingsShare`, which the 50% minimum reads), whether the share is an upper bound, whether the basket views estimated, the book's, the cash's and the covered value, and each holding and currency's cash left out with its reason and share (cash marked `cash: true`). A report is complete only when the basket covers every holding; cash, which no basket holds, does not make it incomplete. Daily returns match both interval endpoints. Published exchange-session calendars reject missing trading days, unsupported years/venues and ambiguous timestamps. The loader requests an eighteen-month buffer, omits today's incomplete observation and requires a recent completed day. The quoted listing and currency must match any metadata returned with history. Daily prices do not establish total returns including distributions or corporate-action reinvestment. Risk uses 60 consecutive matched sessions: compounded basket/SPY returns (SPY is the benchmark; its row names it), their arithmetic difference, maximum drawdown from a unit wealth of one, sample annualized volatility and tracking error using square root of 252, one-day historical VaR 95%, and expected shortfall. VaR is the nonnegative loss at the nearest-rank fifth percentile of daily returns; expected shortfall averages the worst ceiling(5% times sample size) observations. Both also read in money, `2.60% ($5,731)`: the percent times the covered basket's current value in the portfolio currency. Their evidence names the method from the sample it read, `historical, 1-day, 95%, 60 daily returns` (`needs 60 daily returns` when there are fewer), followed by the coverage line above, which names the basket value and what it leaves out; the pane's footer on the Risk view says the same after the coverage, with the daily closes it read to (`daily closes to 2026-10-23`), and a `shot` carries both, its dated status line in place of that last part. Neither is scaled to another horizon or fitted to a normal distribution. One-year percentiles compare the latest statistic with same-horizon rolling estimates using the shared midrank helper, requiring at least 20 valid rolling observations. Overlapping samples are not independent. Current-composition concentration, pair correlations, user scenarios, imported account periods and Greeks have no comparable stored history, so their percentiles remain unavailable. For a portfolio imported from a 13F, `--since filed` (or the pane's Risk window setting) computes the same rows over the sessions since the filing date instead, measured from the last close on or before that day: the trailing run of matched sessions that end after it, so a missing session restarts the window after the gap and the labels give the close it starts from. The basket is the one a copier of the 13F would have held: the 13F's own weights (each imported line's reported value over the imported lines' total, stored at import) bought at that close and held, each holding's share drifting with its price and nothing rebalanced; return, volatility, drawdown, tracking error and the tail rows all read that daily series, and the run stops at the first session a holding has no matched return for. A portfolio imported before the weights were stored rebuilds them from each position's shares times cost, which an import sets to the filing's reported value, and says so; one whose positions no longer carry a USD cost falls back to current weights and names the holding. A holding added after the import is outside the held basket, and a removed one renormalises the rest, each with a note. `--weights current` keeps fixed current weights over the same span, as in the trailing window, and the report's first line names the method either way. These rows have no percentile, since there is no rolling sample of the same span, and VaR and expected shortfall stay unavailable until 60 sessions have passed. Factor regressions independently estimate an intercept and beta against these ETF price-return proxies: market SPY, size IWM minus SPY, value IWD minus IWF, momentum MTUM minus SPY, quality QUAL minus SPY, rates IEF and credit HYG minus IEF. They are not academic factor portfolios or a joint explanatory model. Beta uses 60 matched daily returns and reports sample count and R-squared. Holdings correlation also matches daily interval endpoints. Independent stress scenarios multiply empirical beta by an index return, a DGS10 change in percentage points (100 basis points equals one point), or a VIXCLS point change; each is a share of the basket, which its evidence says (`% of basket`). Stress regressions use up to 126 equity sessions, require 60 matched observations and preserve the last matching source date. They are linear scenarios, not forecasts, and cannot be added together as a joint stress. Currency and price shocks (`--fx-shift`, `--asset-shift`, or the pane's FX shift and Asset shift settings) reprice the whole book instead, every holding and the cash, each at its own currency and price, all of them at once. A currency's shift is its move against USD in percent of its USD value: `--fx-shift TRY -20` is the lira 20% weaker, so lira cash and a lira listing lose a fifth of their value in a USD account. USD itself does not shift; a stronger dollar is the other currency falling. In an account in another currency the account currency's own shift moves every other line the other way: in a lira account `TRY -20` adds a quarter to every USD holding (1 / 0.8), leaves the lira cash as it is, and a euro listing with `EUR 5` as well moves by 1.05 / 0.8. A holding's shift (`--asset-shift GLD 10`, `BTC-USD -30`, `SYMBOL:EXCHANGE` for one listing of several) moves its price in its listing currency. A listing's currency is the one it quotes in (pence move with GBP), and a holding outside the USD marks keeps the value that sizes it in the coverage. The Stress view lists each line a shock moves, its change in percent of its own value and in money with its value before and after, and then `Book total`: the change in money and in percent of the book's net value, cash included. A line without a value is named and left out of the total, and a shock nothing in the book moves with (a currency it holds nothing in, a symbol it does not hold) is named in the notes. Shifts run from -99% to +500%, several separated by commas (`TRY -20, EUR 5`); a comma between two digits is a decimal (`TRY -2,5`). Repricing is instant and holds everything else still; it is not a forecast and has no history behind it. FRED DGS10 and VIXCLS were verified with latest usable dates September 18 and September 21 respectively. ### Local account evidence Current lots, broker fills and generic broker cumulative-return fields cannot establish complete deposits, withdrawals, dated sector weights or an unambiguous TWR/MWR series. Import explicit version 1 JSON through the pane's `i` action (clipboard), its Local evidence JSON setting, or the CLI `--evidence` option. Evidence is private pane configuration and must match the selected portfolio ID and currency. All amounts use that currency; returns and weights are fractions, not percentages. A minimal illustrative ledger and attribution book are: ```json { "version": 1, "portfolioId": "main", "currency": "USD", "source": "Dated account statement", "performance": { "flowTiming": "end-of-day", "externalFlowsComplete": true, "observations": [ {"date": "2025-01-02", "value": 100, "externalFlow": 0}, {"date": "2025-07-01", "value": 160, "externalFlow": 50}, {"date": "2026-01-02", "value": 180, "externalFlow": 0} ] }, "attribution": { "method": "brinson-fachler", "startDate": "2025-01-02", "endDate": "2026-01-02", "benchmark": "Declared sector benchmark", "sectors": [ {"sector": "Technology", "portfolioWeight": 0.6, "benchmarkWeight": 0.4, "portfolioReturn": 0.15, "benchmarkReturn": 0.10}, {"sector": "Industrials", "portfolioWeight": 0.4, "benchmarkWeight": 0.6, "portfolioReturn": -0.05, "benchmarkReturn": -0.02} ] } } ``` Positive external flow means a deposit and negative means a withdrawal. Opening NAV is the starting investment and has zero flow. Include every flow with its after-flow valuation, using the declared end-of-day convention; an omitted or intraperiod unvalued flow invalidates that evidence. TWR links `(closing NAV - closing flow) / previous NAV`; drawdown uses its unitized wealth, so deposits cannot manufacture performance. Annualized MWR solves dated investor cashflows on actual/365, including starting NAV and terminal liquidation. Only a conventional single sign change is accepted, with a unique root in the supported -99.99% to 10,000% range; ambiguous roots leave MWR unavailable without discarding TWR. Dates must increase, NAV/pre-flow NAV must be positive, and input is bounded to 10,000 valuations, twenty years and one MB. Single-period Brinson-Fachler attribution uses declared beginning sector weights and matching period returns for both books, including cash and unclassified sectors so each weight sum is one. Allocation is `(portfolio weight - benchmark weight) * (sector benchmark return - total benchmark return)`; selection is `benchmark weight * (portfolio sector return - benchmark sector return)`; interaction is the product of weight and return differences. Effects reconcile to arithmetic active return. This is the declared benchmark book; no SPY sector holdings or historical account weights are invented. ### Option exposure PORT reuses OSA's European pricing and Greeks. Broker-held options require one exact broker conId, local option symbol, expiry, strike, side, multiplier and currency, plus matching dated Cloud spot, option contract/IV, Treasury rate and dividend yield. They are valued at the spot and instant OMON values their chain at (see [Greeks spot and time](#greeks-spot-and-time)), the ones the contract's IV is measured at: a chain quoted in a session that has closed at that session's close and the time its quotes were taken, so a same-day contract's IV prices it before the open as it did at the close, and the Greeks row is dated by that session. Missing or ambiguous contract inputs remain unavailable and prevent a complete option-book total. Requests are confined to the Cloud provider; no app-side third-party fallback is introduced. Alternatively, add `options: {"scope":"imported","positions":[...]}` to local evidence, with fully specified OSA `ScenarioPosition` snapshots (`symbol`, optional `exchange`, `currency`, `spot`, decimal `rate`/`dividendYield`, millisecond `asOf`, and `legs` containing `id`, `side`, signed integer `quantity`, `strike`, Unix-second `expiration`, `price`, decimal `volatility`, and explicit `multiplier`). The imported option book remains separate from broker holdings. Snapshots older than four calendar days or with future timestamps/mismatched currency are unavailable. Dollar delta multiplies share delta by spot; gamma P&L is one half gamma times a uniform one-percent spot move squared; vega is currency per volatility point, theta currency per calendar day and rho currency per rate point. Share deltas are not added across different underlyings. Exercise, assignment, American exercise premium and adjusted deliverables are not inferred. Imported snapshots are assumptions, not current market quotes. ## Equity criteria screener (EQS) EQS queries an indexed snapshot of the Cloud's covered, stored financial listings. It does not claim to enumerate every listed security. The backend projects existing financial, statement, FINRA, insider and 13F observations in bounded batches; a screen query does not fan out to upstream providers. Snapshots refresh every 15 minutes and expire after two hours. Cursors bind the exact query, sort and snapshot; rows from different generations cannot be combined. Saved definitions are account-owned and use revision checks for concurrent edits. Every numerical observation retains native unit, source date, collection date, known filing availability date, source and availability state. The displayed percentile is cross-sectional within the covered universe, never a historical percentile. Observation dates vary between metrics and issuers. Monetary fields require a single currency for filtering and ordering; no implied FX conversion is performed. The currency keeps only the listings quoted in it, so a CAD screen of tobacco companies finds none where the covered ones are quoted in USD; an empty screen in a currency other than USD says so, and `fn EQS` gives the same screen in USD to run. Missing values fail numeric comparisons. `Unavailable` means the field lacks evidence; it does not mean the financial quantity is zero. Provider multiples, market capitalization and dividend yield carry no observation date; a company's detail shows their collection date, marked collected, instead of inventing a source date. The dividend yield (DIV YLD%) is the yield the company's statistics state, at the price when the screen's data was collected, so it differs from the one `ticker` shows by the price move since that date. Most companies state a forward yield, but one that states only a trailing yield is screened on that, so the column does not claim a basis. A company's detail names its row's own on a Yield basis line, in the words `ticker` and `DVD` use: `latest distribution annualized` or `last 12 months of distributions`, and no line when the statistics do not state one. Outside the regular session a listing is priced at the last regular close and its move, with its market cap moved to that close, so a pre-market or after-hours print never decides which listings match, their order or their percentiles. The pane and `fn EQS` show that print in a column of its own, from each row's quote. US primary listings are named by their SEC conformed name; other listings keep the provider name. Symbols differing only by share-class separator are one listing, and OTC or foreign order-book lines of an issuer with a US primary line in the same currency are omitted. Sector and industry come from stored provider profiles and are missing for many smaller listings, so a sector criterion covers only listings with a stored profile. ATR% is the 14-session average true range as a percent of the last completed close, for US listings, from stored daily bars of settled sessions only. A session's true range is its high less low or, when larger, the distance from its high or low to the prior close. The average is Wilder's, the smoothing of the chart's ATR study, over the latest consecutive sessions, at least 15 and at most 30. A missing session, an invalid bar or fewer than 15 sessions leaves it unavailable. IV rank is a rank, not an IV percentile: 0 is the lowest 30-day implied volatility of the past 52 weeks and 100 the highest. Growth compares matching annual periods with compatible currency and a positive base. Margins use reported revenue and their corresponding profit measure. Insider purchase/sale counts reflect observed filings and are lower bounds; partial cache coverage cannot establish zero activity. Therefore these counts support positive lower-bound or availability conditions, not equality or upper bounds. FINRA quantities and changes retain the source's reporting period, and 13F activity retains its filing period and coverage limitations. Results can remain dated after a failed refresh. Changing the query or account clears the previous result immediately, aborts pending pagination and rejects its late response. Export pins the displayed snapshot and is capped at 5,000 matches; refine a broader screen before exporting. An absent endpoint or migration has an explicit unavailable state. ## Backtests (BT) BT runs on the ticker's daily history from the market data coordinator (all available sessions, one bar per UTC date). A session served without a positive close cannot carry a return and is left out, as is one Gloom Cloud left out of the history for that reason (CL=F settled at -37.63 on 2020-04-20); a session still forming (a coin's UTC day, a future's trade date or a US session before its close) is left out unless `--include-partial` keeps it. Each is warned with its date, and the run is dated by the last session it tested, which `--end` fixes. A futures continuation (`CL=F`, or a generic such as `CL2`) is not one contract: unless adjusted, each roll is a jump between two contracts' prices that the returns include, and the report says so. Indicators use the chart studies' formulas: simple and exponential moving averages seeded by a simple average, Wilder RSI, MACD as the fast minus slow EMA with an EMA signal line, and Bollinger bands from the simple average plus or minus k population standard deviations. `highest(n)` and `lowest(n)` use the n sessions before the current one, so a close can break out of its own range. An undefined value (warmup) never satisfies a comparison, and a cross needs both sessions defined. Evaluation starts after the longest indicator warmup and within the chosen lookback. The strategy is long or flat and fully invested when long. A rule true at a session's close fills at the next session's open, or its close when no open is recorded, so no signal trades on the bar that produced it. Entry is checked when flat and exit when long. Each fill pays the cost per side on its price. Cash earns nothing. Buy-and-hold buys at the same first fill with the same entry cost and is never sold. An open position is marked at the last close, net of an exit cost, in the trade list and at the last close in equity. Returns are price returns, labelled `Price return (distributions not included)` in `fn BT` and its exports, and `Price return` in the pane, whose footer and source line say `price return: distributions not included`: the daily closes are the prices that traded, not adjusted for dividends or fund distributions (HYG's trades fill at its traded prices, about 87 in late 2021), so an income fund's total return is higher than BT's. Splits beyond the provider's adjusted history, borrow, taxes and slippage beyond the stated cost are not modelled either. CAGR needs at least half a year. Volatility and Sharpe use daily returns annualised at the series' bars per year and a zero cash rate: 365 for a 24/7 series such as crypto (daily bars that include both Saturday and Sunday observations), 252 for exchange sessions. The report states it as `365 bars/yr` or `252 bars/yr`. The rolling comparison counts windows of one year of bars (365 or 252) ending on each bar after the first year, so a window spans a calendar year for both, and needs 20 windows. The hit rate sits beside its closed-trade count; with fewer than ten closed trades it says little. Presets use states (`>`, `<`), so a test that begins inside a regime is invested from the first fill; `crosses` waits for a fresh signal. ## Supply chain evidence (SPLC, Pro) SPLC shows suppliers, customers and related entities supported by filings, company announcements, earnings calls and sourced news in Table and Flow views, including reverse disclosures from other companies. Evidence tiers distinguish primary disclosures, reporting and opt-in unconfirmed leads; unconfirmed leads stay outside Flow and disclosed concentrations. Free accounts see three rows per role in each direction with evidence; Pro sees every stored relationship. Permitted original-language quotes, labelled English machine translations, native currency and scale, fiscal periods and source links remain attached to the evidence. Restricted publisher articles expose links without quotes or translated excerpts. See [supply chain methodology](supply-chain.md). Filing coverage is jurisdiction-dependent: US filings, an official Korean API adapter, a Japanese adapter disabled until an API key is available, and Taiwanese company identities from official open data. Taiwan annual-report ingestion remains disabled pending an allowed official API source. Global filing ingestion defaults off; issuer announcements, calls and news retain their separate source coverage. Anonymous customer concentrations stay anonymous; absence of a disclosed relationship does not establish its absence in commerce. ## Known coverage gaps These Bloomberg functions have no Gloom pane yet because the free or licensed sources behind the platform cannot support them honestly: - Corporate bond monitor: FINRA TRACE prints are public, but mapping issuers to CUSIPs needs a security master the platform does not hold. - Swap curve: DTCC SDR publishes swap trades, not a dated par curve; building one needs curve fitting and instrument conventions that are not in place. - Italian and French government curves: no free daily source was found (the Banque de France series need an API key), so `GC` World has no BTP-Bund or OAT-Bund spread. - ETF holdings and flows: issuers publish holdings in per-issuer files with no common format; creation and redemption flows are not published freely. - Supply chain: `SPLC` combines filing disclosures, company announcements, earnings calls and sourced news. Pro includes the full dataset; free accounts receive a preview. Evidence tiers, date, publisher, corroboration and permitted quotes or links accompany each relationship. Unconfirmed leads require an explicit filter and stay separate from disclosed concentrations and flow diagrams. Coverage follows available issuer and publisher evidence globally; US filings use EDGAR. Graph and Path follow up to four disclosed hops with per-hop evidence, explicit search limits and denominator-labelled exposure estimates; they are not a complete commercial supplier register. See [Supply chain evidence](supply-chain.md). - M&A databases: no free structured source. - Level 2 order book: the market data plan supplies trades and NBBO only; `TAS` and `QR` show what is available. ## Credit documents (CRDOC / COVN) Contract terms and revisions retain literal filing quotes, character spans, confidence and reporting dates. Headroom requires matching financial definitions and borrower scope; absent adjustments or stale financials withhold it. Contractual calendar-year maturities retain their native currencies, separate from DDIS fiscal buckets. This is a Pro dataset with evidence-bearing previews. See [credit documents](credit-documents.md) for methodology, coverage and screening limitations. ## Company operating metrics and guidance (KPIS, GUIDE) [Company KPIs and management guidance](company-kpis.md) covers the canonical dictionary, native currencies and fiscal periods, evidence, immutable revisions, range semantics and actual matching. These Pro functions provide a fixed latest preview on Free and complete stored history on Pro. `GUID`, `EM`, `EE` and `ERN` link to them from their pane menus. ## Power and grid capacity (POWER, Pro) POWER combines public interconnection queue snapshots, completion and withdrawal cohorts, large-load requests and approvals, utility exposure, and generation context. Every record preserves units, source dates, observation time, raw evidence and primary links. Free accounts see a limited preview. Historical benchmarks are separate from current queues; rates exclude summary and capacity-segment rows. See [Power and grid capacity](power-grid.md) for regional coverage, history semantics, company links and CLI/REST examples. ## Perpetual markets (Pro) `PERP` provides a board, rankings, a cross-venue comparison and per-market History and Evidence across enabled stock, index, commodity, FX and crypto perpetual contracts. Free accounts receive a fixed preview and latest values; Pro unlocks every market, full rankings and retained history. Raw, eight-hour and annualized funding retain their intervals. Binance, Bybit and OKX contracts also carry each venue's long/short account share, collected hourly since its first collection. Own history is sampled every 5, 15 or 60 minutes by each venue's USD open-interest ranking; new markets are recorded immediately. A separate five-minute baseline cache supports OI changes. Closed-market stock premiums retain a dated underlying reference. See [perpetual methodology and coverage](perpetuals.md) for venue scope, disabled adapters, correction handling, currencies, nulls and exact formulas. ## Exposure engine (EXPO) EXPO is a Pro operating-exposure scenario engine with a one-holding, one-hop free preview. It combines available global company and counterparty disclosures, keeps source evidence and reporting denominators on every path, and reports signed portfolio stress and country/supplier/customer concentrations without predicting equity returns. Geography and supply-chain coverage varies by issuer; missing sensitivities and relationships remain unknown. See [Exposure analysis](exposure.md) for scenarios, signed NAV weights, methodology, source limitations and CLI examples. ## Fails to deliver and weekly off-exchange volume `FTD AAPL` opens the **Fails to deliver** tab of Short Interest (`SI`). Each SEC row is the outstanding fail quantity on its settlement date for one CUSIP. It is not that day's new fails, and quantities must never be added across dates. A symbol may have multiple CUSIPs; the table preserves them. An absent record does not establish zero fails. The reported price is in USD, and the files are published twice monthly with a delay. `ATS AAPL` opens **Weekly ATS/OTC** in the same pane. FINRA OTC transparency publishes weekly shares and trades for alternative trading systems (ATS, including dark pools) and non-ATS venues. **ATS %** divides ATS shares by the published ATS plus non-ATS shares. It is not ATS share of the full market, and these are all trades, not short-sale volume. Missing categories stay blank and do not contribute a fabricated zero or percentage. Reporting weeks are labeled by their Monday start; publication lags depend on the security tier. Open a row for exact quantities or use `o` for its source. Both views are available without signing in, like daily short volume. `gloom fn FTD AAPL --json` and `gloom fn ATS AAPL --csv` export the same observations; `gloom shot FTD AAPL` and `gloom shot ATS AAPL` open the respective tabs. Report metadata includes publication coverage, source dates and any partial-history warnings.