.bl.org-Dossiers, die zurücksprechen
Ein Dossier ist eine .bl.org-Datei. Sie ist die Quelle, die Seite, die
ausführbare Spezifikation und der Antwortbogen. Ein kleiner Beam-Lisp-Server (das Kit neben
dieser Datei) rendert sie mit der echten bl.doc.spans-Partition, veröffentlicht sie im
Tailnet und schreibt jede Antwort des Lesers in den Block, den sie beantwortet.
Keine Datenbank, keine zweite Kopie: git diff zeigt, was Othman gesagt hat.
Beispiel, lesen Sie es, bevor Sie ein neues schreiben:
~/projects/tiny-tools/mobile-app/dossier/pocket-harness.bl.org (umbenannt von baton.bl.org am 31.10.2026).
Ein desktop-lastiges Beispiel mit Schreibtischen und einem ausführbaren Lebenszyklus:
~/projects/knowledger-interface-review/docs/reports/interface-review-20261031/knowledger-interface.bl.org.
Hausgeschmack, von dem es abstammt: ~/code/undefine/omega/spikes/mobile/design-review/design-review.bl.org.
Der Kreislauf
- Zuerst recherchieren. Jede Behauptung auf einen Dateipfad, einen ausgeführten Befehl oder eine zitierte Quelle stützen.
NAME.bl.orgschreiben (Struktur unten). Zellen erhalten keine handgeschriebenen#+RESULTS– lassen Siebl doc runsie schreiben.bl doc run DATEI.bl.orgdannbl doc run DATEI.bl.org --check(Exit 0 = Zellen grün und Ergebnisse aktuell).- Vor dem Behaupten von irgendetwas in Telefonbreite ansehen (siehe Ansehen).
- Veröffentlichen:
Die Env-Datei enthältwork serve NAME --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/pfad/NAME.bl.orgDOSSIER_OWNER=, den Tailscale-Login des Besitzers; nur diese Identität darf antworten (Serve setztTailscale-User-Login; verifiziert am 31.10.2026).DOSSIER_HANDLE=timinouist der Name, den Antworten in:bytragen; ein Login (eine E-Mail-Adresse) wird niemals in die Datei geschrieben. Der Server liest die Datei pro Anfrage neu: Das Bearbeiten der.bl.orgerfordert keinen Neustart. Das Bearbeiten des.bl-Codes des Kits schon:work restart NAME. - Antworten lesen:
Antworten leben im Block-Header:bl run ~/.claude/skills/bl-org-dossier/kit/answers.bl -- /abs/pfad/NAME.bl.org:answer B :at "2026-10-31 17:14" :note "…". Darauf reagieren, das Dossier aktualisieren (den:statuseiner Entscheidung aufdecidedsetzen, eine Roster-Überschrift nach DONE verschieben) und sagen, was sich geändert hat.
Form (Othmans Geschmack)
Eröffnen Sie mit der These, beenden Sie mit dem, was er entscheiden muss. Dazwischen verdienen Sie sich jeden Abschnitt.
#+title:benennt das Ding und sein Versprechen.#+subtitle:ein Satz.#+kicker:wo es lebt.#+status:ehrlich (Vorschlag · nichts gebaut).- In einem Atemzug –
lede+stats. Zwei kurze Absätze, vier Zahlen. - Definieren Sie die Wörter –
termsfür jedes Nomen, auf das Sie sich stützen werden. Wenn ein Satz wie „nahtlos“ die Anfrage trägt, spalten Sie ihn in die einzelnen Versprechen auf, die er verbirgt, und sagen Sie, was er niemals bedeutet (honest). - Jobs – ein
jobpro Nutzungsmoment, jeweils mit der Art und Weise des Referenzprodukts und einer Entscheidung. - Bildschirme –
screen-Blöcke, aus Text gezeichnet. Echte Namen, echte Repos, echte Maschinen aus der tatsächlichen Umgebung – niemals Lorem Ipsum. - Wie es wirklich funktioniert –
sequencefür alles, was eine Leitung kreuzt;graphfür Topologie;rosettafür eine Idee über mehrere Systeme hinweg. - Das Modell, ausführbar – Beam-Lisp-Zellen mit
asserts, die die Invarianten des Designs festnageln. Das unter jeder Zelle gedruckte Ergebnis ist der Beweis. - Vorherige Arbeiten –
matrix, Quellen aufgelistet, Behauptungen Dritter als aus Dokumenten stammend gekennzeichnet. - Entscheidungen (
decision, mit den abgelehnten Optionen sichtbar) → Fragen (ask) → Roster (* TODO/DONE-Überschriften mit:PROPERTIES::JOBS: :AREA: :PROTO:). - Der Text ist kurz. Platzierung und Gewicht tragen den Zustand. Keine Marketing-Adjektive. Sagen Sie, was nicht verifiziert ist.
Komponenten
Header-Attribute: :key value oder :key "quoted value". Körper sind Zeilensprachen; a | b | c-Zeilen, sofern nicht anders angegeben.
| Block | Körper | Darstellung |
|---|---|---|
lede | Prosa | große Serif-Eröffnung |
stats | value | label | note | Statistik-Kacheln |
terms | term | bedeutung | Definitionsliste |
principles | titel | text | nummerierte Karten |
note / warning / honest (:title) | Prosa | Callouts (Schiefer / Ton / Ocker) |
rosetta | erste Zeile = Kopfzeilen | ausgerichtete Tabelle; Karten auf einem Telefon |
matrix | erste Zeile = Kopfzeilen; Zellen y, ~, n + optionale Wörter | Punktmatrix mit Legende |
job :id :title :codex :claude :decision :screen | der JTBD-Satz | Jobkarte + Antwort |
decision :id :title :status proposed|decided | - [x] gewählt, - [ ] abgelehnt, dann Begründung | Entscheidungskarte + Zustimmen/Überarbeiten/Ablehnen |
ask :id :title :options "A|B|C" | Kontext | Fragekarte + Optionen |
screen :id :title :job :caption [:theme dark] | Bildschirmsprache (unten) | Telefon-Mockup + Reaktion; aufeinanderfolgende Bildschirme bilden einen durchstreifbaren Streifen |
desk :id :title :job :caption [:url] | Schreibtischsprache (unten) | ein Desktop-App-Rahmen + Reaktion; gleiche Antwort-Buttons wie bei Bildschirmen |
sequence :title | lanes a · sub | b · sub, a -> b : label (Aufruf), a --> b : label (Antwort), a => b : label (der Schlüsselmoment), note a, b : text, == divider | SVG auf breiten Bildschirmen, nummerierte Schritte auf Telefonen |
graph :title | node id | label | sub | col,row | tone (you door station builder foreign), edge a -> b | label | style (baton solid dash none; <->, -- auch) | SVG-Topologie |
schema :id :title | nicht eingerückt entity @icon | gloss; eingerückt attr type | note. Typen: text date, -> kind (Ref), ->> kind (viele), a > b / c (Zustandsfluss), a, b, c (Enum) | Entitätskarten, Referenzen verlinken auf #entity-NAME, eine Anzahl von Entitäten · Attributen · Zuständen; beantwortbar |
procedure :id :title :makes | step @icon Titel | wer | name · art, … (produziert; ein drittes · draft = das Harness entwirft es, während die Aufgabe startet), check @icon Titel | wer | name, … (Ratschlag eines Prüfers, Agent oder Person), gate @icon Titel | wer | name, … (wartet auf Übergabe); wer benennt eine Rolle; andere Zeilen sind Prosa | eine Schrittschiene, Checks gestrichelt, Gates als Rauten; beantwortbar |
Ein schema- oder procedure-Block ist auch die Quelle, die eine Zelle kompilieren kann: bl doc run
übergibt die Datei in (BeamLisp/argv), sodass eine Zelle ihren eigenen Block lesen und in
Datom-Attribute oder Aufgaben umwandeln kann (Beispiel: team-machine/design/work/WORK.bl.org, Zellen spine, procedure).
Bildschirmsprache, ein Verb pro Zeile: bar Titel | rechts (< Titel fügt zurück hinzu), sub, chips a* | b (* = ausgewählt),
section Label | anzahl, card ton | titel | meta | körper (Töne turn approve run done fail idle),
ask, actions Primär! | Normal? | Gefahr^, msg du|agent | text, tool label | detail,
diff +12 −3 | pfad, code text, strip ton | text | button, row label | wert, banner warn|ok | text,
dest icon | titel | körper, note, spacer, input platzhalter | ↑, tabs A* | B,
lock zeit | datum + notif app | titel | körper | Aktion, Aktion (mit :theme dark),
sheet Titel – alles danach sitzt in einem Bottom-Sheet über dem Bildschirm.
card ton | titel | meta | körper | @check! @x @next? – eine fünfte Spalte setzt symbolbasierte Aktionen auf die Karte
(sagen Sie, was in der Karte benötigt wird, behalten Sie die Aktionen als Symbole; Othman findet Button-Reihen schwer zu parsen),
machine ton | @server name | rolle | detail | rechts (Töne up busy asleep you),
search platzhalter + pick @ordner name* | detail | rechts (eine Projektauswahl, * = gewählt),
listen hinweis (Mikrofon + Wellenform), heard transkript, intent @senden Verb | ziel | text (Sprache),
choices A | B* | C (eine Multiple-Choice-Frage, * = gewählt), reply platzhalter (eine Freitextantwort mit Mikrofon und Senden).
Nebenfakten zu pick und machine fließen in den Text ein; Kartenaktionen stehen unter den Wörtern.
Schreibtischsprache — jedes Bildschirmverb, plus Desktop-Regionen und ein Dokument:
nav @home Accueil* | @matter Affaires (Seitenleiste, * = hier), crumb a › b,
head Titel | ton · Status | Aktion! | Andere? (der Aktionsslot, oben rechts), meta a | b, tabs,
col doc|rail|main (Spalten; doc zeichnet Papier; wiederholen Sie col main für eine Reihe von Karten),
page Titel, para text mit {+eingefügt+} {-gelöscht-} {~vorgeschlagen~} {!zu verifizieren!} ‹P-01› (Quell-Chip) ^1 (Kommentar-Anker),
point ton | @icon art | titel | körper | Option* | Option, comment 1 | wer | text (gleiche Nummer wie sein ^1), opts A* | B.
Zeilen vor der ersten col erstrecken sich über die gesamte Breite. Schreibtische verwenden die Warm-Signal-Palette von Knowledger (Lampe im Dunkelmodus).
Symbole: @name an einer beliebigen Stelle in einer Bildschirm- oder Schreibtischzeile zeichnet ein Liniensymbol – 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. Bevorzugen Sie ein Symbol gegenüber einem Wort für Arten von Dingen.
Beantwortbare Blöcke: ask decision screen desk job schema procedure. Jeder benötigt eine eindeutige :id.
Einfaches Org funktioniert auch: Überschriften mit TODO-Keywords und Tags, :PROPERTIES:-Drawer (Chips),
Tabellen, Listen, [ ]/[X]-Checkboxen, =code=, *bold*, /italic/, [[url][label]], [[#screen-ID][label]].
Ausführbare Zellen
#+begin_src beam-lisp :id lifecycle
(ns project.model) ; erste Zelle benennt den Namensraum; alle Zellen teilen ihn
(defn advance [s e] …)
(assert (= … …)) ; ein fehlgeschlagenes assert wird zum Ergebnis und --check beendet sich mit 1
{:what "der letzte Wert ist der gedruckte Beweis"}
#+end_src
Nur kleingeschriebenes #+begin_src beam-lisp (Großschreibung wird nie ausgeführt). Modellieren Sie die Invarianten des
Designs (ein Schreiber, Reihenfolge von Effekten, Abdeckung einer Abbildung), keine Belanglosigkeiten.
Beim Schreiben dieser Dossiers gefundene Fallstricke von Beam Lisp (installiertes bl, Stand 31.10.2026):
nicht im Kern – ffirst, reductions, spit, replace, format, parse-long, prn.
Verwenden Sie File/read!, File/write!, File/rename!, String/replace, Regex/run|scan|split|replace,
erlang/binary_to_integer, (println (pr-str x)). Argumente werden von rechts nach links ausgewertet.
Benennen Sie niemals eine öffentliche Funktion nach einer Kernfunktion. Hiccup-Kinder müssen Seq's sein (map/for), keine Vektoren:
(map identity v).
Ansehen
chromium --headless=new --no-sandbox --hide-scrollbars --window-size=412,16000 \
--virtual-time-budget=5000 --screenshot=/tmp/d.png http://127.0.0.1:PORT/
nix shell nixpkgs#imagemagick --command magick /tmp/d.png -crop 412x1000+0+0 +repage /tmp/d0.png
Seiten größer als 16000 px: HTML speichern, frühere section.parts verstecken und diese aufnehmen.
Prüfen: zuerst Telefonbreite, jedes Diagramm lesbar, beide Designs, keine ✗ failed-Zelle.
Als App lesen
Auf einem breiten Bildschirm ist die Seite eine zweispaltige App ohne Änderung an der Datei: Jede
Überschrift der Ebene 1 wird zu einer Seite in einer Seitenleiste (mit ihren Überschriften der Ebene 2 darunter,
wenn sie geöffnet ist). Ein Abschnitt zeigt, wie viele Antworten noch ausstehen, ein ✓, sobald
beantwortet, und einen Roster mit seinem DONE/Gesamt. Ein Abschnitt wird auf einmal angezeigt, mit
zurück/vorwärts am Fuß und ←/→ zum Bewegen. #all (« Gesamtes Dokument ») zeigt
alles; jeder #anchor öffnet den Abschnitt, der ihn enthält. Auf einem Telefon wechseln die Chips die Abschnitte
auf die gleiche Weise. Schreiben Sie Überschriften der Ebene 1 als die Seiten des Berichts und
Ebene 2 als deren Teile.
Designsprachen
Mockups können die echte Designsprache eines Produkts tragen. #+design: forest am Anfang eines
Dossiers zeichnet jeden screen und desk darin (ein Block kann mit :design NAME überschreiben,
oder mit :design none abwählen); die Mockup-Zeilen ändern sich nicht. Bevorzugen Sie die eigene Sprache des Produkts
gegenüber der Standardpalette des Kits, wann immer eine existiert.
Eine Sprache ist ein literarisches Modul, kit/dossier/design/NAME.bl.org, dessen Zellen der Namensraum
schema.design.NAME sind: Token (hell und dunkel), Schriftgrößen, Radien, Schatten,
Bewegungs-Token und das CSS, das die Mockup-Variablen des Kits neu bindet. Registrieren Sie es in
kit/dossier/design.bl. Dieselbe Datei ist seine Exemplarseite, durch vier Blöcke, die sich
aus dem Modul selbst zeichnen: #+begin_palette, #+begin_type, #+begin_shape,
#+begin_motion (jeweils mit :design NAME, leerem Körper). Führen Sie eine parity-Zelle, die
die Token mit dem ausgelieferten CSS des Produkts vergleicht; der Kit-Test stellt keine Abweichung fest.
Ausgeliefert: forest – Nurturing Forest, Orams Team-Maschine (design/forest.bl.org,
veröffentlicht als der forest-language-Dienst).
Kit
kit/serve.bl (Routen / /doc /rev /src /answers POST /answer), kit/answers.bl,
kit/dossier/{org,attrs,ui,page,answer,design}.bl (rein), kit/dossier/design/*.bl.org,
kit/style.css, kit/live.js.
Tests: bl test -p ~/.claude/skills/bl-org-dossier/kit kit/test/kit_test.bl.
Eine neue Komponente = eine -h-Funktion in ui.bl, ein Fall in block->h, CSS, eine Nadel im Test.
Antworten werden von patch-line geschrieben: nur :answer :note :at :by ändern sich; jedes andere Byte der Datei bleibt.
Die Fähigkeit lebt in ~/projects/enchanted-skills/bl-org-dossier (das öffentliche
undefine-org/enchanted-skills-Repo); ~/.claude/skills/bl-org-dossier ist ein Symlink darauf.
Sie wird von jeder Sitzung, die diese Fähigkeit nutzt, geteilt. Committen Sie nach und nach, eine Idee pro
Commit, und stagen Sie nur Ihre eigenen Dateien (git status zuerst: eine andere Sitzung könnte gerade bearbeiten). Ein
work restart eines Dossier-Dienstes lädt, was auf der Festplatte ist, einschließlich nicht committeter Bearbeitungen.
Behalten Sie die Antworten eines Lesers in einem eigenen Commit im Repo des Dossiers, damit git diff zeigt, was sie gesagt haben.