The base branch's merge-check.sh judges a pull request, not the change's own copy (hq issue 310) #135

Merged
mesh-admin merged 1 commits from fix/the-base-branchs-check-judges-a-pull-request into main 2026-10-08 09:10:23 +00:00
Contributor

novox/hq issue 310, hole 2.

The build seat ran the merge-check.sh found in the pull request's head. A change could delete or gut it and skip its own tests, and a branch cut before the repository had a script escaped them (the media catalogue's Lidarr pull request merged with "no repository check defined" as a warning).

Now (internal/builder/check_base.go, TheCheckThatJudges): where the base branch holds a merge-check.sh, its script, its # mesh-check-also: parts and its toolchain marker run against the change's tree. The base's scripts are written into the throwaway clone after the gate (which composes the change as it is) and before the repository's own check.

  • The head lacks the script: main's runs, and the summary says the change holds no merge-check.sh: main's judged it.
  • The head alters the script or a declared part: main's runs, and the summary leads with THE CHANGE ALTERS ITS OWN CHECK (<files>): main's version judged it; the change's judges the pull requests after it merges. The verdict stays the verdict of main's script, because the forge counts a warning as a failure, and a warning would block every legitimate change to a check.
  • The base holds no script: unchanged. The head's script runs, or the warning is given when there is none.
  • The base branch cannot be read: an error. It never falls back to the head's script.

Chicken and egg: a pull request that changes the check is judged by the version it replaces. Its own version judges the next pull request.

Tests: check_base_test.go covers a head without the script, a head that guts the script, a head that guts a declared part, a legitimate change to the check, a main with no script, and an unreadable base, plus a docker-gated end-to-end Check. replay310_test.go (TestReplay310) uses only the API from before the fix. It fails on 1a50d6e (the repository layer answered warning) and passes on this commit. It is registered as R310 in mesh-lab.

merge-check.sh was run locally with -race, against a throwaway postgres and with MESH_TEST_DOCKER=1 plus a local registry, and passed.

novox/hq issue 310, hole 2. The build seat ran the `merge-check.sh` found in the pull request's head. A change could delete or gut it and skip its own tests, and a branch cut before the repository had a script escaped them (the media catalogue's Lidarr pull request merged with "no repository check defined" as a warning). **Now** (`internal/builder/check_base.go`, `TheCheckThatJudges`): where the base branch holds a `merge-check.sh`, **its** script, its `# mesh-check-also:` parts and its toolchain marker run against the change's tree. The base's scripts are written into the throwaway clone after the gate (which composes the change as it is) and before the repository's own check. - The head lacks the script: main's runs, and the summary says `the change holds no merge-check.sh: main's judged it`. - The head alters the script or a declared part: main's runs, and the summary leads with `THE CHANGE ALTERS ITS OWN CHECK (<files>): main's version judged it; the change's judges the pull requests after it merges`. The verdict stays the verdict of main's script, because the forge counts a warning as a failure, and a warning would block every legitimate change to a check. - The base holds no script: unchanged. The head's script runs, or the warning is given when there is none. - The base branch cannot be read: an error. It never falls back to the head's script. Chicken and egg: a pull request that changes the check is judged by the version it replaces. Its own version judges the next pull request. **Tests**: `check_base_test.go` covers a head without the script, a head that guts the script, a head that guts a declared part, a legitimate change to the check, a main with no script, and an unreadable base, plus a docker-gated end-to-end `Check`. `replay310_test.go` (`TestReplay310`) uses only the API from before the fix. It fails on 1a50d6e (the repository layer answered `warning`) and passes on this commit. It is registered as R310 in mesh-lab. `merge-check.sh` was run locally with -race, against a throwaway postgres and with `MESH_TEST_DOCKER=1` plus a local registry, and passed.
mesh-admin added 1 commit 2026-10-08 08:58:36 +00:00
Judge a pull request by the base branch's merge-check.sh, not its own copy
mesh/delivery superseded: a newer delivery to the same trunk took over its walk
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
mesh/repo-check pass: its merge-check.sh passed
cb0327de7f
A change could delete or gut its merge-check.sh and skip its own tests, and a
branch cut before the script escaped them. Where the base branch holds one, its
script, declared parts and toolchain run against the change's tree, and the
verdict says when the change lacks or alters the check (novox/hq issue 310).
Author
Contributor

Delivery novox/mesh-controller@cb0327de7fc0 — superseded since 2026-10-08T09:11:43Z

Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • tier 2: route-proxy
  • ace: receives build-agent, route-proxy
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent, route-proxy
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • route-proxy provides route: its consumers are sent again after it
  • route-proxy keeps data (ADR 0233): what it holds is backed up before it moves

Machines

  • mesh-controller on novox: judging — 0 healthy judging(s) so far

Transitions

  • 2026-10-08 08:58 (new) → proposed (announced): novox/mesh-controller#135's head announced
  • 2026-10-08 09:03 proposed → checked (checked): the verdict names this commit
  • 2026-10-08 09:03 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-08 09:10 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
  • 2026-10-08 09:10 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
  • 2026-10-08 09:11 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk

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

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@cb0327de7fc0` — **superseded** since 2026-10-08T09:11:43Z **Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - tier 2: route-proxy - ace: receives build-agent, route-proxy - g14: receives build-agent - novox: receives mesh-controller, build-agent, route-proxy - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - route-proxy provides route: its consumers are sent again after it - route-proxy keeps data (ADR 0233): what it holds is backed up before it moves **Machines** - mesh-controller on novox: judging — 0 healthy judging(s) so far **Transitions** - 2026-10-08 08:58 (new) → proposed (announced): novox/mesh-controller#135's head announced - 2026-10-08 09:03 proposed → checked (checked): the verdict names this commit - 2026-10-08 09:03 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-08 09:10 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move - 2026-10-08 09:10 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 - 2026-10-08 09:11 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at cb0327de

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
  • mesh/repo-check: PASS — its merge-check.sh passed

Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • tier 2: route-proxy
  • ace: receives build-agent, route-proxy
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent, route-proxy
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • route-proxy provides route: its consumers are sent again after it
  • route-proxy keeps data (ADR 0233): what it holds is backed up before it moves

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

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
1 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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T08:57:42Z 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-08T08:57:42Z

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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.034s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	158.525s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.038s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.044s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.040s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.189s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.069s
ok  	github.com/novox/mesh-controller/internal/broker	2.665s
ok  	github.com/novox/mesh-controller/internal/builder	1.944s
ok  	github.com/novox/mesh-controller/internal/catalogue	4.711s
ok  	github.com/novox/mesh-controller/internal/conditions	2.021s
ok  	github.com/novox/mesh-controller/internal/envfile	1.045s
ok  	github.com/novox/mesh-controller/internal/facts	1.047s
ok  	github.com/novox/mesh-controller/internal/identity	4.734s
ok  	github.com/novox/mesh-controller/internal/inventory	79.260s
ok  	github.com/novox/mesh-controller/internal/lease	17.700s
ok  	github.com/novox/mesh-controller/internal/licences	4.385s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.043s
ok  	github.com/novox/mesh-controller/internal/link	45.063s
ok  	github.com/novox/mesh-controller/internal/lint	2.013s
ok  	github.com/novox/mesh-controller/internal/outward	1.080s
ok  	github.com/novox/mesh-controller/internal/overlay	1.063s
ok  	github.com/novox/mesh-controller/internal/secrets	1.534s
ok  	github.com/novox/mesh-controller/internal/store	3.461s
ok  	github.com/novox/mesh-controller/internal/testbus	1.227s
ok  	github.com/novox/mesh-controller/internal/token	1.014s
**Merge check** at `cb0327de` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy) - `mesh/repo-check`: **PASS** — its merge-check.sh passed **Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - tier 2: route-proxy - ace: receives build-agent, route-proxy - g14: receives build-agent - novox: receives mesh-controller, build-agent, route-proxy - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - route-proxy provides route: its consumers are sent again after it - route-proxy keeps data (ADR 0233): what it holds is backed up before it moves Run by the build seat on shanks as `build-1791449928843293730` (`builds --log build-1791449928843293730`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 47 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) long-running resources without health: 1 1 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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T08:57:42Z 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-08T08:57:42Z 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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.034s ok github.com/novox/mesh-controller/cmd/mesh-controller 158.525s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.038s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.044s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.040s ok github.com/novox/mesh-controller/examples/route-proxy 1.189s ok github.com/novox/mesh-controller/internal/artifacts 1.069s ok github.com/novox/mesh-controller/internal/broker 2.665s ok github.com/novox/mesh-controller/internal/builder 1.944s ok github.com/novox/mesh-controller/internal/catalogue 4.711s ok github.com/novox/mesh-controller/internal/conditions 2.021s ok github.com/novox/mesh-controller/internal/envfile 1.045s ok github.com/novox/mesh-controller/internal/facts 1.047s ok github.com/novox/mesh-controller/internal/identity 4.734s ok github.com/novox/mesh-controller/internal/inventory 79.260s ok github.com/novox/mesh-controller/internal/lease 17.700s ok github.com/novox/mesh-controller/internal/licences 4.385s ok github.com/novox/mesh-controller/internal/licences/adapters 1.043s ok github.com/novox/mesh-controller/internal/link 45.063s ok github.com/novox/mesh-controller/internal/lint 2.013s ok github.com/novox/mesh-controller/internal/outward 1.080s ok github.com/novox/mesh-controller/internal/overlay 1.063s ok github.com/novox/mesh-controller/internal/secrets 1.534s ok github.com/novox/mesh-controller/internal/store 3.461s ok github.com/novox/mesh-controller/internal/testbus 1.227s ok github.com/novox/mesh-controller/internal/token 1.014s ```
mesh-admin merged commit 14d36e813f into main 2026-10-08 09:10:23 +00:00
mesh-admin deleted branch fix/the-base-branchs-check-judges-a-pull-request 2026-10-08 09:10:23 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#135