{
  "schemaVersion": 1,
  "generatedAt": "2026-08-21T23:38:34.355Z",
  "language": "es-AR",
  "title": "Catálogo de datos públicos de Datos Chivilcoy",
  "description": "Punto de entrada para asistentes, buscadores y crawlers que necesiten ubicar boletines oficiales, tasas municipales, proveedores detectados, transparencia presupuestaria, personal, organigrama y la propuesta HCD separada.",
  "site": {
    "name": "Datos Chivilcoy",
    "url": "https://datoschivilcoy.com.ar",
    "dataVisibilityInventory": "/data/data-visibility-inventory.json",
    "publicApiContract": "/data/public-api-contract.json",
    "llmsTxt": "/llms.txt",
    "sitemap": "/sitemap.xml"
  },
  "dataVisibility": {
    "inventoryUrl": "/data/data-visibility-inventory.json",
    "summary": {
      "totalItems": 10,
      "visibleItems": 6,
      "partialItems": 0,
      "apiOnlyItems": 1,
      "internalItems": 3
    },
    "guidance": [
      "Usar visibility para distinguir datos visibles en pantalla, datos visibles parcialmente y datos disponibles solo por API.",
      "Usar improvementNotes como notas de mejora o mantenimiento operativo, no como faltantes de publicación."
    ]
  },
  "publicApi": {
    "contractUrl": "/data/public-api-contract.json",
    "preferredForAgents": true,
    "responseEnvelope": {
      "success": {
        "ok": true,
        "data": "payload de la acción solicitada"
      },
      "failure": {
        "ok": false,
        "error": "mensaje estable de error"
      }
    },
    "endpoints": [
      {
        "action": "supabase_status",
        "description": "Diagnóstico vivo de lecturas públicas Supabase, cache server-side y fuente MySQL administrativa.",
        "example": "/api/index.php?action=supabase_status",
        "sourceModels": [
          "official_bulletin_search_index",
          "procurement_supplier_records",
          "ai_public_search_documents"
        ]
      },
      {
        "action": "bulletin_search",
        "description": "Búsqueda textual paginada en bloques del Boletín Oficial vía Supabase REST y proxy PHP.",
        "example": "/api/index.php?action=bulletin_search&q=licitacion&limit=10",
        "sourceModels": [
          "official_bulletin_search_index"
        ]
      },
      {
        "action": "procurement_suppliers",
        "description": "Líneas proveedor normalizadas, ranking agregado y estado de montos detectados en boletines.",
        "example": "/api/index.php?action=procurement_suppliers&year=2023&limit=100",
        "sourceModels": [
          "procurement_supplier_records",
          "procurement_supplier_summary"
        ]
      },
      {
        "action": "public_finance",
        "description": "Rendición de cuentas, métricas presupuestarias y tasas municipales reconstruidas desde Supabase.",
        "example": "/api/index.php?action=public_finance&year=2025",
        "sourceModels": [
          "accountability_reports",
          "accountability_metrics",
          "municipal_tax_rows"
        ]
      },
      {
        "action": "public_search",
        "description": "Búsqueda full-text de Datos Chivilcoy sobre boletines, transparencia, tasas y documentos; excluye el prototipo HCD.",
        "example": "/api/index.php?action=public_search&q=deuda%20flotante&limit=5",
        "sourceModels": [
          "search_data_portal_corpus",
          "ai_public_search_documents"
        ]
      }
    ],
    "guidance": [
      "Preferir estos endpoints sobre descargar JSON grandes cuando la consulta sea textual, paginada o de estado.",
      "Usar limit y offset cuando existan; no asumir que una respuesta trae todo el corpus.",
      "Citar sourceUrl, pdf_url, document_url, route o internal_url cuando se use un dato como evidencia.",
      "Tratar proveedores y montos como datos auditados parcialmente: revisar status, amount y amount_label antes de afirmar totales.",
      "Si un endpoint devuelve 502/503, usar los JSON documentados en ai-catalog.json como fallback operativo."
    ]
  },
  "supabase": {
    "status": {
      "projectName": "Chivilcoy",
      "projectRef": "nqftlaviydpsqbbdvthr",
      "schemaApplied": true,
      "bulkImportsPrepared": true,
      "bulkImportsLoaded": true,
      "productionProxyConfigured": true,
      "primarySqlReadActiveForBulletinSearch": true,
      "bulletinSearchSqlFiltersActive": true,
      "primarySqlReadActiveForProcurementSuppliers": true,
      "primarySqlReadActiveForPublicFinance": true,
      "fallbackJsonActive": true,
      "primarySqlReadActiveForPublicLegislative": true,
      "primarySqlReadActiveForAiSearch": true,
      "productionProxyCacheActive": true,
      "publicSiteApiSyncPrepared": true,
      "publicSnapshotSourceDiagnosticActive": true,
      "legislativeAdminSchemaApplied": true,
      "legislativeAdminBootstrapLoaded": true,
      "legislativeAdminAnonAccessDisabled": true,
      "legislativeAdminRuntimeMirrorPrepared": true,
      "aiSearchRefreshRpcApplied": true
    },
    "manifestUrl": "/data/supabase-public-schema.json",
    "readModel": "Supabase es fuente SQL primaria para búsqueda textual de boletines, proveedores, transparencia presupuestaria, tasas, snapshot legislativo público y búsqueda full-text unificada para agentes por proxy PHP con cache server-side stale-if-error; JSON/seeds quedan como fallback operativo.",
    "runtime": {
      "statusEndpoint": "/api/index.php?action=supabase_status",
      "searchEndpoint": "/api/index.php?action=bulletin_search",
      "procurementEndpoint": "/api/index.php?action=procurement_suppliers",
      "financeEndpoint": "/api/index.php?action=public_finance",
      "primaryReadStrategy": "Usar el proxy PHP para consultas públicas paginadas cuando esté configurado; conservar JSON como fallback operativo.",
      "statusEndpointGuarantee": "No expone claves. Devuelve configuración, disponibilidad REST, conteos por vista pública y siguiente paso operacional.",
      "aiSearchEndpoint": "/api/index.php?action=public_search&q=consulta",
      "publicProxyCache": {
        "location": "api/.cache/supabase-public",
        "serverSideOnly": true,
        "staleIfError": true,
        "survivesDeploy": true,
        "cachedActions": [
          "bulletin_search",
          "procurement_suppliers",
          "public_finance",
          "public_search"
        ]
      },
      "publicSiteSync": {
        "applySqlCommand": "npm run supabase:apply-sql -- tmp/reports/public-site-api-supabase-import.sql",
        "applySyncCommand": "npm run site:sync:supabase -- --apply",
        "exportSqlCommand": "npm run site:sql:supabase:api",
        "mysqlSourceAction": "/api/index.php?action=public_snapshot",
        "purgeCacheCommand": "npm run hostinger:purge-cache",
        "safeDryRunCommand": "npm run site:sync:supabase",
        "statusField": "/api/index.php?action=supabase_status -> data.publicSnapshotSource y data.syncSources",
        "strictMysqlSyncCommand": "npm run site:sync:supabase -- --apply --source public_snapshot --strict-source"
      },
      "legislativeAdminMigration": {
        "migrationSql": "docs/migrations/2026-06-27-legislative-admin-supabase.sql",
        "exportSqlCommand": "npm run legislative-admin:sql:supabase",
        "latestImportSql": "tmp/reports/legislative-admin-supabase-import.sql",
        "targetTables": [],
        "securityModel": "RLS activo en todas las tablas; anon sin SELECT/INSERT/UPDATE/DELETE; authenticated solo SELECT con perfil activo; escrituras publicas deshabilitadas.",
        "nextWriteStep": "Conectar el panel administrativo server-side a estas tablas o agregar policies de escritura finas despues de migrar usuarios a Supabase Auth."
      }
    },
    "readinessGate": {
      "script": "npm run supabase:readiness",
      "strictScript": "npm run supabase:readiness -- --strict",
      "requiredBeforePrimarySqlRead": true,
      "readyWhen": "Todas las tablas y vistas publicas responden por Data API y los conteos coinciden con importArtifacts.",
      "currentKnownState": "Las tablas estan creadas, la carga masiva fue importada y el proxy PHP de Hostinger esta configurado para lecturas Supabase REST. La busqueda textual de boletines, proveedores, transparencia presupuestaria, tasas, snapshot legislativo publico y busqueda IA full-text usan Supabase como lectura primaria; el proxy mantiene cache server-side stale-if-error y la web conserva JSON/seeds como respaldo.",
      "lastDatabaseCheck": {
        "checkedAt": "2026-06-27T20:47:57Z",
        "readiness": "ready",
        "method": "Supabase MCP execute_sql + advisors",
        "tablesWithExpectedCounts": 12,
        "checkedTables": 12,
        "checkedViews": 12,
        "viewRows": {
          "ai_public_corpus": 30527,
          "ai_public_search_documents": 30527,
          "official_bulletin_search_index": 29322,
          "procurement_supplier_line_reviews": 2695,
          "procurement_supplier_records": 2695,
          "procurement_supplier_summary": 358,
          "public_document_index": 181
        },
        "legislativeAdmin": {
          "checkedAt": "2026-06-27T22:12:37Z",
          "method": "Supabase MCP execute_sql + advisors",
          "securityAdvisors": "sin lints",
          "performanceAdvisors": "solo unused_index INFO; esperable en tablas recien creadas y no se removieron indices preventivos.",
          "rowCounts": {
            "blocks": 7,
            "councilors": 26,
            "documents": 0,
            "news": 3,
            "projectAuthors": 8,
            "projectTags": 8,
            "projectVotes": 104,
            "projects": 4,
            "sessionAttendance": 0,
            "sessions": 3,
            "staff": 6
          }
        },
        "aiSearchRefreshRpc": {
          "checkedAt": "2026-06-27T22:12:37Z",
          "function": "refresh_ai_public_search_documents",
          "migrationSql": "docs/migrations/2026-06-27-ai-search-refresh-rpc.sql",
          "executeGrants": [],
          "anonExecute": false,
          "authenticatedExecute": false,
          "lastVerifiedRows": 30527,
          "securityAdvisors": "sin lints"
        }
      },
      "lastProductionApiCheck": {
        "checkedAt": "2026-06-27T22:00:10Z",
        "endpoint": "/api/index.php?action=supabase_status",
        "readiness": "ready",
        "configured": true,
        "method": "Hostinger PHP proxy -> Supabase REST",
        "publicProxyCache": {
          "observed": true,
          "sample": "public_search Lucas Burgos: miss -> hit; 2627 ms -> 111 ms",
          "writable": true
        },
        "publicSnapshotSource": {
          "configured": false,
          "configFileExists": true,
          "pdoMysqlLoaded": true,
          "reachable": false,
          "missingKeys": [],
          "observedAt": "2026-06-27T21:29:33Z"
        },
        "viewRows": {
          "accountability_metrics": 965,
          "accountability_reports": 1,
          "ai_public_corpus": 30527,
          "ai_public_search_documents": 30527,
          "municipal_tax_rows": 17,
          "official_bulletin_search_index": 29322,
          "procurement_supplier_line_reviews": 2695,
          "procurement_supplier_records": 2695,
          "procurement_supplier_summary": 358,
          "public_document_index": 181
        },
        "legislativeAdmin": {
          "checkedAt": "2026-06-27T22:01:52Z",
          "method": "Supabase MCP execute_sql + advisors",
          "securityAdvisors": "sin lints",
          "performanceAdvisors": "solo unused_index INFO; esperable en tablas recien creadas y no se removieron indices preventivos.",
          "rowCounts": {
            "blocks": 7,
            "councilors": 26,
            "documents": 0,
            "news": 3,
            "projectAuthors": 8,
            "projectTags": 8,
            "projectVotes": 104,
            "projects": 4,
            "sessionAttendance": 0,
            "sessions": 3,
            "staff": 6
          }
        }
      },
      "lastSupabaseAdvisorCheck": {
        "checkedAt": "2026-06-27T22:01:52Z",
        "performance": "solo unused_index INFO en indices existentes y nuevos; no se removieron hasta medir uso real. EXPLAIN de busqueda selectiva usa Bitmap Index Scan sobre ai_public_search_documents_vector_idx",
        "security": "sin lints"
      }
    },
    "recommendedViewsForAgents": [
      {
        "view": "official_bulletin_search_index",
        "purpose": "Buscar bloques de boletines por texto, año, tipo, categoría derivada, calidad de texto, tema y ruta de lector.",
        "keyFields": [
          "block_key",
          "bulletin_id",
          "block_id",
          "bulletin_title",
          "year",
          "label",
          "title",
          "text_category",
          "quality_status",
          "body_preview",
          "body_search",
          "route",
          "pdf_url"
        ]
      },
      {
        "view": "procurement_supplier_summary",
        "purpose": "Ranking y resumen de proveedores con cantidad de líneas, montos y faltantes.",
        "keyFields": [
          "supplier_key",
          "supplier_name",
          "line_count",
          "amount_count",
          "missing_amount_count",
          "amount_total",
          "years"
        ]
      },
      {
        "view": "procurement_supplier_records",
        "purpose": "Vista unificada para renderizar proveedores sin descargar boletines completos: línea proveedor, acto, boletín, fecha, método, monto, fuente y enlace interno.",
        "keyFields": [
          "supplier_line_key",
          "supplier_key",
          "supplier_name",
          "act_label",
          "act_date",
          "contract_type",
          "amount",
          "amount_label",
          "bulletin_id",
          "block_id",
          "internal_url",
          "source_url"
        ]
      },
      {
        "view": "procurement_supplier_line_reviews",
        "purpose": "Líneas proveedor auditadas con fuente, revisión, monto y estado.",
        "keyFields": [
          "supplier_line_key",
          "review_key",
          "supplier_name",
          "amount",
          "amount_label",
          "source_url",
          "source_page",
          "status"
        ]
      },
      {
        "view": "accountability_reports",
        "purpose": "Rendiciones anuales con cifras base, ruta pública, periodo, fuente y documentos asociados.",
        "keyFields": [
          "report_year",
          "title",
          "route",
          "source_file",
          "period_label",
          "published_label",
          "figures",
          "source"
        ]
      },
      {
        "view": "accountability_metrics",
        "purpose": "Series y métricas presupuestarias normalizadas para transparencia: ingresos, gastos, deuda, modificaciones, metas y patrimonio.",
        "keyFields": [
          "report_year",
          "metric_group",
          "metric_key",
          "label",
          "amount",
          "note",
          "metadata"
        ]
      },
      {
        "view": "municipal_tax_rows",
        "purpose": "Rubros RAFAM 12.1 auditados con clasificación legal, monto, referencias normativas y trazabilidad.",
        "keyFields": [
          "tax_year",
          "code",
          "label",
          "legal_kind",
          "amount",
          "fiscal_reference",
          "impositive_reference",
          "traceability_note"
        ]
      },
      {
        "view": "ai_public_corpus",
        "purpose": "Corpus unificado para agentes IA: boletines, tasas, métricas de rendición, documentos y datos legislativos del sitio.",
        "keyFields": [
          "entity_type",
          "entity_id",
          "title",
          "summary",
          "body",
          "route",
          "source_url",
          "year",
          "tags",
          "metadata"
        ]
      },
      {
        "view": "ai_public_search_documents",
        "purpose": "Tabla cacheada con tsvector e índice GIN para búsqueda full-text pública. Usar preferentemente vía /api/index.php?action=public_search&q=consulta.",
        "keyFields": [
          "entity_type",
          "entity_id",
          "title",
          "summary",
          "route",
          "source_url",
          "year",
          "tags",
          "metadata"
        ]
      },
      {
        "view": "public_document_index",
        "purpose": "Inventario de PDFs y documentos públicos con owner y URL.",
        "keyFields": [
          "document_id",
          "owner_type",
          "owner_id",
          "title",
          "category",
          "url",
          "mime_type"
        ]
      },
      {
        "purpose": "Snapshot compacto para renderizar inicio, sesiones, proyectos, votaciones, concejales, bloques y noticias desde Supabase sin depender de MySQL.",
        "keyFields": [
          "snapshot_key",
          "generated_at",
          "councilors",
          "sessions",
          "projects",
          "news",
          "staff",
          "metadata"
        ]
      },
      {
        "purpose": "Indice para agentes IA sobre datos legislativos publicos: concejales, sesiones, proyectos, noticias y staff.",
        "keyFields": [
          "entity_type",
          "entity_id",
          "title",
          "summary",
          "body",
          "route",
          "year",
          "tags",
          "metadata"
        ]
      }
    ],
    "tables": [
      "official_bulletin_index",
      "official_bulletin_text_blocks",
      "public_documents",
      "accountability_reports",
      "accountability_metrics",
      "municipal_tax_rows",
      "ai_data_resources",
      "procurement_bulletins",
      "procurement_acts",
      "procurement_suppliers",
      "procurement_supplier_lines",
      "ai_public_search_documents"
    ],
    "restrictedTables": [],
    "importArtifacts": [
      {
        "path": "tmp/reports/public-content-supabase-import.sql",
        "rows": {
          "accountabilityMetrics": 965,
          "aiResources": 53,
          "bulletins": 198,
          "documents": 184,
          "municipalTaxRows": 17,
          "textBlocks": 29738
        }
      },
      {
        "path": "tmp/reports/procurement-supabase-import.sql",
        "rows": {
          "acts": 473,
          "bulletins": 108,
          "supplierLines": 2695,
          "suppliers": 358
        }
      },
      {
        "path": "tmp/reports/public-site-supabase-import.sql",
        "rows": {
          "councilors": 26,
          "news": 3,
          "projects": 4,
          "searchRows": 42,
          "sessions": 3,
          "snapshots": 1,
          "staffGroups": 4,
          "staffPeople": 6
        }
      },
      {
        "path": "tmp/reports/ai-search-supabase-refresh.sql",
        "rows": {
          "searchDocuments": 30527
        }
      },
      {
        "path": "tmp/reports/public-site-api-supabase-import.sql",
        "rows": {
          "councilors": 26,
          "news": 3,
          "projects": 4,
          "searchRows": 42,
          "sessions": 3,
          "snapshots": 1,
          "staffGroups": 4,
          "staffPeople": 6
        }
      },
      {
        "path": "tmp/reports/legislative-admin-supabase-import.sql",
        "rows": {
          "blocks": 7,
          "councilors": 26,
          "documents": 0,
          "news": 3,
          "projectAuthors": 8,
          "projectTags": 8,
          "projectVotes": 104,
          "projects": 4,
          "sessionAttendance": 0,
          "sessions": 3,
          "staff": 6
        }
      }
    ],
    "fallbackFiles": [
      "/data/ai-catalog.json",
      "/data/boletines/historicos-index.json",
      "/data/boletines/landing-summary.json",
      "/data/boletines/sibom-index.json",
      "/data/boletines/wordpress-index.json",
      "/data/tasas/tasas-2025.json",
      "/data/transparencia/rendicion-2025.json"
    ],
    "notes": [
      "Las tablas publicas tienen RLS activo y policies de SELECT para anon/authenticated.",
      "No hay policies de escritura publica; las cargas se hacen por SQL controlado o usuario de base.",
      "Los PDFs e imagenes permanecen como archivos; Postgres guarda texto, metadata y trazabilidad.",
      "La web conserva JSON publicos como fallback mientras se activa la lectura Supabase por pantalla.",
      "El proxy PHP guarda cache server-side de lecturas publicas en api/.cache/supabase-public; no cachea datos administrativos ni claves.",
      "bulletin_search acepta category y quality para resolver filtros frecuentes desde SQL/cache sin descargar historicos-index.json, wordpress-index.json ni sibom-index.json.",
      "Para sincronizar cambios legislativos hacia Supabase, usar npm run site:sync:supabase como dry-run seguro y npm run site:sync:supabase -- --apply para exportar, aplicar SQL, chequear readiness y purgar cache publico.",
      "supabase_status publica data.publicSnapshotSource para diagnosticar si MySQL puede alimentar public_snapshot sin exponer host, usuario, base ni contrasena."
    ]
  },
  "sections": [
    {
      "id": "boletines",
      "title": "Boletín Oficial Municipal",
      "route": "/boletines",
      "description": "Índices de boletines históricos, WordPress anterior y SIBOM con bloques de texto buscables, fechas, temas, PDF fuente y enlace interno al lector.",
      "stats": {
        "byIndex": {
          "internos": 1,
          "historicos": 28,
          "wordpress": 52,
          "sibom": 118
        },
        "byType": {
          "Referencia": 1,
          "Boletín Oficial": 146,
          "Decreto": 24,
          "Ordenanza": 22,
          "Ordenanza fiscal": 3,
          "Ordenanza impositiva": 3
        },
        "bulletinCount": 199,
        "latest": [
          {
            "id": "sibom-118",
            "title": "Boletín Oficial Municipal - Edición Nº 118",
            "type": "Boletín Oficial",
            "publishedAt": "2026-08-14",
            "readerRoutePattern": "/boletines/sibom-118/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-118.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-118.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-117",
            "title": "Boletín Oficial Municipal - Edición Nº 117",
            "type": "Boletín Oficial",
            "publishedAt": "2026-08-05",
            "readerRoutePattern": "/boletines/sibom-117/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-117.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-117.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-116",
            "title": "Boletín Oficial Municipal - Edición Nº 116",
            "type": "Boletín Oficial",
            "publishedAt": "2026-06-24",
            "readerRoutePattern": "/boletines/sibom-116/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-116.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-116.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-115",
            "title": "Boletín Oficial Municipal - Edición Nº 115",
            "type": "Boletín Oficial",
            "publishedAt": "2026-05-19",
            "readerRoutePattern": "/boletines/sibom-115/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-115.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-115.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-114",
            "title": "Boletín Oficial Municipal - Edición Nº 114",
            "type": "Boletín Oficial",
            "publishedAt": "2026-04-24",
            "readerRoutePattern": "/boletines/sibom-114/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-114.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-114.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-113",
            "title": "Boletín Oficial Municipal - Edición Nº 113",
            "type": "Boletín Oficial",
            "publishedAt": "2026-03-30",
            "readerRoutePattern": "/boletines/sibom-113/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-113.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-113.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-112",
            "title": "Boletín Oficial Municipal - Edición Nº 112",
            "type": "Boletín Oficial",
            "publishedAt": "2026-02-23",
            "readerRoutePattern": "/boletines/sibom-112/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-112.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-112.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          },
          {
            "id": "sibom-111",
            "title": "Boletín Oficial Municipal - Edición Nº 111",
            "type": "Boletín Oficial",
            "publishedAt": "2026-01-22",
            "readerRoutePattern": "/boletines/sibom-111/{textBlockId}",
            "textBlocksUrl": "/data/boletines/sibom/edicion-111.json",
            "pdfUrl": "/documents/boletines/sibom/chivilcoy-111.pdf",
            "sourceUrl": "https://chivilcoy.gov.ar/boletinoficial/2017/01/sistema-de-boletines-oficiales-municipales-sibom/"
          }
        ],
        "maxYear": 2026,
        "minYear": 2010,
        "textBlockCount": 29739,
        "years": [
          2010,
          2011,
          2012,
          2013,
          2014,
          2015,
          2016,
          2017,
          2018,
          2019,
          2020,
          2021,
          2022,
          2023,
          2024,
          2025,
          2026
        ]
      },
      "readerRoutePattern": "/boletines/{bulletinId}/{textBlockId}",
      "machineReadableFiles": [
        {
          "url": "/data/boletines/landing-summary.json",
          "format": "json",
          "schema": "BulletinLandingSummary",
          "mainFields": [
            "bulletinCount",
            "textBlockCount",
            "reviewedCount",
            "needsReviewCount",
            "categoryStats",
            "latestBulletins",
            "years",
            "types"
          ]
        },
        {
          "url": "/data/boletines/historicos-index.json",
          "format": "json",
          "schema": "OfficialBulletin[]",
          "mainFields": [
            "id",
            "title",
            "type",
            "year",
            "publishedAt",
            "summary",
            "textBlocks",
            "sourceUrl",
            "pdfUrl",
            "textBlocksUrl",
            "tags"
          ]
        },
        {
          "url": "/data/boletines/wordpress-index.json",
          "format": "json",
          "schema": "OfficialBulletin[]",
          "mainFields": [
            "id",
            "title",
            "type",
            "year",
            "publishedAt",
            "summary",
            "textBlocks",
            "sourceUrl",
            "textBlocksUrl",
            "tags"
          ]
        },
        {
          "url": "/data/boletines/sibom-index.json",
          "format": "json",
          "schema": "OfficialBulletin[]",
          "mainFields": [
            "id",
            "title",
            "type",
            "year",
            "publishedAt",
            "summary",
            "textBlocks",
            "sourceUrl",
            "pdfUrl",
            "textBlocksUrl",
            "tags"
          ]
        }
      ],
      "queryHints": [
        "Buscar por número de decreto, ordenanza, expediente, licitación, proveedor, año o tema.",
        "Para citar una fuente, preferir pdfUrl/sourceUrl y el bloque textBlocks[].id."
      ]
    },
    {
      "id": "proveedores",
      "title": "Proveedores y contrataciones detectadas en boletines",
      "route": "/boletines/proveedores",
      "description": "Datasets de líneas de proveedores detectadas en actos de contratación 2010-2014, 2015-2023, 2019-2023 y 2023-2026, con normalización sugerida, método, expediente, boletín, fuente, monto revisado y faltantes de monto publicado.",
      "stats": {
        "periods": [
          {
            "focusEndYear": 2014,
            "focusStartYear": 2010,
            "missingAmountRows": 0,
            "reviewedSupplierRows": 0,
            "supplierCandidateRows": 0
          },
          {
            "focusEndYear": 2023,
            "focusStartYear": 2015,
            "missingAmountRows": 588,
            "reviewedSupplierRows": 1795,
            "supplierCandidateRows": 1796
          },
          {
            "focusEndYear": 2023,
            "focusStartYear": 2019,
            "missingAmountRows": 569,
            "reviewedSupplierRows": 1661,
            "supplierCandidateRows": 1662
          },
          {
            "focusEndYear": 2026,
            "focusStartYear": 2023,
            "missingAmountRows": 1233,
            "reviewedSupplierRows": 1251,
            "supplierCandidateRows": 1251
          }
        ],
        "focusStartYear": 2023,
        "focusEndYear": 2026,
        "focusRows": 1367,
        "supplierCandidateRows": 1251,
        "reviewedSupplierRows": 1251,
        "reviewedAmountRows": 1251,
        "topSupplierCandidates": [
          {
            "firstDate": "2023-02-08",
            "latestDate": "2026-04-30",
            "lineRows": 44,
            "methods": [
              "Concurso de precios",
              "Licitación privada"
            ],
            "score": 692,
            "sourceRows": 44,
            "supplierKey": "nea srl",
            "supplierName": "NEA S.R.L.",
            "variantCount": 1,
            "variants": [
              "NEA S.R.L."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-03-23",
            "latestDate": "2025-05-09",
            "lineRows": 30,
            "methods": [
              "Concurso de precios",
              "Licitación privada"
            ],
            "score": 474,
            "sourceRows": 30,
            "supplierKey": "nueva era rosario srl",
            "supplierName": "NUEVA ERA ROSARIO S.R.L.",
            "variantCount": 1,
            "variants": [
              "NUEVA ERA ROSARIO S.R.L."
            ],
            "years": [
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-03-23",
            "latestDate": "2026-04-29",
            "lineRows": 28,
            "methods": [
              "Concurso de precios",
              "Licitación privada"
            ],
            "score": 452,
            "sourceRows": 28,
            "supplierKey": "l y s insumos sas",
            "supplierName": "L & S INSUMOS S.A.S.",
            "variantCount": 3,
            "variants": [
              "L & S INSUMOS S.A.S.",
              "L&S INSUMOS S.A.S.",
              "LYS INSUMOS S.A.S."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2026-02-05",
            "lineRows": 27,
            "methods": [
              "Licitación privada"
            ],
            "score": 437,
            "sourceRows": 27,
            "supplierKey": "sorrentino sa",
            "supplierName": "SORRENTINO S.A.",
            "variantCount": 1,
            "variants": [
              "SORRENTINO S.A."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2025-12-10",
            "lineRows": 26,
            "methods": [
              "Concurso de precios",
              "Licitación privada"
            ],
            "score": 422,
            "sourceRows": 26,
            "supplierKey": "medistore srl",
            "supplierName": "MEDISTORE S.R.L.",
            "variantCount": 1,
            "variants": [
              "MEDISTORE S.R.L."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-05-18",
            "latestDate": "2025-10-09",
            "lineRows": 26,
            "methods": [
              "Licitación privada"
            ],
            "score": 414,
            "sourceRows": 26,
            "supplierKey": "cientifica express srl",
            "supplierName": "CIENTIFICA EXPRESS S.R.L.",
            "variantCount": 2,
            "variants": [
              "CIENTIFICA EXPRESS S.R.L.",
              "CIENTÍFICA EXPRESS S.R.L."
            ],
            "years": [
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2026-04-29",
            "lineRows": 25,
            "methods": [
              "Licitación privada"
            ],
            "score": 407,
            "sourceRows": 25,
            "supplierKey": "pilona sa",
            "supplierName": "PILOÑA S.A.",
            "variantCount": 1,
            "variants": [
              "PILOÑA S.A."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-11-07",
            "latestDate": "2026-04-29",
            "lineRows": 25,
            "methods": [
              "Concurso de precios",
              "Licitación privada",
              "Licitación pública"
            ],
            "score": 399,
            "sourceRows": 25,
            "supplierKey": "martelletti hnos molino argentino srl",
            "supplierName": "MARTELLETTI HNOS. MOLINO ARGENTINO S.R.L.",
            "variantCount": 3,
            "variants": [
              "MARTELLETTI HNOS MOLINO ARGENTINO S.R.L.",
              "Martelletti Hnos. Molino Argentino S.R.L.",
              "MARTELLETTI HNOS. MOLINO ARGENTINO S.R.L."
            ],
            "years": [
              "2026",
              "2025",
              "2024"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2026-04-07",
            "lineRows": 24,
            "methods": [
              "Concurso de precios",
              "Licitación privada"
            ],
            "score": 392,
            "sourceRows": 24,
            "supplierKey": "sedesa sa",
            "supplierName": "SEDESA S.A.",
            "variantCount": 1,
            "variants": [
              "SEDESA S.A."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2026-03-18",
            "lineRows": 24,
            "methods": [
              "Licitación privada"
            ],
            "score": 392,
            "sourceRows": 24,
            "supplierKey": "deltorni srl",
            "supplierName": "DELTORNI S.R.L.",
            "variantCount": 1,
            "variants": [
              "DELTORNI S.R.L."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-03-23",
            "latestDate": "2026-03-18",
            "lineRows": 24,
            "methods": [
              "Licitación privada"
            ],
            "score": 392,
            "sourceRows": 24,
            "supplierKey": "dnm farma sa",
            "supplierName": "DNM FARMA S.A.",
            "variantCount": 1,
            "variants": [
              "DNM FARMA S.A."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          },
          {
            "firstDate": "2023-02-10",
            "latestDate": "2025-12-18",
            "lineRows": 24,
            "methods": [
              "Licitación privada"
            ],
            "score": 392,
            "sourceRows": 24,
            "supplierKey": "drogueria bella vista sa",
            "supplierName": "DROGUERIA BELLA VISTA S.A.",
            "variantCount": 2,
            "variants": [
              "DROGUERIA BELLA VISTA S.A.",
              "DROGUERÍA BELLA VISTA S.A."
            ],
            "years": [
              "2026",
              "2025",
              "2024",
              "2023"
            ]
          }
        ],
        "byYear": [
          {
            "rows": 172,
            "sourceRows": 25,
            "withDetectedAmountRows": 0,
            "withItemRows": 172,
            "withNormalizationSuggestionRows": 63,
            "year": "2026"
          },
          {
            "rows": 370,
            "sourceRows": 50,
            "withDetectedAmountRows": 0,
            "withItemRows": 370,
            "withNormalizationSuggestionRows": 162,
            "year": "2025"
          },
          {
            "rows": 413,
            "sourceRows": 73,
            "withDetectedAmountRows": 0,
            "withItemRows": 413,
            "withNormalizationSuggestionRows": 159,
            "year": "2024"
          },
          {
            "rows": 296,
            "sourceRows": 53,
            "withDetectedAmountRows": 6,
            "withItemRows": 296,
            "withNormalizationSuggestionRows": 66,
            "year": "2023"
          }
        ]
      },
      "machineReadableFiles": [
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2010-2014.json",
          "format": "json",
          "schema": "SupplierCandidateLineDataset",
          "mainFields": [
            "supplier_line_key",
            "fecha",
            "anio",
            "boletin",
            "acto",
            "tipo_contratacion",
            "expediente",
            "proveedor_detectado",
            "fuente_url",
            "enlace_interno"
          ]
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2010-2014.csv",
          "format": "csv",
          "schema": "SupplierCandidateLine[]"
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2015-2023.json",
          "format": "json",
          "schema": "SupplierCandidateLineDataset",
          "mainFields": [
            "supplier_line_key",
            "fecha",
            "anio",
            "boletin",
            "acto",
            "tipo_contratacion",
            "expediente",
            "proveedor_detectado",
            "fuente_url",
            "enlace_interno"
          ]
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2015-2023.csv",
          "format": "csv",
          "schema": "SupplierCandidateLine[]"
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2019-2023.json",
          "format": "json",
          "schema": "SupplierCandidateLineDataset",
          "mainFields": [
            "supplier_line_key",
            "fecha",
            "anio",
            "boletin",
            "acto",
            "tipo_contratacion",
            "expediente",
            "proveedor_detectado",
            "fuente_url",
            "enlace_interno"
          ]
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2019-2023.csv",
          "format": "csv",
          "schema": "SupplierCandidateLine[]"
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2023-2026.json",
          "format": "json",
          "schema": "SupplierCandidateLineDataset",
          "mainFields": [
            "supplier_line_key",
            "fecha",
            "anio",
            "boletin",
            "acto",
            "tipo_contratacion",
            "expediente",
            "proveedor_detectado",
            "fuente_url",
            "enlace_interno"
          ]
        },
        {
          "url": "/data/boletines/procurement-supplier-candidate-lines-2023-2026.csv",
          "format": "csv",
          "schema": "SupplierCandidateLine[]"
        },
        {
          "url": "/data/boletines/procurement-supplier-normalization-suggestions.json",
          "format": "json",
          "schema": "SupplierNormalizationSuggestionDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-normalization-suggestions-2019-2023.json",
          "format": "json",
          "schema": "SupplierNormalizationSuggestionDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-normalization-suggestions-2015-2023.json",
          "format": "json",
          "schema": "SupplierNormalizationSuggestionDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-normalization-suggestions-2010-2014.json",
          "format": "json",
          "schema": "SupplierNormalizationSuggestionDataset"
        },
        {
          "url": "/data/boletines/procurement-reviewed-overrides.json",
          "format": "json",
          "schema": "ProcurementReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-reviewed-overrides-2019-2023.json",
          "format": "json",
          "schema": "ProcurementReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-reviewed-overrides-2015-2023.json",
          "format": "json",
          "schema": "ProcurementReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-reviewed-overrides-2010-2014.json",
          "format": "json",
          "schema": "ProcurementReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-reviewed-lines.json",
          "format": "json",
          "schema": "ProcurementSupplierLineReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-reviewed-lines-2019-2023.json",
          "format": "json",
          "schema": "ProcurementSupplierLineReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-reviewed-lines-2015-2023.json",
          "format": "json",
          "schema": "ProcurementSupplierLineReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-reviewed-lines-2010-2014.json",
          "format": "json",
          "schema": "ProcurementSupplierLineReviewDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-missing-amount-lines-2010-2014.json",
          "format": "json",
          "schema": "ProcurementSupplierMissingAmountDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-missing-amount-lines-2015-2023.json",
          "format": "json",
          "schema": "ProcurementSupplierMissingAmountDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-missing-amount-lines-2019-2023.json",
          "format": "json",
          "schema": "ProcurementSupplierMissingAmountDataset"
        },
        {
          "url": "/data/boletines/procurement-supplier-missing-amount-lines-2023-2026.json",
          "format": "json",
          "schema": "ProcurementSupplierMissingAmountDataset"
        }
      ],
      "caveats": [
        "La detección combina extracción automática y revisión humana parcial.",
        "Los montos y proveedores deben citarse junto con fuente_url o enlace_interno cuando se usen como evidencia."
      ]
    },
    {
      "id": "condonaciones",
      "title": "Condonaciones y eximiciones aprobadas por ordenanza",
      "route": "/boletines/condonaciones",
      "description": "Listado nominal de ordenanzas de condonación o eximición con beneficiario extraído, DNI/CUIT y monto sólo cuando la norma los publica, deuda, período, fuente y coincidencias nominales a revisar con personal público.",
      "datasetGeneratedAt": "2026-08-21T21:41:16.000Z",
      "stats": {
        "ordinancesScanned": 877,
        "recordsCount": 877,
        "personRecordsCount": 659,
        "institutionRecordsCount": 44,
        "unresolvedRecordsCount": 174,
        "recordsWithDocumentCount": 0,
        "recordsWithAmountCount": 2,
        "recordsWithPublicLinkCount": 8,
        "yearFrom": 2010,
        "yearTo": 2026
      },
      "machineReadableFiles": [
        {
          "url": "/data/boletines/condonaciones-deuda.json",
          "format": "json",
          "schema": "DebtCondonationsDataset",
          "mainFields": [
            "beneficiaryName",
            "beneficiaryType",
            "documentNumber",
            "amount",
            "debtType",
            "debtPeriod",
            "ordinanceNumber",
            "actDate",
            "sourceRoute",
            "publicLink"
          ]
        },
        {
          "url": "/data/boletines/condonaciones-deuda.csv",
          "format": "csv",
          "schema": "DebtCondonationRecord[]"
        }
      ],
      "caveats": [
        "DNI/CUIT y monto quedan como no informados cuando la ordenanza no los publica.",
        "Una coincidencia nominal no prueba identidad, parentesco, irregularidad ni beneficio indebido."
      ]
    },
    {
      "id": "tasas",
      "title": "Tasas municipales",
      "route": "/tasas",
      "description": "Cruce entre rubros RAFAM 12.1 de la Rendición 2025 y Ordenanzas Fiscal/Impositiva 2025, con clasificación legal, monto, porcentaje y artículos fuente.",
      "stats": {
        "year": 2025,
        "rows": 17,
        "totals": {
          "totalIncome": 49677835517.65,
          "rafam121Total": 13270126131.760002,
          "strictRateTotal": 11686521252.94,
          "assimilatedTotal": 1583604878.8200016,
          "shareOfIncomePercent": 26.712367786324485
        }
      },
      "machineReadableFiles": [
        {
          "url": "/data/tasas/tasas-2025.json",
          "format": "json",
          "schema": "TaxRateDataset",
          "mainFields": [
            "code",
            "label",
            "legalKind",
            "amount",
            "shareOfRatesPercent",
            "shareOfIncomePercent",
            "fiscalReference",
            "impositiveReference",
            "purpose",
            "traceabilityNote"
          ]
        },
        {
          "url": "/data/tasas/tasas-2025.csv",
          "format": "csv",
          "schema": "TaxRate[]"
        }
      ]
    },
    {
      "id": "transparencia",
      "title": "Transparencia presupuestaria",
      "route": "/transparencia",
      "description": "Rendición de Cuentas municipal con cifras principales, series presupuestarias, documentos PDF fuente, deuda flotante, gastos, recursos y patrimonio.",
      "stats": {
        "title": "Rendición de Cuentas 2025",
        "period": "01/01/2025 al 31/12/2025",
        "publishedAt": "20/03/2026",
        "documentCount": 35,
        "totalIncome": 49677835517.65,
        "totalExpense": 53859799311.83,
        "financialResult": -4181963794.18
      },
      "machineReadableFiles": [
        {
          "url": "/data/transparencia/rendicion-2025.json",
          "format": "json",
          "schema": "AccountabilityReportDataset",
          "mainFields": [
            "figures",
            "series",
            "source.documents"
          ]
        },
        {
          "url": "/data/transparencia/rendicion-2025.csv",
          "format": "csv",
          "schema": "AccountabilityAmount[]"
        }
      ]
    },
    {
      "id": "documentos",
      "title": "Documentos publicos",
      "route": "/documentos",
      "description": "Biblioteca navegable de PDFs y documentos publicados por el sitio, consultada desde public_document_index por el endpoint public_search.",
      "stats": {
        "sourceModel": "public_document_index",
        "endpoint": "/api/index.php?action=public_search&entityType=documento_publico"
      },
      "machineReadableFiles": [
        {
          "url": "/api/index.php?action=public_search&entityType=documento_publico&limit=20",
          "format": "json",
          "schema": "PublicSearchPayload<documento_publico>",
          "mainFields": [
            "results[].title",
            "results[].route",
            "results[].sourceUrl",
            "results[].summary",
            "results[].tags",
            "results[].metadata"
          ]
        }
      ],
      "queryHints": [
        "Usar q para buscar por nombre de archivo, boletin, rendicion, tasa o tema.",
        "Citar route/sourceUrl junto con title y tags cuando se use un documento como fuente."
      ]
    },
    {
      "id": "personas-sibom",
      "title": "Personas y movimientos en anexos SIBOM",
      "route": "/boletines/personas",
      "description": "Registros nominales estructurados desde anexos oficiales de las ediciones SIBOM 117 y 118: becas laborales, talleristas/coordinadores y horas extras o tareas especiales.",
      "stats": {
        "recordCount": 4589,
        "uniquePeopleCount": 1658,
        "sourceActsCount": 11,
        "sourceAnnexesCount": 25,
        "recordsWithDocumentCount": 2474,
        "recordsWithEmployeeIdCount": 2115,
        "amountRecordCount": 4550,
        "amountTotal": 949300148.83,
        "byRegime": {
          "beca_laboral": 2170,
          "personal_municipal_regimen_no_especificado": 2115,
          "tallerista": 304
        },
        "byEventType": {
          "pago_horas_extras_tareas_especiales": 2115,
          "pago_beca_laboral": 1705,
          "bono_beca_laboral": 426,
          "pago_tallerista": 304,
          "alta_beca_beneficiario": 17,
          "baja_beca_laboral": 16,
          "alta_beca_capacitador": 6
        },
        "byEdition": {
          "117": 2493,
          "118": 2096
        },
        "byQualityStatus": {
          "source-extracted": 2392,
          "source-exact-reviewed": 2154,
          "normalized-with-source-preserved": 41,
          "needs-review": 2
        }
      },
      "dataDictionary": [],
      "machineReadableFiles": [
        {
          "url": "/data/boletines/sibom-annex-records.json",
          "format": "json",
          "schema": "SibomAnnexRecordDataset",
          "mainFields": [
            "personName",
            "documentNumber",
            "employeeId",
            "eventType",
            "regime",
            "employmentClassification",
            "role",
            "area",
            "amount",
            "period",
            "actId",
            "sourceRoute",
            "sourceAnnexUrl",
            "sourcePage",
            "qualityStatus"
          ]
        },
        {
          "url": "/data/boletines/sibom-annex-records.csv",
          "format": "csv",
          "schema": "SibomAnnexRecord[]"
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-sibom-anexos-cruce.csv",
          "format": "csv",
          "schema": "MunicipalStaff2018SibomAnnexCrosscheckRow[]"
        }
      ],
      "queryHints": [
        "Filtrar por regime y eventType antes de comparar personas o sumar montos.",
        "Usar DNI exacto o legajo exacto para cruces; una coincidencia nominal aislada no prueba identidad.",
        "Citar sourceRoute, sourceAnnexUrl, sourcePage y actId junto con cualquier registro."
      ],
      "caveats": [
        "Beca laboral y tallerista no equivalen a planta municipal.",
        "Los anexos de horas extras no informan si cada persona pertenece a planta permanente o temporaria.",
        "Los importes son sumas de filas publicadas y no deben interpretarse como costo anual ni como salario base."
      ]
    },
    {
      "id": "personal-municipal-2018",
      "title": "Personal municipal 2018",
      "route": "/transparencia/personal-municipal-2018",
      "description": "Listado municipal 2018 extraído desde PDF y publicado como dataset público para consulta y cruces con boletines/SIBOM. Conserva DNI/documento, CUIL y fecha de nacimiento cuando constan en la fuente.",
      "stats": {
        "peopleCount": 1652,
        "assignmentCount": 491,
        "peopleWithDetailedAssignmentCount": 491,
        "peopleOnlyInAlphabeticalIndexCount": 1161,
        "documentNumberCount": 1652,
        "cuilCount": 1652,
        "birthDateCount": 490,
        "jurisdictionCount": 8,
        "programCount": 42,
        "pageCount": 144,
        "parseWarningCount": 0
      },
      "aiAccess": {
        "canonicalRoute": "/transparencia/personal-municipal-2018",
        "llmsEntry": "/llms.txt",
        "catalogEntry": "/data/ai-catalog.json#personal-municipal-2018",
        "recommendedSourceFile": "/data/transparencia/personal-municipal-2018.json",
        "recommendedCrosscheckFile": "/data/transparencia/personal-municipal-2018-sibom-cruce.json",
        "primaryJoinKeys": [
          "personKey",
          "nameKey",
          "employeeId"
        ],
        "usefulSearchFields": [
          "name",
          "normalizedName",
          "nameKey",
          "employeeId",
          "documentNumber",
          "cuil",
          "birthDate",
          "jurisdictionName",
          "programName",
          "scaleCode",
          "scaleLabel"
        ],
        "citationFields": [
          "employeeId",
          "personKey",
          "name",
          "documentNumber",
          "cuil",
          "sourcePage",
          "assignmentId"
        ],
        "bulletinSearchTemplate": "/api/index.php?action=bulletin_search&q={nameKeyOrName}&limit=10",
        "publicSearchTemplate": "/api/index.php?action=public_search&q={nameKeyOrName}&limit=10",
        "caveat": "Una coincidencia textual con SIBOM no prueba continuidad laboral. Validar contra acto, fecha, jurisdicción, cargo/escalafón y fuente documental."
      },
      "dataDictionary": [
        {
          "field": "employeeId",
          "appliesTo": [
            "people",
            "assignments"
          ],
          "description": "Legajo interno del listado 2018; usar como identificador estable dentro de este PDF."
        },
        {
          "field": "personKey",
          "appliesTo": [
            "people",
            "assignments"
          ],
          "description": "Clave estable derivada del legajo, con prefijo legajo-."
        },
        {
          "field": "name",
          "appliesTo": [
            "people",
            "assignments"
          ],
          "description": "Nombre publicado por el PDF."
        },
        {
          "field": "nameKey",
          "appliesTo": [
            "people",
            "assignments"
          ],
          "description": "Nombre normalizado en minúsculas, sin tildes y separado por guiones para matching aproximado."
        },
        {
          "field": "normalizedName",
          "appliesTo": [
            "people"
          ],
          "description": "Nombre en mayúsculas ASCII, útil para comparación textual y deduplicación."
        },
        {
          "field": "documentType",
          "appliesTo": [
            "people"
          ],
          "description": "Tipo de documento informado por el PDF cuando consta."
        },
        {
          "field": "documentNumber",
          "appliesTo": [
            "people"
          ],
          "description": "Número de documento informado por el PDF, normalizado sin puntos."
        },
        {
          "field": "cuil",
          "appliesTo": [
            "people"
          ],
          "description": "CUIL informado por el PDF y asociado por número de documento."
        },
        {
          "field": "birthDate",
          "appliesTo": [
            "people"
          ],
          "description": "Fecha de nacimiento informada por el PDF, en formato ISO, cuando consta en filas de detalle."
        },
        {
          "field": "assignmentId",
          "appliesTo": [
            "assignments"
          ],
          "description": "Identificador estable de cada asignación funcional extraída."
        },
        {
          "field": "jurisdictionName",
          "appliesTo": [
            "assignments"
          ],
          "description": "Jurisdicción o secretaría del registro funcional."
        },
        {
          "field": "programName",
          "appliesTo": [
            "assignments"
          ],
          "description": "Categoría programática o dependencia informada por el PDF."
        },
        {
          "field": "plantType",
          "appliesTo": [
            "assignments"
          ],
          "description": "Tipo de planta informado; en este PDF el detalle extraído corresponde a Cargo Temporaria."
        },
        {
          "field": "scaleCode",
          "appliesTo": [
            "assignments"
          ],
          "description": "Código de escalafón/categoría cuando fue legible."
        },
        {
          "field": "seniorityDate",
          "appliesTo": [
            "assignments"
          ],
          "description": "Fecha de antigüedad informada, en formato ISO."
        },
        {
          "field": "movementDate",
          "appliesTo": [
            "assignments"
          ],
          "description": "Fecha de movimiento informada, en formato ISO."
        }
      ],
      "matchingGuidance": [
        "Para cruzar con SIBOM, buscar nameKey o tokens del nombre en bloques de decretos, designaciones, bajas, pases a planta, licencias y movimientos de personal.",
        "Usar /data/transparencia/personal-municipal-2018-sibom-cruce.json para coincidencias SIBOM y situaciones derivadas: derivedStatus, statusMentions, movementType y movementLabel.",
        "Usar /data/transparencia/personal-municipal-2018-sibom-revision.json para revisar coincidencias medias/revisar, bonificaciones y evidencia posterior antes de afirmar continuidad laboral.",
        "Usar employeeId y documentNumber como identificadores estables dentro de este PDF, pero no asumir que ambos aparecen en SIBOM.",
        "Cuando haya coincidencias por nombre, validar con jurisdicción, programa, fechas de movimiento y página fuente antes de afirmar continuidad laboral."
      ],
      "machineReadableFiles": [
        {
          "url": "/data/transparencia/personal-municipal-2018.json",
          "format": "json",
          "schema": "MunicipalStaff2018Dataset",
          "contentType": "application/json",
          "primaryEntities": [
            "people",
            "assignments"
          ],
          "rowCount": 2143
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-personas.csv",
          "format": "csv",
          "schema": "MunicipalStaff2018Person[]",
          "contentType": "text/csv",
          "primaryKey": "person_key",
          "rowCount": 1652
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-asignaciones.csv",
          "format": "csv",
          "schema": "MunicipalStaff2018Assignment[]",
          "contentType": "text/csv",
          "primaryKey": "assignment_id",
          "rowCount": 491
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-sibom-cruce.json",
          "format": "json",
          "schema": "MunicipalStaff2018SibomCrosscheck",
          "contentType": "application/json",
          "primaryEntities": [
            "people",
            "matches"
          ]
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-sibom-cruce.csv",
          "format": "csv",
          "schema": "MunicipalStaff2018SibomCrosscheckRow[]",
          "contentType": "text/csv"
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-sibom-revision.json",
          "format": "json",
          "schema": "MunicipalStaff2018SibomReviewQueue",
          "contentType": "application/json",
          "primaryEntities": [
            "items"
          ]
        },
        {
          "url": "/data/transparencia/personal-municipal-2018-sibom-revision.csv",
          "format": "csv",
          "schema": "MunicipalStaff2018SibomReviewQueueRow[]",
          "contentType": "text/csv"
        }
      ],
      "queryHints": [
        "Usar /data/transparencia/personal-municipal-2018-sibom-cruce.json para coincidencias SIBOM y situaciones derivadas: derivedStatus, statusMentions, movementType y movementLabel.",
        "Usar /data/transparencia/personal-municipal-2018-sibom-revision.json para revisar coincidencias medias/revisar, bonificaciones y evidencia posterior antes de afirmar continuidad.",
        "Usar nameKey, normalizedName y employeeId para buscar coincidencias contra bloques SIBOM.",
        "Validar coincidencias por nombre con sourcePage, jurisdicción, categoría programática, fechas de movimiento y texto fuente antes de afirmar continuidad laboral."
      ],
      "caveats": [
        "El índice nominal tiene más personas que las asignaciones detalladas porque el PDF combina un índice alfabético con secciones funcionales parciales.",
        "Validar cualquier conclusión administrativa contra la página fuente del PDF y el acto oficial relacionado."
      ]
    }
  ]
}
