Community코딩 & 개발github.com

undefine-org/bl-org-dossier

설계/아키텍처/취향 보고서(dossier)를 하나의 .bl.org 파일로 작성하고, 이를 모바일 우선 라이브 페이지로 렌더링하며, 실행 가능한 Beam Lisp 셀을 포함하고, 독자의 답변을 파일에 다시 기록하여 Claude가 읽을 수 있도록 합니다.

bl-org-dossier란 무엇인가요?

이 스킬은 하나의 `.bl.org` 파일이 문서의 원천이자, 실행 가능한 페이지이며, 독자의 답변을 수집하는 '답변 시트' 역할을 하는 도시에(dossier) 작성 시스템입니다. 개발자나 AI 에이전트가 설계 리뷰, 제안서, 보고서 또는 의사 결정 문서를 작성할 때 사용합니다. 특히 Othman이 핸드폰으로 읽고 반응할 문서에 적합합니다. 작은 Beam Lisp 서버가 파일을 렌더링하여 tailnet에 게시하고, 독자의 모든 답변을 해당 블록에 직접 기록합니다. 데이터베이스나 별도 복사본이 없어 `git diff`로 Othman의 피드백을 즉시 확인할 수 있습니다. 주요 기능 블록으로는 작업(job), 화면(screen), 시퀀스(sequence), 그래프(graph), 로제타(rosetta), 매트릭스(matrix), 결정(decision), 질문(ask) 등이 있으며, 모든 블록은 고유 ID를 가져야 합니다. Beam Lisp 셀을 실행하여 설계의 불변 조건을 검증하고, `--check` 플래그로 모든 셀이 통과하는지 확인할 수 있습니다. 이 스킬은 Claude Code, Cursor 등 AI 에이전트 도구에서 사용되며, Othman의 취향에 맞춰 간결하고 정직한 표현을 강조합니다.

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

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

.bl.org 도시에(dossier), 대화하다

도시에는 하나의 .bl.org 파일입니다. 그것이 원천(source)이자 페이지이며, 실행 가능한 명세이자 답안지입니다. 이 파일 옆에 있는 작은 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.

순환고리

  1. 먼저 조사하세요. 모든 주장은 파일 경로, 실행한 명령어, 또는 인용된 출처에 근거해야 합니다.
  2. NAME.bl.org를 작성합니다 (아래 구조 참조). 셀에는 수동으로 작성된 #+RESULTS를 넣지 마세요. bl doc run이 결과를 쓰도록 하세요.
  3. bl doc run FILE.bl.org를 실행한 다음 bl doc run FILE.bl.org --check를 실행합니다 (종료 코드 0 = 모든 셀이 정상이고 결과가 최신 상태임).
  4. 어떤 주장을 하기 전에 반드시 핸드폰 화면 너비로 확인하세요 (보기 섹션 참조).
  5. 게시:
    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.org
    
    환경 파일에는 DOSSIER_OWNER= 소유자의 Tailscale 로그인이 저장됩니다. 해당 신원만 답변할 수 있습니다 (Serve가 Tailscale-User-Login을 설정함; 2026-10-31 확인됨). DOSSIER_HANDLE=timinou는 답변이 :by에 담는 이름입니다. 로그인(이메일)은 절대 파일에 기록되지 않습니다. 서버는 요청마다 파일을 다시 읽습니다. .bl.org를 수정해도 재시작이 필요 없습니다. 키트의 .bl 코드를 수정하는 경우 재시작이 필요합니다: work restart NAME.
  6. 답변 읽기:
    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의 취향)

논문(thesis)으로 시작하고, 그가 결정해야 할 내용으로 끝내세요. 그 사이의 모든 섹션은 내용을 입증해야 합니다.

  • #+title:은 대상과 그 약속을 명명합니다. #+subtitle:은 한 문장입니다. #+kicker:은 위치입니다. #+status:는 정직하게 표시합니다 (제안 · 아직 구축된 것 없음).
  • 한숨에 — lede + stats. 두 개의 짧은 단락, 네 개의 숫자.
  • 단어 정의 — 의존하는 모든 명사에 대한 terms. "seamless"와 같은 표현이 요청을 담고 있다면, 그 안에 숨겨진 개별 약속들로 나누고, 절대 의미하지 않는 것을 말하세요 (honest).
  • 작업(Jobs) — 사용의 각 순간마다 하나의 job, 각각 참조 제품의 방식과 하나의 결정을 포함.
  • 화면(Screens) — screen 블록, 텍스트로 그려짐. 실제 환경의 실제 이름, 실제 저장소, 실제 시스템을 사용하세요. 절대 lorem ipsum을 사용하지 마세요.
  • 실제 작동 방식 — 유선을 통해 전달되는 모든 것은 sequence; 토폴로지는 graph; 여러 시스템에 걸친 하나의 아이디어는 rosetta.
  • 실행 가능한 모델 — 설계의 불변 조건을 고정하는 assert가 포함된 Beam Lisp 셀. 각 셀 아래에 출력된 결과가 증명입니다.
  • 선행 사례 — matrix, 출처가 나열되고, 타사 주장은 문서에서 인용한 것으로 표시.
  • 결정 (decision, 거부된 옵션도 표시) → 질문 (ask) → 로스터 (* TODO/DONE 헤딩과 :PROPERTIES: 드로어, :JOBS: :AREA: :PROTO:).
  • 문장은 짧게. 배치와 가중치가 상태를 전달합니다. 마케팅 형용사는 사용하지 마세요. 검증되지 않은 것은 말하세요.

구성 요소

헤더 속성: :key value 또는 :key "quoted value". 본문은 라인 언어(line language)입니다. 행은 a | b | c 형식입니다 (별도 언급 없을 시).

블록본문렌더링 결과
lede산문(prose)큰 세리프(serif) 오프닝
statsvalue | label | note통계 타일
termsterm | meaning정의 목록
principlestitle | text번호가 매겨진 카드
note / warning / honest (:title)산문콜아웃(슬레이트/클레이/오커)
rosetta첫 번째 행 = 헤더정렬된 테이블; 핸드폰에서는 카드
matrix첫 번째 행 = 헤더; 셀 y, ~, n + 선택적 단어범례가 있는 점 매트릭스
job :id :title :codex :claude :decision :screenJTBD 문장작업 카드 + 답변
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 :titlelanes a · sub | b · sub, a -> b : label (호출), a --> b : label (응답), a => b : label (핵심 순간), note a, b : text, == divider넓은 화면에서는 SVG, 핸드폰에서는 번호가 매겨진 단계
graph :titlenode 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 :makesstep @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? — 다섯 번째 열은 카드에 아이콘만 있는 작업을 추가 (카드에 필요한 것을 말하고, 작업은 아이콘으로 유지; 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 와 {+inserted+} {-deleted-} {~proposed~} {!to verify!} ‹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 (= … …))             ; 실패한 assert는 결과가 되고 --check는 1로 종료
{:what "마지막 값이 출력된 증명입니다"}
#+end_src

소문자 #+begin_src beam-lisp만 사용 (대문자는 실행되지 않음). 설계의 불변 조건(단일 작성자, 효과의 순서, 매핑의 커버리지)을 모델링하고, 사소한 것은 모델링하지 마세요.

이것들을 작성하면서 발견한 Beam Lisp 함정 (2026-10-31 기준 bl 설치): 코어에 없음 — 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 셀 없음.

앱으로 읽기

넓은 화면에서 페이지는 파일 변경 없이 2열 앱이 됩니다. 모든 레벨-1 헤딩은 사이드바의 페이지가 되고 (열렸을 때 그 아래의 레벨-2 헤딩이 표시됨). 섹션은 아직 기다리는 답변 수를 표시하고, 답변이 완료되면 ✓를, 그리고 DONE/전체 로스터를 표시합니다. 한 번에 하나의 섹션이 표시되며, 하단에 이전/다음 버튼과 ←/→ 키 이동이 가능합니다. #all ("전체 문서")은 모든 것을 표시하고, #anchor는 해당 섹션을 엽니다. 핸드폰에서는 칩이 동일한 방식으로 섹션을 전환합니다. 레벨-1 헤딩은 보고서의 페이지로, 레벨-2는 그 부분으로 작성하세요.

디자인 언어

목업은 제품의 실제 디자인 언어를 적용할 수 있습니다. 도시에 상단에 #+design: forest를 작성하면 도시에의 모든 screen과 desk에 적용됩니다 (개별 블록은 :design NAME으로 재정의하거나 :design none으로 제외 가능); 목업 라인은 변경되지 않습니다. 키트의 기본 팔레트보다 제품의 자체 언어가 있다면 선호하세요.

언어는 리터레이트(literate) 모듈, kit/dossier/design/NAME.bl.org이며, 그 셀은 네임스페이스 dossier.design.NAME을 구성합니다: 토큰(라이트 및 다크), 타입 스케일, 반경, 그림자, 모션 토큰, 그리고 키트의 목업 변수를 다시 바인딩하는 CSS. kit/dossier/design.bl에 등록하세요. 동일한 파일이 견본 페이지 역할을 하며, 모듈에서 자체를 그리는 네 개의 블록을 포함합니다: #+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의 -h fn, block->h의 case, CSS, 테스트의 needle. 답변은 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로 그들이 말한 내용을 확인할 수 있습니다.

Individual skills in this repo

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

관련 스킬