Detecta normas derogadas o modificadas en documentos jurídicos contrastando cada cita con el BOE y EUR-Lex
Project description
Derogada
¿Tu demanda invoca una norma derogada sin saberlo?
Derogada lee tu escrito jurídico (PDF, Word o texto), extrae cada referencia normativa y comprueba en las fuentes oficiales (la API de datos abiertos del BOE y CELLAR / EUR-Lex) si sigue vigente, fue modificada o está derogada. Con enlace oficial en cada línea y propuesta de cambio anclada a la norma vigente.
Sirve tanto para revisar lo que redactas como lo que recibes: una norma derogada en el escrito de la parte contraria es un argumento a tu favor.
Demo en vivo · Documentación técnica · PyPI · GitHub
$ derogada check demanda.pdf --format md --out informe.md
Qué hace
- Extrae las citas del documento ("Ley 30/1992, art. 42", "Reglamento (UE) 2016/679", "art. 217 LECrim"...) con doble canal: regex determinista + LLM opcional.
- Las contrasta con fuentes oficiales: API de datos abiertos del BOE y endpoint SPARQL de CELLAR (EUR-Lex). Sin scrapers, sin inventar.
- Informa del estado: VIGENTE · MODIFICADA · DEROGADA · VIGENCIA AGOTADA · NO RESUELTA · NO ENCONTRADA, con la norma que deroga o modifica y su enlace oficial.
- Verifica a dos niveles: la norma completa y el artículo citado (que puede estar derogado aunque la norma siga viva).
- Propone el cambio textual anclado a la norma vigente equivalente, con fuente.
- Si una cita es ambigua, nunca la adivina: la marca
NO RESUELTAcon los candidatos.
Instalación
pip install derogada
Requiere Python ≥ 3.10. Para desarrollo:
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
Uso
derogada check demanda.pdf # informe Markdown por stdout
derogada check demanda.docx -f json -o informe.json
derogada check demanda.pdf -f tabla # tabla en terminal
derogada check demanda.pdf --no-llm # solo regex, sin LLM
derogada norma BOE-A-1992-26318 # estado de una norma suelta
derogada norma 32016R0679 # también CELEX (EUR-Lex)
derogada cache clear # vacía la caché local
Como biblioteca:
from derogada import analizar_documento
informe = analizar_documento("demanda.pdf")
for r in informe.resultados:
print(r.cita.texto, "->", r.estado.value, r.derogada_por)
Configuración de la IA (opcional)
El canal LLM mejora el recall con siglas y nombres comunes ("el Estatuto de los Trabajadores", "el RGPD"...). Sin configuración, todo funciona en modo solo-regex.
# cualquier modelo LiteLLM: gpt-5.6, anthropic/claude-sonnet-5,
# gemini/gemini-3.5-flash, openai/qwen3.6 (endpoint propio), ollama/llama4...
export DEROGADA_MODEL="anthropic/claude-sonnet-5"
export DEROGADA_API_BASE="https://api.ejemplo/v1" # endpoint OpenAI-compatible
export DEROGADA_API_KEY="sk-..."
Las respuestas de las APIs oficiales se cachean localmente (SQLite, TTL 7 días,
DEROGADA_CACHE_DIR) para no martillear los servicios públicos.
Cómo funciona
ingesta (txt/docx/pdf) → extracción (regex + LLM) → resolución (BOE-A / CELEX)
→ verificación (norma y artículo) → sugerencia anclada → informe (md/json/tabla)
Reglas de diseño: nunca inventar identificadores, validar todo contra la API
(numero_oficial y rango), y no proponer nada sin fuente oficial. Detalles en
la documentación técnica.
Demo web
La landing (derogada.686f6c61.dev, rama
landing) incluye una demo
que se ejecuta 100% en el navegador: verificación en vivo contra el BOE (CORS
abierto) y EUR-Lex (vía proxy CORS; solo viaja el CELEX, dato público).
El servidor opcional para la demo completa con IA (FastAPI, demo/) vive en la
misma rama landing, que es la que se despliega en producción.
Desarrollo
ruff check src tests
pytest -q # 51 tests con cassettes VCR grabadas: no necesita red
CI: ruff + pytest en Python 3.10–3.13. Publicación en PyPI con Trusted Publishing
al pushear un tag v*. Cambios por versión: CHANGELOG.md.
Aviso
Derogada no ofrece asesoramiento jurídico. Los textos consolidados del BOE tienen carácter meramente informativo: a efectos jurídicos, consulta siempre la publicación oficial. Los datos de la UE proceden de CELLAR / EUR-Lex.
Licencia
CC BY-NC-SA 4.0 © 2026 686f6c61. Uso libre para fines no comerciales con atribución, y las obras derivadas deben compartirse bajo la misma licencia (share-alike). Para uso comercial, contacta con el autor para una licencia aparte.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file derogada-0.1.0.tar.gz.
File metadata
- Download URL: derogada-0.1.0.tar.gz
- Upload date:
- Size: 73.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
becae5e9839c4cd9da477f02bcccb9d806bbe7061341799d10580967eb85126d
|
|
| MD5 |
d233eefad7f1e2686a53db7b33a8868c
|
|
| BLAKE2b-256 |
04b26831db3957666d688d9eabc9e8c43b80f858c60b133393e8e3cc8a7bd1ca
|
Provenance
The following attestation bundles were made for derogada-0.1.0.tar.gz:
Publisher:
release.yml on 686f6c61/derogada
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
derogada-0.1.0.tar.gz -
Subject digest:
becae5e9839c4cd9da477f02bcccb9d806bbe7061341799d10580967eb85126d - Sigstore transparency entry: 2239315547
- Sigstore integration time:
-
Permalink:
686f6c61/derogada@990d306021b1d839a29e3cfa560838ef5736c01c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/686f6c61
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@990d306021b1d839a29e3cfa560838ef5736c01c -
Trigger Event:
push
-
Statement type:
File details
Details for the file derogada-0.1.0-py3-none-any.whl.
File metadata
- Download URL: derogada-0.1.0-py3-none-any.whl
- Upload date:
- Size: 39.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2aac11c5c72696d0d27f600f53e64abd096bf96fe9f7cc45dfb33d23eae2d7da
|
|
| MD5 |
7702b2386efd92b2ab43b83d7bcacb2b
|
|
| BLAKE2b-256 |
c075425223bb635240f33bdf958e2a4cc1f9040e2b9a88f6331d9e991580fca5
|
Provenance
The following attestation bundles were made for derogada-0.1.0-py3-none-any.whl:
Publisher:
release.yml on 686f6c61/derogada
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
derogada-0.1.0-py3-none-any.whl -
Subject digest:
2aac11c5c72696d0d27f600f53e64abd096bf96fe9f7cc45dfb33d23eae2d7da - Sigstore transparency entry: 2239315800
- Sigstore integration time:
-
Permalink:
686f6c61/derogada@990d306021b1d839a29e3cfa560838ef5736c01c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/686f6c61
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@990d306021b1d839a29e3cfa560838ef5736c01c -
Trigger Event:
push
-
Statement type: