Dossiers .bl.org que responden
Un dossier es un único archivo .bl.org. Es la fuente, la página, el
spec ejecutable y la hoja de respuestas. Un pequeño servidor Beam Lisp (el kit, junto
a este archivo) lo renderiza con la partición real bl.doc.spans, lo publica en
la tailnet, y escribe cada respuesta que el lector da en el bloque que responde.
Sin base de datos, sin segunda copia: git diff muestra lo que Othman dijo.
Ejemplar, léelo antes de escribir uno nuevo:
~/projects/tiny-tools/mobile-app/dossier/pocket-harness.bl.org (renombrado de baton.bl.org el 2026-10-31).
Un ejemplar con mucho escritorio y un ciclo de vida ejecutable:
~/projects/knowledger-interface-review/docs/reports/interface-review-20261031/knowledger-interface.bl.org.
Casa de la que desciende: ~/code/undefine/omega/spikes/mobile/design-review/design-review.bl.org.
El ciclo
- Investiga primero. Sustenta cada afirmación en una ruta de archivo, un comando que ejecutaste o una fuente citada.
- Escribe
NOMBRE.bl.org(estructura abajo). Las celdas no llevan#+RESULTSescritas a mano — deja quebl doc runlas escriba. bl doc run ARCHIVO.bl.orgy luegobl doc run ARCHIVO.bl.org --check(salida 0 = celdas verdes y resultados actualizados).- Míralo con ancho de teléfono antes de afirmar nada (ver Verlo).
- Publica:
El archivo env contienework serve NOMBRE --http auto --cwd ~/.claude/skills/bl-org-dossier/kit \ --env-file ~/.config/baton-dossier/service.env --ready-timeout 120 \ -- /etc/profiles/per-user/othman/bin/bl serve serve.bl -- /abs/path/NOMBRE.bl.orgDOSSIER_OWNER=el inicio de sesión de Tailscale del propietario; solo esa identidad puede responder (Serve estableceTailscale-User-Login; verificado el 2026-10-31).DOSSIER_HANDLE=timinoues el nombre que llevan las respuestas en:by; un inicio de sesión (un correo) nunca se escribe en el archivo. El servidor relee el archivo por petición: editar el.bl.orgno necesita reinicio. Editar el código.bldel kit sí:work restart NOMBRE. - Lee las respuestas:
Las respuestas viven en el encabezado del bloque:bl run ~/.claude/skills/bl-org-dossier/kit/answers.bl -- /abs/path/NOMBRE.bl.org:answer B :at "2026-10-31 17:14" :note "…". Actúa sobre ellas, actualiza el dossier (cambia el:statusde una decisión adecided, mueve un encabezado del roster a DONE) y di qué cambió.
Forma (el gusto de Othman)
Abre con la tesis, termina con lo que debe decidir. En medio, gana cada sección.
#+title:nombra la cosa y su promesa.#+subtitle:una oración.#+kicker:dónde vive.#+status:honesto (Propuesta · nada construido aún).- En una sola respiración —
lede+stats. Dos párrafos cortos, cuatro números. - Define las palabras —
termspara cada sustantivo que uses. Si una frase como "sin fisuras" carga la petición, sepárala en las promesas separadas que esconde, y di qué no significa nunca (honest). - Jobs — un
jobpor momento de uso, cada uno con la forma del producto de referencia y una decisión. - Pantallas — bloques
screen, dibujados desde texto. Nombres reales, repos reales, máquinas reales del entorno real — nunca lorem ipsum. - Cómo funciona realmente —
sequencepara cualquier cosa que cruce un cable;graphpara topología;rosettapara una idea a través de varios sistemas. - El modelo, ejecutable — Celdas Beam Lisp con
asserts que fijan los invariantes del diseño. El resultado impreso bajo cada celda es la prueba. - Arte previo —
matrix, fuentes listadas, afirmaciones de terceros etiquetadas como de docs. - Decisiones (
decision, con las opciones rechazadas visibles) → Preguntas (ask) → Roster (* TODO/DONEcon:PROPERTIES::JOBS: :AREA: :PROTO:). - El texto es corto. La colocación y el peso comunican estado. Sin adjetivos de marketing. Di qué no está verificado.
Componentes
Atributos de encabezado: :key valor o :key "valor entre comillas". Los cuerpos son lenguajes de línea; filas a | b | c a menos que se indique.
| Bloque | Cuerpo | Renderizado |
|---|---|---|
lede | prosa | apertura serif grande |
stats | valor | etiqueta | nota | mosaicos de estadísticas |
terms | término | significado | lista de definiciones |
principles | título | texto | tarjetas numeradas |
note / warning / honest (:title) | prosa | llamadas (pizarra / arcilla / ocre) |
rosetta | primera fila = encabezados | tabla alineada; tarjetas en un teléfono |
matrix | primera fila = encabezados; celdas y, ~, n + palabras opcionales | matriz de puntos con leyenda |
job :id :title :codex :claude :decision :screen | la oración JTBD | tarjeta de job + respuesta |
decision :id :title :status proposed|decided | - [x] elegida, - [ ] rechazada, luego justificación | tarjeta de decisión + Aceptar/Reelaborar/Desacuerdo |
ask :id :title :options "A|B|C" | contexto | tarjeta de pregunta + opciones |
screen :id :title :job :caption [:theme dark] | lenguaje de pantalla (abajo) | maqueta de teléfono + reacción; pantallas consecutivas forman una tira deslizable |
desk :id :title :job :caption [:url] | lenguaje de escritorio (abajo) | marco de app de escritorio + reacción; mismos botones de respuesta que las pantallas |
sequence :title | lanes a · sub | b · sub, a -> b : etiqueta (llamada), a --> b : etiqueta (respuesta), a => b : etiqueta (el momento clave), note a, b : texto, == divisor | SVG en pantallas anchas, pasos numerados en teléfonos |
graph :title | node id | etiqueta | sub | col,row | tono (you door station builder foreign), edge a -> b | etiqueta | estilo (baton solid dash none; <->, -- también) | SVG topología |
schema :id :title | sin sangría entity @icon | glosa; con sangría attr tipo | nota. Tipos: text date, -> kind (ref), ->> kind (muchos), a > b / c (flujo de estado), a, b, c (enum) | tarjetas de entidad, refs enlazan a #entity-NOMBRE, un conteo de entidades · atributos · estados; respondible |
procedure :id :title :makes | step @icon Título | quién | nombre · tipo, … (produce; un tercer · borrador = el arnés lo redacta al iniciar la tarea), check @icon Título | quién | nombre, … (consejo de un verificador, agente o persona), gate @icon Título | quién | nombre, … (espera entrega); quién nombra un rol; otras líneas son prosa | un carril de pasos, checks discontinuos, gates como diamantes; respondible |
Un bloque schema o procedure también es la fuente que una celda puede compilar: bl doc run
pasa el archivo en (BeamLisp/argv), así que una celda puede leer su propio bloque y convertirlo en
atributos de datom o tareas (ejemplar: team-machine/design/work/WORK.bl.org, celdas spine, procedure).
Lenguaje de pantalla, un verbo por línea: bar Título | right (< Título añade atrás), sub, chips a* | b (* = seleccionado),
section Etiqueta | count, card tono | título | meta | cuerpo (tonos turn approve run done fail idle),
ask, actions Principal! | Plano | Tranquilo? | Peligro^, msg tú|agente | texto, tool etiqueta | detalle,
diff +12 −3 | ruta, code texto, strip tono | texto | botón, row etiqueta | valor, banner warn|ok | texto,
dest icono | título | cuerpo, note, spacer, input placeholder | ↑, tabs A* | B,
lock hora | fecha + notif app | título | cuerpo | Acción, Acción (con :theme dark),
sheet Título — todo lo que sigue se coloca en una hoja inferior sobre la pantalla.
card tono | título | meta | cuerpo | @check! @x @next? — una quinta columna pone acciones solo de icono en la tarjeta
(di lo que se necesita en la tarjeta, mantén las acciones como iconos; Othman encuentra las filas de botones difíciles de analizar),
machine tono | @server nombre | rol | detalle | right (tonos up busy asleep you),
search placeholder + pick @carpeta nombre* | detalle | right (un selector de proyecto, * = elegido),
listen pista (micrófono + forma de onda), heard transcripción, intent @enviar Verbo | destino | texto (voz),
choices A | B* | C (una pregunta de opción múltiple, * = elegida), reply placeholder (una respuesta de texto libre con micrófono y enviar).
Los datos secundarios en pick y machine fluyen hacia el texto; las acciones de tarjeta se colocan bajo las palabras.
Lenguaje de escritorio — cada verbo de pantalla, más regiones de escritorio y un documento:
nav @home Inicio* | @matter Asuntos (barra lateral, * = aquí), crumb a › b,
head Título | tono · Estado | Acción! | Otra? (el espacio de acción, arriba a la derecha), meta a | b, tabs,
col doc|rail|main (columnas; doc dibuja papel; repite col main para una fila de cartas),
page Título, para texto con {+insertado+} {-eliminado-} {~propuesto~} {!por verificar!} ‹P-01› (chip de fuente) ^1 (ancla de comentario),
point tono | @icon tipo | título | cuerpo | Opción* | Opción, comment 1 | quién | texto (mismo número que su ^1), opts A* | B.
Las líneas antes del primer col abarcan todo el ancho. Los escritorios usan la paleta Warm Signal de Knowledger (lámpara en modo oscuro).
Iconos: @nombre en cualquier lugar de una línea de pantalla o escritorio dibuja un icono lineal — home matter library playbook people audit settings search plus send file word check x alert clock user bot chat comment link seal eye edit version diff filter more back next down up bell wait calendar scale flag play undo lock attach grid list board split spark. Prefiere un icono a una palabra para tipos de cosas.
Bloques respondibles: ask decision screen desk job schema procedure. Cada uno necesita un :id único.
Org plano también funciona: encabezados con palabras clave TODO y etiquetas, cajones :PROPERTIES: (chips),
tablas, listas, casillas de verificación [ ]/[X], =code=, *bold*, /italic/, [[url][etiqueta]], [[#pantalla-ID][etiqueta]].
Celdas ejecutables
#+begin_src beam-lisp :id lifecycle
(ns project.model) ; la primera celda nombra el namespace; todas las celdas lo comparten
(defn advance [s e] …)
(assert (= … …)) ; un assert fallido se convierte en el resultado y --check sale con 1
{:what "el último valor es la prueba impresa"}
#+end_src
Solo #+begin_src beam-lisp en minúsculas (mayúsculas nunca se ejecutan). Modela los
invariantes del diseño (un escritor, orden de efectos, cobertura de un mapeo), no trivialidades.
Trampas de Beam Lisp encontradas al escribir estos (instalado bl, 2026-10-31):
no están en el núcleo — ffirst, reductions, spit, replace, format, parse-long, prn.
Usa File/read!, File/write!, File/rename!, String/replace, Regex/run|scan|split|replace,
erlang/binary_to_integer, (println (pr-str x)). Los argumentos se evalúan de derecha a izquierda.
Nunca nombres una fn pública como una fn del núcleo. Los hijos de Hiccup deben ser seqs (map/for), no vectores:
(map identity v).
Verlo
chromium --headless=new --no-sandbox --hide-scrollbars --window-size=412,16000 \
--virtual-time-budget=5000 --screenshot=/tmp/d.png http://127.0.0.1:PUERTO/
nix shell nixpkgs#imagemagick --command magick /tmp/d.png -crop 412x1000+0+0 +repage /tmp/d0.png
Páginas más altas de 16000 px: guarda el HTML con las section.part anteriores ocultas y captura eso.
Verifica: primero ancho de teléfono, cada diagrama legible, ambos temas, ninguna celda ✗ failed.
Leerlo como una app
En una pantalla ancha la página es una app de dos columnas sin cambios en el archivo: cada
encabezado de nivel 1 se convierte en una página en una barra lateral (con sus encabezados de nivel 2 debajo
cuando está abierta). Una sección muestra cuántas respuestas espera todavía, un ✓ una vez
respondido, y un roster con su DONE/total. Una sección se muestra a la vez, con
anterior/siguiente al pie y ←/→ para moverse. #all (« Documento completo ») muestra
todo; cualquier #ancla abre la sección que lo contiene. En un teléfono los chips
cambian de sección de la misma manera. Escribe los encabezados de nivel 1 como las páginas del informe y
de nivel 2 como sus partes.
Lenguajes de diseño
Las maquetas pueden usar el lenguaje de diseño real de un producto. #+design: forest al principio de un
dossier dibuja cada screen y desk en él (un bloque puede anular con :design NOMBRE,
o excluirse con :design none); las líneas de la maqueta no cambian. Prefiere el lenguaje propio del producto
sobre la paleta predeterminada del kit cuando exista.
Un lenguaje es un módulo literario, kit/dossier/design/NOMBRE.bl.org, cuyas celdas son el namespace
dossier.design.NOMBRE: tokens (claro y oscuro), escala tipográfica, radios, sombras,
tokens de movimiento, y el CSS que reasigna las variables de maqueta del kit. Regístralo en
kit/dossier/design.bl. El mismo archivo es su página de muestra, a través de cuatro bloques que se dibujan
sí mismos desde el módulo: #+begin_palette, #+begin_type, #+begin_shape,
#+begin_motion (cada uno con :design NOMBRE, cuerpo vacío). Mantén una celda parity que verifique
los tokens contra el CSS enviado del producto; la prueba del kit afirma que no hay desviación.
Enviado: forest — Nurturing Forest, el equipo de máquina de Ora (design/forest.bl.org,
publicado como el servicio forest-language).
Kit
kit/serve.bl (rutas / /doc /rev /src /answers POST /answer), kit/answers.bl,
kit/dossier/{org,attrs,ui,page,answer,design}.bl (puro), kit/dossier/design/*.bl.org,
kit/style.css, kit/live.js.
Pruebas: bl test -p ~/.claude/skills/bl-org-dossier/kit kit/test/kit_test.bl.
Un nuevo componente = una fn -h en ui.bl, un caso en block->h, CSS, una aguja en la prueba.
Las respuestas se escriben mediante patch-line: solo :answer :note :at :by cambian; cada otro byte del archivo permanece.
La skill vive en ~/projects/enchanted-skills/bl-org-dossier (el repo público
undefine-org/enchanted-skills); ~/.claude/skills/bl-org-dossier es un enlace simbólico a él.
Es compartida por cada sesión que usa esta skill. Haz commit a medida que avanzas, una idea por
commit, y organiza solo tus propios archivos (git status primero: otra sesión puede estar en medio de una edición). Un
work restart de un servicio de dossier carga lo que esté en disco, incluyendo ediciones sin commit.
Mantén las respuestas de un lector en su propio commit en el repo del dossier, para que git diff muestre lo que dijeron.