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
Top comments (0)