# Earnings Desk > Paste the quarterly results release you have just been handed together with the estimates you > carried into it, and work the print in one sitting: score the beat or the miss and say where it > came from, bridge the guidance from the old numbers to the new, write the desk note, and test the > case you were holding against what the quarter actually did. URL: https://earnings-desk.skillsafe.ai/ API: https://earnings-desk.skillsafe.ai/api.html Tokens: https://earnings-desk.skillsafe.ai/tokens.html Model: gpt-terra (resolves to gpt-5.6-terra) · metered, priced per run, free to estimate Earnings Desk is a reading tool for professionals working their own material. It is not investment advice, not a recommendation and not a research report. It never issues a rating, a price target or a buy/sell/hold call, and the prompt forbids the model from originating one. ## What it takes as input One work object: the quarterly results release the user has in front of them. It may be a press release, a results table, an extract from a pack, or all three in one paste. Files can also be dropped onto the page; they are read with FileReader in the browser and never uploaded. Three optional companions, all over the same quarter: - the user's own estimates, and consensus if they have it, as any kind of table - the guidance the company gave last time, so the bridge is computed rather than guessed at - the thesis the user was holding, written as pillars ## What runs for free, in your browser, before anything is sent - **Identity masking, first.** Company legal names, exchange-qualified tickers and cashtags, named executives, email addresses and phone numbers are replaced with placeholders. The dictionary is learned once across every field and then applied to every field — including the user's own notes and thesis, where a bare "Acme" carries no legal suffix for a pattern to find. The scan itself runs on the masked text, so no field of the run input can carry an identity by construction. - **A leak gate that blocks rather than warns.** Every string reachable from the assembled request is walked and checked against the literals masking replaced. A survivor disables the run button; nothing is sent. A warning would put the decision on a user who cannot see the request body. - Every reported figure, read from markdown, pipe, tab, comma and fixed-width tables as well as from the prose of a press release, with its period and its sign convention. - The pack's own scale declaration — "in millions", "in thousands" — applied to bare cells, with per-share lines exempted, because "in millions, except per share data" is the standard caption. - The estimate table joined to the reported lines on canonical metric names, so "net sales" and "total revenue" are one row and "adjusted EPS" and "diluted EPS" are deliberately two. - Surprise arithmetic against both the user's estimate and consensus, with the tolerance derived from the precision each estimate was written to rather than a fixed epsilon. Cost lines are scored with the sign inverted, so spending less than estimated reads as a beat. - Year-over-year growth, computed — and refused where the base was a loss, because "up 340%" off a negative base is the classic release-writing error and computing it would launder it. - Guidance sentences parsed into ranges, floors, ceilings and points, then compared with the prior guide to give raised / lowered / reaffirmed / narrowed and the size of the move. - About twenty internal-consistency lints: the operating income bridge, the margin the release states against the margin its own figures give, EPS against net income and the diluted share count, a growth rate quoted in prose against the growth its own table produces, unreconciled non-GAAP adjustments, mixed negative-number conventions, a buyback flattering EPS, and an EPS beat sitting on top of a revenue miss. ## Tri-state findings, which is the part most tools get wrong Every flag carries a confidence of `high` or `unknown`, derived centrally and never by the rule itself: - a lint with **evidence in the paste** is definite — "gross profit minus operating expenses does not reach the reported operating income" is true of the text whatever else was left out; - a lint asserting **absence across the whole document** is `unknown` — "no segment detail" is a claim about the paste, not about the company, because the user may have pasted an excerpt. The prompt requires the model to answer every flag by id and forbids it from upgrading an `unknown` into a claim about what the company disclosed. The coverage map the app publishes is tri-state for the same reason: `true`, `false` and `"unknown"` are three different claims, and a user acts on `false`. ## The four lanes Every lane takes the same work object and the same prescan facts, and routes on a `task` field. | task | what it produces | | --- | --- | | `scorecard` | the beat/miss table, the quality-of-earnings checks, and where the beat came from | | `guidance` | every guide, the move, and how much of a raise is only the beat flowing through | | `note` | the desk note, with every figure sourced and the gaps marked rather than filled | | `thesis` | each pillar of the stated case tested, with silence marked unsettled, not confirmed | Lane A hands to lane B with a button: the scorecard pre-fills the guidance lane, the bridge pre-fills the note, the note pre-fills the thesis check. ## Output contract One JSON object per run, the same envelope in every lane: `lane`, `title`, `verdict`, `headline`, `summary`, `checks[]`, `findings[]`, `lines[]`, `artifact`, `artifact_json`, `coverage_check[]`, `questions[]`, `confidence`. Every key is always present; an empty section is `[]`, `""` or `{}`, never null and never omitted. A stream cut short still renders whatever parsed, counted against that lane's own required sections so a complete reply never reports itself damaged. ## Sources Derived from the equity-research and financial-services skills in `anthropics/financial-services-plugins`: - `@anthropics/earnings-analysis` — the scorecard lane - `@anthropics/model-update` — the guidance lane - `@anthropics/morning-note` — the note lane - `@anthropics/thesis-tracker` — the thesis lane ## Privacy Everything the prescan does runs in the browser. With masking on, identities are replaced before the scan runs and the assembled request is checked for survivors before it can be sent. Run history is stored in a declared collection against the signed-in user's own account, mirrored in localStorage for instant paint, and the text stored with a run is the masked text.