declined a separate adopt verb, and say that add will not rewrite

Both parties reached the same deadlock independently: add refusing an existing
path, and check unable to ask about a document with no recorded origin. adopt was
the other way out and is not obviously worse.

Not taken because the byte comparison makes the verb unnecessary. Whatever the
command is called it must not trust the claim — it has to fetch and compare,
because the point is that nobody knows whether the local copy is still a copy — and
once it does that, it is add with an origin supplied. A verb earns its place by
naming an act rather than a state, and present-but-unlocked is a condition a
repository is temporarily in.

Recorded with the falsifier: if people and agents keep dropping documents into
externals by hand, and they will, it is a recurring category rather than a
migration, and then it deserves its own word in --help rather than a hint.

Also makes check's hint say that add supplies the origin without rewriting the
local copy, since the previous wording left that to be inferred.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018UTxuSizozEA8yDitPuris
This commit is contained in:
2026-09-07 15:01:56 -04:00
co-authored by Claude Opus 5
parent 021bf63a11
commit c0ae0e892f
2 changed files with 27 additions and 1 deletions
+26
View File
@@ -688,3 +688,29 @@ external, discard does not mean the change goes away** — *the upstream moved
whatever we do* — **so discarding is really "knowingly stale", and nothing whatever we do* — **so discarding is really "knowingly stale", and nothing
currently records that choice.** *If people discard often, that silence is the currently records that choice.** *If people discard often, that silence is the
next defect.* next defect.*
## 2026-09-07 — declined: a separate `adopt` verb `marmalade`
**Considered:** *`loomctl external adopt <path> <url>`* — **a command whose job is
to say "this copy came from there"**, *for a document that is present but
unlocked.* **Both parties reached the deadlock independently and this was the
other way out.**
**Not done, because the byte comparison makes the verb unnecessary.** *Whatever
the command is called, it must not trust the claim* — **it has to fetch and
compare, because the whole point is that nobody knows whether the local copy is
still a copy.** *Once it does that, it is `add` with an origin supplied, and the
user's intent in both cases is the same sentence: **I depend on this document and
here is where it lives.***
**And a verb earns its place by naming an act, not a state.** *"Present but
unlocked" is a condition a repository is temporarily in* — **a permanent command
for it advertises a transitional situation as a normal one.**
**Belief that could be shown wrong:** *that the condition is transitional.* **If
people and agents keep dropping documents into `externals/` by hand — and they
will — it is a recurring category and not a migration**, *and then it deserves its
own word, discoverable in `--help` rather than found in a hint.*
*The domain word survives regardless: `externals` says adopting is fetching a URL,
and the tool says `adopted` throughout.*
+1 -1
View File
@@ -311,7 +311,7 @@ func checkUnlocked(cfg *config.Config, root, rel string, locks *lock.Set, open b
// Without a lock we have no origin, and the path does not round-trip to a // Without a lock we have no origin, and the path does not round-trip to a
// URL, so there is nothing to ask and nowhere to ask it. Supplying the URL // URL, so there is nothing to ask and nowhere to ask it. Supplying the URL
// through add is the only way out. // through add is the only way out.
return Status{rel, "unlocked", "no origin recorded — `loomctl external add <url>` supplies it"}, 0 return Status{rel, "unlocked", "no origin recorded — `loomctl external add <url>` supplies it without rewriting this copy"}, 0
} }
func usagesNote(root, rel string) string { func usagesNote(root, rel string) string {