A macro dashboard built by a multi-agent ensemble on DuckDB
Separate revenue breadth from its change, keep filing facts in DuckDB and check a multi-model synthesis against the source packet.
Every quarter, thousands of pages of releases, GAAP tables, and calls move through terminals in a few weeks. Most of that flow is consumed as three surrogates: the share of companies that beat the Street on EPS, a cap-weighted revenue print dominated by a handful of names, and a handful of management quotes.
This note is an analytics build. It is not an investment product. It does not forecast returns, and it does not tell anyone what to buy.
The engineering claim is narrower: a dashboard can treat earnings season as an instrument, not as a headline feed — if it distinguishes growth level from its change, stores primary facts, and refuses to publish a story the numbers do not support.
B_lvl is not B_acc
Two breadth measures, kept apart:
| Metric | Name | Meaning | What it actually shows |
|---|---|---|---|
| B_lvl | Breadth level | Share of index names whose revenue is up year on year | Share of the selected cohort reporting revenue growth |
| B_acc | Breadth acceleration | Share whose YoY growth is above their own median of the prior eight quarters | Share above the stated historical growth reference |
Illustrative comparison: revenue growth of 6% is below a historical 14% reference. That arithmetic describes slower growth relative to the reference; it does not establish a future margin, hiring or market outcome.
B_lvl means breadth level and B_acc means breadth relative to the specified growth reference. Record cohort coverage and the reference window beside both. They are descriptive measures, not literal calculus derivatives or a demonstrated forecasting rule.
DuckDB and six demand channels
The panel stores primary filing facts in DuckDB. Record issuer coverage, reporting periods, units and query evidence before aggregation; no query-latency benchmark is established here.
Instead of averaging the whole market into one number, six channels hold independent pulses:
- AI and cloud capex (MSFT, GOOGL, AMZN, META) — XBRL capex as a read on the infrastructure cycle.
- Advertising demand (META, GOOGL) — a leading read on smaller advertisers’ mood.
- Consumer volume (WMT, COST, TGT) — same-store sales, not an inflation-padded ticket.
- Logistics (FDX, UPS) — physical parcel and freight volume.
- Bank net interest income (JPM, BAC, WFC, C) — rate-path sensitivity.
- Credit-loss provisions — a stress gauge on borrowers.
Parsers lie in boring ways. Alphabet prints the current quarter on the right and last year on the left; a left-to-right reader flips the sign of the change. FedEx reports daily thousands; UPS reports quarterly millions. Without unit normalisation the index is noise. Incomplete cohorts do not get a number: one advertiser in and one still silent is not “the advertising channel.”
A spine, and two different flags
Compare reconciled aggregates with an appropriate independent reference and a declared tolerance. A discrepancy requires investigation of definitions, periods and coverage; a reference is not automatically ground truth.
A second architectural fault: using one flag for “the season is closed and reconciled” and “this is the right edge of the chart.” If the axis only advances on complete seasons, July still shows March while 450 of 500 have already reported.
Keep them separate:
complete— season finalised and checked against the spine.axis_end— the live season, labelled with the count (481 / 500 reported).
Fusion-Review: three families, one arbiter
Tables still need a reading: what structural shift sits under a move in B_acc, where a supply chain kink appeared. A single large model, even a strong one, carries a prior. It prefers a coherent story, smooths contradictions, and misses tails.
The build supplies a common data snapshot to reviewers from different model families. This can expose disagreements, but model diversity does not prove independent errors or a lower shared-error rate. Test the review result against source evidence.
Claude Opus, in this loop, is the arbiter — not a taste judge. It lines the three critiques up for contradiction. Check each material numeral against its query result, unit, period and conditions; finding a matching token elsewhere in the packet is insufficient. The models are forbidden to round or to compute a delta in prose. If any family times out, the loop goes degraded and will not pretend there was a consensus.
Popper on the scenario
Journalism can end on a vibe. An engineering note ends on a kill condition.
For an illustrative scenario, state the interpretation, observation horizon and evidence that would contradict it before the later data arrives. This is a review method, not a live trading rule or a claimed forecast result.
A quarter later the book splits into settled (horizon closed, verdict in) and in flight (horizon still forming). That is how the core is graded. It is not a performance track record for a fund.
What the loop is for
The build separates source facts, descriptive measures and reviewed interpretation. The store and checks make provenance inspectable; a days-to-minutes saving or an error-free ensemble is not established here.
A sibling problem, in a different domain, is a risk book that reports healthy while the stress job did not run. Same class of failure: a green dashboard as a claim.
- Does the panel measure acceleration against each issuer's own history, or only whether revenue is up?
- Are the facts taken from primary machine-readable filings, not from a second-hand recap?
- Is the parser checked against an independent spine, with a hard gap that blocks publish?
- Do panelists come from different model families, with an arbiter whose numeric claims are independently checked?
- Does every scenario carry a numeric kill condition?