Methodology

v1.0 · last updated 2026-05-23

Substation Spain exists for one reason: to give institutional buyers — infra funds, hyperscaler corp-dev, regulators, analysts — a feed of Spanish data center regulatory activity that survives a one-hour call with a Stonepeak MD asking to trace 5 records to their primary source.

Every design decision below stems from that single requirement.

1. Source whitelist — 15 fuentes oficiales en 3 capas

We pull only from primary government sources. Coverage built layer-by-layer to match how the Spanish regulatory pipeline actually works — national → autonómico → municipal — plus the procurement channel that surfaces obras DC before the EIA hits the boletín.

a. Capa nacional (3 fuentes)

b. Capa autonómica (6 CCAAs)

c. Capa provincial (1 fuente — aggregator BCN)

d. Capa municipal (17 ayuntamientos activos en 5 plataformas)

Backlog técnico (sin cobertura activa hoy): e-TAULER 10 munis catalanes (React SPA — sustituido por BOPB provincial), ABSIS 4 munis (Talavera/Meta + Toledo + Tres Cantos + Huesca — pendiente AJAX POST emulation), DOGV Comunidad Valenciana (iframe Angular SPA — pendiente headless o pivot a bop.dival.es). Scraper code está en el repo; el cron diario está desactivado hasta resolver bloqueador técnico.

Each source is a Source plugin under scripts/. Adding a new municipio en una plataforma template = 1 línea de código.

We never use as source:

Trade press is useful for cross-checking our work, never for sourcing it. The complete whitelist with audit trail lives in docs/KICKOFF.md §5.1.

2. Provenance metadata per field

Every published value carries four pieces of metadata:

Missing any one of the four → the field is invalid → the record is not published. Enforced at the database layer.

3. NOT_FOUND is the default

If a DIA does not literally state a MW figure within a DC-context window (regex within ±100 chars of a DC keyword), we publish NOT_FOUND. We do not:

NOT_FOUND is a feature, not a bug. Transparency is the moat.

4. Three public confidence tiers

Records are tagged with exactly one of three tiers:

There is no ESTIMATED tier. The invariant is tested programmatically — see tests/test_smoke_sprint1.py check "No ESTIMATED tier exists".

5. LLM use restricted to three operations

We use Claude only for:

The LLM never:

6. Two-pass verification + spot check

Before any record is marked VERIFIED in the database:

Before any release, 10 random records are manually opened and checked against the live source. Failure → halt + investigate root cause.

7. Public audit log

Every scrape run, verification pass, spot check and correction is logged to a public table. Daily snapshots are committed to github.com/beltransimo/substation-spain/audit. Every change is reproducible.

8. Corrections workflow

Found an error? Open a correction issue on GitHub. Every correction is cited in the next version's audit log. The friction of corrections is intentional — it demonstrates discipline.


Questions? contact@substation.es