cli: a client reads the answer its failed write left waiting, so a refusal is heard (issue 444) #19

Merged
mesh-admin merged 2 commits from fix/444-a-client-reads-the-answer-its-write-could-not-finish into main 2026-10-11 00:56:01 +00:00
Contributor

Fixes novox/hq issue 444 (a mesh-cli client gives up on a failed request write without reading the answer already waiting for it). Relates to issue 434 and mesh-host#80.

What was wrong

cli.AskWith (and cli.Ask) returned a failed request write as an error at once. Before mesh-host#80, the node-engine wrote its refusal (busy, unknown account) and closed before reading the request. Under load the client's write then failed with broken pipe, and the refusal waiting in the client's buffer was never read. A caller over its bound read "broken pipe" where the engine had said "busy".

What changes (head 24f5ee81)

After a failed write, AskWith still reads the answer, within the deadline the connection already has, so it never waits longer than before.

  • If the answer is a refusal (Refused set), it is returned with no error, so the engine's refusal reaches the caller.
  • Any other answer gives an error: the request was never written in full, so nothing can have run, and no correct engine answers anything but a refusal there. Passing it on as success would hide the failure. The error reads asking the node-engine: <write error>; and the answer that came is not a refusal, though the request was never wholly written.
  • If no answer came, the error says both: asking the node-engine: <write error>; and no answer came (<read error>).

The contract for callers is unchanged: an answer and no error, or an error.

Tests (go/cli/refusal_test.go)

The fake engine writes its answer and closes without reading, as the engine did before mesh-host#80. Each request carries a 4 MiB line, more than a unix socket buffers, so its write cannot finish before the close. The write fails every time, not only when it loses a race.

  • TestARefusalWrittenBeforeTheRequestIsReadReachesTheCaller: the refusal reaches the caller. On main it failed 200 of 200 runs (-race -count=200), each with write: broken pipe.
  • TestAFailedWriteWithNoAnswerSaysBoth: the engine closes without answering, and the error names the failed write and that no answer came. On main it failed 200 of 200 runs.
  • TestAnAnswerOtherThanARefusalAfterAFailedWriteIsAnError: the engine answers {"exit":0}, and the caller gets an error, not success. Against the first head (b4900f5) it failed 20 of 20 runs, each returning that answer as success.
  • TestAFailedWriteWaitsNoLongerThanTheDeadline: a 1 s context and a peer that accepts but never reads, answers or closes. The call returns the deadline error (os.ErrDeadlineExceeded) within 3 s. It also passes on the first head, because it pins existing behaviour rather than fixing anything.

At head 24f5ee81: go vet ./... is clean, and go test -race ./... -count=1, go test -race ./cli/ -count=50 and sh go/merge-check.sh pass.

How consumers pick it up

mesh-sdk/go is pinned by pseudo-version, not by tag.

  • The mesh-cli binary (mesh-catalog modules/mesh-cli) is pinned at v0.1.11-0.20261009143344-f047d0a4a970. It is the client that matters. After this merges, its go.mod needs go get git.novox.be/novox/mesh-sdk/go@<merge commit> (or a new go/v0.1.14 tag), and the mesh-cli module needs a rebuild.
  • mesh-host is pinned at v0.1.14-0.20261010191001-33917f91ac3c. It uses cli.Ask only in its tests, so it can update at its next change.

Neither repository is changed here.

Fixes novox/hq issue 444 (a mesh-cli client gives up on a failed request write without reading the answer already waiting for it). Relates to issue 434 and mesh-host#80. ## What was wrong `cli.AskWith` (and `cli.Ask`) returned a failed request write as an error at once. Before mesh-host#80, the node-engine wrote its refusal (busy, unknown account) and closed before reading the request. Under load the client's write then failed with `broken pipe`, and the refusal waiting in the client's buffer was never read. A caller over its bound read "broken pipe" where the engine had said "busy". ## What changes (head 24f5ee81) After a failed write, `AskWith` still reads the answer, within the deadline the connection already has, so it never waits longer than before. - If the answer is a refusal (`Refused` set), it is returned with no error, so the engine's refusal reaches the caller. - Any other answer gives an error: the request was never written in full, so nothing can have run, and no correct engine answers anything but a refusal there. Passing it on as success would hide the failure. The error reads `asking the node-engine: <write error>; and the answer that came is not a refusal, though the request was never wholly written`. - If no answer came, the error says both: `asking the node-engine: <write error>; and no answer came (<read error>)`. The contract for callers is unchanged: an answer and no error, or an error. ## Tests (`go/cli/refusal_test.go`) The fake engine writes its answer and closes without reading, as the engine did before mesh-host#80. Each request carries a 4 MiB line, more than a unix socket buffers, so its write cannot finish before the close. The write fails every time, not only when it loses a race. - `TestARefusalWrittenBeforeTheRequestIsReadReachesTheCaller`: the refusal reaches the caller. On main it failed 200 of 200 runs (`-race -count=200`), each with `write: broken pipe`. - `TestAFailedWriteWithNoAnswerSaysBoth`: the engine closes without answering, and the error names the failed write and that no answer came. On main it failed 200 of 200 runs. - `TestAnAnswerOtherThanARefusalAfterAFailedWriteIsAnError`: the engine answers `{"exit":0}`, and the caller gets an error, not success. Against the first head (b4900f5) it failed 20 of 20 runs, each returning that answer as success. - `TestAFailedWriteWaitsNoLongerThanTheDeadline`: a 1 s context and a peer that accepts but never reads, answers or closes. The call returns the deadline error (`os.ErrDeadlineExceeded`) within 3 s. It also passes on the first head, because it pins existing behaviour rather than fixing anything. At head 24f5ee81: `go vet ./...` is clean, and `go test -race ./... -count=1`, `go test -race ./cli/ -count=50` and `sh go/merge-check.sh` pass. ## How consumers pick it up mesh-sdk/go is pinned by pseudo-version, not by tag. - The mesh-cli binary (mesh-catalog `modules/mesh-cli`) is pinned at `v0.1.11-0.20261009143344-f047d0a4a970`. It is the client that matters. After this merges, its `go.mod` needs `go get git.novox.be/novox/mesh-sdk/go@<merge commit>` (or a new `go/v0.1.14` tag), and the mesh-cli module needs a rebuild. - mesh-host is pinned at `v0.1.14-0.20261010191001-33917f91ac3c`. It uses `cli.Ask` only in its tests, so it can update at its next change. Neither repository is changed here.
mesh-admin added 1 commit 2026-10-11 00:44:04 +00:00
cli: read the engine's answer after a failed request write, so a refusal is not lost as a broken pipe (hq issue 444)
mesh/merge-gate pass: builds mesh-sdk, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)
mesh/delivery superseded: a newer head of the same pull request
b4900f52b8
Author
Contributor

Delivery novox/mesh-sdk@24f5ee81bd4d — delivered since 2026-10-11T01:04:00Z

Delivery plan — builds mesh-sdk, sent nowhere; no bus step

  • tier 0: mesh-sdk

Machines

  • mesh-sdk on every machine running it: sent

Transitions

  • 2026-10-11 00:49 (new) → proposed (announced): novox/mesh-sdk#19's head announced
  • 2026-10-11 00:52 proposed → checked (checked): the verdict names this commit
  • 2026-10-11 00:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-11 01:02 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:02 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 01:04 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-sdk@24f5ee81bd4d` — **delivered** since 2026-10-11T01:04:00Z **Delivery plan** — builds mesh-sdk, sent nowhere; no bus step - tier 0: mesh-sdk **Machines** - mesh-sdk on every machine running it: sent **Transitions** - 2026-10-11 00:49 (new) → proposed (announced): novox/mesh-sdk#19's head announced - 2026-10-11 00:52 proposed → checked (checked): the verdict names this commit - 2026-10-11 00:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-11 01:02 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:02 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 01:04 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`.
jschoubben added 1 commit 2026-10-11 00:49:19 +00:00
cli: after a failed write take only a refusal, since nothing can have run, and pin that the read keeps the ask's deadline (hq issue 444)
mesh/merge-gate pass: builds mesh-sdk, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)
mesh/delivery delivered
24f5ee81bd
Author
Contributor

Merge check at b4900f52

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

Delivery plan — builds mesh-sdk, sent nowhere; no bus step

  • tier 0: mesh-sdk

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

  ---
  duration_ms: 70.025623
  type: 'test'
  ...
# Subtest: delete refuses an active consumer and deletes only the named retired one
ok 12 - delete refuses an active consumer and deletes only the named retired one
  ---
  duration_ms: 57.981937
  type: 'test'
  ...
# Subtest: an addition acts on the first pass
ok 13 - an addition acts on the first pass
  ---
  duration_ms: 12.82796
  type: 'test'
  ...
# Subtest: what the backend holds at start is retired by the same rules
ok 14 - what the backend holds at start is retired by the same rules
  ---
  duration_ms: 48.84956
  type: 'test'
  ...
# Subtest: the four tools are registered for the module and answer
ok 15 - the four tools are registered for the module and answer
  ---
  duration_ms: 1.384572
  type: 'test'
  ...
# [tools] broken: contributor failed, exposing none: Error: no token
# Subtest: semver orders releases
ok 16 - semver orders releases
  ---
  duration_ms: 0.759426
  type: 'test'
  ...
# Subtest: module tools register and collect, a thrower is skipped not fatal
ok 17 - module tools register and collect, a thrower is skipped not fatal
  ---
  duration_ms: 0.477337
  type: 'test'
  ...
# [provisioner:analytics] webapp-anchor: no longer in /tmp/prov-S5ch6X/analytics.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so webapp-anchor KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:49:32.443Z
# [provisioner:analytics] webapp-anchor: DELETING, asked by someone: gone for good
# Subtest: provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete
ok 18 - provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete
  ---
  duration_ms: 210.548103
  type: 'test'
  ...
# [provisioner:s3-bucket] mesh_anchor_ncloud: no longer in /tmp/prov-derived-XXrRw2/store.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_ncloud KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:49:32.670Z
# [provisioner:s3-bucket] mesh_anchor_ncloud: DELETING, asked by someone: unassigned
# Subtest: provisioner hands the adapter what the mesh derived, and still has it at withdrawal
ok 19 - provisioner hands the adapter what the mesh derived, and still has it at withdrawal
  ---
  duration_ms: 125.757974
  type: 'test'
  ...
# Subtest: provisioner stops calling an unreadable secret a race, and says what to look at
ok 20 - provisioner stops calling an unreadable secret a race, and says what to look at
  ---
  duration_ms: 71.533556
  type: 'test'
  ...
# [provisioner:postgres-database] contributions file unreadable (/tmp/prov-3GoXxe/postgres-database.json): ENOENT: no such file or directory, open '/tmp/prov-3GoXxe/postgres-database.json'; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-3GoXxe/postgres-database.json): SyntaxError: Expected property name or '}' in JSON at position 2 (line 1 column 3); nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-3GoXxe/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-3GoXxe/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-3GoXxe/postgres-database.json): SyntaxError: Unexpected end of JSON input; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-3GoXxe/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-3GoXxe/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
  ---
  duration_ms: 1309.701276
  type: 'test'
  ...
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
  ---
  duration_ms: 213.645994
  type: 'test'
  ...
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
  ---
  duration_ms: 73.146597
  type: 'test'
  ...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
  ---
  duration_ms: 402.26941
  type: 'test'
  ...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
  ---
  duration_ms: 403.276242
  type: 'test'
  ...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
  ---
  duration_ms: 302.205766
  type: 'test'
  ...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
  ---
  duration_ms: 61.735218
  type: 'test'
  ...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
  ---
  duration_ms: 0.522011
  type: 'test'
  ...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
  ---
  duration_ms: 1.145592
  type: 'test'
  ...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
  ---
  duration_ms: 0.431791
  type: 'test'
  ...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 31 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
  ---
  duration_ms: 128.339342
  type: 'test'
  ...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 32 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
  ---
  duration_ms: 63.942064
  type: 'test'
  ...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 33 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
  ---
  duration_ms: 83.225851
  type: 'test'
  ...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 34 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
  ---
  duration_ms: 3196.143355
  type: 'test'
  ...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 35 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
  ---
  duration_ms: 64.047061
  type: 'test'
  ...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 36 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
  ---
  duration_ms: 267.53902
  type: 'test'
  ...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 37 - topics match as the runtime's do: * one segment, \# and ** any number
  ---
  duration_ms: 3.63544
  type: 'test'
  ...
1..37
# tests 37
# suites 0
# pass 37
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3886.124342
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-sdk/go	0.087s
ok  	git.novox.be/novox/mesh-sdk/go/asker	0.002s
ok  	git.novox.be/novox/mesh-sdk/go/asks	0.003s
ok  	git.novox.be/novox/mesh-sdk/go/cli	0.017s
?   	git.novox.be/novox/mesh-sdk/go/example	[no test files]
ok  	git.novox.be/novox/mesh-sdk/go/health	0.002s
**Merge check** at `b4900f52` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-sdk) - `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go) **Delivery plan** — builds mesh-sdk, sent nowhere; no bus step - tier 0: mesh-sdk Run by the build seat on g14 as `build-1791679452884832410` (`builds --log build-1791679452884832410`). ``` --- duration_ms: 70.025623 type: 'test' ... # Subtest: delete refuses an active consumer and deletes only the named retired one ok 12 - delete refuses an active consumer and deletes only the named retired one --- duration_ms: 57.981937 type: 'test' ... # Subtest: an addition acts on the first pass ok 13 - an addition acts on the first pass --- duration_ms: 12.82796 type: 'test' ... # Subtest: what the backend holds at start is retired by the same rules ok 14 - what the backend holds at start is retired by the same rules --- duration_ms: 48.84956 type: 'test' ... # Subtest: the four tools are registered for the module and answer ok 15 - the four tools are registered for the module and answer --- duration_ms: 1.384572 type: 'test' ... # [tools] broken: contributor failed, exposing none: Error: no token # Subtest: semver orders releases ok 16 - semver orders releases --- duration_ms: 0.759426 type: 'test' ... # Subtest: module tools register and collect, a thrower is skipped not fatal ok 17 - module tools register and collect, a thrower is skipped not fatal --- duration_ms: 0.477337 type: 'test' ... # [provisioner:analytics] webapp-anchor: no longer in /tmp/prov-S5ch6X/analytics.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so webapp-anchor KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:49:32.443Z # [provisioner:analytics] webapp-anchor: DELETING, asked by someone: gone for good # Subtest: provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete ok 18 - provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete --- duration_ms: 210.548103 type: 'test' ... # [provisioner:s3-bucket] mesh_anchor_ncloud: no longer in /tmp/prov-derived-XXrRw2/store.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_ncloud KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:49:32.670Z # [provisioner:s3-bucket] mesh_anchor_ncloud: DELETING, asked by someone: unassigned # Subtest: provisioner hands the adapter what the mesh derived, and still has it at withdrawal ok 19 - provisioner hands the adapter what the mesh derived, and still has it at withdrawal --- duration_ms: 125.757974 type: 'test' ... # Subtest: provisioner stops calling an unreadable secret a race, and says what to look at ok 20 - provisioner stops calling an unreadable secret a race, and says what to look at --- duration_ms: 71.533556 type: 'test' ... # [provisioner:postgres-database] contributions file unreadable (/tmp/prov-3GoXxe/postgres-database.json): ENOENT: no such file or directory, open '/tmp/prov-3GoXxe/postgres-database.json'; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-3GoXxe/postgres-database.json): SyntaxError: Expected property name or '}' in JSON at position 2 (line 1 column 3); nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] /tmp/prov-3GoXxe/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] /tmp/prov-3GoXxe/postgres-database.json has no given list; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-3GoXxe/postgres-database.json): SyntaxError: Unexpected end of JSON input; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230) # [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose # [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-3GoXxe/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose # [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-3GoXxe/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose # Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241) ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241) --- duration_ms: 1309.701276 type: 'test' ... # [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again # Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds --- duration_ms: 213.645994 type: 'test' ... # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # Subtest: provisioner keeps a consumer applied when the backend cannot be asked ok 23 - provisioner keeps a consumer applied when the backend cannot be asked --- duration_ms: 73.146597 type: 'test' ... # Subtest: provisioner backs off when create does not satisfy holds, and says so ok 24 - provisioner backs off when create does not satisfy holds, and says so --- duration_ms: 402.26941 type: 'test' ... # Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password --- duration_ms: 403.276242 type: 'test' ... # Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check --- duration_ms: 302.205766 type: 'test' ... # Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker --- duration_ms: 61.735218 type: 'test' ... # Subtest: serving refuses one module exposing two tools of the same name ok 28 - serving refuses one module exposing two tools of the same name --- duration_ms: 0.522011 type: 'test' ... # Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata --- duration_ms: 1.145592 type: 'test' ... # Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192) ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192) --- duration_ms: 0.431791 type: 'test' ... # Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them ok 31 - a bundle on stdio lists its tools and answers a call, a seat's verb among them --- duration_ms: 128.339342 type: 'test' ... # Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193) ok 32 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193) --- duration_ms: 63.942064 type: 'test' ... # Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193) ok 33 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193) --- duration_ms: 83.225851 type: 'test' ... # Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198) ok 34 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198) --- duration_ms: 3196.143355 type: 'test' ... # Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276) ok 35 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276) --- duration_ms: 64.047061 type: 'test' ... # Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201) ok 36 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201) --- duration_ms: 267.53902 type: 'test' ... # Subtest: topics match as the runtime's do: * one segment, \# and ** any number ok 37 - topics match as the runtime's do: * one segment, \# and ** any number --- duration_ms: 3.63544 type: 'test' ... 1..37 # tests 37 # suites 0 # pass 37 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 3886.124342 NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check --- its go/merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-sdk/go 0.087s ok git.novox.be/novox/mesh-sdk/go/asker 0.002s ok git.novox.be/novox/mesh-sdk/go/asks 0.003s ok git.novox.be/novox/mesh-sdk/go/cli 0.017s ? git.novox.be/novox/mesh-sdk/go/example [no test files] ok git.novox.be/novox/mesh-sdk/go/health 0.002s ```
Author
Contributor

Merge check at 24f5ee81

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

Delivery plan — builds mesh-sdk, sent nowhere; no bus step

  • tier 0: mesh-sdk

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

ok 11 - a waiting set the mesh asks for again settles, and nothing is retired
  ---
  duration_ms: 64.633514
  type: 'test'
  ...
# Subtest: delete refuses an active consumer and deletes only the named retired one
ok 12 - delete refuses an active consumer and deletes only the named retired one
  ---
  duration_ms: 55.954932
  type: 'test'
  ...
# Subtest: an addition acts on the first pass
ok 13 - an addition acts on the first pass
  ---
  duration_ms: 15.133691
  type: 'test'
  ...
# Subtest: what the backend holds at start is retired by the same rules
ok 14 - what the backend holds at start is retired by the same rules
  ---
  duration_ms: 47.397872
  type: 'test'
  ...
# Subtest: the four tools are registered for the module and answer
ok 15 - the four tools are registered for the module and answer
  ---
  duration_ms: 1.018125
  type: 'test'
  ...
# [tools] broken: contributor failed, exposing none: Error: no token
# Subtest: semver orders releases
ok 16 - semver orders releases
  ---
  duration_ms: 1.042076
  type: 'test'
  ...
# Subtest: module tools register and collect, a thrower is skipped not fatal
ok 17 - module tools register and collect, a thrower is skipped not fatal
  ---
  duration_ms: 0.68077
  type: 'test'
  ...
# [provisioner:analytics] webapp-anchor: no longer in /tmp/prov-EVqtPY/analytics.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so webapp-anchor KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:52:50.321Z
# [provisioner:analytics] webapp-anchor: DELETING, asked by someone: gone for good
# Subtest: provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete
ok 18 - provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete
  ---
  duration_ms: 209.41288
  type: 'test'
  ...
# [provisioner:s3-bucket] mesh_anchor_ncloud: no longer in /tmp/prov-derived-7wIaD6/store.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_ncloud KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:52:50.547Z
# [provisioner:s3-bucket] mesh_anchor_ncloud: DELETING, asked by someone: unassigned
# Subtest: provisioner hands the adapter what the mesh derived, and still has it at withdrawal
ok 19 - provisioner hands the adapter what the mesh derived, and still has it at withdrawal
  ---
  duration_ms: 135.548184
  type: 'test'
  ...
# Subtest: provisioner stops calling an unreadable secret a race, and says what to look at
ok 20 - provisioner stops calling an unreadable secret a race, and says what to look at
  ---
  duration_ms: 72.704947
  type: 'test'
  ...
# [provisioner:postgres-database] contributions file unreadable (/tmp/prov-Un3Ub9/postgres-database.json): ENOENT: no such file or directory, open '/tmp/prov-Un3Ub9/postgres-database.json'; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-Un3Ub9/postgres-database.json): SyntaxError: Expected property name or '}' in JSON at position 2 (line 1 column 3); nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-Un3Ub9/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-Un3Ub9/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-Un3Ub9/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-Un3Ub9/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
  ---
  duration_ms: 1318.797342
  type: 'test'
  ...
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
  ---
  duration_ms: 210.449825
  type: 'test'
  ...
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
  ---
  duration_ms: 72.308661
  type: 'test'
  ...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
  ---
  duration_ms: 402.732063
  type: 'test'
  ...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
  ---
  duration_ms: 401.887988
  type: 'test'
  ...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
  ---
  duration_ms: 303.189226
  type: 'test'
  ...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
  ---
  duration_ms: 33.353217
  type: 'test'
  ...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
  ---
  duration_ms: 0.311665
  type: 'test'
  ...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
  ---
  duration_ms: 0.689341
  type: 'test'
  ...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
  ---
  duration_ms: 0.218333
  type: 'test'
  ...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 31 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
  ---
  duration_ms: 124.697138
  type: 'test'
  ...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 32 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
  ---
  duration_ms: 83.019804
  type: 'test'
  ...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 33 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
  ---
  duration_ms: 83.445951
  type: 'test'
  ...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 34 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
  ---
  duration_ms: 3205.020301
  type: 'test'
  ...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 35 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
  ---
  duration_ms: 83.363229
  type: 'test'
  ...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 36 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
  ---
  duration_ms: 283.128541
  type: 'test'
  ...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 37 - topics match as the runtime's do: * one segment, \# and ** any number
  ---
  duration_ms: 2.351386
  type: 'test'
  ...
1..37
# tests 37
# suites 0
# pass 37
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3962.935072
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-sdk/go	0.144s
ok  	git.novox.be/novox/mesh-sdk/go/asker	0.003s
ok  	git.novox.be/novox/mesh-sdk/go/asks	0.003s
ok  	git.novox.be/novox/mesh-sdk/go/cli	1.027s
?   	git.novox.be/novox/mesh-sdk/go/example	[no test files]
ok  	git.novox.be/novox/mesh-sdk/go/health	0.002s
**Merge check** at `24f5ee81` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-sdk) - `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go) **Delivery plan** — builds mesh-sdk, sent nowhere; no bus step - tier 0: mesh-sdk Run by the build seat on shanks as `build-1791679823417448417` (`builds --log build-1791679823417448417`). ``` ok 11 - a waiting set the mesh asks for again settles, and nothing is retired --- duration_ms: 64.633514 type: 'test' ... # Subtest: delete refuses an active consumer and deletes only the named retired one ok 12 - delete refuses an active consumer and deletes only the named retired one --- duration_ms: 55.954932 type: 'test' ... # Subtest: an addition acts on the first pass ok 13 - an addition acts on the first pass --- duration_ms: 15.133691 type: 'test' ... # Subtest: what the backend holds at start is retired by the same rules ok 14 - what the backend holds at start is retired by the same rules --- duration_ms: 47.397872 type: 'test' ... # Subtest: the four tools are registered for the module and answer ok 15 - the four tools are registered for the module and answer --- duration_ms: 1.018125 type: 'test' ... # [tools] broken: contributor failed, exposing none: Error: no token # Subtest: semver orders releases ok 16 - semver orders releases --- duration_ms: 1.042076 type: 'test' ... # Subtest: module tools register and collect, a thrower is skipped not fatal ok 17 - module tools register and collect, a thrower is skipped not fatal --- duration_ms: 0.68077 type: 'test' ... # [provisioner:analytics] webapp-anchor: no longer in /tmp/prov-EVqtPY/analytics.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so webapp-anchor KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:52:50.321Z # [provisioner:analytics] webapp-anchor: DELETING, asked by someone: gone for good # Subtest: provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete ok 18 - provisioner creates each consumer with the mesh's login and password; remove waits for a person's delete --- duration_ms: 209.41288 type: 'test' ... # [provisioner:s3-bucket] mesh_anchor_ncloud: no longer in /tmp/prov-derived-7wIaD6/store.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_ncloud KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): the mesh stopped asking for it: the same answer in 5 passes over 0s, from 2026-10-11T00:52:50.547Z # [provisioner:s3-bucket] mesh_anchor_ncloud: DELETING, asked by someone: unassigned # Subtest: provisioner hands the adapter what the mesh derived, and still has it at withdrawal ok 19 - provisioner hands the adapter what the mesh derived, and still has it at withdrawal --- duration_ms: 135.548184 type: 'test' ... # Subtest: provisioner stops calling an unreadable secret a race, and says what to look at ok 20 - provisioner stops calling an unreadable secret a race, and says what to look at --- duration_ms: 72.704947 type: 'test' ... # [provisioner:postgres-database] contributions file unreadable (/tmp/prov-Un3Ub9/postgres-database.json): ENOENT: no such file or directory, open '/tmp/prov-Un3Ub9/postgres-database.json'; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-Un3Ub9/postgres-database.json): SyntaxError: Expected property name or '}' in JSON at position 2 (line 1 column 3); nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] /tmp/prov-Un3Ub9/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] /tmp/prov-Un3Ub9/postgres-database.json has no given list; nothing applied or removed until it can be read # [provisioner:postgres-database] contributions file readable again # [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230) # [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose # [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-Un3Ub9/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose # [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-Un3Ub9/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose # Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241) ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241) --- duration_ms: 1318.797342 type: 'test' ... # [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again # Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds --- duration_ms: 210.449825 type: 'test' ... # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused # Subtest: provisioner keeps a consumer applied when the backend cannot be asked ok 23 - provisioner keeps a consumer applied when the backend cannot be asked --- duration_ms: 72.308661 type: 'test' ... # Subtest: provisioner backs off when create does not satisfy holds, and says so ok 24 - provisioner backs off when create does not satisfy holds, and says so --- duration_ms: 402.732063 type: 'test' ... # Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password --- duration_ms: 401.887988 type: 'test' ... # Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check --- duration_ms: 303.189226 type: 'test' ... # Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker --- duration_ms: 33.353217 type: 'test' ... # Subtest: serving refuses one module exposing two tools of the same name ok 28 - serving refuses one module exposing two tools of the same name --- duration_ms: 0.311665 type: 'test' ... # Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata --- duration_ms: 0.689341 type: 'test' ... # Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192) ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192) --- duration_ms: 0.218333 type: 'test' ... # Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them ok 31 - a bundle on stdio lists its tools and answers a call, a seat's verb among them --- duration_ms: 124.697138 type: 'test' ... # Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193) ok 32 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193) --- duration_ms: 83.019804 type: 'test' ... # Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193) ok 33 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193) --- duration_ms: 83.445951 type: 'test' ... # Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198) ok 34 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198) --- duration_ms: 3205.020301 type: 'test' ... # Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276) ok 35 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276) --- duration_ms: 83.363229 type: 'test' ... # Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201) ok 36 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201) --- duration_ms: 283.128541 type: 'test' ... # Subtest: topics match as the runtime's do: * one segment, \# and ** any number ok 37 - topics match as the runtime's do: * one segment, \# and ** any number --- duration_ms: 2.351386 type: 'test' ... 1..37 # tests 37 # suites 0 # pass 37 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 3962.935072 NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check --- its go/merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-sdk/go 0.144s ok git.novox.be/novox/mesh-sdk/go/asker 0.003s ok git.novox.be/novox/mesh-sdk/go/asks 0.003s ok git.novox.be/novox/mesh-sdk/go/cli 1.027s ? git.novox.be/novox/mesh-sdk/go/example [no test files] ok git.novox.be/novox/mesh-sdk/go/health 0.002s ```
mesh-admin merged commit ee1e1a8303 into main 2026-10-11 00:56:01 +00:00
mesh-admin deleted branch fix/444-a-client-reads-the-answer-its-write-could-not-finish 2026-10-11 00:56:02 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-sdk#19