CommunityProgramación y desarrollogithub.com

undefine-org/bl-org-dossier

Redacta un dossier de diseño/arquitectura como un archivo .bl.org que se renderiza como una página en vivo, apta para móviles, con componentes semánticos (jobs, phone screens, secuencias, grafos, rosettas, matrices, decisiones, preguntas) y celdas Beam Lisp ejecutables — y que escribe las respuestas del lector de vuelta en el archivo para que Claude pueda leerlas. Úsalo cuando Othman pida un dossier, revisión de diseño, propuesta, informe, 'muéstrame la app que imaginas', o cualquier documento de decisión al que deba reaccionar, especialmente desde su teléfono.

¿Qué es bl-org-dossier?

Esta skill convierte un único archivo `.bl.org` en un dossier vivo e interactivo que no solo se renderiza como una página web optimizada para móviles, sino que también permite a Othman (o cualquier lector autorizado) responder directamente desde el archivo. Está diseñada para sesiones de Claude Code (o herramientas similares) donde se necesita una revisión de diseño, una propuesta o un informe de decisiones. El servidor Beam Lisp integrado lee el archivo en cada petición, renderiza componentes semánticos (como `screen`, `decision`, `sequence`, `job`, etc.) y escribe las respuestas del lector como metadatos en el mismo archivo, permitiendo que `git diff` muestre exactamente lo que opinó. La skill incluye un kit completo con soporte para múltiples lenguajes de diseño (como 'forest'), celdas ejecutables para verificar invariantes, y un flujo de trabajo que va desde la escritura hasta la publicación y lectura de respuestas. Es ideal para arquitectos y diseñadores que necesitan mantener un registro claro y versionable de las decisiones y el feedback en proyectos complejos.

Compatible con✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/undefine-org/enchanted-skills/tree/main/bl-org-dossier

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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

  1. Investiga primero. Sustenta cada afirmación en una ruta de archivo, un comando que ejecutaste o una fuente citada.
  2. Escribe NOMBRE.bl.org (estructura abajo). Las celdas no llevan #+RESULTS escritas a mano — deja que bl doc run las escriba.
  3. bl doc run ARCHIVO.bl.org y luego bl doc run ARCHIVO.bl.org --check (salida 0 = celdas verdes y resultados actualizados).
  4. Míralo con ancho de teléfono antes de afirmar nada (ver Verlo).
  5. Publica:
    work 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.org
    
    El archivo env contiene DOSSIER_OWNER= el inicio de sesión de Tailscale del propietario; solo esa identidad puede responder (Serve establece Tailscale-User-Login; verificado el 2026-10-31). DOSSIER_HANDLE=timinou es 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.org no necesita reinicio. Editar el código .bl del kit sí: work restart NOMBRE.
  6. Lee las respuestas:
    bl run ~/.claude/skills/bl-org-dossier/kit/answers.bl -- /abs/path/NOMBRE.bl.org
    
    Las respuestas viven en el encabezado del bloque: :answer B :at "2026-10-31 17:14" :note "…". Actúa sobre ellas, actualiza el dossier (cambia el :status de una decisión a decided, 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 — terms para 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 job por 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 — sequence para cualquier cosa que cruce un cable; graph para topología; rosetta para 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/DONE con :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.

BloqueCuerpoRenderizado
ledeprosaapertura serif grande
statsvalor | etiqueta | notamosaicos de estadísticas
termstérmino | significadolista de definiciones
principlestítulo | textotarjetas numeradas
note / warning / honest (:title)prosallamadas (pizarra / arcilla / ocre)
rosettaprimera fila = encabezadostabla alineada; tarjetas en un teléfono
matrixprimera fila = encabezados; celdas y, ~, n + palabras opcionalesmatriz de puntos con leyenda
job :id :title :codex :claude :decision :screenla oración JTBDtarjeta de job + respuesta
decision :id :title :status proposed|decided- [x] elegida, - [ ] rechazada, luego justificacióntarjeta de decisión + Aceptar/Reelaborar/Desacuerdo
ask :id :title :options "A|B|C"contextotarjeta 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 :titlelanes a · sub | b · sub, a -> b : etiqueta (llamada), a --> b : etiqueta (respuesta), a => b : etiqueta (el momento clave), note a, b : texto, == divisorSVG en pantallas anchas, pasos numerados en teléfonos
graph :titlenode 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 :titlesin 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 :makesstep @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 prosaun 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.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados