docs(chord): every remote type declares its placement

This commit is contained in:
Mario Zechner 2026-10-29 07:17:22 +00:00
parent 1b760044ec
commit 13dee75529
2 changed files with 9 additions and 3 deletions

View file

@ -1771,6 +1771,12 @@ validation and copies the v2 kernel added around Delta.
setups a registry without a value cannot get one before a reload, so a reader then fails at once `transient`
(`unavailable/undeclared`) and is retried when the registry gets its first value (R18), as `self.get` of a type not
served here fails at once (refined 2026-10-27 after the second spec review: no `readyTimeout` wait at start); once live, a later failure of the registry changes nothing (last good value).
- **Every remote type declares its placement (owner, 2026-10-29: "yes, let's remove it"):** `placement` is required in
`remote()` (a type error without it, and a declaration error at runtime); a remote type without placement, a leftover
of slice 3a (remote objects over one link, before host kinds in 4a), is gone, and with it the fallback "here if served
here, otherwise the parent" and its re-placement at the first parent link. Every remote request is placed by its
address alone (dependency model, `packages/chord/docs/next/dependencies/`). Tests and examples get `placement: () =>
Server()` or their own host kind.
- **No client providers for now (owner, 2026-10-28: "yeah, no client providers for now"; reviews
`/tmp/barrier-{astra,fable,opus,sol}.md`):** clients stay unaddressable and serve only `local` types (design §3).
Client-side capabilities (a phone's camera, clipboard, a page's WebMCP tools) go through an owner's state, as the

View file

@ -117,8 +117,8 @@ export const Catalog = remote("catalog", { placement: () => Server(), … });
- `hostKind(name, params?)` declares a kind of addressable host; its params follow the params policy of contracts
(section 5). `Session({ id: "S1" })` is an **address**: `{ kind, params, key }`, the key built like an identity key
(`session|S1`); two addresses are equal when their keys are. No host-name strings appear in app code.
- **`placement`** (owner, 2026-10-21) is a typed function of the params returning an address; `local` contracts have
none. It is not part of the contract fingerprint; a changed rule surfaces as a refusal (below).
- **`placement`** (owner, 2026-10-21) is a typed function of the params returning an address, required on every
`remote` contract (owner, 2026-10-29); `local` contracts have none. It is not part of the contract fingerprint; a changed rule surfaces as a refusal (below).
- **`params`** (owner, 2026-10-21; was `input`) select the instance among objects of its type and are part of its
identity (section 5).
- **The caller computes the address** and sends it in the `hold`; a host that relays routes by that address alone and
@ -129,7 +129,7 @@ export const Catalog = remote("catalog", { placement: () => Server(), … });
| Case | Goes |
| --- | --- |
| the type is served here and its placement (computed here from the params) is this host's address, or the host has no address, or the type no placement | here |
| the type is served here and its placement (computed here from the params) is this host's address, or the host has no address | here |
| a reference made here (`host.get`/`hold`, `self.get`, `ctx.get`) to a served type placed on another host | on, as if not served here (next rows): worker S1 reaches `Notes { session: "S2" }` through the parent |
| an arriving hold for a served type whose params place it on another host | broken `invalid/placement`; the address the hold names only routes it |
| the hold names an address of a kind this host has a route for | over that route's link (the address's params checked against the kind, then `authorize`) |