Commit Graph
3695 Commits
Author SHA1 Message Date
jschoubben e034f73991 Join 11: gitea reads the step event's fingerprint by the seat's name
The seat mesh-pipeline-runner's step event carries `fingerprint`; gitea read
`fp`, which no event carries, and which the type-check refuses once the Node
fetch places the runner's contracts (design 47 G A-285).

Builds: design 47 G A-285

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:42:14 +01:00
jschoubben 622b259145 Join 11: gitea names the pipeline runner's contracts and takes a revision answer whole
gitea imports @novox/mesh-delivery-contracts-mesh-pipeline-runner, so its
package.json names it and the Node fetch places the group's (design 47 G A-285);
the catalog view's revision answer is typed with its revision and entries, which
revisionAnswer already refuses loudly when the holder leaves them out.

Builds: design 47 G A-285

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:39:53 +01:00
jschoubben 64fa2f5abf A-285: the Node fetch packs each of the group's packages and places it by name
The fetch takes `group-packages` (a member's repository, commit, ref and the
package's directory there) in place of the single `package` and its tagged form;
it packs each package a module of the tree takes, publishing nothing, and places
it in every module whose package.json names it, the SDK in every module, in place
of the registry's whatever the lock names.

Builds: design 47 G A-284, A-285

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:37:30 +01:00
jschoubben dad8672b73 Join 11: the fetch's proof loads both build tags and holds the tree's go.mod and go.sum to what they load
Try 2 of milestone G failed in go test, verifying nats-server against the checksum database: restic's
integration tests load it through testbus, neither its go.mod nor its go.sum named it, and the fetch's
shut-off load ran untagged, so it never met it. The second failure of this kind (after the join's
dropped zero-version requires), so the guard is held once, where every repository's check passes: each
directory of the checked tree is loaded untagged and with the integration level's tags, and its own
go.mod and go.sum must name every module the loads reach (a mesh module required, no sums; every other
required at the version selected, with both go.sum lines). The fetch fails naming the module and the
line. A sibling laid beside is loaded as before, unjudged.

This guard lands with G, so G's own check still runs today's proof; no harm, the gaps it finds in the
seven repositories are fixed in this join.

Builds: design 47 G (join 11, the check's shut-off build of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:21:36 +01:00
jschoubben b854f884e9 Join 11: restic requires and sums nats-server, which its tests load through testbus
The check builds with GOPROXY=off, so a module its packages load that go.sum does not hash is looked up in the
checksum database and fails (try 2: verifying nats-server v2.11.17). mesh-sdk testbus, which restic's tests import,
brings nats-server and its four requirements; go.mod and go.sum now name them, as go list -mod=readonly -deps -test
against the group's heads asks (both build tags).

Builds: design 47 G (join 11, the check's shut-off build of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:00:49 +01:00
jschoubben a57139dcf5 Join 11: claude-code's manifest test lists the operator channel's notify it invokes
Area 2 added seat:operator-channel.notify to the manifest's invokes for the call in main.go,
and the test of the manifest's invokes still listed the old ones, so the unit level failed.

Builds: design 47 G GR8

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 14:15:08 +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 b1da6344a8 Join 11: merge origin/main (the licence manager in parts, issue 1409)
The conflict in the old cmd/claude-licence-manager/tools_test.go resolves to both sides: main
moved it to cmd/manager, and the join's count of binding.changed.<consumer> under its family
goes into the moved TestResyncSaysEachOnce. The whole-module test's runtime refused
binding.changed.<consumer> because the manifest names the family binding.changed: it now
accepts a key that extends a named family by further parts, as A-134 says the event.

Builds: design 47 G A-134

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 14:05:51 +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
mesh-tools 6d000647de Merge pull request 'The licence manager is built of its parts, a manager and its tools, and the finished carry-over leaves (issue 1409)' (#662) from feat/1409-parts into main 2026-11-12 12:05:46 +00:00
jschoubben cff1005422 P2: the licence manager is four parts of one manifest (issue 1409)
mesh/delivery merged: source.main moved to novox/mesh-catalog@6d000647de2d
mesh/check being carried to cff1005422c1 on 6d000647de2d | from f9dcbc295723
The one bundle that did everything becomes the manager bundle, which runs long and answers the seat's ten verbs and
the three acting tools, and a tools bundle of its own that answers the four reading tools and writes nothing, so they
answer while the manager fails to load or stops. Both import the module's one package for the layouts of the kept
data and the log entries, the key form, the entries' names and the settings with their validity; the settings file
and the account with its directory stay as they are.

Builds: design 39 parts §1, §2, §3, §4, §5, §6, §7, §8
2026-11-12 12:08:03 +01:00
jschoubben 0e9fb2cbe3 A-281: the switch key names the gate's own build through mesh-sdk's process, which the environment check allows 2026-11-12 12:03:25 +01:00
jschoubben 478551622d mesh-recovery consumes mesh-broker recreated and dropped, which its process binding hears (A-274)
Builds: design 47 G A-274

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:01:54 +01:00
jschoubben 742303895b §716: the gate keeps a group's members from the seat git's pull events in deliveries and groups; the switch runs once (A-281)
The gate consumes pull-updated and invokes open-pulls and pull; it writes deliveries and groups
under their key forms, deletes them as a take-in or a closed pull request leaves them, copies a
delivery's base onto the record's member, answers groups from records and the group key together,
puts a missed event right at its start, and writes switch.done once the switch has run.

Builds: design 47 G §716, A-279, A-236, A-281

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:01:29 +01:00
jschoubben ce9f984363 P1: the carry-over leaves the licence manager (issue 1409)
The carry-over from the store database ran live once and carried every row, so its code, the gate that answered
"the carry-over has not ended", the condition carry-over-failed, the tool licences_carried, the opening of grants
with grant.key and the postgres driver leave the module, with its requirement of the database and of the secret
grant-key. The state carried stays as the carry-over's record; at its start the manager waits for nothing and
clears a carry-over-failed it finds kept.

Builds: design 39 parts §6 (the template files/database.url), §9, §10, §11
2026-11-12 11:55:54 +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 e436c59430 Area 5 (join 11): a take-in's branch no longer stands in for a member's base
Builds: design 47 G A-279 (answers G-22)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:40:07 +01:00
jschoubben fe56de746e Area 2 (join 11): claude-code invokes operator-channel notify and restic the assigner's assignments
Builds: design 47 G GR8 (per-verb grants), area 2 of the join

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:39:43 +01:00
jschoubben 8261c2c7e4 Area 5 (join 11): mesh-recovery fills a restore point's names when it takes the point
Builds: design 47 G A-230 (answers G-22)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:36:52 +01:00
jschoubben b276da8ba6 Area 5 (join 11): mesh-recovery's and restic's finding writers pass their finding-events binding
nats and distribution declare the old stream form and require no finding-events, so their writers stay on it.

Builds: design 47 G A-274 (answers G-22)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:34:26 +01:00
jschoubben f18e24ce19 Area 5 (join 11): the gate's take-in writes its entries into the record and each group member names its base
Builds: design 47 G A-188, A-236 (answers G-22)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:30:04 +01:00
jschoubben 466e1ae320 Merge remote-tracking branch 'origin/main' into feat/47-G-join11 2026-11-12 11:28:35 +01:00
jschoubben cc21062250 Area 4 (join 11): the Go build module lists its kept builds through buildstep's bus-free judgement
buildstep no longer takes mesh-sdk's buscalls objects (that package now reaches
the bus): the module judges each object of its kept-builds store with
KeptBuildOf and orders them with SortKept.

Builds: design 47 G (join 11 area 4: buildstep kept free of the bus)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:21:29 +01:00
mesh-tools f9dcbc2957 Merge pull request 'The licence manager counts room from the weekly window alone, so the switch finds a target (issue 1409)' (#661) from fix/1409-weekly-only into main 2026-11-12 10:18:53 +00: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 94a0ebbedf C4: a licence's room is its weekly window alone (issue 1409)
mesh/delivery merged: source.main moved to novox/mesh-catalog@f9dcbc295723
mesh/check checking 94a0ebbedfa6 on f9dcbc295723
The vendor retired the session limit and answers the session window empty, so Room required a percentage that never
comes: live, no licence had room and no switch could choose a target. Room is now 100 less the weekly percentage; the
session window takes no part in the switch threshold, a target's bound, the near-limit warning or no-room's words.
A reading with no weekly percentage still has unknown room. The settings' descriptions and the README say so.

The whole tests' vendor answers the session window empty, as it does live; on the old rule they failed with the live
symptom ("has no session or weekly window in its reading").

Builds: design 39 bus-and-switch C4
2026-11-12 10:57:19 +01:00
jschoubben e9cdf08841 Join 11: distribution's holder test is C3d's, which its holder code is
The merge of main's holder test (caller list from the config watch) over C3d's
(no caller list, REG2) left cases the merged holder does not answer; the
holder's code is C3d's, so its test is too, with the moved delivery paths.

Builds: design 47 G REG2 (C3d)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:55:34 +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
mesh-tools c5f6845386 Merge pull request 'The licence manager declares its logs in the logs section, so they are issued and its carry-over can finish (issue 1409)' (#660) from fix/1409-logs-section into main 2026-11-12 09:29:45 +00:00
jschoubben 2dc2c7e431 Merge branch 'feat/47-G-fix11-c3d' into feat/47-G-join11
# Conflicts:
#	modules/distribution/go.mod
#	modules/distribution/internal/holder/holder_test.go
2026-11-12 10:26:55 +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 4226204e57 Merge branch 'feat/47-G-fix11-b7' into feat/47-G-join11 2026-11-12 10:25:58 +01:00
jschoubben 546b674d14 Merge branch 'feat/47-G-fix11-c1c' into feat/47-G-join11 2026-11-12 10:25:58 +01:00
jschoubben 4caea7e624 Merge remote-tracking branch 'origin/main' into feat/47-G-join11
# Conflicts:
#	modules/distribution/internal/holder/holder_test.go
2026-11-12 10:25:58 +01:00
jschoubben 636cb633ac C3: the manager's two logs in the logs section the runtime issues (issue 1409)
mesh/delivery merged: source.main moved to novox/mesh-catalog@c5f684538607
mesh/check checking 636cb633acfd on c5f684538607
Live after #659 the manager, in its own runtime, was still issued none of its logs: the runtime on main issues
template states but logs only from the `logs` section. usage (35 days, 256 MiB) and audit (64 MiB) move there; the
states stay templates. The whole tests' runtime now issues logs only from `logs`, as main does, and failed on the
old manifest.

Builds: design 39 bus-and-switch C3
2026-11-12 10:21:27 +01:00
mesh-tools 6181d9afb3 Merge pull request 'The licence manager runs as its own account, so its own logs are issued to it and its carry-over can finish (issue 1409)' (#659) from fix/1409-own-runtime into main 2026-11-12 08:41:49 +00:00
mesh-tools 89ad370485 Merge pull request 'systemd: serve kernel-log, the node's kernel log of this boot or an earlier one; journal refuses a boot (issue 1975)' (#658) from fix/1975-kernel-log into main 2026-11-12 08:40:36 +00:00
jschoubben 333e3c21a5 C1c-2b: the three build modules keep a run's answer in an outputs store and serve the verb output
Each module's puller keeps an answer over what step-ended carries inline in the object store `outputs` its manifest requires
(template objects, 256 MiB) and its tools serve `<seat>.output` from it; the manifest claims the verb.

Builds: design 47 G A-254, A-257

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:39:54 +01:00
jschoubben 8291502cbb C2: a key pair the manager cannot read is made anew in its place (issue 1409)
mesh/delivery merged: source.main moved to novox/mesh-catalog@6181d9afb3e5
mesh/check checking 8291502cbbaf on 6181d9afb3e5
Moved to its own account, the manager finds manager-key.json still owned by the tool runner's account, which the
node-engine does not hand over; it skipped making a pair because the file existed, and every verb answered the read
error. Now a pair it cannot read is replaced by a new one, renamed over it, and said in its journal; every use passes
the public key per ask, so nothing depends on the old pair.

Builds: design 39 bus-and-switch C2

Claude-Session: https://claude.ai/code/session_01NcbgfHb9d4T9nq5Q6WqdiJ
2026-11-12 09:38:03 +01:00
jschoubben 8d2497b65e C1: the licence manager runs as its own account, its service and its tools in its own runtime (issue 1409)
Run inside the machine's tool runner, the manager was issued none of its own logs and states, so the carry-over
failed live ("keeps no log called usage ... it was issued: none"). It now declares runs-as claude-licence-manager,
makes that account, owns what it places on its machine and its secrets, reaches the bus with its own broker secret,
and invokes a node's claude_code_grant, which the tool runner's account could ask and its own could not.

The whole tests play the manager's own runtime: they issue only the states, logs, asks and events its manifest
names, and fail on a manifest without runs-as; a unit test holds every ask in the code to the manifest's invokes.

Builds: design 39 bus-and-switch C1

Claude-Session: https://claude.ai/code/session_01NcbgfHb9d4T9nq5Q6WqdiJ
2026-11-12 09:25:57 +01:00
jschoubben 5b77eb18f8 B5g3-4: mesh-build-go takes a run's input of any size from the chunked verb input
Builds: design 47 G §712, §354, A-237, A-249

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:24:45 +01:00
jschoubben aa10f070f2 B7-2: record-opened carries a forge-made record's repository, pull request, commit and branch
OpenForgeMade is the fill; no path of the gate opens a forge-made record (design 47 G §151 ends the mark from G's delivery),
so the teller says none until one does.

Builds: design 47 G §170, §522, A-161, A-172
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:46:45 +01:00
jschoubben 9ee1cbe3f5 B7-1: recovery-merged names the branch the merge moved and the module of the record's catalog half
Builds: design 47 G §81, §522, A-161, A-172
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:46:13 +01:00
jschoubben b52dd7ca44 B7-3: the pinned event's catalog entries name their branch, the record keeps it
A catalog revision is pinned by its watched branch and its number (revisions are numbered per branch): PinnedRevision gains
branch, Pin and Free take it, the key names it so two branches' revision 9 are two pins, and pinsOf says {branch, revision}.
Also the C2 merge's sourcetools imports follow the contracts' new path.

Builds: design 47 G §579, A-171
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:45:53 +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 584fc94baa BG2, BG3: the three build modules check the asker against the seat list and pull the named worker
The runtime source is *steprun.SeatAsks (named worker not bound is said through the module's journal); the callers follow
the seat list (steprun.SeatListCallers).

Builds: design 47 G §543, §544, A-163, A-170

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:44:46 +01:00
jschoubben 11f49905a1 Merge branch 'feat/47-G-fix11-c2' into feat/47-G-fix11-b7 2026-11-12 05:43:07 +01:00
jschoubben 51df346a23 BG12, BLD16: the Go build module's finding names the module as the runtime does
compose.go no longer fixes its own name "mesh-build-go": the finding's module is MESH_MODULE.

Builds: design 47 G §7, §368, §583

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:34:39 +01:00
jschoubben c1008aeedf BG4, BN4, BI4: the three build modules' pullers say the seat's events
Builds: design 47 G §496, §602, §603

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:33:26 +01:00
jschoubben 8d73b5ba1b C3d REG2: distribution keeps no caller list; the build modules are the catalog half's claimants of node-build-* seats
The config `callers`, the tool registry_callers and its invokes, the caller-list code and the holder's per-verb
Allowed checks go. The windows' driver counts as build modules the modules claiming a `node-build-*` seat in the
catalog half, followed by the seat mesh-catalog's branch follower on the program's views reader (one shared events
hub); it wakes again when a build module's entry moves. The retention check of remove finds the artifact sweep's
holder through the seat mesh-module-assigner's holders (seatlist.HolderOf), not a name.

Builds: design 47 G §610, §7, §428, A-156, A-82
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:30:54 +01:00