Commit Graph
61 Commits
Author SHA1 Message Date
jschoubben bd49b184a2 Merge b4/registry: Placement and Identity-and-access contracts, the domain on their definitions (ADR 0634 §7, §9; ADR 0636 §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 14:42:12 +01:00
jschoubben 551870d8d5 Fixtures captured from the holders' own read tools for the states that had none (conditions, findings, presence, stuck, would, resolved, asks, packages); the packages item requires absent (ADR 0634 §6; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 14:40:27 +01:00
jschoubben f4a69e85f2 node-engine: the verbs seat-list and seat-list-again (the operator and the healers) and the state findings, with fixtures (ADR 0636 §1, §7; issue 1966) 2026-11-05 14:34:07 +01:00
jschoubben af804f5abf Hand-acts recorder is mesh-sdk's views.HandActs; the conditions client writes a part's findings as views.FindingWriter (ADR 0634 §4, ADR 0635 §4; issue 1966) 2026-11-05 14:16:53 +01:00
jschoubben fb5451f694 mesh-vault and mesh-node-enroller clients: the signing, the node's two logins and the own-secret drift; the token and the redeem proof (ADR 0634 §4; C-10; issue 1966) 2026-11-05 14:16:00 +01:00
jschoubben 97b7da6128 mesh-provisioner: the provision's plan entry typed in the definition, and fixtures for its two states (ADR 0634 §6; issue 1966) 2026-11-05 14:15:36 +01:00
jschoubben 935a0c7753 Each generated TypeScript package gets its lock, its package.json without dependencies and its type-check config (ADR 0634 §8, F7; issue 1966) 2026-11-05 14:14:32 +01:00
jschoubben c5fc93644f mesh-module-assigner client: the placement keys assembled into a node's placement, who stands where since when, who holds a seat, what a placement says to the composition; the node key's digest kept as the first writer made it (ADR 0634 §4; C-6; issue 1966) 2026-11-05 14:14:01 +01:00
jschoubben 929bf5539e Every seat definition names its glossary domain; the schema requires it (ADR 0636 §5; issue 1966) 2026-11-05 14:11:19 +01:00
jschoubben 326d729c0b Placement and Identity-and-access contracts: mesh-module-assigner and mesh-wants whole with states, mesh-vault moves, mesh-node-enroller whole, node-secret-service moves; the two seats renamed (ADR 0634 §7, §9; C-5, C-10; issue 1966) 2026-11-05 14:09:45 +01:00
jschoubben a3106a4b64 Provisioner client: the key and plan layouts, the provider and its harness, moved from mesh-sdk; the provider's 31 tests are 6 tables, the plan stays typed in the client (ADR 0634, ADR 0635; issue 1966) 2026-11-05 14:09:06 +01:00
jschoubben f7cc1ba920 Connectivity seat-list files join their folder; root module.json drops the seat-set and operator-channel packages (ADR 0634, ADR 0636; issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-05 13:24:11 +01:00
jschoubben 211bdcaa5e Regenerate the domain contracts; hand-acts and conditions clients; operator-channel client moves; the seat-set package ends (ADR 0634, ADR 0635; issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-05 13:19:37 +01:00
jschoubben 23a759c78b Domain contracts folders: health-and-repair, provisioning, connectivity, operator-and-conversation hold their seats' definitions with states; node-engine and mesh-config gain states (ADR 0634, ADR 0635; issue 1966)
Generated code, clients and the seat-set removal wait for the seatgen change.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-05 12:51:40 +01:00
jschoubben b6c127f237 Seat definition format: states replace records, operator-channel's asks first (ADR 0608 §1, ADR 0634 §6; issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-05 12:46:33 +01:00
jschoubben 4d7b2a3778 Registry seats: no seat delivers artifact-store, and the two store seats serve list (ADR 0632 §2, §3; issue 1966)
The store's address is the registry seat holder's listen, so the provision
artifact-store retires; the sweep and the read tools read the store through
list, never by its files or its read side.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 20:52:15 +01:00
jschoubben ae5266e776 Pin the clients' requires: mesh-sdk f94abb95 and this repository's seats at 347a3053, the group's final heads (issue 1966)
mesh/delivery-group group feat/registry-milestone checking: 7 of 7 member(s) ready
mesh/delivery closed: a newer head of the same pull request
mesh/check failed (9): ace: novox/mesh-sdk#167 does not merge into the trunk: files in conflict: go/catalog…; and 8 more | ae5266e77639 on 2923c82001a5
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 18:43:44 +01:00
jschoubben 347a305358 Pin the clients' requires again: mesh-sdk 3526e9ef2a42 and this repository's seats at 859da7b1ce, the group's heads after review round 2 (issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 18:22:18 +01:00
jschoubben 859da7b1ce Registry seats: remove answers and says kept when a tagged version shares its digest
A store that cannot remove a tag alone (another tag names its digest) kept the tag and the holder said
removed, so the builder and every follower believed the tagged version gone while it stayed pullable:
work reported done that was not done. The shared registry part gains the outcome kept: in remove's
answer (kept, the reason shared-digest, the tags still naming the digest) and as its own event, in all
four registry seats. Regenerated with mesh-catalog's seatgen (join-mesh-catalog ccb7eaff); seatgen
-check passes; fixtures for the answer and the event in each seat.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 18:12:34 +01:00
jschoubben ec9529022c Pin the clients' requires: mesh-sdk 719956b7451a and this repository's seats at 5b440ca877, the group's heads (issue 1966)
A client requires the seat it speaks and mesh-sdk; the seats and the seat list require nothing. The pins are the commits
before this one, as a module cannot name the commit it is part of; the group's check builds against its members' heads.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 17:40:00 +01:00
jschoubben 5b440ca877 README: name where seatgen -check now lives
The generator moved into mesh-catalog's Go build module; the line named no path, so a reader could not
find what checks the tree.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 16:58:34 +01:00
jschoubben 7d8f090b75 Registry seats: the removal reasons are constants, a release of nothing held answers released false, packages carry their own language's names
seatgen writes a string's enum as Go constants, so the sweep names
RemoveInputReasonRetention instead of the literal. release of what is not
held is no error. The package seats' fixtures name a package as design 32
does (git.novox.be/novox/mesh-sdk/go, @novox/mesh-sdk), name says so, and
module equals name for a Go package. Generated with mesh-catalog's seatgen
(wip/registry-a3); seatgen -check passes.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 16:32:15 +01:00
jschoubben 5118c5f425 J7 (1): the operator-channel client reads an ask its keeper carries back, held to its id and an option
The assigner, the teller, the view and the gate each wrote the same two checks over the ask a value of theirs carries;
the fourth copy made it a kind, so it lives once in the seat's client (Carried) and the four call it.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 15:38:46 +01:00
jschoubben d9af39256e J4 (A2j finding 2): the checker's verdict event names each series change, so a reader never loses one to a cut status line
Each change of an artifact's series the checked head makes is {module, artifact, from, to} under series; the
fixture carries one and the regenerated round trip reads it back (seatgen -check clean).

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 14:52:52 +01:00
jschoubben 4afce1aac8 Drop node-engine's optional verb pull-waits: no record gives the seat that verb
The lead's ruling (14:2x): the pull waits ENG-9 shows are carried in the engine's have, read through node_haves, as
ENG-9 allows, so the seat serves no verb of its own for them. Regenerated; seatgen -check finds nothing out of step.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:52:54 +01:00
jschoubben 22abe5c955 ADR 0627 §1: node-engine's client holds the checks of compose-candidate's ask and answer
The checks the node-engine, the checker and the assigner share over the verb (ADR 0593 §7, §9) leave mesh-sdk's delivery
package, where they sat over aliases of the seat's types, for go/clients/nodeengineclient, a Go module and package
artifact of its own over the seat's generated contract: the verdicts, the module states, the asker's bound, the no-answer
words, Encode/DecodeAsk, Encode/DecodeAnswer and CheckAnswer. Its test holds the cases mesh-sdk's held, and that an
open input's number keeps its digits; each fails without the code. seatgen -check finds nothing out of step.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:50:00 +01:00
jschoubben 252b619470 Join the forge's main (its first commit, the README) into the registry milestone
The forge began mesh-contracts with a commit of its own (ADR 0428), unrelated to the branch's history; the README keeps
the branch's text and the forge's paragraph on how main is reached.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:46:26 +01:00
jschoubben 652606f59a Join lead-47's node-engine seat whole into the registry milestone, in its own Go module and npm package
The node-engine seat, defined whole by lead-47's L3 (ADR 0618, ADR 0613 §3), is regenerated in A1's layout (ADR 0625 §1,
§3): go/seats/nodeengine a Go module of its own, ts/seats/nodeengine an npm package of its own, and module.json declares
go-nodeengine and ts-nodeengine. seatgen -check finds nothing out of step.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:46:05 +01:00
jschoubben a6f859de3f ADR 0625 §1: each seat defined whole is an npm package of its own, declared in module.json
One @novox/mesh-contracts would rebuild every TypeScript user at any seat's change, since the indexer
counts the npm package a lock resolves. Generated by seatgen c1fdd7c; ts/ keeps the seat list alone.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:40:54 +01:00
jschoubben 9d57c09594 ADR 0625 §10: the README says where a seat's definition, contract and client go, and how each is checked
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:34:41 +01:00
jschoubben 3368a055a4 SD-M2c (A2d): a registry outcome names the Go module path a Go package is fetched under
go-package-registry's published says the module (field module), so a reader fetches the version by its path. The
four registry seats take their events whole from the part registry, which refuses a seat redefining one, so the
field is the part's, optional and empty for every other kind.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:32:24 +01:00
jschoubben 4ce5dec682 SD-M2d: operator-channel's offered and closed are on the router's stream asks, mesh.stream.<holder>.event.*
The messenger keeps them in its own stream asks (its manifest's streams, design 55 § 11), so they ride that
stream's subjects, as the checker's verdict does.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:31:16 +01:00
jschoubben 1bcb18d1c7 SD-M2d, ADR 0627 §1: the vault's sign, enrolment-token and node-account answers and its signed event are typed
Their output schemas replace mesh-sdk's hand-written SignAnswer, EnrolmentTokenAnswer, NodeAccountAnswer and
Signed, on the same wire names; signed's time is RFC 3339 text, as the generator writes every time.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:29:47 +01:00
jschoubben 6fd4eca51c ADR 0627 §1: operator-channel's client holds a process connection's state to its Store
The test moved from mesh-sdk's process package, which no longer names the client.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:27:00 +01:00
jschoubben cc2d3aafdb SD-M2b, SD-M2d: the checker's and mesh-config's events kept in their own streams are mesh.stream.<holder>.event.*
verdict, tag-wanted and preview.written ride the checker's own streams, renamed, retiring and retired
mesh-config's config-events stream, whose subjects are mesh.stream.<module>.event.<event>.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:17:26 +01:00
jschoubben 323e6a6be2 SD-M2a: mesh-broker's Held says the entry's state and why, so show says why an entry is in its state
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:15:18 +01:00
jschoubben b5db9466c2 ADR 0627 §1: operator-channel's client holds the asking and the warrant's checks over the contract's types
mesh-sdk's asks logic (an ask's check and digest, the act's digest, a warrant's For and Says, the condition's
encoding) and its asker client move here, over operatorchannel's generated Ask, Option, Warrant and Condition; the
digests are those asks gave (a row holds two of them), so a router and an asker of either build agree.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:13:59 +01:00
jschoubben a1ef06b20e ADR 0627 §1: the four registry seats' clients publish a file in parts over their own seat
Each client binds mesh-sdk's seat-neutral parts sender to its own seat's publish and publish-part and types, so no
client uses another seat's; each is a Go module and a package artifact of its own (ADR 0625 §3).

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 13:08:59 +01:00
jschoubben f32ea4ba75 SD-M2d: the checker's tag-wanted names the pull request's branch
The lead's ruling of 13:0x: the builder removes the tag when the branch ends, so it needs the branch.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:53:49 +01:00
jschoubben 96b7eeeaf7 SD-M2b: mesh-broker's events on the shared events stream, 7 days
The lead's ruling of 13:0x replaces 12:5x's said-subject: mesh-broker's events follow every seat, on
mesh.seat.mesh-broker.event.<event> in the shared events stream, 7 days; the bus module keeps a longer history on a
stream of its own module. So every seat family is that stream filtered to the seat's subjects: a definition says 7
days and no cap of its own, and the reader refuses anything else.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:53:19 +01:00
jschoubben c62ce1c309 ADR 0625: each seat defined whole is a Go module and a package artifact of its own
ADR 0625 §1-§3 (accepted 12:45): the seat set stays the root Go module's package; each seat defined whole is a Go
module of its own, since the fingerprint counts a Go module's go.mod and go.sum, so a change of one seat moves only
its importers. A seat's module imports nothing: the registry part's types are written into each registry seat whole,
so no seat module requires a sibling's version.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:48:57 +01:00
jschoubben 87412fd307 SD-M2d: operator-channel's decided kept 7 days, on the shared events stream
The lead's ruling of 12:5x: no record fixes 30 days; decided rides the shared events stream, 7 days, as on the bus today.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:42:35 +01:00
jschoubben f31de828e9 SD-M2b: mesh-broker's events on mesh.seat.mesh-broker.said.<event>
The lead's ruling of 12:5x (design 25 § 12.3): mesh-broker's events ride the bus module's own stream, 30 days,
on mesh.seat.mesh-broker.said.<event>, outside the shared events stream's mesh.seat.*.event.>, so the bus never
refuses the two as overlapping.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:42:16 +01:00
jschoubben 7498d689e2 The node-engine seat whole: every verb's answer, its events' bodies, and ADR 0618's manifest-reads and manifest-reads-changed
The seat's area changes in this milestone, so it moves whole into its contracts (ADR 0613 §3): the eleven verbs it serves
get their answers as the engine writes them, asked, done and refused their body, and the seat serves the optional verb
manifest-reads (ADR 0618 §3) and says manifest-reads-changed (§4). Each event is published per node, the node's name its
last token (by-caller), and kept with the seat's events for seven days. compose-candidate's input is a boolean, as the
engine and the checker read it. Fixtures for every event, compose-candidate's input and three answers.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
2026-11-04 12:39:56 +01:00
jschoubben f3a9cd17d6 SD-M2b: mesh-broker's events carry the binding and the verdict's revision (the lead's ruling, 12:4x)
The binding a module receives is one named type, Binding, the provision's form and each event's binding.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:35:30 +01:00
jschoubben e9c97f9e9f SD-M2a, SD-M2b: the registry and broker verbs are optional until their holders serve them (design 33 §7)
The deciding parts built with this seat list judge the running nats and gitea before their new builds are delivered;
a required verb they do not serve yet would refuse them as the seats' holders (mesh-host's composition and the grants
part's last-holder rule, read in their suites). The mark goes once every holder serves the verbs.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:33:59 +01:00
jschoubben 52b05d50cb SD-M4: mesh-contracts declares its Go and TypeScript packages, series 0.1, generated from its definitions (design 26)
Each package carries the contracts marker generated-from naming the module's root, where seats/, parts/ and format/
are. No merge-check.sh: the checker runs every repository's tests by Go's convention (ADR 0529).

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:27:55 +01:00
jschoubben 88972faf08 SD-M2a: a publish-part chunk is at most 760 KiB, so its message stays under the bus's 1 MiB with its fields
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:26:44 +01:00
jschoubben 5b4239e6d9 SD-M3: the node-engine seat's read-only verb pull-waits (design 51, A7's ENG-9)
Optional until every engine serves it; answers each failed pull waiting on a store's holder.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:19:52 +01:00
jschoubben 7f0b0f3b42 SD-M2c: retire takes ask
The ask's id beside the warrant (the hand act's id), as own-retired carries it (A4's request).

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:01:18 +01:00