docs(chord): slice 8 registry failures

This commit is contained in:
Mario Zechner 2026-10-28 17:15:50 +00:00
parent 1e1716e69a
commit 9cef0db2d6
2 changed files with 12 additions and 3 deletions

View file

@ -1742,6 +1742,11 @@ validation and copies the v2 kernel added around Delta.
for versioned things: a shared definition (object types, registries) keeps its adapters with the provider; a
definition of one owner (documents, tables, `json(...)` columns, jobs) keeps them in itself. Refines Q8's "one
authoritative declaration" (the serve is it) and design §17's example.
- **Slice 8: registry failures (owner, 2026-10-27: "ok", "agree"):** contributions never fail a registry: a
watchable contribution that fails is left out of the table and reported (`contribution_failed`), back once healed;
a throwing `compose` (the owner's bug) is reported (`registry_failed`), its watches get a `failed` call, and `.value`
keeps the last good composition (before any, it throws). Derives keep `.value` throwing while failed: state must match
its sources, an extension point must stay available.
- **The performance and memory bar, and converging reviews (owner, 2026-10-27: "yes"):** supersedes "as good as
HEAD in everything" for Chord v2 slices and pi changes. CPU: each hot path (calls, changes, watches, links) within
about 5% of HEAD, measured in bursts with alternating processes pinned to one CPU; worse is fixed or goes to the

View file

@ -62,9 +62,13 @@ await host.root(async (ctx) => (await ctx.get(Notes, { session })).add(note, ctx
`contribution_refused { registry, plugin, version }`).
- **`compose(table, { report })`:** pure, runs whenever the table changes (a contributor goes live or ends, a
contribution that is a watchable changes), in the owner's flush, never inside another owner's commit step (W4);
`report(conflict)` goes to `onError` as `registry_conflict { registry, message, plugins }`. A throwing `compose`
makes the composed value fail: its watches get a `failed` call, `.value` throws the error, the next good compose heals
it ("Failures are watch calls").
`report(conflict)` goes to `onError` as `registry_conflict { registry, message, plugins }`.
- **Failures (owner, 2026-10-27):** contributions never fail the registry. A contribution that is a watchable and fails
is left out of the table and reported (`contribution_failed { registry, plugin, error }`), the table recomposes without
it, and it is back once it heals. A `compose` that throws (the owner's bug) is reported (`registry_failed { registry,
error }`), the composed value's watches get a `failed` call, and `.value` keeps the last good composition (an extension
point stays available; derives keep their own rule, `.value` throwing while failed); the next good composition
replaces it. Before any good composition `.value` throws the error.
- **Without a provider** (the defining plugin is not loaded): the composed value is failed with
`unavailable/undeclared` (readers see the error as from a failed reference); contributions wait in the table; its
serve heals it.