Skill Reference · Meta & Output
Fact Check — Verify the Numbers, Cite the Sources
Claim-level verification of any report or data set — extract every figure and factual claim, check each against a primary source (SEC filing, company IR, FRED, exchange data, or…
Run this skill
/us-stock-analysis:fact-check AAPL@prompts/fact-check.md Evaluate AAPLEvaluate AAPL using the fact-check framework⚠️ Data Verification — Do This Before Any Analysis
Before verifying anything, establish what data each claim actually needs:
- Fetch current price only where a claim needs it — market claims (price, market cap, yield, multiples “today”) are checked against a live quote for the report’s as-of date and today’s; use web search or ask the user. Reported figures, historical comparisons, and
--recomputeruns need no live quote — do not request one, and do not let its absence block them. Never assume a price from training data. - Confirm key figures — for this skill the “key figures” are the sources themselves: the filing (10-K / 10-Q / 8-K / proxy / Form 4 / 13F), the IR release, the FRED series, the exchange or issuer data, or the document the user pasted. Retrieve or request them before judging a single claim. A claim checked against memory is not checked.
- State your data source — fill in the
Data & Sourcesheader (next section) so the origin, as-of date, retrieval path, and confidence of every figure are explicit at the top of the output. - Flag stale data explicitly — if a live quote is needed for a market claim and unavailable, display this warning before proceeding, and mark those claims
❓or🕒rather than guessing:
⚠️ Live data unavailable. The following analysis uses training-data estimates which may be significantly out of date. Verify all prices and metrics before making any decisions.
The warning describes the inputs actually used: when every claim was checked against user-supplied documents, say so instead of implying training-data estimates were involved. Never silently substitute training-data estimates for current prices. When in doubt, ask the user to paste the latest quote.
📋 Data & Sources Header — Open Every Output With It
The first thing in the output is this provenance block, filled in — never left as placeholders. It is the standard documented on the Data & Accuracy page and the first thing result-validator looks for:
Data & Sources
As of: <date the figures represent, e.g. 2026-06-30>
Source: <primary docs — SEC EDGAR 10-K/10-Q, company IR, FRED, exchange data …>
Retrieval: <pasted by user | web/tool retrieval | model memory>
Confidence: <HIGH | MEDIUM | LOW>
Retrieval: model memorymust be paired withConfidence: LOW— memory is a placeholder until confirmed against a primary source.- Mixed sources: list each with its own as-of date rather than blending them.
- Sources disagree on the same figure (a closing price, a deal term): prefer the primary source (SEC filing, company release, exchange data) over an aggregator, then the most recent dated one. Show both values with their sources and dates, say which you used and why, and never average them.
- Data the user pasted is reported as
pasted by user; do not upgrade its confidence beyond what the user’s own source supports.
For this skill the header describes the sources used to verify, not the report being verified — the report’s own header is quoted and judged in Phase 5.
Overview
Every InvestSkill analysis opens with a Data & Sources header, and result-validator scores whether sources are “cited or identifiable”. Neither answers the question a careful reader actually has: is this specific number true, and where exactly does it come from? A report can carry an honest header, a tidy methodology, and a consistent signal — and still be built on a revenue figure from the wrong fiscal year, a margin computed on non-GAAP earnings, or a share count that was stale when the model wrote it.
This skill closes that gap at the level of the individual claim. It takes any report — an InvestSkill output, a broker note, a spreadsheet, a paragraph from a forum post — pulls out every figure and factual assertion, checks each one against a primary source, recomputes every derived number from verified inputs, and hands back three things: a claim ledger with a verdict per claim (✅ verified · ⚠️ mismatch · ❓ unverifiable · 🔁 recomputed · 🕒 stale), a corrected copy of the report with inline citations and a References section, and a Verification Score 0–10 that result-validator can consume as the evidence behind its Data Quality dimension.
Division of labour. result-validator asks is this analysis well built? (methodology, consistency, risk coverage, transparency). fact-check asks are the inputs true? Run this one first when the stakes are real; the validator’s score means little if the numbers underneath it are wrong. learning-coach then explains the result to a beginner.
What it is not. It does not re-run the analysis, form its own view on the stock, or change the report’s signal. It never invents a source to make a claim look verified: an unverifiable claim stays ❓, and a claim that cannot be traced is more honestly left uncited than given a plausible-looking reference. Fabricating a citation is the one failure mode that makes this skill worse than useless — it is a hard-cap-to-zero offence in the score.
1. Modes
| Mode | Invocation | What it does |
|---|---|---|
| Verify (default) | paste the report (+ sources, or permission to retrieve them) | Full ledger, recomputation, consistency check, corrected report with citations, Verification Score |
| Cite | --cite-only + the report + its sources |
Attach inline citations and a References section to figures the sources confirm; no recomputation, no score beyond coverage — for a report you already trust but need to make traceable |
| Recompute | --recompute + the report |
Only the arithmetic: rebuild every derived figure from the reported inputs and flag disagreements — fast, needs no external source |
| Diff | --diff + two versions of a report or two data sets |
Which figures changed, by how much, and whether the change is a restatement, a period roll, or an error |
If a source cannot be retrieved in the environment, the skill says which claims that blocks and asks the user to paste the document — it never fills the gap from memory.
2. Inputs
| Input | Required | Default if unstated |
|---|---|---|
| The report or data to check (pasted, or a file) | ✅ | — |
| Sources: pasted filing text / IR release / data table, URLs, or permission to retrieve | ✅ for Verify and Cite | ask; without sources every claim is ❓ and the score is capped |
| Ticker and fiscal calendar (FY end month) | recommended | infer from the report; state it — half of all “mismatches” are fiscal-year confusions |
| Tolerance for market data (price, market cap) | optional | ±1% and same trading day |
| Which claims are signal-driving (the 3–5 numbers the report’s conclusion rests on) | optional | infer from the report’s own signal box and thesis; state the choice |
| Output form: corrected copy vs. annotated diff | optional | corrected copy with strike-through of originals |
3. Framework
Phase 1 — Extract every claim into a ledger
Read the report once and list every checkable statement — not just the headline numbers. One row per claim:
| # | Claim (as written) | Value · unit · period | Type | Signal-driving? | Where in report |
|---|---|---|---|---|---|
| 1 | “Revenue grew 20% to $6.12B in FY2026” | $6,120M · FY2026 · +20% YoY | reported (filing) | ✅ | §2 Financial Health |
| 2 | “FCF of $930M” | $930M · FY2026 | derived (OCF − capex) | ✅ | §2 |
| 3 | “trades at 24× forward earnings” | 24.2× · as of ? | market × estimate | ✅ | §3 Valuation |
| 4 | “CFO bought $1.2M of stock in May” | $1.2M · 2026-05 | fact (Form 4) | — | §5 Insider |
| 5 | “top customer is 18% of revenue” | 18% · FY2026 | reported (10-K risk factors) | — | §1 |
Claim types decide which source can verify them: reported (a figure stated in a filing or release), derived (computed from reported figures — must be recomputed, not just matched), market (price, market cap, yield — needs an as-of date), estimate (consensus, guidance — needs the source and date of the estimate), macro (rates, CPI — FRED / BLS series and vintage), fact (an event: a filing, a transaction, an appointment), qualitative (a characterization — “dominant”, “improving” — checked for whether the cited evidence supports it, never marked verified on its own).
Mark the signal-driving claims. They carry more weight in the score and a mismatch on one of them changes the report’s standing.
Phase 2 — Source hierarchy
Only a source the reader could open verifies a claim. Rank what you use, and record the tier in the ledger:
| Tier | Sources | Verifies |
|---|---|---|
| 1 — Primary | SEC EDGAR filings (10-K, 10-Q, 8-K, DEF 14A, Form 4, 13F, S-1), the company’s own IR release or presentation, FRED / BLS / BEA series, the exchange’s or ETF issuer’s published data, IRS publications, the fund prospectus / factsheet | reported figures, facts, macro, fund data |
| 1 — User-supplied | The document the user pasted (a filing excerpt, a broker statement, a data export) | its own figures — labelled user-supplied so the reader knows verification stops at the user’s document |
| 2 — Secondary | Reputable financial data vendors and press explicitly quoting a primary document, consensus aggregators for estimates | market data and estimates, with the vendor and date recorded; a reported figure verified only at Tier 2 is marked ✅ (secondary) |
| 3 — Not a source | Model memory, forum posts, uncited summaries, a second AI output | nothing — a claim matched only against these stays ❓ |
Prefer the most specific location: Item and Note number, statement line, table, page. “The 10-K” is a document, not a citation.
Retrieving a Tier-1 source without an API key. When the user grants permission to retrieve and the host can fetch URLs, go straight to SEC EDGAR rather than a summary site: resolve the CIK from https://www.sec.gov/files/company_tickers.json (zero-pad cik_str to 10 digits); list filings from https://data.sec.gov/submissions/CIK##########.json, where filings.recent.form / filingDate / reportDate / accessionNumber / primaryDocument line up by index (10-K, 10-Q, 8-K, DEF 14A, 4 for insider transactions — Form 4s are filed under the issuer’s CIK as well as the insider’s — and 20-F / 6-K for foreign issuers); open the document at https://www.sec.gov/Archives/edgar/data/<CIK without leading zeros>/<accession without dashes>/<primaryDocument>; and cross-check statement figures against the tagged facts at https://data.sec.gov/api/xbrl/companyfacts/CIK##########.json. Send an identifying User-Agent and stay under 10 requests per second. Record Retrieval: web/tool retrieval, the accession number and the filing date. Institutional holdings are the exception to the issuer-CIK route: Form 13F-HR is filed by the investment manager, so it never appears under the target company’s CIK. Resolve the manager (from the claim: “Vanguard holds 8.9%”) to its CIK, list its 13F-HR filings, and verify the position in the information table by the target’s CUSIP — or use EDGAR full-text search (https://www.sec.gov/edgar/search/#/q=%22<company or CUSIP>%22&forms=13F-HR) to find which managers report the security. A 13F verifies one manager’s position at one quarter-end; an aggregate “institutional ownership %” is a secondary-source figure and is marked ✅ (secondary) at best. If the host cannot fetch, ask the user to paste the document — or to run node scripts/fetch-edgar.js <TICKER> --form 10-K / node scripts/fetch-fundamentals.js <TICKER> from the InvestSkill repository and paste the output (Retrieval: pasted by user). A source that could not be retrieved leaves its claims ❓; it is never filled from memory.
Phase 3 — Verify each claim
For each ledger row, locate the figure in the source, compare, and assign one verdict:
| Verdict | Meaning | Rule |
|---|---|---|
| ✅ VERIFIED | The source states the figure | Reported figures: exact, or rounding within 0.5%. Market data: same trading day and within the stated tolerance. Percentages: within 0.1 pp. Record source · location · as-of |
| ⚠️ MISMATCH | The source states a different figure | Record the source value, the delta (absolute and %), and the likely cause — the usual suspects: wrong fiscal year or quarter; TTM vs. fiscal year; GAAP vs. adjusted; basic vs. diluted shares; a restated prior period; a currency or unit slip (thousands vs. millions); a stale price |
| ❓ UNVERIFIABLE | No Tier 1–2 source available | Say what source would settle it. This is not “false” — never let the corrected report read as if the claim were disproven |
| 🔁 RECOMPUTED | A derived figure rebuilt from verified inputs | Show the arithmetic (Phase 4); mark agrees or disagrees (report X, recomputed Y) |
| 🕒 STALE | Verified, but the as-of date is older than the report implies or than 90 days | Verified figure, wrong vintage — give the current value alongside |
A qualitative claim is judged only on whether the evidence the report cites for it holds; it is never ✅ on its own.
Phase 4 — Recompute every derived figure
Never accept a derived number by matching it to a secondary source that may have made the same mistake. Rebuild it from verified inputs and show the work:
Free cash flow = OCF − capex 1,240 − 310 = 930 ✓ report 930
Gross margin = gross profit ÷ revenue 3,550 ÷ 6,120 = 58.0% ✓ report 58%
Revenue growth = rev / prior rev − 1 6,120 ÷ 5,100 − 1 = 20.0% ✓
Net debt = total debt − cash 800 − 1,650 = −850 (net cash) ✓
Market cap = price × shares outstanding 48.20 × 412 = 19,858 (shares outstanding at the price date — not the diluted count used for EPS)
Enterprise value = market cap + debt − cash 19,858 + 800 − 1,650 = 19,008
P/E (trailing) = price ÷ diluted EPS 48.20 ÷ 1.99 = 24.2× ✓ report "24× forward" ✗ — trailing, not forward
FCF yield = FCF ÷ market cap 930 ÷ 19,858 = 4.7%
Payout (FCF basis) = dividends paid ÷ FCF 165 ÷ 930 = 17.7%
Standard checks: FCF, margins, growth rates, per-share figures (which share count?), P/E · P/S · EV/EBITDA · P/FCF (trailing vs. forward, and whose estimate), net debt and EV, payout and yield, ROE / ROIC (state the denominator), any score or weighted composite in the report (do the weights sum to 100%? does the weighted sum match?). Where the report’s definition is ambiguous, say so rather than picking one silently.
Phase 5 — Consistency and honesty of the report itself
- Numbers vs. narrative — does the text say what the tables say? (“margins expanding” next to a table where they fell)
- Internal contradictions — the same figure quoted two ways in two sections.
- Signal vs. score — the signal box’s Score must sit in the band its Signal implies (≥ 6.0 BULLISH · 4.0–5.9 NEUTRAL · < 4.0 BEARISH); a mismatch is a red flag, not a rounding issue.
- The report’s
Data & Sourcesheader vs. what was verifiable — a header claimingRetrieval: web/tool retrieval · Confidence: HIGHover a report whose figures cannot be traced is itself a finding. Quote the header and state whether the verification supports it. - Fabricated or unopenable citations in the report — a reference that does not exist, or a page/Item that does not contain the figure, is the most serious finding this skill can make. Say so plainly.
Phase 6 — Re-issue the report with citations
Produce the corrected copy (or the diff, if asked):
- Every
✅figure gets an inline citation[n]; every🔁 agreesfigure gets the citation of its inputs plus(recomputed). - Every
⚠️figure is corrected in place, with the original struck through:$5.9B$6.12B [1] — and a one-line note on the cause. Never silently change a number. - Every
❓figure is marked[?]and left as written. Every🕒figure keeps its citation and gains(as of <date>; current: <value> [m]). - Qualitative claims whose evidence failed are marked
[unsupported]. - A References section closes the report:
## References
[1] Zephyr Robotics Inc., Form 10-K for FY ended 2026-03-31 — Item 8, Consolidated Statements of Operations, p. 54 (SEC EDGAR, accession 0000000000-26-000000; retrieved 2026-06-30)
[2] Same filing — Item 8, Consolidated Statements of Cash Flows, p. 58
[3] Zephyr Robotics Q4 FY2026 earnings release, 2026-05-14 — segment table (company IR)
[4] Form 4, filed 2026-05-19 — CFO open-market purchase (SEC EDGAR)
[5] User-supplied: price and shares outstanding as of 2026-06-30 close (pasted by user; not independently verified)
Each reference names the document, the exact location, the as-of or filing date, and how it was retrieved. If the environment cannot produce a URL or accession number, say so rather than inventing one.
Phase 7 — Verification Score (0–10)
The headline number measures how much of the report is demonstrably true, not whether the report’s conclusion is right.
| Component | Weight | 10 looks like | 0 looks like |
|---|---|---|---|
| Coverage | 30% | ≥ 95% of claims ✅ or 🔁 agrees |
< 40% |
| Signal-driving accuracy | 30% | Every signal-driving claim verified within tolerance | A signal-driving claim off by > 5% or from the wrong period |
| Recomputation | 15% | Every derived figure agrees | Derived figures disagree or cannot be rebuilt from the report’s own inputs |
| Source quality | 15% | All Tier 1, specific locations | Mostly secondary or user-supplied only |
| Freshness | 10% | Every as-of date matches the report’s claim and is < 90 days old for market data | Stale figures presented as current |
Hard caps (state any that fires): a signal-driving ⚠️ or 🔁 disagrees with delta > 5% → max 4.0 · more than half the claims ❓ → max 5.0 · the report’s own Data & Sources header overstates its retrieval or confidence → max 6.0 · any fabricated or unopenable citation found in the report → 0.0. Always print a Caps fired: line under the score (none, or the list) so a capped 4.0 is never mistaken for an earned 4.0 — a report whose score was capped by a signal-driving mismatch is a failed verification regardless of the number.
Map onto the standard bands: ≥ 6.0 the report’s inputs are sound (BULLISH on the report) · 4.0–5.9 usable with the listed corrections (NEUTRAL) · < 4.0 do not rely on it — re-run the analysis with verified inputs (BEARISH). Hand the score and the ledger to result-validator, whose Data Quality dimension should not exceed what this score supports.
4. Output Format
Data & Sourcesheader — the sources used to verify, with retrieval path- Verification summary — one line:
N claims · V verified · R recomputed (r agree) · M mismatch · U unverifiable · S stale · Verification Score X.X · Caps fired: none | <list> - Signal-driving claims first — the 3–5 that matter, each with verdict, source, and delta
- Claim ledger — the full table from Phase 1 with verdict, source tier, location, as-of
- Mismatches in detail — original · source value · delta · likely cause · what the corrected figure does to the report’s conclusion
- Recomputation table — Phase 4, arithmetic shown
- Report consistency findings — Phase 5, including the judgment on the report’s own header
- Corrected report with citations (or
--diffoutput) and the References section - Thesis Invalidation — what would change these verdicts (below)
- Investment Signal block — mirrors the report’s signal with the verification verdict attached (below)
Example
User: [pastes a stock-eval output on ZEPH that concludes BULLISH 7.4 / 10] Verify every number
and add sources. Here is the FY2026 10-K excerpt and the Q4 release. [pasted]
The assistant lists 23 claims, flags 5 as signal-driving (revenue growth, gross margin, FCF,
net cash, forward P/E). Verifies 17 against the 10-K and the release with Item/statement/page
locations; recomputes 6 derived figures — all agree except one: the report's "24× forward P/E"
is 48.20 ÷ 1.99, i.e. the *trailing* multiple on FY2026 diluted EPS; no forward estimate is
cited, so the claim becomes ⚠️ MISMATCH (label) with the corrected wording "24.2× trailing";
consensus forward EPS would be needed for the forward figure → ❓ until supplied. Two claims
are 🕒 STALE: the price and market cap are from a date 40 days before the report. One
qualitative claim ("dominant share of warehouse robotics") cites no evidence → [unsupported].
The report's own header said "Retrieval: web/tool retrieval · Confidence: HIGH"; 17/23 verified
supports MEDIUM, so that is noted. No fabricated citations. Verification Score 6.8 — the report's
inputs are sound; the signal stands with the valuation sentence corrected. Emits the corrected
report with [1]–[9] inline and a References section, and hands the ledger to result-validator.
Notes
- Run it before
result-validator, not instead of it. This skill checks the inputs; the validator checks the reasoning built on them. The validator’s Data Quality score should never exceed what the Verification Score supports. - Every InvestSkill report is a candidate, but so is anything else the user brings — a broker note, a newsletter, a spreadsheet, a screenshot transcribed to text. The ledger discipline is the same.
- Unverifiable is not false. The corrected copy must never read as if a
❓claim were refuted. The honest output for a claim without a source is the claim, unchanged, with[?]. - Fiscal calendars cause most false mismatches. Establish the fiscal year end and the period each table covers before comparing anything.
- Do not fabricate a reference to fill a gap. No accession number, page, or URL that was not actually seen. If the environment cannot retrieve, ask the user to paste.
- Pairs with:
result-validator(consumes the score),learning-coach(explains the ledger to a beginner),10k-digestandfinancial-report-analyst(produce well-cited inputs in the first place),full-report(run this on the composite before shipping it),thesis-tracker(verify the KPI values before recording them at a check).
Thesis Invalidation
After delivering the analysis signal, specify what would reverse it:
If signal is BULLISH (the report’s inputs verified) — the verdicts break if:
- A new filing restates a figure the report relied on (an 8-K or an amended 10-K/A) — every
✅on that figure becomes🕒until re-checked - A signal-driving figure that was verified at Tier 2 (secondary) is later contradicted by the primary document
- The market-data as-of dates pass 90 days — verified prices become stale prices, and the valuation claims built on them lose their
✅
If signal is BEARISH (the report’s inputs did not verify) — the verdicts break if:
- The user supplies the source that turns the
❓claims into✅— the ledger is re-run, not amended by hand - A mismatch is traced to a period or definition difference the report actually disclosed elsewhere (then it is a labelling issue, not a wrong number — downgrade to a note)
- The report is re-issued by its author with the corrected figures, in which case fact-check the new version, not the old
Re-run this analysis when:
- [ ] The company files its next 10-Q / 10-K, or any 8-K restating prior figures
- [ ] The report is edited or re-generated
- [ ] 90 days pass on any market-data claim
- [ ] Before the report is shared, published, or used to size a position
- [ ]
result-validatorscores Data Quality above what the ledger supports
Standard Signal Output
This skill does not form a view on the stock. Score is always the Verification Score, and Confidence is capped at the tier it supports (≥ 8.0 HIGH · 6.0–7.9 MEDIUM · < 6.0 LOW). The other fields depend on the outcome:
- Verification passed (Score ≥ 4.0 and no signal-driving cap fired —
Caps fired: none, or only the coverage / header caps): Signal, Horizon, Action, and Conviction mirror the verified report’s own, and a line under the box statesMirrors the report's signal — quoted, not re-derived. If a signal-driving claim mismatched by more than 5%, addSignal not supported at stated confidence — re-run the analysis with verified inputs. - Verification failed (Score < 4.0, or the signal-driving mismatch cap fired — even if the capped score reads exactly 4.0 — or a fabricated citation → 0): the box does not carry the report’s Signal or Action forward — an unsupported BUY must not survive into the verification result. Fill
Signal: NEUTRAL · Action: HOLD · Conviction: WEAK · Confidence: LOW, and under the box writeVerification failed — the report's own signal (BULLISH / BUY, quoted) is not supported by its inputs; do not act on it. - For a report with no signal block, fill Signal / Action / Conviction with
n/a.
All analysis concludes with this standardized block:
╔══════════════════════════════════════════════╗
║ INVESTMENT SIGNAL ║
╠══════════════════════════════════════════════╣
║ Signal: BULLISH / NEUTRAL / BEARISH ║
║ Confidence: HIGH / MEDIUM / LOW ║
║ Horizon: SHORT / MEDIUM / LONG-TERM ║
║ Score: X.X / 10 ║
╠══════════════════════════════════════════════╣
║ Action: BUY / HOLD / SELL ║
║ Conviction: STRONG / MODERATE / WEAK ║
╚══════════════════════════════════════════════╝
Score Guide: 8.0–10.0 Strongly Bullish | 6.0–7.9 Moderately Bullish | 4.0–5.9 Neutral | 2.0–3.9 Moderately Bearish | 0.0–1.9 Strongly Bearish Confidence: HIGH (strong data, clear signals) | MEDIUM (mixed signals) | LOW (limited data, conflicting signals) Horizon: SHORT-TERM (1 week–3 months) | MEDIUM-TERM (3 months–1 year) | LONG-TERM (1+ years)
Note: The Score above is the Verification Score — how much of the report is demonstrably true — mapped onto the standard scale for cross-skill comparability. When verification passes, Signal, Horizon, Action, and Conviction are the verified report’s own, quoted unchanged; when it fails, they are replaced by NEUTRAL / HOLD / WEAK so that no unsupported call is carried forward.
Disclaimer: Educational analysis only. Not financial advice. Verification is limited to the sources available at run time; an unverifiable claim is neither confirmed nor refuted.