CCX, el formato de grafos de conocimiento, ya tiene especificación y lector propio
Chaos Cypher publica el borrador de especificación del formato .ccx y una librería lectora en Python bajo Apache-2.0, usable sin su producto de por medio.

Chaos Cypher ha publicado el borrador de especificación de CCX, el formato de sus archivos .ccx, junto a una librería lectora independiente en Python. La idea es sencilla de enunciar y trabajosa de cumplir: que un grafo de conocimiento exportado se pueda leer dentro de cinco años en una máquina que nunca ha oído hablar del software que lo generó.
El paquete se instala con pip install ccx-format y el import es ccx. Está en el repositorio de la empresa y en PyPI, bajo Apache-2.0, una licencia deliberadamente más permisiva que la del propio Chaos Cypher: un formato que nadie puede implementar es un formato que nadie adopta.
Qué hay dentro de un .ccx
Un .ccx es un ZIP con una disposición fija. La primera entrada es mimetype, sin comprimir. Después vienen manifest.json con metadatos e inventario de miembros, context.jsonld con el contexto JSON-LD embebido, knowledge.jsonld con el grafo por defecto, graphs/<namespace>.<name>.jsonld para los grafos con nombre, sources.jsonl con fuentes y fragmentos, y shapes.ttl opcional para las formas SHACL. Los recursos direccionados por contenido van en assets/sha256/<hex> y las firmas, también opcionales, en signatures/manifest.sig.
De ahí salen las decisiones que hacen que el archivo se pueda confiar y no solo abrir. El empaquetado es determinista: las marcas de tiempo se fijan en 1980-01-01 y los modos de archivo en 0644, así que las mismas entradas producen un archivo idéntico byte a byte, y sumar el checksum de una exportación significa algo. El tipo MIME va en los primeros bytes, con la primera entrada siempre llamada mimetype y conteniendo application/vnd.ccx+zip, el mismo truco que usa EPUB: el fichero se identifica sin descomprimir. Cada grafo y cada recurso lleva doble suma, SHA-256 y SHA-512, y la verificación exige que cuadren las dos. Antes de inflar nada, el lector aplica límites duros: como máximo 100.000 entradas, 512 MiB por entrada y 2 GiB en total, para que un paquete malicioso no pueda reventar al consumidor.
La regla más opinionada es la de los contextos remotos. Un lector conforme rechaza cualquier referencia @context a http(s):// dentro del paquete y carga los grafos con el acceso a red desactivado. Es una propiedad de seguridad, no una preferencia de estilo: el paquete debe ser interpretable sin conexión y para siempre. Las citas sobreviven al viaje porque sources.jsonl guarda un objeto JSON por línea y cada fragmento apunta al texto completo retenido mediante desplazamiento de caracteres.
Clases de conformidad, no un booleano
validate() no devuelve un booleano. Devuelve un informe con errores, avisos y un conjunto de clases de conformidad: core, sources, shapes, embeddings y signed. Por encima de core son capacidades independientes, no una pila, y su ausencia nunca es un error: un paquete se juzga solo por lo que declara y efectivamente trae. Uno sin embeddings no falla, simplemente no obtiene esa clase. Uno que los declara y los trae rotos tampoco falla: acumula avisos y se le retira la clase. Un export completo típico de Chaos Cypher valida como core, sources y shapes.
Hay además CLI, con ccx inspect, ccx validate y ccx pack, para comprobar un paquete sin escribir una línea de código.
Para quien ya usa Chaos Cypher, la exportación no cambia hoy: el archivo es el mismo. Lo que cambia es lo que ese archivo significa. Antes, el .ccx era un detalle de implementación, lo que escribiera el exportador y aceptara el importador. Ahora hay esquema, validador y un segundo programa que lo lee, y la exportación deja de ser una apuesta a que el proveedor siga vivo. Queda por ver si alguien fuera de la casa implementa el formato; la especificación está publicada, el lector es Apache-2.0, y eso es todo lo que hace falta para intentarlo.


