19. Outbound research, monitoring & the Sources repo
From the Meridians Wiki · Public · Maintained · joint
The research/forecast spine adds an outbound dimension the collaboration model above doesn't otherwise touch — the app reaches the open web (via Firecrawl) and the LLM on the Director's keys. How it fits the single-instance design:
- The Sources repo is a global catalog (not domain-scoped): Sites · Topics · Tickers,
persisted in the
researchCatalogIndexedDB store (seed merged with the user's own by id —lib/engine/research/catalog.ts). Shared across every domain; contributor+ writes (ADD/UPDATE/DELETE_CATALOG_{SITE,TOPIC,TICKER}, all taggedcontribute). - A Ticker is a source of truth by reference.
cycle.tickers/forecast.monitor.tickershold catalog ticker ids, not copies — because a ticker is a stateful instrument whose reading history is one global series (unlike stateless Sites/Topics, which embed). A read scrapes the page + AI-extracts the typed value and appends to the catalog ticker'shistory(lib/engine/research/ticker.ts). - Runs are one generalised pipeline.
ResearchRunDashboardfans a run's cycles + forecast monitors out through/api/ai/firecrawl(key resolved server-side, never exposed), routes cycle findings into streams and forecast findings into checks, and reads any attached tickers — deduped, metered per credit. A dry-run Test takes the same path but writes nothing. - Cross-domain writes — the honest constraint. The client reducer's
updateDomainmutates only the active domain, so a constellation surface can't rewrite a member's cycle/forecast cadences with a plain local dispatch. The capability is not missing — the sync layer'sapplyActionToDomain(target, branch, action)(§11) already folds an action onto any domain by id, so constellation-wide flow-down is a matter of emitting per-member targeted action-pushes, not new plumbing.