Skip to content

Piloto Costa Rica — Nosara y cooperativa agrícola ​

Estado: BORRADOR. El alcance del piloto todavía no está confirmado con la contraparte (ver HOLD). Todo lo que sigue se construyó sin credenciales de nadie: solo geoservicios públicos del Estado costarricense. Eso es deliberado — el piloto tenía que poder sostenerse antes de que llegara cualquier acceso, y ahora se sostiene.

El piloto responde a una pregunta incómoda: ¿cuánto se puede saber de un distrito costarricense sin pedirle nada a nadie? La respuesta resultó ser bastante, pero no lo que uno esperaría. Hay padrón de acueductos comunales con población abastecida por operador; no hay población censal. Hay zonificación agropecuaria con valores fiscales; no hay predios. Ese contraste es el producto.

Qué se cargó ​

Todo vive bajo public/data/cr-pilot/nosara/ y se regenera con un solo comando:

bash
bun run scripts/cr-pilot/ingest-nosara.ts       # sondea y reescribe el corte
bun run scripts/cr-pilot/build-question-pack.ts # recalcula el pack de preguntas
bun run scripts/cr-pilot/build-export.ts        # reemite las muestras del contrato
ArchivoQué contiene
layers.jsonRegistro de las 12 capas evaluadas, con la evidencia del sondeo: qué permite cada servicio sin credenciales y, si no permite nada, por qué.
cells.jsonCada valor con citation_id, source_url y source_field — el atributo exacto del que salió. Incluye los huecos declarados.
asadas.jsonLos 7 acueductos comunales del distrito con su población abastecida, servicios, fuentes y caudal.
agri-zones.jsonLas 10 zonas agropecuarias del cantón de Nicoya; 2 cubren el área del piloto.
boundary.jsonEl polígono oficial del distrito, verbatim del IGN.
climate.jsonClimatología mensual 2001–2020 en el punto de Nosara.
question-pack.json17 preguntas de actores con su estado calculado desde las celdas.

El corte, en una línea: 11 celdas oficiales, 2 modeladas, 8 derivadas y 7 huecos declarados.

Las fuentes que sí respondieron ​

  • IGN — División Territorial Administrativa (WFS). El límite oficial del distrito de Nosara, código DTA 50206, cantón Nicoya, provincia Guanacaste, región Chorotega, creado por Acuerdo 40 (oficializado 1988-01-26). Superficie oficial 133,65 km² según el atributo SDE de la capa. El corte recalcula el área sobre la geometría (134,12 km²) y publica ese número marcado como derivado, solo como verificación cruzada: la diferencia viene de la proyección CRTM05 del IGN y no habilita a corregir la cifra oficial.

  • AyA — padrón de entes operadores delegados (ASADAS) (WFS). La capa más valiosa del corte. En Nosara el agua potable no la presta la municipalidad sino 7 asociaciones comunitarias, que en conjunto declaran abastecer a 13.334 personas con 3.810 servicios y 35 fuentes. Playa Nosara (4.627 personas) y Bocas de Nosara (3.769) son las dos grandes; Bosque Verde, con 210, es la más pequeña. El padrón desagrega además las 10 comunidades servidas — Playa Guiones, Playa Pelada, Santa Marta, Arenales, Las Delicias — que es un grano sub-distrital que ninguna otra capa pública ofrece.

  • ONT (Hacienda) — Zonas Agropecuarias (WFS). Dos zonas de la Plataforma de Valores Agropecuarios cubren el área del piloto: 502A09 «Nosara Guiones Bote» (3.201 ha) y 502A10 «Esperanza Sur El Silencio» (8.040 ha). Es el ancla pública más cercana a la economía agrícola de una cooperativa local.

  • SINAC — Áreas Silvestres Protegidas (WFS). El Refugio Nacional de Vida Silvestre Ostional, creado por Ley 6919 (1983), Área de Conservación Tempisque. Condiciona el uso del suelo del litoral del distrito. El corte no afirma qué porcentaje de Nosara solapa: eso exige una intersección geométrica que no se hizo, y afirmarla sin hacerla sería inventar.

  • NASA POWER — climatología MERRA-2 2001–2020. Precipitación media anual de 4,73 mm/día y temperatura media de 27,59 °C en el punto del distrito, con una estación seca de enero a abril (0,45 mm/día). Va marcada como modeled, no official: es reanálisis global, no una estación del IMN.

Las que no ​

Esta lista vale tanto como la anterior. Cada línea es un pedido concreto.

CapaQué bloqueaQué lo desbloquearía
INEC — Marco GeoestadísticoEl geoservidor corta el handshake TLS y inec.cr responde 403 a clientes no-navegador.Descarga manual del geoportal, o un endpoint estable acordado con el INEC.
Registro Inmobiliario — catastroEl nodo publica solo WMS: imagen de mapa, sin atributos de finca.Consulta autenticada en el SIRI, o convenio para acceso masivo.
ICT — Zona Marítimo TerrestreWMS-only y el endpoint devolvió HTTP 502 en el sondeo.Reintentar; y pedir a la municipalidad el plan regulador costero, que es el instrumento vinculante.
Dirección de Agua — concesionesLas 37 capas son WMS. No hay lectura abierta del expediente.Solicitud de información pública por las concesiones del distrito.
SENARA — acuífero de NosaraSENARA publica 51 capas de vulnerabilidad y recarga y ninguna cubre Nosara.Consultar si existe un estudio no publicado. Las vecinas (Sámara-MalaNoche, Marbella, Nimboyores, río Ario) no se extrapolan.
Municipalidad de NicoyaDe los 33 nodos municipales del SNIT, ninguno es Nicoya.Contacto institucional directo. Es el hueco estructural del piloto.

Las reglas de honestidad, y dónde se hacen cumplir ​

No son prosa: son código con tests.

  • Un hueco es value: null, nunca un cero. Si el dato no existe en fuente pública, la celda lo dice y explica por qué. nosara-slice.test.ts falla si una celda marcada gap trae un valor, o si una celda con valor no trae cita.

  • Nada derivado se presenta como oficial. coverage distingue official (lo afirma una institución), modeled (reanálisis) y derived (cálculo nuestro, con el método nombrado). La suma de población abastecida por ASADAS es derived y su nota dice explícitamente que no es población censal.

  • Si la fuente no declara la unidad, nosotros tampoco la inventamos. Los campos Total_Caudal, Caudal_Requerido_lts y Aprobados_MINAE_lts del AyA son enteros sin metadato de unidad. El corte publica el valor crudo con unit: "n/d" y una advertencia, en vez de asumir l/s. Lo mismo con el campo VALOR del ONT: no se sabe si la base es por hectárea o por m², así que no se emite una cifra monetaria.

  • Los defectos del padrón de origen se marcan, no se borran. El WFS del AyA trae una comunidad sin nombre con coordenada centinela que cae en el Caribe. Se conserva con flags: ["nombre-ausente-en-origen", "coordenada-fuera-del-distrito"]. Borrarla haría que el corte pareciera más limpio de lo que la fuente realmente está.

  • Minimización de datos de contacto. El padrón del AyA publica teléfono, correo y dirección de cada ASADA. El corte los descarta: el piloto necesita el registro operativo, no un directorio. Hay un test que lo verifica.

El contrato de exportación ​

server/cr-pilot/contract.ts define lo que sale de Futuros hacia la contraparte. Es un sobre con procedencia obligatoria y tres reglas que el validador hace cumplir en código:

  1. Ninguna fila sin citation_id y source_url.
  2. Lo sintético se declara y no viaja como real. Un sobre audience: "public" con una sola fila synthetic-example es inválido. Es la regla que impide que un ejemplo de plantilla se venda como dato de cooperativa en vivo.
  3. Los huecos viajan en el payload. gaps[] acompaña a rows[], y cada hueco debe nombrar su bloqueo y su vía de salida.

Cada sobre se sella con un SHA-256 del contenido canonicalizado de rows (claves ordenadas, para que el digest no dependa del orden de propiedades). Un test recalcula el digest de las muestras comprometidas: si alguien edita una muestra a mano, el test falla.

Formatos. JSON es el canónico. CSV y GeoJSON son proyecciones del mismo sobre. El CSV repite las columnas de procedencia en cada fila a propósito: un CSV se abre en Excel y se separa de su envoltorio, así que la cita tiene que viajar dentro de la fila o se pierde.

Muestras en server/cr-pilot/samples/:

ArchivoPúblicoContenido
nosara-public.json / .csvpublic21 filas y 7 huecos. Solo extractos de capas públicas. Publicable.
nosara-boundary.geojsonpublicEl polígono oficial con el sobre de procedencia.
coop-template-counterpart.jsoncounterpart3 filas sintéticas de la plantilla. El validador prohíbe estas filas en un sobre público.

Cadencia. Hoy on-request, que es lo honesto para un borrador sin contraparte confirmada. Al cerrarse el alcance se fija en trimestral para las capas del SNIT (que se actualizan sin calendario público) y anual para la climatología. La institución productora manda: si el AyA o el IGN publican un valor distinto, el de la institución es el correcto y el export está viejo.

La plantilla de cooperativa ​

public/data/cr-pilot/coop-template/schema.json describe la ficha de una cooperativa agrícola: socios, fincas, hectáreas, cultivo, identificadores de derecho de agua, producción por ciclo. No contiene ni un dato real, y ese es el punto: se publica vacía para que la conversación de acceso sea sobre campos concretos en vez de sobre una idea.

Dos decisiones de diseño que vale explicitar:

  • Se piden conteos de socios, nunca un padrón nominal. Ninguna pregunta del piloto necesita saber quién es socio.
  • Cada campo declara x-sensitivity y, cuando existe registro público equivalente, x-reconciles-with. Así water_right_id apunta a la capa de concesiones de la Dirección de Agua, ont_zone_code a las zonas del ONT y asada_operator_id al padrón del AyA. La ficha nace sabiendo contra qué se va a conciliar — y un test verifica que esas referencias apunten a capas que existen de verdad en el registro.

Sin provenance.consent no se ingiere nada. Los dos fixtures (fixture-empty.json y fixture-example.json) llevan source: "fixture" y consent.granted: false, de modo que si alguno se ingiere por error queda fuera de cualquier export público por construcción.

El pack de preguntas ​

17 preguntas que una municipalidad, una ASADA o una cooperativa harían de verdad — ver el pack completo.

Lo que lo hace útil no es la lista: es que el estado se calcula, no se escribe. Cada pregunta declara las celdas que necesita, y el generador la marca:

  • 🟢 live (10) — todas sus celdas tienen valor.
  • 🟡 partial (2) — se puede responder con salvedad explícita (confianza baja o unidad no declarada). Son las de caudal y valor de tierra.
  • 🔴 cant-answer (5) — alguna celda es un hueco declarado.

Si una fuente deja de responder y se regenera el corte, la pregunta afectada cae sola a cant-answer. Es la propiedad que impide que el pack prometa lo que el dato ya no sostiene, y hay un test que verifica que ningún estado contradiga a las celdas.

src/lib/cr-pilot-pack.ts expone el pack tipado para que una superficie de chat o de pack lo pinte. El loader no decide nada: solo lee el estado ya calculado, y descarta cualquier pregunta malformada en vez de pintarla.

HOLD — lo que falta decidir ​

Este PR asume Nosara + una cooperativa agrícola genérica porque había que elegir algo para poder construir. Sigue abierto con la contraparte:

  1. Cuál es el hilo del piloto — ¿Nosara, una mesa municipal, un trabajo a escala de estado, o una cooperativa nombrada? El corte de capas públicas sirve igual para cualquier distrito costarricense; lo que cambiaría es el filtro territorial.
  2. Las preguntas reales de los actores — las 17 del pack son plausibles y están ancladas al dato, pero nadie de la municipalidad ni de una ASADA las validó todavía.
  3. El acceso a la cooperativa — qué organización, con qué consentimiento y con qué cadencia. La plantilla está lista; los datos no existen.

Nada de esto bloquea lo ya construido: el corte público, el contrato y el pack funcionan hoy y se rehacen con tres comandos si el alcance cambia.

Pilares que sirve ​

  • Fideicomiso de Datos — la plantilla de cooperativa modela consentimiento y sensibilidad por campo antes de que exista un solo registro; el contrato impide que un dato privado salga disfrazado de público.
  • Inteligencia de Frontera — el corte y el contrato son el primer caso de inteligencia territorial a grano municipal/distrital para un actor local.

Cada cifra con su fuente — la trazabilidad es el contrato.