The automatic engine
Everything you see in ARIA — your readiness score, who AI cites, the questions your visitors ask — stays current on its own. Four small background loops do the work. There is no job queue and nothing for you to schedule: each loop wakes up, finds the domains that are due, does its one job, stamps the clock, and sleeps.
Each worker is a background loop that owns exactly one signal. They run as their own services alongside the web app, so the site stays responsive while they work.
| Worker | What it produces | Cadence |
|---|---|---|
| crawl | Reads your pages and re-scores readiness. | every 6h |
| probe | Asks engines your tracked questions → Citation. | every 168h (weekly) |
| gaps | Clusters chat & voice questions → GapRadar. | every 168h (weekly) |
| discover | Regenerates the tracked-question set → Discovery. | every 720h (monthly) |
Each pass writes the snapshots behind your scores.
A loop never re-does work that's still fresh. On each pass it selects verified domains in good standing whose last run timestamp for that job is empty (never run, so due now) or older than that job's TTL. Everything else is skipped until its clock runs out.
The loop sleep is just the polling beat — seconds for crawl, around a minute for the rest — not the cadence. The TTL above decides whether a domain is actually due.
Press refresh now, or edit your tracked questions, and ARIA simply clears the relevant timestamp. That makes the domain due, so the next pass of that loop picks it up within seconds — no special queue, no waiting for the full TTL.
The loops touch the outside world only through small, named interfaces I call ports: the DNS resolver, the page fetcher, and the four model calls — the chat answer, the engine probe, the gap labelling, and the question proposal. Each port has one job and one shape.
Because every dependency sits behind a port, the test suite injects fakes through those ports — so the standard tests never hit the network or a real model, and run the same way every time. The reasoning modules underneath (AEO scoring, visibility math, content extraction, domain normalization) are pure logic with no framework imports, so they're tested directly. Real engines run only in separate, out-of-gate smoke and eval suites.
In the dev and production stack the four workers run as their own services, each looping independently. The web process owns the database migrations; the workers own none — they only read what's due and write their results. If a subscription lapses, crawling stops and chat pauses until the plan is current again.
See Plans & billing for what a lapse gates, or how ARIA works for the whole picture.