From d0687bce8582a1cc7077585b71e12b24913d9aa9 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 29 Oct 2026 07:29:25 +0000 Subject: [PATCH] docs(chord): only hosts with an address serve remote types; holds always carry their address --- packages/chord/docs/next/decisions.md | 4 ++++ packages/chord/docs/next/design.md | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/chord/docs/next/decisions.md b/packages/chord/docs/next/decisions.md index b7b7a89ca..e87d429d7 100644 --- a/packages/chord/docs/next/decisions.md +++ b/packages/chord/docs/next/decisions.md @@ -1771,6 +1771,10 @@ 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). +- **Only hosts with an address serve remote types (owner, 2026-10-29: "b"):** a host serving a `remote` type needs an + address and a principal; `load` refuses a facet that serves one on a host without an address (until now a host with + a principal but no address served remote types and placed every one of them "here"). So "here" is decided by the + address alone, as the host address of the type. Holds carry their `address` always (required on the wire). - **`hostAddress` instead of `placement` (owner, 2026-10-29: "yes, rename"):** the field of a `remote` contract that computes where its object lives is `hostAddress: (params) => Address` (it returns the address of the host that serves the object, the vocabulary of `createHost({ address })`, routes and holds); supersedes the name of "`placement`, not diff --git a/packages/chord/docs/next/design.md b/packages/chord/docs/next/design.md index 754c96cc2..66a76765f 100644 --- a/packages/chord/docs/next/design.md +++ b/packages/chord/docs/next/design.md @@ -88,8 +88,9 @@ worker worker worker addressable by a typed address, started on demand | server | yes, one | its own declaration | runs | | worker | yes, many | stamped by the parent | started on demand by the app | -Clients serve only `local` types (they are not addressable): a host without a principal refuses to serve a remote type -(`load` throws; a remote object is owned by a principal of the host serving it; owner, 2026-10-24). No client providers for now (owner, +Clients serve only `local` types (they are not addressable): a host without a principal or without an address refuses +to serve a remote type (`load` throws; a remote object is owned by a principal of the host serving it, owner, +2026-10-24; and placed by its host address, owner, 2026-10-29). No client providers for now (owner, 2026-10-28): client-side capabilities (a camera, WebMCP tools) go through an owner's requests that clients answer (section 20, the Questions service). A client's local calls have no principal; what a client calls on the server is stamped with the client's authenticated principal. @@ -130,7 +131,7 @@ export const Catalog = remote("catalog", { hostAddress: () => Server(), … }); | Case | Goes | | --- | --- | - | the type is served here and its host address (computed here from the params) is this host's address, or the host has no address | here | + | the type is served here and its host address (computed here from the params) is this host's 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/host_address`; 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`) | @@ -1797,7 +1798,7 @@ validation, no clone of snapshots or ops. | Kind | Direction | Fields | | --- | --- | --- | | `hello` | both, first | `protocol`, `incarnation`, `calls` (the call window N) | - | `hold` | to provider | `origin?`, `hold`, `type`, `version`, `fingerprint`, `params` (part), `address?`, `principal?`, `incarnation?`, `chain?` (activation chain, Q5), `limit?` (decoded size limit, 4b) | + | `hold` | to provider | `origin?`, `hold`, `type`, `version`, `fingerprint`, `params` (part), `address`, `principal?`, `incarnation?`, `chain?` (activation chain, Q5), `limit?` (decoded size limit, 4b) | | `revoke` | parent to child (route link) | the revocation value (4b) | | `release`, `retry` | to provider | `origin?`, `hold` | | `call` | to provider | `origin?`, `call`, `hold`, `method` (index), `args?` (part; absent: no arguments), `segments?` |