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 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)" 1.3. Estructura recomendada
us-code/ ├─ .github/ │ └─ workflows/ │ └─ ci.yml ├─ scripts/ │ ├─ parse_xml.py │ └─ summarize.py ├─ source/ # XML descargado └─ README.md 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 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 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() Requisitos:
pip install openai lxml tqdm. Configura la variable de entornoOPENAI_API_KEYcon 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 }} 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() 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:
- Filtrar la sección: en
scripts/parse_xml.pyañade una función que copie sólo los archivos cuyotitlecontenga “1983”. - Generar resumen diario con el script de IA.
- Crear issue automático si el resumen contiene palabras clave como “restricción”, “exención” o “sanción”.
- **Enviar
Herramienta mencionada: Groq Cloud