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:
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| Archivo | Qué contiene |
|---|---|
layers.json | Registro de las 12 capas evaluadas, con la evidencia del sondeo: qué permite cada servicio sin credenciales y, si no permite nada, por qué. |
cells.json | Cada valor con citation_id, source_url y source_field — el atributo exacto del que salió. Incluye los huecos declarados. |
asadas.json | Los 7 acueductos comunales del distrito con su población abastecida, servicios, fuentes y caudal. |
agri-zones.json | Las 10 zonas agropecuarias del cantón de Nicoya; 2 cubren el área del piloto. |
boundary.json | El polígono oficial del distrito, verbatim del IGN. |
climate.json | Climatología mensual 2001–2020 en el punto de Nosara. |
question-pack.json | 17 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
SDEde 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, noofficial: 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.
| Capa | Qué bloquea | Qué lo desbloquearía |
|---|---|---|
| INEC — Marco Geoestadístico | El 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 — catastro | El 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 Terrestre | WMS-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 — concesiones | Las 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 Nosara | SENARA 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 Nicoya | De 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.tsfalla si una celda marcadagaptrae un valor, o si una celda con valor no trae cita.Nada derivado se presenta como oficial.
coveragedistingueofficial(lo afirma una institución),modeled(reanálisis) yderived(cálculo nuestro, con el método nombrado). La suma de población abastecida por ASADAS esderivedy 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_ltsyAprobados_MINAE_ltsdel AyA son enteros sin metadato de unidad. El corte publica el valor crudo conunit: "n/d"y una advertencia, en vez de asumir l/s. Lo mismo con el campoVALORdel 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:
- Ninguna fila sin
citation_idysource_url. - Lo sintético se declara y no viaja como real. Un sobre
audience: "public"con una sola filasynthetic-examplees inválido. Es la regla que impide que un ejemplo de plantilla se venda como dato de cooperativa en vivo. - Los huecos viajan en el payload.
gaps[]acompaña arows[], 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/:
| Archivo | Público | Contenido |
|---|---|---|
nosara-public.json / .csv | public | 21 filas y 7 huecos. Solo extractos de capas públicas. Publicable. |
nosara-boundary.geojson | public | El polígono oficial con el sobre de procedencia. |
coop-template-counterpart.json | counterpart | 3 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-sensitivityy, cuando existe registro público equivalente,x-reconciles-with. Asíwater_right_idapunta a la capa de concesiones de la Dirección de Agua,ont_zone_codea las zonas del ONT yasada_operator_idal 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:
- 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.
- 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.
- 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.