{"schemaVersion":1,"id":"https://lucioduran.com/es/projects/citable-publication","url":"https://lucioduran.com/es/projects/citable-publication","title":"Citable Publication","description":"Publicación determinista en HTML, Markdown y JSON desde un único corpus, con verificación de integridad antes de publicar y fallos reproducibles.","language":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","contentFormat":"text/markdown","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Citable Publication\n\n# Citable Publication\n\nPublicación determinista en HTML, Markdown y JSON desde un único corpus, con verificación de integridad antes de publicar y fallos reproducibles.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.13.7 · Licencia: [MIT](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/citable-publication>) · [Informe de fallos](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json>)\n\n## Problema y utilidad para agentes\n\nUna URL canónica correcta no garantiza que un agente reciba el contenido completo. Una exportación puede perder código, truncar una tabla o cambiar el esquema JSON sin alterar esa URL. Citable Publication define un contrato de publicación y rechaza los archivos que se apartan de él.\n\nPara citar una fuente, un agente necesita recuperar el pasaje correcto y conservar su contexto. Este proyecto aborda una parte concreta de ese problema: preservar contenido y referencias entre formatos y detectar divergencias antes de publicar.\n\n## Arquitectura\n\n1. **Contrato de entrada.** Un corpus JSON validado se transforma en un modelo inmutable. Cada documento declara una URL HTTPS canónica y cada sección tiene un identificador estable.\n2. **Tres representaciones.** El mismo modelo genera HTML, Markdown y JSON. Un manifiesto registra rutas, tipos de contenido, tamaños y hashes SHA-256.\n3. **Verificación contra la fuente.** El verificador regenera los bytes esperados desde el corpus original. No toma el manifiesto como autoridad: modificar un archivo y actualizar su hash también produce un rechazo.\n4. **Publicación condicionada.** La salida se construye en un directorio temporal, se verifica y se renombra al destino. Se exige un destino nuevo y se informan los errores por archivo y documento.\n\n- [Diseño y garantías](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md>)\n- [Contrato de entrada](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md>)\n\n## Qué demuestra\n\n- Diseño de contratos de datos y referencias citables, con generación determinista desde una fuente común.\n- Control de integridad que detecta pérdida de contenido, archivos faltantes y cambios de esquema antes de promover una publicación.\n- Evaluación reproducible mediante inyección de fallos, control limpio, comparación explícita y resultados inspeccionables.\n\n## Resultados publicados\n\nResultados publicados por el autor en el repositorio. La comparación usa el mismo corpus de tres documentos sintéticos originales. El control básico comprueba únicamente las URL canónicas del HTML; el control completo verifica la publicación contra su fuente.\n\nSe restaura la salida original antes de cada caso y se comprueba que la mutación cambió bytes. Las seis clases de fallo afectan a la URL canónica, versión del esquema JSON, código Markdown, tablas HTML, ausencia de JSON y vaciado del manifiesto.\n\n### Comparación de los controles\n\n| Medición | Solo URL canónica | Control completo |\n| --- | --- | --- |\n| Controles limpios aceptados | 1 / 1 | 1 / 1 |\n| Fallos inyectados rechazados | 3 / 18 | 18 / 18 |\n| Fallos inyectados no detectados | 15 / 18 | 0 / 18 |\n\nSon 18 casos de una matriz fija, no 18 clases de fallo ni una estimación de eficacia sobre sitios arbitrarios. El manifiesto vacío repite el mismo fallo global tres veces. La medición evalúa corrección, no velocidad, posicionamiento ni probabilidad de que un modelo cite una fuente.\n\nEl informe limpio cubre 3 documentos y 10 archivos, incluido el manifiesto. [Informe de publicación limpia](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json>).\n\n## Reproducir\n\nSin dependencias de ejecución, llamadas a modelos ni servicios pagos. Los comandos de compilación y verificación imprimen informes JSON; la verificación correcta termina con código 0.\n\nUsá Python 3.13.7 y un directorio de salida que todavía no exista. Guardá los informes fuera del directorio publicado. La revisión está fijada para consultar el mismo código y las mismas fuentes de esta ficha. La ejecución local generará sus propios metadatos de entorno y fecha.\n\n### Compilación y verificación\n\n```\ngit clone https://github.com/lucioduran/citable-publication.git\ncd citable-publication\ngit checkout 1a265730b7e0acdd3d326bd3fb7704f71e15edec\npython -m citable_publication build --corpus examples/corpus.json --output dist/first-release\npython -m citable_publication verify --corpus examples/corpus.json --output dist/first-release\npython -m experiments.reproduce --output build/reproduction.json\n```\n\n## Alcance y límites\n\n- Es una implementación independiente inspirada en los requisitos de lucioduran.com. No audita ni certifica esta web en producción.\n- El corpus admite documentos en inglés con párrafos literales, bloques de código, tablas rectangulares y secciones. No admite imágenes, listas, texto enriquecido ni documentos multilingües. Esta ficha sí está traducida.\n- La comparación exacta de bytes también rechaza cambios de formato inocuos. El verificador y el renderizador comparten código: un error compartido puede escapar al control.\n- Las tablas Markdown y las anclas HTML dependen del soporte del lector. SHA-256 identifica bytes, no autoría ni veracidad.\n- Requiere un sistema de archivos confiable con un único escritor. El directorio temporal no garantiza exclusión entre despliegues ni durabilidad ante un corte de energía. Servir contenido e invalidar cachés queda fuera del alcance.\n- El corpus se carga en memoria. Las entradas no confiables necesitan límites externos de tamaño; declarar el idioma no equivale a detectarlo.\n\n- [Cómo se publica y se accede al contenido de esta web](<https://lucioduran.com/es/access>)\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: [` 1a265730b7e0acdd3d326bd3fb7704f71e15edec `](<https://github.com/lucioduran/citable-publication/commit/1a265730b7e0acdd3d326bd3fb7704f71e15edec>)\n- Revisión registrada por el experimento: [` 150b2d3f5059bf0cef5cd7dde441896539ad4d6e `](<https://github.com/lucioduran/citable-publication/commit/150b2d3f5059bf0cef5cd7dde441896539ad4d6e>)\n- Fecha del informe (UTC): 2026-10-21T20:48:30.875583+00:00\n- SHA-256 del corpus: ` 059916d1c6d4fbbf15df7fb65ddefe39d2f892bb0caeae494037c04a5675959c `\n\n- [README](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/README.md>)\n- [Diseño y garantías](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md>)\n- [Contrato de entrada](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md>)\n- [Corpus de ejemplo](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/examples/corpus.json>)\n- [Informe de fallos](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json>)\n- [Informe de publicación limpia](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json>)\n- [Licencia MIT](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE>)","headings":[{"level":1,"text":"Citable Publication","url":"https://lucioduran.com/es/projects/citable-publication#title"},{"level":2,"text":"Problema y utilidad para agentes","url":"https://lucioduran.com/es/projects/citable-publication#problem"},{"level":2,"text":"Arquitectura","url":"https://lucioduran.com/es/projects/citable-publication#architecture"},{"level":2,"text":"Qué demuestra","url":"https://lucioduran.com/es/projects/citable-publication#demonstrates"},{"level":2,"text":"Resultados publicados","url":"https://lucioduran.com/es/projects/citable-publication#results"},{"level":3,"text":"Comparación de los controles","url":"https://lucioduran.com/es/projects/citable-publication#results-comparison"},{"level":2,"text":"Reproducir","url":"https://lucioduran.com/es/projects/citable-publication#reproduce"},{"level":3,"text":"Compilación y verificación","url":"https://lucioduran.com/es/projects/citable-publication#reproduce-verification"},{"level":2,"text":"Alcance y límites","url":"https://lucioduran.com/es/projects/citable-publication#scope"},{"level":2,"text":"Fuentes y revisión","url":"https://lucioduran.com/es/projects/citable-publication#sources"}],"sections":[{"heading":"Citable Publication","level":1,"url":"https://lucioduran.com/es/projects/citable-publication","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Citable Publication"},{"heading":"Citable Publication","level":1,"url":"https://lucioduran.com/es/projects/citable-publication#title","content":"Publicación determinista en HTML, Markdown y JSON desde un único corpus, con verificación de integridad antes de publicar y fallos reproducibles.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.13.7 · Licencia: [MIT](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/citable-publication>) · [Informe de fallos](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json>)"},{"heading":"Problema y utilidad para agentes","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#problem","content":"Una URL canónica correcta no garantiza que un agente reciba el contenido completo. Una exportación puede perder código, truncar una tabla o cambiar el esquema JSON sin alterar esa URL. Citable Publication define un contrato de publicación y rechaza los archivos que se apartan de él.\n\nPara citar una fuente, un agente necesita recuperar el pasaje correcto y conservar su contexto. Este proyecto aborda una parte concreta de ese problema: preservar contenido y referencias entre formatos y detectar divergencias antes de publicar."},{"heading":"Arquitectura","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#architecture","content":"1. **Contrato de entrada.** Un corpus JSON validado se transforma en un modelo inmutable. Cada documento declara una URL HTTPS canónica y cada sección tiene un identificador estable.\n2. **Tres representaciones.** El mismo modelo genera HTML, Markdown y JSON. Un manifiesto registra rutas, tipos de contenido, tamaños y hashes SHA-256.\n3. **Verificación contra la fuente.** El verificador regenera los bytes esperados desde el corpus original. No toma el manifiesto como autoridad: modificar un archivo y actualizar su hash también produce un rechazo.\n4. **Publicación condicionada.** La salida se construye en un directorio temporal, se verifica y se renombra al destino. Se exige un destino nuevo y se informan los errores por archivo y documento.\n\n- [Diseño y garantías](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md>)\n- [Contrato de entrada](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md>)"},{"heading":"Qué demuestra","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#demonstrates","content":"- Diseño de contratos de datos y referencias citables, con generación determinista desde una fuente común.\n- Control de integridad que detecta pérdida de contenido, archivos faltantes y cambios de esquema antes de promover una publicación.\n- Evaluación reproducible mediante inyección de fallos, control limpio, comparación explícita y resultados inspeccionables."},{"heading":"Resultados publicados","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#results","content":"Resultados publicados por el autor en el repositorio. La comparación usa el mismo corpus de tres documentos sintéticos originales. El control básico comprueba únicamente las URL canónicas del HTML; el control completo verifica la publicación contra su fuente.\n\nSe restaura la salida original antes de cada caso y se comprueba que la mutación cambió bytes. Las seis clases de fallo afectan a la URL canónica, versión del esquema JSON, código Markdown, tablas HTML, ausencia de JSON y vaciado del manifiesto."},{"heading":"Comparación de los controles","level":3,"url":"https://lucioduran.com/es/projects/citable-publication#results-comparison","content":"| Medición | Solo URL canónica | Control completo |\n| --- | --- | --- |\n| Controles limpios aceptados | 1 / 1 | 1 / 1 |\n| Fallos inyectados rechazados | 3 / 18 | 18 / 18 |\n| Fallos inyectados no detectados | 15 / 18 | 0 / 18 |\n\nSon 18 casos de una matriz fija, no 18 clases de fallo ni una estimación de eficacia sobre sitios arbitrarios. El manifiesto vacío repite el mismo fallo global tres veces. La medición evalúa corrección, no velocidad, posicionamiento ni probabilidad de que un modelo cite una fuente.\n\nEl informe limpio cubre 3 documentos y 10 archivos, incluido el manifiesto. [Informe de publicación limpia](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json>)."},{"heading":"Reproducir","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#reproduce","content":"Sin dependencias de ejecución, llamadas a modelos ni servicios pagos. Los comandos de compilación y verificación imprimen informes JSON; la verificación correcta termina con código 0.\n\nUsá Python 3.13.7 y un directorio de salida que todavía no exista. Guardá los informes fuera del directorio publicado. La revisión está fijada para consultar el mismo código y las mismas fuentes de esta ficha. La ejecución local generará sus propios metadatos de entorno y fecha."},{"heading":"Compilación y verificación","level":3,"url":"https://lucioduran.com/es/projects/citable-publication#reproduce-verification","content":"```\ngit clone https://github.com/lucioduran/citable-publication.git\ncd citable-publication\ngit checkout 1a265730b7e0acdd3d326bd3fb7704f71e15edec\npython -m citable_publication build --corpus examples/corpus.json --output dist/first-release\npython -m citable_publication verify --corpus examples/corpus.json --output dist/first-release\npython -m experiments.reproduce --output build/reproduction.json\n```"},{"heading":"Alcance y límites","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#scope","content":"- Es una implementación independiente inspirada en los requisitos de lucioduran.com. No audita ni certifica esta web en producción.\n- El corpus admite documentos en inglés con párrafos literales, bloques de código, tablas rectangulares y secciones. No admite imágenes, listas, texto enriquecido ni documentos multilingües. Esta ficha sí está traducida.\n- La comparación exacta de bytes también rechaza cambios de formato inocuos. El verificador y el renderizador comparten código: un error compartido puede escapar al control.\n- Las tablas Markdown y las anclas HTML dependen del soporte del lector. SHA-256 identifica bytes, no autoría ni veracidad.\n- Requiere un sistema de archivos confiable con un único escritor. El directorio temporal no garantiza exclusión entre despliegues ni durabilidad ante un corte de energía. Servir contenido e invalidar cachés queda fuera del alcance.\n- El corpus se carga en memoria. Las entradas no confiables necesitan límites externos de tamaño; declarar el idioma no equivale a detectarlo.\n\n- [Cómo se publica y se accede al contenido de esta web](<https://lucioduran.com/es/access>)"},{"heading":"Fuentes y revisión","level":2,"url":"https://lucioduran.com/es/projects/citable-publication#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: [` 1a265730b7e0acdd3d326bd3fb7704f71e15edec `](<https://github.com/lucioduran/citable-publication/commit/1a265730b7e0acdd3d326bd3fb7704f71e15edec>)\n- Revisión registrada por el experimento: [` 150b2d3f5059bf0cef5cd7dde441896539ad4d6e `](<https://github.com/lucioduran/citable-publication/commit/150b2d3f5059bf0cef5cd7dde441896539ad4d6e>)\n- Fecha del informe (UTC): 2026-10-21T20:48:30.875583+00:00\n- SHA-256 del corpus: ` 059916d1c6d4fbbf15df7fb65ddefe39d2f892bb0caeae494037c04a5675959c `\n\n- [README](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/README.md>)\n- [Diseño y garantías](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md>)\n- [Contrato de entrada](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md>)\n- [Corpus de ejemplo](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/examples/corpus.json>)\n- [Informe de fallos](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json>)\n- [Informe de publicación limpia](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json>)\n- [Licencia MIT](<https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/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/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE"},{"text":"Repositorio","url":"https://github.com/lucioduran/citable-publication"},{"text":"Informe de fallos","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json"},{"text":"Diseño y garantías","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md"},{"text":"Contrato de entrada","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md"},{"text":"Informe de publicación limpia","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json"},{"text":"Cómo se publica y se accede al contenido de esta web","url":"https://lucioduran.com/es/access"},{"text":"1a265730b7e0acdd3d326bd3fb7704f71e15edec","url":"https://github.com/lucioduran/citable-publication/commit/1a265730b7e0acdd3d326bd3fb7704f71e15edec"},{"text":"150b2d3f5059bf0cef5cd7dde441896539ad4d6e","url":"https://github.com/lucioduran/citable-publication/commit/150b2d3f5059bf0cef5cd7dde441896539ad4d6e"},{"text":"README","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/README.md"},{"text":"Corpus de ejemplo","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/examples/corpus.json"},{"text":"Licencia MIT","url":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://lucioduran.com/es/projects/citable-publication#page","url":"https://lucioduran.com/es/projects/citable-publication","name":"Citable Publication","description":"Publicación determinista en HTML, Markdown y JSON desde un único corpus, con verificación de integridad antes de publicar y fallos reproducibles.","inLanguage":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","author":{"@id":"https://lucioduran.com/#person"},"mainEntity":{"@id":"https://lucioduran.com/projects/citable-publication#software"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/citable-publication#software","name":"Citable Publication","description":"Publicación determinista en HTML, Markdown y JSON desde un único corpus, con verificación de integridad antes de publicar y fallos reproducibles.","url":"https://lucioduran.com/es/projects/citable-publication","codeRepository":"https://github.com/lucioduran/citable-publication","programmingLanguage":"Python","runtimePlatform":"Python 3.13.7","license":"https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/LICENSE","version":"1a265730b7e0acdd3d326bd3fb7704f71e15edec","author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/README.md","https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/design.md","https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/docs/contract.md","https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/examples/corpus.json","https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/reproduction.json","https://github.com/lucioduran/citable-publication/blob/1a265730b7e0acdd3d326bd3fb7704f71e15edec/results/publication.json"]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Proyectos","item":"https://lucioduran.com/es/projects"},{"@type":"ListItem","position":2,"name":"Citable Publication","item":"https://lucioduran.com/es/projects/citable-publication"}]}]}],"contentHash":"08c7338405850c8f72369b8bffd667ae504fa9222533370fdec85a185e107377","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/es/projects/citable-publication","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":41511,"contentBytes":7885}}
