0041 — Organizar la documentación por superficie de entrega (no por tipo de lector): dos superficies + un mediador¶
- Estado: Aceptada
- Fecha: 2026-06-29
- Decidido por: Product Owner humano (decisión acordada 2026-06-29). Las decisiones
concretas —no forkear el sitio mkdocs por audiencia y mantener Diátaxis; publicar un
llms.txten la raíz del sitio como puerta para IA externa; usar la persona como veneer de navegación (tres puertas por intención hacia un mismo cuerpo); y subirAGENTS.mdal nav— son decisiones del PO. El encuadre —"la documentación se organiza por superficie de entrega, no por tipo de lector: los tres usuarios no son tres árboles de documentación, son dos superficies + un mediador; y la experiencia del agente que opera bib2graph (Claude / ChatGPT / Minimax, con herramientas + Python) es un objetivo de primera clase de la documentación, no un subproducto"— es síntesis de la IA (architect) validada por el PO. - Relacionada con: 0039 (la skill de Claude Code es la
doc operativa del humano no-técnico mediada por IA; vive vendoreada en el wheel, no en el
sitio — este ADR la nombra como pieza del ecosistema, no como sección de mkdocs),
0010/0021 (CLI
agente-native: la superficie machine-legible del sitio —Referencia +
llms.txt— publica el mismo contrato que el CLI expone), 0037/0038 (los 10 verbos del ciclo son lo que la Referencia del CLI autogenerada y elllms.txtdeben enseñar, exactos a la versión publicada), 0040 (tras el retiro de la GUI la única frontera es la CLI agente-native; este ADR alinea la documentación con esa frontera). - No introduce IA (coherente con 0022): es organización
de documentación.
llms.txtes un artefacto markdown que una IA cliente lee; bib2graph no embebe ni invoca ningún modelo. El alcance de este ADR es la documentación del motor determinista, no un producto. - No cambia ningún contrato público. No toca el envelope
schema="1", los exit codes ni el FSM (0021); no alteradocs/API.mdcomo contrato (lo publica mejor). Es net-new: ningún ADR gobernaba hasta hoy la estructura de la documentación. - Origen: la frontera bib2graph (motor determinista) vs. producto, y la constatación de que bib2graph lo consumen cada vez más agentes con herramientas y Python (Claude Code, ChatGPT, Minimax) además de humanos.
Contexto¶
bib2graph lo consumen hoy tres clases de usuario:
- Un humano no-técnico que interactúa vía un asistente de IA (le pide a su agente que use bib2graph; no escribe comandos a mano).
- Una IA que opera el repo o el paquete (Claude Code dentro del clon; ChatGPT / Minimax fuera de
él, ayudando a alguien que hizo
pip install). - Un desarrollador que contribuye a la librería.
La tentación natural es mapear estos tres usuarios a tres árboles de documentación —forkear el
sitio mkdocs en caminos por audiencia—. Eso duplicaría contenido (el mismo quickstart contado
tres veces) y generaría drift: justo lo que el sitio ya combate con include-markdown y fuente
única (mkdocs.yml reusa API.md, ARCHITECTURE.md, los ADRs y los .md de raíz; no copia).
El error del mapeo "un lector = un árbol" es confundir lector con superficie de entrega —el canal físico por donde la documentación llega—. Tres lectores no implican tres cuerpos de documentación; implican distintas puertas al mismo cuerpo. Cuando se separan las superficies reales, los tres lectores colapsan en dos superficies + un mediador:
- Agente DENTRO del repo (p. ej. Claude Code): lee
AGENTS.mdy el código fuente, no el sitio renderizado. mkdocs no le sirve a este lector — ya tiene el árbol de archivos. Su puerta esAGENTS.md(canónica, puertas adentro). - Agente FUERA del repo (p. ej. ChatGPT / Minimax ayudando a alguien que hizo
pip instally no clona el repo, pero tiene herramientas + Python): necesita una puerta publicada y machine-legible. Hoy ese es el hueco real: no hay un punto de entrada estable, pensado para una IA, en el sitio público. - Humano navegando: ese sí es el público del sitio mkdocs. El desarrollador es un humano navegando con una intención distinta (contribuir), no una tercera superficie.
El sitio ya es Diátaxis (Empezar/Tutoriales/Guías/Referencia/Explicación, ver mkdocs.yml
nav:). Diátaxis sirve a la vez al humano y a la IA: la sección Referencia es por naturaleza
machine-grade (la API de Python por mkdocstrings, el CLI por mkdocs-click, los contratos en
API.md). El problema no es la estructura del sitio; es la falta de una puerta para la IA externa
y el riesgo de forkearlo por audiencia.
Decisión¶
La documentación de bib2graph se organiza por superficie de entrega: dos superficies (agente dentro del repo / humano-y-agente navegando el sitio) más un mediador (la puerta machine-legible para la IA externa). NO se forkea el sitio por audiencia; las tres intenciones de uso entran por puertas de navegación distintas a un mismo cuerpo Diátaxis. La experiencia del agente que opera bib2graph (Claude / ChatGPT / Minimax, con herramientas + Python) es un objetivo de primera clase de la documentación.
(1) Mantener Diátaxis; no forkear el sitio por audiencia¶
La estructura del sitio (Empezar / Tutoriales / Guías / Referencia / Explicación) se conserva. Sirve al humano y a la IA a la vez; la Referencia es la cara machine-grade y se mantiene autogenerada (mkdocstrings + mkdocs-click) para que no derive de la verdad del código. No se crea un árbol "para IA" ni un árbol "para devs" paralelos: sería el quickstart contado tres veces y drift garantizado. Un edificio, no tres edificios.
(2) Publicar llms.txt en la raíz del sitio — la puerta de la IA externa¶
Se agrega un llms.txt en la raíz del sitio publicado (/llms.txt), siguiendo el estándar
emergente llmstxt.org, con un llms-full.txt opcional para el volcado
extendido. Es la versión pública de lo que AGENTS.md hace puertas adentro: un mapa conciso,
machine-legible, de qué es bib2graph, cómo se instala, cuál es el ciclo (los 10 verbos del 0037) y
dónde está la Referencia. Cierra el hueco del agente FUERA del repo: un ChatGPT / Minimax con
acceso a la web y a Python puede leer /llms.txt, entender la superficie y operar el CLI sin clonar.
Debe ser derivado, no escrito a mano: su fuente natural es AGENTS.md + la referencia del CLI
autogenerada (mkdocs-click); generarlo en el build evita el drift que un llms.txt redactado a mano
reintroduciría. (El cómo generarlo —script/plugin en el pipeline de mkdocs build— es trabajo
del coder; este ADR fija que existe, dónde vive y de qué se deriva, no la implementación.)
(3) La persona como veneer de navegación, no como fork de contenido¶
En docs/index.md se ofrecen tres puertas de entrada por intención que enrutan al mismo cuerpo
Diátaxis:
- (a) "Quiero explorar literatura" → Empezar / Tutoriales / Guías.
- (b) "Soy una IA y voy a operar bib2graph" →
llms.txt+ Referencia (CLI/API) +AGENTS.md. - (c) "Quiero contribuir" → Contribuir / Arquitectura / ADRs.
Tres puertas, un edificio. La persona vive en la navegación (un veneer de enrutamiento), no en el contenido (que sigue siendo único). Ningún cuerpo de texto se duplica: las puertas son enlaces a las secciones que ya existen.
(4) Subir AGENTS.md al nav del sitio — la bisagra entre superficies¶
AGENTS.md hoy no aparece en el nav (mkdocs.yml lo excluye implícitamente; solo lo ven los
agentes dentro del repo). Se sube al nav como bisagra explícita entre superficies:
enlazable y citable desde el sitio, vía el mismo patrón include-markdown que ya usa
docs/contributing.md para CONTRIBUTING.md (un shim fino que incluye ../AGENTS.md). Así la
puerta (b) tiene un destino navegable y el llms.txt un ancla pública, sin duplicar la verdad de
AGENTS.md.
El objetivo de primera clase: cómo operar bib2graph desde una IA¶
Este ADR fija como objetivo de diseño que un agente con herramientas + Python pueda operar bib2graph leyendo la documentación. Las dos rutas, explícitas:
- Agente DENTRO del repo (Claude Code) → lee
AGENTS.md+ el código. Ya cubierto; el sitio no le agrega nada. - Agente FUERA del repo (ChatGPT / Minimax, tras
pip install bib2graph) → lee/llms.txten el sitio + la Referencia del CLI publicada (los 10 verbos del 0037, exactos a la versión) y corre el cicloinit→seed→chain→build→readleyendostatuscomo mapa.
La skill de bib2graph (ADR 0039) es la doc operativa
del humano no-técnico mediada por IA: vive vendoreada en el wheel y se instala con b2g skill
add, no es una sección del sitio. Es pieza del ecosistema de documentación —complementa este
ADR— pero su superficie de entrega es el wheel, no mkdocs.
Consecuencias¶
Lo que se gana
- Una sola fuente de verdad con puertas por intención. Se evita el fork por audiencia y el
quickstart triplicado; el sitio sigue siendo el cuerpo único que
include-markdownya garantiza. - Se cierra el hueco de la IA externa.
llms.txtda a un agente fuera del repo una puerta estable y machine-legible; deja de depender de "que el modelo adivine" navegando HTML pensado para humanos. - La experiencia del agente queda como objetivo declarado, no accidental. Las dos rutas (dentro/fuera del repo) están nombradas; la documentación se diseña para que un agente opere el CLI, no solo para que un humano lea.
AGENTS.mddeja de ser invisible en el sitio. Pasa a ser bisagra citable entre superficies, reusando el patrón de shim que ya existe — sin duplicar contenido.
Lo que cuesta
- Mantener
llms.txtsincronizado. Es el costo central: unllms.txtque enseña verbos que ya no existen miente (mismo riesgo que el 0039 cerró para la skill con el version-lock). Mitigación obligatoria: generarlo delAGENTS.md+ la referencia del CLI en el build, no a mano. Unllms.txtescrito a mano es drift diferido. - Tocar el
navy el pipeline de build. SubirAGENTS.mdal nav (shim + entrada enmkdocs.yml) y generarllms.txtenmkdocs buildson cambios de config/build → trabajo delcoder; este ADR los recomienda y encuadra, no los implementa. docs/index.mdgana las tres puertas por intención. Es trabajo de redacción (documental), no de duplicación: las puertas enlazan a secciones existentes.- Convención de doc nueva que vigilar. "Superficie de entrega, no tipo de lector" hay que sostenerla en cada incorporación: la tentación de forkear por audiencia volverá; este ADR es el ancla para rechazarla.
Alternativas¶
- Forkear el sitio mkdocs en tres caminos por audiencia (humano / IA / dev). Descartada:
triplica el contenido (mismo quickstart tres veces), reintroduce el drift que
include-markdowny la fuente única combaten, y confunde lector con superficie de entrega. Tres lectores no son tres edificios; son tres puertas al mismo edificio. - Abandonar Diátaxis por una estructura "agents-first" propia. Descartada: Diátaxis ya sirve a
humano e IA a la vez —la Referencia es machine-grade por construcción— y es un estándar reconocible.
Reinventar la estructura perdería esa legibilidad sin resolver el hueco real (la puerta para IA
externa), que
llms.txtcubre sin tocar la estructura. - No publicar
llms.txt; confiar en que la IA externa navegue el HTML. Descartada: deja el hueco abierto. Un sitio HTML pensado para humanos es un mal punto de entrada para un agente sin contexto;llms.txtes el estándar emergente justamente para esto y es derivable de fuentes que ya mantenemos. - Escribir
llms.txta mano. Descartada: reintroduce el drift que todo el sitio combate (unllms.txtque enseña una superficie vieja miente, igual que una skill desfasada en el 0039). Debe generarse deAGENTS.md+ la referencia del CLI; si hoy no hay generador, elcoderlo construye antes de publicarlo. - Documentar la operación-por-IA solo en la skill (0039) y no en el sitio. Descartada: la
skill cubre al humano no-técnico con Claude Code; no cubre al agente externo (ChatGPT /
Minimax) ni a quien no instala la skill. La puerta pública del sitio (
llms.txt+ Referencia) y la skill son complementarias, no sustitutas: distintas superficies de entrega del mismo motor.