<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jared Ablon</title>
    <description>The latest articles on DEV Community by Jared Ablon (@jared_ablon_f27e6e2896913).</description>
    <link>https://dev.to/jared_ablon_f27e6e2896913</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3930408%2Fb2dc5b12-5588-4948-a330-59c20c1a8e02.png</url>
      <title>DEV Community: Jared Ablon</title>
      <link>https://dev.to/jared_ablon_f27e6e2896913</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jared_ablon_f27e6e2896913"/>
    <language>en</language>
    <item>
      <title>I Open-Sourced the SEC 8-K Classifier Powering My Forensic Tool — Here's the Taxonomy</title>
      <dc:creator>Jared Ablon</dc:creator>
      <pubDate>Fri, 03 Jul 2026 02:32:00 +0000</pubDate>
      <link>https://dev.to/jared_ablon_f27e6e2896913/i-open-sourced-the-sec-8-k-classifier-powering-my-forensic-tool-heres-the-taxonomy-237l</link>
      <guid>https://dev.to/jared_ablon_f27e6e2896913/i-open-sourced-the-sec-8-k-classifier-powering-my-forensic-tool-heres-the-taxonomy-237l</guid>
      <description>&lt;h1&gt;
  
  
  I Open-Sourced the SEC 8-K Classifier Powering My Forensic Tool — Here's the Taxonomy
&lt;/h1&gt;

&lt;p&gt;Most of what makes a SEC 8-K interesting is what's &lt;em&gt;not&lt;/em&gt; in the item list. Corporate filers routinely bury Item 1.03 bankruptcy-adjacent language inside an Item 8.01 "Regulation FD" disclosure, or slide an Item 3.01 delisting notice into an otherwise-routine investor update. The item-list header is a filter, not the truth.&lt;/p&gt;

&lt;p&gt;I built a classifier that parses the body text of every 8-K and reclassifies mismatches — outputting a &lt;code&gt;buried_json&lt;/code&gt; field for every filing that shows what items the &lt;em&gt;body&lt;/em&gt; actually references vs. what items the filer &lt;em&gt;marked&lt;/em&gt;. It's the engine behind the &lt;a href="https://filingfirehose.com/forensic" rel="noopener noreferrer"&gt;FilingFirehose forensic scoring tool&lt;/a&gt;, and I open-sourced it because the algorithm should be auditable.&lt;/p&gt;

&lt;p&gt;Repo: &lt;strong&gt;&lt;a href="https://github.com/jaablon/buried-events-parser" rel="noopener noreferrer"&gt;github.com/jaablon/buried-events-parser&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MIT-licensed. Pure Python. Zero LLM calls in the classifier itself (the taxonomy runs deterministically; LLMs only enter later in the pipeline for narrative synthesis).&lt;/p&gt;

&lt;h2&gt;
  
  
  The taxonomy
&lt;/h2&gt;

&lt;p&gt;There are 25 numbered items in a 8-K filing (1.01 through 9.01). The classifier maintains a per-item lexicon of trigger phrases and sub-item patterns.&lt;/p&gt;

&lt;p&gt;Some illustrative examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Item 1.03 (bankruptcy / receivership):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct triggers: "voluntary petition", "chapter 11", "chapter 7", "receiver appointed", "trustee appointed"&lt;/li&gt;
&lt;li&gt;Contextual triggers: "restructuring support agreement", "DIP financing", "plan of reorganization"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Item 5.02 (officer / director events):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct triggers: "resignation of", "termination of", "appointment of", specific role words paired with departure verbs&lt;/li&gt;
&lt;li&gt;Cluster detection: multiple 5.02s within a 30-day window flag "departure cluster" separately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Item 8.01 (other events):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The catchall. This is where filers hide anti-signals from search-crawlers. The classifier is most aggressive here — any 1.03/2.04/3.01/5.02 language in an 8.01 body gets tagged as &lt;code&gt;buried_1_03&lt;/code&gt;, &lt;code&gt;buried_2_04&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Item 3.01 (listing standard / transfer notice):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct triggers: "notification of failure", "continued listing", "listing standard", "grace period", "delisting"&lt;/li&gt;
&lt;li&gt;Presence of a standalone 3.01 filing (without other items) is itself a high-signal event — most companies file 3.01s alongside placeholder items to reduce visibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The interesting failure modes
&lt;/h2&gt;

&lt;p&gt;Two edge cases you learn about the hard way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amendments (10-K/A, 10-Q/A):&lt;/strong&gt; These are technically not 8-Ks but they carry Item 4.02 restatement disclosures. The classifier handles them by walking the amendment cover page for the "restated" keyword pattern before falling through to the body scan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foreign private issuers (20-F, 6-K):&lt;/strong&gt; They don't use 8-K item codes at all — they follow SEC form-based disclosure. The classifier translates 6-K materiality flags into the closest 8-K item equivalent so the scoring pipeline downstream doesn't need to know about the alternate form.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why open source
&lt;/h2&gt;

&lt;p&gt;Every claim in the paid &lt;a href="https://filingfirehose.com/reports" rel="noopener noreferrer"&gt;$49 forensic report&lt;/a&gt; is tied to a specific EDGAR accession number and a specific classifier output. Anyone who reads the report — customer, journalist, opposing counsel, whoever — can pull the source filing themselves and run it through the classifier locally. Zero trust required in the LLM narrative layer.&lt;/p&gt;

&lt;p&gt;That's the trade I want to make explicit: the &lt;em&gt;scoring&lt;/em&gt; is auditable by anyone. What you pay $49 for is the narrative synthesis, the executive summary, the accession-cited red-flag catalog, and the "what changes next" section. You're paying for the &lt;em&gt;reading&lt;/em&gt;, not the &lt;em&gt;counting&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next thing I want to build
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cross-filing correlation.&lt;/strong&gt; Right now the classifier operates on one filing at a time. But the most-interesting SEC disclosure risks are patterns &lt;em&gt;across&lt;/em&gt; filings — a 5.02 cluster, an S-3 followed by a 424B5, a 10-K/A restatement following an auditor 5.02. The next release will emit a per-issuer time series so downstream tools can detect these patterns programmatically.&lt;/p&gt;

&lt;p&gt;If you're building anything in the SEC-data or fintech space and want to plug this into your pipeline, the code is above. If you want the tool that consumes it end-to-end, &lt;a href="https://filingfirehose.com/forensic" rel="noopener noreferrer"&gt;FilingFirehose Forensic&lt;/a&gt; is free to try — paste any US ticker, get a risk score in 3 seconds, then optionally buy the $49 full report on the same ticker.&lt;/p&gt;

&lt;p&gt;Feedback on the taxonomy welcome. What SEC filing signals do you key on that I should add?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nothing here is investment advice. The classifier surfaces disclosure-language patterns; deciding what to do with those signals is your job, not the tool's.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>fintech</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The One SEC Form That Reveals Dilution Before It Hits Your Position — and How I Auto-Scan It</title>
      <dc:creator>Jared Ablon</dc:creator>
      <pubDate>Wed, 01 Jul 2026 21:55:48 +0000</pubDate>
      <link>https://dev.to/jared_ablon_f27e6e2896913/the-one-sec-form-that-reveals-dilution-before-it-hits-your-position-and-how-i-auto-scan-it-d3f</link>
      <guid>https://dev.to/jared_ablon_f27e6e2896913/the-one-sec-form-that-reveals-dilution-before-it-hits-your-position-and-how-i-auto-scan-it-d3f</guid>
      <description>&lt;h1&gt;
  
  
  The One SEC Form That Reveals Dilution Before It Hits Your Position — and How I Auto-Scan It
&lt;/h1&gt;

&lt;p&gt;Every retail trader learns the hard way that some 10-15% overnight gaps come out of nowhere, unrelated to news. It's shelf-registered dilution. The company filed an S-3 months ago, then quietly executed on it via a 424B5 or 424B3 the night before. By the time the volume shows up, the price is already gone.&lt;/p&gt;

&lt;p&gt;Here's the mechanic and the thing I built to catch it before you're in the trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two-filing dance
&lt;/h2&gt;

&lt;p&gt;An S-3 registration is a company saying "I &lt;em&gt;might&lt;/em&gt; sell more stock later." No shares issued yet, no immediate dilution — but the shelf is now loaded.&lt;/p&gt;

&lt;p&gt;The 424B5 (and 424B3) is a company saying "I &lt;em&gt;am&lt;/em&gt; selling shares now, off the shelf I registered earlier." That's the actual dilution event. It's technically a prospectus supplement, but the market reads it as "the ATM machine just fired."&lt;/p&gt;

&lt;p&gt;The gap between the S-3 and the 424B5 can be days or years. That's the window where you can front-run the dilution &lt;em&gt;if you're watching the filings.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can pull all of it from SEC EDGAR for free. But EDGAR gives you a firehose of 10,000+ filings a day and no way to say "just show me the 424B5s that landed on tickers I'm holding, and only if the raw amount is more than 5% of float."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;A polling service that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Watches EDGAR's atom feed every 60 seconds for new 8-K, S-3, 424B5, and 424B3 filings.&lt;/li&gt;
&lt;li&gt;Parses the 424B5 body for the offering size and cross-references it against float from EDGAR's XBRL structured facts.&lt;/li&gt;
&lt;li&gt;Scores each ticker on a proprietary red-flag taxonomy (dilution proximity, listing-standard notices, officer clustering, cyber Item 1.05, bankruptcy language). LOW/MODERATE/ELEVATED/HIGH bands.&lt;/li&gt;
&lt;li&gt;Ships a $49 forensic report per ticker with every flag cited to the exact EDGAR accession number.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The scoring engine is the interesting part. Half of what looks like "sudden news" is actually a signal that was sitting in a prior 8-K three weeks earlier — an Item 5.02 officer departure, a buried 8.01 disclosure, an S-3 shelf registration. The tool assembles the narrative &lt;em&gt;before&lt;/em&gt; the market does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What one looks like
&lt;/h2&gt;

&lt;p&gt;Ten pre-generated sample reports on tickers most retail traders already watch — AAPL, NVDA, TSLA, COIN, GME, PLTR, MSFT, SOFI, JPM, AMC — are here: &lt;a href="https://filingfirehose.com/reports/samples" rel="noopener noreferrer"&gt;https://filingfirehose.com/reports/samples&lt;/a&gt;. No paywall. They're identical in format to what a paying customer receives on any ticker.&lt;/p&gt;

&lt;p&gt;If you want one on a specific ticker you're watching, that's the &lt;a href="https://filingfirehose.com/reports" rel="noopener noreferrer"&gt;$49 report&lt;/a&gt;. One-time, no subscription, no-signals refund guarantee — if the engine finds zero red flags on your ticker, you get the $49 back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dev side
&lt;/h2&gt;

&lt;p&gt;A few implementation notes for anyone building similar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Never do parquet scans inside a request handler.&lt;/strong&gt; I tried "wrap the scan in a threaded timeout" and took production down for 45 minutes when the polars binary held a futex lock across the timeout. Now every heavy scan is a nightly precompute → JSON blob → request handler just reads the blob. Response times dropped from 3s p99 to 8ms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cite everything.&lt;/strong&gt; An LLM-written brief that says "we found dilution risk" is useless. One that says "see accession &lt;code&gt;0001193125-25-107824&lt;/code&gt;, an S-3 shelf registration for $500M filed on 2025-04-12, followed by a 424B5 on 2025-06-03 for $60M" is forensically defensible. Every claim in the paid report links to the source filing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust the LLM for synthesis, not for extraction.&lt;/strong&gt; Accession numbers, item codes, and dates come from a deterministic parser. The LLM only assembles the narrative. This avoids the "the AI made up a filing" credibility death spiral.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The classifier is open-source.&lt;/strong&gt; &lt;a href="https://github.com/jaablon/buried-events-parser" rel="noopener noreferrer"&gt;github.com/jaablon/buried-events-parser&lt;/a&gt; — MIT-licensed, pure Python, zero LLM. You can audit exactly how the 8-K item classifier works before trusting any output from the paid tool.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;US SEC filings only. No international.&lt;/li&gt;
&lt;li&gt;Forensic &lt;em&gt;disclosure&lt;/em&gt; signals, not fundamentals. If you want DCF models and 15-year historical financials, use &lt;a href="https://tikr.com" rel="noopener noreferrer"&gt;TIKR&lt;/a&gt; or &lt;a href="https://stockanalysis.com" rel="noopener noreferrer"&gt;StockAnalysis.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;No live chat / community. It's a report, not a subscription.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're deep in SEC filing analysis and think there's a signal class I'm missing from the taxonomy — reply here or hit me at &lt;a href="mailto:jared@filingfirehose.com"&gt;jared@filingfirehose.com&lt;/a&gt;. Genuinely want feedback from other people who spend time in EDGAR.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nothing in this post is investment advice. Dilution-risk detection is a disclosure-language read, not a recommendation to buy or sell any stock mentioned.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fintech</category>
      <category>showdev</category>
      <category>stocks</category>
    </item>
    <item>
      <title>I Built a SEC Disclosure-Risk Audit Tool — Here's What It Found on a Real Ticker (SNBR)</title>
      <dc:creator>Jared Ablon</dc:creator>
      <pubDate>Sun, 28 Jun 2026 03:53:30 +0000</pubDate>
      <link>https://dev.to/jared_ablon_f27e6e2896913/i-built-a-sec-disclosure-risk-audit-tool-heres-what-it-found-on-a-real-ticker-snbr-24c7</link>
      <guid>https://dev.to/jared_ablon_f27e6e2896913/i-built-a-sec-disclosure-risk-audit-tool-heres-what-it-found-on-a-real-ticker-snbr-24c7</guid>
      <description>&lt;h1&gt;
  
  
  I Built a SEC Disclosure-Risk Audit Tool — Here's What It Found on a Real Ticker (SNBR)
&lt;/h1&gt;

&lt;p&gt;I've been building &lt;a href="https://filingfirehose.com" rel="noopener noreferrer"&gt;FilingFirehose&lt;/a&gt; for the past few months — a tool that ingests every SEC 8-K, 10-K, 10-Q, S-3, and 13D filing in real time and scores each issuer for disclosure risk. This week I shipped the first end-to-end "audit" deliverable: a 12-page forensic write-up on a single ticker, with every red flag traced back to a specific EDGAR accession number.&lt;/p&gt;

&lt;p&gt;I want to walk through the actual audit it generated on &lt;strong&gt;Sleep Number Corp (SNBR)&lt;/strong&gt; — a real, mid-cap, publicly traded company — because the patterns it surfaced are a useful illustration of what's hiding in plain sight in routine 8-K cadence.&lt;/p&gt;

&lt;p&gt;The full sample is public: &lt;strong&gt;&lt;a href="https://filingfirehose.com/audit/sample/SNBR" rel="noopener noreferrer"&gt;https://filingfirehose.com/audit/sample/SNBR&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The TL;DR
&lt;/h2&gt;

&lt;p&gt;The system pulled SNBR's last four quarters of SEC filings, ran them through a red-flag taxonomy I built (bankruptcy proximity, delisting notices, dilution proximity, restatement risk, officer departure clustering, cyber-incident disclosure, going-concern language, activist 13D filings), and produced this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SNBR — ELEVATED risk band.&lt;/strong&gt; 7 distinct signals across an 8-K cluster filed late May through mid-June 2026. Trajectory: worsening.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The interesting part isn't the score. It's the &lt;em&gt;pattern&lt;/em&gt; it caught — one that any short-side analyst would also catch within 10 minutes of looking, but that most retail traders and even some IROs miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;Three things happened in a 21-day window:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;May 27, June 2, June 10&lt;/strong&gt; — three consecutive 8-K filings each carrying Item 5.02 (officer/director events). Short-side desks treat clustered 5.02s as a "departure cluster" regardless of the stated reason.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;June 12&lt;/strong&gt; — a single 8-K carrying Items 1.01, 1.03, 2.04, 7.01, &lt;em&gt;and&lt;/em&gt; 9.01. The presence of &lt;strong&gt;Item 1.03 (bankruptcy / receivership)&lt;/strong&gt; alongside &lt;strong&gt;Item 2.04 (triggering events accelerating a financial obligation)&lt;/strong&gt; is one of the highest-signal item-mixes in the 8-K vocabulary. It rarely shows up benignly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;June 17&lt;/strong&gt; — a standalone Item 3.01 filing. Item 3.01 is the notice category used for "notification of delisting or failure to satisfy a continued listing rule." Standalone 3.01s are uncommon and are the first item outside readers scan for.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Taken individually, none of these &lt;em&gt;necessarily&lt;/em&gt; means anything bad. Taken as a sequence — 5.02 cluster → embedded 1.03 with 2.04 → standalone 3.01 — they form a single narrative that an experienced short-side reader will instantly assemble.&lt;/p&gt;

&lt;p&gt;That's what the audit does: it does the assembly for you, names the narrative, cites each filing, and tells you what an outside reader is seeing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works (high level)
&lt;/h2&gt;

&lt;p&gt;This is the open-source-ish stack I'm running on Fly.io:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EDGAR full-text feed (polled every 60s)
  ↓
Parquet store of every filing back to 2023
  ↓
Taxonomy classifier (8-K item parsing + buried_json extraction)
  ↓
Per-ticker risk-signal aggregator
  ↓
Claude Opus prompt with the signal list + full context
  ↓
Structured JSON → HTML PDF + Loom-style narration script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few decisions I made that worked out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pre-compute risk scores nightly&lt;/strong&gt; instead of computing on request. Stripping parquet scans out of the request handler took the p99 response time from 3s to 8ms. Lesson: never do heavy compute in a web request, even if you "wrap it in a thread with a timeout." I tried that and it took the production app down for 45 minutes one afternoon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cite every claim to an EDGAR accession number.&lt;/strong&gt; An audit that says "we found dilution risk" is useless. An audit that says "see accession 0000950103-26-008891, Item 7.01, where the company filed an Item 1.03 reference embedded in a Regulation FD disclosure" is forensically defensible. Every red flag in the deliverable links to the source filing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust the LLM for synthesis, not for fact-extraction.&lt;/strong&gt; The accession numbers, item codes, and dates come from a deterministic parser. The LLM is only used to assemble the narrative. This avoids the "the AI made up a filing" failure mode that kills credibility instantly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the Free Tool Does
&lt;/h2&gt;

&lt;p&gt;If you want to try the underlying scoring engine on any US ticker — no signup, no email — it's at &lt;a href="https://filingfirehose.com/forensic" rel="noopener noreferrer"&gt;filingfirehose.com/forensic&lt;/a&gt;. Type a ticker, hit go, get a score band + breakdown in about 800ms.&lt;/p&gt;

&lt;p&gt;The full audit deliverable (12-page PDF + every accession cited + executive summary + outside-reader interpretation) is a one-time $497 product for IROs, CFOs, and audit committees who want to know what an outside analyst is seeing in their filings &lt;em&gt;before&lt;/em&gt; the outside analyst writes the article. It's at &lt;a href="https://filingfirehose.com/audit" rel="noopener noreferrer"&gt;filingfirehose.com/audit&lt;/a&gt; if you want to see the landing — or just read the SNBR sample to see what one looks like in the real world.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Build Next
&lt;/h2&gt;

&lt;p&gt;Two things on the roadmap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sector-comparative scoring&lt;/strong&gt; — instead of an absolute score, show "you're in the 87th percentile of disclosure risk among small-cap consumer goods companies." Context beats absolutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Earnings-call language drift detection&lt;/strong&gt; — pair the 8-K signal stream with transcript embeddings, surface when management's framing diverges from the filing language. This is where short-sellers actually find alpha.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you build forensic analysis tools or run a small-cap research desk, would genuinely love to hear what signals you key on that I should add to the taxonomy. Reply here or hit me at &lt;a href="mailto:jared@filingfirehose.com"&gt;jared@filingfirehose.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The SNBR audit is real and public. Nothing in this post is investment advice. The "ELEVATED risk band" is a disclosure-language read on routine SEC filings, not a financial conclusion or a recommendation to short the stock.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fintech</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>I parsed 4,251 SEC 8-K filings — 7.3% have buried material events nobody surfaces</title>
      <dc:creator>Jared Ablon</dc:creator>
      <pubDate>Thu, 14 May 2026 04:40:13 +0000</pubDate>
      <link>https://dev.to/jared_ablon_f27e6e2896913/i-parsed-4251-sec-8-k-filings-73-have-buried-material-events-nobody-surfaces-5c8o</link>
      <guid>https://dev.to/jared_ablon_f27e6e2896913/i-parsed-4251-sec-8-k-filings-73-have-buried-material-events-nobody-surfaces-5c8o</guid>
      <description>&lt;h2&gt;
  
  
  The wedge
&lt;/h2&gt;

&lt;p&gt;US public companies file Form 8-K to disclose material events between quarterly reports. Each 8-K has one or more &lt;strong&gt;item codes&lt;/strong&gt; indicating &lt;em&gt;what&lt;/em&gt; the event is — Item 1.05 for a material cybersecurity incident, Item 5.02 for a director or officer departure, Item 1.01 for a definitive material agreement, and so on.&lt;/p&gt;

&lt;p&gt;There's also a catch-all: &lt;strong&gt;Item 8.01 ("Other Events")&lt;/strong&gt;. The SEC's instructions explicitly say that if a more specific item applies, you should use that instead. In practice, filers chronically use Item 8.01 to disclose events that fit a more specific item — sometimes innocently, sometimes to bury the disclosure.&lt;/p&gt;

&lt;p&gt;Most SEC data APIs trust the filer-reported item codes. &lt;strong&gt;We re-classify from the body text and surface the discrepancies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://filingfirehose.com" rel="noopener noreferrer"&gt;FilingFirehose&lt;/a&gt; (a productized SEC EDGAR JSON API) and ran the body-text classifier over 4,251 8-K filings filed in a 21-business-day window. Findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;7.3%&lt;/strong&gt; of Item 8.01 filings contain body language strongly suggesting a more specific item code&lt;/li&gt;
&lt;li&gt;Top suspected misclassifications: Item 1.01 (material agreement, 27 cases), Item 3.01 (notice of delisting, 17), Item 1.05 (cyber, 5), Item 5.02 (officer departure, 3), Item 2.01 (acquisition, 3), Item 1.03 (bankruptcy, 3)&lt;/li&gt;
&lt;li&gt;Item 7.01 (Reg FD) shows a similar pattern: 4.0% of those have body language suggesting another item should have been used&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;For three audiences specifically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance teams.&lt;/strong&gt; The SEC's 2023 cybersecurity disclosure rule explicitly flags Item 1.05 misclassification as a violation. Recent enforcement actions cite this exact pattern (a company filing a cyber breach under 8.01 when 1.05 was required). If you're monitoring competitor or watchlist filings, knowing which 8.01 filings actually contain cyber language gives you a real-time risk signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quant analysts running event-driven strategies.&lt;/strong&gt; Classification noise on filer-reported items is a known problem. The body-text classification is itself a free signal — companies that bury events under 8.01 may be doing so to delay market reaction, which means the price-impact lag is longer than naive item-code monitoring would suggest. Strategies that key off the &lt;strong&gt;discrepancy&lt;/strong&gt; between filer-reported items and body-detected items have an alpha source most consumers miss entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fintech journalists.&lt;/strong&gt; Item 8.01 filings are where the buried news lives. Manually reading every 8-K's body for cyber, officer, or material-agreement language is a Sunday-afternoon job. We do it automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline
&lt;/h2&gt;

&lt;p&gt;The whole thing is ~2k LOC of Python. Stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EDGAR poller&lt;/strong&gt;: standard SEC &lt;code&gt;getcurrent&lt;/code&gt; atom feed at 2-second cadence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filing fetch&lt;/strong&gt;: per-filing HTML body via &lt;code&gt;requests&lt;/code&gt; (cached aggressively — EDGAR rate-limits at 10 req/s)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body extraction&lt;/strong&gt;: BeautifulSoup with custom rules for the SEC's idiosyncratic HTML&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classification&lt;/strong&gt;: deterministic regex + keyword + co-occurrence rules. No transformer. Domain phrases are specific enough that rule-based beats LLM accuracy on this task, with no per-filing inference cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Polars LazyFrames over a partitioned Parquet store (form_type / date). The classifier output stored as a JSON column alongside the parsed metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-runs nightly&lt;/strong&gt;: full body-text re-parse with current rules; results overwrite the JSON column.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sample classifier rule for Item 1.05 (cyber):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_item_105&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Detect material cybersecurity incident language.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;body_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;has_breach_lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body_lower&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;material cybersecurity incident&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unauthorized access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data exfiltration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ransomware&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cyber attack&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cybersecurity event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;has_temporal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body_lower&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on [date]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;we became aware&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;discovered on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;identified on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;has_materiality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body_lower&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;material&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;significant impact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;operations were affected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;has_breach_lang&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;has_temporal&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;has_materiality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Real implementation has more rules + scoring. False positive rate on a 50-filing manual audit: ~12%. False negative rate on 100 unflagged filings: 1%.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The output
&lt;/h2&gt;

&lt;p&gt;Every 8-K record in our API includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accession_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0001234567-26-001234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Corp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-10T16:00:00-04:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filer_reported_items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"8.01"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detected_items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"8.01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.05"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discrepancy_items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"1.05"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"suspected_buried_events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"reported as Item 8.01 but body suggests Item 1.05"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;discrepancy_items&lt;/code&gt; field is the difference between detected and reported. The &lt;code&gt;suspected_buried_events&lt;/code&gt; field is a human-readable string explaining the flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to query it
&lt;/h2&gt;

&lt;p&gt;The free public tier covers the past 72 hours, no API key required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# All 8-Ks with suspected buried events from the last 72h&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://filingfirehose.com/v1/public/8k?suspected_buried_only=true"&lt;/span&gt;

&lt;span class="c"&gt;# Filter by item code&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://filingfirehose.com/v1/public/8k?items=1.05"&lt;/span&gt;

&lt;span class="c"&gt;# Recent activist 13D filings (separate endpoint)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://filingfirehose.com/v1/public/13d?activist=Saba"&lt;/span&gt;

&lt;span class="c"&gt;# Recent ATM offerings on S-3/424B5&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://filingfirehose.com/v1/public/atm?min_shelf_million_usd=100"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the full archive (10+ years) + webhook delivery + 10× rate limit, there's a &lt;a href="https://filingfirehose.com/trial" rel="noopener noreferrer"&gt;free 14-day Pro trial&lt;/a&gt;, no card required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Today's flagged filings&lt;/strong&gt;: &lt;a href="https://filingfirehose.com/today" rel="noopener noreferrer"&gt;filingfirehose.com/today&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public leaderboard&lt;/strong&gt; of companies ranked by buried-event rate: &lt;a href="https://filingfirehose.com/leaderboard" rel="noopener noreferrer"&gt;filingfirehose.com/leaderboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-ticker pages&lt;/strong&gt;: filingfirehose.com/sec/{TICKER} for any listed US company&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methodology piece&lt;/strong&gt;: &lt;a href="https://filingfirehose.com/research/buried-events" rel="noopener noreferrer"&gt;filingfirehose.com/research/buried-events&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; for Claude Desktop / Cursor / Windsurf: add &lt;code&gt;https://filingfirehose.com/mcp&lt;/code&gt; to your config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT custom GPT&lt;/strong&gt;: &lt;a href="https://chatgpt.com/g/g-6a00c51251c08191ad99bf16dc80f4b3-filingfirehose" rel="noopener noreferrer"&gt;chatgpt.com/g/g-6a00c51251c08191ad99bf16dc80f4b3-filingfirehose&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd love feedback on
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Other body-text patterns worth testing.&lt;/strong&gt; Going-concern language buried under generic 8-K items is on my list. What else?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The classifier's false-positive rate.&lt;/strong&gt; 12% feels acceptable for a screening tool but may be too noisy for a trading signal. Curious if anyone here has experience tuning rule-based classifiers in this regime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other forms worth body-text-parsing.&lt;/strong&gt; S-1 amendments, proxy statements, going-concern 10-Q sections — what would compound the most?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're building anything in this space, happy to chat. The source on the parsing rules isn't fully open (it's the moat) but I'll share the methodology in detail with anyone serious.&lt;/p&gt;

&lt;p&gt;— Jared&lt;/p&gt;

</description>
      <category>finance</category>
      <category>python</category>
      <category>api</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
