Problem
references/dispatch-liveness.md:55 prescribes a wait built on timeout(1):
timeout 3600 bash -c 'until <condition>; do sleep 60; done'; echo "wait ended: $?"
and :58 tells the reader to "set the outer timeout to the longest the wait could reasonably
take". macOS does not ship timeout(1). On a stock macOS host the recipe fails with a
command-not-found, and the wait it was supposed to bound does not happen at all.
This is the same premise ADR 0068 rests on. That record exists because there is no portable
timeout on this project's primary development platform, and it specifies a trap-free Bash 3.2
mechanism for exactly that reason. One shipped reference now says the opposite of another.
Evidence
references/dispatch-liveness.md:55 and :58 — the prescription, in a reference the repository
ships and links from skills.
- ADR 0068 and
references/network-bounds.md — the mechanism that exists because timeout(1) is
unavailable here.
scripts/check-public-safety-test.sh already records the same hazard in-repo: its gate is
backgrounded and polled "rather than wrapped in timeout(1), which macOS does not ship (a
timeout-based leg would fail on it)".
- Homebrew coreutils may supply
timeout or gtimeout on a given machine. That is a host
accident, not a guarantee, and a reference cannot depend on it.
Expected
dispatch-liveness.md prescribes a wait that runs on a stock macOS host. The repository already
has two portable precedents to draw on rather than inventing a third — the polled loop in
check-public-safety-test.sh and the bounded_call mechanism in references/network-bounds.md.
Reuse beats invention here: if bounded_call fits, say so and point at it, since a fourth copy of
the same idiom is the drift ADR 0068 already priced.
Non-goals
- Changing what dispatch-liveness says about liveness itself — one probe per worker per run,
never inferring liveness from timestamps. That guidance is not in question.
- Adding
timeout to any required-command list, which would make the affected scripts refuse to
run on a stock macOS host.
Provenance
Found during the campaign covering #382, #384, #386 and #387, while auditing the repository's own
timeout precedents; verified against the file before filing. Filed on explicit operator
authorization.
Problem
references/dispatch-liveness.md:55prescribes a wait built ontimeout(1):and
:58tells the reader to "set the outertimeoutto the longest the wait could reasonablytake". macOS does not ship
timeout(1). On a stock macOS host the recipe fails with acommand-not-found, and the wait it was supposed to bound does not happen at all.
This is the same premise ADR 0068 rests on. That record exists because there is no portable
timeouton this project's primary development platform, and it specifies a trap-free Bash 3.2mechanism for exactly that reason. One shipped reference now says the opposite of another.
Evidence
references/dispatch-liveness.md:55and:58— the prescription, in a reference the repositoryships and links from skills.
references/network-bounds.md— the mechanism that exists becausetimeout(1)isunavailable here.
scripts/check-public-safety-test.shalready records the same hazard in-repo: its gate isbackgrounded and polled "rather than wrapped in
timeout(1), which macOS does not ship (atimeout-based leg would fail on it)".
timeoutorgtimeouton a given machine. That is a hostaccident, not a guarantee, and a reference cannot depend on it.
Expected
dispatch-liveness.mdprescribes a wait that runs on a stock macOS host. The repository alreadyhas two portable precedents to draw on rather than inventing a third — the polled loop in
check-public-safety-test.shand thebounded_callmechanism inreferences/network-bounds.md.Reuse beats invention here: if
bounded_callfits, say so and point at it, since a fourth copy ofthe same idiom is the drift ADR 0068 already priced.
Non-goals
never inferring liveness from timestamps. That guidance is not in question.
timeoutto any required-command list, which would make the affected scripts refuse torun on a stock macOS host.
Provenance
Found during the campaign covering #382, #384, #386 and #387, while auditing the repository's own
timeout precedents; verified against the file before filing. Filed on explicit operator
authorization.