Merge a pull request marked ready at its head once its checks pass (issue 722) #303

Merged
mesh-admin merged 3 commits from feat/merge-on-ready into main 2026-10-14 19:57:01 +00:00
Contributor

Issue 722 (an approved pull request with green checks waits for someone to call merge). Operator, 2026-10-14: "the reviewer task should merge the request or mark the MR as ready to merge in any case".

The mark. The independent reviewer marks a pull request ready at the head it approved: the label mesh/ready plus a comment with a line ready at <full head sha> (both through gitea_api / gitea_add_comment; the forge's approve stays the operator's).

gitea. gitea_open_pulls carries each pull request's labels and, for one labelled mesh/ready, its mark: the head the newest ready at comment names, who wrote it, when, and the label's id. Comments are read only for labelled pull requests.

mesh-delivery (ready.go) reads the open pull requests every minute (was five) and, each tick, for every mark:

  • marked head is not the head (a push after the mark): the label is taken off (gitea_api DELETE) and the clearing is said on the pull request; nothing merges;
  • delivery ready (check passed against its trunk's head), or proposed with an out-of-date verdict nobody asked again: gitea_merge_pull_request at the marked head, the one merge path. When the trunk moved the tool asks the fresh check and refuses; the merge is asked again once a minute and lands on the passing verdict;
  • group member: only when the group's composed check passed for its members' heads as they are, and every member before it in the group's order merged;
  • check failed (rejected): no merge, one comment on the pull request, and a stalled line (the controller's delivery.<id>.stalled condition). A mark the merge tool refused for an hour is a stalled line too.

Everything done is kept on the delivery (ready: mark, waits, tries, last answer, merged) shown by show, said in the log, and the merge's transition (merged/done) names mesh-delivery, on the ready mark at <head> by <who> as its author. Manifest invokes gain gitea_merge_pull_request, gitea_add_comment, gitea_api.

Tests (fail on main): ready_test.go (merge at the marked head; push clears the mark; trunk moved → judged again → merged on verdict; failed check said + stalled; refused an hour → stalled; group merges in order only once composed) and gitea announcing.test.ts (the mark is read). merge-check.sh for gitea + mesh-delivery passes locally; the TypeScript part passes (91 tests).

Issue 722 (an approved pull request with green checks waits for someone to call merge). Operator, 2026-10-14: "the reviewer task should merge the request or mark the MR as ready to merge in any case". **The mark.** The independent reviewer marks a pull request ready at the head it approved: the label `mesh/ready` plus a comment with a line `ready at <full head sha>` (both through gitea_api / gitea_add_comment; the forge's approve stays the operator's). **gitea.** `gitea_open_pulls` carries each pull request's labels and, for one labelled `mesh/ready`, its mark: the head the newest `ready at` comment names, who wrote it, when, and the label's id. Comments are read only for labelled pull requests. **mesh-delivery** (ready.go) reads the open pull requests every minute (was five) and, each tick, for every mark: - marked head is not the head (a push after the mark): the label is taken off (gitea_api DELETE) and the clearing is said on the pull request; nothing merges; - delivery ready (check passed against its trunk's head), or proposed with an out-of-date verdict nobody asked again: `gitea_merge_pull_request` at the marked head, the one merge path. When the trunk moved the tool asks the fresh check and refuses; the merge is asked again once a minute and lands on the passing verdict; - group member: only when the group's composed check passed for its members' heads as they are, and every member before it in the group's order merged; - check failed (rejected): no merge, one comment on the pull request, and a stalled line (the controller's `delivery.<id>.stalled` condition). A mark the merge tool refused for an hour is a stalled line too. Everything done is kept on the delivery (`ready`: mark, waits, tries, last answer, merged) shown by `show`, said in the log, and the merge's transition (merged/done) names `mesh-delivery, on the ready mark at <head> by <who>` as its author. Manifest invokes gain gitea_merge_pull_request, gitea_add_comment, gitea_api. Tests (fail on main): ready_test.go (merge at the marked head; push clears the mark; trunk moved → judged again → merged on verdict; failed check said + stalled; refused an hour → stalled; group merges in order only once composed) and gitea announcing.test.ts (the mark is read). merge-check.sh for gitea + mesh-delivery passes locally; the TypeScript part passes (91 tests).
mesh-admin added 1 commit 2026-10-14 19:23:37 +00:00
Merge a pull request marked ready at its head once its checks pass (issue 722)
mesh/merge-gate out of date: judged against trunk 482232e8c51c, the trunk is now 7e3e62062bef; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk 482232e8c51c, the trunk is now 7e3e62062bef; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
7e0001e304
The operator wants a reviewed pull request merged without a session calling
the merge tool again after every recheck. The reviewer marks it ready (label
mesh/ready and a comment "ready at <full head sha>"); the forge's open-pulls
read carries the mark, and mesh-delivery merges through gitea_merge_pull_request
at that head, in a group's order once its composed check passed. A push after
the mark clears it; a failed check is said on the pull request and as a
stalled line.
Author
Contributor

Delivery novox/mesh-catalog@baa5ef802e82 — delivered since 2026-10-14T20:00:13Z

Delivery plan — builds gitea, mesh-delivery → novox; no bus step

  • tier 0: gitea, mesh-delivery
  • novox: receives gitea, mesh-delivery
  • gitea provides npm-package-registry, git: its consumers are sent again after it
  • gitea keeps data (ADR 0233): what it holds is backed up before it moves

Machines

  • gitea on every machine running it: sent
  • mesh-delivery on every machine running it: sent

Transitions

  • 2026-10-14 19:52 (new) → proposed (announced): novox/mesh-catalog#303's head announced
  • 2026-10-14 19:55 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
  • 2026-10-14 19:55 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-14 19:57 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
  • 2026-10-14 19:57 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
  • 2026-10-14 20:00 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-catalog@baa5ef802e82` — **delivered** since 2026-10-14T20:00:13Z **Delivery plan** — builds gitea, mesh-delivery → novox; no bus step - tier 0: gitea, mesh-delivery - novox: receives gitea, mesh-delivery - gitea provides npm-package-registry, git: its consumers are sent again after it - gitea keeps data (ADR 0233): what it holds is backed up before it moves **Machines** - gitea on every machine running it: sent - mesh-delivery on every machine running it: sent **Transitions** - 2026-10-14 19:52 (new) → proposed (announced): novox/mesh-catalog#303's head announced - 2026-10-14 19:55 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit - 2026-10-14 19:55 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-14 19:57 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move - 2026-10-14 19:57 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit - 2026-10-14 20:00 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at 7e0001e3
Judged: head 7e0001e3045b merged into trunk 482232e8c51c; read beside it: mesh-controller c2ec0a601acb, mesh-controller-main c2ec0a601acb, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: gitea, mesh-delivery)
  • mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)

Delivery plan — builds gitea, mesh-delivery → novox; no bus step

  • tier 0: gitea, mesh-delivery
  • novox: receives gitea, mesh-delivery
  • gitea provides npm-package-registry, git: its consumers are sent again after it
  • gitea keeps data (ADR 0233): what it holds is backed up before it moves
  • read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go

Run by the build seat on novox as build-1792005847892429545 (builds --log build-1792005847892429545).

--- the gate: gitea, mesh-delivery
gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T19:10:09Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-14T19:10:09Z

modules the change moves:
  - gitea (changed)
  - mesh-delivery (changed)

machines:
  - a machine (f35): composes
  - holds mesh-dns-resolver (idt): composes
  - holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
  - a machine (yvbpsm): composes

a merge would rebuild 2 module(s) in 1 tier(s): gitea, mesh-delivery

notes:
  - modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go and modules/mesh-delivery/cmd/mesh-delivery/ready_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.006s
words: 12 retired words and 70 daemons' lines, none in the 47029 strings of 720 files
ok  	git.novox.be/novox/mesh-catalog/checks/agenthome	0.013s
agent-home: no archive and no file written into under the agent's home
ok  	git.novox.be/novox/mesh-catalog/checks/secrets	0.013s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.007s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 62, as kept
ok  	git.novox.be/novox/mesh-catalog/checks/deps	0.231s
testing modules/gitea
ok  	gitea/cmd/forge	1.525s
ok  	gitea/cmd/npm-registry	1.913s
?   	gitea/internal/forgehttp	[no test files]
testing modules/mesh-delivery
ok  	mesh-delivery/cmd/mesh-delivery	3.453s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/gitea (TypeScript)
testing modules/gitea (TypeScript)
✔ a pull request opened after the margin is looked at, by its own update time (32.379938ms)
✔ every open pull request is read with what its base requires and what its head has (gitea_open_pulls) (75.572295ms)
✔ a pull request or issue number that is not one is refused before the forge is asked (1.989024ms)
✔ a merged pull request whose branch was deleted is announced with its branch, not its pull ref (13.930595ms)
✔ a pull request's ready mark is read: the label and the head the newest ready comment names (20.747837ms)
✔ the newest status of each context is kept, with what it said, when and by whom (27.430629ms)
✔ a commit merges only when every required status is a success; a warning blocks (0.798011ms)
✔ no rule requires nothing; a rule that cannot be read says nothing, never yes (0.268071ms)
✔ a commit is contained in another when the compare finds nothing on it the other lacks (1.089542ms)
✔ a note line is appended once, as the forge's user, in its own repository (16.90044ms)
✔ a note that cannot be written is said, never read as written (0.631952ms)
✔ one view per pull request, found by its marker; only the mesh's statuses (0.834821ms)
✔ a build machine taking the check is said on the head: building on which machine, since the local time (27.330008ms)
✔ the verdict heard while a 'building' write is in flight lands last and stays (9.229077ms)
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written
✔ the verdict written while a start's read of the forge is in flight stays the newest status (1.473142ms)
✔ the verdict heard while a 'building' write still waits its turn: the 'building' is never written (0.588131ms)
✔ a start heard after the verdict writes nothing (1.121762ms)
✔ a start from before the check now pending (a run before a recheck, the stream's history) writes nothing (0.527301ms)
✔ an old run's verdict redelivered after a recheck's pending is not written over it (0.834621ms)
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check the forge holds pending; not written
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written
✔ an old run's verdict in flight when the recheck comes lands before the recheck's pending (5.768391ms)
✔ a rechecked head says where its new run is: building on which machine (0.922331ms)
✔ the recheck's own verdict is written, even asked a little before the pending by another machine's clock (0.682222ms)
✔ after a restart, an old run's verdict is weighed against the check the forge's history holds open (0.531151ms)
✔ a recheck the forge does not take fails its caller, and the head is as it was (0.525591ms)
✔ the status tool writes the merge check's pending through the writer, and the mesh's other statuses as they were (8.911716ms)
✔ when a check was asked is read from its id; the opening of the check now pending from the gate's history (0.27694ms)
✔ a head this process did not announce (it restarted) is said only while the forge holds its gate pending (0.432621ms)
✔ a repository as the mesh clones it is told from another (0.313601ms)
✔ gitea_api refuses the forge's administration, a branch's protection and the merge check's status, and sends nothing (7.317103ms)
✔ gitea_api refuses a file written to the default branch or one a rule guards, and writes one on a branch of its own (68.728443ms)
✔ a protection rule covers a branch as the forge decides it: classes, alternatives, a plain name in any case (issue 539) (17.09735ms)
✔ gitea_api still writes what an author writes (5.855031ms)
✔ gitea_branch_protection_set only strengthens (13.319294ms)
✔ gitea_merge_pull_request merges only a head whose required statuses all succeeded, and only that head (51.646802ms)
✔ gitea_merge_pull_request refuses a verdict judged against an earlier trunk, and asks the check once (163.207322ms)
✔ gitea_merge_pull_request merges only the head it is named, and refuses one that is not the head (16.53719ms)
✔ gitea_merge_pull_request is loud when the forge merged a head other than the one it was handed (14.131245ms)
✔ gitea_merge_pull_request says the merge happened when reading back what landed fails (24.456764ms)
✔ gitea_merge_pull_request reads back a fast-forward, and says it cannot read back a squash or a rebase (56.438491ms)
✔ gitea_delete_repo deletes only the tools' own user's repository, unguarded, untouched for 30 days, named in full (21.003958ms)
✔ gitea_api sends the path it judged, and refuses moving a pull request's base (3.546136ms)
✔ gitea_merge_pull_request merges only into a branch whose protection requires the checks (6.917003ms)
✔ a rule named for a branch is not made weaker than the glob rule that guards it now (12.677322ms)
✔ a repository owner or name is never another path (0.481271ms)
✔ the judges, without a forge (0.409261ms)
✔ gitea_api never acts as another user: sudo, in any case, and any query key it does not send are refused (2.763365ms)
✔ gitea_api never approves a pull request nor requests changes: those are the operator's (2.330484ms)
✔ no tool's caller text becomes another path or another user: `..` and `?sudo=` are refused before the forge (5.45154ms)
✔ every page of a pull request's files is read, though the forge caps a page at fifty (38.8859ms)
✔ a pass asks only the repositories that moved since the last look, every one before the first (0.565331ms)
✔ the directories above a merge's files that hold a module at the commit are said, the root never (24.632404ms)
✔ a lookup the forge refuses is thrown, not read as no module (7.738554ms)
✔ a renamed file is said under its old name too, as gone (novox/hq ADR 0267) (9.057326ms)
✔ a new head beyond the newest 20 open pull requests is announced, exactly once (73.864702ms)
✔ a pass pages until it reaches back past its floor, and no further (44.66246ms)
✔ the statuses asked for replace the rule's, and an empty list requires none (8.214654ms)
✔ a new rule refuses direct pushes unless asked; an administrator's override only when said (0.358421ms)
✔ each open pull request's new head is announced once, and nothing closed or merged (17.990102ms)
✔ a verdict is the head commit's status; an error is the forge's error, never a success (1.321802ms)
✔ each layer is its own status: the gate with the modules it judged, the repository's own check beside it (0.807552ms)
✔ no verdict sets warning on a required check; only a person's decision fails (1.043282ms)
✔ a commit status is set on the commit, under the merge check's context (52.915884ms)
✔ a change plan is the gate's result: said on the status and, when it builds something, as a comment (0.596181ms)
✔ a head announced is pending in the build queue, since the local time it was announced (0.27819ms)
✔ the vault's token is used, a setting of it is ignored and said once, without its value (2.816005ms)
✔ a consumer that asks nothing, or write, publishes: the package team (1.693123ms)
✔ a consumer that asks to read joins the readers, who write no package (0.478591ms)
✔ a reader is made, put on the readers team, and taken off the package team (0.570191ms)
✔ a publisher is made and put on the package team, as before (0.22375ms)
✔ first start: mints with the admin account, keeps the token at 0600, asks for the tools' scopes only (32.105247ms)
✔ second start: reuses the kept token, mints nothing (15.520658ms)
✔ the forge rejects the kept token (its data was restored): minted afresh, once, and the call goes through (24.592544ms)
✔ a token kept with write:admin by an earlier build is minted again without it at the next start, and the forge drops the old one (22.631781ms)
✔ a kept token lacking a scope the tools need: the forge refuses the call for the scope, the token is re-minted with the whole list, and the call goes through (20.431736ms)
✔ the kept file is gone but the forge still holds a token by that name: replaced, not refused (17.627791ms)
✔ concurrent first calls share one mint (11.884292ms)
✔ the admin account is refused: said plainly, nothing kept, and the next call fails the same way rather than crashing (13.304853ms)
✔ one process shares one source per kept file — the watcher and the tools never renew against each other (0.986262ms)
✔ a second process finds the token the first renewed, and reuses it instead of minting over it (20.673867ms)
✔ a configured token wins, and is reported rather than minted over when the forge rejects it (2.976045ms)
✔ nothing to mint with and no token: the client says what is missing (0.20586ms)
[gitea] no tools — no Gitea token, and nothing to mint one with — set MESH_GITEA_TOKEN, or MESH_GITEA_ADMIN_USER, MESH_GITEA_ADMIN_PASSWORD_FILE, MESH_GITEA_STATE_DIR
[gitea] no token kept — minting one
[gitea] the forge already holds a token named "mesh-tools" — replacing it
[gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-OwbEl6/state/token
✔ the tools register once there is a way to a token, and the first call mints it (9.092516ms)
[gitea] no token kept — minting one
[gitea] the forge already holds a token named "mesh-tools" — replacing it
[gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-GGi9cN/state/token
✔ a pull request can be closed, read and cleaned up through the tools (23.947413ms)
[gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 25 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-host's main moved from d28ca95ccccc to ffffffffffff: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-host: whether a trunk moved could not be weighed, so it is weighed again on the next pass — the forge is away
[gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-controller's feat/57-config-and-provisioning moved from eeeeeeeeeeee to d28ca95ccccc: 1 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
✔ both statuses say the head and the trunk commit the verdict judged, first, whatever the summary's length (1.805613ms)
✔ a trunk's move puts an open head's merge check out of date, naming both commits, unless a check is on its way (1.446263ms)
✔ a push to a trunk puts every open pull request into it out of date — twenty-five of them — and none into another (4.172327ms)
✔ a trunk that cannot be read is weighed again on the next pass, never recorded half (0.45251ms)
✔ the trunk's move takes its turn after a verdict in flight, and weighs what the forge holds then (0.532141ms)
✔ a verdict judged against a trunk newer than the pass's first read is not put out of date (0.345301ms)
✔ a verdict that landed out of date keeps its account on the pull request (0.384351ms)
✔ a release branch's move puts every open pull request into it out of date, as a trunk's does (ADR 0358 §5) (0.475321ms)
ℹ tests 91
ℹ suites 0
ℹ pass 91
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 802.219575
**Merge check** at `7e0001e3` Judged: head `7e0001e3045b` merged into trunk `482232e8c51c`; read beside it: mesh-controller `c2ec0a601acb`, mesh-controller-main `c2ec0a601acb`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: gitea, mesh-delivery) - `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript) **Delivery plan** — builds gitea, mesh-delivery → novox; no bus step - tier 0: gitea, mesh-delivery - novox: receives gitea, mesh-delivery - gitea provides npm-package-registry, git: its consumers are sent again after it - gitea keeps data (ADR 0233): what it holds is backed up before it moves - read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go Run by the build seat on novox as `build-1792005847892429545` (`builds --log build-1792005847892429545`). ``` --- the gate: gitea, mesh-delivery gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups long-running resources without health: 0 files asking for a setting without saying whether it is trusted: 0 2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T19:10:09Z says they run composing every machine as the mesh is the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued composing every machine with the change the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose) judged by controller development build against the facts of 2026-10-14T19:10:09Z modules the change moves: - gitea (changed) - mesh-delivery (changed) machines: - a machine (f35): composes - holds mesh-dns-resolver (idt): composes - holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes - a machine (yvbpsm): composes a merge would rebuild 2 module(s) in 1 tier(s): gitea, mesh-delivery notes: - modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go and modules/mesh-delivery/cmd/mesh-delivery/ready_test.go read by no module's build, and rebuild nothing (issue 280) --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.006s words: 12 retired words and 70 daemons' lines, none in the 47029 strings of 720 files ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.013s agent-home: no archive and no file written into under the agent's home ok git.novox.be/novox/mesh-catalog/checks/secrets 0.013s secrets: no setting can replace a vault secret in a mergeable file (1 known, nested) ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s paths: no module names another's state on its machine (3 known, listed to go) long-running resources without health: 62, as kept ok git.novox.be/novox/mesh-catalog/checks/deps 0.231s testing modules/gitea ok gitea/cmd/forge 1.525s ok gitea/cmd/npm-registry 1.913s ? gitea/internal/forgehttp [no test files] testing modules/mesh-delivery ok mesh-delivery/cmd/mesh-delivery 3.453s --- its merge-check-typescript.sh (typescript toolchain) type-checking modules/gitea (TypeScript) testing modules/gitea (TypeScript) ✔ a pull request opened after the margin is looked at, by its own update time (32.379938ms) ✔ every open pull request is read with what its base requires and what its head has (gitea_open_pulls) (75.572295ms) ✔ a pull request or issue number that is not one is refused before the forge is asked (1.989024ms) ✔ a merged pull request whose branch was deleted is announced with its branch, not its pull ref (13.930595ms) ✔ a pull request's ready mark is read: the label and the head the newest ready comment names (20.747837ms) ✔ the newest status of each context is kept, with what it said, when and by whom (27.430629ms) ✔ a commit merges only when every required status is a success; a warning blocks (0.798011ms) ✔ no rule requires nothing; a rule that cannot be read says nothing, never yes (0.268071ms) ✔ a commit is contained in another when the compare finds nothing on it the other lacks (1.089542ms) ✔ a note line is appended once, as the forge's user, in its own repository (16.90044ms) ✔ a note that cannot be written is said, never read as written (0.631952ms) ✔ one view per pull request, found by its marker; only the mesh's statuses (0.834821ms) ✔ a build machine taking the check is said on the head: building on which machine, since the local time (27.330008ms) ✔ the verdict heard while a 'building' write is in flight lands last and stays (9.229077ms) [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written ✔ the verdict written while a start's read of the forge is in flight stays the newest status (1.473142ms) ✔ the verdict heard while a 'building' write still waits its turn: the 'building' is never written (0.588131ms) ✔ a start heard after the verdict writes nothing (1.121762ms) ✔ a start from before the check now pending (a run before a recheck, the stream's history) writes nothing (0.527301ms) ✔ an old run's verdict redelivered after a recheck's pending is not written over it (0.834621ms) [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check the forge holds pending; not written [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written ✔ an old run's verdict in flight when the recheck comes lands before the recheck's pending (5.768391ms) ✔ a rechecked head says where its new run is: building on which machine (0.922331ms) ✔ the recheck's own verdict is written, even asked a little before the pending by another machine's clock (0.682222ms) ✔ after a restart, an old run's verdict is weighed against the check the forge's history holds open (0.531151ms) ✔ a recheck the forge does not take fails its caller, and the head is as it was (0.525591ms) ✔ the status tool writes the merge check's pending through the writer, and the mesh's other statuses as they were (8.911716ms) ✔ when a check was asked is read from its id; the opening of the check now pending from the gate's history (0.27694ms) ✔ a head this process did not announce (it restarted) is said only while the forge holds its gate pending (0.432621ms) ✔ a repository as the mesh clones it is told from another (0.313601ms) ✔ gitea_api refuses the forge's administration, a branch's protection and the merge check's status, and sends nothing (7.317103ms) ✔ gitea_api refuses a file written to the default branch or one a rule guards, and writes one on a branch of its own (68.728443ms) ✔ a protection rule covers a branch as the forge decides it: classes, alternatives, a plain name in any case (issue 539) (17.09735ms) ✔ gitea_api still writes what an author writes (5.855031ms) ✔ gitea_branch_protection_set only strengthens (13.319294ms) ✔ gitea_merge_pull_request merges only a head whose required statuses all succeeded, and only that head (51.646802ms) ✔ gitea_merge_pull_request refuses a verdict judged against an earlier trunk, and asks the check once (163.207322ms) ✔ gitea_merge_pull_request merges only the head it is named, and refuses one that is not the head (16.53719ms) ✔ gitea_merge_pull_request is loud when the forge merged a head other than the one it was handed (14.131245ms) ✔ gitea_merge_pull_request says the merge happened when reading back what landed fails (24.456764ms) ✔ gitea_merge_pull_request reads back a fast-forward, and says it cannot read back a squash or a rebase (56.438491ms) ✔ gitea_delete_repo deletes only the tools' own user's repository, unguarded, untouched for 30 days, named in full (21.003958ms) ✔ gitea_api sends the path it judged, and refuses moving a pull request's base (3.546136ms) ✔ gitea_merge_pull_request merges only into a branch whose protection requires the checks (6.917003ms) ✔ a rule named for a branch is not made weaker than the glob rule that guards it now (12.677322ms) ✔ a repository owner or name is never another path (0.481271ms) ✔ the judges, without a forge (0.409261ms) ✔ gitea_api never acts as another user: sudo, in any case, and any query key it does not send are refused (2.763365ms) ✔ gitea_api never approves a pull request nor requests changes: those are the operator's (2.330484ms) ✔ no tool's caller text becomes another path or another user: `..` and `?sudo=` are refused before the forge (5.45154ms) ✔ every page of a pull request's files is read, though the forge caps a page at fifty (38.8859ms) ✔ a pass asks only the repositories that moved since the last look, every one before the first (0.565331ms) ✔ the directories above a merge's files that hold a module at the commit are said, the root never (24.632404ms) ✔ a lookup the forge refuses is thrown, not read as no module (7.738554ms) ✔ a renamed file is said under its old name too, as gone (novox/hq ADR 0267) (9.057326ms) ✔ a new head beyond the newest 20 open pull requests is announced, exactly once (73.864702ms) ✔ a pass pages until it reaches back past its floor, and no further (44.66246ms) ✔ the statuses asked for replace the rule's, and an empty list requires none (8.214654ms) ✔ a new rule refuses direct pushes unless asked; an administrator's override only when said (0.358421ms) ✔ each open pull request's new head is announced once, and nothing closed or merged (17.990102ms) ✔ a verdict is the head commit's status; an error is the forge's error, never a success (1.321802ms) ✔ each layer is its own status: the gate with the modules it judged, the repository's own check beside it (0.807552ms) ✔ no verdict sets warning on a required check; only a person's decision fails (1.043282ms) ✔ a commit status is set on the commit, under the merge check's context (52.915884ms) ✔ a change plan is the gate's result: said on the status and, when it builds something, as a comment (0.596181ms) ✔ a head announced is pending in the build queue, since the local time it was announced (0.27819ms) ✔ the vault's token is used, a setting of it is ignored and said once, without its value (2.816005ms) ✔ a consumer that asks nothing, or write, publishes: the package team (1.693123ms) ✔ a consumer that asks to read joins the readers, who write no package (0.478591ms) ✔ a reader is made, put on the readers team, and taken off the package team (0.570191ms) ✔ a publisher is made and put on the package team, as before (0.22375ms) ✔ first start: mints with the admin account, keeps the token at 0600, asks for the tools' scopes only (32.105247ms) ✔ second start: reuses the kept token, mints nothing (15.520658ms) ✔ the forge rejects the kept token (its data was restored): minted afresh, once, and the call goes through (24.592544ms) ✔ a token kept with write:admin by an earlier build is minted again without it at the next start, and the forge drops the old one (22.631781ms) ✔ a kept token lacking a scope the tools need: the forge refuses the call for the scope, the token is re-minted with the whole list, and the call goes through (20.431736ms) ✔ the kept file is gone but the forge still holds a token by that name: replaced, not refused (17.627791ms) ✔ concurrent first calls share one mint (11.884292ms) ✔ the admin account is refused: said plainly, nothing kept, and the next call fails the same way rather than crashing (13.304853ms) ✔ one process shares one source per kept file — the watcher and the tools never renew against each other (0.986262ms) ✔ a second process finds the token the first renewed, and reuses it instead of minting over it (20.673867ms) ✔ a configured token wins, and is reported rather than minted over when the forge rejects it (2.976045ms) ✔ nothing to mint with and no token: the client says what is missing (0.20586ms) [gitea] no tools — no Gitea token, and nothing to mint one with — set MESH_GITEA_TOKEN, or MESH_GITEA_ADMIN_USER, MESH_GITEA_ADMIN_PASSWORD_FILE, MESH_GITEA_STATE_DIR [gitea] no token kept — minting one [gitea] the forge already holds a token named "mesh-tools" — replacing it [gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-OwbEl6/state/token ✔ the tools register once there is a way to a token, and the first call mints it (9.092516ms) [gitea] no token kept — minting one [gitea] the forge already holds a token named "mesh-tools" — replacing it [gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-GGi9cN/state/token ✔ a pull request can be closed, read and cleaned up through the tools (23.947413ms) [gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 25 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-host's main moved from d28ca95ccccc to ffffffffffff: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-host: whether a trunk moved could not be weighed, so it is weighed again on the next pass — the forge is away [gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-controller's feat/57-config-and-provisioning moved from eeeeeeeeeeee to d28ca95ccccc: 1 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) ✔ both statuses say the head and the trunk commit the verdict judged, first, whatever the summary's length (1.805613ms) ✔ a trunk's move puts an open head's merge check out of date, naming both commits, unless a check is on its way (1.446263ms) ✔ a push to a trunk puts every open pull request into it out of date — twenty-five of them — and none into another (4.172327ms) ✔ a trunk that cannot be read is weighed again on the next pass, never recorded half (0.45251ms) ✔ the trunk's move takes its turn after a verdict in flight, and weighs what the forge holds then (0.532141ms) ✔ a verdict judged against a trunk newer than the pass's first read is not put out of date (0.345301ms) ✔ a verdict that landed out of date keeps its account on the pull request (0.384351ms) ✔ a release branch's move puts every open pull request into it out of date, as a trunk's does (ADR 0358 §5) (0.475321ms) ℹ tests 91 ℹ suites 0 ℹ pass 91 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 802.219575 ```
Author
Contributor

Independent review at 7e0001e304: changes requested, not merged.

  1. Anyone who can comment can make a mark. The repository is public. readyMarkOf takes the newest "ready at " comment from any author; by is recorded but never checked. The label needs write access, but it stays on after a push until mesh-delivery's next read (up to a minute or more, and indefinitely if the unlabel fails). Any account that comments "ready at " in that window turns the old label into a valid mark, and the new head merges with no review. Fix: accept a ready comment only from a configured list of accounts (a setting, default the mesh's own forge account), and only one written after the head was pushed (or after the label was added).
  2. Who reviewed is not proven. Builders and reviewers comment as the same forge account, so a builder can mark its own pull request. Today the session's permission check refuses a builder's direct self-merge; a label plus a comment gets past it. This needs the decision issue 722's triage asked for ("needs: decision") before it ships, saying how the reviewer is told from the author.
  3. Minor: listComments reads one page only. On a pull request with more comments than the forge's page size, the newest ready comment is missed and an older one clears a valid mark.

What holds: the merge goes only through gitea_merge_pull_request at the marked head, which refuses another head and a red or out-of-date verdict; group order and the composed-check gate read correctly; the load (one search per minute, comments only for labelled pull requests) is fine. gofmt, go vet and go test pass; both required checks are green.

Independent review at 7e0001e3045b: **changes requested, not merged.** 1. **Anyone who can comment can make a mark.** The repository is public. `readyMarkOf` takes the newest "ready at <sha>" comment from any author; `by` is recorded but never checked. The label needs write access, but it stays on after a push until mesh-delivery's next read (up to a minute or more, and indefinitely if the unlabel fails). Any account that comments "ready at <new head>" in that window turns the old label into a valid mark, and the new head merges with no review. Fix: accept a ready comment only from a configured list of accounts (a setting, default the mesh's own forge account), and only one written after the head was pushed (or after the label was added). 2. **Who reviewed is not proven.** Builders and reviewers comment as the same forge account, so a builder can mark its own pull request. Today the session's permission check refuses a builder's direct self-merge; a label plus a comment gets past it. This needs the decision issue 722's triage asked for ("needs: decision") before it ships, saying how the reviewer is told from the author. 3. Minor: `listComments` reads one page only. On a pull request with more comments than the forge's page size, the newest ready comment is missed and an older one clears a valid mark. What holds: the merge goes only through gitea_merge_pull_request at the marked head, which refuses another head and a red or out-of-date verdict; group order and the composed-check gate read correctly; the load (one search per minute, comments only for labelled pull requests) is fine. gofmt, go vet and go test pass; both required checks are green.
jschoubben added 1 commit 2026-10-14 19:45:42 +00:00
Count a ready mark only from a listed account, after the last push and the label (issue 722)
mesh/merge-gate head 5b20e419ec1f merged into trunk 7e3e62062bef — fail: builds gitea, mesh-delivery → novox; no bus step; a manifest the change touches fa…
mesh/repo-check head 5b20e419ec1f merged into trunk 7e3e62062bef — fail: its merge-check.sh failed: files asking for a setting without saying whether it is…
mesh/delivery superseded: a newer head of the same pull request
5b20e419ec
Review of #303: anyone who can comment could turn a stale label into a mark,
and a long thread hid the newest comment. The forge now reads the pull
request's whole timeline and takes a "ready at" comment only from the
accounts in the trusted setting ready-authors (default the mesh's own forge
account and the operator's), written after the label was last added and after
the last push; any other author is ignored and said in the log.
Author
Contributor

Merge check at 5b20e419
Judged: head 5b20e419ec1f merged into trunk 7e3e62062bef; read beside it: mesh-controller c2ec0a601acb, mesh-controller-main c2ec0a601acb, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: FAIL — a manifest the change touches fails the module check: modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11) (modules: gitea, mesh-delivery)
  • mesh/repo-check: FAIL — its merge-check.sh failed: files asking for a setting without saying whether it is trusted: 25

Delivery plan — builds gitea, mesh-delivery → novox; no bus step

  • tier 0: gitea, mesh-delivery
  • novox: receives gitea, mesh-delivery
  • gitea provides npm-package-registry, git: its consumers are sent again after it
  • gitea keeps data (ADR 0233): what it holds is backed up before it moves
  • read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go

Run by the build seat on shanks as build-1792007150036847262 (builds --log build-1792007150036847262).

--- the gate: gitea, mesh-delivery
modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11)
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
mesh-controller: 1 problem(s) in 2 manifest(s)
--- the same manifests on main
gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.003s
words: 12 retired words and 70 daemons' lines, none in the 47070 strings of 721 files
ok  	git.novox.be/novox/mesh-catalog/checks/agenthome	0.012s
agent-home: no archive and no file written into under the agent's home
ok  	git.novox.be/novox/mesh-catalog/checks/secrets	0.012s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.006s
paths: no module names another's state on its machine (3 known, listed to go)
mesh-controller: 1 problem(s) in 128 manifest(s)
modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11)
adwaita: ok, 4 tool(s)
artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect, mesh-catalog.catalog_modules, mesh-catalog.catalog_module
asus-zephyrus-g14: ok, 11 tool(s); WARNING: asusd, supergfxd, upower stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
audit-logger: ok, keeps trail (valuable), spool (valuable)
avahi: ok, 4 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
baserow: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
betterbird: ok, 17 tool(s), invokes seat:mesh-controller.settings, seat:mesh-controller.nodes, seat:mesh-controller.node, betterbird.betterbird_derive
blueman: ok, 3 tool(s)
bluetooth: ok, 9 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
build-agent: ok, keeps workspace (cache), judge-cache (cache), ready: server by exec every 10s
ca-trust: ok; WARNING: trust stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
claude-code: ok, 48 tool(s), keeps state servers, holdings, config, proposals, questions, memory, reads claude-licence-manager.bindings, keeps agent-home (valuable); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
clipmenu: ok, 3 tool(s)
confluence: ok
cups: ok, 7 tool(s); WARNING: socket, scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
dbus: ok, 5 tool(s); WARNING: system-bus stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
de-spiegel: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
desk-channel: ok, 1 tool(s), invokes seat:node-notifier.send, keeps state shown; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
dev-tools: ok
disk-load: ok, 4 tool(s)
distribution: ok, keeps registry (rebuildable); WARNING: store stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
dmenu: ok, 2 tool(s)
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
docker-compose: ok, 9 tool(s)
dunst: ok, 6 tool(s)
fail2ban: ok, 2 tool(s), ready: watch by its tool fail2ban_health every 1m0s; run by unit every 30s
feh: ok, 2 tool(s)
flatpak: ok, 11 tool(s)
fonts: ok, 6 tool(s)
forticlient: ok, 3 tool(s), ready: split-dns by unit every 30s; WARNING: scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
gitlab: ok
gnome-keyring: ok, 4 tool(s)
grafana: ok, keeps data (valuable), ready: server by http / on web every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
hello-web: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
home-assistant: ok, keeps config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
hostname: ok; WARNING: name ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
i3: ok, 10 tool(s)
i3status-rust: ok, 4 tool(s)
icecast: ok, keeps logs (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
influxdb: ok, keeps data (valuable), config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
invoicing: ok; WARNING: app, api stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
jira: ok
keycloak: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
lab: ok, keeps work (cache); WARNING: runtime-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
lemurs: ok, 2 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
letta: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
local-model-consumer: ok
localization: ok, 4 tool(s)
logrotate: ok, 7 tool(s); WARNING: timer stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
mailu: ok, 11 tool(s), keeps mail (valuable), dkim (valuable), data (valuable), dav (valuable), webmail (valuable), queue (valuable), filter (rebuildable), certs (rebuildable), automx (rebuildable), fetchmail (rebuildable), clamav (cache), redis (cache), ready: resolver by its image's own check every 30s; admin by its image's own check every 30s; imap by its image's own check every 30s; smtp by its tool mailu_health every 1m0s; antispam by its image's own check every 30s; webmail by its image's own check every 30s; webdav by its image's own check every 30s; fetchmail by its image's own check every 30s; front by exec every 1m0s; WARNING: config-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: redis, antivirus, automx stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
marrytts: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
matrix: ok, keeps db (valuable), ready: element by its image's own check every 30s; WARNING: element-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: homeserver stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
memory-pressure: ok, 6 tool(s); WARNING: oomd stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
mesh-catalog: ok
mesh-cli: ok
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
mesh-issues: ok, invokes claude-code.claude_code_judge, seat:mesh-delivery.checks, seat:operator-channel.notify, gitea.gitea_pull_reviews, records.records_status, records.records_list, records.records_read, mesh-knowledge.knowledge_highest, keeps state issues, counters, grooming, reservations, keeps log changes (1024 MiB)
mesh-knowledge: ok, 2 tool(s), invokes seat:issue-tracker.reserve, claude-code.claude_code_judge, claude-code.claude_code_judged, records.records_status, records.records_list, records.records_read, seat:operator-channel.notify, ready: keep by unit every 30s; watch by its tool knowledge_health every 1m0s
mesh-reads: ok
mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable)
mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
messenger: ok, 7 tool(s), invokes seat:mesh-controller.conditions, seat:mesh-controller.root-free, seat:issue-tracker.tracking, keeps state open, sent, asks, identities, walks; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
minio: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
model-usage: ok, keeps state (cache), spool (valuable)
mongodb: ok, keeps data (valuable), dumps (rebuildable), ready: server by tcp on database every 30s
mosquitto: ok, keeps data (rebuildable), ready: server by tcp on mqtt every 30s
mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
mssql: ok, keeps data (valuable), dumps (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
n8n: ok, keeps data (valuable), cache (cache), ready: server by http /healthz/readiness on web expecting 200 every 30s; WARNING: cache-server, browser stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
nats: ok, 9 tool(s), keeps jetstream (valuable), snapshots (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 5 tool(s)
networkmanager: ok
nextcloud: ok, keeps html (valuable), ready: server by http /status.php on web expecting 200 every 30s
nextcloud-client: ok, 4 tool(s)
nfs-server: ok, 1 tool(s), invokes seat:mesh-controller.seats, seat:mesh-controller.data, keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
nftables: ok, 1 tool(s); WARNING: load stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
nm-applet: ok, 3 tool(s)
node-env: ok
nodered: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
ollama: ok, keeps models (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
only-office: ok, keeps data (rebuildable), lib (rebuildable), db (rebuildable), fonts (rebuildable), logs (cache), rabbitmq (cache), redis (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
openai-consumer: ok
openrazer: ok, 3 tool(s)
pacman: ok, 15 tool(s); WARNING: mirror-refresh, cache-cleaning stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
photos-eef: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
photos-filip: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
picom: ok, 4 tool(s); WARNING: configuration ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
polychromatic: ok, 3 tool(s)
postgres: ok, keeps store (valuable), dumps (rebuildable), ready: server by tcp on database every 30s
power: ok, 5 tool(s), keeps state draw, ready: draw by unit every 30s; WARNING: logind-power ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: after-boot, before-shutdown stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
powerlevel10k: ok
records: ok, 6 tool(s), keeps checkout (rebuildable)
redis: ok, keeps data (cache), ready: server by tcp on cache every 30s
restic: ok, 3 tool(s), keeps repository (rebuildable), state (cache), ready: night by its tool backup_health every 1m0s; measure by unit every 30s
rofi: ok, 3 tool(s)
route-adapter: ok; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
route-proxy: ok, keeps acme (rebuildable), ca (cache), ready: server by tcp on http every 10s
screen-lock: ok, 3 tool(s)
searxng: ok, keeps valkey (cache); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: cache, server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
showcase: ok; WARNING: server, tools stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
slack: ok, 4 tool(s)
snapd: ok, 10 tool(s)
ssh-client: ok, 8 tool(s), keeps ssh (valuable)
sshd: ok; WARNING: run stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
step-ca: ok, keeps home (valuable), ready: server by its image's own check every 30s
sudo: ok, 4 tool(s)
supabase: ok, keeps db (valuable), dumps (rebuildable), storage (valuable), functions (valuable), db-config (rebuildable), ready: db by its image's own check every 30s; kong by its image's own check every 30s; meta by its image's own check every 30s; studio by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: vector, analytics, auth, rest, realtime, imgproxy, storage-api, edge-functions, pooler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
systemd: ok
systemd-networkd: ok
systemd-resolved: ok, ready: service by unit every 30s; guard by unit every 30s
telegram: ok, 1 tool(s), keeps state offset, messages
time-sync: ok, 3 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
triggerhappy: ok, 4 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
umami: ok, ready: server by http /api/share/mesh-health on web expecting 404 every 30s
unifi: ok, keeps data (valuable); WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
website: ok, ready: server by http / on web every 30s
xclip: ok, 4 tool(s)
xdg: ok, 5 tool(s); WARNING: user-dirs ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
xorg: ok, 9 tool(s)
xterm: ok, 2 tool(s)
zfs: ok, 15 tool(s), ready: watch by its tool zfs_health every 1m0s; events by unit every 30s; WARNING: scrub-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
zsh: ok, 1 tool(s); WARNING: tools-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
zsh-autosuggestions: ok
zsh-syntax-highlighting: ok
long-running resources without health: 62
files asking for a setting without saying whether it is trusted: 25
**Merge check** at `5b20e419` Judged: head `5b20e419ec1f` merged into trunk `7e3e62062bef`; read beside it: mesh-controller `c2ec0a601acb`, mesh-controller-main `c2ec0a601acb`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **FAIL** — a manifest the change touches fails the module check: modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11) (modules: gitea, mesh-delivery) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: files asking for a setting without saying whether it is trusted: 25 **Delivery plan** — builds gitea, mesh-delivery → novox; no bus step - tier 0: gitea, mesh-delivery - novox: receives gitea, mesh-delivery - gitea provides npm-package-registry, git: its consumers are sent again after it - gitea keeps data (ADR 0233): what it holds is backed up before it moves - read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go Run by the build seat on shanks as `build-1792007150036847262` (`builds --log build-1792007150036847262`). ``` --- the gate: gitea, mesh-delivery modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11) mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups long-running resources without health: 0 files asking for a setting without saying whether it is trusted: 0 mesh-controller: 1 problem(s) in 2 manifest(s) --- the same manifests on main gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, keeps state deliveries, groups long-running resources without health: 0 files asking for a setting without saying whether it is trusted: 0 2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.003s words: 12 retired words and 70 daemons' lines, none in the 47070 strings of 721 files ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.012s agent-home: no archive and no file written into under the agent's home ok git.novox.be/novox/mesh-catalog/checks/secrets 0.012s secrets: no setting can replace a vault secret in a mergeable file (1 known, nested) ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s paths: no module names another's state on its machine (3 known, listed to go) mesh-controller: 1 problem(s) in 128 manifest(s) modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings: a module that declares a setting names the keys each mergeable file takes, an empty list for none (novox/hq ADR 0326 §3, ADR 0164 §11) adwaita: ok, 4 tool(s) artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect, mesh-catalog.catalog_modules, mesh-catalog.catalog_module asus-zephyrus-g14: ok, 11 tool(s); WARNING: asusd, supergfxd, upower stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) audit-logger: ok, keeps trail (valuable), spool (valuable) avahi: ok, 4 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) baserow: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) betterbird: ok, 17 tool(s), invokes seat:mesh-controller.settings, seat:mesh-controller.nodes, seat:mesh-controller.node, betterbird.betterbird_derive blueman: ok, 3 tool(s) bluetooth: ok, 9 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) build-agent: ok, keeps workspace (cache), judge-cache (cache), ready: server by exec every 10s ca-trust: ok; WARNING: trust stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) claude-code: ok, 48 tool(s), keeps state servers, holdings, config, proposals, questions, memory, reads claude-licence-manager.bindings, keeps agent-home (valuable); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) clipmenu: ok, 3 tool(s) confluence: ok cups: ok, 7 tool(s); WARNING: socket, scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) dbus: ok, 5 tool(s); WARNING: system-bus stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) de-spiegel: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) desk-channel: ok, 1 tool(s), invokes seat:node-notifier.send, keeps state shown; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) dev-tools: ok disk-load: ok, 4 tool(s) distribution: ok, keeps registry (rebuildable); WARNING: store stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) dmenu: ok, 2 tool(s) dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) docker-compose: ok, 9 tool(s) dunst: ok, 6 tool(s) fail2ban: ok, 2 tool(s), ready: watch by its tool fail2ban_health every 1m0s; run by unit every 30s feh: ok, 2 tool(s) flatpak: ok, 11 tool(s) fonts: ok, 6 tool(s) forticlient: ok, 3 tool(s), ready: split-dns by unit every 30s; WARNING: scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) gitlab: ok gnome-keyring: ok, 4 tool(s) grafana: ok, keeps data (valuable), ready: server by http / on web every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) hello-web: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) home-assistant: ok, keeps config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) hostname: ok; WARNING: name ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) i3: ok, 10 tool(s) i3status-rust: ok, 4 tool(s) icecast: ok, keeps logs (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) influxdb: ok, keeps data (valuable), config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) invoicing: ok; WARNING: app, api stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) jira: ok keycloak: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) lab: ok, keeps work (cache); WARNING: runtime-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) lemurs: ok, 2 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) letta: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) local-model-consumer: ok localization: ok, 4 tool(s) logrotate: ok, 7 tool(s); WARNING: timer stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) mailu: ok, 11 tool(s), keeps mail (valuable), dkim (valuable), data (valuable), dav (valuable), webmail (valuable), queue (valuable), filter (rebuildable), certs (rebuildable), automx (rebuildable), fetchmail (rebuildable), clamav (cache), redis (cache), ready: resolver by its image's own check every 30s; admin by its image's own check every 30s; imap by its image's own check every 30s; smtp by its tool mailu_health every 1m0s; antispam by its image's own check every 30s; webmail by its image's own check every 30s; webdav by its image's own check every 30s; fetchmail by its image's own check every 30s; front by exec every 1m0s; WARNING: config-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: redis, antivirus, automx stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) marrytts: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) matrix: ok, keeps db (valuable), ready: element by its image's own check every 30s; WARNING: element-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: homeserver stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) memory-pressure: ok, 6 tool(s); WARNING: oomd stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) mesh-catalog: ok mesh-cli: ok mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups mesh-issues: ok, invokes claude-code.claude_code_judge, seat:mesh-delivery.checks, seat:operator-channel.notify, gitea.gitea_pull_reviews, records.records_status, records.records_list, records.records_read, mesh-knowledge.knowledge_highest, keeps state issues, counters, grooming, reservations, keeps log changes (1024 MiB) mesh-knowledge: ok, 2 tool(s), invokes seat:issue-tracker.reserve, claude-code.claude_code_judge, claude-code.claude_code_judged, records.records_status, records.records_list, records.records_read, seat:operator-channel.notify, ready: keep by unit every 30s; watch by its tool knowledge_health every 1m0s mesh-reads: ok mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable) mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) messenger: ok, 7 tool(s), invokes seat:mesh-controller.conditions, seat:mesh-controller.root-free, seat:issue-tracker.tracking, keeps state open, sent, asks, identities, walks; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) minio: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) model-usage: ok, keeps state (cache), spool (valuable) mongodb: ok, keeps data (valuable), dumps (rebuildable), ready: server by tcp on database every 30s mosquitto: ok, keeps data (rebuildable), ready: server by tcp on mqtt every 30s mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) mssql: ok, keeps data (valuable), dumps (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) n8n: ok, keeps data (valuable), cache (cache), ready: server by http /healthz/readiness on web expecting 200 every 30s; WARNING: cache-server, browser stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) nats: ok, 9 tool(s), keeps jetstream (valuable), snapshots (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) netcheck: ok, 5 tool(s) networkmanager: ok nextcloud: ok, keeps html (valuable), ready: server by http /status.php on web expecting 200 every 30s nextcloud-client: ok, 4 tool(s) nfs-server: ok, 1 tool(s), invokes seat:mesh-controller.seats, seat:mesh-controller.data, keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) nftables: ok, 1 tool(s); WARNING: load stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) nm-applet: ok, 3 tool(s) node-env: ok nodered: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) ollama: ok, keeps models (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) only-office: ok, keeps data (rebuildable), lib (rebuildable), db (rebuildable), fonts (rebuildable), logs (cache), rabbitmq (cache), redis (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) openai-consumer: ok openrazer: ok, 3 tool(s) pacman: ok, 15 tool(s); WARNING: mirror-refresh, cache-cleaning stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) photos-eef: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) photos-filip: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) picom: ok, 4 tool(s); WARNING: configuration ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) polychromatic: ok, 3 tool(s) postgres: ok, keeps store (valuable), dumps (rebuildable), ready: server by tcp on database every 30s power: ok, 5 tool(s), keeps state draw, ready: draw by unit every 30s; WARNING: logind-power ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: after-boot, before-shutdown stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) powerlevel10k: ok records: ok, 6 tool(s), keeps checkout (rebuildable) redis: ok, keeps data (cache), ready: server by tcp on cache every 30s restic: ok, 3 tool(s), keeps repository (rebuildable), state (cache), ready: night by its tool backup_health every 1m0s; measure by unit every 30s rofi: ok, 3 tool(s) route-adapter: ok; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) route-proxy: ok, keeps acme (rebuildable), ca (cache), ready: server by tcp on http every 10s screen-lock: ok, 3 tool(s) searxng: ok, keeps valkey (cache); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: cache, server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s showcase: ok; WARNING: server, tools stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) slack: ok, 4 tool(s) snapd: ok, 10 tool(s) ssh-client: ok, 8 tool(s), keeps ssh (valuable) sshd: ok; WARNING: run stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) step-ca: ok, keeps home (valuable), ready: server by its image's own check every 30s sudo: ok, 4 tool(s) supabase: ok, keeps db (valuable), dumps (rebuildable), storage (valuable), functions (valuable), db-config (rebuildable), ready: db by its image's own check every 30s; kong by its image's own check every 30s; meta by its image's own check every 30s; studio by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: vector, analytics, auth, rest, realtime, imgproxy, storage-api, edge-functions, pooler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) systemd: ok systemd-networkd: ok systemd-resolved: ok, ready: service by unit every 30s; guard by unit every 30s telegram: ok, 1 tool(s), keeps state offset, messages time-sync: ok, 3 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) triggerhappy: ok, 4 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) umami: ok, ready: server by http /api/share/mesh-health on web expecting 404 every 30s unifi: ok, keeps data (valuable); WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) website: ok, ready: server by http / on web every 30s xclip: ok, 4 tool(s) xdg: ok, 5 tool(s); WARNING: user-dirs ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) xorg: ok, 9 tool(s) xterm: ok, 2 tool(s) zfs: ok, 15 tool(s), ready: watch by its tool zfs_health every 1m0s; events by unit every 30s; WARNING: scrub-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) zsh: ok, 1 tool(s); WARNING: tools-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) zsh-autosuggestions: ok zsh-syntax-highlighting: ok long-running resources without health: 62 files asking for a setting without saying whether it is trusted: 25 ```
Author
Contributor

Re-review at 5b20e419ec: the code closes finding 1, but both required checks are red, so it is not merged.

  • Finding 1 is closed. A ready comment counts only from a listed author, and only after the last pull_push and after the label was last added. A push or taking the label off voids every earlier mark. The whole timeline is read page by page, and other authors are ignored and logged once. Tests cover each case.
  • The default mesh-admin jschoubben is right: jschoubben exists on the forge (id 1, admin, the operator's address), and jochen does not.
  • gofmt, go vet and go test pass for mesh-delivery and gitea.
  • mesh/merge-gate and mesh/repo-check fail (build-1792007150036847262, judged against trunk 7e3e62062b). The module check says: modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings (ADR 0326 §3, ADR 0164 §11). Give gitea's mergeable runtime-config resource takes-settings: [], so that file takes no setting. Also check that the setting's kind is the trusted one the module check expects; preference may not be it. Then push, and mark the new head once it is re-reviewed.
Re-review at 5b20e419ec1f: **the code closes finding 1, but both required checks are red, so it is not merged.** - Finding 1 is closed. A ready comment counts only from a listed author, and only after the last `pull_push` and after the label was last added. A push or taking the label off voids every earlier mark. The whole timeline is read page by page, and other authors are ignored and logged once. Tests cover each case. - The default `mesh-admin jschoubben` is right: `jschoubben` exists on the forge (id 1, admin, the operator's address), and `jochen` does not. - gofmt, go vet and go test pass for mesh-delivery and gitea. - **mesh/merge-gate and mesh/repo-check fail** (build-1792007150036847262, judged against trunk 7e3e62062bef). The module check says: `modules/gitea/module.json: gitea declares settings, and its mergeable runtime-config names no takes-settings` (ADR 0326 §3, ADR 0164 §11). Give gitea's mergeable runtime-config resource `takes-settings: []`, so that file takes no setting. Also check that the setting's kind is the trusted one the module check expects; `preference` may not be it. Then push, and mark the new head once it is re-reviewed.
jschoubben added 1 commit 2026-10-14 19:52:49 +00:00
Name the keys gitea's mergeable config takes: none (ADR 0326)
mesh/merge-gate head baa5ef802e82 merged into trunk 7e3e62062bef — pass: builds gitea, mesh-delivery → novox; no bus step; every machine composes with the …
mesh/repo-check head baa5ef802e82 merged into trunk 7e3e62062bef — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-…
mesh/delivery delivered
baa5ef802e
gitea now declares a setting, so every mergeable file of it must name its
keys; the runtime config reads no setting, and ready-authors reaches its
own file.
Author
Contributor

Merge check at baa5ef80
Judged: head baa5ef802e82 merged into trunk 7e3e62062bef; read beside it: mesh-controller c2ec0a601acb, mesh-controller-main c2ec0a601acb, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: gitea, mesh-delivery)
  • mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)

Delivery plan — builds gitea, mesh-delivery → novox; no bus step

  • tier 0: gitea, mesh-delivery
  • novox: receives gitea, mesh-delivery
  • gitea provides npm-package-registry, git: its consumers are sent again after it
  • gitea keeps data (ADR 0233): what it holds is backed up before it moves
  • read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go

Run by the build seat on shanks as build-1792007575304675549 (builds --log build-1792007575304675549).

--- the gate: gitea, mesh-delivery
gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T19:40:09Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-14T19:40:09Z

modules the change moves:
  - gitea (changed)
  - mesh-delivery (changed)

machines:
  - a machine (f35): composes
  - holds mesh-dns-resolver (idt): composes
  - holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:gitea.ready-authors)
  - a machine (yvbpsm): composes

a merge would rebuild 2 module(s) in 1 tier(s): gitea, mesh-delivery

notes:
  - modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go and modules/mesh-delivery/cmd/mesh-delivery/ready_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.003s
words: 12 retired words and 70 daemons' lines, none in the 47070 strings of 721 files
ok  	git.novox.be/novox/mesh-catalog/checks/agenthome	0.013s
agent-home: no archive and no file written into under the agent's home
ok  	git.novox.be/novox/mesh-catalog/checks/secrets	0.012s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 62, as kept
ok  	git.novox.be/novox/mesh-catalog/checks/deps	0.213s
testing modules/gitea
ok  	gitea/cmd/forge	1.490s
ok  	gitea/cmd/npm-registry	1.791s
?   	gitea/internal/forgehttp	[no test files]
testing modules/mesh-delivery
ok  	mesh-delivery/cmd/mesh-delivery	3.229s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/gitea (TypeScript)
testing modules/gitea (TypeScript)
✔ a pull request opened after the margin is looked at, by its own update time (10.613036ms)
✔ every open pull request is read with what its base requires and what its head has (gitea_open_pulls) (52.1791ms)
✔ a pull request or issue number that is not one is refused before the forge is asked (1.440053ms)
✔ a merged pull request whose branch was deleted is announced with its branch, not its pull ref (11.41953ms)
✔ a pull request's ready mark is read: the label and the head the newest listed ready comment names (17.505965ms)
✔ a ready comment by an account not listed is ignored, and said (0.537078ms)
✔ a ready comment older than the latest push, or than the label, never counts (46.46242ms)
[gitea] f cannot be read (gone); only mesh-admin may mark a pull request ready
[gitea] f names no account that may mark a pull request ready; only mesh-admin may
✔ a long thread hides nothing: every page of the timeline is read (17.000347ms)
✔ the accounts that may mark are the setting's, and only the mesh's own when it cannot be read (0.764462ms)
✔ the newest status of each context is kept, with what it said, when and by whom (19.150961ms)
✔ a commit merges only when every required status is a success; a warning blocks (0.691161ms)
✔ no rule requires nothing; a rule that cannot be read says nothing, never yes (0.368066ms)
✔ a commit is contained in another when the compare finds nothing on it the other lacks (0.908735ms)
✔ a note line is appended once, as the forge's user, in its own repository (10.276251ms)
✔ a note that cannot be written is said, never read as written (0.449338ms)
✔ one view per pull request, found by its marker; only the mesh's statuses (0.716161ms)
✔ a build machine taking the check is said on the head: building on which machine, since the local time (15.028416ms)
✔ the verdict heard while a 'building' write is in flight lands last and stays (6.591473ms)
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written
✔ the verdict written while a start's read of the forge is in flight stays the newest status (0.871404ms)
✔ the verdict heard while a 'building' write still waits its turn: the 'building' is never written (0.447627ms)
✔ a start heard after the verdict writes nothing (0.588219ms)
✔ a start from before the check now pending (a run before a recheck, the stream's history) writes nothing (0.593429ms)
✔ an old run's verdict redelivered after a recheck's pending is not written over it (0.982876ms)
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check the forge holds pending; not written
[gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written
✔ an old run's verdict in flight when the recheck comes lands before the recheck's pending (3.368823ms)
✔ a rechecked head says where its new run is: building on which machine (1.180759ms)
✔ the recheck's own verdict is written, even asked a little before the pending by another machine's clock (0.920845ms)
✔ after a restart, an old run's verdict is weighed against the check the forge's history holds open (0.603159ms)
✔ a recheck the forge does not take fails its caller, and the head is as it was (0.538668ms)
✔ the status tool writes the merge check's pending through the writer, and the mesh's other statuses as they were (5.036329ms)
✔ when a check was asked is read from its id; the opening of the check now pending from the gate's history (0.274434ms)
✔ a head this process did not announce (it restarted) is said only while the forge holds its gate pending (0.393467ms)
✔ a repository as the mesh clones it is told from another (0.321505ms)
✔ gitea_api refuses the forge's administration, a branch's protection and the merge check's status, and sends nothing (7.436156ms)
✔ gitea_api refuses a file written to the default branch or one a rule guards, and writes one on a branch of its own (51.236096ms)
✔ a protection rule covers a branch as the forge decides it: classes, alternatives, a plain name in any case (issue 539) (19.078499ms)
✔ gitea_api still writes what an author writes (7.939715ms)
✔ gitea_branch_protection_set only strengthens (14.310666ms)
✔ gitea_merge_pull_request merges only a head whose required statuses all succeeded, and only that head (43.677246ms)
✔ gitea_merge_pull_request refuses a verdict judged against an earlier trunk, and asks the check once (154.367796ms)
✔ gitea_merge_pull_request merges only the head it is named, and refuses one that is not the head (17.594147ms)
✔ gitea_merge_pull_request is loud when the forge merged a head other than the one it was handed (16.486879ms)
✔ gitea_merge_pull_request says the merge happened when reading back what landed fails (27.722486ms)
✔ gitea_merge_pull_request reads back a fast-forward, and says it cannot read back a squash or a rebase (62.270588ms)
✔ gitea_delete_repo deletes only the tools' own user's repository, unguarded, untouched for 30 days, named in full (22.521264ms)
✔ gitea_api sends the path it judged, and refuses moving a pull request's base (4.919428ms)
✔ gitea_merge_pull_request merges only into a branch whose protection requires the checks (7.362685ms)
✔ a rule named for a branch is not made weaker than the glob rule that guards it now (12.789011ms)
✔ a repository owner or name is never another path (0.313175ms)
✔ the judges, without a forge (0.392736ms)
✔ gitea_api never acts as another user: sudo, in any case, and any query key it does not send are refused (1.673596ms)
✔ gitea_api never approves a pull request nor requests changes: those are the operator's (2.55895ms)
✔ no tool's caller text becomes another path or another user: `..` and `?sudo=` are refused before the forge (5.809061ms)
✔ every page of a pull request's files is read, though the forge caps a page at fifty (23.205035ms)
✔ a pass asks only the repositories that moved since the last look, every one before the first (0.417037ms)
✔ the directories above a merge's files that hold a module at the commit are said, the root never (11.151485ms)
✔ a lookup the forge refuses is thrown, not read as no module (3.526696ms)
✔ a renamed file is said under its old name too, as gone (novox/hq ADR 0267) (6.418461ms)
✔ a new head beyond the newest 20 open pull requests is announced, exactly once (55.667915ms)
✔ a pass pages until it reaches back past its floor, and no further (25.730213ms)
✔ the statuses asked for replace the rule's, and an empty list requires none (5.935943ms)
✔ a new rule refuses direct pushes unless asked; an administrator's override only when said (0.267324ms)
✔ each open pull request's new head is announced once, and nothing closed or merged (10.972083ms)
✔ a verdict is the head commit's status; an error is the forge's error, never a success (1.165068ms)
✔ each layer is its own status: the gate with the modules it judged, the repository's own check beside it (0.615989ms)
✔ no verdict sets warning on a required check; only a person's decision fails (1.017096ms)
✔ a commit status is set on the commit, under the merge check's context (39.721754ms)
✔ a change plan is the gate's result: said on the status and, when it builds something, as a comment (0.546809ms)
✔ a head announced is pending in the build queue, since the local time it was announced (0.238564ms)
✔ the vault's token is used, a setting of it is ignored and said once, without its value (3.054738ms)
✔ a consumer that asks nothing, or write, publishes: the package team (1.416043ms)
✔ a consumer that asks to read joins the readers, who write no package (0.375466ms)
✔ a reader is made, put on the readers team, and taken off the package team (0.432937ms)
✔ a publisher is made and put on the package team, as before (0.171633ms)
✔ first start: mints with the admin account, keeps the token at 0600, asks for the tools' scopes only (29.468982ms)
✔ second start: reuses the kept token, mints nothing (14.66521ms)
✔ the forge rejects the kept token (its data was restored): minted afresh, once, and the call goes through (19.756841ms)
✔ a token kept with write:admin by an earlier build is minted again without it at the next start, and the forge drops the old one (23.482119ms)
✔ a kept token lacking a scope the tools need: the forge refuses the call for the scope, the token is re-minted with the whole list, and the call goes through (19.12094ms)
✔ the kept file is gone but the forge still holds a token by that name: replaced, not refused (16.746453ms)
✔ concurrent first calls share one mint (9.54378ms)
✔ the admin account is refused: said plainly, nothing kept, and the next call fails the same way rather than crashing (12.943513ms)
✔ one process shares one source per kept file — the watcher and the tools never renew against each other (0.880134ms)
✔ a second process finds the token the first renewed, and reuses it instead of minting over it (17.676988ms)
✔ a configured token wins, and is reported rather than minted over when the forge rejects it (2.349117ms)
✔ nothing to mint with and no token: the client says what is missing (0.174453ms)
[gitea] no tools — no Gitea token, and nothing to mint one with — set MESH_GITEA_TOKEN, or MESH_GITEA_ADMIN_USER, MESH_GITEA_ADMIN_PASSWORD_FILE, MESH_GITEA_STATE_DIR
[gitea] no token kept — minting one
[gitea] the forge already holds a token named "mesh-tools" — replacing it
[gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-T6xuT7/state/token
✔ the tools register once there is a way to a token, and the first call mints it (8.231239ms)
[gitea] no token kept — minting one
[gitea] the forge already holds a token named "mesh-tools" — replacing it
[gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-sJkEww/state/token
✔ a pull request can be closed, read and cleaned up through the tools (19.698849ms)
[gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 25 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-host's main moved from d28ca95ccccc to ffffffffffff: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-host: whether a trunk moved could not be weighed, so it is weighed again on the next pass — the forge is away
[gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
[gitea] novox/mesh-controller's feat/57-config-and-provisioning moved from eeeeeeeeeeee to d28ca95ccccc: 1 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323)
✔ both statuses say the head and the trunk commit the verdict judged, first, whatever the summary's length (2.195175ms)
✔ a trunk's move puts an open head's merge check out of date, naming both commits, unless a check is on its way (1.384852ms)
✔ a push to a trunk puts every open pull request into it out of date — twenty-five of them — and none into another (5.961194ms)
✔ a trunk that cannot be read is weighed again on the next pass, never recorded half (0.579339ms)
✔ the trunk's move takes its turn after a verdict in flight, and weighs what the forge holds then (0.62431ms)
✔ a verdict judged against a trunk newer than the pass's first read is not put out of date (0.527318ms)
✔ a verdict that landed out of date keeps its account on the pull request (0.351936ms)
✔ a release branch's move puts every open pull request into it out of date, as a trunk's does (ADR 0358 §5) (0.778403ms)
ℹ tests 95
ℹ suites 0
ℹ pass 95
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 665.325663
**Merge check** at `baa5ef80` Judged: head `baa5ef802e82` merged into trunk `7e3e62062bef`; read beside it: mesh-controller `c2ec0a601acb`, mesh-controller-main `c2ec0a601acb`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: gitea, mesh-delivery) - `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript) **Delivery plan** — builds gitea, mesh-delivery → novox; no bus step - tier 0: gitea, mesh-delivery - novox: receives gitea, mesh-delivery - gitea provides npm-package-registry, git: its consumers are sent again after it - gitea keeps data (ADR 0233): what it holds is backed up before it moves - read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go, modules/mesh-delivery/cmd/mesh-delivery/ready_test.go Run by the build seat on shanks as `build-1792007575304675549` (`builds --log build-1792007575304675549`). ``` --- the gate: gitea, mesh-delivery gitea: ok, keeps data (valuable), ready: server by http /api/healthz on web expecting 200 every 30s mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups long-running resources without health: 0 files asking for a setting without saying whether it is trusted: 0 2 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T19:40:09Z says they run composing every machine as the mesh is the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued composing every machine with the change the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose) judged by controller development build against the facts of 2026-10-14T19:40:09Z modules the change moves: - gitea (changed) - mesh-delivery (changed) machines: - a machine (f35): composes - holds mesh-dns-resolver (idt): composes - holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:gitea.ready-authors) - a machine (yvbpsm): composes a merge would rebuild 2 module(s) in 1 tier(s): gitea, mesh-delivery notes: - modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/manifest_test.go and modules/mesh-delivery/cmd/mesh-delivery/ready_test.go read by no module's build, and rebuild nothing (issue 280) --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.003s words: 12 retired words and 70 daemons' lines, none in the 47070 strings of 721 files ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.013s agent-home: no archive and no file written into under the agent's home ok git.novox.be/novox/mesh-catalog/checks/secrets 0.012s secrets: no setting can replace a vault secret in a mergeable file (1 known, nested) ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s paths: no module names another's state on its machine (3 known, listed to go) long-running resources without health: 62, as kept ok git.novox.be/novox/mesh-catalog/checks/deps 0.213s testing modules/gitea ok gitea/cmd/forge 1.490s ok gitea/cmd/npm-registry 1.791s ? gitea/internal/forgehttp [no test files] testing modules/mesh-delivery ok mesh-delivery/cmd/mesh-delivery 3.229s --- its merge-check-typescript.sh (typescript toolchain) type-checking modules/gitea (TypeScript) testing modules/gitea (TypeScript) ✔ a pull request opened after the margin is looked at, by its own update time (10.613036ms) ✔ every open pull request is read with what its base requires and what its head has (gitea_open_pulls) (52.1791ms) ✔ a pull request or issue number that is not one is refused before the forge is asked (1.440053ms) ✔ a merged pull request whose branch was deleted is announced with its branch, not its pull ref (11.41953ms) ✔ a pull request's ready mark is read: the label and the head the newest listed ready comment names (17.505965ms) ✔ a ready comment by an account not listed is ignored, and said (0.537078ms) ✔ a ready comment older than the latest push, or than the label, never counts (46.46242ms) [gitea] f cannot be read (gone); only mesh-admin may mark a pull request ready [gitea] f names no account that may mark a pull request ready; only mesh-admin may ✔ a long thread hides nothing: every page of the timeline is read (17.000347ms) ✔ the accounts that may mark are the setting's, and only the mesh's own when it cannot be read (0.764462ms) ✔ the newest status of each context is kept, with what it said, when and by whom (19.150961ms) ✔ a commit merges only when every required status is a success; a warning blocks (0.691161ms) ✔ no rule requires nothing; a rule that cannot be read says nothing, never yes (0.368066ms) ✔ a commit is contained in another when the compare finds nothing on it the other lacks (0.908735ms) ✔ a note line is appended once, as the forge's user, in its own repository (10.276251ms) ✔ a note that cannot be written is said, never read as written (0.449338ms) ✔ one view per pull request, found by its marker; only the mesh's statuses (0.716161ms) ✔ a build machine taking the check is said on the head: building on which machine, since the local time (15.028416ms) ✔ the verdict heard while a 'building' write is in flight lands last and stays (6.591473ms) [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written ✔ the verdict written while a start's read of the forge is in flight stays the newest status (0.871404ms) ✔ the verdict heard while a 'building' write still waits its turn: the 'building' is never written (0.447627ms) ✔ a start heard after the verdict writes nothing (0.588219ms) ✔ a start from before the check now pending (a run before a recheck, the stream's history) writes nothing (0.593429ms) ✔ an old run's verdict redelivered after a recheck's pending is not written over it (0.982876ms) [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check the forge holds pending; not written [gitea] novox/hq@a6b08de8: the verdict of build-1791680941000000000 is an older run's than the check now pending; not written ✔ an old run's verdict in flight when the recheck comes lands before the recheck's pending (3.368823ms) ✔ a rechecked head says where its new run is: building on which machine (1.180759ms) ✔ the recheck's own verdict is written, even asked a little before the pending by another machine's clock (0.920845ms) ✔ after a restart, an old run's verdict is weighed against the check the forge's history holds open (0.603159ms) ✔ a recheck the forge does not take fails its caller, and the head is as it was (0.538668ms) ✔ the status tool writes the merge check's pending through the writer, and the mesh's other statuses as they were (5.036329ms) ✔ when a check was asked is read from its id; the opening of the check now pending from the gate's history (0.274434ms) ✔ a head this process did not announce (it restarted) is said only while the forge holds its gate pending (0.393467ms) ✔ a repository as the mesh clones it is told from another (0.321505ms) ✔ gitea_api refuses the forge's administration, a branch's protection and the merge check's status, and sends nothing (7.436156ms) ✔ gitea_api refuses a file written to the default branch or one a rule guards, and writes one on a branch of its own (51.236096ms) ✔ a protection rule covers a branch as the forge decides it: classes, alternatives, a plain name in any case (issue 539) (19.078499ms) ✔ gitea_api still writes what an author writes (7.939715ms) ✔ gitea_branch_protection_set only strengthens (14.310666ms) ✔ gitea_merge_pull_request merges only a head whose required statuses all succeeded, and only that head (43.677246ms) ✔ gitea_merge_pull_request refuses a verdict judged against an earlier trunk, and asks the check once (154.367796ms) ✔ gitea_merge_pull_request merges only the head it is named, and refuses one that is not the head (17.594147ms) ✔ gitea_merge_pull_request is loud when the forge merged a head other than the one it was handed (16.486879ms) ✔ gitea_merge_pull_request says the merge happened when reading back what landed fails (27.722486ms) ✔ gitea_merge_pull_request reads back a fast-forward, and says it cannot read back a squash or a rebase (62.270588ms) ✔ gitea_delete_repo deletes only the tools' own user's repository, unguarded, untouched for 30 days, named in full (22.521264ms) ✔ gitea_api sends the path it judged, and refuses moving a pull request's base (4.919428ms) ✔ gitea_merge_pull_request merges only into a branch whose protection requires the checks (7.362685ms) ✔ a rule named for a branch is not made weaker than the glob rule that guards it now (12.789011ms) ✔ a repository owner or name is never another path (0.313175ms) ✔ the judges, without a forge (0.392736ms) ✔ gitea_api never acts as another user: sudo, in any case, and any query key it does not send are refused (1.673596ms) ✔ gitea_api never approves a pull request nor requests changes: those are the operator's (2.55895ms) ✔ no tool's caller text becomes another path or another user: `..` and `?sudo=` are refused before the forge (5.809061ms) ✔ every page of a pull request's files is read, though the forge caps a page at fifty (23.205035ms) ✔ a pass asks only the repositories that moved since the last look, every one before the first (0.417037ms) ✔ the directories above a merge's files that hold a module at the commit are said, the root never (11.151485ms) ✔ a lookup the forge refuses is thrown, not read as no module (3.526696ms) ✔ a renamed file is said under its old name too, as gone (novox/hq ADR 0267) (6.418461ms) ✔ a new head beyond the newest 20 open pull requests is announced, exactly once (55.667915ms) ✔ a pass pages until it reaches back past its floor, and no further (25.730213ms) ✔ the statuses asked for replace the rule's, and an empty list requires none (5.935943ms) ✔ a new rule refuses direct pushes unless asked; an administrator's override only when said (0.267324ms) ✔ each open pull request's new head is announced once, and nothing closed or merged (10.972083ms) ✔ a verdict is the head commit's status; an error is the forge's error, never a success (1.165068ms) ✔ each layer is its own status: the gate with the modules it judged, the repository's own check beside it (0.615989ms) ✔ no verdict sets warning on a required check; only a person's decision fails (1.017096ms) ✔ a commit status is set on the commit, under the merge check's context (39.721754ms) ✔ a change plan is the gate's result: said on the status and, when it builds something, as a comment (0.546809ms) ✔ a head announced is pending in the build queue, since the local time it was announced (0.238564ms) ✔ the vault's token is used, a setting of it is ignored and said once, without its value (3.054738ms) ✔ a consumer that asks nothing, or write, publishes: the package team (1.416043ms) ✔ a consumer that asks to read joins the readers, who write no package (0.375466ms) ✔ a reader is made, put on the readers team, and taken off the package team (0.432937ms) ✔ a publisher is made and put on the package team, as before (0.171633ms) ✔ first start: mints with the admin account, keeps the token at 0600, asks for the tools' scopes only (29.468982ms) ✔ second start: reuses the kept token, mints nothing (14.66521ms) ✔ the forge rejects the kept token (its data was restored): minted afresh, once, and the call goes through (19.756841ms) ✔ a token kept with write:admin by an earlier build is minted again without it at the next start, and the forge drops the old one (23.482119ms) ✔ a kept token lacking a scope the tools need: the forge refuses the call for the scope, the token is re-minted with the whole list, and the call goes through (19.12094ms) ✔ the kept file is gone but the forge still holds a token by that name: replaced, not refused (16.746453ms) ✔ concurrent first calls share one mint (9.54378ms) ✔ the admin account is refused: said plainly, nothing kept, and the next call fails the same way rather than crashing (12.943513ms) ✔ one process shares one source per kept file — the watcher and the tools never renew against each other (0.880134ms) ✔ a second process finds the token the first renewed, and reuses it instead of minting over it (17.676988ms) ✔ a configured token wins, and is reported rather than minted over when the forge rejects it (2.349117ms) ✔ nothing to mint with and no token: the client says what is missing (0.174453ms) [gitea] no tools — no Gitea token, and nothing to mint one with — set MESH_GITEA_TOKEN, or MESH_GITEA_ADMIN_USER, MESH_GITEA_ADMIN_PASSWORD_FILE, MESH_GITEA_STATE_DIR [gitea] no token kept — minting one [gitea] the forge already holds a token named "mesh-tools" — replacing it [gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-T6xuT7/state/token ✔ the tools register once there is a way to a token, and the first call mints it (8.231239ms) [gitea] no token kept — minting one [gitea] the forge already holds a token named "mesh-tools" — replacing it [gitea] minted a token for "mesh-admin" (write:repository, write:issue, read:user), kept at /tmp/gitea-sJkEww/state/token ✔ a pull request can be closed, read and cleaned up through the tools (19.698849ms) [gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 25 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-host's main moved from d28ca95ccccc to ffffffffffff: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-host: whether a trunk moved could not be weighed, so it is weighed again on the next pass — the forge is away [gitea] novox/mesh-host's main moved from a2c2c35bbbbb to d28ca95ccccc: 0 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) [gitea] novox/mesh-controller's feat/57-config-and-provisioning moved from eeeeeeeeeeee to d28ca95ccccc: 1 open pull request(s) into it put out of date, nothing run (novox/hq ADR 0323) ✔ both statuses say the head and the trunk commit the verdict judged, first, whatever the summary's length (2.195175ms) ✔ a trunk's move puts an open head's merge check out of date, naming both commits, unless a check is on its way (1.384852ms) ✔ a push to a trunk puts every open pull request into it out of date — twenty-five of them — and none into another (5.961194ms) ✔ a trunk that cannot be read is weighed again on the next pass, never recorded half (0.579339ms) ✔ the trunk's move takes its turn after a verdict in flight, and weighs what the forge holds then (0.62431ms) ✔ a verdict judged against a trunk newer than the pass's first read is not put out of date (0.527318ms) ✔ a verdict that landed out of date keeps its account on the pull request (0.351936ms) ✔ a release branch's move puts every open pull request into it out of date, as a trunk's does (ADR 0358 §5) (0.778403ms) ℹ tests 95 ℹ suites 0 ℹ pass 95 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 665.325663 ```
mesh-admin merged commit fadf5025cc into main 2026-10-14 19:57:01 +00:00
mesh-admin deleted branch feat/merge-on-ready 2026-10-14 19:57:04 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-catalog#303