chore(mise): declare bun 1.4.0 and node 24 as text, and pin CI to the same values #85
Description
What to build
Declare this repo's runtimes as text so a fleet box installs them instead of relying on what it
happens to have. Add mise.toml with [tools] bun = "1.4.0" and node = "24" (the values
developerz-ai/wurk pinned in wurk#533 and the fleet proved green on 2026-09-17), and pin CI to the
same values: .github/workflows/ci.yml currently uses oven-sh/setup-bun@v2 with
bun-version: latest and sets up no node at all — it passes on ubuntu-latest by accident of
what that image ships. Add a comment in mise.toml naming ci.yml as the other copy so the next
bump moves both. bin/setup already mise-guards (if command -v mise); do not change it.
Evidence this is the cause: fleet task tsk_f2d3b5466fda46da8c6c436193e2f707 for #80 failed on box
fleet-2 with ./bin/setup: line 73: node: command not found immediately after mise all tools are installed, while the same script passed on sebastian-3, which happened to have a node. 13 of the
fleet's 14 exit-127 gate events in 7 days are this repo. Boxes carry no per-language runtime by design
(developerz.ai scripts/attach-vm.sh: "a box is a system and a bun, and nothing per-language; a
repo's toolchain is text (mise.toml) the runner user installs itself").
Acceptance criteria
-
mise.tomldeclaresbun = "1.4.0"andnode = "24", with a comment namingci.ymlas the paired copy -
ci.ymlpinsbun-version: "1.4.0"and addsactions/setup-nodewithnode-version: "24"before the install step - gates green:
bun run lint,bun run typecheck,bun test(CI) - no change to
bin/setup,bin/check,package.jsonorsrc/ - live test: post-merge, the next fleet coding run on this repo records a
team_verifyverdict (green or red) rather thangate_unrunnable/ exit 127
AFK / HITL
AFK.
Live test
set -euo pipefail
command -v gh >/dev/null || { echo "LIVE_TEST_INCONCLUSIVE: gh is missing on this runner"; exit 1; }
# The merged file must carry both pins. Contents-API read, with a same-scope control (CLAUDE.md pre-exists the merge).
out="$(gh api repos/developerz-ai/ui-debugger-mcp/contents/mise.toml -H 'Accept: application/vnd.github.raw' 2>&1)" || {
ctl="$(gh api repos/developerz-ai/ui-debugger-mcp/contents/CLAUDE.md -H 'Accept: application/vnd.github.raw' 2>&1)" || {
printf '%s\n' "$ctl" | tail -c 300; echo "LIVE_TEST_INCONCLUSIVE: this runner cannot read the repo's CONTENTS (control read failed)"; exit 1; }
printf '%s\n' "$out" | tail -c 300; echo "FAIL: mise.toml is absent on the default branch after merge"; exit 1; }
printf '%s' "$out" | grep -E '^bun *= *"1\.4\.0"' >/dev/null || { echo "FAIL: mise.toml does not pin bun = \"1.4.0\""; exit 1; }
printf '%s' "$out" | grep -E '^node *= *"24"' >/dev/null || { echo "FAIL: mise.toml does not pin node = \"24\""; exit 1; }
echo "PASS: mise.toml pins bun 1.4.0 and node 24 on the default branch"Affected paths
mise.toml, .github/workflows/ci.yml
Blocked by
None, can start immediately.
Parent
developerz-ai/developerz.ai#4277
Activity
ivndev001 commentedon Sep 17, 2026
spec-gate verdict: READY
run: a8c76a12b13c4f55d
provider: anthropic
model: claude-opus-5
developerz-ai commentedon Sep 17, 2026
chore(mise): declare bun 1.4.0 and node 24 as text, and pin CI to the same values
Work landed on #86 — watching it toward merge.
1m · 16 tool calls · 5 messages
Sessions: coding run
🤖 developerz.ai maintainer bot — sebby-ovh-3 (developerz-ai[bot]) · model
MiniMax-M3onrouter.ai.developerz.aiivndev001 commentedon Sep 17, 2026
Two corrections from the spec-gate's notes, recorded here rather than edited into the body so the
readylabel keeps pointing at the exact text the gate read.1. The runner name in the body is wrong; the mechanism around it is not. The body says ci.yml
"passes on
ubuntu-latestby accident of what that image ships". The workflow actually declaresruns-on: blacksmith-2vcpu-ubuntu-2204. Do not grep forubuntu-latest— it is not there. What thesentence was pointing at is true and unchanged: ci.yml sets up no node, so the
install chromiumstep's
node node_modules/playwright-core/cli.jsresolves to whatever the runner image happens toship, which is exactly the accident this issue removes.
2.
bun 1.4.0has never had a green run on THIS repo, and that is a deliberate choice, not anoversight. The six consecutive greens since
c5c488ball resolvedbun-version: latestto 1.4.2(1.4.1 landed 2026-09-04, 1.4.2 on 2026-09-05). The pin is 1.4.0 because the selection criterion was
proven on the fleet boxes — 1.4.0 is what developerz-ai/wurk#533 proved there, while this repo's
1.4.2 greens are all blacksmith-hosted CI, which is a different machine class and the one that has
never been the problem. The choice is self-gating either way: a 1.4.0-specific defect reds the
introducing PR's own CI, and
pr.auto_merge: truerequires green, so it cannot land silently.Related open issues worth reading before touching the pin, neither of which this issue closes: #66
(
bun-version: latestfloated 1.3.14 -> 1.4.0; auth e2e timeouts) and #70 (main red, "pin it to aKNOWN-GOOD version"). Both were symptom-fixed by PR #75 — a test-side
expect().rejectsstarvationbug, not a bun bug — and left open.
3. Leave
bin/setupalone. Its line 11 comment still says ".mise.toml/.tool-versions"while the correct filename here is unprefixed
mise.toml. Acceptance criterion 4 forbids touchingbin/setup, so refreshing that comment would trip this issue's own gate. It is a separate docs slice.developerz-ai commentedon Sep 17, 2026
Thanks for the corrections — noted for the record:
blacksmith-2vcpu-ubuntu-2204, notubuntu-latest. The mechanism (no node setup) is unchanged.auto_merge: true.PR #86 is proceeding with these understandings.
🤖 Posted by developerz.ai — the maintainer agent, not a human.
chore(mise): declare bun 1.4.0 and node 24 as text, pin CI to the same (