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:
@@ -0,0 +1,46 @@
|
|||||||
|
# Declines
|
||||||
|
|
||||||
|
**What was considered and not done, with the reason.** *Only a belief can later
|
||||||
|
be shown wrong, so each says what was believed and not only what was chosen.*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `cart: almanac`, 2026-09-07
|
||||||
|
|
||||||
|
**A registry service, first.** *Considered for three days and deferred.* **We
|
||||||
|
believe a git host already provides a document with an owner, an address, an
|
||||||
|
`ETag`, history and rendering** — so the service buys aggregation and a
|
||||||
|
self-describing entry point, and buys them better after the conventions have been
|
||||||
|
used. *Entry 78. **Wrong if the conventions turn out to need a server to be
|
||||||
|
usable at all**, which using them will show.*
|
||||||
|
|
||||||
|
**Affordances, stagings, roles and beads, for problems 1 and 2.** *Built out over
|
||||||
|
three days and then bracketed.* **We believe the model is for describing software
|
||||||
|
above its implementation, and that infrastructure and practice description is a
|
||||||
|
different altitude** being forced into it. *Entries 69 and 70. **Wrong if the
|
||||||
|
documentation layer turns out to need decomposition to answer anything
|
||||||
|
useful.***
|
||||||
|
|
||||||
|
**Bulk recasting a bead across stagings.** **We believe the list is the migration
|
||||||
|
plan** — resumable, observable, owned by whoever owns each staging — where a bulk
|
||||||
|
operation is one uninspectable moment that breaks every consumer at once. *Entry
|
||||||
|
35.*
|
||||||
|
|
||||||
|
**Signatures on receipts.** **We believe a content hash catches every accident,
|
||||||
|
and a signature answers an adversary that does not exist** — one tailnet, one
|
||||||
|
operator. *Entry 41. **Revisit when a consumer must verify without being able to
|
||||||
|
ask.***
|
||||||
|
|
||||||
|
**`watch`, and any subscription.** **We believe it would be the first thing
|
||||||
|
giving the registry persistent knowledge of its consumers**, which is the line
|
||||||
|
drawn at *a pin is not a subscription* — and a conditional `GET` suffices for
|
||||||
|
documents that change monthly. *Entry 72.*
|
||||||
|
|
||||||
|
**Naming what loom kept reaching for — "accommodations", "standard".** **We
|
||||||
|
believe it is a lifecycle stage with a measurement rather than a kind needing a
|
||||||
|
name**: a specification is a thing that names roles and casts none of them.
|
||||||
|
*Entries 45 and 48. **Coin it when we keep needing to say it.***
|
||||||
|
|
||||||
|
**An `internal/` directory.** **We believe naming the complement of `published/`
|
||||||
|
invents a category, and one that looks like a security boundary and is not.**
|
||||||
|
*Entries 29 and 67.*
|
||||||
+3491
File diff suppressed because it is too large
Load Diff
@@ -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.**
|
||||||
@@ -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.*
|
||||||
@@ -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.**
|
||||||
@@ -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.*
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# bedrock
|
||||||
|
|
||||||
|
**The primitives.** Four documents, in `.loom/published/`:
|
||||||
|
|
||||||
|
- [The `.loom` directory](.loom/published/loom-directory.md) — everything lives
|
||||||
|
there, and a directory means a kind
|
||||||
|
- [Sibling facets](.loom/published/sibling-facets.md) — `x.<facet>.md` beside
|
||||||
|
`x.md`, owned by whoever wrote the facet
|
||||||
|
- [Recording decisions](.loom/published/recording-decisions.md) — what an entry
|
||||||
|
says, and why it is never revised
|
||||||
|
- [Publication](.loom/published/publication.md) — what `.loom/published/` means
|
||||||
|
|
||||||
|
**Nothing here says what to *do*.** *`loom/annotating`, `loom/cart` and
|
||||||
|
`loom/externals` are built on these and are where the practices live.*
|
||||||
|
|
||||||
|
**Most repositories will never read this.** *Its audience is people building
|
||||||
|
conventions, not people using them — and it is a good sign that a primitive is
|
||||||
|
one nobody needs.*
|
||||||
|
|
||||||
|
**Publishers are the exception**, because publication is defined here, and the
|
||||||
|
people whose choices land on somebody else should have read the primitives.
|
||||||
Reference in New Issue
Block a user