Commit Graph
288 Commits
Author SHA1 Message Date
jschoubben f02a740b10 D2: assigner_ask_again asks one of the assigner's asks of the operator again by hand (issue 1966, ADR 0668 §5)
The recovery of an ask that ended at the channel unheard needed a restart. The tool writes the key
again under a new asking by the ask-ended rules (a proposal's authorising ask and a put's record ask
are refused), refuses an asking the operator answered, naming the answer, and records the hand act
through the seat mesh-hand-acts. One tool added to the manifest.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 03:16:28 +01:00
jschoubben 3f2482716b Q7: the assigner reads the operator-channel seat's asks at its consumer's bind and asks again each held asking that lapsed or was cancelled (issue 1966, ADR 0668 §4)
An ask-ended the teller said before the assigner's consumer existed is not delivered to it (note 155).
At each bind the assigner calls the seat verb operator-channel.asks once, a kept call, for the ended
asks since its earliest held asking, and writes again each one that ended expired or cancelled, by
the ask-ended rules and their compare-and-set. A seat verb: no module named. One invoke added.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 03:10:33 +01:00
jschoubben 416e270899 D1: the assigner, builder and indexer call every node's manifest-reads again at their consumer's bind (issue 1966, ADR 0668 §4)
Note 155: a manifest-reads-changed said before the assigner's consumer existed was never heard, and
ace's bootstrapped statement stood. Each part registers the engine-reads keeper's AtBind on its hub
and calls the verb as a kept call (CallKeptOn). The asks-at-bind half (Q7) is not in this commit.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 02:59:53 +01:00
mesh-tools 1fad9c8855 Merge pull request 'An assigner ask that ends at the channel without an answer is asked again under a new asking (issue 1966)' (#198) from fix/1966-ask-ended into main 2026-11-10 00:44:42 +00:00
jschoubben 46badf078e Subtask A: the assigner hears the teller's ask-ended and writes the ask again under a new asking (issue 1966)
An ask that ended at the operator channel without an answer while its key stood was never
written again, so nothing asked it (note 151: the nats yes on novox, three backup asks). The
assigner now consumes mesh-delivery-teller.ask-ended on its durable consumer and writes the key
again by compare-and-set under AskingSeconds (above the old asking), an id of its own and a new
expiry (AskLasts), one row per kind: hold, restore, backup and a record ask of the rules are
written again; the authorising ask of a proposal is not (ADR 0567 §5, §11: its lapse ends the
proposal, again asks it again), nor a record ask a put asked (ADR 0546: its lapse refuses the
put), nor an asking the key no longer holds.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 01:10:35 +01:00
jschoubben b1343147e8 S7: the assigner's and the grants part's seat-list again answers a proved operator's session
mesh/delivery merged: source.main moved to novox/mesh-delivery@8d9683d844ec
mesh/delivery-group group fix/1966-seat-list-unread merged: every member is merged
mesh/check checking b1343147e80f on 8d9683d844ec | novox/mesh-delivery#197 in group fix/1966-seat-list-unread
Their seat_list_again answered person.<name> and the healers, but every call
through the mesh MCP server is proved as its machine's tool runner (issue
627), so no operator's session could ask it; node-tools now stands for that
session, the kind met a second time in the node-engine (issue 1966). The
assigner's silent stand-in keeps the bus's retry bound short, since the
seat list's reader now asks again while its ask reached no one.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 00:59:07 +01:00
jschoubben 8596b9abf5 Subtask C: the two new tests of issue 1966 run inside existing test functions, to stay within the test budget
mesh/delivery merged: source.main moved to novox/mesh-delivery@10066c5ec0c0
mesh/check checking 8596b9abf52c on 10066c5ec0c0
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 22:55:58 +01:00
jschoubben 2469531c2f Subtask A: a record ask is kept while its node waits on it or its yes is unwritten, and an ask written again is asked again under a new id (issue 1966)
The assigner took record.novox.nats away as stale in the same second the operator's yes
was written (the yes counts only while the ask is there), and rewrote it under the id the
router already kept, so the teller never asked it again. The stale test compared a module's
ask with the whole node's composition; it now reads the module's own have, and restore and
record asks are numbered by their writing's time as hold asks are.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 22:47:32 +01:00
jschoubben b71358e2cc A put without a hold ends once the node runs its fingerprint healthy, and assigner_puts says a put older than the newest build
mesh/check being carried to b71358e2cc14 on 05e21fd8a382 | from fc21f2d1bd56
mesh/delivery merged: source.main moved to novox/mesh-delivery@05e21fd8a382
A put with hold false waited for the node's composition digest to equal its own and never ended when the node composes its own,
pinning the module's want (issue 1966, F21).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 19:54:16 +01:00
jschoubben 2819b05838 The assigner's integration test answers the verbs' asks of the indexer's first views from the indexer's buckets (issue 1966)
The verbs ask mesh-delivery-indexer.modules and .manifests through the tool runner
since the asks moved off the indexer's state, but the test's stand-in answered every
ask {ok:true}, which is no answer: propose failed on main with 'unexpected end of
JSON input'.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-09 15:10:32 +01:00
jschoubben 173a7654ba The assigner, the indexer and the grants part tell their followers when the bus made their consumer (issue 1966, recovery)
mesh/delivery merged: source.main moved to novox/mesh-delivery@e39ec444bd39
mesh/delivery-group group fix/1966-views-durable merged: every member is merged
mesh/check checking 173a7654ba61 on e39ec444bd39 | novox/mesh-delivery#184 in group fix/1966-views-durable
A consumer is made from now, so an event said between a first view and the consumer is never delivered; the hub says when the bus made it (EventHub.OnBound) and each follower asks again if behind (Follower.ConsumerMade).

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-09 02:27:38 +01:00
jschoubben e5f782cc07 The assigner's process and its seat verbs read the seat list from the seat mesh-catalog (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-delivery@4a59c17c6886
mesh/check checking e5f782cc07d4 on 4a59c17c6886
Neither runtime of the assigner gave catalogue a seat list, so propose judged
every mesh seat as held once (mesh-dns-resolver, replicated, refused every
proposal) and seat-holders marked every seat outside the list. Both now follow
the list as the grants part does (ADR 0636 §1, §4, §7): a proposal laid again
is not ended and seat-holders is not written until the list is read, and the
two seat list tools read and read it again.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-09 00:34:32 +01:00
jschoubben d1a6950071 The assigner's check says a seat the unread seat list does not name waits for the list, never held once (issue 1966)
A mesh seat held on two nodes was refused as held once whenever catalogue did
not name it, and a host that has not read the seat list holds only the
bootstrapped definitions: mesh-dns-resolver, a replicated seat, refused every
proposal (ADR 0636 §1).

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-09 00:31:27 +01:00
jschoubben 0a82e33518 The checker's tools and the assigner's put ask the indexer's tools instead of reading its state (issue 1966, recovery)
mesh/delivery merged: source.main moved to novox/mesh-delivery@8f57df2d7757
mesh/check failed (3): mesh-build-go: the go.mod of novox/mesh-sdk at 396511b7a276, beside the change, cann…; and 2 more | 0a82e3351804 on 9c6bf236b6b1
The second instance of the kind: checker_status and checker_pull read the indexer's
candidates and modules from its bus state, which the checker's manifest does not
declare under reads, so the runtime refuses them ("keeps and reads no state
mesh-delivery-indexer.candidates"). They now ask indexer_read_candidates and
indexer_read_modules, the indexer's read tools the manifest already invokes: the
keys with no argument, one key's value with key (ADR 0596). The assigner's put
read its newest fingerprint from the same refused state and now asks the
indexer's first view of modules, as the seat verbs do. A sweep of every module
finds no other read of another module's state that its manifest does not declare;
the checker's tools carry a test that refuses one.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 11:58:42 +01:00
jschoubben 0c4660eea8 The assigner's seat verbs ask the indexer's first views instead of reading its state (issue 1966, recovery)
mesh-module-assigner.propose and mesh-wants' upgrade and bus read the indexer's
modules and manifests straight from its bus state, which the runtime refuses
since those reads moved to the indexer's first-view tools (ADR 0615 §1, ADR 0621):
"mesh-delivery-assigner keeps and reads no state called mesh-delivery-indexer.modules".
Another module's data is asked through its tools, never read from its state
(ADR 0596). The verbs now ask mesh-delivery-indexer.modules and .manifests through
the tool runner, every page, at each call; the manifest already invokes both and
the indexer answers them to the assigner.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 11:54:37 +01:00
jschoubben ee6fd92b4d The assigner and the indexer's hold count a bootstrapped seat as read (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-delivery@7f412185525e
mesh/delivery-group group fix/1966-seat-reads-bootstrap merged: every member is merged
mesh/check failed (2): mesh-delivery-checker: no published of the tagged version of go-sdk of mesh-delivery…; and 1 more | ee6fd92b4d1a on 7f412185525e
Every reader of the seat list holds the bootstrapped seats from its start
(ADR 0636 §2), so a manifest naming one is read by every node-engine
whatever its statement names. graph.MissingReads, in the Delivery domain's
SDK, is the one rule both holds judge with; mesh-sdk is not changed.

ace's engine states no seat, so the want of the node-engine's own build
0bd8cbad (needing mesh-catalog) and of restic (needing node-backup) were
held on ace: the engine that would state them could not be delivered. The
indexer's hold judges only mesh-wide reads today, so its verdicts do not
change; it takes the rule so the two stay one.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 03:53:11 +01:00
jschoubben e0f510facb Take the Go package artifacts out of the delivery parts for now, so the running builder builds them (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-delivery@267b53635a1e
mesh/delivery-group group fix/1966-bootstrap-no-packages merged: every member is merged
mesh/check checking e0f510facb17 on b73315ffe05c | novox/mesh-delivery#166 in group fix/1966-bootstrap-no-packages
The running builder predates Go package artifacts ("refused kind: package of language go ... no build module
builds it"), so it can build neither the new builder, the grants module, the Go build module nor the checker:
each new part is needed before the others can be built or delivered. For the bootstrap of the registry
delivery, at the operator's word (19:4x, "do the temporary change"), the package artifacts leave the manifests of
the parts that run; the contracts and SDK modules, which run on no node, keep theirs. They come back in one change
once the new builder runs. Quick vs thorough: quick; the thorough fix is 47/G's tier order (issue 1921 note 80).

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-07 19:48:57 +01:00
jschoubben 4a07e7a0ce The assigner's integration test puts its responders' interest on the bus before it asks them (issue 1921, milestone 47/G, the group check of 616c42434ac2)
A manifest-reads ask the assigner made on manifest-reads-changed before the
test's SUB reached the server was answered by nobody and, by design, never
asked again; a flush is the barrier after each of the test's subscriptions.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-07 04:27:37 +01:00
jschoubben ca61a8432c Complete go.mod and go.sum for the externals each module builds with
A check's tests run without network, so each module must carry every external module it builds with.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-06 00:51:22 +01:00
jschoubben 70d1252e18 The end of the copy is marked in a state of its own, copies, read by assigner_read_copies; nothing is written to the retired state (ADR 0641 section 4, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 23:15:17 +01:00
jschoubben c006f0b2bc The copy of the retired state ends with a marker: a crash mid-copy is completed at the next start, and nothing is copied after the marker (ADR 0641 section 4, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 23:09:52 +01:00
jschoubben c34d6a13cd The assigner only copies the retired state, never deletes from it, and writes nothing over a filled assignments (ADR 0641 section 4, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 23:08:40 +01:00
jschoubben d1acd6b231 The retired state is declared and left unannounced for the copy alone; the integration test copies it into the state made after the start (issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 22:17:40 +01:00
jschoubben 0eafb2fe95 The assigner's state and verb placement are assignments, with its events, tools, views and every caller; the assigner copies the retired state at its start (issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 22:13:20 +01:00
jschoubben b638303104 No client names the holder of the seat mesh-provisioner: each reader keeps its own constant, held to its manifest (ADR 0625 section 4, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 19:36:21 +01:00
jschoubben 535f475d6e The assigner's texts say its seat mesh-module-assigner (ADR 0634 section 9, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 19:24:07 +01:00
jschoubben f6f18d04e1 The delivery SDK's enginereads, findings and heard leave for the clients of their seats (ADR 0634 sections 1 and 2, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 19:22:05 +01:00
jschoubben c8241d0be6 No client names a holder: each reader keeps its own constant, held to its manifest (ADR 0625 section 4, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 18:37:28 +01:00
jschoubben 2dbb0da8a5 Require every mesh package of the group at the floor version (ADR 0573 sections 2 and 4, issue 1966)
A member's go.mod names the oldest version a module accepts; the check builds the group's own heads whatever it names. go.sum lines of mesh packages are left out.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:56:39 +00:00
jschoubben 4f647cbc80 Merge branch 'b9i/registry' into b7/registry 2026-11-05 17:39:18 +01:00
jschoubben 8f6c90adff The reference forms move beside the build key, in builds/forms, and read the registry seat's form through the registry clients' reference package; the builder names the sweep seat from its contract (ADR 0634 §4, S-8; issue 1966)
sdk/forms could not import the reference package: the registry client's module requires the delivery sdk (parts).
builds already requires the client and both seats, and both users of forms (builder, assigner) require builds.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 17:34:56 +01:00
jschoubben 3e7281cb14 assigner: the seat mesh-module-assigner's four events are said on the seat's subject, not on a stream of the module's own; its placement stream and the judge's exception for it are gone (V1; ruling 18:4x, issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 17:32:54 +01:00
jschoubben a6c8db74f4 assigner: its findings are the seat mesh-conditions' layout, written through meshconditionsclient's Observation, Key, EncodeFinding and DecodeFinding; no mesh-sdk health finding left (ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:47:47 +01:00
jschoubben 738c8ca036 assigner, view, watchman: provisions come from meshprovisionerclient, not mesh-sdk go/provisions (ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:45:25 +01:00
jschoubben e52d9d7791 Assigner: the node's presence is read through the watchdogs client's key and codec, no seat codec of its own (ADR 0634 §4; issue 1966) 2026-11-05 16:36:50 +01:00
jschoubben 72e1676d61 Assigner: the module graph is served from the node-engine's haves, the adapter and the last go/delivery import are gone (ADR 0634 §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:08:35 +01:00
jschoubben 788ee56791 Assigner: its own and the indexer's module names from their seats' clients, the teller's name beside the buckets, the delivery bound from motion, the provided modules from the overlay package, the build queue from buildstep (ADR 0634 §1, §4, §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:06:38 +01:00
jschoubben 05b7dbce48 Assigner: the gate's answer, source and merge are the delivery client's and the seat's, the verdict words the checker client's (ADR 0634 §2, §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:04:06 +01:00
jschoubben 70865842f2 Assigner: the published compositions are read with the node-engine client's Composition (ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:01:58 +01:00
jschoubben 3fd09d50e9 Assigner: a want, a node's own want and a hold are the wants client's, a put is the assigner's own puts package (ADR 0634 §4, §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:01:10 +01:00
jschoubben 44397a53fc Assigner: its asks and their keys are its asks package's, an asking's id the delivery client's, the view's answers the view's (ADR 0634 §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:54:19 +01:00
jschoubben 54f91d5ad9 Assigner: a node's presence is read through the watchdogs seat's keys and values (ADR 0634 §1; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:53:27 +01:00
jschoubben 7ff785978e Assigner: a build record is the builder's builds package's and a grant the grants part's grantsstate package's (ADR 0634 §5; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:52:46 +01:00
jschoubben a3e53e6f78 Assigner: a module's source and its manifest are the catalogue seat's types, its keys and codecs the catalogue client's (ADR 0634 §2; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:51:52 +01:00
jschoubben 1ca0af7a2d Assigner: who may add a node is read from the holders of the seat mesh-node-enroller, not from a module's name (B7f finding 5; ADR 0634 §1; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:50:29 +01:00
jschoubben 891d292dfd Assigner: the operations of a change and the states of a proposal are the module assigner client's, which the enrolment builds with (B7f finding 4; ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:44:06 +01:00
jschoubben cd94b19384 Assigner: the node-engine's have, phases, healths and candidate answers are the node-engine contract's and client's, the buckets it reads are its own package's, held equal to the manifest (B7f finding 3; ADR 0634 §1; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:43:00 +01:00
jschoubben be93d5f71b Assigner judge: its comment names the pulse key's new home (issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:34:04 +01:00
jschoubben a3cb3e4a9b Assigner: the seat's state names, events, buckets and history are the contract's and the placement package's (D-12; ADR 0634 §1; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:33:01 +01:00
jschoubben 1266c1ada0 Assigner: placements, proposals, candidates and seat holders are the contract's types and the assigner's own placement package, no longer go/delivery's (D-12; ADR 0634 §1; issue 1966)
The judge keeps the node's answer as the verdict's body; pointer times of the contract are guarded. One ask test folded into a table to hold the unit count.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:31:50 +01:00