Fixes novox/hq issue 443 (a stalled line's times reach the operator as raw UTC), catalogue half. The controller half is novox/mesh-controller#218, which walks first.
What changes
StalledLine gains checks: one {context, state, since} per merge check an unanswered line waits on. state is pending or never-set; since is RFC 3339 in UTC, and is left out when the forge gave no time or one that cannot be read.
Stalled() fills it for every unanswered line from the head it was said of (withChecks, in the new waiting_checks.go). That covers the held-delivery lines that #199 (issue 441) adds too.
waiting (the finished words) stays as it is.
Safe alone: today's controller ignores checks and keeps reading waiting. With #218 the controller words checks in the operator's zone.
Kept out of #199's files: unchecked.go is untouched, so waitingChecks restates unanswered()'s rule. TestAnUnansweredLinesChecksAgreeWithItsWords holds the two together: same checks in the same order, and offset, missing and unreadable times. Once #199 lands, unanswered() can build its words from waitingChecks. I merged this branch with #199 locally, and the module's tests pass on the result.
Tests:TestAnUnansweredLineGivesItsChecksAsData and the agreement test both failed on main (no checks) and pass here. go vet ./... and go test ./... -count=1 in modules/mesh-delivery are green, and so is the words check.
after: novox/mesh-controller
Fixes novox/hq issue 443 (a stalled line's times reach the operator as raw UTC), catalogue half. The controller half is novox/mesh-controller#218, which walks first.
**What changes**
- `StalledLine` gains `checks`: one `{context, state, since}` per merge check an `unanswered` line waits on. `state` is `pending` or `never-set`; `since` is RFC 3339 in UTC, and is left out when the forge gave no time or one that cannot be read.
- `Stalled()` fills it for every `unanswered` line from the head it was said of (`withChecks`, in the new waiting_checks.go). That covers the held-delivery lines that #199 (issue 441) adds too.
- `waiting` (the finished words) stays as it is.
**Safe alone:** today's controller ignores `checks` and keeps reading `waiting`. With #218 the controller words `checks` in the operator's zone.
**Kept out of #199's files:** unchecked.go is untouched, so `waitingChecks` restates `unanswered()`'s rule. `TestAnUnansweredLinesChecksAgreeWithItsWords` holds the two together: same checks in the same order, and offset, missing and unreadable times. Once #199 lands, `unanswered()` can build its words from `waitingChecks`. I merged this branch with #199 locally, and the module's tests pass on the result.
**Tests:** `TestAnUnansweredLineGivesItsChecksAsData` and the agreement test both failed on main (no `checks`) and pass here. `go vet ./...` and `go test ./... -count=1` in modules/mesh-delivery are green, and so is the words check.
composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
Machines
mesh-delivery on novox: passed — carried by release-1791683758447339083
mesh-controller on novox: passed — healthy 3 times over 3m38s
mesh-controller on the rest running it: sent
mesh-delivery on the rest running it: sent
Transitions
2026-10-11 01:11 (new) → proposed (announced): novox/mesh-catalog#201's head announced
2026-10-11 01:13 proposed → checked (checked): the verdict names this commit
2026-10-11 01:13 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-11 01:55 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-11 01:55 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-11 02: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@30788c46a1a1` — **delivered** since 2026-10-11T02:00:44Z
**Delivery plan** — builds mesh-delivery → novox; no bus step
- tier 0: mesh-delivery
- novox: receives mesh-delivery
**Group** `fix/443-a-stalled-lines-times-are-local`, in order: novox/mesh-controller@984d85865d70 → novox/mesh-catalog@30788c46a1a1
- novox/mesh-controller@984d85865d70 before novox/mesh-catalog@30788c46a1a1: declared
- composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
**Machines**
- mesh-delivery on novox: passed — carried by release-1791683758447339083
- mesh-controller on novox: passed — healthy 3 times over 3m38s
- mesh-controller on the rest running it: sent
- mesh-delivery on the rest running it: sent
**Transitions**
- 2026-10-11 01:11 (new) → proposed (announced): novox/mesh-catalog#201's head announced
- 2026-10-11 01:13 proposed → checked (checked): the verdict names this commit
- 2026-10-11 01:13 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-11 01:55 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-11 01:55 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-11 02: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/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: 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 mesh-delivery → novox; no bus step
tier 0: mesh-delivery
novox: receives mesh-delivery
read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/issue443_test.go
Run by the build seat on novox as build-1791681062665916716 (builds --log build-1791681062665916716).
--- the gate: mesh-delivery
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, 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
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-11T01:09:19Z 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-11T01:09:19Z
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 1 module(s) in 1 tier(s): mesh-delivery
notes:
- modules/mesh-delivery/cmd/mesh-delivery/issue443_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 39440 strings of 655 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.015s
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: 69, as kept
testing modules/mesh-delivery
ok mesh-delivery/cmd/mesh-delivery 2.011s
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `30788c46`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: 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 mesh-delivery → novox; no bus step
- tier 0: mesh-delivery
- novox: receives mesh-delivery
- read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/issue443_test.go
Run by the build seat on novox as `build-1791681062665916716` (`builds --log build-1791681062665916716`).
```
--- the gate: mesh-delivery
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, 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
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-11T01:09:19Z 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-11T01:09:19Z
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 1 module(s) in 1 tier(s): mesh-delivery
notes:
- modules/mesh-delivery/cmd/mesh-delivery/issue443_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 39440 strings of 655 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.015s
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: 69, as kept
testing modules/mesh-delivery
ok mesh-delivery/cmd/mesh-delivery 2.011s
--- 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.
after: novox/mesh-controller
Fixes novox/hq issue 443 (a stalled line's times reach the operator as raw UTC), catalogue half. The controller half is novox/mesh-controller#218, which walks first.
What changes
StalledLinegainschecks: one{context, state, since}per merge check anunansweredline waits on.stateispendingornever-set;sinceis RFC 3339 in UTC, and is left out when the forge gave no time or one that cannot be read.Stalled()fills it for everyunansweredline from the head it was said of (withChecks, in the new waiting_checks.go). That covers the held-delivery lines that #199 (issue 441) adds too.waiting(the finished words) stays as it is.Safe alone: today's controller ignores
checksand keeps readingwaiting. With #218 the controller wordschecksin the operator's zone.Kept out of #199's files: unchecked.go is untouched, so
waitingChecksrestatesunanswered()'s rule.TestAnUnansweredLinesChecksAgreeWithItsWordsholds the two together: same checks in the same order, and offset, missing and unreadable times. Once #199 lands,unanswered()can build its words fromwaitingChecks. I merged this branch with #199 locally, and the module's tests pass on the result.Tests:
TestAnUnansweredLineGivesItsChecksAsDataand the agreement test both failed on main (nochecks) and pass here.go vet ./...andgo test ./... -count=1in modules/mesh-delivery are green, and so is the words check.Delivery
novox/mesh-catalog@30788c46a1a1— delivered since 2026-10-11T02:00:44ZDelivery plan — builds mesh-delivery → novox; no bus step
Group
fix/443-a-stalled-lines-times-are-local, in order: novox/mesh-controller@984d85865d → novox/mesh-catalog@30788c46a1Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
30788c46mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: 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 mesh-delivery → novox; no bus step
Run by the build seat on novox as
build-1791681062665916716(builds --log build-1791681062665916716).