Architecture decision ADR-018

Product data is maintained through the CMS

Accepted · 2026-10-20

Historical decision text is preserved. Accepted describes the decision, not deployment of every capability discussed. Consult the Architecture and Infrastructure tabs for the verified running system.

Supersedes or amends: ADR-007

Date: 2026-10-20
Status: Accepted
Deciders: Daniel Meza
Supersedes: ADR-007
Related: ADR-012 — Python FastAPI for the API, ADR-016 — Lightweight admin auth, Architecture reference


Context

ADR-007 chose a hybrid ingestion pipeline: scheduled scrapers and PDF parsers per issuer, plus manual CSV upload, run by a separate ingestion service that wrote canonical product rows and tracked failures. Its premise was that Costa Rican banks publish no machine-readable feeds, so data would be collected automatically and editors would only override.

Since then the CMS shipped (FEAT-018 to FEAT-024): editors create and edit issuers, products, editorial reviews, offers, articles, and guides through the admin UI and /api/v1/admin/**. That became the real data path. The ingestion service stayed in the repository, but nothing in the codebase calls its API proxy, the local dev stack (pnpm dev:local) does not start it, and editors never interact with it. Meanwhile it cost maintenance: a second Python service, its tests, a proxy in the API, an ingestion_runs table, and documentation for sources nobody scraped.

Decision

Product data is created and updated only by editors through the CMS. There is no ingestion service, no ingestion API, and no ingestion bookkeeping in the database.

Considered alternatives

Consequences

Positive

Negative / to watch

Deployment order

Migration 0010 is destructive. Deploy the API first (it no longer reads the dropped columns, so it works against both schemas), then run the migration, and snapshot the database before each production change.