From 13dee755297b9b2a3d1366b1296984fb45978636 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 29 Oct 2026 07:17:22 +0000 Subject: [PATCH] docs(chord): every remote type declares its placement --- packages/chord/docs/next/decisions.md | 6 ++++++ packages/chord/docs/next/design.md | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/chord/docs/next/decisions.md b/packages/chord/docs/next/decisions.md index 17b8e8aa4..d4ba29fe0 100644 --- a/packages/chord/docs/next/decisions.md +++ b/packages/chord/docs/next/decisions.md @@ -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 diff --git a/packages/chord/docs/next/design.md b/packages/chord/docs/next/design.md index dc38b5642..2772ee9e8 100644 --- a/packages/chord/docs/next/design.md +++ b/packages/chord/docs/next/design.md @@ -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`) |