Astro Starlight over .loom/externals/. Every reference page is a copy of a document published by another loom repository, adopted with loomctl, locked to the etag it was fetched at. Nothing is written twice. Two kinds of page. Generated ones are overwritten every build because nobody typed them. Guides are hand-written, never overwritten, and stamped in frontmatter with the etags they were written against; when a source moves, the build renders a banner onto the page asking whether it is still true. It cannot answer that — only a person can — so it asks where a reader will see it too, and the site degrades honestly instead of reading as authoritative and being wrong. npm run ack is the person saying they re-read it. Declined: having the build stage a polad into the cart. loomctl external check does that and is right to, but a docs build runs in CI and in worktrees where there is no cart, and staging a polad is an act of judgment. The build reports; a person raises. The guides are worked examples rather than explanations, deliberately. An explanation is a second saying of a rule owned on the page beside it and goes stale silently; an example goes stale visibly, because the artifacts in it are the wrong shape. Generation is byte-deterministic — locks are walked in path order, no timestamps — because the diff is most of the value. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
148 lines
6.0 KiB
Markdown
148 lines
6.0 KiB
Markdown
# Handoff
|
|
|
|
**What this is, what is decided, and what is left.** *Written so another instance
|
|
can continue without reconstructing the reasoning.*
|
|
|
|
---
|
|
|
|
## The one-paragraph version
|
|
|
|
**This site is the `loom` conventions rendered for people, and it is an instance
|
|
of the thing it documents.** *Every reference page is a copy of a document
|
|
published by another repository, adopted with `loomctl external add`, locked to
|
|
the etag it was fetched at.* **The hand-written pages are four section fronts,
|
|
and they are stamped with what they were written against so that a source moving
|
|
puts a banner on them.**
|
|
|
|
*It exists because nine repositories of prose is more than a person can hold, and
|
|
it was the first idea in this project aimed at a **human** reader.*
|
|
|
|
---
|
|
|
|
## What is settled, and why
|
|
|
|
### Two kinds of page
|
|
|
|
**Generated** — one per adopted document. *Overwritten every build; nobody typed
|
|
it.* **Guide** — `index.mdx` per section. *Never overwritten.*
|
|
|
|
**The generator writes exactly one thing into a hand-written file: the `loom:`
|
|
block in its frontmatter.** *That block is machine-owned; everything below the
|
|
closing `---` is copied byte for byte.* **If you change this, change it here and
|
|
say so in the README**, *because a tool that edits a person's file without a
|
|
declared boundary is how the `CLAUDE.md` problem starts.*
|
|
|
|
### Staleness is rendered, not filed
|
|
|
|
**The build cannot tell whether a guide is still true — only a person can — so it
|
|
renders the question onto the page.** *A reader sees the doubt even if nobody has
|
|
reconciled it.*
|
|
|
|
> **The site degrades honestly rather than reading as authoritative and being
|
|
> wrong.**
|
|
|
|
**`npm run ack` is the person saying they re-read it. Nothing else clears the
|
|
banner.** *`npm run check` exits `1` on any stale guide, for CI.*
|
|
|
|
**Declined: having the build stage a polad into the cart.** *`loomctl external
|
|
check` does exactly that and it is right to* — **but a docs build runs in CI, in
|
|
worktrees, and on machines with no cart**, *and staging a polad is an act of
|
|
judgment, which is what keeps a cart worth reading.* **The build reports; a
|
|
person raises.**
|
|
|
|
### Prefer an example to an explanation
|
|
|
|
**Because an explanation is a second saying of a rule owned elsewhere, and it
|
|
goes stale silently.** *An example goes stale visibly — the artifacts in it are
|
|
the wrong shape.* **The four guides are written this way on purpose**; *keep it.*
|
|
|
|
### Sections are repositories
|
|
|
|
*Not hosts, not documents.* **`bedrock` with five pages is how a person holds
|
|
it**; *nine one-page sections is not.* **The host segment never appears in
|
|
navigation.**
|
|
|
|
### Everything here is public, and that is arithmetic
|
|
|
|
*`externals` forbids adopting from a source less readable than the adopting
|
|
repository. This site is on the public internet.* **So a document must be
|
|
published to appear here** — *which turns the widening rule from a sentence
|
|
somebody has to remember into an incentive.*
|
|
|
|
> **The hazard runs the other way now.** *Wanting to be in the site is pressure
|
|
> to publish things that should not be.* **Grep a repository's history for
|
|
> anything address- or version-shaped when it changes visibility** — *that has
|
|
> already caught one node address.*
|
|
|
|
---
|
|
|
|
## Where things are
|
|
|
|
```
|
|
scripts/generate.mjs the whole projection. Read this first; it is commented.
|
|
astro.config.mjs sidebar autogenerates from directories — names no document
|
|
src/content.config.ts the `loom:` frontmatter block's schema
|
|
src/content/docs/
|
|
index.mdx hand-written home
|
|
<repo>/index.mdx hand-written guide, stamped
|
|
<repo>/<doc>.md GENERATED — do not edit
|
|
.loom/externals/ the adopted copies and .locks — do not edit either
|
|
.loom/externals/**/*.usages.md what of ours depends on each document
|
|
```
|
|
|
|
**Two directories hold copies and neither may be edited**, *for the same reason:*
|
|
**a copy that differs from its source is the only evidence that something moved
|
|
while nobody was watching.**
|
|
|
|
## Adding a document
|
|
|
|
```sh
|
|
loomctl external add loom/<repo> <doc>.md
|
|
npm run generate
|
|
```
|
|
|
|
*Nothing else. No config to touch.* **A document that stops being adopted has its
|
|
page removed by the generator**, *because a page for something no longer depended
|
|
on reads as current and nothing will ever correct it.*
|
|
|
|
---
|
|
|
|
## What is left
|
|
|
|
**Deploy.** *Nothing is wired up.* `npm run build` *emits `dist/`; it needs to
|
|
land at `loom.hypertheory-labs.dev`.* **`npm run check` belongs in whatever runs
|
|
first**, *so a stale guide fails before it ships.*
|
|
|
|
**`.gaps.md` on the site's own externals — deliberately not started.** *This
|
|
repository is a real adopter and will find real gaps; publishing them would make
|
|
the site more than a mirror.* **Left out of v1 on purpose** — *it is pointed in a
|
|
way a plain mirror is not, and that is Jeff's call.*
|
|
|
|
**The `annotating` guide holds a claim its source does not make** — *the
|
|
annotate-versus-correspond discriminator, which was settled in a cart round and
|
|
lives in another repository's `cart.gaps.md`.* **No check will ever catch that.**
|
|
*It is recorded in `annotating.usages.md`. If `annotating` is ever amended to
|
|
include it, delete the paragraph rather than leaving two sayings.*
|
|
|
|
**Sub-page staleness is not detected.** *The banner fires when a whole document
|
|
moves, not when the sentence a guide depended on changed* — **so it fires on
|
|
edits that do not matter and cannot fire more precisely.** *That is the known
|
|
limit and the `.usages.md` files say what each guide actually leans on.*
|
|
|
|
**`externals.md` owes an amendment.** *The lock grew a fourth column
|
|
(`visibility`) and the published document still describes three.* **That is
|
|
`loom/externals`' to fix, not this repository's** — *filing it as a gap here
|
|
would be the right move if it is not done soon.*
|
|
|
|
---
|
|
|
|
## The check phrase
|
|
|
|
**Jeff's, and it is the one that keeps this on the rails:**
|
|
|
|
> **Does anything here depend on it?**
|
|
|
|
*If nothing does, it is probably problem 3 — affordances, stagings, roles,
|
|
beads — which is **bracketed**.* **This site documents problems 1 and 2 only.**
|
|
*Do not add a section waiting for beads.*
|