応答する.bl.orgドシエ
ドシエは一つの.bl.orgファイルです。ソース、ページ、実行可能仕様、回答シートを兼ねます。このファイルの隣にあるBeam Lispサーバーキットが、実際のbl.doc.spansパーティションを使ってレンダリングし、tailnet上に公開し、読者が与えたすべての回答をその回答先ブロックに書き込みます。データベースもコピーも不要:git diffでOthmanが何を言ったかがわかります。
作成前に必ず読むべき模範例:
~/projects/tiny-tools/mobile-app/dossier/pocket-harness.bl.org(2026-10-31にbaton.bl.orgから改名)。
デスクと実行可能ライフサイクルを持つデスクトップ重視の模範例:
~/projects/knowledger-interface-review/docs/reports/interface-review-20261031/knowledger-interface.bl.org。
その元になったハウステイスト:~/code/undefine/omega/spikes/mobile/design-review/design-review.bl.org。
ループ
- まず調査する。すべての主張をファイルパス、実行したコマンド、引用元に基づかせる。
NAME.bl.orgを作成する(構造は下記)。セルには手書きの#+RESULTSを付けない —bl doc runに任せる。bl doc run FILE.bl.orgを実行し、次にbl doc run FILE.bl.org --checkを実行する(終了コード0 = セルが正常で結果が最新)。- 何か主張する前に、電話幅で表示を確認する(表示の確認参照)。
- 公開する:
環境ファイルにはwork 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/path/NAME.bl.orgDOSSIER_OWNER=に所有者のTailscaleログインを設定する。そのIDだけが回答できる(ServeがTailscale-User-Loginを設定する;2026-10-31確認済み)。DOSSIER_HANDLE=timinouは回答が:byに載せる名前であり、ログイン(メールアドレス)はファイルに書き込まれない。 サーバーはリクエストごとにファイルを再読み込みする:.bl.orgを編集しても再起動不要。 キットの.blコードを編集した場合は必要:work restart NAME。 - 回答を読む:
回答はブロックヘッダーに存在する:bl run ~/.claude/skills/bl-org-dossier/kit/answers.bl -- /abs/path/NAME.bl.org:answer B :at "2026-10-31 17:14" :note "…"。 それに基づいて行動し、ドシエを更新する(決定の:statusをdecidedに変更する、ロースターの見出しをDONEに移動する)、そして何が変わったかを伝える。
形状(Othmanの好み)
テーゼで始め、彼が決定すべきことで終える。その間で、各セクションを正当化する。
#+title:はものとその約束を命名する。#+subtitle:は一文。#+kicker:はそれがどこに存在するか。#+status:は正直に(提案・まだ何も作られていない)。- 一息で —
lede+stats。2つの短い段落、4つの数字。 - 言葉を定義する —
termsで、依存するすべての名詞について。もし「シームレス」のようなフレーズが要求を含意するなら、それが隠す別々の約束に分解し、決して意味しないことを述べる(honest)。 - ジョブ — 使用の瞬間ごとに1つの
job、それぞれに参照製品の方法と1つの決定。 - 画面 —
screenブロック、テキストから描画される。実際の環境からの実際の名前、実際のリポジトリ、実際のマシン — 決してダミーテキストではない。 - 実際の仕組み — ワイヤーを越えるものには
sequence、トポロジーにはgraph、複数のシステムにまたがる一つのアイデアにはrosetta。 - 実行可能なモデル — 設計の不変条件を固定する
assert付きのBeam Lispセル。各セルの下に表示される結果が証明である。 - 先行技術 —
matrix、ソースをリストし、第三者の主張はドキュメントからのものと明記。 - 決定(
decision、拒否されたオプションも表示) → 質問(ask) → ロースター(* TODO/DONEの見出しと:PROPERTIES:、:JOBS: :AREA: :PROTO:)。 - コピーは短く。配置と重みが状態を伝える。マーケティング形容詞禁止。未検証のことは述べない。
コンポーネント
ヘッダー属性::key valueまたは:key "quoted value"。本文は行言語;特に断らない限りa | b | c形式の行。
| ブロック | 本文 | レンダリング |
|---|---|---|
lede | 散文 | 大きなセリフ体の冒頭 |
stats | value | label | note | 統計タイル |
terms | term | meaning | 定義リスト |
principles | title | text | 番号付きカード |
note / warning / honest(:title) | 散文 | コールアウト(スレート/クレイ/オークル) |
rosetta | 最初の行 = ヘッダー | 整列テーブル;電話ではカード |
matrix | 最初の行 = ヘッダー;セルはy、~、n + オプションの単語 | 凡例付きドットマトリックス |
job :id :title :codex :claude :decision :screen | JTBD文 | ジョブカード + 回答 |
decision :id :title :status proposed|decided | - [x] chosen、- [ ] rejected、次に根拠 | 決定カード + 同意/再検討/不同意 |
ask :id :title :options "A|B|C" | コンテキスト | 質問カード + 選択肢 |
screen :id :title :job :caption [:theme dark] | 画面言語(下記) | 電話モックアップ + リアクション;連続するスクリーンはスワイプ可能なストリップを形成 |
desk :id :title :job :caption [:url] | デスク言語(下記) | デスクトップアプリフレーム + リアクション;スクリーンと同じ回答ボタン |
sequence :title | lanes a · sub | b · sub、a -> b : label(呼び出し)、a --> b : label(応答)、a => b : label(重要な瞬間)、note a, b : text、== divider | ワイド画面でSVG、電話で番号付きステップ |
graph :title | node id | label | sub | col,row | tone(you door station builder foreign)、edge a -> b | label | style(baton solid dash none;<->、--も可) | SVGトポロジー |
schema :id :title | インデントなしのentity @icon | gloss;インデントありのattr type | note。型:text date、-> kind(参照)、->> kind(多)、a > b / c(状態フロー)、a, b, c(列挙型) | エンティティカード、参照は#entity-NAMEにリンク、エンティティ数・属性・状態のカウント;回答可能 |
procedure :id :title :makes | step @icon Title | who | name · kind, …(生成物;三番目の· draft = タスク開始時にハーネスが草案を作成)、check @icon Title | who | name, …(検証者の助言、エージェントまたは人間)、gate @icon Title | who | name, …(引き継ぎを待つ);whoは役割名;その他の行は散文 | ステップレール、チェックは破線、ゲートはひし形;回答可能 |
schemaまたはprocedureブロックは、セルがコンパイルできるソースでもある:bl doc runは(BeamLisp/argv)でファイルを渡すため、セルは自身のブロックを読み取り、datom属性やタスクに変換できる(例:team-machine/design/work/WORK.bl.org、セルspine、procedure)。
画面言語、一行一動詞:bar Title | right(< Titleは戻るボタンを追加)、sub、chips a* | b(* = 選択済み)、section Label | count、card tone | title | meta | body(トーンはturn approve run done fail idle)、ask、actions Primary! | Plain | Quiet? | Danger^、msg you|agent | text、tool label | detail、diff +12 −3 | path、code text、strip tone | text | button、row label | value、banner warn|ok | text、dest icon | title | body、note、spacer、input placeholder | ↑、tabs A* | B、lock time | date + notif app | title | body | Action, Action(:theme dark付きで)、sheet Title — その後のすべては画面下部のシートに配置される。card tone | title | meta | body | @check! @x @next? — 5列目はカードにアイコンのみのアクションを配置する(カードに必要なものを記述し、アクションはアイコンとして保持;Othmanはボタン行の解析が難しいと感じる)、machine tone | @server name | role | detail | right(トーンはup busy asleep you)、search placeholder + pick @folder name* | detail | right(プロジェクトピッカー、* = 選択済み)、listen hint(マイク+波形)、heard transcript、intent @send Verb | target | text(音声)、choices A | B* | C(複数選択の質問、* = 選択済み)、reply placeholder(マイクと送信ボタン付きの自由記述回答)。pickとmachineのサイドファクトはテキストに流れ込み、カードアクションは単語の下に配置される。
デスク言語 — すべての画面動詞に加えて、デスクトップ領域と文書:nav @home Accueil* | @matter Affaires(サイドバー、* = 現在地)、crumb a › b、head Title | tone · Status | Action! | Other?(アクションスロット、右上)、meta a | b、tabs、col doc|rail|main(列;docは用紙を描画;col mainを繰り返してカードの行を作成)、page Title、para text({+挿入+} {-削除-} {~提案~} {!要確認!} ‹P-01›(ソースチップ)^1(コメントアンカー))、point tone | @icon kind | title | body | Option* | Option、comment 1 | who | text(同じ番号が^1に対応)、opts A* | B。最初のcolより前の行は全幅に広がる。デスクはKnowledgerのWarm Signalパレット(ダークモードではランプ)を使用する。
アイコン:画面またはデスクの行内の任意の場所にある@nameはラインアイコンを描画する — 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。種類を示す言葉よりもアイコンを優先する。
回答可能なブロック:ask decision screen desk job schema procedure。それぞれ一意の:idが必要。
プレーンOrgも動作:TODOキーワードとタグ付きの見出し、:PROPERTIES:ドロワー(チップ)、テーブル、リスト、[ ]/[X]チェックボックス、=code=、*bold*、/italic/、[[url][label]]、[[#screen-ID][label]]。
実行可能セル
#+begin_src beam-lisp :id lifecycle
(ns project.model) ; 最初のセルが名前空間を命名する;すべてのセルが共有する
(defn advance [s e] …)
(assert (= … …)) ; 失敗したアサートは結果になり、--checkは終了コード1で終了する
{:what "最後の値が印刷された証明です"}
#+end_src
小文字の#+begin_src beam-lispのみ(大文字は決して実行されない)。設計の不変条件(単一ライター、効果の順序、マッピングのカバレッジ)をモデル化し、些細なことはモデル化しない。
これらを書いている間に遭遇したBeam Lispの落とし穴(blインストール済み、2026-10-31):
コアに存在しないもの — ffirst、reductions、spit、replace、format、parse-long、prn。
代わりにFile/read!、File/write!、File/rename!、String/replace、Regex/run|scan|split|replace、erlang/binary_to_integer、(println (pr-str x))を使用。引数は右から左に評価される。
パブリックなfnにコアfnと同じ名前を決して付けない。Hiccupの子要素はシーケンス(map/for)でなければならず、ベクターは不可:(map identity v)。
表示の確認
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
16000 pxを超えるページ:以前のsection.partを非表示にしてHTMLを保存し、それを撮影する。
チェック:最初に電話幅、すべての図が読めること、両方のテーマ、✗ failedセルがないこと。
アプリとして読む
ワイド画面では、ファイルに変更を加えることなくページは二段組アプリになる:すべてのレベル1見出しがサイドバーのページになり(開いたときにその下のレベル2見出しが表示される)。セクションはまだ待っている回答数、回答済みの✓、およびDONE/合計のロースターを表示する。一度に一つのセクションが表示され、下部に前/次へ、←/→で移動する。#all(「文書全体」)はすべてを表示し、任意の#anchorはそれを保持するセクションを開く。電話ではチャンクが同じ方法でセクションを切り替える。レベル1見出しをレポートのページとして、レベル2をその部分として書く。
デザイン言語
モックアップは製品の実際のデザイン言語をまとうことができる。ドシエの先頭に#+design: forestと書くと、その中のすべてのscreenとdeskがその言語で描画される(個別のブロックは:design NAMEでオーバーライド、または:design noneでオプトアウト可能);モックアップ行は変わらない。デフォルトのキットパレットよりも、製品独自の言語を優先する。
言語はリテラートモジュール、kit/dossier/design/NAME.bl.orgであり、そのセルがそのものである名前空間dossier.design.NAME:トークン(ライトとダーク)、タイプスケール、半径、シャドウ、モーショントークン、およびキットのモックアップ変数を再バインドするCSS。kit/dossier/design.blに登録する。同じファイルが見本ページであり、モジュールから自身を描画する4つのブロックを通して:#+begin_palette、#+begin_type、#+begin_shape、#+begin_motion(それぞれ:design NAME、本文は空)。製品の出荷されたCSSに対するトークンのパリティをチェックするparityセルを保持する;キットテストはドリフトをアサートする。
出荷済み:forest — Nurturing Forest、Oraのチームマシン(design/forest.bl.org、forest-languageサービスとして公開)。
キット
kit/serve.bl(ルーティング / /doc /rev /src /answers POST /answer)、kit/answers.bl、kit/dossier/{org,attrs,ui,page,answer,design}.bl(純粋)、kit/dossier/design/*.bl.org、kit/style.css、kit/live.js。
テスト:bl test -p ~/.claude/skills/bl-org-dossier/kit kit/test/kit_test.bl。
新しいコンポーネント = ui.bl内の1つの-h fn、block->h内の1つのケース、CSS、テスト内の1つのニードル。
回答はpatch-lineによって書き込まれる::answer :note :at :byのみが変更され、ファイルの他のすべてのバイトはそのまま残る。
このスキルは~/projects/enchanted-skills/bl-org-dossier(パブリックなundefine-org/enchanted-skillsリポジトリ)に存在し、~/.claude/skills/bl-org-dossierはそれへのシンボリックリンクです。
このスキルを使用するすべてのセッションで共有されます。進捗に応じてコミットし、一つのアイデアにつき一つのコミット、自身のファイルのみをステージングします(最初にgit statusを確認:別のセッションが編集中である可能性があります)。ドシエサービスのwork restartは、ディスク上にあるものをロードし、未コミットの編集も含まれます。読者の回答はドシエのリポジトリ内の独自のコミットに保存し、git diffで彼らが何を言ったかを表示できるようにします。