A reading framework for diffing Item 1A across two consecutive 10-Ks. Companies don't add risk factors lightly — every new paragraph in the year's risk section is signal that management decided this matters now. The diff is more useful than the section itself.
Why this works with edgar.tools MCP
A 10-K's Item 1A runs 30-60 risk factors and 8,000-15,000 words. Most of it is the same boilerplate the company has filed for a decade. The signal is the delta — what the company added, removed, expanded, or pulled back from the prior year.
Vanilla LLMs handle this by summarizing whatever they remember of the latest 10-K, which collapses the diff to "they mention competition, regulation, and cybersecurity" — true of every 10-K, useful for none. With edgar.tools MCP both filings are fetched as primary-source text and diffed pair-wise:
company_filings— locate the most-recent two 10-Ks for the issuer.filing_section(risk_factors) — fetch Item 1A from each, full text.material_events— cross-check any added risk against recent 8-Ks that may have prompted it (litigation, restatements, cybersecurity incidents).
The diff grounds every claim in a fetchable section. No invented "they added a new risk about AI" without a specific paragraph in a specific accession.
How to use
Copy the framework below into your Claude / ChatGPT / Gemini conversation. With edgar.tools MCP connected, the model will fetch both filings and walk the diff. Then ask:
Run the Risk-Factor YoY Diff on [TICKER].
The framework (v1.0)
You are an analyst reading the year's 10-K with one specific question: what changed in Item 1A since last year? Every addition, removal, expansion, or rewording in the risk-factor section is the company's CFO and outside counsel telling you what they think mattered enough to litigate over later. Your job is to produce a structured diff.
Non-negotiables
- No invention. Every "added" / "removed" / "expanded" claim must point to a paragraph in a specific accession.
- If a risk is genuinely new, quote 10-20 words verbatim so the user can verify.
- If a risk is rewritten, name the change explicitly (e.g. "added 'including in connection with AI'", "removed the qualifier 'material'").
- If you cannot locate the prior-year 10-K (newly public, foreign issuer, transition year), state so and stop.
Workflow (ordered, mandatory)
Step 1 — Pin both filings
Call company_filings({ company: "[TICKER]", form: "10-K", limit: 3 }). Pin the two most recent accessions. Note:
- Latest 10-K: filing date, FY end, accession
- Prior 10-K: filing date, FY end, accession
- Any 10-K/A (amendment) between them — amendments often carry the substantive Item 1A revisions
If only one 10-K exists (newly public), pin Item 1A of the S-1 or F-1 as the comparison baseline. Mark Confidence: Medium.
Step 2 — Fetch Item 1A from both
Call filing_section({ accession: <latest>, section: "risk_factors" }) and filing_section({ accession: <prior>, section: "risk_factors" }) in parallel. Read both end-to-end before drafting the diff — don't try to diff incrementally section-by-section.
Step 3 — Build the structural diff
Categorize every meaningful change into exactly one of these buckets:
- ADDED — A risk factor present this year that was not present last year, or a substantively new sub-paragraph inside an existing factor heading. Highest signal.
- REMOVED — A risk factor dropped this year that was present last year. Less common; usually signals the underlying exposure has resolved (lawsuit settled, regulatory regime changed, divested business unit).
- EXPANDED — A risk factor present in both years that gained material new content. Includes: new examples, new naming of regulators/counterparties, new dollar amounts, new defensive language. Second-highest signal.
- TIGHTENED — A risk factor present in both years that removed qualifiers ("may", "could", "in some circumstances") or escalated tense (from "could result in" to "has resulted in"). Often subtle but high-information.
- UNCHANGED — Same factor, same language. Don't list these. The whole point of the diff is the delta.
Ignore: typo fixes, internal reordering with no language change, footnote re-numbering.
Step 4 — Cross-reference with recent 8-Ks
For each ADDED or EXPANDED risk, call material_events({ company: "[TICKER]", days: 365 }) once (single call covers all changes) and check whether a recent 8-K likely prompted the change. Common pairings:
- New cybersecurity risk ↔ 8-K Item 1.05 (material cyber incident)
- New litigation risk ↔ 8-K Item 8.01 naming a lawsuit
- New officer-departure risk ↔ 8-K Item 5.02 cluster
- New restatement risk ↔ 8-K Item 4.02 (non-reliance on prior financials)
- New regulatory risk ↔ 8-K Item 8.01 naming an enforcement action or new rule
When you find a pairing, name it. When you don't, say so — an added risk with no 8-K pairing is usually proactive ("we're getting ahead of this").
Step 5 — Identify the 2-3 load-bearing changes
From the categorized diff, pick the 2-3 changes that would actually move your thesis on this company. Heuristics for "load-bearing":
- The change names a specific dollar amount, regulator, counterparty, jurisdiction, or product line.
- The change is tied to a thesis driver (margin, growth, regulation, capital structure).
- The change escalates tense from hypothetical ("could") to actual ("has").
- An ADDED risk with a paired 8-K event (the company is documenting something that already happened).
Skip: changes that are clearly drafting cleanup, generic macroeconomic language additions ("inflation", "geopolitical tensions"), or risks added to mirror peer disclosures without substantive change.
Required output
Produce a structured diff in this exact shape:
[TICKER] — Risk-Factor YoY Diff
Latest: [Form] · Filed [date] · FY[year] — Accession: [link]
Prior: [Form] · Filed [date] · FY[year] — Accession: [link]
DIFF SUMMARY
Added: N risks
Removed: N risks
Expanded: N risks
Tightened: N risks
LOAD-BEARING CHANGES (2-3)
1. [ADDED / EXPANDED / TIGHTENED] — [Risk heading]
What changed: [one sentence + 10-20 word verbatim quote]
Why it matters: [one sentence — connect to thesis driver]
8-K pairing: [accession + item code, or "none"]
2. ...
3. ...
OTHER NOTABLE CHANGES (1-line summaries, optional)
- ADDED: [heading] — [one phrase]
- REMOVED: [heading] — [one phrase]
- EXPANDED: [heading] — [one phrase]
CONFIDENCE: High / Medium / LowStopping conditions
- If only one 10-K exists (newly public), use the S-1's risk section as the baseline and mark Confidence: Medium. Note that S-1 risk factors are typically more candid than 10-K risk factors (different SEC review).
- If the prior-year filing is a 10-K/A (amendment) and the latest is a regular 10-K, diff against the 10-K/A — that's the most-recently-reviewed version.
- If
filing_sectionreturns an empty string forrisk_factorson either filing, the issuer is likely a smaller reporting company exempt from Item 1A. Stop and report Confidence: Low.
What MCP-grounded diff adds
| Diff element | Without MCP | With MCP |
|---|---|---|
| Latest + prior 10-K accessions | Approximated | company_filings returns the actual filings list |
| Full Item 1A text from both | Summarized from training | filing_section(risk_factors) returns the verbatim text |
| Added vs. expanded distinction | Collapsed | Side-by-side text supports the structural diff |
| Verbatim quotes for verification | Hallucinated | Quotes are pulled from the fetched text, citable to accession |
| 8-K pairings for added risks | Guesswork | material_events returns 365 days of items with dates |
The diff is the recipe most worth running on companies where you're long-time-familiar — that's where you're least likely to notice that something changed.
Sample output structure
A complete diff on AAPL (Apple Inc., FY25 10-K vs FY24 10-K) — a stable mega-cap with subtle risk-section evolution — looks like the preview below.
AAPL — Risk-Factor YoY Diff
Latest: 10-K · Filed 2025-10-31 · FY2025 ending 2025-09-27 Accession: `0000320193-25-000079`
Prior: 10-K · Filed 2024-11-01 · FY2024 ending 2024-09-28 Accession: `0000320193-24-000123`
Diff summary — 26 changes
| Bucket | Count |
|---|---|
| Added | 4 risks |
| Removed | 5 risks |
| Materially changed | 17 risks (12 escalated · 5 de-emphasised) |
Load-bearing changes
- ESCALATED — Political events, trade and other international disputes
- What changed: the trade-restriction language moved from hypothetical to actual. FY2025 names the new U.S. tariffs and reciprocal tariffs involving China, India, Japan, South Korea, Taiwan, Vietnam and the EU, and discloses that the "Department of Commerce has initiated an investigation under Section 232 of the Trade Expansion Act of 1962" into "imports of semiconductors, semiconductor manufacturing equipment, and their derivative products."
- Why it matters: hardware COGS and the assembly footprint sit directly under this factor — the margin-side thesis risk, now disclosed as in-progress rather than possible.
- 8-K pairing: none — the trailing-365d 8-K record is earnings (2.02), officer changes (5.02) and the annual vote. Tariff exposure isn't 8-K'd; Item 1A is where it surfaces first.
- ADDED — Personal-data and online-safety law (new heading)
- What changed: new stand-alone factor on data-protection compliance whose obligations list now runs "online safety; age verification; … machine learning and artificial intelligence" — AI and child-safety regimes named as compliance surfaces with penalty exposure.
- Why it matters: converts platform regulation from general legal boilerplate into named per-jurisdiction obligations — the disclosure trail for services-segment regulatory cost.
- 8-K pairing: none. Proactive disclosure.
- ADDED — Net sales and gross margins subject to volatility and downward pressure (new heading)
- What changed: margin pressure promoted to its own headed factor — global pricing pressure, competition, component-cost risk, and the concentration effect of a demand decline in a single key product category.
- Why it matters: a new heading is counsel saying this now warrants individual disclosure; on a company where one product line carries roughly half of revenue, that's the load-bearing admission.
- 8-K pairing: none. Proactive disclosure.
Other notable changes
- ADDED: Dependence on carriers and other resellers — reseller device-financing plans and distribution commitments broken out as their own exposure.
- ADDED: "Varied stakeholder expectations about social and other issues" — ESG-goals factor (missed goals, adverse stakeholder reactions, legal proceedings).
- ESCALATED: Third-party intellectual property — now names machine learning and AI as an infringement surface, including reproduction of copyrighted materials.
- ESCALATED: Confidential-information factor — adds sensitive health and financial data, and stock-price impact.
- ESCALATED: Talent factor — adds immigration, labor/employment and export-control law exposure. Cross-reference the three 5.02 officer-change 8-Ks in the window (2025-12-05, 2026-01-02, 2026-04-20).
Confidence: High Counts from edgar.tools' pairwise Item 1A comparison of the two filings (FY2025 vs FY2024); quotes verbatim from filing_section(risk_factors) on the FY2025 filing; 8-K pairings checked against material_events over 365 days.
Sample captured 2026-08-15 from live calls on the linked filings — refreshed when a new fiscal year makes it stale.
Actual output will vary by ticker. Stable mega-caps like AAPL typically have 2-4 load-bearing changes per year; high-growth or recently-IPO'd issuers can have 10+.
Related
- 10-K Speedrun — when "what's the whole 10-K say" is the question, not just the risks. Use that one first; come back to this when you want to drill on risks specifically.
- 8-K Event Triager — when the diff turns up an added risk with no 8-K pairing, run this to confirm.
- F.O.R.G.E. Framework — when an added risk affects a compounding thesis (per-share economics, capital allocation discipline).