jschoubben ed12ffb387 mesh-broker's Binding is the wire form and Held carries it, so list, show and orphans answer the binding
The seat's Binding takes the fields the events carry and the membership holds
(local, storage, template, stream, subject, bucket, object-store, history,
state, indexes, snapshot, types): one form in the events, in list, show and
orphans. Held gains binding, present on an entry the bus holds. Definition,
fixture and generated Go and TypeScript contract.

Builds: design 25 bindings-first-view §2, §7 (hq d0760629, PR 543)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:14:55 +01:00

mesh-contracts

The mesh's seat contracts (novox/hq ADR 0608 §5, ADR 0613, ADR 0620, ADR 0625, ADR 0627; design 26 A seat's definition): one language-neutral definition per seat, the Go and TypeScript code generated from it, and the client of a seat whose callers share logic over it. This repository holds contracts only and no seat: a seat's holder implements its contract, and no holder's code lives here.

Where a seat's code goes

  • The definition, written by hand: seats/<seat>/seat.json, its fixtures in seats/<seat>/fixtures/, and the parts several seats include whole in parts/ (none here now: the registry seats' part is mesh-delivery-contracts'). mesh-sdk's seatdef is the one reader of the format; the indexer and the generators use it.
  • A state, in the definition's states (ADR 0608 §1, ADR 0634 §6): {name, template, writer, key-forms, history, max-age-days, description}. template is one of ADR 0595's six (state, events, work-queue, log, objects, ledger); writer is holder (the default) or caller; each key form is {key, value, description}, the key a pattern of named parts between angle brackets (<asker>.<id>) and the value its JSON Schema. A definition names no holder module: a reader takes the holder from its own manifest's reads. A fixture of a state is state:<name>/<key>.
  • The seat set, generated: go/seats (module git.novox.be/novox/mesh-contracts/go), every seat's name, scope, verbs and provision at the seat list's grain (ADR 0625 §2). mesh-sdk's catalogue is its only importer in mesh-sdk. A change of it rebuilds every importer of the seat set. Its npm package is ts/ (@novox/mesh-contracts, the seat list alone).
  • A seat defined whole, generated: go/seats/<seat without hyphens>, a Go module of its own importing nothing, holding the seat's verbs, events and subjects, its message types and a test of its fixtures (ADR 0625 §1). A module imports only the seats it uses, so a change of one seat rebuilds only its users. Its npm package is ts/seats/<seat without hyphens> (@novox/mesh-contracts-<seat>), holding the parts it includes whole: the indexer counts the npm package a lock resolves, so here too a module is rebuilt only for the seats it uses.
  • A seat's client, written by hand: go/clients/<seat without hyphens>client, a Go module of its own, only where two or more callers share logic over the seat (ADR 0625 §4, ADR 0627 §1): operator-channel's (checking an ask, its digest, a warrant's, and an asking module's keeping of its asks), node-engine's (checking compose-candidate's ask and answer). A client imports its own seat's contract and mesh-sdk's runtime, never another seat's client, and names no module's subject or tool.
  • Not here: the value layouts of seats not yet defined whole (they stay in mesh-sdk until their domain moves, ADR 0625 §9), and a role only one module could ever play (that module's own tools and events, ADR 0625 §8).

How it is checked

Every file under go/ and ts/ outside go/clients/ is written by the generator (seatgen, the source of the Go and Node build modules' generate step) and compared on every build: a hand-written file there fails, named (ADR 0625 §5). seatgen -check (mesh-catalog modules/mesh-build-go/buildstep/cmd/seatgen) also runs the client check (each client is for a seat defined whole, a module of its own, importing only its seat's contract and mesh-sdk) and checks module.json's Go and npm package artifacts against the tree.

Made by the mesh from the gitea module's config value repositories (novox/hq ADR 0428). Main takes no push: a change reaches it by a pull request whose mesh/check passed: the checker's verdict on its head merged onto main, its tests run by their language's convention (novox/hq ADR 0447, ADR 0445).

S
Description
Novox Mesh — contracts: every seat's definition (verbs, events, fixtures) and the Go and TypeScript packages generated from them (ADR 0613).
Readme
954 KiB
Languages
Go 80.4%
TypeScript 19.6%