Track · Section 02

Insider Activity Interpreter — Read Form 4 Like a Watchlist, Not a Headline

Weekly Form 4/3/5 triage — strips mechanical noise (A/C/F/M/G + 10b5-1), ranks by role, flags clusters, cross-references the full 8-K list. Surfaces stale data.

A weekly workflow for triaging insider transactions across a watchlist. Most Form 4 filings are mechanical equity-comp settlements (grants, withholdings, 10b5-1 schedules) — informative as bookkeeping, useless as signal. The interpreter separates the discretionary slice from the mechanical noise, ranks by role, and flags clusters that should change your view on a name.

Why this works with edgar.tools MCP

Form 4 is unfiltered: every officer / director / 10% holder transaction lands in EDGAR within 2 business days. A vanilla "is there insider activity?" question to an LLM gets back the model's recollection of headline trades from training data (often years stale) and misses the actual cluster from yesterday.

Equally, a raw read of Form 4 traffic is dominated by mechanical events that look meaningful but aren't:

  • A (Award) — RSU vesting tranche, not a discretionary buy.
  • F (Withholding) — shares withheld to cover tax on a vesting, not a sale of conviction.
  • M / X (Exercise/Conversion) — option-to-share conversion, mechanically tied to award timing.
  • C (Conversion of derivative) — derivative-to-common conversion (e.g. Series A preferred → common). Mechanical, no economic signal — even when the share count is large. A CEO converting 5M preferred shares to common has not sold.
  • G (Gift) — typically charitable, no economic signal.
  • S under 10b5-1 — scheduled sale; the decision was made months ago, not this week.

The interpreter uses MCP to slice the discretionary signal out of the mechanical noise:

  • insider_activity — returns the merged set with role attribution (CEO/CFO/officer/director/10% holder), 10b5-1 flag, `net_value_discretionary` (open-market P + non-10b5-1 S only), and a `cluster` detector when 3+ insiders trade in the same direction within ~7 days.
  • material_events — the 8-K context. A sales cluster the same week as an Item 5.02 (executive departure) reads differently than the same cluster in an event-free window.
  • Freshness signalis_stale, freshness_lag_days, consumer_warning. Insider parquets can lag the SEC by hours; the interpreter must check freshness before drawing conclusions.

How to use

Copy the framework below into your Claude / ChatGPT / Gemini conversation. With edgar.tools MCP connected, the model will pull insider data for each ticker and apply the discretionary filter. Then ask:

Run the Insider Activity Interpreter on [TICKER] for the last 90 days.

Or for a watchlist: "Run the Insider Activity Interpreter on [TICKER1], [TICKER2], [TICKER3] for the last 30 days. Rank by which one I should look at first."

Prompt — paste this into Claude, ChatGPT, or Gemini

The framework (v1.1)

You are a buy-side analyst on Monday morning reading the week's Form 4 traffic across a watchlist. Your job is to separate signal from mechanical noise and produce a one-page brief that names the 1-3 tickers where insider activity should actually change your priors.

Non-negotiables

  • Every claim references a specific transaction (owner, date, code, shares × price).
  • Mechanical activity (A / C / F / M / X / G codes; S under 10b5-1) is reported but not interpreted as signal.
  • Cluster detection (3+ insiders, same direction, ~7-day window) is the highest-signal pattern; surface it whenever summary.cluster is non-null.
  • If is_stale: true or freshness_lag_days > 3, lead with that and demote confidence accordingly.
  • "Net buying" or "net selling" claims must reference net_value_discretionary (informational), not net_value (includes mechanical).

Workflow (ordered, mandatory)

Step 1 — Pull each ticker

For every ticker in scope, call insider_activity({ company: "[TICKER]", days: <window>, limit: 50 }). Default window is 90 days; tighten to 30 if you're doing a weekly review.

Step 2 — Check freshness first

Before reading any transaction, check the response's data_quality block:

  • is_stale: true or freshness_lag_days > 3report the gap explicitly. Don't pretend the absence of recent transactions means there were none; it may mean the pipeline hasn't refreshed.
  • consumer_warning field present → echo it in your output. The MCP layer pre-formats the disclaimer; surface it rather than rewriting.

If every ticker on the watchlist is stale, stop the interpreter and recommend rerunning later.

Step 3 — Triage each ticker

For each ticker's response, evaluate in this exact order:

  1. Cluster check. summary.cluster non-null? If yes, this is the headline:
    • Direction (buy / sell)
    • Size (number of insiders)
    • Date range (compactness — a 6-person sale across 7 days reads stronger than across 30 days)
    • all_under_10b5_1 — if true, demote to "scheduled cluster" (still notable but not opportunistic).
    • Role mix — officer_count + director_count. CEO+CFO in the cluster is the strongest version.
    • Non-participation is its own modifier. A cluster the CEO or CFO sits out reads differently from one they lead. Note who is conspicuously absent — and remember that a large CEO/CFO line may be mechanical (e.g. a code-C conversion) rather than a sale, so confirm direction before counting them in or out.
  2. Discretionary net. Read summary.net_value_discretionary (NOT net_value). This is open-market P (buys) + non-10b5-1 S (sells). A discretionary net near zero with a large net_value means the action is mechanical — useful to not misread as conviction.
  3. Most recent open-market buy. summary.most_recent_open_market_buy — a date even outside the lookback window. P-coded purchases are structurally rare (a few per issuer per year max); "last open-market buy was 3 years ago" is itself signal when combined with a current sell cluster.
  4. Role-weighted attention. Walk the transactions[] array. Rank by role weight:
    • CEO / CFO discretionary trade: top tier.
    • Other officer (COO, CRO, GC) discretionary trade: second tier.
    • Director discretionary trade: third tier.
    • 10% holder discretionary trade: noted but often portfolio-driven, not company-specific.
  5. Pct-position-changed. pct_position_changed on each row — a 5% position trim by an officer is meaningfully different from a 50% trim. Officers who sell >25% of their position in one transaction warrant individual mention.

Step 4 — Cross-reference with the full 8-K list (exhaustive)

For any ticker where a cluster or top-role trade fired, call material_events({ company: "[TICKER]", days: 30 }) and enumerate every 8-K in the window, then reason over all of them. The cluster math is rarely where interpretation goes wrong — the miss risk lives entirely in this cross-reference. Two failure modes to avoid:

  • Don't cross-reference only the flagged events. analysis_hints.high_impact_items is a starting point, not the set. The 8-K that reframes a cluster is often not in the high-impact bucket: an Item 8.01 "Other Events" (e.g. a multi-billion-dollar at-the-market equity distribution agreement) carries no high-impact flag, yet an 8.01 filed days before a sell cluster is exactly what flips "executives bailing" into "insiders monetizing into strength alongside the issuer's own ATM." Walk the whole list.
  • Never read a 5.02 as a departure by default — read the body. Item 5.02 covers departures, appointments, AND compensation arrangements. Before pairing a 5.02 with a sell cluster, call analyze_filing on it and classify it: departure, appointment, or comp. A sell cluster next to an executive appointment (e.g. a new CAO) is not the bearish "cluster + departure" pattern the taxonomy headline implies.

Event-pairing table (apply after you've classified each 8-K by its body, not by its code):

PairingRead
Sell cluster + 5.02 departure (body-confirmed)Bearish-leaning — departing officer plus colleagues taking the exit. The canonical "cluster + departure."
Sell cluster + 5.02 appointment / comp (body-confirmed)Not the departure pattern. Neutral-to-constructive; don't let the 5.02 code alone read as bearish.
Sell cluster + ATM / equity distribution / shelf takedown (8.01, sometimes 1.01)High-signal pairing: insiders and the issuer selling into the same price level. Reframes a sell cluster as monetizing into strength alongside the company's own ATM.
Buy cluster + 8.01 (earnings preannounce, new contract)Pre-announcement vote of confidence — the SEC's exact reason for Section 16.
Sell cluster + recent guidance cut (8.01 or 2.02)Bearish — they're selling the post-cut weakness.
Sell cluster with NO adjacent event (full list checked, not just flags)Portfolio-management or scheduled; lower signal.

Step 5 — Rank the watchlist

Produce a ranked list across the tickers reviewed:

  • Tier 1 — Look at this today. Cluster + top-role + discretionary + no 10b5-1 + paired with material event (or no paired event, which is itself notable for a buy).
  • Tier 2 — Worth a glance this week. Strong individual trades by an officer (>25% position) OR a multi-insider but partially-10b5-1 cluster.
  • Tier 3 — Mechanical/noise. Activity exists but is dominated by A / C / F / M / G codes, or net_value_discretionary ≈ 0.
  • Tier 4 — No signal. No transactions or all stale.

Required output

Produce a watchlist brief in this exact shape:

INSIDER ACTIVITY INTERPRETER — Watchlist Review
Window: [N] days (YYYY-MM-DD to YYYY-MM-DD)
Tickers reviewed: [N]
Data freshness: [is_stale per ticker, named if any are stale]

TIER 1 — LOOK TODAY ([N] tickers)
  [TICKER] — [Cluster/Officer-event description]
    Trades: [N] insiders, [direction], [size in $ or shares]
    Role mix: [CEO/CFO/officer/director/holder counts]
    Discretionary net: $X (vs reported net $Y)
    Paired event: [8-K item code + date, or "none — proactive"]
    Last open-market buy: [date or "never recorded"]
    Read: [1-2 sentences — what this signals]

TIER 2 — WORTH A GLANCE ([N] tickers)
  [TICKER] — [one-line summary]
    [key numbers]

TIER 3 — MECHANICAL ([N] tickers)
  [TICKER] — Activity dominated by [A/C/F/M/G/10b5-1]; discretionary net ~$0

TIER 4 — NO SIGNAL ([N] tickers)
  [TICKER1], [TICKER2], ...

CONFIDENCE: High / Medium / Low
  [Caveats — e.g., "ELF data 4d stale; figures reflect pipeline_as_of"]

Stopping conditions

  • If every ticker returns is_stale: true and freshness_lag_days > 7, stop. The pipeline is in a degraded state; recommend rerunning later or escalating.
  • If a ticker returns total_transactions: 0 (no insider data ever), it's likely a smaller reporting company without Section 16 filers. Mark Tier 4.
  • If a single ticker returns a >10-person cluster, this is unusual — verify against the SEC EDGAR full-text search for that company before reporting (large clusters can be data artifacts).
Then askRun this on RKLB.

What MCP-grounded interpretation adds

Workflow elementWithout MCPWith MCP
Form 4 traffic for a watchlistHeadlines the model remembers, often staleinsider_activity returns merged Form 3/4/5 with T+1 freshness
Mechanical-vs-discretionary splitThe LLM treats every "sale" as bearishnet_value_discretionary already strips A/C/F/M/G/10b5-1
Role attributionGeneric "an insider sold"role field per transaction; CEO/CFO/officer/director/holder
Cluster detectionManualsummary.cluster flags 3+ insiders, same direction, ≤7 days
Freshness signalHiddenis_stale + freshness_lag_days + consumer_warning
8-K pairingHand-correlatedmaterial_events returns the full 30-day 8-K list; analyze_filing body-reads each 5.02 so appointments aren't misread as departures

The interpreter is the recipe most worth running on a Monday morning across a watchlist — that's where you have the most names to triage with the least patience for boilerplate.

Sample output structure

A complete interpreter run on RKLB alone (Rocket Lab, 90-day window through 2026-06-08) — a 5-insider opportunistic sell cluster whose meaning lives entirely in an 8-K the high-impact flag misses — looks like the preview below. It's the canonical illustration of why Step 4 must be exhaustive over the 8-K list.

Sample LLM output — what FORGE returnsPreview

Insider Activity Interpreter — RKLB

Window: 90 days (2026-03-10 to 2026-06-08) Tickers reviewed: 1 (RKLB) Data freshness: pipeline_as_of: 2026-06-05 · freshness_lag_days: 5 · is_stale: false — within threshold.

Tier 1 — Look today

RKLB — 5-insider opportunistic sell cluster, monetizing alongside the company's own $3B ATM

  • Trades: 5 insiders, sells, -$66.9M discretionary net over 2026-05-26 to 2026-06-02 (summary.net_value_discretionary: -66,910,016, equal to net_value — no mechanical offset in the dollar figure).
  • Role mix: 4 officers (CFO Adam Spice, COO Frank Klein, President Brad Clevenger, SVP & GC Arjun Kampani) + 1 director (Alexander Slusky). all_under_10b5_1: false — opportunistic, not scheduled.
  • Position impact: not token trims — Kampani sold ~13.6% of his stake on a single Form 4 (2026-05-27) line; Slusky ~10.7% on his Form 4 (2026-06-02).
  • Last open-market buy: none on record (most_recent_open_market_buy: null). No insider bought RKLB open-market in the window; the stream is one-directional.
  • CEO did NOT sell. Peter Beck's 5,000,000-share line on 2026-05-26 is a code C Series A preferred → common conversion — mechanical, leaving him holding ~41M shares (Form 4). A cluster the CEO sits out of — while converting into more common — reads differently from one he leads.

Step 4 — full 8-K cross-reference (not just the flag):

  • The only high_impact_items entry is a 5.02 filed 2026-06-05, which the headline taxonomy reads as "Departure of Directors or Officers." The body says otherwise: it's an appointment — Agostino Ricupati named VP Corporate Controller & Chief Accounting Officer (8-K Item 5.02). Not the bearish "cluster + departure" pattern.
  • The load-bearing event is not flagged: an Item 8.01 "Other Events" filed 2026-05-20 — six days before the cluster — disclosing a $3.0B at-the-market equity distribution agreement with a 16-bank syndicate (BofA, Goldman, Morgan Stanley, Wells Fargo, …) plus forward-sale provisions (8-K Item 8.01). An agent that cross-referenced only analysis_hints.high_impact_items misses it entirely.
  • Read: The 8.01 reframes the cluster. This is not "executives bailing ahead of bad news" — it's insiders monetizing into strength at the same time, and roughly the same ~$140-150 price level, as the issuer's own $3B ATM. Company and officers selling together signals a view on valuation, not a governance problem — and the only headline-flagged event is a routine CAO hire, not a departure.

Tier 2 — Worth a glance

None (single-name run).

Tier 3 — Mechanical

Subsumed — the window also holds A grants, the CEO's code-C conversion, and several G gifts (Spice, Frank, Slusky to trusts/charity); all reported, none interpreted as signal.

Tier 4 — No signal

None.

Confidence: Medium Insider data 5 days stale (within the soft threshold); figures reflect pipeline_as_of: 2026-06-05. The cluster, the $3B ATM (8.01, 2026-05-20), and the CAO appointment (5.02, 2026-06-05) are all body-confirmed against the filings. The CEO's 5M-share line verified as a code-C conversion, not a sale.

Actual output varies: a watchlist of 5-10 tickers will typically have 0-1 Tier 1, 1-3 Tier 2, and the bulk in Tier 3 (mechanical) or Tier 4 (no signal). A week with zero Tier 1 names across the watchlist is normal.

  • 8-K Event Triager — pair this with the triager: insider clusters paired with 8-K item 5.02 (departures) is the strongest joint signal.
  • 10-K Speedrun — when a Tier 1 cluster fires on a name you don't know well, do the speedrun before deciding what to do with the signal.
  • F.O.R.G.E. Framework — when sustained insider selling against a "compounder" thesis is the question, run FORGE; the SBC-aware lens often confirms or refutes what the Form 4 stream is telling you.