Skip to main content

disensor

Adversarial plan & code review with a declared residue.

Declaración de residuo de revisión adversarial, con validación y gate de CI. Implementación de referencia del artefacto definido a partir del método de desacuerdo controlado: un modelo genera, un modelo de otra familia ataca, el generador verifica cada hallazgo, y el ciclo termina cuando todo hallazgo quedó resuelto, refutado con evidencia o escalado a un humano.

El artefacto que este repo define y hace cumplir registra cómo terminó cada evento de revisión: los hallazgos con su estado terminal, y el residuo: lo que el ciclo no pudo cerrar por sí mismo y descansa sobre el juicio de alguien. La declaración lista residuo, no cobertura: dirige el escrutinio del revisor humano en lugar de leerse como sello de calidad.

Paper del método: Rocchia, N. (2026), Desacuerdo controlado: revisión adversarial automatizada con un segundo asistente de código en el desarrollo de software, DOI 10.5281/zenodo.21633495.

Qué hay acá

  • spec/residuo.schema.json: el esquema del artefacto (JSON Schema 2020-12), versión v0.1.
  • spec/ejemplos/: tres artefactos de ejemplo, incluido un evento real anonimizado y el perfil minimizado sin texto libre.
  • src/disensor/: paquete Python con el validador (reglas R0 a R10), el gate de CI (chequeos G1 a G5), el render del comentario de PR y el scaffolding de artefactos.
  • action.yml: GitHub Action compuesta, lista para usar.
  • docs/integracion-claude-code.md: cómo el flujo real (Claude Code + Codex) emite el artefacto al cierre de cada evento.

Uso rápido

pip install disensor     # para desarrollo, desde el repo clonado: pip install -e .

disensor nuevo --compuerta diff --nivel B    # plantilla prellenada en .residuo/
disensor validar .residuo/<id>.json          # schema + reglas R0 a R10
disensor gate --sin-comentario               # lo que va a correr CI, en local

En el repositorio consumidor, disensor.config.json en la raíz declara el nivel de criticidad (el nivel viaja con el código, en un archivo versionado):

{
  "nivel_criticidad": "B",
  "nivel_A_habilitado": false
}

Y el workflow (ver docs/ejemplo-workflow.yml):

on: pull_request
permissions:
  contents: read
  pull-requests: write
jobs:
  gate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: NicolasRocchia/disensor@v0.1.0

El gate valida todos los artefactos de .residuo/ del PR, aplica la política y publica la declaración como comentario (se actualiza en el lugar en cada push).

Qué hace cumplir el gate

Por artefacto (reglas R0 a R10): coherencia entre hallazgos y residuo, conteos que cierran, decorrelación de familias entre generador y revisor, evidencia obligatoria en refutaciones verificables, atención humana obligatoria en refutaciones interpretativas, corrección verificada antes de cerrar un hallazgo en compuerta de diff, rechazo de marcadores genéricos, y perfil minimizado sin fugas de texto.

Por PR (chequeos G1 a G5): al menos una declaración válida en el rango, nivel del artefacto igual al declarado del repositorio, Nivel A bloqueado mientras la gobernanza no esté validada, política de confinamiento del revisor por nivel, y commit revisado dentro del rango del PR.

Límite honesto, heredado del protocolo: la máquina detecta el campo vacío y el marcador genérico, no la declaración falsa. El muestreo humano de PR cerrados sigue siendo la única defensa real contra el cumplimiento cosmético.

Qué no hace

No corre modelos, no pide claves de API en CI, y ningún código viaja a ningún servicio: valida un JSON que ya está versionado en el repo. La orquestación del loop vive donde el equipo ya trabaja; el perfil minimizado del artefacto permite ambientes donde ni siquiera el texto de los hallazgos puede salir del entorno.

Conformidad entre implementaciones

spec/vectores/ contiene los vectores de conformidad: 22 artefactos con su veredicto esperado (valido o no, y las etiquetas de regla que deben dispararse). Toda implementacion del validador tiene que pasarlos identicos: la referencia en Python los corre en la suite (tests/test_vectores.py) y el port TypeScript del plano de evidencia los corre con npm run conformidad. Se comparan etiquetas, no mensajes. Los vectores se regeneran con python -m disensor.vectores spec/vectores.

plano-evidencia/ contiene el Worker de ingesta (Cloudflare Workers mas D1) con el port TypeScript del validador y el recibo de integridad de solo agregado. Ver su README para el estado de verificacion y el despliegue.

Estado

v0.1, borrador en uso. El esquema puede cambiar hasta v1.0; los cambios se declaran en el propio esquema. Dos decisiones abiertas antes de v0.2: claves del esquema en español o inglés, y licencia definitiva (hoy MIT; Apache-2.0 está en consideración por la concesión de patentes antes del release público).

Licencia

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

disensor-0.1.0.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

disensor-0.1.0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file disensor-0.1.0.tar.gz.

File metadata

  • Download URL: disensor-0.1.0.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.2

File hashes

Hashes for disensor-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7c706697cd129415b7c50a0d9944b2de1d12c05bd0924512b873971db4dbdf73
MD5 2fcbfc24e76ecf7a0e6d230e0d1f87c4
BLAKE2b-256 8bf3e05f4cc7eabf4f8047e7f9b8c8a3355455faca5160584eb095f339c8a3ea

See more details on using hashes here.

File details

Details for the file disensor-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: disensor-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.2

File hashes

Hashes for disensor-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ce95d3d1a49792c81246d9493f79aa7f73aae390ad3f07d20874978aa35ef24a
MD5 921feeda0497bd25bf92efa212a4d1a6
BLAKE2b-256 b8bf9192ee4f0982569cf32aa85e80f89f3a5116c4119b518bccf82ec72748e2

See more details on using hashes here.

Release history Release notifications | RSS feed

0.6.4

2 files

0.6.3

2 files

0.6.2

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page