consumes its own mesh-issues.opened; for an issue still at open, two judgements through claude-code.claude_code_judge@<node>: a shortlist (≤5) by titles, then a verdict on the reports (duplicate / related / none, certain, reason). Only older issues at open/diagnosing/located are offered.
certain duplicate: verdict note first, link duplicates, the newer's title+report as a note on the older, move newer to wontfix "duplicate of N". related or not certain: relates-to + notes. none: one note. The older never moves; resolved/wontfix never touched; a verdict naming an issue not offered fails.
once per issue: the verdict note's fixed first line (by duplicate-check only) is the record; a redelivery finishes missing steps without judging.
failure is loud: one note, handler returns an error → redelivered, then the controller's max-deliveries condition.
verb groom: dry run in the background kept in new state grooming; pass shows it; confirm+pass applies exactly its findings, re-checked.
note/link/move gained internal variants that record the actor; the public verbs are unchanged.
claude-code
claude_code_judge: claude -p --output-format json --json-schema … --tools "" --safe-mode --no-session-persistence as the agent account (sudo -n -H -u where confined), empty dir, question on stdin, 25 s bound, one at a time; refuses empty/oversized question, non-object schema, unknown model, no licence.
Tests (judgement stubbed): clear duplicate, related, duplicate-not-certain, none, resolved/wontfix/newer/unoffered target, idempotent redelivery + partial apply, a spoofed note by another caller, failed judgement (one note, not taken), off setting, dry run byte-for-byte unchanged, confirm skips findings against an issue resolved meanwhile, confirm closes only the newer, interrupted pass. claude-code: argv (no tools, safe mode, sudo as agent), refusals, timeouts, turn-taking.
Reviewers' checklist: glossary words; no secret in any event; cannot close both sides or a resolved issue; dry run changes nothing; idempotent on redelivery; failure loud; store change = new declared state only (no schema/migration: a KV bucket the controller creates).
Builds hq ADR 0278 (hq PR #281), to-be 53 §9.
**mesh-issues**
- consumes its own `mesh-issues.opened`; for an issue still at `open`, two judgements through `claude-code.claude_code_judge@<node>`: a shortlist (≤5) by titles, then a verdict on the reports (duplicate / related / none, certain, reason). Only older issues at open/diagnosing/located are offered.
- certain duplicate: verdict note first, link `duplicates`, the newer's title+report as a note on the older, move newer to `wontfix` "duplicate of N". related or not certain: `relates-to` + notes. none: one note. The older never moves; resolved/wontfix never touched; a verdict naming an issue not offered fails.
- once per issue: the verdict note's fixed first line (by `duplicate-check` only) is the record; a redelivery finishes missing steps without judging.
- failure is loud: one note, handler returns an error → redelivered, then the controller's `max-deliveries` condition.
- verb `groom`: dry run in the background kept in new state `grooming`; `pass` shows it; `confirm`+`pass` applies exactly its findings, re-checked.
- settings `duplicate-check` (on), `judge-model` (sonnet). Manifest: `consumes`, `invokes`, state `grooming`, verb `groom`.
- note/link/move gained internal variants that record the actor; the public verbs are unchanged.
**claude-code**
- `claude_code_judge`: `claude -p --output-format json --json-schema … --tools "" --safe-mode --no-session-persistence` as the agent account (sudo -n -H -u where confined), empty dir, question on stdin, 25 s bound, one at a time; refuses empty/oversized question, non-object schema, unknown model, no licence.
**Tests** (judgement stubbed): clear duplicate, related, duplicate-not-certain, none, resolved/wontfix/newer/unoffered target, idempotent redelivery + partial apply, a spoofed note by another caller, failed judgement (one note, not taken), off setting, dry run byte-for-byte unchanged, confirm skips findings against an issue resolved meanwhile, confirm closes only the newer, interrupted pass. claude-code: argv (no tools, safe mode, sudo as agent), refusals, timeouts, turn-taking.
Reviewers' checklist: glossary words; no secret in any event; cannot close both sides or a resolved issue; dry run changes nothing; idempotent on redelivery; failure loud; store change = new declared state only (no schema/migration: a KV bucket the controller creates).
mesh/merge-gate pass: builds claude-code, mesh-issues → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 o…
The operator asked for duplicate issues to be consolidated as they are opened.
The tracker consumes its own opened event and asks the agent on its node, through
claude-code's new claude_code_judge, whether an older issue not resolved asks the
same question; it closes only the newer issue of a certain duplicate, keeping its
report on the older one, and fails loudly when it cannot judge. groom runs the
same judgement over the backlog as a dry run, applied on confirm.
Deliverynovox/mesh-catalog@a5c38892a7e7 — delivered since 2026-10-10T15:43:01Z
Delivery plan — builds claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
tier 0: claude-code, mesh-issues
ace: receives claude-code
g14: receives claude-code
novox: receives claude-code, mesh-issues
shanks: receives claude-code
claude-code keeps data (ADR 0233): what it holds is backed up before it moves
Machines
claude-code on ace: passed — healthy 3 times over 2m21s
mesh-issues on novox: passed — healthy 3 times over 2m12s
claude-code on the rest running it: sent
mesh-issues on the rest running it: sent
Transitions
2026-10-10 15:20 (new) → proposed (announced): novox/mesh-catalog#183's head announced
2026-10-10 15:23 proposed → checked (checked): the verdict names this commit
2026-10-10 15:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-10 15:36 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-10 15:36 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-10 15:43 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@a5c38892a7e7` — **delivered** since 2026-10-10T15:43:01Z
**Delivery plan** — builds claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
- tier 0: claude-code, mesh-issues
- ace: receives claude-code
- g14: receives claude-code
- novox: receives claude-code, mesh-issues
- shanks: receives claude-code
- claude-code keeps data (ADR 0233): what it holds is backed up before it moves
**Machines**
- claude-code on ace: passed — healthy 3 times over 2m21s
- mesh-issues on novox: passed — healthy 3 times over 2m12s
- claude-code on the rest running it: sent
- mesh-issues on the rest running it: sent
**Transitions**
- 2026-10-10 15:20 (new) → proposed (announced): novox/mesh-catalog#183's head announced
- 2026-10-10 15:23 proposed → checked (checked): the verdict names this commit
- 2026-10-10 15:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-10 15:36 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-10 15:36 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-10 15:43 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/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)
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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
tier 0: claude-code, mesh-issues
ace: receives claude-code
g14: receives claude-code
novox: receives claude-code, mesh-issues
shanks: receives claude-code
claude-code keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go, modules/mesh-issues/cmd/mesh-issues/memory_test.go
Run by the build seat on ace as build-1791645141326738460 (builds --log build-1791645141326738460).
--- the gate: claude-code, mesh-issues
note: claude-code uses the seat "operator-channel", which no module declares and the mesh does not define among the manifests given; registration judges it against the whole catalogue, and passing the declaring module's manifest too judges it here
claude-code: ok, 44 tool(s), keeps state servers, holdings, config, proposals, 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)
mesh-issues: ok, invokes claude-code.claude_code_judge, keeps state issues, counters, grooming
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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-10T14:26:57Z 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-10T14:26:57Z
modules the change moves:
- claude-code (changed)
- mesh-issues (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): claude-code, mesh-issues
notes:
- modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go and modules/mesh-issues/cmd/mesh-issues/memory_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.002s
words: 12 retired words and 70 daemons' lines, none in the 38166 strings of 642 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
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: 70, as kept
testing modules/claude-code
ok claude-code/cmd/claude-code 2.719s
testing modules/mesh-issues
ok mesh-issues/cmd/mesh-issues 5.612s
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `f58840b8`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)
- `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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
- tier 0: claude-code, mesh-issues
- ace: receives claude-code
- g14: receives claude-code
- novox: receives claude-code, mesh-issues
- shanks: receives claude-code
- claude-code keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go, modules/mesh-issues/cmd/mesh-issues/memory_test.go
Run by the build seat on ace as `build-1791645141326738460` (`builds --log build-1791645141326738460`).
```
--- the gate: claude-code, mesh-issues
note: claude-code uses the seat "operator-channel", which no module declares and the mesh does not define among the manifests given; registration judges it against the whole catalogue, and passing the declaring module's manifest too judges it here
claude-code: ok, 44 tool(s), keeps state servers, holdings, config, proposals, 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)
mesh-issues: ok, invokes claude-code.claude_code_judge, keeps state issues, counters, grooming
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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-10T14:26:57Z 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-10T14:26:57Z
modules the change moves:
- claude-code (changed)
- mesh-issues (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): claude-code, mesh-issues
notes:
- modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go and modules/mesh-issues/cmd/mesh-issues/memory_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.002s
words: 12 retired words and 70 daemons' lines, none in the 38166 strings of 642 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
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: 70, as kept
testing modules/claude-code
ok claude-code/cmd/claude-code 2.719s
testing modules/mesh-issues
ok mesh-issues/cmd/mesh-issues 5.612s
--- its merge-check-typescript.sh (typescript toolchain)
```
mesh/merge-gate pass: builds claude-code, mesh-issues → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 o…
An independent review found a pass could starve new issues' checks, two writers
could apply one verdict twice, a judged issue resolved by a person could still be
linked, and the dry run's answer raced its pass.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)
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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
tier 0: claude-code, mesh-issues
ace: receives claude-code
g14: receives claude-code
novox: receives claude-code, mesh-issues
shanks: receives claude-code
claude-code keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go, modules/mesh-issues/cmd/mesh-issues/memory_test.go
Run by the build seat on g14 as build-1791645627600348269 (builds --log build-1791645627600348269).
--- the gate: claude-code, mesh-issues
note: claude-code uses the seat "operator-channel", which no module declares and the mesh does not define among the manifests given; registration judges it against the whole catalogue, and passing the declaring module's manifest too judges it here
claude-code: ok, 44 tool(s), keeps state servers, holdings, config, proposals, 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)
mesh-issues: ok, invokes claude-code.claude_code_judge, keeps state issues, counters, grooming
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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-10T14:26:57Z 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-10T14:26:57Z
modules the change moves:
- claude-code (changed)
- mesh-issues (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): claude-code, mesh-issues
notes:
- modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go and modules/mesh-issues/cmd/mesh-issues/memory_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.002s
words: 12 retired words and 70 daemons' lines, none in the 38172 strings of 642 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.009s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 70, as kept
testing modules/claude-code
ok claude-code/cmd/claude-code 2.689s
testing modules/mesh-issues
ok mesh-issues/cmd/mesh-issues 5.682s
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `a5c38892`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)
- `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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
- tier 0: claude-code, mesh-issues
- ace: receives claude-code
- g14: receives claude-code
- novox: receives claude-code, mesh-issues
- shanks: receives claude-code
- claude-code keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go, modules/mesh-issues/cmd/mesh-issues/memory_test.go
Run by the build seat on g14 as `build-1791645627600348269` (`builds --log build-1791645627600348269`).
```
--- the gate: claude-code, mesh-issues
note: claude-code uses the seat "operator-channel", which no module declares and the mesh does not define among the manifests given; registration judges it against the whole catalogue, and passing the declaring module's manifest too judges it here
claude-code: ok, 44 tool(s), keeps state servers, holdings, config, proposals, 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)
mesh-issues: ok, invokes claude-code.claude_code_judge, keeps state issues, counters, grooming
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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-10T14:26:57Z 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-10T14:26:57Z
modules the change moves:
- claude-code (changed)
- mesh-issues (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): claude-code, mesh-issues
notes:
- modules/claude-code/README.md, modules/claude-code/cmd/claude-code/judge_test.go, modules/mesh-issues/README.md, modules/mesh-issues/cmd/mesh-issues/groom_test.go, modules/mesh-issues/cmd/mesh-issues/manifest_test.go and modules/mesh-issues/cmd/mesh-issues/memory_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.002s
words: 12 retired words and 70 daemons' lines, none in the 38172 strings of 642 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.009s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 70, as kept
testing modules/claude-code
ok claude-code/cmd/claude-code 2.689s
testing modules/mesh-issues
ok mesh-issues/cmd/mesh-issues 5.682s
--- its merge-check-typescript.sh (typescript toolchain)
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Builds hq ADR 0278 (hq PR #281), to-be 53 §9.
mesh-issues
mesh-issues.opened; for an issue still atopen, two judgements throughclaude-code.claude_code_judge@<node>: a shortlist (≤5) by titles, then a verdict on the reports (duplicate / related / none, certain, reason). Only older issues at open/diagnosing/located are offered.duplicates, the newer's title+report as a note on the older, move newer towontfix"duplicate of N". related or not certain:relates-to+ notes. none: one note. The older never moves; resolved/wontfix never touched; a verdict naming an issue not offered fails.duplicate-checkonly) is the record; a redelivery finishes missing steps without judging.max-deliveriescondition.groom: dry run in the background kept in new stategrooming;passshows it;confirm+passapplies exactly its findings, re-checked.duplicate-check(on),judge-model(sonnet). Manifest:consumes,invokes, stategrooming, verbgroom.claude-code
claude_code_judge:claude -p --output-format json --json-schema … --tools "" --safe-mode --no-session-persistenceas the agent account (sudo -n -H -u where confined), empty dir, question on stdin, 25 s bound, one at a time; refuses empty/oversized question, non-object schema, unknown model, no licence.Tests (judgement stubbed): clear duplicate, related, duplicate-not-certain, none, resolved/wontfix/newer/unoffered target, idempotent redelivery + partial apply, a spoofed note by another caller, failed judgement (one note, not taken), off setting, dry run byte-for-byte unchanged, confirm skips findings against an issue resolved meanwhile, confirm closes only the newer, interrupted pass. claude-code: argv (no tools, safe mode, sudo as agent), refusals, timeouts, turn-taking.
Reviewers' checklist: glossary words; no secret in any event; cannot close both sides or a resolved issue; dry run changes nothing; idempotent on redelivery; failure loud; store change = new declared state only (no schema/migration: a KV bucket the controller creates).
Delivery
novox/mesh-catalog@a5c38892a7e7— delivered since 2026-10-10T15:43:01ZDelivery plan — builds claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
f58840b8mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791645141326738460(builds --log build-1791645141326738460).Merge check at
a5c38892mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: claude-code, mesh-issues)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 claude-code, mesh-issues → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791645627600348269(builds --log build-1791645627600348269).