Commit Graph
148 Commits
Author SHA1 Message Date
jschoubben a98b6ba77e S6: the bus keeper treats a none-yet catalog half as not yet viewed
PlanCatalog plans nothing, deletes no plans key and orphans no entry while the
catalog half lists no module before any was seen; the first revision with
entries plans as before.

Builds: design 47 G A-367 (G-22-lead-answers-2.md), W22/Q4 of start-waits.md

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 20:48:04 +01:00
jschoubben 75d98dd908 C4: the build modules ask the steps state with its objects store in requires; outputs goes
mesh/delivery-group group feat/47-G-join11 checking: 7 of 7 member(s) ready
mesh/delivery closed: a newer head of the same pull request
mesh/check checking 75d98dd9083a on 117f933dacf0 | novox/mesh-catalog#675 in group feat/47-G-join11
Builds: design 47 G A-254, A-313, A-314, §58, §547

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:29:28 +01:00
jschoubben f7e59b876d Join 11: every go.mod requires, at the zero version, each mesh module its packages load
The checker's fetch pins only the zero-version requirements a directory's go.mod names
(mesh-build-go workspace.go goModOf), so a module reached only through another, such as
meshhandacts through meshhandactsclient or mesh-delivery-sdk through meshcatalogclient,
was never downloaded and the shut-off load failed (fetch.go:267). The join's merges had
dropped these indirect requirements that the trunk's go.mod files list.

Builds: design 47 G (join 11, the check's fetch of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 14:07:29 +01:00
jschoubben 0f796e6505 A-283: the bus module's keeper makes a state bucket with the max-mib its requirement declares
Builds: design 47 G A-283 (G-22 lead answers, with A-277 and ADR 0595)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:13:05 +01:00
jschoubben c82b40660b A-278 (join 11): mesh-recovery and nats pass mesh-sdk's seatlist.Definition to AnswerSeat
Builds: design 47 G A-278 (answers G-22)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:42:11 +01:00
jschoubben a196bf6323 Area 6 (join 11): every AnswerSeat caller follows a seat list and its grant
AnswerSeat checks a call's caller against the seat's definition its caller
reads from the seat list it follows (A-186). The bus module's keeper hands
it the mesh-broker definition its seat list holds once heard; mesh-recovery,
which followed none, follows one over its connection and an event hub, read
again once its events are live, and its manifest and its process invoke
seat-definitions and consume the list's two events. Its whole test answers
the seat list.

Builds: design 47 G lead answers A-179, A-186 (join 11 area 6)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:15:02 +01:00
jschoubben 0be81ae036 Join 11: the merged heads compile where no area's fix is owed
The join's importers name the delivery repository's moved contracts and sdk
(MV1), node-tools' tests use mesh-sdk's gate, the duplicate node-engine claim
rule of the reader release gives way to G's, and the assigner names its first
watched branch, never a constant. The seat holders' AnswerSeat callers are
area 6's.

Builds: design 47 G join 11 (merge of fix round 11)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:41:44 +01:00
jschoubben 9e005317dd Merge branch 'feat/47-G-fix11-c3c' into feat/47-G-join11
# Conflicts:
#	modules/nats/cmd/nats-tools/keep.go
#	modules/nats/go.mod
2026-11-12 10:26:43 +01:00
jschoubben bf60d6a8bb NATS3 (rest): the bus module plans from the catalog half of every watched branch, not from manifest-accepted
The keeper follows meshcatalogclient's branch follower and the seat list on its views reader, and plans again at each
move of a branch's view, the registrations or the seat list. Each local name is planned from the first of the module's
watched branches in its registration's order; another branch asking it with other settings is said drifted, naming
the branch. A module of the new form whose resolved seat definition has a verb or an event gets its sent store; one
including only parts, and a foundation part, none. A module in no watched branch's newest revision loses its plans
key, its entries orphans. The sum of the caps counts the old sections the entries declare. The manifest consumes the
catalog half's and the seat list's events and invokes their verbs; manifest-accepted and indexer_bus_state go.

Builds: design 47 G §344, §433, §532, §533, §537, §538, §547, §591

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:45:49 +01:00
jschoubben e4ef67adcd MV1: move contracts and sdk under modules/, importers follow
The delivery repository's contracts and SDK live under modules/ as
mesh-delivery-contracts and mesh-delivery-sdk, their Go module paths
renamed to match the folders (the TypeScript names already did), and
every importer in mesh-delivery, mesh-catalog, mesh-host, mesh-tools
and mesh-sdk follows in the same group: a design as it should be, one
path per module, checked by the group's check building every importer.

Builds: design 47 G §427, §88

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:09:56 +01:00
jschoubben e723d498e7 NATS1, NATS6: the bus module's whole test makes the plans state and restores a state's objects store with it
Builds: design 47 G §58, §538

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:08:17 +01:00
jschoubben 8d6b7fbbc9 A-112: the bus module's snapshots-cap and snapshot-keep-days are config values in a settings file the keeper reads at its start
Builds: design 47 G §633, §681, lead answer A-112

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:02:13 +01:00
jschoubben 6277067465 NATS6: the bus module keeps its plans and plans again only when a module's entries differ; nats_plans reads them
Builds: design 47 G §538

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:00:34 +01:00
jschoubben 78b12be752 NATS5: the bus module reads the bus's storage limits, refuses a plan whose caps pass the account's and shows the sum in list
Builds: design 47 G §547, §495, §661

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 04:59:19 +01:00
jschoubben 24778d24b6 NATS8: the bus module's ask lasts its level's bound and a refused ask ends its request with the router's words
Builds: design 47 G §570

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 04:56:56 +01:00
jschoubben 0699741fab NATS1: the bus module plans each state's <state>-objects store (16 MiB, objects-max-mib) and says its binding
Builds: design 47 G §58, §91, §513, §591, §607, §549

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 04:55:47 +01:00
jschoubben 500c8c8cec Merge branch 'feat/47-G-fix9-recovery' into feat/47-G-join10 2026-11-12 02:39:22 +01:00
jschoubben 810254193c mesh-recovery: the hand verb restore takes a keeper's snapshot by request
An unprotected snapshot is received through snapshot-get into
incoming/<request>, refused before the first chunk past the cap, checked
against its digest before any aside, and restored by the module; a
protected one is verified, the running data set aside and restored in
place by the keeper, waited on by snapshot-restored within
snapshot-restore-wait-minutes, cancelled at the bound. The bus module
sends its chunks with mesh-sdk's form.

Builds: design 47 G §681, §682, A-137, A-138, A-139, A-140

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:12:32 +01:00
jschoubben 6d45f3ef58 A-125: the bus module imports mesh-sdk's bussnap and busarchive, its copies deleted
The take and restore of one stream is shared code in mesh-sdk; the bus module's keeper, its
nightly dump and its tools import it from there and keep no copy.

Builds: design 47 G §655, A-125

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:26:38 +01:00
jschoubben 5d1456257c Fix 9.3: the nats keeper's process serves its four mesh-broker snapshot verbs, beside its bus
Builds: design 47 G A-109, A-110, A-115 (serves is a field of the process itself)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:00:59 +01:00
jschoubben 14d1a919cc Merge branch 'feat/47-G-judge5' into feat/47-G-join8 2026-11-12 00:14:17 +01:00
jschoubben 605c583ab4 bus5 B6 (A-109): snapshot-get's chunks go on a core publish to any caller; no grant check
grantedBy is dropped: any caller of snapshot-get gets the chunks, a protected snapshot never.
The chunks are a transfer on the core bus, published with a core publish and kept on no stream.

Builds: design 47 G A-109 (G-20-lead-answers), §681

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:57:09 +01:00
jschoubben 44cb7ad449 bus5 B5 (A-107): the keeper's process answers mesh-broker's snapshot verbs itself through AnswerSeat
snapshot-get, snapshot-restore, snapshot-restore-cancel and snapshot-remove are answered by
the keeper's process with the proved caller; it publishes snapshot-get's chunks and hears
their acks on its own subscription, and acts at once with no hand-over through requests
(the record of a running restore is written before it runs). The tools bundle keeps its
tools, nats_snapshots among them. The protected refusal and the whole test's case (send,
restore in place, removal) stay.

Builds: design 47 G A-107 (G-20-lead-answers), §681

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:56:06 +01:00
jschoubben a9dfe77b1d bus5 B4 (A-64): snapshots-filling has scope module and id nats.snapshots
Builds: design 47 G §681, A-64
2026-11-11 22:56:49 +01:00
jschoubben caa350f350 bus5 B4 (§529): nats go.mod requires the meshconditions contract it imports (requiredmodules check)
Builds: design 47 G §529, A-30
2026-11-11 22:55:28 +01:00
jschoubben 47aaee122c bus5 B3 (§681, A-44, A-45, A-59): the bus module serves snapshot-get, snapshot-restore, snapshot-restore-cancel and snapshot-remove through its tools bundle, sends the chunks, hands the work to the keeper through requests; nats_snapshots; the whole test covers send, restore in place and removal
Builds: design 47 G §681, ADR 0675, lead answers A-44, A-45, A-59
2026-11-11 22:54:35 +01:00
jschoubben 790b5aac7d bus5 B4 (§681, A-29, A-40, §529): the bus module writes snapshots-filling through mesh-sdk's held writer over its state findings; nats-findings declared in the foundation form
Builds: design 47 G §681, §529, A-17, A-29, A-30, A-40
2026-11-11 22:49:07 +01:00
jschoubben d627400cf1 bus5 B2 (§681): the keeper restores a snapshot in place (verify, names live, 60-minute bound, cancel, partial stream removed, snapshot-restored); requests keeps records 91 days (A-53)
Builds: design 47 G §681, ADR 0675, lead answers A-45, A-53
2026-11-11 22:45:56 +01:00
jschoubben 5b4b201558 bus5 B1 (§681): the keeper records its snapshot (path, size, digest, protected) before it touches live data, holds it to snapshots-cap, removes it after snapshot-keep-days, tells snapshots-filling
Builds: design 47 G §681, ADR 0675
2026-11-11 22:41:36 +01:00
jschoubben f509c61b50 VERSION (A-46, §368, §411): every manifest of the catalog says its version MAJOR.MINOR
mesh-delivery-builder.builder_versions answered no numbered version for any name asked (mesh-sdk go and ts, mesh-host, node-tools, mesh-delivery-builder, mesh-conditions), so every module takes 0.1, the floor §368 gives a module with none published: all 144 manifests (141 from "1", distribution, mesh-provisioner and mesh-provisioner-client from "2", which carries nothing over, §583).

Builds: design 47 G §368, §411, §583, A-46

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:38:45 +01:00
jschoubben bea1c446ea NATS10: the bus module serves no restore point tool and keeps no state kept
Reverts bbd9f638, c2e017a4 and b6884796; cmd/mesh-nats-snapshot/restore.go is as before them. The manifest test
asserts the claim serves only the reading verbs and the keeper's state is asked, requests, spent.

Builds: design 47 G §554, §555

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:45:03 +01:00
jschoubben 202c44c6e3 Merge branch 'feat/47-G-build-bus' into feat/47-G-build 2026-11-11 14:32:02 +01:00
jschoubben 7a1e8d1036 Merge remote-tracking branch 'origin/main' into feat/47-G-build 2026-11-11 14:32:02 +01:00
jschoubben 6062feaa22 NATS3 (part, branch-independent): which module sends, and a catalog entry read for the bus module
Sends reads a claim of a seat whose definition has a verb or an event, or an event of its own; AsksOf reads
an entry's bus-state asks and claims. The follower's branch and the wiring wait on the design's answer.

Builds: design 47 G §344, §433

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:23:40 +01:00
jschoubben b6884796e7 NATS4: the bus module takes and restores a restore point of a module's kept data, beside the live data
Verbs snapshot-kept and restore-kept (with aside-only and discard-aside) on the seat mesh-broker, handed to the
keeper; taken over from the join's 0480e16f and c4e88eaa, without the verbs aside and discard-aside and the tool
nats_kept, which no design line gives.

Builds: design 47 G §296, §297, §302, §337, §405

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:08:05 +01:00
jschoubben c2e017a4c1 The bus module takes and restores a restore point of a module's kept data, beside the live data (milestone G, W14.2)
Seat verbs snapshot-kept, restore-kept, discard-aside and aside, handed to the keeper; state kept; tool nats_kept.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:05:54 +01:00
jschoubben bbd9f638a0 Move the restore of a bus archive into bussnap so the keeper restores a kept data too (milestone G, W14)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:05:54 +01:00
jschoubben b9a224dc99 NATS2: the bus module plans each sender's sent store, 256 MiB, 7 days, refusing when full
The store is made by Keeper.Sends, kept when a verdict asks nothing of it, and a full one says `full`.
Which module sends is NATS3's input (the catalog half); this makes the store.

Builds: design 47 G §59, §137, §344, §477

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:05:11 +01:00
jschoubben ae056a44dd The bus module's list, show and orphans answer each held entry's binding
mesh/delivery merged: source.main moved to novox/mesh-catalog@9dfb2eae0eb3
mesh/delivery-group group fix/1966-bindings-first-view merged: every member is merged
mesh/check checking ae056a44dd72 on 9dfb2eae0eb3 | novox/mesh-catalog#656 in group fix/1966-bindings-first-view
Held.binding is the entry's plan binding, the value its created and recreated
carry, present when the bus holds the entry's objects and absent on one it does
not (waiting, refused). Table rows in the reading verbs' test: the binding of a
held entry equals the one its created carries; a waiting entry has none.

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

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:19:42 +01:00
jschoubben a3d141e793 nats_stream_messages shows a body only for the stream EVENTS (issue 1966, review 1)
mesh/delivery merged: source.main moved to novox/mesh-catalog@fd9147087ef6
mesh/check checking a3d141e79351 on fd9147087ef6
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 21:21:03 +01:00
jschoubben 4fbe6e347f nats_stream_messages shows a body only on an event stream (issue 1966, review 1)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 21:20:19 +01:00
jschoubben 3d70bd3660 nats_stream_messages refuses a module's kept state (KV_*, OBJ_*), which can hold secrets (issue 1966, review 1)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 21:18:43 +01:00
jschoubben a4e5a8ffef Format the bus tools' new test (issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 21:14:00 +01:00
jschoubben 13dea6b1aa The bus module reads one consumer in full and a stream's messages by subject (issue 1966)
A lost event between a shared stream and a module's consumer could not be located: no tool read a consumer's delivered and acknowledged sequence or a stream's messages for one subject. nats_consumer reads from the monitoring document; nats_stream_messages asks STREAM.MSG.GET on the module's own credential, newest first and bounded.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 21:13:02 +01:00
jschoubben 1ef1b13560 The keeper's health reads the consumers it looks for: the shared monitoring read asks for them
mesh/delivery merged: source.main moved to novox/mesh-catalog@08fbc51af26f
mesh/check checking 1ef1b1356044 on 08fbc51af26f
nats_keeper_health found the keeper's consumer novox_nats_keeper in /jsz, but the read it shares with the
broker verbs asked /jsz?accounts=1&streams=1&config=1, without consumers=1, so keeperPending always read -1
and the keeper was "unhealthy: what waits on its consumer cannot be read from the bus's monitoring" for
ever (2026-11-08, issue 1966).

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 23:55:32 +01:00
jschoubben bc8cb3b153 The bus keeper reads a bare stream's max-age-days "none" as kept for good, as the judge accepts it
mesh/delivery merged: source.main moved to novox/mesh-catalog@7fd4ed589806
mesh/check checking bc8cb3b153cf on 7fd4ed589806
mesh-knowledge's stream reviews says max-age-days "none", which the indexer's judge accepts
(judge/busstate.go noAge), but the keeper refused it ("not a whole number"), so the stream was
never made and the keeper stayed unhealthy (2026-11-08, issue 1966). Quick fix; the thorough one,
one shared reader of the template options in mesh-sdk catalogue for the judge and the keeper, is
noted on issue 1966.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 23:52:51 +01:00
jschoubben 6547933b4d Name packages by their module path in 15 manifests (issue 1966)
Kind: short package names (builds, sshkeys, forgemsg, backupgood,
diskreadings, grantsstate, busgrants) in `packages`, which the indexer's
judge refuses by design 32's rule (a Go package is named by its go.mod's
module path). This held mesh-delivery-gate, the build modules, mounts and
restic. Each key is now the import path the module's code uses, with its
series kept; the manifest tests read the new keys, and the host/machine-name
word tests in mounts, nfs-server, mesh-build-node and mesh-delivery-gate
look past the path's `git.novox.be/novox/` prefix.

Quick fix: only the gate's manifest. Thorough fix (chosen): all 15, since
the same refusal holds each. Follow-up for the checker: the candidate
verdict lets such a name through (J7(3)), so the merge check did not stop it.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 00:38:55 +01:00
jschoubben 50a66399f6 Take tidy's go.mod whole: mesh requirements at the zero version only, unused ones dropped
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-06 00:52:18 +01:00
jschoubben 35f005e53d 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 fb6bf361e4 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