109 scheduled jobs across two systems. Each job lives in exactly one.
Fonteum runs scheduled work across two cron systems: Inngest (for jobs that need step-level retries, event emission, or observability) and Vercel cron (for lightweight HTTP-only operations). Ownership is decided by the AGENTS.md §cron-doctrine decision tree; the tools/cron-ownership-check.sh CI gate blocks any job that lands in both systems or is missing from this page.
Step-orchestrated work — retries, observability, event emission.
Inngest owns work that needs structured failure handling. Source pullers (network can flap), identity-linker (multi-step batch), webhook-deliverer (per-recipient retry), and citation-discoverer (rate-limited external API) all rely on Inngest’s step primitives + dashboard observability.
| Job ID | Schedule (UTC) | Source file | Purpose |
|---|---|---|---|
usage-meter-reporter | */10 * * * * | src/inngest/functions/usage-meter-reporter.ts | Every 10 min (§metered-api): drain the api_usage_events outbox to Stripe Billing Meters. Idempotent (dedups on event id); no-ops safely without STRIPE_SECRET_KEY. Inngest because it calls an external API with retries. |
ai-content-qa | 0 20 * * 0 | src/inngest/functions/ai-content-qa.ts | Weekly Sunday 20:00 UTC AI content-QA: flag-gated (AI_CONTENT_QA_ENABLED=1). Classifies money pages as ok/thin/stale/duplicate; writes proposals to ai_review_queue. Never edits live pages. |
ai-entity-summaries | 0 22 * * 0 | src/inngest/functions/ai-entity-summaries.ts | Weekly Sunday 22:00 UTC AI entity-summary scaffold: flag-gated (AI_ENTITY_SUMMARIES_ENABLED=1, default OFF). Scaffold only — no-ops until implementation is reviewed. Writes to ai_review_queue only. |
ai-link-suggestions | 0 21 * * 0 | src/inngest/functions/ai-link-suggestions.ts | Weekly Sunday 21:00 UTC AI embedding-based link suggestions: flag-gated (AI_LINK_SUGGESTIONS_ENABLED=1). Uses OpenAI text-embedding-3-small to find semantically similar pages; writes link proposals to ai_review_queue. Never modifies live pages. |
care-compare-asc-monthly | 0 6 1 * * | src/inngest/functions/care-compare-asc-monthly.ts | Monthly CMS Care Compare ASC refresh reminder; emits fonteum/source.refresh_due for the operator-triggered ASC ingest. |
care-compare-dialysis-monthly | 0 6 1 * * | src/inngest/functions/care-compare-dialysis-monthly.ts | Monthly CMS Care Compare Dialysis refresh reminder; emits fonteum/source.refresh_due for the operator-triggered dialysis ingest. |
compliance-change-detector | 0 5 * * * | src/inngest/functions/compliance-change-detector.ts | §pillar5-compliance-change-feed — daily 05:00 UTC. Diffs current in-force exclusion / compromised-flag / ownership (CHOW) facts against the compliance_change_events watermark; records new LEIE/SAM/state exclusions, OIG CIAs, CMS penalties, and CHOW ownership changes; fans out fonteum/compliance.change_detected for subscribers. |
cwv-anomaly-monitor | 0 11 * * * | src/inngest/functions/cwv-anomaly-monitor.ts | Daily 11:00 UTC CWV + data-freshness anomaly monitor: runs PageSpeed Insights against curated pages, checks row-count baselines on key tables, writes anomaly rows to selfheal_anomaly_log, and alerts operator on regressions. |
citation-discoverer | 0 9 * * * | src/inngest/functions/citation-discoverer.ts | Daily OpenAlex poll for papers citing Fonteum data; populates discovered_citations moderation queue. |
daily-refresh-stale-check | 0 9 * * * | src/inngest/functions/source-refresh-reminders.ts | Logs sources that have not refreshed within their declared cadence; surfaces in /freshness degraded badge. |
health-check | 0 7 * * * | src/inngest/functions/health-check.ts | Daily Inngest dashboard ping confirming the function-registration round-trip is alive. |
lead-capture-canary | */15 * * * * | src/inngest/functions/lead-capture-canary.ts | Every 15 min synthetic lead-capture canary: posts a dummy pilot-intake lead, confirms the row exists, deletes it, and alerts the operator if persistence fails. |
link-404-watchdog | 0 1 * * * | src/inngest/functions/link-404-watchdog.ts | Daily 01:00 UTC 404/broken-link watchdog: HEADs sitemap URLs, queues 404s in selfheal_redirect_queue with auto-inferred redirect destinations where safe. Operator reviews + approves before any redirect is promoted. |
identity-linker | */5 * * * * | src/inngest/functions/identity-linker.ts | Polling job that resolves NPI ↔ PECOS-ID ↔ CCN ↔ LEIE provider identity links in batches. |
indexnow-retry-nightly | 0 2 * * * | src/inngest/functions/indexnow-retry-nightly.ts | Nightly retry of failed IndexNow URL submissions persisted to failed_indexnow_submissions (F-12). |
m16-ai-referral-share | 0 22 * * 0 | src/inngest/functions/moat-m16-ai-referral.ts | Weekly Sunday 22:00 UTC AI referral traffic share: pulls Plausible referral data for AI assistants and writes an ai_referral_share row to moat_metrics. |
m4-fhir-api-usage | 0 8 * * 1 | src/inngest/functions/moat-m4-fhir-api-usage.ts | Weekly Monday 08:00 UTC FHIR API usage tracker: reads 7d of fhir_request_logs, classifies requests by user-agent class and FHIR resource type, and writes fhir_api_usage rows to moat_metrics. |
m6-press-mentions | 0 11 * * 1 | src/inngest/functions/moat-m6-press-mentions.ts | Weekly Monday 11:00 UTC press-mention tracker: queries DataForSEO News for brand mentions, dedupes by URL, enriches each domain with its DR, and writes press_mention rows to moat_metrics. |
m7-email-list-growth | 0 7 * * 1 | src/inngest/functions/moat-m7-email-list-growth.ts | Weekly Monday 07:00 UTC email-list growth tracker: reads email_subscribers, computes new/unsub/total by source over the trailing 7 days, and writes email_list_growth rows to moat_metrics. |
m8-internal-link-health | 0 8 * * 1 | src/inngest/functions/moat-m8-internal-link-health.ts | Weekly Monday 08:00 UTC internal-link graph audit: crawls the sitemap, counts inbound internal links per page, and writes orphan/violation/healthy/avg_inbound rows (doctrine G7) to moat_metrics. |
m9-topical-authority | 0 1 1 * * | src/inngest/functions/moat-m9-topical-authority.ts | Monthly (1st, 01:00 UTC) topical-authority score: counts pages with GSC impressions per topic cluster and records newest-page rank, writing topical_authority rows to moat_metrics. |
m13-performance-regression | 0 6 * * 1 | src/inngest/functions/moat-m13-performance-regression.ts | Weekly Monday 06:00 UTC performance-regression monitor: runs PageSpeed Insights against curated pages and writes per-metric LCP/INP/CLS/FCP/TBT pass/fail rows (doctrine G3) to moat_metrics. |
m15-dataforseo-spend | 0 9 * * 1 | src/inngest/functions/moat-m15-dataforseo-spend.ts | Weekly Monday 09:00 UTC DataForSEO spend tracker: queries the account balance API and writes balance + burn_rate rows (cost_dataforseo) to moat_metrics; alerts when balance < $10. |
moat-m1-ai-citation | 0 4 * * 2 | src/inngest/functions/moat-m1-ai-citation.ts | Weekly Tuesday 04:00 UTC AI citation-count tracker: queries assistants for Fonteum dataset citations and writes an ai_citation_count row to moat_metrics (headline moat metric). |
moat-m11-fhir-empty | 0 * * * * | src/inngest/functions/moat-m11-fhir-empty.ts | Hourly FHIR empty-bundle monitor: GETs each FHIR resource endpoint and flags any that return an empty Bundle (total=0), writing a fhir_empty_resource row to moat_metrics. |
m19-velocity | 0 23 * * 0 | src/inngest/functions/moat-m19-velocity.ts | Weekly Sunday 23:00 UTC founder-velocity metric: counts merged PRs + route/table growth over the trailing 7 days (GitHub API) and writes an m19_velocity row to moat_metrics. |
m2-research-scorecard | 0 3 * * 1 | src/inngest/functions/moat-m2-research-scorecard.ts | Weekly Monday 03:00 UTC research-study scorecard: classifies each published study as compounding or decaying from GSC impression trend and writes a research_scorecard row to moat_metrics. |
m17-doctrine-pass-rate | 0 4 * * 1 | src/inngest/functions/moat-m17-doctrine-pass-rate.ts | Weekly Monday 04:00 UTC doctrine-gate pass-rate metric: runs the doctrine gates across research/methodology pages and writes an m17_doctrine_pass_rate row to moat_metrics. |
m18-fhir-partner-ping | 30 8 * * 1 | src/inngest/functions/moat-m18-fhir-partner-ping.ts | Weekly Monday 08:30 UTC FHIR partner-ping tracker: reads 7d of fhir_request_logs, flags requests from enterprise healthcare-data vendor user-agents (Komodo, Definitive, Verisys, …) as enterprise probes, and writes alert-fired m18_fhir_partner_ping rows to moat_metrics (acqui-hire diligence signal). |
moat-digest-weekly | 0 1 * * 1 | src/inngest/functions/moat-digest-weekly.ts | Weekly Monday 01:00 UTC (09:00 PHT) founder digest: reads 14d of moat_metrics, computes top-3 movers + week-over-week deltas across all 19 metrics, collects fired alerts, and emails the summary via Resend to MOAT_DIGEST_RECIPIENT. |
methodology-publisher | 0 7 * * * | src/inngest/functions/methodology-publisher.ts | Detects methodology version bumps + emits fonteum/methodology.published event for downstream consumers. |
moat-m10-route-integrity | 0 */6 * * * | src/inngest/functions/moat-m10-route-integrity.ts | Every-6-hours route integrity check across all CRITICAL_ROUTES; emails operator if any route returns 404/500 or a FHIR bundle returns total=0. |
moat-m3-snapshot-depth | 0 1 * * 1 | src/inngest/functions/moat-m3-snapshot-depth.ts | Weekly Monday 01:00 UTC snapshot historical-depth metric: counts retained research_snapshots vintages per dataset and writes a snapshot_depth row to moat_metrics (the data-moat metric). |
records-request-reminders | 0 8 * * * | src/inngest/functions/records-request-reminders.ts | Scans outstanding public-records requests; emails operator when SLA breach is imminent (e.g. AZ ROC PR-0006673). |
seo-schema-watchdog | 0 3 * * * | src/inngest/functions/seo-schema-watchdog.ts | Daily 03:00 UTC SEO/schema regression watchdog: fetches curated production pages, validates title/meta/H1/canonical/JSON-LD presence, runs a cross-page duplicate-title/duplicate-meta-description pass, writes results to selfheal_seo_checks, and alerts operator on failures. |
seo-autopilot-phase3 | 0 14 * * 1 | src/inngest/functions/seo-autopilot-phase3.ts | §seo-autopilot-phase3: weekly Monday 14:00 UTC SEO Page-Quality Autopilot readout. READ-ONLY — reads gsc_page_metrics / gsc_query_metrics / gsc_index_coverage / page_quality_runs and emails the State-of-SEO digest. Loop 6: mines GSC queries, classifies junk (dataset-ID/API-code) vs buyer-intent, flags title/meta rewrite candidates + pages ranking on junk. Loop 5: flags indexed-but-zero-impression thin pages into the remediation queue + routes the GSC coverage backlog. Headline KPIs are indexation %, score-band movement, and CTR-gap closure — never keyword rank. Emits flags; mutates no content. |
ingestion-health-digest | 0 15 * * * | src/inngest/functions/ingestion-alert-monitor.ts | Daily 15:00 UTC autopilot-hardening integrity digest: reads open source_schema_drift events, recent source_snapshot_quarantine incidents, and degraded source_health_status rows, then sends ONE consolidated operator alert when anything is wrong. Read-only; silent on a clean run. Closes the notify-don't-rot gap so a broken or drifting pipe is a same-day email, never silent rot. |
integrity-anchor-daily | 0 16 * * * | src/inngest/functions/integrity-anchor-monitor.ts | Daily 16:00 UTC external timestamp attempt (moat-defense #126): submits the signed chain head and latest attestation root to public OpenTimestamps calendars and appends the returned proof to timestamp_anchor_attempts. Evidence checks append immutable timestamp_anchor_verifications rows. Neither path updates legacy timestamp_anchors, and a stored attempt is not independent mainnet validation. |
integrity-anchor-upgrade | 0 */6 * * * | src/inngest/functions/integrity-anchor-monitor.ts | Every-6-hours OpenTimestamps evidence poll (moat-defense #126): re-checks append-only attempts and inserts a new immutable timestamp_anchor_verifications row for the result. It never flips or updates a legacy timestamp_anchors status; public mainnet evidence requires an authentic retained block header and a successful proof check. |
integrity-chain-liveness | 0 * * * * | src/inngest/functions/integrity-anchor-monitor.ts | Hourly integrity-chain liveness guard: reads chain_state.last_extended_at and raises a hard operator alert when the signed chain has not advanced for more than six hours. Read-only on integrity state. |
integrity-self-audit | 30 16 * * * | src/inngest/functions/integrity-anchor-monitor.ts | Daily 16:30 UTC integrity self-audit (moat-defense #126): re-derives EVERY signed chain link (the N-key self-test) + cross-checks a witness sample against the recorded hashes, and emails the operator on any HARD breach (HASH_MISMATCH / WITNESS_INVALID / CHAIN_BROKEN). Read-only; silent on a clean run. So a DD audit is never the first time the proof runs. |
snapshot-staleness-watchdog | 0 4 * * * | src/inngest/functions/snapshot-staleness-watchdog.ts | Daily 04:00 UTC research_snapshots staleness watchdog: for each active snapshot-bearing source, compares the freshest snapshot_date against the source's own refresh_cadence_days, writes snapshot_stale rows to selfheal_anomaly_log, and alerts operator when any provenance snapshot has gone stale. |
sitemap-orphan-audit | 0 5 * * 3 | src/inngest/functions/sitemap-orphan-audit.ts | Weekly Wednesday 05:00 UTC sitemap/orphan/internal-link audit: flags orphan pages (0 inbound), pages below the 3-link doctrine threshold, and sitemap URLs returning 404. Writes to selfheal_page_audit. |
site-crawl-monitor | 0 3 * * 1 | src/inngest/functions/site-crawl-monitor.ts | Weekly Monday 03:00 UTC full-site render-and-assert crawl (sitemap + edge-parameter coverage + boundary edge-cases). Asserts HTTP 200, no error/empty/fallback state, resolved links, JSON-LD, metadata, visible-first SSR, and data-truth; persists the failure set to site_crawl_runs and emails ONLY new failures vs the prior run. |
recapture-loop-daily | 0 8 * * * | src/inngest/functions/recapture-loop.ts | §moat-recapture: forward-ready daily-tier loop for recapture-enabled sources that do not own a dedicated source-puller function. Dedicated sanctions pullers are excluded to prevent duplicate refreshes. |
recapture-loop-weekly | 0 8 * * 1 | src/inngest/functions/recapture-loop.ts | §moat-recapture: weekly-tier recapture loop (same engine as the daily loop, scoped to weekly-cadence recapture-enabled sources). No-ops cleanly when no weekly source is wired yet. |
recapture-loop-monthly | 0 8 1 * * | src/inngest/functions/recapture-loop.ts | §moat-recapture: monthly-tier recapture loop (1st of month). Forward-ready for monthly-cadence bitemporal sources. |
recapture-loop-quarterly | 0 8 1 1,4,7,10 * | src/inngest/functions/recapture-loop.ts | §moat-recapture: quarterly-tier recapture loop (1st of Jan/Apr/Jul/Oct). Forward-ready for quarterly-cadence bitemporal sources. |
recapture-loop-annual | 0 8 1 1 * | src/inngest/functions/recapture-loop.ts | §moat-recapture: annual-tier recapture loop (Jan 1). Forward-ready for annual-cadence bitemporal sources. |
recapture-loop-static | 0 8 1 1 * | src/inngest/functions/recapture-loop.ts | §moat-recapture: static-tier recapture loop (Jan 1 drift safety-net). Forward-ready for slow-reference bitemporal sources. |
recapture-watchdog | 0 13 * * * | src/inngest/functions/recapture-watchdog.ts | §moat-recapture: daily 13:00 UTC freshness-SLO watchdog. Any recapture-enabled source past its cadence interval + grace gets exactly one deterministic auto-re-run; escalates by email if the re-run did not land; folds in upstream-degraded sources; then pings the external dead-man-switch (DEADMAN_HEARTBEAT_URL) so an outside monitor knows the watchdog ran. |
recapture-accuracy-monitor | 0 17 * * * | src/inngest/functions/recapture-accuracy-monitor.ts | §moat-recapture: daily 17:00 UTC accuracy monitor. Samples N current stored facts per recapture-enabled source, re-fetches the live government source, and writes the measured per-source accuracy % to data_quality_runs. Alerts the operator on any sub-threshold source; silent when clean. |
refresh-reminder-<family> | per-source from cron-sources.cron_expression | src/inngest/functions/source-refresh-reminders.ts | Family-specific cadence reminder that nags the operator to refresh a source on schedule (NPPES, Care Compare, etc.). |
source-health-monitor | */15 * * * * | src/inngest/functions/source-health-monitor.ts | HEAD probe per source upstream URL; flips source_health_status row + emits fonteum/source.health_status_changed. |
source-schema-drift-monitor | 0 8 * * 1 | src/inngest/functions/source-schema-drift-monitor.ts | Weekly Monday 08:00 UTC schema-fingerprint check per registered source (URL resolves + file format + depended-on columns present). Records drift to source_schema_drift and fails loud when a publisher changes a column/format/URL. |
source-puller-bea-regional | 0 6 1 10 * | src/inngest/functions/source-puller-bea-regional.ts | Annual October BEA Regional pull — area-level GDP + per-capita income. |
source-puller-bls-oews | 0 6 1 5 * | src/inngest/functions/source-puller-bls-oews.ts | Annual May BLS OEWS pull — occupational employment + wage statistics. |
source-puller-cpsc | 0 8 * * 1 | src/inngest/functions/source-puller-cpsc.ts | Weekly CPSC pull — complete federal product-recall corpus with signed source snapshot. |
source-puller-cfpb-enforcement-actions | 0 8 * * * | src/inngest/functions/source-puller-cfpb-enforcement-actions.ts | Daily CFPB enforcement-actions full-corpus pull and attestation. |
source-puller-fincen-enforcement-actions | 0 8 * * * | src/inngest/functions/source-puller-fincen-enforcement-actions.ts | Daily FinCEN enforcement-actions full-corpus pull and attestation. |
source-puller-ncua-enforcement-actions | 0 8 * * * | src/inngest/functions/source-puller-ncua-enforcement-actions.ts | Daily NCUA administrative-orders full-corpus pull and attestation. |
source-puller-sec-edgar | 0 8 * * * | src/inngest/functions/source-puller-sec-edgar.ts | Daily SEC EDGAR full entity-corpus pull and attestation. |
source-puller-sec-enforcement | 0 8 * * * | src/inngest/functions/source-puller-sec-enforcement.ts | Daily SEC enforcement all-pages pull and attestation. |
source-puller-sec-iapd | 0 8 * * * | src/inngest/functions/source-puller-sec-iapd.ts | Daily SEC IAPD full-feed pull and attestation. |
source-puller-cftc-enforcement-actions | 0 8 * * * | src/inngest/functions/source-puller-cftc-enforcement-actions.ts | Daily CFTC enforcement-actions all-pages pull and attestation. |
source-puller-dea-registrant-enforcement | 0 8 * * * | src/inngest/functions/source-puller-dea-registrant-enforcement.ts | Daily DEA registrant-enforcement Federal Register pull and attestation. |
source-puller-cms-pos | 0 8 1 1,4,7,10 * | src/inngest/functions/source-puller-cms-pos.ts | Quarterly CMS Provider of Services (POS) pull — CCN facility identity backbone. |
source-puller-cms-ncci-mue-edits | 0 8 1 1,4,7,10 * | src/inngest/functions/source-puller-cms-ncci-mue-edits.ts | Quarterly CMS NCCI MUE edits pull — current-quarter maximum-units limits. |
source-puller-eu-sanctions | 15 8 * * * | src/inngest/functions/source-puller-eu-sanctions.ts | Daily 08:15 UTC EU sanctions refresh — fetches the full FSF XML, applies bitemporal changes, and registers the upstream evidence through the signed snapshot path. |
source-puller-fda-enforcement-actions | 0 8 * * 1 | src/inngest/functions/source-puller-fda-enforcement-actions.ts | Weekly FDA enforcement pull — all openFDA drug, device, and food recall partitions plus Warning Letters pages. |
source-puller-hrsa-hpsa | 0 6 1 1,4,7,10 * | src/inngest/functions/source-puller-hrsa-hpsa.ts | Quarterly HRSA HPSA pull — Health Professional Shortage Area designations. |
source-puller-leie | 0 6 1 * * | src/inngest/functions/source-puller-leie.ts | Monthly OIG LEIE pull — federal program exclusions list. |
source-puller-ofac-sdn | 0 8 * * * | src/inngest/functions/source-puller-ofac-sdn.ts | Daily 08:00 UTC OFAC refresh — fetches SDN plus Consolidated XML, attests one deterministic composite ZIP, and applies bitemporal changes. |
source-puller-pecos | 0 6 * * 0 | src/inngest/functions/source-puller-pecos.ts | Weekly Sunday CMS PECOS PPEF pull — Medicare provider enrollment status. |
source-puller-phmsa-pipeline-enforcement | 0 8 1 * * | src/inngest/functions/source-puller-phmsa-pipeline-enforcement.ts | Monthly PHMSA pull — complete Pipeline Safety Enforcement raw export with bitemporal history. |
source-puller-uk-sanctions | 30 8 * * * | src/inngest/functions/source-puller-uk-sanctions.ts | Daily 08:30 UTC UK sanctions refresh — fetches the complete UKSL XML, applies bitemporal changes, and registers the upstream evidence through the signed snapshot path. |
source-puller-un-sanctions | 45 8 * * * | src/inngest/functions/source-puller-un-sanctions.ts | Daily 08:45 UTC UN sanctions refresh — fetches the consolidated Security Council XML, applies bitemporal changes, and registers the upstream evidence through the signed snapshot path. |
state-of-fonteum-digest | 30 13 * * 1 | src/inngest/functions/state-of-fonteum-digest.ts | §self-healing-remediation: weekly Monday 13:30 UTC State of Fonteum digest. Reads remediation_log + source_recapture_state and rebinds freshness to proved transitions in the attested snapshot ledger (read-only), then emails the self-healing scoreboard — auto-remediation rate, sources healed, escalations, dead-lettered, and freshness-SLO compliance. Workflow execution and content freshness remain separate. The positive-scoreboard counterpart to the alert watchdogs; emails every week as the proof the platform runs unattended. |
ingestion-failure-alertevent: inngest/function.failed | event | src/inngest/functions/ingestion-alert-monitor.ts | Autopilot-hardening: listens for inngest/function.failed scoped to the autonomous ingestion crons (source pullers, Care Compare monthly ingests, daily snapshotter) and sends a Resend operator alert when one fails after exhausting retries. A failed pull is a flagged missed refresh, never corruption. |
event-emitterevent: fonteum/source.snapshot_inserted | event | src/inngest/functions/event-emitter.ts | Fans source-snapshot-inserted events into downstream consumers (webhook-deliverer, methodology-publisher). |
refresh-manual-triggerevent: source.refresh.manual_triggered | event | src/inngest/functions/source-refresh-reminders.ts | Operator-fired manual refresh of a source family — re-runs the puller out-of-cadence. |
webhook-delivererevent: webhook.delivery.queued | event | src/inngest/functions/webhook-deliverer.ts | Per-recipient webhook delivery with backoff retry; consumes events emitted by the source-snapshot pipeline. |
dataset-snapshot-webhook-fanoutevent: fonteum/source.snapshot_inserted | event | src/inngest/functions/dataset-snapshot-webhook-fanout.ts | Pillar 5 dataset webhooks — fans each new source snapshot to one delivery event per active dataset.snapshot_published subscriber. |
compliance-feed-delivererevent: fonteum/compliance.change_detected | event | src/inngest/functions/compliance-feed-deliverer.ts | §pillar5-compliance-change-feed — HMAC-signed POST of each detected compliance change to active compliance_feed_subscriptions matching the event_type; logs every attempt to compliance_feed_deliveries with 6-retry exponential backoff. |
dataset-webhook-delivererevent: fonteum/dataset.delivery_requested | event | src/inngest/functions/dataset-webhook-deliverer.ts | Pillar 5 dataset webhooks — delivers one Ed25519-signed snapshot-published POST to one subscriber with Inngest backoff retry. |
fhir-bulk-export-workerevent: fhir.bulk.export.requested | event | src/inngest/functions/fhir-bulk-export-worker.ts | Processes FHIR R4 Bulk Data Access ($export) job requests; writes NDJSON output, updates job status. |
nsa-compliance-quarterly | 0 9 15 3,6,9,12 * | src/inngest/functions/nsa-compliance-quarterly.ts | Quarterly NSA/surprise-billing compliance score computation across IDR + MRF datasets. |
hospital-margin-annual | 0 9 1 12 * | src/inngest/functions/hospital-margin-annual.ts | Annual hospital financial margin computation from HCRIS cost reports; runs each December 1. |
chain-extender | */5 * * * * | src/inngest/functions/chain-extender.ts | Polls snapshot_attestations for unchained rows; links previous_link_hash to extend the attestation chain. |
endpoint-uptime-monitor | */5 * * * * | src/inngest/functions/endpoint-uptime-monitor.ts | 5-min /api/health transport-reachability ping; records result in endpoint_uptime_checks for rolling 24h/30d uptime % on /status. Pipeline freshness, source completeness, and incidents are separate status dimensions. |
entity-perception-probe | 0 5 * * 2 | src/inngest/functions/entity-perception-probe.ts | Weekly Tue 05:00 UTC (§entity-perception-tracker, Layer D): probes how the 4 AI assistants + Google SERP describe Fonteum, classifies each healthcare_only/multi_vertical/mixed, appends to entity_perception_captures to trend the multi-vertical-vs-healthcare-only share on /owner. Read-only on the live web; env-keyed (LLM keys + DataForSEO); degrades to empty when keys unset. Inngest because it calls external APIs with retries. |
freshness-watchdog | 0 14 * * * | src/inngest/functions/freshness-watchdog.ts | Configured daily freshness audit: fetches /api/freshness, compares last_updated against declared cadence, and is intended to email the operator on threshold breaches. The schedule is not evidence that a run succeeded. |
snapshot-archive | 0 3 * * * | src/inngest/functions/snapshot-archive.ts | Configured for 03:00 UTC content-addressed NPPES + PECOS snapshots to S3. Deduplication and dataset_snapshots indexing describe the job path; consult the loaded/status date for the latest successful run. |
risk-signal-refresh | 0 4 * * * | src/inngest/functions/risk-signal-refresh.ts | Configured for a 04:00 UTC refresh of exact public exclusion-list records in provider_risk_signals. The schedule does not prove a successful load; consult the serving coverage date. |
risk-signal-refresh-error-alertevent: inngest/function.failed | event | src/inngest/functions/risk-signal-refresh.ts | Event-triggered: listens for inngest/function.failed scoped to risk-signal-refresh and sends a Resend operator alert. |
daily-dataset-snapshotter | 15 6 * * * | src/inngest/functions/daily-dataset-snapshotter.ts | Daily 06:15 UTC integrity observation. Before the 2026-08-01 cutover it preserves the frozen count-observation-v1 path. At and after the cutover it emits exact row-Merkle evidence only for oig_leie, pecos_ppef, and hrsa_shortage_areas, and fails closed unless the source producer has banked and sealed an immutable exact-row capture. This job is not an upstream source refresh. |
source-row-history-capture-daily | 45 8 * * * | src/inngest/functions/row-history-capture.ts | Daily 08:45 UTC private history follower over sealed row-Merkle observations. The first eligible full rowset opens a baseline; a changed content hash closes missing exact-row intervals and opens new ones, while an unchanged hash records a dated zero-diff capture. It does not write snapshot, serving, or freshness tables. |
moat-m12-sitemap-drift | 0 */12 * * * | src/inngest/functions/moat-m12-sitemap-drift.ts | Every-12-hours sitemap drift detector: fetches sitemap-index recursively, HEAD-checks all URLs (10s/10-worker), diffs vs prior run url_set, writes sitemap_drift row, fires alert if broken>0 or dropped>5. |
moat-m14-cms-freshness | 0 3 * * * | src/inngest/functions/moat-m14-cms-freshness.ts | Daily 03:00 UTC CMS data freshness check — fetches upstream modified date from data.cms.gov API for 5 datasets, compares to our source_snapshots, computes lag_days, emails operator per stale source (lag > 14 days). |
journorequest-monitor | */30 * * * * | src/inngest/functions/journorequest-monitor.ts | Every-30-min scraper of Twitter #journorequest (via Nitter) and Qwoted public opportunities; keyword-matches against tier config; stores in journalist_requests table; sends Tier 1 matches via Resend immediately. |
journorequest-digest | 0 1 * * 1-5 | src/inngest/functions/journorequest-monitor.ts | Mon-Fri 01:00 UTC (09:00 PHT) Tier 2 daily digest email bundling all unnotified Tier 2 journalist request matches from the prior 24h; silent on zero matches. |
gsc-triage-daily | 30 6 * * * | src/inngest/functions/gsc-triage-daily.ts | Demand Gate Loop 1 (demand-gate-v1): daily GSC drift detector. Reads Search Console (live API when credentials present, CSV-imported gsc_* tables otherwise), excludes dataset-UUID / raw-API / single-entity-name queries, and writes RETITLE / PUSH / BUILD_CANDIDATE / REPOINT_OR_DEINDEX rows to gsc_triage_queue. Surfaced at /admin/gsc-triage. |
bulk-snapshot-on-demandevent: fonteum/bulk.snapshot.requested | event | src/inngest/functions/bulk-snapshot-on-demand.ts | On-demand internal source puller for collecting raw source snapshots. Generic CSV-gzip URLs are not published from this worker; only source-specific files listed in the public bulk manifest are downloadable. |
HTTP boundary ticks — most fire-and-forget; one liveness watchdog exception.
Vercel cron owns lightweight HTTP operations and one deliberate Vercel-boundary watchdog. Most entries complete quickly without step orchestration. ops-heartbeat is the exception because its external deadman must detect a Vercel scheduler, proxy, or invocation failure before the application can create a ledger row. Defined in vercel.json crons[]; each entry maps to a src/app/api/cron/<name>/route.ts handler.
| Job ID | Schedule (UTC) | Source file | Purpose |
|---|---|---|---|
ping-new-urls | 17 * * * * | src/app/api/cron/ping-new-urls/route.ts | Hourly IndexNow submission for current Fonteum brand, dataset, and research URLs. |
provenance-audit | 0 7 * * * | src/app/api/cron/provenance-audit/route.ts | Nightly 07:00 UTC provenance source health check — HEAD/GETs every cited source_url, logs reachability + latency + content-SHA drift to provenance_audit_log; surfaces on /admin/provenance-audit. |
ops-heartbeat | 17 17 * * * | src/app/api/cron/ops-heartbeat/route.ts | Daily strict operations heartbeat — the Vercel-boundary watchdog exception: persists ledger checks and incident evidence, dispatches required operations alerts, and pings the dedicated deadman only after an observable green completion. It remains Vercel-bound so a missed deadman ping detects scheduler, proxy, or invocation failures that produce no application ledger row. |
platform-stats-snapshot | 30 7 * * * | src/app/api/cron/platform-stats-snapshot/route.ts | Daily dated snapshot of headline platform-coverage counts into platform_stats_snapshots; invalidates both production cache domains, regenerates the homepage, /sources, discovery artifacts, and API docs, then verifies the published observation date. |
schema-audit | 0 6 * * 0 | src/app/api/cron/schema-audit/route.ts | Weekly Sunday rich-results / Schema.org test against every public surface; logs to schema_audit_reports. |
submit-gsc-sitemaps | 15 3 * * * | src/app/api/cron/submit-gsc-sitemaps/route.ts | Daily Google Search Console submission for the canonical Fonteum sitemap. |
Decision tree — including the Vercel-boundary watchdog exception.
- Does the job need step-level retries, idempotency, or step-orchestration? → Inngest.
- Does the job emit events that downstream Inngest functions consume? → Inngest.
- Does the job need observability beyond simple HTTP-200/non-200? → Inngest.
- Lightweight HTTP-only operation that completes in seconds and does not need step orchestration? → Vercel cron.
ops-heartbeatis the explicit Vercel-boundary watchdog exception: use Vercel cron when an external deadman must detect a scheduler, proxy, or invocation failure before an application ledger row can exist.
When unclear, default to Inngest — it is strictly more capable. The documented ops-heartbeat boundary watchdog is the narrow exception. The tools/cron-ownership-check.sh CI gate blocks any job that lands in both systems and any job that is missing from this page’s registry.