A walk's first-machine gate waits for a busy container, and mesh-builder busy drains the agent (issue 594, hq ADR 0335) #283

Open
mesh-admin wants to merge 1 commits from feat/335-a-busy-container-is-replaced-when-idle into main
Contributor

after: novox/mesh-host

Issue 594; decision: novox/hq ADR 0335. Companion to mesh-host#98. Compatible with #280 (a restarted build is said): this touches MachineOptions and the Take loop after the cancel check, not the delivery stamp #280 adds.

What it does

  • Manifest: a container's busy (command, timeout default 10s, at most 1m) is checked by module check (shape, only on a container that stays up), and composed only for a machine whose health statement says contract 8 (link.BusyContract); an older, strict engine is not sent it and replaces at once, as before.
  • Pin: mesh-host moved to bb60e7b (mesh-host#98's head) and vendored, so the node-engine's own validator used by the facts and probes knows busy. Re-pin if #98 changes before merging.
  • Report: busy is kept with the machine's last account (node_report.busy, migration 0096); a wait starting or ending is news. While a container waits, the machine's apply duration is not recorded: the report that says it replaced ends the apply, so the rest's apply phase counts the wait.
  • Gate: a first-machine gate whose machine reports, on the gate's send, a judged module's container waiting does not judge: no pass, no bound; the walk and plans say "waits for a busy container on " with what it holds. At the report that no longer lists it, the gate's Since moves to that report: the judging starts then. Past the engine's bound plus 5 minutes (an engine silent while it waited), the judging starts anyway and holds the module not healthy while it is still listed waiting, so no walk waits for ever.
  • Walk phases: a busy-wait phase between send-first and judgement, only in a tier where one waited; measured, counted in the delivery time, never exempted.
  • mesh-builder: mesh-builder busy writes a drain mark, then exits 0 while a build is in hand (printing what) and 1 when none is. A drained agent fetches nothing and hands back what it fetched (MachineOptions.Claim): each side writes its own mark before it reads the other's, so an ask racing a fetch never misses a build just taken. The marks are cleared when the holder starts.

Migration number: 0096 is also used by the unmerged branches feat/325 and feat/328; whichever lands last renumbers.

Tests (fail on main: the identifiers do not exist there)

  • cmd/mesh-controller busy_test.go: a gate waits while its module's container waits, says so, and starts at the replaced report; it waits no longer than the engine's bound plus the slack; an engine that never waits starts as before, and a wait reported on an older declaration holds nothing.
  • internal/inventory busy_test.go: the busy wait is a measured phase between the send and the judging, and the total holds; an open wait is said; a container is its module's by id. Store test TestAReportOfABusyContainerIsKeptAndReadBack (listed in testdata/store-tests; not run here: no store on this machine).
  • internal/catalogue busy_test.go: busy's shape; sent only to an engine that reads it, and the node-engine's validator accepts it.
  • cmd/mesh-builder busy_test.go: busy answers while a build is in hand and drains; 200 racing ask/claim rounds never miss a build.

gofmt, go vet and merge-check.sh pass (without MESH_TEST_POSTGRES: store tests skipped).

after: novox/mesh-host Issue 594; decision: novox/hq ADR 0335. Companion to mesh-host#98. Compatible with #280 (a restarted build is said): this touches `MachineOptions` and the Take loop after the cancel check, not the delivery stamp #280 adds. **What it does** - Manifest: a container's `busy` (`command`, `timeout` default 10s, at most 1m) is checked by `module check` (shape, only on a container that stays up), and composed only for a machine whose health statement says contract 8 (`link.BusyContract`); an older, strict engine is not sent it and replaces at once, as before. - Pin: mesh-host moved to bb60e7b (mesh-host#98's head) and vendored, so the node-engine's own validator used by the facts and probes knows `busy`. Re-pin if #98 changes before merging. - Report: `busy` is kept with the machine's last account (`node_report.busy`, migration 0096); a wait starting or ending is news. While a container waits, the machine's `apply` duration is not recorded: the report that says it replaced ends the apply, so the rest's apply phase counts the wait. - Gate: a first-machine gate whose machine reports, on the gate's send, a judged module's container `waiting` does not judge: no pass, no bound; the walk and `plans` say "waits for a busy container on <machine>" with what it holds. At the report that no longer lists it, the gate's Since moves to that report: the judging starts then. Past the engine's bound plus 5 minutes (an engine silent while it waited), the judging starts anyway and holds the module not healthy while it is still listed waiting, so no walk waits for ever. - Walk phases: a `busy-wait` phase between `send-first` and `judgement`, only in a tier where one waited; measured, counted in the delivery time, never exempted. - mesh-builder: `mesh-builder busy` writes a drain mark, then exits 0 while a build is in hand (printing what) and 1 when none is. A drained agent fetches nothing and hands back what it fetched (`MachineOptions.Claim`): each side writes its own mark before it reads the other's, so an ask racing a fetch never misses a build just taken. The marks are cleared when the holder starts. **Migration number**: 0096 is also used by the unmerged branches feat/325 and feat/328; whichever lands last renumbers. **Tests (fail on main: the identifiers do not exist there)** - cmd/mesh-controller busy_test.go: a gate waits while its module's container waits, says so, and starts at the replaced report; it waits no longer than the engine's bound plus the slack; an engine that never waits starts as before, and a wait reported on an older declaration holds nothing. - internal/inventory busy_test.go: the busy wait is a measured phase between the send and the judging, and the total holds; an open wait is said; a container is its module's by id. Store test TestAReportOfABusyContainerIsKeptAndReadBack (listed in testdata/store-tests; not run here: no store on this machine). - internal/catalogue busy_test.go: busy's shape; sent only to an engine that reads it, and the node-engine's validator accepts it. - cmd/mesh-builder busy_test.go: busy answers while a build is in hand and drains; 200 racing ask/claim rounds never miss a build. gofmt, go vet and merge-check.sh pass (without MESH_TEST_POSTGRES: store tests skipped).
mesh-admin added 1 commit 2026-10-12 22:54:36 +00:00
Hold a walk's first-machine gate while its busy container finishes its build
mesh/delivery checking
mesh/delivery-group group feat/335-a-busy-container-is-replaced-when-idle rejected: its order contradicts itself: novox/mesh-catalog@190608193764, novox/mesh-c…
mesh/merge-gate out of date: judged against trunk 56d6313262e8, the trunk is now cbac703e817d; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk 56d6313262e8, the trunk is now cbac703e817d; judged again on a recheck or when it is merged
b1546ed28a
A merge into mesh-controller replaced every build agent and threw away the
checks in flight (issue 594). The manifest's container busy is checked and
sent only to an engine that reads it; a report's busy waits are kept, the
gate starts at the report that says the container replaced, and the wait is
a phase of the delivery time. mesh-builder busy drains the agent and answers
while a build is in hand (novox/hq ADR 0335).
Author
Contributor

Delivery novox/mesh-controller@b1546ed28a88 — proposed since 2026-10-12T22:54:44Z

Group feat/335-a-busy-container-is-replaced-when-idle, in order: novox/mesh-host@bb60e7b584 → novox/mesh-controller@b1546ed28a

Transitions

  • 2026-10-12 22:54 (new) → proposed (announced): novox/mesh-controller#283's head announced

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

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@b1546ed28a88` — **proposed** since 2026-10-12T22:54:44Z **Group** `feat/335-a-busy-container-is-replaced-when-idle`, in order: novox/mesh-host@bb60e7b584d8 → novox/mesh-controller@b1546ed28a88 - novox/mesh-host@bb60e7b584d8 before novox/mesh-controller@b1546ed28a88: declared, over built by **Transitions** - 2026-10-12 22:54 (new) → proposed (announced): novox/mesh-controller#283's head announced The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at b1546ed2
Judged: head b1546ed28a88 merged into trunk 56d6313262e8; read beside it: mesh-catalog 8f80cd471634, mesh-controller-main 56d6313262e8, mesh-host 7a41e120635b, mesh-tools 954e1a53eef9

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s); and TestAReportOfABusyContainerIsKeptAndReadBack

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
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent, route-proxy is judged on its first machine
  • read by no module's build: cmd/mesh-builder/busy_test.go, cmd/mesh-builder/stdout_test.go, cmd/mesh-controller/busy_test.go, internal/catalogue/busy_test.go, internal/inventory/busy_test.go, testdata/store-tests

Run by the build seat on g14 as build-1791845684393014632 (builds --log build-1791845684393014632).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 58 tool(s); WARNING: merge-window 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: 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
files asking for a setting without saying whether it is trusted: 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-12T22:43:48Z 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-12T22:43:48Z

modules the change moves:
  - mesh-controller (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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy

notes:
  - cmd/mesh-builder/busy_test.go, cmd/mesh-builder/stdout_test.go, cmd/mesh-controller/busy_test.go, internal/catalogue/busy_test.go, internal/inventory/busy_test.go and testdata/store-tests read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.076s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	198.008s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.019s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.012s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.162s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.064s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:29: open /var/lib/build-agent/workspace/check/mesh-host/examples/foundation-first-node-nats.lock: no such file or directory
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	3.024s
ok  	github.com/novox/mesh-controller/internal/builder	35.785s
ok  	github.com/novox/mesh-controller/internal/catalogue	7.782s
ok  	github.com/novox/mesh-controller/internal/conditions	2.496s
ok  	github.com/novox/mesh-controller/internal/envfile	1.032s
ok  	github.com/novox/mesh-controller/internal/facts	1.041s
ok  	github.com/novox/mesh-controller/internal/identity	6.121s
--- FAIL: TestAReportOfABusyContainerIsKeptAndReadBack (0.13s)
    busy_test.go:120: can't scan into dest[4]: cannot scan NULL into *bool
2026/10/12 22:57:42 the stored manifest of later has a key this controller does not know (a state is either a name or {name, history, ttl-seconds, per-machine}: json: unknown field "a-field-from-later" (read without state[0].a-field-from-later)): a newer controller registered it, and later is left out of every machine until this controller is updated (novox/hq ADR 0262)
FAIL
FAIL	github.com/novox/mesh-controller/internal/inventory	35.079s
ok  	github.com/novox/mesh-controller/internal/lease	17.720s
ok  	github.com/novox/mesh-controller/internal/licences	5.090s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.013s
ok  	github.com/novox/mesh-controller/internal/link	59.943s
ok  	github.com/novox/mesh-controller/internal/lint	2.040s
ok  	github.com/novox/mesh-controller/internal/outward	1.044s
ok  	github.com/novox/mesh-controller/internal/overlay	1.029s
ok  	github.com/novox/mesh-controller/internal/secrets	1.384s
ok  	github.com/novox/mesh-controller/internal/store	4.622s
ok  	github.com/novox/mesh-controller/internal/testbus	1.170s
ok  	github.com/novox/mesh-controller/internal/token	1.014s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:29: open /var/lib/build-agent/workspace/check/mesh-host/examples/foundation-first-node-nats.lock: no such file or directory
FAIL	github.com/novox/mesh-controller/internal/broker	3.024s
--- FAIL: TestAReportOfABusyContainerIsKeptAndReadBack (0.13s)
    busy_test.go:120: can't scan into dest[4]: cannot scan NULL into *bool
FAIL	github.com/novox/mesh-controller/internal/inventory	35.079s

Out of date when it landed: out of date: judged against trunk 56d6313262, the trunk is now cbac703e817d; judged again on a recheck or when it is merged

**Merge check** at `b1546ed2` Judged: head `b1546ed28a88` merged into trunk `56d6313262e8`; read beside it: mesh-catalog `8f80cd471634`, mesh-controller-main `56d6313262e8`, mesh-host `7a41e120635b`, mesh-tools `954e1a53eef9` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s); and TestAReportOfABusyContainerIsKeptAndReadBack **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 - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent, route-proxy is judged on its first machine - read by no module's build: cmd/mesh-builder/busy_test.go, cmd/mesh-builder/stdout_test.go, cmd/mesh-controller/busy_test.go, internal/catalogue/busy_test.go, internal/inventory/busy_test.go, testdata/store-tests Run by the build seat on g14 as `build-1791845684393014632` (`builds --log build-1791845684393014632`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 58 tool(s); WARNING: merge-window 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: 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 files asking for a setting without saying whether it is trusted: 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-12T22:43:48Z 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-12T22:43:48Z modules the change moves: - mesh-controller (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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy notes: - cmd/mesh-builder/busy_test.go, cmd/mesh-builder/stdout_test.go, cmd/mesh-controller/busy_test.go, internal/catalogue/busy_test.go, internal/inventory/busy_test.go and testdata/store-tests read by no module's build, and rebuild nothing (issue 280) --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.076s ok github.com/novox/mesh-controller/cmd/mesh-controller 198.008s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.021s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s ok github.com/novox/mesh-controller/examples/route-proxy 1.162s ok github.com/novox/mesh-controller/internal/artifacts 1.064s ? github.com/novox/mesh-controller/internal/beside [no test files] --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:29: open /var/lib/build-agent/workspace/check/mesh-host/examples/foundation-first-node-nats.lock: no such file or directory FAIL FAIL github.com/novox/mesh-controller/internal/broker 3.024s ok github.com/novox/mesh-controller/internal/builder 35.785s ok github.com/novox/mesh-controller/internal/catalogue 7.782s ok github.com/novox/mesh-controller/internal/conditions 2.496s ok github.com/novox/mesh-controller/internal/envfile 1.032s ok github.com/novox/mesh-controller/internal/facts 1.041s ok github.com/novox/mesh-controller/internal/identity 6.121s --- FAIL: TestAReportOfABusyContainerIsKeptAndReadBack (0.13s) busy_test.go:120: can't scan into dest[4]: cannot scan NULL into *bool 2026/10/12 22:57:42 the stored manifest of later has a key this controller does not know (a state is either a name or {name, history, ttl-seconds, per-machine}: json: unknown field "a-field-from-later" (read without state[0].a-field-from-later)): a newer controller registered it, and later is left out of every machine until this controller is updated (novox/hq ADR 0262) FAIL FAIL github.com/novox/mesh-controller/internal/inventory 35.079s ok github.com/novox/mesh-controller/internal/lease 17.720s ok github.com/novox/mesh-controller/internal/licences 5.090s ok github.com/novox/mesh-controller/internal/licences/adapters 1.013s ok github.com/novox/mesh-controller/internal/link 59.943s ok github.com/novox/mesh-controller/internal/lint 2.040s ok github.com/novox/mesh-controller/internal/outward 1.044s ok github.com/novox/mesh-controller/internal/overlay 1.029s ok github.com/novox/mesh-controller/internal/secrets 1.384s ok github.com/novox/mesh-controller/internal/store 4.622s ok github.com/novox/mesh-controller/internal/testbus 1.170s ok github.com/novox/mesh-controller/internal/token 1.014s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.00s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:29: open /var/lib/build-agent/workspace/check/mesh-host/examples/foundation-first-node-nats.lock: no such file or directory FAIL github.com/novox/mesh-controller/internal/broker 3.024s --- FAIL: TestAReportOfABusyContainerIsKeptAndReadBack (0.13s) busy_test.go:120: can't scan into dest[4]: cannot scan NULL into *bool FAIL github.com/novox/mesh-controller/internal/inventory 35.079s ``` **Out of date when it landed**: out of date: judged against trunk 56d6313262e8, the trunk is now cbac703e817d; judged again on a recheck or when it is merged
Some checks are pending
mesh/delivery checking
mesh/delivery-group group feat/335-a-busy-container-is-replaced-when-idle rejected: its order contradicts itself: novox/mesh-catalog@190608193764, novox/mesh-c…
mesh/merge-gate out of date: judged against trunk 56d6313262e8, the trunk is now cbac703e817d; judged again on a recheck or when it is merged
Required
Details
mesh/repo-check out of date: judged against trunk 56d6313262e8, the trunk is now cbac703e817d; judged again on a recheck or when it is merged
Required
Details
This pull request has changes conflicting with the target branch.
  • testdata/store-tests
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/335-a-busy-container-is-replaced-when-idle:feat/335-a-busy-container-is-replaced-when-idle
git checkout feat/335-a-busy-container-is-replaced-when-idle
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#283