{"schemaVersion":1,"id":"https://lucioduran.com/es/projects/structured-output-contracts","url":"https://lucioduran.com/es/projects/structured-output-contracts","title":"Structured Output Contracts","description":"Contratos JSON acotados con validación estricta, rechazos explícitos y reintentos limitados. Compara validez y exactitud con dos modelos Qwen locales y respuestas originales.","language":"es","datePublished":"2026-10-22","dateModified":"2026-10-22","contentFormat":"text/markdown","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Structured Output Contracts\n\n# Structured Output Contracts\n\nContratos JSON acotados con validación estricta, rechazos explícitos y reintentos limitados. Compara validez y exactitud con dos modelos Qwen locales y respuestas originales.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE>)\n\nFicha publicada: 2026-10-22 · Ficha actualizada: 2026-10-22\n\n[Repositorio](<https://github.com/lucioduran/structured-output-contracts>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json>) · [Release v0.1.0](<https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0>)\n\n## Problema y utilidad para agentes\n\nJSON válido puede contener una respuesta falsa. Una salida truncada, un rechazo y un error de esquema tampoco son el mismo fallo. Mezclarlos en una tasa de éxito única impide entender qué está pasando.\n\nEl proyecto implementa una frontera entre generación y consumo de datos: clasifica cada intento, limita los reintentos y conserva las respuestas inválidas para poder inspeccionarlas.\n\n## Arquitectura\n\n1. **Esquemas acotados.** Objetos anidados, uniones discriminadas y límites de strings y arrays dentro de un subconjunto de JSON Schema Draft 2020-12. El parser rechaza entradas inválidas sin reparación silenciosa.\n2. **Política explícita.** Acepta, reconoce un rechazo explícito, reintenta o agota el presupuesto. El experimento limita cada tarea a dos intentos y usa metadatos reales de finalización.\n3. **Evaluación separada.** Qwen2-0.5B-Instruct y Qwen2.5-0.5B-Instruct fijados por revisión generan localmente. La exactitud semántica se calcula aparte, sin usar etiquetas para decidir reintentos.\n\n- [Diseño y metodología](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md>)\n\n## Qué demuestra\n\n- Contratos con límites de estructura y tratamiento explícito de rechazo y truncamiento.\n- Contabilidad por esquema de intentos, tokens, tiempo y validez separada de corrección.\n- Preservación de fallos originales y replay de la política sobre trazas congeladas.\n\n## Resultados publicados\n\nDoce tareas reservadas por modelo, cuatro por familia de esquema. Medición CPU float32 en Intel Xeon W-3223 con cuatro hilos. Qwen2 y Qwen2.5 en la tabla son las versiones Instruct de 0,5B parámetros.\n\nLas flechas comparan primer intento y resultado final. Validez y corrección usan todas las tareas como denominador, incluidas abstenciones esperadas. La latencia por tarea suma todos sus intentos y excluye cargar los modelos.\n\n### Resultados por modelo y esquema\n\n| Modelo / esquema | Válidas: inicial → final | Correctas: inicial → final | Reintentos | Mediana (s) | Máximo (s) |\n| --- | --- | --- | --- | --- | --- |\n| Qwen2 / bounded | 1/4 → 2/4 | 2/4 → 3/4 | 2 | 1.405 | 3.806 |\n| Qwen2 / nested | 0/4 → 0/4 | 0/4 → 0/4 | 1 | 1.336 | 2.155 |\n| Qwen2 / union | 0/4 → 0/4 | 1/4 → 1/4 | 0 | 0.890 | 1.010 |\n| Qwen2.5 / bounded | 0/4 → 0/4 | 0/4 → 1/4 | 4 | 2.005 | 2.745 |\n| Qwen2.5 / nested | 3/4 → 3/4 | 3/4 → 3/4 | 1 | 2.676 | 2.866 |\n| Qwen2.5 / union | 3/4 → 3/4 | 2/4 → 2/4 | 1 | 1.607 | 3.423 |\n\nQwen2 terminó con 2/12 respuestas válidas y 4/12 resultados correctos, incluidas dos abstenciones correctas. Qwen2.5 obtuvo 6/12 y 6/12, con una abstención correcta. Qwen2.5 también produjo un cero inventado que pasó el esquema: validar estructura no verifica hechos.\n\nLos 33 intentos reales incluyen 12 rechazos, siete respuestas malformadas, cuatro violaciones de esquema y dos truncamientos. Los 14 casos inyectados son controles de política separados, no muestras adicionales de modelos. [Análisis de errores](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md>).\n\n## Reproducir\n\nEl replay instala dependencias de validación, sin modelos. La reproducción neural descarga aproximadamente 1,9 GiB de snapshots públicos y usa el lock del entorno Intel macOS medido.\n\nEjecutá primero el bloque de replay para crear y activar el entorno. Usá directorios de salida nuevos y una medición a la vez. Las respuestas originales no se reparan ni se reemplazan.\n\n### Revisar la evidencia guardada\n\n```\ngit clone https://github.com/lucioduran/structured-output-contracts.git\ncd structured-output-contracts\ngit checkout ac8680a5b15731932da446694b8a0a5ced00d12a\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-dev.txt\npython -m contracts verify --output results/dev\npython -m contracts verify --output results/eval\n```\n\n### Repetir la medición local\n\n```\npython -m pip install -r requirements-local.lock\npython -m contracts download\nOMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 python -m contracts run --split dev --output build/reproduced-dev\nOMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 python -m contracts run --split eval --output build/reproduced-eval\npython -m contracts verify --output build/reproduced-dev\npython -m contracts verify --output build/reproduced-eval\npython -m scripts.injected --output build/injected.json\n```\n\n## Alcance y límites\n\n- Dos modelos pequeños de una familia y doce tareas por modelo no establecen confiabilidad de producción ni un ranking general. No hubo revisión humana independiente.\n- Se evalúa JSON solicitado por prompt con validación y reintentos. No incluye decodificación restringida por gramática ni productos alojados de structured output.\n- La igualdad exacta de JSON es una métrica conservadora, no una medida general de factualidad. Los límites de estructura no implementan un timeout duro ni un sandbox.\n- Una observación temporal por tarea. API paga: USD 0; electricidad, hardware y tiempo de operación no medidos.\n\n- [Function calling y contratos de salida de agentes](<https://lucioduran.com/es/blog/llm-function-calling-tool-use-patterns>)\n\n## Fuentes y revisión\n\nLos valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` ac8680a5b15731932da446694b8a0a5ced00d12a `](<https://github.com/lucioduran/structured-output-contracts/commit/ac8680a5b15731932da446694b8a0a5ced00d12a>)\n- Revisión registrada por el experimento: [` b73bec6fab382a96691e91a8b39af1491f53da0d `](<https://github.com/lucioduran/structured-output-contracts/commit/b73bec6fab382a96691e91a8b39af1491f53da0d>)\n- Fecha del informe (UTC): 2026-10-21T22:58:44.050791+00:00\n- Release publicada: [v0.1.0](<https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0>) · 2026-10-21T23:02:50Z\n\n- [README y uso](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/README.md>)\n- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json>)\n- [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/summary.json>)\n- [Respuestas y trazas originales](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/trace.jsonl>)\n- [Evidencia de desarrollo](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/dev/manifest.json>)\n- [Diseño y metodología](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md>)\n- [Análisis de errores](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md>)\n- [Datos y procedencia](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/data/README.md>)\n- [Configuración congelada](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/data/freeze.json>)\n- [Modelos, revisiones y licencias](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/model-notices.md>)\n- [Dependencias del entorno medido](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/requirements-local.lock>)\n- [Licencia MIT](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE>)","headings":[{"level":1,"text":"Structured Output Contracts","url":"https://lucioduran.com/es/projects/structured-output-contracts#title"},{"level":2,"text":"Problema y utilidad para agentes","url":"https://lucioduran.com/es/projects/structured-output-contracts#problem"},{"level":2,"text":"Arquitectura","url":"https://lucioduran.com/es/projects/structured-output-contracts#architecture"},{"level":2,"text":"Qué demuestra","url":"https://lucioduran.com/es/projects/structured-output-contracts#demonstrates"},{"level":2,"text":"Resultados publicados","url":"https://lucioduran.com/es/projects/structured-output-contracts#results"},{"level":3,"text":"Resultados por modelo y esquema","url":"https://lucioduran.com/es/projects/structured-output-contracts#results-contracts"},{"level":2,"text":"Reproducir","url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce"},{"level":3,"text":"Revisar la evidencia guardada","url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce-replay"},{"level":3,"text":"Repetir la medición local","url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce-inference"},{"level":2,"text":"Alcance y límites","url":"https://lucioduran.com/es/projects/structured-output-contracts#scope"},{"level":2,"text":"Fuentes y revisión","url":"https://lucioduran.com/es/projects/structured-output-contracts#sources"}],"sections":[{"heading":"Structured Output Contracts","level":1,"url":"https://lucioduran.com/es/projects/structured-output-contracts","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Structured Output Contracts"},{"heading":"Structured Output Contracts","level":1,"url":"https://lucioduran.com/es/projects/structured-output-contracts#title","content":"Contratos JSON acotados con validación estricta, rechazos explícitos y reintentos limitados. Compara validez y exactitud con dos modelos Qwen locales y respuestas originales.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE>)\n\nFicha publicada: 2026-10-22 · Ficha actualizada: 2026-10-22\n\n[Repositorio](<https://github.com/lucioduran/structured-output-contracts>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json>) · [Release v0.1.0](<https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0>)"},{"heading":"Problema y utilidad para agentes","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#problem","content":"JSON válido puede contener una respuesta falsa. Una salida truncada, un rechazo y un error de esquema tampoco son el mismo fallo. Mezclarlos en una tasa de éxito única impide entender qué está pasando.\n\nEl proyecto implementa una frontera entre generación y consumo de datos: clasifica cada intento, limita los reintentos y conserva las respuestas inválidas para poder inspeccionarlas."},{"heading":"Arquitectura","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#architecture","content":"1. **Esquemas acotados.** Objetos anidados, uniones discriminadas y límites de strings y arrays dentro de un subconjunto de JSON Schema Draft 2020-12. El parser rechaza entradas inválidas sin reparación silenciosa.\n2. **Política explícita.** Acepta, reconoce un rechazo explícito, reintenta o agota el presupuesto. El experimento limita cada tarea a dos intentos y usa metadatos reales de finalización.\n3. **Evaluación separada.** Qwen2-0.5B-Instruct y Qwen2.5-0.5B-Instruct fijados por revisión generan localmente. La exactitud semántica se calcula aparte, sin usar etiquetas para decidir reintentos.\n\n- [Diseño y metodología](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md>)"},{"heading":"Qué demuestra","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#demonstrates","content":"- Contratos con límites de estructura y tratamiento explícito de rechazo y truncamiento.\n- Contabilidad por esquema de intentos, tokens, tiempo y validez separada de corrección.\n- Preservación de fallos originales y replay de la política sobre trazas congeladas."},{"heading":"Resultados publicados","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#results","content":"Doce tareas reservadas por modelo, cuatro por familia de esquema. Medición CPU float32 en Intel Xeon W-3223 con cuatro hilos. Qwen2 y Qwen2.5 en la tabla son las versiones Instruct de 0,5B parámetros.\n\nLas flechas comparan primer intento y resultado final. Validez y corrección usan todas las tareas como denominador, incluidas abstenciones esperadas. La latencia por tarea suma todos sus intentos y excluye cargar los modelos."},{"heading":"Resultados por modelo y esquema","level":3,"url":"https://lucioduran.com/es/projects/structured-output-contracts#results-contracts","content":"| Modelo / esquema | Válidas: inicial → final | Correctas: inicial → final | Reintentos | Mediana (s) | Máximo (s) |\n| --- | --- | --- | --- | --- | --- |\n| Qwen2 / bounded | 1/4 → 2/4 | 2/4 → 3/4 | 2 | 1.405 | 3.806 |\n| Qwen2 / nested | 0/4 → 0/4 | 0/4 → 0/4 | 1 | 1.336 | 2.155 |\n| Qwen2 / union | 0/4 → 0/4 | 1/4 → 1/4 | 0 | 0.890 | 1.010 |\n| Qwen2.5 / bounded | 0/4 → 0/4 | 0/4 → 1/4 | 4 | 2.005 | 2.745 |\n| Qwen2.5 / nested | 3/4 → 3/4 | 3/4 → 3/4 | 1 | 2.676 | 2.866 |\n| Qwen2.5 / union | 3/4 → 3/4 | 2/4 → 2/4 | 1 | 1.607 | 3.423 |\n\nQwen2 terminó con 2/12 respuestas válidas y 4/12 resultados correctos, incluidas dos abstenciones correctas. Qwen2.5 obtuvo 6/12 y 6/12, con una abstención correcta. Qwen2.5 también produjo un cero inventado que pasó el esquema: validar estructura no verifica hechos.\n\nLos 33 intentos reales incluyen 12 rechazos, siete respuestas malformadas, cuatro violaciones de esquema y dos truncamientos. Los 14 casos inyectados son controles de política separados, no muestras adicionales de modelos. [Análisis de errores](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md>)."},{"heading":"Reproducir","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce","content":"El replay instala dependencias de validación, sin modelos. La reproducción neural descarga aproximadamente 1,9 GiB de snapshots públicos y usa el lock del entorno Intel macOS medido.\n\nEjecutá primero el bloque de replay para crear y activar el entorno. Usá directorios de salida nuevos y una medición a la vez. Las respuestas originales no se reparan ni se reemplazan."},{"heading":"Revisar la evidencia guardada","level":3,"url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce-replay","content":"```\ngit clone https://github.com/lucioduran/structured-output-contracts.git\ncd structured-output-contracts\ngit checkout ac8680a5b15731932da446694b8a0a5ced00d12a\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-dev.txt\npython -m contracts verify --output results/dev\npython -m contracts verify --output results/eval\n```"},{"heading":"Repetir la medición local","level":3,"url":"https://lucioduran.com/es/projects/structured-output-contracts#reproduce-inference","content":"```\npython -m pip install -r requirements-local.lock\npython -m contracts download\nOMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 python -m contracts run --split dev --output build/reproduced-dev\nOMP_NUM_THREADS=4 MKL_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 python -m contracts run --split eval --output build/reproduced-eval\npython -m contracts verify --output build/reproduced-dev\npython -m contracts verify --output build/reproduced-eval\npython -m scripts.injected --output build/injected.json\n```"},{"heading":"Alcance y límites","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#scope","content":"- Dos modelos pequeños de una familia y doce tareas por modelo no establecen confiabilidad de producción ni un ranking general. No hubo revisión humana independiente.\n- Se evalúa JSON solicitado por prompt con validación y reintentos. No incluye decodificación restringida por gramática ni productos alojados de structured output.\n- La igualdad exacta de JSON es una métrica conservadora, no una medida general de factualidad. Los límites de estructura no implementan un timeout duro ni un sandbox.\n- Una observación temporal por tarea. API paga: USD 0; electricidad, hardware y tiempo de operación no medidos.\n\n- [Function calling y contratos de salida de agentes](<https://lucioduran.com/es/blog/llm-function-calling-tool-use-patterns>)"},{"heading":"Fuentes y revisión","level":2,"url":"https://lucioduran.com/es/projects/structured-output-contracts#sources","content":"Los valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` ac8680a5b15731932da446694b8a0a5ced00d12a `](<https://github.com/lucioduran/structured-output-contracts/commit/ac8680a5b15731932da446694b8a0a5ced00d12a>)\n- Revisión registrada por el experimento: [` b73bec6fab382a96691e91a8b39af1491f53da0d `](<https://github.com/lucioduran/structured-output-contracts/commit/b73bec6fab382a96691e91a8b39af1491f53da0d>)\n- Fecha del informe (UTC): 2026-10-21T22:58:44.050791+00:00\n- Release publicada: [v0.1.0](<https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0>) · 2026-10-21T23:02:50Z\n\n- [README y uso](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/README.md>)\n- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json>)\n- [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/summary.json>)\n- [Respuestas y trazas originales](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/trace.jsonl>)\n- [Evidencia de desarrollo](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/dev/manifest.json>)\n- [Diseño y metodología](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md>)\n- [Análisis de errores](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md>)\n- [Datos y procedencia](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/data/README.md>)\n- [Configuración congelada](<https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/data/freeze.json>)\n- [Modelos, revisiones y licencias](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/model-notices.md>)\n- [Dependencias del entorno medido](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/requirements-local.lock>)\n- [Licencia MIT](<https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE>)"}],"links":[{"text":"Proyectos","url":"https://lucioduran.com/es/projects"},{"text":"Lucio Durán","url":"https://lucioduran.com/es"},{"text":"MIT","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE"},{"text":"Repositorio","url":"https://github.com/lucioduran/structured-output-contracts"},{"text":"Evidencia original","url":"https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json"},{"text":"Release v0.1.0","url":"https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0"},{"text":"Diseño y metodología","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md"},{"text":"Resumen de resultados","url":"https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/summary.json"},{"text":"Análisis de errores","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md"},{"text":"Function calling y contratos de salida de agentes","url":"https://lucioduran.com/es/blog/llm-function-calling-tool-use-patterns"},{"text":"ac8680a5b15731932da446694b8a0a5ced00d12a","url":"https://github.com/lucioduran/structured-output-contracts/commit/ac8680a5b15731932da446694b8a0a5ced00d12a"},{"text":"b73bec6fab382a96691e91a8b39af1491f53da0d","url":"https://github.com/lucioduran/structured-output-contracts/commit/b73bec6fab382a96691e91a8b39af1491f53da0d"},{"text":"v0.1.0","url":"https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0"},{"text":"README y uso","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/README.md"},{"text":"Respuestas y trazas originales","url":"https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/trace.jsonl"},{"text":"Evidencia de desarrollo","url":"https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/dev/manifest.json"},{"text":"Datos y procedencia","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/data/README.md"},{"text":"Configuración congelada","url":"https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/data/freeze.json"},{"text":"Modelos, revisiones y licencias","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/model-notices.md"},{"text":"Dependencias del entorno medido","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/requirements-local.lock"},{"text":"Licencia MIT","url":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com/"},{"@type":"WebSite","@id":"https://lucioduran.com/#website","url":"https://lucioduran.com/","name":"Lucio Durán","inLanguage":["en","es"],"publisher":{"@id":"https://lucioduran.com/#person"}},{"@type":"WebPage","@id":"https://lucioduran.com/es/projects/structured-output-contracts#page","url":"https://lucioduran.com/es/projects/structured-output-contracts","name":"Structured Output Contracts","description":"Contratos JSON acotados con validación estricta, rechazos explícitos y reintentos limitados. Compara validez y exactitud con dos modelos Qwen locales y respuestas originales.","inLanguage":"es","author":{"@id":"https://lucioduran.com/#person"},"publisher":{"@id":"https://lucioduran.com/#person"},"isPartOf":{"@id":"https://lucioduran.com/#website"},"isAccessibleForFree":true,"mainEntity":{"@id":"https://lucioduran.com/projects/structured-output-contracts#software"},"datePublished":"2026-10-22","dateModified":"2026-10-22","breadcrumb":{"@id":"https://lucioduran.com/es/projects/structured-output-contracts#breadcrumb"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/structured-output-contracts#software","name":"Structured Output Contracts","description":"Contratos JSON acotados con validación estricta, rechazos explícitos y reintentos limitados. Compara validez y exactitud con dos modelos Qwen locales y respuestas originales.","url":"https://lucioduran.com/es/projects/structured-output-contracts","codeRepository":"https://github.com/lucioduran/structured-output-contracts","programmingLanguage":"Python","runtimePlatform":"Python 3.11.13","license":"https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/LICENSE","version":"v0.1.0","identifier":{"@type":"PropertyValue","propertyID":"git-commit","value":"ac8680a5b15731932da446694b8a0a5ced00d12a"},"author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/README.md","https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/manifest.json","https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/summary.json","https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/eval/trace.jsonl","https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/results/dev/manifest.json","https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/design.md","https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/error-analysis.md","https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/data/README.md","https://raw.githubusercontent.com/lucioduran/structured-output-contracts/ac8680a5b15731932da446694b8a0a5ced00d12a/data/freeze.json","https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/docs/model-notices.md","https://github.com/lucioduran/structured-output-contracts/blob/ac8680a5b15731932da446694b8a0a5ced00d12a/requirements-local.lock","https://github.com/lucioduran/structured-output-contracts/releases/tag/v0.1.0"],"publisher":{"@id":"https://lucioduran.com/#person"},"mainEntityOfPage":{"@id":"https://lucioduran.com/es/projects/structured-output-contracts#page"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Proyectos","item":"https://lucioduran.com/es/projects"},{"@type":"ListItem","position":2,"name":"Structured Output Contracts","item":"https://lucioduran.com/es/projects/structured-output-contracts"}],"@id":"https://lucioduran.com/es/projects/structured-output-contracts#breadcrumb"}]}],"contentHash":"6e83c9d474a14e7128c94c58b3fd3296bfcc2f7ff3fdc93e163575eba69fb6ce","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/es/projects/structured-output-contracts","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":49044,"contentBytes":8915}}
