commit 0e827851ec57ff86f36b44445a2c432465b01468 Author: Jeff Gonzalez Date: Mon Sep 7 10:53:44 2026 -0400 the cart agreement, v0 Published to give the document an address. The README states what the agreement depends on (annotating/v0), the four roles it leaves to adopters, and the one among them that is not a preference — when one party cannot feel a cost, the decision belongs to the party who can, and an agent will not feel a cart filling. Also states what is known and unresolved: an out-of-scope need has no exit. Conversion emits the artifact and the declines, and a thing that came up, was correctly out of scope, and was neither refused nor decided is neither of those, so today "out of scope" means "lost". Proposed as a third exit, not adopted, and loom's to make. This is the copy adopted by staribridge/substrate on 2026-08-21 and reconciled to v0 the same day, read many times and never edited. If loom's own copy differs, this one is wrong. Co-Authored-By: Claude Opus 5 (1M context) diff --git a/.loom/published/cart.md b/.loom/published/cart.md new file mode 100644 index 0000000..46a2d5d --- /dev/null +++ b/.loom/published/cart.md @@ -0,0 +1,262 @@ +# Agreement — the cart + +**v0.** Depends on `annotating/v0`. + +**How two parties work out what something means before one of them changes it.** + +--- + +## Why + +An AI has no good way to say *"I need to know more from you before I do this, and +I suspect you don't know either, and I don't want to make you look stupid."* +Neither do most people — **they assume the lightbulb will arrive once enough +content has been offloaded on them.** + +**The cart gives that sentence somewhere to go where it does not read as an +obstruction.** + +### Say what you will do if nobody answers + +**Every open item states its own fallback.** *"If unanswered I will store an +opaque string and not link it."* + +**This is what stops the cart from stalling.** Without it an unanswered question +is an unresolved obligation and work stops; with it, **silence is a usable +reply** and the round can close with items still open in a way both parties +understand. + +> **Silence means proceed. It never means dropped.** + +*A fallback that quietly becomes the decision is worth knowing about later, so it +is worth being able to find them.* + +## The cart is the round, not the folder + +**A cart is one bounded exchange.** It starts, it runs, it **converts**, and then +it is gone. The directory is only where a cart happens. + +**What ends a cart is size, not time.** + +> **A cart converts when it exceeds what two people can hold at once.** + +*A whiteboard's virtue is that it is bounded and erasable: when it fills, you have +to decide what matters. Cover the walls and you have removed the only thing it +was doing for you.* + +**A cart that cannot convert and a commit that cannot be reviewed are the same +failure.** The sphere got bigger than a head. + +## Two files. Only ever two. + +**One daily per presence.** One for the owner of the code. One for **everyone +else**, collapsed into a single voice. + +**A presence is not a person.** Three people on the outside speak as one, or they +do not speak — and **they do their disagreeing somewhere else first, in their own +cart, where they are the two parties.** Carts nest by party-pair, not by topic. + +**There is never a third file.** `jill-daily.md`, `bill-daily.md`, +`im-the-ceo.md` is a chat log; a chat log has no bound; **something with no bound +never converts.** + +**The test, when someone wants a third:** *what happens to this file when the +person changes?* **If it transfers, it was a stake. If it dies, it was a person.** + +*If someone with authority wants in: have them write it as a venue constraint for +the org instead. **An authority claim entering as a venue fact carries a reason +and can be shown wrong. Entering as a voice in a cart, it cannot.*** + +## Only dailies get annotated + +**Anything else you put in someone's cart is a specimen.** + +> **Specimen** — evidence. *Look at this; it may bear on your decision.* It +> belongs to the repository the cart lives in, **and they may throw it away +> without asking you.** Default: discard. + +> **Polad** — a candidate artifact, shaped exactly like what it would become, +> staged so you can see whether it fits. Default: apply or discard. + +**Promotion is explicit.** A specimen cannot drift into a kept file — **if you +want to keep it, it must be re-shaped as a polad and placed deliberately.** +*Otherwise `docs/` fills with things nobody threw away.* + +**A specimen cannot travel between carts.** If it still matters in the next one, +**it is reintroduced, with a fresh reason** — *"this is still here because of line +1,237."* Anything that travels silently accrues standing nobody re-affirmed. + +**So responding to a specimen means restating it in your own daily, in your own +words.** That costs precision and buys something better: + +> **Pinning a defect in place lets you be exact without having understood. +> Restating surfaces the misunderstanding that pinning hides.** + +## Conversion emits two things + +**The artifact** — the code, the decision, the change — **and the declines.** + +> **A decline is what you considered and did not do, with the reason you did +> not.** + +**Almost nobody writes these.** Three weeks later someone proposes the thing you +already rejected, and the rejection is gone because it lived in an annotation +that died with the round. + +**A decline needs no file of its own.** It is an entry in whatever durable record +you keep, and **it should say what you believed, not just what you chose** — only +a belief can later be shown wrong. + +## Where a cart lives, and the shelf + +**A fixed path, and at most two things in it:** + +``` +{wherever you put carts}/ +├── current/ +│ ├── name one meaningless word +│ ├── {x}-daily.md +│ └── {y}-daily.md +└── shelf/ remnants of the last round, if any +``` + +**The directory names are fixed on purpose.** A cart directory you can name +becomes `PROJ-1234` within a month, and then the cart *is* a ticket — with a +status, an assignee, and a backlog behind it. **The name goes in a file, where +nothing navigates by it.** + +**Three states, visible in a listing:** no `current/` → no cart. `current/` alone +→ open, last round fully resolved. **`current/` and `shelf/` → carry-forward +pending.** + +### Converting: whose act it is, and who decides when + +**The cart lives in someone's repository, and it is theirs to reshape and theirs +to convert.** This is not a permission question. + +**But converting ends a round the other presence may be standing in**, so: + +> **Do not convert while someone is mid-thought. Ask whether they are ready. If +> you convert alone anyway, say so** — and expect them to reintroduce whatever +> they were in the middle of. + +*The harm is smaller than it sounds: **the shelf catches what did not resolve**, +so nothing is destroyed. What is taken is the round, and a round is recoverable +by reintroduction with a reason.* + +**If a tool offers a convert action, its confirmation should restate this and +nothing more.** A dialog that invents an obligation creates **shadow policy** — +something everyone obeys, nobody agreed to, and which cannot be found or argued +with. + +### Deciding *when* belongs to a presence that can feel the bound + +**The size trigger assumes someone notices a cart getting full. Not every +presence has that instrument.** + +An AI in a cart **will not feel it filling and will keep going until told to +stop** — not from carelessness; there is nothing there to feel it with. **Asking +would produce an answer, and the answer would be fabricated.** + +> **When one party cannot feel a cost, the decision belongs to the party who +> can.** Sensor placement, not authority. + +*The same reason an agent commits and does not push: the consequences of a push +land on people it cannot experience. **Say who owns the conversion call, in your +notes file, before you need it.*** + +**If neither presence can feel it** — two agents in a cart with no human — **size +is not an available trigger** and you need a different one. We do not have a good +answer for that case. + +### A third trigger, from use + +**A cart may want to convert when the ground shifts under it**, at any size — +*not* a change of subject, but a change of the coordinate system: the protocol +itself changed, or a venue moved, and the round you are in was framed by +something that no longer holds. + +*Reported by the first adopter, from a cart that was small and still wanted to +end. It may be its own trigger or too rare to be worth naming.* + +### The shelf + +**One live cart. Ever.** *"Let's switch to another cart"* is how nothing ever +converts. + +**The shelf holds what did not resolve when the last cart converted**, and +carrying something forward means **re-authoring it**, not moving it. + +> **Act as if the shelf is discarded at least once a day.** + +**Nothing enforces that, and it is still the useful rule**, because it sorts +without enforcing: **if you would mind losing it overnight, it was never shelf +material.** It is a polad to apply, an entry to log, or a decline to record. + +**Which is why no polad ever goes in the shelf.** A polad has exactly two exits — +**applied or discarded** — and forcing that at conversion is the point, because +conversion is when you know most about it. + +**If you find mid-round that you are in the wrong cart**, move it out of here +entirely — **not to the shelf**, which is a carry-forward slot with nothing to +carry into. Anything from it that still matters is **reintroduced later with a +fresh reason.** *And it owes one sentence: what the conversation turned out to +be. Not a justification — the name of the round you were actually in.* + +## The cart's name + +**Give the cart a meaningless name.** A uuid, or `watermelon`. **Meaningless on +purpose**, so it cannot accrue a category. + +**Tag durable entries with it.** The tag says exactly one thing: + +> **Everything tagged with this name was considered in a single sphere of +> understanding.** + +**The cart is gone by then.** You keep the boundary without keeping the container +— so you can later ask *what else was in the room when we decided this*, which is +the question someone who was not there actually asks. + +--- + +## Roles you must cast + +**An agreement adopted with these uncast has not been adopted. It has been +filed.** + +## Select: Where does a cart live? +- `.loom/cart/` +- somewhere else under `.loom/` +- outside `.loom/` entirely +- there is no directory; carts happen somewhere that is not the repository + +## Select: What is the durable record that declines go into? +- an event log file in the repository +- ADRs +- commit trailers +- an issue tracker +- nothing yet — declines are written and lost, knowingly + +## Select: What isolates work in progress while a cart is open? +- a local branch +- a worktree +- a separate clone +- nothing; work happens in place + +## Question: Who are the two presences, and what happens to each file if that person leaves? + +*Name them. If either answer is "the file dies," you have a person and not a +stake, and the cart will grow a third file within a month.* + +--- + +## What we know is unsettled + +**Whether size is the only conversion trigger.** Size is what has been observed — +a cart might also want to convert on a **change of subject** at small size, and +there is no example either way. + +**Whether `specimen` and `polad` stay two roles.** They are two here because +promotion is a deliberate act. If specimens routinely turn out to persist without +anyone promoting them, that is one role with a discovered property, and this is +wrong. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f1cf9f7 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# cart + +**How two parties work out what something means before one of them changes it — +including when neither of them knows.** + +- [The agreement](.loom/published/cart.md) — `v0` + +**A cart is one bounded exchange.** *It starts, it runs, it **converts**, and then +it is gone. The directory is only where a cart happens.* + +## What it depends on + +**[`annotating/v0`](https://git.hypertheory-labs.dev/loom/annotating).** *Dailies +are annotated, and everything here rests on that.* + +## Four roles it leaves to you + +**An agreement adopted with these uncast has not been adopted. It has been +filed.** + +- **Where a cart lives** +- **What durable record declines go into** +- **What isolates work in progress while a cart is open** +- **Who decides when the round ends** — *and this one is not a preference. + **When one party cannot feel a cost, the decision belongs to the party who + can.** An agent will not feel a cart filling and will keep writing until told + to stop.* + +*The agreement asks these as prompts. **Answer them where you adopt it**, not +here.* + +## Known and unresolved + +**An out-of-scope need has no exit.** *Conversion emits the artifact and the +declines — and a thing that came up, was correctly out of scope, and was neither +refused nor decided is neither of those.* **Today "out of scope" means "lost."** + +*Proposed as a third exit and not yet adopted; it is loom's to make. Recorded in +[`bedrock`](https://git.hypertheory-labs.dev/loom/bedrock)'s event log, cart +`almanac`.* + +## Provenance of this copy + +**Adopted by `staribridge/substrate` on 2026-08-21 and reconciled to `v0` the +same day.** *Read many times, never edited.* **If loom's own copy differs, this +one is wrong and should be replaced before anybody adopts it.**