DEV Community

LeoJulieta
LeoJulieta

Posted on

Controla y sigue cambios del US Code con Git y IA

Versiona y vigila el US Code con Git, GitHub Actions y IA

Una guía práctica para legisladores, abogados y desarrolladores que quieren seguir cada cambio legislativo en tiempo real.

Introducción

¿Te imaginas descubrir que una norma que afecta a tu organización ha sido modificada y no lo sabes hasta que ya está en vigor? Desde que el artículo “Git for the US Code” se viralizó en Hacker News y Reddit, cientos de profesionales están pidiendo una solución que combine control de versiones, automatización y análisis con IA. En las siguientes secciones verás, paso a paso, cómo crear un repositorio Git del US Code, montar un pipeline CI/CD con GitHub Actions y usar un LLM para generar resúmenes y detectar conflictos. Todo con scripts listos para copiar‑pegar y sin rodeos teóricos.


1. Preparar el repositorio del US Code

1.1. Clonar los datos oficiales

El US Code está disponible en formato XML en la página del Government Publishing Office (GPO). Ejecuta:

# Crear carpeta del proyecto
mkdir us-code && cd us-code

# Descargar el ZIP del XML (versión 2023)
curl -L -o uscode.zip https://www.govinfo.gov/content/pkg/USCODE-2023/xml.zip
unzip uscode.zip -d source
Enter fullscreen mode Exit fullscreen mode

1.2. Inicializar Git y hacer el primer commit

git init
git add source/
git commit -m "📦 Importación inicial del US Code (XML 2023)"
Enter fullscreen mode Exit fullscreen mode

1.3. Estructura recomendada

us-code/
├─ .github/
│   └─ workflows/
│       └─ ci.yml
├─ scripts/
│   ├─ parse_xml.py
│   └─ summarize.py
├─ source/          # XML descargado
└─ README.md
Enter fullscreen mode Exit fullscreen mode

2. Automatizar la actualización diaria

2.1. GitHub Actions – workflow básico

Crea el archivo .github/workflows/ci.yml con el siguiente contenido:

name: Actualizar US Code

on:
  schedule:
    - cron: '0 4 * * *'   # Cada día a 04:00 UTC
  workflow_dispatch:      # Permite lanzar manualmente

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout del repositorio
        uses: actions/checkout@v4

      - name: Instalar dependencias
        run: |
          sudo apt-get update
          sudo apt-get install -y unzip curl
          python -m pip install --upgrade pip
          pip install lxml openai tqdm

      - name: Descargar última versión del US Code
        run: |
          curl -L -o uscode_latest.zip https://www.govinfo.gov/content/pkg/USCODE-2024/xml.zip
          unzip -o uscode_latest.zip -d source

      - name: Detectar cambios
        id: diff
        run: |
          git diff --quiet || echo "changed=true" >> $GITHUB_OUTPUT

      - name: Commit y push de cambios
        if: steps.diff.outputs.changed == 'true'
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add source/
          git commit -m "🔄 Actualización diaria del US Code $(date +'%Y-%m-%d')"
          git push
Enter fullscreen mode Exit fullscreen mode

Tip: El job solo crea un commit si hay diferencias reales, evitando ruido en el historial.

2.2. Notificaciones en Slack (opcional)

Añade al workflow un paso que envíe un mensaje a Slack usando el Slack Webhook almacenado como secret SLACK_WEBHOOK.

      - name: Notificar a Slack
        if: steps.diff.outputs.changed == 'true'
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
        run: |
          curl -X POST -H 'Content-type: application/json' \
          --data "{\"text\":\"✅ US Code actualizado. $(git rev-parse --short HEAD)\"}" $SLACK_WEBHOOK
Enter fullscreen mode Exit fullscreen mode

3. Analizar el texto con un LLM

3.1. Script de resumen (scripts/summarize.py)

import os, json, pathlib, tqdm
from openai import OpenAI
from lxml import etree

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def xml_to_text(xml_path: pathlib.Path) -> str:
    tree = etree.parse(str(xml_path))
    # Extraemos los párrafos <p> y los concatenamos
    return "\n".join(tree.xpath("//p/text()"))

def summarize(section_text: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "Eres un asistente que resume legislación federal en español, resaltando obligaciones, derechos y plazos."},
            {"role": "user", "content": f"Resume el siguiente texto:\n\n{section_text}"}
        ],
        temperature=0.0,
    )
    return response.choices[0].message.content.strip()

def main():
    src = pathlib.Path("../source")
    out = pathlib.Path("../summaries")
    out.mkdir(exist_ok=True)

    for xml_file in tqdm.tqdm(src.rglob("*.xml")):
        txt = xml_to_text(xml_file)
        summary = summarize(txt)
        out_file = out / (xml_file.stem + ".md")
        out_file.write_text(f"# Resumen de {xml_file.stem}\n\n{summary}")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Requisitos: pip install openai lxml tqdm. Configura la variable de entorno OPENAI_API_KEY con tu clave de OpenAI.

3.2. Ejecutar desde la CI

Añade al workflow un paso después del commit:

      - name: Generar resúmenes con IA
        run: |
          python -m pip install -r requirements.txt
          python scripts/summarize.py
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
Enter fullscreen mode Exit fullscreen mode

Los resúmenes se guardarán en la carpeta summaries/ y se pueden publicar automáticamente como GitHub Pages o como artefactos del workflow.


4. Detectar conflictos legislativos

Algunas enmiendas generan inconsistencias (por ejemplo, una norma que otorga un derecho y otra que lo limita). Un enfoque rápido es usar el LLM para comparar dos versiones de la misma sección.

def compare_versions(old: str, new: str) -> str:
    prompt = f"""Compara las siguientes dos versiones de una sección del US Code y enumera:
1. Cambios sustanciales.
2. Posibles conflictos o contradicciones.
3. Impacto práctico.

Versión anterior:
{old}

Versión nueva:
{new}
"""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.0,
    )
    return resp.choices[0].message.content.strip()
Enter fullscreen mode Exit fullscreen mode

Integra esta función en el pipeline para que, cada vez que el git diff detecte cambios en una sección, se genere automáticamente un reporte en issues/ de GitHub.


5. Tabla comparativa de herramientas

Necesidad Herramienta Ventajas Comentario
Almacenamiento Git (GitHub, GitLab) Historial completo, colaboración mediante PR Público y gratuito para repositorios abiertos
Descarga automática curl + unzip Sin dependencias externas Usa la API oficial del GPO
Parseo XML lxml (Python) Rápido y con soporte XPath Permite extraer sólo los elementos relevantes
IA para resumen OpenAI GPT‑4o‑mini Calidad alta, bajo coste Alternativas: Anthropic Claude, LLaMA‑2 (local)
CI/CD GitHub Actions Integración nativa, programación cron Similar en GitLab CI, Azure Pipelines
Alertas Slack/Webhook, GitHub Issues Notificaciones en tiempo real Configurable por proyecto

6. Caso práctico: monitorizar derechos civiles

Supongamos que tu ONG quiere estar al tanto de cualquier cambio en la sección 42 U.S.C. § 1983 (responsabilidad civil por violaciones de derechos). El flujo sería:

  1. Filtrar la sección: en scripts/parse_xml.py añade una función que copie sólo los archivos cuyo title contenga “1983”.
  2. Generar resumen diario con el script de IA.
  3. Crear issue automático si el resumen contiene palabras clave como “restricción”, “exención” o “sanción”.
  4. **Enviar

Herramienta mencionada: Groq Cloud

Top comments (0)