Special Edition · 2026-07-30

The biggest week of substrate growth in MARS history.

32 million new rows landed across four verticals. Here's what came in, who owns it, and what it unlocks.

In the last seven days MARS added 32.1 million rows across the canonical layer. Most of it came in a single 48-hour window: deeds landed the entire IRS 990 corpus (foundations + officers), bios minted 457,432 new persons from board-of-directors resolution, atlas → companies_v2 sync caught up on 789K CIK anchors, and lp_data stood up its first five pension funds with $217B of tracked private-market commitments. This is a bigger week of growth than the entire month of June combined.

+27.3M

Foundation officers NEW

+3.5M

Foundation orgs NEW

+457K

Persons (bios)

+800K

Companies (atlas)

$217B

LP commits tracked NEW

1,033

Fund commitments

5

Public pensions live

731

Bankruptcy events NEW

01The 990 substrate lands

Every 501(c) organization the IRS tracks.

deeds vertical shipped the full IRS 990 corpus overnight — 3.49M orgs, 27.3M officer/trustee/director rows, ~7M distinct raw person names waiting to be resolved into the MARS person graph.

The 990 corpus is one of the richest public wealth-signal substrates that exists — every US nonprofit has to file, every year, and the schedule requires disclosure of officers, directors, trustees, key employees, compensation, and highest-compensated. It's the primary source for "who sits on which foundation board" and by extension "who has the network access + net worth to sit there."

What landed:

TableRowsGrainOwner
mars.foundation_orgs_v23,485,812 one row per 501(c) org (EIN)deeds
mars.foundation_officers_v227,271,776 one row per (EIN × tax_year × person × filing)deeds

Every row is at vouched integrity tier — deterministic XML extraction from the IRS 990 e-file corpus, no LLM. The role flags (is_officer, is_trustee, is_director, is_key_employee, is_highest_compensated) come directly from the filings. Compensation columns are populated.

Unresolved by design. 100% of officer rows have person_id = NULL at landing, and 100% of orgs have company_id = NULL. That's the platform contract: deeds ingests raw; bios owns the resolution into the shared entity graph. Bios is already resolving at ~310K/day (see next section) — first wave will land as bios-c*-990-v1 methodology tags.

02The person graph gets denser

+457K persons this week. Bios did most of it.

persons_v2 grew from 1,424,626 to 1,882,058 — a 32% jump in seven days. Overwhelmingly driven by bios's 990 board-of-directors resolution pass.

MethodologyAddedSource
bios-c8-990-v1308,981 990 board members / trustees resolved into persons
bios-web-v1144,291 bios's own domain crawler + Qwen extract
bios-legacy-vetted-v11,749 historical spider-derived bios vetted + retagged
mars-v2-persons-v11,500 funding-deal officer extraction, mars-owned
bios-research-v1429 bios's targeted enrichment on high-signal rows
bios-adv-2b-v1365 SEC ADV Part 2B brochure supplements

The 85,266 minted on 2026-07-28 and 310,044 on 2026-07-30 are the two big waves from bios's 990 pass — the pattern is roughly one workload per day, with each drop going from raw name to canonical person_id via bios's linking chain (Qwen for context, Grok-web for world-knowledge, escalate on collision).

Every one of these is minted with entity_resolution_pending=TRUE — they'll get merged into existing persons_v2 rows when bios's next resolution pass finds a strong-ID match (CIK, LinkedIn URL, or unambiguous Grok-web verification). That's the same discipline that took the persons_v2 franken-merge count from 281 to zero in July.

03The company graph gets deeper

Atlas caught up. 789K new CIKs.

The atlas → companies_v2 sync had been running incrementally; the watermark was 15 days behind on 2026-07-29. A redesign to bulk INSERT collapsed the drain to 43 seconds.

MethodologyAddedSource
mars-atlas-sync700,390 full-sweep bulk mint (obviated the incremental backlog)
mars-atlas-sync-v188,955 hourly incremental sync (now caught up)
bios-c8-990-v19,284 foundation orgs bios needed to mint mid-resolution
bios-web-v14,372 employer companies bios extracted from crawled bios
sedar-mint-pilot-v12,168 Canadian issuers minted by sedar vertical
credit-bdc-10q-v1731 BDC portfolio companies from 10-Q filings

The atlas backfill unlocks something specific for consumers: every US public company filer now has a companies_v2 row with a CIK anchor. The Kirkland-Ellis-of-your-Series-A or the KKR-of-your-M&A used to need a fuzzy name-match; now they resolve on the strong identifier and drop into the graph next to their filings, their insider Form 4 activity, their 13D/G positions, and their private-market deals.

companies_v2 total: 1,096,132 canonical rows. cik-having: 860,187 (78%). ticker-having: 15,632 (1.4%) — with the ticker backfill from Atlas cik→ticker mapping planned as the next hop.

04LP data goes live

$217 billion in tracked private-market commitments.

The lp_data vertical shipped its first five public pension funds with structured commitment-level data extracted from their own CAFR disclosures. Every row is primary-source verifiable.

The design principle we committed to at scaffold: never use commercial LP databases (Preqin, Pitchbook LP News). Instead, primary sources only — public pension CAFRs, sovereign wealth reports, DFI filings, UK charities. 30-40% coverage vs. Preqin's 70-80%, but every row you can defend in court.

LPCommitmentsCommitted
CalPERS283$83.2 B
CalSTRS259$41.7 B
WSIB (Washington State)136$41.0 B
Oregon PERS168$25.8 B
PSERS (Pennsylvania)187$25.5 B
Total1,033 $217.2 B

Every commitment is joined to a canonical GP fund via the shared mars.funds_v2 canonical (157,472 rows, minted from Form D Regulation D private-placement filings). That's the join that turns "CalPERS commitments" into "which GPs is CalPERS backing this vintage, and how does that overlap with CalSTRS + WSIB + Oregon" — a query surface that costs $30K/year through Preqin and now costs zero against MARS substrate.

Next up: pensions 6-15 (Illinois SURS/TRS, Texas TRS, NYSCRF, Ontario Teachers, Massachusetts PRIT). Same extraction pattern — the schedules are already identified.

05Deal signal quality gets sharper

Definitive vs. rumor. Freshness bounds. Valuations.

The mid-week Kalshi asks from Crown drove three shipped substrate improvements on the M&A + funding side.

Deal stage ladder

Every merger row now carries deal_stage (rumor / talks / loi / definitive / pending / closed / terminated) and is_definitive boolean. Consumers can now filter "signed and announced M&A" from "reported to be in talks." 94.9% of clusters resolved to is_definitive=TRUE via Qwen backfill — the 5.1% rumor-premium tail is what Kalshi's markets actually trade.

Freshness

Every deal now has first_seen_at populated (99.96% funding, 100% merger). MCP tools accept a min_freshness filter, and the response envelope now includes server-computed days_since_first_seen + freshness_class (fresh / recent / aging / stale) — key for any market-signal use case where a 60-day-old announcement is a different asset from a 6-hour-old one.

Valuation columns backfilled on funding_deals_v2

A silent 10-day bug: extract_funding.py had been extracting pre-money + post-money valuation from Grok's response since 2026-07-17, but the field whitelist in the write path dropped both. Zero rows landed. Bug caught + fixed 2026-07-27; 548 valuations backfilled via targeted Qwen sweep on marquee equity deals. Fireworks $17.5B post-money, Cerebras $8.1B, and every OpenAI / xAI / Anthropic round now carries the valuation trajectory.

06Also worth flagging

Three smaller substrates that quietly matter.

Bankruptcy events, franken-division fixes, systemic entity guards — the kind of maintenance the daily report doesn't headline but consumers depend on.

Bankruptcy events substrate

mars.bankruptcy_events_v2 shipped 2026-07-28 as the news-lane counterpart to credit's SEC 8-K Item 1.03 substrate. The two feed mars.bankruptcy_events_union_v, which grew credit's borrower_distress_events_v2 by +22% (bankruptcy_filing kind: 1,406 → 1,711). Consumers with existing distress-signal queries saw a coverage jump without any code change.

Franken-division guard

M&A divestments where the target is a business unit ("X (Y Business)" / "Y division of X") used to resolve to the parent CIK — the parent's row in companies_v2 got polluted with the divested asset's deals. New guard in etl_company_id.resolve_merger_party mints a fresh nameless entity for divisional targets. Retroactive cleanup: 421 new divisional entities minted, 466 article rows + 624 cluster rows re-attributed. The Harmonic Video Business class of bug is now systemically closed.

Extractor field-whitelist audit

A single extractor bug (valuation dropped by a hardcoded field list, see study 05) drove a mini-doctrine: whenever we add a field to an LLM prompt schema, grep for the write-path copy list and add it there too. Same trap likely exists in other extractors; filed for audit before the next feature adds a fourth silent-zero-coverage class.

07What's coming next

Three items on the near-term horizon.

All planned; all real dates.

Bios linking pass on 990

Bios owns the resolution of the 27.3M raw officer rows deeds landed. First pass (Tier-0 exact-match on CRD + strong identifiers) already running. Grok-web world-knowledge tier next — resolves the "Marc Andreessen on the a16z Foundation board" class of edge into the person graph.

Deeds FEC Phase 1

Federal Election Commission bulk data (60M records/cycle) — political donation history keyed by (person, cycle). Same platform contract as 990: deeds ingests raw, bios resolves. Kicks in ~1-2 weeks. Cross-references cleanly to persons_v2 for wealth + network signals.

Signals vertical

Eight article-signal categories (lawsuit, appointment, contract, product launch, dividend, auditor change, license, government) that today's classify.py scores but drops. Qwen's $0-per-article extraction makes structured events on all eight affordable. Vertical scaffolded, awaiting owner.

Substrate as a UI, not just a query

mars-ui (adrian) is building a Metabase-analogue over the v2 canonicals. Coverage MVs shipped last week (company_coverage_v2 + person_coverage_v2) — the "how much do we know" chips that turn a canonical row into a scorable profile.

99The through-line

32 million rows only matters because they join.

The value isn't the count. It's that everything lines up.

A prospect scoring query today can ask: "Which persons appear on a foundation board (990 substrate, deeds), have insider Form 4 sales activity (SEC substrate, insider vertical), were extracted from an ADV brochure supplement (bios), share alma mater with a MARS-tracked VC's founding partner (bios education), and are within 90 days of a related private-market round (funding_deals_v2)?"

That query didn't work at any point in MARS's history until this week. Every substrate piece existed; the 990 layer was the missing join. It's live now — takes bios's resolution pass to fill in person_id across the officer rows, and then every consumer surface that joins on person_id gets the wealth-signal layer for free.

Prospects scoring becomes a real product this week. The pieces exist: Form 4 liquidity events (insider), 990 board seats (deeds), ADV bios (bios), canonical persons_v2 (mars). Bios's resolution pass is the wire connecting them. Watch this space through August.

How this was built. Every number in this edition is a live query against the mars postgres (host 172.31.91.195, dbname mars, read-only via argos_readonly). Ping kee for connection details if a consumer needs to run these queries themselves.

What's underneath. 24 canonical tables in the mars schema, ~32M new rows this week, ~52M total. Consumer contract stays: filter integrity_tier IN ('verified','vouched'), prefer amount_usd_converted for cross-currency comparability, filter NOT is_placeholder on investors_v2.

Cadence. The daily MARS SEC Daily Signal covers day-to-day Form D / Form 144 / 13D activity. This special edition covers substrate growth and structural change — expect these ~monthly, or whenever a landing this size warrants.

MARS · 2026-07-30 · special edition · kee@kscope.io