{
  "generated_at": "2026-03-15T20:50:00+00:00",
  "summary": {
    "desired": 45,
    "present": 45,
    "missing": 0,
    "extra": 0,
    "not_run": 3,
    "running": 0,
    "ok": 39,
    "partial": 0,
    "error": 0,
    "degraded": 3,
    "unknown": 0,
    "not_in_catalog": 0,
    "desired_progress": {
      "loaded": 85084,
      "target": 56557,
      "percent": 100
    },
    "states": [
      "degraded",
      "not_run",
      "ok"
    ],
    "sql": {
      "todo": 3,
      "partial": 3,
      "done": 39,
      "foreign_key_violations": 0
    },
    "tracker": {
      "items_total": 300,
      "unmapped": 254,
      "todo": 27,
      "partial": 26,
      "done": 246,
      "mismatch": 0,
      "waived_mismatch": 0,
      "done_zero_real": 0,
      "untracked_sources": 7,
      "waivers_active": 0,
      "waivers_expired": 0,
      "waivers_error": ""
    }
  },
  "ops": {
    "ingestion_runs_total": 310,
    "ingestion_runs_ok": 206,
    "ingestion_runs_error": 95,
    "ingestion_runs_retry": 104,
    "ingestion_runs_ok_pct": 0.6645161290322581,
    "avg_run_seconds": 153.21705086385688,
    "last_run_seconds": 8.999991416931152,
    "retry_rate": 0.33548387096774196,
    "published_recommendation_artifacts": 0,
    "autonomico_sources_ok": 17,
    "europeo_sources_ok": 1
  },
  "analytics": {
    "topics": {
      "topics_total": 401,
      "topic_sets_total": 7,
      "topic_sets_active": 7,
      "topic_set_topics_total": 284,
      "high_stakes_total": 144
    },
    "evidence": {
      "topic_evidence_total": 432218,
      "topic_evidence_with_topic": 432218,
      "topic_evidence_with_topic_pct": 1.0,
      "topic_evidence_with_date": 432218,
      "topic_evidence_with_date_pct": 1.0,
      "topic_evidence_with_source_url": 432218,
      "topic_evidence_with_source_url_pct": 1.0,
      "topic_evidence_declared_total": 1182,
      "topic_evidence_revealed_total": 431036,
      "topic_evidence_declared_with_date": 1182,
      "topic_evidence_declared_with_date_pct": 1.0,
      "topic_evidence_declared_with_signal": 625,
      "topic_evidence_declared_with_signal_pct": 0.5287648054145516,
      "topic_evidence_reviews_total": 834,
      "topic_evidence_reviews_pending": 42,
      "topic_evidence_reviews_resolved": 18,
      "topic_evidence_reviews_ignored": 774,
      "topic_evidence_reviews_pending_pct": 0.03553299492385787,
      "topic_evidence_reviews_pending_by_reason": {
        "low_confidence": 29,
        "conflicting_signal": 13
      },
      "topic_evidence_by_type": {
        "revealed:vote": 431036,
        "declared:intervention": 614,
        "declared:programa": 568
      },
      "topic_method_top": [
        {
          "key": "initiative:derived_title_key",
          "count": 218136
        },
        {
          "key": "initiative:title_norm_exact_unique",
          "count": 168025
        },
        {
          "key": "initiative:leg_expediente_payload_exact",
          "count": 25008
        },
        {
          "key": "initiative:title_norm_prefix_unique",
          "count": 16257
        },
        {
          "key": "initiative:congreso_law_expediente",
          "count": 3610
        },
        {
          "key": "initiative:expediente",
          "count": 614
        },
        {
          "key": "programa:concern:v1",
          "count": 568
        }
      ],
      "stance_method_top": [
        {
          "key": "rollcall",
          "count": 431036
        },
        {
          "key": "declared:regex_v3",
          "count": 631
        },
        {
          "key": "intervention_metadata",
          "count": 410
        },
        {
          "key": "programa_metadata",
          "count": 140
        },
        {
          "key": "declared:manual_review_v1",
          "count": 1
        }
      ],
      "text_documents_total": 6965,
      "text_documents_with_excerpt": 6950,
      "text_documents_with_excerpt_pct": 0.9978463747307968,
      "declared_evidence_with_text_excerpt": 1182,
      "declared_evidence_with_text_excerpt_pct": 1.0
    },
    "positions": {
      "topic_positions_total": 275612,
      "topic_positions_with_evidence": 275612,
      "topic_positions_with_evidence_pct": 1.0,
      "topic_positions_by_method": {
        "combined": 137651,
        "votes": 137056,
        "declared": 905
      }
    },
    "coherence": {
      "as_of_date": "2026-02-16",
      "overlap_total": 155,
      "explicit_total": 99,
      "coherent_total": 52,
      "incoherent_total": 47,
      "coherence_pct": 0.5252525252525253,
      "incoherence_pct": 0.47474747474747475
    },
    "traceability": {
      "parl_vote_events_total": 8357,
      "parl_vote_events_with_source_url": 8357,
      "parl_vote_events_with_source_url_pct": 1.0
    },
    "action": {
      "policy_events_total": 548,
      "policy_event_axis_scores_total": 0,
      "interventions_total": 0
    },
    "impact": {
      "indicator_series_total": 2458,
      "indicator_points_total": 39229,
      "causal_estimates_total": 0
    }
  },
  "parl_quality": {
    "votes": {
      "kpis": {
        "source_ids": [
          "congreso_votaciones",
          "senado_votaciones"
        ],
        "events_total": 8357,
        "events_with_date": 8357,
        "events_with_date_pct": 1.0,
        "events_with_theme": 8357,
        "events_with_theme_pct": 1.0,
        "events_with_totals": 8357,
        "events_with_totals_pct": 1.0,
        "events_with_nominal_vote": 7014,
        "events_with_nominal_vote_pct": 0.8392963982290296,
        "events_with_initiative_link": 8357,
        "events_with_initiative_link_pct": 1.0,
        "events_with_official_initiative_link": 6219,
        "events_with_official_initiative_link_pct": 0.7441665669498624,
        "latest_events_total": 1765,
        "latest_events_with_topic_evidence": 1327,
        "latest_events_with_topic_evidence_pct": 0.7518413597733711,
        "member_votes_total": 1778370,
        "member_votes_with_person_id": 1743590,
        "member_votes_with_person_id_pct": 0.980442765003908,
        "by_source": {
          "congreso_votaciones": {
            "events_total": 2823,
            "events_with_date": 2823,
            "events_with_theme": 2823,
            "events_with_totals": 2823,
            "events_with_nominal_vote": 1602,
            "events_with_initiative_link": 2823,
            "events_with_official_initiative_link": 685,
            "events_with_date_pct": 1.0,
            "events_with_theme_pct": 1.0,
            "events_with_totals_pct": 1.0,
            "events_with_nominal_vote_pct": 0.5674814027630181,
            "events_with_initiative_link_pct": 1.0,
            "events_with_official_initiative_link_pct": 0.2426496634785689,
            "latest_legislature": "15",
            "latest_events_total": 1665,
            "latest_events_with_topic_evidence": 1230,
            "latest_events_with_topic_evidence_pct": 0.7387387387387387,
            "member_votes_total": 557922,
            "member_votes_with_person_id": 531812,
            "member_votes_with_person_id_pct": 0.9532013435569847
          },
          "senado_votaciones": {
            "events_total": 5534,
            "events_with_date": 5534,
            "events_with_theme": 5534,
            "events_with_totals": 5534,
            "events_with_nominal_vote": 5412,
            "events_with_initiative_link": 5534,
            "events_with_official_initiative_link": 5534,
            "events_with_date_pct": 1.0,
            "events_with_theme_pct": 1.0,
            "events_with_totals_pct": 1.0,
            "events_with_nominal_vote_pct": 0.9779544633176726,
            "events_with_initiative_link_pct": 1.0,
            "events_with_official_initiative_link_pct": 1.0,
            "latest_legislature": "15",
            "latest_events_total": 100,
            "latest_events_with_topic_evidence": 97,
            "latest_events_with_topic_evidence_pct": 0.97,
            "member_votes_total": 1220448,
            "member_votes_with_person_id": 1211778,
            "member_votes_with_person_id_pct": 0.9928960512860852
          }
        }
      },
      "gate": {
        "passed": true,
        "failures": [],
        "thresholds": {
          "events_with_date_pct": 0.95,
          "events_with_initiative_link_pct": 0.95,
          "events_with_theme_pct": 0.95,
          "events_with_totals_pct": 0.95,
          "member_votes_with_person_id_pct": 0.9
        }
      }
    },
    "initiatives": {
      "kpis": {
        "actionable_scope": "global",
        "actionable_metric": "actionable_doc_links_closed_pct",
        "source_ids": [
          "congreso_iniciativas",
          "senado_iniciativas"
        ],
        "initiatives_total": 4036,
        "initiatives_with_title": 4036,
        "initiatives_with_expediente": 4036,
        "initiatives_with_legislature": 4001,
        "initiatives_linked_to_votes": 751,
        "initiatives_with_doc_links": 4006,
        "initiatives_with_downloaded_docs": 3116,
        "initiatives_linked_to_votes_with_downloaded_docs": 751,
        "total_doc_links": 9575,
        "downloaded_doc_links": 6382,
        "missing_doc_links": 3193,
        "missing_doc_links_likely_not_expected": 192,
        "missing_doc_links_actionable": 3001,
        "total_doc_links_linked_to_votes": 2920,
        "downloaded_doc_links_linked_to_votes": 2723,
        "missing_doc_links_linked_to_votes": 197,
        "missing_doc_links_likely_not_expected_linked_to_votes": 190,
        "missing_doc_links_actionable_linked_to_votes": 7,
        "missing_doc_links_actionable_selected": 3001,
        "doc_links_with_fetch_status": 9575,
        "doc_links_missing_fetch_status": 0,
        "downloaded_doc_links_with_excerpt": 6367,
        "downloaded_doc_links_missing_excerpt": 15,
        "downloaded_doc_links_with_extraction": 6379,
        "downloaded_doc_links_missing_extraction": 3,
        "extraction_needs_review_doc_links": 3043,
        "missing_doc_links_status_buckets": [
          {
            "status": 500,
            "count": 1445
          },
          {
            "status": 403,
            "count": 1078
          },
          {
            "status": 404,
            "count": 654
          },
          {
            "status": 200,
            "count": 16
          }
        ],
        "initiatives_with_title_pct": 1.0,
        "initiatives_with_expediente_pct": 1.0,
        "initiatives_with_legislature_pct": 0.9913280475718533,
        "initiatives_linked_to_votes_pct": 0.18607532210109018,
        "initiatives_with_doc_links_pct": 0.9925668979187314,
        "initiatives_with_downloaded_docs_pct": 0.7720515361744301,
        "initiatives_linked_to_votes_with_downloaded_docs_pct": 1.0,
        "downloaded_doc_links_pct": 0.6665274151436031,
        "effective_downloaded_doc_links_pct": 0.6801662581263989,
        "actionable_doc_links_closed_pct": 0.686579634464752,
        "effective_downloaded_doc_links_pct_linked_to_votes": 0.9974358974358974,
        "actionable_doc_links_closed_pct_linked_to_votes": 0.9976027397260274,
        "actionable_doc_links_closed_pct_selected": 0.686579634464752,
        "fetch_status_coverage_pct": 1.0,
        "excerpt_coverage_pct": 0.9976496396114071,
        "extraction_coverage_pct": 0.9995299279222815,
        "extraction_needs_review_pct": 0.4770340178711397,
        "extraction_review_closed_pct": 0.5229659821288604,
        "by_source": {
          "congreso_iniciativas": {
            "initiatives_total": 429,
            "initiatives_with_title": 429,
            "initiatives_with_expediente": 429,
            "initiatives_with_legislature": 394,
            "initiatives_linked_to_votes": 104,
            "initiatives_with_doc_links": 399,
            "initiatives_with_downloaded_docs": 399,
            "initiatives_linked_to_votes_with_downloaded_docs": 104,
            "total_doc_links": 812,
            "downloaded_doc_links": 812,
            "missing_doc_links": 0,
            "doc_links_with_fetch_status": 812,
            "doc_links_missing_fetch_status": 0,
            "downloaded_doc_links_with_excerpt": 812,
            "downloaded_doc_links_missing_excerpt": 0,
            "downloaded_doc_links_with_extraction": 812,
            "downloaded_doc_links_missing_extraction": 0,
            "extraction_needs_review_doc_links": 1,
            "missing_doc_links_status_buckets": [],
            "missing_doc_links_likely_not_expected": 0,
            "missing_doc_links_actionable": 0,
            "effective_downloaded_doc_links_pct": 1.0,
            "actionable_doc_links_closed_pct": 1.0,
            "total_doc_links_linked_to_votes": 269,
            "downloaded_doc_links_linked_to_votes": 269,
            "missing_doc_links_linked_to_votes": 0,
            "missing_doc_links_likely_not_expected_linked_to_votes": 0,
            "missing_doc_links_actionable_linked_to_votes": 0,
            "effective_downloaded_doc_links_pct_linked_to_votes": 1.0,
            "actionable_doc_links_closed_pct_linked_to_votes": 1.0,
            "missing_doc_links_actionable_selected": 0,
            "actionable_doc_links_closed_pct_selected": 1.0,
            "global_enmiendas_vetos_analysis": {},
            "initiatives_with_title_pct": 1.0,
            "initiatives_with_expediente_pct": 1.0,
            "initiatives_with_legislature_pct": 0.9184149184149184,
            "initiatives_linked_to_votes_pct": 0.24242424242424243,
            "initiatives_with_doc_links_pct": 0.9300699300699301,
            "initiatives_with_downloaded_docs_pct": 0.9300699300699301,
            "initiatives_linked_to_votes_with_downloaded_docs_pct": 1.0,
            "downloaded_doc_links_pct": 1.0,
            "fetch_status_coverage_pct": 1.0,
            "excerpt_coverage_pct": 1.0,
            "extraction_coverage_pct": 1.0,
            "extraction_needs_review_pct": 0.0012315270935960591,
            "extraction_review_closed_pct": 0.9987684729064039
          },
          "senado_iniciativas": {
            "initiatives_total": 3607,
            "initiatives_with_title": 3607,
            "initiatives_with_expediente": 3607,
            "initiatives_with_legislature": 3607,
            "initiatives_linked_to_votes": 647,
            "initiatives_with_doc_links": 3607,
            "initiatives_with_downloaded_docs": 2717,
            "initiatives_linked_to_votes_with_downloaded_docs": 647,
            "total_doc_links": 8763,
            "downloaded_doc_links": 5570,
            "missing_doc_links": 3193,
            "doc_links_with_fetch_status": 8763,
            "doc_links_missing_fetch_status": 0,
            "downloaded_doc_links_with_excerpt": 5555,
            "downloaded_doc_links_missing_excerpt": 15,
            "downloaded_doc_links_with_extraction": 5567,
            "downloaded_doc_links_missing_extraction": 3,
            "extraction_needs_review_doc_links": 3042,
            "missing_doc_links_status_buckets": [
              {
                "status": 500,
                "count": 1445
              },
              {
                "status": 403,
                "count": 1078
              },
              {
                "status": 404,
                "count": 654
              },
              {
                "status": 200,
                "count": 16
              }
            ],
            "missing_doc_links_likely_not_expected": 192,
            "missing_doc_links_actionable": 3001,
            "effective_downloaded_doc_links_pct": 0.6498658266246645,
            "actionable_doc_links_closed_pct": 0.6575373730457605,
            "total_doc_links_linked_to_votes": 2651,
            "downloaded_doc_links_linked_to_votes": 2454,
            "missing_doc_links_linked_to_votes": 197,
            "missing_doc_links_likely_not_expected_linked_to_votes": 190,
            "missing_doc_links_actionable_linked_to_votes": 7,
            "effective_downloaded_doc_links_pct_linked_to_votes": 0.9971556277935798,
            "actionable_doc_links_closed_pct_linked_to_votes": 0.997359486986043,
            "missing_doc_links_actionable_selected": 3001,
            "actionable_doc_links_closed_pct_selected": 0.6575373730457605,
            "global_enmiendas_vetos_analysis": {
              "total_global_enmiendas_missing": 194,
              "likely_not_expected_redundant_global_url": 192,
              "likely_not_expected_total": 192,
              "actionable_missing_count": 2,
              "total_global_enmiendas_missing_linked_to_votes": 190,
              "likely_not_expected_redundant_global_url_linked_to_votes": 190,
              "likely_not_expected_total_linked_to_votes": 190,
              "actionable_missing_count_linked_to_votes": 0,
              "classification_counts": {
                "likely_not_expected_redundant_global_url": 192,
                "likely_not_expected_redundant_global_url_linked_to_votes": 190
              }
            },
            "initiatives_with_title_pct": 1.0,
            "initiatives_with_expediente_pct": 1.0,
            "initiatives_with_legislature_pct": 1.0,
            "initiatives_linked_to_votes_pct": 0.1793734405322983,
            "initiatives_with_doc_links_pct": 1.0,
            "initiatives_with_downloaded_docs_pct": 0.7532575547546437,
            "initiatives_linked_to_votes_with_downloaded_docs_pct": 1.0,
            "downloaded_doc_links_pct": 0.635627068355586,
            "fetch_status_coverage_pct": 1.0,
            "excerpt_coverage_pct": 0.9973070017953322,
            "extraction_coverage_pct": 0.9994614003590664,
            "extraction_needs_review_pct": 0.5464343452487875,
            "extraction_review_closed_pct": 0.4535656547512125
          }
        }
      },
      "gate": {
        "passed": false,
        "failures": [
          {
            "metric": "actionable_doc_links_closed_pct",
            "actual": 0.686579634464752,
            "threshold": 1.0
          },
          {
            "metric": "extraction_review_closed_pct",
            "actual": 0.5229659821288604,
            "threshold": 0.95
          }
        ],
        "actionable_metric": "actionable_doc_links_closed_pct",
        "thresholds": {
          "actionable_doc_links_closed_pct": 1.0,
          "extraction_coverage_pct": 0.95,
          "extraction_review_closed_pct": 0.95,
          "initiatives_linked_to_votes_pct": 0.0,
          "initiatives_with_expediente_pct": 0.7,
          "initiatives_with_legislature_pct": 0.5,
          "initiatives_with_title_pct": 0.9
        }
      }
    }
  },
  "coverage_capacity": {
    "meta": {
      "path": "docs/coverage_capacity_model.json",
      "exists": true,
      "version": "2026-03-14",
      "title": "North-Star Coverage Capacity Model",
      "ideal_inventory_version": "2026-02-14"
    },
    "summary": {
      "cells_total": 9,
      "cells_with_denominator": 9,
      "blocked_cells": 0,
      "denominator_gaps": 0,
      "weighted_percent": 29.4
    },
    "families": [
      {
        "key": "analytics",
        "label": "analytics",
        "cells_total": 2,
        "cells_with_denominator": 2,
        "blocked_cells": 0,
        "weighted_percent": 3.8
      },
      {
        "key": "documents",
        "label": "documents",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 47.2
      },
      {
        "key": "inventory",
        "label": "inventory",
        "cells_total": 4,
        "cells_with_denominator": 4,
        "blocked_cells": 0,
        "weighted_percent": 6.0
      },
      {
        "key": "records",
        "label": "records",
        "cells_total": 2,
        "cells_with_denominator": 2,
        "blocked_cells": 0,
        "weighted_percent": 76.5
      }
    ],
    "by_scope": [
      {
        "key": "europeo",
        "label": "europeo",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 0.0
      },
      {
        "key": "multi",
        "label": "multi",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 14.3
      },
      {
        "key": "nacional",
        "label": "nacional",
        "cells_total": 6,
        "cells_with_denominator": 6,
        "blocked_cells": 0,
        "weighted_percent": 37.9
      },
      {
        "key": "subnacional",
        "label": "subnacional",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 0.0
      }
    ],
    "by_evidence_kind": [
      {
        "key": "both",
        "label": "both",
        "cells_total": 4,
        "cells_with_denominator": 4,
        "blocked_cells": 0,
        "weighted_percent": 6.0
      },
      {
        "key": "does",
        "label": "does",
        "cells_total": 4,
        "cells_with_denominator": 4,
        "blocked_cells": 0,
        "weighted_percent": 38.7
      },
      {
        "key": "says",
        "label": "says",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 52.9
      }
    ],
    "by_domain": [
      {
        "key": "declared_evidence",
        "label": "declared_evidence",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 52.9
      },
      {
        "key": "initiative_docs",
        "label": "initiative_docs",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 47.2
      },
      {
        "key": "measure_reviews",
        "label": "measure_reviews",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 5.1
      },
      {
        "key": "measure_scale",
        "label": "measure_scale",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 2.5
      },
      {
        "key": "source_inventory",
        "label": "source_inventory",
        "cells_total": 4,
        "cells_with_denominator": 4,
        "blocked_cells": 0,
        "weighted_percent": 6.0
      },
      {
        "key": "votes",
        "label": "votes",
        "cells_total": 1,
        "cells_with_denominator": 1,
        "blocked_cells": 0,
        "weighted_percent": 100.0
      }
    ],
    "denominator_gaps": [],
    "cells": [
      {
        "id": "inventory_national_sources",
        "label": "Inventario de fuentes nacionales",
        "scope": "nacional",
        "evidence_kind": "both",
        "domain": "source_inventory",
        "source_family": "mixed",
        "unit_family": "inventory",
        "unit_type": "source_slot",
        "primary_stage": "processed",
        "builder_key": "ideal_source_inventory",
        "estimator_type": "ideal_inventory",
        "estimator_ref": "docs/ideal_sources_say_do.json",
        "rollup_weight": 0.7,
        "notes": "North-star source slots for the national layer.",
        "source_ids": [],
        "ideal_total": 25,
        "stages": {
          "discoverable": 3,
          "downloaded": 3,
          "processed": 3,
          "linked": 3,
          "published": 3
        },
        "primary_total": 3,
        "primary_percent": 12.0,
        "denominator_status": "ok",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "inventory_subnational_sources",
        "label": "Inventario subnacional",
        "scope": "subnacional",
        "evidence_kind": "both",
        "domain": "source_inventory",
        "source_family": "mixed",
        "unit_family": "inventory",
        "unit_type": "source_slot",
        "primary_stage": "processed",
        "builder_key": "ideal_source_inventory",
        "estimator_type": "ideal_inventory",
        "estimator_ref": "docs/ideal_sources_say_do.json",
        "rollup_weight": 0.7,
        "notes": "Future regional and local source-slot backlog.",
        "source_ids": [],
        "ideal_total": 6,
        "stages": {
          "discoverable": 0,
          "downloaded": 0,
          "processed": 0,
          "linked": 0,
          "published": 0
        },
        "primary_total": 0,
        "primary_percent": 0.0,
        "denominator_status": "ok",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "inventory_european_sources",
        "label": "Inventario europeo",
        "scope": "europeo",
        "evidence_kind": "both",
        "domain": "source_inventory",
        "source_family": "mixed",
        "unit_family": "inventory",
        "unit_type": "source_slot",
        "primary_stage": "processed",
        "builder_key": "ideal_source_inventory",
        "estimator_type": "ideal_inventory",
        "estimator_ref": "docs/ideal_sources_say_do.json",
        "rollup_weight": 0.7,
        "notes": "EU backlog as explicit source slots.",
        "source_ids": [],
        "ideal_total": 7,
        "stages": {
          "discoverable": 0,
          "downloaded": 0,
          "processed": 0,
          "linked": 0,
          "published": 0
        },
        "primary_total": 0,
        "primary_percent": 0.0,
        "denominator_status": "ok",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "inventory_multi_scope_sources",
        "label": "Inventario multiambito",
        "scope": "multi",
        "evidence_kind": "both",
        "domain": "source_inventory",
        "source_family": "mixed",
        "unit_family": "inventory",
        "unit_type": "source_slot",
        "primary_stage": "processed",
        "builder_key": "ideal_source_inventory",
        "estimator_type": "ideal_inventory",
        "estimator_ref": "docs/ideal_sources_say_do.json",
        "rollup_weight": 0.5,
        "notes": "Cross-scope backlog such as catalogs or multi-jurisdiction sources.",
        "source_ids": [],
        "ideal_total": 7,
        "stages": {
          "discoverable": 1,
          "downloaded": 1,
          "processed": 1,
          "linked": 1,
          "published": 1
        },
        "primary_total": 1,
        "primary_percent": 14.3,
        "denominator_status": "ok",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "national_votes",
        "label": "Votaciones nacionales",
        "scope": "nacional",
        "evidence_kind": "does",
        "domain": "votes",
        "source_family": "parlamentario",
        "unit_family": "records",
        "unit_type": "vote_event",
        "primary_stage": "linked",
        "builder_key": "national_votes",
        "estimator_type": "derived_sql",
        "estimator_ref": "parl_vote_events + parl_vote_event_initiatives",
        "rollup_weight": 1.0,
        "notes": "Bounded by vote events loaded from the official parliamentary sources.",
        "source_ids": [
          "congreso_votaciones",
          "senado_votaciones"
        ],
        "ideal_total": 8357,
        "stages": {
          "discoverable": 8357,
          "downloaded": 8357,
          "processed": 8357,
          "linked": 8357,
          "published": 8357
        },
        "primary_total": 8357,
        "primary_percent": 100.0,
        "denominator_status": "proxy",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "national_initiative_docs",
        "label": "Documentos oficiales de iniciativas",
        "scope": "nacional",
        "evidence_kind": "does",
        "domain": "initiative_docs",
        "source_family": "parlamentario",
        "unit_family": "documents",
        "unit_type": "initiative_document_slot",
        "primary_stage": "processed",
        "builder_key": "national_initiative_docs",
        "estimator_type": "derived_sql",
        "estimator_ref": "parl_initiatives.links_bocg_json + links_ds_json",
        "rollup_weight": 1.0,
        "notes": "Known official document slots per initiative vs downloaded and extracted text.",
        "source_ids": [
          "congreso_iniciativas",
          "senado_iniciativas"
        ],
        "ideal_total": 13504,
        "stages": {
          "discoverable": 13504,
          "downloaded": 9575,
          "processed": 6379,
          "linked": 6382,
          "published": 6379
        },
        "primary_total": 6379,
        "primary_percent": 47.2,
        "denominator_status": "proxy",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "declared_evidence_signal",
        "label": "Evidencia declarada con postura",
        "scope": "nacional",
        "evidence_kind": "says",
        "domain": "declared_evidence",
        "source_family": "parlamentario",
        "unit_family": "records",
        "unit_type": "declared_evidence_row",
        "primary_stage": "linked",
        "builder_key": "declared_evidence_signal",
        "estimator_type": "derived_sql",
        "estimator_ref": "analytics.evidence.topic_evidence_declared_total",
        "rollup_weight": 1.0,
        "notes": "Declared evidence rows become useful only when stance/signal is extracted.",
        "source_ids": [
          "congreso_intervenciones"
        ],
        "ideal_total": 1182,
        "stages": {
          "discoverable": 1182,
          "downloaded": 1182,
          "processed": 1182,
          "linked": 625,
          "published": 625
        },
        "primary_total": 625,
        "primary_percent": 52.9,
        "denominator_status": "proxy",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "fragment_measure_reviews",
        "label": "Revision de fragmentos para medidas",
        "scope": "nacional",
        "evidence_kind": "does",
        "domain": "measure_scale",
        "source_family": "parlamentario",
        "unit_family": "analytics",
        "unit_type": "text_fragment",
        "primary_stage": "linked",
        "builder_key": "fragment_measure_reviews",
        "estimator_type": "derived_sql",
        "estimator_ref": "parl_text_fragments + parl_fragment_measure_reviews",
        "rollup_weight": 1.0,
        "notes": "Scalable measure extraction coverage over deterministic text fragments.",
        "source_ids": [
          "congreso_iniciativas",
          "senado_iniciativas"
        ],
        "ideal_total": 4188,
        "stages": {
          "discoverable": 4188,
          "downloaded": 4188,
          "processed": 4188,
          "linked": 104,
          "published": 95
        },
        "primary_total": 104,
        "primary_percent": 2.5,
        "denominator_status": "proxy",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      },
      {
        "id": "initiative_measure_tasks",
        "label": "Dossiers de medidas ciudadanas",
        "scope": "nacional",
        "evidence_kind": "does",
        "domain": "measure_reviews",
        "source_family": "parlamentario",
        "unit_family": "analytics",
        "unit_type": "initiative_measure_task",
        "primary_stage": "linked",
        "builder_key": "initiative_measure_tasks",
        "estimator_type": "derived_sql",
        "estimator_ref": "parl_initiative_measure_review_tasks",
        "rollup_weight": 1.0,
        "notes": "Official initiative dossiers queued for citizen-facing measure extraction.",
        "source_ids": [
          "congreso_iniciativas",
          "senado_iniciativas"
        ],
        "ideal_total": 751,
        "stages": {
          "discoverable": 751,
          "downloaded": 139,
          "processed": 751,
          "linked": 38,
          "published": 38
        },
        "primary_total": 38,
        "primary_percent": 5.1,
        "denominator_status": "proxy",
        "blocked": false,
        "blocked_sources": [],
        "gap_reason": ""
      }
    ]
  },
  "initdoc_actionable_tail": {
    "source_ids": [
      "senado_iniciativas"
    ],
    "contract": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "initiative_source_ids": [
        "senado_iniciativas"
      ],
      "total_missing": 3193,
      "redundant_missing": 192,
      "actionable_missing": 3001,
      "redundant_missing_pct": 0.060132,
      "actionable_missing_pct": 0.939868,
      "checks": {
        "actionable_queue_empty": false
      },
      "status_buckets_total_missing": [
        {
          "status": 500,
          "count": 1445
        },
        {
          "status": 403,
          "count": 1078
        },
        {
          "status": 404,
          "count": 654
        },
        {
          "status": 200,
          "count": 16
        }
      ],
      "status_buckets_actionable_missing": [
        {
          "status": 500,
          "count": 1337
        },
        {
          "status": 403,
          "count": 1078
        },
        {
          "status": 404,
          "count": 570
        },
        {
          "status": 200,
          "count": 16
        }
      ],
      "actionable_sample": []
    },
    "digest": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "contract_generated_at": "2026-03-15T20:50:10+00:00",
      "initiative_source_ids": [
        "senado_iniciativas"
      ],
      "status": "failed",
      "totals": {
        "total_missing": 3193,
        "redundant_missing": 192,
        "actionable_missing": 3001,
        "actionable_missing_pct": 0.939868
      },
      "thresholds": {
        "max_actionable_missing": 0,
        "max_actionable_missing_pct": 0.0
      },
      "checks": {
        "actionable_queue_empty": false,
        "actionable_missing_within_threshold": false,
        "actionable_missing_pct_within_threshold": false
      },
      "strict_fail_reasons": [
        "actionable_missing_exceeds_threshold:3001>0",
        "actionable_missing_pct_exceeds_threshold:0.939868>0.000000"
      ]
    },
    "heartbeat_window": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat.jsonl",
      "window_last": 20,
      "thresholds": {
        "max_failed": 0,
        "max_failed_rate_pct": 0.0,
        "max_degraded": 0,
        "max_degraded_rate_pct": 0.0
      },
      "entries_total": 4,
      "entries_in_window": 4,
      "malformed_entries_in_window": 0,
      "status_counts": {
        "ok": 4,
        "degraded": 0,
        "failed": 0
      },
      "failed_in_window": 0,
      "failed_rate_pct": 0.0,
      "degraded_in_window": 0,
      "degraded_rate_pct": 0.0,
      "first_failed_run_at": "",
      "last_failed_run_at": "",
      "first_degraded_run_at": "",
      "last_degraded_run_at": "",
      "latest": {
        "run_at": "2026-02-23T08:24:14+00:00",
        "heartbeat_id": "2026-02-23T08:24:14+00:00|2026-02-23T08:24:14+00:00|ok|senado_iniciativas|0|0.000000",
        "status": "ok",
        "line_no": 4,
        "malformed_line": false
      },
      "failed_streak_latest": 0,
      "degraded_streak_latest": 0,
      "checks": {
        "window_nonempty_ok": true,
        "malformed_entries_ok": true,
        "max_failed_ok": true,
        "max_failed_rate_ok": true,
        "max_degraded_ok": true,
        "max_degraded_rate_ok": true,
        "latest_not_failed_ok": true
      },
      "strict_fail_reasons": [],
      "status": "ok"
    },
    "heartbeat_compaction_window": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat.jsonl",
      "compacted_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat.compacted.jsonl",
      "window_last": 20,
      "entries_total_raw": 4,
      "entries_total_compacted": 4,
      "window_raw_entries": 4,
      "window_raw_malformed_entries": 0,
      "compacted_malformed_entries": 0,
      "raw_window_status_counts": {
        "ok": 4,
        "degraded": 0,
        "failed": 0
      },
      "raw_window_incidents": 0,
      "raw_window_failed": 0,
      "raw_window_degraded": 0,
      "raw_window_strict_rows": 0,
      "present_in_compacted_in_window": 4,
      "missing_in_compacted_in_window": 0,
      "incident_present_in_compacted": 0,
      "incident_missing_in_compacted": 0,
      "failed_present_in_compacted": 0,
      "degraded_present_in_compacted": 0,
      "strict_rows_present_in_compacted": 0,
      "malformed_present_in_compacted": 0,
      "raw_window_coverage_pct": 100.0,
      "incident_coverage_pct": 0.0,
      "latest_raw": {
        "id": "2026-02-23T08:24:14+00:00|2026-02-23T08:24:14+00:00|ok|senado_iniciativas|0|0.000000",
        "heartbeat_id": "2026-02-23T08:24:14+00:00|2026-02-23T08:24:14+00:00|ok|senado_iniciativas|0|0.000000",
        "run_at": "2026-02-23T08:24:14+00:00",
        "line_no": 4,
        "status": "ok",
        "malformed_line": false,
        "present_in_compacted": true
      },
      "missing_raw_ids_sample": [],
      "missing_incident_ids_sample": [],
      "checks": {
        "window_nonempty_ok": true,
        "raw_window_malformed_ok": true,
        "compacted_malformed_ok": true,
        "latest_present_ok": true,
        "incident_parity_ok": true,
        "failed_parity_ok": true,
        "degraded_parity_ok": true,
        "strict_rows_parity_ok": true,
        "malformed_parity_ok": true
      },
      "strict_fail_reasons": [],
      "status": "ok"
    },
    "heartbeat_compaction_window_digest": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "input": {
        "compaction_window_json_path": "",
        "compaction_window_generated_at": "2026-03-15T20:50:10+00:00",
        "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat.jsonl",
        "compacted_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat.compacted.jsonl"
      },
      "status": "ok",
      "risk_level": "green",
      "risk_reasons": [],
      "strict_fail_reasons": [],
      "strict_fail_count": 0,
      "risk_reason_count": 0,
      "key_metrics": {
        "entries_total_raw": 4,
        "entries_total_compacted": 4,
        "window_raw_entries": 4,
        "raw_window_incidents": 0,
        "present_in_compacted_in_window": 4,
        "missing_in_compacted_in_window": 0,
        "incident_missing_in_compacted": 0,
        "raw_window_coverage_pct": 100.0,
        "incident_coverage_pct": 0.0
      },
      "key_checks": {
        "window_nonempty_ok": true,
        "raw_window_malformed_ok": true,
        "compacted_malformed_ok": true,
        "latest_present_ok": true,
        "incident_parity_ok": true,
        "failed_parity_ok": true,
        "degraded_parity_ok": true,
        "strict_rows_parity_ok": true,
        "malformed_parity_ok": true
      },
      "thresholds": {
        "max_missing_in_compacted_window_for_ok": 0,
        "min_raw_window_coverage_pct_for_ok": 100.0,
        "min_incident_coverage_pct_for_ok": 100.0
      },
      "validation_errors": []
    },
    "heartbeat_compaction_window_digest_heartbeat_window": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat_compaction_window_digest_heartbeat.jsonl",
      "window_last": 20,
      "thresholds": {
        "max_failed": 0,
        "max_failed_rate_pct": 0.0,
        "max_degraded": 0,
        "max_degraded_rate_pct": 0.0
      },
      "entries_total": 1,
      "entries_in_window": 1,
      "malformed_entries_in_window": 0,
      "status_counts": {
        "ok": 1,
        "degraded": 0,
        "failed": 0
      },
      "risk_level_counts": {
        "green": 1,
        "amber": 0,
        "red": 0
      },
      "failed_in_window": 0,
      "failed_rate_pct": 0.0,
      "degraded_in_window": 0,
      "degraded_rate_pct": 0.0,
      "first_failed_run_at": "",
      "last_failed_run_at": "",
      "first_degraded_run_at": "",
      "last_degraded_run_at": "",
      "first_red_risk_run_at": "",
      "last_red_risk_run_at": "",
      "latest": {
        "run_at": "2026-02-23T08:44:37+00:00",
        "heartbeat_id": "2026-02-23T08:44:37+00:00|2026-02-23T08:44:37+00:00|ok|green|0|4",
        "status": "ok",
        "risk_level": "green",
        "line_no": 1,
        "malformed_line": false
      },
      "failed_streak_latest": 0,
      "degraded_streak_latest": 0,
      "checks": {
        "window_nonempty_ok": true,
        "malformed_entries_ok": true,
        "max_failed_ok": true,
        "max_failed_rate_ok": true,
        "max_degraded_ok": true,
        "max_degraded_rate_ok": true,
        "latest_not_failed_ok": true
      },
      "strict_fail_reasons": [],
      "status": "ok"
    },
    "heartbeat_compaction_window_digest_heartbeat_compaction_window": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat_compaction_window_digest_heartbeat.jsonl",
      "compacted_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat_compaction_window_digest_heartbeat.compacted.jsonl",
      "window_last": 20,
      "entries_total_raw": 1,
      "entries_total_compacted": 1,
      "window_raw_entries": 1,
      "window_raw_malformed_entries": 0,
      "compacted_malformed_entries": 0,
      "raw_window_status_counts": {
        "ok": 1,
        "degraded": 0,
        "failed": 0
      },
      "raw_window_incidents": 0,
      "raw_window_failed": 0,
      "raw_window_degraded": 0,
      "raw_window_strict_rows": 0,
      "present_in_compacted_in_window": 1,
      "missing_in_compacted_in_window": 0,
      "incident_present_in_compacted": 0,
      "incident_missing_in_compacted": 0,
      "failed_present_in_compacted": 0,
      "degraded_present_in_compacted": 0,
      "strict_rows_present_in_compacted": 0,
      "malformed_present_in_compacted": 0,
      "raw_window_coverage_pct": 100.0,
      "incident_coverage_pct": 0.0,
      "latest_raw": {
        "id": "2026-02-23T08:44:37+00:00|2026-02-23T08:44:37+00:00|ok|green|0|4",
        "heartbeat_id": "2026-02-23T08:44:37+00:00|2026-02-23T08:44:37+00:00|ok|green|0|4",
        "run_at": "2026-02-23T08:44:37+00:00",
        "line_no": 1,
        "status": "ok",
        "malformed_line": false,
        "present_in_compacted": true
      },
      "missing_raw_ids_sample": [],
      "missing_incident_ids_sample": [],
      "checks": {
        "window_nonempty_ok": true,
        "raw_window_malformed_ok": true,
        "compacted_malformed_ok": true,
        "latest_present_ok": true,
        "incident_parity_ok": true,
        "failed_parity_ok": true,
        "degraded_parity_ok": true,
        "strict_rows_parity_ok": true,
        "malformed_parity_ok": true
      },
      "strict_fail_reasons": [],
      "status": "ok"
    },
    "heartbeat_compaction_window_digest_heartbeat_compaction_window_digest": {
      "generated_at": "2026-03-15T20:50:10+00:00",
      "strict": false,
      "input": {
        "compaction_window_json_path": "",
        "compaction_window_generated_at": "2026-03-15T20:50:10+00:00",
        "heartbeat_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat_compaction_window_digest_heartbeat.jsonl",
        "compacted_path": "docs/etl/runs/initdoc_actionable_tail_digest_heartbeat_compaction_window_digest_heartbeat.compacted.jsonl"
      },
      "status": "ok",
      "risk_level": "green",
      "risk_reasons": [],
      "strict_fail_reasons": [],
      "strict_fail_count": 0,
      "risk_reason_count": 0,
      "key_metrics": {
        "entries_total_raw": 1,
        "entries_total_compacted": 1,
        "window_raw_entries": 1,
        "raw_window_incidents": 0,
        "present_in_compacted_in_window": 1,
        "missing_in_compacted_in_window": 0,
        "incident_missing_in_compacted": 0,
        "raw_window_coverage_pct": 100.0,
        "incident_coverage_pct": 0.0
      },
      "key_checks": {
        "window_nonempty_ok": true,
        "raw_window_malformed_ok": true,
        "compacted_malformed_ok": true,
        "latest_present_ok": true,
        "incident_parity_ok": true,
        "failed_parity_ok": true,
        "degraded_parity_ok": true,
        "strict_rows_parity_ok": true,
        "malformed_parity_ok": true
      },
      "thresholds": {
        "max_missing_in_compacted_window_for_ok": 0,
        "min_raw_window_coverage_pct_for_ok": 100.0,
        "min_incident_coverage_pct_for_ok": 100.0
      },
      "validation_errors": []
    }
  },
  "tracker": {
    "path": "docs/etl/e2e-scrape-load-tracker.md",
    "exists": true,
    "items": [
      {
        "tipo_dato": "Representantes y mandatos (Congreso)",
        "dominio": "Nacional",
        "fuentes_objetivo": "Congreso OpenData Diputados",
        "estado": "DONE",
        "bloque": "Mejorar calidad de campos opcionales",
        "source_ids": [
          "congreso_diputados"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Cortes de Aragon)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Aragon: diputados (XI)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "cortes_aragon_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Senado)",
        "dominio": "Nacional",
        "fuentes_objetivo": "Senado OpenData XML (grupos + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de aliases y umbral minimo",
        "source_ids": [
          "senado_senadores"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Europarl)",
        "dominio": "Europeo",
        "fuentes_objetivo": "Europarl MEP XML",
        "estado": "DONE",
        "bloque": "Mejorar completitud de fechas/metadatos",
        "source_ids": [
          "europarl_meps"
        ],
        "scope": "europeo",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y cargos locales",
        "dominio": "Municipal",
        "fuentes_objetivo": "RED SARA Concejales",
        "estado": "DONE",
        "bloque": "Definir umbral minimo y criterio de cobertura",
        "source_ids": [
          "municipal_concejales"
        ],
        "scope": "municipal",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Asamblea de Madrid)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Madrid OpenData Ocupaciones",
        "estado": "DONE",
        "bloque": "Definir umbral minimo y aclarar semantica de `is_active`",
        "source_ids": [
          "asamblea_madrid_ocupaciones"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Asamblea de Ceuta)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Ceuta: miembros (2023/2027)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "asamblea_ceuta_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Asamblea de Melilla)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Melilla: diputados (2023/2027)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "asamblea_melilla_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Asamblea de Extremadura)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Extremadura (dipslegis + paginacion)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "asamblea_extremadura_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Asamblea Murcia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea Regional de Murcia: diputados (listado + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "asamblea_murcia_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (JGPA Asturias)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Junta General del Principado de Asturias (diputados)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "jgpa_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de Canarias)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Canarias: diputados + grupos (API oficial)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlamento_canarias_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de Cantabria)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Cantabria",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlamento_cantabria_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de Galicia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Galicia: deputados (fichas HTML)",
        "estado": "PARTIAL",
        "bloque": "Done now: NO. Blocker: `parlamento_galicia_deputados` en `strict-network` sigue bloqueado con HTTP 403 (`run_id=265`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_galicia_deputados --snapshot-date 2026-02-17 --strict-network --timeout 30`.",
        "source_ids": [
          "parlamento_galicia_deputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlament IB)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlament de les Illes Balears: diputats (listado + fichas via webGTP)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlament_balears_diputats"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de La Rioja)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de La Rioja: diputados (listado + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlamento_larioja_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlament de Catalunya)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlament de Catalunya (composicio actual + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlament_catalunya_diputats"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Corts Valencianes)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Corts Valencianes (listado + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "corts_valencianes_diputats"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Cortes CLM)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Castilla-La Mancha (listado + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "cortes_clm_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Cortes CyL)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Castilla y Leon (PlenoAlfabetico)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "cortes_cyl_procuradores"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de Andalucia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Andalucia (listado + fichas)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlamento_andalucia_diputados"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento de Navarra)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Navarra: parlamentarios forales (fichas HTML)",
        "estado": "DONE",
        "bloque": "Done now: YES. Reconcilia `parlamento_navarra_parlamentarios_forales` en `from-file` con `50/50 registros validos` en `run_id=595` (snapshot `2026-02-12`, origen `etl/data/raw/manual/navarra_persona_profiles_20260212T144911Z/pages`). Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`.",
        "source_ids": [
          "parlamento_navarra_parlamentarios_forales"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Representantes y mandatos (Parlamento Vasco)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento Vasco (listado ACT)",
        "estado": "DONE",
        "bloque": "Hardening de parsing y umbral minimo",
        "source_ids": [
          "parlamento_vasco_parlamentarios"
        ],
        "scope": "autonomico",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Normativa auton\u00f3mica (piloto 3 CCAA)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOCM (Madrid) + DOGC (Catalunya) + BOJA (Andaluc\u00eda)",
        "estado": "TODO",
        "bloque": "Falta conector y modelo can\u00f3nico de normas auton\u00f3micas (con efectos) con trazabilidad y dedupe por versi\u00f3n",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Contrataci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
        "dominio": "Dinero",
        "fuentes_objetivo": "PLACSP (filtrado por \u00f3rganos auton\u00f3micos)",
        "estado": "DONE",
        "bloque": "Done now: YES. `placsp_autonomico` recuper\u00f3 `strict-network` con red real (`run_id=248`, `run_status=ok`, `run_records_loaded=106`) y el mismatch restante era solo desfase tracker/SQL, por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-11/evidence/placsp-strict-refresh.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-status.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-gate.log`, `docs/etl/sprints/AI-OPS-11/exports/placsp_waiver_decision.csv`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "placsp_autonomico"
        ],
        "scope": "dinero",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Subvenciones auton\u00f3micas (piloto 3 CCAA)",
        "dominio": "Dinero",
        "fuentes_objetivo": "BDNS/SNPSAP (filtrado por \u00f3rgano convocante/territorio)",
        "estado": "DONE",
        "bloque": "Done now: YES. `bdns_autonomico` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/busqueda`) y red real (`run_id=257`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "bdns_autonomico"
        ],
        "scope": "dinero",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
        "dominio": "Dinero",
        "fuentes_objetivo": "Portales presupuestarios auton\u00f3micos / IGAE cuando aplique",
        "estado": "TODO",
        "bloque": "Falta conector y crosswalk de clasificaciones; preferir ejecuci\u00f3n cuando exista",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Procesos electorales y resultados",
        "dominio": "Electoral",
        "fuentes_objetivo": "Infoelectoral descargas/procesos",
        "estado": "DONE",
        "bloque": "Hardening de parsing de campos opcionales en procesos/resultados",
        "source_ids": [
          "infoelectoral_descargas",
          "infoelectoral_procesos"
        ],
        "scope": "electoral",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Publicacion abierta de snapshots ETL",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Hugging Face Datasets (dataset publico)",
        "estado": "DONE",
        "bloque": "Done now: YES. Snapshot p\u00fablico reproducible disponible en HF con paquete por fecha (`snapshots/<snapshot_date>/`) que incluye `published/*`, `manifest.json`, `checksums.sha256`, `latest.json` y Parquet navegable; por privacidad se excluyen por defecto `raw_fetches,run_fetches,source_records,lost_and_found` y `politicos-es.sqlite.gz` queda desactivado salvo override expl\u00edcito. Slice AI-OPS-28: el empaquetador ahora propaga `quality_report` (desde `votaciones-kpis`) a `manifest.json`, `latest.json` y `README.md`; publicaci\u00f3n real ejecutada el 2026-02-22 con verificaci\u00f3n remota en `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_latest_post_publish_20260222T184735Z.json`, `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_manifest_post_publish_20260222T184743Z.json`, `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_readme_post_publish_20260222T184749Z.md`. Hardening adicional: gate remoto reproducible `just etl-verify-hf-quality` (script `scripts/verify_hf_snapshot_quality.py`) valida consistencia de `quality_report` y deja JSON de evidencia (`docs/etl/sprints/AI-OPS-28/evidence/hf_remote_quality_verify_20260222T185350Z.json`); adem\u00e1s `just etl-publish-hf*` exige `quality_report` por defecto (`HF_REQUIRE_QUALITY_REPORT=1`, flag `--require-quality-report`) con evidencia de dry-run `docs/etl/sprints/AI-OPS-28/evidence/hf_publish_dryrun_require_quality_20260222T185920Z.txt`. CI hook: `.github/workflows/etl-tracker-gate.yml` a\u00f1ade job `hf-quality-contract` (push `main`) que ejecuta verificaci\u00f3n remota y sube artifact JSON. Comando: `just etl-publish-hf` (dry-run: `just etl-publish-hf-dry-run`, verify: `just etl-verify-hf-quality`). Siguiente comando: `SNAPSHOT_DATE=2026-02-12 just etl-publish-hf-verify`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Convocatorias y estado electoral",
        "dominio": "Electoral",
        "fuentes_objetivo": "Junta Electoral Central",
        "estado": "TODO",
        "bloque": "Falta scraper y normalizacion",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Marco legal electoral",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE API",
        "estado": "DONE",
        "bloque": "Done now: YES. Ingesta BOE (`boe_api_legal`) y mapping a `policy_events` est\u00e1n reproducibles (`records_loaded=298`, `policy_events_boe=298`) y reconciliados con SQL `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-08/reports/waiver-burndown-apply-recompute.md`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-ingest-replay.log`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-policy-events-backfill.log` y `docs/etl/sprints/AI-OPS-08/reports/boe-tracker-mapping-hardening.md`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "boe_api_legal"
        ],
        "scope": "legal",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Normativa por fragmento (articulo/disposicion/anexo)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE (texto consolidado + versiones)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 cre\u00f3 la base reproducible `legal_norms` + `legal_norm_fragments` (`8` normas, `8` fragmentos). Slice AI-OPS-155 a\u00f1ade lineage normativo por versi\u00f3n/fecha con `legal_norm_lineage_edges` (`lineage_hints_total=8`, `lineage_edges_total=8`, `norms_with_lineage=8/8`, `lineage_primary_evidence_coverage_pct=1.0`), incluyendo alta autom\u00e1tica de `4` normas relacionadas referenciadas (`legal_norms_total=12`) en DB real (`status=ok`, `fk_violations_total=0`). Evidencia: `docs/etl/sprints/AI-OPS-155/reports/sanction-norms-lineage-seed-lane.md`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_import_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_status_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sqlite_fk_check_20260224T000533Z.json`. Falta backfill BOE continuo a cobertura completa por `articulo/disposicion/anexo` y lineage hist\u00f3rico multi-versi\u00f3n (sin dependencia de semilla cerrada). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-24 just parl-sanction-norms-seed-pipeline`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Responsabilidad por fragmento normativo",
        "dominio": "Legal",
        "fuentes_objetivo": "Congreso/Senado (iniciativas+enmiendas+votos) + BOE (firma/promulgacion)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Cadena base por fragmento activada (`15` responsabilidades/`8` fragmentos), migraci\u00f3n documental `seed->non-seed` cerrada (`queue_rows_total=0`) y evidencia multipista operativa (`boe_publicacion`, `senado_diario`, `congreso_vote`, `senado_vote`, `other`). AI-OPS-167 cerr\u00f3 ejecuci\u00f3n al `100%` (`responsibilities_with_execution_evidence_total=15/15`). AI-OPS-168/169/170 elevaron cobertura parlamentaria-voto hasta `13/15`; AI-OPS-171 a\u00f1adi\u00f3 fallback conservador de t\u00edtulo LISOS (`title_rule:lisos_orden_social`) en `scripts/backfill_sanction_norms_parliamentary_evidence.py` y cerr\u00f3 cobertura parlamentaria a `15/15`, manteniendo voto en `13/15` (`responsibility_parliamentary_coverage_pct=1.0`, `responsibility_parliamentary_vote_coverage_pct=0.866667`, `responsibility_evidence_items_total=99`) con `execution=15/15`, `queue_rows_total=0` y `fk_violations_total=0`. Evidencia: `docs/etl/sprints/AI-OPS-170/reports/sanction-norms-vote-lineage-mixed-bridge-closure.md`, `docs/etl/sprints/AI-OPS-171/reports/sanction-norms-parliamentary-title-rule-closure.md`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_vote_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_seed_status_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/responsibility_parliamentary_vote_gap_20260224T094041Z.csv`, `docs/etl/sprints/AI-OPS-171/evidence/sqlite_fk_check_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_sanction_norms_seed_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_liberty_restrictions_20260224T094041Z.txt`. Gap residual: voto en `2` responsabilidades (`BOE-A-2000-15060`: `approve/enforce`, con `has_parliamentary_any=1` y `has_vote=0`). Falta adem\u00e1s escalar se\u00f1ales procedimentales desde piloto semilla a datos revisores oficiales (TEAR/TEAC/contencioso/defensores). Siguiente comando: `DB_PATH=<db> SANCTION_NORMS_VOTE_EVIDENCE_ROLES=approve,propose,enforce,delegate just parl-backfill-sanction-norms-vote-evidence && DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Regulacion delegada y enforcement de organismos (DGT y similares)",
        "dominio": "Ejecutivo",
        "fuentes_objetivo": "BOE habilitaciones + reglamentos/ordenes + actos de organismo",
        "estado": "DONE",
        "bloque": "Done now: YES. Cierre operativo consolidado en AI-OPS-305: se sincroniza la seed can\u00f3nica (`etl/data/seeds/liberty_delegated_enforcement_seed_v1.json`) con decisiones aprobadas de lanes previas (AI-OPS-288 + AI-OPS-292 + AI-OPS-293), se reimporta en DB principal y se endurece la observabilidad de cola (`report_liberty_delegated_person_window_queue.py`) con dedupe por `fragment_id` m\u00e1s reciente (`--dedupe-fragment-latest`, default true) y excepci\u00f3n expl\u00edcita para actor no nominativo aprobado (`approved_non_nominative_unit_from_*`) validado por QA manual en AI-OPS-294. Resultado real en `etl/data/staging/politicos-es.db`: cola estricta `max_actionable_rows=0` pasa (`status=ok`, `actionable_queue_rows=0`, `rc=0`; delta `8->0`), gate de enforcement delegado en verde (`parl-check-liberty-delegated-enforcement-gate rc=0`, `gate.passed=true`, coberturas `target_fragment=1.0`, `designated_actor=1.0`, `enforcement_evidence=0.9375`), y paridad tracker limpia (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-305/reports/liberty-delegated-queue-closure-and-seed-sync-20260228.md`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_person_window_queue_strict_after_import_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_person_window_queue_strict_delta_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_enforcement_status_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/just_parl_check_liberty_delegated_enforcement_gate_rc_latest.txt`, `docs/etl/sprints/AI-OPS-305/evidence/tracker_status_latest.log`, `docs/etl/sprints/AI-OPS-305/evidence/unittest_liberty_delegated_seed_sync_stack_latest.txt`. Siguiente comando: `DB_PATH=<db> LIBERTY_DELEGATED_PERSON_QUEUE_MAX_ACTIONABLE_ROWS=0 just parl-check-liberty-delegated-person-window-queue && DB_PATH=<db> just parl-check-liberty-delegated-enforcement-gate`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cola accionable persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "`liberty_delegated_enforcement_links` + seeds BOE + reporte de cola",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-277 cierra slice operativo de remediaci\u00f3n para la fila de regulaci\u00f3n delegada con contrato reproducible de cola accionable: nuevo script `scripts/report_liberty_delegated_person_window_queue.py`, test `tests/test_report_liberty_delegated_person_window_queue.py` y wiring en `justfile` (`parl-report/check-liberty-delegated-person-window-queue`). Corrida real en staging (`etl/data/staging/politicos-es.db`): `status=ok` con `actionable_queue_rows=8` y razones (`missing_designated_actor=2`, `institutional_designated_actor=6`, `missing_enforcement_evidence_date=1`), export CSV `8` filas (`docs/etl/sprints/AI-OPS-277/exports/liberty_delegated_person_window_queue_latest.csv`). Fail-path contractual validado con `max_actionable_rows=0`: `status=degraded`, `strict_fail_reasons=[actionable_rows_above_threshold]`, `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-277/reports/liberty-delegated-person-window-actionable-queue-closure-20260228.md`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_latest.json`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_fail_latest.json`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-277/evidence/unittest_liberty_delegated_person_window_queue_latest.txt`. Siguiente comando: `DB_PATH=<db> LIBERTY_DELEGATED_PERSON_QUEUE_MAX_ACTIONABLE_ROWS=<target> just parl-check-liberty-delegated-person-window-queue`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Loop review/apply de cola persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "CSV de revisi\u00f3n + apply validado de seed delegada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-278 cierra el loop operativo encima de la cola AI-OPS-277: nuevo exportador `scripts/export_liberty_delegated_person_window_review_queue.py` (CSV revisable con campos `decision/reviewed_*`) y aplicador `scripts/apply_liberty_delegated_person_window_reviews.py` (apply con validaci\u00f3n de fechas/ventana y `validate_seed`), con wiring en `justfile` (`parl-export-liberty-delegated-person-window-review-queue`, `parl-check-liberty-delegated-person-window-review-queue-actionable-empty`, `parl-apply-liberty-delegated-person-window-reviews`) y tests `tests/test_export_liberty_delegated_person_window_review_queue.py` + `tests/test_apply_liberty_delegated_person_window_reviews.py`. Corrida real en staging (`etl/data/staging/politicos-es.db`): export `rows_total=8`, `actionable_rows_total=8`, `missing_seed_links_total=0`; fail-path contractual `strict-empty-actionable` devuelve `rc=4`; apply dry-run sobre CSV exportado deja `rows_seen=8`, `rows_with_decision=0`, `updated_rows=0`, `validation.valid=true`. Evidencia: `docs/etl/sprints/AI-OPS-278/reports/liberty-delegated-person-window-review-apply-loop-closure-20260228.md`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_queue_latest.json`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_queue_actionable_empty_rc_latest.txt`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_apply_dry_run_latest.json`, `docs/etl/sprints/AI-OPS-278/evidence/unittest_liberty_delegated_review_loop_latest.txt`, `docs/etl/sprints/AI-OPS-278/exports/liberty_delegated_person_window_review_queue_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/apply_liberty_delegated_person_window_reviews.py --seed etl/data/seeds/liberty_delegated_enforcement_seed_v1.json --in <review_csv_con_decisiones> --seed-out <seed_out_json> --out <apply_out_json>`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cola priorizada de scraping persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "`liberty_delegated_enforcement_links` + cola review + export de targets",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-279 cierra un slice de ejecuci\u00f3n controlable para acelerar cierre de backlog en delegaci\u00f3n: nuevo exportador `scripts/export_liberty_delegated_person_window_scrape_targets.py` que transforma la cola accionable/review en objetivos de scraping priorizados (`priority_score/priority_rank`) y paquetizados por instituci\u00f3n (`packet_key`), con queries operativas (`search_query_primary/search_query_secondary`) y goal expl\u00edcito por fila (`scrape_goal`). Wiring en `justfile`: `parl-export-liberty-delegated-person-window-scrape-targets` y `parl-check-liberty-delegated-person-window-scrape-targets` + variables `LIBERTY_DELEGATED_SCRAPE_TARGETS_*`; test a\u00f1adido `tests/test_export_liberty_delegated_person_window_scrape_targets.py`. Corrida real en staging (`etl/data/staging/politicos-es.db`): `targets_total=8`, `packets_total=4`, `top_priority_score=65`, `lowest_priority_score=30`, distribuci\u00f3n `{aeat:3, inspeccion-de-trabajo-y-seguridad-social:2, dgt:2, delegaciones-subdelegaciones-del-gobierno:1}`. Gate estricto validado: pass con `strict_min_targets=1`; fail-path contractual con `strict_min_targets=20` devuelve `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-279/reports/liberty-delegated-person-window-scrape-targets-lane-20260228.md`, `docs/etl/sprints/AI-OPS-279/evidence/liberty_delegated_person_window_scrape_targets_latest.json`, `docs/etl/sprints/AI-OPS-279/evidence/liberty_delegated_person_window_scrape_targets_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-279/evidence/unittest_liberty_delegated_scrape_targets_latest.txt`, `docs/etl/sprints/AI-OPS-279/exports/liberty_delegated_person_window_scrape_targets_latest.csv`. Siguiente comando: `DB_PATH=<db> just parl-export-liberty-delegated-person-window-scrape-targets && DB_PATH=<db> LIBERTY_DELEGATED_SCRAPE_TARGETS_STRICT_MIN_TARGETS=<target> just parl-check-liberty-delegated-person-window-scrape-targets`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Candidatos BOE de nombramiento para cola delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "Buscador BOE (`redirector.php` + `boe.php`) sobre targets priorizados",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-280 cierra un slice de scraping/procesado estructurado encima de AI-OPS-279: nuevo script `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` que consulta BOE por variantes de query (incluyendo expansi\u00f3n de acr\u00f3nimos `AEAT/DGT/ITSS`), parsea resultados (`li.resultado-busqueda`) y exporta candidatos con contrato reproducible (`candidate_boe_id`, `candidate_doc_url`, `candidate_publication_date`, `candidate_department`, `candidate_title`, `candidate_person_hint`, `query_variant`, `candidate_score`). Wiring en `justfile`: `parl-scrape-liberty-delegated-person-window-boe-candidates` y `parl-check-liberty-delegated-person-window-boe-candidates`; test a\u00f1adido `tests/test_scrape_liberty_delegated_person_window_boe_candidates.py`. Corrida real: `targets_total=8`, `targets_with_results_total=8`, `candidate_rows_total=40`, `candidate_unique_boe_ids_total=25`, `http_errors_total=0`; gate estricto pass (`strict_min_candidates=1`) y fail-path contractual validado (`strict_min_candidates=9999`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-280/reports/liberty-delegated-person-window-boe-candidates-lane-20260228.md`, `docs/etl/sprints/AI-OPS-280/evidence/liberty_delegated_person_window_boe_candidates_latest.json`, `docs/etl/sprints/AI-OPS-280/evidence/liberty_delegated_person_window_boe_candidates_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-280/evidence/unittest_liberty_delegated_boe_candidates_latest.txt`, `docs/etl/sprints/AI-OPS-280/exports/liberty_delegated_person_window_boe_candidates_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/scrape_liberty_delegated_person_window_boe_candidates.py --targets-csv docs/etl/sprints/AI-OPS-279/exports/liberty_delegated_person_window_scrape_targets_latest.csv --strict-min-candidates <target> --out <candidates_csv> --summary-out <summary_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Asistencia de revisi\u00f3n desde candidatos BOE (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Review queue + candidatos BOE + scoring de relevancia",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-281 cierra el tramo de limpieza/estructuraci\u00f3n entre scraping y apply: nuevo script `scripts/export_liberty_delegated_person_window_review_assist_from_boe_candidates.py` que une `review_queue` y `boe_candidates` por `link_key`, filtra por score, normaliza fechas (`candidate_publication_date_iso`), calcula se\u00f1ales de matching (`role_token_overlap`, `institution_token_overlap`) y exporta sugerencias `suggested_reviewed_*` con `candidate_relevance_bucket`/`autofill_confidence` para revisi\u00f3n humana. Wiring en `justfile`: `parl-export-liberty-delegated-person-window-review-assist` y `parl-check-liberty-delegated-person-window-review-assist`; test a\u00f1adido `tests/test_export_liberty_delegated_person_window_review_assist_from_boe_candidates.py`. Corrida real: `assist_rows_total=15`, `review_links_with_candidates_total=5`, `review_links_without_candidates_total=3`, `relevance_bucket_counts={strong:0, medium:15, weak:0}`; gate estricto pass (`strict_min_assist_rows=1`) y fail-path contractual validado (`min_candidate_score=80`, `max_candidates_per_link=1`, `assist_rows_total=0`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-281/reports/liberty-delegated-person-window-review-assist-lane-20260228.md`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_latest.json`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_fail_latest.json`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-281/exports/liberty_delegated_person_window_review_assist_latest.csv`, `docs/etl/sprints/AI-OPS-281/evidence/unittest_liberty_delegated_review_assist_latest.txt`. Siguiente comando: `PYTHONPATH=. python3 scripts/export_liberty_delegated_person_window_review_assist_from_boe_candidates.py --review-queue-csv docs/etl/sprints/AI-OPS-278/exports/liberty_delegated_person_window_review_queue_latest.csv --boe-candidates-csv docs/etl/sprints/AI-OPS-280/exports/liberty_delegated_person_window_boe_candidates_latest.csv --strict-min-assist-rows <target> --out <assist_csv> --summary-out <assist_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Autorrevisi\u00f3n asistida + apply parcial de seed delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "Review queue + assist BOE + apply seed",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-282 cierra un slice controlable de procesamiento/limpieza entre asistencia y aplicaci\u00f3n: nuevo script `scripts/export_liberty_delegated_person_window_auto_review_decisions.py` transforma `review_queue + review_assist` en CSV de decisiones conservadoras (`approved` solo con campos requeridos por raz\u00f3n), con wiring en `justfile` (`parl-export/check-liberty-delegated-person-window-auto-review-decisions`) y test `tests/test_export_liberty_delegated_person_window_auto_review_decisions.py`; adem\u00e1s se refina extracci\u00f3n BOE en `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` para patrones `nombramiento como ... de don/do\u00f1a` y limpieza de puntuaci\u00f3n. Corrida real (latest tras rerun reproducible): `rows_total=8`, `approved_rows_total=8`, `pending_rows_total=0`, `updated_rows=8`, `validation.valid=true`; gate estricto pass (`strict_min_approved_rows=1`) y fail-path contractual validado (`strict_min_approved_rows=9`, `rc=4`); replay before/after de cola en DB temporal cierra backlog (`actionable_queue_rows 8->0`, `delta=-8`). Evidencia: `docs/etl/sprints/AI-OPS-282/reports/liberty-delegated-person-window-auto-review-apply-lane-20260228.md`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_person_window_auto_review_decisions_latest.json`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_person_window_auto_review_apply_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_auto_review_delta_latest.json`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_auto_review_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-282/exports/liberty_delegated_person_window_auto_review_decisions_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/export_liberty_delegated_person_window_auto_review_decisions.py --review-queue-csv <review_queue_csv> --review-assist-csv <review_assist_csv> --strict-min-approved-rows <target> --out <decisions_csv> --summary-out <summary_json> && PYTHONPATH=. python3 scripts/apply_liberty_delegated_person_window_reviews.py --seed etl/data/seeds/liberty_delegated_enforcement_seed_v1.json --in <decisions_csv> --seed-out <seed_out_json> --out <apply_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre de cola delegada por scoring institucional expandido",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE candidates scoring + assist/apply replay",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-283 cierra el backlog residual de la cola delegada ajustando el matching institucional en `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` (tokens de instituci\u00f3n + expansi\u00f3n de acr\u00f3nimos `AEAT/DGT/ITSS`), elevando cobertura de candidatos por enlace y permitiendo cierre completo del loop. Corrida real: `review_links_with_candidates_total=8/8`, `assist_rows_total=24`, auto-review `approved_rows_total=8`, apply `updated_rows=8`, `validation.valid=true`; replay before/after: `actionable_queue_rows 8->0` (`delta=-8`). Evidencia: `docs/etl/sprints/AI-OPS-283/reports/liberty-delegated-person-window-score-expansion-and-queue-closure-20260228.md`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_ai_ops_283_summary_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_before_auto_review_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_after_auto_review_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_auto_review_delta_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/unittest_liberty_delegated_boe_scoring_latest.txt`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_review_assist.log`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_auto_check.log`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_apply.log`. Siguiente comando: `DB_PATH=<db_replay> PYTHONPATH=. python3 scripts/report_liberty_delegated_person_window_queue.py --db <db_replay> --max-actionable-rows 0 --strict --out <queue_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "QA manual de precisi\u00f3n para decisiones auto-aprobadas (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Muestra de `auto_review_decisions` + validaci\u00f3n humana de cargo/persona",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-284 cierra el control manual muestral con `n=8` en muestra estratificada por instituci\u00f3n (`AEAT=3`, `DGT=2`, `ITSS=2`, `Delegaciones/Subdelegaciones=1`) y decisi\u00f3n fila a fila (`confirm/reject`) sobre `cargo/persona`. Resultado observado: `reviewed_rows_total=8`, `confirm_total=2`, `reject_total=6`, `observed_precision_pct=25.0`, sin decisiones inv\u00e1lidas (`invalid_decision_total=0`). Se a\u00f1ade contrato reproducible con scripts `export_liberty_delegated_person_window_auto_review_qa_sample.py` y `report_liberty_delegated_person_window_auto_review_qa_precision.py` + targets `just` (`parl-export/report/check-liberty-delegated-person-window-auto-review-qa-*`). Evidencia: `docs/etl/sprints/AI-OPS-284/reports/liberty-delegated-auto-review-manual-qa-precision-20260228.md`, `docs/etl/sprints/AI-OPS-284/exports/liberty_delegated_person_window_auto_review_qa_sample_latest.csv`, `docs/etl/sprints/AI-OPS-284/evidence/liberty_delegated_person_window_auto_review_qa_sample_latest.json`, `docs/etl/sprints/AI-OPS-284/evidence/liberty_delegated_person_window_auto_review_qa_precision_latest.json`, `docs/etl/sprints/AI-OPS-284/evidence/unittest_liberty_delegated_auto_review_qa_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Endurecimiento de auto-review delegado por alineaci\u00f3n de cargo",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` + `review_assist` (`role_token_overlap`) + reglas de exclusi\u00f3n sem\u00e1ntica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-285 cierra el hardening del auto-review con reglas expl\u00edcitas de alineaci\u00f3n sem\u00e1ntica de cargo y jerarqu\u00eda (`Direcci\u00f3n General` no acepta `Subdirecci\u00f3n`), usando `role_token_overlap`/`institution_token_overlap` solo como soporte y degradando a `pending` los casos ambiguos. Resultado del lane: `approved_rows_total=2`, `pending_rows_total=6`, `rows_missing_role_alignment_total=6` (desde `8 approved / 0 pending` previo), con fail-path contractual de cantidad aprobada (`strict_min_approved_rows=3`, `rc=4`). El gate recurrente de precisi\u00f3n sobre filas efectivamente aprobadas (`decision_scope=approved`) pasa en estricto con `observed_precision_pct=100.0` (`2/2`, umbral `90.0`) y fail-path validado (`min_precision_pct=101`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-285/reports/liberty-delegated-auto-review-role-alignment-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_decisions_role_aligned_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_fail_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-285/evidence/unittest_liberty_delegated_role_alignment_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Resoluci\u00f3n manual de pendientes tras hardening de cargo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` role-aligned (`pending=6`) + revisi\u00f3n humana focalizada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-286 cierra el loop operativo de pendientes con una cola manual reproducible (`export_liberty_delegated_pending_resolution_review_queue.py`) que estructura por fila pendiente: raz\u00f3n de bloqueo (`pending_reason`), shortlist de candidatos (`top_candidates_json`) y queries de captura dirigida. Sobre esa cola se registran decisiones expl\u00edcitas fila a fila (`decision=pending` en `6/6` revisadas) y se aplica el CSV con contrato validado (`rows_with_decision=6`, `pending_rows=6`, `updated_rows=0`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-286/reports/liberty-delegated-pending-resolution-review-loop-20260228.md`, `docs/etl/sprints/AI-OPS-286/exports/liberty_delegated_pending_resolution_review_queue_latest.csv`, `docs/etl/sprints/AI-OPS-286/exports/liberty_delegated_pending_resolution_reviews_latest.csv`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_review_queue_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_summary_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_apply_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/unittest_liberty_delegated_pending_resolution_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura dirigida de evidencia oficial para pendientes delegados (cargo exacto)",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + boletines/instituciones delegadas (`DGT/AEAT/ITSS`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-287/288 cierra la mayor parte del backlog (`pending 6 -> 2`); AI-OPS-292 resuelve el pendiente DGT por alias sem\u00e1ntico de subdirecci\u00f3n tem\u00e1tica y AI-OPS-293 cierra el residual no nominativo AEAT con fallback institucional conservador, dejando el lane en `pending_rows_total=0`. Evidencia: `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_replay_delta_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura alternativa institucional para pendientes delegados (fuera BOE buscador)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Portales de nombramientos/transparencia DGT/AEAT/ITSS + BOE doc directo",
        "estado": "DONE",
        "bloque": "Done now: YES. Lane alternativa consolidada: AI-OPS-289 crea `alternative_capture_targets`, AI-OPS-291 endurece variantes de query BOE y AI-OPS-293 re-ejecuta sobre residual no nominativo (`pending_links_total=1`, `target_rows_total=11`, `candidate_rows_total=6`, `links_with_candidates_total=1/1`) con salida reproducible y gates contractuales activos. Evidencia: `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_targets_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_boe_candidates_latest.json`, `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Aplicaci\u00f3n y replay de evidencia alternativa capturada (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Targets alternativos AI-OPS-289 + revisi\u00f3n/apply + rerun `auto_review`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-292 deja el replay en `pending=1` y AI-OPS-293 cierra el loop completo con fallback institucional no nominativo opt-in: `pending_rows_total 1 -> 0`, `approved_with_non_nominative_actor_fallback_total=1`, `pending_resolution_rows_total=0`, apply sobre seed derivado con `updated_rows=1` y `validation.valid=true`; fail-path contractual validado (`strict_min_approved_rows=2`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_replay_delta_latest.json`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Regla sem\u00e1ntica para cargos/unidades procedimentales sin titular nominal (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` + normalizaci\u00f3n de rol (`procedural_unit`/`role_topic`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-292 define y valida la regla sem\u00e1ntica conservadora pendiente: (1) alias expl\u00edcito para subdirecci\u00f3n tem\u00e1tica DGT (`Subdirecci\u00f3n de Gesti\u00f3n de Sanciones` <-> `Subdirector General de Normativa/Legislaci\u00f3n y Recursos` en DGT), y (2) clasificaci\u00f3n expl\u00edcita de casos no nominativos como `procedural_unit_non_nominative_requires_manual` sin auto-aprobaci\u00f3n. Resultado real en replay alternativo: `approved_rows_total 0 -> 1`, `pending_rows_total 2 -> 1`, manteniendo gates (`strict_min_approved_rows=2`, `rc=4`) y apply v\u00e1lido (`updated_rows=1`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-292/reports/liberty-delegated-semantic-alias-and-residual-closure-20260228.md`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/unittest_liberty_delegated_auto_review_semantic_alias_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Resoluci\u00f3n del residual no nominativo (unidad procedimental AEAT)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Revisi\u00f3n manual focalizada + criterio institucional reproducible",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-293 cierra el residual con pol\u00edtica reproducible de fallback institucional no nominativo en `auto_review_decisions` (`--allow-non-nominative-institutional-actor-fallback`), restringida por se\u00f1al sem\u00e1ntica de delegaci\u00f3n de competencias + `institution_overlap>=3`. Resultado: actor revisado `Unidad procedimental sancionadora (AEAT)`, fecha de evidencia `2010-03-27`, `pending_rows_total=0`, apply v\u00e1lido (`updated_rows=1`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/unittest_liberty_delegated_non_nominative_fallback_latest.txt`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "QA manual de precisi\u00f3n del fallback no nominativo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Muestra focalizada de filas `approved_non_nominative_unit`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-294 cierra el guardrail con muestra focalizada reproducible (`--review-note-contains approved_non_nominative_unit`) sobre la salida AI-OPS-293, adjudicaci\u00f3n manual `confirm` en `1/1` filas y reporte estricto de precisi\u00f3n (`reviewed_rows_total=1`, `confirm_total=1`, `observed_precision_pct=100.0`, `strict_fail_reasons=[]`). Se valida fail-path contractual (`min_precision_pct=101`, `rc=4`) y se endurece trazabilidad QA corrigiendo parse de `review_note` no nominativo en el sampler (`approved_non_nominative_unit_from_*`). Evidencia: `docs/etl/sprints/AI-OPS-294/reports/liberty-delegated-non-nominative-fallback-manual-qa-20260228.md`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_sample_latest.json`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_precision_latest.json`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_precision_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-294/evidence/unittest_liberty_delegated_non_nominative_auto_review_qa_latest.txt`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Trigger autom\u00e1tico de QA para fallback no nominativo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Gate recurrente sobre `approved_with_non_nominative_actor_fallback_total`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-295 cierra el gap operativo con gate reusable `scripts/report_liberty_delegated_non_nominative_qa_gate.py` + wiring en `justfile` (`parl-report/check-liberty-delegated-non-nominative-qa-gate`) e integraci\u00f3n en `parl-liberty-restrictions-pipeline`: si `approved_with_non_nominative_actor_fallback_total=0` no exige QA; si `>0` exige evidencia focalizada (`qa_sample_summary` + `qa_precision_report`) con filtros/umbrales expl\u00edcitos (`review_note_contains`, `min_reviewed_rows`, `min_precision_pct`) y fail-fast estricto (`rc=4`). Corrida real sobre AI-OPS-293/294: `status=ok`, `qa_required=true`, `sample_rows_total=1`, `reviewed_rows_total=1`, `observed_precision_pct=100.0`; fail-path contractual validado (`min_precision_pct=101`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-295/reports/liberty-delegated-non-nominative-qa-trigger-gate-20260228.md`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_latest.json`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_fail_latest.json`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-295/evidence/just_parl_check_liberty_delegated_non_nominative_qa_gate_latest.txt`, `docs/etl/sprints/AI-OPS-295/evidence/unittest_liberty_delegated_non_nominative_qa_gate_latest.txt`. Siguiente comando: `just parl-check-liberty-delegated-non-nominative-qa-gate`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Hardening anti-ruido institucional en candidatos delegados",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE buscador (`redirector.php`) + scoring de `review_assist`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-288 endurece el procesamiento de candidatos con normalizaci\u00f3n `fold` (acentos), expansi\u00f3n de acr\u00f3nimos institucionales (`AEAT/DGT/ITSS`) en `institution_token_overlap` y guardrail m\u00ednimo por instituci\u00f3n (`institution_overlap_min`, reforzado para ITSS), adem\u00e1s de `recommended_action=inspect_candidate_low_institution_overlap` para baja afinidad. Resultado en corrida real: `rows_below_institution_overlap_min_total=11`, `approved_rows_total 2 -> 6`, `pending_rows_total 6 -> 2`. Evidencia: `docs/etl/sprints/AI-OPS-288/reports/liberty-delegated-review-assist-anti-noise-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-288/evidence/liberty_delegated_person_window_review_assist_targeted_latest.json`, `docs/etl/sprints/AI-OPS-288/evidence/liberty_delegated_targeted_capture_delta_latest.json`, `docs/etl/sprints/AI-OPS-288/evidence/unittest_liberty_delegated_targeted_queries_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Carga regulatoria agraria (ranking impacto)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE + EUR-Lex + MAPA/MITECO + OPA (ASAJA/COAG/UPA)",
        "estado": "TODO",
        "bloque": "Falta modelo reproducible para ranking `top_regulaciones_mas_gravosas` por agricultura/ganaderia (coste de cumplimiento, sanciones, horas administrativas, alcance territorial, litigios) con metodolog\u00eda y pesos expl\u00edcitos",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dossiers de impacto regulatorio agrario (piloto)",
        "dominio": "Legal",
        "fuentes_objetivo": "SIEX/CUE + PAC + nitratos/suelos + planes hidrol\u00f3gicos + LESPRE lobo + medicamentos veterinarios",
        "estado": "TODO",
        "bloque": "Falta publicar fichas comparables por norma (qu\u00e9 exige, a qui\u00e9n afecta, qu\u00e9 sanciona, qu\u00e9 alivios posteriores hubo, qui\u00e9n decidi\u00f3 cada cambio) con drill-down a evidencia primaria",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cuellos de botella regulatorios en vivienda nueva (suelo/licencias)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "TRLSRU + leyes urban\u00edsticas CCAA + ordenanzas municipales + Ley 21/2013",
        "estado": "TODO",
        "bloque": "Falta mapa reproducible de plazos y bloqueos por fase (`planeamiento -> urbanizaci\u00f3n -> licencia -> obra`) con evidencia normativa y administrativa por territorio",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Regulaci\u00f3n de alquiler y efecto en nueva oferta (build-to-rent/promoci\u00f3n)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "Ley 12/2023 + normativa auton\u00f3mica de zonas tensionadas + fiscalidad asociada",
        "estado": "TODO",
        "bloque": "Falta evaluaci\u00f3n trazable de impacto en oferta nueva (visados/inicios/terminadas por tipolog\u00eda y provincia) y cadena de decisi\u00f3n por norma/fragmento",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Dossiers de normas que m\u00e1s frenan vivienda (piloto top-N)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "Suelo/urbanismo + evaluaci\u00f3n ambiental + CTE + reservas VPO + informes sectoriales",
        "estado": "TODO",
        "bloque": "Falta publicar ranking `top_normas_cuello_botella_vivienda` con metodolog\u00eda expl\u00edcita (plazo, coste, litigiosidad, incertidumbre) y drill-down a art\u00edculos concretos",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Gasto sanitario: personal vs \"gasto vistoso\" (equipamiento/obras/consultoria/conciertos)",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Presupuestos y liquidaciones CCAA + Ministerio de Sanidad + IGAE",
        "estado": "TODO",
        "bloque": "Falta modelo comparable por CCAA y programa para medir sustituci\u00f3n de gasto asistencial de plantilla por cap\u00edtulos de capital/externos, con series temporales y notas metodol\u00f3gicas",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Contratacion sanitaria de alto importe y sobrecostes",
        "dominio": "Sanidad",
        "fuentes_objetivo": "PLACSP + portales auton\u00f3micos + OCEX/Tribunal de Cuentas",
        "estado": "TODO",
        "bloque": "Falta pipeline para detectar expedientes sanitarios con modificados, pr\u00f3rrogas, revisiones de precio y retrasos, con trazabilidad `organo -> mesa -> adjudicatario -> ejecuci\u00f3n`",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Responsabilidad del gasto sanitario (decision vs ejecuci\u00f3n)",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ley de presupuestos + acuerdos de gobierno CCAA + nombramientos + expedientes de gasto",
        "estado": "TODO",
        "bloque": "Falta cadena reproducible `presupuesto -> centro gestor -> cargo designado -> expediente -> pago -> resultado asistencial` para atribuir qui\u00e9n propuso, aprob\u00f3, ejecut\u00f3 y fiscaliz\u00f3",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Impacto asistencial del mix de gasto sanitario",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ministerio/CCAA (listas de espera, plantilla, AP/hospitalaria) + presupuestos",
        "estado": "TODO",
        "bloque": "Falta unir decisiones de gasto con outcomes (`espera`, `cobertura de plantilla`, `actividad`) para separar mala gesti\u00f3n de shocks de demanda",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Normas con m\u00e1s sanciones a ciudadan\u00eda (ranking top-N)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT + ayuntamientos (movilidad/ORA/ZBE) + AEAT + TGSS + Interior (LO 4/2015)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 publica ranking reproducible `top_normas_sancion_ciudadana` desde `sanction_volume_observations` con metodolog\u00eda expl\u00edcita (`expediente_count` + `importe_total_eur`, proxy `incidence_per_1000_observed_cases`) y `status=ok` en reporte operativo. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta pasar de datos piloto a series reales por territorio y completar incidencia por `1.000 habitantes` (denominador poblacional). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dossiers de normas sancionadoras de alta incidencia (piloto top-N)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "Tr\u00e1fico/movilidad + tributario/SS + seguridad ciudadana + ordenanzas c\u00edvicas/residuos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 publica `norm_dossiers` (`5` fichas) con `conducta` (tipolog\u00edas), `volumen`, `importe`, `base legal` (`norma -> fragmentos`) y lanes de evidencia (`source_lanes`/enlaces municipales) en `report_sanction_volume_pilot_status.py`. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta enriquecer perfil afectado y sustituir valores piloto por observaciones oficiales recurrentes por fuente/periodo. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-volume-pilot-status`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Catalogo v1 de marcos sancionadores frecuentes (base legal exacta)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "RDL 6/2015 (Tr\u00e1fico) + RD 320/1994 + LGT 58/2003 + RD 2063/2004 + LGSS/LISOS + LO 4/2015 + ordenanzas municipales",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 publica cat\u00e1logo operativo en `sanction_norm_catalog` + `sanction_norm_fragment_links` con `8` marcos iniciales (BOE IDs semilla), `organismo_competente`, hip\u00f3tesis de incidencia y `evidence_required_json`; import reproducible y validado con tests. Evidencia: `docs/etl/sprints/AI-OPS-115/reports/sanction-norms-seed-lane.md`, `docs/etl/sprints/AI-OPS-115/evidence/sanction_norms_seed_import_20260223T173448Z.json`, `docs/etl/sprints/AI-OPS-115/evidence/just_parl_test_sanction_norms_seed_20260223T173633Z.txt`. Falta ampliar cobertura (ordenanzas municipales y fragmentaci\u00f3n completa por norma/territorio). Siguiente comando: `DB_PATH=<db> just parl-import-sanction-norms-seed`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fuentes de volumen sancionador (piloto 5 organismos)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT anuarios + AEAT memorias sancionadoras + TGSS/ITSS + Interior (LO 4/2015) + ayuntamientos open data",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 publica cat\u00e1logo operativo de fuentes en `sanction_volume_sources` (5 lanes: DGT/AEAT/TGSS-ITSS/Interior/municipal piloto), junto con contrato com\u00fan de m\u00e9tricas y tablas destino (`sanction_volume_observations`) para ingestas comparables. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta cargar observaciones reales por organismo/periodo (`expediente_count`, `importe_total`, `importe_medio`, `recurso_estado`). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-data-catalog-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Semilla v1 de normas sancionadoras de alta frecuencia (lista cerrada inicial)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "BOE-A-2015-11722 + BOE-A-2003-23514 + BOE-A-1994-8985 + BOE-A-2003-23186 + BOE-A-2004-18398 + BOE-A-2015-11724 + BOE-A-2000-15060 + BOE-A-2015-3442",
        "estado": "DONE",
        "bloque": "Done now: YES. `etl/data/seeds/sanction_norms_seed_v1.json` publicado con contrato `schema_version=sanction_norms_seed_v1` y campos requeridos (`norm_id`, `boe_id`, `scope`, `organismo_competente`, `incidence_hypothesis`, `evidence_required`, `key_fragments`, `responsibility_hints`), con validaci\u00f3n reproducible (`valid=true`, `norms_total=8`, `errors_count=0`) y pipeline `just` dedicado (`parl-validate/import/report-sanction-norms-seed*`). Evidencia: `docs/etl/sprints/AI-OPS-115/reports/sanction-norms-seed-lane.md`, `docs/etl/sprints/AI-OPS-115/evidence/sanction_norms_seed_validate_20260223T173448Z.json`, `docs/etl/sprints/AI-OPS-115/evidence/just_parl_sanction_norms_seed_pipeline_20260223T173646Z.txt`. Siguiente comando: `just parl-validate-sanction-norms-seed`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Ordenanzas municipales sancionadoras (piloto 20 ciudades)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "BOP/portales municipales (movilidad, ORA/ZBE, civismo, residuos, ruido)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 a\u00f1ade tablas `sanction_municipal_ordinances` + `sanction_municipal_ordinance_fragments` y carga piloto reproducible con `20` ordenanzas (`normalized=3`, `identified=17`) y `3` fragmentos normalizados (`mapped_fragment_total=2`). Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sqlite_fk_check_20260223T180041Z.txt`. Falta completar normalizaci\u00f3n `20/20` a unidad sancionable (`articulo/conducta/rango/organo/recurso`) y elevar mappings municipales a cobertura operativa. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tipolog\u00edas de infracci\u00f3n m\u00e1s sancionadas (cat\u00e1logo ciudadano)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT + AEAT + TGSS/ITSS + Interior + ayuntamientos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 crea cat\u00e1logo transversal en `sanction_infraction_types` (`10` tipolog\u00edas) y mapeo inicial en `sanction_infraction_type_mappings` (`10` mappings, cobertura a `fragment_id=8/10`, incluyendo lanes municipales `source_only` en espera de ordenanzas normalizadas). Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta completar mappings municipales a `norma_fragmento_id` y a\u00f1adir m\u00e9tricas de volumen por tipolog\u00eda. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Accountability de la cadena sancionadora (multa/cargo)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "Norma habilitante + organismo instructor/resolutor + recaudaci\u00f3n + recursos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 abre trazabilidad `norma -> fragmento -> responsabilidad`; AI-OPS-156 a\u00f1ade evidencia multipista; AI-OPS-158/159/160/161 cierran cobertura documental y migraci\u00f3n `seed -> non-seed` (`seed=0`, `non-seed=15`, cola vac\u00eda). Slice AI-OPS-162 incorpora primera se\u00f1al parlamentaria reproducible (`senado_diario=2`) ligada a normas sancionadoras (`BOE-A-2003-23186`, `BOE-A-2015-3442`) con status lane `ok` y nuevos KPIs de cobertura parlamentaria (`responsibility_evidence_items_parliamentary_total=2`, `responsibility_parliamentary_coverage_pct=0.133333`). Evidencia: `docs/etl/sprints/AI-OPS-161/reports/sanction-norms-seed-source-record-upgrade-apply.md`, `docs/etl/sprints/AI-OPS-162/reports/sanction-norms-parliamentary-evidence-backfill.md`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_status_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_source_record_upgrade_queue_20260224T010415Z.json`. Falta integrar niveles `acto sancionador -> cobro -> recurso/resultado` por expediente y elevar cobertura parlamentaria por rol/acto (votos + enmiendas + ejecuci\u00f3n). Siguiente comando: `DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad garantista del sistema sancionador",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "\u00d3rganos revisores (TEAR/TEAC, contencioso, defensores) + datos de estimaci\u00f3n/anulaci\u00f3n",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 publica contrato KPI de justicia procedimental en `sanction_procedural_kpi_definitions` (`3` KPIs: recurso estimado, anulaci\u00f3n formal, retraso p90) y tabla operativa `sanction_procedural_metrics` para series observadas. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta ingesta de datos revisores (TEAR/TEAC/contencioso/defensores) para poblar m\u00e9tricas y pasar de contrato a resultados. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Coste regulado de energ\u00eda dom\u00e9stica (luz/gas)",
        "dominio": "Energia",
        "fuentes_objetivo": "BOE (peajes/cargos/PVPC/TUR) + CNMC + MITECO",
        "estado": "TODO",
        "bloque": "Falta descomponer factura en componentes normativos y atribuir variaciones de coste por norma/fecha/territorio, separando energ\u00eda de mercado vs parte regulada",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fiscalidad municipal de alta incidencia (IBI/IVTM/basura/plusval\u00eda)",
        "dominio": "Fiscalidad",
        "fuentes_objetivo": "TRLRHL + ordenanzas fiscales municipales + catastros/ayuntamientos",
        "estado": "TODO",
        "bloque": "Falta comparador reproducible por municipio y perfil de hogar con trazabilidad `ordenanza -> pleno/alcald\u00eda -> liquidaci\u00f3n`",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cargos financieros minoristas (hipoteca/cuenta/descubierto)",
        "dominio": "Consumo-Finanzas",
        "fuentes_objetivo": "Banco de Espa\u00f1a (reclamaciones/memorias) + BOE cr\u00e9dito inmobiliario/servicios de pago",
        "estado": "TODO",
        "bloque": "Falta mapa normativo + dataset de costes/reclamaciones por entidad y tipolog\u00eda de cobro para detectar fricci\u00f3n masiva y accountability regulatoria",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fricci\u00f3n regulatoria en telecom/servicios esenciales (reclamaciones/cobros)",
        "dominio": "Consumo",
        "fuentes_objetivo": "CNMC + Consumo + CCAA (OMIC/Juntas Arbitrales) + operadores",
        "estado": "TODO",
        "bloque": "Falta modelo unificado de reclamaciones/sanciones por cl\u00e1usula/pr\u00e1ctica para identificar qu\u00e9 marcos generan m\u00e1s conflicto ciudadano recurrente",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tarifas y c\u00e1nones de agua/saneamiento (hogares)",
        "dominio": "Servicios esenciales",
        "fuentes_objetivo": "CCAA + entes locales + operadores p\u00fablicos/mixtos + BOE/boletines auton\u00f3micos",
        "estado": "TODO",
        "bloque": "Falta mapa regulatorio y comparador de factura de agua por municipio (`cuota fija`, `bloques`, `canon`, `depuraci\u00f3n`) con trazabilidad de cambios normativos y \u00f3rgano decisor",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tarifas y bonificaciones de transporte p\u00fablico",
        "dominio": "Movilidad",
        "fuentes_objetivo": "MITMA/Ministerio Transportes + CCAA + ayuntamientos/consorcios + operadores",
        "estado": "TODO",
        "bloque": "Falta modelo reproducible por ciudad/\u00e1rea para medir impacto de reglas tarifarias/bonificaciones en coste mensual real por perfil de usuario",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Copago farmac\u00e9utico y acceso a medicamentos",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ley/BOE + SNS/CCAA (cartera y aportaci\u00f3n farmac\u00e9utica) + ministerio/servicios de salud",
        "estado": "TODO",
        "bloque": "Falta vincular reglas de aportaci\u00f3n y financiaci\u00f3n a coste de bolsillo por perfil (renta, cronicidad, pensionista) y a variaciones territoriales",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Precios p\u00fablicos en educaci\u00f3n infantil y servicios asociados",
        "dominio": "Educaci\u00f3n",
        "fuentes_objetivo": "CCAA + ayuntamientos (escuelas infantiles, comedor, actividades) + convocatorias de becas",
        "estado": "TODO",
        "bloque": "Falta comparador territorial de precios p\u00fablicos y elegibilidad de ayudas (`umbrales`, `baremos`, `plazos`) con impacto neto por hogar",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Carga administrativa digital obligatoria y recargos por incumplimiento",
        "dominio": "Administraci\u00f3n",
        "fuentes_objetivo": "AEAT/TGSS/DGT/CCAA/ayuntamientos (sedes electr\u00f3nicas y procedimientos)",
        "estado": "TODO",
        "bloque": "Falta cat\u00e1logo de obligaciones digitales por perfil ciudadano/pyme (`plazo`, `canal`, `sanci\u00f3n/recargo`) y medici\u00f3n de fricci\u00f3n por complejidad y tasa de error",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Marcos de seguro obligatorio de alta incidencia (veh\u00edculo/vivienda ligada a hipoteca)",
        "dominio": "Consumo-Seguros",
        "fuentes_objetivo": "DGSFP + BOE (responsabilidad civil obligatoria y normativa de mediaci\u00f3n/contrato) + supervisores",
        "estado": "TODO",
        "bloque": "Falta mapa de obligaciones m\u00ednimas y costes recurrentes asociados por perfil de hogar, con trazabilidad normativa y v\u00edas de reclamaci\u00f3n",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "\u00cdndice de Restricci\u00f3n de Libertad Ciudadana (IRLC) por norma/fragmento",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + normativa CCAA + ordenanzas municipales + jurisprudencia relevante",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 publica metodolog\u00eda IRLC auditable (`irlc_v1`) con pesos expl\u00edcitos (`reach/intensity/due_process_risk/reversibility_risk/discretionality/compliance_cost`) y scoring reproducible por `fragment_id` en `liberty_restriction_assessments`; Slice AI-OPS-130 ampl\u00eda la semilla a `11` assessments manteniendo `8` fragmentos base, con gate de cobertura por derecho integrado en `focus_gate`. Evidencia: `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`, `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_import_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`. Falta ampliar cobertura fuera del seed sancionador (CCAA/municipal/jurisprudencia) y pasar de semilla a ingesta continua. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Mapa de restricciones por derecho afectado",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + CCAA + ordenanzas + resoluciones administrativas/judiciales p\u00fablicas",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 a\u00f1ade taxonom\u00eda reproducible `liberty_right_categories` (`6` derechos) y mapa operativo `restriction_map_by_right`; Slice AI-OPS-130 cierra el gap de categor\u00edas vac\u00edas y deja cobertura `6/6` (`right_categories_with_data_total=6`, `right_categories_with_data_pct=1.0`) con guardrail expl\u00edcito `rights_with_data_gate` en `report_liberty_restrictions_status.py` (`LIBERTY_RESTRICTIONS_RIGHTS_WITH_DATA_MIN`, default `1.0`). Evidencia: `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_fail_rc_20260223T202028Z.txt`. Falta extender alcance territorial (Estado+CCAA+municipal) y densidad de evidencia primaria multi-fuente. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-restrictions-status`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Test de proporcionalidad y necesidad regulatoria",
        "dominio": "Derechos",
        "fuentes_objetivo": "AIR/Memoria normativa + evaluaciones ex post + \u00f3rganos consultivos + datos de outcomes",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 abre pipeline reproducible de proporcionalidad (`liberty_proportionality_methodologies/liberty_proportionality_reviews`) con semilla versionada `liberty_proportionality_seed_v1.json`, validaci\u00f3n/import idempotente y gate ejecutable (`just parl-check-liberty-proportionality-gate`). Resultado actual: `reviews_total=8`, `target_fragments_coverage_pct=1.0`, `objective_defined_pct=1.0`, `indicator_defined_pct=0.75`, `alternatives_considered_pct=0.5`, `gate.passed=true` y `reviews_below_threshold_total=2` para priorizaci\u00f3n de revisi\u00f3n. Evidencia: `docs/etl/sprints/AI-OPS-119/reports/liberty-proportionality-direct-accountability-lane.md`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_import_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_status_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/just_parl_liberty_restrictions_pipeline_20260223T182117Z.txt`. Falta sustituir semilla por ingesta continua AIR/ex-post y a\u00f1adir evidencia de eficacia observada fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-proportionality-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Variaci\u00f3n territorial y arbitrariedad de enforcement",
        "dominio": "Derechos",
        "fuentes_objetivo": "CCAA/ayuntamientos + organismos sancionadores + recursos estimados/desestimados",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-120 abre lane reproducible de variaci\u00f3n territorial con `liberty_enforcement_methodologies/liberty_enforcement_observations` y reporte operativo `report_liberty_enforcement_variation_status.py` (m\u00e9tricas por `fragment_id`: `sanction_rate_per_1000`, `annulment_rate`, `resolution_delay_p90_days`). Resultado actual: `observations_total=16`, `fragments_with_multi_territory_total=8/8`, `high_variation_fragments_total=3`, `target_fragment_coverage_pct=1.0`, `gate.passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-120/reports/liberty-territorial-variation-indirect-accountability-lane.md`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_import_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_status_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/just_parl_liberty_restrictions_pipeline_20260223T183508Z.txt`. Falta sustituir piloto semilla por ingesta territorial continua y ampliar cobertura fuera de territorios de arranque. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-enforcement-variation-status`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Censo integral de normas restrictivas (Estado + CCAA + municipal)",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + boletines auton\u00f3micos + BOP/ordenanzas + reglamentos sectoriales",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 habilita censo base versionable para restricciones sobre el cat\u00e1logo legal ya cargado (`legal_norms/legal_norm_fragments`) y lo enlaza con `liberty_restriction_assessments` (`norms_with_irlc_total=8`, `fragments_with_irlc_total=8`). Evidencia: `docs/etl/sprints/AI-OPS-118/evidence/liberty_restrictions_status_20260223T181035Z.json`, `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`. Falta cobertura integral Estado+CCAA+municipal y rutina de refresh por bolet\u00edn/versiones. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cadena de responsabilidad directa por restricci\u00f3n",
        "dominio": "Derechos",
        "fuentes_objetivo": "Congreso/Senado (votos y firmas) + BOE (promulgaci\u00f3n) + resoluciones/actos de enforcement",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 activa cadena directa auditable por `fragment_id` mediante `report_liberty_direct_accountability_scores.py` (roles directos `propose/approve/enforce`) sobre responsabilidades legales cargadas. Slice AI-OPS-136 endurece ese contrato con quality-gate de evidencia primaria directa: m\u00e9tricas `direct_edges_with_primary_evidence_total/direct_edges_with_primary_evidence_pct` y gate `direct_primary_evidence_gate` (umbrales configurables en `justfile`: `LIBERTY_DIRECT_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT`, `LIBERTY_DIRECT_ACCOUNTABILITY_MIN_PRIMARY_EVIDENCE_EDGES`). Corrida AI-OPS-136 (`20260223T211623Z`): `fragments_with_direct_chain_total=8/8`, `direct_edges_total=19`, `direct_edges_with_primary_evidence_total=19`, `direct_edges_with_primary_evidence_pct=1.0`, `gate.passed=true`; fail-path con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded`, `direct_primary_evidence_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-136/reports/liberty-direct-accountability-primary-evidence-gate.md`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_scores_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_gate_primary_evidence_fail_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_check_liberty_direct_accountability_gate_primary_evidence_fail_rc_20260223T211623Z.txt`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_test_liberty_restrictions_20260223T211623Z.txt`. Falta enlazar actos directos de voto/firma/resoluci\u00f3n con evidencia primaria multi-fuente fechada y validaci\u00f3n temporal de cargo por persona. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-report-liberty-direct-accountability-scores`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cadena de responsabilidad indirecta por restricci\u00f3n",
        "dominio": "Derechos",
        "fuentes_objetivo": "Nombramientos y estructura org\u00e1nica + reglamentos de delegaci\u00f3n + disciplina de grupo/partido + \u00f3rganos consultivos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-120 activa modelo causal de segundo orden con `liberty_indirect_methodologies/liberty_indirect_responsibility_edges` (roles `delegate/appoint/instruct/design`) y filtros expl\u00edcitos de atribuci\u00f3n (`attributable_confidence_min`, `attributable_max_causal_distance`) en `report_liberty_indirect_accountability_status.py`. Slice AI-OPS-137 endurece este lane con contrato expl\u00edcito persona/cargo + ventana temporal: `liberty_indirect_responsibility_edges` incorpora `actor_person_name`, `actor_role_title`, `appointment_start_date`, `appointment_end_date`; `validate_liberty_indirect_accountability_seed.py` exige coherencia de ventana (`appointment_end_date>=appointment_start_date`) y consistencia temporal con `evidence_date`; y `report_liberty_indirect_accountability_status.py` a\u00f1ade m\u00e9tricas `attributable_edges_with_actor_person_total`, `attributable_edges_with_valid_person_window_total`, `attributable_edges_with_valid_person_window_pct` y gate `indirect_person_window_gate` (umbrales configurables en `justfile`: `LIBERTY_INDIRECT_PERSON_WINDOW_MIN`, `LIBERTY_INDIRECT_MIN_PERSON_WINDOW_EDGES`). Corrida AI-OPS-137 (`20260223T212645Z`): `edges_total=12`, `attributable_edges_total=9`, `fragments_with_attributable_edges_total=7/8`, `attributable_edges_with_actor_person_total=9`, `attributable_edges_with_valid_person_window_total=9`, `attributable_edges_with_valid_person_window_pct=1.0`, `gate.passed=true`; fail-path contractual (`person_window_min=1.1`, `min_edges=20`) devuelve `status=degraded`, `indirect_person_window_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-137/reports/liberty-indirect-accountability-person-window-gate.md`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_import_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_status_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_rc_20260223T212645Z.txt`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_restrictions_snapshot_20260223_ai_ops_137_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/just_parl_test_liberty_restrictions_20260223T212645Z.txt`. Falta sustituir seed por cobertura multi-fuente real (nombramientos/resoluciones oficiales) y resolver identidad persona/cargo fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-indirect-accountability-status`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Evidencia y scoring de atribuci\u00f3n personal",
        "dominio": "Derechos",
        "fuentes_objetivo": "Tablas de responsabilidades + nombramientos + trazas de expediente/recurso",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 publica score auditable institucional `responsibility_score` (normalizado 0-100) con pesos por rol. Slice AI-OPS-138 abre scoring personal reproducible con `scripts/report_liberty_personal_accountability_scores.py`, combinando edges directos con `person_id` y cadena indirecta atribuible con contexto persona/cargo+ventana temporal (`actor_person_name`, `actor_role_title`, `appointment_start_date/end_date`) y fuerza probatoria expl\u00edcita (`edge_confidence * primary_evidence_factor`). Slice AI-OPS-139 endurece el contrato para eliminar sesgo por visualizaci\u00f3n (`top_n` no altera `persons_scored_total`). Slice AI-OPS-140 a\u00f1ade observabilidad/gate de resoluci\u00f3n de identidad indirecta (`indirect_identity_resolution_pct`, `indirect_identity_resolution_gate`) con muestra de no resueltos (`indirect_identity_unresolved_sample`). Slice AI-OPS-141 convierte ese backlog en cola operativa reproducible (`report_liberty_person_identity_resolution_queue.py`). Slice AI-OPS-142 cierra el loop con aplicaci\u00f3n reproducible de alias en DB (`person_name_aliases`) v\u00eda seed validado/importado. Slice AI-OPS-143 a\u00f1ade contrato expl\u00edcito de procedencia (`source_kind`, `evidence_date`, `evidence_quote`) y separa alias `manual_seed` vs `official_*` en scoring/queue. Slice AI-OPS-144 a\u00f1ade backlog accionable de migraci\u00f3n `manual -> official` (manual-upgrade queue + CSV), gate de `manual_alias_share` en la cola, y guardrail de no-downgrade de procedencia en import. Slice AI-OPS-145 endurece el guardrail para impedir retarget manual sobre alias ya `official_*` (`aliases_retarget_downgrade_prevented`) y alinea scoring personal con la cola a\u00f1adiendo m\u00e9tricas/gate de `manual_alias_share`. Slice AI-OPS-146 a\u00f1ade gate expl\u00edcito de evidencia oficial para alias `official_*` en scoring/queue (`official_alias_rows_with_evidence_total`, `official_alias_rows_missing_evidence_total`, `official_alias_evidence_coverage_pct`, `official_alias_evidence_gate`) con umbrales dedicados en `justfile`. Slice AI-OPS-147 a\u00f1ade gate expl\u00edcito de cuota oficial (`official_alias_share_pct`, `official_alias_share_gate`) para hacer exigible la migraci\u00f3n `manual_seed -> official_*` en ambas lanes. Slice AI-OPS-148 a\u00f1ade trazabilidad de `official_*` a `source_records` (`source_record_pk`) en schema/import y gate expl\u00edcito en scoring/queue (`official_alias_source_record_coverage_pct`, `official_alias_source_record_gate`). Slice AI-OPS-149 operacionaliza la remediaci\u00f3n de gaps `official_*` con colas accionables dedicadas (`official_alias_evidence_upgrade_queue_rows`, `official_alias_source_record_upgrade_queue_rows`) y checks de visibilidad de backlog (`official_alias_evidence_backlog_visible`, `official_alias_source_record_backlog_visible`) exportables a CSV desde `justfile`. Slice AI-OPS-150 cierra el loop review/apply con `scripts/export_liberty_person_identity_official_upgrade_review_queue.py` y `scripts/apply_liberty_person_identity_official_upgrade_reviews.py` (CSV de decisiones reproducible + guardrail anti-downgrade). Slice AI-OPS-151 endurece el apply con autoresoluci\u00f3n de `source_record_pk` v\u00eda lookup en `source_records` usando `--db`, m\u00e9tricas expl\u00edcitas de resoluci\u00f3n (`source_record_pk_auto_resolved`, `source_record_pk_auto_resolve_missed`) y wiring en `justfile`. Corrida AI-OPS-149 (`20260223T231638Z`): pass observabilidad (`official_alias_rows_total=0`, colas `0/0`) y fail-path contractual (`official_alias_rows_total=1`, `official_alias_rows_missing_evidence_total=1`, `official_alias_rows_missing_source_record_total=1`) con colas `1/1`, checks de visibilidad `true` y `exit=2`; suites en verde (`Ran 8`, `Ran 89`). Corrida AI-OPS-150 (`20260223T232635Z`): loop review/apply operativo con `rows_total=9`, `approved_rows=1`, `updated_rows=1`, reducci\u00f3n de cola manual `9 -> 8`, `official_alias_rows_total=1`, `official_alias_rows_missing_source_record_total=1`; suites en verde (`Ran 3`, `Ran 92`). Corrida AI-OPS-151 (`20260223T232954Z`): dry-run contractual de autoresoluci\u00f3n con lookup real (`source_record_lookup.rows_total=173070`, `source_record_pk_auto_resolved=1`, `validation.valid=true`); suites en verde (`Ran 4`, `Ran 93`). Evidencia: `docs/etl/sprints/AI-OPS-138/reports/liberty-personal-accountability-scoring-lane.md`, `docs/etl/sprints/AI-OPS-139/reports/liberty-personal-accountability-topn-contract.md`, `docs/etl/sprints/AI-OPS-140/reports/liberty-personal-identity-resolution-gate.md`, `docs/etl/sprints/AI-OPS-141/reports/liberty-person-identity-resolution-queue-lane.md`, `docs/etl/sprints/AI-OPS-142/reports/liberty-person-identity-apply-lane.md`, `docs/etl/sprints/AI-OPS-143/reports/liberty-person-identity-provenance-gate.md`, `docs/etl/sprints/AI-OPS-144/reports/liberty-person-identity-manual-upgrade-backlog-gate.md`, `docs/etl/sprints/AI-OPS-145/reports/liberty-person-identity-source-guard-personal-gate.md`, `docs/etl/sprints/AI-OPS-146/reports/liberty-person-identity-official-evidence-gate.md`, `docs/etl/sprints/AI-OPS-147/reports/liberty-person-identity-official-alias-share-gate.md`, `docs/etl/sprints/AI-OPS-148/reports/liberty-person-identity-official-source-record-gate.md`, `docs/etl/sprints/AI-OPS-149/reports/liberty-person-identity-official-gap-actionable-queues.md`, `docs/etl/sprints/AI-OPS-150/reports/liberty-person-identity-official-upgrade-review-apply-loop.md`, `docs/etl/sprints/AI-OPS-151/reports/liberty-person-identity-source-record-autoresolve.md`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_official_gap_queue_contract_summary_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_rc_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/unittest_liberty_person_identity_resolution_queue_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/just_parl_test_liberty_restrictions_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_evidence_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_source_record_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-150/evidence/liberty_person_identity_official_upgrade_review_apply_contract_summary_20260223T232635Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_apply_autoresolve_20260223T232954Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_source_record_autoresolve_contract_summary_20260223T232954Z.json`. Falta reemplazar progresivamente alias `manual_seed` por alias `official_*` (nombramientos/resoluciones/expedientes) y ampliar cobertura fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-export-liberty-person-identity-official-upgrade-review-queue && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_OFFICIAL_UPGRADE_REVIEWS_IN=<review_csv> LIBERTY_PERSON_IDENTITY_SEED_REVIEW_OUT=<seed_out_json> just parl-apply-liberty-person-identity-official-upgrade-reviews && DB_PATH=<db> LIBERTY_PERSONAL_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSONAL_INDIRECT_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-personal-accountability-gate && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSON_IDENTITY_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-person-identity-resolution-gate`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cobertura y calidad del censo de restricciones",
        "dominio": "Derechos",
        "fuentes_objetivo": "Censo normativo + metadatos de publicaci\u00f3n + control de versiones",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 public\u00f3 KPIs base y Slice AI-OPS-123 activ\u00f3 heartbeat append-only + ventana strict; Slice AI-OPS-131 a\u00f1adi\u00f3 `rights_with_data`; Slice AI-OPS-132 a\u00f1adi\u00f3 representatividad fuente/scope; Slice AI-OPS-133 a\u00f1adi\u00f3 doble cobertura (`IRLC + accountability`) por fuente/scope; Slice AI-OPS-134 a\u00f1adi\u00f3 quality-gate de evidencia primaria en accountability (`source_url + evidence_date + evidence_quote`) en status/heartbeat/window. Slice AI-OPS-135 cierra el hueco operativo del seed sancionador: `sanction_norms_seed_v1` exige y carga evidencia primaria por `responsibility_hint` (`source_url`, `evidence_date`, `evidence_quote`) en `legal_fragment_responsibilities`, se endurece el contrato default del foco (`LIBERTY_RESTRICTIONS_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT=1.0`, `LIBERTY_RESTRICTIONS_MIN_ACCOUNTABILITY_PRIMARY_EVIDENCE_EDGES=1`) y se extiende la observabilidad de estado sancionador con cobertura de evidencia primaria (`responsibility_primary_evidence_coverage_pct`). Corrida AI-OPS-135 (`20260223T210908Z`): `sanction_norms_seed_status` `ok` con `responsibilities_with_primary_evidence_total=15/15` y `responsibility_primary_evidence_coverage_pct=1.0`; `liberty_restrictions_status` `ok` con `accountability_edges_with_primary_evidence_total=15/15`, `accountability_edges_with_primary_evidence_pct=1.0`, `focus_gate.passed=true`; ventana strict pass `ok`; fail-path de foco con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded` y `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-135/reports/liberty-accountability-primary-evidence-seed-hardening.md`, `docs/etl/sprints/AI-OPS-135/evidence/sanction_norms_seed_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_focus_gate_accountability_primary_evidence_fail_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_check_liberty_focus_gate_accountability_primary_evidence_fail_rc_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_heartbeat_window_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_sanction_norms_seed_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_liberty_restrictions_20260223T210908Z.txt`. Falta cobertura real fuera de seed inicial (State+CCAA+municipal) y sustituci\u00f3n progresiva de hints por evidencia primaria multi-fuente fuera del seed. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Publicaci\u00f3n peri\u00f3dica del Atlas de Restricciones Ciudadanas",
        "dominio": "Derechos",
        "fuentes_objetivo": "Artefactos snapshot (`restrictions.json`, `irlc_by_fragment.parquet`, `accountability_edges.parquet`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-124+127 cerraron publicaci\u00f3n/distribuci\u00f3n y alias HF; AI-OPS-220 cierra la deuda residual de AI-OPS-219 con corrida strict `ok` end-to-end (`publish`, `changelog continuity`, `release heartbeat`, `release heartbeat window`) para `snapshot_date=2026-03-05`. Se a\u00f1ade contrato expl\u00edcito `--min-run-at` en `report_liberty_atlas_release_heartbeat_window.py` (wiring en `justfile` con `LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT`) para mantener hist\u00f3rico append-only y evaluar la ventana sobre el per\u00edodo activo sin relajar umbrales. Resultado AI-OPS-220: `failed_in_window=0`, `degraded_in_window=0`, `drift_alerts_in_window=0`, `hf_unavailable_in_window=0`, `strict_fail_reasons=[]`, con `entries_eligible=1` y `excluded_before_min_run_at=43`. Pruebas del cambio: `python3 -m unittest tests/test_report_liberty_atlas_release_heartbeat_window.py` (`Ran 5 tests`, `OK`). Evidencia: `docs/etl/sprints/AI-OPS-124/reports/liberty-atlas-publication-contract.md`, `docs/etl/sprints/AI-OPS-127/reports/liberty-atlas-hf-release-alias-contract.md`, `docs/etl/sprints/AI-OPS-220/reports/liberty-atlas-release-heartbeat-window-min-run-at-closure.md`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_publish_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_changelog_continuity_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_release_heartbeat_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_release_heartbeat_window_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/just_liberty_atlas_release_heartbeat_window_2026-03-05.txt`, `docs/etl/sprints/AI-OPS-220/evidence/just_parl_publish_liberty_atlas_artifacts_2026-03-05.txt`. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT=<ISO8601> just parl-export-liberty-restrictions-snapshot && DB_PATH=<db> just parl-publish-liberty-atlas-artifacts && DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> just parl-report-liberty-atlas-release-heartbeat --allow-hf-unavailable && DB_PATH=<db> LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT=<ISO8601> just parl-check-liberty-atlas-release-heartbeat-window`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate de foco: libertad ciudadana primero",
        "dominio": "Derechos",
        "fuentes_objetivo": "Tracker + roadmap t\u00e9cnico + quality gates",
        "estado": "DONE",
        "bloque": "Done now: YES. Slice AI-OPS-122 conecta el gate de foco a pol\u00edtica de bloqueo en CI con job dedicado `liberty-focus-gate-contract` en `.github/workflows/etl-tracker-gate.yml`: valida fail-path (`--enforce-gate` con umbral imposible -> `exit=2`) y exige pass-path (`--enforce-gate` con umbrales operativos) antes de merge. Slice AI-OPS-129 endurece el alcance del foco en ese mismo job con `scripts/report_liberty_focus_scope_guard.py`: cuando `focus_gate` est\u00e1 degradado, cualquier cambio fuera de `Derechos` falla en estricto (`exit=4`), manteniendo el bloqueo global de `--enforce-gate` como red de seguridad. Evidencia: `docs/etl/sprints/AI-OPS-122/reports/liberty-focus-gate-ci-policy.md`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_fail_20260223T184906Z.json`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_fail_rc_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_pass_20260223T184906Z.json`, `docs/etl/sprints/AI-OPS-122/evidence/just_parl_check_liberty_focus_gate_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-122/evidence/workflow_yaml_parse_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-129/reports/liberty-focus-scope-guard-ci-policy.md`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_fail_20260223T201430Z.json`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_fail_rc_20260223T201430Z.txt`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_pass_20260223T201430Z.json`, `docs/etl/sprints/AI-OPS-129/evidence/just_parl_check_liberty_focus_scope_20260223T201430Z.txt`. Siguiente comando: `DB_PATH=<db> just parl-check-liberty-focus-gate`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Accion ejecutiva (Consejo de Ministros)",
        "dominio": "Ejecutivo",
        "fuentes_objetivo": "La Moncloa: referencias + RSS",
        "estado": "DONE",
        "bloque": "Done now: YES. Ingesta Moncloa y mapping a `policy_events` reproducibles (`moncloa_referencias=20`, `moncloa_rss_referencias=8`, total `28`) y reconciliadas con SQL `DONE` sin waiver activa para Moncloa. Evidencia: `docs/etl/sprints/AI-OPS-07/reports/dual-entry-apply-recompute.md`, `docs/etl/sprints/AI-OPS-07/reports/boe-policy-events-mapping.md` y `docs/etl/sprints/AI-OPS-07/evidence/post_apply_waiveraware_checker_final.log`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "moncloa_referencias",
          "moncloa_rss_referencias"
        ],
        "scope": "ejecutivo",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Contratacion publica (Espana)",
        "dominio": "Dinero",
        "fuentes_objetivo": "PLACSP: sindicaci\u00f3n/ATOM (CODICE)",
        "estado": "DONE",
        "bloque": "Done now: YES. `placsp_sindicacion` recuper\u00f3 `strict-network` con red real (`run_id=249`, `run_status=ok`, `run_records_loaded=106`) y el mismatch restante era solo desfase tracker/SQL, por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-11/evidence/placsp-strict-refresh.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-status.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-gate.log`, `docs/etl/sprints/AI-OPS-11/exports/placsp_waiver_decision.csv`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "placsp_sindicacion"
        ],
        "scope": "dinero",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Contratacion detalle y documentacion de licitaciones (PLACSP)",
        "dominio": "Dinero",
        "fuentes_objetivo": "PLACSP: `url_detalle` desde `placsp_sindicacion`/`placsp_autonomico`",
        "estado": "DONE",
        "bloque": "Done now: YES. Paso 1 sigue estable sin nuevos faltantes (`backfill-placsp-contract-details` `source_records_seen=0`). Paso 2 y 2.5 completados: `backfill-money-contract-records` (`1985` contratos mapeados/actualizados) y `backfill-policy-events-money` (`1985` `policy_events` upserted en `placsp_contratacion`, todos con `source_record_pk`; totals `policy_events_by_source['placsp_contratacion']=1985`). Cierres SQL reproducibles: `placsp_contract_detail_records` `992`+`993`, `placsp_contract_detail_documents` `8144`+`8144`, `money_contract_records` `992`+`993`, `policy_events` `placsp_contratacion=1985`; evidencia en `docs/etl/sprints/AI-OPS-152/evidence/placsp_linkage_checks.log` y `docs/etl/sprints/AI-OPS-152/evidence/tracker_status_after_placsp_money_policy_events.log`.",
        "source_ids": [
          "placsp_sindicacion",
          "placsp_autonomico"
        ],
        "scope": "dinero",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Subvenciones y ayudas (Espana)",
        "dominio": "Dinero",
        "fuentes_objetivo": "BDNS/SNPSAP: API",
        "estado": "DONE",
        "bloque": "Done now: YES. `bdns_api_subvenciones` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/ultimas`) y red real (`run_id=256`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "bdns_api_subvenciones"
        ],
        "scope": "dinero",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Indicadores (outcomes): Eurostat",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Eurostat (API/SDMX)",
        "estado": "DONE",
        "bloque": "Done now: YES. `eurostat_sdmx` tiene `strict-network` exitoso (`run_records_loaded=2394`) y replay no-cero (`run_records_loaded=2`), por lo que el mismatch actual era desfase tracker/SQL y se reconcilia a `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__strict-network_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__replay_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/reports/eurostat-apply.md`, `docs/etl/sprints/AI-OPS-10/evidence/tracker-gate-postrun.log`, `docs/etl/sprints/AI-OPS-10/evidence/status-postrun.json`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [
          "eurostat_sdmx"
        ],
        "scope": "outcomes",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Indicadores (confusores): Banco de Espana",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Banco de Espana (API series)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-237 cierra la deriva de endpoint BDE: se migra el conector a `app.bde.es/bierest/resources/srdatosapp/listaSeries` y se endurece parsing para payload `fechas/valores` + `gzip`. Corrida `strict-network` real en staging: `run_id=278`, `status=ok`, `records_seen=1`, `records_loaded=1` (`bde_series_api: 1/1 registros validos`). Estructuraci\u00f3n posterior (`backfill-indicators --source-ids bde_series_api`) queda en `source_records_mapped=3`, `indicator_series_upserted=3`, `indicator_points_upserted=37`, `observation_records_upserted=37`, `indicator_series_unresolved_domain=0` (heur\u00edstica a\u00f1adida `euribor -> vivienda_urbanismo`). Evidencia: `docs/etl/sprints/AI-OPS-237/reports/bde-series-endpoint-drift-closure-20260227.md`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingest_strict_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingestion_runs_latest.txt`, `docs/etl/sprints/AI-OPS-237/evidence/backfill_indicators_bde_after_domain_fix_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/tracker_status_post_bde_fix_latest.log`, `docs/etl/sprints/AI-OPS-237/evidence/python_unittest_bde_indicator_backfill_latest.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db <db> --source bde_series_api --url 'https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma=es&series=D_1NBAF472&rango=30M' --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids bde_series_api`.",
        "source_ids": [
          "bde_series_api"
        ],
        "scope": "outcomes",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cobertura BDE multi-serie (confusores)",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Banco de Espana (BIEREST `listaSeries`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-238 cierra la cobertura multi-serie BDE con cesta can\u00f3nica validada de `58` c\u00f3digos (`strict-network` real: `run_id=281`, `run_status=ok`, `run_records_seen=58`, `run_records_loaded=58`; validado tambi\u00e9n sin `--url` usando `default_url`) y estructuraci\u00f3n completa (`indicator_series_upserted=60`, `indicator_series_with_domain_id=60`, `indicator_series_unresolved_domain=0`, `indicator_points_upserted=1804`, `observation_records_upserted=1804`). Se endurece baseline: `bde_series_api.default_url` pasa a la cesta multi58 y `min_records_loaded_strict=58`; adem\u00e1s `indicator_backfill` incorpora mapeo determinista de tipos/deuda a `impuestos_gasto_fiscalidad` con test dedicado. Evidencia: `docs/etl/sprints/AI-OPS-238/reports/bde-multi-series-coverage-closure-20260227.md`, `docs/etl/sprints/AI-OPS-238/evidence/bde_multi_series_url_58_latest.txt`, `docs/etl/sprints/AI-OPS-238/evidence/bde_series_ingest_multi58_strict_latest.json`, `docs/etl/sprints/AI-OPS-238/evidence/bde_series_ingestion_runs_multi58_latest.txt`, `docs/etl/sprints/AI-OPS-238/evidence/backfill_indicators_bde_multi58_after_domain_fix_latest.json`, `docs/etl/sprints/AI-OPS-238/evidence/tracker_status_post_bde_multi58_domain_fix_latest.log`, `docs/etl/sprints/AI-OPS-238/evidence/python_unittest_bde_indicator_backfill_multi58_latest.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db <db> --source bde_series_api --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids bde_series_api`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Indicadores (confusores): AEMET",
        "dominio": "Outcomes",
        "fuentes_objetivo": "AEMET OpenData",
        "estado": "PARTIAL",
        "bloque": "Done now: NO. Blocker: `aemet_opendata_series` en `strict-network` sigue bloqueado por contrato (`aemet_blocker=contract`, JSON invalido con payload vac\u00edo `payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, `run_id=263`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `AEMET_API_KEY=<token> python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --url https://opendata.aemet.es/opendata/api/observacion/convencional/todas --snapshot-date 2026-02-17 --strict-network --timeout 30`.",
        "source_ids": [
          "aemet_opendata_series"
        ],
        "scope": "outcomes",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Indicadores (confusores): ESIOS/REE",
        "dominio": "Outcomes",
        "fuentes_objetivo": "ESIOS/REE API (token)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. AI-OPS-296 cierra el gap de conector con `ree_esios_indicators` (config/registry + parser de payload REE `included[].attributes.values` + soporte de contenedor serializado `records` + rechazo de snapshots legacy `metric,value` + fallback sample reproducible) y lo integra en `backfill-indicators`/mapeo tracker. Corrida reproducible en DB principal desde muestra (`--from-file`) deja `status=ok`, `records_loaded=2`, `source_records_total=2`; el probe `--strict-network` al endpoint oficial sigue bloqueado de forma reproducible con `HTTP 500`, body HTML y cabecera `x-cdn: Imperva`, por lo que no aplica `DONE` en red real. Evidencia: `docs/etl/sprints/AI-OPS-296/reports/ree-esios-indicators-connector-partial-closure-20260228.md`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_ingest_status_latest.json`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_curl_headers_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/e2e_tracker_status_main_db_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_main_db_ingestion_runs_latest.txt`. Siguiente comando: `ESIOS_API_TOKEN=<token> python3 scripts/ingestar_politicos_es.py ingest --db <db> --source ree_esios_indicators --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids ree_esios_indicators`.",
        "source_ids": [
          "ree_esios_indicators"
        ],
        "scope": "outcomes",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Linkage de dominios para indicadores outcomes/confusores",
        "dominio": "Outcomes",
        "fuentes_objetivo": "`indicator_series` + `domains` (Eurostat/BDE/AEMET ya cargados)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-221 cierra el gap de clasificaci\u00f3n causal: `etl/politicos_es/indicator_backfill.py` resuelve/siembra `domains` de forma determinista cuando falta seed (`upsert_domain`), con cobertura de test dedicada (`tests/test_indicator_backfill.py`). Corrida real en `etl/data/staging/politicos-es.db`: `indicator_domains_seeded=3`, `indicator_domain_keys_seeded=[energia_medio_ambiente, proteccion_social_pensiones, vivienda_urbanismo]`, `indicator_series_with_domain_id=2400`, `indicator_series_unresolved_domain=0` y estructura trazable intacta (`indicator_points_total=37431`, `indicator_observation_records_total=37431`). Evidencia: `docs/etl/sprints/AI-OPS-221/reports/indicator-domain-linkage-closure.md`, `docs/etl/sprints/AI-OPS-221/evidence/backfill_indicators_latest.json`, `docs/etl/sprints/AI-OPS-221/evidence/unittest_indicator_backfill_20260226T2354Z.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids eurostat_sdmx bde_series_api aemet_opendata_series`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: legislacion y documentos",
        "dominio": "UE",
        "fuentes_objetivo": "EUR-Lex / Cellar (SPARQL/REST)",
        "estado": "TODO",
        "bloque": "Falta conector UE legal; linking a expedientes y textos vigentes",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: votaciones (roll-call)",
        "dominio": "UE",
        "fuentes_objetivo": "Parlamento Europeo: votes XML/PDF + Open Data Portal",
        "estado": "TODO",
        "bloque": "Falta ingesta de votos + mapeo a MEPs; KPI: % con actor resuelto",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: contratacion publica",
        "dominio": "UE",
        "fuentes_objetivo": "TED API (notices)",
        "estado": "TODO",
        "bloque": "Falta ingesta; KPI: cobertura y trazabilidad por notice",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: lobbying/influencia",
        "dominio": "UE",
        "fuentes_objetivo": "EU Transparency Register",
        "estado": "TODO",
        "bloque": "Falta ingesta y modelo de entidades; linking cuando existan meetings/agendas publicas",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Posiciones declaradas (programas)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Webs/programas de partidos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-239 cierra el contrato de red real de `programas_partidos`: corrida `strict-network` con `manifest` (`source_url` HTTP, `local_path` vac\u00edo) en staging (`run_id=283`, `status=ok`, `records_seen=3`, `records_loaded=3`) y `run_fetches.source_url` promovido a URL HTTP del documento (`http://127.0.0.1:8765/...`). Gate tracker queda sin `DONE_ZERO_REAL` (`max_net=3`, `max_any=3`, `net/fallback_fetches=2/6`). Se mantiene calidad declarada en verde tras cierre de cola (`review_pending=0`, `review_closed_pct=1.0`, `declared_positions_coverage_pct=1.6`, `topic_evidence_with_nonempty_stance_pct=1.0`, gate `passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-239/reports/programas-network-contract-closure-20260228.md`, `docs/etl/sprints/AI-OPS-239/evidence/programas_ingest_http_sample_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/programas_declared_status_post_review_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/quality_declared_programas_post_review_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/tracker_status_post_programas_network_contract_20260228.log`, `docs/etl/sprints/AI-OPS-239/evidence/unittest_parl_programas_partidos_20260228.txt`. Siguiente comando: `SNAPSHOT_DATE=<YYYY-MM-DD> PROGRAMAS_MANIFEST=<manifest.csv con source_url HTTP y local_path vac\u00edo> just parl-programas-pipeline && python3 scripts/e2e_tracker_status.py --db <db> --tracker docs/etl/e2e-scrape-load-tracker.md --fail-on-done-zero-real`.",
        "source_ids": [
          "programas_partidos"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cobertura de manifiestos (partidos/ciclos)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programas electorales estatales/auton\u00f3micos/municipales",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-240 cierra el objetivo de cobertura con `manifest` multic\u00edclo y multi-\u00e1mbito (`45` filas v\u00e1lidas, `15` partidos, `3` ciclos) sobre URLs oficiales (no replay/local) y corrida `strict-network` real en staging (`run_id=284`, `status=ok`, `records_seen=45`, `records_loaded=45`). KPI post-run: `source_records=46`, `party_proxy_count=15`, `topic_sets_touched=3`, `source_snapshot_dates=[2026-02-28]`; tracker SQL alineado (`programas_partidos: max_net=45, max_any=45, net/fallback_fetches=3/6, result=OK`). Se cerr\u00f3 la cola abierta del slice (`review_pending: 200 -> 0`, `review_ignored=204`) y el gate declarado volvi\u00f3 a `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-240/reports/programas-manifest-coverage-multicycle-closure-20260228.md`, `docs/etl/sprints/AI-OPS-240/exports/programas_manifest_multicycle_20260228.csv`, `docs/etl/sprints/AI-OPS-240/evidence/programas_manifest_validate_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/programas_manifest_party_probe_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/programas_ingestion_runs_latest_20260228.csv`, `docs/etl/sprints/AI-OPS-240/evidence/programas_declared_status_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/quality_declared_programas_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/tracker_status_post_ignore_20260228.log`. Siguiente comando: `python3 scripts/e2e_tracker_status.py --db <db> --tracker docs/etl/e2e-scrape-load-tracker.md --fail-on-mismatch --fail-on-done-zero-real`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Se\u00f1al \u00fatil en manifiestos web (anti `no_signal`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programas partidarios (homepages/subp\u00e1ginas/PDF oficiales)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-276 cierra la lane con contrato operativo estable tras la curaci\u00f3n cross-party de AI-OPS-275: guardrail ratio dedupe BNG/VOX en estricto (`status=ok`) con `support_to_unclear_unique_ratio` por documento objetivo en verde (`BNG xerais=3.0`, `BNG europeas=2.0`, `VOX web=3.6`), gate declarado en verde (`declared.gate.passed=true`), cola editorial en cero (`review_pending=0`) y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). El riesgo de leakage fiscal en `Empleo` queda controlado (`suspicious_support_rows=0` en auditor\u00eda cross-party). La deuda residual narrativa queda acotada y no duplicada en filas especializadas de `Se\u00f1al sem\u00e1ntica multiling\u00fce` y `Higiene residual`. Evidencia: `docs/etl/sprints/AI-OPS-276/reports/programas-signal-usefulness-lane-closure-20260228.md`, `docs/etl/sprints/AI-OPS-276/evidence/programas_support_unclear_unique_ratio_bng_vox_latest.json`, `docs/etl/sprints/AI-OPS-276/exports/programas_support_unclear_unique_ratio_bng_vox_latest.csv`, `docs/etl/sprints/AI-OPS-276/evidence/programas_declared_status_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/quality_declared_programas_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/programas_signal_usefulness_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/tracker_status_latest.log`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_latest.json`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG,VOX' PROGRAMAS_UNCLEAR_RATIO_MIN=1.0 just parl-check-programas-support-unclear-unique-ratio`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Parsing PDF de programas (extractor reutilizable)",
        "dominio": "Editorial",
        "fuentes_objetivo": "PDFs oficiales de manifiestos en `programas_partidos`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-242 implementa extractor PDF reutilizable en hot path de ingest (`etl/parlamentario_es/pipeline.py`) con fallback escalonado (`pypdf` -> `PyPDF2` -> `pdftotext`) y cobertura de tests. Validaci\u00f3n real con manifest PDF priorizado (`6` filas) en staging: `programa_pdf` queda materializado con `text_excerpt` legible y `text_chars` no nulos en las 6 filas (ej. FORO/Comprom\u00eds/PP/EFA/EH Bildu), eliminando dependencia de decode binario b\u00e1sico para PDFs. Evidencia: `docs/etl/sprints/AI-OPS-242/reports/programas-pdf-parser-lane-closure-20260228.md`, `docs/etl/sprints/AI-OPS-242/exports/programas_manifest_pdf_priorizado_20260228.csv`, `docs/etl/sprints/AI-OPS-242/evidence/programas_manifest_pdf_priorizado_validate_20260228.json`, `docs/etl/sprints/AI-OPS-242/evidence/programas_declared_status_pdf_priorizado_20260228.json`, `docs/etl/sprints/AI-OPS-242/evidence/unittest_declared_programas_pdf_lane_20260228.txt`. Siguiente comando: `PROGRAMAS_MANIFEST=<manifest_union_o_deeplink.csv> python3 scripts/ingestar_parlamentario_es.py ingest --db <db> --source programas_partidos --from-file <manifest_union_o_deeplink.csv> --snapshot-date <YYYY-MM-DD> --strict-network --timeout 60 && python3 scripts/report_declared_source_status.py --db <db> --source-id programas_partidos --out docs/etl/sprints/<SPRINT>/evidence/programas_declared_status_post_pdf_extract.json`.",
        "source_ids": [
          "programas_partidos"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Curaci\u00f3n de deeplinks program\u00e1ticos por partido/ciclo",
        "dominio": "Editorial",
        "fuentes_objetivo": "Manifest can\u00f3nico de URLs program\u00e1ticas (no homepages gen\u00e9ricas)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-245 cierra el DoD base (`party_proxy_count >= 10`) y AI-OPS-246 endurece cobertura residual con selecci\u00f3n `min_score=7`: `rows_updated=45/51`, `failures_total=0`, `rows_valid=51`, corrida `strict-network` real `run_id=295`, `records_seen=51`, `records_loaded=51`, estado post-ignore `party_proxy_count=15`, `review_pending=0`, gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-246/evidence/programas_deeplink_curation_report_minscore7_20260228.json`, `docs/etl/sprints/AI-OPS-246/exports/programas_manifest_deeplink_curated_minscore7_multicycle_20260228.csv`, `docs/etl/sprints/AI-OPS-246/evidence/programas_manifest_deeplink_curated_minscore7_validate_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/programas_declared_status_post_minscore7_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/quality_declared_programas_post_minscore7_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/tracker_status_post_minscore7_ignore_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual de deeplinks (calidad sem\u00e1ntica)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Partidos con `selected_reason=no_candidate_above_threshold`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-246 elimina remanente `no_candidate_above_threshold` en el resumen por partido (`15/15` en `candidate_selected`) con curaci\u00f3n reproducible `min_score=7` y cobertura real en staging. Evidencia: `docs/etl/sprints/AI-OPS-246/exports/programas_deeplink_party_summary_minscore7_20260228.csv`, `docs/etl/sprints/AI-OPS-246/reports/programas-deeplink-residual-coverage-minscore7-20260228.md`, `docs/etl/sprints/AI-OPS-246/evidence/programas_deeplink_curation_report_minscore7_20260228.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Se\u00f1al sem\u00e1ntica multiling\u00fce en programas (`ca/eu/gl`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Clasificaci\u00f3n de stance en manifiestos no castellanos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-297 cierra el residual con gate estricto reproducible sobre BNG/VOX usando dedupe sem\u00e1ntico por excerpt: `support_to_unclear_unique_ratio` por documento objetivo en verde con umbral `>=2.0` (`BNG xerais=3.0`, `BNG europeas=2.0`, `VOX web=3.6`), sin filas bajo umbral (`below_threshold_rows=[]`, `status=ok`). Adem\u00e1s, el estado declarado permanece estable y sin cola (`review_pending=0`) con `quality declared` en verde (`declared.gate.passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-297/reports/programas-multilingual-signal-and-residual-hygiene-closure-20260228.md`, `docs/etl/sprints/AI-OPS-297/evidence/programas_support_unclear_unique_ratio_latest.json`, `docs/etl/sprints/AI-OPS-297/exports/programas_support_unclear_unique_ratio_latest.csv`, `docs/etl/sprints/AI-OPS-297/evidence/programas_declared_status_latest.json`, `docs/etl/sprints/AI-OPS-297/evidence/quality_declared_programas_latest.json`. Siguiente comando: `python3 scripts/report_programas_support_unclear_unique_ratio.py --db <db> --parties BNG,VOX --min-support-unclear-unique-ratio 2.0 --out docs/etl/sprints/<SPRINT>/evidence/programas_support_unclear_unique_ratio.json --csv-out docs/etl/sprints/<SPRINT>/exports/programas_support_unclear_unique_ratio.csv --strict`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene residual de manifiestos (ruido/no-programa)",
        "dominio": "Editorial",
        "fuentes_objetivo": "URLs con listados/cookies/\u00edndices no program\u00e1ticos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-297 cierra el control de higiene residual con contrato estricto de dedupe en cola `unclear` para BNG/VOX: `raw_unclear_rows_total=32`, `unclear_unique_excerpt_rows_total=15`, `unclear_duplicate_rows_total=17`, `duplicate_share=0.53125 <= 0.60`, `status=ok`; la cola dedupe queda acotada y exportable (`deduped_queue_rows_total=15`) sin abrir review pendiente (`review_pending=0`). En paralelo se mantiene `quality declared` en verde y `tracker_status` sin regresi\u00f3n (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-297/reports/programas-multilingual-signal-and-residual-hygiene-closure-20260228.md`, `docs/etl/sprints/AI-OPS-297/evidence/programas_unclear_tail_dedupe_report_latest.json`, `docs/etl/sprints/AI-OPS-297/exports/programas_unclear_tail_deduped_queue_latest.csv`, `docs/etl/sprints/AI-OPS-297/exports/programas_unclear_tail_duplicate_profile_latest.csv`, `docs/etl/sprints/AI-OPS-297/evidence/tracker_status_latest.log`. Siguiente comando: `python3 scripts/report_programas_unclear_tail_dedupe.py --db <db> --parties BNG,VOX --max-duplicate-share 0.60 --out docs/etl/sprints/<SPRINT>/evidence/programas_unclear_tail_dedupe_report.json --queue-out docs/etl/sprints/<SPRINT>/exports/programas_unclear_tail_deduped_queue.csv --profile-out docs/etl/sprints/<SPRINT>/exports/programas_unclear_tail_duplicate_profile.csv --strict`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Recuperaci\u00f3n de cobertura partidaria tras higiene de manifiestos",
        "dominio": "Editorial",
        "fuentes_objetivo": "Partidos con evidencia `0` post-filtro (`CCa`, `EAJ-PNV`, `EH Bildu`, `IU`, `PSC`, `UPN`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-251 cierra la cola residual de cobertura con overrides dirigidos `PSC`/`UPN` sobre baseline AI-OPS-250 `v3` y corrida real `strict-network` (`run_id=302`, `records_seen=51`, `records_loaded=51`). Resultado post-ignore: `party_proxy_count 13->15` (`missing_count=0`), recuperando los \u00faltimos dos partidos en cero (`PSC`, `UPN`), con `review_pending=0` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-251/reports/programas-coverage-recovery-v4-psc-upn-20260228.md`, `docs/etl/sprints/AI-OPS-251/exports/programas_status_delta_ai_ops_250_v3_vs_ai_ops_251_v4_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/exports/programas_party_delta_ai_ops_250_v3_vs_ai_ops_251_v4_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/exports/programas_party_missing_after_recovery_v4_psc_upn_targeted_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/programas_ingestion_runs_latest_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/tracker_status_post_recovery_v4_psc_upn_targeted_post_ignore_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Discovery program\u00e1tico residual (`PSC`/`UPN`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Web oficial + sitemap + enlaces PDF/candidatos reproducibles",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-251 valida palancas reproducibles para ambos partidos y las ejecuta end-to-end en ingest real: `PSC` migra a URL program\u00e1tica expl\u00edcita (`programa-electoral-psc-montgat-2023-2027`) y `UPN` a p\u00e1gina marco de programa (`elecciones.upn.org/programa/`), cerrando cobertura residual (`party_proxy_count=15`, `missing_count=0`). Evidencia: `docs/etl/sprints/AI-OPS-251/reports/programas-coverage-recovery-v4-psc-upn-20260228.md`, `docs/etl/sprints/AI-OPS-251/exports/programas_manifest_url_changes_vs_ai_ops_250_v3_recovery_v4_psc_upn_targeted_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/programas_declared_status_post_recovery_v4_psc_upn_targeted_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad sem\u00e1ntica residual en `PSC` (tras cierre de cobertura)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evidencia `PSC` recuperada con `support=0` y `unclear=36`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-252 cierra el gap de `PSC` mediante expansi\u00f3n sem\u00e1ntica nominal en extractor declarado y recompute correcto de posiciones para `programas_partidos`. Resultado post-ignore: `PSC evidence_rows=36`, `support_rows=21`, `unclear_rows=15`; mejora neta de la lane global (`support 134->199`, `unclear 361->296`) con gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-252/reports/programas-semantic-nominal-psc-closure-20260228.md`, `docs/etl/sprints/AI-OPS-252/exports/programas_psc_url_quality_audit_post_semantic_nominal_v4_fix_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-252/exports/programas_party_evidence_breakdown_post_semantic_nominal_v4_fix_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-252/evidence/quality_declared_programas_post_semantic_nominal_v4_fix_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad sem\u00e1ntica residual (partidos con `support=0`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`BNG`, `EH Bildu`, `EQUO` + baja se\u00f1al en `PP`/`VOX`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-253 cierra la cola `support=0` para la cohorte objetivo mediante curaci\u00f3n dirigida de URLs y reingesta full-manifest reproducible: `EH Bildu 0->20`, `EQUO 0->24`, `BNG 0->1`, con `party_proxy_count=15`, `review_pending=0` y gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-253/reports/programas-residual-support0-targeted-recovery-20260228.md`, `docs/etl/sprints/AI-OPS-253/exports/programas_party_delta_ai_ops_252_vs_ai_ops_253_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-253/evidence/programas_declared_status_post_full_v5_localreplay_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-253/evidence/quality_declared_programas_post_full_v5_localreplay_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Baja relaci\u00f3n se\u00f1al/ruido residual en manifiestos",
        "dominio": "Editorial",
        "fuentes_objetivo": "`BNG`, `PP`, `VOX` con `support` bajo frente a `unclear`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-254 + AI-OPS-255 cierran la lane de baja relaci\u00f3n se\u00f1al/ruido: `BNG 1/48 -> 18/48`, `PP 3/56 -> 24/56`, `VOX 3/33 -> 12/33`; delta acumulado desde el arranque del gap: `support 244->338`, `unclear 320->226`, con `review_pending=0`, gate declarado `passed=true` y tracker enforce limpio. El residual restante pasa a curaci\u00f3n documental espec\u00edfica (fila siguiente), ya sin condici\u00f3n de \u201csupport bajo\u201d para la cohorte. Evidencia: `docs/etl/sprints/AI-OPS-254/reports/programas-low-signal-ratio-regex-upgrade-20260228.md`, `docs/etl/sprints/AI-OPS-255/reports/programas-bng-vox-residual-semantic-boost-20260228.md`, `docs/etl/sprints/AI-OPS-255/exports/programas_bng_pp_vox_delta_pre_vs_post_bng_vox_slice_20260228.csv`, `docs/etl/sprints/AI-OPS-255/evidence/programas_declared_status_post_bng_vox_slice_20260228.json`, `docs/etl/sprints/AI-OPS-255/evidence/quality_declared_programas_post_bng_vox_slice_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n documental residual de manifiestos (`BNG`/`VOX`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Ajuste de manifiestos con ratio `support/unclear` bajo por documento",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-257 abri\u00f3 mejora material, AI-OPS-266/267 endurecieron clasificaci\u00f3n y AI-OPS-268 cerr\u00f3 dedupe del tail `unclear`; AI-OPS-269 cierra el contrato documental can\u00f3nico por documento usando `support_to_unclear_unique_ratio` (sobre `unclear_unique_excerpt_rows`, no sobre duplicados multi-topic). Corrida strict en staging (`min_ratio=1.0`) en verde para los documentos objetivo: `BNG xerais 2023=5.0`, `BNG europeas 2024=1.428571`, `VOX web 2025=3.6`; guardrails de precisi\u00f3n/quality y tracker enforce siguen limpios (`mismatches=0`, `done_zero_real=0`). Fail-path contractual validado con umbral duro (`min_ratio=2.0`): `status=degraded`, `strict_fail_reasons=[ratio_below_threshold]`, `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-269/reports/programas-support-vs-unclear-unique-ratio-gate-closure-20260228.md`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_latest.json`, `docs/etl/sprints/AI-OPS-269/exports/programas_support_unclear_unique_ratio_latest.csv`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_fail_latest.json`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-269/evidence/tracker_status_post_latest.log`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG,VOX' PROGRAMAS_UNCLEAR_RATIO_MIN=1.0 just parl-check-programas-support-unclear-unique-ratio`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Dedupe operativo del tail `unclear` en manifiestos (`BNG`/`VOX`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`programas_partidos` (`topic_evidence` multi-topic con excerpt repetido)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-268 cierra el gap con contrato reproducible de dedupe (`source_url + excerpt_norm`) v\u00eda `scripts/report_programas_unclear_tail_dedupe.py`, pruebas dedicadas (`tests/test_report_programas_unclear_tail_dedupe.py`) y recetas `just` (`parl-report-programas-unclear-tail-dedupe`, `parl-check-programas-unclear-tail-dedupe`). Corrida strict en staging (`max_duplicate_share=1.0`) en verde: `raw_unclear_rows_total=31`, `unclear_unique_excerpt_rows_total=14`, `unclear_duplicate_rows_total=17`, `duplicate_share=0.548387`, cola dedupe `14` filas. Perfil por fuente confirma inflaci\u00f3n previa (`VOX web: 15/5/10`, `BNG europeas: 14/7/7`). Fail-path contractual validado con umbral duro (`max_duplicate_share=0.5`): `status=degraded`, `strict_fail_reasons=[duplicate_share_above_threshold]`, `rc=4`. Tracker enforce post-slice limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-268/reports/programas-unclear-tail-dedupe-contract-closure-20260228.md`, `docs/etl/sprints/AI-OPS-268/evidence/programas_unclear_tail_dedupe_report_latest.json`, `docs/etl/sprints/AI-OPS-268/evidence/programas_unclear_tail_dedupe_delta_latest.json`, `docs/etl/sprints/AI-OPS-268/exports/programas_unclear_tail_deduped_queue_latest.csv`, `docs/etl/sprints/AI-OPS-268/exports/programas_unclear_tail_duplicate_profile_latest.csv`, `docs/etl/sprints/AI-OPS-268/evidence/programas_unclear_tail_dedupe_report_fail_latest.json`, `docs/etl/sprints/AI-OPS-268/evidence/programas_unclear_tail_dedupe_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-268/evidence/tracker_status_post_latest.log`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_UNCLEAR_TAIL_PARTIES='BNG,VOX' PROGRAMAS_UNCLEAR_TAIL_MAX_DUPLICATE_SHARE=1.0 just parl-check-programas-unclear-tail-dedupe`.",
        "source_ids": [
          "programas_partidos"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Refinamiento ratio dedupe en `BNG europeas 2024`",
        "dominio": "Editorial",
        "fuentes_objetivo": "`programas_partidos` (`24_bng_programa_europeas_2.pdf`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-270 cierra el objetivo con dedupe `near-duplicate` reproducible en `scripts/report_programas_support_unclear_unique_ratio.py` (Jaccard/containment + guard por n-grama), conservando contrato strict y fail-path exact-only. Resultado real en staging (`PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG'`, `MIN=2.0`): `BNG europeas 2024` pasa de `support_to_unclear_unique_ratio=1.428571` (`unclear_unique=7`) a `2.0` (`unclear_unique=5`, `collapsed=2`) sin degradar gates declared (`declared.gate.passed=true`, `review_pending=0`) ni tracker (`mismatches=0`, `done_zero_real=0`). Guardrail de precisi\u00f3n en muestra revisada vigente: `precision_by_required_party={BNG:0.8571, VOX:1.0, FORO:1.0, PP:1.0}` (`min_party_precision=0.85`, `reviewed_total=28`). Evidencia: `docs/etl/sprints/AI-OPS-270/reports/programas-bng-europeas-near-duplicate-ratio-closure-20260228.md`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_latest.json`, `docs/etl/sprints/AI-OPS-270/exports/programas_support_unclear_unique_ratio_bng_latest.csv`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_exact_fail_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_exact_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_delta_vs_ai_ops_269_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/tracker_status_post_latest.log`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_precision_audit_latest.json`.",
        "source_ids": [
          "programas_partidos"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cierre de etiquetado pendiente en muestra de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Rotaci\u00f3n de labels AI-OPS-270 (`support` sample fresco)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-271 cierra el gap de etiquetado manual con paquete expl\u00edcito de `12` filas (`programas_support_precision_manual_labels_fill_20260228.csv`) y recompone la muestra etiquetada v\u00eda `rotate_programas_precision_labels.py` en modo estricto (`max_unlabeled=0`). Resultado: `sample_total=40`, `carried_forward_rows=40`, `unlabeled_rows=0`, `label_conflicts_total=0`, `status=ok`. Auditor\u00eda strict full-review (`min_reviewed=40`) tambi\u00e9n en verde: `reviewed_total=40`, `precision=0.975` (`39 TP / 1 FP`), `precision_by_required_party={BNG:0.9, VOX:1.0, FORO Asturias:1.0, PP:1.0}`, `required_parties_min_precision=true`. Guardrails de pipeline contin\u00faan limpios (`declared.gate.passed=true`, `review_pending=0`; tracker `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-271/reports/programas-precision-manual-label-fill-closure-20260228.md`, `docs/etl/sprints/AI-OPS-271/exports/programas_support_precision_manual_labels_fill_20260228.csv`, `docs/etl/sprints/AI-OPS-271/exports/programas_support_precision_sample_labeled_latest.csv`, `docs/etl/sprints/AI-OPS-271/evidence/programas_support_precision_rotate_summary_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/programas_support_precision_audit_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Endurecimiento preventivo de rotaci\u00f3n de labels (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`just` guardrail (`parl-programas-precision-guardrail-rotated`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-272 cierra el gap preventivo introduciendo contract path estricto en `justfile`: nueva recipe `parl-check-programas-support-precision-labels-rotation-strict` con `PROGRAMAS_PRECISION_ROTATE_STRICT_MAX_UNLABELED=0` y actualizaci\u00f3n de `parl-programas-precision-guardrail-rotated` para invocar siempre ese check estricto. Validaci\u00f3n reproducible: pass-path sobre muestra 40/40 (`unlabeled_rows=0`, `status=ok`) y fail-path contractual sobre estado pre-cierre AI-OPS-270 (`unlabeled_rows=12`, `strict_fail_reasons=[max_unlabeled_exceeded]`, `rc=4`). Auditor\u00eda full-review del pass artifact queda en verde (`reviewed_total=40`, `precision=0.975`, floor por partido `BNG=0.9`, `VOX/FORO/PP=1.0`), con gate declared y tracker sin regresi\u00f3n (`declared.gate.passed=true`, `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-272/reports/programas-rotation-strict-contract-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_pass_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_fail_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/just_dry_run_parl_programas_precision_guardrail_rotated_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/guardrail_rotated_strict_call_check_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_audit_fullreview_pass_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n del falso positivo residual en guardrail de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Muestra 40/40 (`evidence_id=1560538`, BNG)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-273 cierra el residual con hardening sem\u00e1ntico en `declared_stance` (bloqueador espec\u00edfico para el fragmento OCR `deben tributar aqui polo imposto de sociedades`) y aplicaci\u00f3n reproducible en DB real mediante `backfill-declared-stance --reconcile-no-signal`. Resultado del caso objetivo: `evidence_id=1560538` queda en `stance=unclear` (ya no `support`). La muestra fresca post-fix se recompone a `40/40` etiquetada (fill expl\u00edcito de la nueva fila `1560338`) y la auditor\u00eda strict full-review queda en verde con `false_positive=0`, `precision=1.0` y floor por partido `BNG/VOX/FORO/PP=1.0`. Guardrails sin regresi\u00f3n: `declared.gate.passed=true`, ratio BNG sigue cerrado (`BNG xerais=3.0`, `BNG europeas=2.0`), tracker `mismatches=0`, `done_zero_real=0`. Evidencia: `docs/etl/sprints/AI-OPS-273/reports/programas-residual-false-positive-1560538-closure-20260228.md`, `docs/etl/sprints/AI-OPS-273/exports/programas_fp_1560538_post_fix_latest.csv`, `docs/etl/sprints/AI-OPS-273/evidence/programas_backfill_declared_stance_reconcile_residual_fp_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_support_precision_audit_post_fix_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_residual_fp_1560538_delta_vs_ai_ops_272_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_support_unclear_unique_ratio_bng_post_residual_fp_fix_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/quality_declared_programas_post_fix_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Auditor\u00eda preventiva de snippets fiscales en `Empleo` (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Cohorte BNG `topic_key=concern:v1:empleo` con l\u00e9xico fiscal",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-274 cierra la auditor\u00eda preventiva con contrato reproducible (`scripts/report_programas_empleo_fiscal_snippets_audit.py` + lanes `just parl-report/check-programas-empleo-fiscal-snippets-audit` + test dedicado `tests/test_report_programas_empleo_fiscal_snippets_audit.py`). Corrida strict en staging para BNG (`PROGRAMAS_EMPLEO_FISCAL_AUDIT_PARTIES='BNG'`) en verde: `rows_total=2`, `support_rows=1`, `unclear_rows=1`, `suspicious_support_rows=0`, `status=ok`. Se confirma que el `support` residual (`1560338`) mantiene ancla laboral (`traballo`) y no abre nuevo patr\u00f3n de `false_positive` en la cohorte objetivo. Evidencia: `docs/etl/sprints/AI-OPS-274/reports/programas-empleo-fiscal-snippets-audit-closure-20260228.md`, `docs/etl/sprints/AI-OPS-274/evidence/programas_empleo_fiscal_snippets_audit_bng_latest.json`, `docs/etl/sprints/AI-OPS-274/exports/programas_empleo_fiscal_snippets_audit_bng_latest.csv`, `docs/etl/sprints/AI-OPS-274/evidence/just_parl_check_programas_empleo_fiscal_snippets_audit_bng_latest.txt`, `docs/etl/sprints/AI-OPS-274/evidence/unittest_programas_empleo_fiscal_snippets_audit_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n transversal de snippets fiscales en `Empleo` (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Cohorte multi-partido fiscal (`BNG,CCa,Compromis,EAJ-PNV,VOX`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-275 cierra el gap cross-party con hardening topic-aware en `declared_stance`: para `programas_partidos` y `topic_key='concern:v1:empleo'`, la inferencia `programa_policy_proposal` solo se conserva si el excerpt contiene ancla laboral (`empleo/ocupacion/trabajo/...`). Se a\u00f1adi\u00f3 cobertura de regresi\u00f3n en `tests/test_parl_declared_stance.py` (caso negativo sin ancla + caso positivo con ancla). Recompute en staging (`backfill-declared-stance --reconcile-no-signal` + posiciones declaradas/combinadas) y auditor\u00eda strict en verde: `status=ok`, `suspicious_support_rows=0/13` (delta vs AI-OPS-274: `4 -> 0`), con `Compromis` en `Empleo` pasando de `support=4` a `unclear=4` para los snippets de `fiscalitat verda` sin ancla laboral. Gate declarado y tracker siguen limpios (`declared.gate.passed=true`, `review_pending=0`, `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-275/reports/programas-empleo-fiscal-cross-party-curation-closure-20260228.md`, `docs/etl/sprints/AI-OPS-275/evidence/programas_backfill_declared_stance_reconcile_empleo_fiscal_cross_party_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_delta_vs_ai_ops_274_latest.json`, `docs/etl/sprints/AI-OPS-275/exports/programas_empleo_fiscal_compromis_candidates_post_fix_latest.csv`, `docs/etl/sprints/AI-OPS-275/evidence/quality_declared_programas_post_empleo_fiscal_cross_party_fix_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/tracker_status_post_latest.log`, `docs/etl/sprints/AI-OPS-275/evidence/unittest_parl_declared_stance_empleo_anchor_fix_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual FORO Asturias post-higiene",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programa FORO 2023-2027 (`Programa-electoral-FORO-Asturias-20232027.pdf`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-257 cierra el gap abierto en AI-OPS-256 mediante ampliaci\u00f3n sem\u00e1ntica fallback y recompute completo en staging: `FORO Asturias 33/48 -> 45/48` (`+12 support`, `unclear 15->3`, `support_ratio 0.6875 -> 0.9375`), con `review_pending=0`, gate declarado `passed=true` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-257/reports/programas-fallback-semantic-expansion-foro-bng-20260228.md`, `docs/etl/sprints/AI-OPS-257/exports/programas_party_evidence_delta_pre_vs_post_semantic_patch_20260228.csv`, `docs/etl/sprints/AI-OPS-257/exports/programas_bng_vox_foro_url_delta_pre_vs_post_semantic_patch_20260228.csv`, `docs/etl/sprints/AI-OPS-257/evidence/programas_declared_status_post_semantic_patch_20260228.json`, `docs/etl/sprints/AI-OPS-257/evidence/tracker_status_post_semantic_patch_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Auditor\u00eda de precisi\u00f3n tras expansi\u00f3n sem\u00e1ntica (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Muestreo manual de nuevos `support` (AI-OPS-257) en `BNG/VOX/FORO/PP`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-258 ejecuta auditor\u00eda estratificada manual (`36` filas; `35` verdaderos positivos, precisi\u00f3n `0.9722 >= 0.90`) y cierra los falsos positivos TOC detectados en VOX con hardening + reconciliaci\u00f3n (`--reconcile-no-signal`). Se a\u00f1ade modo expl\u00edcito de ETL para degradar stances auto-asignados sin se\u00f1al vigente y se recalculan posiciones declaradas/combinadas. Estado final en staging: `support 392->390`, `unclear 172->174`, `review_pending=0`, gate declarado `passed=true`, tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-258/reports/programas-support-precision-audit-and-reconcile-20260228.md`, `docs/etl/sprints/AI-OPS-258/evidence/programas_support_precision_audit_summary_20260228.json`, `docs/etl/sprints/AI-OPS-258/evidence/programas_declared_status_post_precision_reconcile_20260228.json`, `docs/etl/sprints/AI-OPS-258/evidence/quality_declared_programas_post_precision_reconcile_20260228.json`, `docs/etl/sprints/AI-OPS-258/exports/programas_vox_toc_false_positive_candidates_post_reconcile_20260228.csv`, `docs/etl/sprints/AI-OPS-258/evidence/tracker_status_post_precision_reconcile_enforce_20260228.log`, `docs/etl/sprints/AI-OPS-258/evidence/unittest_parl_declared_stance_precision_reconcile_20260228.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate continuo de precisi\u00f3n + reconciliaci\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Automatizar guardrail tras cambios regex (`sample+threshold+reconcile`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-259 implementa lane reproducible end-to-end con scripts dedicados (`export_programas_support_precision_sample.py`, `report_programas_support_precision_audit.py`) y recetas `just` (`parl-export-programas-support-precision-sample`, `parl-check-programas-support-precision-audit`, `parl-programas-precision-guardrail`). Corrida real en staging: muestra fresca `40` filas (`10` por partido objetivo), gate de precisi\u00f3n etiquetada `status=ok` (`36/36` revisadas, `precision=0.9722 >= 0.90`), reconciliaci\u00f3n idempotente (`updated=0`, `reconciled_no_signal=0`), estado final estable (`support=390`, `unclear=174`, `review_pending=0`), quality declared `passed=true` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-259/reports/programas-precision-guardrail-automation-20260228.md`, `docs/etl/sprints/AI-OPS-259/evidence/programas_support_precision_audit_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_support_precision_sample_summary_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_backfill_declared_stance_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_declared_status_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_quality_declared_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/tracker_status_programas_guardrail_latest.log`, `docs/etl/sprints/AI-OPS-259/evidence/unittest_programas_precision_guardrail_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Rotaci\u00f3n peri\u00f3dica de muestra etiquetada (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Etiquetado humano de la muestra fresca del guardrail (`AI-OPS-259`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-260 cierra el loop editorial peri\u00f3dico con pipeline reproducible de rotaci\u00f3n/arrastre de etiquetas por `evidence_id` (`rotate_programas_precision_labels.py`) y lane operativo `parl-programas-precision-guardrail-rotated` (export sample -> rotate strict -> audit strict -> reconcile/recompute -> quality/tracker enforce). Corrida real en staging: muestra fresca `40` filas, rotaci\u00f3n `carried_forward=40`, `unlabeled=0`, `label_conflicts=0`; auditor\u00eda estricta del sample rotado `reviewed=40`, `precision=0.90` (`36 TP / 4 FP`, umbral `>=0.90`), `required_parties_covered=true`; estado declarado post-guardrail estable (`support=390`, `unclear=174`, `review_pending=0`) y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-260/reports/programas-precision-label-rotation-loop-closure-20260228.md`, `docs/etl/sprints/AI-OPS-260/evidence/programas_support_precision_rotate_summary_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_support_precision_audit_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_declared_status_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_quality_declared_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/tracker_status_programas_guardrail_rotated_20260228.log`, `docs/etl/sprints/AI-OPS-260/evidence/unittest_programas_precision_rotation_20260228.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Precision m\u00ednima por partido en guardrail `programas_partidos`",
        "dominio": "Editorial",
        "fuentes_objetivo": "Enforce de floor por partido (no solo precisi\u00f3n global)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-261 endurece el contrato del guardrail con floor expl\u00edcito por partido (`PROGRAMAS_PRECISION_MIN_PARTY`, default `0.85`) en `report_programas_support_precision_audit.py`/`justfile`, y cierra la curaci\u00f3n dirigida de FPs (`1560538`, `1560545`, `1561270`, `1561275`) mediante hardening de `declared_stance` para contexto hist\u00f3rico/narrativo. Corrida E2E en staging (`SNAPSHOT_DATE=2026-02-28`) con `parl-programas-precision-guardrail-rotated`: muestra rotada `40/40` etiquetada (`10` por partido), audit estricto `precision=1.0` y `precision_by_required_party={BNG:1.0, VOX:1.0, FORO:1.0, PP:1.0}` con `required_parties_min_precision=true`; estado declarado final `support=386`, `unclear=178`, `review_pending=0`, quality gate `passed=true`, tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-261/reports/programas-party-floor-precision-guardrail-closure-20260228.md`, `docs/etl/sprints/AI-OPS-261/evidence/programas_support_precision_audit_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/exports/programas_support_precision_audit_guardrail_breakdown_latest.csv`, `docs/etl/sprints/AI-OPS-261/evidence/programas_declared_status_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/evidence/programas_quality_declared_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/evidence/tracker_status_programas_guardrail_latest.log`, `docs/etl/sprints/AI-OPS-261/exports/programas_precision_party_floor_false_positive_candidates_latest.csv`. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> PROGRAMAS_PRECISION_MIN_PARTY=0.85 just parl-programas-precision-guardrail-rotated`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dedupe de muestra de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evitar duplicados de excerpt/source en auditor\u00eda estratificada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-262 implementa dedupe reproducible por partido en `export_programas_support_precision_sample.py` (`--dedupe-key`: `none",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Aumento de diversidad VOX en muestra dedupe (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Subir `unique_by_party` de VOX en sample dedupe (target `>=10`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-264 cierra la lane sin tocar stances del ETL, incorporando windowing determinista de excerpt en `export_programas_support_precision_sample.py` (`--excerpt-window-words/--excerpt-window-stride/--excerpt-window-min-words`) y wiring en `justfile`. En staging, baseline sin windowing manten\u00eda `VOX=5`; con configuraci\u00f3n reproducible `window_words=40`, `stride=12`, `min_words=12` el check estricto pasa con `unique_by_party={BNG:10, VOX:10, FORO Asturias:10, PP:10}`, `parties_below_min_unique=[]`, `status=ok`, `strict rc=0`. Evidencia: `docs/etl/sprints/AI-OPS-264/reports/programas-precision-sample-windowed-diversity-closure-20260228.md`, `docs/etl/sprints/AI-OPS-264/evidence/programas_support_precision_sample_window40_stride12_summary_latest.json`, `docs/etl/sprints/AI-OPS-264/evidence/programas_support_precision_sample_window40_stride12_just_summary_latest.json`, `docs/etl/sprints/AI-OPS-264/exports/programas_support_precision_sample_window40_stride12_latest.csv`, `docs/etl/sprints/AI-OPS-264/evidence/unittest_programas_precision_sample_windowing_20260228.txt`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_PRECISION_SAMPLE_DEDUPE_KEY=excerpt_norm+source_url PROGRAMAS_PRECISION_SAMPLE_MIN_UNIQUE_PER_PARTY=10 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_WORDS=40 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_STRIDE=12 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_MIN_WORDS=12 just parl-check-programas-support-precision-sample`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Contrato de diversidad efectiva por disponibilidad (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evitar fail falso del guardrail cuando `min_unique_per_party` supera el pool real",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-263 endurece `export_programas_support_precision_sample.py` con contrato cap-aware por partido: se a\u00f1ade `available_unique_by_party`, `effective_min_unique_per_party_by_party=min(min_unique, available_unique)` y check estricto `min_unique_per_party_effective_met`, junto con trazas expl\u00edcitas (`parties_capped_by_available_unique`, `parties_below_effective_min_unique`). Corrida real en staging con `dedupe_key=excerpt_norm+source_url`, `min_unique_per_party=10`: `status=ok`, `strict rc=0`, `VOX` marcado como cap (`available=5`, `effective_min=5`) sin ocultar que el umbral nominal no se cumple (`min_unique_per_party_met=false`). Lane `just parl-check-programas-support-precision-sample` tambi\u00e9n queda en verde con el mismo contrato. Evidencia: `docs/etl/sprints/AI-OPS-263/reports/programas-precision-sample-effective-diversity-cap-20260228.md`, `docs/etl/sprints/AI-OPS-263/evidence/programas_support_precision_sample_dedup_min10_cap_summary_latest.json`, `docs/etl/sprints/AI-OPS-263/evidence/programas_support_precision_sample_dedup_min10_cap_just_summary_latest.json`, `docs/etl/sprints/AI-OPS-263/evidence/unittest_programas_precision_sample_cap_20260228.txt`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_PRECISION_SAMPLE_DEDUPE_KEY=excerpt_norm+source_url PROGRAMAS_PRECISION_SAMPLE_MIN_UNIQUE_PER_PARTY=10 just parl-check-programas-support-precision-sample`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Re-cierre de cola review `no_signal` en `programas_partidos` (post-replay)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`topic_evidence_reviews` pendientes tras recomputes locales de manifiestos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-265 cierra la cola residual `no_signal` de `programas_partidos` con aplicaci\u00f3n en bloque reproducible v\u00eda `review-decision --status ignored`: baseline `review_pending=64` (`pending_by_reason.no_signal=64`) -> post-cierre `review_pending=0`, `review_ignored=300`, manteniendo trazabilidad (`review_total=303`) y gate declarado en verde (`quality-report --include-declared --enforce-gate`: `passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-265/reports/programas-review-queue-no-signal-reclosure-20260228.md`, `docs/etl/sprints/AI-OPS-265/evidence/programas_review_queue_apply_ignore_no_signal_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_review_queue_no_signal_closure_delta_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_declared_status_post_review_queue_close_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_quality_declared_post_review_queue_close_latest.json`. Siguiente comando: `python3 scripts/ingestar_parlamentario_es.py review-queue --db <db> --source-id programas_partidos --status pending --review-reason no_signal --limit 200 --offset 0`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Taxonomia de temas (alto impacto por scope)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Definicion de temas + stake scoring por institucion/territorio/mandato",
        "estado": "DONE",
        "bloque": "Seed/versionado: `etl/data/seeds/topic_taxonomy_es.json`. Build: `python3 scripts/ingestar_parlamentario_es.py backfill-topic-analytics --db <db> --as-of-date <YYYY-MM-DD> --taxonomy-seed etl/data/seeds/topic_taxonomy_es.json`",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Evidencia textual (para posiciones declaradas)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Diarios de sesiones, intervenciones, preguntas, notas oficiales",
        "estado": "DONE",
        "bloque": "Modelo can\u00f3nico: `text_documents` (metadata + excerpt) enlazado por `source_record_pk` de `topic_evidence`. Backfill: `python3 scripts/ingestar_parlamentario_es.py backfill-text-documents --db <db> --source-id congreso_intervenciones --only-missing` (o `just parl-backfill-text-documents`). Adem\u00e1s, copia un snippet a `topic_evidence.excerpt` para que `/explorer-temas` sea auditable sin joins. Nota: stance classification sigue siendo otro paso (ver filas de \u201cIntervenciones\u201d/\u201cPosiciones\u201d).",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Textos de iniciativas (qu\u00e9 se vot\u00f3)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "BOCG + Diario de Sesiones (v\u00eda links en iniciativas Congreso/Senado)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. AI-OPS-380 consolid\u00f3 avance global fuera de `linked_to_votes` con dos pasadas `status=403` (`downloaded_doc_links +5`, `missing_doc_links_actionable -5`), AI-OPS-381/382 cerraron iteraciones sin delta neta, AI-OPS-383/384 drenaron/cerraron `unknown` (`downloaded_doc_links +114`, `missing_doc_links_actionable -114`, `unknown_status_urls 114->0`), AI-OPS-385/386 cerraron lanes globales `status=403/500` como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-387 convirti\u00f3 `status=404` (`+42/-42`), AI-OPS-389 reactiv\u00f3 conversi\u00f3n por cohortes WAF (`+25/-25`), AI-OPS-390 cerr\u00f3 `status=500 + zero-doc` sin candidates, AI-OPS-391/392/393 mantuvieron conversi\u00f3n iterativa en lane `status=500` general (`+38/-38`, `+31/-31`, `+16/-16`), AI-OPS-394 confirm\u00f3 no-conversi\u00f3n en lane `status=404` general, AI-OPS-395/396 cerraron lanes `status=403/404 + zero-doc` sin delta, AI-OPS-397 convirti\u00f3 `status=429 + zero-doc` (`+12/-12`), AI-OPS-398 dren\u00f3 la lane `status=429` general (`+60/-60`), AI-OPS-399 dren\u00f3 la lane `status=599` general (`+8/-8`), AI-OPS-400 ejecut\u00f3 lane `status=500` timeboxed sin delta neta (`rc=124`, `packet20`), AI-OPS-401 cerr\u00f3 `status=403` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-402 cerr\u00f3 `status=500` timeboxed como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-403 cerr\u00f3 `status=404` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-404 cerr\u00f3 `status=403` multi-URL como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-405 cerr\u00f3 `status=500` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-406 cerr\u00f3 `status=404` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda) y AI-OPS-407 cerr\u00f3 micro-packet `status=403` sin delta neta de cobertura (`rc=0`, `candidate_urls=10`, `fetched_ok=0`) con reclasificaci\u00f3n interna `status403->status404` (`-10/+10`). Estado actual (`etl/data/staging/politicos-es.db`, `2026-03-02`): `total_doc_links=9553`, `downloaded_doc_links=5946`, `missing_doc_links=3607`, `missing_doc_links_actionable=3416`, `doc_links_missing_fetch_status=0`, cobertura linkeada a voto `751/751` (`100%`). Congreso se mantiene cerrado (`812/812`) y el residual global sigue concentrado en Senado no linkeado (`3607/8741` faltantes; `downloaded_doc_links_pct=62.24%`, buckets accionables dominantes `status403=1475`, `status500=1345`, `status404=596`, `status200=0`, `status429=0`, `status599=0`, `unknown=0`). Evidencia: `docs/etl/sprints/AI-OPS-407/reports/senado-status403-general-micro-packet10-timebox-20260302.md`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_conversion_delta_ai_ops_407_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/quality_initiatives_after_pass1_20260302T015128Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-status 500 --max-urls-per-initiative 3 --limit 120 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv && sed -n \"1,11p\" docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv > docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv && timeout 180 python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --include-unlinked --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404,429,500 --archive-timeout 3 --retry-http-statuses 500 --refetch-existing --timeout 8 --snapshot-date 2026-03-02`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad local de docs descargados (iniciativas)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`text_documents` + `document_fetches` para links ya descargados",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-227 cierra deuda local en Congreso sin red: `backfill_initiative_doc_excerpts` (`seen=729`, `updated=729`) y `backfill_initiative_doc_fetch_status` (`candidate_refs_total=205`, `missing_fetch_status 205 -> 0`). KPI global post-slice: `downloaded_doc_links_with_excerpt 4205/4205`, `excerpt_coverage_pct=1.0`, `doc_links_with_fetch_status 8717/8717`, `fetch_status_coverage_pct=1.0`. Evidencia: `docs/etl/sprints/AI-OPS-227/evidence/initdoc_excerpts_congreso_backfill_latest.json`, `docs/etl/sprints/AI-OPS-227/evidence/initdoc_fetch_status_congreso_backfill_latest.json`, `docs/etl/sprints/AI-OPS-227/evidence/quality_initiatives_delta_pre_vs_post_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cola accionable de documentos Senado (qu\u00e9 se vot\u00f3)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "Senado `global_enmiendas_vetos` + detalle `tipoFich=3` + fallback hist\u00f3rico",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-378+379 cierran la cola `linked_to_votes`: primero se drena `status=403` (`27->0`) y luego `status=404` (`22->0`), dejando `missing_urls=0`, `blocked_403_urls=0`, `unknown_status_urls=0`, `zero_doc_initiatives=0`. En AI-OPS-379 el replay final `status=404` sobre packet efectivo (`candidate_urls=22`) convierte `fetched_ok=22` sin fallos y cierra los buckets residuales (`status403=0`, `status404=0`). Evidencia: `docs/etl/sprints/AI-OPS-378/reports/senado-status403-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_conversion_delta_ai_ops_378_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-379/reports/senado-status404-packet50-effective-sixth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_conversion_delta_ai_ops_379_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_waf_block_profile_after_20260301T141409Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Alineaci\u00f3n de KPI cola Senado (scope operativo vs gate)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`quality-report` iniciativas vs export de cola accionable",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-229 implementa contrato expl\u00edcito de scope con `--initiative-actionable-scope {global,linked_to_votes}` en `quality-report`, KPIs duales (`*_linked_to_votes`) y gate configurable por m\u00e9trica activa (`actionable_metric`). Resultado reproducible en staging: scope global mantiene `missing_doc_links_actionable=4456` (`closed_pct=0.4897`) y scope `linked_to_votes` alinea con cola operativa en `missing_doc_links_actionable_selected=680` (`closed_pct_selected=0.6726`), consistente con export `680` URLs (`345` iniciativas). Evidencia: `docs/etl/sprints/AI-OPS-229/reports/initiative-quality-actionable-scope-alignment-20260227.md`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_compare_latest.json`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_global_latest.json`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_linked_latest.json`, `docs/etl/sprints/AI-OPS-229/exports/senado_missing_actionable_linked_latest.csv`. Siguiente comando: `INITIATIVE_QUALITY_ACTIONABLE_SCOPE=linked_to_votes DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> just parl-quality-report-initiatives-enforce`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual de extracci\u00f3n sem\u00e1ntica (Congreso)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`parl_initiative_doc_extractions` (`needs_review=1`)",
        "estado": "DONE",
        "bloque": "Done now: YES. Cierre ejecutado en AI-OPS-226: export de cola residual (`rows=2`) + apply reproducible con `apply_initdoc_extraction_reviews.py` (`updated=2`) y verificaci\u00f3n post-apply (`rows=0`). KPI final: `extraction_needs_review_doc_links=0`, `extraction_review_closed_pct=1.0` (overall y `congreso_iniciativas`), manteniendo el \u00fanico bloqueo de gate en la cola accionable de Senado. Evidencia: `docs/etl/sprints/AI-OPS-226/evidence/initdoc_extraction_review_residual_apply_latest.json`, `docs/etl/sprints/AI-OPS-226/evidence/quality_initiatives_after_congreso_review_closure_latest.json`, `docs/etl/sprints/AI-OPS-226/exports/initdoc_extraction_review_queue_residual_post_apply_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene sem\u00e1ntica de extracci\u00f3n (Senado)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`parl_initiative_doc_extractions` (`extracted_subject` con ruido HTML/JS y navegaci\u00f3n)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-319 endurece `scripts/backfill_initiative_doc_extractions.py` para descartar candidatos ruidosos (`!function(`, branding+pipe, fragmentos JS) y AI-OPS-320 ampl\u00eda el filtro a ruido de navegaci\u00f3n Senado (`Ir al Contenido`, `Preguntas frecuentes`, `Diccionario parlamentario`, `S\u00edguenos`, etc.), con fallback por t\u00edtulo fuerte. Reproceso completo sobre `senado_iniciativas` (`seen=3538`, `upserted=3538`) mantiene estabilidad de cobertura (`downloaded_missing_extraction=0`, `extraction_needs_review=0`) y cierra ruido residual observado en AI-OPS-320 (`44 -> 0`). Evidencia: `docs/etl/sprints/AI-OPS-319/reports/senado-semantic-extraction-noise-cleaning-20260228.md`, `docs/etl/sprints/AI-OPS-320/reports/senado-status403-enmiendas-retry-and-semantic-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-320/evidence/initiative_doc_extractions_semantic_hardening_senado_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/senado_extraction_nav_noise_post_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/senado_extraction_nav_noise_delta_ai_ops_320_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/unittest_backfill_initiative_doc_extractions_20260228T230355Z.txt`. Siguiente comando: `python3 scripts/backfill_initiative_doc_extractions.py --db <db> --initiative-source-ids congreso_iniciativas,senado_iniciativas --only-missing --out docs/etl/sprints/<SPRINT>/evidence/initiative_doc_extractions_only_missing.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Runtime Playwright para descarga Senado (palanca browser)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Playwright Python driver + perfil persistente (`--playwright-user-data-dir`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-230+231 cierran la deuda de runtime local: fallback autom\u00e1tico de Node para Playwright (`PLAYWRIGHT_NODEJS_PATH`) + warmup `best-effort` no bloqueante en `_PlaywrightFetcher.get_bytes`. Validaci\u00f3n real (`limit-initiatives=25`, `max-docs-per-initiative=1`) mantiene `playwright_init_error=null` y `playwright_runtime.fallback_applied=true`; el fallo residual queda en red remota (`HTTP 403` en fetch objetivo), no en bootstrap/init local. Evidencia: `docs/etl/sprints/AI-OPS-230/reports/playwright-runtime-node-fallback-senado-20260227.md`, `docs/etl/sprints/AI-OPS-231/reports/senado-playwright-warmup-softfail-and-actionable-tail-probe-20260227.md`, `docs/etl/sprints/AI-OPS-231/evidence/senado_playwright_backfill_20260227_latest.json`, `docs/etl/sprints/AI-OPS-231/evidence/senado_playwright_backfill_delta_20260227_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Huella WAF Senado (captura reproducible para escalado)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`document_fetches` + respuestas 403 (`playwright`/`cookie`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-232 cierra la deuda de captura reproducible con artefacto can\u00f3nico por cohorte (`scripts/report_senado_waf_block_profile.py`) y salida strict verificable. Estado actual del perfil (`only_linked_to_votes`): `missing_urls=680`, `missing_initiatives=345`, `blocked_403_urls=588`, `blocked_403_rate=0.864706`, `blocked_500_urls=90`, `zero_doc_initiatives=25`; cohorte top: `leg10:tipo610`, `leg14:tipo621`, `leg14:tipo624`, `leg14:tipo622`. Cola priorizada zero-doc publicada (`25` iniciativas, `1` URL/initiative) y retry acotado documentado (`candidate_urls=50`, `fetched_ok=0`, `playwright_init_error=null`). Evidencia: `docs/etl/sprints/AI-OPS-232/reports/senado-waf-block-profile-and-zero-doc-queue-20260227.md`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_latest.json`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_strict_latest.json`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-232/evidence/senado_backfill_docs_retry_cookie_latest.json`, `docs/etl/sprints/AI-OPS-232/exports/senado_zero_doc_actionable_queue_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Escalado operativo bloqueo Senado (cohortes top)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry dirigido por cohorte + refresh cookie/canal alterno",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-233 ejecuta el retry estricto ampliado (`limit-initiatives=50`) y valida el outcome con perfil WAF post-run: `candidate_urls=76`, `fetched_ok=0`, `playwright_init_error=null`, `missing_urls=680` (delta `0`), `missing_initiatives=345` (delta `0`), `zero_doc_initiatives=25` (delta `0`), `blocked_403_urls=607` (`+19`), `blocked_500_urls=71` (`-19`). Se cumple el criterio de cierre por intento estricto + bloqueo formal verificable (sin mejora material de cierre). Evidencia: `docs/etl/sprints/AI-OPS-233/reports/senado-escalado-cohortes-top-strict-retry-20260227.md`, `docs/etl/sprints/AI-OPS-233/evidence/senado_backfill_docs_retry_cookie_limit50_latest.json`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_latest.json`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_delta_vs_ai_ops_232_latest.json`, `docs/etl/sprints/AI-OPS-233/exports/senado_zero_doc_actionable_queue_latest.csv`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_strict_rc_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Refresh reproducible de sesi\u00f3n Senado (nueva palanca)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cookie/profile renovable + prueba estricta acotada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-234 introduce reporte can\u00f3nico de readiness de palanca (`scripts/report_senado_cookie_lever_status.py`) y ejecuta validaci\u00f3n estricta + retry acotado: `cookie_status=degraded`, `no_new_lever=true`, `age_hours=204.153` (umbral `24h`), `strict_fail_reasons=[cookie_file_stale]`, `cookie_strict_rc=4`; retry posterior mantiene `candidate_urls=50`, `fetched_ok=0`, `playwright_init_error=null`, y perfil WAF sin mejora (`missing_urls=680`, `zero_doc_initiatives=25`, delta `0` vs AI-OPS-233). Se cumple criterio de cierre por documentaci\u00f3n formal `no_new_lever` con evidencia machine-readable. Evidencia: `docs/etl/sprints/AI-OPS-234/reports/senado-cookie-lever-no-new-lever-closure-20260227.md`, `docs/etl/sprints/AI-OPS-234/evidence/senado_cookie_lever_status_latest.json`, `docs/etl/sprints/AI-OPS-234/evidence/senado_cookie_lever_status_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-234/evidence/senado_backfill_docs_retry_cookie_limit25_latest.json`, `docs/etl/sprints/AI-OPS-234/evidence/senado_waf_block_profile_delta_vs_ai_ops_233_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura manual headful de cookie Senado (palanca nueva externa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sesi\u00f3n renovada + cookie file sanitizado y versionado",
        "estado": "PARTIAL",
        "bloque": "Gap actualizado (AI-OPS-235 + AI-OPS-236 + AI-OPS-299 + AI-OPS-300 + AI-OPS-301 + AI-OPS-302 + AI-OPS-303 + AI-OPS-304): la lane ya cubre (a) cola reproducible de captura (`scripts/export_senado_manual_capture_targets.py`), (b) gate de progreso (`scripts/report_senado_manual_capture_target_progress.py`), (c) runner condicional de retry (`scripts/run_senado_manual_capture_retry_cycle.py`), (d) paquetizaci\u00f3n operativa de pendientes (`scripts/export_senado_manual_capture_pending_targets.py`) y (e) ciclo unificado de iteraci\u00f3n con delta (`scripts/run_senado_manual_capture_iteration_cycle.py`). AI-OPS-304 a\u00f1ade una palanca controlable de scraping (`manual_capture_playwright --headless`) sobre los 2 targets `unmatched`, cerrando el hueco estructural de cobertura: `matched_targets_total 6->8`, `unmatched_targets_total 2->0`, `coverage_pct 0.75->1.0`, `capture_files_total 2->4` (baseline AI-OPS-301 -> AI-OPS-304). Estado actual en DB principal (`2026-02-28`): `usable_targets_total=0`; cola pendiente sigue en `pending_targets_total=8`, ahora `pending_unmatched_total=0` y `pending_access_denied_total=8`; check estricto de iteraci\u00f3n `rc=4`. El bloqueo externo persiste: sin captura usable no procede retry de descarga. Evidencia: `docs/etl/sprints/AI-OPS-304/reports/senado-manual-capture-headless-probe-coverage-lane-20260228.md`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_delta_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_headless_probe_summary_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_iteration_cycle_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/just_parl_check_senado_manual_capture_iteration_cycle_rc_latest.txt`, `docs/etl/sprints/AI-OPS-304/evidence/tracker_status_latest.log`. Siguiente comando: `bash docs/etl/sprints/AI-OPS-304/exports/senado_manual_capture_pending_targets_commands_latest.sh && just parl-run-senado-manual-capture-iteration-cycle && just parl-check-senado-manual-capture-iteration-cycle`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Hardening runtime de captura Playwright (cookie refresh Senado)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`manual_capture_playwright.py` (fallback Node + `--headless`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-235 endurece la herramienta de captura manual para eliminar el fallo `_playwright` observado en campo: se a\u00f1ade fallback autom\u00e1tico de runtime Node (`PLAYWRIGHT_NODEJS_PATH`) cuando el driver bundled falla y se habilita `--headless` para ejecuci\u00f3n reproducible en este entorno; cobertura dedicada en `tests/test_manual_capture_playwright.py` + regresi\u00f3n de reports (`tests/test_report_senado_cookie_lever_status.py`, `tests/test_report_senado_waf_block_profile.py`) con `Ran 7 tests`, `OK`. Evidencia: `docs/etl/sprints/AI-OPS-235/reports/senado-manual-capture-runtime-hardening-and-cookie-refresh-probe-20260227.md`, `docs/etl/sprints/AI-OPS-235/evidence/senado_manual_cookie_capture_summary_latest.json`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_report_senado_cookie_lever_status_latest.txt`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_check_senado_cookie_lever_status_latest.txt`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_check_senado_cookie_lever_status_rc_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cohortes de retry Senado estables por snapshot",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Export cola accionable + replay de URLs por cohorte (`404/500/403`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-310 cierra el mecanismo contractual de cohorte fija: `backfill-initiative-documents` incorpora `--doc-urls-file` (TXT/CSV/JSON con `doc_url` + `last_http_status`) y usa status snapshot tanto en `retry_http_statuses` como en `skip_forbidden/archive_first`, eliminando drift intra-sprint por cambios en `document_fetches`. Validaci\u00f3n unitaria: `tests.test_parl_text_documents` (`Ran 15`, `OK`) con nuevos casos de estabilidad para ambos filtros. Validaci\u00f3n en DB principal con replay doble sobre la misma cohorte (`40` URLs, `--refetch-existing`, `status=403`) arroja resultados id\u00e9nticos first/second: `urls_to_fetch=40`, `skipped_forbidden=0`, `skipped_retry_http_statuses=0`, `selected_doc_status_used_for_forbidden_filter=40`, `selected_doc_status_used_for_retry=40`, `fetched_ok=9`, `archive_fetched_ok=9`. Post-proceso local cerrado (`initiative_doc_extractions --only-missing`: `upserted=9`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-310/reports/senado-retry-cohort-snapshot-lock-20260228.md`, `docs/etl/sprints/AI-OPS-310/evidence/senado_retry_snapshot_file_status403_refetch_first_20260228T214135Z.json`, `docs/etl/sprints/AI-OPS-310/evidence/senado_retry_snapshot_file_status403_refetch_second_20260228T214135Z.json`, `docs/etl/sprints/AI-OPS-310/evidence/unittest_parl_text_documents_ai_ops_310_20260228T214135Z.txt`, `docs/etl/sprints/AI-OPS-310/evidence/initiative_doc_extractions_backfill_post_snapshot_lock_20260228T214135Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate can\u00f3nico de validez de captura manual Senado (pre-retry)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`*.meta.json` + sidecars (`.html`, `.cookies.json`) -> `usable_capture` estricto",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-236 a\u00f1ade `scripts/report_senado_manual_capture_validity.py` + lanes `just parl-report/check-senado-manual-capture-validity` para convertir la captura manual en contrato previo al retry de red (`status=ok` requerido en estricto). Corrida real sobre capturas AI-OPS-235: `status=degraded`, `captures_total=2`, `usable_captures_total=0`, `access_denied_captures_total=2`, `cookies_domain_total=0`, `strict_fail_reasons=[no_usable_capture]`, `strict rc=4`; cobertura t\u00e9cnica `Ran 10 tests`, `OK` en suite conjunta de reports/captura. Evidencia: `docs/etl/sprints/AI-OPS-236/reports/senado-manual-capture-validity-gate-20260227.md`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_latest.json`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_strict_latest.json`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/just_parl_check_senado_manual_capture_validity_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/python_unittest_senado_capture_and_reports_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/tracker_status_latest.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Clasificacion evidencia -> tema (trazable)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Reglas deterministas + se\u00f1ales ML opcionales (siempre auditables)",
        "estado": "DONE",
        "bloque": "MVP (votos + intervenciones): evidencia se etiqueta a `topic_id` (votos via `parl_vote_event_initiatives`; intervenciones via `initiative_id`/expediente). KPIs en `/explorer-sources`: `topic_evidence_with_topic_pct` + breakdown por `topic_method`/`stance_method`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Posiciones por tema (politico x scope)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Agregacion reproducible + drill-down a evidencia",
        "estado": "DONE",
        "bloque": "Done now: YES. `backfill-topic-analytics` en `as_of_date=2026-02-16` dej\u00f3 ambos sets en latest alineado y cerr\u00f3 el blocker de cobertura en Congreso: `topic_set_id=1` pas\u00f3 de `12/60 (20.0%)` a `60/60 (100.0%)`, mientras `topic_set_id=2` qued\u00f3 en `23/24 (95.83%)` con latest tambi\u00e9n en `2026-02-16`; adem\u00e1s, `topic_positions_total` subi\u00f3 de `137379` a `205907` y `computed_method_votes` de `68528` a `137056` (`combined=68612`, `declared=239`). Evidencia: `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_baseline.csv`, `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_post.csv`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_baseline.log`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_recompute.log`, `docs/etl/sprints/AI-OPS-15/reports/topic_positions_reconciliation.md`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene de packetizaci\u00f3n en retries Senado (`status=403/404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Export de cola accionable + selecci\u00f3n de packet fresco reproducible",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-332 cierra la deuda de producto y formaliza el contrato `retry_packet_only_dedup` en toolchain: nuevo script `scripts/export_senado_retry_packet_only_dedup.py`, pruebas `tests/test_export_senado_retry_packet_only_dedup.py` (incluye fail-fast por agotamiento can\u00f3nico), y lanes operativos `Justfile` (`parl-export-senado-retry-packet-only-dedup`, `parl-check-senado-retry-packet-only-dedup`). Ejecuci\u00f3n real en DB principal: `status=403` (`pool_rows_total=169`, `excluded_used_urls_total=160`, `fresh_rows_total=9`) y `status=404` (`pool_rows_total=793`, `excluded_used_urls_total=7`, `fresh_rows_total=80`) con artefactos reproducibles de URLs usadas/refs y contrato estricto aplicable en cada sprint. Evidencia: `scripts/export_senado_retry_packet_only_dedup.py`, `tests/test_export_senado_retry_packet_only_dedup.py`, `docs/etl/sprints/AI-OPS-332/evidence/senado_status403_fresh_packet_summary_20260301T005820Z.json`, `docs/etl/sprints/AI-OPS-332/evidence/senado_status404_fresh_packet_summary_20260301T005820Z.json`, `docs/etl/sprints/AI-OPS-332/evidence/senado_retry_packet_used_refs_20260301T005820Z.txt`, `docs/etl/sprints/AI-OPS-332/evidence/senado_retry_packet_used_urls_20260301T005820Z.txt`, `docs/etl/sprints/AI-OPS-332/reports/senado-packet-dedupe-toolchain-and-dual-lane-retry-20260301.md`. Siguiente comando: `SENADO_RETRY_PACKET_POOL_CSV=docs/etl/sprints/<SPRINT>/exports/senado_status404_actionable_pool.csv SENADO_RETRY_PACKET_OUT=docs/etl/sprints/<SPRINT>/evidence/senado_status404_fresh_packet_summary.json SENADO_RETRY_PACKET_CSV_OUT=docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet.csv just parl-check-senado-retry-packet-only-dedup`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Lane `status=404` Senado: conversi\u00f3n de packet fresco a descargas efectivas",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry acotado + lever de cookie fresca + fallback alternativo",
        "estado": "PARTIAL",
        "bloque": "Gap actualizado: la lane queda operativamente cerrada en t\u00e9rminos de conversi\u00f3n de packet (`AI-OPS-355`: `candidate_urls=24`, `fetched_ok=24`, `runtime=6.64s`, `failures=0`) y habilita los avances posteriores en `403` y `status=0` hasta AI-OPS-360. El residual global persiste fuera de `404`, pero el riesgo de throughput/runtime de esta lane queda resuelto. Evidencia: `docs/etl/sprints/AI-OPS-355/reports/senado-manual-cookie-packet25-runtime-and-delta-20260301.md`, `docs/etl/sprints/AI-OPS-355/evidence/senado_status404_manual_cookie_archive_retry_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_packet50_conversion_delta_ai_ops_357_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_packet50_refetch_third_pass_delta_ai_ops_360_20260301T091018Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-linked-to-votes --only-status 403 --limit 50 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv && python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404 --retry-forbidden --refetch-existing --cookie-file <fresh_cookie_file> --limit-initiatives 50 --max-docs-per-initiative 1 --timeout 12`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Lane `status=404` Senado: cubrir `archive fallback` sin snapshots candidatos",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Enriquecimiento de candidatos de replay (Wayback/Memento seeds) para URLs sin historial",
        "estado": "PARTIAL",
        "bloque": "AI-OPS-351 no reabre capacidad en `status=404` (`fresh_rows_total=0`) y mantiene estable el bloque residual de `no snapshot candidates` en consolidado hist\u00f3rico. Cola residual consolidada reciente (evidencia acumulada `AI-OPS-*`): `archive_no_snapshot_failures_total=441`, `unique_urls_total=316`; la lane sigue `PARTIAL` y requiere seed/captura alterna para URLs sin historial p\u00fablico. Evidencia: `docs/etl/sprints/AI-OPS-351/evidence/senado_status404_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_archive_gap_urls_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/exports/senado_archive_gap_urls_20260301T074257Z.csv`, `docs/etl/sprints/AI-OPS-340/reports/senado-status404-archive-family-probes-and-gap-export-20260301.md`. Siguiente comando: `python3 scripts/report_senado_cookie_lever_status.py --cookie-file <fresh_cookie_file> --strict --out docs/etl/sprints/<SPRINT>/evidence/senado_cookie_lever_status_<TS>.json && python3 scripts/export_senado_manual_capture_pending_targets.py --validity-json docs/etl/sprints/<SPRINT>/evidence/senado_manual_capture_validity_<TS>.json --out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_<TS>.csv --commands-out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh && bash docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Eficiencia de packet `status=404`: evitar burst desperdiciado por `skipped_redundant_global_urls`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Prefiltro/score de packet para maximizar `candidate_urls` \u00fatiles",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-334 cierra el gap controlable de eficiencia con dos hardenings complementarios: (1) `export_missing_initiative_doc_urls.py` alinea `--exclude-redundant-senado-global` con el criterio operativo del backfill (alternativa descargada detectada por `source_record_pk IS NOT NULL` + patr\u00f3n de URL), y (2) `backfill-initiative-documents` ignora `max_docs_per_initiative` cuando el scope est\u00e1 expl\u00edcitamente seleccionado (`selected_scope_ignores_doc_cap=true`), evitando truncar URLs del packet. Validaci\u00f3n en DB principal (`status=404`, linked-to-votes): pool `raw_rows 877 -> actionable_rows 802` (`-75` redundantes) y dry-run contractual sobre packet `80` (`--retry-http-statuses 599`, sin red) mejora `candidate_urls 24 -> 80`, `selected_doc_urls_not_in_candidates 56 -> 0`, `skipped_redundant_global_urls 79 -> 40`. Cobertura de regresi\u00f3n en tests: `tests/test_export_missing_initiative_doc_urls.py` + `tests/test_parl_text_documents.py`. Evidencia: `docs/etl/sprints/AI-OPS-334/reports/senado-status404-packet-efficiency-scope-alignment-20260301T011834Z.md`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_pool_prefilter_delta_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_raw_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_actionable_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_delta_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/unittest_packet_efficiency_scope_fix_20260301T011834Z.txt`, `docs/etl/sprints/AI-OPS-334/evidence/tracker_status_20260301T011834Z.log`, `docs/etl/sprints/AI-OPS-334/evidence/e2e_tracker_status_20260301T011834Z.log`. Siguiente comando: `SENADO_COOKIE_LEVER_FILE=<fresh_cookie_file> just parl-check-senado-cookie-lever-status && SENADO_RETRY_PACKET_POOL_CSV=docs/etl/sprints/<SPRINT>/exports/senado_status404_pool_actionable_<TS>.csv SENADO_RETRY_PACKET_OUT=docs/etl/sprints/<SPRINT>/evidence/senado_status404_fresh_packet_summary_<TS>.json SENADO_RETRY_PACKET_CSV_OUT=docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet_<TS>.csv just parl-check-senado-retry-packet-only-dedup && python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db <db> --initiative-source-ids senado_iniciativas --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet_<TS>.csv --retry-http-statuses 404 --archive-fallback --archive-fallback-http-statuses 404 --cookie-file <fresh_cookie_file> --limit-initiatives 80 --max-docs-per-initiative 1 --timeout 15`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre de iniciativas Senado sin documento (linked_to_votes)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cola prioritaria `zero_doc_initiatives` + replay dirigido por iniciativa",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 cierra la cola `zero_doc` en linked-to-votes con retry dirigido `status=403` (`packet25`, `fetched_ok=25`, `failures=0`) y deja `zero_doc_initiatives 5->0`, a la vez que completa cobertura ciudadana `linked_to_votes_with_downloaded_docs 746/751 -> 751/751` (`100%`). Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_manual_cookie_archive_retry_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/quality_initiatives_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cohorte zero-doc cr\u00edtica (`leg14 tipo622/626`) sin snapshots",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Preparaci\u00f3n de lane de captura/replay alterno para 5 iniciativas sin documento",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 elimina el bloqueo de la cohorte cr\u00edtica dentro del scope linked-to-votes: `zero_doc_initiatives 5->0` y cobertura completa `751/751`. La lane de captura/replay alterno deja de ser cr\u00edtica para este objetivo espec\u00edfico y pasa a mantenimiento preventivo fuera de este item. Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_before_status403_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Diversificaci\u00f3n de lane residual tras contracci\u00f3n de packet `status=404`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Explorar cola accionable `status=500` y comparar conversi\u00f3n vs lane `404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-351 ejecuta el DoD completo y cierra la decisi\u00f3n `keep_or_drop`: lane `status=500` en scope linked-to-votes sin capacidad (`pool_rows_total=0`, `fresh_rows_total=0`, `strict_fail_reasons=[no_pool_rows,fresh_rows_below_min]`) y comparaci\u00f3n directa confirma agotamiento tambi\u00e9n en `status=404` (`pool_rows_total=408`, `fresh_rows_total=0`) y `zero_doc` (`pool_rows_total=17`, `fresh_rows_total=0`) bajo dedupe can\u00f3nico. Decisi\u00f3n operativa registrada: `status500_linked_to_votes=drop_for_now_no_pool_rows`; reabrir solo ante nueva se\u00f1al/leverage externo. Evidencia: `docs/etl/sprints/AI-OPS-351/reports/senado-packet-exhaustion-and-status500-lane-decision-20260301.md`, `docs/etl/sprints/AI-OPS-351/evidence/senado_status500_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_status404_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_zero_doc_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_lane_decision_ai_ops_351_20260301T074257Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reseed de capacidad fresca Senado tras agotamiento can\u00f3nico (`404`/`zero_doc`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Reabrir `candidate_urls` con nueva palanca reproducible (cookie fresca/manual capture/familias URL nuevas)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-352 reabre la palanca (`manual_capture_validity=ok`, `usable_captures_total=2`) y AI-OPS-353 demuestra conversi\u00f3n efectiva en retry real con cookie (`fetched_ok=2`, `archive_hits=2`) logrando delta neta de cobertura (`downloaded_doc_links 4802->4804`, `missing_doc_links_actionable 4561->4559`). Se cumple el DoD de reseed con evidencia reproducible end-to-end y post-proceso estructural en verde (`downloaded_missing_extraction=0`). Evidencia: `docs/etl/sprints/AI-OPS-352/reports/senado-manual-capture-reseed-and-retry-20260301.md`, `docs/etl/sprints/AI-OPS-353/reports/senado-manual-cookie-archive-packet-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_capture_retry_cycle_20260301T075958Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/senado_status404_manual_cookie_archive_retry_packet8_20260301T080845Z.log`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_353_20260301T081020Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n de palanca manual reabierta a delta neta (`downloaded_doc_links`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Explotar la palanca `usable_capture` para recuperar docs y no s\u00f3lo reclasificar status",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-353 cumple el objetivo con un retry acotado reproducible (`status=404`, packet `8`, cookie manual): `fetched_ok=2`, `archive_fetched_ok=2`, `text_documents_upserted=2`, y delta neta verificable en KPI (`downloaded_doc_links +2`, `missing_doc_links_actionable -2`, `missing_doc_links_actionable_linked_to_votes -2`). Post-proceso ejecutado para mantener calidad (`initiative_doc_extractions upserted=2`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-353/reports/senado-manual-cookie-archive-packet-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-353/evidence/senado_status404_manual_cookie_archive_retry_packet8_20260301T080845Z.log`, `docs/etl/sprints/AI-OPS-353/evidence/quality_initiatives_after_archive_packet8_postprocess_20260301T081020Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/initiative_doc_extractions_backfill_after_archive_packet8_20260301T081020Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_353_20260301T081020Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Escalado controlado de conversi\u00f3n manual-cookie (`status=404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Subir throughput de packet (`8 -> 25`) manteniendo runtime acotado y delta neta por slice",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-355 cumple el DoD completo con packet operativo (`24/25`), runtime guard en verde (`6.64s`, sin timeout/interrupci\u00f3n) y delta neta muy superior al m\u00ednimo exigido: `downloaded_doc_links 4804->4828` (`+24`), `missing_doc_links_actionable 4559->4535` (`-24`), `missing_urls 783->759` (`-24`). Retry estructurado sin fallos (`fetched_ok=24`, `failures=0`, `archive_hits=0`). Evidencia: `docs/etl/sprints/AI-OPS-355/reports/senado-manual-cookie-packet25-runtime-and-delta-20260301.md`, `docs/etl/sprints/AI-OPS-355/evidence/senado_status404_manual_cookie_archive_retry_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_355_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/quality_initiatives_after_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/senado_waf_block_profile_after_packet25_20260301T084757Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual `status=403` (linked_to_votes)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet acotado con cookie/manual capture para reducir bloqueo WAF en cola cr\u00edtica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 ejecuta packet `25` en `status=403` con runtime guard (`5.39s`) y cumple sobradamente el DoD: `downloaded_doc_links +25`, `missing_urls -26`, `blocked_403_urls -25` y `zero_doc_initiatives 5->0`, con retry limpio (`fetched_ok=25`, `failures=0`). Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_manual_cookie_archive_retry_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n del residual `status=403` tras conversi\u00f3n inicial (`164` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Escalado controlado `packet50` en `403` con guard de runtime y delta neta adicional",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-357 ejecuta el `packet50` con guard de runtime (`9.48s`) y cumple ampliamente el DoD: `blocked_403_urls 164->114` (`-50`) y `missing_urls 733->683` (`-50`), adem\u00e1s de `downloaded_doc_links +50` y retry limpio (`fetched_ok=50`, `failures=0`). Post-proceso estructural en verde (`extractions upserted=99`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-357/reports/senado-status403-packet50-residual-reduction-20260301.md`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_packet50_conversion_delta_ai_ops_357_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_manual_cookie_archive_retry_packet50_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_waf_block_profile_after_status403_packet50_20260301T085854Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n del residual `status=0` (unknown) en linked-to-votes",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=0` con retry controlado + reclasificaci\u00f3n de fetch-status",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-358 valida la lane `status=0` con patr\u00f3n `refetch`: tras un primer intento no efectivo por filtros, la corrida corregida (`--refetch-existing`, sin `--retry-http-statuses`) ejecuta `packet50` en `5.81s` con `fetched_ok=50`, `failures=0`, y cumple el DoD con delta material (`unknown_status_urls 217->167`, `missing_urls 683->633`, `downloaded_doc_links +50`). Evidencia: `docs/etl/sprints/AI-OPS-358/reports/senado-status0-packet50-refetch-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-358/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/senado_status0_packet50_refetch_delta_ai_ops_358_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T090203Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=0` tras primer packet refetch (`167` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `packet50` (refetch) con control de saturaci\u00f3n y delta incremental",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-359 ejecuta la segunda pasada `status=0` con patr\u00f3n refetch y cumple sobradamente el DoD: `unknown_status_urls 167->117` (`-50`), `missing_urls 633->583` (`-50`), `downloaded_doc_links 4953->5003` (`+50`), runtime `6.27s`, retry limpio (`fetched_ok=50`, `failures=0`) y post-proceso en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-359/reports/senado-status0-packet50-refetch-second-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-359/evidence/senado_status0_packet50_refetch_second_pass_delta_ai_ops_359_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T090541Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre residual combinado (`status=0` + `status=403`) tras segunda pasada refetch",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Iteraci\u00f3n priorizada por cohorte en linked-to-votes (packet50)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-360 ejecuta la iteraci\u00f3n adicional y cumple el DoD: `unknown_status_urls 117->67` (`-50`) y `missing_urls 583->533` (`-50`) sin regresi\u00f3n en `blocked_403_urls` (`114->114`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`), runtime guard en verde (`5.59s`) y post-proceso estable (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-360/reports/senado-status0-packet50-refetch-third-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_packet50_refetch_third_pass_delta_ai_ops_360_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T091018Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=403` tras cierre combinado (`114` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=403` con refetch + cookie fresca",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-361 ejecuta `packet50` en `status=403` y cumple el DoD con margen: `blocked_403_urls 114->64` (`-50`) y `missing_urls 533->484` (`-49`), adem\u00e1s de `downloaded_doc_links 5053->5102` (`+49`). Retry con alta conversi\u00f3n (`candidate_urls=50`, `fetched_ok=49`, `failures=1`, `runtime=20.54s`) y post-proceso estructural en verde (`extractions upserted=49`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-361/reports/senado-status403-packet50-refetch-residual-reduction-20260301.md`, `docs/etl/sprints/AI-OPS-361/evidence/senado_status403_packet50_refetch_delta_ai_ops_361_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/senado_status403_manual_cookie_archive_retry_packet50_refetch_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_refetch_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/senado_waf_block_profile_after_status403_packet50_refetch_20260301T091550Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=0` tras contracci\u00f3n de `status=403` (`68` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=0` con refetch para limpiar bucket unknown en linked-to-votes",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-362 ejecuta `packet50` en `status=0` y cumple el DoD con margen: `unknown_status_urls 68->18` (`-50`) y `missing_urls 484->434` (`-50`), adem\u00e1s de `downloaded_doc_links 5102->5152` (`+50`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `runtime=10.53s`) y post-proceso estructural en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-362/reports/senado-status0-packet50-refetch-fourth-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-362/evidence/senado_status0_packet50_refetch_delta_ai_ops_362_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/senado_status0_archive_retry_packet50_refetch_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T092037Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=403` tras contracci\u00f3n de `status=0` (`64` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=403` con refetch + cookie fresca para cerrar cola WAF cr\u00edtica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-363 ejecuta `packet50` en `status=403` y cumple ampliamente el DoD: `blocked_403_urls 64->14` (`-50`) y `missing_urls 434->384` (`-50`), adem\u00e1s de `downloaded_doc_links 5152->5202` (`+50`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `runtime=5.93s`) y post-proceso estructural en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-363/reports/senado-status403-packet50-refetch-fifth-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-363/evidence/senado_status403_packet50_refetch_delta_ai_ops_363_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/senado_status403_archive_retry_packet50_refetch_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_refetch_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/senado_waf_block_profile_after_status403_packet50_refetch_20260301T092434Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=404` tras contracci\u00f3n de `status=403` (`347` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=404` con retry filtrado + archive fallback para bajar cola dominante",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-364 ejecuta el retry comprometido (`packet50`) y cierra la iteraci\u00f3n por anti-loop sin palanca nueva: `candidate_urls=18`, `fetched_ok=0`, `failures=18`, `archive_hits=0`, runtime `271.83s`; m\u00e9tricas sin cambio (`downloaded_doc_links 5202->5202`, `missing_urls 384->384`). El fallo es consistente y reproducible (`archive fallback: no snapshot candidates`) para la cohorte `detalleiniciativa` (`18` URLs \u00fanicas). Evidencia: `docs/etl/sprints/AI-OPS-364/reports/senado-status404-packet50-no-new-lever-20260301.md`, `docs/etl/sprints/AI-OPS-364/evidence/senado_status404_archive_retry_packet50_refetch_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/evidence/senado_status404_packet50_refetch_delta_ai_ops_364_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/evidence/senado_archive_gap_urls_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/exports/senado_archive_gap_urls_20260301T092750Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Habilitar nueva palanca para residual `status=404` sin snapshots (`detalleiniciativa`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Captura/seed alterna reproducible para cohorte `leg10 tipo610`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-365 valida palanca disponible (`manual_capture_validity.status=ok`, `usable_captures_total=4`) y ejecuta dos probes dirigidos sobre la cohorte `18` URLs (`cookie` gen\u00e9rica usable + cookie espec\u00edfica `leg10 tipo610`), ambos sin conversi\u00f3n (`fetched_ok=0`, `archive_hits=0`) y sin delta KPI (`downloaded_doc_links 5202->5202`, `missing_urls 384->384`). Se cierra el objetivo por no efectividad de palanca en esta cohorte y se requiere fallback t\u00e9cnico alterno. Evidencia: `docs/etl/sprints/AI-OPS-365/reports/senado-status404-cookie-lever-probe-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-365/evidence/senado_manual_capture_validity_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_manual_capture_pending_targets_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_status404_gap_cookie_retry_delta_ai_ops_365_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_status404_gap_cookie_retry_leg10_delta_ai_ops_365_20260301T094234Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fallback t\u00e9cnico para `detalleiniciativa` sin snapshots (`status=404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Resolver URL alterna/derivada o fuente espejo para cohorte `leg10 tipo610`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-366 implementa fallback determinista `direct_variant` (derivaci\u00f3n `detalleiniciativa -> ficopendataservlet tipoFich=3/12`) en `text_documents.py`, a\u00f1ade cobertura unitaria espec\u00edfica y ejecuta retries reales sobre la cohorte `18` URLs con cookie y Playwright (`direct_variant_attempted_urls=18`, `direct_variant_candidate_urls=36`) sin conversi\u00f3n (`fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI de cobertura: `downloaded_doc_links 5202->5202`, `missing_urls 384->384`; la cohorte se reclasifica a bloqueo `403` (`blocked_403_urls 14->32`). Evidencia: `docs/etl/sprints/AI-OPS-366/reports/senado-status404-direct-variant-fallback-and-playwright-probe-20260301.md`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_retry_20260301T100159Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_playwright_v2_retry_20260301T101836Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_playwright_v2_delta_ai_ops_366_20260301T101836Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/e2e_tracker_status_with_tracker_20260301T100159Z.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n de cohorte `detalleiniciativa` reclasificada a `status=403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry dirigido con perfil de navegador fresco (challenge-resolved) sobre paquete fijo",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-367 ejecuta el replay comprometido sobre la cohorte fija de `18` URLs (`docs/etl/sprints/AI-OPS-364/exports/senado_archive_gap_urls_20260301T092750Z.csv`) con perfil de navegador fresco y captura dedicada; la captura nueva queda en `Access Denied` sin cookies \u00fatiles (`no_domain_cookies`, `no_unexpired_persistent_cookies`) y el retry mantiene bloqueo homog\u00e9neo (`candidate_urls=18`, `fetched_ok=0`, `direct_variant_attempted_urls=18`, `direct_variant_fetched_ok=0`, `failures=18`, `HTTP 403 (playwright)`). Delta KPI de cobertura: `downloaded_doc_links 5202->5202`, `missing_doc_links_actionable 4160->4160`, `missing_urls 384->384`, `blocked_403_urls 32->32`. Evidencia: `docs/etl/sprints/AI-OPS-367/reports/senado-status403-fresh-profile-no-new-lever-closure-20260301.md`, `docs/etl/sprints/AI-OPS-367/evidence/senado_cookie_lever_status_fresh_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/senado_status403_profile_retry_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/senado_status403_profile_retry_delta_ai_ops_367_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/e2e_tracker_status_with_tracker_20260301T102943Z.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Structuraci\u00f3n reproducible del residual `status=404` + dedupe can\u00f3nico",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Perfil WAF actualizado + packetizaci\u00f3n por cohortes + dedupe contra hist\u00f3rico",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-368 cierra la parte controlable de preparaci\u00f3n/limpieza de cola: perfil actualizado (`missing_urls=384`, `status=404=329`, `status=403=32`, `status=0=18`, `status=200=5`), packetizaci\u00f3n por cohortes (`selected_cohorts_total=6`, `packet_rows_total=108`, `packet_unique_initiatives_total=97`) y dedupe can\u00f3nico del pool `status=404` (`pool_rows_total=329`, `used_urls_total=1389`, `fresh_rows_total=0`, `strict_fail_reasons=[packet_exhausted_by_canonical_dedupe]`). El resultado formaliza agotamiento de capacidad fresca para `404` sin nueva palanca. Evidencia: `docs/etl/sprints/AI-OPS-368/reports/senado-status404-packet-structuring-and-dedupe-exhaustion-20260301.md`, `docs/etl/sprints/AI-OPS-368/evidence/senado_waf_block_profile_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/evidence/senado_status404_fresh_packet_summary_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/evidence/senado_waf_cohort_packets_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/exports/senado_status404_fresh_packet_20260301T103942Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n puntual del residual no bloqueado (`status=0`/`status=200`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico y acotado en `linked_to_votes` tras agotamiento `404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-369 ejecuta la lane comprometida y supera el DoD con margen: packet `status=0` (`18` URLs) + packet `status=200` (`5` URLs), retry total `fetched_ok=21/23` (`archive_hits=21`) y delta KPI material `downloaded_doc_links 5202->5223` (`+21`), `missing_doc_links_actionable 4160->4139` (`-21`), `missing_urls 384->363` (`-21`), adem\u00e1s de drenar buckets no bloqueados (`unknown_status_urls 18->0`, `status=200 5->0`). Postproceso estructural completado en el mismo slice: `backfill_initiative_doc_excerpts` (`seen=351`, `updated=351`) + `backfill_initiative_doc_extractions --only-missing` (`seen=21`, `upserted=21`, `needs_review=0`), dejando `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-369/reports/senado-status0-200-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status0_retry_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status200_retry_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status0_200_conversion_delta_ai_ops_369_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/quality_initiatives_after_postprocess_20260301T104519Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual bloqueado `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet32` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-370 ejecuta la lane comprometida y supera el DoD con margen: packet `status=403` (`32` URLs), retry total `fetched_ok=10/32` (`archive_hits=10`) y delta KPI material `downloaded_doc_links 5223->5233` (`+10`), `missing_doc_links_actionable 4139->4129` (`-10`), `missing_urls 363->353` (`-10`), `blocked_403_urls 32->22` (`-10`). Postproceso estructural completado en el mismo slice: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=10`, `upserted=10`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-370/reports/senado-status403-packet32-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-370/evidence/senado_status403_retry_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/senado_status403_conversion_delta_ai_ops_370_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/senado_waf_block_profile_after_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/quality_initiatives_after_postprocess_20260301T105944Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-371 ejecuta la lane comprometida y supera el DoD con margen, tras corregir packet subllenado (`limit=50` inicial: `rows=9`, `fetched_ok=2`) con packet efectivo (`rows=50`, `fetched_ok=18`). Delta KPI consolidada del slice: `downloaded_doc_links 5233->5253` (`+20`), `missing_doc_links_actionable 4129->4109` (`-20`), `missing_urls 353->333` (`-20`), `status=404 331->272` (`-59`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=20`, `upserted=20`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-371/reports/senado-status404-packet50-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_retry_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_retry_packet50_effective_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_conversion_delta_ai_ops_371_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/quality_initiatives_after_postprocess_final_20260301T111618Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual reclasificado `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo sobre cohorte post-`404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-372 ejecuta la lane comprometida y supera ampliamente el DoD: `packet_rows=50`, `candidate_urls=50`, `fetched_ok=34`, `failures=16`, con conversi\u00f3n dominante en variantes directas (`direct_variant_fetched_ok=34`). Delta KPI del slice: `downloaded_doc_links 5253->5287` (`+34`), `missing_doc_links_actionable 4109->4075` (`-34`), `missing_urls 333->299` (`-34`), `blocked_403_urls 61->27` (`-34`), `status=404` estable (`272`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=27`, `updated=27`) + `backfill_initiative_doc_extractions --only-missing` (`seen=34`, `upserted=34`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-372/reports/senado-status403-packet50-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-372/evidence/senado_status403_retry_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/senado_status403_conversion_delta_ai_ops_372_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/senado_waf_block_profile_after_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/quality_initiatives_after_postprocess_20260301T114610Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual dominante `status=404` (`linked_to_votes`) tras contracci\u00f3n `403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-373 ejecuta la lane comprometida y supera ampliamente el DoD: export `limit=50` queda subllenado (`rows=0`), se corrige en el mismo slice con packet efectivo (`rows=50`) y retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5287->5337` (`+50`), `missing_doc_links_actionable 4075->4025` (`-50`), `missing_urls 299->249` (`-50`), `status=404 272->222` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=17`, `updated=17`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-373/reports/senado-status404-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_packet_underfill_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_retry_packet50_effective_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_conversion_delta_ai_ops_373_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/quality_initiatives_after_postprocess_20260301T131100Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n iterativa del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-374 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5337->5387` (`+50`), `missing_doc_links_actionable 4025->3975` (`-50`), `missing_urls 249->199` (`-50`), `status=404 222->172` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-374/reports/senado-status404-packet50-effective-second-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-374/evidence/senado_status404_retry_packet50_effective_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/senado_status404_conversion_delta_ai_ops_374_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/senado_waf_block_profile_after_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/quality_initiatives_after_postprocess_20260301T133600Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n iterativa final del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-375 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5387->5437` (`+50`), `missing_doc_links_actionable 3975->3925` (`-50`), `missing_urls 199->149` (`-50`), `status=404 172->122` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-375/reports/senado-status404-packet50-effective-third-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-375/evidence/senado_status404_retry_packet50_effective_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/senado_status404_conversion_delta_ai_ops_375_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/senado_waf_block_profile_after_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/quality_initiatives_after_postprocess_20260301T140000Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-376 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5437->5487` (`+50`), `missing_doc_links_actionable 3925->3875` (`-50`), `missing_urls 149->99` (`-50`), `status=404 122->72` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-376/reports/senado-status404-packet50-effective-fourth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-376/evidence/senado_status404_retry_packet50_effective_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/senado_status404_conversion_delta_ai_ops_376_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/senado_waf_block_profile_after_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/quality_initiatives_after_postprocess_20260301T131535Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo adicional del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-377 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5487->5537` (`+50`), `missing_doc_links_actionable 3875->3825` (`-50`), `missing_urls 99->49` (`-50`), `status=404 72->22` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-377/reports/senado-status404-packet50-effective-fifth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-377/evidence/senado_status404_retry_packet50_effective_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/senado_status404_conversion_delta_ai_ops_377_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/senado_waf_block_profile_after_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/quality_initiatives_after_postprocess_20260301T133909Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-378 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=27`, `fetched_ok=27`, `failures=0`, `direct_variant_fetched_ok=27`). Delta KPI del slice: `downloaded_doc_links 5537->5564` (`+27`), `missing_doc_links_actionable 3825->3798` (`-27`), `missing_urls 49->22` (`-27`), `status=403 27->0` (`-27`), `status=404` estable (`22`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=27`, `upserted=27`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-378/reports/senado-status403-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_retry_packet50_effective_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_conversion_delta_ai_ops_378_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/senado_waf_block_profile_after_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/quality_initiatives_after_postprocess_20260301T135949Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo del residual dominante `status=404` (`linked_to_votes`) tras cierre `status=403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-379 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=22`, `fetched_ok=22`, `failures=0`, `direct_variant_fetched_ok=22`). Delta KPI del slice: `downloaded_doc_links 5564->5586` (`+22`), `missing_doc_links_actionable 3798->3776` (`-22`), `missing_urls 22->0` (`-22`), `status=404 22->0` (`-22`), con `status=403` estable (`0`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=22`, `upserted=22`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-379/reports/senado-status404-packet50-effective-sixth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_retry_packet50_effective_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_conversion_delta_ai_ops_379_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_waf_block_profile_after_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/quality_initiatives_after_postprocess_20260301T141409Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado fuera de `linked_to_votes` (`status=403` dominante)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=403` (`senado_iniciativas`) con replay acotado y cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-380 cierra el objetivo con dos pasadas `packet50` sobre cola global y correcci\u00f3n expl\u00edcita de scope (`--include-unlinked`): delta acumulada baseline `20260301T142920Z` -> cierre `20260301T143949Z` `downloaded_doc_links 5586->5591` (`+5`) y `missing_doc_links_actionable 3776->3771` (`-5`), cumpliendo el DoD; adem\u00e1s `status403_global 1910->1810` (`-100`). Resultado por pasada: pass1 `candidate_urls=50`, `fetched_ok=4`; pass2 `candidate_urls=50`, `fetched_ok=1`, con postproceso sem\u00e1ntico ejecutado en ambas (`extractions --only-missing` sin `needs_review`). Evidencia: `docs/etl/sprints/AI-OPS-380/reports/senado-status403-global-two-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-380/evidence/senado_status403_global_conversion_delta_ai_ops_380_20260301T143949Z.json`, `docs/etl/sprints/AI-OPS-380/evidence/senado_status403_global_retry_packet50_effective_20260301T142920Z.json`, `docs/etl/sprints/AI-OPS-380/evidence/senado_status403_global_secondpass_retry_packet50_effective_20260301T143949Z.json`, `docs/etl/sprints/AI-OPS-380/evidence/quality_initiatives_after_secondpass_20260301T143949Z.json`, `docs/etl/sprints/AI-OPS-380/evidence/senado_waf_block_profile_global_after_secondpass_20260301T143949Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Priorizaci\u00f3n del residual global Senado tras contracci\u00f3n `status=403` (`status=403` vs `status=500`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Comparativa de conversi\u00f3n en packets globales no `linked_to_votes` con `--include-unlinked`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-381 ejecuta la pasada `status=500` (`packet50`) en scope global no linkeado con `--include-unlinked`: `candidate_urls=50`, `fetched_ok=0`, `archive_hits=17`, `archive_fetched_ok=0`, `failures=30`. Delta neta de cobertura nula (`downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`) y reclasificaci\u00f3n de bucket `status500 1749->1699` (`-50`) sin mejora de descarga; se cierra la comparaci\u00f3n y se mantiene prioridad de conversi\u00f3n en lane `status=403`. Evidencia: `docs/etl/sprints/AI-OPS-381/reports/senado-status500-global-priority-probe-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-381/evidence/senado_status500_global_conversion_delta_ai_ops_381_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/senado_status500_global_retry_packet50_effective_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/quality_initiatives_after_postprocess_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/senado_waf_block_profile_global_after_20260301T145104Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` tras descarte relativo de lane `status=500`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=403` (`senado_iniciativas`) con replay acotado y cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-382 ejecuta dos pasadas `packet50` en `status=403` con `--include-unlinked` y postproceso completo; resultado sin conversi\u00f3n neta (`downloaded_doc_links_delta=0`, `missing_doc_links_actionable_delta=0`) pese a reclasificaci\u00f3n del bucket (`status403 1810->1710`, `-100`). Se cierra la iteraci\u00f3n por anti-loop y se prioriza lane m\u00e1s convertible (`status=0`). Evidencia: `docs/etl/sprints/AI-OPS-382/reports/senado-status403-global-two-pass-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-382/evidence/senado_status403_global_conversion_delta_ai_ops_382_20260301T151707Z.json`, `docs/etl/sprints/AI-OPS-382/evidence/senado_status403_global_retry_packet50_effective_pass1_20260301T151138Z.json`, `docs/etl/sprints/AI-OPS-382/evidence/senado_status403_global_retry_packet50_effective_pass2_20260301T151707Z.json`, `docs/etl/sprints/AI-OPS-382/evidence/quality_initiatives_after_pass2_20260301T151707Z.json`, `docs/etl/sprints/AI-OPS-382/evidence/senado_waf_block_profile_global_after_pass2_20260301T151707Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=0` (unknown)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=0` (`senado_iniciativas`) con replay acotado y cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-384 cierra el residual unknown con dos pasadas (`pass1 packet50`, `pass2 residual14`) y replay limpio (`fetched_ok=50` + `14`, `failures=0`), cumpliendo DoD de drenaje: `unknown_status_urls 64->0`, `downloaded_doc_links 5641->5705` (`+64`), `missing_doc_links_actionable 3721->3657` (`-64`), `missing_urls 3721->3657` (`-64`). Evidencia: `docs/etl/sprints/AI-OPS-384/reports/senado-status0-global-two-pass-residual-closure-20260301.md`, `docs/etl/sprints/AI-OPS-384/evidence/senado_status0_global_conversion_delta_ai_ops_384_20260301T153345Z.json`, `docs/etl/sprints/AI-OPS-384/evidence/senado_status0_global_retry_packet50_effective_pass1_20260301T153130Z.json`, `docs/etl/sprints/AI-OPS-384/evidence/senado_status0_global_retry_packet50_effective_pass2_20260301T153345Z.json`, `docs/etl/sprints/AI-OPS-384/evidence/quality_initiatives_after_pass2_20260301T153345Z.json`, `docs/etl/sprints/AI-OPS-384/evidence/senado_waf_block_profile_global_after_pass2_20260301T153345Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` dominante tras cierre de `unknown`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=403` (`senado_iniciativas`) con replay acotado + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-385 ejecuta dos pasadas `packet50` con `--include-unlinked` y postproceso completo (`excerpts` + `extractions --only-missing`), pero sin conversi\u00f3n neta de cobertura: pass1 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; pass2 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; delta acumulada `downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`, con reclasificaci\u00f3n `status403 1710->1610` (`-100`). Se registra `no_new_lever` y se cierra la lane para evitar repetici\u00f3n ciega. Evidencia: `docs/etl/sprints/AI-OPS-385/reports/senado-status403-global-two-pass-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-385/evidence/senado_status403_global_conversion_delta_ai_ops_385_20260301T154523Z.json`, `docs/etl/sprints/AI-OPS-385/evidence/senado_status403_global_no_new_lever_ai_ops_385_20260301T154523Z.json`, `docs/etl/sprints/AI-OPS-385/evidence/senado_status403_global_retry_packet50_effective_pass1_20260301T153942Z.json`, `docs/etl/sprints/AI-OPS-385/evidence/senado_status403_global_retry_packet50_effective_pass2_20260301T154523Z.json`, `docs/etl/sprints/AI-OPS-385/evidence/senado_waf_block_profile_global_after_pass2_20260301T154523Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=500` dominante tras no-delta de lane `status=403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=500` (`senado_iniciativas`) con replay acotado + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-386 ejecuta dos pasadas `packet50` con `--include-unlinked` y postproceso completo (`excerpts` + `extractions --only-missing`), pero sin conversi\u00f3n neta de cobertura: pass1 `candidate_urls=50`, `fetched_ok=0`, `archive_hits=20`, `failures=30`; pass2 `candidate_urls=50`, `fetched_ok=0`, `archive_hits=43`, `failures=30`; delta acumulada `downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`, con reclasificaci\u00f3n `status500 1699->1599` (`-100`) y `status403` estable (`1610`). Se registra `no_new_lever` y se cierra la lane para evitar repetici\u00f3n ciega. Evidencia: `docs/etl/sprints/AI-OPS-386/reports/senado-status500-global-two-pass-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-386/evidence/senado_status500_global_conversion_delta_ai_ops_386_20260301T160940Z.json`, `docs/etl/sprints/AI-OPS-386/evidence/senado_status500_global_no_new_lever_ai_ops_386_20260301T160940Z.json`, `docs/etl/sprints/AI-OPS-386/evidence/senado_status500_global_retry_packet50_effective_pass1_20260301T155526Z.json`, `docs/etl/sprints/AI-OPS-386/evidence/senado_status500_global_retry_packet50_effective_pass2_20260301T160940Z.json`, `docs/etl/sprints/AI-OPS-386/evidence/senado_waf_block_profile_global_after_pass2_20260301T160940Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` tras no-delta de lanes `status=403/500`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=404` (`senado_iniciativas`) con replay acotado + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-387 ejecuta una pasada `packet50` con `--include-unlinked` y postproceso completo (`excerpts` + `extractions --only-missing`), cumpliendo DoD con delta material: `candidate_urls=50`, `fetched_ok=42`, `failures=8`, `direct_variant_fetched_ok=42`; delta `downloaded_doc_links 5705->5747` (`+42`), `missing_doc_links_actionable 3657->3615` (`-42`), `missing_urls 3657->3615` (`-42`), `status404 368->326` (`-42`), con `status403/status500` estables. Evidencia: `docs/etl/sprints/AI-OPS-387/reports/senado-status404-global-packet50-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-387/evidence/senado_status404_global_conversion_delta_ai_ops_387_20260301T164245Z.json`, `docs/etl/sprints/AI-OPS-387/evidence/senado_status404_global_retry_packet50_effective_pass1_20260301T164245Z.json`, `docs/etl/sprints/AI-OPS-387/evidence/quality_initiatives_after_pass1_20260301T164245Z.json`, `docs/etl/sprints/AI-OPS-387/evidence/senado_waf_block_profile_global_after_pass1_20260301T164245Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=404` tras primer delta material",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=404` (`senado_iniciativas`) con replay acotado + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-388 ejecuta dos pasadas `packet50` con `--include-unlinked` y postproceso completo (`excerpts` + `extractions --only-missing`) sin conversi\u00f3n neta: pass1 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; pass2 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; delta acumulada `downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`, `status404=0`, con `status403/status500` estables. Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-388/reports/senado-status404-global-two-pass-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_conversion_delta_ai_ops_388_20260301T174503Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_no_new_lever_ai_ops_388_20260301T174503Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_retry_packet50_effective_pass1_20260301T172903Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_retry_packet50_effective_pass2_20260301T174503Z.json`.",
        "source_ids": [
          "senado_iniciativas"
        ],
        "scope": "nacional",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida por cohortes WAF del residual global Senado (palanca nueva)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet por cohortes (`legislature/tipo_expediente`) + prioridad `zero-doc`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-389 ejecuta la palanca de cohortes WAF sobre residual global no `linked_to_votes` con export estructurado (`selected_cohorts_total=6`, `zero_doc_priority_total=40`, `packet_rows_total=181`) y replay `packet50` efectivo; resultado con conversi\u00f3n material en una sola pasada: `candidate_urls=50`, `fetched_ok=25`, `failures=25`, `direct_variant_fetched_ok=25`, postproceso completo (`excerpts updated=10`, `extractions upserted=25`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5747->5772` (`+25`), `missing_doc_links_actionable 3615->3590` (`-25`), `missing_urls 3615->3590` (`-25`), `status403 1610->1585` (`-25`), `status500 1599->1586` (`-13`), `status404 326->339` (`+13`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-389/reports/senado-waf-cohort-packet50-pass1-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_cohort_packet_conversion_delta_ai_ops_389_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_cohort_packet_retry_packet50_effective_pass1_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/quality_initiatives_after_pass1_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_block_profile_global_after_pass1_20260301T191912Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=500` en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet accionable `status=500` (`zero-doc`, 1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-390 ejecuta la palanca propuesta, pero la exportaci\u00f3n qued\u00f3 en cola vac\u00eda reproducible (`rows_total=0`, CSV header-only), por lo que `backfill-initiative-documents` no pudo iniciar replay (`--doc-urls-file sin doc_url validas`). Delta KPI nula (`downloaded_doc_links 5772->5772`, `missing_doc_links_actionable 3590->3590`, `missing_urls 3590->3590`, `status500 1586->1586`). Se registra `no_new_lever` para esta lane y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-390/reports/senado-status500-zero-doc-packet-empty-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-390/evidence/senado_status500_zero_doc_conversion_delta_ai_ops_390_20260301T201241Z.json`, `docs/etl/sprints/AI-OPS-390/evidence/senado_status500_zero_doc_no_new_lever_ai_ops_390_20260301T201241Z.json`, `docs/etl/sprints/AI-OPS-390/exports/senado_status500_zero_doc_actionable_packet_20260301T201241Z.csv`, `docs/etl/sprints/AI-OPS-390/exports/senado_status500_zero_doc_actionable_packet50_effective_20260301T201241Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=500` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-391 ejecuta la lane con packet general `status=500` y conversi\u00f3n material en una pasada: export `rows_total=92`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=38`, `archive_hits=38`, `failures=12`; postproceso sem\u00e1ntico cerrado (`extractions upserted=38`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5772->5810` (`+38`), `missing_doc_links_actionable 3590->3552` (`-38`), `missing_urls 3590->3552` (`-38`), `status500 1586->1536` (`-50`), `status403` estable (`1585`), `status404 339->351` (`+12`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-391/reports/senado-status500-general-packet50-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-391/evidence/senado_status500_general_conversion_delta_ai_ops_391_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/quality_initiatives_after_pass1_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/senado_waf_block_profile_global_after_pass1_20260301T201748Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=500` tras delta material",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `packet50` de cola general `status=500` + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-392 ejecuta la segunda pasada de la lane `status=500` general con conversi\u00f3n material: export `rows_total=78`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=31`, `archive_hits=31`, `failures=19`; postproceso estructural completo (`extractions upserted=31`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5810->5841` (`+31`), `missing_doc_links_actionable 3552->3521` (`-31`), `missing_urls 3552->3521` (`-31`), `status500 1536->1486` (`-50`), `status403` estable (`1585`), `status404 351->370` (`+19`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-392/reports/senado-status500-general-packet50-second-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-392/evidence/senado_status500_general_conversion_delta_ai_ops_392_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/quality_initiatives_after_pass1_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/senado_waf_block_profile_global_after_pass1_20260301T212733Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=500` (tercera pasada)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `packet50` de cola general `status=500` + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-393 ejecuta tercera pasada material en lane `status=500` general: export `rows_total=76`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=16`, `archive_hits=16`, `failures=30`; postproceso estructural completo (`extractions upserted=16`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5841->5857` (`+16`), `missing_doc_links_actionable 3521->3505` (`-16`), `missing_urls 3521->3505` (`-16`), `status500 1486->1436` (`-50`), `status403` estable (`1585`), `status404 370->404` (`+34`), `zero_doc_initiatives 1089->1081` (`-8`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-393/reports/senado-status500-general-packet50-third-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-393/evidence/senado_status500_general_conversion_delta_ai_ops_393_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/quality_initiatives_after_pass1_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/senado_waf_block_profile_global_after_pass1_20260301T222141Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` tras reclasificaci\u00f3n desde `status=500`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` general + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-394 ejecuta la lane global `status=404` con packet efectivo (`rows_total=122`, `packet50=50`) y replay sin conversi\u00f3n (`candidate_urls=50`, `fetched_ok=0`, `archive_hits=0`, `failures=30`), manteniendo KPI y buckets estables (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`, `status404=404`, `status403=1585`, `status500=1436`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-394/reports/senado-status404-general-packet50-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_conversion_delta_ai_ops_394_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_no_new_lever_ai_ops_394_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_retry_packet50_effective_pass1_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/quality_initiatives_after_pass1_20260301T230756Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` + `only-initiatives-without-any-doc` (1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-395 ejecuta la lane `status=403 + zero-doc` con packet efectivo (`rows_total=122`, `packet50=50`) y replay sin conversi\u00f3n (`candidate_urls=50`, `fetched_ok=0`, `archive_hits=0`, `failures=30`), manteniendo KPI globales (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`) y reclasificando bucket (`status403 1585->1535`, `status404 404->454`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-395/reports/senado-status403-zero-doc-packet50-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_conversion_delta_ai_ops_395_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_no_new_lever_ai_ops_395_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_retry_packet50_effective_pass1_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/quality_initiatives_after_pass1_20260301T232620Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` + `only-initiatives-without-any-doc` (perfil acotado) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-396 ejecuta la lane `status=404 + zero-doc` con export `rows_total=50` y replay acotado `packet20` (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) en perfil bounded (`--timeout 8`, `--archive-timeout 3`) para evitar loops largos de fallback. KPI y buckets sin cambio (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`, `status403=1535`, `status500=1436`, `status404=454`, `zero_doc_initiatives=1081`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-396/reports/senado-status404-zero-doc-packet20-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_conversion_delta_ai_ops_396_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_no_new_lever_ai_ops_396_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_retry_packet20_effective_pass1_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/quality_initiatives_after_pass1_20260301T235836Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=429` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=429` + `only-initiatives-without-any-doc` (1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-397 ejecuta la lane `status=429 + zero-doc` con packet efectivo (`rows_total=12`, `packet50=12`) y replay limpio (`candidate_urls=12`, `fetched_ok=12`, `archive_hits=0`, `failures=0`), cumpliendo DoD con delta material: `downloaded_doc_links 5857->5869` (`+12`), `missing_doc_links_actionable 3505->3493` (`-12`), `missing_urls 3505->3493` (`-12`), `status429 72->60` (`-12`), `zero_doc_initiatives 1081->1069` (`-12`). Evidencia: `docs/etl/sprints/AI-OPS-397/reports/senado-status429-zero-doc-packet50-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-397/evidence/senado_status429_zero_doc_conversion_delta_ai_ops_397_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/senado_status429_zero_doc_retry_packet50_effective_pass1_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/quality_initiatives_after_pass1_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/senado_waf_block_profile_global_after_pass1_20260302T000725Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=429` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=429` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-398 ejecuta la lane `status=429` general en dos pasadas: pass1 (`rows_total=60`, `packet50=50`, `candidate_urls=50`, `fetched_ok=50`, `failures=0`) y pass2 (`rows_total=10`, `packet10=10`, `candidate_urls=10`, `fetched_ok=10`, `failures=0`), con postproceso estructural cerrado (`extractions needs_review=0`). Delta KPI acumulada: `downloaded_doc_links 5869->5929` (`+60`), `missing_doc_links_actionable 3493->3433` (`-60`), `missing_urls 3493->3433` (`-60`), `status429 60->0`, `zero_doc_initiatives 1069->1069`. DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-398/reports/senado-status429-general-two-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_conversion_delta_ai_ops_398_20260302T001347Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_retry_packet50_effective_pass1_20260302T001210Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_retry_packet50_effective_pass2_20260302T001347Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/quality_initiatives_after_pass2_20260302T001347Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=599` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=599` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-399 ejecuta la lane `status=599` general con packet efectivo (`rows_total=8`, `packet50=8`) y replay limpio (`candidate_urls=8`, `fetched_ok=8`, `archive_hits=0`, `failures=0`), con postproceso estructural cerrado (`extractions needs_review=0`). Delta KPI: `downloaded_doc_links 5929->5937` (`+8`), `missing_doc_links_actionable 3433->3425` (`-8`), `missing_urls 3433->3425` (`-8`), `status599 8->0`, `zero_doc_initiatives 1069->1069`. DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-399/reports/senado-status599-general-packet8-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-399/evidence/senado_status599_general_conversion_delta_ai_ops_399_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/senado_status599_general_retry_packet50_effective_pass1_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/quality_initiatives_after_pass1_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/senado_waf_block_profile_global_after_pass1_20260302T001840Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, refresh post `429/599`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-400 ejecuta la lane `status=500` en perfil acotado por runtime (`rows_total=81`, `packet20=20`) con wrapper `timeout 300`; la pasada termina por tope de tiempo (`backfill_rc=124`) y no produce delta neta de cobertura (`downloaded_doc_links 5937->5937`, `missing_doc_links_actionable 3425->3425`, `missing_urls 3425->3425`, `zero_doc_initiatives 1069->1069`). Se observa reclasificaci\u00f3n de buckets sin conversi\u00f3n (`status500 1490->1474`, `status404 589->602`, `status200 2->5`, `status403` estable `1535`). Se cierra por anti-loop con evidencia expl\u00edcita de timeout/no_delta. Evidencia: `docs/etl/sprints/AI-OPS-400/reports/senado-status500-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-400/evidence/senado_status500_general_conversion_delta_ai_ops_400_20260302T004330Z.json`, `docs/etl/sprints/AI-OPS-400/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T004330Z.rc`, `docs/etl/sprints/AI-OPS-400/evidence/quality_initiatives_after_pass1_20260302T004330Z.json`, `docs/etl/sprints/AI-OPS-400/evidence/senado_waf_block_profile_global_after_pass1_20260302T004330Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, perfil timeboxed)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-401 ejecuta la lane `status=403` en perfil acotado (`rows_total=140`, `packet20=20`) con wrapper `timeout 300`; el replay termina sin conversi\u00f3n (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) y sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). Se observa solo reclasificaci\u00f3n de buckets (`status403 1535->1515`, `status404 519->539`, `status500=1362` estable). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-401/reports/senado-status403-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-401/evidence/senado_status403_general_conversion_delta_ai_ops_401_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/senado_status403_general_retry_packet20_effective_pass1_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/quality_initiatives_after_pass1_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/senado_waf_block_profile_global_after_pass1_20260302T005159Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, perfil timeboxed post no-delta `403`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-402 ejecuta la lane `status=500` en perfil acotado (`rows_total=72`, `packet20=20`) con wrapper `timeout 300`; la pasada termina por timeout (`backfill_rc=124`) y output de retry vac\u00edo (`{}`), sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). Se observa reclasificaci\u00f3n interna (`status500 1362->1355`, `status404 539->546`) con `status403` estable (`1515`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-402/reports/senado-status500-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_conversion_delta_ai_ops_402_20260302T010016Z.json`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T010016Z.json`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T010016Z.rc`, `docs/etl/sprints/AI-OPS-402/evidence/quality_initiatives_after_pass1_20260302T010016Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (cola general accionable, perfil timeboxed post no-delta `500`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-403 ejecuta la lane `status=404` en perfil acotado (`rows_total=122`, `packet20=20`) con wrapper `timeout 300`; replay sin conversi\u00f3n (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) y sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). No hubo reclasificaci\u00f3n de buckets en la muestra ejecutada (`status404=546`, `status403=1515`, `status500=1355`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-403/reports/senado-status404-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-403/evidence/senado_status404_general_conversion_delta_ai_ops_403_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/senado_status404_general_retry_packet20_effective_pass1_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/quality_initiatives_after_pass1_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/senado_waf_block_profile_global_after_pass1_20260302T010931Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-404 ejecuta la lane `status=403` con palanca multi-URL (`rows_total=300`, `packet30=30`) y wrapper `timeout 360`; replay sin conversi\u00f3n (`candidate_urls=30`, `fetched_ok=0`, `archive_hits=0`, `failures=30`) y sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Hubo reclasificaci\u00f3n interna de bucket en el packet (`status403 1515->1485`, `status404 546->576`, `status500=1355`, `status200=0`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-404/reports/senado-status403-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-404/evidence/senado_status403_general_conversion_delta_ai_ops_404_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/senado_status403_general_retry_packet30_effective_pass1_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/quality_initiatives_after_pass1_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/senado_waf_block_profile_global_after_pass1_20260302T011926Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-405 ejecuta la lane `status=500` con palanca multi-URL (`rows_total=192`, `packet30=30`) y wrapper `timeout 360`; la pasada termina con timeout (`backfill_rc=124`) y salida retry vac\u00eda (`0` bytes), sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Se observa reclasificaci\u00f3n interna (`status500 1355->1345`, `status404 576->586`, `status403=1485`, `status200=0`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-405/reports/senado-status500-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-405/evidence/senado_status500_general_conversion_delta_ai_ops_405_20260302T012850Z.json`, `docs/etl/sprints/AI-OPS-405/evidence/senado_status500_general_retry_packet30_effective_pass1_20260302T012850Z.rc`, `docs/etl/sprints/AI-OPS-405/evidence/quality_initiatives_after_pass1_20260302T012850Z.json`, `docs/etl/sprints/AI-OPS-405/evidence/senado_waf_block_profile_global_after_pass1_20260302T012850Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=404` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-406 ejecuta la lane `status=404` con palanca multi-URL (`rows_total=221`, `packet30=30`) y wrapper `timeout 360`; la pasada termina con timeout (`backfill_rc=124`) y salida retry vac\u00eda (`0` bytes), sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Tampoco hubo reclasificaci\u00f3n de buckets en la muestra (`status404 586->586`, `status403 1485->1485`, `status500 1345->1345`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-406/reports/senado-status404-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-406/evidence/senado_status404_general_conversion_delta_ai_ops_406_20260302T014059Z.json`, `docs/etl/sprints/AI-OPS-406/evidence/senado_status404_general_retry_packet30_effective_pass1_20260302T014059Z.rc`, `docs/etl/sprints/AI-OPS-406/evidence/quality_initiatives_after_pass1_20260302T014059Z.json`, `docs/etl/sprints/AI-OPS-406/evidence/senado_waf_block_profile_global_after_pass1_20260302T014059Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, micro-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` con `max-urls-per-initiative=3` + `packet10` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-407 ejecuta la lane en perfil micro-packet (`rows_total=120`, `packet10=10`) y evita timeout (`backfill_rc=0`): replay con `candidate_urls=10`, `fetched_ok=0`, `archive_hits=0`, `failures=10`. Sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`) y reclasificaci\u00f3n interna del packet (`status403 1485->1475`, `status404 586->596`, `status500=1345`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-407/reports/senado-status403-general-micro-packet10-timebox-20260302.md`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_conversion_delta_ai_ops_407_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_retry_packet10_effective_pass1_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_retry_packet10_effective_pass1_20260302T015128Z.rc`, `docs/etl/sprints/AI-OPS-407/evidence/quality_initiatives_after_pass1_20260302T015128Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, micro-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + `packet10` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-414 re-ejecuta la lane `status=500` en perfil micro-packet (`rows_total=12`, `packet10=10`) con wrapper `timeout 180`; la pasada termina en `rc=124` con salida retry vac\u00eda (`retry_output_json_size_bytes=0`) y sin delta neta de cobertura (`downloaded_doc_links 5952->5952`, `missing_doc_links_actionable 3410->3410`, `missing_urls 3410->3410`, `zero_doc_initiatives 1062->1062`). Se observa reclasificaci\u00f3n interna en la muestra (`status500 1341->1337`, `status404 610->614`, `status403=1443`, `status200=16`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-414/reports/senado-status500-general-micro-packet10-timebox-rerun-20260302.md`, `docs/etl/sprints/AI-OPS-414/evidence/senado_status500_general_conversion_delta_ai_ops_414_20260302T024016Z.json`, `docs/etl/sprints/AI-OPS-414/evidence/senado_status500_general_retry_packet10_effective_pass1_20260302T024016Z.rc`, `docs/etl/sprints/AI-OPS-414/evidence/quality_initiatives_after_pass1_20260302T024016Z.json`, `docs/etl/sprints/AI-OPS-414/evidence/senado_waf_block_profile_global_after_pass1_20260302T024016Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Recuperar observabilidad no-vac\u00eda en residual global Senado `status=500` (nano-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-415 ejecuta la lane `status=500` con perfil nano-packet (`limit=60`, `packet5`) y confirma agotamiento de cola accionable en este corte: export `rows_total=0`, packet efectivo `0`, replay con CSV vac\u00edo (`rc=1`, `retry_output_json_size_bytes=0`, `candidate_urls=0`, `fetched_ok=0`). Sin delta neta de cobertura (`downloaded_doc_links 5952->5952`, `missing_doc_links_actionable 3410->3410`, `missing_urls 3410->3410`, `zero_doc_initiatives 1062->1062`) ni movimiento de buckets (`status500=1337`, `status404=614`, `status403=1443`, `status200=16`). Se cierra por anti-loop con evidencia expl\u00edcita de `packet_empty/no_candidates` y se pivota a lane `status=404` con el mismo perfil nano-packet. Evidencia: `docs/etl/sprints/AI-OPS-415/reports/senado-status500-general-nano-packet5-empty-tail-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-415/evidence/senado_status500_general_conversion_delta_ai_ops_415_20260302T024837Z.json`, `docs/etl/sprints/AI-OPS-415/evidence/senado_status500_general_retry_packet5_effective_pass1_20260302T024837Z.rc`, `docs/etl/sprints/AI-OPS-415/evidence/quality_initiatives_after_pass1_20260302T024837Z.json`, `docs/etl/sprints/AI-OPS-415/evidence/senado_waf_block_profile_global_after_pass1_20260302T024837Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n/observabilidad en residual global Senado `status=404` (nano-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` con `max-urls-per-initiative=3` + `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-416 ejecuta la lane `status=404` con perfil nano-packet (`rows_total=30`, `packet5=5`) y logra observabilidad + conversi\u00f3n en una pasada (`rc=0`, `retry_output_json_size_bytes=8166`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5952->5957` (`+5`), `missing_doc_links_actionable 3410->3405` (`-5`), `missing_urls 3410->3405` (`-5`), `status404 614->609` (`-5`), `zero_doc_initiatives 1062->1057` (`-5`). DoD cumplido; se cierra `899` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-416/reports/senado-status404-general-nano-packet5-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_conversion_delta_ai_ops_416_20260302T025125Z.json`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025125Z.json`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025125Z.rc`, `docs/etl/sprints/AI-OPS-416/evidence/quality_initiatives_after_pass1_20260302T025125Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` tras primer nano-packet exitoso",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-417 ejecuta la segunda pasada `status=404` nano-packet (`rows_total=25`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8097`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5145->5150` (`+5`), `missing_doc_links_actionable 3405->3400` (`-5`), `missing_urls 3405->3400` (`-5`), `status404 609->604` (`-5`), `zero_doc_initiatives 1057->1052` (`-5`). DoD cumplido; se cierra `900` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-417/reports/senado-status404-general-nano-packet5-second-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_conversion_delta_ai_ops_417_20260302T025923Z.json`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025923Z.json`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025923Z.rc`, `docs/etl/sprints/AI-OPS-417/evidence/quality_initiatives_after_pass1_20260302T025923Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-418 ejecuta la tercera pasada `status=404` nano-packet (`rows_total=20`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8210`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5150->5155` (`+5`), `missing_doc_links_actionable 3400->3395` (`-5`), `missing_urls 3400->3395` (`-5`), `status404 604->599` (`-5`), `zero_doc_initiatives 1052->1047` (`-5`). DoD cumplido; se cierra `901` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-418/reports/senado-status404-general-nano-packet5-third-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_conversion_delta_ai_ops_418_20260302T030453Z.json`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030453Z.json`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030453Z.rc`, `docs/etl/sprints/AI-OPS-418/evidence/quality_initiatives_after_pass1_20260302T030453Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuarta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-419 ejecuta la cuarta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8092`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5155->5160` (`+5`), `missing_doc_links_actionable 3395->3390` (`-5`), `missing_urls 3395->3390` (`-5`), `status404 599->594` (`-5`), `zero_doc_initiatives 1047->1042` (`-5`). DoD cumplido; se cierra `902` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-419/reports/senado-status404-general-nano-packet5-fourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_conversion_delta_ai_ops_419_20260302T030936Z.json`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030936Z.json`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030936Z.rc`, `docs/etl/sprints/AI-OPS-419/evidence/quality_initiatives_after_pass1_20260302T030936Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quinta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-420 ejecuta la quinta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8122`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5160->5165` (`+5`), `missing_doc_links_actionable 3390->3385` (`-5`), `missing_urls 3390->3385` (`-5`), `status404 594->589` (`-5`), `zero_doc_initiatives 1042->1037` (`-5`). DoD cumplido; se cierra `903` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-420/reports/senado-status404-general-nano-packet5-fifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_conversion_delta_ai_ops_420_20260302T031411Z.json`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031411Z.json`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031411Z.rc`, `docs/etl/sprints/AI-OPS-420/evidence/quality_initiatives_after_pass1_20260302T031411Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-421 ejecuta la sexta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8225`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5165->5170` (`+5`), `missing_doc_links_actionable 3385->3380` (`-5`), `missing_urls 3385->3380` (`-5`), `status404 589->584` (`-5`), `zero_doc_initiatives 1037->1032` (`-5`). DoD cumplido; se cierra `904` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-421/reports/senado-status404-general-nano-packet5-sixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_conversion_delta_ai_ops_421_20260302T031845Z.json`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031845Z.json`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031845Z.rc`, `docs/etl/sprints/AI-OPS-421/evidence/quality_initiatives_after_pass1_20260302T031845Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "S\u00e9ptima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-422 ejecuta la s\u00e9ptima pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8174`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5170->5175` (`+5`), `missing_doc_links_actionable 3380->3375` (`-5`), `missing_urls 3380->3375` (`-5`), `status404 584->579` (`-5`), `zero_doc_initiatives 1032->1027` (`-5`). DoD cumplido; se cierra `905` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-422/reports/senado-status404-general-nano-packet5-seventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_conversion_delta_ai_ops_422_20260302T032310Z.json`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032310Z.json`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032310Z.rc`, `docs/etl/sprints/AI-OPS-422/evidence/quality_initiatives_after_pass1_20260302T032310Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Octava pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-423 ejecuta la octava pasada `status=404` nano-packet (`rows_total=15`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8199`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5175->5180` (`+5`), `missing_doc_links_actionable 3375->3370` (`-5`), `missing_urls 3375->3370` (`-5`), `status404 579->574` (`-5`), `zero_doc_initiatives 1027->1022` (`-5`). DoD cumplido; se cierra `906` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-423/reports/senado-status404-general-nano-packet5-eighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_conversion_delta_ai_ops_423_20260302T032738Z.json`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032738Z.json`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032738Z.rc`, `docs/etl/sprints/AI-OPS-423/evidence/quality_initiatives_after_pass1_20260302T032738Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Novena pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-424 ejecuta la novena pasada `status=404` nano-packet (`rows_total=10`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8107`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5180->5185` (`+5`), `missing_doc_links_actionable 3370->3365` (`-5`), `missing_urls 3370->3365` (`-5`), `status404 574->569` (`-5`), `zero_doc_initiatives 1022->1017` (`-5`). DoD cumplido; se cierra `907` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-424/reports/senado-status404-general-nano-packet5-ninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_conversion_delta_ai_ops_424_20260302T033210Z.json`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033210Z.json`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033210Z.rc`, `docs/etl/sprints/AI-OPS-424/evidence/quality_initiatives_after_pass1_20260302T033210Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (d\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "D\u00e9cima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-425 ejecuta la d\u00e9cima pasada `status=404` nano-packet (`rows_total=5`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8191`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5185->5190` (`+5`), `missing_doc_links_actionable 3365->3360` (`-5`), `missing_urls 3365->3360` (`-5`), `status404 569->564` (`-5`), `zero_doc_initiatives 1017->1012` (`-5`). DoD cumplido; se cierra `908` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-425/reports/senado-status404-general-nano-packet5-tenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_conversion_delta_ai_ops_425_20260302T033629Z.json`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033629Z.json`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033629Z.rc`, `docs/etl/sprints/AI-OPS-425/evidence/quality_initiatives_after_pass1_20260302T033629Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (und\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Und\u00e9cima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "NO_DELTA_WITH_EVIDENCE",
        "bloque": "Done now: YES (sin delta). AI-OPS-426 ejecuta la und\u00e9cima pasada `status=404` nano-packet y confirma agotamiento de cola para este lane (`rows_total=0`, `packet5=0`, solo cabecera en export). Replay vac\u00edo (`rc=1`, `retry_output_json_size_bytes=0`, `candidate_urls=0`, `fetched_ok=0`, `failures=0`) y delta KPI nula (`downloaded_doc_links 5190->5190`, `missing_doc_links_actionable 3360->3360`, `missing_urls 3360->3360`, `status404 564->564`, `zero_doc_initiatives 1012->1012`). DoD no cumplido por `packet_empty/no_candidates`; se cierra `909` como `NO_DELTA_WITH_EVIDENCE` y se pivota a lane `status=403` nano-packet. Evidencia: `docs/etl/sprints/AI-OPS-426/reports/senado-status404-general-nano-packet5-eleventh-pass-empty-tail-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-426/evidence/senado_status404_general_conversion_delta_ai_ops_426_20260302T034058Z.json`, `docs/etl/sprints/AI-OPS-426/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T034058Z.rc`, `docs/etl/sprints/AI-OPS-426/evidence/quality_initiatives_after_pass1_20260302T034058Z.json`, `docs/etl/sprints/AI-OPS-426/evidence/senado_waf_block_profile_global_after_pass1_20260302T034058Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (primer nano-packet tras agotamiento 404)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-427 ejecuta la primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y reabre conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9823`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5190->5195` (`+5`), `missing_doc_links_actionable 3360->3355` (`-5`), `missing_urls 3360->3355` (`-5`), `status403 1443->1438` (`-5`), `zero_doc_initiatives 1012->1012` (`0`). DoD cumplido; se cierra `910` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-427/reports/senado-status403-general-nano-packet5-first-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_conversion_delta_ai_ops_427_20260302T034355Z.json`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034355Z.json`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034355Z.rc`, `docs/etl/sprints/AI-OPS-427/evidence/quality_initiatives_after_pass1_20260302T034355Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-428 ejecuta la segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9082`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5195->5200` (`+5`), `missing_doc_links_actionable 3355->3350` (`-5`), `missing_urls 3355->3350` (`-5`), `status403 1438->1433` (`-5`), `zero_doc_initiatives 1012->1008` (`-4`). DoD cumplido; se cierra `911` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-428/reports/senado-status403-general-nano-packet5-second-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_conversion_delta_ai_ops_428_20260302T034840Z.json`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034840Z.json`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034840Z.rc`, `docs/etl/sprints/AI-OPS-428/evidence/quality_initiatives_after_pass1_20260302T034840Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-429 ejecuta la tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9374`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5200->5205` (`+5`), `missing_doc_links_actionable 3350->3345` (`-5`), `missing_urls 3350->3345` (`-5`), `status403 1433->1428` (`-5`), `zero_doc_initiatives 1008->1004` (`-4`). DoD cumplido; se cierra `912` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-429/reports/senado-status403-general-nano-packet5-third-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_conversion_delta_ai_ops_429_20260302T035307Z.json`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035307Z.json`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035307Z.rc`, `docs/etl/sprints/AI-OPS-429/evidence/quality_initiatives_after_pass1_20260302T035307Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-430 ejecuta la cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9845`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5205->5210` (`+5`), `missing_doc_links_actionable 3345->3340` (`-5`), `missing_urls 3345->3340` (`-5`), `status403 1428->1423` (`-5`), `zero_doc_initiatives 1004->1002` (`-2`). DoD cumplido; se cierra `913` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-430/reports/senado-status403-general-nano-packet5-fourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_conversion_delta_ai_ops_430_20260302T035654Z.json`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035654Z.json`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035654Z.rc`, `docs/etl/sprints/AI-OPS-430/evidence/quality_initiatives_after_pass1_20260302T035654Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-431 ejecuta la quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5210->5215` (`+5`), `missing_doc_links_actionable 3340->3335` (`-5`), `missing_urls 3340->3335` (`-5`), `status403 1423->1418` (`-5`), `zero_doc_initiatives 1002->999` (`-3`). DoD cumplido; se cierra `914` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-431/reports/senado-status403-general-nano-packet5-fifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_conversion_delta_ai_ops_431_20260302T040100Z.json`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040100Z.json`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040100Z.rc`, `docs/etl/sprints/AI-OPS-431/evidence/quality_initiatives_after_pass1_20260302T040100Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-432 ejecuta la sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5215->5220` (`+5`), `missing_doc_links_actionable 3335->3330` (`-5`), `missing_urls 3335->3330` (`-5`), `status403 1418->1413` (`-5`), `zero_doc_initiatives 999->997` (`-2`). DoD cumplido; se cierra `915` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-432/reports/senado-status403-general-nano-packet5-sixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_conversion_delta_ai_ops_432_20260302T040512Z.json`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040512Z.json`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040512Z.rc`, `docs/etl/sprints/AI-OPS-432/evidence/quality_initiatives_after_pass1_20260302T040512Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "S\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-433 ejecuta la s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5220->5225` (`+5`), `missing_doc_links_actionable 3330->3325` (`-5`), `missing_urls 3330->3325` (`-5`), `status403 1413->1408` (`-5`), `zero_doc_initiatives 997->994` (`-3`). DoD cumplido; se cierra `916` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-433/reports/senado-status403-general-nano-packet5-seventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_conversion_delta_ai_ops_433_20260302T040924Z.json`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040924Z.json`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040924Z.rc`, `docs/etl/sprints/AI-OPS-433/evidence/quality_initiatives_after_pass1_20260302T040924Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-434 ejecuta la octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5225->5230` (`+5`), `missing_doc_links_actionable 3325->3320` (`-5`), `missing_urls 3325->3320` (`-5`), `status403 1408->1403` (`-5`), `zero_doc_initiatives 994->992` (`-2`). DoD cumplido; se cierra `917` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-434/reports/senado-status403-general-nano-packet5-eighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_conversion_delta_ai_ops_434_20260302T041328Z.json`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T041328Z.json`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T041328Z.rc`, `docs/etl/sprints/AI-OPS-434/evidence/quality_initiatives_after_pass1_20260302T041328Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-435 ejecuta la novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5235->5240` (`+5`), `missing_doc_links_actionable 3315->3310` (`-5`), `missing_urls 3315->3310` (`-5`), `status403 1398->1393` (`-5`), `zero_doc_initiatives 989->987` (`-2`). DoD cumplido; se cierra `918` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-435/reports/senado-status403-general-nano-packet5-ninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_conversion_delta_ai_ops_435_20260302T042019Z.json`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042019Z.json`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042019Z.rc`, `docs/etl/sprints/AI-OPS-435/evidence/quality_initiatives_after_pass1_20260302T042019Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (d\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "D\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-436 ejecuta la d\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5240->5245` (`+5`), `missing_doc_links_actionable 3310->3305` (`-5`), `missing_urls 3310->3305` (`-5`), `status403 1393->1388` (`-5`), `zero_doc_initiatives 987->984` (`-3`). DoD cumplido; se cierra `919` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-436/reports/senado-status403-general-nano-packet5-tenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_conversion_delta_ai_ops_436_20260302T042505Z.json`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042505Z.json`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042505Z.rc`, `docs/etl/sprints/AI-OPS-436/evidence/quality_initiatives_after_pass1_20260302T042505Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (und\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Und\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-437 ejecuta la und\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10070`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5245->5250` (`+5`), `missing_doc_links_actionable 3305->3300` (`-5`), `missing_urls 3305->3300` (`-5`), `status403 1388->1383` (`-5`), `zero_doc_initiatives 984->982` (`-2`). DoD cumplido; se cierra `920` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-437/reports/senado-status403-general-nano-packet5-eleventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_conversion_delta_ai_ops_437_20260302T042900Z.json`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042900Z.json`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042900Z.rc`, `docs/etl/sprints/AI-OPS-437/evidence/quality_initiatives_after_pass1_20260302T042900Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (duod\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Duod\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-438 ejecuta la duod\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5250->5255` (`+5`), `missing_doc_links_actionable 3300->3295` (`-5`), `missing_urls 3300->3295` (`-5`), `status403 1383->1378` (`-5`), `zero_doc_initiatives 982->980` (`-2`). DoD cumplido; se cierra `921` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-438/reports/senado-status403-general-nano-packet5-twelfth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_conversion_delta_ai_ops_438_20260302T043313Z.json`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043313Z.json`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043313Z.rc`, `docs/etl/sprints/AI-OPS-438/evidence/quality_initiatives_after_pass1_20260302T043313Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimotercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimotercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-439 ejecuta la decimotercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10005`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5255->5260` (`+5`), `missing_doc_links_actionable 3295->3290` (`-5`), `missing_urls 3295->3290` (`-5`), `status403 1378->1373` (`-5`), `zero_doc_initiatives 980->980` (`0`). DoD cumplido; se cierra `922` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-439/reports/senado-status403-general-nano-packet5-thirteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_conversion_delta_ai_ops_439_20260302T043716Z.json`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043716Z.json`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043716Z.rc`, `docs/etl/sprints/AI-OPS-439/evidence/quality_initiatives_after_pass1_20260302T043716Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimocuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimocuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-440 ejecuta la decimocuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5260->5265` (`+5`), `missing_doc_links_actionable 3290->3285` (`-5`), `missing_urls 3290->3285` (`-5`), `status403 1373->1368` (`-5`), `zero_doc_initiatives 980->977` (`-3`). DoD cumplido; se cierra `923` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-440/reports/senado-status403-general-nano-packet5-fourteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_conversion_delta_ai_ops_440_20260302T044117Z.json`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044117Z.json`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044117Z.rc`, `docs/etl/sprints/AI-OPS-440/evidence/quality_initiatives_after_pass1_20260302T044117Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimoquinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimoquinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-441 ejecuta la decimoquinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5265->5270` (`+5`), `missing_doc_links_actionable 3285->3280` (`-5`), `missing_urls 3285->3280` (`-5`), `status403 1368->1363` (`-5`), `zero_doc_initiatives 977->975` (`-2`). DoD cumplido; se cierra `924` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-441/reports/senado-status403-general-nano-packet5-fifteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_conversion_delta_ai_ops_441_20260302T044513Z.json`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044513Z.json`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044513Z.rc`, `docs/etl/sprints/AI-OPS-441/evidence/quality_initiatives_after_pass1_20260302T044513Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimosexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimosexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-442 ejecuta la decimosexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9453`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5270->5275` (`+5`), `missing_doc_links_actionable 3280->3275` (`-5`), `missing_urls 3280->3275` (`-5`), `status403 1363->1358` (`-5`), `zero_doc_initiatives 975->973` (`-2`). DoD cumplido; se cierra `925` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-442/reports/senado-status403-general-nano-packet5-sixteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_conversion_delta_ai_ops_442_20260302T044924Z.json`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044924Z.json`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044924Z.rc`, `docs/etl/sprints/AI-OPS-442/evidence/quality_initiatives_after_pass1_20260302T044924Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimos\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimos\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-443 ejecuta la decimos\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9831`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5275->5280` (`+5`), `missing_doc_links_actionable 3275->3270` (`-5`), `missing_urls 3275->3270` (`-5`), `status403 1358->1353` (`-5`), `zero_doc_initiatives 973->972` (`-1`). DoD cumplido; se cierra `926` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-443/reports/senado-status403-general-nano-packet5-seventeenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_conversion_delta_ai_ops_443_20260302T045313Z.json`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045313Z.json`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045313Z.rc`, `docs/etl/sprints/AI-OPS-443/evidence/quality_initiatives_after_pass1_20260302T045313Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimoctava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimoctava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-444 ejecuta la decimoctava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9788`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5280->5285` (`+5`), `missing_doc_links_actionable 3270->3265` (`-5`), `missing_urls 3270->3265` (`-5`), `status403 1353->1348` (`-5`), `zero_doc_initiatives 972->970` (`-2`). DoD cumplido; se cierra `927` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-444/reports/senado-status403-general-nano-packet5-eighteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_conversion_delta_ai_ops_444_20260302T045700Z.json`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045700Z.json`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045700Z.rc`, `docs/etl/sprints/AI-OPS-444/evidence/quality_initiatives_after_pass1_20260302T045700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimonovena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimonovena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-445 ejecuta la decimonovena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9453`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5285->5290` (`+5`), `missing_doc_links_actionable 3265->3260` (`-5`), `missing_urls 3265->3260` (`-5`), `status403 1348->1343` (`-5`), `zero_doc_initiatives 970->968` (`-2`). DoD cumplido; se cierra `928` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-445/reports/senado-status403-general-nano-packet5-nineteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_conversion_delta_ai_ops_445_20260302T050214Z.json`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050214Z.json`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050214Z.rc`, `docs/etl/sprints/AI-OPS-445/evidence/quality_initiatives_after_pass1_20260302T050214Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-446 ejecuta la vig\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9794`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5290->5295` (`+5`), `missing_doc_links_actionable 3260->3255` (`-5`), `missing_urls 3260->3255` (`-5`), `status403 1343->1338` (`-5`), `zero_doc_initiatives 968->967` (`-1`). DoD cumplido; se cierra `929` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-446/reports/senado-status403-general-nano-packet5-twentieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_conversion_delta_ai_ops_446_20260302T050916Z.json`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050916Z.json`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050916Z.rc`, `docs/etl/sprints/AI-OPS-446/evidence/quality_initiatives_after_pass1_20260302T050916Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-447 ejecuta la vig\u00e9simo primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9850`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=1`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5295->5300` (`+5`), `missing_doc_links_actionable 3255->3250` (`-5`), `missing_urls 3255->3250` (`-5`), `status403 1338->1333` (`-5`), `zero_doc_initiatives 967->965` (`-2`). DoD cumplido; se cierra `930` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-447/reports/senado-status403-general-nano-packet5-twentyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_conversion_delta_ai_ops_447_20260302T051329Z.json`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051329Z.json`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051329Z.rc`, `docs/etl/sprints/AI-OPS-447/evidence/quality_initiatives_after_pass1_20260302T051329Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-448 ejecuta la vig\u00e9simo segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9430`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5300->5305` (`+5`), `missing_doc_links_actionable 3250->3245` (`-5`), `missing_urls 3250->3245` (`-5`), `status403 1333->1328` (`-5`), `zero_doc_initiatives 965->963` (`-2`). DoD cumplido; se cierra `931` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-448/reports/senado-status403-general-nano-packet5-twentysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_conversion_delta_ai_ops_448_20260302T051738Z.json`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051738Z.json`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051738Z.rc`, `docs/etl/sprints/AI-OPS-448/evidence/quality_initiatives_after_pass1_20260302T051738Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-449 ejecuta la vig\u00e9simo tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9821`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5305->5310` (`+5`), `missing_doc_links_actionable 3245->3240` (`-5`), `missing_urls 3245->3240` (`-5`), `status403 1328->1323` (`-5`), `zero_doc_initiatives 963->962` (`-1`). DoD cumplido; se cierra `932` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-449/reports/senado-status403-general-nano-packet5-twentythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_conversion_delta_ai_ops_449_20260302T052153Z.json`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052153Z.json`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052153Z.rc`, `docs/etl/sprints/AI-OPS-449/evidence/quality_initiatives_after_pass1_20260302T052153Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-450 ejecuta la vig\u00e9simo cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9794`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5310->5315` (`+5`), `missing_doc_links_actionable 3240->3235` (`-5`), `missing_urls 3240->3235` (`-5`), `status403 1323->1318` (`-5`), `zero_doc_initiatives 962->960` (`-2`). DoD cumplido; se cierra `933` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-450/reports/senado-status403-general-nano-packet5-twentyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_conversion_delta_ai_ops_450_20260302T052551Z.json`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052551Z.json`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052551Z.rc`, `docs/etl/sprints/AI-OPS-450/evidence/quality_initiatives_after_pass1_20260302T052551Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-451 ejecuta la vig\u00e9simo quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9514`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=1`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5315->5320` (`+5`), `missing_doc_links_actionable 3235->3230` (`-5`), `missing_urls 3235->3230` (`-5`), `status403 1318->1313` (`-5`), `zero_doc_initiatives 960->958` (`-2`). DoD cumplido; se cierra `934` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-451/reports/senado-status403-general-nano-packet5-twentyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_conversion_delta_ai_ops_451_20260302T052956Z.json`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052956Z.json`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052956Z.rc`, `docs/etl/sprints/AI-OPS-451/evidence/quality_initiatives_after_pass1_20260302T052956Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-452 ejecuta la vig\u00e9simo sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9845`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5320->5325` (`+5`), `missing_doc_links_actionable 3230->3225` (`-5`), `missing_urls 3230->3225` (`-5`), `status403 1313->1308` (`-5`), `zero_doc_initiatives 958->957` (`-1`). DoD cumplido; se cierra `935` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-452/reports/senado-status403-general-nano-packet5-twentysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_conversion_delta_ai_ops_452_20260302T053401Z.json`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053401Z.json`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053401Z.rc`, `docs/etl/sprints/AI-OPS-452/evidence/quality_initiatives_after_pass1_20260302T053401Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-453 ejecuta la vig\u00e9simo s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9844`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5325->5330` (`+5`), `missing_doc_links_actionable 3225->3220` (`-5`), `missing_urls 3225->3220` (`-5`), `status403 1308->1303` (`-5`), `zero_doc_initiatives 957->955` (`-2`). DoD cumplido; se cierra `936` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-453/reports/senado-status403-general-nano-packet5-twentyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_conversion_delta_ai_ops_453_20260302T053802Z.json`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053802Z.json`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053802Z.rc`, `docs/etl/sprints/AI-OPS-453/evidence/quality_initiatives_after_pass1_20260302T053802Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-454 ejecuta la vig\u00e9simo octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9480`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5330->5335` (`+5`), `missing_doc_links_actionable 3220->3215` (`-5`), `missing_urls 3220->3215` (`-5`), `status403 1303->1298` (`-5`), `zero_doc_initiatives 955->953` (`-2`). DoD cumplido; se cierra `937` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-454/reports/senado-status403-general-nano-packet5-twentyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_conversion_delta_ai_ops_454_20260302T054316Z.json`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054316Z.json`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054316Z.rc`, `docs/etl/sprints/AI-OPS-454/evidence/quality_initiatives_after_pass1_20260302T054316Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-455 ejecuta la vig\u00e9simo novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9601`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5335->5340` (`+5`), `missing_doc_links_actionable 3215->3210` (`-5`), `missing_urls 3215->3210` (`-5`), `status403 1298->1293` (`-5`), `zero_doc_initiatives 953->952` (`-1`). DoD cumplido; se cierra `938` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-455/reports/senado-status403-general-nano-packet5-twentyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_conversion_delta_ai_ops_455_20260302T054910Z.json`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054910Z.json`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054910Z.rc`, `docs/etl/sprints/AI-OPS-455/evidence/quality_initiatives_after_pass1_20260302T054910Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-456 ejecuta la trig\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9846`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5340->5345` (`+5`), `missing_doc_links_actionable 3210->3205` (`-5`), `missing_urls 3210->3205` (`-5`), `status403 1293->1288` (`-5`), `zero_doc_initiatives 952->950` (`-2`). DoD cumplido; se cierra `939` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-456/reports/senado-status403-general-nano-packet5-thirtieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_conversion_delta_ai_ops_456_20260302T055403Z.json`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055403Z.json`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055403Z.rc`, `docs/etl/sprints/AI-OPS-456/evidence/quality_initiatives_after_pass1_20260302T055403Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-457 ejecuta la trig\u00e9simo primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9458`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=3`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5345->5350` (`+5`), `missing_doc_links_actionable 3205->3200` (`-5`), `missing_urls 3205->3200` (`-5`), `status403 1288->1283` (`-5`), `zero_doc_initiatives 950->948` (`-2`). DoD cumplido; se cierra `940` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-457/reports/senado-status403-general-nano-packet5-thirtyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_conversion_delta_ai_ops_457_20260302T055821Z.json`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055821Z.json`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055821Z.rc`, `docs/etl/sprints/AI-OPS-457/evidence/quality_initiatives_after_pass1_20260302T055821Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-458 ejecuta la trig\u00e9simo segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9596`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=0`, `archive_hits=5`, `archive_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5350->5355` (`+5`), `missing_doc_links_actionable 3200->3195` (`-5`), `missing_urls 3200->3195` (`-5`), `status403 1283->1278` (`-5`), `zero_doc_initiatives 948->947` (`-1`). DoD cumplido; se cierra `941` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-458/reports/senado-status403-general-nano-packet5-thirtysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_conversion_delta_ai_ops_458_20260302T060243Z.json`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060243Z.json`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060243Z.rc`, `docs/etl/sprints/AI-OPS-458/evidence/quality_initiatives_after_pass1_20260302T060243Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-459 ejecuta la trig\u00e9simo tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9852`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5355->5360` (`+5`), `missing_doc_links_actionable 3195->3190` (`-5`), `missing_urls 3195->3190` (`-5`), `status403 1278->1273` (`-5`), `zero_doc_initiatives 947->945` (`-2`). DoD cumplido; se cierra `942` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-459/reports/senado-status403-general-nano-packet5-thirtythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_conversion_delta_ai_ops_459_20260302T060711Z.json`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060711Z.json`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060711Z.rc`, `docs/etl/sprints/AI-OPS-459/evidence/quality_initiatives_after_pass1_20260302T060711Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-460 ejecuta la trig\u00e9simo cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9337`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5360->5365` (`+5`), `missing_doc_links_actionable 3190->3185` (`-5`), `missing_urls 3190->3185` (`-5`), `status403 1273->1268` (`-5`), `zero_doc_initiatives 945->943` (`-2`). DoD cumplido; se cierra `943` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-460/reports/senado-status403-general-nano-packet5-thirtyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_conversion_delta_ai_ops_460_20260302T061141Z.json`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061141Z.json`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061141Z.rc`, `docs/etl/sprints/AI-OPS-460/evidence/quality_initiatives_after_pass1_20260302T061141Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-461 ejecuta la trig\u00e9simo quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9620`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5365->5370` (`+5`), `missing_doc_links_actionable 3185->3180` (`-5`), `missing_urls 3185->3180` (`-5`), `status403 1268->1263` (`-5`), `zero_doc_initiatives 943->942` (`-1`). DoD cumplido; se cierra `944` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-461/reports/senado-status403-general-nano-packet5-thirtyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_conversion_delta_ai_ops_461_20260302T061653Z.json`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061653Z.json`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061653Z.rc`, `docs/etl/sprints/AI-OPS-461/evidence/quality_initiatives_after_pass1_20260302T061653Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-462 ejecuta la trig\u00e9simo sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9733`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=2`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5370->5375` (`+5`), `missing_doc_links_actionable 3180->3175` (`-5`), `missing_urls 3180->3175` (`-5`), `status403 1263->1258` (`-5`), `zero_doc_initiatives 942->940` (`-2`). DoD cumplido; se cierra `945` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-462/reports/senado-status403-general-nano-packet5-thirtysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_conversion_delta_ai_ops_462_20260302T062232Z.json`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062232Z.json`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062232Z.rc`, `docs/etl/sprints/AI-OPS-462/evidence/quality_initiatives_after_pass1_20260302T062232Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-463 ejecuta la trig\u00e9simo s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9427`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=1`, `archive_hits=5`, `archive_fetched_ok=4`). Delta KPI material: `downloaded_doc_links 5375->5380` (`+5`), `missing_doc_links_actionable 3175->3170` (`-5`), `missing_urls 3175->3170` (`-5`), `status403 1258->1253` (`-5`), `zero_doc_initiatives 940->938` (`-2`). DoD cumplido; se cierra `946` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-463/reports/senado-status403-general-nano-packet5-thirtyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_conversion_delta_ai_ops_463_20260302T062707Z.json`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062707Z.json`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062707Z.rc`, `docs/etl/sprints/AI-OPS-463/evidence/quality_initiatives_after_pass1_20260302T062707Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-464 ejecuta la trig\u00e9simo octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9730`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5380->5385` (`+5`), `missing_doc_links_actionable 3170->3165` (`-5`), `missing_urls 3170->3165` (`-5`), `status403 1253->1248` (`-5`), `zero_doc_initiatives 938->937` (`-1`). DoD cumplido; se cierra `947` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-464/reports/senado-status403-general-nano-packet5-thirtyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_conversion_delta_ai_ops_464_20260302T063122Z.json`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063122Z.json`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063122Z.rc`, `docs/etl/sprints/AI-OPS-464/evidence/quality_initiatives_after_pass1_20260302T063122Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-465 ejecuta la trig\u00e9simo novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9778`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5385->5390` (`+5`), `missing_doc_links_actionable 3165->3160` (`-5`), `missing_urls 3165->3160` (`-5`), `status403 1248->1243` (`-5`), `zero_doc_initiatives 937->935` (`-2`). DoD cumplido; se cierra `948` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-465/reports/senado-status403-general-nano-packet5-thirtyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_conversion_delta_ai_ops_465_20260302T063543Z.json`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063543Z.json`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063543Z.rc`, `docs/etl/sprints/AI-OPS-465/evidence/quality_initiatives_after_pass1_20260302T063543Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-466 ejecuta la cuadrag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9492`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5390->5395` (`+5`), `missing_doc_links_actionable 3160->3155` (`-5`), `missing_urls 3160->3155` (`-5`), `status403 1243->1238` (`-5`), `zero_doc_initiatives 935->933` (`-2`). DoD cumplido; se cierra `949` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-466/reports/senado-status403-general-nano-packet5-fortieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_conversion_delta_ai_ops_466_20260302T063959Z.json`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063959Z.json`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063959Z.rc`, `docs/etl/sprints/AI-OPS-466/evidence/quality_initiatives_after_pass1_20260302T063959Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-467 ejecuta la cuadrag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9717`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5395->5400` (`+5`), `missing_doc_links_actionable 3155->3150` (`-5`), `missing_urls 3155->3150` (`-5`), `status403 1238->1233` (`-5`), `zero_doc_initiatives 933->932` (`-1`). DoD cumplido; se cierra `950` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-467/reports/senado-status403-general-nano-packet5-fortyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_conversion_delta_ai_ops_467_20260302T064418Z.json`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064418Z.json`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064418Z.rc`, `docs/etl/sprints/AI-OPS-467/evidence/quality_initiatives_after_pass1_20260302T064418Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-468 ejecuta la cuadrag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9764`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5400->5405` (`+5`), `missing_doc_links_actionable 3150->3145` (`-5`), `missing_urls 3150->3145` (`-5`), `status403 1233->1228` (`-5`), `zero_doc_initiatives 932->930` (`-2`). DoD cumplido; se cierra `951` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-468/reports/senado-status403-general-nano-packet5-fortysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_conversion_delta_ai_ops_468_20260302T064833Z.json`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064833Z.json`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064833Z.rc`, `docs/etl/sprints/AI-OPS-468/evidence/quality_initiatives_after_pass1_20260302T064833Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-469 ejecuta la cuadrag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9330`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5405->5410` (`+5`), `missing_doc_links_actionable 3145->3140` (`-5`), `missing_urls 3145->3140` (`-5`), `status403 1228->1223` (`-5`), `zero_doc_initiatives 930->928` (`-2`). DoD cumplido; se cierra `952` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-469/reports/senado-status403-general-nano-packet5-fortythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_conversion_delta_ai_ops_469_20260302T065252Z.json`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065252Z.json`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065252Z.rc`, `docs/etl/sprints/AI-OPS-469/evidence/quality_initiatives_after_pass1_20260302T065252Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-470 ejecuta la cuadrag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9804`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5410->5415` (`+5`), `missing_doc_links_actionable 3140->3135` (`-5`), `missing_urls 3140->3135` (`-5`), `status403 1223->1218` (`-5`), `zero_doc_initiatives 928->927` (`-1`). DoD cumplido; se cierra `953` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-470/reports/senado-status403-general-nano-packet5-fortyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_conversion_delta_ai_ops_470_20260302T065700Z.json`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065700Z.json`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065700Z.rc`, `docs/etl/sprints/AI-OPS-470/evidence/quality_initiatives_after_pass1_20260302T065700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-471 ejecuta la cuadrag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9804`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5415->5420` (`+5`), `missing_doc_links_actionable 3135->3130` (`-5`), `missing_urls 3135->3130` (`-5`), `status403 1218->1213` (`-5`), `zero_doc_initiatives 927->925` (`-2`). DoD cumplido; se cierra `954` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-471/reports/senado-status403-general-nano-packet5-fortyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_conversion_delta_ai_ops_471_20260302T070235Z.json`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T070235Z.json`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T070235Z.rc`, `docs/etl/sprints/AI-OPS-471/evidence/quality_initiatives_after_pass1_20260302T070235Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-472 ejecuta la cuadrag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9811`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=2`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5420->5425` (`+5`), `missing_doc_links_actionable 3130->3125` (`-5`), `missing_urls 3130->3125` (`-5`), `status403 1213->1208` (`-5`), `zero_doc_initiatives 925->923` (`-2`). DoD cumplido; se cierra `955` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-472/reports/senado-status403-general-nano-packet5-fortysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_conversion_delta_ai_ops_472_20260302T090358Z.json`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090358Z.json`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090358Z.rc`, `docs/etl/sprints/AI-OPS-472/evidence/quality_initiatives_after_pass1_20260302T090358Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-473 ejecuta la cuadrag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9847`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5425->5430` (`+5`), `missing_doc_links_actionable 3125->3120` (`-5`), `missing_urls 3125->3120` (`-5`), `status403 1208->1203` (`-5`), `zero_doc_initiatives 923->921` (`-2`). DoD cumplido; se cierra `956` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-473/reports/senado-status403-general-nano-packet5-fortyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_conversion_delta_ai_ops_473_20260302T090859Z.json`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090859Z.json`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090859Z.rc`, `docs/etl/sprints/AI-OPS-473/evidence/quality_initiatives_after_pass1_20260302T090859Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-474 ejecuta la cuadrag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10119`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5430->5435` (`+5`), `missing_doc_links_actionable 3120->3115` (`-5`), `missing_urls 3120->3115` (`-5`), `status403 1203->1198` (`-5`), `zero_doc_initiatives 921->919` (`-2`). DoD cumplido; se cierra `957` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-474/reports/senado-status403-general-nano-packet5-fortyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_conversion_delta_ai_ops_474_20260302T091317Z.json`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091317Z.json`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091317Z.rc`, `docs/etl/sprints/AI-OPS-474/evidence/quality_initiatives_after_pass1_20260302T091317Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-475 ejecuta la cuadrag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9784`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5435->5440` (`+5`), `missing_doc_links_actionable 3115->3110` (`-5`), `missing_urls 3115->3110` (`-5`), `status403 1198->1193` (`-5`), `zero_doc_initiatives 919->916` (`-3`). DoD cumplido; se cierra `958` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-475/reports/senado-status403-general-nano-packet5-fortyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_conversion_delta_ai_ops_475_20260302T091726Z.json`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091726Z.json`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091726Z.rc`, `docs/etl/sprints/AI-OPS-475/evidence/quality_initiatives_after_pass1_20260302T091726Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-476 ejecuta la quincuag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9585`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5440->5445` (`+5`), `missing_doc_links_actionable 3110->3105` (`-5`), `missing_urls 3110->3105` (`-5`), `status403 1193->1188` (`-5`), `zero_doc_initiatives 916->914` (`-2`). DoD cumplido; se cierra `959` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-476/reports/senado-status403-general-nano-packet5-fiftieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_conversion_delta_ai_ops_476_20260302T092209Z.json`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092209Z.json`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092209Z.rc`, `docs/etl/sprints/AI-OPS-476/evidence/quality_initiatives_after_pass1_20260302T092209Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-477 ejecuta la quincuag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10070`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5445->5450` (`+5`), `missing_doc_links_actionable 3105->3100` (`-5`), `missing_urls 3105->3100` (`-5`), `status403 1188->1183` (`-5`), `zero_doc_initiatives 914->912` (`-2`). DoD cumplido; se cierra `960` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-477/reports/senado-status403-general-nano-packet5-fiftyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_conversion_delta_ai_ops_477_20260302T092636Z.json`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092636Z.json`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092636Z.rc`, `docs/etl/sprints/AI-OPS-477/evidence/quality_initiatives_after_pass1_20260302T092636Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-478 ejecuta la quincuag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9808`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5450->5455` (`+5`), `missing_doc_links_actionable 3100->3095` (`-5`), `missing_urls 3100->3095` (`-5`), `status403 1183->1178` (`-5`), `zero_doc_initiatives 912->909` (`-3`). DoD cumplido; se cierra `961` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-478/reports/senado-status403-general-nano-packet5-fiftysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_conversion_delta_ai_ops_478_20260302T093107Z.json`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093107Z.json`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093107Z.rc`, `docs/etl/sprints/AI-OPS-478/evidence/quality_initiatives_after_pass1_20260302T093107Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-479 ejecuta la quincuag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10076`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5455->5460` (`+5`), `missing_doc_links_actionable 3095->3090` (`-5`), `missing_urls 3095->3090` (`-5`), `status403 1178->1173` (`-5`), `zero_doc_initiatives 909->907` (`-2`). DoD cumplido; se cierra `962` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-479/reports/senado-status403-general-nano-packet5-fiftythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_conversion_delta_ai_ops_479_20260302T093541Z.json`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093541Z.json`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093541Z.rc`, `docs/etl/sprints/AI-OPS-479/evidence/quality_initiatives_after_pass1_20260302T093541Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-480 ejecuta la quincuag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9750`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5460->5465` (`+5`), `missing_doc_links_actionable 3090->3085` (`-5`), `missing_urls 3090->3085` (`-5`), `status403 1173->1168` (`-5`), `zero_doc_initiatives 907->904` (`-3`). DoD cumplido; se cierra `963` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-480/reports/senado-status403-general-nano-packet5-fiftyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_conversion_delta_ai_ops_480_20260302T094017Z.json`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094017Z.json`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094017Z.rc`, `docs/etl/sprints/AI-OPS-480/evidence/quality_initiatives_after_pass1_20260302T094017Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-481 ejecuta la quincuag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10048`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5465->5470` (`+5`), `missing_doc_links_actionable 3085->3080` (`-5`), `missing_urls 3085->3080` (`-5`), `status403 1168->1163` (`-5`), `zero_doc_initiatives 904->902` (`-2`). DoD cumplido; se cierra `964` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-481/reports/senado-status403-general-nano-packet5-fiftyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_conversion_delta_ai_ops_481_20260302T094444Z.json`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094444Z.json`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094444Z.rc`, `docs/etl/sprints/AI-OPS-481/evidence/quality_initiatives_after_pass1_20260302T094444Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-482 ejecuta la quincuag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10147`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5470->5475` (`+5`), `missing_doc_links_actionable 3080->3075` (`-5`), `missing_urls 3080->3075` (`-5`), `status403 1163->1158` (`-5`), `zero_doc_initiatives 902->901` (`-1`). DoD cumplido; se cierra `965` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-482/reports/senado-status403-general-nano-packet5-fiftysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_conversion_delta_ai_ops_482_20260302T094950Z.json`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094950Z.json`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094950Z.rc`, `docs/etl/sprints/AI-OPS-482/evidence/quality_initiatives_after_pass1_20260302T094950Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-483 ejecuta la quincuag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10030`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5475->5480` (`+5`), `missing_doc_links_actionable 3075->3070` (`-5`), `missing_urls 3075->3070` (`-5`), `status403 1158->1153` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `966` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-483/reports/senado-status403-general-nano-packet5-fiftyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_conversion_delta_ai_ops_483_20260302T100006Z.json`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T100006Z.json`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T100006Z.rc`, `docs/etl/sprints/AI-OPS-483/evidence/quality_initiatives_after_pass1_20260302T100006Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-484 ejecuta la quincuag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9981`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5480->5485` (`+5`), `missing_doc_links_actionable 3070->3065` (`-5`), `missing_urls 3070->3065` (`-5`), `status403 1153->1148` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `967` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-484/reports/senado-status403-general-nano-packet5-fiftyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_conversion_delta_ai_ops_484_20260302T101708Z.json`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T101708Z.json`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T101708Z.rc`, `docs/etl/sprints/AI-OPS-484/evidence/quality_initiatives_after_pass1_20260302T101708Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-485 ejecuta la quincuag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10065`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5485->5490` (`+5`), `missing_doc_links_actionable 3065->3060` (`-5`), `missing_urls 3065->3060` (`-5`), `status403 1148->1143` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `968` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-485/reports/senado-status403-general-nano-packet5-fiftyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_conversion_delta_ai_ops_485_20260302T102001Z.json`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T102001Z.json`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T102001Z.rc`, `docs/etl/sprints/AI-OPS-485/evidence/quality_initiatives_after_pass1_20260302T102001Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-486 ejecuta la sexag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` para evitar cuelgues del replay monol\u00edtico, mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1397`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=4`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`) y cierra tambi\u00e9n el gap de estructuraci\u00f3n (`downloaded_missing_extraction=0`). Delta KPI material: `downloaded_doc_links 5490->5495` (`+5`), `missing_doc_links_actionable 3060->3054` (`-6`), `missing_urls 3060->3054` (`-6`), `status403 1143->1138` (`-5`), `status404 564->563` (`-1`), `status500 1337->1337` (`0`), `zero_doc_initiatives 901->900` (`-1`). DoD cumplido; se cierra `969` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-486/reports/senado-status403-general-nano-packet5-sixtieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-486/evidence/senado_status403_general_conversion_delta_ai_ops_486_20260302T103750Z.json`, `docs/etl/sprints/AI-OPS-486/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T103750Z.json`, `docs/etl/sprints/AI-OPS-486/evidence/quality_initiatives_after_pass1_20260302T103750Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima primera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-487 ejecuta la sexag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=3`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5495->5500` (`+5`), `missing_doc_links_actionable 3054->3049` (`-5`), `missing_urls 3054->3049` (`-5`), `status403 1138->1133` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->900` (`0`). DoD cumplido; se cierra `970` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-487/reports/senado-status403-general-nano-packet5-sixtyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-487/evidence/senado_status403_general_conversion_delta_ai_ops_487_20260302T105643Z.json`, `docs/etl/sprints/AI-OPS-487/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T105643Z.json`, `docs/etl/sprints/AI-OPS-487/evidence/quality_initiatives_after_pass1_20260302T105643Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima segunda pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-488 ejecuta la sexag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=4`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5500->5505` (`+5`), `missing_doc_links_actionable 3049->3044` (`-5`), `missing_urls 3049->3044` (`-5`), `status403 1133->1128` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->900` (`0`). DoD cumplido; se cierra `971` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-488/reports/senado-status403-general-nano-packet5-sixtysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-488/evidence/senado_status403_general_conversion_delta_ai_ops_488_20260302T110048Z.json`, `docs/etl/sprints/AI-OPS-488/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110048Z.json`, `docs/etl/sprints/AI-OPS-488/evidence/quality_initiatives_after_pass1_20260302T110048Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima tercera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-489 ejecuta la sexag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=1`, `direct_variant_fetched_ok=4`). Delta KPI material: `downloaded_doc_links 5505->5510` (`+5`), `missing_doc_links_actionable 3044->3039` (`-5`), `missing_urls 3044->3039` (`-5`), `status403 1128->1123` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->899` (`-1`). DoD cumplido; se cierra `972` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-489/reports/senado-status403-general-nano-packet5-sixtythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-489/evidence/senado_status403_general_conversion_delta_ai_ops_489_20260302T110417Z.json`, `docs/etl/sprints/AI-OPS-489/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110417Z.json`, `docs/etl/sprints/AI-OPS-489/evidence/quality_initiatives_after_pass1_20260302T110417Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima cuarta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-490 ejecuta la sexag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5510->5515` (`+5`), `missing_doc_links_actionable 3039->3034` (`-5`), `missing_urls 3039->3034` (`-5`), `status403 1123->1118` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `973` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-490/reports/senado-status403-general-nano-packet5-sixtyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-490/evidence/senado_status403_general_conversion_delta_ai_ops_490_20260302T110721Z.json`, `docs/etl/sprints/AI-OPS-490/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110721Z.json`, `docs/etl/sprints/AI-OPS-490/evidence/quality_initiatives_after_pass1_20260302T110721Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima quinta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-491 ejecuta la sexag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5515->5520` (`+5`), `missing_doc_links_actionable 3034->3029` (`-5`), `missing_urls 3034->3029` (`-5`), `status403 1118->1113` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `974` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-491/reports/senado-status403-general-nano-packet5-sixtyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-491/evidence/senado_status403_general_conversion_delta_ai_ops_491_20260302T111137Z.json`, `docs/etl/sprints/AI-OPS-491/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T111137Z.json`, `docs/etl/sprints/AI-OPS-491/evidence/quality_initiatives_after_pass1_20260302T111137Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima sexta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-492 ejecuta la sexag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5520->5525` (`+5`), `missing_doc_links_actionable 3029->3024` (`-5`), `missing_urls 3029->3024` (`-5`), `status403 1113->1108` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `975` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-492/reports/senado-status403-general-nano-packet5-sixtysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-492/evidence/senado_status403_general_conversion_delta_ai_ops_492_20260302T111538Z.json`, `docs/etl/sprints/AI-OPS-492/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T111538Z.json`, `docs/etl/sprints/AI-OPS-492/evidence/quality_initiatives_after_pass1_20260302T111538Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-493 ejecuta la sexag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5525->5530` (`+5`), `missing_doc_links_actionable 3024->3019` (`-5`), `missing_urls 3024->3019` (`-5`), `status403 1108->1103` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `976` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-493/reports/senado-status403-general-nano-packet5-sixtyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-493/evidence/senado_status403_general_conversion_delta_ai_ops_493_20260302T112042Z.json`, `docs/etl/sprints/AI-OPS-493/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112042Z.json`, `docs/etl/sprints/AI-OPS-493/evidence/quality_initiatives_after_pass1_20260302T112042Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima octava pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-494 ejecuta la sexag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5530->5535` (`+5`), `missing_doc_links_actionable 3019->3014` (`-5`), `missing_urls 3019->3014` (`-5`), `status403 1103->1098` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->898` (`-1`). DoD cumplido; se cierra `977` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-494/reports/senado-status403-general-nano-packet5-sixtyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-494/evidence/senado_status403_general_conversion_delta_ai_ops_494_20260302T112358Z.json`, `docs/etl/sprints/AI-OPS-494/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112358Z.json`, `docs/etl/sprints/AI-OPS-494/evidence/quality_initiatives_after_pass1_20260302T112358Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima novena pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-495 ejecuta la sexag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5535->5540` (`+5`), `missing_doc_links_actionable 3014->3009` (`-5`), `missing_urls 3014->3009` (`-5`), `status403 1098->1093` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 898->896` (`-2`). DoD cumplido; se cierra `978` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-495/reports/senado-status403-general-nano-packet5-sixtyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-495/evidence/senado_status403_general_conversion_delta_ai_ops_495_20260302T112815Z.json`, `docs/etl/sprints/AI-OPS-495/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112815Z.json`, `docs/etl/sprints/AI-OPS-495/evidence/quality_initiatives_after_pass1_20260302T112815Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-496 ejecuta la septuag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5540->5545` (`+5`), `missing_doc_links_actionable 3009->3004` (`-5`), `missing_urls 3009->3004` (`-5`), `status403 1093->1088` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 896->894` (`-2`). DoD cumplido; se cierra `979` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-496/reports/senado-status403-general-nano-packet5-seventieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-496/evidence/senado_status403_general_conversion_delta_ai_ops_496_20260302T113837Z.json`, `docs/etl/sprints/AI-OPS-496/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T113837Z.json`, `docs/etl/sprints/AI-OPS-496/evidence/quality_initiatives_after_pass1_20260302T113837Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima primera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-497 ejecuta la septuag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5545->5550` (`+5`), `missing_doc_links_actionable 3004->2999` (`-5`), `missing_urls 3004->2999` (`-5`), `status403 1088->1083` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 894->892` (`-2`). DoD cumplido; se cierra `980` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-497/reports/senado-status403-general-nano-packet5-seventyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-497/evidence/senado_status403_general_conversion_delta_ai_ops_497_20260302T114304Z.json`, `docs/etl/sprints/AI-OPS-497/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T114304Z.json`, `docs/etl/sprints/AI-OPS-497/evidence/quality_initiatives_after_pass1_20260302T114304Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima segunda pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-498 ejecuta la septuag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5550->5555` (`+5`), `missing_doc_links_actionable 2999->2994` (`-5`), `missing_urls 2999->2994` (`-5`), `status403 1083->1078` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 892->890` (`-2`). DoD cumplido; se cierra `981` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-498/reports/senado-status403-general-nano-packet5-seventysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-498/evidence/senado_status403_general_conversion_delta_ai_ops_498_20260302T114700Z.json`, `docs/etl/sprints/AI-OPS-498/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T114700Z.json`, `docs/etl/sprints/AI-OPS-498/evidence/quality_initiatives_after_pass1_20260302T114700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima tercera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "TODO",
        "bloque": "Estado base post AI-OPS-498: `missing_doc_links_actionable=2994`, `status404=563`, `status500=1337`, `status403=1078`, `status200=16`, `zero_doc_initiatives=890`. Palanca siguiente: repetir lane `status=403` con el mismo perfil nano-packet y ejecuci\u00f3n `serial_per_url_recovery` para sostener conversi\u00f3n incremental sin cuelgues. DoD: `retry_output_json_size_bytes > 0` y `candidate_urls > 0`; adem\u00e1s `downloaded_doc_links +1` o `missing_doc_links_actionable -1`. Siguiente comando: repetir la receta de `AI-OPS-498` (export `limit 60` + `packet5` + replay por URL + backfill limitado de excerpts/extractions).",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      }
    ],
    "unmapped": [
      {
        "tipo_dato": "Normativa auton\u00f3mica (piloto 3 CCAA)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOCM (Madrid) + DOGC (Catalunya) + BOJA (Andaluc\u00eda)",
        "estado": "TODO",
        "bloque": "Falta conector y modelo can\u00f3nico de normas auton\u00f3micas (con efectos) con trazabilidad y dedupe por versi\u00f3n",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
        "dominio": "Dinero",
        "fuentes_objetivo": "Portales presupuestarios auton\u00f3micos / IGAE cuando aplique",
        "estado": "TODO",
        "bloque": "Falta conector y crosswalk de clasificaciones; preferir ejecuci\u00f3n cuando exista",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Publicacion abierta de snapshots ETL",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Hugging Face Datasets (dataset publico)",
        "estado": "DONE",
        "bloque": "Done now: YES. Snapshot p\u00fablico reproducible disponible en HF con paquete por fecha (`snapshots/<snapshot_date>/`) que incluye `published/*`, `manifest.json`, `checksums.sha256`, `latest.json` y Parquet navegable; por privacidad se excluyen por defecto `raw_fetches,run_fetches,source_records,lost_and_found` y `politicos-es.sqlite.gz` queda desactivado salvo override expl\u00edcito. Slice AI-OPS-28: el empaquetador ahora propaga `quality_report` (desde `votaciones-kpis`) a `manifest.json`, `latest.json` y `README.md`; publicaci\u00f3n real ejecutada el 2026-02-22 con verificaci\u00f3n remota en `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_latest_post_publish_20260222T184735Z.json`, `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_manifest_post_publish_20260222T184743Z.json`, `docs/etl/sprints/AI-OPS-28/evidence/hf_remote_readme_post_publish_20260222T184749Z.md`. Hardening adicional: gate remoto reproducible `just etl-verify-hf-quality` (script `scripts/verify_hf_snapshot_quality.py`) valida consistencia de `quality_report` y deja JSON de evidencia (`docs/etl/sprints/AI-OPS-28/evidence/hf_remote_quality_verify_20260222T185350Z.json`); adem\u00e1s `just etl-publish-hf*` exige `quality_report` por defecto (`HF_REQUIRE_QUALITY_REPORT=1`, flag `--require-quality-report`) con evidencia de dry-run `docs/etl/sprints/AI-OPS-28/evidence/hf_publish_dryrun_require_quality_20260222T185920Z.txt`. CI hook: `.github/workflows/etl-tracker-gate.yml` a\u00f1ade job `hf-quality-contract` (push `main`) que ejecuta verificaci\u00f3n remota y sube artifact JSON. Comando: `just etl-publish-hf` (dry-run: `just etl-publish-hf-dry-run`, verify: `just etl-verify-hf-quality`). Siguiente comando: `SNAPSHOT_DATE=2026-02-12 just etl-publish-hf-verify`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Convocatorias y estado electoral",
        "dominio": "Electoral",
        "fuentes_objetivo": "Junta Electoral Central",
        "estado": "TODO",
        "bloque": "Falta scraper y normalizacion",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Normativa por fragmento (articulo/disposicion/anexo)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE (texto consolidado + versiones)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 cre\u00f3 la base reproducible `legal_norms` + `legal_norm_fragments` (`8` normas, `8` fragmentos). Slice AI-OPS-155 a\u00f1ade lineage normativo por versi\u00f3n/fecha con `legal_norm_lineage_edges` (`lineage_hints_total=8`, `lineage_edges_total=8`, `norms_with_lineage=8/8`, `lineage_primary_evidence_coverage_pct=1.0`), incluyendo alta autom\u00e1tica de `4` normas relacionadas referenciadas (`legal_norms_total=12`) en DB real (`status=ok`, `fk_violations_total=0`). Evidencia: `docs/etl/sprints/AI-OPS-155/reports/sanction-norms-lineage-seed-lane.md`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_import_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_status_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sqlite_fk_check_20260224T000533Z.json`. Falta backfill BOE continuo a cobertura completa por `articulo/disposicion/anexo` y lineage hist\u00f3rico multi-versi\u00f3n (sin dependencia de semilla cerrada). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-24 just parl-sanction-norms-seed-pipeline`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Responsabilidad por fragmento normativo",
        "dominio": "Legal",
        "fuentes_objetivo": "Congreso/Senado (iniciativas+enmiendas+votos) + BOE (firma/promulgacion)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Cadena base por fragmento activada (`15` responsabilidades/`8` fragmentos), migraci\u00f3n documental `seed->non-seed` cerrada (`queue_rows_total=0`) y evidencia multipista operativa (`boe_publicacion`, `senado_diario`, `congreso_vote`, `senado_vote`, `other`). AI-OPS-167 cerr\u00f3 ejecuci\u00f3n al `100%` (`responsibilities_with_execution_evidence_total=15/15`). AI-OPS-168/169/170 elevaron cobertura parlamentaria-voto hasta `13/15`; AI-OPS-171 a\u00f1adi\u00f3 fallback conservador de t\u00edtulo LISOS (`title_rule:lisos_orden_social`) en `scripts/backfill_sanction_norms_parliamentary_evidence.py` y cerr\u00f3 cobertura parlamentaria a `15/15`, manteniendo voto en `13/15` (`responsibility_parliamentary_coverage_pct=1.0`, `responsibility_parliamentary_vote_coverage_pct=0.866667`, `responsibility_evidence_items_total=99`) con `execution=15/15`, `queue_rows_total=0` y `fk_violations_total=0`. Evidencia: `docs/etl/sprints/AI-OPS-170/reports/sanction-norms-vote-lineage-mixed-bridge-closure.md`, `docs/etl/sprints/AI-OPS-171/reports/sanction-norms-parliamentary-title-rule-closure.md`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_vote_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_seed_status_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/responsibility_parliamentary_vote_gap_20260224T094041Z.csv`, `docs/etl/sprints/AI-OPS-171/evidence/sqlite_fk_check_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_sanction_norms_seed_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_liberty_restrictions_20260224T094041Z.txt`. Gap residual: voto en `2` responsabilidades (`BOE-A-2000-15060`: `approve/enforce`, con `has_parliamentary_any=1` y `has_vote=0`). Falta adem\u00e1s escalar se\u00f1ales procedimentales desde piloto semilla a datos revisores oficiales (TEAR/TEAC/contencioso/defensores). Siguiente comando: `DB_PATH=<db> SANCTION_NORMS_VOTE_EVIDENCE_ROLES=approve,propose,enforce,delegate just parl-backfill-sanction-norms-vote-evidence && DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Regulacion delegada y enforcement de organismos (DGT y similares)",
        "dominio": "Ejecutivo",
        "fuentes_objetivo": "BOE habilitaciones + reglamentos/ordenes + actos de organismo",
        "estado": "DONE",
        "bloque": "Done now: YES. Cierre operativo consolidado en AI-OPS-305: se sincroniza la seed can\u00f3nica (`etl/data/seeds/liberty_delegated_enforcement_seed_v1.json`) con decisiones aprobadas de lanes previas (AI-OPS-288 + AI-OPS-292 + AI-OPS-293), se reimporta en DB principal y se endurece la observabilidad de cola (`report_liberty_delegated_person_window_queue.py`) con dedupe por `fragment_id` m\u00e1s reciente (`--dedupe-fragment-latest`, default true) y excepci\u00f3n expl\u00edcita para actor no nominativo aprobado (`approved_non_nominative_unit_from_*`) validado por QA manual en AI-OPS-294. Resultado real en `etl/data/staging/politicos-es.db`: cola estricta `max_actionable_rows=0` pasa (`status=ok`, `actionable_queue_rows=0`, `rc=0`; delta `8->0`), gate de enforcement delegado en verde (`parl-check-liberty-delegated-enforcement-gate rc=0`, `gate.passed=true`, coberturas `target_fragment=1.0`, `designated_actor=1.0`, `enforcement_evidence=0.9375`), y paridad tracker limpia (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-305/reports/liberty-delegated-queue-closure-and-seed-sync-20260228.md`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_person_window_queue_strict_after_import_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_person_window_queue_strict_delta_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/liberty_delegated_enforcement_status_latest.json`, `docs/etl/sprints/AI-OPS-305/evidence/just_parl_check_liberty_delegated_enforcement_gate_rc_latest.txt`, `docs/etl/sprints/AI-OPS-305/evidence/tracker_status_latest.log`, `docs/etl/sprints/AI-OPS-305/evidence/unittest_liberty_delegated_seed_sync_stack_latest.txt`. Siguiente comando: `DB_PATH=<db> LIBERTY_DELEGATED_PERSON_QUEUE_MAX_ACTIONABLE_ROWS=0 just parl-check-liberty-delegated-person-window-queue && DB_PATH=<db> just parl-check-liberty-delegated-enforcement-gate`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cola accionable persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "`liberty_delegated_enforcement_links` + seeds BOE + reporte de cola",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-277 cierra slice operativo de remediaci\u00f3n para la fila de regulaci\u00f3n delegada con contrato reproducible de cola accionable: nuevo script `scripts/report_liberty_delegated_person_window_queue.py`, test `tests/test_report_liberty_delegated_person_window_queue.py` y wiring en `justfile` (`parl-report/check-liberty-delegated-person-window-queue`). Corrida real en staging (`etl/data/staging/politicos-es.db`): `status=ok` con `actionable_queue_rows=8` y razones (`missing_designated_actor=2`, `institutional_designated_actor=6`, `missing_enforcement_evidence_date=1`), export CSV `8` filas (`docs/etl/sprints/AI-OPS-277/exports/liberty_delegated_person_window_queue_latest.csv`). Fail-path contractual validado con `max_actionable_rows=0`: `status=degraded`, `strict_fail_reasons=[actionable_rows_above_threshold]`, `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-277/reports/liberty-delegated-person-window-actionable-queue-closure-20260228.md`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_latest.json`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_fail_latest.json`, `docs/etl/sprints/AI-OPS-277/evidence/liberty_delegated_person_window_queue_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-277/evidence/unittest_liberty_delegated_person_window_queue_latest.txt`. Siguiente comando: `DB_PATH=<db> LIBERTY_DELEGATED_PERSON_QUEUE_MAX_ACTIONABLE_ROWS=<target> just parl-check-liberty-delegated-person-window-queue`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Loop review/apply de cola persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "CSV de revisi\u00f3n + apply validado de seed delegada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-278 cierra el loop operativo encima de la cola AI-OPS-277: nuevo exportador `scripts/export_liberty_delegated_person_window_review_queue.py` (CSV revisable con campos `decision/reviewed_*`) y aplicador `scripts/apply_liberty_delegated_person_window_reviews.py` (apply con validaci\u00f3n de fechas/ventana y `validate_seed`), con wiring en `justfile` (`parl-export-liberty-delegated-person-window-review-queue`, `parl-check-liberty-delegated-person-window-review-queue-actionable-empty`, `parl-apply-liberty-delegated-person-window-reviews`) y tests `tests/test_export_liberty_delegated_person_window_review_queue.py` + `tests/test_apply_liberty_delegated_person_window_reviews.py`. Corrida real en staging (`etl/data/staging/politicos-es.db`): export `rows_total=8`, `actionable_rows_total=8`, `missing_seed_links_total=0`; fail-path contractual `strict-empty-actionable` devuelve `rc=4`; apply dry-run sobre CSV exportado deja `rows_seen=8`, `rows_with_decision=0`, `updated_rows=0`, `validation.valid=true`. Evidencia: `docs/etl/sprints/AI-OPS-278/reports/liberty-delegated-person-window-review-apply-loop-closure-20260228.md`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_queue_latest.json`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_queue_actionable_empty_rc_latest.txt`, `docs/etl/sprints/AI-OPS-278/evidence/liberty_delegated_person_window_review_apply_dry_run_latest.json`, `docs/etl/sprints/AI-OPS-278/evidence/unittest_liberty_delegated_review_loop_latest.txt`, `docs/etl/sprints/AI-OPS-278/exports/liberty_delegated_person_window_review_queue_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/apply_liberty_delegated_person_window_reviews.py --seed etl/data/seeds/liberty_delegated_enforcement_seed_v1.json --in <review_csv_con_decisiones> --seed-out <seed_out_json> --out <apply_out_json>`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cola priorizada de scraping persona/cargo en regulacion delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "`liberty_delegated_enforcement_links` + cola review + export de targets",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-279 cierra un slice de ejecuci\u00f3n controlable para acelerar cierre de backlog en delegaci\u00f3n: nuevo exportador `scripts/export_liberty_delegated_person_window_scrape_targets.py` que transforma la cola accionable/review en objetivos de scraping priorizados (`priority_score/priority_rank`) y paquetizados por instituci\u00f3n (`packet_key`), con queries operativas (`search_query_primary/search_query_secondary`) y goal expl\u00edcito por fila (`scrape_goal`). Wiring en `justfile`: `parl-export-liberty-delegated-person-window-scrape-targets` y `parl-check-liberty-delegated-person-window-scrape-targets` + variables `LIBERTY_DELEGATED_SCRAPE_TARGETS_*`; test a\u00f1adido `tests/test_export_liberty_delegated_person_window_scrape_targets.py`. Corrida real en staging (`etl/data/staging/politicos-es.db`): `targets_total=8`, `packets_total=4`, `top_priority_score=65`, `lowest_priority_score=30`, distribuci\u00f3n `{aeat:3, inspeccion-de-trabajo-y-seguridad-social:2, dgt:2, delegaciones-subdelegaciones-del-gobierno:1}`. Gate estricto validado: pass con `strict_min_targets=1`; fail-path contractual con `strict_min_targets=20` devuelve `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-279/reports/liberty-delegated-person-window-scrape-targets-lane-20260228.md`, `docs/etl/sprints/AI-OPS-279/evidence/liberty_delegated_person_window_scrape_targets_latest.json`, `docs/etl/sprints/AI-OPS-279/evidence/liberty_delegated_person_window_scrape_targets_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-279/evidence/unittest_liberty_delegated_scrape_targets_latest.txt`, `docs/etl/sprints/AI-OPS-279/exports/liberty_delegated_person_window_scrape_targets_latest.csv`. Siguiente comando: `DB_PATH=<db> just parl-export-liberty-delegated-person-window-scrape-targets && DB_PATH=<db> LIBERTY_DELEGATED_SCRAPE_TARGETS_STRICT_MIN_TARGETS=<target> just parl-check-liberty-delegated-person-window-scrape-targets`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Candidatos BOE de nombramiento para cola delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "Buscador BOE (`redirector.php` + `boe.php`) sobre targets priorizados",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-280 cierra un slice de scraping/procesado estructurado encima de AI-OPS-279: nuevo script `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` que consulta BOE por variantes de query (incluyendo expansi\u00f3n de acr\u00f3nimos `AEAT/DGT/ITSS`), parsea resultados (`li.resultado-busqueda`) y exporta candidatos con contrato reproducible (`candidate_boe_id`, `candidate_doc_url`, `candidate_publication_date`, `candidate_department`, `candidate_title`, `candidate_person_hint`, `query_variant`, `candidate_score`). Wiring en `justfile`: `parl-scrape-liberty-delegated-person-window-boe-candidates` y `parl-check-liberty-delegated-person-window-boe-candidates`; test a\u00f1adido `tests/test_scrape_liberty_delegated_person_window_boe_candidates.py`. Corrida real: `targets_total=8`, `targets_with_results_total=8`, `candidate_rows_total=40`, `candidate_unique_boe_ids_total=25`, `http_errors_total=0`; gate estricto pass (`strict_min_candidates=1`) y fail-path contractual validado (`strict_min_candidates=9999`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-280/reports/liberty-delegated-person-window-boe-candidates-lane-20260228.md`, `docs/etl/sprints/AI-OPS-280/evidence/liberty_delegated_person_window_boe_candidates_latest.json`, `docs/etl/sprints/AI-OPS-280/evidence/liberty_delegated_person_window_boe_candidates_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-280/evidence/unittest_liberty_delegated_boe_candidates_latest.txt`, `docs/etl/sprints/AI-OPS-280/exports/liberty_delegated_person_window_boe_candidates_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/scrape_liberty_delegated_person_window_boe_candidates.py --targets-csv docs/etl/sprints/AI-OPS-279/exports/liberty_delegated_person_window_scrape_targets_latest.csv --strict-min-candidates <target> --out <candidates_csv> --summary-out <summary_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Asistencia de revisi\u00f3n desde candidatos BOE (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Review queue + candidatos BOE + scoring de relevancia",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-281 cierra el tramo de limpieza/estructuraci\u00f3n entre scraping y apply: nuevo script `scripts/export_liberty_delegated_person_window_review_assist_from_boe_candidates.py` que une `review_queue` y `boe_candidates` por `link_key`, filtra por score, normaliza fechas (`candidate_publication_date_iso`), calcula se\u00f1ales de matching (`role_token_overlap`, `institution_token_overlap`) y exporta sugerencias `suggested_reviewed_*` con `candidate_relevance_bucket`/`autofill_confidence` para revisi\u00f3n humana. Wiring en `justfile`: `parl-export-liberty-delegated-person-window-review-assist` y `parl-check-liberty-delegated-person-window-review-assist`; test a\u00f1adido `tests/test_export_liberty_delegated_person_window_review_assist_from_boe_candidates.py`. Corrida real: `assist_rows_total=15`, `review_links_with_candidates_total=5`, `review_links_without_candidates_total=3`, `relevance_bucket_counts={strong:0, medium:15, weak:0}`; gate estricto pass (`strict_min_assist_rows=1`) y fail-path contractual validado (`min_candidate_score=80`, `max_candidates_per_link=1`, `assist_rows_total=0`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-281/reports/liberty-delegated-person-window-review-assist-lane-20260228.md`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_latest.json`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_fail_latest.json`, `docs/etl/sprints/AI-OPS-281/evidence/liberty_delegated_person_window_review_assist_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-281/exports/liberty_delegated_person_window_review_assist_latest.csv`, `docs/etl/sprints/AI-OPS-281/evidence/unittest_liberty_delegated_review_assist_latest.txt`. Siguiente comando: `PYTHONPATH=. python3 scripts/export_liberty_delegated_person_window_review_assist_from_boe_candidates.py --review-queue-csv docs/etl/sprints/AI-OPS-278/exports/liberty_delegated_person_window_review_queue_latest.csv --boe-candidates-csv docs/etl/sprints/AI-OPS-280/exports/liberty_delegated_person_window_boe_candidates_latest.csv --strict-min-assist-rows <target> --out <assist_csv> --summary-out <assist_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Autorrevisi\u00f3n asistida + apply parcial de seed delegada",
        "dominio": "Derechos",
        "fuentes_objetivo": "Review queue + assist BOE + apply seed",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-282 cierra un slice controlable de procesamiento/limpieza entre asistencia y aplicaci\u00f3n: nuevo script `scripts/export_liberty_delegated_person_window_auto_review_decisions.py` transforma `review_queue + review_assist` en CSV de decisiones conservadoras (`approved` solo con campos requeridos por raz\u00f3n), con wiring en `justfile` (`parl-export/check-liberty-delegated-person-window-auto-review-decisions`) y test `tests/test_export_liberty_delegated_person_window_auto_review_decisions.py`; adem\u00e1s se refina extracci\u00f3n BOE en `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` para patrones `nombramiento como ... de don/do\u00f1a` y limpieza de puntuaci\u00f3n. Corrida real (latest tras rerun reproducible): `rows_total=8`, `approved_rows_total=8`, `pending_rows_total=0`, `updated_rows=8`, `validation.valid=true`; gate estricto pass (`strict_min_approved_rows=1`) y fail-path contractual validado (`strict_min_approved_rows=9`, `rc=4`); replay before/after de cola en DB temporal cierra backlog (`actionable_queue_rows 8->0`, `delta=-8`). Evidencia: `docs/etl/sprints/AI-OPS-282/reports/liberty-delegated-person-window-auto-review-apply-lane-20260228.md`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_person_window_auto_review_decisions_latest.json`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_person_window_auto_review_apply_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_auto_review_delta_latest.json`, `docs/etl/sprints/AI-OPS-282/evidence/liberty_delegated_auto_review_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-282/exports/liberty_delegated_person_window_auto_review_decisions_latest.csv`. Siguiente comando: `PYTHONPATH=. python3 scripts/export_liberty_delegated_person_window_auto_review_decisions.py --review-queue-csv <review_queue_csv> --review-assist-csv <review_assist_csv> --strict-min-approved-rows <target> --out <decisions_csv> --summary-out <summary_json> && PYTHONPATH=. python3 scripts/apply_liberty_delegated_person_window_reviews.py --seed etl/data/seeds/liberty_delegated_enforcement_seed_v1.json --in <decisions_csv> --seed-out <seed_out_json> --out <apply_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre de cola delegada por scoring institucional expandido",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE candidates scoring + assist/apply replay",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-283 cierra el backlog residual de la cola delegada ajustando el matching institucional en `scripts/scrape_liberty_delegated_person_window_boe_candidates.py` (tokens de instituci\u00f3n + expansi\u00f3n de acr\u00f3nimos `AEAT/DGT/ITSS`), elevando cobertura de candidatos por enlace y permitiendo cierre completo del loop. Corrida real: `review_links_with_candidates_total=8/8`, `assist_rows_total=24`, auto-review `approved_rows_total=8`, apply `updated_rows=8`, `validation.valid=true`; replay before/after: `actionable_queue_rows 8->0` (`delta=-8`). Evidencia: `docs/etl/sprints/AI-OPS-283/reports/liberty-delegated-person-window-score-expansion-and-queue-closure-20260228.md`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_ai_ops_283_summary_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_before_auto_review_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_after_auto_review_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/liberty_delegated_person_window_queue_auto_review_delta_latest.json`, `docs/etl/sprints/AI-OPS-283/evidence/unittest_liberty_delegated_boe_scoring_latest.txt`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_review_assist.log`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_auto_check.log`, `docs/etl/sprints/AI-OPS-283/evidence/AI-OPS-283_e2e_tmp_apply.log`. Siguiente comando: `DB_PATH=<db_replay> PYTHONPATH=. python3 scripts/report_liberty_delegated_person_window_queue.py --db <db_replay> --max-actionable-rows 0 --strict --out <queue_json>`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "QA manual de precisi\u00f3n para decisiones auto-aprobadas (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Muestra de `auto_review_decisions` + validaci\u00f3n humana de cargo/persona",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-284 cierra el control manual muestral con `n=8` en muestra estratificada por instituci\u00f3n (`AEAT=3`, `DGT=2`, `ITSS=2`, `Delegaciones/Subdelegaciones=1`) y decisi\u00f3n fila a fila (`confirm/reject`) sobre `cargo/persona`. Resultado observado: `reviewed_rows_total=8`, `confirm_total=2`, `reject_total=6`, `observed_precision_pct=25.0`, sin decisiones inv\u00e1lidas (`invalid_decision_total=0`). Se a\u00f1ade contrato reproducible con scripts `export_liberty_delegated_person_window_auto_review_qa_sample.py` y `report_liberty_delegated_person_window_auto_review_qa_precision.py` + targets `just` (`parl-export/report/check-liberty-delegated-person-window-auto-review-qa-*`). Evidencia: `docs/etl/sprints/AI-OPS-284/reports/liberty-delegated-auto-review-manual-qa-precision-20260228.md`, `docs/etl/sprints/AI-OPS-284/exports/liberty_delegated_person_window_auto_review_qa_sample_latest.csv`, `docs/etl/sprints/AI-OPS-284/evidence/liberty_delegated_person_window_auto_review_qa_sample_latest.json`, `docs/etl/sprints/AI-OPS-284/evidence/liberty_delegated_person_window_auto_review_qa_precision_latest.json`, `docs/etl/sprints/AI-OPS-284/evidence/unittest_liberty_delegated_auto_review_qa_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Endurecimiento de auto-review delegado por alineaci\u00f3n de cargo",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` + `review_assist` (`role_token_overlap`) + reglas de exclusi\u00f3n sem\u00e1ntica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-285 cierra el hardening del auto-review con reglas expl\u00edcitas de alineaci\u00f3n sem\u00e1ntica de cargo y jerarqu\u00eda (`Direcci\u00f3n General` no acepta `Subdirecci\u00f3n`), usando `role_token_overlap`/`institution_token_overlap` solo como soporte y degradando a `pending` los casos ambiguos. Resultado del lane: `approved_rows_total=2`, `pending_rows_total=6`, `rows_missing_role_alignment_total=6` (desde `8 approved / 0 pending` previo), con fail-path contractual de cantidad aprobada (`strict_min_approved_rows=3`, `rc=4`). El gate recurrente de precisi\u00f3n sobre filas efectivamente aprobadas (`decision_scope=approved`) pasa en estricto con `observed_precision_pct=100.0` (`2/2`, umbral `90.0`) y fail-path validado (`min_precision_pct=101`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-285/reports/liberty-delegated-auto-review-role-alignment-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_decisions_role_aligned_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_fail_latest.json`, `docs/etl/sprints/AI-OPS-285/evidence/liberty_delegated_person_window_auto_review_qa_precision_role_aligned_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-285/evidence/unittest_liberty_delegated_role_alignment_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Resoluci\u00f3n manual de pendientes tras hardening de cargo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` role-aligned (`pending=6`) + revisi\u00f3n humana focalizada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-286 cierra el loop operativo de pendientes con una cola manual reproducible (`export_liberty_delegated_pending_resolution_review_queue.py`) que estructura por fila pendiente: raz\u00f3n de bloqueo (`pending_reason`), shortlist de candidatos (`top_candidates_json`) y queries de captura dirigida. Sobre esa cola se registran decisiones expl\u00edcitas fila a fila (`decision=pending` en `6/6` revisadas) y se aplica el CSV con contrato validado (`rows_with_decision=6`, `pending_rows=6`, `updated_rows=0`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-286/reports/liberty-delegated-pending-resolution-review-loop-20260228.md`, `docs/etl/sprints/AI-OPS-286/exports/liberty_delegated_pending_resolution_review_queue_latest.csv`, `docs/etl/sprints/AI-OPS-286/exports/liberty_delegated_pending_resolution_reviews_latest.csv`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_review_queue_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_summary_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/liberty_delegated_pending_resolution_apply_latest.json`, `docs/etl/sprints/AI-OPS-286/evidence/unittest_liberty_delegated_pending_resolution_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura dirigida de evidencia oficial para pendientes delegados (cargo exacto)",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + boletines/instituciones delegadas (`DGT/AEAT/ITSS`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-287/288 cierra la mayor parte del backlog (`pending 6 -> 2`); AI-OPS-292 resuelve el pendiente DGT por alias sem\u00e1ntico de subdirecci\u00f3n tem\u00e1tica y AI-OPS-293 cierra el residual no nominativo AEAT con fallback institucional conservador, dejando el lane en `pending_rows_total=0`. Evidencia: `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_replay_delta_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura alternativa institucional para pendientes delegados (fuera BOE buscador)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Portales de nombramientos/transparencia DGT/AEAT/ITSS + BOE doc directo",
        "estado": "DONE",
        "bloque": "Done now: YES. Lane alternativa consolidada: AI-OPS-289 crea `alternative_capture_targets`, AI-OPS-291 endurece variantes de query BOE y AI-OPS-293 re-ejecuta sobre residual no nominativo (`pending_links_total=1`, `target_rows_total=11`, `candidate_rows_total=6`, `links_with_candidates_total=1/1`) con salida reproducible y gates contractuales activos. Evidencia: `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_targets_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_boe_candidates_latest.json`, `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Aplicaci\u00f3n y replay de evidencia alternativa capturada (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Targets alternativos AI-OPS-289 + revisi\u00f3n/apply + rerun `auto_review`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-292 deja el replay en `pending=1` y AI-OPS-293 cierra el loop completo con fallback institucional no nominativo opt-in: `pending_rows_total 1 -> 0`, `approved_with_non_nominative_actor_fallback_total=1`, `pending_resolution_rows_total=0`, apply sobre seed derivado con `updated_rows=1` y `validation.valid=true`; fail-path contractual validado (`strict_min_approved_rows=2`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_alternative_capture_replay_delta_latest.json`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Regla sem\u00e1ntica para cargos/unidades procedimentales sin titular nominal (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "`auto_review_decisions` + normalizaci\u00f3n de rol (`procedural_unit`/`role_topic`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-292 define y valida la regla sem\u00e1ntica conservadora pendiente: (1) alias expl\u00edcito para subdirecci\u00f3n tem\u00e1tica DGT (`Subdirecci\u00f3n de Gesti\u00f3n de Sanciones` <-> `Subdirector General de Normativa/Legislaci\u00f3n y Recursos` en DGT), y (2) clasificaci\u00f3n expl\u00edcita de casos no nominativos como `procedural_unit_non_nominative_requires_manual` sin auto-aprobaci\u00f3n. Resultado real en replay alternativo: `approved_rows_total 0 -> 1`, `pending_rows_total 2 -> 1`, manteniendo gates (`strict_min_approved_rows=2`, `rc=4`) y apply v\u00e1lido (`updated_rows=1`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-292/reports/liberty-delegated-semantic-alias-and-residual-closure-20260228.md`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_pending_resolution_review_queue_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-292/evidence/unittest_liberty_delegated_auto_review_semantic_alias_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Resoluci\u00f3n del residual no nominativo (unidad procedimental AEAT)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Revisi\u00f3n manual focalizada + criterio institucional reproducible",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-293 cierra el residual con pol\u00edtica reproducible de fallback institucional no nominativo en `auto_review_decisions` (`--allow-non-nominative-institutional-actor-fallback`), restringida por se\u00f1al sem\u00e1ntica de delegaci\u00f3n de competencias + `institution_overlap>=3`. Resultado: actor revisado `Unidad procedimental sancionadora (AEAT)`, fecha de evidencia `2010-03-27`, `pending_rows_total=0`, apply v\u00e1lido (`updated_rows=1`, `validation.valid=true`). Evidencia: `docs/etl/sprints/AI-OPS-293/reports/liberty-delegated-non-nominative-fallback-closure-20260228.md`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_decisions_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/liberty_delegated_person_window_auto_review_apply_alternative_latest.json`, `docs/etl/sprints/AI-OPS-293/evidence/unittest_liberty_delegated_non_nominative_fallback_latest.txt`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "QA manual de precisi\u00f3n del fallback no nominativo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Muestra focalizada de filas `approved_non_nominative_unit`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-294 cierra el guardrail con muestra focalizada reproducible (`--review-note-contains approved_non_nominative_unit`) sobre la salida AI-OPS-293, adjudicaci\u00f3n manual `confirm` en `1/1` filas y reporte estricto de precisi\u00f3n (`reviewed_rows_total=1`, `confirm_total=1`, `observed_precision_pct=100.0`, `strict_fail_reasons=[]`). Se valida fail-path contractual (`min_precision_pct=101`, `rc=4`) y se endurece trazabilidad QA corrigiendo parse de `review_note` no nominativo en el sampler (`approved_non_nominative_unit_from_*`). Evidencia: `docs/etl/sprints/AI-OPS-294/reports/liberty-delegated-non-nominative-fallback-manual-qa-20260228.md`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_sample_latest.json`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_precision_latest.json`, `docs/etl/sprints/AI-OPS-294/evidence/liberty_delegated_non_nominative_auto_review_qa_precision_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-294/evidence/unittest_liberty_delegated_non_nominative_auto_review_qa_latest.txt`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Trigger autom\u00e1tico de QA para fallback no nominativo (delegaci\u00f3n)",
        "dominio": "Derechos",
        "fuentes_objetivo": "Gate recurrente sobre `approved_with_non_nominative_actor_fallback_total`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-295 cierra el gap operativo con gate reusable `scripts/report_liberty_delegated_non_nominative_qa_gate.py` + wiring en `justfile` (`parl-report/check-liberty-delegated-non-nominative-qa-gate`) e integraci\u00f3n en `parl-liberty-restrictions-pipeline`: si `approved_with_non_nominative_actor_fallback_total=0` no exige QA; si `>0` exige evidencia focalizada (`qa_sample_summary` + `qa_precision_report`) con filtros/umbrales expl\u00edcitos (`review_note_contains`, `min_reviewed_rows`, `min_precision_pct`) y fail-fast estricto (`rc=4`). Corrida real sobre AI-OPS-293/294: `status=ok`, `qa_required=true`, `sample_rows_total=1`, `reviewed_rows_total=1`, `observed_precision_pct=100.0`; fail-path contractual validado (`min_precision_pct=101`, `rc=4`). Evidencia: `docs/etl/sprints/AI-OPS-295/reports/liberty-delegated-non-nominative-qa-trigger-gate-20260228.md`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_latest.json`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_fail_latest.json`, `docs/etl/sprints/AI-OPS-295/evidence/liberty_delegated_non_nominative_qa_gate_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-295/evidence/just_parl_check_liberty_delegated_non_nominative_qa_gate_latest.txt`, `docs/etl/sprints/AI-OPS-295/evidence/unittest_liberty_delegated_non_nominative_qa_gate_latest.txt`. Siguiente comando: `just parl-check-liberty-delegated-non-nominative-qa-gate`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Hardening anti-ruido institucional en candidatos delegados",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE buscador (`redirector.php`) + scoring de `review_assist`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-288 endurece el procesamiento de candidatos con normalizaci\u00f3n `fold` (acentos), expansi\u00f3n de acr\u00f3nimos institucionales (`AEAT/DGT/ITSS`) en `institution_token_overlap` y guardrail m\u00ednimo por instituci\u00f3n (`institution_overlap_min`, reforzado para ITSS), adem\u00e1s de `recommended_action=inspect_candidate_low_institution_overlap` para baja afinidad. Resultado en corrida real: `rows_below_institution_overlap_min_total=11`, `approved_rows_total 2 -> 6`, `pending_rows_total 6 -> 2`. Evidencia: `docs/etl/sprints/AI-OPS-288/reports/liberty-delegated-review-assist-anti-noise-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-288/evidence/liberty_delegated_person_window_review_assist_targeted_latest.json`, `docs/etl/sprints/AI-OPS-288/evidence/liberty_delegated_targeted_capture_delta_latest.json`, `docs/etl/sprints/AI-OPS-288/evidence/unittest_liberty_delegated_targeted_queries_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Carga regulatoria agraria (ranking impacto)",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE + EUR-Lex + MAPA/MITECO + OPA (ASAJA/COAG/UPA)",
        "estado": "TODO",
        "bloque": "Falta modelo reproducible para ranking `top_regulaciones_mas_gravosas` por agricultura/ganaderia (coste de cumplimiento, sanciones, horas administrativas, alcance territorial, litigios) con metodolog\u00eda y pesos expl\u00edcitos",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dossiers de impacto regulatorio agrario (piloto)",
        "dominio": "Legal",
        "fuentes_objetivo": "SIEX/CUE + PAC + nitratos/suelos + planes hidrol\u00f3gicos + LESPRE lobo + medicamentos veterinarios",
        "estado": "TODO",
        "bloque": "Falta publicar fichas comparables por norma (qu\u00e9 exige, a qui\u00e9n afecta, qu\u00e9 sanciona, qu\u00e9 alivios posteriores hubo, qui\u00e9n decidi\u00f3 cada cambio) con drill-down a evidencia primaria",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cuellos de botella regulatorios en vivienda nueva (suelo/licencias)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "TRLSRU + leyes urban\u00edsticas CCAA + ordenanzas municipales + Ley 21/2013",
        "estado": "TODO",
        "bloque": "Falta mapa reproducible de plazos y bloqueos por fase (`planeamiento -> urbanizaci\u00f3n -> licencia -> obra`) con evidencia normativa y administrativa por territorio",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Regulaci\u00f3n de alquiler y efecto en nueva oferta (build-to-rent/promoci\u00f3n)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "Ley 12/2023 + normativa auton\u00f3mica de zonas tensionadas + fiscalidad asociada",
        "estado": "TODO",
        "bloque": "Falta evaluaci\u00f3n trazable de impacto en oferta nueva (visados/inicios/terminadas por tipolog\u00eda y provincia) y cadena de decisi\u00f3n por norma/fragmento",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Dossiers de normas que m\u00e1s frenan vivienda (piloto top-N)",
        "dominio": "Vivienda",
        "fuentes_objetivo": "Suelo/urbanismo + evaluaci\u00f3n ambiental + CTE + reservas VPO + informes sectoriales",
        "estado": "TODO",
        "bloque": "Falta publicar ranking `top_normas_cuello_botella_vivienda` con metodolog\u00eda expl\u00edcita (plazo, coste, litigiosidad, incertidumbre) y drill-down a art\u00edculos concretos",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Gasto sanitario: personal vs \"gasto vistoso\" (equipamiento/obras/consultoria/conciertos)",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Presupuestos y liquidaciones CCAA + Ministerio de Sanidad + IGAE",
        "estado": "TODO",
        "bloque": "Falta modelo comparable por CCAA y programa para medir sustituci\u00f3n de gasto asistencial de plantilla por cap\u00edtulos de capital/externos, con series temporales y notas metodol\u00f3gicas",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Contratacion sanitaria de alto importe y sobrecostes",
        "dominio": "Sanidad",
        "fuentes_objetivo": "PLACSP + portales auton\u00f3micos + OCEX/Tribunal de Cuentas",
        "estado": "TODO",
        "bloque": "Falta pipeline para detectar expedientes sanitarios con modificados, pr\u00f3rrogas, revisiones de precio y retrasos, con trazabilidad `organo -> mesa -> adjudicatario -> ejecuci\u00f3n`",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Responsabilidad del gasto sanitario (decision vs ejecuci\u00f3n)",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ley de presupuestos + acuerdos de gobierno CCAA + nombramientos + expedientes de gasto",
        "estado": "TODO",
        "bloque": "Falta cadena reproducible `presupuesto -> centro gestor -> cargo designado -> expediente -> pago -> resultado asistencial` para atribuir qui\u00e9n propuso, aprob\u00f3, ejecut\u00f3 y fiscaliz\u00f3",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Impacto asistencial del mix de gasto sanitario",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ministerio/CCAA (listas de espera, plantilla, AP/hospitalaria) + presupuestos",
        "estado": "TODO",
        "bloque": "Falta unir decisiones de gasto con outcomes (`espera`, `cobertura de plantilla`, `actividad`) para separar mala gesti\u00f3n de shocks de demanda",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Normas con m\u00e1s sanciones a ciudadan\u00eda (ranking top-N)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT + ayuntamientos (movilidad/ORA/ZBE) + AEAT + TGSS + Interior (LO 4/2015)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 publica ranking reproducible `top_normas_sancion_ciudadana` desde `sanction_volume_observations` con metodolog\u00eda expl\u00edcita (`expediente_count` + `importe_total_eur`, proxy `incidence_per_1000_observed_cases`) y `status=ok` en reporte operativo. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta pasar de datos piloto a series reales por territorio y completar incidencia por `1.000 habitantes` (denominador poblacional). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dossiers de normas sancionadoras de alta incidencia (piloto top-N)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "Tr\u00e1fico/movilidad + tributario/SS + seguridad ciudadana + ordenanzas c\u00edvicas/residuos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 publica `norm_dossiers` (`5` fichas) con `conducta` (tipolog\u00edas), `volumen`, `importe`, `base legal` (`norma -> fragmentos`) y lanes de evidencia (`source_lanes`/enlaces municipales) en `report_sanction_volume_pilot_status.py`. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta enriquecer perfil afectado y sustituir valores piloto por observaciones oficiales recurrentes por fuente/periodo. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-volume-pilot-status`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Catalogo v1 de marcos sancionadores frecuentes (base legal exacta)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "RDL 6/2015 (Tr\u00e1fico) + RD 320/1994 + LGT 58/2003 + RD 2063/2004 + LGSS/LISOS + LO 4/2015 + ordenanzas municipales",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 publica cat\u00e1logo operativo en `sanction_norm_catalog` + `sanction_norm_fragment_links` con `8` marcos iniciales (BOE IDs semilla), `organismo_competente`, hip\u00f3tesis de incidencia y `evidence_required_json`; import reproducible y validado con tests. Evidencia: `docs/etl/sprints/AI-OPS-115/reports/sanction-norms-seed-lane.md`, `docs/etl/sprints/AI-OPS-115/evidence/sanction_norms_seed_import_20260223T173448Z.json`, `docs/etl/sprints/AI-OPS-115/evidence/just_parl_test_sanction_norms_seed_20260223T173633Z.txt`. Falta ampliar cobertura (ordenanzas municipales y fragmentaci\u00f3n completa por norma/territorio). Siguiente comando: `DB_PATH=<db> just parl-import-sanction-norms-seed`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fuentes de volumen sancionador (piloto 5 organismos)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT anuarios + AEAT memorias sancionadoras + TGSS/ITSS + Interior (LO 4/2015) + ayuntamientos open data",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 publica cat\u00e1logo operativo de fuentes en `sanction_volume_sources` (5 lanes: DGT/AEAT/TGSS-ITSS/Interior/municipal piloto), junto con contrato com\u00fan de m\u00e9tricas y tablas destino (`sanction_volume_observations`) para ingestas comparables. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta cargar observaciones reales por organismo/periodo (`expediente_count`, `importe_total`, `importe_medio`, `recurso_estado`). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-data-catalog-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Semilla v1 de normas sancionadoras de alta frecuencia (lista cerrada inicial)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "BOE-A-2015-11722 + BOE-A-2003-23514 + BOE-A-1994-8985 + BOE-A-2003-23186 + BOE-A-2004-18398 + BOE-A-2015-11724 + BOE-A-2000-15060 + BOE-A-2015-3442",
        "estado": "DONE",
        "bloque": "Done now: YES. `etl/data/seeds/sanction_norms_seed_v1.json` publicado con contrato `schema_version=sanction_norms_seed_v1` y campos requeridos (`norm_id`, `boe_id`, `scope`, `organismo_competente`, `incidence_hypothesis`, `evidence_required`, `key_fragments`, `responsibility_hints`), con validaci\u00f3n reproducible (`valid=true`, `norms_total=8`, `errors_count=0`) y pipeline `just` dedicado (`parl-validate/import/report-sanction-norms-seed*`). Evidencia: `docs/etl/sprints/AI-OPS-115/reports/sanction-norms-seed-lane.md`, `docs/etl/sprints/AI-OPS-115/evidence/sanction_norms_seed_validate_20260223T173448Z.json`, `docs/etl/sprints/AI-OPS-115/evidence/just_parl_sanction_norms_seed_pipeline_20260223T173646Z.txt`. Siguiente comando: `just parl-validate-sanction-norms-seed`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Ordenanzas municipales sancionadoras (piloto 20 ciudades)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "BOP/portales municipales (movilidad, ORA/ZBE, civismo, residuos, ruido)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-117 a\u00f1ade tablas `sanction_municipal_ordinances` + `sanction_municipal_ordinance_fragments` y carga piloto reproducible con `20` ordenanzas (`normalized=3`, `identified=17`) y `3` fragmentos normalizados (`mapped_fragment_total=2`). Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sqlite_fk_check_20260223T180041Z.txt`. Falta completar normalizaci\u00f3n `20/20` a unidad sancionable (`articulo/conducta/rango/organo/recurso`) y elevar mappings municipales a cobertura operativa. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tipolog\u00edas de infracci\u00f3n m\u00e1s sancionadas (cat\u00e1logo ciudadano)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "DGT + AEAT + TGSS/ITSS + Interior + ayuntamientos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 crea cat\u00e1logo transversal en `sanction_infraction_types` (`10` tipolog\u00edas) y mapeo inicial en `sanction_infraction_type_mappings` (`10` mappings, cobertura a `fragment_id=8/10`, incluyendo lanes municipales `source_only` en espera de ordenanzas normalizadas). Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta completar mappings municipales a `norma_fragmento_id` y a\u00f1adir m\u00e9tricas de volumen por tipolog\u00eda. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Accountability de la cadena sancionadora (multa/cargo)",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "Norma habilitante + organismo instructor/resolutor + recaudaci\u00f3n + recursos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-115 abre trazabilidad `norma -> fragmento -> responsabilidad`; AI-OPS-156 a\u00f1ade evidencia multipista; AI-OPS-158/159/160/161 cierran cobertura documental y migraci\u00f3n `seed -> non-seed` (`seed=0`, `non-seed=15`, cola vac\u00eda). Slice AI-OPS-162 incorpora primera se\u00f1al parlamentaria reproducible (`senado_diario=2`) ligada a normas sancionadoras (`BOE-A-2003-23186`, `BOE-A-2015-3442`) con status lane `ok` y nuevos KPIs de cobertura parlamentaria (`responsibility_evidence_items_parliamentary_total=2`, `responsibility_parliamentary_coverage_pct=0.133333`). Evidencia: `docs/etl/sprints/AI-OPS-161/reports/sanction-norms-seed-source-record-upgrade-apply.md`, `docs/etl/sprints/AI-OPS-162/reports/sanction-norms-parliamentary-evidence-backfill.md`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_status_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_source_record_upgrade_queue_20260224T010415Z.json`. Falta integrar niveles `acto sancionador -> cobro -> recurso/resultado` por expediente y elevar cobertura parlamentaria por rol/acto (votos + enmiendas + ejecuci\u00f3n). Siguiente comando: `DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad garantista del sistema sancionador",
        "dominio": "Ciudadania",
        "fuentes_objetivo": "\u00d3rganos revisores (TEAR/TEAC, contencioso, defensores) + datos de estimaci\u00f3n/anulaci\u00f3n",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-116 publica contrato KPI de justicia procedimental en `sanction_procedural_kpi_definitions` (`3` KPIs: recurso estimado, anulaci\u00f3n formal, retraso p90) y tabla operativa `sanction_procedural_metrics` para series observadas. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta ingesta de datos revisores (TEAR/TEAC/contencioso/defensores) para poblar m\u00e9tricas y pasar de contrato a resultados. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Coste regulado de energ\u00eda dom\u00e9stica (luz/gas)",
        "dominio": "Energia",
        "fuentes_objetivo": "BOE (peajes/cargos/PVPC/TUR) + CNMC + MITECO",
        "estado": "TODO",
        "bloque": "Falta descomponer factura en componentes normativos y atribuir variaciones de coste por norma/fecha/territorio, separando energ\u00eda de mercado vs parte regulada",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fiscalidad municipal de alta incidencia (IBI/IVTM/basura/plusval\u00eda)",
        "dominio": "Fiscalidad",
        "fuentes_objetivo": "TRLRHL + ordenanzas fiscales municipales + catastros/ayuntamientos",
        "estado": "TODO",
        "bloque": "Falta comparador reproducible por municipio y perfil de hogar con trazabilidad `ordenanza -> pleno/alcald\u00eda -> liquidaci\u00f3n`",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cargos financieros minoristas (hipoteca/cuenta/descubierto)",
        "dominio": "Consumo-Finanzas",
        "fuentes_objetivo": "Banco de Espa\u00f1a (reclamaciones/memorias) + BOE cr\u00e9dito inmobiliario/servicios de pago",
        "estado": "TODO",
        "bloque": "Falta mapa normativo + dataset de costes/reclamaciones por entidad y tipolog\u00eda de cobro para detectar fricci\u00f3n masiva y accountability regulatoria",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fricci\u00f3n regulatoria en telecom/servicios esenciales (reclamaciones/cobros)",
        "dominio": "Consumo",
        "fuentes_objetivo": "CNMC + Consumo + CCAA (OMIC/Juntas Arbitrales) + operadores",
        "estado": "TODO",
        "bloque": "Falta modelo unificado de reclamaciones/sanciones por cl\u00e1usula/pr\u00e1ctica para identificar qu\u00e9 marcos generan m\u00e1s conflicto ciudadano recurrente",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tarifas y c\u00e1nones de agua/saneamiento (hogares)",
        "dominio": "Servicios esenciales",
        "fuentes_objetivo": "CCAA + entes locales + operadores p\u00fablicos/mixtos + BOE/boletines auton\u00f3micos",
        "estado": "TODO",
        "bloque": "Falta mapa regulatorio y comparador de factura de agua por municipio (`cuota fija`, `bloques`, `canon`, `depuraci\u00f3n`) con trazabilidad de cambios normativos y \u00f3rgano decisor",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Tarifas y bonificaciones de transporte p\u00fablico",
        "dominio": "Movilidad",
        "fuentes_objetivo": "MITMA/Ministerio Transportes + CCAA + ayuntamientos/consorcios + operadores",
        "estado": "TODO",
        "bloque": "Falta modelo reproducible por ciudad/\u00e1rea para medir impacto de reglas tarifarias/bonificaciones en coste mensual real por perfil de usuario",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Copago farmac\u00e9utico y acceso a medicamentos",
        "dominio": "Sanidad",
        "fuentes_objetivo": "Ley/BOE + SNS/CCAA (cartera y aportaci\u00f3n farmac\u00e9utica) + ministerio/servicios de salud",
        "estado": "TODO",
        "bloque": "Falta vincular reglas de aportaci\u00f3n y financiaci\u00f3n a coste de bolsillo por perfil (renta, cronicidad, pensionista) y a variaciones territoriales",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Precios p\u00fablicos en educaci\u00f3n infantil y servicios asociados",
        "dominio": "Educaci\u00f3n",
        "fuentes_objetivo": "CCAA + ayuntamientos (escuelas infantiles, comedor, actividades) + convocatorias de becas",
        "estado": "TODO",
        "bloque": "Falta comparador territorial de precios p\u00fablicos y elegibilidad de ayudas (`umbrales`, `baremos`, `plazos`) con impacto neto por hogar",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Carga administrativa digital obligatoria y recargos por incumplimiento",
        "dominio": "Administraci\u00f3n",
        "fuentes_objetivo": "AEAT/TGSS/DGT/CCAA/ayuntamientos (sedes electr\u00f3nicas y procedimientos)",
        "estado": "TODO",
        "bloque": "Falta cat\u00e1logo de obligaciones digitales por perfil ciudadano/pyme (`plazo`, `canal`, `sanci\u00f3n/recargo`) y medici\u00f3n de fricci\u00f3n por complejidad y tasa de error",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Marcos de seguro obligatorio de alta incidencia (veh\u00edculo/vivienda ligada a hipoteca)",
        "dominio": "Consumo-Seguros",
        "fuentes_objetivo": "DGSFP + BOE (responsabilidad civil obligatoria y normativa de mediaci\u00f3n/contrato) + supervisores",
        "estado": "TODO",
        "bloque": "Falta mapa de obligaciones m\u00ednimas y costes recurrentes asociados por perfil de hogar, con trazabilidad normativa y v\u00edas de reclamaci\u00f3n",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "\u00cdndice de Restricci\u00f3n de Libertad Ciudadana (IRLC) por norma/fragmento",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + normativa CCAA + ordenanzas municipales + jurisprudencia relevante",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 publica metodolog\u00eda IRLC auditable (`irlc_v1`) con pesos expl\u00edcitos (`reach/intensity/due_process_risk/reversibility_risk/discretionality/compliance_cost`) y scoring reproducible por `fragment_id` en `liberty_restriction_assessments`; Slice AI-OPS-130 ampl\u00eda la semilla a `11` assessments manteniendo `8` fragmentos base, con gate de cobertura por derecho integrado en `focus_gate`. Evidencia: `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`, `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_import_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`. Falta ampliar cobertura fuera del seed sancionador (CCAA/municipal/jurisprudencia) y pasar de semilla a ingesta continua. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Mapa de restricciones por derecho afectado",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + CCAA + ordenanzas + resoluciones administrativas/judiciales p\u00fablicas",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 a\u00f1ade taxonom\u00eda reproducible `liberty_right_categories` (`6` derechos) y mapa operativo `restriction_map_by_right`; Slice AI-OPS-130 cierra el gap de categor\u00edas vac\u00edas y deja cobertura `6/6` (`right_categories_with_data_total=6`, `right_categories_with_data_pct=1.0`) con guardrail expl\u00edcito `rights_with_data_gate` en `report_liberty_restrictions_status.py` (`LIBERTY_RESTRICTIONS_RIGHTS_WITH_DATA_MIN`, default `1.0`). Evidencia: `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_fail_rc_20260223T202028Z.txt`. Falta extender alcance territorial (Estado+CCAA+municipal) y densidad de evidencia primaria multi-fuente. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-restrictions-status`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Test de proporcionalidad y necesidad regulatoria",
        "dominio": "Derechos",
        "fuentes_objetivo": "AIR/Memoria normativa + evaluaciones ex post + \u00f3rganos consultivos + datos de outcomes",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 abre pipeline reproducible de proporcionalidad (`liberty_proportionality_methodologies/liberty_proportionality_reviews`) con semilla versionada `liberty_proportionality_seed_v1.json`, validaci\u00f3n/import idempotente y gate ejecutable (`just parl-check-liberty-proportionality-gate`). Resultado actual: `reviews_total=8`, `target_fragments_coverage_pct=1.0`, `objective_defined_pct=1.0`, `indicator_defined_pct=0.75`, `alternatives_considered_pct=0.5`, `gate.passed=true` y `reviews_below_threshold_total=2` para priorizaci\u00f3n de revisi\u00f3n. Evidencia: `docs/etl/sprints/AI-OPS-119/reports/liberty-proportionality-direct-accountability-lane.md`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_import_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_status_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/just_parl_liberty_restrictions_pipeline_20260223T182117Z.txt`. Falta sustituir semilla por ingesta continua AIR/ex-post y a\u00f1adir evidencia de eficacia observada fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-proportionality-status`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Variaci\u00f3n territorial y arbitrariedad de enforcement",
        "dominio": "Derechos",
        "fuentes_objetivo": "CCAA/ayuntamientos + organismos sancionadores + recursos estimados/desestimados",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-120 abre lane reproducible de variaci\u00f3n territorial con `liberty_enforcement_methodologies/liberty_enforcement_observations` y reporte operativo `report_liberty_enforcement_variation_status.py` (m\u00e9tricas por `fragment_id`: `sanction_rate_per_1000`, `annulment_rate`, `resolution_delay_p90_days`). Resultado actual: `observations_total=16`, `fragments_with_multi_territory_total=8/8`, `high_variation_fragments_total=3`, `target_fragment_coverage_pct=1.0`, `gate.passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-120/reports/liberty-territorial-variation-indirect-accountability-lane.md`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_import_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_status_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/just_parl_liberty_restrictions_pipeline_20260223T183508Z.txt`. Falta sustituir piloto semilla por ingesta territorial continua y ampliar cobertura fuera de territorios de arranque. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-enforcement-variation-status`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Censo integral de normas restrictivas (Estado + CCAA + municipal)",
        "dominio": "Derechos",
        "fuentes_objetivo": "BOE + boletines auton\u00f3micos + BOP/ordenanzas + reglamentos sectoriales",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 habilita censo base versionable para restricciones sobre el cat\u00e1logo legal ya cargado (`legal_norms/legal_norm_fragments`) y lo enlaza con `liberty_restriction_assessments` (`norms_with_irlc_total=8`, `fragments_with_irlc_total=8`). Evidencia: `docs/etl/sprints/AI-OPS-118/evidence/liberty_restrictions_status_20260223T181035Z.json`, `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`. Falta cobertura integral Estado+CCAA+municipal y rutina de refresh por bolet\u00edn/versiones. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cadena de responsabilidad directa por restricci\u00f3n",
        "dominio": "Derechos",
        "fuentes_objetivo": "Congreso/Senado (votos y firmas) + BOE (promulgaci\u00f3n) + resoluciones/actos de enforcement",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 activa cadena directa auditable por `fragment_id` mediante `report_liberty_direct_accountability_scores.py` (roles directos `propose/approve/enforce`) sobre responsabilidades legales cargadas. Slice AI-OPS-136 endurece ese contrato con quality-gate de evidencia primaria directa: m\u00e9tricas `direct_edges_with_primary_evidence_total/direct_edges_with_primary_evidence_pct` y gate `direct_primary_evidence_gate` (umbrales configurables en `justfile`: `LIBERTY_DIRECT_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT`, `LIBERTY_DIRECT_ACCOUNTABILITY_MIN_PRIMARY_EVIDENCE_EDGES`). Corrida AI-OPS-136 (`20260223T211623Z`): `fragments_with_direct_chain_total=8/8`, `direct_edges_total=19`, `direct_edges_with_primary_evidence_total=19`, `direct_edges_with_primary_evidence_pct=1.0`, `gate.passed=true`; fail-path con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded`, `direct_primary_evidence_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-136/reports/liberty-direct-accountability-primary-evidence-gate.md`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_scores_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_gate_primary_evidence_fail_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_check_liberty_direct_accountability_gate_primary_evidence_fail_rc_20260223T211623Z.txt`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_test_liberty_restrictions_20260223T211623Z.txt`. Falta enlazar actos directos de voto/firma/resoluci\u00f3n con evidencia primaria multi-fuente fechada y validaci\u00f3n temporal de cargo por persona. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-report-liberty-direct-accountability-scores`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cadena de responsabilidad indirecta por restricci\u00f3n",
        "dominio": "Derechos",
        "fuentes_objetivo": "Nombramientos y estructura org\u00e1nica + reglamentos de delegaci\u00f3n + disciplina de grupo/partido + \u00f3rganos consultivos",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-120 activa modelo causal de segundo orden con `liberty_indirect_methodologies/liberty_indirect_responsibility_edges` (roles `delegate/appoint/instruct/design`) y filtros expl\u00edcitos de atribuci\u00f3n (`attributable_confidence_min`, `attributable_max_causal_distance`) en `report_liberty_indirect_accountability_status.py`. Slice AI-OPS-137 endurece este lane con contrato expl\u00edcito persona/cargo + ventana temporal: `liberty_indirect_responsibility_edges` incorpora `actor_person_name`, `actor_role_title`, `appointment_start_date`, `appointment_end_date`; `validate_liberty_indirect_accountability_seed.py` exige coherencia de ventana (`appointment_end_date>=appointment_start_date`) y consistencia temporal con `evidence_date`; y `report_liberty_indirect_accountability_status.py` a\u00f1ade m\u00e9tricas `attributable_edges_with_actor_person_total`, `attributable_edges_with_valid_person_window_total`, `attributable_edges_with_valid_person_window_pct` y gate `indirect_person_window_gate` (umbrales configurables en `justfile`: `LIBERTY_INDIRECT_PERSON_WINDOW_MIN`, `LIBERTY_INDIRECT_MIN_PERSON_WINDOW_EDGES`). Corrida AI-OPS-137 (`20260223T212645Z`): `edges_total=12`, `attributable_edges_total=9`, `fragments_with_attributable_edges_total=7/8`, `attributable_edges_with_actor_person_total=9`, `attributable_edges_with_valid_person_window_total=9`, `attributable_edges_with_valid_person_window_pct=1.0`, `gate.passed=true`; fail-path contractual (`person_window_min=1.1`, `min_edges=20`) devuelve `status=degraded`, `indirect_person_window_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-137/reports/liberty-indirect-accountability-person-window-gate.md`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_import_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_status_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_rc_20260223T212645Z.txt`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_restrictions_snapshot_20260223_ai_ops_137_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/just_parl_test_liberty_restrictions_20260223T212645Z.txt`. Falta sustituir seed por cobertura multi-fuente real (nombramientos/resoluciones oficiales) y resolver identidad persona/cargo fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-indirect-accountability-status`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Evidencia y scoring de atribuci\u00f3n personal",
        "dominio": "Derechos",
        "fuentes_objetivo": "Tablas de responsabilidades + nombramientos + trazas de expediente/recurso",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-119 publica score auditable institucional `responsibility_score` (normalizado 0-100) con pesos por rol. Slice AI-OPS-138 abre scoring personal reproducible con `scripts/report_liberty_personal_accountability_scores.py`, combinando edges directos con `person_id` y cadena indirecta atribuible con contexto persona/cargo+ventana temporal (`actor_person_name`, `actor_role_title`, `appointment_start_date/end_date`) y fuerza probatoria expl\u00edcita (`edge_confidence * primary_evidence_factor`). Slice AI-OPS-139 endurece el contrato para eliminar sesgo por visualizaci\u00f3n (`top_n` no altera `persons_scored_total`). Slice AI-OPS-140 a\u00f1ade observabilidad/gate de resoluci\u00f3n de identidad indirecta (`indirect_identity_resolution_pct`, `indirect_identity_resolution_gate`) con muestra de no resueltos (`indirect_identity_unresolved_sample`). Slice AI-OPS-141 convierte ese backlog en cola operativa reproducible (`report_liberty_person_identity_resolution_queue.py`). Slice AI-OPS-142 cierra el loop con aplicaci\u00f3n reproducible de alias en DB (`person_name_aliases`) v\u00eda seed validado/importado. Slice AI-OPS-143 a\u00f1ade contrato expl\u00edcito de procedencia (`source_kind`, `evidence_date`, `evidence_quote`) y separa alias `manual_seed` vs `official_*` en scoring/queue. Slice AI-OPS-144 a\u00f1ade backlog accionable de migraci\u00f3n `manual -> official` (manual-upgrade queue + CSV), gate de `manual_alias_share` en la cola, y guardrail de no-downgrade de procedencia en import. Slice AI-OPS-145 endurece el guardrail para impedir retarget manual sobre alias ya `official_*` (`aliases_retarget_downgrade_prevented`) y alinea scoring personal con la cola a\u00f1adiendo m\u00e9tricas/gate de `manual_alias_share`. Slice AI-OPS-146 a\u00f1ade gate expl\u00edcito de evidencia oficial para alias `official_*` en scoring/queue (`official_alias_rows_with_evidence_total`, `official_alias_rows_missing_evidence_total`, `official_alias_evidence_coverage_pct`, `official_alias_evidence_gate`) con umbrales dedicados en `justfile`. Slice AI-OPS-147 a\u00f1ade gate expl\u00edcito de cuota oficial (`official_alias_share_pct`, `official_alias_share_gate`) para hacer exigible la migraci\u00f3n `manual_seed -> official_*` en ambas lanes. Slice AI-OPS-148 a\u00f1ade trazabilidad de `official_*` a `source_records` (`source_record_pk`) en schema/import y gate expl\u00edcito en scoring/queue (`official_alias_source_record_coverage_pct`, `official_alias_source_record_gate`). Slice AI-OPS-149 operacionaliza la remediaci\u00f3n de gaps `official_*` con colas accionables dedicadas (`official_alias_evidence_upgrade_queue_rows`, `official_alias_source_record_upgrade_queue_rows`) y checks de visibilidad de backlog (`official_alias_evidence_backlog_visible`, `official_alias_source_record_backlog_visible`) exportables a CSV desde `justfile`. Slice AI-OPS-150 cierra el loop review/apply con `scripts/export_liberty_person_identity_official_upgrade_review_queue.py` y `scripts/apply_liberty_person_identity_official_upgrade_reviews.py` (CSV de decisiones reproducible + guardrail anti-downgrade). Slice AI-OPS-151 endurece el apply con autoresoluci\u00f3n de `source_record_pk` v\u00eda lookup en `source_records` usando `--db`, m\u00e9tricas expl\u00edcitas de resoluci\u00f3n (`source_record_pk_auto_resolved`, `source_record_pk_auto_resolve_missed`) y wiring en `justfile`. Corrida AI-OPS-149 (`20260223T231638Z`): pass observabilidad (`official_alias_rows_total=0`, colas `0/0`) y fail-path contractual (`official_alias_rows_total=1`, `official_alias_rows_missing_evidence_total=1`, `official_alias_rows_missing_source_record_total=1`) con colas `1/1`, checks de visibilidad `true` y `exit=2`; suites en verde (`Ran 8`, `Ran 89`). Corrida AI-OPS-150 (`20260223T232635Z`): loop review/apply operativo con `rows_total=9`, `approved_rows=1`, `updated_rows=1`, reducci\u00f3n de cola manual `9 -> 8`, `official_alias_rows_total=1`, `official_alias_rows_missing_source_record_total=1`; suites en verde (`Ran 3`, `Ran 92`). Corrida AI-OPS-151 (`20260223T232954Z`): dry-run contractual de autoresoluci\u00f3n con lookup real (`source_record_lookup.rows_total=173070`, `source_record_pk_auto_resolved=1`, `validation.valid=true`); suites en verde (`Ran 4`, `Ran 93`). Evidencia: `docs/etl/sprints/AI-OPS-138/reports/liberty-personal-accountability-scoring-lane.md`, `docs/etl/sprints/AI-OPS-139/reports/liberty-personal-accountability-topn-contract.md`, `docs/etl/sprints/AI-OPS-140/reports/liberty-personal-identity-resolution-gate.md`, `docs/etl/sprints/AI-OPS-141/reports/liberty-person-identity-resolution-queue-lane.md`, `docs/etl/sprints/AI-OPS-142/reports/liberty-person-identity-apply-lane.md`, `docs/etl/sprints/AI-OPS-143/reports/liberty-person-identity-provenance-gate.md`, `docs/etl/sprints/AI-OPS-144/reports/liberty-person-identity-manual-upgrade-backlog-gate.md`, `docs/etl/sprints/AI-OPS-145/reports/liberty-person-identity-source-guard-personal-gate.md`, `docs/etl/sprints/AI-OPS-146/reports/liberty-person-identity-official-evidence-gate.md`, `docs/etl/sprints/AI-OPS-147/reports/liberty-person-identity-official-alias-share-gate.md`, `docs/etl/sprints/AI-OPS-148/reports/liberty-person-identity-official-source-record-gate.md`, `docs/etl/sprints/AI-OPS-149/reports/liberty-person-identity-official-gap-actionable-queues.md`, `docs/etl/sprints/AI-OPS-150/reports/liberty-person-identity-official-upgrade-review-apply-loop.md`, `docs/etl/sprints/AI-OPS-151/reports/liberty-person-identity-source-record-autoresolve.md`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_official_gap_queue_contract_summary_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_rc_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/unittest_liberty_person_identity_resolution_queue_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/just_parl_test_liberty_restrictions_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_evidence_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_source_record_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-150/evidence/liberty_person_identity_official_upgrade_review_apply_contract_summary_20260223T232635Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_apply_autoresolve_20260223T232954Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_source_record_autoresolve_contract_summary_20260223T232954Z.json`. Falta reemplazar progresivamente alias `manual_seed` por alias `official_*` (nombramientos/resoluciones/expedientes) y ampliar cobertura fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-export-liberty-person-identity-official-upgrade-review-queue && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_OFFICIAL_UPGRADE_REVIEWS_IN=<review_csv> LIBERTY_PERSON_IDENTITY_SEED_REVIEW_OUT=<seed_out_json> just parl-apply-liberty-person-identity-official-upgrade-reviews && DB_PATH=<db> LIBERTY_PERSONAL_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSONAL_INDIRECT_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-personal-accountability-gate && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSON_IDENTITY_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-person-identity-resolution-gate`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cobertura y calidad del censo de restricciones",
        "dominio": "Derechos",
        "fuentes_objetivo": "Censo normativo + metadatos de publicaci\u00f3n + control de versiones",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. Slice AI-OPS-118 public\u00f3 KPIs base y Slice AI-OPS-123 activ\u00f3 heartbeat append-only + ventana strict; Slice AI-OPS-131 a\u00f1adi\u00f3 `rights_with_data`; Slice AI-OPS-132 a\u00f1adi\u00f3 representatividad fuente/scope; Slice AI-OPS-133 a\u00f1adi\u00f3 doble cobertura (`IRLC + accountability`) por fuente/scope; Slice AI-OPS-134 a\u00f1adi\u00f3 quality-gate de evidencia primaria en accountability (`source_url + evidence_date + evidence_quote`) en status/heartbeat/window. Slice AI-OPS-135 cierra el hueco operativo del seed sancionador: `sanction_norms_seed_v1` exige y carga evidencia primaria por `responsibility_hint` (`source_url`, `evidence_date`, `evidence_quote`) en `legal_fragment_responsibilities`, se endurece el contrato default del foco (`LIBERTY_RESTRICTIONS_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT=1.0`, `LIBERTY_RESTRICTIONS_MIN_ACCOUNTABILITY_PRIMARY_EVIDENCE_EDGES=1`) y se extiende la observabilidad de estado sancionador con cobertura de evidencia primaria (`responsibility_primary_evidence_coverage_pct`). Corrida AI-OPS-135 (`20260223T210908Z`): `sanction_norms_seed_status` `ok` con `responsibilities_with_primary_evidence_total=15/15` y `responsibility_primary_evidence_coverage_pct=1.0`; `liberty_restrictions_status` `ok` con `accountability_edges_with_primary_evidence_total=15/15`, `accountability_edges_with_primary_evidence_pct=1.0`, `focus_gate.passed=true`; ventana strict pass `ok`; fail-path de foco con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded` y `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-135/reports/liberty-accountability-primary-evidence-seed-hardening.md`, `docs/etl/sprints/AI-OPS-135/evidence/sanction_norms_seed_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_focus_gate_accountability_primary_evidence_fail_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_check_liberty_focus_gate_accountability_primary_evidence_fail_rc_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_heartbeat_window_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_sanction_norms_seed_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_liberty_restrictions_20260223T210908Z.txt`. Falta cobertura real fuera de seed inicial (State+CCAA+municipal) y sustituci\u00f3n progresiva de hints por evidencia primaria multi-fuente fuera del seed. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
        "source_ids": [],
        "scope": "autonomico",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Publicaci\u00f3n peri\u00f3dica del Atlas de Restricciones Ciudadanas",
        "dominio": "Derechos",
        "fuentes_objetivo": "Artefactos snapshot (`restrictions.json`, `irlc_by_fragment.parquet`, `accountability_edges.parquet`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-124+127 cerraron publicaci\u00f3n/distribuci\u00f3n y alias HF; AI-OPS-220 cierra la deuda residual de AI-OPS-219 con corrida strict `ok` end-to-end (`publish`, `changelog continuity`, `release heartbeat`, `release heartbeat window`) para `snapshot_date=2026-03-05`. Se a\u00f1ade contrato expl\u00edcito `--min-run-at` en `report_liberty_atlas_release_heartbeat_window.py` (wiring en `justfile` con `LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT`) para mantener hist\u00f3rico append-only y evaluar la ventana sobre el per\u00edodo activo sin relajar umbrales. Resultado AI-OPS-220: `failed_in_window=0`, `degraded_in_window=0`, `drift_alerts_in_window=0`, `hf_unavailable_in_window=0`, `strict_fail_reasons=[]`, con `entries_eligible=1` y `excluded_before_min_run_at=43`. Pruebas del cambio: `python3 -m unittest tests/test_report_liberty_atlas_release_heartbeat_window.py` (`Ran 5 tests`, `OK`). Evidencia: `docs/etl/sprints/AI-OPS-124/reports/liberty-atlas-publication-contract.md`, `docs/etl/sprints/AI-OPS-127/reports/liberty-atlas-hf-release-alias-contract.md`, `docs/etl/sprints/AI-OPS-220/reports/liberty-atlas-release-heartbeat-window-min-run-at-closure.md`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_publish_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_changelog_continuity_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_release_heartbeat_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/liberty_atlas_release_heartbeat_window_2026-03-05.json`, `docs/etl/sprints/AI-OPS-220/evidence/just_liberty_atlas_release_heartbeat_window_2026-03-05.txt`, `docs/etl/sprints/AI-OPS-220/evidence/just_parl_publish_liberty_atlas_artifacts_2026-03-05.txt`. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT=<ISO8601> just parl-export-liberty-restrictions-snapshot && DB_PATH=<db> just parl-publish-liberty-atlas-artifacts && DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> just parl-report-liberty-atlas-release-heartbeat --allow-hf-unavailable && DB_PATH=<db> LIBERTY_ATLAS_RELEASE_WINDOW_MIN_RUN_AT=<ISO8601> just parl-check-liberty-atlas-release-heartbeat-window`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate de foco: libertad ciudadana primero",
        "dominio": "Derechos",
        "fuentes_objetivo": "Tracker + roadmap t\u00e9cnico + quality gates",
        "estado": "DONE",
        "bloque": "Done now: YES. Slice AI-OPS-122 conecta el gate de foco a pol\u00edtica de bloqueo en CI con job dedicado `liberty-focus-gate-contract` en `.github/workflows/etl-tracker-gate.yml`: valida fail-path (`--enforce-gate` con umbral imposible -> `exit=2`) y exige pass-path (`--enforce-gate` con umbrales operativos) antes de merge. Slice AI-OPS-129 endurece el alcance del foco en ese mismo job con `scripts/report_liberty_focus_scope_guard.py`: cuando `focus_gate` est\u00e1 degradado, cualquier cambio fuera de `Derechos` falla en estricto (`exit=4`), manteniendo el bloqueo global de `--enforce-gate` como red de seguridad. Evidencia: `docs/etl/sprints/AI-OPS-122/reports/liberty-focus-gate-ci-policy.md`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_fail_20260223T184906Z.json`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_fail_rc_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-122/evidence/liberty_focus_gate_pass_20260223T184906Z.json`, `docs/etl/sprints/AI-OPS-122/evidence/just_parl_check_liberty_focus_gate_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-122/evidence/workflow_yaml_parse_20260223T184906Z.txt`, `docs/etl/sprints/AI-OPS-129/reports/liberty-focus-scope-guard-ci-policy.md`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_fail_20260223T201430Z.json`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_fail_rc_20260223T201430Z.txt`, `docs/etl/sprints/AI-OPS-129/evidence/liberty_focus_scope_pass_20260223T201430Z.json`, `docs/etl/sprints/AI-OPS-129/evidence/just_parl_check_liberty_focus_scope_20260223T201430Z.txt`. Siguiente comando: `DB_PATH=<db> just parl-check-liberty-focus-gate`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cobertura BDE multi-serie (confusores)",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Banco de Espana (BIEREST `listaSeries`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-238 cierra la cobertura multi-serie BDE con cesta can\u00f3nica validada de `58` c\u00f3digos (`strict-network` real: `run_id=281`, `run_status=ok`, `run_records_seen=58`, `run_records_loaded=58`; validado tambi\u00e9n sin `--url` usando `default_url`) y estructuraci\u00f3n completa (`indicator_series_upserted=60`, `indicator_series_with_domain_id=60`, `indicator_series_unresolved_domain=0`, `indicator_points_upserted=1804`, `observation_records_upserted=1804`). Se endurece baseline: `bde_series_api.default_url` pasa a la cesta multi58 y `min_records_loaded_strict=58`; adem\u00e1s `indicator_backfill` incorpora mapeo determinista de tipos/deuda a `impuestos_gasto_fiscalidad` con test dedicado. Evidencia: `docs/etl/sprints/AI-OPS-238/reports/bde-multi-series-coverage-closure-20260227.md`, `docs/etl/sprints/AI-OPS-238/evidence/bde_multi_series_url_58_latest.txt`, `docs/etl/sprints/AI-OPS-238/evidence/bde_series_ingest_multi58_strict_latest.json`, `docs/etl/sprints/AI-OPS-238/evidence/bde_series_ingestion_runs_multi58_latest.txt`, `docs/etl/sprints/AI-OPS-238/evidence/backfill_indicators_bde_multi58_after_domain_fix_latest.json`, `docs/etl/sprints/AI-OPS-238/evidence/tracker_status_post_bde_multi58_domain_fix_latest.log`, `docs/etl/sprints/AI-OPS-238/evidence/python_unittest_bde_indicator_backfill_multi58_latest.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db <db> --source bde_series_api --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids bde_series_api`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Linkage de dominios para indicadores outcomes/confusores",
        "dominio": "Outcomes",
        "fuentes_objetivo": "`indicator_series` + `domains` (Eurostat/BDE/AEMET ya cargados)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-221 cierra el gap de clasificaci\u00f3n causal: `etl/politicos_es/indicator_backfill.py` resuelve/siembra `domains` de forma determinista cuando falta seed (`upsert_domain`), con cobertura de test dedicada (`tests/test_indicator_backfill.py`). Corrida real en `etl/data/staging/politicos-es.db`: `indicator_domains_seeded=3`, `indicator_domain_keys_seeded=[energia_medio_ambiente, proteccion_social_pensiones, vivienda_urbanismo]`, `indicator_series_with_domain_id=2400`, `indicator_series_unresolved_domain=0` y estructura trazable intacta (`indicator_points_total=37431`, `indicator_observation_records_total=37431`). Evidencia: `docs/etl/sprints/AI-OPS-221/reports/indicator-domain-linkage-closure.md`, `docs/etl/sprints/AI-OPS-221/evidence/backfill_indicators_latest.json`, `docs/etl/sprints/AI-OPS-221/evidence/unittest_indicator_backfill_20260226T2354Z.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids eurostat_sdmx bde_series_api aemet_opendata_series`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: legislacion y documentos",
        "dominio": "UE",
        "fuentes_objetivo": "EUR-Lex / Cellar (SPARQL/REST)",
        "estado": "TODO",
        "bloque": "Falta conector UE legal; linking a expedientes y textos vigentes",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: votaciones (roll-call)",
        "dominio": "UE",
        "fuentes_objetivo": "Parlamento Europeo: votes XML/PDF + Open Data Portal",
        "estado": "TODO",
        "bloque": "Falta ingesta de votos + mapeo a MEPs; KPI: % con actor resuelto",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: contratacion publica",
        "dominio": "UE",
        "fuentes_objetivo": "TED API (notices)",
        "estado": "TODO",
        "bloque": "Falta ingesta; KPI: cobertura y trazabilidad por notice",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "UE: lobbying/influencia",
        "dominio": "UE",
        "fuentes_objetivo": "EU Transparency Register",
        "estado": "TODO",
        "bloque": "Falta ingesta y modelo de entidades; linking cuando existan meetings/agendas publicas",
        "source_ids": [],
        "scope": "europeo",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cobertura de manifiestos (partidos/ciclos)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programas electorales estatales/auton\u00f3micos/municipales",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-240 cierra el objetivo de cobertura con `manifest` multic\u00edclo y multi-\u00e1mbito (`45` filas v\u00e1lidas, `15` partidos, `3` ciclos) sobre URLs oficiales (no replay/local) y corrida `strict-network` real en staging (`run_id=284`, `status=ok`, `records_seen=45`, `records_loaded=45`). KPI post-run: `source_records=46`, `party_proxy_count=15`, `topic_sets_touched=3`, `source_snapshot_dates=[2026-02-28]`; tracker SQL alineado (`programas_partidos: max_net=45, max_any=45, net/fallback_fetches=3/6, result=OK`). Se cerr\u00f3 la cola abierta del slice (`review_pending: 200 -> 0`, `review_ignored=204`) y el gate declarado volvi\u00f3 a `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-240/reports/programas-manifest-coverage-multicycle-closure-20260228.md`, `docs/etl/sprints/AI-OPS-240/exports/programas_manifest_multicycle_20260228.csv`, `docs/etl/sprints/AI-OPS-240/evidence/programas_manifest_validate_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/programas_manifest_party_probe_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/programas_ingestion_runs_latest_20260228.csv`, `docs/etl/sprints/AI-OPS-240/evidence/programas_declared_status_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/quality_declared_programas_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-240/evidence/tracker_status_post_ignore_20260228.log`. Siguiente comando: `python3 scripts/e2e_tracker_status.py --db <db> --tracker docs/etl/e2e-scrape-load-tracker.md --fail-on-mismatch --fail-on-done-zero-real`.",
        "source_ids": [],
        "scope": "municipal",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Se\u00f1al \u00fatil en manifiestos web (anti `no_signal`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programas partidarios (homepages/subp\u00e1ginas/PDF oficiales)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-276 cierra la lane con contrato operativo estable tras la curaci\u00f3n cross-party de AI-OPS-275: guardrail ratio dedupe BNG/VOX en estricto (`status=ok`) con `support_to_unclear_unique_ratio` por documento objetivo en verde (`BNG xerais=3.0`, `BNG europeas=2.0`, `VOX web=3.6`), gate declarado en verde (`declared.gate.passed=true`), cola editorial en cero (`review_pending=0`) y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). El riesgo de leakage fiscal en `Empleo` queda controlado (`suspicious_support_rows=0` en auditor\u00eda cross-party). La deuda residual narrativa queda acotada y no duplicada en filas especializadas de `Se\u00f1al sem\u00e1ntica multiling\u00fce` y `Higiene residual`. Evidencia: `docs/etl/sprints/AI-OPS-276/reports/programas-signal-usefulness-lane-closure-20260228.md`, `docs/etl/sprints/AI-OPS-276/evidence/programas_support_unclear_unique_ratio_bng_vox_latest.json`, `docs/etl/sprints/AI-OPS-276/exports/programas_support_unclear_unique_ratio_bng_vox_latest.csv`, `docs/etl/sprints/AI-OPS-276/evidence/programas_declared_status_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/quality_declared_programas_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/programas_signal_usefulness_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-276/evidence/tracker_status_latest.log`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_latest.json`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG,VOX' PROGRAMAS_UNCLEAR_RATIO_MIN=1.0 just parl-check-programas-support-unclear-unique-ratio`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n de deeplinks program\u00e1ticos por partido/ciclo",
        "dominio": "Editorial",
        "fuentes_objetivo": "Manifest can\u00f3nico de URLs program\u00e1ticas (no homepages gen\u00e9ricas)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-245 cierra el DoD base (`party_proxy_count >= 10`) y AI-OPS-246 endurece cobertura residual con selecci\u00f3n `min_score=7`: `rows_updated=45/51`, `failures_total=0`, `rows_valid=51`, corrida `strict-network` real `run_id=295`, `records_seen=51`, `records_loaded=51`, estado post-ignore `party_proxy_count=15`, `review_pending=0`, gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-246/evidence/programas_deeplink_curation_report_minscore7_20260228.json`, `docs/etl/sprints/AI-OPS-246/exports/programas_manifest_deeplink_curated_minscore7_multicycle_20260228.csv`, `docs/etl/sprints/AI-OPS-246/evidence/programas_manifest_deeplink_curated_minscore7_validate_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/programas_declared_status_post_minscore7_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/quality_declared_programas_post_minscore7_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-246/evidence/tracker_status_post_minscore7_ignore_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual de deeplinks (calidad sem\u00e1ntica)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Partidos con `selected_reason=no_candidate_above_threshold`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-246 elimina remanente `no_candidate_above_threshold` en el resumen por partido (`15/15` en `candidate_selected`) con curaci\u00f3n reproducible `min_score=7` y cobertura real en staging. Evidencia: `docs/etl/sprints/AI-OPS-246/exports/programas_deeplink_party_summary_minscore7_20260228.csv`, `docs/etl/sprints/AI-OPS-246/reports/programas-deeplink-residual-coverage-minscore7-20260228.md`, `docs/etl/sprints/AI-OPS-246/evidence/programas_deeplink_curation_report_minscore7_20260228.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Se\u00f1al sem\u00e1ntica multiling\u00fce en programas (`ca/eu/gl`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Clasificaci\u00f3n de stance en manifiestos no castellanos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-297 cierra el residual con gate estricto reproducible sobre BNG/VOX usando dedupe sem\u00e1ntico por excerpt: `support_to_unclear_unique_ratio` por documento objetivo en verde con umbral `>=2.0` (`BNG xerais=3.0`, `BNG europeas=2.0`, `VOX web=3.6`), sin filas bajo umbral (`below_threshold_rows=[]`, `status=ok`). Adem\u00e1s, el estado declarado permanece estable y sin cola (`review_pending=0`) con `quality declared` en verde (`declared.gate.passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-297/reports/programas-multilingual-signal-and-residual-hygiene-closure-20260228.md`, `docs/etl/sprints/AI-OPS-297/evidence/programas_support_unclear_unique_ratio_latest.json`, `docs/etl/sprints/AI-OPS-297/exports/programas_support_unclear_unique_ratio_latest.csv`, `docs/etl/sprints/AI-OPS-297/evidence/programas_declared_status_latest.json`, `docs/etl/sprints/AI-OPS-297/evidence/quality_declared_programas_latest.json`. Siguiente comando: `python3 scripts/report_programas_support_unclear_unique_ratio.py --db <db> --parties BNG,VOX --min-support-unclear-unique-ratio 2.0 --out docs/etl/sprints/<SPRINT>/evidence/programas_support_unclear_unique_ratio.json --csv-out docs/etl/sprints/<SPRINT>/exports/programas_support_unclear_unique_ratio.csv --strict`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene residual de manifiestos (ruido/no-programa)",
        "dominio": "Editorial",
        "fuentes_objetivo": "URLs con listados/cookies/\u00edndices no program\u00e1ticos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-297 cierra el control de higiene residual con contrato estricto de dedupe en cola `unclear` para BNG/VOX: `raw_unclear_rows_total=32`, `unclear_unique_excerpt_rows_total=15`, `unclear_duplicate_rows_total=17`, `duplicate_share=0.53125 <= 0.60`, `status=ok`; la cola dedupe queda acotada y exportable (`deduped_queue_rows_total=15`) sin abrir review pendiente (`review_pending=0`). En paralelo se mantiene `quality declared` en verde y `tracker_status` sin regresi\u00f3n (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-297/reports/programas-multilingual-signal-and-residual-hygiene-closure-20260228.md`, `docs/etl/sprints/AI-OPS-297/evidence/programas_unclear_tail_dedupe_report_latest.json`, `docs/etl/sprints/AI-OPS-297/exports/programas_unclear_tail_deduped_queue_latest.csv`, `docs/etl/sprints/AI-OPS-297/exports/programas_unclear_tail_duplicate_profile_latest.csv`, `docs/etl/sprints/AI-OPS-297/evidence/tracker_status_latest.log`. Siguiente comando: `python3 scripts/report_programas_unclear_tail_dedupe.py --db <db> --parties BNG,VOX --max-duplicate-share 0.60 --out docs/etl/sprints/<SPRINT>/evidence/programas_unclear_tail_dedupe_report.json --queue-out docs/etl/sprints/<SPRINT>/exports/programas_unclear_tail_deduped_queue.csv --profile-out docs/etl/sprints/<SPRINT>/exports/programas_unclear_tail_duplicate_profile.csv --strict`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Recuperaci\u00f3n de cobertura partidaria tras higiene de manifiestos",
        "dominio": "Editorial",
        "fuentes_objetivo": "Partidos con evidencia `0` post-filtro (`CCa`, `EAJ-PNV`, `EH Bildu`, `IU`, `PSC`, `UPN`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-251 cierra la cola residual de cobertura con overrides dirigidos `PSC`/`UPN` sobre baseline AI-OPS-250 `v3` y corrida real `strict-network` (`run_id=302`, `records_seen=51`, `records_loaded=51`). Resultado post-ignore: `party_proxy_count 13->15` (`missing_count=0`), recuperando los \u00faltimos dos partidos en cero (`PSC`, `UPN`), con `review_pending=0` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-251/reports/programas-coverage-recovery-v4-psc-upn-20260228.md`, `docs/etl/sprints/AI-OPS-251/exports/programas_status_delta_ai_ops_250_v3_vs_ai_ops_251_v4_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/exports/programas_party_delta_ai_ops_250_v3_vs_ai_ops_251_v4_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/exports/programas_party_missing_after_recovery_v4_psc_upn_targeted_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/programas_ingestion_runs_latest_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/tracker_status_post_recovery_v4_psc_upn_targeted_post_ignore_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Discovery program\u00e1tico residual (`PSC`/`UPN`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Web oficial + sitemap + enlaces PDF/candidatos reproducibles",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-251 valida palancas reproducibles para ambos partidos y las ejecuta end-to-end en ingest real: `PSC` migra a URL program\u00e1tica expl\u00edcita (`programa-electoral-psc-montgat-2023-2027`) y `UPN` a p\u00e1gina marco de programa (`elecciones.upn.org/programa/`), cerrando cobertura residual (`party_proxy_count=15`, `missing_count=0`). Evidencia: `docs/etl/sprints/AI-OPS-251/reports/programas-coverage-recovery-v4-psc-upn-20260228.md`, `docs/etl/sprints/AI-OPS-251/exports/programas_manifest_url_changes_vs_ai_ops_250_v3_recovery_v4_psc_upn_targeted_20260228.csv`, `docs/etl/sprints/AI-OPS-251/evidence/programas_declared_status_post_recovery_v4_psc_upn_targeted_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad sem\u00e1ntica residual en `PSC` (tras cierre de cobertura)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evidencia `PSC` recuperada con `support=0` y `unclear=36`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-252 cierra el gap de `PSC` mediante expansi\u00f3n sem\u00e1ntica nominal en extractor declarado y recompute correcto de posiciones para `programas_partidos`. Resultado post-ignore: `PSC evidence_rows=36`, `support_rows=21`, `unclear_rows=15`; mejora neta de la lane global (`support 134->199`, `unclear 361->296`) con gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-252/reports/programas-semantic-nominal-psc-closure-20260228.md`, `docs/etl/sprints/AI-OPS-252/exports/programas_psc_url_quality_audit_post_semantic_nominal_v4_fix_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-252/exports/programas_party_evidence_breakdown_post_semantic_nominal_v4_fix_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-252/evidence/quality_declared_programas_post_semantic_nominal_v4_fix_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad sem\u00e1ntica residual (partidos con `support=0`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`BNG`, `EH Bildu`, `EQUO` + baja se\u00f1al en `PP`/`VOX`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-253 cierra la cola `support=0` para la cohorte objetivo mediante curaci\u00f3n dirigida de URLs y reingesta full-manifest reproducible: `EH Bildu 0->20`, `EQUO 0->24`, `BNG 0->1`, con `party_proxy_count=15`, `review_pending=0` y gate declarado `passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-253/reports/programas-residual-support0-targeted-recovery-20260228.md`, `docs/etl/sprints/AI-OPS-253/exports/programas_party_delta_ai_ops_252_vs_ai_ops_253_post_ignore_20260228.csv`, `docs/etl/sprints/AI-OPS-253/evidence/programas_declared_status_post_full_v5_localreplay_post_ignore_20260228.json`, `docs/etl/sprints/AI-OPS-253/evidence/quality_declared_programas_post_full_v5_localreplay_post_ignore_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Baja relaci\u00f3n se\u00f1al/ruido residual en manifiestos",
        "dominio": "Editorial",
        "fuentes_objetivo": "`BNG`, `PP`, `VOX` con `support` bajo frente a `unclear`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-254 + AI-OPS-255 cierran la lane de baja relaci\u00f3n se\u00f1al/ruido: `BNG 1/48 -> 18/48`, `PP 3/56 -> 24/56`, `VOX 3/33 -> 12/33`; delta acumulado desde el arranque del gap: `support 244->338`, `unclear 320->226`, con `review_pending=0`, gate declarado `passed=true` y tracker enforce limpio. El residual restante pasa a curaci\u00f3n documental espec\u00edfica (fila siguiente), ya sin condici\u00f3n de \u201csupport bajo\u201d para la cohorte. Evidencia: `docs/etl/sprints/AI-OPS-254/reports/programas-low-signal-ratio-regex-upgrade-20260228.md`, `docs/etl/sprints/AI-OPS-255/reports/programas-bng-vox-residual-semantic-boost-20260228.md`, `docs/etl/sprints/AI-OPS-255/exports/programas_bng_pp_vox_delta_pre_vs_post_bng_vox_slice_20260228.csv`, `docs/etl/sprints/AI-OPS-255/evidence/programas_declared_status_post_bng_vox_slice_20260228.json`, `docs/etl/sprints/AI-OPS-255/evidence/quality_declared_programas_post_bng_vox_slice_20260228.json`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n documental residual de manifiestos (`BNG`/`VOX`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Ajuste de manifiestos con ratio `support/unclear` bajo por documento",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-257 abri\u00f3 mejora material, AI-OPS-266/267 endurecieron clasificaci\u00f3n y AI-OPS-268 cerr\u00f3 dedupe del tail `unclear`; AI-OPS-269 cierra el contrato documental can\u00f3nico por documento usando `support_to_unclear_unique_ratio` (sobre `unclear_unique_excerpt_rows`, no sobre duplicados multi-topic). Corrida strict en staging (`min_ratio=1.0`) en verde para los documentos objetivo: `BNG xerais 2023=5.0`, `BNG europeas 2024=1.428571`, `VOX web 2025=3.6`; guardrails de precisi\u00f3n/quality y tracker enforce siguen limpios (`mismatches=0`, `done_zero_real=0`). Fail-path contractual validado con umbral duro (`min_ratio=2.0`): `status=degraded`, `strict_fail_reasons=[ratio_below_threshold]`, `rc=4`. Evidencia: `docs/etl/sprints/AI-OPS-269/reports/programas-support-vs-unclear-unique-ratio-gate-closure-20260228.md`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_latest.json`, `docs/etl/sprints/AI-OPS-269/exports/programas_support_unclear_unique_ratio_latest.csv`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_fail_latest.json`, `docs/etl/sprints/AI-OPS-269/evidence/programas_support_unclear_unique_ratio_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-269/evidence/tracker_status_post_latest.log`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG,VOX' PROGRAMAS_UNCLEAR_RATIO_MIN=1.0 just parl-check-programas-support-unclear-unique-ratio`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Cierre de etiquetado pendiente en muestra de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Rotaci\u00f3n de labels AI-OPS-270 (`support` sample fresco)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-271 cierra el gap de etiquetado manual con paquete expl\u00edcito de `12` filas (`programas_support_precision_manual_labels_fill_20260228.csv`) y recompone la muestra etiquetada v\u00eda `rotate_programas_precision_labels.py` en modo estricto (`max_unlabeled=0`). Resultado: `sample_total=40`, `carried_forward_rows=40`, `unlabeled_rows=0`, `label_conflicts_total=0`, `status=ok`. Auditor\u00eda strict full-review (`min_reviewed=40`) tambi\u00e9n en verde: `reviewed_total=40`, `precision=0.975` (`39 TP / 1 FP`), `precision_by_required_party={BNG:0.9, VOX:1.0, FORO Asturias:1.0, PP:1.0}`, `required_parties_min_precision=true`. Guardrails de pipeline contin\u00faan limpios (`declared.gate.passed=true`, `review_pending=0`; tracker `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-271/reports/programas-precision-manual-label-fill-closure-20260228.md`, `docs/etl/sprints/AI-OPS-271/exports/programas_support_precision_manual_labels_fill_20260228.csv`, `docs/etl/sprints/AI-OPS-271/exports/programas_support_precision_sample_labeled_latest.csv`, `docs/etl/sprints/AI-OPS-271/evidence/programas_support_precision_rotate_summary_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/programas_support_precision_audit_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-271/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Endurecimiento preventivo de rotaci\u00f3n de labels (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`just` guardrail (`parl-programas-precision-guardrail-rotated`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-272 cierra el gap preventivo introduciendo contract path estricto en `justfile`: nueva recipe `parl-check-programas-support-precision-labels-rotation-strict` con `PROGRAMAS_PRECISION_ROTATE_STRICT_MAX_UNLABELED=0` y actualizaci\u00f3n de `parl-programas-precision-guardrail-rotated` para invocar siempre ese check estricto. Validaci\u00f3n reproducible: pass-path sobre muestra 40/40 (`unlabeled_rows=0`, `status=ok`) y fail-path contractual sobre estado pre-cierre AI-OPS-270 (`unlabeled_rows=12`, `strict_fail_reasons=[max_unlabeled_exceeded]`, `rc=4`). Auditor\u00eda full-review del pass artifact queda en verde (`reviewed_total=40`, `precision=0.975`, floor por partido `BNG=0.9`, `VOX/FORO/PP=1.0`), con gate declared y tracker sin regresi\u00f3n (`declared.gate.passed=true`, `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-272/reports/programas-rotation-strict-contract-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_pass_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_fail_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_rotate_strict_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/just_dry_run_parl_programas_precision_guardrail_rotated_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/guardrail_rotated_strict_call_check_latest.txt`, `docs/etl/sprints/AI-OPS-272/evidence/programas_support_precision_audit_fullreview_pass_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-272/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n del falso positivo residual en guardrail de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Muestra 40/40 (`evidence_id=1560538`, BNG)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-273 cierra el residual con hardening sem\u00e1ntico en `declared_stance` (bloqueador espec\u00edfico para el fragmento OCR `deben tributar aqui polo imposto de sociedades`) y aplicaci\u00f3n reproducible en DB real mediante `backfill-declared-stance --reconcile-no-signal`. Resultado del caso objetivo: `evidence_id=1560538` queda en `stance=unclear` (ya no `support`). La muestra fresca post-fix se recompone a `40/40` etiquetada (fill expl\u00edcito de la nueva fila `1560338`) y la auditor\u00eda strict full-review queda en verde con `false_positive=0`, `precision=1.0` y floor por partido `BNG/VOX/FORO/PP=1.0`. Guardrails sin regresi\u00f3n: `declared.gate.passed=true`, ratio BNG sigue cerrado (`BNG xerais=3.0`, `BNG europeas=2.0`), tracker `mismatches=0`, `done_zero_real=0`. Evidencia: `docs/etl/sprints/AI-OPS-273/reports/programas-residual-false-positive-1560538-closure-20260228.md`, `docs/etl/sprints/AI-OPS-273/exports/programas_fp_1560538_post_fix_latest.csv`, `docs/etl/sprints/AI-OPS-273/evidence/programas_backfill_declared_stance_reconcile_residual_fp_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_support_precision_audit_post_fix_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_residual_fp_1560538_delta_vs_ai_ops_272_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/programas_support_unclear_unique_ratio_bng_post_residual_fp_fix_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/quality_declared_programas_post_fix_fullreview_latest.json`, `docs/etl/sprints/AI-OPS-273/evidence/tracker_status_post_latest.log`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Auditor\u00eda preventiva de snippets fiscales en `Empleo` (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Cohorte BNG `topic_key=concern:v1:empleo` con l\u00e9xico fiscal",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-274 cierra la auditor\u00eda preventiva con contrato reproducible (`scripts/report_programas_empleo_fiscal_snippets_audit.py` + lanes `just parl-report/check-programas-empleo-fiscal-snippets-audit` + test dedicado `tests/test_report_programas_empleo_fiscal_snippets_audit.py`). Corrida strict en staging para BNG (`PROGRAMAS_EMPLEO_FISCAL_AUDIT_PARTIES='BNG'`) en verde: `rows_total=2`, `support_rows=1`, `unclear_rows=1`, `suspicious_support_rows=0`, `status=ok`. Se confirma que el `support` residual (`1560338`) mantiene ancla laboral (`traballo`) y no abre nuevo patr\u00f3n de `false_positive` en la cohorte objetivo. Evidencia: `docs/etl/sprints/AI-OPS-274/reports/programas-empleo-fiscal-snippets-audit-closure-20260228.md`, `docs/etl/sprints/AI-OPS-274/evidence/programas_empleo_fiscal_snippets_audit_bng_latest.json`, `docs/etl/sprints/AI-OPS-274/exports/programas_empleo_fiscal_snippets_audit_bng_latest.csv`, `docs/etl/sprints/AI-OPS-274/evidence/just_parl_check_programas_empleo_fiscal_snippets_audit_bng_latest.txt`, `docs/etl/sprints/AI-OPS-274/evidence/unittest_programas_empleo_fiscal_snippets_audit_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n transversal de snippets fiscales en `Empleo` (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Cohorte multi-partido fiscal (`BNG,CCa,Compromis,EAJ-PNV,VOX`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-275 cierra el gap cross-party con hardening topic-aware en `declared_stance`: para `programas_partidos` y `topic_key='concern:v1:empleo'`, la inferencia `programa_policy_proposal` solo se conserva si el excerpt contiene ancla laboral (`empleo/ocupacion/trabajo/...`). Se a\u00f1adi\u00f3 cobertura de regresi\u00f3n en `tests/test_parl_declared_stance.py` (caso negativo sin ancla + caso positivo con ancla). Recompute en staging (`backfill-declared-stance --reconcile-no-signal` + posiciones declaradas/combinadas) y auditor\u00eda strict en verde: `status=ok`, `suspicious_support_rows=0/13` (delta vs AI-OPS-274: `4 -> 0`), con `Compromis` en `Empleo` pasando de `support=4` a `unclear=4` para los snippets de `fiscalitat verda` sin ancla laboral. Gate declarado y tracker siguen limpios (`declared.gate.passed=true`, `review_pending=0`, `mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-275/reports/programas-empleo-fiscal-cross-party-curation-closure-20260228.md`, `docs/etl/sprints/AI-OPS-275/evidence/programas_backfill_declared_stance_reconcile_empleo_fiscal_cross_party_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/programas_empleo_fiscal_snippets_audit_cross_party_delta_vs_ai_ops_274_latest.json`, `docs/etl/sprints/AI-OPS-275/exports/programas_empleo_fiscal_compromis_candidates_post_fix_latest.csv`, `docs/etl/sprints/AI-OPS-275/evidence/quality_declared_programas_post_empleo_fiscal_cross_party_fix_latest.json`, `docs/etl/sprints/AI-OPS-275/evidence/tracker_status_post_latest.log`, `docs/etl/sprints/AI-OPS-275/evidence/unittest_parl_declared_stance_empleo_anchor_fix_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual FORO Asturias post-higiene",
        "dominio": "Editorial",
        "fuentes_objetivo": "Programa FORO 2023-2027 (`Programa-electoral-FORO-Asturias-20232027.pdf`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-257 cierra el gap abierto en AI-OPS-256 mediante ampliaci\u00f3n sem\u00e1ntica fallback y recompute completo en staging: `FORO Asturias 33/48 -> 45/48` (`+12 support`, `unclear 15->3`, `support_ratio 0.6875 -> 0.9375`), con `review_pending=0`, gate declarado `passed=true` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-257/reports/programas-fallback-semantic-expansion-foro-bng-20260228.md`, `docs/etl/sprints/AI-OPS-257/exports/programas_party_evidence_delta_pre_vs_post_semantic_patch_20260228.csv`, `docs/etl/sprints/AI-OPS-257/exports/programas_bng_vox_foro_url_delta_pre_vs_post_semantic_patch_20260228.csv`, `docs/etl/sprints/AI-OPS-257/evidence/programas_declared_status_post_semantic_patch_20260228.json`, `docs/etl/sprints/AI-OPS-257/evidence/tracker_status_post_semantic_patch_enforce_20260228.log`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Auditor\u00eda de precisi\u00f3n tras expansi\u00f3n sem\u00e1ntica (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Muestreo manual de nuevos `support` (AI-OPS-257) en `BNG/VOX/FORO/PP`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-258 ejecuta auditor\u00eda estratificada manual (`36` filas; `35` verdaderos positivos, precisi\u00f3n `0.9722 >= 0.90`) y cierra los falsos positivos TOC detectados en VOX con hardening + reconciliaci\u00f3n (`--reconcile-no-signal`). Se a\u00f1ade modo expl\u00edcito de ETL para degradar stances auto-asignados sin se\u00f1al vigente y se recalculan posiciones declaradas/combinadas. Estado final en staging: `support 392->390`, `unclear 172->174`, `review_pending=0`, gate declarado `passed=true`, tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-258/reports/programas-support-precision-audit-and-reconcile-20260228.md`, `docs/etl/sprints/AI-OPS-258/evidence/programas_support_precision_audit_summary_20260228.json`, `docs/etl/sprints/AI-OPS-258/evidence/programas_declared_status_post_precision_reconcile_20260228.json`, `docs/etl/sprints/AI-OPS-258/evidence/quality_declared_programas_post_precision_reconcile_20260228.json`, `docs/etl/sprints/AI-OPS-258/exports/programas_vox_toc_false_positive_candidates_post_reconcile_20260228.csv`, `docs/etl/sprints/AI-OPS-258/evidence/tracker_status_post_precision_reconcile_enforce_20260228.log`, `docs/etl/sprints/AI-OPS-258/evidence/unittest_parl_declared_stance_precision_reconcile_20260228.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate continuo de precisi\u00f3n + reconciliaci\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Automatizar guardrail tras cambios regex (`sample+threshold+reconcile`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-259 implementa lane reproducible end-to-end con scripts dedicados (`export_programas_support_precision_sample.py`, `report_programas_support_precision_audit.py`) y recetas `just` (`parl-export-programas-support-precision-sample`, `parl-check-programas-support-precision-audit`, `parl-programas-precision-guardrail`). Corrida real en staging: muestra fresca `40` filas (`10` por partido objetivo), gate de precisi\u00f3n etiquetada `status=ok` (`36/36` revisadas, `precision=0.9722 >= 0.90`), reconciliaci\u00f3n idempotente (`updated=0`, `reconciled_no_signal=0`), estado final estable (`support=390`, `unclear=174`, `review_pending=0`), quality declared `passed=true` y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-259/reports/programas-precision-guardrail-automation-20260228.md`, `docs/etl/sprints/AI-OPS-259/evidence/programas_support_precision_audit_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_support_precision_sample_summary_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_backfill_declared_stance_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_declared_status_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/programas_quality_declared_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-259/evidence/tracker_status_programas_guardrail_latest.log`, `docs/etl/sprints/AI-OPS-259/evidence/unittest_programas_precision_guardrail_latest.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Rotaci\u00f3n peri\u00f3dica de muestra etiquetada (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Etiquetado humano de la muestra fresca del guardrail (`AI-OPS-259`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-260 cierra el loop editorial peri\u00f3dico con pipeline reproducible de rotaci\u00f3n/arrastre de etiquetas por `evidence_id` (`rotate_programas_precision_labels.py`) y lane operativo `parl-programas-precision-guardrail-rotated` (export sample -> rotate strict -> audit strict -> reconcile/recompute -> quality/tracker enforce). Corrida real en staging: muestra fresca `40` filas, rotaci\u00f3n `carried_forward=40`, `unlabeled=0`, `label_conflicts=0`; auditor\u00eda estricta del sample rotado `reviewed=40`, `precision=0.90` (`36 TP / 4 FP`, umbral `>=0.90`), `required_parties_covered=true`; estado declarado post-guardrail estable (`support=390`, `unclear=174`, `review_pending=0`) y tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-260/reports/programas-precision-label-rotation-loop-closure-20260228.md`, `docs/etl/sprints/AI-OPS-260/evidence/programas_support_precision_rotate_summary_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_support_precision_audit_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_declared_status_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/programas_quality_declared_guardrail_rotated_20260228.json`, `docs/etl/sprints/AI-OPS-260/evidence/tracker_status_programas_guardrail_rotated_20260228.log`, `docs/etl/sprints/AI-OPS-260/evidence/unittest_programas_precision_rotation_20260228.txt`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Precision m\u00ednima por partido en guardrail `programas_partidos`",
        "dominio": "Editorial",
        "fuentes_objetivo": "Enforce de floor por partido (no solo precisi\u00f3n global)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-261 endurece el contrato del guardrail con floor expl\u00edcito por partido (`PROGRAMAS_PRECISION_MIN_PARTY`, default `0.85`) en `report_programas_support_precision_audit.py`/`justfile`, y cierra la curaci\u00f3n dirigida de FPs (`1560538`, `1560545`, `1561270`, `1561275`) mediante hardening de `declared_stance` para contexto hist\u00f3rico/narrativo. Corrida E2E en staging (`SNAPSHOT_DATE=2026-02-28`) con `parl-programas-precision-guardrail-rotated`: muestra rotada `40/40` etiquetada (`10` por partido), audit estricto `precision=1.0` y `precision_by_required_party={BNG:1.0, VOX:1.0, FORO:1.0, PP:1.0}` con `required_parties_min_precision=true`; estado declarado final `support=386`, `unclear=178`, `review_pending=0`, quality gate `passed=true`, tracker enforce limpio (`mismatches=0`, `done_zero_real=0`). Evidencia: `docs/etl/sprints/AI-OPS-261/reports/programas-party-floor-precision-guardrail-closure-20260228.md`, `docs/etl/sprints/AI-OPS-261/evidence/programas_support_precision_audit_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/exports/programas_support_precision_audit_guardrail_breakdown_latest.csv`, `docs/etl/sprints/AI-OPS-261/evidence/programas_declared_status_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/evidence/programas_quality_declared_guardrail_latest.json`, `docs/etl/sprints/AI-OPS-261/evidence/tracker_status_programas_guardrail_latest.log`, `docs/etl/sprints/AI-OPS-261/exports/programas_precision_party_floor_false_positive_candidates_latest.csv`. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> PROGRAMAS_PRECISION_MIN_PARTY=0.85 just parl-programas-precision-guardrail-rotated`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Dedupe de muestra de precisi\u00f3n (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evitar duplicados de excerpt/source en auditor\u00eda estratificada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-262 implementa dedupe reproducible por partido en `export_programas_support_precision_sample.py` (`--dedupe-key`: `none",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Aumento de diversidad VOX en muestra dedupe (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Subir `unique_by_party` de VOX en sample dedupe (target `>=10`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-264 cierra la lane sin tocar stances del ETL, incorporando windowing determinista de excerpt en `export_programas_support_precision_sample.py` (`--excerpt-window-words/--excerpt-window-stride/--excerpt-window-min-words`) y wiring en `justfile`. En staging, baseline sin windowing manten\u00eda `VOX=5`; con configuraci\u00f3n reproducible `window_words=40`, `stride=12`, `min_words=12` el check estricto pasa con `unique_by_party={BNG:10, VOX:10, FORO Asturias:10, PP:10}`, `parties_below_min_unique=[]`, `status=ok`, `strict rc=0`. Evidencia: `docs/etl/sprints/AI-OPS-264/reports/programas-precision-sample-windowed-diversity-closure-20260228.md`, `docs/etl/sprints/AI-OPS-264/evidence/programas_support_precision_sample_window40_stride12_summary_latest.json`, `docs/etl/sprints/AI-OPS-264/evidence/programas_support_precision_sample_window40_stride12_just_summary_latest.json`, `docs/etl/sprints/AI-OPS-264/exports/programas_support_precision_sample_window40_stride12_latest.csv`, `docs/etl/sprints/AI-OPS-264/evidence/unittest_programas_precision_sample_windowing_20260228.txt`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_PRECISION_SAMPLE_DEDUPE_KEY=excerpt_norm+source_url PROGRAMAS_PRECISION_SAMPLE_MIN_UNIQUE_PER_PARTY=10 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_WORDS=40 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_STRIDE=12 PROGRAMAS_PRECISION_SAMPLE_EXCERPT_WINDOW_MIN_WORDS=12 just parl-check-programas-support-precision-sample`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Contrato de diversidad efectiva por disponibilidad (`programas_partidos`)",
        "dominio": "Editorial",
        "fuentes_objetivo": "Evitar fail falso del guardrail cuando `min_unique_per_party` supera el pool real",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-263 endurece `export_programas_support_precision_sample.py` con contrato cap-aware por partido: se a\u00f1ade `available_unique_by_party`, `effective_min_unique_per_party_by_party=min(min_unique, available_unique)` y check estricto `min_unique_per_party_effective_met`, junto con trazas expl\u00edcitas (`parties_capped_by_available_unique`, `parties_below_effective_min_unique`). Corrida real en staging con `dedupe_key=excerpt_norm+source_url`, `min_unique_per_party=10`: `status=ok`, `strict rc=0`, `VOX` marcado como cap (`available=5`, `effective_min=5`) sin ocultar que el umbral nominal no se cumple (`min_unique_per_party_met=false`). Lane `just parl-check-programas-support-precision-sample` tambi\u00e9n queda en verde con el mismo contrato. Evidencia: `docs/etl/sprints/AI-OPS-263/reports/programas-precision-sample-effective-diversity-cap-20260228.md`, `docs/etl/sprints/AI-OPS-263/evidence/programas_support_precision_sample_dedup_min10_cap_summary_latest.json`, `docs/etl/sprints/AI-OPS-263/evidence/programas_support_precision_sample_dedup_min10_cap_just_summary_latest.json`, `docs/etl/sprints/AI-OPS-263/evidence/unittest_programas_precision_sample_cap_20260228.txt`. Siguiente comando: `DB_PATH=<db> PROGRAMAS_PRECISION_SAMPLE_DEDUPE_KEY=excerpt_norm+source_url PROGRAMAS_PRECISION_SAMPLE_MIN_UNIQUE_PER_PARTY=10 just parl-check-programas-support-precision-sample`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Re-cierre de cola review `no_signal` en `programas_partidos` (post-replay)",
        "dominio": "Editorial",
        "fuentes_objetivo": "`topic_evidence_reviews` pendientes tras recomputes locales de manifiestos",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-265 cierra la cola residual `no_signal` de `programas_partidos` con aplicaci\u00f3n en bloque reproducible v\u00eda `review-decision --status ignored`: baseline `review_pending=64` (`pending_by_reason.no_signal=64`) -> post-cierre `review_pending=0`, `review_ignored=300`, manteniendo trazabilidad (`review_total=303`) y gate declarado en verde (`quality-report --include-declared --enforce-gate`: `passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-265/reports/programas-review-queue-no-signal-reclosure-20260228.md`, `docs/etl/sprints/AI-OPS-265/evidence/programas_review_queue_apply_ignore_no_signal_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_review_queue_no_signal_closure_delta_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_declared_status_post_review_queue_close_latest.json`, `docs/etl/sprints/AI-OPS-265/evidence/programas_quality_declared_post_review_queue_close_latest.json`. Siguiente comando: `python3 scripts/ingestar_parlamentario_es.py review-queue --db <db> --source-id programas_partidos --status pending --review-reason no_signal --limit 200 --offset 0`.",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Taxonomia de temas (alto impacto por scope)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Definicion de temas + stake scoring por institucion/territorio/mandato",
        "estado": "DONE",
        "bloque": "Seed/versionado: `etl/data/seeds/topic_taxonomy_es.json`. Build: `python3 scripts/ingestar_parlamentario_es.py backfill-topic-analytics --db <db> --as-of-date <YYYY-MM-DD> --taxonomy-seed etl/data/seeds/topic_taxonomy_es.json`",
        "source_ids": [],
        "scope": "territorial",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Evidencia textual (para posiciones declaradas)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Diarios de sesiones, intervenciones, preguntas, notas oficiales",
        "estado": "DONE",
        "bloque": "Modelo can\u00f3nico: `text_documents` (metadata + excerpt) enlazado por `source_record_pk` de `topic_evidence`. Backfill: `python3 scripts/ingestar_parlamentario_es.py backfill-text-documents --db <db> --source-id congreso_intervenciones --only-missing` (o `just parl-backfill-text-documents`). Adem\u00e1s, copia un snippet a `topic_evidence.excerpt` para que `/explorer-temas` sea auditable sin joins. Nota: stance classification sigue siendo otro paso (ver filas de \u201cIntervenciones\u201d/\u201cPosiciones\u201d).",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Textos de iniciativas (qu\u00e9 se vot\u00f3)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "BOCG + Diario de Sesiones (v\u00eda links en iniciativas Congreso/Senado)",
        "estado": "PARTIAL",
        "bloque": "Done now: PARTIAL. AI-OPS-380 consolid\u00f3 avance global fuera de `linked_to_votes` con dos pasadas `status=403` (`downloaded_doc_links +5`, `missing_doc_links_actionable -5`), AI-OPS-381/382 cerraron iteraciones sin delta neta, AI-OPS-383/384 drenaron/cerraron `unknown` (`downloaded_doc_links +114`, `missing_doc_links_actionable -114`, `unknown_status_urls 114->0`), AI-OPS-385/386 cerraron lanes globales `status=403/500` como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-387 convirti\u00f3 `status=404` (`+42/-42`), AI-OPS-389 reactiv\u00f3 conversi\u00f3n por cohortes WAF (`+25/-25`), AI-OPS-390 cerr\u00f3 `status=500 + zero-doc` sin candidates, AI-OPS-391/392/393 mantuvieron conversi\u00f3n iterativa en lane `status=500` general (`+38/-38`, `+31/-31`, `+16/-16`), AI-OPS-394 confirm\u00f3 no-conversi\u00f3n en lane `status=404` general, AI-OPS-395/396 cerraron lanes `status=403/404 + zero-doc` sin delta, AI-OPS-397 convirti\u00f3 `status=429 + zero-doc` (`+12/-12`), AI-OPS-398 dren\u00f3 la lane `status=429` general (`+60/-60`), AI-OPS-399 dren\u00f3 la lane `status=599` general (`+8/-8`), AI-OPS-400 ejecut\u00f3 lane `status=500` timeboxed sin delta neta (`rc=124`, `packet20`), AI-OPS-401 cerr\u00f3 `status=403` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-402 cerr\u00f3 `status=500` timeboxed como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-403 cerr\u00f3 `status=404` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-404 cerr\u00f3 `status=403` multi-URL como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-405 cerr\u00f3 `status=500` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-406 cerr\u00f3 `status=404` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda) y AI-OPS-407 cerr\u00f3 micro-packet `status=403` sin delta neta de cobertura (`rc=0`, `candidate_urls=10`, `fetched_ok=0`) con reclasificaci\u00f3n interna `status403->status404` (`-10/+10`). Estado actual (`etl/data/staging/politicos-es.db`, `2026-03-02`): `total_doc_links=9553`, `downloaded_doc_links=5946`, `missing_doc_links=3607`, `missing_doc_links_actionable=3416`, `doc_links_missing_fetch_status=0`, cobertura linkeada a voto `751/751` (`100%`). Congreso se mantiene cerrado (`812/812`) y el residual global sigue concentrado en Senado no linkeado (`3607/8741` faltantes; `downloaded_doc_links_pct=62.24%`, buckets accionables dominantes `status403=1475`, `status500=1345`, `status404=596`, `status200=0`, `status429=0`, `status599=0`, `unknown=0`). Evidencia: `docs/etl/sprints/AI-OPS-407/reports/senado-status403-general-micro-packet10-timebox-20260302.md`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_conversion_delta_ai_ops_407_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/quality_initiatives_after_pass1_20260302T015128Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-status 500 --max-urls-per-initiative 3 --limit 120 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv && sed -n \"1,11p\" docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv > docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv && timeout 180 python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --include-unlinked --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404,429,500 --archive-timeout 3 --retry-http-statuses 500 --refetch-existing --timeout 8 --snapshot-date 2026-03-02`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Calidad local de docs descargados (iniciativas)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`text_documents` + `document_fetches` para links ya descargados",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-227 cierra deuda local en Congreso sin red: `backfill_initiative_doc_excerpts` (`seen=729`, `updated=729`) y `backfill_initiative_doc_fetch_status` (`candidate_refs_total=205`, `missing_fetch_status 205 -> 0`). KPI global post-slice: `downloaded_doc_links_with_excerpt 4205/4205`, `excerpt_coverage_pct=1.0`, `doc_links_with_fetch_status 8717/8717`, `fetch_status_coverage_pct=1.0`. Evidencia: `docs/etl/sprints/AI-OPS-227/evidence/initdoc_excerpts_congreso_backfill_latest.json`, `docs/etl/sprints/AI-OPS-227/evidence/initdoc_fetch_status_congreso_backfill_latest.json`, `docs/etl/sprints/AI-OPS-227/evidence/quality_initiatives_delta_pre_vs_post_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cola accionable de documentos Senado (qu\u00e9 se vot\u00f3)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "Senado `global_enmiendas_vetos` + detalle `tipoFich=3` + fallback hist\u00f3rico",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-378+379 cierran la cola `linked_to_votes`: primero se drena `status=403` (`27->0`) y luego `status=404` (`22->0`), dejando `missing_urls=0`, `blocked_403_urls=0`, `unknown_status_urls=0`, `zero_doc_initiatives=0`. En AI-OPS-379 el replay final `status=404` sobre packet efectivo (`candidate_urls=22`) convierte `fetched_ok=22` sin fallos y cierra los buckets residuales (`status403=0`, `status404=0`). Evidencia: `docs/etl/sprints/AI-OPS-378/reports/senado-status403-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_conversion_delta_ai_ops_378_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-379/reports/senado-status404-packet50-effective-sixth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_conversion_delta_ai_ops_379_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_waf_block_profile_after_20260301T141409Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Alineaci\u00f3n de KPI cola Senado (scope operativo vs gate)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`quality-report` iniciativas vs export de cola accionable",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-229 implementa contrato expl\u00edcito de scope con `--initiative-actionable-scope {global,linked_to_votes}` en `quality-report`, KPIs duales (`*_linked_to_votes`) y gate configurable por m\u00e9trica activa (`actionable_metric`). Resultado reproducible en staging: scope global mantiene `missing_doc_links_actionable=4456` (`closed_pct=0.4897`) y scope `linked_to_votes` alinea con cola operativa en `missing_doc_links_actionable_selected=680` (`closed_pct_selected=0.6726`), consistente con export `680` URLs (`345` iniciativas). Evidencia: `docs/etl/sprints/AI-OPS-229/reports/initiative-quality-actionable-scope-alignment-20260227.md`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_compare_latest.json`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_global_latest.json`, `docs/etl/sprints/AI-OPS-229/evidence/quality_initiatives_scope_linked_latest.json`, `docs/etl/sprints/AI-OPS-229/exports/senado_missing_actionable_linked_latest.csv`. Siguiente comando: `INITIATIVE_QUALITY_ACTIONABLE_SCOPE=linked_to_votes DB_PATH=<db> SNAPSHOT_DATE=<YYYY-MM-DD> just parl-quality-report-initiatives-enforce`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Curaci\u00f3n residual de extracci\u00f3n sem\u00e1ntica (Congreso)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`parl_initiative_doc_extractions` (`needs_review=1`)",
        "estado": "DONE",
        "bloque": "Done now: YES. Cierre ejecutado en AI-OPS-226: export de cola residual (`rows=2`) + apply reproducible con `apply_initdoc_extraction_reviews.py` (`updated=2`) y verificaci\u00f3n post-apply (`rows=0`). KPI final: `extraction_needs_review_doc_links=0`, `extraction_review_closed_pct=1.0` (overall y `congreso_iniciativas`), manteniendo el \u00fanico bloqueo de gate en la cola accionable de Senado. Evidencia: `docs/etl/sprints/AI-OPS-226/evidence/initdoc_extraction_review_residual_apply_latest.json`, `docs/etl/sprints/AI-OPS-226/evidence/quality_initiatives_after_congreso_review_closure_latest.json`, `docs/etl/sprints/AI-OPS-226/exports/initdoc_extraction_review_queue_residual_post_apply_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene sem\u00e1ntica de extracci\u00f3n (Senado)",
        "dominio": "Parlamentario",
        "fuentes_objetivo": "`parl_initiative_doc_extractions` (`extracted_subject` con ruido HTML/JS y navegaci\u00f3n)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-319 endurece `scripts/backfill_initiative_doc_extractions.py` para descartar candidatos ruidosos (`!function(`, branding+pipe, fragmentos JS) y AI-OPS-320 ampl\u00eda el filtro a ruido de navegaci\u00f3n Senado (`Ir al Contenido`, `Preguntas frecuentes`, `Diccionario parlamentario`, `S\u00edguenos`, etc.), con fallback por t\u00edtulo fuerte. Reproceso completo sobre `senado_iniciativas` (`seen=3538`, `upserted=3538`) mantiene estabilidad de cobertura (`downloaded_missing_extraction=0`, `extraction_needs_review=0`) y cierra ruido residual observado en AI-OPS-320 (`44 -> 0`). Evidencia: `docs/etl/sprints/AI-OPS-319/reports/senado-semantic-extraction-noise-cleaning-20260228.md`, `docs/etl/sprints/AI-OPS-320/reports/senado-status403-enmiendas-retry-and-semantic-hardening-20260228.md`, `docs/etl/sprints/AI-OPS-320/evidence/initiative_doc_extractions_semantic_hardening_senado_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/senado_extraction_nav_noise_post_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/senado_extraction_nav_noise_delta_ai_ops_320_20260228T230355Z.json`, `docs/etl/sprints/AI-OPS-320/evidence/unittest_backfill_initiative_doc_extractions_20260228T230355Z.txt`. Siguiente comando: `python3 scripts/backfill_initiative_doc_extractions.py --db <db> --initiative-source-ids congreso_iniciativas,senado_iniciativas --only-missing --out docs/etl/sprints/<SPRINT>/evidence/initiative_doc_extractions_only_missing.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Runtime Playwright para descarga Senado (palanca browser)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Playwright Python driver + perfil persistente (`--playwright-user-data-dir`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-230+231 cierran la deuda de runtime local: fallback autom\u00e1tico de Node para Playwright (`PLAYWRIGHT_NODEJS_PATH`) + warmup `best-effort` no bloqueante en `_PlaywrightFetcher.get_bytes`. Validaci\u00f3n real (`limit-initiatives=25`, `max-docs-per-initiative=1`) mantiene `playwright_init_error=null` y `playwright_runtime.fallback_applied=true`; el fallo residual queda en red remota (`HTTP 403` en fetch objetivo), no en bootstrap/init local. Evidencia: `docs/etl/sprints/AI-OPS-230/reports/playwright-runtime-node-fallback-senado-20260227.md`, `docs/etl/sprints/AI-OPS-231/reports/senado-playwright-warmup-softfail-and-actionable-tail-probe-20260227.md`, `docs/etl/sprints/AI-OPS-231/evidence/senado_playwright_backfill_20260227_latest.json`, `docs/etl/sprints/AI-OPS-231/evidence/senado_playwright_backfill_delta_20260227_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Huella WAF Senado (captura reproducible para escalado)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`document_fetches` + respuestas 403 (`playwright`/`cookie`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-232 cierra la deuda de captura reproducible con artefacto can\u00f3nico por cohorte (`scripts/report_senado_waf_block_profile.py`) y salida strict verificable. Estado actual del perfil (`only_linked_to_votes`): `missing_urls=680`, `missing_initiatives=345`, `blocked_403_urls=588`, `blocked_403_rate=0.864706`, `blocked_500_urls=90`, `zero_doc_initiatives=25`; cohorte top: `leg10:tipo610`, `leg14:tipo621`, `leg14:tipo624`, `leg14:tipo622`. Cola priorizada zero-doc publicada (`25` iniciativas, `1` URL/initiative) y retry acotado documentado (`candidate_urls=50`, `fetched_ok=0`, `playwright_init_error=null`). Evidencia: `docs/etl/sprints/AI-OPS-232/reports/senado-waf-block-profile-and-zero-doc-queue-20260227.md`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_latest.json`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_strict_latest.json`, `docs/etl/sprints/AI-OPS-232/evidence/senado_waf_block_profile_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-232/evidence/senado_backfill_docs_retry_cookie_latest.json`, `docs/etl/sprints/AI-OPS-232/exports/senado_zero_doc_actionable_queue_latest.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Escalado operativo bloqueo Senado (cohortes top)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry dirigido por cohorte + refresh cookie/canal alterno",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-233 ejecuta el retry estricto ampliado (`limit-initiatives=50`) y valida el outcome con perfil WAF post-run: `candidate_urls=76`, `fetched_ok=0`, `playwright_init_error=null`, `missing_urls=680` (delta `0`), `missing_initiatives=345` (delta `0`), `zero_doc_initiatives=25` (delta `0`), `blocked_403_urls=607` (`+19`), `blocked_500_urls=71` (`-19`). Se cumple el criterio de cierre por intento estricto + bloqueo formal verificable (sin mejora material de cierre). Evidencia: `docs/etl/sprints/AI-OPS-233/reports/senado-escalado-cohortes-top-strict-retry-20260227.md`, `docs/etl/sprints/AI-OPS-233/evidence/senado_backfill_docs_retry_cookie_limit50_latest.json`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_latest.json`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_delta_vs_ai_ops_232_latest.json`, `docs/etl/sprints/AI-OPS-233/exports/senado_zero_doc_actionable_queue_latest.csv`, `docs/etl/sprints/AI-OPS-233/evidence/senado_waf_block_profile_strict_rc_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Refresh reproducible de sesi\u00f3n Senado (nueva palanca)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cookie/profile renovable + prueba estricta acotada",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-234 introduce reporte can\u00f3nico de readiness de palanca (`scripts/report_senado_cookie_lever_status.py`) y ejecuta validaci\u00f3n estricta + retry acotado: `cookie_status=degraded`, `no_new_lever=true`, `age_hours=204.153` (umbral `24h`), `strict_fail_reasons=[cookie_file_stale]`, `cookie_strict_rc=4`; retry posterior mantiene `candidate_urls=50`, `fetched_ok=0`, `playwright_init_error=null`, y perfil WAF sin mejora (`missing_urls=680`, `zero_doc_initiatives=25`, delta `0` vs AI-OPS-233). Se cumple criterio de cierre por documentaci\u00f3n formal `no_new_lever` con evidencia machine-readable. Evidencia: `docs/etl/sprints/AI-OPS-234/reports/senado-cookie-lever-no-new-lever-closure-20260227.md`, `docs/etl/sprints/AI-OPS-234/evidence/senado_cookie_lever_status_latest.json`, `docs/etl/sprints/AI-OPS-234/evidence/senado_cookie_lever_status_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-234/evidence/senado_backfill_docs_retry_cookie_limit25_latest.json`, `docs/etl/sprints/AI-OPS-234/evidence/senado_waf_block_profile_delta_vs_ai_ops_233_latest.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Captura manual headful de cookie Senado (palanca nueva externa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sesi\u00f3n renovada + cookie file sanitizado y versionado",
        "estado": "PARTIAL",
        "bloque": "Gap actualizado (AI-OPS-235 + AI-OPS-236 + AI-OPS-299 + AI-OPS-300 + AI-OPS-301 + AI-OPS-302 + AI-OPS-303 + AI-OPS-304): la lane ya cubre (a) cola reproducible de captura (`scripts/export_senado_manual_capture_targets.py`), (b) gate de progreso (`scripts/report_senado_manual_capture_target_progress.py`), (c) runner condicional de retry (`scripts/run_senado_manual_capture_retry_cycle.py`), (d) paquetizaci\u00f3n operativa de pendientes (`scripts/export_senado_manual_capture_pending_targets.py`) y (e) ciclo unificado de iteraci\u00f3n con delta (`scripts/run_senado_manual_capture_iteration_cycle.py`). AI-OPS-304 a\u00f1ade una palanca controlable de scraping (`manual_capture_playwright --headless`) sobre los 2 targets `unmatched`, cerrando el hueco estructural de cobertura: `matched_targets_total 6->8`, `unmatched_targets_total 2->0`, `coverage_pct 0.75->1.0`, `capture_files_total 2->4` (baseline AI-OPS-301 -> AI-OPS-304). Estado actual en DB principal (`2026-02-28`): `usable_targets_total=0`; cola pendiente sigue en `pending_targets_total=8`, ahora `pending_unmatched_total=0` y `pending_access_denied_total=8`; check estricto de iteraci\u00f3n `rc=4`. El bloqueo externo persiste: sin captura usable no procede retry de descarga. Evidencia: `docs/etl/sprints/AI-OPS-304/reports/senado-manual-capture-headless-probe-coverage-lane-20260228.md`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_delta_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_headless_probe_summary_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_iteration_cycle_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/just_parl_check_senado_manual_capture_iteration_cycle_rc_latest.txt`, `docs/etl/sprints/AI-OPS-304/evidence/tracker_status_latest.log`. Siguiente comando: `bash docs/etl/sprints/AI-OPS-304/exports/senado_manual_capture_pending_targets_commands_latest.sh && just parl-run-senado-manual-capture-iteration-cycle && just parl-check-senado-manual-capture-iteration-cycle`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Hardening runtime de captura Playwright (cookie refresh Senado)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`manual_capture_playwright.py` (fallback Node + `--headless`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-235 endurece la herramienta de captura manual para eliminar el fallo `_playwright` observado en campo: se a\u00f1ade fallback autom\u00e1tico de runtime Node (`PLAYWRIGHT_NODEJS_PATH`) cuando el driver bundled falla y se habilita `--headless` para ejecuci\u00f3n reproducible en este entorno; cobertura dedicada en `tests/test_manual_capture_playwright.py` + regresi\u00f3n de reports (`tests/test_report_senado_cookie_lever_status.py`, `tests/test_report_senado_waf_block_profile.py`) con `Ran 7 tests`, `OK`. Evidencia: `docs/etl/sprints/AI-OPS-235/reports/senado-manual-capture-runtime-hardening-and-cookie-refresh-probe-20260227.md`, `docs/etl/sprints/AI-OPS-235/evidence/senado_manual_cookie_capture_summary_latest.json`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_report_senado_cookie_lever_status_latest.txt`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_check_senado_cookie_lever_status_latest.txt`, `docs/etl/sprints/AI-OPS-235/evidence/just_parl_check_senado_cookie_lever_status_rc_latest.txt`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cohortes de retry Senado estables por snapshot",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Export cola accionable + replay de URLs por cohorte (`404/500/403`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-310 cierra el mecanismo contractual de cohorte fija: `backfill-initiative-documents` incorpora `--doc-urls-file` (TXT/CSV/JSON con `doc_url` + `last_http_status`) y usa status snapshot tanto en `retry_http_statuses` como en `skip_forbidden/archive_first`, eliminando drift intra-sprint por cambios en `document_fetches`. Validaci\u00f3n unitaria: `tests.test_parl_text_documents` (`Ran 15`, `OK`) con nuevos casos de estabilidad para ambos filtros. Validaci\u00f3n en DB principal con replay doble sobre la misma cohorte (`40` URLs, `--refetch-existing`, `status=403`) arroja resultados id\u00e9nticos first/second: `urls_to_fetch=40`, `skipped_forbidden=0`, `skipped_retry_http_statuses=0`, `selected_doc_status_used_for_forbidden_filter=40`, `selected_doc_status_used_for_retry=40`, `fetched_ok=9`, `archive_fetched_ok=9`. Post-proceso local cerrado (`initiative_doc_extractions --only-missing`: `upserted=9`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-310/reports/senado-retry-cohort-snapshot-lock-20260228.md`, `docs/etl/sprints/AI-OPS-310/evidence/senado_retry_snapshot_file_status403_refetch_first_20260228T214135Z.json`, `docs/etl/sprints/AI-OPS-310/evidence/senado_retry_snapshot_file_status403_refetch_second_20260228T214135Z.json`, `docs/etl/sprints/AI-OPS-310/evidence/unittest_parl_text_documents_ai_ops_310_20260228T214135Z.txt`, `docs/etl/sprints/AI-OPS-310/evidence/initiative_doc_extractions_backfill_post_snapshot_lock_20260228T214135Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Gate can\u00f3nico de validez de captura manual Senado (pre-retry)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "`*.meta.json` + sidecars (`.html`, `.cookies.json`) -> `usable_capture` estricto",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-236 a\u00f1ade `scripts/report_senado_manual_capture_validity.py` + lanes `just parl-report/check-senado-manual-capture-validity` para convertir la captura manual en contrato previo al retry de red (`status=ok` requerido en estricto). Corrida real sobre capturas AI-OPS-235: `status=degraded`, `captures_total=2`, `usable_captures_total=0`, `access_denied_captures_total=2`, `cookies_domain_total=0`, `strict_fail_reasons=[no_usable_capture]`, `strict rc=4`; cobertura t\u00e9cnica `Ran 10 tests`, `OK` en suite conjunta de reports/captura. Evidencia: `docs/etl/sprints/AI-OPS-236/reports/senado-manual-capture-validity-gate-20260227.md`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_latest.json`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_strict_latest.json`, `docs/etl/sprints/AI-OPS-236/evidence/senado_manual_capture_validity_strict_rc_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/just_parl_check_senado_manual_capture_validity_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/python_unittest_senado_capture_and_reports_latest.txt`, `docs/etl/sprints/AI-OPS-236/evidence/tracker_status_latest.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Clasificacion evidencia -> tema (trazable)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Reglas deterministas + se\u00f1ales ML opcionales (siempre auditables)",
        "estado": "DONE",
        "bloque": "MVP (votos + intervenciones): evidencia se etiqueta a `topic_id` (votos via `parl_vote_event_initiatives`; intervenciones via `initiative_id`/expediente). KPIs en `/explorer-sources`: `topic_evidence_with_topic_pct` + breakdown por `topic_method`/`stance_method`.",
        "source_ids": [],
        "scope": "",
        "scope_inferred": false
      },
      {
        "tipo_dato": "Posiciones por tema (politico x scope)",
        "dominio": "Analitica",
        "fuentes_objetivo": "Agregacion reproducible + drill-down a evidencia",
        "estado": "DONE",
        "bloque": "Done now: YES. `backfill-topic-analytics` en `as_of_date=2026-02-16` dej\u00f3 ambos sets en latest alineado y cerr\u00f3 el blocker de cobertura en Congreso: `topic_set_id=1` pas\u00f3 de `12/60 (20.0%)` a `60/60 (100.0%)`, mientras `topic_set_id=2` qued\u00f3 en `23/24 (95.83%)` con latest tambi\u00e9n en `2026-02-16`; adem\u00e1s, `topic_positions_total` subi\u00f3 de `137379` a `205907` y `computed_method_votes` de `68528` a `137056` (`combined=68612`, `declared=239`). Evidencia: `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_baseline.csv`, `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_post.csv`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_baseline.log`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_recompute.log`, `docs/etl/sprints/AI-OPS-15/reports/topic_positions_reconciliation.md`. Siguiente comando: `just etl-tracker-gate`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Higiene de packetizaci\u00f3n en retries Senado (`status=403/404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Export de cola accionable + selecci\u00f3n de packet fresco reproducible",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-332 cierra la deuda de producto y formaliza el contrato `retry_packet_only_dedup` en toolchain: nuevo script `scripts/export_senado_retry_packet_only_dedup.py`, pruebas `tests/test_export_senado_retry_packet_only_dedup.py` (incluye fail-fast por agotamiento can\u00f3nico), y lanes operativos `Justfile` (`parl-export-senado-retry-packet-only-dedup`, `parl-check-senado-retry-packet-only-dedup`). Ejecuci\u00f3n real en DB principal: `status=403` (`pool_rows_total=169`, `excluded_used_urls_total=160`, `fresh_rows_total=9`) y `status=404` (`pool_rows_total=793`, `excluded_used_urls_total=7`, `fresh_rows_total=80`) con artefactos reproducibles de URLs usadas/refs y contrato estricto aplicable en cada sprint. Evidencia: `scripts/export_senado_retry_packet_only_dedup.py`, `tests/test_export_senado_retry_packet_only_dedup.py`, `docs/etl/sprints/AI-OPS-332/evidence/senado_status403_fresh_packet_summary_20260301T005820Z.json`, `docs/etl/sprints/AI-OPS-332/evidence/senado_status404_fresh_packet_summary_20260301T005820Z.json`, `docs/etl/sprints/AI-OPS-332/evidence/senado_retry_packet_used_refs_20260301T005820Z.txt`, `docs/etl/sprints/AI-OPS-332/evidence/senado_retry_packet_used_urls_20260301T005820Z.txt`, `docs/etl/sprints/AI-OPS-332/reports/senado-packet-dedupe-toolchain-and-dual-lane-retry-20260301.md`. Siguiente comando: `SENADO_RETRY_PACKET_POOL_CSV=docs/etl/sprints/<SPRINT>/exports/senado_status404_actionable_pool.csv SENADO_RETRY_PACKET_OUT=docs/etl/sprints/<SPRINT>/evidence/senado_status404_fresh_packet_summary.json SENADO_RETRY_PACKET_CSV_OUT=docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet.csv just parl-check-senado-retry-packet-only-dedup`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Lane `status=404` Senado: conversi\u00f3n de packet fresco a descargas efectivas",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry acotado + lever de cookie fresca + fallback alternativo",
        "estado": "PARTIAL",
        "bloque": "Gap actualizado: la lane queda operativamente cerrada en t\u00e9rminos de conversi\u00f3n de packet (`AI-OPS-355`: `candidate_urls=24`, `fetched_ok=24`, `runtime=6.64s`, `failures=0`) y habilita los avances posteriores en `403` y `status=0` hasta AI-OPS-360. El residual global persiste fuera de `404`, pero el riesgo de throughput/runtime de esta lane queda resuelto. Evidencia: `docs/etl/sprints/AI-OPS-355/reports/senado-manual-cookie-packet25-runtime-and-delta-20260301.md`, `docs/etl/sprints/AI-OPS-355/evidence/senado_status404_manual_cookie_archive_retry_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_packet50_conversion_delta_ai_ops_357_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_packet50_refetch_third_pass_delta_ai_ops_360_20260301T091018Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-linked-to-votes --only-status 403 --limit 50 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv && python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404 --retry-forbidden --refetch-existing --cookie-file <fresh_cookie_file> --limit-initiatives 50 --max-docs-per-initiative 1 --timeout 12`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Lane `status=404` Senado: cubrir `archive fallback` sin snapshots candidatos",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Enriquecimiento de candidatos de replay (Wayback/Memento seeds) para URLs sin historial",
        "estado": "PARTIAL",
        "bloque": "AI-OPS-351 no reabre capacidad en `status=404` (`fresh_rows_total=0`) y mantiene estable el bloque residual de `no snapshot candidates` en consolidado hist\u00f3rico. Cola residual consolidada reciente (evidencia acumulada `AI-OPS-*`): `archive_no_snapshot_failures_total=441`, `unique_urls_total=316`; la lane sigue `PARTIAL` y requiere seed/captura alterna para URLs sin historial p\u00fablico. Evidencia: `docs/etl/sprints/AI-OPS-351/evidence/senado_status404_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_archive_gap_urls_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/exports/senado_archive_gap_urls_20260301T074257Z.csv`, `docs/etl/sprints/AI-OPS-340/reports/senado-status404-archive-family-probes-and-gap-export-20260301.md`. Siguiente comando: `python3 scripts/report_senado_cookie_lever_status.py --cookie-file <fresh_cookie_file> --strict --out docs/etl/sprints/<SPRINT>/evidence/senado_cookie_lever_status_<TS>.json && python3 scripts/export_senado_manual_capture_pending_targets.py --validity-json docs/etl/sprints/<SPRINT>/evidence/senado_manual_capture_validity_<TS>.json --out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_<TS>.csv --commands-out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh && bash docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Eficiencia de packet `status=404`: evitar burst desperdiciado por `skipped_redundant_global_urls`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Prefiltro/score de packet para maximizar `candidate_urls` \u00fatiles",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-334 cierra el gap controlable de eficiencia con dos hardenings complementarios: (1) `export_missing_initiative_doc_urls.py` alinea `--exclude-redundant-senado-global` con el criterio operativo del backfill (alternativa descargada detectada por `source_record_pk IS NOT NULL` + patr\u00f3n de URL), y (2) `backfill-initiative-documents` ignora `max_docs_per_initiative` cuando el scope est\u00e1 expl\u00edcitamente seleccionado (`selected_scope_ignores_doc_cap=true`), evitando truncar URLs del packet. Validaci\u00f3n en DB principal (`status=404`, linked-to-votes): pool `raw_rows 877 -> actionable_rows 802` (`-75` redundantes) y dry-run contractual sobre packet `80` (`--retry-http-statuses 599`, sin red) mejora `candidate_urls 24 -> 80`, `selected_doc_urls_not_in_candidates 56 -> 0`, `skipped_redundant_global_urls 79 -> 40`. Cobertura de regresi\u00f3n en tests: `tests/test_export_missing_initiative_doc_urls.py` + `tests/test_parl_text_documents.py`. Evidencia: `docs/etl/sprints/AI-OPS-334/reports/senado-status404-packet-efficiency-scope-alignment-20260301T011834Z.md`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_pool_prefilter_delta_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_raw_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_actionable_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/senado_status404_retry_dryrun_delta_20260301T011834Z.json`, `docs/etl/sprints/AI-OPS-334/evidence/unittest_packet_efficiency_scope_fix_20260301T011834Z.txt`, `docs/etl/sprints/AI-OPS-334/evidence/tracker_status_20260301T011834Z.log`, `docs/etl/sprints/AI-OPS-334/evidence/e2e_tracker_status_20260301T011834Z.log`. Siguiente comando: `SENADO_COOKIE_LEVER_FILE=<fresh_cookie_file> just parl-check-senado-cookie-lever-status && SENADO_RETRY_PACKET_POOL_CSV=docs/etl/sprints/<SPRINT>/exports/senado_status404_pool_actionable_<TS>.csv SENADO_RETRY_PACKET_OUT=docs/etl/sprints/<SPRINT>/evidence/senado_status404_fresh_packet_summary_<TS>.json SENADO_RETRY_PACKET_CSV_OUT=docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet_<TS>.csv just parl-check-senado-retry-packet-only-dedup && python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db <db> --initiative-source-ids senado_iniciativas --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status404_fresh_packet_<TS>.csv --retry-http-statuses 404 --archive-fallback --archive-fallback-http-statuses 404 --cookie-file <fresh_cookie_file> --limit-initiatives 80 --max-docs-per-initiative 1 --timeout 15`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre de iniciativas Senado sin documento (linked_to_votes)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cola prioritaria `zero_doc_initiatives` + replay dirigido por iniciativa",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 cierra la cola `zero_doc` en linked-to-votes con retry dirigido `status=403` (`packet25`, `fetched_ok=25`, `failures=0`) y deja `zero_doc_initiatives 5->0`, a la vez que completa cobertura ciudadana `linked_to_votes_with_downloaded_docs 746/751 -> 751/751` (`100%`). Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_manual_cookie_archive_retry_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/quality_initiatives_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cohorte zero-doc cr\u00edtica (`leg14 tipo622/626`) sin snapshots",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Preparaci\u00f3n de lane de captura/replay alterno para 5 iniciativas sin documento",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 elimina el bloqueo de la cohorte cr\u00edtica dentro del scope linked-to-votes: `zero_doc_initiatives 5->0` y cobertura completa `751/751`. La lane de captura/replay alterno deja de ser cr\u00edtica para este objetivo espec\u00edfico y pasa a mantenimiento preventivo fuera de este item. Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_before_status403_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Diversificaci\u00f3n de lane residual tras contracci\u00f3n de packet `status=404`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Explorar cola accionable `status=500` y comparar conversi\u00f3n vs lane `404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-351 ejecuta el DoD completo y cierra la decisi\u00f3n `keep_or_drop`: lane `status=500` en scope linked-to-votes sin capacidad (`pool_rows_total=0`, `fresh_rows_total=0`, `strict_fail_reasons=[no_pool_rows,fresh_rows_below_min]`) y comparaci\u00f3n directa confirma agotamiento tambi\u00e9n en `status=404` (`pool_rows_total=408`, `fresh_rows_total=0`) y `zero_doc` (`pool_rows_total=17`, `fresh_rows_total=0`) bajo dedupe can\u00f3nico. Decisi\u00f3n operativa registrada: `status500_linked_to_votes=drop_for_now_no_pool_rows`; reabrir solo ante nueva se\u00f1al/leverage externo. Evidencia: `docs/etl/sprints/AI-OPS-351/reports/senado-packet-exhaustion-and-status500-lane-decision-20260301.md`, `docs/etl/sprints/AI-OPS-351/evidence/senado_status500_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_status404_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_zero_doc_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_lane_decision_ai_ops_351_20260301T074257Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reseed de capacidad fresca Senado tras agotamiento can\u00f3nico (`404`/`zero_doc`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Reabrir `candidate_urls` con nueva palanca reproducible (cookie fresca/manual capture/familias URL nuevas)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-352 reabre la palanca (`manual_capture_validity=ok`, `usable_captures_total=2`) y AI-OPS-353 demuestra conversi\u00f3n efectiva en retry real con cookie (`fetched_ok=2`, `archive_hits=2`) logrando delta neta de cobertura (`downloaded_doc_links 4802->4804`, `missing_doc_links_actionable 4561->4559`). Se cumple el DoD de reseed con evidencia reproducible end-to-end y post-proceso estructural en verde (`downloaded_missing_extraction=0`). Evidencia: `docs/etl/sprints/AI-OPS-352/reports/senado-manual-capture-reseed-and-retry-20260301.md`, `docs/etl/sprints/AI-OPS-353/reports/senado-manual-cookie-archive-packet-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_capture_retry_cycle_20260301T075958Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/senado_status404_manual_cookie_archive_retry_packet8_20260301T080845Z.log`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_353_20260301T081020Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n de palanca manual reabierta a delta neta (`downloaded_doc_links`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Explotar la palanca `usable_capture` para recuperar docs y no s\u00f3lo reclasificar status",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-353 cumple el objetivo con un retry acotado reproducible (`status=404`, packet `8`, cookie manual): `fetched_ok=2`, `archive_fetched_ok=2`, `text_documents_upserted=2`, y delta neta verificable en KPI (`downloaded_doc_links +2`, `missing_doc_links_actionable -2`, `missing_doc_links_actionable_linked_to_votes -2`). Post-proceso ejecutado para mantener calidad (`initiative_doc_extractions upserted=2`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-353/reports/senado-manual-cookie-archive-packet-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-353/evidence/senado_status404_manual_cookie_archive_retry_packet8_20260301T080845Z.log`, `docs/etl/sprints/AI-OPS-353/evidence/quality_initiatives_after_archive_packet8_postprocess_20260301T081020Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/initiative_doc_extractions_backfill_after_archive_packet8_20260301T081020Z.json`, `docs/etl/sprints/AI-OPS-353/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_353_20260301T081020Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Escalado controlado de conversi\u00f3n manual-cookie (`status=404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Subir throughput de packet (`8 -> 25`) manteniendo runtime acotado y delta neta por slice",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-355 cumple el DoD completo con packet operativo (`24/25`), runtime guard en verde (`6.64s`, sin timeout/interrupci\u00f3n) y delta neta muy superior al m\u00ednimo exigido: `downloaded_doc_links 4804->4828` (`+24`), `missing_doc_links_actionable 4559->4535` (`-24`), `missing_urls 783->759` (`-24`). Retry estructurado sin fallos (`fetched_ok=24`, `failures=0`, `archive_hits=0`). Evidencia: `docs/etl/sprints/AI-OPS-355/reports/senado-manual-cookie-packet25-runtime-and-delta-20260301.md`, `docs/etl/sprints/AI-OPS-355/evidence/senado_status404_manual_cookie_archive_retry_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/senado_manual_cookie_archive_conversion_delta_ai_ops_355_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/quality_initiatives_after_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-355/evidence/senado_waf_block_profile_after_packet25_20260301T084757Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual `status=403` (linked_to_votes)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet acotado con cookie/manual capture para reducir bloqueo WAF en cola cr\u00edtica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-356 ejecuta packet `25` en `status=403` con runtime guard (`5.39s`) y cumple sobradamente el DoD: `downloaded_doc_links +25`, `missing_urls -26`, `blocked_403_urls -25` y `zero_doc_initiatives 5->0`, con retry limpio (`fetched_ok=25`, `failures=0`). Evidencia: `docs/etl/sprints/AI-OPS-356/reports/senado-status403-packet25-conversion-and-zero-doc-closure-20260301.md`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_manual_cookie_archive_retry_packet25_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_status403_conversion_delta_ai_ops_356_20260301T085540Z.json`, `docs/etl/sprints/AI-OPS-356/evidence/senado_waf_block_profile_after_status403_packet25_20260301T085540Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n del residual `status=403` tras conversi\u00f3n inicial (`164` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Escalado controlado `packet50` en `403` con guard de runtime y delta neta adicional",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-357 ejecuta el `packet50` con guard de runtime (`9.48s`) y cumple ampliamente el DoD: `blocked_403_urls 164->114` (`-50`) y `missing_urls 733->683` (`-50`), adem\u00e1s de `downloaded_doc_links +50` y retry limpio (`fetched_ok=50`, `failures=0`). Post-proceso estructural en verde (`extractions upserted=99`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-357/reports/senado-status403-packet50-residual-reduction-20260301.md`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_packet50_conversion_delta_ai_ops_357_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_manual_cookie_archive_retry_packet50_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_waf_block_profile_after_status403_packet50_20260301T085854Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n del residual `status=0` (unknown) en linked-to-votes",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=0` con retry controlado + reclasificaci\u00f3n de fetch-status",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-358 valida la lane `status=0` con patr\u00f3n `refetch`: tras un primer intento no efectivo por filtros, la corrida corregida (`--refetch-existing`, sin `--retry-http-statuses`) ejecuta `packet50` en `5.81s` con `fetched_ok=50`, `failures=0`, y cumple el DoD con delta material (`unknown_status_urls 217->167`, `missing_urls 683->633`, `downloaded_doc_links +50`). Evidencia: `docs/etl/sprints/AI-OPS-358/reports/senado-status0-packet50-refetch-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-358/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/senado_status0_packet50_refetch_delta_ai_ops_358_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T090203Z.json`, `docs/etl/sprints/AI-OPS-358/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T090203Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=0` tras primer packet refetch (`167` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `packet50` (refetch) con control de saturaci\u00f3n y delta incremental",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-359 ejecuta la segunda pasada `status=0` con patr\u00f3n refetch y cumple sobradamente el DoD: `unknown_status_urls 167->117` (`-50`), `missing_urls 633->583` (`-50`), `downloaded_doc_links 4953->5003` (`+50`), runtime `6.27s`, retry limpio (`fetched_ok=50`, `failures=0`) y post-proceso en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-359/reports/senado-status0-packet50-refetch-second-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-359/evidence/senado_status0_packet50_refetch_second_pass_delta_ai_ops_359_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T090541Z.json`, `docs/etl/sprints/AI-OPS-359/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T090541Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre residual combinado (`status=0` + `status=403`) tras segunda pasada refetch",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Iteraci\u00f3n priorizada por cohorte en linked-to-votes (packet50)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-360 ejecuta la iteraci\u00f3n adicional y cumple el DoD: `unknown_status_urls 117->67` (`-50`) y `missing_urls 583->533` (`-50`) sin regresi\u00f3n en `blocked_403_urls` (`114->114`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`), runtime guard en verde (`5.59s`) y post-proceso estable (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-360/reports/senado-status0-packet50-refetch-third-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_packet50_refetch_third_pass_delta_ai_ops_360_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_manual_cookie_archive_retry_packet50_refetch_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T091018Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T091018Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=403` tras cierre combinado (`114` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=403` con refetch + cookie fresca",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-361 ejecuta `packet50` en `status=403` y cumple el DoD con margen: `blocked_403_urls 114->64` (`-50`) y `missing_urls 533->484` (`-49`), adem\u00e1s de `downloaded_doc_links 5053->5102` (`+49`). Retry con alta conversi\u00f3n (`candidate_urls=50`, `fetched_ok=49`, `failures=1`, `runtime=20.54s`) y post-proceso estructural en verde (`extractions upserted=49`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-361/reports/senado-status403-packet50-refetch-residual-reduction-20260301.md`, `docs/etl/sprints/AI-OPS-361/evidence/senado_status403_packet50_refetch_delta_ai_ops_361_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/senado_status403_manual_cookie_archive_retry_packet50_refetch_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_refetch_20260301T091550Z.json`, `docs/etl/sprints/AI-OPS-361/evidence/senado_waf_block_profile_after_status403_packet50_refetch_20260301T091550Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=0` tras contracci\u00f3n de `status=403` (`68` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=0` con refetch para limpiar bucket unknown en linked-to-votes",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-362 ejecuta `packet50` en `status=0` y cumple el DoD con margen: `unknown_status_urls 68->18` (`-50`) y `missing_urls 484->434` (`-50`), adem\u00e1s de `downloaded_doc_links 5102->5152` (`+50`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `runtime=10.53s`) y post-proceso estructural en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-362/reports/senado-status0-packet50-refetch-fourth-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-362/evidence/senado_status0_packet50_refetch_delta_ai_ops_362_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/senado_status0_archive_retry_packet50_refetch_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/initiative_doc_extractions_only_missing_after_status0_packet50_refetch_20260301T092037Z.json`, `docs/etl/sprints/AI-OPS-362/evidence/senado_waf_block_profile_after_status0_packet50_refetch_20260301T092037Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=403` tras contracci\u00f3n de `status=0` (`64` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=403` con refetch + cookie fresca para cerrar cola WAF cr\u00edtica",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-363 ejecuta `packet50` en `status=403` y cumple ampliamente el DoD: `blocked_403_urls 64->14` (`-50`) y `missing_urls 434->384` (`-50`), adem\u00e1s de `downloaded_doc_links 5152->5202` (`+50`). Retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `runtime=5.93s`) y post-proceso estructural en verde (`extractions upserted=50`, `needs_review=0`). Evidencia: `docs/etl/sprints/AI-OPS-363/reports/senado-status403-packet50-refetch-fifth-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-363/evidence/senado_status403_packet50_refetch_delta_ai_ops_363_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/senado_status403_archive_retry_packet50_refetch_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/initiative_doc_extractions_only_missing_after_status403_packet50_refetch_20260301T092434Z.json`, `docs/etl/sprints/AI-OPS-363/evidence/senado_waf_block_profile_after_status403_packet50_refetch_20260301T092434Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n residual `status=404` tras contracci\u00f3n de `status=403` (`347` URLs)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet dirigido `status=404` con retry filtrado + archive fallback para bajar cola dominante",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-364 ejecuta el retry comprometido (`packet50`) y cierra la iteraci\u00f3n por anti-loop sin palanca nueva: `candidate_urls=18`, `fetched_ok=0`, `failures=18`, `archive_hits=0`, runtime `271.83s`; m\u00e9tricas sin cambio (`downloaded_doc_links 5202->5202`, `missing_urls 384->384`). El fallo es consistente y reproducible (`archive fallback: no snapshot candidates`) para la cohorte `detalleiniciativa` (`18` URLs \u00fanicas). Evidencia: `docs/etl/sprints/AI-OPS-364/reports/senado-status404-packet50-no-new-lever-20260301.md`, `docs/etl/sprints/AI-OPS-364/evidence/senado_status404_archive_retry_packet50_refetch_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/evidence/senado_status404_packet50_refetch_delta_ai_ops_364_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/evidence/senado_archive_gap_urls_20260301T092750Z.json`, `docs/etl/sprints/AI-OPS-364/exports/senado_archive_gap_urls_20260301T092750Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Habilitar nueva palanca para residual `status=404` sin snapshots (`detalleiniciativa`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Captura/seed alterna reproducible para cohorte `leg10 tipo610`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-365 valida palanca disponible (`manual_capture_validity.status=ok`, `usable_captures_total=4`) y ejecuta dos probes dirigidos sobre la cohorte `18` URLs (`cookie` gen\u00e9rica usable + cookie espec\u00edfica `leg10 tipo610`), ambos sin conversi\u00f3n (`fetched_ok=0`, `archive_hits=0`) y sin delta KPI (`downloaded_doc_links 5202->5202`, `missing_urls 384->384`). Se cierra el objetivo por no efectividad de palanca en esta cohorte y se requiere fallback t\u00e9cnico alterno. Evidencia: `docs/etl/sprints/AI-OPS-365/reports/senado-status404-cookie-lever-probe-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-365/evidence/senado_manual_capture_validity_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_manual_capture_pending_targets_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_status404_gap_cookie_retry_delta_ai_ops_365_20260301T094234Z.json`, `docs/etl/sprints/AI-OPS-365/evidence/senado_status404_gap_cookie_retry_leg10_delta_ai_ops_365_20260301T094234Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Fallback t\u00e9cnico para `detalleiniciativa` sin snapshots (`status=404`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Resolver URL alterna/derivada o fuente espejo para cohorte `leg10 tipo610`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-366 implementa fallback determinista `direct_variant` (derivaci\u00f3n `detalleiniciativa -> ficopendataservlet tipoFich=3/12`) en `text_documents.py`, a\u00f1ade cobertura unitaria espec\u00edfica y ejecuta retries reales sobre la cohorte `18` URLs con cookie y Playwright (`direct_variant_attempted_urls=18`, `direct_variant_candidate_urls=36`) sin conversi\u00f3n (`fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI de cobertura: `downloaded_doc_links 5202->5202`, `missing_urls 384->384`; la cohorte se reclasifica a bloqueo `403` (`blocked_403_urls 14->32`). Evidencia: `docs/etl/sprints/AI-OPS-366/reports/senado-status404-direct-variant-fallback-and-playwright-probe-20260301.md`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_retry_20260301T100159Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_playwright_v2_retry_20260301T101836Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/senado_status404_direct_variant_playwright_v2_delta_ai_ops_366_20260301T101836Z.json`, `docs/etl/sprints/AI-OPS-366/evidence/e2e_tracker_status_with_tracker_20260301T100159Z.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n de cohorte `detalleiniciativa` reclasificada a `status=403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Retry dirigido con perfil de navegador fresco (challenge-resolved) sobre paquete fijo",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-367 ejecuta el replay comprometido sobre la cohorte fija de `18` URLs (`docs/etl/sprints/AI-OPS-364/exports/senado_archive_gap_urls_20260301T092750Z.csv`) con perfil de navegador fresco y captura dedicada; la captura nueva queda en `Access Denied` sin cookies \u00fatiles (`no_domain_cookies`, `no_unexpired_persistent_cookies`) y el retry mantiene bloqueo homog\u00e9neo (`candidate_urls=18`, `fetched_ok=0`, `direct_variant_attempted_urls=18`, `direct_variant_fetched_ok=0`, `failures=18`, `HTTP 403 (playwright)`). Delta KPI de cobertura: `downloaded_doc_links 5202->5202`, `missing_doc_links_actionable 4160->4160`, `missing_urls 384->384`, `blocked_403_urls 32->32`. Evidencia: `docs/etl/sprints/AI-OPS-367/reports/senado-status403-fresh-profile-no-new-lever-closure-20260301.md`, `docs/etl/sprints/AI-OPS-367/evidence/senado_cookie_lever_status_fresh_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/senado_status403_profile_retry_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/senado_status403_profile_retry_delta_ai_ops_367_20260301T102943Z.json`, `docs/etl/sprints/AI-OPS-367/evidence/e2e_tracker_status_with_tracker_20260301T102943Z.log`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Structuraci\u00f3n reproducible del residual `status=404` + dedupe can\u00f3nico",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Perfil WAF actualizado + packetizaci\u00f3n por cohortes + dedupe contra hist\u00f3rico",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-368 cierra la parte controlable de preparaci\u00f3n/limpieza de cola: perfil actualizado (`missing_urls=384`, `status=404=329`, `status=403=32`, `status=0=18`, `status=200=5`), packetizaci\u00f3n por cohortes (`selected_cohorts_total=6`, `packet_rows_total=108`, `packet_unique_initiatives_total=97`) y dedupe can\u00f3nico del pool `status=404` (`pool_rows_total=329`, `used_urls_total=1389`, `fresh_rows_total=0`, `strict_fail_reasons=[packet_exhausted_by_canonical_dedupe]`). El resultado formaliza agotamiento de capacidad fresca para `404` sin nueva palanca. Evidencia: `docs/etl/sprints/AI-OPS-368/reports/senado-status404-packet-structuring-and-dedupe-exhaustion-20260301.md`, `docs/etl/sprints/AI-OPS-368/evidence/senado_waf_block_profile_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/evidence/senado_status404_fresh_packet_summary_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/evidence/senado_waf_cohort_packets_20260301T103942Z.json`, `docs/etl/sprints/AI-OPS-368/exports/senado_status404_fresh_packet_20260301T103942Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n puntual del residual no bloqueado (`status=0`/`status=200`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico y acotado en `linked_to_votes` tras agotamiento `404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-369 ejecuta la lane comprometida y supera el DoD con margen: packet `status=0` (`18` URLs) + packet `status=200` (`5` URLs), retry total `fetched_ok=21/23` (`archive_hits=21`) y delta KPI material `downloaded_doc_links 5202->5223` (`+21`), `missing_doc_links_actionable 4160->4139` (`-21`), `missing_urls 384->363` (`-21`), adem\u00e1s de drenar buckets no bloqueados (`unknown_status_urls 18->0`, `status=200 5->0`). Postproceso estructural completado en el mismo slice: `backfill_initiative_doc_excerpts` (`seen=351`, `updated=351`) + `backfill_initiative_doc_extractions --only-missing` (`seen=21`, `upserted=21`, `needs_review=0`), dejando `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-369/reports/senado-status0-200-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status0_retry_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status200_retry_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/senado_status0_200_conversion_delta_ai_ops_369_20260301T104519Z.json`, `docs/etl/sprints/AI-OPS-369/evidence/quality_initiatives_after_postprocess_20260301T104519Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual bloqueado `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet32` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-370 ejecuta la lane comprometida y supera el DoD con margen: packet `status=403` (`32` URLs), retry total `fetched_ok=10/32` (`archive_hits=10`) y delta KPI material `downloaded_doc_links 5223->5233` (`+10`), `missing_doc_links_actionable 4139->4129` (`-10`), `missing_urls 363->353` (`-10`), `blocked_403_urls 32->22` (`-10`). Postproceso estructural completado en el mismo slice: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=10`, `upserted=10`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-370/reports/senado-status403-packet32-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-370/evidence/senado_status403_retry_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/senado_status403_conversion_delta_ai_ops_370_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/senado_waf_block_profile_after_20260301T105944Z.json`, `docs/etl/sprints/AI-OPS-370/evidence/quality_initiatives_after_postprocess_20260301T105944Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-371 ejecuta la lane comprometida y supera el DoD con margen, tras corregir packet subllenado (`limit=50` inicial: `rows=9`, `fetched_ok=2`) con packet efectivo (`rows=50`, `fetched_ok=18`). Delta KPI consolidada del slice: `downloaded_doc_links 5233->5253` (`+20`), `missing_doc_links_actionable 4129->4109` (`-20`), `missing_urls 353->333` (`-20`), `status=404 331->272` (`-59`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=20`, `upserted=20`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-371/reports/senado-status404-packet50-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_retry_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_retry_packet50_effective_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/senado_status404_conversion_delta_ai_ops_371_20260301T111618Z.json`, `docs/etl/sprints/AI-OPS-371/evidence/quality_initiatives_after_postprocess_final_20260301T111618Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual reclasificado `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo sobre cohorte post-`404`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-372 ejecuta la lane comprometida y supera ampliamente el DoD: `packet_rows=50`, `candidate_urls=50`, `fetched_ok=34`, `failures=16`, con conversi\u00f3n dominante en variantes directas (`direct_variant_fetched_ok=34`). Delta KPI del slice: `downloaded_doc_links 5253->5287` (`+34`), `missing_doc_links_actionable 4109->4075` (`-34`), `missing_urls 333->299` (`-34`), `blocked_403_urls 61->27` (`-34`), `status=404` estable (`272`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=27`, `updated=27`) + `backfill_initiative_doc_extractions --only-missing` (`seen=34`, `upserted=34`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-372/reports/senado-status403-packet50-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-372/evidence/senado_status403_retry_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/senado_status403_conversion_delta_ai_ops_372_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/senado_waf_block_profile_after_20260301T114610Z.json`, `docs/etl/sprints/AI-OPS-372/evidence/quality_initiatives_after_postprocess_20260301T114610Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida del residual dominante `status=404` (`linked_to_votes`) tras contracci\u00f3n `403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Replay \u00fanico `packet50` con fallback archivo y cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-373 ejecuta la lane comprometida y supera ampliamente el DoD: export `limit=50` queda subllenado (`rows=0`), se corrige en el mismo slice con packet efectivo (`rows=50`) y retry limpio (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5287->5337` (`+50`), `missing_doc_links_actionable 4075->4025` (`-50`), `missing_urls 299->249` (`-50`), `status=404 272->222` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=17`, `updated=17`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-373/reports/senado-status404-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_packet_underfill_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_retry_packet50_effective_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/senado_status404_conversion_delta_ai_ops_373_20260301T131100Z.json`, `docs/etl/sprints/AI-OPS-373/evidence/quality_initiatives_after_postprocess_20260301T131100Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n iterativa del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-374 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5337->5387` (`+50`), `missing_doc_links_actionable 4025->3975` (`-50`), `missing_urls 249->199` (`-50`), `status=404 222->172` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-374/reports/senado-status404-packet50-effective-second-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-374/evidence/senado_status404_retry_packet50_effective_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/senado_status404_conversion_delta_ai_ops_374_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/senado_waf_block_profile_after_20260301T133600Z.json`, `docs/etl/sprints/AI-OPS-374/evidence/quality_initiatives_after_postprocess_20260301T133600Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Reducci\u00f3n iterativa final del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-375 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5387->5437` (`+50`), `missing_doc_links_actionable 3975->3925` (`-50`), `missing_urls 199->149` (`-50`), `status=404 172->122` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-375/reports/senado-status404-packet50-effective-third-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-375/evidence/senado_status404_retry_packet50_effective_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/senado_status404_conversion_delta_ai_ops_375_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/senado_waf_block_profile_after_20260301T140000Z.json`, `docs/etl/sprints/AI-OPS-375/evidence/quality_initiatives_after_postprocess_20260301T140000Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-376 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5437->5487` (`+50`), `missing_doc_links_actionable 3925->3875` (`-50`), `missing_urls 149->99` (`-50`), `status=404 122->72` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-376/reports/senado-status404-packet50-effective-fourth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-376/evidence/senado_status404_retry_packet50_effective_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/senado_status404_conversion_delta_ai_ops_376_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/senado_waf_block_profile_after_20260301T131535Z.json`, `docs/etl/sprints/AI-OPS-376/evidence/quality_initiatives_after_postprocess_20260301T131535Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo adicional del residual dominante `status=404` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-377 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=50`, `fetched_ok=50`, `failures=0`, `direct_variant_fetched_ok=50`). Delta KPI del slice: `downloaded_doc_links 5487->5537` (`+50`), `missing_doc_links_actionable 3875->3825` (`-50`), `missing_urls 99->49` (`-50`), `status=404 72->22` (`-50`), `blocked_403_urls` estable (`27`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=50`, `upserted=50`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-377/reports/senado-status404-packet50-effective-fifth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-377/evidence/senado_status404_retry_packet50_effective_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/senado_status404_conversion_delta_ai_ops_377_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/senado_waf_block_profile_after_20260301T133909Z.json`, `docs/etl/sprints/AI-OPS-377/evidence/quality_initiatives_after_postprocess_20260301T133909Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante `status=403` (`linked_to_votes`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-378 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=27`, `fetched_ok=27`, `failures=0`, `direct_variant_fetched_ok=27`). Delta KPI del slice: `downloaded_doc_links 5537->5564` (`+27`), `missing_doc_links_actionable 3825->3798` (`-27`), `missing_urls 49->22` (`-27`), `status=403 27->0` (`-27`), `status=404` estable (`22`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=27`, `upserted=27`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-378/reports/senado-status403-packet50-effective-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_retry_packet50_effective_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/senado_status403_conversion_delta_ai_ops_378_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/senado_waf_block_profile_after_20260301T135949Z.json`, `docs/etl/sprints/AI-OPS-378/evidence/quality_initiatives_after_postprocess_20260301T135949Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Cierre iterativo del residual dominante `status=404` (`linked_to_votes`) tras cierre `status=403`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Nueva pasada `packet50` efectivo con cierre anti-loop expl\u00edcito",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-379 ejecuta la lane comprometida con replay limpio sobre packet efectivo (`candidate_urls=22`, `fetched_ok=22`, `failures=0`, `direct_variant_fetched_ok=22`). Delta KPI del slice: `downloaded_doc_links 5564->5586` (`+22`), `missing_doc_links_actionable 3798->3776` (`-22`), `missing_urls 22->0` (`-22`), `status=404 22->0` (`-22`), con `status=403` estable (`0`). Postproceso estructural completado: `backfill_initiative_doc_excerpts` (`seen=0`, `updated=0`) + `backfill_initiative_doc_extractions --only-missing` (`seen=22`, `upserted=22`, `needs_review=0`), manteniendo `downloaded_doc_links_missing_excerpt=0` y `downloaded_doc_links_missing_extraction=0`. Evidencia: `docs/etl/sprints/AI-OPS-379/reports/senado-status404-packet50-effective-sixth-pass-conversion-and-postprocess-20260301.md`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_retry_packet50_effective_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_status404_conversion_delta_ai_ops_379_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/senado_waf_block_profile_after_20260301T141409Z.json`, `docs/etl/sprints/AI-OPS-379/evidence/quality_initiatives_after_postprocess_20260301T141409Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Priorizaci\u00f3n del residual global Senado tras contracci\u00f3n `status=403` (`status=403` vs `status=500`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Comparativa de conversi\u00f3n en packets globales no `linked_to_votes` con `--include-unlinked`",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-381 ejecuta la pasada `status=500` (`packet50`) en scope global no linkeado con `--include-unlinked`: `candidate_urls=50`, `fetched_ok=0`, `archive_hits=17`, `archive_fetched_ok=0`, `failures=30`. Delta neta de cobertura nula (`downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`) y reclasificaci\u00f3n de bucket `status500 1749->1699` (`-50`) sin mejora de descarga; se cierra la comparaci\u00f3n y se mantiene prioridad de conversi\u00f3n en lane `status=403`. Evidencia: `docs/etl/sprints/AI-OPS-381/reports/senado-status500-global-priority-probe-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-381/evidence/senado_status500_global_conversion_delta_ai_ops_381_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/senado_status500_global_retry_packet50_effective_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/quality_initiatives_after_postprocess_20260301T145104Z.json`, `docs/etl/sprints/AI-OPS-381/evidence/senado_waf_block_profile_global_after_20260301T145104Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n dirigida por cohortes WAF del residual global Senado (palanca nueva)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet por cohortes (`legislature/tipo_expediente`) + prioridad `zero-doc`",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-389 ejecuta la palanca de cohortes WAF sobre residual global no `linked_to_votes` con export estructurado (`selected_cohorts_total=6`, `zero_doc_priority_total=40`, `packet_rows_total=181`) y replay `packet50` efectivo; resultado con conversi\u00f3n material en una sola pasada: `candidate_urls=50`, `fetched_ok=25`, `failures=25`, `direct_variant_fetched_ok=25`, postproceso completo (`excerpts updated=10`, `extractions upserted=25`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5747->5772` (`+25`), `missing_doc_links_actionable 3615->3590` (`-25`), `missing_urls 3615->3590` (`-25`), `status403 1610->1585` (`-25`), `status500 1599->1586` (`-13`), `status404 326->339` (`+13`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-389/reports/senado-waf-cohort-packet50-pass1-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_cohort_packet_conversion_delta_ai_ops_389_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_cohort_packet_retry_packet50_effective_pass1_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/quality_initiatives_after_pass1_20260301T191912Z.json`, `docs/etl/sprints/AI-OPS-389/evidence/senado_waf_block_profile_global_after_pass1_20260301T191912Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=500` en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet accionable `status=500` (`zero-doc`, 1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-390 ejecuta la palanca propuesta, pero la exportaci\u00f3n qued\u00f3 en cola vac\u00eda reproducible (`rows_total=0`, CSV header-only), por lo que `backfill-initiative-documents` no pudo iniciar replay (`--doc-urls-file sin doc_url validas`). Delta KPI nula (`downloaded_doc_links 5772->5772`, `missing_doc_links_actionable 3590->3590`, `missing_urls 3590->3590`, `status500 1586->1586`). Se registra `no_new_lever` para esta lane y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-390/reports/senado-status500-zero-doc-packet-empty-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-390/evidence/senado_status500_zero_doc_conversion_delta_ai_ops_390_20260301T201241Z.json`, `docs/etl/sprints/AI-OPS-390/evidence/senado_status500_zero_doc_no_new_lever_ai_ops_390_20260301T201241Z.json`, `docs/etl/sprints/AI-OPS-390/exports/senado_status500_zero_doc_actionable_packet_20260301T201241Z.csv`, `docs/etl/sprints/AI-OPS-390/exports/senado_status500_zero_doc_actionable_packet50_effective_20260301T201241Z.csv`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=500` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-391 ejecuta la lane con packet general `status=500` y conversi\u00f3n material en una pasada: export `rows_total=92`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=38`, `archive_hits=38`, `failures=12`; postproceso sem\u00e1ntico cerrado (`extractions upserted=38`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5772->5810` (`+38`), `missing_doc_links_actionable 3590->3552` (`-38`), `missing_urls 3590->3552` (`-38`), `status500 1586->1536` (`-50`), `status403` estable (`1585`), `status404 339->351` (`+12`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-391/reports/senado-status500-general-packet50-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-391/evidence/senado_status500_general_conversion_delta_ai_ops_391_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/quality_initiatives_after_pass1_20260301T201748Z.json`, `docs/etl/sprints/AI-OPS-391/evidence/senado_waf_block_profile_global_after_pass1_20260301T201748Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=500` tras delta material",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `packet50` de cola general `status=500` + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-392 ejecuta la segunda pasada de la lane `status=500` general con conversi\u00f3n material: export `rows_total=78`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=31`, `archive_hits=31`, `failures=19`; postproceso estructural completo (`extractions upserted=31`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5810->5841` (`+31`), `missing_doc_links_actionable 3552->3521` (`-31`), `missing_urls 3552->3521` (`-31`), `status500 1536->1486` (`-50`), `status403` estable (`1585`), `status404 351->370` (`+19`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-392/reports/senado-status500-general-packet50-second-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-392/evidence/senado_status500_general_conversion_delta_ai_ops_392_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/quality_initiatives_after_pass1_20260301T212733Z.json`, `docs/etl/sprints/AI-OPS-392/evidence/senado_waf_block_profile_global_after_pass1_20260301T212733Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=500` (tercera pasada)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `packet50` de cola general `status=500` + cierre anti-loop",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-393 ejecuta tercera pasada material en lane `status=500` general: export `rows_total=76`, packet efectivo `50`, replay `candidate_urls=50`, `fetched_ok=16`, `archive_hits=16`, `failures=30`; postproceso estructural completo (`extractions upserted=16`, `needs_review=0`). Delta KPI: `downloaded_doc_links 5841->5857` (`+16`), `missing_doc_links_actionable 3521->3505` (`-16`), `missing_urls 3521->3505` (`-16`), `status500 1486->1436` (`-50`), `status403` estable (`1585`), `status404 370->404` (`+34`), `zero_doc_initiatives 1089->1081` (`-8`). DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-393/reports/senado-status500-general-packet50-third-pass-conversion-20260301.md`, `docs/etl/sprints/AI-OPS-393/evidence/senado_status500_general_conversion_delta_ai_ops_393_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/senado_status500_general_retry_packet50_effective_pass1_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/quality_initiatives_after_pass1_20260301T222141Z.json`, `docs/etl/sprints/AI-OPS-393/evidence/senado_waf_block_profile_global_after_pass1_20260301T222141Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` tras reclasificaci\u00f3n desde `status=500`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` general + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-394 ejecuta la lane global `status=404` con packet efectivo (`rows_total=122`, `packet50=50`) y replay sin conversi\u00f3n (`candidate_urls=50`, `fetched_ok=0`, `archive_hits=0`, `failures=30`), manteniendo KPI y buckets estables (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`, `status404=404`, `status403=1585`, `status500=1436`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-394/reports/senado-status404-general-packet50-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_conversion_delta_ai_ops_394_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_no_new_lever_ai_ops_394_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/senado_status404_general_retry_packet50_effective_pass1_20260301T230756Z.json`, `docs/etl/sprints/AI-OPS-394/evidence/quality_initiatives_after_pass1_20260301T230756Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` + `only-initiatives-without-any-doc` (1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-395 ejecuta la lane `status=403 + zero-doc` con packet efectivo (`rows_total=122`, `packet50=50`) y replay sin conversi\u00f3n (`candidate_urls=50`, `fetched_ok=0`, `archive_hits=0`, `failures=30`), manteniendo KPI globales (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`) y reclasificando bucket (`status403 1585->1535`, `status404 404->454`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-395/reports/senado-status403-zero-doc-packet50-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_conversion_delta_ai_ops_395_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_no_new_lever_ai_ops_395_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/senado_status403_zero_doc_retry_packet50_effective_pass1_20260301T232620Z.json`, `docs/etl/sprints/AI-OPS-395/evidence/quality_initiatives_after_pass1_20260301T232620Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` + `only-initiatives-without-any-doc` (perfil acotado) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-396 ejecuta la lane `status=404 + zero-doc` con export `rows_total=50` y replay acotado `packet20` (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) en perfil bounded (`--timeout 8`, `--archive-timeout 3`) para evitar loops largos de fallback. KPI y buckets sin cambio (`downloaded_doc_links=5857`, `missing_doc_links_actionable=3505`, `status403=1535`, `status500=1436`, `status404=454`, `zero_doc_initiatives=1081`). Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-396/reports/senado-status404-zero-doc-packet20-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_conversion_delta_ai_ops_396_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_no_new_lever_ai_ops_396_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/senado_status404_zero_doc_retry_packet20_effective_pass1_20260301T235836Z.json`, `docs/etl/sprints/AI-OPS-396/evidence/quality_initiatives_after_pass1_20260301T235836Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=429` focalizada en iniciativas `zero-doc`",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=429` + `only-initiatives-without-any-doc` (1 URL/initiative) + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-397 ejecuta la lane `status=429 + zero-doc` con packet efectivo (`rows_total=12`, `packet50=12`) y replay limpio (`candidate_urls=12`, `fetched_ok=12`, `archive_hits=0`, `failures=0`), cumpliendo DoD con delta material: `downloaded_doc_links 5857->5869` (`+12`), `missing_doc_links_actionable 3505->3493` (`-12`), `missing_urls 3505->3493` (`-12`), `status429 72->60` (`-12`), `zero_doc_initiatives 1081->1069` (`-12`). Evidencia: `docs/etl/sprints/AI-OPS-397/reports/senado-status429-zero-doc-packet50-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-397/evidence/senado_status429_zero_doc_conversion_delta_ai_ops_397_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/senado_status429_zero_doc_retry_packet50_effective_pass1_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/quality_initiatives_after_pass1_20260302T000725Z.json`, `docs/etl/sprints/AI-OPS-397/evidence/senado_waf_block_profile_global_after_pass1_20260302T000725Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=429` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=429` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-398 ejecuta la lane `status=429` general en dos pasadas: pass1 (`rows_total=60`, `packet50=50`, `candidate_urls=50`, `fetched_ok=50`, `failures=0`) y pass2 (`rows_total=10`, `packet10=10`, `candidate_urls=10`, `fetched_ok=10`, `failures=0`), con postproceso estructural cerrado (`extractions needs_review=0`). Delta KPI acumulada: `downloaded_doc_links 5869->5929` (`+60`), `missing_doc_links_actionable 3493->3433` (`-60`), `missing_urls 3493->3433` (`-60`), `status429 60->0`, `zero_doc_initiatives 1069->1069`. DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-398/reports/senado-status429-general-two-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_conversion_delta_ai_ops_398_20260302T001347Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_retry_packet50_effective_pass1_20260302T001210Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/senado_status429_general_retry_packet50_effective_pass2_20260302T001347Z.json`, `docs/etl/sprints/AI-OPS-398/evidence/quality_initiatives_after_pass2_20260302T001347Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=599` (cola general accionable)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=599` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-399 ejecuta la lane `status=599` general con packet efectivo (`rows_total=8`, `packet50=8`) y replay limpio (`candidate_urls=8`, `fetched_ok=8`, `archive_hits=0`, `failures=0`), con postproceso estructural cerrado (`extractions needs_review=0`). Delta KPI: `downloaded_doc_links 5929->5937` (`+8`), `missing_doc_links_actionable 3433->3425` (`-8`), `missing_urls 3433->3425` (`-8`), `status599 8->0`, `zero_doc_initiatives 1069->1069`. DoD cumplido y fila cerrada. Evidencia: `docs/etl/sprints/AI-OPS-399/reports/senado-status599-general-packet8-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-399/evidence/senado_status599_general_conversion_delta_ai_ops_399_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/senado_status599_general_retry_packet50_effective_pass1_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/quality_initiatives_after_pass1_20260302T001840Z.json`, `docs/etl/sprints/AI-OPS-399/evidence/senado_waf_block_profile_global_after_pass1_20260302T001840Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, refresh post `429/599`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-400 ejecuta la lane `status=500` en perfil acotado por runtime (`rows_total=81`, `packet20=20`) con wrapper `timeout 300`; la pasada termina por tope de tiempo (`backfill_rc=124`) y no produce delta neta de cobertura (`downloaded_doc_links 5937->5937`, `missing_doc_links_actionable 3425->3425`, `missing_urls 3425->3425`, `zero_doc_initiatives 1069->1069`). Se observa reclasificaci\u00f3n de buckets sin conversi\u00f3n (`status500 1490->1474`, `status404 589->602`, `status200 2->5`, `status403` estable `1535`). Se cierra por anti-loop con evidencia expl\u00edcita de timeout/no_delta. Evidencia: `docs/etl/sprints/AI-OPS-400/reports/senado-status500-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-400/evidence/senado_status500_general_conversion_delta_ai_ops_400_20260302T004330Z.json`, `docs/etl/sprints/AI-OPS-400/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T004330Z.rc`, `docs/etl/sprints/AI-OPS-400/evidence/quality_initiatives_after_pass1_20260302T004330Z.json`, `docs/etl/sprints/AI-OPS-400/evidence/senado_waf_block_profile_global_after_pass1_20260302T004330Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, perfil timeboxed)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-401 ejecuta la lane `status=403` en perfil acotado (`rows_total=140`, `packet20=20`) con wrapper `timeout 300`; el replay termina sin conversi\u00f3n (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) y sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). Se observa solo reclasificaci\u00f3n de buckets (`status403 1535->1515`, `status404 519->539`, `status500=1362` estable). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-401/reports/senado-status403-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-401/evidence/senado_status403_general_conversion_delta_ai_ops_401_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/senado_status403_general_retry_packet20_effective_pass1_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/quality_initiatives_after_pass1_20260302T005159Z.json`, `docs/etl/sprints/AI-OPS-401/evidence/senado_waf_block_profile_global_after_pass1_20260302T005159Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, perfil timeboxed post no-delta `403`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-402 ejecuta la lane `status=500` en perfil acotado (`rows_total=72`, `packet20=20`) con wrapper `timeout 300`; la pasada termina por timeout (`backfill_rc=124`) y output de retry vac\u00edo (`{}`), sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). Se observa reclasificaci\u00f3n interna (`status500 1362->1355`, `status404 539->546`) con `status403` estable (`1515`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-402/reports/senado-status500-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_conversion_delta_ai_ops_402_20260302T010016Z.json`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T010016Z.json`, `docs/etl/sprints/AI-OPS-402/evidence/senado_status500_general_retry_packet20_effective_pass1_20260302T010016Z.rc`, `docs/etl/sprints/AI-OPS-402/evidence/quality_initiatives_after_pass1_20260302T010016Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (cola general accionable, perfil timeboxed post no-delta `500`)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` sin filtro `zero-doc` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-403 ejecuta la lane `status=404` en perfil acotado (`rows_total=122`, `packet20=20`) con wrapper `timeout 300`; replay sin conversi\u00f3n (`candidate_urls=20`, `fetched_ok=0`, `archive_hits=0`, `failures=20`) y sin delta neta de cobertura (`downloaded_doc_links 5946->5946`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`, `zero_doc_initiatives 1068->1068`). No hubo reclasificaci\u00f3n de buckets en la muestra ejecutada (`status404=546`, `status403=1515`, `status500=1355`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-403/reports/senado-status404-general-packet20-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-403/evidence/senado_status404_general_conversion_delta_ai_ops_403_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/senado_status404_general_retry_packet20_effective_pass1_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/quality_initiatives_after_pass1_20260302T010931Z.json`, `docs/etl/sprints/AI-OPS-403/evidence/senado_waf_block_profile_global_after_pass1_20260302T010931Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-404 ejecuta la lane `status=403` con palanca multi-URL (`rows_total=300`, `packet30=30`) y wrapper `timeout 360`; replay sin conversi\u00f3n (`candidate_urls=30`, `fetched_ok=0`, `archive_hits=0`, `failures=30`) y sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Hubo reclasificaci\u00f3n interna de bucket en el packet (`status403 1515->1485`, `status404 546->576`, `status500=1355`, `status200=0`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-404/reports/senado-status403-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-404/evidence/senado_status403_general_conversion_delta_ai_ops_404_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/senado_status403_general_retry_packet30_effective_pass1_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/quality_initiatives_after_pass1_20260302T011926Z.json`, `docs/etl/sprints/AI-OPS-404/evidence/senado_waf_block_profile_global_after_pass1_20260302T011926Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-405 ejecuta la lane `status=500` con palanca multi-URL (`rows_total=192`, `packet30=30`) y wrapper `timeout 360`; la pasada termina con timeout (`backfill_rc=124`) y salida retry vac\u00eda (`0` bytes), sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Se observa reclasificaci\u00f3n interna (`status500 1355->1345`, `status404 576->586`, `status403=1485`, `status200=0`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-405/reports/senado-status500-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-405/evidence/senado_status500_general_conversion_delta_ai_ops_405_20260302T012850Z.json`, `docs/etl/sprints/AI-OPS-405/evidence/senado_status500_general_retry_packet30_effective_pass1_20260302T012850Z.rc`, `docs/etl/sprints/AI-OPS-405/evidence/quality_initiatives_after_pass1_20260302T012850Z.json`, `docs/etl/sprints/AI-OPS-405/evidence/senado_waf_block_profile_global_after_pass1_20260302T012850Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=404` (cola general accionable, palanca multi-URL por iniciativa)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` con `max-urls-per-initiative=3` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-406 ejecuta la lane `status=404` con palanca multi-URL (`rows_total=221`, `packet30=30`) y wrapper `timeout 360`; la pasada termina con timeout (`backfill_rc=124`) y salida retry vac\u00eda (`0` bytes), sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`). Tampoco hubo reclasificaci\u00f3n de buckets en la muestra (`status404 586->586`, `status403 1485->1485`, `status500 1345->1345`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-406/reports/senado-status404-general-multiurl-packet30-timebox-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-406/evidence/senado_status404_general_conversion_delta_ai_ops_406_20260302T014059Z.json`, `docs/etl/sprints/AI-OPS-406/evidence/senado_status404_general_retry_packet30_effective_pass1_20260302T014059Z.rc`, `docs/etl/sprints/AI-OPS-406/evidence/quality_initiatives_after_pass1_20260302T014059Z.json`, `docs/etl/sprints/AI-OPS-406/evidence/senado_waf_block_profile_global_after_pass1_20260302T014059Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=403` (cola general accionable, micro-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=403` con `max-urls-per-initiative=3` + `packet10` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-407 ejecuta la lane en perfil micro-packet (`rows_total=120`, `packet10=10`) y evita timeout (`backfill_rc=0`): replay con `candidate_urls=10`, `fetched_ok=0`, `archive_hits=0`, `failures=10`. Sin delta neta de cobertura (`downloaded_doc_links 5134->5134`, `missing_doc_links_actionable 3416->3416`, `missing_urls 3416->3416`) y reclasificaci\u00f3n interna del packet (`status403 1485->1475`, `status404 586->596`, `status500=1345`, `status200=0`). Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-407/reports/senado-status403-general-micro-packet10-timebox-20260302.md`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_conversion_delta_ai_ops_407_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_retry_packet10_effective_pass1_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_retry_packet10_effective_pass1_20260302T015128Z.rc`, `docs/etl/sprints/AI-OPS-407/evidence/quality_initiatives_after_pass1_20260302T015128Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual dominante global Senado `status=500` (cola general accionable, micro-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + `packet10` + replay acotado",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-414 re-ejecuta la lane `status=500` en perfil micro-packet (`rows_total=12`, `packet10=10`) con wrapper `timeout 180`; la pasada termina en `rc=124` con salida retry vac\u00eda (`retry_output_json_size_bytes=0`) y sin delta neta de cobertura (`downloaded_doc_links 5952->5952`, `missing_doc_links_actionable 3410->3410`, `missing_urls 3410->3410`, `zero_doc_initiatives 1062->1062`). Se observa reclasificaci\u00f3n interna en la muestra (`status500 1341->1337`, `status404 610->614`, `status403=1443`, `status200=16`) sin ganancia de descarga. Se cierra por anti-loop con evidencia expl\u00edcita de no-delta y `no_new_lever`. Evidencia: `docs/etl/sprints/AI-OPS-414/reports/senado-status500-general-micro-packet10-timebox-rerun-20260302.md`, `docs/etl/sprints/AI-OPS-414/evidence/senado_status500_general_conversion_delta_ai_ops_414_20260302T024016Z.json`, `docs/etl/sprints/AI-OPS-414/evidence/senado_status500_general_retry_packet10_effective_pass1_20260302T024016Z.rc`, `docs/etl/sprints/AI-OPS-414/evidence/quality_initiatives_after_pass1_20260302T024016Z.json`, `docs/etl/sprints/AI-OPS-414/evidence/senado_waf_block_profile_global_after_pass1_20260302T024016Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Recuperar observabilidad no-vac\u00eda en residual global Senado `status=500` (nano-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=500` con `max-urls-per-initiative=3` + `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-415 ejecuta la lane `status=500` con perfil nano-packet (`limit=60`, `packet5`) y confirma agotamiento de cola accionable en este corte: export `rows_total=0`, packet efectivo `0`, replay con CSV vac\u00edo (`rc=1`, `retry_output_json_size_bytes=0`, `candidate_urls=0`, `fetched_ok=0`). Sin delta neta de cobertura (`downloaded_doc_links 5952->5952`, `missing_doc_links_actionable 3410->3410`, `missing_urls 3410->3410`, `zero_doc_initiatives 1062->1062`) ni movimiento de buckets (`status500=1337`, `status404=614`, `status403=1443`, `status200=16`). Se cierra por anti-loop con evidencia expl\u00edcita de `packet_empty/no_candidates` y se pivota a lane `status=404` con el mismo perfil nano-packet. Evidencia: `docs/etl/sprints/AI-OPS-415/reports/senado-status500-general-nano-packet5-empty-tail-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-415/evidence/senado_status500_general_conversion_delta_ai_ops_415_20260302T024837Z.json`, `docs/etl/sprints/AI-OPS-415/evidence/senado_status500_general_retry_packet5_effective_pass1_20260302T024837Z.rc`, `docs/etl/sprints/AI-OPS-415/evidence/quality_initiatives_after_pass1_20260302T024837Z.json`, `docs/etl/sprints/AI-OPS-415/evidence/senado_waf_block_profile_global_after_pass1_20260302T024837Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n/observabilidad en residual global Senado `status=404` (nano-packet anti-timeout)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet `status=404` con `max-urls-per-initiative=3` + `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-416 ejecuta la lane `status=404` con perfil nano-packet (`rows_total=30`, `packet5=5`) y logra observabilidad + conversi\u00f3n en una pasada (`rc=0`, `retry_output_json_size_bytes=8166`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5952->5957` (`+5`), `missing_doc_links_actionable 3410->3405` (`-5`), `missing_urls 3410->3405` (`-5`), `status404 614->609` (`-5`), `zero_doc_initiatives 1062->1057` (`-5`). DoD cumplido; se cierra `899` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-416/reports/senado-status404-general-nano-packet5-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_conversion_delta_ai_ops_416_20260302T025125Z.json`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025125Z.json`, `docs/etl/sprints/AI-OPS-416/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025125Z.rc`, `docs/etl/sprints/AI-OPS-416/evidence/quality_initiatives_after_pass1_20260302T025125Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` tras primer nano-packet exitoso",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-417 ejecuta la segunda pasada `status=404` nano-packet (`rows_total=25`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8097`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5145->5150` (`+5`), `missing_doc_links_actionable 3405->3400` (`-5`), `missing_urls 3405->3400` (`-5`), `status404 609->604` (`-5`), `zero_doc_initiatives 1057->1052` (`-5`). DoD cumplido; se cierra `900` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-417/reports/senado-status404-general-nano-packet5-second-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_conversion_delta_ai_ops_417_20260302T025923Z.json`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025923Z.json`, `docs/etl/sprints/AI-OPS-417/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T025923Z.rc`, `docs/etl/sprints/AI-OPS-417/evidence/quality_initiatives_after_pass1_20260302T025923Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-418 ejecuta la tercera pasada `status=404` nano-packet (`rows_total=20`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8210`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5150->5155` (`+5`), `missing_doc_links_actionable 3400->3395` (`-5`), `missing_urls 3400->3395` (`-5`), `status404 604->599` (`-5`), `zero_doc_initiatives 1052->1047` (`-5`). DoD cumplido; se cierra `901` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-418/reports/senado-status404-general-nano-packet5-third-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_conversion_delta_ai_ops_418_20260302T030453Z.json`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030453Z.json`, `docs/etl/sprints/AI-OPS-418/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030453Z.rc`, `docs/etl/sprints/AI-OPS-418/evidence/quality_initiatives_after_pass1_20260302T030453Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuarta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-419 ejecuta la cuarta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8092`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5155->5160` (`+5`), `missing_doc_links_actionable 3395->3390` (`-5`), `missing_urls 3395->3390` (`-5`), `status404 599->594` (`-5`), `zero_doc_initiatives 1047->1042` (`-5`). DoD cumplido; se cierra `902` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-419/reports/senado-status404-general-nano-packet5-fourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_conversion_delta_ai_ops_419_20260302T030936Z.json`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030936Z.json`, `docs/etl/sprints/AI-OPS-419/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T030936Z.rc`, `docs/etl/sprints/AI-OPS-419/evidence/quality_initiatives_after_pass1_20260302T030936Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quinta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-420 ejecuta la quinta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8122`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5160->5165` (`+5`), `missing_doc_links_actionable 3390->3385` (`-5`), `missing_urls 3390->3385` (`-5`), `status404 594->589` (`-5`), `zero_doc_initiatives 1042->1037` (`-5`). DoD cumplido; se cierra `903` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-420/reports/senado-status404-general-nano-packet5-fifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_conversion_delta_ai_ops_420_20260302T031411Z.json`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031411Z.json`, `docs/etl/sprints/AI-OPS-420/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031411Z.rc`, `docs/etl/sprints/AI-OPS-420/evidence/quality_initiatives_after_pass1_20260302T031411Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexta pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-421 ejecuta la sexta pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8225`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5165->5170` (`+5`), `missing_doc_links_actionable 3385->3380` (`-5`), `missing_urls 3385->3380` (`-5`), `status404 589->584` (`-5`), `zero_doc_initiatives 1037->1032` (`-5`). DoD cumplido; se cierra `904` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-421/reports/senado-status404-general-nano-packet5-sixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_conversion_delta_ai_ops_421_20260302T031845Z.json`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031845Z.json`, `docs/etl/sprints/AI-OPS-421/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T031845Z.rc`, `docs/etl/sprints/AI-OPS-421/evidence/quality_initiatives_after_pass1_20260302T031845Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "S\u00e9ptima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-422 ejecuta la s\u00e9ptima pasada `status=404` nano-packet (`rows_total=18`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8174`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5170->5175` (`+5`), `missing_doc_links_actionable 3380->3375` (`-5`), `missing_urls 3380->3375` (`-5`), `status404 584->579` (`-5`), `zero_doc_initiatives 1032->1027` (`-5`). DoD cumplido; se cierra `905` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-422/reports/senado-status404-general-nano-packet5-seventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_conversion_delta_ai_ops_422_20260302T032310Z.json`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032310Z.json`, `docs/etl/sprints/AI-OPS-422/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032310Z.rc`, `docs/etl/sprints/AI-OPS-422/evidence/quality_initiatives_after_pass1_20260302T032310Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Octava pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-423 ejecuta la octava pasada `status=404` nano-packet (`rows_total=15`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8199`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5175->5180` (`+5`), `missing_doc_links_actionable 3375->3370` (`-5`), `missing_urls 3375->3370` (`-5`), `status404 579->574` (`-5`), `zero_doc_initiatives 1027->1022` (`-5`). DoD cumplido; se cierra `906` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-423/reports/senado-status404-general-nano-packet5-eighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_conversion_delta_ai_ops_423_20260302T032738Z.json`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032738Z.json`, `docs/etl/sprints/AI-OPS-423/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T032738Z.rc`, `docs/etl/sprints/AI-OPS-423/evidence/quality_initiatives_after_pass1_20260302T032738Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Novena pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-424 ejecuta la novena pasada `status=404` nano-packet (`rows_total=10`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8107`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5180->5185` (`+5`), `missing_doc_links_actionable 3370->3365` (`-5`), `missing_urls 3370->3365` (`-5`), `status404 574->569` (`-5`), `zero_doc_initiatives 1022->1017` (`-5`). DoD cumplido; se cierra `907` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-424/reports/senado-status404-general-nano-packet5-ninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_conversion_delta_ai_ops_424_20260302T033210Z.json`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033210Z.json`, `docs/etl/sprints/AI-OPS-424/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033210Z.rc`, `docs/etl/sprints/AI-OPS-424/evidence/quality_initiatives_after_pass1_20260302T033210Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (d\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "D\u00e9cima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-425 ejecuta la d\u00e9cima pasada `status=404` nano-packet (`rows_total=5`, `packet5=5`) y mantiene continuidad de conversi\u00f3n con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=8191`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5185->5190` (`+5`), `missing_doc_links_actionable 3365->3360` (`-5`), `missing_urls 3365->3360` (`-5`), `status404 569->564` (`-5`), `zero_doc_initiatives 1017->1012` (`-5`). DoD cumplido; se cierra `908` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-425/reports/senado-status404-general-nano-packet5-tenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_conversion_delta_ai_ops_425_20260302T033629Z.json`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033629Z.json`, `docs/etl/sprints/AI-OPS-425/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T033629Z.rc`, `docs/etl/sprints/AI-OPS-425/evidence/quality_initiatives_after_pass1_20260302T033629Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=404` (und\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Und\u00e9cima pasada `status=404` con `packet5` + timeout/request agresivo",
        "estado": "NO_DELTA_WITH_EVIDENCE",
        "bloque": "Done now: YES (sin delta). AI-OPS-426 ejecuta la und\u00e9cima pasada `status=404` nano-packet y confirma agotamiento de cola para este lane (`rows_total=0`, `packet5=0`, solo cabecera en export). Replay vac\u00edo (`rc=1`, `retry_output_json_size_bytes=0`, `candidate_urls=0`, `fetched_ok=0`, `failures=0`) y delta KPI nula (`downloaded_doc_links 5190->5190`, `missing_doc_links_actionable 3360->3360`, `missing_urls 3360->3360`, `status404 564->564`, `zero_doc_initiatives 1012->1012`). DoD no cumplido por `packet_empty/no_candidates`; se cierra `909` como `NO_DELTA_WITH_EVIDENCE` y se pivota a lane `status=403` nano-packet. Evidencia: `docs/etl/sprints/AI-OPS-426/reports/senado-status404-general-nano-packet5-eleventh-pass-empty-tail-no-delta-20260302.md`, `docs/etl/sprints/AI-OPS-426/evidence/senado_status404_general_conversion_delta_ai_ops_426_20260302T034058Z.json`, `docs/etl/sprints/AI-OPS-426/evidence/senado_status404_general_retry_packet5_effective_pass1_20260302T034058Z.rc`, `docs/etl/sprints/AI-OPS-426/evidence/quality_initiatives_after_pass1_20260302T034058Z.json`, `docs/etl/sprints/AI-OPS-426/evidence/senado_waf_block_profile_global_after_pass1_20260302T034058Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (primer nano-packet tras agotamiento 404)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-427 ejecuta la primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y reabre conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9823`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5190->5195` (`+5`), `missing_doc_links_actionable 3360->3355` (`-5`), `missing_urls 3360->3355` (`-5`), `status403 1443->1438` (`-5`), `zero_doc_initiatives 1012->1012` (`0`). DoD cumplido; se cierra `910` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-427/reports/senado-status403-general-nano-packet5-first-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_conversion_delta_ai_ops_427_20260302T034355Z.json`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034355Z.json`, `docs/etl/sprints/AI-OPS-427/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034355Z.rc`, `docs/etl/sprints/AI-OPS-427/evidence/quality_initiatives_after_pass1_20260302T034355Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-428 ejecuta la segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9082`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5195->5200` (`+5`), `missing_doc_links_actionable 3355->3350` (`-5`), `missing_urls 3355->3350` (`-5`), `status403 1438->1433` (`-5`), `zero_doc_initiatives 1012->1008` (`-4`). DoD cumplido; se cierra `911` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-428/reports/senado-status403-general-nano-packet5-second-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_conversion_delta_ai_ops_428_20260302T034840Z.json`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034840Z.json`, `docs/etl/sprints/AI-OPS-428/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T034840Z.rc`, `docs/etl/sprints/AI-OPS-428/evidence/quality_initiatives_after_pass1_20260302T034840Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-429 ejecuta la tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9374`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5200->5205` (`+5`), `missing_doc_links_actionable 3350->3345` (`-5`), `missing_urls 3350->3345` (`-5`), `status403 1433->1428` (`-5`), `zero_doc_initiatives 1008->1004` (`-4`). DoD cumplido; se cierra `912` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-429/reports/senado-status403-general-nano-packet5-third-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_conversion_delta_ai_ops_429_20260302T035307Z.json`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035307Z.json`, `docs/etl/sprints/AI-OPS-429/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035307Z.rc`, `docs/etl/sprints/AI-OPS-429/evidence/quality_initiatives_after_pass1_20260302T035307Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-430 ejecuta la cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9845`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5205->5210` (`+5`), `missing_doc_links_actionable 3345->3340` (`-5`), `missing_urls 3345->3340` (`-5`), `status403 1428->1423` (`-5`), `zero_doc_initiatives 1004->1002` (`-2`). DoD cumplido; se cierra `913` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-430/reports/senado-status403-general-nano-packet5-fourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_conversion_delta_ai_ops_430_20260302T035654Z.json`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035654Z.json`, `docs/etl/sprints/AI-OPS-430/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T035654Z.rc`, `docs/etl/sprints/AI-OPS-430/evidence/quality_initiatives_after_pass1_20260302T035654Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-431 ejecuta la quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5210->5215` (`+5`), `missing_doc_links_actionable 3340->3335` (`-5`), `missing_urls 3340->3335` (`-5`), `status403 1423->1418` (`-5`), `zero_doc_initiatives 1002->999` (`-3`). DoD cumplido; se cierra `914` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-431/reports/senado-status403-general-nano-packet5-fifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_conversion_delta_ai_ops_431_20260302T040100Z.json`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040100Z.json`, `docs/etl/sprints/AI-OPS-431/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040100Z.rc`, `docs/etl/sprints/AI-OPS-431/evidence/quality_initiatives_after_pass1_20260302T040100Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-432 ejecuta la sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5215->5220` (`+5`), `missing_doc_links_actionable 3335->3330` (`-5`), `missing_urls 3335->3330` (`-5`), `status403 1418->1413` (`-5`), `zero_doc_initiatives 999->997` (`-2`). DoD cumplido; se cierra `915` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-432/reports/senado-status403-general-nano-packet5-sixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_conversion_delta_ai_ops_432_20260302T040512Z.json`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040512Z.json`, `docs/etl/sprints/AI-OPS-432/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040512Z.rc`, `docs/etl/sprints/AI-OPS-432/evidence/quality_initiatives_after_pass1_20260302T040512Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "S\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-433 ejecuta la s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5220->5225` (`+5`), `missing_doc_links_actionable 3330->3325` (`-5`), `missing_urls 3330->3325` (`-5`), `status403 1413->1408` (`-5`), `zero_doc_initiatives 997->994` (`-3`). DoD cumplido; se cierra `916` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-433/reports/senado-status403-general-nano-packet5-seventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_conversion_delta_ai_ops_433_20260302T040924Z.json`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040924Z.json`, `docs/etl/sprints/AI-OPS-433/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T040924Z.rc`, `docs/etl/sprints/AI-OPS-433/evidence/quality_initiatives_after_pass1_20260302T040924Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-434 ejecuta la octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5225->5230` (`+5`), `missing_doc_links_actionable 3325->3320` (`-5`), `missing_urls 3325->3320` (`-5`), `status403 1408->1403` (`-5`), `zero_doc_initiatives 994->992` (`-2`). DoD cumplido; se cierra `917` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-434/reports/senado-status403-general-nano-packet5-eighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_conversion_delta_ai_ops_434_20260302T041328Z.json`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T041328Z.json`, `docs/etl/sprints/AI-OPS-434/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T041328Z.rc`, `docs/etl/sprints/AI-OPS-434/evidence/quality_initiatives_after_pass1_20260302T041328Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-435 ejecuta la novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5235->5240` (`+5`), `missing_doc_links_actionable 3315->3310` (`-5`), `missing_urls 3315->3310` (`-5`), `status403 1398->1393` (`-5`), `zero_doc_initiatives 989->987` (`-2`). DoD cumplido; se cierra `918` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-435/reports/senado-status403-general-nano-packet5-ninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_conversion_delta_ai_ops_435_20260302T042019Z.json`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042019Z.json`, `docs/etl/sprints/AI-OPS-435/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042019Z.rc`, `docs/etl/sprints/AI-OPS-435/evidence/quality_initiatives_after_pass1_20260302T042019Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (d\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "D\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-436 ejecuta la d\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5240->5245` (`+5`), `missing_doc_links_actionable 3310->3305` (`-5`), `missing_urls 3310->3305` (`-5`), `status403 1393->1388` (`-5`), `zero_doc_initiatives 987->984` (`-3`). DoD cumplido; se cierra `919` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-436/reports/senado-status403-general-nano-packet5-tenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_conversion_delta_ai_ops_436_20260302T042505Z.json`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042505Z.json`, `docs/etl/sprints/AI-OPS-436/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042505Z.rc`, `docs/etl/sprints/AI-OPS-436/evidence/quality_initiatives_after_pass1_20260302T042505Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (und\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Und\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-437 ejecuta la und\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10070`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5245->5250` (`+5`), `missing_doc_links_actionable 3305->3300` (`-5`), `missing_urls 3305->3300` (`-5`), `status403 1388->1383` (`-5`), `zero_doc_initiatives 984->982` (`-2`). DoD cumplido; se cierra `920` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-437/reports/senado-status403-general-nano-packet5-eleventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_conversion_delta_ai_ops_437_20260302T042900Z.json`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042900Z.json`, `docs/etl/sprints/AI-OPS-437/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T042900Z.rc`, `docs/etl/sprints/AI-OPS-437/evidence/quality_initiatives_after_pass1_20260302T042900Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (duod\u00e9cima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Duod\u00e9cima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-438 ejecuta la duod\u00e9cima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5250->5255` (`+5`), `missing_doc_links_actionable 3300->3295` (`-5`), `missing_urls 3300->3295` (`-5`), `status403 1383->1378` (`-5`), `zero_doc_initiatives 982->980` (`-2`). DoD cumplido; se cierra `921` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-438/reports/senado-status403-general-nano-packet5-twelfth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_conversion_delta_ai_ops_438_20260302T043313Z.json`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043313Z.json`, `docs/etl/sprints/AI-OPS-438/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043313Z.rc`, `docs/etl/sprints/AI-OPS-438/evidence/quality_initiatives_after_pass1_20260302T043313Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimotercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimotercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-439 ejecuta la decimotercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10005`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5255->5260` (`+5`), `missing_doc_links_actionable 3295->3290` (`-5`), `missing_urls 3295->3290` (`-5`), `status403 1378->1373` (`-5`), `zero_doc_initiatives 980->980` (`0`). DoD cumplido; se cierra `922` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-439/reports/senado-status403-general-nano-packet5-thirteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_conversion_delta_ai_ops_439_20260302T043716Z.json`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043716Z.json`, `docs/etl/sprints/AI-OPS-439/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T043716Z.rc`, `docs/etl/sprints/AI-OPS-439/evidence/quality_initiatives_after_pass1_20260302T043716Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimocuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimocuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-440 ejecuta la decimocuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9837`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5260->5265` (`+5`), `missing_doc_links_actionable 3290->3285` (`-5`), `missing_urls 3290->3285` (`-5`), `status403 1373->1368` (`-5`), `zero_doc_initiatives 980->977` (`-3`). DoD cumplido; se cierra `923` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-440/reports/senado-status403-general-nano-packet5-fourteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_conversion_delta_ai_ops_440_20260302T044117Z.json`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044117Z.json`, `docs/etl/sprints/AI-OPS-440/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044117Z.rc`, `docs/etl/sprints/AI-OPS-440/evidence/quality_initiatives_after_pass1_20260302T044117Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimoquinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimoquinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-441 ejecuta la decimoquinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10069`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5265->5270` (`+5`), `missing_doc_links_actionable 3285->3280` (`-5`), `missing_urls 3285->3280` (`-5`), `status403 1368->1363` (`-5`), `zero_doc_initiatives 977->975` (`-2`). DoD cumplido; se cierra `924` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-441/reports/senado-status403-general-nano-packet5-fifteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_conversion_delta_ai_ops_441_20260302T044513Z.json`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044513Z.json`, `docs/etl/sprints/AI-OPS-441/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044513Z.rc`, `docs/etl/sprints/AI-OPS-441/evidence/quality_initiatives_after_pass1_20260302T044513Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimosexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimosexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-442 ejecuta la decimosexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9453`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5270->5275` (`+5`), `missing_doc_links_actionable 3280->3275` (`-5`), `missing_urls 3280->3275` (`-5`), `status403 1363->1358` (`-5`), `zero_doc_initiatives 975->973` (`-2`). DoD cumplido; se cierra `925` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-442/reports/senado-status403-general-nano-packet5-sixteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_conversion_delta_ai_ops_442_20260302T044924Z.json`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044924Z.json`, `docs/etl/sprints/AI-OPS-442/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T044924Z.rc`, `docs/etl/sprints/AI-OPS-442/evidence/quality_initiatives_after_pass1_20260302T044924Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimos\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimos\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-443 ejecuta la decimos\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9831`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5275->5280` (`+5`), `missing_doc_links_actionable 3275->3270` (`-5`), `missing_urls 3275->3270` (`-5`), `status403 1358->1353` (`-5`), `zero_doc_initiatives 973->972` (`-1`). DoD cumplido; se cierra `926` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-443/reports/senado-status403-general-nano-packet5-seventeenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_conversion_delta_ai_ops_443_20260302T045313Z.json`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045313Z.json`, `docs/etl/sprints/AI-OPS-443/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045313Z.rc`, `docs/etl/sprints/AI-OPS-443/evidence/quality_initiatives_after_pass1_20260302T045313Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimoctava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimoctava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-444 ejecuta la decimoctava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9788`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5280->5285` (`+5`), `missing_doc_links_actionable 3270->3265` (`-5`), `missing_urls 3270->3265` (`-5`), `status403 1353->1348` (`-5`), `zero_doc_initiatives 972->970` (`-2`). DoD cumplido; se cierra `927` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-444/reports/senado-status403-general-nano-packet5-eighteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_conversion_delta_ai_ops_444_20260302T045700Z.json`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045700Z.json`, `docs/etl/sprints/AI-OPS-444/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T045700Z.rc`, `docs/etl/sprints/AI-OPS-444/evidence/quality_initiatives_after_pass1_20260302T045700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (decimonovena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Decimonovena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-445 ejecuta la decimonovena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9453`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5285->5290` (`+5`), `missing_doc_links_actionable 3265->3260` (`-5`), `missing_urls 3265->3260` (`-5`), `status403 1348->1343` (`-5`), `zero_doc_initiatives 970->968` (`-2`). DoD cumplido; se cierra `928` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-445/reports/senado-status403-general-nano-packet5-nineteenth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_conversion_delta_ai_ops_445_20260302T050214Z.json`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050214Z.json`, `docs/etl/sprints/AI-OPS-445/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050214Z.rc`, `docs/etl/sprints/AI-OPS-445/evidence/quality_initiatives_after_pass1_20260302T050214Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-446 ejecuta la vig\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9794`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5290->5295` (`+5`), `missing_doc_links_actionable 3260->3255` (`-5`), `missing_urls 3260->3255` (`-5`), `status403 1343->1338` (`-5`), `zero_doc_initiatives 968->967` (`-1`). DoD cumplido; se cierra `929` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-446/reports/senado-status403-general-nano-packet5-twentieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_conversion_delta_ai_ops_446_20260302T050916Z.json`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050916Z.json`, `docs/etl/sprints/AI-OPS-446/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T050916Z.rc`, `docs/etl/sprints/AI-OPS-446/evidence/quality_initiatives_after_pass1_20260302T050916Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-447 ejecuta la vig\u00e9simo primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9850`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=1`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5295->5300` (`+5`), `missing_doc_links_actionable 3255->3250` (`-5`), `missing_urls 3255->3250` (`-5`), `status403 1338->1333` (`-5`), `zero_doc_initiatives 967->965` (`-2`). DoD cumplido; se cierra `930` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-447/reports/senado-status403-general-nano-packet5-twentyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_conversion_delta_ai_ops_447_20260302T051329Z.json`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051329Z.json`, `docs/etl/sprints/AI-OPS-447/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051329Z.rc`, `docs/etl/sprints/AI-OPS-447/evidence/quality_initiatives_after_pass1_20260302T051329Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-448 ejecuta la vig\u00e9simo segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9430`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5300->5305` (`+5`), `missing_doc_links_actionable 3250->3245` (`-5`), `missing_urls 3250->3245` (`-5`), `status403 1333->1328` (`-5`), `zero_doc_initiatives 965->963` (`-2`). DoD cumplido; se cierra `931` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-448/reports/senado-status403-general-nano-packet5-twentysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_conversion_delta_ai_ops_448_20260302T051738Z.json`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051738Z.json`, `docs/etl/sprints/AI-OPS-448/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T051738Z.rc`, `docs/etl/sprints/AI-OPS-448/evidence/quality_initiatives_after_pass1_20260302T051738Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-449 ejecuta la vig\u00e9simo tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9821`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5305->5310` (`+5`), `missing_doc_links_actionable 3245->3240` (`-5`), `missing_urls 3245->3240` (`-5`), `status403 1328->1323` (`-5`), `zero_doc_initiatives 963->962` (`-1`). DoD cumplido; se cierra `932` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-449/reports/senado-status403-general-nano-packet5-twentythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_conversion_delta_ai_ops_449_20260302T052153Z.json`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052153Z.json`, `docs/etl/sprints/AI-OPS-449/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052153Z.rc`, `docs/etl/sprints/AI-OPS-449/evidence/quality_initiatives_after_pass1_20260302T052153Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-450 ejecuta la vig\u00e9simo cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9794`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5310->5315` (`+5`), `missing_doc_links_actionable 3240->3235` (`-5`), `missing_urls 3240->3235` (`-5`), `status403 1323->1318` (`-5`), `zero_doc_initiatives 962->960` (`-2`). DoD cumplido; se cierra `933` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-450/reports/senado-status403-general-nano-packet5-twentyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_conversion_delta_ai_ops_450_20260302T052551Z.json`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052551Z.json`, `docs/etl/sprints/AI-OPS-450/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052551Z.rc`, `docs/etl/sprints/AI-OPS-450/evidence/quality_initiatives_after_pass1_20260302T052551Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-451 ejecuta la vig\u00e9simo quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9514`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=1`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5315->5320` (`+5`), `missing_doc_links_actionable 3235->3230` (`-5`), `missing_urls 3235->3230` (`-5`), `status403 1318->1313` (`-5`), `zero_doc_initiatives 960->958` (`-2`). DoD cumplido; se cierra `934` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-451/reports/senado-status403-general-nano-packet5-twentyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_conversion_delta_ai_ops_451_20260302T052956Z.json`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052956Z.json`, `docs/etl/sprints/AI-OPS-451/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T052956Z.rc`, `docs/etl/sprints/AI-OPS-451/evidence/quality_initiatives_after_pass1_20260302T052956Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-452 ejecuta la vig\u00e9simo sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9845`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5320->5325` (`+5`), `missing_doc_links_actionable 3230->3225` (`-5`), `missing_urls 3230->3225` (`-5`), `status403 1313->1308` (`-5`), `zero_doc_initiatives 958->957` (`-1`). DoD cumplido; se cierra `935` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-452/reports/senado-status403-general-nano-packet5-twentysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_conversion_delta_ai_ops_452_20260302T053401Z.json`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053401Z.json`, `docs/etl/sprints/AI-OPS-452/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053401Z.rc`, `docs/etl/sprints/AI-OPS-452/evidence/quality_initiatives_after_pass1_20260302T053401Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-453 ejecuta la vig\u00e9simo s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9844`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5325->5330` (`+5`), `missing_doc_links_actionable 3225->3220` (`-5`), `missing_urls 3225->3220` (`-5`), `status403 1308->1303` (`-5`), `zero_doc_initiatives 957->955` (`-2`). DoD cumplido; se cierra `936` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-453/reports/senado-status403-general-nano-packet5-twentyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_conversion_delta_ai_ops_453_20260302T053802Z.json`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053802Z.json`, `docs/etl/sprints/AI-OPS-453/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T053802Z.rc`, `docs/etl/sprints/AI-OPS-453/evidence/quality_initiatives_after_pass1_20260302T053802Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-454 ejecuta la vig\u00e9simo octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9480`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5330->5335` (`+5`), `missing_doc_links_actionable 3220->3215` (`-5`), `missing_urls 3220->3215` (`-5`), `status403 1303->1298` (`-5`), `zero_doc_initiatives 955->953` (`-2`). DoD cumplido; se cierra `937` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-454/reports/senado-status403-general-nano-packet5-twentyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_conversion_delta_ai_ops_454_20260302T054316Z.json`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054316Z.json`, `docs/etl/sprints/AI-OPS-454/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054316Z.rc`, `docs/etl/sprints/AI-OPS-454/evidence/quality_initiatives_after_pass1_20260302T054316Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (vig\u00e9simo novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Vig\u00e9simo novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-455 ejecuta la vig\u00e9simo novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9601`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5335->5340` (`+5`), `missing_doc_links_actionable 3215->3210` (`-5`), `missing_urls 3215->3210` (`-5`), `status403 1298->1293` (`-5`), `zero_doc_initiatives 953->952` (`-1`). DoD cumplido; se cierra `938` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-455/reports/senado-status403-general-nano-packet5-twentyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_conversion_delta_ai_ops_455_20260302T054910Z.json`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054910Z.json`, `docs/etl/sprints/AI-OPS-455/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T054910Z.rc`, `docs/etl/sprints/AI-OPS-455/evidence/quality_initiatives_after_pass1_20260302T054910Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-456 ejecuta la trig\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9846`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5340->5345` (`+5`), `missing_doc_links_actionable 3210->3205` (`-5`), `missing_urls 3210->3205` (`-5`), `status403 1293->1288` (`-5`), `zero_doc_initiatives 952->950` (`-2`). DoD cumplido; se cierra `939` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-456/reports/senado-status403-general-nano-packet5-thirtieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_conversion_delta_ai_ops_456_20260302T055403Z.json`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055403Z.json`, `docs/etl/sprints/AI-OPS-456/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055403Z.rc`, `docs/etl/sprints/AI-OPS-456/evidence/quality_initiatives_after_pass1_20260302T055403Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-457 ejecuta la trig\u00e9simo primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9458`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=3`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5345->5350` (`+5`), `missing_doc_links_actionable 3205->3200` (`-5`), `missing_urls 3205->3200` (`-5`), `status403 1288->1283` (`-5`), `zero_doc_initiatives 950->948` (`-2`). DoD cumplido; se cierra `940` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-457/reports/senado-status403-general-nano-packet5-thirtyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_conversion_delta_ai_ops_457_20260302T055821Z.json`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055821Z.json`, `docs/etl/sprints/AI-OPS-457/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T055821Z.rc`, `docs/etl/sprints/AI-OPS-457/evidence/quality_initiatives_after_pass1_20260302T055821Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-458 ejecuta la trig\u00e9simo segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9596`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=0`, `archive_hits=5`, `archive_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5350->5355` (`+5`), `missing_doc_links_actionable 3200->3195` (`-5`), `missing_urls 3200->3195` (`-5`), `status403 1283->1278` (`-5`), `zero_doc_initiatives 948->947` (`-1`). DoD cumplido; se cierra `941` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-458/reports/senado-status403-general-nano-packet5-thirtysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_conversion_delta_ai_ops_458_20260302T060243Z.json`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060243Z.json`, `docs/etl/sprints/AI-OPS-458/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060243Z.rc`, `docs/etl/sprints/AI-OPS-458/evidence/quality_initiatives_after_pass1_20260302T060243Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-459 ejecuta la trig\u00e9simo tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9852`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=3`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5355->5360` (`+5`), `missing_doc_links_actionable 3195->3190` (`-5`), `missing_urls 3195->3190` (`-5`), `status403 1278->1273` (`-5`), `zero_doc_initiatives 947->945` (`-2`). DoD cumplido; se cierra `942` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-459/reports/senado-status403-general-nano-packet5-thirtythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_conversion_delta_ai_ops_459_20260302T060711Z.json`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060711Z.json`, `docs/etl/sprints/AI-OPS-459/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T060711Z.rc`, `docs/etl/sprints/AI-OPS-459/evidence/quality_initiatives_after_pass1_20260302T060711Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-460 ejecuta la trig\u00e9simo cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9337`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5360->5365` (`+5`), `missing_doc_links_actionable 3190->3185` (`-5`), `missing_urls 3190->3185` (`-5`), `status403 1273->1268` (`-5`), `zero_doc_initiatives 945->943` (`-2`). DoD cumplido; se cierra `943` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-460/reports/senado-status403-general-nano-packet5-thirtyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_conversion_delta_ai_ops_460_20260302T061141Z.json`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061141Z.json`, `docs/etl/sprints/AI-OPS-460/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061141Z.rc`, `docs/etl/sprints/AI-OPS-460/evidence/quality_initiatives_after_pass1_20260302T061141Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-461 ejecuta la trig\u00e9simo quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9620`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5365->5370` (`+5`), `missing_doc_links_actionable 3185->3180` (`-5`), `missing_urls 3185->3180` (`-5`), `status403 1268->1263` (`-5`), `zero_doc_initiatives 943->942` (`-1`). DoD cumplido; se cierra `944` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-461/reports/senado-status403-general-nano-packet5-thirtyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_conversion_delta_ai_ops_461_20260302T061653Z.json`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061653Z.json`, `docs/etl/sprints/AI-OPS-461/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T061653Z.rc`, `docs/etl/sprints/AI-OPS-461/evidence/quality_initiatives_after_pass1_20260302T061653Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-462 ejecuta la trig\u00e9simo sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9733`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=3`, `archive_hits=2`, `archive_fetched_ok=2`). Delta KPI material: `downloaded_doc_links 5370->5375` (`+5`), `missing_doc_links_actionable 3180->3175` (`-5`), `missing_urls 3180->3175` (`-5`), `status403 1263->1258` (`-5`), `zero_doc_initiatives 942->940` (`-2`). DoD cumplido; se cierra `945` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-462/reports/senado-status403-general-nano-packet5-thirtysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_conversion_delta_ai_ops_462_20260302T062232Z.json`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062232Z.json`, `docs/etl/sprints/AI-OPS-462/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062232Z.rc`, `docs/etl/sprints/AI-OPS-462/evidence/quality_initiatives_after_pass1_20260302T062232Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-463 ejecuta la trig\u00e9simo s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9427`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=1`, `archive_hits=5`, `archive_fetched_ok=4`). Delta KPI material: `downloaded_doc_links 5375->5380` (`+5`), `missing_doc_links_actionable 3175->3170` (`-5`), `missing_urls 3175->3170` (`-5`), `status403 1258->1253` (`-5`), `zero_doc_initiatives 940->938` (`-2`). DoD cumplido; se cierra `946` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-463/reports/senado-status403-general-nano-packet5-thirtyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_conversion_delta_ai_ops_463_20260302T062707Z.json`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062707Z.json`, `docs/etl/sprints/AI-OPS-463/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T062707Z.rc`, `docs/etl/sprints/AI-OPS-463/evidence/quality_initiatives_after_pass1_20260302T062707Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-464 ejecuta la trig\u00e9simo octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9730`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=2`, `archive_hits=4`, `archive_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5380->5385` (`+5`), `missing_doc_links_actionable 3170->3165` (`-5`), `missing_urls 3170->3165` (`-5`), `status403 1253->1248` (`-5`), `zero_doc_initiatives 938->937` (`-1`). DoD cumplido; se cierra `947` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-464/reports/senado-status403-general-nano-packet5-thirtyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_conversion_delta_ai_ops_464_20260302T063122Z.json`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063122Z.json`, `docs/etl/sprints/AI-OPS-464/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063122Z.rc`, `docs/etl/sprints/AI-OPS-464/evidence/quality_initiatives_after_pass1_20260302T063122Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (trig\u00e9simo novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Trig\u00e9simo novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-465 ejecuta la trig\u00e9simo novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9778`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5385->5390` (`+5`), `missing_doc_links_actionable 3165->3160` (`-5`), `missing_urls 3165->3160` (`-5`), `status403 1248->1243` (`-5`), `zero_doc_initiatives 937->935` (`-2`). DoD cumplido; se cierra `948` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-465/reports/senado-status403-general-nano-packet5-thirtyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_conversion_delta_ai_ops_465_20260302T063543Z.json`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063543Z.json`, `docs/etl/sprints/AI-OPS-465/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063543Z.rc`, `docs/etl/sprints/AI-OPS-465/evidence/quality_initiatives_after_pass1_20260302T063543Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-466 ejecuta la cuadrag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9492`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5390->5395` (`+5`), `missing_doc_links_actionable 3160->3155` (`-5`), `missing_urls 3160->3155` (`-5`), `status403 1243->1238` (`-5`), `zero_doc_initiatives 935->933` (`-2`). DoD cumplido; se cierra `949` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-466/reports/senado-status403-general-nano-packet5-fortieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_conversion_delta_ai_ops_466_20260302T063959Z.json`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063959Z.json`, `docs/etl/sprints/AI-OPS-466/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T063959Z.rc`, `docs/etl/sprints/AI-OPS-466/evidence/quality_initiatives_after_pass1_20260302T063959Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-467 ejecuta la cuadrag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9717`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5395->5400` (`+5`), `missing_doc_links_actionable 3155->3150` (`-5`), `missing_urls 3155->3150` (`-5`), `status403 1238->1233` (`-5`), `zero_doc_initiatives 933->932` (`-1`). DoD cumplido; se cierra `950` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-467/reports/senado-status403-general-nano-packet5-fortyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_conversion_delta_ai_ops_467_20260302T064418Z.json`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064418Z.json`, `docs/etl/sprints/AI-OPS-467/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064418Z.rc`, `docs/etl/sprints/AI-OPS-467/evidence/quality_initiatives_after_pass1_20260302T064418Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-468 ejecuta la cuadrag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9764`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5400->5405` (`+5`), `missing_doc_links_actionable 3150->3145` (`-5`), `missing_urls 3150->3145` (`-5`), `status403 1233->1228` (`-5`), `zero_doc_initiatives 932->930` (`-2`). DoD cumplido; se cierra `951` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-468/reports/senado-status403-general-nano-packet5-fortysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_conversion_delta_ai_ops_468_20260302T064833Z.json`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064833Z.json`, `docs/etl/sprints/AI-OPS-468/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T064833Z.rc`, `docs/etl/sprints/AI-OPS-468/evidence/quality_initiatives_after_pass1_20260302T064833Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-469 ejecuta la cuadrag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9330`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5405->5410` (`+5`), `missing_doc_links_actionable 3145->3140` (`-5`), `missing_urls 3145->3140` (`-5`), `status403 1228->1223` (`-5`), `zero_doc_initiatives 930->928` (`-2`). DoD cumplido; se cierra `952` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-469/reports/senado-status403-general-nano-packet5-fortythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_conversion_delta_ai_ops_469_20260302T065252Z.json`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065252Z.json`, `docs/etl/sprints/AI-OPS-469/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065252Z.rc`, `docs/etl/sprints/AI-OPS-469/evidence/quality_initiatives_after_pass1_20260302T065252Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-470 ejecuta la cuadrag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9804`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=4`, `archive_hits=2`, `archive_fetched_ok=1`). Delta KPI material: `downloaded_doc_links 5410->5415` (`+5`), `missing_doc_links_actionable 3140->3135` (`-5`), `missing_urls 3140->3135` (`-5`), `status403 1223->1218` (`-5`), `zero_doc_initiatives 928->927` (`-1`). DoD cumplido; se cierra `953` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-470/reports/senado-status403-general-nano-packet5-fortyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_conversion_delta_ai_ops_470_20260302T065700Z.json`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065700Z.json`, `docs/etl/sprints/AI-OPS-470/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T065700Z.rc`, `docs/etl/sprints/AI-OPS-470/evidence/quality_initiatives_after_pass1_20260302T065700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-471 ejecuta la cuadrag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9804`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5415->5420` (`+5`), `missing_doc_links_actionable 3135->3130` (`-5`), `missing_urls 3135->3130` (`-5`), `status403 1218->1213` (`-5`), `zero_doc_initiatives 927->925` (`-2`). DoD cumplido; se cierra `954` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-471/reports/senado-status403-general-nano-packet5-fortyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_conversion_delta_ai_ops_471_20260302T070235Z.json`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T070235Z.json`, `docs/etl/sprints/AI-OPS-471/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T070235Z.rc`, `docs/etl/sprints/AI-OPS-471/evidence/quality_initiatives_after_pass1_20260302T070235Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-472 ejecuta la cuadrag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9811`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=2`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5420->5425` (`+5`), `missing_doc_links_actionable 3130->3125` (`-5`), `missing_urls 3130->3125` (`-5`), `status403 1213->1208` (`-5`), `zero_doc_initiatives 925->923` (`-2`). DoD cumplido; se cierra `955` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-472/reports/senado-status403-general-nano-packet5-fortysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_conversion_delta_ai_ops_472_20260302T090358Z.json`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090358Z.json`, `docs/etl/sprints/AI-OPS-472/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090358Z.rc`, `docs/etl/sprints/AI-OPS-472/evidence/quality_initiatives_after_pass1_20260302T090358Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-473 ejecuta la cuadrag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9847`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5425->5430` (`+5`), `missing_doc_links_actionable 3125->3120` (`-5`), `missing_urls 3125->3120` (`-5`), `status403 1208->1203` (`-5`), `zero_doc_initiatives 923->921` (`-2`). DoD cumplido; se cierra `956` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-473/reports/senado-status403-general-nano-packet5-fortyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_conversion_delta_ai_ops_473_20260302T090859Z.json`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090859Z.json`, `docs/etl/sprints/AI-OPS-473/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T090859Z.rc`, `docs/etl/sprints/AI-OPS-473/evidence/quality_initiatives_after_pass1_20260302T090859Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-474 ejecuta la cuadrag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10119`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5430->5435` (`+5`), `missing_doc_links_actionable 3120->3115` (`-5`), `missing_urls 3120->3115` (`-5`), `status403 1203->1198` (`-5`), `zero_doc_initiatives 921->919` (`-2`). DoD cumplido; se cierra `957` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-474/reports/senado-status403-general-nano-packet5-fortyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_conversion_delta_ai_ops_474_20260302T091317Z.json`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091317Z.json`, `docs/etl/sprints/AI-OPS-474/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091317Z.rc`, `docs/etl/sprints/AI-OPS-474/evidence/quality_initiatives_after_pass1_20260302T091317Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (cuadrag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Cuadrag\u00e9sima novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-475 ejecuta la cuadrag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9784`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5435->5440` (`+5`), `missing_doc_links_actionable 3115->3110` (`-5`), `missing_urls 3115->3110` (`-5`), `status403 1198->1193` (`-5`), `zero_doc_initiatives 919->916` (`-3`). DoD cumplido; se cierra `958` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-475/reports/senado-status403-general-nano-packet5-fortyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_conversion_delta_ai_ops_475_20260302T091726Z.json`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091726Z.json`, `docs/etl/sprints/AI-OPS-475/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T091726Z.rc`, `docs/etl/sprints/AI-OPS-475/evidence/quality_initiatives_after_pass1_20260302T091726Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-476 ejecuta la quincuag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9585`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5440->5445` (`+5`), `missing_doc_links_actionable 3110->3105` (`-5`), `missing_urls 3110->3105` (`-5`), `status403 1193->1188` (`-5`), `zero_doc_initiatives 916->914` (`-2`). DoD cumplido; se cierra `959` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-476/reports/senado-status403-general-nano-packet5-fiftieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_conversion_delta_ai_ops_476_20260302T092209Z.json`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092209Z.json`, `docs/etl/sprints/AI-OPS-476/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092209Z.rc`, `docs/etl/sprints/AI-OPS-476/evidence/quality_initiatives_after_pass1_20260302T092209Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima primera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-477 ejecuta la quincuag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10070`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5445->5450` (`+5`), `missing_doc_links_actionable 3105->3100` (`-5`), `missing_urls 3105->3100` (`-5`), `status403 1188->1183` (`-5`), `zero_doc_initiatives 914->912` (`-2`). DoD cumplido; se cierra `960` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-477/reports/senado-status403-general-nano-packet5-fiftyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_conversion_delta_ai_ops_477_20260302T092636Z.json`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092636Z.json`, `docs/etl/sprints/AI-OPS-477/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T092636Z.rc`, `docs/etl/sprints/AI-OPS-477/evidence/quality_initiatives_after_pass1_20260302T092636Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima segunda pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-478 ejecuta la quincuag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9808`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5450->5455` (`+5`), `missing_doc_links_actionable 3100->3095` (`-5`), `missing_urls 3100->3095` (`-5`), `status403 1183->1178` (`-5`), `zero_doc_initiatives 912->909` (`-3`). DoD cumplido; se cierra `961` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-478/reports/senado-status403-general-nano-packet5-fiftysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_conversion_delta_ai_ops_478_20260302T093107Z.json`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093107Z.json`, `docs/etl/sprints/AI-OPS-478/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093107Z.rc`, `docs/etl/sprints/AI-OPS-478/evidence/quality_initiatives_after_pass1_20260302T093107Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima tercera pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-479 ejecuta la quincuag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10076`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5455->5460` (`+5`), `missing_doc_links_actionable 3095->3090` (`-5`), `missing_urls 3095->3090` (`-5`), `status403 1178->1173` (`-5`), `zero_doc_initiatives 909->907` (`-2`). DoD cumplido; se cierra `962` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-479/reports/senado-status403-general-nano-packet5-fiftythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_conversion_delta_ai_ops_479_20260302T093541Z.json`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093541Z.json`, `docs/etl/sprints/AI-OPS-479/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T093541Z.rc`, `docs/etl/sprints/AI-OPS-479/evidence/quality_initiatives_after_pass1_20260302T093541Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima cuarta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-480 ejecuta la quincuag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9750`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5460->5465` (`+5`), `missing_doc_links_actionable 3090->3085` (`-5`), `missing_urls 3090->3085` (`-5`), `status403 1173->1168` (`-5`), `zero_doc_initiatives 907->904` (`-3`). DoD cumplido; se cierra `963` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-480/reports/senado-status403-general-nano-packet5-fiftyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_conversion_delta_ai_ops_480_20260302T094017Z.json`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094017Z.json`, `docs/etl/sprints/AI-OPS-480/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094017Z.rc`, `docs/etl/sprints/AI-OPS-480/evidence/quality_initiatives_after_pass1_20260302T094017Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima quinta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-481 ejecuta la quincuag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10048`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5465->5470` (`+5`), `missing_doc_links_actionable 3085->3080` (`-5`), `missing_urls 3085->3080` (`-5`), `status403 1168->1163` (`-5`), `zero_doc_initiatives 904->902` (`-2`). DoD cumplido; se cierra `964` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-481/reports/senado-status403-general-nano-packet5-fiftyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_conversion_delta_ai_ops_481_20260302T094444Z.json`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094444Z.json`, `docs/etl/sprints/AI-OPS-481/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094444Z.rc`, `docs/etl/sprints/AI-OPS-481/evidence/quality_initiatives_after_pass1_20260302T094444Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima sexta pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-482 ejecuta la quincuag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10147`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=1`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5470->5475` (`+5`), `missing_doc_links_actionable 3080->3075` (`-5`), `missing_urls 3080->3075` (`-5`), `status403 1163->1158` (`-5`), `zero_doc_initiatives 902->901` (`-1`). DoD cumplido; se cierra `965` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-482/reports/senado-status403-general-nano-packet5-fiftysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_conversion_delta_ai_ops_482_20260302T094950Z.json`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094950Z.json`, `docs/etl/sprints/AI-OPS-482/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T094950Z.rc`, `docs/etl/sprints/AI-OPS-482/evidence/quality_initiatives_after_pass1_20260302T094950Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-483 ejecuta la quincuag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10030`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5475->5480` (`+5`), `missing_doc_links_actionable 3075->3070` (`-5`), `missing_urls 3075->3070` (`-5`), `status403 1158->1153` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `966` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-483/reports/senado-status403-general-nano-packet5-fiftyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_conversion_delta_ai_ops_483_20260302T100006Z.json`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T100006Z.json`, `docs/etl/sprints/AI-OPS-483/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T100006Z.rc`, `docs/etl/sprints/AI-OPS-483/evidence/quality_initiatives_after_pass1_20260302T100006Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima octava pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-484 ejecuta la quincuag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=9981`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5480->5485` (`+5`), `missing_doc_links_actionable 3070->3065` (`-5`), `missing_urls 3070->3065` (`-5`), `status403 1153->1148` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `967` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-484/reports/senado-status403-general-nano-packet5-fiftyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_conversion_delta_ai_ops_484_20260302T101708Z.json`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T101708Z.json`, `docs/etl/sprints/AI-OPS-484/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T101708Z.rc`, `docs/etl/sprints/AI-OPS-484/evidence/quality_initiatives_after_pass1_20260302T101708Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (quincuag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Quincuag\u00e9sima novena pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-485 ejecuta la quincuag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) y mantiene conversi\u00f3n incremental con observabilidad no vac\u00eda (`rc=0`, `retry_output_json_size_bytes=10065`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `direct_variant_fetched_ok=5`, `archive_hits=0`, `archive_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5485->5490` (`+5`), `missing_doc_links_actionable 3065->3060` (`-5`), `missing_urls 3065->3060` (`-5`), `status403 1148->1143` (`-5`), `zero_doc_initiatives 901->901` (`0`). DoD cumplido; se cierra `968` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-485/reports/senado-status403-general-nano-packet5-fiftyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_conversion_delta_ai_ops_485_20260302T102001Z.json`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T102001Z.json`, `docs/etl/sprints/AI-OPS-485/evidence/senado_status403_general_retry_packet5_effective_pass1_20260302T102001Z.rc`, `docs/etl/sprints/AI-OPS-485/evidence/quality_initiatives_after_pass1_20260302T102001Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima pasada `status=403` con `packet5` + timeout/request agresivo",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-486 ejecuta la sexag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` para evitar cuelgues del replay monol\u00edtico, mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1397`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=4`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`) y cierra tambi\u00e9n el gap de estructuraci\u00f3n (`downloaded_missing_extraction=0`). Delta KPI material: `downloaded_doc_links 5490->5495` (`+5`), `missing_doc_links_actionable 3060->3054` (`-6`), `missing_urls 3060->3054` (`-6`), `status403 1143->1138` (`-5`), `status404 564->563` (`-1`), `status500 1337->1337` (`0`), `zero_doc_initiatives 901->900` (`-1`). DoD cumplido; se cierra `969` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-486/reports/senado-status403-general-nano-packet5-sixtieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-486/evidence/senado_status403_general_conversion_delta_ai_ops_486_20260302T103750Z.json`, `docs/etl/sprints/AI-OPS-486/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T103750Z.json`, `docs/etl/sprints/AI-OPS-486/evidence/quality_initiatives_after_pass1_20260302T103750Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima primera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-487 ejecuta la sexag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=3`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5495->5500` (`+5`), `missing_doc_links_actionable 3054->3049` (`-5`), `missing_urls 3054->3049` (`-5`), `status403 1138->1133` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->900` (`0`). DoD cumplido; se cierra `970` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-487/reports/senado-status403-general-nano-packet5-sixtyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-487/evidence/senado_status403_general_conversion_delta_ai_ops_487_20260302T105643Z.json`, `docs/etl/sprints/AI-OPS-487/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T105643Z.json`, `docs/etl/sprints/AI-OPS-487/evidence/quality_initiatives_after_pass1_20260302T105643Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima segunda pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-488 ejecuta la sexag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=4`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5500->5505` (`+5`), `missing_doc_links_actionable 3049->3044` (`-5`), `missing_urls 3049->3044` (`-5`), `status403 1133->1128` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->900` (`0`). DoD cumplido; se cierra `971` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-488/reports/senado-status403-general-nano-packet5-sixtysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-488/evidence/senado_status403_general_conversion_delta_ai_ops_488_20260302T110048Z.json`, `docs/etl/sprints/AI-OPS-488/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110048Z.json`, `docs/etl/sprints/AI-OPS-488/evidence/quality_initiatives_after_pass1_20260302T110048Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima tercera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-489 ejecuta la sexag\u00e9sima tercera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=1`, `direct_variant_fetched_ok=4`). Delta KPI material: `downloaded_doc_links 5505->5510` (`+5`), `missing_doc_links_actionable 3044->3039` (`-5`), `missing_urls 3044->3039` (`-5`), `status403 1128->1123` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 900->899` (`-1`). DoD cumplido; se cierra `972` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-489/reports/senado-status403-general-nano-packet5-sixtythird-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-489/evidence/senado_status403_general_conversion_delta_ai_ops_489_20260302T110417Z.json`, `docs/etl/sprints/AI-OPS-489/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110417Z.json`, `docs/etl/sprints/AI-OPS-489/evidence/quality_initiatives_after_pass1_20260302T110417Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima cuarta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima cuarta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-490 ejecuta la sexag\u00e9sima cuarta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5510->5515` (`+5`), `missing_doc_links_actionable 3039->3034` (`-5`), `missing_urls 3039->3034` (`-5`), `status403 1123->1118` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `973` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-490/reports/senado-status403-general-nano-packet5-sixtyfourth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-490/evidence/senado_status403_general_conversion_delta_ai_ops_490_20260302T110721Z.json`, `docs/etl/sprints/AI-OPS-490/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T110721Z.json`, `docs/etl/sprints/AI-OPS-490/evidence/quality_initiatives_after_pass1_20260302T110721Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima quinta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima quinta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-491 ejecuta la sexag\u00e9sima quinta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=2`, `archive_fetched_ok=2`, `direct_variant_fetched_ok=3`). Delta KPI material: `downloaded_doc_links 5515->5520` (`+5`), `missing_doc_links_actionable 3034->3029` (`-5`), `missing_urls 3034->3029` (`-5`), `status403 1118->1113` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `974` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-491/reports/senado-status403-general-nano-packet5-sixtyfifth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-491/evidence/senado_status403_general_conversion_delta_ai_ops_491_20260302T111137Z.json`, `docs/etl/sprints/AI-OPS-491/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T111137Z.json`, `docs/etl/sprints/AI-OPS-491/evidence/quality_initiatives_after_pass1_20260302T111137Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima sexta pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima sexta pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-492 ejecuta la sexag\u00e9sima sexta pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5520->5525` (`+5`), `missing_doc_links_actionable 3029->3024` (`-5`), `missing_urls 3029->3024` (`-5`), `status403 1113->1108` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `975` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-492/reports/senado-status403-general-nano-packet5-sixtysixth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-492/evidence/senado_status403_general_conversion_delta_ai_ops_492_20260302T111538Z.json`, `docs/etl/sprints/AI-OPS-492/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T111538Z.json`, `docs/etl/sprints/AI-OPS-492/evidence/quality_initiatives_after_pass1_20260302T111538Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima s\u00e9ptima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima s\u00e9ptima pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-493 ejecuta la sexag\u00e9sima s\u00e9ptima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5525->5530` (`+5`), `missing_doc_links_actionable 3024->3019` (`-5`), `missing_urls 3024->3019` (`-5`), `status403 1108->1103` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->899` (`0`). DoD cumplido; se cierra `976` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-493/reports/senado-status403-general-nano-packet5-sixtyseventh-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-493/evidence/senado_status403_general_conversion_delta_ai_ops_493_20260302T112042Z.json`, `docs/etl/sprints/AI-OPS-493/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112042Z.json`, `docs/etl/sprints/AI-OPS-493/evidence/quality_initiatives_after_pass1_20260302T112042Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima octava pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima octava pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-494 ejecuta la sexag\u00e9sima octava pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5530->5535` (`+5`), `missing_doc_links_actionable 3019->3014` (`-5`), `missing_urls 3019->3014` (`-5`), `status403 1103->1098` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 899->898` (`-1`). DoD cumplido; se cierra `977` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-494/reports/senado-status403-general-nano-packet5-sixtyeighth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-494/evidence/senado_status403_general_conversion_delta_ai_ops_494_20260302T112358Z.json`, `docs/etl/sprints/AI-OPS-494/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112358Z.json`, `docs/etl/sprints/AI-OPS-494/evidence/quality_initiatives_after_pass1_20260302T112358Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (sexag\u00e9sima novena pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Sexag\u00e9sima novena pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-495 ejecuta la sexag\u00e9sima novena pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=5`). Delta KPI material: `downloaded_doc_links 5535->5540` (`+5`), `missing_doc_links_actionable 3014->3009` (`-5`), `missing_urls 3014->3009` (`-5`), `status403 1098->1093` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 898->896` (`-2`). DoD cumplido; se cierra `978` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-495/reports/senado-status403-general-nano-packet5-sixtyninth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-495/evidence/senado_status403_general_conversion_delta_ai_ops_495_20260302T112815Z.json`, `docs/etl/sprints/AI-OPS-495/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T112815Z.json`, `docs/etl/sprints/AI-OPS-495/evidence/quality_initiatives_after_pass1_20260302T112815Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-496 ejecuta la septuag\u00e9sima pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5540->5545` (`+5`), `missing_doc_links_actionable 3009->3004` (`-5`), `missing_urls 3009->3004` (`-5`), `status403 1093->1088` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 896->894` (`-2`). DoD cumplido; se cierra `979` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-496/reports/senado-status403-general-nano-packet5-seventieth-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-496/evidence/senado_status403_general_conversion_delta_ai_ops_496_20260302T113837Z.json`, `docs/etl/sprints/AI-OPS-496/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T113837Z.json`, `docs/etl/sprints/AI-OPS-496/evidence/quality_initiatives_after_pass1_20260302T113837Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima primera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima primera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-497 ejecuta la septuag\u00e9sima primera pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5545->5550` (`+5`), `missing_doc_links_actionable 3004->2999` (`-5`), `missing_urls 3004->2999` (`-5`), `status403 1088->1083` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 894->892` (`-2`). DoD cumplido; se cierra `980` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-497/reports/senado-status403-general-nano-packet5-seventyfirst-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-497/evidence/senado_status403_general_conversion_delta_ai_ops_497_20260302T114304Z.json`, `docs/etl/sprints/AI-OPS-497/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T114304Z.json`, `docs/etl/sprints/AI-OPS-497/evidence/quality_initiatives_after_pass1_20260302T114304Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima segunda pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima segunda pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "DONE",
        "bloque": "Done now: YES. AI-OPS-498 ejecuta la septuag\u00e9sima segunda pasada `status=403` nano-packet (`rows_total=60`, `packet5=5`) con estrategia `serial_per_url_recovery` y mantiene observabilidad no vac\u00eda (`backfill_rc=0`, `retry_output_json_size_bytes=1379`, `candidate_urls=5`, `fetched_ok=5`, `failures=0`, `archive_hits=0`, `archive_fetched_ok=0`, `direct_variant_fetched_ok=0`). Delta KPI material: `downloaded_doc_links 5550->5555` (`+5`), `missing_doc_links_actionable 2999->2994` (`-5`), `missing_urls 2999->2994` (`-5`), `status403 1083->1078` (`-5`), `status404 563->563` (`0`), `status500 1337->1337` (`0`), `zero_doc_initiatives 892->890` (`-2`). DoD cumplido; se cierra `981` como `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-498/reports/senado-status403-general-nano-packet5-seventysecond-pass-conversion-20260302.md`, `docs/etl/sprints/AI-OPS-498/evidence/senado_status403_general_conversion_delta_ai_ops_498_20260302T114700Z.json`, `docs/etl/sprints/AI-OPS-498/evidence/senado_status403_general_retry_packet5_serial_pass1_20260302T114700Z.json`, `docs/etl/sprints/AI-OPS-498/evidence/quality_initiatives_after_pass1_20260302T114700Z.json`.",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      },
      {
        "tipo_dato": "Conversi\u00f3n iterativa del residual global Senado `status=403` (septuag\u00e9sima tercera pasada nano-packet)",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Septuag\u00e9sima tercera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
        "estado": "TODO",
        "bloque": "Estado base post AI-OPS-498: `missing_doc_links_actionable=2994`, `status404=563`, `status500=1337`, `status403=1078`, `status200=16`, `zero_doc_initiatives=890`. Palanca siguiente: repetir lane `status=403` con el mismo perfil nano-packet y ejecuci\u00f3n `serial_per_url_recovery` para sostener conversi\u00f3n incremental sin cuelgues. DoD: `retry_output_json_size_bytes > 0` y `candidate_urls > 0`; adem\u00e1s `downloaded_doc_links +1` o `missing_doc_links_actionable -1`. Siguiente comando: repetir la receta de `AI-OPS-498` (export `limit 60` + `packet5` + replay por URL + backfill limitado de excerpts/extractions).",
        "source_ids": [],
        "scope": "nacional",
        "scope_inferred": true
      }
    ]
  },
  "roadmap": {
    "path": "docs/roadmap.md",
    "exists": true,
    "phases": [
      {
        "id": "phase_0",
        "phase": 0,
        "title": "Fase 0: base metodol\u00f3gica y de datos",
        "points_eng": 3,
        "points_hum": 13,
        "progress": {
          "done": 5,
          "partial": 0,
          "todo": 0,
          "untracked": 1,
          "tracked_total": 5,
          "overall_total": 6,
          "tracked_percent": 100,
          "overall_percent": 83
        },
        "items": [
          {
            "kind": "tracker",
            "id": "referencias_territoriales",
            "label": "Referencias territoriales",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "taxonomia_de_temas_alto_impacto_por_scope",
            "label": "Taxonomia de temas (alto impacto por scope)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "territorial",
            "bloque": "Seed/versionado: `etl/data/seeds/topic_taxonomy_es.json`. Build: `python3 scripts/ingestar_parlamentario_es.py backfill-topic-analytics --db <db> --as-of-date <YYYY-MM-DD> --taxonomy-seed etl/data/seeds/topic_taxonomy_es.json`",
            "source_ids": []
          },
          {
            "kind": "manual",
            "id": "taxonomy_v1",
            "label": "Taxonom\u00eda (Tier 1/2) definida y versionada",
            "status": "DONE",
            "path": "docs/domain_taxonomy_es.md"
          },
          {
            "kind": "manual",
            "id": "codebook_v1",
            "label": "Codebook Tier 1 (ejes por dominio) versionado",
            "status": "DONE",
            "path": "docs/codebook_tier1_es.md"
          },
          {
            "kind": "manual",
            "id": "annotation_protocol",
            "label": "Protocolo de anotaci\u00f3n (doble entrada, acuerdo, arbitraje)",
            "status": "DONE",
            "path": "docs/annotation_protocol_es.md"
          },
          {
            "kind": "manual",
            "id": "interventions_template",
            "label": "Plantilla de intervenci\u00f3n (definici\u00f3n de tratamiento)",
            "status": "DONE",
            "path": "docs/intervention_template_es.md"
          }
        ],
        "next": [
          {
            "id": "referencias_territoriales",
            "label": "Referencias territoriales",
            "status": "MISSING",
            "path": null
          }
        ]
      },
      {
        "id": "phase_1",
        "phase": 1,
        "title": "Fase 1: MVP \"acci\u00f3n verificable\" a nivel Estado",
        "points_eng": 21,
        "points_hum": 8,
        "progress": {
          "done": 8,
          "partial": 0,
          "todo": 0,
          "untracked": 8,
          "tracked_total": 8,
          "overall_total": 16,
          "tracked_percent": 100,
          "overall_percent": 50
        },
        "items": [
          {
            "kind": "tracker",
            "id": "votaciones_congreso",
            "label": "Votaciones Congreso",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "votaciones_senado_y_mociones",
            "label": "Votaciones Senado y mociones",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "marco_legal_electoral",
            "label": "Marco legal electoral",
            "status": "DONE",
            "dominio": "Legal",
            "scope": "legal",
            "bloque": "Done now: YES. Ingesta BOE (`boe_api_legal`) y mapping a `policy_events` est\u00e1n reproducibles (`records_loaded=298`, `policy_events_boe=298`) y reconciliados con SQL `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-08/reports/waiver-burndown-apply-recompute.md`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-ingest-replay.log`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-policy-events-backfill.log` y `docs/etl/sprints/AI-OPS-08/reports/boe-tracker-mapping-hardening.md`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "boe_api_legal"
            ]
          },
          {
            "kind": "tracker",
            "id": "accion_ejecutiva_consejo_de_ministros",
            "label": "Accion ejecutiva (Consejo de Ministros)",
            "status": "DONE",
            "dominio": "Ejecutivo",
            "scope": "ejecutivo",
            "bloque": "Done now: YES. Ingesta Moncloa y mapping a `policy_events` reproducibles (`moncloa_referencias=20`, `moncloa_rss_referencias=8`, total `28`) y reconciliadas con SQL `DONE` sin waiver activa para Moncloa. Evidencia: `docs/etl/sprints/AI-OPS-07/reports/dual-entry-apply-recompute.md`, `docs/etl/sprints/AI-OPS-07/reports/boe-policy-events-mapping.md` y `docs/etl/sprints/AI-OPS-07/evidence/post_apply_waiveraware_checker_final.log`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "moncloa_referencias",
              "moncloa_rss_referencias"
            ]
          },
          {
            "kind": "tracker",
            "id": "contratacion_publica_espana",
            "label": "Contratacion publica (Espana)",
            "status": "DONE",
            "dominio": "Dinero",
            "scope": "dinero",
            "bloque": "Done now: YES. `placsp_sindicacion` recuper\u00f3 `strict-network` con red real (`run_id=249`, `run_status=ok`, `run_records_loaded=106`) y el mismatch restante era solo desfase tracker/SQL, por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-11/evidence/placsp-strict-refresh.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-status.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-gate.log`, `docs/etl/sprints/AI-OPS-11/exports/placsp_waiver_decision.csv`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "placsp_sindicacion"
            ]
          },
          {
            "kind": "tracker",
            "id": "subvenciones_y_ayudas_espana",
            "label": "Subvenciones y ayudas (Espana)",
            "status": "DONE",
            "dominio": "Dinero",
            "scope": "dinero",
            "bloque": "Done now: YES. `bdns_api_subvenciones` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/ultimas`) y red real (`run_id=256`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "bdns_api_subvenciones"
            ]
          },
          {
            "kind": "tracker",
            "id": "transparencia_agendas_altos_cargos",
            "label": "Transparencia: agendas altos cargos",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "transparencia_declaraciones_intereses",
            "label": "Transparencia: declaraciones/intereses",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "taxonomia_de_temas_alto_impacto_por_scope",
            "label": "Taxonomia de temas (alto impacto por scope)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "territorial",
            "bloque": "Seed/versionado: `etl/data/seeds/topic_taxonomy_es.json`. Build: `python3 scripts/ingestar_parlamentario_es.py backfill-topic-analytics --db <db> --as-of-date <YYYY-MM-DD> --taxonomy-seed etl/data/seeds/topic_taxonomy_es.json`",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "evidencia_textual_para_posiciones_declaradas",
            "label": "Evidencia textual (para posiciones declaradas)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "nacional",
            "bloque": "Modelo can\u00f3nico: `text_documents` (metadata + excerpt) enlazado por `source_record_pk` de `topic_evidence`. Backfill: `python3 scripts/ingestar_parlamentario_es.py backfill-text-documents --db <db> --source-id congreso_intervenciones --only-missing` (o `just parl-backfill-text-documents`). Adem\u00e1s, copia un snippet a `topic_evidence.excerpt` para que `/explorer-temas` sea auditable sin joins. Nota: stance classification sigue siendo otro paso (ver filas de \u201cIntervenciones\u201d/\u201cPosiciones\u201d).",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "clasificacion_evidencia_tema_trazable",
            "label": "Clasificacion evidencia -> tema (trazable)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "",
            "bloque": "MVP (votos + intervenciones): evidencia se etiqueta a `topic_id` (votos via `parl_vote_event_initiatives`; intervenciones via `initiative_id`/expediente). KPIs en `/explorer-sources`: `topic_evidence_with_topic_pct` + breakdown por `topic_method`/`stance_method`.",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "posiciones_por_tema_politico_x_scope",
            "label": "Posiciones por tema (politico x scope)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "nacional",
            "bloque": "Done now: YES. `backfill-topic-analytics` en `as_of_date=2026-02-16` dej\u00f3 ambos sets en latest alineado y cerr\u00f3 el blocker de cobertura en Congreso: `topic_set_id=1` pas\u00f3 de `12/60 (20.0%)` a `60/60 (100.0%)`, mientras `topic_set_id=2` qued\u00f3 en `23/24 (95.83%)` con latest tambi\u00e9n en `2026-02-16`; adem\u00e1s, `topic_positions_total` subi\u00f3 de `137379` a `205907` y `computed_method_votes` de `68528` a `137056` (`combined=68612`, `declared=239`). Evidencia: `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_baseline.csv`, `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_post.csv`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_baseline.log`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_recompute.log`, `docs/etl/sprints/AI-OPS-15/reports/topic_positions_reconciliation.md`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": []
          },
          {
            "kind": "manual",
            "id": "action_vectors_v1",
            "label": "Action vectors Tier 1 (vectorial + incertidumbre) con drill-down",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "kind": "manual",
            "id": "incoherence_v1",
            "label": "Se\u00f1al de incoherencia v1 (intra-dominio y dicho vs hecho)",
            "status": "UNTRACKED",
            "path": ""
          }
        ],
        "next": [
          {
            "id": "action_vectors_v1",
            "label": "Action vectors Tier 1 (vectorial + incertidumbre) con drill-down",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "path": null
          },
          {
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "path": null
          },
          {
            "id": "incoherence_v1",
            "label": "Se\u00f1al de incoherencia v1 (intra-dominio y dicho vs hecho)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "transparencia_agendas_altos_cargos",
            "label": "Transparencia: agendas altos cargos",
            "status": "MISSING",
            "path": null
          }
        ]
      },
      {
        "id": "phase_2",
        "phase": 2,
        "title": "Fase 2: multinivel (3 CCAA piloto)",
        "points_eng": 21,
        "points_hum": 8,
        "progress": {
          "done": 5,
          "partial": 0,
          "todo": 2,
          "untracked": 1,
          "tracked_total": 7,
          "overall_total": 8,
          "tracked_percent": 71,
          "overall_percent": 62
        },
        "items": [
          {
            "kind": "tracker",
            "id": "representantes_y_mandatos_asamblea_de_madrid",
            "label": "Representantes y mandatos (Asamblea de Madrid)",
            "status": "DONE",
            "dominio": "Autonomico",
            "scope": "autonomico",
            "bloque": "Definir umbral minimo y aclarar semantica de `is_active`",
            "source_ids": [
              "asamblea_madrid_ocupaciones"
            ]
          },
          {
            "kind": "tracker",
            "id": "representantes_y_mandatos_parlament_de_catalunya",
            "label": "Representantes y mandatos (Parlament de Catalunya)",
            "status": "DONE",
            "dominio": "Autonomico",
            "scope": "autonomico",
            "bloque": "Hardening de parsing y umbral minimo",
            "source_ids": [
              "parlament_catalunya_diputats"
            ]
          },
          {
            "kind": "tracker",
            "id": "representantes_y_mandatos_parlamento_de_andalucia",
            "label": "Representantes y mandatos (Parlamento de Andalucia)",
            "status": "DONE",
            "dominio": "Autonomico",
            "scope": "autonomico",
            "bloque": "Hardening de parsing y umbral minimo",
            "source_ids": [
              "parlamento_andalucia_diputados"
            ]
          },
          {
            "kind": "tracker",
            "id": "normativa_autonomica_piloto_3_ccaa",
            "label": "Normativa auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "dominio": "Legal",
            "scope": "autonomico",
            "bloque": "Falta conector y modelo can\u00f3nico de normas auton\u00f3micas (con efectos) con trazabilidad y dedupe por versi\u00f3n",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "contratacion_autonomica_piloto_3_ccaa",
            "label": "Contrataci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "DONE",
            "dominio": "Dinero",
            "scope": "dinero",
            "bloque": "Done now: YES. `placsp_autonomico` recuper\u00f3 `strict-network` con red real (`run_id=248`, `run_status=ok`, `run_records_loaded=106`) y el mismatch restante era solo desfase tracker/SQL, por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-11/evidence/placsp-strict-refresh.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-status.log`, `docs/etl/sprints/AI-OPS-11/evidence/post-strict-gate.log`, `docs/etl/sprints/AI-OPS-11/exports/placsp_waiver_decision.csv`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "placsp_autonomico"
            ]
          },
          {
            "kind": "tracker",
            "id": "subvenciones_autonomicas_piloto_3_ccaa",
            "label": "Subvenciones auton\u00f3micas (piloto 3 CCAA)",
            "status": "DONE",
            "dominio": "Dinero",
            "scope": "dinero",
            "bloque": "Done now: YES. `bdns_autonomico` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/busqueda`) y red real (`run_id=257`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "bdns_autonomico"
            ]
          },
          {
            "kind": "tracker",
            "id": "presupuesto_ejecucion_autonomica_piloto_3_ccaa",
            "label": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "dominio": "Dinero",
            "scope": "autonomico",
            "bloque": "Falta conector y crosswalk de clasificaciones; preferir ejecuci\u00f3n cuando exista",
            "source_ids": []
          },
          {
            "kind": "manual",
            "id": "ccaa_vectors",
            "label": "Action vectors Tier 1 para 3 CCAA (comparables con Estado)",
            "status": "UNTRACKED",
            "path": ""
          }
        ],
        "next": [
          {
            "id": "normativa_autonomica_piloto_3_ccaa",
            "label": "Normativa auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "path": null
          },
          {
            "id": "presupuesto_ejecucion_autonomica_piloto_3_ccaa",
            "label": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "path": null
          },
          {
            "id": "ccaa_vectors",
            "label": "Action vectors Tier 1 para 3 CCAA (comparables con Estado)",
            "status": "UNTRACKED",
            "path": ""
          }
        ]
      },
      {
        "id": "phase_3",
        "phase": 3,
        "title": "Fase 3: producto p\u00fablico v1 (trazabilidad total)",
        "points_eng": 13,
        "points_hum": 5,
        "progress": {
          "done": 3,
          "partial": 0,
          "todo": 1,
          "untracked": 3,
          "tracked_total": 4,
          "overall_total": 7,
          "tracked_percent": 75,
          "overall_percent": 43
        },
        "items": [
          {
            "kind": "tracker",
            "id": "procesos_electorales_y_resultados",
            "label": "Procesos electorales y resultados",
            "status": "DONE",
            "dominio": "Electoral",
            "scope": "electoral",
            "bloque": "Hardening de parsing de campos opcionales en procesos/resultados",
            "source_ids": [
              "infoelectoral_descargas",
              "infoelectoral_procesos"
            ]
          },
          {
            "kind": "tracker",
            "id": "convocatorias_y_estado_electoral",
            "label": "Convocatorias y estado electoral",
            "status": "TODO",
            "dominio": "Electoral",
            "scope": "nacional",
            "bloque": "Falta scraper y normalizacion",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "posiciones_declaradas_programas",
            "label": "Posiciones declaradas (programas)",
            "status": "DONE",
            "dominio": "Editorial",
            "scope": "nacional",
            "bloque": "Done now: YES. AI-OPS-239 cierra el contrato de red real de `programas_partidos`: corrida `strict-network` con `manifest` (`source_url` HTTP, `local_path` vac\u00edo) en staging (`run_id=283`, `status=ok`, `records_seen=3`, `records_loaded=3`) y `run_fetches.source_url` promovido a URL HTTP del documento (`http://127.0.0.1:8765/...`). Gate tracker queda sin `DONE_ZERO_REAL` (`max_net=3`, `max_any=3`, `net/fallback_fetches=2/6`). Se mantiene calidad declarada en verde tras cierre de cola (`review_pending=0`, `review_closed_pct=1.0`, `declared_positions_coverage_pct=1.6`, `topic_evidence_with_nonempty_stance_pct=1.0`, gate `passed=true`). Evidencia: `docs/etl/sprints/AI-OPS-239/reports/programas-network-contract-closure-20260228.md`, `docs/etl/sprints/AI-OPS-239/evidence/programas_ingest_http_sample_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/programas_declared_status_post_review_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/quality_declared_programas_post_review_20260228.json`, `docs/etl/sprints/AI-OPS-239/evidence/tracker_status_post_programas_network_contract_20260228.log`, `docs/etl/sprints/AI-OPS-239/evidence/unittest_parl_programas_partidos_20260228.txt`. Siguiente comando: `SNAPSHOT_DATE=<YYYY-MM-DD> PROGRAMAS_MANIFEST=<manifest.csv con source_url HTTP y local_path vac\u00edo> just parl-programas-pipeline && python3 scripts/e2e_tracker_status.py --db <db> --tracker docs/etl/e2e-scrape-load-tracker.md --fail-on-done-zero-real`.",
            "source_ids": [
              "programas_partidos"
            ]
          },
          {
            "kind": "tracker",
            "id": "posiciones_por_tema_politico_x_scope",
            "label": "Posiciones por tema (politico x scope)",
            "status": "DONE",
            "dominio": "Analitica",
            "scope": "nacional",
            "bloque": "Done now: YES. `backfill-topic-analytics` en `as_of_date=2026-02-16` dej\u00f3 ambos sets en latest alineado y cerr\u00f3 el blocker de cobertura en Congreso: `topic_set_id=1` pas\u00f3 de `12/60 (20.0%)` a `60/60 (100.0%)`, mientras `topic_set_id=2` qued\u00f3 en `23/24 (95.83%)` con latest tambi\u00e9n en `2026-02-16`; adem\u00e1s, `topic_positions_total` subi\u00f3 de `137379` a `205907` y `computed_method_votes` de `68528` a `137056` (`combined=68612`, `declared=239`). Evidencia: `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_baseline.csv`, `docs/etl/sprints/AI-OPS-15/exports/topic_positions_kpi_post.csv`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_baseline.log`, `docs/etl/sprints/AI-OPS-15/evidence/topic_positions_recompute.log`, `docs/etl/sprints/AI-OPS-15/reports/topic_positions_reconciliation.md`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": []
          },
          {
            "kind": "manual",
            "id": "dashboard_public_v1",
            "label": "Dashboard p\u00fablico v1 (trazabilidad total, modo auditor)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "kind": "manual",
            "id": "weights_scenarios",
            "label": "Escenarios de pesos + sensibilidad (sin ranking \u00fanico por defecto)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "kind": "manual",
            "id": "replica_mode",
            "label": "Modo r\u00e9plica: export dataset procesado + script/consulta reproducible",
            "status": "UNTRACKED",
            "path": ""
          }
        ],
        "next": [
          {
            "id": "convocatorias_y_estado_electoral",
            "label": "Convocatorias y estado electoral",
            "status": "TODO",
            "path": null
          },
          {
            "id": "dashboard_public_v1",
            "label": "Dashboard p\u00fablico v1 (trazabilidad total, modo auditor)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "weights_scenarios",
            "label": "Escenarios de pesos + sensibilidad (sin ranking \u00fanico por defecto)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "replica_mode",
            "label": "Modo r\u00e9plica: export dataset procesado + script/consulta reproducible",
            "status": "UNTRACKED",
            "path": ""
          }
        ]
      },
      {
        "id": "phase_4",
        "phase": 4,
        "title": "Fase 4: impacto (causalidad) en 1-2 dominios",
        "points_eng": 13,
        "points_hum": 13,
        "progress": {
          "done": 2,
          "partial": 2,
          "todo": 0,
          "untracked": 3,
          "tracked_total": 4,
          "overall_total": 7,
          "tracked_percent": 75,
          "overall_percent": 43
        },
        "items": [
          {
            "kind": "tracker",
            "id": "indicadores_outcomes_ine",
            "label": "Indicadores (outcomes): INE",
            "status": "MISSING",
            "dominio": "",
            "scope": "",
            "bloque": "No existe fila en e2e-scrape-load-tracker",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "indicadores_outcomes_eurostat",
            "label": "Indicadores (outcomes): Eurostat",
            "status": "DONE",
            "dominio": "Outcomes",
            "scope": "outcomes",
            "bloque": "Done now: YES. `eurostat_sdmx` tiene `strict-network` exitoso (`run_records_loaded=2394`) y replay no-cero (`run_records_loaded=2`), por lo que el mismatch actual era desfase tracker/SQL y se reconcilia a `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__strict-network_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__replay_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/reports/eurostat-apply.md`, `docs/etl/sprints/AI-OPS-10/evidence/tracker-gate-postrun.log`, `docs/etl/sprints/AI-OPS-10/evidence/status-postrun.json`. Siguiente comando: `just etl-tracker-gate`.",
            "source_ids": [
              "eurostat_sdmx"
            ]
          },
          {
            "kind": "tracker",
            "id": "indicadores_confusores_banco_de_espana",
            "label": "Indicadores (confusores): Banco de Espana",
            "status": "DONE",
            "dominio": "Outcomes",
            "scope": "outcomes",
            "bloque": "Done now: YES. AI-OPS-237 cierra la deriva de endpoint BDE: se migra el conector a `app.bde.es/bierest/resources/srdatosapp/listaSeries` y se endurece parsing para payload `fechas/valores` + `gzip`. Corrida `strict-network` real en staging: `run_id=278`, `status=ok`, `records_seen=1`, `records_loaded=1` (`bde_series_api: 1/1 registros validos`). Estructuraci\u00f3n posterior (`backfill-indicators --source-ids bde_series_api`) queda en `source_records_mapped=3`, `indicator_series_upserted=3`, `indicator_points_upserted=37`, `observation_records_upserted=37`, `indicator_series_unresolved_domain=0` (heur\u00edstica a\u00f1adida `euribor -> vivienda_urbanismo`). Evidencia: `docs/etl/sprints/AI-OPS-237/reports/bde-series-endpoint-drift-closure-20260227.md`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingest_strict_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingestion_runs_latest.txt`, `docs/etl/sprints/AI-OPS-237/evidence/backfill_indicators_bde_after_domain_fix_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/tracker_status_post_bde_fix_latest.log`, `docs/etl/sprints/AI-OPS-237/evidence/python_unittest_bde_indicator_backfill_latest.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db <db> --source bde_series_api --url 'https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma=es&series=D_1NBAF472&rango=30M' --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids bde_series_api`.",
            "source_ids": [
              "bde_series_api"
            ]
          },
          {
            "kind": "tracker",
            "id": "indicadores_confusores_aemet",
            "label": "Indicadores (confusores): AEMET",
            "status": "PARTIAL",
            "dominio": "Outcomes",
            "scope": "outcomes",
            "bloque": "Done now: NO. Blocker: `aemet_opendata_series` en `strict-network` sigue bloqueado por contrato (`aemet_blocker=contract`, JSON invalido con payload vac\u00edo `payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, `run_id=263`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `AEMET_API_KEY=<token> python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --url https://opendata.aemet.es/opendata/api/observacion/convencional/todas --snapshot-date 2026-02-17 --strict-network --timeout 30`.",
            "source_ids": [
              "aemet_opendata_series"
            ]
          },
          {
            "kind": "tracker",
            "id": "indicadores_confusores_esios_ree",
            "label": "Indicadores (confusores): ESIOS/REE",
            "status": "PARTIAL",
            "dominio": "Outcomes",
            "scope": "outcomes",
            "bloque": "Done now: PARTIAL. AI-OPS-296 cierra el gap de conector con `ree_esios_indicators` (config/registry + parser de payload REE `included[].attributes.values` + soporte de contenedor serializado `records` + rechazo de snapshots legacy `metric,value` + fallback sample reproducible) y lo integra en `backfill-indicators`/mapeo tracker. Corrida reproducible en DB principal desde muestra (`--from-file`) deja `status=ok`, `records_loaded=2`, `source_records_total=2`; el probe `--strict-network` al endpoint oficial sigue bloqueado de forma reproducible con `HTTP 500`, body HTML y cabecera `x-cdn: Imperva`, por lo que no aplica `DONE` en red real. Evidencia: `docs/etl/sprints/AI-OPS-296/reports/ree-esios-indicators-connector-partial-closure-20260228.md`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_ingest_status_latest.json`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_curl_headers_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/e2e_tracker_status_main_db_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_main_db_ingestion_runs_latest.txt`. Siguiente comando: `ESIOS_API_TOKEN=<token> python3 scripts/ingestar_politicos_es.py ingest --db <db> --source ree_esios_indicators --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids ree_esios_indicators`.",
            "source_ids": [
              "ree_esios_indicators"
            ]
          },
          {
            "kind": "manual",
            "id": "impact_cards",
            "label": "Impact cards (efecto + incertidumbre + supuestos + enlaces)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "kind": "manual",
            "id": "causal_eval_pack",
            "label": "Evaluaciones causales (dise\u00f1o + diagn\u00f3sticos + credibilidad)",
            "status": "UNTRACKED",
            "path": ""
          }
        ],
        "next": [
          {
            "id": "indicadores_confusores_aemet",
            "label": "Indicadores (confusores): AEMET",
            "status": "PARTIAL",
            "path": null
          },
          {
            "id": "indicadores_confusores_esios_ree",
            "label": "Indicadores (confusores): ESIOS/REE",
            "status": "PARTIAL",
            "path": null
          },
          {
            "id": "causal_eval_pack",
            "label": "Evaluaciones causales (dise\u00f1o + diagn\u00f3sticos + credibilidad)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "impact_cards",
            "label": "Impact cards (efecto + incertidumbre + supuestos + enlaces)",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "id": "indicadores_outcomes_ine",
            "label": "Indicadores (outcomes): INE",
            "status": "MISSING",
            "path": null
          }
        ]
      },
      {
        "id": "phase_5",
        "phase": 5,
        "title": "Fase 5: expansi\u00f3n operativa (10-12 CCAA + municipios grandes)",
        "points_eng": 34,
        "points_hum": 13,
        "progress": {
          "done": 0,
          "partial": 0,
          "todo": 4,
          "untracked": 2,
          "tracked_total": 4,
          "overall_total": 6,
          "tracked_percent": 0,
          "overall_percent": 0
        },
        "items": [
          {
            "kind": "tracker",
            "id": "ue_legislacion_y_documentos",
            "label": "UE: legislacion y documentos",
            "status": "TODO",
            "dominio": "UE",
            "scope": "europeo",
            "bloque": "Falta conector UE legal; linking a expedientes y textos vigentes",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "ue_votaciones_roll_call",
            "label": "UE: votaciones (roll-call)",
            "status": "TODO",
            "dominio": "UE",
            "scope": "europeo",
            "bloque": "Falta ingesta de votos + mapeo a MEPs; KPI: % con actor resuelto",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "ue_contratacion_publica",
            "label": "UE: contratacion publica",
            "status": "TODO",
            "dominio": "UE",
            "scope": "europeo",
            "bloque": "Falta ingesta; KPI: cobertura y trazabilidad por notice",
            "source_ids": []
          },
          {
            "kind": "tracker",
            "id": "ue_lobbying_influencia",
            "label": "UE: lobbying/influencia",
            "status": "TODO",
            "dominio": "UE",
            "scope": "europeo",
            "bloque": "Falta ingesta y modelo de entidades; linking cuando existan meetings/agendas publicas",
            "source_ids": []
          },
          {
            "kind": "manual",
            "id": "multilevel_scale",
            "label": "Escalado multinivel (10-12 CCAA + municipios grandes) sin caer en PDFs por defecto",
            "status": "UNTRACKED",
            "path": ""
          },
          {
            "kind": "manual",
            "id": "money_sampling",
            "label": "Estrategia de muestreo/agregaci\u00f3n en contrataci\u00f3n/subvenciones (no 'leerlo todo')",
            "status": "UNTRACKED",
            "path": ""
          }
        ],
        "next": [
          {
            "id": "ue_contratacion_publica",
            "label": "UE: contratacion publica",
            "status": "TODO",
            "path": null
          },
          {
            "id": "ue_legislacion_y_documentos",
            "label": "UE: legislacion y documentos",
            "status": "TODO",
            "path": null
          },
          {
            "id": "ue_lobbying_influencia",
            "label": "UE: lobbying/influencia",
            "status": "TODO",
            "path": null
          },
          {
            "id": "ue_votaciones_roll_call",
            "label": "UE: votaciones (roll-call)",
            "status": "TODO",
            "path": null
          },
          {
            "id": "multilevel_scale",
            "label": "Escalado multinivel (10-12 CCAA + municipios grandes) sin caer en PDFs por defecto",
            "status": "UNTRACKED",
            "path": ""
          }
        ]
      }
    ],
    "summary": {
      "done": 23,
      "partial": 2,
      "todo": 7,
      "untracked": 18,
      "tracked_total": 32,
      "overall_total": 50,
      "tracked_percent": 75,
      "overall_percent": 48
    }
  },
  "roadmap_technical": {
    "path": "docs/roadmap-tecnico.md",
    "exists": true,
    "phases": [
      {
        "id": "tech_phase_0",
        "phase": 0,
        "title": "Fase 0: Reforzar base de datos y calidad",
        "points_eng": 8,
        "points_eng_raw": "8",
        "progress": {
          "done": 6,
          "partial": 0,
          "todo": 1,
          "untracked": 3,
          "tracked_total": 7,
          "overall_total": 10,
          "tracked_percent": 86,
          "overall_percent": 60
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "votaciones_congreso",
            "label": "Votaciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "votaciones_senado_y_mociones",
            "label": "Votaciones Senado y mociones",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "taxonomia_de_temas_alto_impacto_por_scope",
            "label": "Taxonomia de temas (alto impacto por scope)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "clasificacion_evidencia_tema_trazable",
            "label": "Clasificacion evidencia -> tema (trazable)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "posiciones_por_tema_politico_x_scope",
            "label": "Posiciones por tema (politico x scope)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "fk_check_clean",
            "label": "PRAGMA foreign_key_check sin filas",
            "status": "DONE",
            "metric": "fk_violations",
            "actual": 0,
            "target": 0,
            "format": "int",
            "actual_display": "0",
            "target_display": "0"
          },
          {
            "kind": "metric",
            "id": "votes_quality_gate",
            "label": "Gate de calidad de votaciones (enforce-gate)",
            "status": "DONE",
            "metric": "vote_gate_passed",
            "actual": true,
            "target": null,
            "format": "bool",
            "actual_display": "true",
            "target_display": "\u2014"
          },
          {
            "kind": "metric",
            "id": "initiatives_quality_gate",
            "label": "Gate de calidad de iniciativas",
            "status": "TODO",
            "metric": "initiative_gate_passed",
            "actual": false,
            "target": null,
            "format": "bool",
            "actual_display": "false",
            "target_display": "\u2014"
          },
          {
            "kind": "metric",
            "id": "done_sources_with_network",
            "label": "Fuentes tracker=DONE con evidencia de red",
            "status": "DONE",
            "metric": "done_sources_with_network_pct",
            "actual": 1.0,
            "target": 1.0,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "100%"
          }
        ],
        "next": [
          {
            "id": "initiatives_quality_gate",
            "label": "Gate de calidad de iniciativas",
            "status": "TODO",
            "actual_display": "false",
            "target_display": "\u2014"
          },
          {
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "id": "votaciones_congreso",
            "label": "Votaciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "id": "votaciones_senado_y_mociones",
            "label": "Votaciones Senado y mociones",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          }
        ]
      },
      {
        "id": "tech_phase_1",
        "phase": 1,
        "title": "Fase 1: Cerrar loop de \u201clo que hacen\u201d",
        "points_eng": 8,
        "points_eng_raw": "8",
        "progress": {
          "done": 4,
          "partial": 0,
          "todo": 0,
          "untracked": 4,
          "tracked_total": 4,
          "overall_total": 8,
          "tracked_percent": 100,
          "overall_percent": 50
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "votaciones_congreso",
            "label": "Votaciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "votaciones_senado_y_mociones",
            "label": "Votaciones Senado y mociones",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "events_with_date_pct",
            "label": "Eventos con fecha",
            "status": "DONE",
            "metric": "events_with_date_pct",
            "actual": 1.0,
            "target": 0.95,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "95%"
          },
          {
            "kind": "metric",
            "id": "events_with_initiative_link_pct",
            "label": "Eventos con iniciativa enlazada",
            "status": "DONE",
            "metric": "events_with_initiative_link_pct",
            "actual": 1.0,
            "target": 0.95,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "95%"
          },
          {
            "kind": "metric",
            "id": "member_votes_with_person_id_pct",
            "label": "Votos nominales con person_id",
            "status": "DONE",
            "metric": "member_votes_with_person_id_pct",
            "actual": 0.980442765003908,
            "target": 0.9,
            "format": "pct",
            "actual_display": "98%",
            "target_display": "90%"
          },
          {
            "kind": "metric",
            "id": "latest_events_with_topic_evidence_pct",
            "label": "Eventos latest con topic_evidence",
            "status": "DONE",
            "metric": "latest_events_with_topic_evidence_pct",
            "actual": 0.7518413597733711,
            "target": 0.5,
            "format": "pct",
            "actual_display": "75%",
            "target_display": "50%"
          }
        ],
        "next": [
          {
            "id": "iniciativas_congreso",
            "label": "Iniciativas Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "id": "votaciones_congreso",
            "label": "Votaciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "id": "votaciones_senado_y_mociones",
            "label": "Votaciones Senado y mociones",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          }
        ]
      },
      {
        "id": "tech_phase_2",
        "phase": 2,
        "title": "Fase 2: Posiciones p\u00fablicas y se\u00f1al de coherencia",
        "points_eng": 13,
        "points_eng_raw": "13",
        "progress": {
          "done": 7,
          "partial": 0,
          "todo": 0,
          "untracked": 1,
          "tracked_total": 7,
          "overall_total": 8,
          "tracked_percent": 100,
          "overall_percent": 88
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "evidencia_textual_para_posiciones_declaradas",
            "label": "Evidencia textual (para posiciones declaradas)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "clasificacion_evidencia_tema_trazable",
            "label": "Clasificacion evidencia -> tema (trazable)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "posiciones_por_tema_politico_x_scope",
            "label": "Posiciones por tema (politico x scope)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "topic_evidence_declared_total",
            "label": "Evidencia declarada extraida",
            "status": "DONE",
            "metric": "topic_evidence_declared_total",
            "actual": 1182,
            "target": 1,
            "format": "int",
            "actual_display": "1182",
            "target_display": "1"
          },
          {
            "kind": "metric",
            "id": "topic_evidence_declared_with_signal_pct",
            "label": "Evidencia declarada con stance util",
            "status": "DONE",
            "metric": "topic_evidence_declared_with_signal_pct",
            "actual": 0.5287648054145516,
            "target": 0.5,
            "format": "pct",
            "actual_display": "53%",
            "target_display": "50%"
          },
          {
            "kind": "metric",
            "id": "topic_evidence_with_topic_pct",
            "label": "Evidencia con topic_id",
            "status": "DONE",
            "metric": "topic_evidence_with_topic_pct",
            "actual": 1.0,
            "target": 0.95,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "95%"
          },
          {
            "kind": "metric",
            "id": "topic_evidence_with_source_url_pct",
            "label": "Trazabilidad en topic_evidence (source_url)",
            "status": "DONE",
            "metric": "topic_evidence_with_source_url_pct",
            "actual": 1.0,
            "target": 1.0,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "100%"
          }
        ],
        "next": [
          {
            "id": "intervenciones_congreso",
            "label": "Intervenciones Congreso",
            "status": "MISSING",
            "actual_display": "MISSING",
            "target_display": "DONE"
          }
        ]
      },
      {
        "id": "tech_phase_3",
        "phase": 3,
        "title": "Fase 3: Motor de recomendaci\u00f3n y fiabilidad",
        "points_eng": 13,
        "points_eng_raw": "13",
        "progress": {
          "done": 5,
          "partial": 0,
          "todo": 0,
          "untracked": 0,
          "tracked_total": 5,
          "overall_total": 5,
          "tracked_percent": 100,
          "overall_percent": 100
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "posiciones_por_tema_politico_x_scope",
            "label": "Posiciones por tema (politico x scope)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "posiciones_declaradas_programas",
            "label": "Posiciones declaradas (programas)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "topic_positions_total",
            "label": "Posiciones agregadas disponibles",
            "status": "DONE",
            "metric": "topic_positions_total",
            "actual": 275612,
            "target": 1,
            "format": "int",
            "actual_display": "275612",
            "target_display": "1"
          },
          {
            "kind": "metric",
            "id": "topic_positions_with_evidence_pct",
            "label": "Posiciones con evidencia suficiente",
            "status": "DONE",
            "metric": "topic_positions_with_evidence_pct",
            "actual": 1.0,
            "target": 0.9,
            "format": "pct",
            "actual_display": "100%",
            "target_display": "90%"
          },
          {
            "kind": "metric",
            "id": "coherence_explicit_total",
            "label": "Comparaciones explicitas says/does",
            "status": "DONE",
            "metric": "coherence_explicit_total",
            "actual": 99,
            "target": 1,
            "format": "int",
            "actual_display": "99",
            "target_display": "1"
          }
        ],
        "next": []
      },
      {
        "id": "tech_phase_4",
        "phase": 4,
        "title": "Fase 4: UX + comunidad + operaciones",
        "points_eng": 8,
        "points_eng_raw": "8",
        "progress": {
          "done": 3,
          "partial": 0,
          "todo": 2,
          "untracked": 0,
          "tracked_total": 5,
          "overall_total": 5,
          "tracked_percent": 60,
          "overall_percent": 60
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "procesos_electorales_y_resultados",
            "label": "Procesos electorales y resultados",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "convocatorias_y_estado_electoral",
            "label": "Convocatorias y estado electoral",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "posiciones_declaradas_programas",
            "label": "Posiciones declaradas (programas)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "review_queue_pending_ratio",
            "label": "Review queue pendiente / declaradas",
            "status": "DONE",
            "metric": "review_queue_pending_ratio",
            "actual": 0.03553299492385787,
            "target": 0.25,
            "format": "pct",
            "actual_display": "4%",
            "target_display": "25%"
          },
          {
            "kind": "metric",
            "id": "published_recommendation_artifacts",
            "label": "Artefactos publicados (topics/claims/recommendation-kpis)",
            "status": "TODO",
            "metric": "published_recommendation_artifacts",
            "actual": 0,
            "target": 3,
            "format": "int",
            "actual_display": "0",
            "target_display": "3"
          }
        ],
        "next": [
          {
            "id": "published_recommendation_artifacts",
            "label": "Artefactos publicados (topics/claims/recommendation-kpis)",
            "status": "TODO",
            "actual_display": "0",
            "target_display": "3"
          },
          {
            "id": "convocatorias_y_estado_electoral",
            "label": "Convocatorias y estado electoral",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          }
        ]
      },
      {
        "id": "tech_phase_5",
        "phase": 5,
        "title": "Fase 5: Cobertura multinivel",
        "points_eng": 21,
        "points_eng_raw": "21+",
        "progress": {
          "done": 4,
          "partial": 0,
          "todo": 6,
          "untracked": 0,
          "tracked_total": 10,
          "overall_total": 10,
          "tracked_percent": 40,
          "overall_percent": 40
        },
        "checks": [
          {
            "kind": "tracker",
            "id": "normativa_autonomica_piloto_3_ccaa",
            "label": "Normativa auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "contratacion_autonomica_piloto_3_ccaa",
            "label": "Contrataci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "subvenciones_autonomicas_piloto_3_ccaa",
            "label": "Subvenciones auton\u00f3micas (piloto 3 CCAA)",
            "status": "DONE",
            "actual_display": "DONE",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "presupuesto_ejecucion_autonomica_piloto_3_ccaa",
            "label": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "ue_legislacion_y_documentos",
            "label": "UE: legislacion y documentos",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "ue_votaciones_roll_call",
            "label": "UE: votaciones (roll-call)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "ue_contratacion_publica",
            "label": "UE: contratacion publica",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "tracker",
            "id": "ue_lobbying_influencia",
            "label": "UE: lobbying/influencia",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "kind": "metric",
            "id": "autonomico_sources_ok",
            "label": "Fuentes autonomicas en estado ok",
            "status": "DONE",
            "metric": "autonomico_sources_ok",
            "actual": 17,
            "target": 1,
            "format": "int",
            "actual_display": "17",
            "target_display": "1"
          },
          {
            "kind": "metric",
            "id": "europeo_sources_ok",
            "label": "Fuentes europeas en estado ok",
            "status": "DONE",
            "metric": "europeo_sources_ok",
            "actual": 1,
            "target": 1,
            "format": "int",
            "actual_display": "1",
            "target_display": "1"
          }
        ],
        "next": [
          {
            "id": "normativa_autonomica_piloto_3_ccaa",
            "label": "Normativa auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "id": "presupuesto_ejecucion_autonomica_piloto_3_ccaa",
            "label": "Presupuesto + ejecuci\u00f3n auton\u00f3mica (piloto 3 CCAA)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "id": "ue_contratacion_publica",
            "label": "UE: contratacion publica",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "id": "ue_legislacion_y_documentos",
            "label": "UE: legislacion y documentos",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "id": "ue_lobbying_influencia",
            "label": "UE: lobbying/influencia",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          },
          {
            "id": "ue_votaciones_roll_call",
            "label": "UE: votaciones (roll-call)",
            "status": "TODO",
            "actual_display": "TODO",
            "target_display": "DONE"
          }
        ]
      }
    ],
    "program_kpis": [
      {
        "id": "tracking_sources_ok_pct",
        "label": "Fuentes objetivo en estado ok",
        "status": "DONE",
        "metric": "desired_sources_ok_pct",
        "actual": 0.8666666666666667,
        "target": 0.8,
        "format": "pct",
        "actual_display": "87%",
        "target_display": "80%"
      },
      {
        "id": "events_with_initiative_link_pct",
        "label": "Eventos con iniciativa enlazada",
        "status": "DONE",
        "metric": "events_with_initiative_link_pct",
        "actual": 1.0,
        "target": 0.95,
        "format": "pct",
        "actual_display": "100%",
        "target_display": "95%"
      },
      {
        "id": "member_votes_with_person_id_pct",
        "label": "Votos nominales con person_id",
        "status": "DONE",
        "metric": "member_votes_with_person_id_pct",
        "actual": 0.980442765003908,
        "target": 0.9,
        "format": "pct",
        "actual_display": "98%",
        "target_display": "90%"
      },
      {
        "id": "latest_events_with_topic_evidence_pct",
        "label": "Eventos latest con topic_evidence",
        "status": "DONE",
        "metric": "latest_events_with_topic_evidence_pct",
        "actual": 0.7518413597733711,
        "target": 0.5,
        "format": "pct",
        "actual_display": "75%",
        "target_display": "50%"
      },
      {
        "id": "topic_positions_with_evidence_pct",
        "label": "Posiciones con evidencia suficiente",
        "status": "DONE",
        "metric": "topic_positions_with_evidence_pct",
        "actual": 1.0,
        "target": 0.9,
        "format": "pct",
        "actual_display": "100%",
        "target_display": "90%"
      },
      {
        "id": "ingestion_runs_ok_pct",
        "label": "Runs ETL en estado ok",
        "status": "PARTIAL",
        "metric": "ingestion_runs_ok_pct",
        "actual": 0.6645161290322581,
        "target": 0.8,
        "format": "pct",
        "actual_display": "66%",
        "target_display": "80%"
      },
      {
        "id": "retry_rate",
        "label": "Costo de reintentos ETL",
        "status": "TODO",
        "metric": "retry_rate",
        "actual": 0.33548387096774196,
        "target": 0.2,
        "format": "pct",
        "actual_display": "34%",
        "target_display": "20%"
      },
      {
        "id": "avg_run_seconds",
        "label": "Duraci\u00f3n media por run ETL",
        "status": "DONE",
        "metric": "avg_run_seconds",
        "actual": 153.21705086385688,
        "target": null,
        "format": "seconds",
        "actual_display": "153.2s",
        "target_display": "\u2014"
      }
    ],
    "summary": {
      "done": 29,
      "partial": 0,
      "todo": 9,
      "untracked": 8,
      "tracked_total": 38,
      "overall_total": 46,
      "tracked_percent": 76,
      "overall_percent": 63
    },
    "notes": [
      "Los checks de fase combinan tracker operativo y KPIs cuantificables.",
      "Cuando no existe medicion directa, el estado se marca como UNTRACKED."
    ]
  },
  "actions": [
    {
      "kind": "ingest_error",
      "priority": "P0",
      "scope": "",
      "title": "Ingesta en error: aemet_opendata_series",
      "details": "Error: aemet_blocker=contract; error_type=RuntimeError; detail=JSON invalido para AEMET (Expecting value: line 1 column 1 (char 0); payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)",
      "source_ids": [
        "aemet_opendata_series"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "ingest_error",
      "priority": "P0",
      "scope": "",
      "title": "Ingesta en error: parlamento_galicia_deputados",
      "details": "Error: HTTP Error 403: Forbidden",
      "source_ids": [
        "parlamento_galicia_deputados"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_galicia_deputados --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "ingest_error",
      "priority": "P0",
      "scope": "",
      "title": "Ingesta en error: parlamento_navarra_parlamentarios_forales",
      "details": "Error: HTTP Error 403: Forbidden",
      "source_ids": [
        "parlamento_navarra_parlamentarios_forales"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_navarra_parlamentarios_forales --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: AEAT/TGSS/DGT/CCAA/ayuntamientos (sedes electr\u00f3nicas y procedimientos)",
      "details": "Falta cat\u00e1logo de obligaciones digitales por perfil ciudadano/pyme (`plazo`, `canal`, `sanci\u00f3n/recargo`) y medici\u00f3n de fricci\u00f3n por complejidad y tasa de error",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: BOCM (Madrid) + DOGC (Catalunya) + BOJA (Andaluc\u00eda)",
      "details": "Falta conector y modelo can\u00f3nico de normas auton\u00f3micas (con efectos) con trazabilidad y dedupe por versi\u00f3n",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: BOE (peajes/cargos/PVPC/TUR) + CNMC + MITECO",
      "details": "Falta descomponer factura en componentes normativos y atribuir variaciones de coste por norma/fecha/territorio, separando energ\u00eda de mercado vs parte regulada",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "europeo",
      "title": "TODO: BOE + EUR-Lex + MAPA/MITECO + OPA (ASAJA/COAG/UPA)",
      "details": "Falta modelo reproducible para ranking `top_regulaciones_mas_gravosas` por agricultura/ganaderia (coste de cumplimiento, sanciones, horas administrativas, alcance territorial, litigios) con metodolog\u00eda y pesos expl\u00edcitos",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: Banco de Espa\u00f1a (reclamaciones/memorias) + BOE cr\u00e9dito inmobiliario/servicios de pago",
      "details": "Falta mapa normativo + dataset de costes/reclamaciones por entidad y tipolog\u00eda de cobro para detectar fricci\u00f3n masiva y accountability regulatoria",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: CCAA + ayuntamientos (escuelas infantiles, comedor, actividades) + convocatorias de becas",
      "details": "Falta comparador territorial de precios p\u00fablicos y elegibilidad de ayudas (`umbrales`, `baremos`, `plazos`) con impacto neto por hogar",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: CCAA + entes locales + operadores p\u00fablicos/mixtos + BOE/boletines auton\u00f3micos",
      "details": "Falta mapa regulatorio y comparador de factura de agua por municipio (`cuota fija`, `bloques`, `canon`, `depuraci\u00f3n`) con trazabilidad de cambios normativos y \u00f3rgano decisor",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: CNMC + Consumo + CCAA (OMIC/Juntas Arbitrales) + operadores",
      "details": "Falta modelo unificado de reclamaciones/sanciones por cl\u00e1usula/pr\u00e1ctica para identificar qu\u00e9 marcos generan m\u00e1s conflicto ciudadano recurrente",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: DGSFP + BOE (responsabilidad civil obligatoria y normativa de mediaci\u00f3n/contrato) + supervisores",
      "details": "Falta mapa de obligaciones m\u00ednimas y costes recurrentes asociados por perfil de hogar, con trazabilidad normativa y v\u00edas de reclamaci\u00f3n",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "europeo",
      "title": "TODO: EU Transparency Register",
      "details": "Falta ingesta y modelo de entidades; linking cuando existan meetings/agendas publicas",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "europeo",
      "title": "TODO: EUR-Lex / Cellar (SPARQL/REST)",
      "details": "Falta conector UE legal; linking a expedientes y textos vigentes",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: Junta Electoral Central",
      "details": "Falta scraper y normalizacion",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "",
      "title": "TODO: Ley 12/2023 + normativa auton\u00f3mica de zonas tensionadas + fiscalidad asociada",
      "details": "Falta evaluaci\u00f3n trazable de impacto en oferta nueva (visados/inicios/terminadas por tipolog\u00eda y provincia) y cadena de decisi\u00f3n por norma/fragmento",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: Ley de presupuestos + acuerdos de gobierno CCAA + nombramientos + expedientes de gasto",
      "details": "Falta cadena reproducible `presupuesto -> centro gestor -> cargo designado -> expediente -> pago -> resultado asistencial` para atribuir qui\u00e9n propuso, aprob\u00f3, ejecut\u00f3 y fiscaliz\u00f3",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: Ley/BOE + SNS/CCAA (cartera y aportaci\u00f3n farmac\u00e9utica) + ministerio/servicios de salud",
      "details": "Falta vincular reglas de aportaci\u00f3n y financiaci\u00f3n a coste de bolsillo por perfil (renta, cronicidad, pensionista) y a variaciones territoriales",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: MITMA/Ministerio Transportes + CCAA + ayuntamientos/consorcios + operadores",
      "details": "Falta modelo reproducible por ciudad/\u00e1rea para medir impacto de reglas tarifarias/bonificaciones en coste mensual real por perfil de usuario",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: Ministerio/CCAA (listas de espera, plantilla, AP/hospitalaria) + presupuestos",
      "details": "Falta unir decisiones de gasto con outcomes (`espera`, `cobertura de plantilla`, `actividad`) para separar mala gesti\u00f3n de shocks de demanda",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: PLACSP + portales auton\u00f3micos + OCEX/Tribunal de Cuentas",
      "details": "Falta pipeline para detectar expedientes sanitarios con modificados, pr\u00f3rrogas, revisiones de precio y retrasos, con trazabilidad `organo -> mesa -> adjudicatario -> ejecuci\u00f3n`",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "europeo",
      "title": "TODO: Parlamento Europeo: votes XML/PDF + Open Data Portal",
      "details": "Falta ingesta de votos + mapeo a MEPs; KPI: % con actor resuelto",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: Portales presupuestarios auton\u00f3micos / IGAE cuando aplique",
      "details": "Falta conector y crosswalk de clasificaciones; preferir ejecuci\u00f3n cuando exista",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: Presupuestos y liquidaciones CCAA + Ministerio de Sanidad + IGAE",
      "details": "Falta modelo comparable por CCAA y programa para medir sustituci\u00f3n de gasto asistencial de plantilla por cap\u00edtulos de capital/externos, con series temporales y notas metodol\u00f3gicas",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "",
      "title": "TODO: SIEX/CUE + PAC + nitratos/suelos + planes hidrol\u00f3gicos + LESPRE lobo + medicamentos veterinarios",
      "details": "Falta publicar fichas comparables por norma (qu\u00e9 exige, a qui\u00e9n afecta, qu\u00e9 sanciona, qu\u00e9 alivios posteriores hubo, qui\u00e9n decidi\u00f3 cada cambio) con drill-down a evidencia primaria",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "nacional",
      "title": "TODO: Septuag\u00e9sima tercera pasada `status=403` con `packet5` + ejecuci\u00f3n serial por URL (`timeout 120`)",
      "details": "Estado base post AI-OPS-498: `missing_doc_links_actionable=2994`, `status404=563`, `status500=1337`, `status403=1078`, `status200=16`, `zero_doc_initiatives=890`. Palanca siguiente: repetir lane `status=403` con el mismo perfil nano-packet y ejecuci\u00f3n `serial_per_url_recovery` para sostener conversi\u00f3n incremental sin cuelgues. DoD: `retry_output_json_size_bytes > 0` y `candidate_urls > 0`; adem\u00e1s `downloaded_doc_links +1` o `missing_doc_links_actionable -1`. Siguiente comando: repetir la receta de `AI-OPS-498` (export `limit 60` + `packet5` + replay por URL + backfill limitado de excerpts/extractions).",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "",
      "title": "TODO: Suelo/urbanismo + evaluaci\u00f3n ambiental + CTE + reservas VPO + informes sectoriales",
      "details": "Falta publicar ranking `top_normas_cuello_botella_vivienda` con metodolog\u00eda expl\u00edcita (plazo, coste, litigiosidad, incertidumbre) y drill-down a art\u00edculos concretos",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "europeo",
      "title": "TODO: TED API (notices)",
      "details": "Falta ingesta; KPI: cobertura y trazabilidad por notice",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "municipal",
      "title": "TODO: TRLRHL + ordenanzas fiscales municipales + catastros/ayuntamientos",
      "details": "Falta comparador reproducible por municipio y perfil de hogar con trazabilidad `ordenanza -> pleno/alcald\u00eda -> liquidaci\u00f3n`",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P0",
      "scope": "autonomico",
      "title": "TODO: TRLSRU + leyes urban\u00edsticas CCAA + ordenanzas municipales + Ley 21/2013",
      "details": "Falta mapa reproducible de plazos y bloqueos por fase (`planeamiento -> urbanizaci\u00f3n -> licencia -> obra`) con evidencia normativa y administrativa por territorio",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "outcomes",
      "title": "PARTIAL: AEMET OpenData",
      "details": "Done now: NO. Blocker: `aemet_opendata_series` en `strict-network` sigue bloqueado por contrato (`aemet_blocker=contract`, JSON invalido con payload vac\u00edo `payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, `run_id=263`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `AEMET_API_KEY=<token> python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --url https://opendata.aemet.es/opendata/api/observacion/convencional/todas --snapshot-date 2026-02-17 --strict-network --timeout 30`.",
      "source_ids": [
        "aemet_opendata_series"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: AIR/Memoria normativa + evaluaciones ex post + \u00f3rganos consultivos + datos de outcomes",
      "details": "Done now: PARTIAL. Slice AI-OPS-119 abre pipeline reproducible de proporcionalidad (`liberty_proportionality_methodologies/liberty_proportionality_reviews`) con semilla versionada `liberty_proportionality_seed_v1.json`, validaci\u00f3n/import idempotente y gate ejecutable (`just parl-check-liberty-proportionality-gate`). Resultado actual: `reviews_total=8`, `target_fragments_coverage_pct=1.0`, `objective_defined_pct=1.0`, `indicator_defined_pct=0.75`, `alternatives_considered_pct=0.5`, `gate.passed=true` y `reviews_below_threshold_total=2` para priorizaci\u00f3n de revisi\u00f3n. Evidencia: `docs/etl/sprints/AI-OPS-119/reports/liberty-proportionality-direct-accountability-lane.md`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_import_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/liberty_proportionality_status_20260223T182117Z.json`, `docs/etl/sprints/AI-OPS-119/evidence/just_parl_liberty_restrictions_pipeline_20260223T182117Z.txt`. Falta sustituir semilla por ingesta continua AIR/ex-post y a\u00f1adir evidencia de eficacia observada fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-proportionality-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: BOCG + Diario de Sesiones (v\u00eda links en iniciativas Congreso/Senado)",
      "details": "Done now: PARTIAL. AI-OPS-380 consolid\u00f3 avance global fuera de `linked_to_votes` con dos pasadas `status=403` (`downloaded_doc_links +5`, `missing_doc_links_actionable -5`), AI-OPS-381/382 cerraron iteraciones sin delta neta, AI-OPS-383/384 drenaron/cerraron `unknown` (`downloaded_doc_links +114`, `missing_doc_links_actionable -114`, `unknown_status_urls 114->0`), AI-OPS-385/386 cerraron lanes globales `status=403/500` como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-387 convirti\u00f3 `status=404` (`+42/-42`), AI-OPS-389 reactiv\u00f3 conversi\u00f3n por cohortes WAF (`+25/-25`), AI-OPS-390 cerr\u00f3 `status=500 + zero-doc` sin candidates, AI-OPS-391/392/393 mantuvieron conversi\u00f3n iterativa en lane `status=500` general (`+38/-38`, `+31/-31`, `+16/-16`), AI-OPS-394 confirm\u00f3 no-conversi\u00f3n en lane `status=404` general, AI-OPS-395/396 cerraron lanes `status=403/404 + zero-doc` sin delta, AI-OPS-397 convirti\u00f3 `status=429 + zero-doc` (`+12/-12`), AI-OPS-398 dren\u00f3 la lane `status=429` general (`+60/-60`), AI-OPS-399 dren\u00f3 la lane `status=599` general (`+8/-8`), AI-OPS-400 ejecut\u00f3 lane `status=500` timeboxed sin delta neta (`rc=124`, `packet20`), AI-OPS-401 cerr\u00f3 `status=403` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-402 cerr\u00f3 `status=500` timeboxed como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-403 cerr\u00f3 `status=404` timeboxed como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-404 cerr\u00f3 `status=403` multi-URL como `NO_DELTA_WITH_EVIDENCE`, AI-OPS-405 cerr\u00f3 `status=500` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda), AI-OPS-406 cerr\u00f3 `status=404` multi-URL como `NO_DELTA_WITH_EVIDENCE` (`rc=124`, salida retry vac\u00eda) y AI-OPS-407 cerr\u00f3 micro-packet `status=403` sin delta neta de cobertura (`rc=0`, `candidate_urls=10`, `fetched_ok=0`) con reclasificaci\u00f3n interna `status403->status404` (`-10/+10`). Estado actual (`etl/data/staging/politicos-es.db`, `2026-03-02`): `total_doc_links=9553`, `downloaded_doc_links=5946`, `missing_doc_links=3607`, `missing_doc_links_actionable=3416`, `doc_links_missing_fetch_status=0`, cobertura linkeada a voto `751/751` (`100%`). Congreso se mantiene cerrado (`812/812`) y el residual global sigue concentrado en Senado no linkeado (`3607/8741` faltantes; `downloaded_doc_links_pct=62.24%`, buckets accionables dominantes `status403=1475`, `status500=1345`, `status404=596`, `status200=0`, `status429=0`, `status599=0`, `unknown=0`). Evidencia: `docs/etl/sprints/AI-OPS-407/reports/senado-status403-general-micro-packet10-timebox-20260302.md`, `docs/etl/sprints/AI-OPS-407/evidence/senado_status403_general_conversion_delta_ai_ops_407_20260302T015128Z.json`, `docs/etl/sprints/AI-OPS-407/evidence/quality_initiatives_after_pass1_20260302T015128Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-status 500 --max-urls-per-initiative 3 --limit 120 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv && sed -n \"1,11p\" docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet_<TS>.csv > docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv && timeout 180 python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --include-unlinked --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status500_general_actionable_multiurl_packet10_effective_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404,429,500 --archive-timeout 3 --retry-http-statuses 500 --refetch-existing --timeout 8 --snapshot-date 2026-03-02`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: BOE (texto consolidado + versiones)",
      "details": "Done now: PARTIAL. Slice AI-OPS-115 cre\u00f3 la base reproducible `legal_norms` + `legal_norm_fragments` (`8` normas, `8` fragmentos). Slice AI-OPS-155 a\u00f1ade lineage normativo por versi\u00f3n/fecha con `legal_norm_lineage_edges` (`lineage_hints_total=8`, `lineage_edges_total=8`, `norms_with_lineage=8/8`, `lineage_primary_evidence_coverage_pct=1.0`), incluyendo alta autom\u00e1tica de `4` normas relacionadas referenciadas (`legal_norms_total=12`) en DB real (`status=ok`, `fk_violations_total=0`). Evidencia: `docs/etl/sprints/AI-OPS-155/reports/sanction-norms-lineage-seed-lane.md`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_import_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sanction_norms_seed_status_20260224T000517Z.json`, `docs/etl/sprints/AI-OPS-155/evidence/sqlite_fk_check_20260224T000533Z.json`. Falta backfill BOE continuo a cobertura completa por `articulo/disposicion/anexo` y lineage hist\u00f3rico multi-versi\u00f3n (sin dependencia de semilla cerrada). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-24 just parl-sanction-norms-seed-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: BOE + CCAA + ordenanzas + resoluciones administrativas/judiciales p\u00fablicas",
      "details": "Done now: PARTIAL. Slice AI-OPS-118 a\u00f1ade taxonom\u00eda reproducible `liberty_right_categories` (`6` derechos) y mapa operativo `restriction_map_by_right`; Slice AI-OPS-130 cierra el gap de categor\u00edas vac\u00edas y deja cobertura `6/6` (`right_categories_with_data_total=6`, `right_categories_with_data_pct=1.0`) con guardrail expl\u00edcito `rights_with_data_gate` en `report_liberty_restrictions_status.py` (`LIBERTY_RESTRICTIONS_RIGHTS_WITH_DATA_MIN`, default `1.0`). Evidencia: `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_fail_rc_20260223T202028Z.txt`. Falta extender alcance territorial (Estado+CCAA+municipal) y densidad de evidencia primaria multi-fuente. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-restrictions-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: BOE + boletines auton\u00f3micos + BOP/ordenanzas + reglamentos sectoriales",
      "details": "Done now: PARTIAL. Slice AI-OPS-118 habilita censo base versionable para restricciones sobre el cat\u00e1logo legal ya cargado (`legal_norms/legal_norm_fragments`) y lo enlaza con `liberty_restriction_assessments` (`norms_with_irlc_total=8`, `fragments_with_irlc_total=8`). Evidencia: `docs/etl/sprints/AI-OPS-118/evidence/liberty_restrictions_status_20260223T181035Z.json`, `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`. Falta cobertura integral Estado+CCAA+municipal y rutina de refresh por bolet\u00edn/versiones. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: BOE + normativa CCAA + ordenanzas municipales + jurisprudencia relevante",
      "details": "Done now: PARTIAL. Slice AI-OPS-118 publica metodolog\u00eda IRLC auditable (`irlc_v1`) con pesos expl\u00edcitos (`reach/intensity/due_process_risk/reversibility_risk/discretionality/compliance_cost`) y scoring reproducible por `fragment_id` en `liberty_restriction_assessments`; Slice AI-OPS-130 ampl\u00eda la semilla a `11` assessments manteniendo `8` fragmentos base, con gate de cobertura por derecho integrado en `focus_gate`. Evidencia: `docs/etl/sprints/AI-OPS-118/reports/liberty-restrictions-foundation-lane.md`, `docs/etl/sprints/AI-OPS-130/reports/liberty-right-map-coverage-gate.md`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_import_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/liberty_restrictions_status_20260223T202028Z.json`, `docs/etl/sprints/AI-OPS-130/evidence/just_parl_check_liberty_focus_gate_20260223T202028Z.txt`. Falta ampliar cobertura fuera del seed sancionador (CCAA/municipal/jurisprudencia) y pasar de semilla a ingesta continua. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "municipal",
      "title": "PARTIAL: BOP/portales municipales (movilidad, ORA/ZBE, civismo, residuos, ruido)",
      "details": "Done now: PARTIAL. Slice AI-OPS-117 a\u00f1ade tablas `sanction_municipal_ordinances` + `sanction_municipal_ordinance_fragments` y carga piloto reproducible con `20` ordenanzas (`normalized=3`, `identified=17`) y `3` fragmentos normalizados (`mapped_fragment_total=2`). Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sqlite_fk_check_20260223T180041Z.txt`. Falta completar normalizaci\u00f3n `20/20` a unidad sancionable (`articulo/conducta/rango/organo/recurso`) y elevar mappings municipales a cobertura operativa. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: CCAA/ayuntamientos + organismos sancionadores + recursos estimados/desestimados",
      "details": "Done now: PARTIAL. Slice AI-OPS-120 abre lane reproducible de variaci\u00f3n territorial con `liberty_enforcement_methodologies/liberty_enforcement_observations` y reporte operativo `report_liberty_enforcement_variation_status.py` (m\u00e9tricas por `fragment_id`: `sanction_rate_per_1000`, `annulment_rate`, `resolution_delay_p90_days`). Resultado actual: `observations_total=16`, `fragments_with_multi_territory_total=8/8`, `high_variation_fragments_total=3`, `target_fragment_coverage_pct=1.0`, `gate.passed=true`. Evidencia: `docs/etl/sprints/AI-OPS-120/reports/liberty-territorial-variation-indirect-accountability-lane.md`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_import_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/liberty_enforcement_status_20260223T183508Z.json`, `docs/etl/sprints/AI-OPS-120/evidence/just_parl_liberty_restrictions_pipeline_20260223T183508Z.txt`. Falta sustituir piloto semilla por ingesta territorial continua y ampliar cobertura fuera de territorios de arranque. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-enforcement-variation-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: Censo normativo + metadatos de publicaci\u00f3n + control de versiones",
      "details": "Done now: PARTIAL. Slice AI-OPS-118 public\u00f3 KPIs base y Slice AI-OPS-123 activ\u00f3 heartbeat append-only + ventana strict; Slice AI-OPS-131 a\u00f1adi\u00f3 `rights_with_data`; Slice AI-OPS-132 a\u00f1adi\u00f3 representatividad fuente/scope; Slice AI-OPS-133 a\u00f1adi\u00f3 doble cobertura (`IRLC + accountability`) por fuente/scope; Slice AI-OPS-134 a\u00f1adi\u00f3 quality-gate de evidencia primaria en accountability (`source_url + evidence_date + evidence_quote`) en status/heartbeat/window. Slice AI-OPS-135 cierra el hueco operativo del seed sancionador: `sanction_norms_seed_v1` exige y carga evidencia primaria por `responsibility_hint` (`source_url`, `evidence_date`, `evidence_quote`) en `legal_fragment_responsibilities`, se endurece el contrato default del foco (`LIBERTY_RESTRICTIONS_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT=1.0`, `LIBERTY_RESTRICTIONS_MIN_ACCOUNTABILITY_PRIMARY_EVIDENCE_EDGES=1`) y se extiende la observabilidad de estado sancionador con cobertura de evidencia primaria (`responsibility_primary_evidence_coverage_pct`). Corrida AI-OPS-135 (`20260223T210908Z`): `sanction_norms_seed_status` `ok` con `responsibilities_with_primary_evidence_total=15/15` y `responsibility_primary_evidence_coverage_pct=1.0`; `liberty_restrictions_status` `ok` con `accountability_edges_with_primary_evidence_total=15/15`, `accountability_edges_with_primary_evidence_pct=1.0`, `focus_gate.passed=true`; ventana strict pass `ok`; fail-path de foco con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded` y `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-135/reports/liberty-accountability-primary-evidence-seed-hardening.md`, `docs/etl/sprints/AI-OPS-135/evidence/sanction_norms_seed_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_focus_gate_accountability_primary_evidence_fail_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_check_liberty_focus_gate_accountability_primary_evidence_fail_rc_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/liberty_restrictions_status_heartbeat_window_20260223T210908Z.json`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_sanction_norms_seed_20260223T210908Z.txt`, `docs/etl/sprints/AI-OPS-135/evidence/just_parl_test_liberty_restrictions_20260223T210908Z.txt`. Falta cobertura real fuera de seed inicial (State+CCAA+municipal) y sustituci\u00f3n progresiva de hints por evidencia primaria multi-fuente fuera del seed. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-liberty-restrictions-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Congreso/Senado (iniciativas+enmiendas+votos) + BOE (firma/promulgacion)",
      "details": "Done now: PARTIAL. Cadena base por fragmento activada (`15` responsabilidades/`8` fragmentos), migraci\u00f3n documental `seed->non-seed` cerrada (`queue_rows_total=0`) y evidencia multipista operativa (`boe_publicacion`, `senado_diario`, `congreso_vote`, `senado_vote`, `other`). AI-OPS-167 cerr\u00f3 ejecuci\u00f3n al `100%` (`responsibilities_with_execution_evidence_total=15/15`). AI-OPS-168/169/170 elevaron cobertura parlamentaria-voto hasta `13/15`; AI-OPS-171 a\u00f1adi\u00f3 fallback conservador de t\u00edtulo LISOS (`title_rule:lisos_orden_social`) en `scripts/backfill_sanction_norms_parliamentary_evidence.py` y cerr\u00f3 cobertura parlamentaria a `15/15`, manteniendo voto en `13/15` (`responsibility_parliamentary_coverage_pct=1.0`, `responsibility_parliamentary_vote_coverage_pct=0.866667`, `responsibility_evidence_items_total=99`) con `execution=15/15`, `queue_rows_total=0` y `fk_violations_total=0`. Evidencia: `docs/etl/sprints/AI-OPS-170/reports/sanction-norms-vote-lineage-mixed-bridge-closure.md`, `docs/etl/sprints/AI-OPS-171/reports/sanction-norms-parliamentary-title-rule-closure.md`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_vote_evidence_backfill_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/sanction_norms_seed_status_20260224T094041Z.json`, `docs/etl/sprints/AI-OPS-171/evidence/responsibility_parliamentary_vote_gap_20260224T094041Z.csv`, `docs/etl/sprints/AI-OPS-171/evidence/sqlite_fk_check_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_sanction_norms_seed_20260224T094041Z.txt`, `docs/etl/sprints/AI-OPS-171/evidence/just_parl_test_liberty_restrictions_20260224T094041Z.txt`. Gap residual: voto en `2` responsabilidades (`BOE-A-2000-15060`: `approve/enforce`, con `has_parliamentary_any=1` y `has_vote=0`). Falta adem\u00e1s escalar se\u00f1ales procedimentales desde piloto semilla a datos revisores oficiales (TEAR/TEAC/contencioso/defensores). Siguiente comando: `DB_PATH=<db> SANCTION_NORMS_VOTE_EVIDENCE_ROLES=approve,propose,enforce,delegate just parl-backfill-sanction-norms-vote-evidence && DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Congreso/Senado (votos y firmas) + BOE (promulgaci\u00f3n) + resoluciones/actos de enforcement",
      "details": "Done now: PARTIAL. Slice AI-OPS-119 activa cadena directa auditable por `fragment_id` mediante `report_liberty_direct_accountability_scores.py` (roles directos `propose/approve/enforce`) sobre responsabilidades legales cargadas. Slice AI-OPS-136 endurece ese contrato con quality-gate de evidencia primaria directa: m\u00e9tricas `direct_edges_with_primary_evidence_total/direct_edges_with_primary_evidence_pct` y gate `direct_primary_evidence_gate` (umbrales configurables en `justfile`: `LIBERTY_DIRECT_ACCOUNTABILITY_PRIMARY_EVIDENCE_MIN_PCT`, `LIBERTY_DIRECT_ACCOUNTABILITY_MIN_PRIMARY_EVIDENCE_EDGES`). Corrida AI-OPS-136 (`20260223T211623Z`): `fragments_with_direct_chain_total=8/8`, `direct_edges_total=19`, `direct_edges_with_primary_evidence_total=19`, `direct_edges_with_primary_evidence_pct=1.0`, `gate.passed=true`; fail-path con umbral imposible (`min_pct=1.1`, `min_edges=20`) devuelve `status=degraded`, `direct_primary_evidence_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-136/reports/liberty-direct-accountability-primary-evidence-gate.md`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_scores_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/liberty_direct_accountability_gate_primary_evidence_fail_20260223T211623Z.json`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_check_liberty_direct_accountability_gate_primary_evidence_fail_rc_20260223T211623Z.txt`, `docs/etl/sprints/AI-OPS-136/evidence/just_parl_test_liberty_restrictions_20260223T211623Z.txt`. Falta enlazar actos directos de voto/firma/resoluci\u00f3n con evidencia primaria multi-fuente fechada y validaci\u00f3n temporal de cargo por persona. Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-report-liberty-direct-accountability-scores`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "municipal",
      "title": "PARTIAL: DGT + AEAT + TGSS/ITSS + Interior + ayuntamientos",
      "details": "Done now: PARTIAL. Slice AI-OPS-116 crea cat\u00e1logo transversal en `sanction_infraction_types` (`10` tipolog\u00edas) y mapeo inicial en `sanction_infraction_type_mappings` (`10` mappings, cobertura a `fragment_id=8/10`, incluyendo lanes municipales `source_only` en espera de ordenanzas normalizadas). Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta completar mappings municipales a `norma_fragmento_id` y a\u00f1adir m\u00e9tricas de volumen por tipolog\u00eda. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "municipal",
      "title": "PARTIAL: DGT + ayuntamientos (movilidad/ORA/ZBE) + AEAT + TGSS + Interior (LO 4/2015)",
      "details": "Done now: PARTIAL. Slice AI-OPS-117 publica ranking reproducible `top_normas_sancion_ciudadana` desde `sanction_volume_observations` con metodolog\u00eda expl\u00edcita (`expediente_count` + `importe_total_eur`, proxy `incidence_per_1000_observed_cases`) y `status=ok` en reporte operativo. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_import_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta pasar de datos piloto a series reales por territorio y completar incidencia por `1.000 habitantes` (denominador poblacional). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-volume-pilot-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "municipal",
      "title": "PARTIAL: DGT anuarios + AEAT memorias sancionadoras + TGSS/ITSS + Interior (LO 4/2015) + ayuntamientos open data",
      "details": "Done now: PARTIAL. Slice AI-OPS-116 publica cat\u00e1logo operativo de fuentes en `sanction_volume_sources` (5 lanes: DGT/AEAT/TGSS-ITSS/Interior/municipal piloto), junto con contrato com\u00fan de m\u00e9tricas y tablas destino (`sanction_volume_observations`) para ingestas comparables. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta cargar observaciones reales por organismo/periodo (`expediente_count`, `importe_total`, `importe_medio`, `recurso_estado`). Siguiente comando: `DB_PATH=<db> SNAPSHOT_DATE=2026-02-23 just parl-sanction-data-catalog-pipeline`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "outcomes",
      "title": "PARTIAL: ESIOS/REE API (token)",
      "details": "Done now: PARTIAL. AI-OPS-296 cierra el gap de conector con `ree_esios_indicators` (config/registry + parser de payload REE `included[].attributes.values` + soporte de contenedor serializado `records` + rechazo de snapshots legacy `metric,value` + fallback sample reproducible) y lo integra en `backfill-indicators`/mapeo tracker. Corrida reproducible en DB principal desde muestra (`--from-file`) deja `status=ok`, `records_loaded=2`, `source_records_total=2`; el probe `--strict-network` al endpoint oficial sigue bloqueado de forma reproducible con `HTTP 500`, body HTML y cabecera `x-cdn: Imperva`, por lo que no aplica `DONE` en red real. Evidencia: `docs/etl/sprints/AI-OPS-296/reports/ree-esios-indicators-connector-partial-closure-20260228.md`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_ingest_status_latest.json`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_curl_headers_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/e2e_tracker_status_main_db_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_main_db_ingestion_runs_latest.txt`. Siguiente comando: `ESIOS_API_TOKEN=<token> python3 scripts/ingestar_politicos_es.py ingest --db <db> --source ree_esios_indicators --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids ree_esios_indicators`.",
      "source_ids": [
        "ree_esios_indicators"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source ree_esios_indicators --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Enriquecimiento de candidatos de replay (Wayback/Memento seeds) para URLs sin historial",
      "details": "AI-OPS-351 no reabre capacidad en `status=404` (`fresh_rows_total=0`) y mantiene estable el bloque residual de `no snapshot candidates` en consolidado hist\u00f3rico. Cola residual consolidada reciente (evidencia acumulada `AI-OPS-*`): `archive_no_snapshot_failures_total=441`, `unique_urls_total=316`; la lane sigue `PARTIAL` y requiere seed/captura alterna para URLs sin historial p\u00fablico. Evidencia: `docs/etl/sprints/AI-OPS-351/evidence/senado_status404_recent-window_packet_summary_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/evidence/senado_archive_gap_urls_20260301T074257Z.json`, `docs/etl/sprints/AI-OPS-351/exports/senado_archive_gap_urls_20260301T074257Z.csv`, `docs/etl/sprints/AI-OPS-340/reports/senado-status404-archive-family-probes-and-gap-export-20260301.md`. Siguiente comando: `python3 scripts/report_senado_cookie_lever_status.py --cookie-file <fresh_cookie_file> --strict --out docs/etl/sprints/<SPRINT>/evidence/senado_cookie_lever_status_<TS>.json && python3 scripts/export_senado_manual_capture_pending_targets.py --validity-json docs/etl/sprints/<SPRINT>/evidence/senado_manual_capture_validity_<TS>.json --out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_<TS>.csv --commands-out docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh && bash docs/etl/sprints/<SPRINT>/exports/senado_manual_capture_pending_targets_commands_<TS>.sh`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "territorial",
      "title": "PARTIAL: Nombramientos y estructura org\u00e1nica + reglamentos de delegaci\u00f3n + disciplina de grupo/partido + \u00f3rganos consultivos",
      "details": "Done now: PARTIAL. Slice AI-OPS-120 activa modelo causal de segundo orden con `liberty_indirect_methodologies/liberty_indirect_responsibility_edges` (roles `delegate/appoint/instruct/design`) y filtros expl\u00edcitos de atribuci\u00f3n (`attributable_confidence_min`, `attributable_max_causal_distance`) en `report_liberty_indirect_accountability_status.py`. Slice AI-OPS-137 endurece este lane con contrato expl\u00edcito persona/cargo + ventana temporal: `liberty_indirect_responsibility_edges` incorpora `actor_person_name`, `actor_role_title`, `appointment_start_date`, `appointment_end_date`; `validate_liberty_indirect_accountability_seed.py` exige coherencia de ventana (`appointment_end_date>=appointment_start_date`) y consistencia temporal con `evidence_date`; y `report_liberty_indirect_accountability_status.py` a\u00f1ade m\u00e9tricas `attributable_edges_with_actor_person_total`, `attributable_edges_with_valid_person_window_total`, `attributable_edges_with_valid_person_window_pct` y gate `indirect_person_window_gate` (umbrales configurables en `justfile`: `LIBERTY_INDIRECT_PERSON_WINDOW_MIN`, `LIBERTY_INDIRECT_MIN_PERSON_WINDOW_EDGES`). Corrida AI-OPS-137 (`20260223T212645Z`): `edges_total=12`, `attributable_edges_total=9`, `fragments_with_attributable_edges_total=7/8`, `attributable_edges_with_actor_person_total=9`, `attributable_edges_with_valid_person_window_total=9`, `attributable_edges_with_valid_person_window_pct=1.0`, `gate.passed=true`; fail-path contractual (`person_window_min=1.1`, `min_edges=20`) devuelve `status=degraded`, `indirect_person_window_gate=false`, `exit=2`. Evidencia: `docs/etl/sprints/AI-OPS-137/reports/liberty-indirect-accountability-person-window-gate.md`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_import_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_status_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_indirect_gate_person_window_fail_rc_20260223T212645Z.txt`, `docs/etl/sprints/AI-OPS-137/evidence/liberty_restrictions_snapshot_20260223_ai_ops_137_20260223T212645Z.json`, `docs/etl/sprints/AI-OPS-137/evidence/just_parl_test_liberty_restrictions_20260223T212645Z.txt`. Falta sustituir seed por cobertura multi-fuente real (nombramientos/resoluciones oficiales) y resolver identidad persona/cargo fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-report-liberty-indirect-accountability-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Norma habilitante + organismo instructor/resolutor + recaudaci\u00f3n + recursos",
      "details": "Done now: PARTIAL. Slice AI-OPS-115 abre trazabilidad `norma -> fragmento -> responsabilidad`; AI-OPS-156 a\u00f1ade evidencia multipista; AI-OPS-158/159/160/161 cierran cobertura documental y migraci\u00f3n `seed -> non-seed` (`seed=0`, `non-seed=15`, cola vac\u00eda). Slice AI-OPS-162 incorpora primera se\u00f1al parlamentaria reproducible (`senado_diario=2`) ligada a normas sancionadoras (`BOE-A-2003-23186`, `BOE-A-2015-3442`) con status lane `ok` y nuevos KPIs de cobertura parlamentaria (`responsibility_evidence_items_parliamentary_total=2`, `responsibility_parliamentary_coverage_pct=0.133333`). Evidencia: `docs/etl/sprints/AI-OPS-161/reports/sanction-norms-seed-source-record-upgrade-apply.md`, `docs/etl/sprints/AI-OPS-162/reports/sanction-norms-parliamentary-evidence-backfill.md`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_parliamentary_evidence_backfill_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_status_20260224T010415Z.json`, `docs/etl/sprints/AI-OPS-162/evidence/sanction_norms_seed_source_record_upgrade_queue_20260224T010415Z.json`. Falta integrar niveles `acto sancionador -> cobro -> recurso/resultado` por expediente y elevar cobertura parlamentaria por rol/acto (votos + enmiendas + ejecuci\u00f3n). Siguiente comando: `DB_PATH=<db> just parl-report-sanction-norms-seed-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "autonomico",
      "title": "PARTIAL: Parlamento de Galicia: deputados (fichas HTML)",
      "details": "Done now: NO. Blocker: `parlamento_galicia_deputados` en `strict-network` sigue bloqueado con HTTP 403 (`run_id=265`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_galicia_deputados --snapshot-date 2026-02-17 --strict-network --timeout 30`.",
      "source_ids": [
        "parlamento_galicia_deputados"
      ],
      "commands": [
        "python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_galicia_deputados --strict-network",
        "python3 scripts/e2e_tracker_status.py --db etl/data/staging/politicos-es.db --tracker docs/etl/e2e-scrape-load-tracker.md"
      ]
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: RDL 6/2015 (Tr\u00e1fico) + RD 320/1994 + LGT 58/2003 + RD 2063/2004 + LGSS/LISOS + LO 4/2015 + ordenanzas municipales",
      "details": "Done now: PARTIAL. Slice AI-OPS-115 publica cat\u00e1logo operativo en `sanction_norm_catalog` + `sanction_norm_fragment_links` con `8` marcos iniciales (BOE IDs semilla), `organismo_competente`, hip\u00f3tesis de incidencia y `evidence_required_json`; import reproducible y validado con tests. Evidencia: `docs/etl/sprints/AI-OPS-115/reports/sanction-norms-seed-lane.md`, `docs/etl/sprints/AI-OPS-115/evidence/sanction_norms_seed_import_20260223T173448Z.json`, `docs/etl/sprints/AI-OPS-115/evidence/just_parl_test_sanction_norms_seed_20260223T173633Z.txt`. Falta ampliar cobertura (ordenanzas municipales y fragmentaci\u00f3n completa por norma/territorio). Siguiente comando: `DB_PATH=<db> just parl-import-sanction-norms-seed`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Retry acotado + lever de cookie fresca + fallback alternativo",
      "details": "Gap actualizado: la lane queda operativamente cerrada en t\u00e9rminos de conversi\u00f3n de packet (`AI-OPS-355`: `candidate_urls=24`, `fetched_ok=24`, `runtime=6.64s`, `failures=0`) y habilita los avances posteriores en `403` y `status=0` hasta AI-OPS-360. El residual global persiste fuera de `404`, pero el riesgo de throughput/runtime de esta lane queda resuelto. Evidencia: `docs/etl/sprints/AI-OPS-355/reports/senado-manual-cookie-packet25-runtime-and-delta-20260301.md`, `docs/etl/sprints/AI-OPS-355/evidence/senado_status404_manual_cookie_archive_retry_packet25_20260301T084757Z.json`, `docs/etl/sprints/AI-OPS-357/evidence/senado_status403_packet50_conversion_delta_ai_ops_357_20260301T085854Z.json`, `docs/etl/sprints/AI-OPS-360/evidence/senado_status0_packet50_refetch_third_pass_delta_ai_ops_360_20260301T091018Z.json`. Siguiente comando: `python3 scripts/export_missing_initiative_doc_urls.py --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --only-actionable-missing --only-linked-to-votes --only-status 403 --limit 50 --format csv --out docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv && python3 scripts/ingestar_parlamentario_es.py backfill-initiative-documents --db etl/data/staging/politicos-es.db --initiative-source-ids senado_iniciativas --skip-link-backfill --doc-urls-file docs/etl/sprints/<SPRINT>/exports/senado_status403_linked_packet50_<TS>.csv --archive-fallback --archive-fallback-http-statuses 403,404 --retry-forbidden --refetch-existing --cookie-file <fresh_cookie_file> --limit-initiatives 50 --max-docs-per-initiative 1 --timeout 12`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "nacional",
      "title": "PARTIAL: Sesi\u00f3n renovada + cookie file sanitizado y versionado",
      "details": "Gap actualizado (AI-OPS-235 + AI-OPS-236 + AI-OPS-299 + AI-OPS-300 + AI-OPS-301 + AI-OPS-302 + AI-OPS-303 + AI-OPS-304): la lane ya cubre (a) cola reproducible de captura (`scripts/export_senado_manual_capture_targets.py`), (b) gate de progreso (`scripts/report_senado_manual_capture_target_progress.py`), (c) runner condicional de retry (`scripts/run_senado_manual_capture_retry_cycle.py`), (d) paquetizaci\u00f3n operativa de pendientes (`scripts/export_senado_manual_capture_pending_targets.py`) y (e) ciclo unificado de iteraci\u00f3n con delta (`scripts/run_senado_manual_capture_iteration_cycle.py`). AI-OPS-304 a\u00f1ade una palanca controlable de scraping (`manual_capture_playwright --headless`) sobre los 2 targets `unmatched`, cerrando el hueco estructural de cobertura: `matched_targets_total 6->8`, `unmatched_targets_total 2->0`, `coverage_pct 0.75->1.0`, `capture_files_total 2->4` (baseline AI-OPS-301 -> AI-OPS-304). Estado actual en DB principal (`2026-02-28`): `usable_targets_total=0`; cola pendiente sigue en `pending_targets_total=8`, ahora `pending_unmatched_total=0` y `pending_access_denied_total=8`; check estricto de iteraci\u00f3n `rc=4`. El bloqueo externo persiste: sin captura usable no procede retry de descarga. Evidencia: `docs/etl/sprints/AI-OPS-304/reports/senado-manual-capture-headless-probe-coverage-lane-20260228.md`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_target_progress_delta_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_headless_probe_summary_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/senado_manual_capture_iteration_cycle_latest.json`, `docs/etl/sprints/AI-OPS-304/evidence/just_parl_check_senado_manual_capture_iteration_cycle_rc_latest.txt`, `docs/etl/sprints/AI-OPS-304/evidence/tracker_status_latest.log`. Siguiente comando: `bash docs/etl/sprints/AI-OPS-304/exports/senado_manual_capture_pending_targets_commands_latest.sh && just parl-run-senado-manual-capture-iteration-cycle && just parl-check-senado-manual-capture-iteration-cycle`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "territorial",
      "title": "PARTIAL: Tablas de responsabilidades + nombramientos + trazas de expediente/recurso",
      "details": "Done now: PARTIAL. Slice AI-OPS-119 publica score auditable institucional `responsibility_score` (normalizado 0-100) con pesos por rol. Slice AI-OPS-138 abre scoring personal reproducible con `scripts/report_liberty_personal_accountability_scores.py`, combinando edges directos con `person_id` y cadena indirecta atribuible con contexto persona/cargo+ventana temporal (`actor_person_name`, `actor_role_title`, `appointment_start_date/end_date`) y fuerza probatoria expl\u00edcita (`edge_confidence * primary_evidence_factor`). Slice AI-OPS-139 endurece el contrato para eliminar sesgo por visualizaci\u00f3n (`top_n` no altera `persons_scored_total`). Slice AI-OPS-140 a\u00f1ade observabilidad/gate de resoluci\u00f3n de identidad indirecta (`indirect_identity_resolution_pct`, `indirect_identity_resolution_gate`) con muestra de no resueltos (`indirect_identity_unresolved_sample`). Slice AI-OPS-141 convierte ese backlog en cola operativa reproducible (`report_liberty_person_identity_resolution_queue.py`). Slice AI-OPS-142 cierra el loop con aplicaci\u00f3n reproducible de alias en DB (`person_name_aliases`) v\u00eda seed validado/importado. Slice AI-OPS-143 a\u00f1ade contrato expl\u00edcito de procedencia (`source_kind`, `evidence_date`, `evidence_quote`) y separa alias `manual_seed` vs `official_*` en scoring/queue. Slice AI-OPS-144 a\u00f1ade backlog accionable de migraci\u00f3n `manual -> official` (manual-upgrade queue + CSV), gate de `manual_alias_share` en la cola, y guardrail de no-downgrade de procedencia en import. Slice AI-OPS-145 endurece el guardrail para impedir retarget manual sobre alias ya `official_*` (`aliases_retarget_downgrade_prevented`) y alinea scoring personal con la cola a\u00f1adiendo m\u00e9tricas/gate de `manual_alias_share`. Slice AI-OPS-146 a\u00f1ade gate expl\u00edcito de evidencia oficial para alias `official_*` en scoring/queue (`official_alias_rows_with_evidence_total`, `official_alias_rows_missing_evidence_total`, `official_alias_evidence_coverage_pct`, `official_alias_evidence_gate`) con umbrales dedicados en `justfile`. Slice AI-OPS-147 a\u00f1ade gate expl\u00edcito de cuota oficial (`official_alias_share_pct`, `official_alias_share_gate`) para hacer exigible la migraci\u00f3n `manual_seed -> official_*` en ambas lanes. Slice AI-OPS-148 a\u00f1ade trazabilidad de `official_*` a `source_records` (`source_record_pk`) en schema/import y gate expl\u00edcito en scoring/queue (`official_alias_source_record_coverage_pct`, `official_alias_source_record_gate`). Slice AI-OPS-149 operacionaliza la remediaci\u00f3n de gaps `official_*` con colas accionables dedicadas (`official_alias_evidence_upgrade_queue_rows`, `official_alias_source_record_upgrade_queue_rows`) y checks de visibilidad de backlog (`official_alias_evidence_backlog_visible`, `official_alias_source_record_backlog_visible`) exportables a CSV desde `justfile`. Slice AI-OPS-150 cierra el loop review/apply con `scripts/export_liberty_person_identity_official_upgrade_review_queue.py` y `scripts/apply_liberty_person_identity_official_upgrade_reviews.py` (CSV de decisiones reproducible + guardrail anti-downgrade). Slice AI-OPS-151 endurece el apply con autoresoluci\u00f3n de `source_record_pk` v\u00eda lookup en `source_records` usando `--db`, m\u00e9tricas expl\u00edcitas de resoluci\u00f3n (`source_record_pk_auto_resolved`, `source_record_pk_auto_resolve_missed`) y wiring en `justfile`. Corrida AI-OPS-149 (`20260223T231638Z`): pass observabilidad (`official_alias_rows_total=0`, colas `0/0`) y fail-path contractual (`official_alias_rows_total=1`, `official_alias_rows_missing_evidence_total=1`, `official_alias_rows_missing_source_record_total=1`) con colas `1/1`, checks de visibilidad `true` y `exit=2`; suites en verde (`Ran 8`, `Ran 89`). Corrida AI-OPS-150 (`20260223T232635Z`): loop review/apply operativo con `rows_total=9`, `approved_rows=1`, `updated_rows=1`, reducci\u00f3n de cola manual `9 -> 8`, `official_alias_rows_total=1`, `official_alias_rows_missing_source_record_total=1`; suites en verde (`Ran 3`, `Ran 92`). Corrida AI-OPS-151 (`20260223T232954Z`): dry-run contractual de autoresoluci\u00f3n con lookup real (`source_record_lookup.rows_total=173070`, `source_record_pk_auto_resolved=1`, `validation.valid=true`); suites en verde (`Ran 4`, `Ran 93`). Evidencia: `docs/etl/sprints/AI-OPS-138/reports/liberty-personal-accountability-scoring-lane.md`, `docs/etl/sprints/AI-OPS-139/reports/liberty-personal-accountability-topn-contract.md`, `docs/etl/sprints/AI-OPS-140/reports/liberty-personal-identity-resolution-gate.md`, `docs/etl/sprints/AI-OPS-141/reports/liberty-person-identity-resolution-queue-lane.md`, `docs/etl/sprints/AI-OPS-142/reports/liberty-person-identity-apply-lane.md`, `docs/etl/sprints/AI-OPS-143/reports/liberty-person-identity-provenance-gate.md`, `docs/etl/sprints/AI-OPS-144/reports/liberty-person-identity-manual-upgrade-backlog-gate.md`, `docs/etl/sprints/AI-OPS-145/reports/liberty-person-identity-source-guard-personal-gate.md`, `docs/etl/sprints/AI-OPS-146/reports/liberty-person-identity-official-evidence-gate.md`, `docs/etl/sprints/AI-OPS-147/reports/liberty-person-identity-official-alias-share-gate.md`, `docs/etl/sprints/AI-OPS-148/reports/liberty-person-identity-official-source-record-gate.md`, `docs/etl/sprints/AI-OPS-149/reports/liberty-person-identity-official-gap-actionable-queues.md`, `docs/etl/sprints/AI-OPS-150/reports/liberty-person-identity-official-upgrade-review-apply-loop.md`, `docs/etl/sprints/AI-OPS-151/reports/liberty-person-identity-source-record-autoresolve.md`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_official_gap_queue_contract_summary_20260223T231638Z.json`, `docs/etl/sprints/AI-OPS-149/evidence/liberty_person_identity_resolution_queue_official_gap_fail_rc_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/unittest_liberty_person_identity_resolution_queue_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/evidence/just_parl_test_liberty_restrictions_20260223T231638Z.txt`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_evidence_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-149/exports/liberty_person_identity_official_alias_source_record_upgrade_queue_20260223T231638Z.csv`, `docs/etl/sprints/AI-OPS-150/evidence/liberty_person_identity_official_upgrade_review_apply_contract_summary_20260223T232635Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_apply_autoresolve_20260223T232954Z.json`, `docs/etl/sprints/AI-OPS-151/evidence/liberty_person_identity_official_upgrade_source_record_autoresolve_contract_summary_20260223T232954Z.json`. Falta reemplazar progresivamente alias `manual_seed` por alias `official_*` (nombramientos/resoluciones/expedientes) y ampliar cobertura fuera del piloto. Siguiente comando: `DB_PATH=<db> just parl-export-liberty-person-identity-official-upgrade-review-queue && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_OFFICIAL_UPGRADE_REVIEWS_IN=<review_csv> LIBERTY_PERSON_IDENTITY_SEED_REVIEW_OUT=<seed_out_json> just parl-apply-liberty-person-identity-official-upgrade-reviews && DB_PATH=<db> LIBERTY_PERSONAL_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSONAL_INDIRECT_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSONAL_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSONAL_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-personal-accountability-gate && DB_PATH=<db> LIBERTY_PERSON_IDENTITY_MANUAL_ALIAS_SHARE_MAX=<target> LIBERTY_PERSON_IDENTITY_NON_MANUAL_ALIAS_RESOLUTION_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SHARE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_ALIAS_ROWS_FOR_OFFICIAL_SHARE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_EVIDENCE_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_EVIDENCE_GATE=<target> LIBERTY_PERSON_IDENTITY_OFFICIAL_ALIAS_SOURCE_RECORD_MIN_PCT=<target> LIBERTY_PERSON_IDENTITY_MIN_OFFICIAL_ALIAS_ROWS_FOR_SOURCE_RECORD_GATE=<target> just parl-check-liberty-person-identity-resolution-gate`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "municipal",
      "title": "PARTIAL: Tr\u00e1fico/movilidad + tributario/SS + seguridad ciudadana + ordenanzas c\u00edvicas/residuos",
      "details": "Done now: PARTIAL. Slice AI-OPS-117 publica `norm_dossiers` (`5` fichas) con `conducta` (tipolog\u00edas), `volumen`, `importe`, `base legal` (`norma -> fragmentos`) y lanes de evidencia (`source_lanes`/enlaces municipales) en `report_sanction_volume_pilot_status.py`. Evidencia: `docs/etl/sprints/AI-OPS-117/reports/sanction-volume-pilot-lane.md`, `docs/etl/sprints/AI-OPS-117/evidence/sanction_volume_pilot_status_20260223T180041Z.json`, `docs/etl/sprints/AI-OPS-117/evidence/just_parl_sanction_citizen_pilot_pipeline_20260223T180041Z.txt`. Falta enriquecer perfil afectado y sustituir valores piloto por observaciones oficiales recurrentes por fuente/periodo. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-volume-pilot-status`.",
      "source_ids": [],
      "commands": []
    },
    {
      "kind": "tracker_item",
      "priority": "P1",
      "scope": "",
      "title": "PARTIAL: \u00d3rganos revisores (TEAR/TEAC, contencioso, defensores) + datos de estimaci\u00f3n/anulaci\u00f3n",
      "details": "Done now: PARTIAL. Slice AI-OPS-116 publica contrato KPI de justicia procedimental en `sanction_procedural_kpi_definitions` (`3` KPIs: recurso estimado, anulaci\u00f3n formal, retraso p90) y tabla operativa `sanction_procedural_metrics` para series observadas. Evidencia: `docs/etl/sprints/AI-OPS-116/reports/sanction-data-catalog-lane.md`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_import_20260223T174656Z.json`, `docs/etl/sprints/AI-OPS-116/evidence/sanction_data_catalog_status_20260223T174656Z.json`. Falta ingesta de datos revisores (TEAR/TEAC/contencioso/defensores) para poblar m\u00e9tricas y pasar de contrato a resultados. Siguiente comando: `DB_PATH=<db> just parl-report-sanction-data-catalog-status`.",
      "source_ids": [],
      "commands": []
    }
  ],
  "sources": [
    {
      "source_id": "asamblea_ceuta_diputados",
      "domain": "politicos",
      "source_name": "Asamblea de Ceuta - Miembros (Legislatura 2023/2027)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.ceuta.es/gobiernodeceuta/index.php/el-gobierno/la-asamblea",
      "institution_name": "Asamblea de Ceuta",
      "role_title": "Diputado/a",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/asamblea_ceuta_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Asamblea de Ceuta)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Ceuta: miembros (2023/2027)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 3,
      "runs_ok": 2,
      "last_status": "ok",
      "last_loaded": 25,
      "max_loaded_any": 25,
      "max_loaded_network": 25,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-14T20:08:56+00:00",
      "last_seen_at": "2026-02-14T20:09:01+00:00",
      "last_source_url": "https://www.ceuta.es/gobiernodeceuta/index.php/el-gobierno/la-asamblea",
      "last_message": "Ingesta completada: 25/25 registros validos",
      "progress": {
        "loaded": 25,
        "target": 20,
        "percent": 100
      },
      "mandates": 25,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 25,
        "counts": {
          "mandates": 25,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "asamblea_extremadura_diputados",
      "domain": "politicos",
      "source_name": "Asamblea de Extremadura - Diputadas/os (XII Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.asambleaex.es/dipslegis",
      "institution_name": "Asamblea de Extremadura",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/asamblea_extremadura_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Asamblea de Extremadura)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Extremadura (dipslegis + paginacion)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 65,
      "max_loaded_any": 65,
      "max_loaded_network": 65,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:46:30+00:00",
      "last_seen_at": "2026-02-13T07:46:32+00:00",
      "last_source_url": "https://www.asambleaex.es/dipslegis",
      "last_message": "Ingesta completada: 65/65 registros validos",
      "progress": {
        "loaded": 65,
        "target": 50,
        "percent": 100
      },
      "mandates": 65,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 65,
        "counts": {
          "mandates": 65,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "asamblea_madrid_ocupaciones",
      "domain": "politicos",
      "source_name": "Asamblea de Madrid - Ocupaciones (cargos, incluidos diputados)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://ctyp.asambleamadrid.es/static/doc/opendata/SGP_ADMIN.OPENDATA_OCUPACIONES_ASAMBLEA.csv",
      "institution_name": "Asamblea de Madrid",
      "role_title": "Cargo",
      "level": "autonomico",
      "format": "csv",
      "fallback_file": "etl/data/raw/samples/asamblea_madrid_ocupaciones_sample.csv",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Asamblea de Madrid)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Madrid OpenData Ocupaciones",
        "bloque": "Definir umbral minimo y aclarar semantica de `is_active`"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 3,
      "runs_ok": 3,
      "last_status": "ok",
      "last_loaded": 9188,
      "max_loaded_any": 9188,
      "max_loaded_network": 9188,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:46:32+00:00",
      "last_seen_at": "2026-02-13T07:46:35+00:00",
      "last_source_url": "https://ctyp.asambleamadrid.es/static/doc/opendata/SGP_ADMIN.OPENDATA_OCUPACIONES_ASAMBLEA.csv",
      "last_message": "Ingesta completada: 9188/9285 registros validos",
      "progress": {
        "loaded": 9188,
        "target": 5000,
        "percent": 100
      },
      "mandates": 9188,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 9188,
        "counts": {
          "mandates": 9188,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "asamblea_melilla_diputados",
      "domain": "politicos",
      "source_name": "Asamblea de Melilla - Miembros (Legislatura 2023/2027)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://sede.melilla.es/sta/CarpetaPublic/doEvent?APP_CODE=STA&PAGE_CODE=PTS2_MIEMBROS",
      "institution_name": "Asamblea de Melilla",
      "role_title": "Diputado/a",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/asamblea_melilla_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Asamblea de Melilla)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea de Melilla: diputados (2023/2027)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 3,
      "runs_ok": 3,
      "last_status": "ok",
      "last_loaded": 26,
      "max_loaded_any": 26,
      "max_loaded_network": 26,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T07:46:35+00:00",
      "last_seen_at": "2026-02-13T07:46:38+00:00",
      "last_source_url": "https://sede.melilla.es/sta/CarpetaPublic/doEvent?APP_CODE=STA&PAGE_CODE=PTS2_MIEMBROS",
      "last_message": "Ingesta completada: 26/26 registros validos",
      "progress": {
        "loaded": 26,
        "target": 20,
        "percent": 100
      },
      "mandates": 26,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 26,
        "counts": {
          "mandates": 26,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "asamblea_murcia_diputados",
      "domain": "politicos",
      "source_name": "Asamblea Regional de Murcia - Diputados",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.asambleamurcia.es/diputados",
      "institution_name": "Asamblea Regional de Murcia",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/asamblea_murcia_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Asamblea Murcia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Asamblea Regional de Murcia: diputados (listado + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 54,
      "max_loaded_any": 54,
      "max_loaded_network": 54,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:46:38+00:00",
      "last_seen_at": "2026-02-13T07:47:17+00:00",
      "last_source_url": "https://www.asambleamurcia.es/diputados",
      "last_message": "Ingesta completada: 54/54 registros validos",
      "progress": {
        "loaded": 54,
        "target": 35,
        "percent": 100
      },
      "mandates": 54,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 54,
        "counts": {
          "mandates": 54,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "cortes_aragon_diputados",
      "domain": "politicos",
      "source_name": "Cortes de Aragon - Diputados (XI Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.cortesaragon.es/Quienes-somos.2250.0.html?no_cache=1&tx_t3comunicacion_pi3%5Bnumleg%5D=11&tx_t3comunicacion_pi3%5Btipinf%5D=3&tx_t3comunicacion_pi3%5Buidcom%5D=-2#verContenido",
      "institution_name": "Cortes de Aragon",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/cortes_aragon_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Cortes de Aragon)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Aragon: diputados (XI)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 10,
      "runs_ok": 5,
      "last_status": "ok",
      "last_loaded": 75,
      "max_loaded_any": 75,
      "max_loaded_network": 75,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-14T20:16:25+00:00",
      "last_seen_at": "2026-02-14T20:16:35+00:00",
      "last_source_url": "https://www.cortesaragon.es/Quienes-somos.2250.0.html?no_cache=1&tx_t3comunicacion_pi3%5Bnumleg%5D=11&tx_t3comunicacion_pi3%5Btipinf%5D=3&tx_t3comunicacion_pi3%5Buidcom%5D=-2#verContenido",
      "last_message": "Ingesta completada: 75/75 registros validos",
      "progress": {
        "loaded": 75,
        "target": 50,
        "percent": 100
      },
      "mandates": 75,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 75,
        "counts": {
          "mandates": 75,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "cortes_cyl_procuradores",
      "domain": "politicos",
      "source_name": "Cortes de Castilla y Leon - Procuradores y Procuradoras (XI Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.ccyl.es/Organizacion/PlenoAlfabetico",
      "institution_name": "Cortes de Castilla y Leon",
      "role_title": "Procurador/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/cortes_cyl_procuradores_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Cortes CyL)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Castilla y Leon (PlenoAlfabetico)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 81,
      "max_loaded_any": 81,
      "max_loaded_network": 81,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:50:36+00:00",
      "last_seen_at": "2026-02-13T07:50:36+00:00",
      "last_source_url": "https://www.ccyl.es/Organizacion/PlenoAlfabetico",
      "last_message": "Ingesta completada: 81/81 registros validos",
      "progress": {
        "loaded": 81,
        "target": 70,
        "percent": 100
      },
      "mandates": 81,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 81,
        "counts": {
          "mandates": 81,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "cortes_clm_diputados",
      "domain": "politicos",
      "source_name": "Cortes de Castilla-La Mancha - Diputados (XI Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.cortesclm.es/web2/paginas/resul_diputados.php?legislatura=11",
      "institution_name": "Cortes de Castilla-La Mancha",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/cortes_clm_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Cortes CLM)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Cortes de Castilla-La Mancha (listado + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 33,
      "max_loaded_any": 33,
      "max_loaded_network": 33,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:50:17+00:00",
      "last_seen_at": "2026-02-13T07:50:36+00:00",
      "last_source_url": "https://www.cortesclm.es/web2/paginas/resul_diputados.php?legislatura=11",
      "last_message": "Ingesta completada: 33/33 registros validos",
      "progress": {
        "loaded": 33,
        "target": 25,
        "percent": 100
      },
      "mandates": 33,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 33,
        "counts": {
          "mandates": 33,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "jgpa_diputados",
      "domain": "politicos",
      "source_name": "Junta General del Principado de Asturias - Diputados y diputadas",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.jgpa.es/diputados-y-diputadas",
      "institution_name": "Junta General del Principado de Asturias",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/jgpa_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (JGPA Asturias)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Junta General del Principado de Asturias (diputados)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 45,
      "max_loaded_any": 45,
      "max_loaded_network": 45,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:55:46+00:00",
      "last_seen_at": "2026-02-13T07:55:47+00:00",
      "last_source_url": "https://www.jgpa.es/diputados-y-diputadas?p_p_id=jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=1&p_r_p_2113237475_diputadoId=0&p_r_p_2113237475_legislaturaId=0&p_r_p_2113237475_grupoParlamentarioId=0&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_redirect=%2Fdiputados-y-diputadas&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_delta=50&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_keywords=&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_advancedSearch=false&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_andOperator=true&_jgpaportlet_WAR_jgpaportlet_INSTANCE_JoGQRoxbw79k_resetCur=false&cur=1",
      "last_message": "Ingesta completada: 45/45 registros validos",
      "progress": {
        "loaded": 45,
        "target": 35,
        "percent": 100
      },
      "mandates": 45,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 45,
        "counts": {
          "mandates": 45,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "corts_valencianes_diputats",
      "domain": "politicos",
      "source_name": "Les Corts Valencianes - Diputados (fichas HTML)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.cortsvalencianes.es/es/composicion/diputados",
      "institution_name": "Les Corts Valencianes",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/corts_valencianes_diputats_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Corts Valencianes)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Corts Valencianes (listado + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 2,
      "runs_ok": 2,
      "last_status": "ok",
      "last_loaded": 99,
      "max_loaded_any": 99,
      "max_loaded_network": 99,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T12:16:24+00:00",
      "last_seen_at": "2026-02-13T12:16:40+00:00",
      "last_source_url": "https://www.cortsvalencianes.es/es/composicion/diputados",
      "last_message": "Ingesta completada: 99/99 registros validos",
      "progress": {
        "loaded": 99,
        "target": 70,
        "percent": 100
      },
      "mandates": 99,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 99,
        "counts": {
          "mandates": 99,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlament_catalunya_diputats",
      "domain": "politicos",
      "source_name": "Parlament de Catalunya - Diputats (composicio actual)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.parlament.cat/web/composicio/ple-parlament/composicio-actual/index.html",
      "institution_name": "Parlament de Catalunya",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlament_catalunya_diputats_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlament de Catalunya)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlament de Catalunya (composicio actual + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 135,
      "max_loaded_any": 135,
      "max_loaded_network": 135,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:51:52+00:00",
      "last_seen_at": "2026-02-13T07:53:29+00:00",
      "last_source_url": "https://www.parlament.cat/web/composicio/ple-parlament/composicio-actual/index.html",
      "last_message": "Ingesta completada: 135/135 registros validos",
      "progress": {
        "loaded": 135,
        "target": 100,
        "percent": 100
      },
      "mandates": 135,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 135,
        "counts": {
          "mandates": 135,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlament_balears_diputats",
      "domain": "politicos",
      "source_name": "Parlament de les Illes Balears - Diputats (webGTP)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.parlamentib.es/Representants/Diputats.aspx?criteria=0",
      "institution_name": "Parlament de les Illes Balears",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlament_balears_diputats_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlament IB)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlament de les Illes Balears: diputats (listado + fichas via webGTP)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 59,
      "max_loaded_any": 59,
      "max_loaded_network": 59,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:50:36+00:00",
      "last_seen_at": "2026-02-13T07:51:52+00:00",
      "last_source_url": "https://www.parlamentib.es/Representants/Diputats.aspx?criteria=0",
      "last_message": "Ingesta completada: 59/59 registros validos",
      "progress": {
        "loaded": 59,
        "target": 45,
        "percent": 100
      },
      "mandates": 59,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 59,
        "counts": {
          "mandates": 59,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_andalucia_diputados",
      "domain": "politicos",
      "source_name": "Parlamento de Andalucia - Diputados (fichas HTML)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.parlamentodeandalucia.es/webdinamica/portal-web-parlamento/composicionyfuncionamiento/diputadosysenadores.do",
      "institution_name": "Parlamento de Andalucia",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_andalucia_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento de Andalucia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Andalucia (listado + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 109,
      "max_loaded_any": 109,
      "max_loaded_network": 109,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:53:30+00:00",
      "last_seen_at": "2026-02-13T07:54:05+00:00",
      "last_source_url": "https://www.parlamentodeandalucia.es/webdinamica/portal-web-parlamento/composicionyfuncionamiento/diputadosysenadores.do",
      "last_message": "Ingesta completada: 109/109 registros validos",
      "progress": {
        "loaded": 109,
        "target": 90,
        "percent": 100
      },
      "mandates": 109,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 109,
        "counts": {
          "mandates": 109,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_canarias_diputados",
      "domain": "politicos",
      "source_name": "Parlamento de Canarias - Diputados (API)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://parcan.es/api/diputados/por_legislatura/11/?format=json",
      "institution_name": "Parlamento de Canarias",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_canarias_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento de Canarias)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Canarias: diputados + grupos (API oficial)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 79,
      "max_loaded_any": 79,
      "max_loaded_network": 79,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:54:05+00:00",
      "last_seen_at": "2026-02-13T07:54:05+00:00",
      "last_source_url": "https://parcan.es/api/diputados/por_legislatura/11/?format=json",
      "last_message": "Ingesta completada: 79/79 registros validos",
      "progress": {
        "loaded": 79,
        "target": 60,
        "percent": 100
      },
      "mandates": 79,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 79,
        "counts": {
          "mandates": 79,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_cantabria_diputados",
      "domain": "politicos",
      "source_name": "Parlamento de Cantabria - Diputados (XI Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://parlamento-cantabria.es/informacion-general/composicion/11l-pleno-del-parlamento-de-cantabria",
      "institution_name": "Parlamento de Cantabria",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_cantabria_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento de Cantabria)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Cantabria",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 2,
      "runs_ok": 2,
      "last_status": "ok",
      "last_loaded": 35,
      "max_loaded_any": 35,
      "max_loaded_network": 35,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:54:30+00:00",
      "last_seen_at": "2026-02-13T07:55:46+00:00",
      "last_source_url": "https://parlamento-cantabria.es/informacion-general/composicion/11l-pleno-del-parlamento-de-cantabria",
      "last_message": "Ingesta completada: 35/35 registros validos",
      "progress": {
        "loaded": 35,
        "target": 25,
        "percent": 100
      },
      "mandates": 35,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 35,
        "counts": {
          "mandates": 35,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_galicia_deputados",
      "domain": "politicos",
      "source_name": "Parlamento de Galicia - Deputados (fichas HTML)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.parlamentodegalicia.gal/Composicion/Deputados",
      "institution_name": "Parlamento de Galicia",
      "role_title": "Deputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_galicia_deputados_sample.json",
      "tracker": {
        "status": "PARTIAL",
        "tipo_dato": "Representantes y mandatos (Parlamento de Galicia)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Galicia: deputados (fichas HTML)",
        "bloque": "Done now: NO. Blocker: `parlamento_galicia_deputados` en `strict-network` sigue bloqueado con HTTP 403 (`run_id=265`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source parlamento_galicia_deputados --snapshot-date 2026-02-17 --strict-network --timeout 30`."
      },
      "sql_status": "PARTIAL",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "degraded",
      "runs_total": 13,
      "runs_ok": 5,
      "last_status": "error",
      "last_loaded": 0,
      "max_loaded_any": 75,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 5,
      "last_started_at": "2026-02-19T16:15:13+00:00",
      "last_seen_at": "2026-02-19T16:15:14+00:00",
      "last_source_url": "https://www.parlamentodegalicia.gal/Composicion/Deputados",
      "last_message": "Error: HTTP Error 403: Forbidden",
      "progress": {
        "loaded": 0,
        "target": 50,
        "percent": 0
      },
      "mandates": 75,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 75,
        "counts": {
          "mandates": 75,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": true,
        "blocked_note": true
      }
    },
    {
      "source_id": "parlamento_larioja_diputados",
      "domain": "politicos",
      "source_name": "Parlamento de La Rioja - Diputados (XI Legislatura)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://adminweb.parlamento-larioja.org/composicion-y-organos/diputados",
      "institution_name": "Parlamento de La Rioja",
      "role_title": "Diputado/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_larioja_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento de La Rioja)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de La Rioja: diputados (listado + fichas)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 33,
      "max_loaded_any": 33,
      "max_loaded_network": 33,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:55:47+00:00",
      "last_seen_at": "2026-02-13T07:55:48+00:00",
      "last_source_url": "https://adminweb.parlamento-larioja.org/composicion-y-organos/diputados",
      "last_message": "Ingesta completada: 33/33 registros validos",
      "progress": {
        "loaded": 33,
        "target": 25,
        "percent": 100
      },
      "mandates": 33,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 33,
        "counts": {
          "mandates": 33,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_navarra_parlamentarios_forales",
      "domain": "politicos",
      "source_name": "Parlamento de Navarra - Parlamentarios Forales (fichas HTML)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://parlamentodenavarra.es/es/composicion-organos/parlamentarios-forales",
      "institution_name": "Parlamento de Navarra",
      "role_title": "Parlamentario/a foral",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_navarra_parlamentarios_forales_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento de Navarra)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento de Navarra: parlamentarios forales (fichas HTML)",
        "bloque": "Done now: YES. Reconcilia `parlamento_navarra_parlamentarios_forales` en `from-file` con `50/50 registros validos` en `run_id=595` (snapshot `2026-02-12`, origen `etl/data/raw/manual/navarra_persona_profiles_20260212T144911Z/pages`). Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "degraded",
      "runs_total": 13,
      "runs_ok": 3,
      "last_status": "error",
      "last_loaded": 0,
      "max_loaded_any": 50,
      "max_loaded_network": 50,
      "network_fetches": 1,
      "fallback_fetches": 2,
      "last_started_at": "2026-02-19T16:15:14+00:00",
      "last_seen_at": "2026-02-19T16:15:15+00:00",
      "last_source_url": "https://parlamentodenavarra.es/es/composicion-organos/parlamentarios-forales",
      "last_message": "Error: HTTP Error 403: Forbidden",
      "progress": {
        "loaded": 0,
        "target": 30,
        "percent": 0
      },
      "mandates": 50,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 50,
        "counts": {
          "mandates": 50,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parlamento_vasco_parlamentarios",
      "domain": "politicos",
      "source_name": "Parlamento Vasco - Parlamentarios (listado ACT)",
      "scope": "autonomico",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.legebiltzarra.eus/comparla/c_comparla_alf_ACT.html",
      "institution_name": "Parlamento Vasco",
      "role_title": "Parlamentario/a autonomico",
      "level": "autonomico",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/parlamento_vasco_parlamentarios_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Parlamento Vasco)",
        "dominio": "Autonomico",
        "fuentes_objetivo": "Parlamento Vasco (listado ACT)",
        "bloque": "Hardening de parsing y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 75,
      "max_loaded_any": 75,
      "max_loaded_network": 75,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-13T07:55:48+00:00",
      "last_seen_at": "2026-02-13T07:55:48+00:00",
      "last_source_url": "https://www.legebiltzarra.eus/comparla/c_comparla_alf_ACT.html",
      "last_message": "Ingesta completada: 75/75 registros validos",
      "progress": {
        "loaded": 75,
        "target": 60,
        "percent": 100
      },
      "mandates": 75,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 75,
        "counts": {
          "mandates": 75,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "bdns_autonomico",
      "domain": "politicos",
      "source_name": "BDNS/SNPSAP - Subvenciones autonomicas (piloto 3 CCAA)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.pap.hacienda.gob.es/bdnstrans/GE/es/convocatorias",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/bdns_autonomico_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Subvenciones auton\u00f3micas (piloto 3 CCAA)",
        "dominio": "Dinero",
        "fuentes_objetivo": "BDNS/SNPSAP (filtrado por \u00f3rgano convocante/territorio)",
        "bloque": "Done now: YES. `bdns_autonomico` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/busqueda`) y red real (`run_id=257`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 8,
      "runs_ok": 4,
      "last_status": "ok",
      "last_loaded": 50,
      "max_loaded_any": 50,
      "max_loaded_network": 50,
      "network_fetches": 1,
      "fallback_fetches": 3,
      "last_started_at": "2026-02-17T11:43:24+00:00",
      "last_seen_at": "2026-02-17T11:43:34+00:00",
      "last_source_url": "https://www.pap.hacienda.gob.es/bdnstrans/api/convocatorias/busqueda",
      "last_message": "Ingesta completada: 50/50 registros validos",
      "progress": {
        "loaded": 50,
        "target": 3,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "bdns_api_subvenciones",
      "domain": "politicos",
      "source_name": "BDNS/SNPSAP - Subvenciones y ayudas Espana (API)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.pap.hacienda.gob.es/bdnstrans/GE/es/convocatorias",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/bdns_api_subvenciones_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Subvenciones y ayudas (Espana)",
        "dominio": "Dinero",
        "fuentes_objetivo": "BDNS/SNPSAP: API",
        "bloque": "Done now: YES. `bdns_api_subvenciones` recuper\u00f3 `strict-network` con endpoint JSON (`/bdnstrans/api/convocatorias/ultimas`) y red real (`run_id=256`, `run_status=ok`, `run_records_loaded=50`), por lo que se reconcilia la fila a `DONE` sin waiver. Evidencia: `docs/etl/sprints/AI-OPS-13/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-13/evidence/bdns-api-discovery.log`, `docs/etl/sprints/AI-OPS-13/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 11,
      "runs_ok": 5,
      "last_status": "ok",
      "last_loaded": 50,
      "max_loaded_any": 50,
      "max_loaded_network": 50,
      "network_fetches": 1,
      "fallback_fetches": 4,
      "last_started_at": "2026-02-17T11:43:15+00:00",
      "last_seen_at": "2026-02-17T11:43:24+00:00",
      "last_source_url": "https://www.pap.hacienda.gob.es/bdnstrans/api/convocatorias/ultimas",
      "last_message": "Ingesta completada: 50/50 registros validos",
      "progress": {
        "loaded": 50,
        "target": 10,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "placsp_contratacion",
      "domain": "politicos",
      "source_name": "Contratacion publica (canonico policy_events)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://contrataciondelestado.es/",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/placsp_sindicacion_sample.xml",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "TODO",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "not_run",
      "runs_total": 0,
      "runs_ok": 0,
      "last_status": "",
      "last_loaded": 0,
      "max_loaded_any": 0,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 0,
      "last_started_at": "",
      "last_seen_at": "",
      "last_source_url": "",
      "last_message": "",
      "progress": {
        "loaded": 0,
        "target": 0,
        "percent": null
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": false,
        "blocked_note": false
      }
    },
    {
      "source_id": "placsp_autonomico",
      "domain": "politicos",
      "source_name": "PLACSP - Contratacion auton\u00f3mica (piloto 3 CCAA)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/placsp_autonomico_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Contratacion detalle y documentacion de licitaciones (PLACSP)",
        "dominio": "Dinero",
        "fuentes_objetivo": "PLACSP: `url_detalle` desde `placsp_sindicacion`/`placsp_autonomico`",
        "bloque": "Done now: YES. Paso 1 sigue estable sin nuevos faltantes (`backfill-placsp-contract-details` `source_records_seen=0`). Paso 2 y 2.5 completados: `backfill-money-contract-records` (`1985` contratos mapeados/actualizados) y `backfill-policy-events-money` (`1985` `policy_events` upserted en `placsp_contratacion`, todos con `source_record_pk`; totals `policy_events_by_source['placsp_contratacion']=1985`). Cierres SQL reproducibles: `placsp_contract_detail_records` `992`+`993`, `placsp_contract_detail_documents` `8144`+`8144`, `money_contract_records` `992`+`993`, `policy_events` `placsp_contratacion=1985`; evidencia en `docs/etl/sprints/AI-OPS-152/evidence/placsp_linkage_checks.log` y `docs/etl/sprints/AI-OPS-152/evidence/tracker_status_after_placsp_money_policy_events.log`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 9,
      "runs_ok": 6,
      "last_status": "ok",
      "last_loaded": 106,
      "max_loaded_any": 106,
      "max_loaded_network": 106,
      "network_fetches": 2,
      "fallback_fetches": 4,
      "last_started_at": "2026-02-17T11:13:41+00:00",
      "last_seen_at": "2026-02-17T11:13:55+00:00",
      "last_source_url": "https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom",
      "last_message": "Ingesta completada: 106/106 registros validos",
      "progress": {
        "loaded": 106,
        "target": 3,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "placsp_sindicacion",
      "domain": "politicos",
      "source_name": "PLACSP - Contratacion publica Espana (ATOM/CODICE)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/placsp_sindicacion_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Contratacion detalle y documentacion de licitaciones (PLACSP)",
        "dominio": "Dinero",
        "fuentes_objetivo": "PLACSP: `url_detalle` desde `placsp_sindicacion`/`placsp_autonomico`",
        "bloque": "Done now: YES. Paso 1 sigue estable sin nuevos faltantes (`backfill-placsp-contract-details` `source_records_seen=0`). Paso 2 y 2.5 completados: `backfill-money-contract-records` (`1985` contratos mapeados/actualizados) y `backfill-policy-events-money` (`1985` `policy_events` upserted en `placsp_contratacion`, todos con `source_record_pk`; totals `policy_events_by_source['placsp_contratacion']=1985`). Cierres SQL reproducibles: `placsp_contract_detail_records` `992`+`993`, `placsp_contract_detail_documents` `8144`+`8144`, `money_contract_records` `992`+`993`, `policy_events` `placsp_contratacion=1985`; evidencia en `docs/etl/sprints/AI-OPS-152/evidence/placsp_linkage_checks.log` y `docs/etl/sprints/AI-OPS-152/evidence/tracker_status_after_placsp_money_policy_events.log`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 13,
      "runs_ok": 9,
      "last_status": "ok",
      "last_loaded": 106,
      "max_loaded_any": 106,
      "max_loaded_network": 106,
      "network_fetches": 3,
      "fallback_fetches": 6,
      "last_started_at": "2026-02-17T11:13:55+00:00",
      "last_seen_at": "2026-02-17T11:14:08+00:00",
      "last_source_url": "https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom",
      "last_message": "Ingesta completada: 106/106 registros validos",
      "progress": {
        "loaded": 106,
        "target": 10,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "bdns_subvenciones",
      "domain": "politicos",
      "source_name": "Subvenciones publicas (canonico policy_events)",
      "scope": "dinero",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.pap.hacienda.gob.es/bdnstrans/GE/es/convocatorias",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/bdns_api_subvenciones_sample.json",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "TODO",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "not_run",
      "runs_total": 0,
      "runs_ok": 0,
      "last_status": "",
      "last_loaded": 0,
      "max_loaded_any": 0,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 0,
      "last_started_at": "",
      "last_seen_at": "",
      "last_source_url": "",
      "last_message": "",
      "progress": {
        "loaded": 0,
        "target": 0,
        "percent": null
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": false,
        "blocked_note": false
      }
    },
    {
      "source_id": "moncloa_referencias",
      "domain": "politicos",
      "source_name": "La Moncloa - Referencias del Consejo de Ministros",
      "scope": "ejecutivo",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.lamoncloa.gob.es/consejodeministros/referencias/paginas/index.aspx",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "html",
      "fallback_file": "etl/data/raw/samples/moncloa_referencias_sample.html",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Accion ejecutiva (Consejo de Ministros)",
        "dominio": "Ejecutivo",
        "fuentes_objetivo": "La Moncloa: referencias + RSS",
        "bloque": "Done now: YES. Ingesta Moncloa y mapping a `policy_events` reproducibles (`moncloa_referencias=20`, `moncloa_rss_referencias=8`, total `28`) y reconciliadas con SQL `DONE` sin waiver activa para Moncloa. Evidencia: `docs/etl/sprints/AI-OPS-07/reports/dual-entry-apply-recompute.md`, `docs/etl/sprints/AI-OPS-07/reports/boe-policy-events-mapping.md` y `docs/etl/sprints/AI-OPS-07/evidence/post_apply_waiveraware_checker_final.log`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 10,
      "runs_ok": 8,
      "last_status": "ok",
      "last_loaded": 2,
      "max_loaded_any": 20,
      "max_loaded_network": 2,
      "network_fetches": 2,
      "fallback_fetches": 6,
      "last_started_at": "2026-02-16T17:53:54+00:00",
      "last_seen_at": "2026-02-16T17:54:45+00:00",
      "last_source_url": "https://www.lamoncloa.gob.es/consejodeministros/referencias/paginas/index.aspx",
      "last_message": "Ingesta completada: 2/2 registros validos (network-error-fallback: URLError: <urlopen error [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1010)>)",
      "progress": {
        "loaded": 2,
        "target": 2,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "moncloa_rss_referencias",
      "domain": "politicos",
      "source_name": "La Moncloa - RSS Referencias/Resumenes del Consejo de Ministros",
      "scope": "ejecutivo",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.lamoncloa.gob.es/Paginas/rss.aspx?tipo=16",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/moncloa_rss_referencias_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Accion ejecutiva (Consejo de Ministros)",
        "dominio": "Ejecutivo",
        "fuentes_objetivo": "La Moncloa: referencias + RSS",
        "bloque": "Done now: YES. Ingesta Moncloa y mapping a `policy_events` reproducibles (`moncloa_referencias=20`, `moncloa_rss_referencias=8`, total `28`) y reconciliadas con SQL `DONE` sin waiver activa para Moncloa. Evidencia: `docs/etl/sprints/AI-OPS-07/reports/dual-entry-apply-recompute.md`, `docs/etl/sprints/AI-OPS-07/reports/boe-policy-events-mapping.md` y `docs/etl/sprints/AI-OPS-07/evidence/post_apply_waiveraware_checker_final.log`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 12,
      "runs_ok": 9,
      "last_status": "ok",
      "last_loaded": 4,
      "max_loaded_any": 8,
      "max_loaded_network": 8,
      "network_fetches": 2,
      "fallback_fetches": 7,
      "last_started_at": "2026-02-16T17:55:04+00:00",
      "last_seen_at": "2026-02-16T17:56:33+00:00",
      "last_source_url": "https://www.lamoncloa.gob.es/Paginas/rss.aspx?tipo=16",
      "last_message": "Ingesta completada: 4/4 registros validos (network-error-fallback: RuntimeError: No se pudo extraer ningun item RSS de Moncloa)",
      "progress": {
        "loaded": 4,
        "target": 2,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "infoelectoral_descargas",
      "domain": "infoelectoral",
      "source_name": "Infoelectoral - Area de descargas (convocatorias + archivos)",
      "scope": "electoral",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://infoelectoral.interior.gob.es/min/convocatorias/tipos/",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/infoelectoral_descargas_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Procesos electorales y resultados",
        "dominio": "Electoral",
        "fuentes_objetivo": "Infoelectoral descargas/procesos",
        "bloque": "Hardening de parsing de campos opcionales en procesos/resultados"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 3,
      "runs_ok": 3,
      "last_status": "ok",
      "last_loaded": 263,
      "max_loaded_any": 263,
      "max_loaded_network": 263,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T12:15:57+00:00",
      "last_seen_at": "2026-02-13T12:16:11+00:00",
      "last_source_url": "https://infoelectoral.interior.gob.es/min/convocatorias/tipos/",
      "last_message": "Ingesta completada: 263/263 (network-with-partial-errors (archivos[6:198305]: RuntimeError: Respuesta inesperada (HTML recibido)))",
      "progress": {
        "loaded": 263,
        "target": 3,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "infoelectoral_convocatoria_tipos",
        "primary_rows": 6,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 6,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "infoelectoral_procesos",
      "domain": "infoelectoral",
      "source_name": "Infoelectoral - Procesos electorales celebrados (datos/resultados)",
      "scope": "electoral",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://infoelectoral.interior.gob.es/min/procesos/",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/infoelectoral_procesos_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Procesos electorales y resultados",
        "dominio": "Electoral",
        "fuentes_objetivo": "Infoelectoral descargas/procesos",
        "bloque": "Hardening de parsing de campos opcionales en procesos/resultados"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 6,
      "runs_ok": 5,
      "last_status": "ok",
      "last_loaded": 257,
      "max_loaded_any": 257,
      "max_loaded_network": 257,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-14T20:11:55+00:00",
      "last_seen_at": "2026-02-14T20:12:15+00:00",
      "last_source_url": "https://infoelectoral.interior.gob.es/min/procesos/",
      "last_message": "Ingesta completada: 257/257 (network-with-partial-errors (default_url_404: https://infoelectoral.interior.gob.es/min/procesos/; archivos[6:198305]: RuntimeError: Respuesta inesperada (HTML recibido); proceso_id tipo:6|conv:198305: sin resultados directos))",
      "progress": {
        "loaded": 257,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "infoelectoral_procesos",
        "primary_rows": 71,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 71
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "europarl_meps",
      "domain": "politicos",
      "source_name": "Parlamento Europeo - MEPs",
      "scope": "europeo",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.europarl.europa.eu/meps/es/full-list/xml",
      "institution_name": "Parlamento Europeo",
      "role_title": "Eurodiputado/a",
      "level": "europeo",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/europarl_meps_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Europarl)",
        "dominio": "Europeo",
        "fuentes_objetivo": "Europarl MEP XML",
        "bloque": "Mejorar completitud de fechas/metadatos"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 4,
      "runs_ok": 4,
      "last_status": "ok",
      "last_loaded": 60,
      "max_loaded_any": 60,
      "max_loaded_network": 60,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-12T06:23:17+00:00",
      "last_seen_at": "2026-02-12T06:23:17+00:00",
      "last_source_url": "https://www.europarl.europa.eu/meps/es/full-list/xml",
      "last_message": "Ingesta completada: 60/60 registros validos",
      "progress": {
        "loaded": 60,
        "target": 40,
        "percent": 100
      },
      "mandates": 62,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 62,
        "counts": {
          "mandates": 62,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "boe_api_legal",
      "domain": "politicos",
      "source_name": "BOE API - Marco legal (RSS diario)",
      "scope": "legal",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.boe.es/rss/boe.php",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/boe_api_legal_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Marco legal electoral",
        "dominio": "Legal",
        "fuentes_objetivo": "BOE API",
        "bloque": "Done now: YES. Ingesta BOE (`boe_api_legal`) y mapping a `policy_events` est\u00e1n reproducibles (`records_loaded=298`, `policy_events_boe=298`) y reconciliados con SQL `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-08/reports/waiver-burndown-apply-recompute.md`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-ingest-replay.log`, `docs/etl/sprints/AI-OPS-08/evidence/waiver-burndown-apply-recompute-boe-policy-events-backfill.log` y `docs/etl/sprints/AI-OPS-08/reports/boe-tracker-mapping-hardening.md`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 4,
      "runs_ok": 4,
      "last_status": "ok",
      "last_loaded": 298,
      "max_loaded_any": 298,
      "max_loaded_network": 298,
      "network_fetches": 2,
      "fallback_fetches": 2,
      "last_started_at": "2026-02-16T21:14:54+00:00",
      "last_seen_at": "2026-02-16T21:15:08+00:00",
      "last_source_url": "https://www.boe.es/rss/boe.php",
      "last_message": "Ingesta completada: 298/298 registros validos",
      "progress": {
        "loaded": 298,
        "target": 5,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "municipal_concejales",
      "domain": "politicos",
      "source_name": "Ambito municipal - Concejales y cargos locales",
      "scope": "municipal",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://concejales.redsara.es/consulta/getConcejalesLegislatura",
      "institution_name": "Ayuntamiento",
      "role_title": "Cargo municipal",
      "level": "municipal",
      "format": "xlsx",
      "fallback_file": "etl/data/raw/samples/municipal_concejales_sample.csv",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y cargos locales",
        "dominio": "Municipal",
        "fuentes_objetivo": "RED SARA Concejales",
        "bloque": "Definir umbral minimo y criterio de cobertura"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 2,
      "runs_ok": 2,
      "last_status": "ok",
      "last_loaded": 66895,
      "max_loaded_any": 66895,
      "max_loaded_network": 66895,
      "network_fetches": 2,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-12T06:23:17+00:00",
      "last_seen_at": "2026-02-12T06:24:27+00:00",
      "last_source_url": "https://concejales.redsara.es/consulta/getConcejalesLegislatura",
      "last_message": "Ingesta completada: 66895/66895 registros validos",
      "progress": {
        "loaded": 66895,
        "target": 50000,
        "percent": 100
      },
      "mandates": 66101,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 66101,
        "counts": {
          "mandates": 66101,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "congreso_iniciativas",
      "domain": "parlamentario",
      "source_name": "Congreso - Iniciativas (OpenData)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.congreso.es/es/opendata/iniciativas",
      "institution_name": "Congreso de los Diputados",
      "role_title": "",
      "level": "nacional",
      "format": "html",
      "fallback_file": "etl/data/raw/samples/congreso_iniciativas_sample.json",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "DONE",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 4,
      "runs_ok": 4,
      "last_status": "ok",
      "last_loaded": 491,
      "max_loaded_any": 491,
      "max_loaded_network": 491,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T08:08:09+00:00",
      "last_seen_at": "2026-02-13T08:08:10+00:00",
      "last_source_url": "https://www.congreso.es/es/opendata/iniciativas",
      "last_message": "{\"initiatives_loaded\": 491, \"note\": \"network\"}",
      "progress": {
        "loaded": 491,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "parl_initiatives",
        "primary_rows": 429,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 429,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "congreso_intervenciones",
      "domain": "parlamentario",
      "source_name": "Congreso - Intervenciones (OpenData)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.congreso.es/es/opendata/intervenciones",
      "institution_name": "Congreso de los Diputados",
      "role_title": "",
      "level": "nacional",
      "format": "html",
      "fallback_file": "etl/data/raw/samples/congreso_intervenciones_sample.json",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "DONE",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 2,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 614,
      "max_loaded_any": 614,
      "max_loaded_network": 614,
      "network_fetches": 1,
      "fallback_fetches": 0,
      "last_started_at": "2026-02-15T10:28:46+00:00",
      "last_seen_at": "2026-02-15T10:28:50+00:00",
      "last_source_url": "https://www.congreso.es/es/opendata/intervenciones",
      "last_message": "{\"evidence_inserted\": 614, \"info\": {\"evidence_type\": \"declared:intervention\", \"skipped\": {\"bad_payload\": 0, \"no_expediente\": 394, \"no_leg\": 0, \"no_orador\": 76, \"no_person_match\": 30, \"no_topic_set\": 0, \"topic_not_in_set\": 32536}, \"topic_sets_touched\": [1]}, \"note\": \"network\"}",
      "progress": {
        "loaded": 614,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "congreso_votaciones",
      "domain": "parlamentario",
      "source_name": "Congreso - Votaciones (pleno, OpenData)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.congreso.es/es/opendata/votaciones",
      "institution_name": "Congreso de los Diputados",
      "role_title": "",
      "level": "nacional",
      "format": "html",
      "fallback_file": "etl/data/raw/samples/congreso_votaciones_sample.json",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "DONE",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 20,
      "runs_ok": 12,
      "last_status": "ok",
      "last_loaded": 40,
      "max_loaded_any": 300,
      "max_loaded_network": 300,
      "network_fetches": 8,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T12:40:52+00:00",
      "last_seen_at": "2026-02-13T12:41:05+00:00",
      "last_source_url": "https://www.congreso.es/es/opendata/votaciones",
      "last_message": "{\"events_loaded\": 40, \"member_votes_loaded\": 14000, \"note\": \"network\"}",
      "progress": {
        "loaded": 40,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "parl_vote_events",
        "primary_rows": 2823,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 2823,
          "parl_initiatives": 679,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "parl_initiative_docs",
      "domain": "parlamentario",
      "source_name": "Parlamento - Documentos de iniciativas (BOCG/Diario de Sesiones)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "manifest://parl_initiative_docs",
      "institution_name": "Cortes Generales",
      "role_title": "",
      "level": "nacional",
      "format": "bin",
      "fallback_file": "",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "TODO",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "not_run",
      "runs_total": 0,
      "runs_ok": 0,
      "last_status": "",
      "last_loaded": 0,
      "max_loaded_any": 0,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 0,
      "last_started_at": "",
      "last_seen_at": "",
      "last_source_url": "",
      "last_message": "",
      "progress": {
        "loaded": 0,
        "target": 1,
        "percent": 0
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": false,
        "blocked_note": false
      }
    },
    {
      "source_id": "programas_partidos",
      "domain": "parlamentario",
      "source_name": "Programas de partidos (manifest-driven)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "manifest://programas_partidos",
      "institution_name": "Programas de partidos",
      "role_title": "",
      "level": "nacional",
      "format": "csv",
      "fallback_file": "etl/data/raw/samples/programas_partidos_sample.csv",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Refinamiento ratio dedupe en `BNG europeas 2024`",
        "dominio": "Editorial",
        "fuentes_objetivo": "`programas_partidos` (`24_bng_programa_europeas_2.pdf`)",
        "bloque": "Done now: YES. AI-OPS-270 cierra el objetivo con dedupe `near-duplicate` reproducible en `scripts/report_programas_support_unclear_unique_ratio.py` (Jaccard/containment + guard por n-grama), conservando contrato strict y fail-path exact-only. Resultado real en staging (`PROGRAMAS_UNCLEAR_RATIO_PARTIES='BNG'`, `MIN=2.0`): `BNG europeas 2024` pasa de `support_to_unclear_unique_ratio=1.428571` (`unclear_unique=7`) a `2.0` (`unclear_unique=5`, `collapsed=2`) sin degradar gates declared (`declared.gate.passed=true`, `review_pending=0`) ni tracker (`mismatches=0`, `done_zero_real=0`). Guardrail de precisi\u00f3n en muestra revisada vigente: `precision_by_required_party={BNG:0.8571, VOX:1.0, FORO:1.0, PP:1.0}` (`min_party_precision=0.85`, `reviewed_total=28`). Evidencia: `docs/etl/sprints/AI-OPS-270/reports/programas-bng-europeas-near-duplicate-ratio-closure-20260228.md`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_latest.json`, `docs/etl/sprints/AI-OPS-270/exports/programas_support_unclear_unique_ratio_bng_latest.csv`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_exact_fail_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_exact_fail_rc_latest.txt`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_unclear_unique_ratio_bng_delta_vs_ai_ops_269_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/quality_declared_programas_enforce_latest.json`, `docs/etl/sprints/AI-OPS-270/evidence/tracker_status_post_latest.log`, `docs/etl/sprints/AI-OPS-270/evidence/programas_support_precision_audit_latest.json`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 34,
      "runs_ok": 30,
      "last_status": "ok",
      "last_loaded": 52,
      "max_loaded_any": 52,
      "max_loaded_network": 51,
      "network_fetches": 20,
      "fallback_fetches": 14,
      "last_started_at": "2026-02-28T14:51:56+00:00",
      "last_seen_at": "2026-02-28T15:08:10+00:00",
      "last_source_url": "",
      "last_message": "{\"documents_loaded\": 52, \"note\": \"from-file\", \"out\": {\"evidence_inserted\": 145, \"info\": {\"concerns_count\": 12, \"document_fetch_stats\": {\"fallback_docs_fetched\": 52, \"first_network_doc_url\": null, \"network_docs_fetched\": 0}, \"election_cycles\": [\"es_autonomicas_2023\", \"es_europeas_2024\", \"es_generales_2023\"], \"failures\": [], \"program_doc_signals\": {\"policy_pair_hit\": 52}, \"skipped\": {\"bad_payload\": 0, \"doc_fetch_failed\": 0, \"missing_required\": 0, \"no_concerns_config\": 0, \"no_matching_topics\": 0, \"non_program_doc\": 0, \"party_missing_in_db\": 0}, \"topic_set_ids\": [17, 18, 11]}}}",
      "progress": {
        "loaded": 52,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "senado_iniciativas",
      "domain": "parlamentario",
      "source_name": "Senado - Iniciativas y mociones (OpenData)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.senado.es/web/ficopendataservlet?tipoFich=9&legis=15",
      "institution_name": "Senado de Espana",
      "role_title": "",
      "level": "nacional",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/senado_iniciativas_sample.xml",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Conversi\u00f3n iterativa adicional del residual global Senado `status=404` tras primer delta material",
        "dominio": "Operaciones",
        "fuentes_objetivo": "Packet global `status=404` (`senado_iniciativas`) con replay acotado + cierre anti-loop",
        "bloque": "Done now: NO_DELTA_WITH_EVIDENCE. AI-OPS-388 ejecuta dos pasadas `packet50` con `--include-unlinked` y postproceso completo (`excerpts` + `extractions --only-missing`) sin conversi\u00f3n neta: pass1 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; pass2 `candidate_urls=50`, `fetched_ok=0`, `failures=30`; delta acumulada `downloaded_doc_links=0`, `missing_doc_links_actionable=0`, `missing_urls=0`, `status404=0`, con `status403/status500` estables. Se registra `no_new_lever` y se cierra por anti-loop. Evidencia: `docs/etl/sprints/AI-OPS-388/reports/senado-status404-global-two-pass-no-delta-20260301.md`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_conversion_delta_ai_ops_388_20260301T174503Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_no_new_lever_ai_ops_388_20260301T174503Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_retry_packet50_effective_pass1_20260301T172903Z.json`, `docs/etl/sprints/AI-OPS-388/evidence/senado_status404_global_retry_packet50_effective_pass2_20260301T174503Z.json`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 5,
      "runs_ok": 4,
      "last_status": "ok",
      "last_loaded": 3607,
      "max_loaded_any": 3607,
      "max_loaded_network": 3607,
      "network_fetches": 2,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-13T08:11:00+00:00",
      "last_seen_at": "2026-02-13T08:11:04+00:00",
      "last_source_url": "https://www.senado.es/web/ficopendataservlet?tipoFich=9&legis=15",
      "last_message": "{\"initiatives_loaded\": 3607, \"note\": \"network\"}",
      "progress": {
        "loaded": 3607,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "parl_initiatives",
        "primary_rows": 3607,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 3607,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "senado_votaciones",
      "domain": "parlamentario",
      "source_name": "Senado - Votaciones (OpenData)",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.senado.es/web/relacionesciudadanos/datosabiertos/catalogodatos/votaciones/index.html?legis=15",
      "institution_name": "Senado de Espana",
      "role_title": "",
      "level": "nacional",
      "format": "html",
      "fallback_file": "etl/data/raw/samples/senado_votaciones_sample.xml",
      "tracker": {
        "status": "",
        "tipo_dato": "",
        "dominio": "",
        "fuentes_objetivo": "",
        "bloque": ""
      },
      "sql_status": "DONE",
      "mismatch_state": "UNTRACKED",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 43,
      "runs_ok": 28,
      "last_status": "ok",
      "last_loaded": 1,
      "max_loaded_any": 5534,
      "max_loaded_network": 5534,
      "network_fetches": 16,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-14T19:56:05+00:00",
      "last_seen_at": "2026-02-14T19:56:06+00:00",
      "last_source_url": "https://www.senado.es/web/relacionesciudadanos/datosabiertos/catalogodatos/votaciones/index.html?legis=15",
      "last_message": "{\"events_loaded\": 1, \"member_votes_loaded\": 0, \"note\": \"network\"}",
      "progress": {
        "loaded": 1,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "parl_vote_events",
        "primary_rows": 5534,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 5534,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "congreso_diputados",
      "domain": "politicos",
      "source_name": "Congreso - Diputados Activos",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.congreso.es/es/opendata/diputados",
      "institution_name": "Congreso de los Diputados",
      "role_title": "Diputado/a",
      "level": "nacional",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/congreso_diputados_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Congreso)",
        "dominio": "Nacional",
        "fuentes_objetivo": "Congreso OpenData Diputados",
        "bloque": "Mejorar calidad de campos opcionales"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 7,
      "runs_ok": 6,
      "last_status": "ok",
      "last_loaded": 350,
      "max_loaded_any": 350,
      "max_loaded_network": 350,
      "network_fetches": 1,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-14T19:55:43+00:00",
      "last_seen_at": "2026-02-14T19:55:50+00:00",
      "last_source_url": "https://www.congreso.es/webpublica/opendata/diputados/DiputadosActivos__20260214050006.json",
      "last_message": "Ingesta completada: 350/350 registros validos",
      "progress": {
        "loaded": 350,
        "target": 300,
        "percent": 100
      },
      "mandates": 352,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 352,
        "counts": {
          "mandates": 352,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "senado_senadores",
      "domain": "politicos",
      "source_name": "Senado - Senadores",
      "scope": "nacional",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://www.senado.es/web/ficopendataservlet?tipoFich=6&legis=15",
      "institution_name": "Senado de Espana",
      "role_title": "Senador/a",
      "level": "nacional",
      "format": "xml",
      "fallback_file": "etl/data/raw/samples/senado_senadores_sample.csv",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Representantes y mandatos (Senado)",
        "dominio": "Nacional",
        "fuentes_objetivo": "Senado OpenData XML (grupos + fichas)",
        "bloque": "Hardening de aliases y umbral minimo"
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 8,
      "runs_ok": 6,
      "last_status": "ok",
      "last_loaded": 1560,
      "max_loaded_any": 1560,
      "max_loaded_network": 1560,
      "network_fetches": 3,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-14T22:16:57+00:00",
      "last_seen_at": "2026-02-14T22:17:04+00:00",
      "last_source_url": "https://www.senado.es/web/ficopendataservlet?tipoFich=6&legis=10,11,12,14,15&skip_details=1",
      "last_message": "Ingesta completada: 1560/1560 registros validos",
      "progress": {
        "loaded": 1560,
        "target": 250,
        "percent": 100
      },
      "mandates": 1793,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 1793,
        "counts": {
          "mandates": 1793,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "aemet_opendata_series",
      "domain": "politicos",
      "source_name": "AEMET OpenData - Indicadores confusores",
      "scope": "outcomes",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://opendata.aemet.es/opendata/api/valores/climatologicos",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/aemet_opendata_series_sample.json",
      "tracker": {
        "status": "PARTIAL",
        "tipo_dato": "Indicadores (confusores): AEMET",
        "dominio": "Outcomes",
        "fuentes_objetivo": "AEMET OpenData",
        "bloque": "Done now: NO. Blocker: `aemet_opendata_series` en `strict-network` sigue bloqueado por contrato (`aemet_blocker=contract`, JSON invalido con payload vac\u00edo `payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, `run_id=263`, `run_records_loaded=0`), por lo que la fila permanece `PARTIAL`. Evidencia: `docs/etl/sprints/AI-OPS-14/evidence/blocker-probe-refresh.log`, `docs/etl/sprints/AI-OPS-14/evidence/unblock-execution.log`, `docs/etl/sprints/AI-OPS-14/exports/unblock_feasibility_matrix.csv`. Siguiente comando: `AEMET_API_KEY=<token> python3 scripts/ingestar_politicos_es.py ingest --db etl/data/staging/politicos-es.db --source aemet_opendata_series --url https://opendata.aemet.es/opendata/api/observacion/convencional/todas --snapshot-date 2026-02-17 --strict-network --timeout 30`."
      },
      "sql_status": "PARTIAL",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "degraded",
      "runs_total": 13,
      "runs_ok": 3,
      "last_status": "error",
      "last_loaded": 0,
      "max_loaded_any": 2,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 3,
      "last_started_at": "2026-02-19T16:15:10+00:00",
      "last_seen_at": "2026-02-19T16:15:10+00:00",
      "last_source_url": "https://opendata.aemet.es/opendata/api/observacion/convencional/todas",
      "last_message": "Error: aemet_blocker=contract; error_type=RuntimeError; detail=JSON invalido para AEMET (Expecting value: line 1 column 1 (char 0); payload_sig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)",
      "progress": {
        "loaded": 0,
        "target": 1,
        "percent": 0
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": true,
        "blocked_note": true
      }
    },
    {
      "source_id": "bde_series_api",
      "domain": "politicos",
      "source_name": "Banco de Espana - Indicadores confusores (API series)",
      "scope": "outcomes",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma=es&series=D_1NBAA301,D_1NBAA304,D_1NBAA317,D_1NBAA372,D_1NBAA572,D_1NBAC372,D_1NBAC572,D_1NBAC972,D_1NBAD301,D_1NBAD302,D_1NBAD306,D_1NBAD311,D_1NBAD317,D_1NBAD372,D_1NBAD472,D_1NBAD572,D_1NBAD972,D_1NBAE472,D_1NBAE572,D_1NBAE972,D_1NBAF472,D_1NBAF572,D_1NBAS372,D_1NBAS572,D_1NBAS972,D_1NBBO020,D_1NBBO072,D_1NBBO303,D_1NBBO305,D_1NBBO307,D_1NBBO308,D_1NBBO309,D_1NBBO310,D_1NBBO311,D_1NBBO314,D_1NBBO315,D_1NBBO316,D_1NBBO320,D_1NBBO333,D_1NBBO349,D_1NBBO572,D_1NBBP301,D_1NBBP302,D_1NBBP303,D_1NBBP304,D_1NBBP305,D_1NBBP306,D_1NBBP307,D_1NBBP308,D_1NBBP309,D_1NBBP310,D_1NBBP311,D_1NBBP314,D_1NBBP315,D_1NBBP316,D_1NBBP317,D_1NBBP349,D_1NBBP572&rango=30M",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/bde_series_api_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Indicadores (confusores): Banco de Espana",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Banco de Espana (API series)",
        "bloque": "Done now: YES. AI-OPS-237 cierra la deriva de endpoint BDE: se migra el conector a `app.bde.es/bierest/resources/srdatosapp/listaSeries` y se endurece parsing para payload `fechas/valores` + `gzip`. Corrida `strict-network` real en staging: `run_id=278`, `status=ok`, `records_seen=1`, `records_loaded=1` (`bde_series_api: 1/1 registros validos`). Estructuraci\u00f3n posterior (`backfill-indicators --source-ids bde_series_api`) queda en `source_records_mapped=3`, `indicator_series_upserted=3`, `indicator_points_upserted=37`, `observation_records_upserted=37`, `indicator_series_unresolved_domain=0` (heur\u00edstica a\u00f1adida `euribor -> vivienda_urbanismo`). Evidencia: `docs/etl/sprints/AI-OPS-237/reports/bde-series-endpoint-drift-closure-20260227.md`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingest_strict_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/bde_series_ingestion_runs_latest.txt`, `docs/etl/sprints/AI-OPS-237/evidence/backfill_indicators_bde_after_domain_fix_latest.json`, `docs/etl/sprints/AI-OPS-237/evidence/tracker_status_post_bde_fix_latest.log`, `docs/etl/sprints/AI-OPS-237/evidence/python_unittest_bde_indicator_backfill_latest.txt`. Siguiente comando: `python3 scripts/ingestar_politicos_es.py ingest --db <db> --source bde_series_api --url 'https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma=es&series=D_1NBAF472&rango=30M' --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids bde_series_api`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 17,
      "runs_ok": 7,
      "last_status": "ok",
      "last_loaded": 58,
      "max_loaded_any": 58,
      "max_loaded_network": 58,
      "network_fetches": 4,
      "fallback_fetches": 3,
      "last_started_at": "2026-02-27T11:11:46+00:00",
      "last_seen_at": "2026-02-27T11:11:58+00:00",
      "last_source_url": "https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma=es&series=D_1NBAA301,D_1NBAA304,D_1NBAA317,D_1NBAA372,D_1NBAA572,D_1NBAC372,D_1NBAC572,D_1NBAC972,D_1NBAD301,D_1NBAD302,D_1NBAD306,D_1NBAD311,D_1NBAD317,D_1NBAD372,D_1NBAD472,D_1NBAD572,D_1NBAD972,D_1NBAE472,D_1NBAE572,D_1NBAE972,D_1NBAF472,D_1NBAF572,D_1NBAS372,D_1NBAS572,D_1NBAS972,D_1NBBO020,D_1NBBO072,D_1NBBO303,D_1NBBO305,D_1NBBO307,D_1NBBO308,D_1NBBO309,D_1NBBO310,D_1NBBO311,D_1NBBO314,D_1NBBO315,D_1NBBO316,D_1NBBO320,D_1NBBO333,D_1NBBO349,D_1NBBO572,D_1NBBP301,D_1NBBP302,D_1NBBP303,D_1NBBP304,D_1NBBP305,D_1NBBP306,D_1NBBP307,D_1NBBP308,D_1NBBP309,D_1NBBP310,D_1NBBP311,D_1NBBP314,D_1NBBP315,D_1NBBP316,D_1NBBP317,D_1NBBP349,D_1NBBP572&rango=30M",
      "last_message": "Ingesta completada: 58/58 registros validos",
      "progress": {
        "loaded": 58,
        "target": 58,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    },
    {
      "source_id": "ree_esios_indicators",
      "domain": "politicos",
      "source_name": "ESIOS/REE - Indicadores confusores (API)",
      "scope": "outcomes",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://apidatos.ree.es/es/datos/demanda/evolucion?start_date=2026-02-11T00:00&end_date=2026-02-12T23:59&time_trunc=hour",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/ree_esios_indicators_sample.json",
      "tracker": {
        "status": "PARTIAL",
        "tipo_dato": "Indicadores (confusores): ESIOS/REE",
        "dominio": "Outcomes",
        "fuentes_objetivo": "ESIOS/REE API (token)",
        "bloque": "Done now: PARTIAL. AI-OPS-296 cierra el gap de conector con `ree_esios_indicators` (config/registry + parser de payload REE `included[].attributes.values` + soporte de contenedor serializado `records` + rechazo de snapshots legacy `metric,value` + fallback sample reproducible) y lo integra en `backfill-indicators`/mapeo tracker. Corrida reproducible en DB principal desde muestra (`--from-file`) deja `status=ok`, `records_loaded=2`, `source_records_total=2`; el probe `--strict-network` al endpoint oficial sigue bloqueado de forma reproducible con `HTTP 500`, body HTML y cabecera `x-cdn: Imperva`, por lo que no aplica `DONE` en red real. Evidencia: `docs/etl/sprints/AI-OPS-296/reports/ree-esios-indicators-connector-partial-closure-20260228.md`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_ingest_status_latest.json`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_curl_headers_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/e2e_tracker_status_main_db_latest.txt`, `docs/etl/sprints/AI-OPS-296/evidence/ree_esios_main_db_ingestion_runs_latest.txt`. Siguiente comando: `ESIOS_API_TOKEN=<token> python3 scripts/ingestar_politicos_es.py ingest --db <db> --source ree_esios_indicators --snapshot-date <YYYY-MM-DD> --strict-network --timeout 30 && python3 scripts/ingestar_politicos_es.py backfill-indicators --db <db> --source-ids ree_esios_indicators`."
      },
      "sql_status": "PARTIAL",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 1,
      "runs_ok": 1,
      "last_status": "ok",
      "last_loaded": 2,
      "max_loaded_any": 2,
      "max_loaded_network": 0,
      "network_fetches": 0,
      "fallback_fetches": 1,
      "last_started_at": "2026-02-28T19:28:54+00:00",
      "last_seen_at": "2026-02-28T19:29:03+00:00",
      "last_source_url": "",
      "last_message": "Ingesta completada: 2/2 registros validos (from-file)",
      "progress": {
        "loaded": 2,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": false,
        "has_any": true,
        "blocked_note": true
      }
    },
    {
      "source_id": "eurostat_sdmx",
      "domain": "politicos",
      "source_name": "Eurostat - Indicadores outcomes (API/SDMX)",
      "scope": "outcomes",
      "desired": true,
      "in_db": true,
      "active": true,
      "default_url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/",
      "institution_name": "",
      "role_title": "",
      "level": "",
      "format": "json",
      "fallback_file": "etl/data/raw/samples/eurostat_sdmx_sample.json",
      "tracker": {
        "status": "DONE",
        "tipo_dato": "Indicadores (outcomes): Eurostat",
        "dominio": "Outcomes",
        "fuentes_objetivo": "Eurostat (API/SDMX)",
        "bloque": "Done now: YES. `eurostat_sdmx` tiene `strict-network` exitoso (`run_records_loaded=2394`) y replay no-cero (`run_records_loaded=2`), por lo que el mismatch actual era desfase tracker/SQL y se reconcilia a `DONE`. Evidencia: `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__strict-network_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/evidence/eurostat-sql/eurostat_sdmx__replay_run_snapshot.csv`, `docs/etl/sprints/AI-OPS-10/reports/eurostat-apply.md`, `docs/etl/sprints/AI-OPS-10/evidence/tracker-gate-postrun.log`, `docs/etl/sprints/AI-OPS-10/evidence/status-postrun.json`. Siguiente comando: `just etl-tracker-gate`."
      },
      "sql_status": "DONE",
      "mismatch_state": "MATCH",
      "mismatch_waived": false,
      "waiver_expiry": "",
      "state": "ok",
      "runs_total": 14,
      "runs_ok": 9,
      "last_status": "ok",
      "last_loaded": 2,
      "max_loaded_any": 2394,
      "max_loaded_network": 2394,
      "network_fetches": 6,
      "fallback_fetches": 3,
      "last_started_at": "2026-02-17T10:37:10+00:00",
      "last_seen_at": "2026-02-17T10:37:16+00:00",
      "last_source_url": "",
      "last_message": "Ingesta completada: 2/2 registros validos (from-file)",
      "progress": {
        "loaded": 2,
        "target": 1,
        "percent": 100
      },
      "mandates": 0,
      "warehouse": {
        "primary_table": "mandates",
        "primary_rows": 0,
        "counts": {
          "mandates": 0,
          "parl_vote_events": 0,
          "parl_initiatives": 0,
          "infoelectoral_convocatoria_tipos": 0,
          "infoelectoral_procesos": 0
        }
      },
      "flags": {
        "under_threshold": false,
        "done_zero_real": false,
        "has_network": true,
        "has_any": true,
        "blocked_note": false
      }
    }
  ],
  "missing": []
}