diff --git a/.loom/event-log.md b/.loom/event-log.md index babad43..337eff4 100644 --- a/.loom/event-log.md +++ b/.loom/event-log.md @@ -7,21 +7,6 @@ by saying so.* --- -## 2026-09-07 — what this tool is `osprey` - -**Decided:** *`loom-cli` is a fetcher and a comparator.* **It fetches a document -you depend on and tells you whether the publisher's copy has moved.** *It reports -and never repairs.* - -**Believed to advance:** *every act in the loom model is a file in somebody's -repository — publishing is writing one, adopting is fetching a URL, homing a gap -is an `mv`.* **Almost nothing needs a program**, so the program should be the -part that cannot be done by hand: an HTTP request, repeated. - -**Belief that could be shown wrong:** *that reporting is enough.* **If every -report is followed by the same manual act, we have moved the work rather than -removed it**, and the missing command will be obvious. - ## 2026-09-07 — the design lives here and not in a spec `osprey` **Decided:** *this log is the artifact of `osprey`.* **No specification document @@ -72,40 +57,6 @@ somebody's published surface or from a file they may rename at will. location.* **If anybody writes code that parses it back into a URL, the path should stop looking like one.** -## 2026-09-07 — the lock, and what it holds `osprey` - -**Decided:** *one record per adopted document in `.loom/externals/.locks`: the -**resolved** origin URL, and the `ETag` it came with.* - -**Believed to advance:** *the specimen said there would be no lock file, on the -strength of the `ETag`-as-blob-hash claim.* **That claim failed twice**, so the -file exists and is named for what it is. *It was briefly called `.etags`, from -when we believed there would be one field.* - -**Resolved, and not the short form.** *Measured: gitea `303`s -`/loom/externals/raw/externals.md` to `/raw/branch/main/…`* — **so a lock holding a -short URL is locked to whatever the default branch is at the time you ask**, and a -branch rename reports as a change in the document. - -**Belief that could be shown wrong:** *that one file is cheap.* **Two fetches in -one round conflict inside it, and the conflict is in a file no human can resolve -by reading.** *If that bites, it becomes one record per document and the tree is -mirrored twice.* - -## 2026-09-07 — unlocked is a state `osprey` - -**Decided:** *a document with no lock is reported as unlocked.* **`check` never -adopts whatever the remote is currently serving as the lock.** - -**Believed to advance:** *adopting it would assert the local copy is the one being -served, which is the thing you were about to check.* **It is the hash assumption -in a different coat, and it fails silently in the one case that matters — a copy -somebody edited.** - -**Belief that could be shown wrong:** *that anybody will run `pull` again to fix -it.* **If unlocked documents simply accumulate, the report is noise and something -has to lock them.** - ## 2026-09-07 — `404` is unresolved, and that is no longer provisional `osprey` **Decided:** *`check` reports a `404` as unresolvable — the document was withdrawn @@ -450,16 +401,6 @@ unknown.** next token*, **and because if a read scope is not enough, that is the only argument for keeping ssh.** -## 2026-09-07 — `--help` is the documentation surface `marmalade` - -**Decided:** *`--help` is what a person or an agent actually runs when handed an -unfamiliar CLI, so it is the surface that has to be good* — **say what a command -does and what it will not do.** - -**A `.loom/published/` for `loomctl` is deferred, not declined.** *The distinction -matters because `init` was declined.* **It earns publication when somebody depends -on this tool's behaviour rather than reading its help.** - ## 2026-09-07 — decided by fallback: where the credential lives `marmalade` **Nobody chose this; the fallback became the decision and that is recorded so it @@ -789,21 +730,6 @@ designed to be ephemeral is the first step in it not being ephemeral.** unit.* **If two presences ever work from different machines, the cart has nowhere to live**, *and everything above stops being true at once.* -## 2026-09-07 — conversion now destroys, so the log is the only record `quince` - -**Under `cart/v1` the cart is untracked, so converting a round deletes its dailies -outright.** *Every previous conversion left them in git.* - -**So an entry that was not written before the `rm` is gone**, *and the write-ahead -log is the mechanism* — **stage as you go, because at conversion the cart is the -only copy and you are about to delete it.** - -**And it sharpens a conflict recorded in `cart.usages.md`:** *the annotation -protocol here says commit before dissolving because git is the only archive.* -**With an ignored cart there is no archive, so dissolving a notes file destroys -the annotations outright.** *Both documents are loom's; this is where an adopter -can see the collision.* - ## 2026-09-07 — declined for now: reference-only adoption `quince` **`externals` offers two ways out of the confidentiality rule.** *We implement @@ -1041,27 +967,6 @@ it wrong.* configured one.* **It only pays if it is the same everywhere**, *which is not ours to decide and is with `bedrock`.* -## 2026-09-08 — the lock records visibility, and the word it will not use `sorrel` - -**Decided:** *the lock carries what the source could be read as when it was -fetched, and `check` audits it against this repository's visibility now.* - -**Believed to advance:** *access is verified once, at fetch, and the copy is -durable.* **Whether an adoption is still legitimate rests on the relative -visibility of two repositories — a fact somebody can change with a checkbox a year -later, without ever seeing the adoption.** *Recording it turns a silent permanent -hazard into something that runs.* - -**The value is `public` or `not-public`, and never `private`.** *An anonymous -request tells those two apart and nothing finer* — **so it cannot see two -repositories private to different people, which is the case where adopting between -private repositories genuinely widens access.** *The word `private` would claim -precision the signal does not have.* - -**Belief that could be shown wrong:** *that the coarse signal is worth having.* -**If the cases that matter here are all private-to-private, this alarm will never -fire and the field is ceremony.** - ## 2026-09-08 — a probe is not a fetch, and confusing them clears alarms `sorrel` **Recorded because the bug was one line and the trap is permanent.** @@ -1151,3 +1056,57 @@ guarantee rather than from anybody's code.* *Consequence nobody predicted: reconciling cleared the banner with no acknowledgement, which is correct — an acknowledgement is for a guide that is behind, and this one was ahead.* + +## 2026-09-08 — compacted, and it barely compressed `tansy` + +**A compaction is itself a decision, so this is the entry `recording-decisions` +asks for.** *Six entries dropped, fifty kept. The uncompacted log is in git +history, which is where a reader who needs it goes.* + +**Dropped, each because a competent reader can now recover it from the artifact, +and here is which artifact:** + +- *`what this tool is`* — **`.loom/published/guarantees.md` and `README.md`** +- *`the lock, and what it holds`* — **`guarantees.md` documents the format** +- *`unlocked is a state`* — **`guarantees.md`, and `add` refuses in code** +- *`--help is the documentation surface`* — **`README.md` says so and points there** +- *`the lock records visibility, and the word it will not use`* — **`guarantees.md` + carries the field and the refusal of the word `private`** +- *`conversion now destroys, so the log is the only record`* — **`cart/v2`, adopted + here, and `cart.usages.md` names `wal.md` as the mechanism** + +> **Every one of them became droppable by being published.** *Nothing was +> summarised away; the content moved into a document somebody else can lock, which +> is a stronger place for it than a log only we read.* + +## What did not compress, and why that is the finding + +**Fifty entries survived, and the reason is the rule rather than sentiment.** +*Almost all of them are one of the four kinds that may never be dropped:* + +**Declines** — *`init`, `published check`, a separate `adopt` verb, a plugin +boundary, an audience declaration, reference-only adoption, resolving `404` over +ssh, a second orientation file, worktrees, a spec, fixing `annotating`.* **Not one +is recoverable from the code, because the code is what they are absent from.** + +**Measurements** — *the `ETag` is a blob hash on gitea and not on GitHub; three +hosts and one partial clone; only gitea resolves its own short raw URL; a refused +write names the token's scopes; a private repository over HTTPS with a read +token.* **Facts about other people's systems, which no artifact here holds.** + +**Supersessions** — *publication is not publicness; a cart is not committed; `add` +does not replace; `git` is not needed for `list` only; the private path is +exercised.* **Each is a change of mind, which is most of what a reader wants.** + +**Beliefs shown wrong** — *the specimen's hash-as-lock; `others` read as +`everyone`; a probe treated as a fetch; a banner that claimed a direction two +opaque strings cannot support.* + +> **The log is long because the work was exploratory, not because it is padded.** +> *A project that mostly built things would compact to a page. This one mostly +> found out it was wrong about things, and that is the part the code cannot +> hold.* + +**Belief that could be shown wrong:** *that fifty is readable.* **It is today.** +*The next remedy is not another compaction — it is the guide `bedrock` needed, +and it is not needed yet.*