Methodology

How Forum Atlas produces every brief.

A multi-agent ensemble with a citation-validator gate. No single Claude call. No anonymous synthesis.

The pipeline

  1. User query is embedded via voyage-3 (1024d).
  2. Top-20 candidate chunks retrieved via pgvector HNSW + sector + recency filters.
  3. Cohere Rerank v3.5 narrows to top-10.
  4. Multi-agent ensemble synthesizes the answer — a coordinator plus the five specialists (legal/regulatory, financial, technical, geospatial, forecasting) the query calls for.
  5. Citation validator: a deterministic check in the database (forum.citation_verbatim_matches) that each cited quote appears verbatim in the retrieved source text. It is not a model and does not judge whether the claim follows from the quote.
  6. On validation failure: retry once with a stricter prompt. On second failure: render “insufficient evidence”.
  7. Persist the brief with append-only citation rows. Audit log records the full call chain.

Citation discipline

  • Every analytical claim must anchor to a verbatim substring from a retrieved chunk.
  • Whitespace is normalized; case and punctuation are preserved.
  • Paraphrases that don't match the substring fail validation.
  • Failed paragraphs render “insufficient evidence on [topic]” rather than fabricated text.
  • Citation rows are append-only — once persisted, they don't mutate.

Source quality + recency

Each source carries an importance score (1–5, canonical-vs-supplemental) and a quality_score (1–5, reliability + signal-to-noise). Both are snapshotted at citation time. The pill UX shows quality on hover. Recency labels are bucketed: just_now (< 60 min), hours, days, weeks, months, older.

Forecast methodology

Forum Forecast decomposes a question into driver hypotheses, retrieves cited evidence for each, and runs a Monte-Carlo simulation in which each driver's estimated effect is scaled by its estimated weight. It draws 10,000 samples when the request asks for a confidence target of 0.9 or higher and 1,000 otherwise, and publishes a probability distribution with a 95% sampling interval, not a single number.

The interval published alongside a forecast is a 95% Monte-Carlo sampling interval, labelled ci_basis: monte_carlo_sampling_95 in the API. It states how far the sampling itself could have moved the point estimate. It is not a measure of how uncertain the forecast is about the world, and we do not present it as one.

A forecast is scored only if it was bound, at issue, to a named public series and an explicit threshold and deadline. The binding is what makes a forecast scoreable by someone other than us. It is applied by the scheduled forecast lane when it constructs a forecast (scripts/forecast_binding.py); a forecast requested directly through the API is not bound, so it is not scored. The scheduled lane is paused before launch, so no new bound forecasts are being issued; Accuracy prints the date of the last one, read from the database.

The binding rule did not reach backwards. Forecasts issued before it are on the record, cannot be scored, and are published as unscoreable rather than dropped — a forecast that will never produce a Brier score is not the same thing as one that is pending, and we would rather print that than leave an empty column implying patience. Accuracy counts the scoreable and unscoreable forecasts live.

For a deeper read, see Citation discipline and the pipeline documentation in our developer docs.