Earnings-season panel with multi-agent synthesis
A DuckDB panel that reads primary SEC filings as a macro instrument, then runs a three-family model panel under an arbiter that is not allowed to invent numbers.
What changed. A macro packet that took a desk four days now comes off an automated cycle in about fifteen minutes, with every numeral checked against the warehouse.
Stack. DuckDB · SEC XBRL ingest · breadth acceleration metrics · mixture-of-agents review
Context
Each quarter, hundreds of public companies drop primary filings in a few weeks. Most of that stream is consumed as surrogates: an EPS beat-rate, a cap-weighted revenue print, a handful of management quotes. Consensus estimates are often walked down so that a high beat-rate can be announced even while the underlying businesses slow. A single language model asked to “summarise the season” will smooth contradictions and invent a tidy narrative.
The studio built an earnings macro panel: treat the season as an instrument, not as a headline feed. This is an analytics and engineering case. It is not a product that promises yield, alpha, or a trading recommendation.
Task
Ingest primary regulator forms rather than a second-hand aggregator. Distinguish growth level from growth acceleration. Keep the live season visible on the chart before it is complete. Interpret the packet with more than one model family, then forbid the synthesizer from calculating its own figures. Every published scenario must carry a numeric condition that would prove it wrong.
What we built
DuckDB holds machine-readable 10-Q / 10-K and 8-K facts and XBRL company concepts. Aggregation across roughly 500 issuers and 40 quarters runs in well under 150 milliseconds. Six demand channels are kept separate rather than averaged into one index: cloud and AI capex, digital advertising, retail volumes, freight, bank net interest income, and credit-loss provisions. Incomplete cohorts emit no number; a channel does not speak until its members have reported.
Two breadth metrics sit side by side. B_lvl is the share of names whose revenue is up year on year — the first derivative. B_acc is the share whose year-on-year rate beats that name’s own median of the prior eight quarters — the second derivative. A still-high B_lvl with a collapsed B_acc is the shape the panel is built to show.
Ingest is tested against traps we had already hit: a revenue table that prints the current quarter on the right, so a naive left-to-right parser flips the sign; freight volumes disclosed in different units that must be normalised before they can be added. A FactSet spine gate blocks publication if the panel’s beat-rate diverges from the reference by more than three percentage points.
complete and axis_end are different flags. A season can be on the screen as 481 of 500 reported without pretending it has been finalised.
Fusion-review sends the same DuckDB snapshot to three families — Gemini, Kimi, and GPT — then an arbiter (Claude Opus) reconciles contradictions. Every numeral in the prose is checked token-by-token against the warehouse. Models may not round or compute deltas in text. If a family times out, the contour is degraded and must not look like consensus. Each scenario carries a Popper condition: a later print that would retire the claim.
What changed
The automated cycle — parse, aggregate, synthesise — finishes in about fifteen minutes instead of four analyst-days of collection. Figures in the issued brief are warehouse figures, or the brief does not issue. Vendor blips degrade the panel instead of silently shrinking the jury.
What we would do differently
Split complete from axis_end on the first dashboard, not after operators spent a summer staring at March. The warehouse was honest earlier than the screen. A panel that only plots finished seasons is a rear-view mirror with a live-looking frame.
Related service: AI agents and automation