327 Commits
Author SHA1 Message Date
jschoubben f112011727 C3: the forge module reads failed-steps' fill through the bundle's state call mesh/state.info
Builds: design 47 G §623, A-214

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:19:49 +01:00
jschoubben 0aa5d6637c C1: the gate and the forge hold no branch name; the trunk is the asked branch, a default is the repository's
Builds: design 47 G §428, §507, A-93

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:18:25 +01:00
jschoubben 1cb1c84cc1 A-287, A-288: gitea announces every state its manifest declares; its refusal test holds the meaning
KEPT gains failed-steps, idle and transfers, so each declared state can be read by
its tools; the force-push refusal's test holds that the refusal names the one tool
that may do it and that it runs on the operator's Approve of that call.

Builds: design 47 G A-287, A-288

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:45:03 +01:00
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 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 9fe3f41ac0 AM-K2: the forge module's gitea_branch_protection_loosen alone removes a trunk's protection or lets a force-push onto it
The tool is marked in the manifest's needs-approval, so each call runs on the operator's Approve; the manifest
uses operator-channel; set_full keeps refusing a force-push onto a trunk and names the new tool; both clients
gain deleteBranchProtection.

Builds: design 46 approval mark §21 (milestone G)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:17:44 +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 00be4c5063 GIT17: the forge module deletes seen keys past 30 days on each step-ended and at its start; git_seen_expire runs it now
Builds: design 47 G §581, §585, §487 (TypeScript tests not run here: no installed dependencies)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:06:03 +01:00
jschoubben e4c5108306 JUDGE: the module tests that read a manifest follow the manifests' new forms (version 0.1, findings in requires, the foundation's old sections)
sudo and localization expect version 0.1; distribution and gitea read the old objects and state sections; mesh-build-go, mesh-knowledge, mesh-provisioner and mesh-self-check expect the findings asked in requires and the keeper's ask consumed. Each assertion failed against the changed manifest before it was changed.

Builds: design 47 G §368, §529, §584, A-30

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:00:47 +01:00
jschoubben af978cc559 JUDGE (§584): gitea, a foundation part, keeps its bus state in its old sections
transfers, idle (key-ttl), failed-steps (history 1) go from requires entries to the old state section and incoming to the old objects section, as §584 has the forge module keep every state in its old sections.

Builds: design 47 G §584, ADR 0619 §1

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:44:29 +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 6a612c58cb G findings: mesh-config, gitea and distribution declare their finding events in the foundation form, the stream <module>-findings in streams
Builds: design 47 G A-30, §529, §577
2026-11-11 22:24:58 +01:00
jschoubben c81915b039 G findings: distribution-tools and package-registry make the held writer at once and start it after Serve, as it seeds at Start
Builds: design 47 G A-40, A-32
2026-11-11 22:19:22 +01:00
jschoubben 652493e2ac G: the package seats' whole test plays the runtime's put and get sessions
Builds: design 47 G A-21, §518, §490

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:15:42 +01:00
jschoubben fc83f204f4 G findings: the held writers of the stdio bundles are made once the runtime has its channel
The held writer reads the keys of its state when it is made, so it is made after Serve answers state calls; the keeper says a finding is not said before it exists.

Builds: design 47 G A-32, A-29, A-37
2026-11-11 22:15:42 +01:00
jschoubben 18fd2a32bf G findings: distribution and gitea's package registry write through the held writer, so a restart neither drops nor rewrites their findings
Their in-memory open sets go.

Builds: design 47 G A-32, A-29, A-37
2026-11-11 22:11:12 +01:00
jschoubben 8255640d00 G findings: claude-code, mesh-provisioner, distribution, mesh-config and gitea declare the writer's three events
The writer listens to mesh-conditions.findings-asked, so each also consumes it, as the modules that moved before.

Builds: design 47 G A-30, §383, §686

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 22:10:19 +01:00
jschoubben 3215e5eeb9 G findings: distribution and gitea's package registry delete their old finding keys once at start
Builds: design 47 G A-31, A-14, A-22

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 22:08:33 +01:00
jschoubben 06ebd7e8cf G findings: the writers name the ask's subject from the contract; the readers take the writer whole
WriterConfig.Asked is the generated mesh-conditions contract's SubjectFindingsAsked (A-17), a reader's Findings is the
module's writer itself (A-22, A-26), and mesh-build-go's single manifest ask writes and clears its first-view-unanswered
finding through the writer with the contract's Finding (A-28). mesh-config and mesh-vault's own followers (A-28) are not
yet moved onto a views.Reader: they do not compile at mesh-sdk 24f876a.

Builds: design 47 G §687, §689, A-17, A-22, A-26, A-28

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 22:03:09 +01:00
jschoubben 95f29d6c54 G findings: the modules with findings of their own write them through mesh-sdk's writer
artifact-store-tools (image-missing, sweep-refused), distribution (program and tools bundle, one writer each over its own
kinds), gitea's package-registry (and the token-refused key the TypeScript bundle watches) and mesh-config keep their
findings open and write and clear them through the generic writer; mesh-vault states its assignments view's. A part of an
id told apart by a ref is in the id (<id>.<ref>), each escaped; the writer starts once Serve has the runtime's channel; the
removed findings helpers and resolved words go.

Builds: design 47 G §686, §687, §689, A-3, A-14, A-16, A-22

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:58:08 +01:00
jschoubben 299f43167c GIT12, REG1: the reservation check's test is a case of the holder's own test, so no module ends over its start count
Builds: design 47 G §381; test budget

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:15:01 +01:00
jschoubben 86342c4399 GIT12: the forge module's package registry checks a publish against the builder's reservation, asked by the package's name
The holder asks the seat mesh-builds' verb reserved with the publish's name and version in place of builder_versions, and stores
only a version reserved for an artifact of the publish's digest; the manifest invokes the verb and takes no builder package.

Builds: design 47 G §381, §478, §504

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:04:56 +01:00
jschoubben bc2e5574ef GIT7, GIT8: the forge module keeps the runner's failed required steps and refuses a head by them; git_failed_steps and git_failed_steps_drop
merge-pull refuses a head at whose fingerprint a run failed a required step (policy-failed, naming run, module, step), from the
module's own state failed-steps kept from step-ended, with the seen keys of every step end and the deletion once no watched
branch's head nor open pull request's head names a commit. The two tools read it with its fill and drop a key after the hand act.

Builds: design 47 G §39, §83, §84, §85, §135, §475, §487, §548

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:01:27 +01:00
jschoubben e6aab55008 GIT15: the forge module guesses no base branch for a pull request the forge gave none
The base "main" fallbacks of the open-pulls read and the announcer are gone (the indexer's module name and tool went with GIT10).
The manifest's version is MAN1's, written with the fill's source it needs.

Builds: design 47 G §7, §428

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:44:59 +01:00
jschoubben 312d824e4f GIT13: the forge module keeps no trusted callers; who may call a verb is the seat definition's
The config value callers, the package seats' list of callers with its watch, and the seat git's caller judgement are gone:
the grants part grants by each definition's callers and the bus refuses the rest.

Builds: design 47 G §68, §127, §313, §321

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:43:18 +01:00
jschoubben 5daf3a333a GIT11: the seat git's tag writes go/vMAJOR.MINOR.PATCH at the commit a released version was built from
A tag at that commit is answered performed; at another commit, refused (a tag is never moved). The builder alone calls it:
the bus refuses any other account from the definition's callers.

Builds: design 47 G §370

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:37:36 +01:00
jschoubben a00429bc80 GIT6, GIT9: merge-pull merges the head the caller names and asks no Approve; it refuses every merge until the first registrations
merge-pull answers its refused-kind (head-moved, unprotected, git-refused, no-registrations); an already merged pull request at
that head is answered performed. The failed-steps refusal (policy-failed) is GIT7, stopped on a design question.
GIT9: registrations.ts learns the first registrations from the seat mesh-catalog's verb registrations at the start and its event
registration-changed; the code artifact needs mesh-delivery-assigner:program.

Builds: design 47 G §38, §129, §314, §95, §96, §130, §353, §432

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:36:37 +01:00
jschoubben 975f1aa8e8 GIT5: the forge's push webhook of a branch says branch-moved with the new head on the seat
Builds: design 47 G §11, §111, §331 branch-moved

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:32:33 +01:00
jschoubben 0bf636826a GIT4: the seat git's branch answers a branch's head and whether a rule refuses a direct push and admits only merges
Builds: design 47 G §5, §111, §310 branch

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:32:33 +01:00
jschoubben 32655b95f6 GIT1, GIT2, GIT3, GIT10: the forge module serves the seat git's verbs and says its events, retires its acting tools, follows the catalog half
The four share files (index.ts, module.json, guard.test.ts), so they land as one commit.
GIT1: seat.ts serves pull, open-pulls, tags, trees, file, contains, statuses, status, comment, view, note, merge-pull
as tools on the seat, each answering the contract's shape and an error of kind refused, not-found or failed; a comment,
view or note whose act id is held is answered held (note matched by id). merge-pull merges the head the caller names
(its from-G judgements are GIT6, GIT7, GIT9).
GIT2: seatevents.ts says pull-updated, pull-merged, pull-closed, forge-pull, forge-status, forge-delete and repo-writable on
mesh.seat.git.event.<event>; the module's emits drop them.
GIT3: merge.ts, check.ts, the acting tools, the owed watch, the gate's source read and check-gates-merge are gone.
GIT10: catalog.ts follows the seat mesh-catalog (revision, catalog-revision); no write is granted before the first view.

Builds: design 47 G §310, §311, §312, §313, §314, §163, §317, §278, §321, §196

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:31:24 +01:00
jschoubben 067b9a47da Play the config watch in the package seats' whole test, so the held callers list is proven (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-catalog@462db1c25719
mesh/check checking 067b9a47dafd on 462db1c25719
The holder holds its callers by a config watch since the callers were moved off per-call reads; the test's player answered only provision.get.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-10 11:00:57 +01:00
jschoubben 24bf59219e Distribution and the forge hold their caller list from its config watch, not an ask per call (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-catalog@5e537f851f08
mesh/delivery-group group fix/1966-callers-config-read merged: every member is merged
mesh/check checking 24bf59219ee5 on 9c42423d5821 | novox/mesh-catalog#646 in group fix/1966-callers-config-read
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-09 22:42:00 +01:00
jschoubben 4becc7bd83 Forge database pool caps are config values and a change recreates the forge (issue 1966, recovery)
mesh/delivery merged: source.main moved to novox/mesh-catalog@53d173aa7de5
mesh/check checking 4becc7bd8312 on 53d173aa7de5
The caps were literals in server.env and the container named no restart-on, so a changed env-file never reached the running forge. They are now three gitea config values placed with ${config:...}, and the server container restarts on server-env.

Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 03:33:16 +01:00
jschoubben b4192c525e Cap the forge's database pool at 40 open connections: the store's 100 are shared by every module (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-catalog@61737962fcb6
mesh/check failed (3): ace: the check of novox/mesh-catalog#632 failed: downloading the asked version 68581…; and 2 more | b4192c525e7e on 61737962fcb6
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
2026-11-08 02:01:20 +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 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 625d627794 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 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
jschoubben 8d3cffab9a gitea and mesh-provisioner tests name the finding key and the findings state through the conditions client, not mesh-sdk's health (B5l; ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:46:45 +01:00
jschoubben df53a0c59e gitea's whole test names the builder's versions address from the builder's builds package (B5g; ADR 0634 §1; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 16:09:54 +01:00
jschoubben 72dd8a719e gitea asks the builder through the builder's published package builds, taken by its series (B5e; ADR 0634 §1, §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:25:33 +01:00
jschoubben 4104143d16 The writers of findings give the seat's time.Time (artifact-store-tools, distribution, gitea, mesh-config; B5d; ADR 0634; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 15:13:16 +01:00
jschoubben b4dbda287b Findings are written and read in the seat mesh-conditions' layout: gitea, distribution, mesh-config, artifact-store-tools (B5b Left 5 part; ADR 0634 §4; issue 1966)
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
2026-11-05 14:50:35 +01:00
jschoubben b2db504ab2 Build, image, node, distribution and gitea take parts, buildstep and composer from mesh-delivery-sdk; seatgen's client check allows a client's own packages and its -go-module has no root default; the build module writes its finding through the conditions client (K-4..K-20 part; ADR 0634 §3, §4, ADR 0635 §4; issue 1966) 2026-11-05 14:31:04 +01:00
jschoubben e8f93d5db0 Provision and provider users take the provisioner's client; mesh-vault writes its findings through the conditions client (K-4..K-20, K-21 part; ADR 0634 §4; issue 1966) 2026-11-05 14:26:48 +01:00
jschoubben 87388b9046 Eleven modules record hand acts through the hand-acts client, the finding writers are the conditions client's, nats takes the broker seat's name from its package (K-21 part, K-4..K-20 part; ADR 0634 §4, ADR 0635 §4; issue 1966) 2026-11-05 14:21:57 +01:00
jschoubben a86e2ff1fc Mesh-catalog modules import operator-channel from its domain's contracts module and the registry seats from mesh-delivery's (K-4..K-20 first part; ADR 0634 §7, ADR 0636; issue 1966)
The group's module paths are placeholders the re-pin rewrites.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-05 14:07:30 +01:00
jschoubben cea09d8a36 Make five manifests the milestone changed pass the indexer's judge: an event in one place, one form per state, a digest of a text field, trusted and runtime config values (issue 1966)
messenger's refusal took its declaration of operator-channel out of the judged catalogue, so claude-code's use of it
was refused too. distribution's two remaining refusals (its program builds beside the artifact store it provides,
and its only health check is its own tool) are a design question left to the lead.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 19:55:36 +01:00
jschoubben d8af436536 Pin mesh-sdk 05b3e2e1b94f and mesh-contracts ae5266e77639, the group's final heads, in every Go module (issue 1966)
Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 18:46:38 +01:00