the four primitives

Depended on by the conventions built on this, and depending on none of them.

- the .loom directory — everything lives there, a directory means a kind, a
  stream is a file. Fixes .loom/ and deliberately not which kinds exist.
- sibling facets — x.<facet>.md beside x.md, owned by whoever wrote the facet,
  never by whoever wrote x.md. Plus the three choices a convention must make.
- recording decisions — what an entry says, why it is never revised, and why it
  has no status field.
- publication — the act, the contract, and that what is published is a document.

Also carries the event log and declines from cart `almanac`, which ran 2026-09-04
to 2026-09-07 and produced seventy-eight entries. Read it forwards; entry 69 is
where it changes its own mind and brackets most of what came before.

The git history here starts now. The event log is the history that matters.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-07 10:24:54 -04:00
co-authored by Claude Opus 5
commit 42d963d24f
7 changed files with 3668 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
# The `.loom` directory
**A repository that uses loom keeps everything in `.loom/` at its root.**
> **Type is determined by location.** *The directory a file is in says what it
> is.* **So frontmatter carries almost nothing, and often nothing at all.**
**A stream is a file. A collection of things with identity is a directory.** *A
log is appended to and no entry is ever addressed; a thing that is referred to
individually gets its own file.*
**Everything not recognised is shown rather than rejected.** *These files are
edited by hand and by agents, constantly, and that is supported. A reader that
fails on an unfamiliar directory is wrong.*
## What is fixed
**Only `.loom/` itself, and that a directory means a kind.** *Which kinds exist
is not fixed here — conventions built on this one declare their own, and a
repository has only the ones it uses.*
**Nothing outside `.loom/` is loom's business.**
+31
View File
@@ -0,0 +1,31 @@
# Publication
**What a repository has handed over for others to depend on lives in
`.loom/published/`.**
> **Publishing is a change of kind, not a change of status.** *An unpublished
> document is an implementation detail you may rename at will. **A published one
> is a contract.***
**So publication is an act somebody performs** — a file moves in — **and the move
is a diff that shows up in review.** *A flag in frontmatter is a line nobody
notices; this is the moment a thing becomes somebody else's problem, and it
should be unmissable.*
**`ls .loom/published/` is *what have we committed to?*** — and it is the question
to ask before changing anything.
## What is published is a document
**Prose, in whatever form its readers need.** *If a repository organises its
thinking some other way internally, that is its own business:* **a consumer
cannot tell whether it did, and must not need to.**
> **What is not exported is not hidden.** *The rest of the repository is there to
> read. It is simply not what you depend on.*
## There is no directory for what is unpublished
**Everything else is simply elsewhere in the repository.** *Naming the complement
invents a category — and a directory called `internal/` would look like a
security boundary and not be one.*
+29
View File
@@ -0,0 +1,29 @@
# Recording decisions
**An entry says what was decided, what it is believed to advance, and the belief
that could turn out false.**
> **Only a stated belief can later be shown wrong.** *"To satisfy §4" is a
> citation, not a reason — it points at a label.* **A constraint whose reason
> cannot be found gets re-litigated as a defect by whoever inherits it.**
**Appended, newest last, never revised.** *A later entry supersedes an earlier
one by saying so.* **A revised record cannot show that anybody changed their
mind, which is most of what a reader wants from it.**
**No status, no assignee, nothing to process.** *The moment an entry can be "not
yet applied", somebody must track which ones are — and the record becomes a work
tracker, which is how a thing that outlives its authors turns into a queue nobody
reads.*
## Declines belong here too
**What you considered and did not do, with the reason you did not.**
*Almost nobody writes these, and three weeks later somebody proposes the thing
you already rejected — because the rejection lived somewhere that did not
survive.*
## Where it lives
`.loom/event-log.md`. **A stream, so a file.**
+28
View File
@@ -0,0 +1,28 @@
# Sibling facets
**For any file `x.md`, other things said about it live beside it as
`x.<facet>.md`.**
> **A facet is owned by whoever wrote the facet, never by whoever wrote `x.md`.**
**That is the whole of it.** *It exists so that two parties can both write about
one document without either of them reconciling two versions of it.*
## What a convention using this must decide
**Three things, and it must say all three or its adopters will not know they had
a choice.**
- **What the facet is called.** *`notes`, `usages`, `gaps` — the name is the
contract; a reader recognises the pair on sight.*
- **What fixes `x.md` while the facet exists.** *Something must, or the facet
comes loose from what it is about.*
- **How the pair is released.** *There must be an answer. **A convention that
does not say leaves its adopters stuck**, and they will not notice, because a
question nobody asks looks like a question already answered.*
## Why the facet is never owned by the source's author
**Because the source may not be theirs to change.** *An adopted document belongs
to whoever published it; a facet beside it is the only place a reader has to put
what they think.*