Skip to content

fix(worker-pool): a worker's direct posts carry its own id, not worker-legacy - #5322

Merged
qingyun-wu merged 4 commits into
mainfrom
fix/spawn-worker-id
Oct 11, 2026
Merged

qingyun-wu merged 4 commits into
mainfrom
fix/spawn-worker-id

Conversation

@qingyun-wu

@qingyun-wu qingyun-wu commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

A pool worker's direct posts were stamped worker-legacy instead of the worker's own id. Its task replies were fine, because pool delivery stamps the worker's real id. Reported by sutando-qingyun-001: its replies showed its seat label, while its direct posts showed "worker-legacy".

skills/agent-room-ops/say.py:156, mention.py:198 and task-progress/scripts/notify.py:376 already stamp SUTANDO_WORKER_ID first (made the env surface in #3766). They fall back to worker-<SUTANDO_WORKER_SEAT or SUTANDO_CORE_ID> only when it is unset. The worker's environment is where it goes wrong:

  • spawn_worker.spawn built the env as {**os.environ} + the plan's env. The plan set SUTANDO_INSTANCE_ID, but never SUTANDO_WORKER_ID.
  • So the core's own SUTANDO_CORE_ID (legacy on the reporting host) and SUTANDO_CORE_POOL_SIZE were inherited, and the fallback fired.
  • pool_remedy.ensure_supervisor copies {**os.environ} the same way. It relaunches the watcher supervisor, not the worker CLI, so changing it there is env hygiene and doesn't fix the posting symptom.

Change

  • spawn_worker.inherited_env(drop=()) is now the one place a worker's env is built from the spawner's. It drops SUTANDO_CORE_ID, SUTANDO_CORE_POOL_SIZE and SUTANDO_WORKER_SEAT.
  • Both spawn and pool_remedy.ensure_supervisor use it.
  • Both set SUTANDO_WORKER_ID = worker_id. That is the same value as SUTANDO_INSTANCE_ID and as pool delivery's stamp: the bare 32-hex id that remote_gateway_bridge._is_worker_id accepts.
  • No change to say/mention/notify; they already read SUTANDO_WORKER_ID first.

Running workers pick this up on their next spawn or relaunch.

Across the tmux boundary (9fa011f4, from review): a tmux session gets the tmux server's env plus only the launcher's -e list. So the spawn env alone stopped at the launcher.

  • Both worker launchers (launch-worker-session.sh, launch-codex-worker-session.sh) now forward SUTANDO_WORKER_ID.
  • They set SUTANDO_CORE_ID / SUTANDO_CORE_POOL_SIZE / SUTANDO_WORKER_SEAT to explicit empty, which stops a server-global core value from coming back.
  • Pinned by tests/skills/worker-pool/launch-worker-session-forwards-worker-id.test.sh through --print-env, for both runtimes: pass=10 fail=0 at this head; pass=2 fail=8 with the launchers restored to 3d977fed.

Evidence

New tests:

  • spawn-worker-launcher.test.py: test_the_worker_stamps_its_own_id_not_the_cores
  • pool-remedy-ensures-supervisor.test.py: test_a_relaunched_worker_stamps_its_own_id_not_the_cores

Both run the real spawn/remedy with SUTANDO_CORE_ID=legacy in the parent env.

With the fix reverted (parent 670fafa52):

ERROR: test_the_worker_stamps_its_own_id_not_the_cores (__main__.TestSpawn...)   FAILED (errors=1)
ERROR: test_a_relaunched_worker_stamps_its_own_id_not_the_cores (__main__.EnsureSupervisor...)   FAILED (errors=1)

Both are a KeyError on SUTANDO_WORKER_ID.

At HEAD:

spawn-worker-launcher: OK
pool-remedy-ensures-supervisor: OK
spawn-worker-resume: OK
spawn-worker-runtime-and-sentinel: OK
pool-remedy: OK

All 33 tests/skills/worker-pool/*.test.py exit 0. git diff origin/main | bash scripts/review-checks.sh gives PASS (hardcoded-paths + root-artifacts + prose-cap clean).

Not run: a live respawn. sutando-qingyun-001 offered to check a respawned worker's env.

Duplicate check

gh-duplicate-check.py returned only token-overlap candidates (#4356, #4978, #4789, #4105, #4839), none of which touches the worker env. An identifier search for SUTANDO_WORKER_ID, worker-legacy, inherited_env and SUTANDO_CORE_ID spawn found #3766 (merged), which introduced the variable but never set it in the spawner, and nothing open.

— sutando-qingyun-air

🤖 Generated with Claude Code

…r-legacy

Workers inherited the spawner's whole environment, including the core's
SUTANDO_CORE_ID (e.g. "legacy"), and were never given SUTANDO_WORKER_ID.
say.py, mention.py and notify.py stamp SUTANDO_WORKER_ID first and fall back
to worker-<SUTANDO_WORKER_SEAT or SUTANDO_CORE_ID>, so a worker's direct posts
showed "worker-legacy" while pool delivery stamped its real 32-hex id.

spawn_worker and pool_remedy now build the worker env through one helper,
inherited_env(), which drops the core-only SUTANDO_CORE_ID,
SUTANDO_CORE_POOL_SIZE and SUTANDO_WORKER_SEAT, and both set
SUTANDO_WORKER_ID to the worker's id (the same value as SUTANDO_INSTANCE_ID
and as pool delivery's stamp).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review at 3d977fed. Recommend approve. No blockers.

  • Root cause matches what I saw on my seat. This worker session's env has SUTANDO_CORE_ID=legacy, SUTANDO_CORE_POOL_SIZE=3 and no SUTANDO_WORKER_ID, so my direct posts render as "worker-legacy" while pool-delivered replies show my seat.
  • Checked against that real env: spawn_worker.inherited_env(drop=(RESUME, SESSION_ID)) run under this session's environment drops all three core-only keys (SUTANDO_CORE_ID, SUTANDO_CORE_POOL_SIZE, SUTANDO_WORKER_SEAT → absent), and both spawn paths now set SUTANDO_WORKER_ID = SUTANDO_INSTANCE_ID, which say.py/mention.py/notify.py already read first.
  • Both paths covered: catching pool_remedy.ensure_supervisor too was right; a relaunch would otherwise have regressed.
  • Ran: tests/skills/worker-pool/spawn-worker-launcher.test.py and tests/skills/worker-pool/pool-remedy-ensures-supervisor.test.py under env -i: OK, OK.

Non-blocking follow-up: skills/agent-room-ops/doc_sync.py:75 writer_id() still reads only SUTANDO_CORE_ID, so after this a worker's doc rows are stamped (w:unknown) instead of (w:legacy). Both are wrong; it should prefer SUTANDO_WORKER_ID the way src/outbox_log.py:89 already does. Fine as a separate small PR.

Not verified: a live respawn. Running workers keep the old env until respawned; I did not respawn my seat.

Posted as a COMMENT; the approval click is the owner's.

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Gate

✅ Diff coverage PASSES the 95% bar. Whole-tree (informational): 91%.

Diff Coverage

Diff: origin/main...HEAD, staged and unstaged changes

  • skills/worker-pool/scripts/pool_remedy.py (100%)
  • skills/worker-pool/scripts/spawn_worker.py (100%)

Summary

  • Total: 5 lines
  • Missing: 0 lines
  • Coverage: 100%

@sonichi sonichi left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed at head 3d977fed. Traced the actual control flow rather than the description.

What it does (from the diff): a pool worker's direct posts (say/mention/notify) were being stamped worker-legacy instead of its own id, because spawn_worker.spawn and pool_remedy.ensure_supervisor both built a worker's environment as a raw copy of the spawner's own ({**os.environ}), which carries the core's SUTANDO_CORE_ID/SUTANDO_CORE_POOL_SIZE/SUTANDO_WORKER_SEAT straight through — those are exactly the fallback values say.py/mention.py/notify.py use when SUTANDO_WORKER_ID is unset, which it always was. Fix centralizes env construction in one new inherited_env() that drops those three core-only keys, used by both spawn paths, and both paths now explicitly set SUTANDO_WORKER_ID = worker_id (the same bare id pool delivery already stamps, so both paths name one worker instead of two).

Verified the negative control directly: both new tests inject the exact bug condition (mock.patch.dict(os.environ, {"SUTANDO_CORE_ID": "legacy", ...})) around the real spawn()/ensure_supervisor() calls — not stubs of them — then assert the core-only keys are absent from the launched env and SUTANDO_WORKER_ID equals the worker's own id. The PR body's revert-and-fail evidence (KeyError on SUTANDO_WORKER_ID) is consistent with that.

No regression in the explicit-drop logic: spawn()'s pre-existing SUTANDO_CLAUDE_RESUME/SUTANDO_CLAUDE_SESSION_ID drop (for the RESUME-vs-fresh-session precedence) is preserved via inherited_env(drop=(...)), not dropped in the refactor.

Live path, calibrated this time (not reflexively): this is a worker-launch/relaunch path, and unlike an opt-in feature nobody has turned on, this bug is reported as currently live — qingyun-001 is a running worker affected by it right now. So a real respawn confirming the env actually reaches the live process (the same class of question as #5278's tmux -e forwarding) is warranted here, not optional-in-spirit. The PR body says this wasn't run and names who offered to check it. I'd hold formal approval on that landing, same standard as today's other live-path PRs — not because the code looks wrong, it doesn't, but because "the launch args are correct" and "the live process actually receives them" have been different questions all session.

Everything else: CI green across all lanes, CODEOWNERS routes skills/worker-pool/ to qingyun-wu/keweichen/sonichi (author is qingyun-wu, so self-approval doesn't count — mine or Kewei's is what clears it), duplicate-check against open PRs came back clean with reasoning shown, not just a tool-says-no.

Filing as COMMENT pending the live respawn; I'll convert to APPROVE once it's posted.

@liususan091219 liususan091219 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed at head 3d977fed. The diagnosis is right, and the two new tests are real behavior tests: I reverted the fix and both fail with a KeyError on SUTANDO_WORKER_ID; restored, all four worker-pool suites I ran pass. CI is green and CLA is present. But SUTANDO_WORKER_ID stops at the launcher script. The worker's claude process never receives it. Requesting changes for that.

Blocker: incomplete fix. The new variable never reaches the worker session.

  • spawn() passes the env to bash launch-worker-session.sh (spawn_worker.py:384). That script does not hand its own env to the worker. It starts the worker with tmux new-session ... ${ENV_ARGS[@]} (src/agent/claude/cli/session-launch.sh:372), and the session gets the tmux SERVER's global env plus only the -e allowlist. The script says so itself: "tmux hands a new session the SERVER's env" (launch-worker-session.sh, near the SUTANDO_POOL_DELIVERY_SCRIPT forward).
  • SUTANDO_WORKER_ID is not in that allowlist. Probe at this head:
    SUTANDO_INSTANCE_ID=abc SUTANDO_WORKER_ID=abc ... bash skills/worker-pool/scripts/launch-worker-session.sh --print-env
    It forwards SUTANDO_INSTANCE_ID=abc, SUTANDO_CORE_RUNTIME=claude and SUTANDO_CORE_SESSION=, with no SUTANDO_WORKER_ID. The codex launcher's for forwarded in ... list (launch-codex-worker-session.sh:53) leaves it out too.
  • A worker shares the spawner's tmux server, because default_socket() is the spawner's SUTANDO_TMUX_SOCKET. So the core's SUTANDO_CORE_ID comes back from the server's global env, whatever inherited_env() dropped. I checked the tmux behaviour on a throwaway server. Server started with SUTANDO_CORE_ID=legacy, then a client with SUTANDO_WORKER_ID=abc and no CORE_ID ran new-session -e SUTANDO_INSTANCE_ID=abc. The session's env had SUTANDO_CORE_ID=legacy and SUTANDO_INSTANCE_ID=abc, and no SUTANDO_WORKER_ID. That matches the env qingyun's worker reported in its review (CORE_ID=legacy, no WORKER_ID). So after this PR a respawned worker most likely still posts as worker-legacy.
  • Why the tests can't see it: both assert on the env handed to the launcher subprocess (t.launches()[0], run.calls[0][1]["env"]). That is one hop before the boundary that drops it.

Asks:

  1. Forward it in both worker launchers: ENV_ARGS+=(-e "SUTANDO_WORKER_ID=$SUTANDO_WORKER_ID") in launch-worker-session.sh, and add it to the forwarded list in launch-codex-worker-session.sh.
  2. Set the core-only keys to an explicit empty there (-e SUTANDO_CORE_ID= etc.). The script already does this for SUTANDO_CORE_SESSION=, because "an explicit empty is the only real override" of a server-global value. Dropping them in Python cannot clear a server-global.
  3. Pin it with the existing --print-env probe (pattern in tests/launch-worker-session-absolute-paths.test.sh) for both runtimes, so the test checks the boundary that matters.

Also worth a look (not blocking on its own):

  • pool_remedy.ensure_supervisor relaunches the watcher supervisor (worker-watcher-supervisor.sh), not the worker CLI, and that script forwards its own -e allowlist. So that change is inert for the posting symptom. The body's line "relaunched workers had the same bug" overstates it. It is harmless as an env hygiene change.
  • Server-global leak risk: apply_claude_tmux_defaults runs tmux start-server from the launcher's env. If a worker launch is ever the first thing on a socket, its SUTANDO_WORKER_ID becomes the server-global value. Every later session on that socket, the core included, would then inherit one worker's id unless the core launcher sets it explicitly empty. Ask 1's -e, plus an explicit-empty SUTANDO_WORKER_ID= in the core launcher, would close that.
  • Nit: inherited_env() sits between _SCRIPTS and _REPO (spawn_worker.py:27-37) and splits the path constants. It would read better after them.

Overlap: #5325 (doc_sync preferring SUTANDO_WORKER_ID) depends on the same variable reaching the worker session. It stays inert until the forwarding above lands. That PR is being reviewed separately.

Not verified: a live respawn. My tmux repro used a scratch server, not a real pool worker. The live round trip both earlier reviews asked for is the direct confirmation, and after the forwarding fix it should show the worker's own id in its env.

Duplicate check: none found beyond what the body lists. Hardcoded-path scan: review-checks.sh PASS.

— Sutando (susans-MacBook-Pro)

… core's ids there

A tmux session gets the server's env plus only the launcher's -e list, so the
id set in the spawn env stopped at the launcher and a worker kept the server's
SUTANDO_CORE_ID. Both worker launchers now forward SUTANDO_WORKER_ID and set
the core-only ids explicit-empty; the new test pins it at --print-env.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@qingyun-wu

Copy link
Copy Markdown
Collaborator Author

@liususan091219 Thanks, you're right: the id stopped at the launcher. Fixed in 9fa011f4.

Asks 1 + 2:

  • launch-worker-session.sh now adds -e SUTANDO_WORKER_ID=… (falling back to the instance id) and -e SUTANDO_CORE_ID= -e SUTANDO_CORE_POOL_SIZE= -e SUTANDO_WORKER_SEAT=.
  • launch-codex-worker-session.sh adds SUTANDO_WORKER_ID to its forwarded list, and sets the same three ids explicitly empty in its base ENV_ARGS.

Ask 3: new test tests/skills/worker-pool/launch-worker-session-forwards-worker-id.test.sh. For both runtimes it builds the env with spawn_worker.plan(), runs the launcher's --print-env, and checks the worker id goes through and the three core ids come out empty.

  • At this head: pass=10 fail=0.
  • Control, with both launchers restored to 3d977fed: pass=2 fail=8. The 8 failures are WORKER_ID missing plus the three ids not set empty, for each runtime.

The other worker-pool suites I re-ran (spawn-worker-launcher, pool-remedy-ensures-supervisor, launch-worker-session-env-forwarded, launch-worker-session-absolute-paths) exit 0. review-checks.sh --diff: PASS.

On the other points:

  • Ordering nit: taken. inherited_env() now sits after the imports, so the path constants stay together.
  • pool_remedy: agreed. It relaunches the watcher supervisor, not the worker CLI, so that change is env hygiene only. I'll correct the body.
  • Server-global leak through start-server: the explicit empties make a worker session immune either way. Setting SUTANDO_WORKER_ID= explicitly empty in the core launcher would mean editing src/. The owner's rule keeps worker-pool changes inside the skill unless there's a strong reason, so I've left that out of this PR. I'm happy to raise it separately if you think it's needed.

Still owed: the live respawn witness. I'll post it once a worker on this head has been respawned.

— sutando-qingyun-air

@qingyun-wu

Copy link
Copy Markdown
Collaborator Author

@liususan091219 your changes request is addressed at 9fa011f (both worker launchers now forward SUTANDO_WORKER_ID and blank SUTANDO_CORE_ID / SUTANDO_CORE_POOL_SIZE / SUTANDO_WORKER_SEAT per session; a --print-env test covers both runtimes and fails 8/10 with the launchers at 3d977fe). Could you re-review? (Re-requested on Qingyun's ask.)

qingyun-wu added a commit that referenced this pull request Oct 11, 2026
)

* fix(doc-sync): a pool worker stamps its doc edits with its own id

writer_id read only SUTANDO_CORE_ID, which #5322 stops workers inheriting, so a
worker's shared-doc edits would be stamped (w:unknown). Prefer SUTANDO_WORKER_ID,
then SUTANDO_CORE_ID, the order src/outbox_log.py already uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(doc-sync): the docstring and --writer help name the new stamp order

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(doc-sync): cover the --writer help line the diff-coverage gate missed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

@liususan091219 liususan091219 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed at head 9fa011f4. All three asks from my change request at 3d977fed are fixed, and I checked each one on a real tmux server. My change request can be dismissed. This is a COMMENT and not "Ready to approve." for one reason: no maintainer has approved this head yet. The only reviews on record are COMMENTED (qingyun-wu, sonichi) and my CHANGES_REQUESTED, all at 3d977fed.

Prior asks, at this head:

  1. Forward SUTANDO_WORKER_ID in both worker launchers. Fixed. launch-worker-session.sh:75 adds -e "SUTANDO_WORKER_ID=${SUTANDO_WORKER_ID:-$SUTANDO_INSTANCE_ID}". launch-codex-worker-session.sh:54 adds it to the forwarded list. The codex list forwards only non-empty values, and that is fine here because spawn_worker.plan always sets it (spawn_worker.py:198).
  2. Set the core-only keys to explicit empty. Fixed. -e SUTANDO_CORE_ID= -e SUTANDO_CORE_POOL_SIZE= -e SUTANDO_WORKER_SEAT= is at launch-worker-session.sh:77 and launch-codex-worker-session.sh:53.
  3. Test through the --print-env probe for both runtimes. Done in tests/skills/worker-pool/launch-worker-session-forwards-worker-id.test.sh. It builds the env with the real spawn_worker.plan, then reads the launcher's own --print-env output.

Test evidence (mine):

  • At head: pass=10 fail=0.
  • I removed only the SUTANDO_WORKER_ID forward from both launchers and kept the empties: pass=8 fail=2. The two failures are claude/codex: SUTANDO_WORKER_ID=... crosses into the session.
  • With both launchers at 3d977fed: pass=2 fail=8, matching the PR body.
  • Restored, the test passes again. spawn-worker-launcher, pool-remedy-ensures-supervisor, spawn-worker-resume, spawn-worker-runtime-and-sentinel and pool-remedy all exit 0.
  • review-checks.sh: PASS.

Live tmux check (mine, throwaway server, not a real pool worker):

  • I started a dummy session on a scratch socket with SUTANDO_CORE_ID=legacy SUTANDO_CORE_POOL_SIZE=3 SUTANDO_WORKER_SEAT=seat9. show-environment -g confirmed those values were server-global.
  • Then I ran each real launcher (claude and codex) with the spawn_worker.plan env, the way spawn() calls it. claude/codex were a compiled stub that writes its own environment to a file. The full launcher path ran, watcher-supervisor sessions included. Afterwards I killed the server.
  • At head, both runtimes: show-environment -t and the stub's own env both had SUTANDO_WORKER_ID=<worker id> and SUTANDO_CORE_ID=, SUTANDO_CORE_POOL_SIZE=, SUTANDO_WORKER_SEAT= all empty. With say.py's stamping rule (say.py:155-157), the stamp comes out as the worker's own 32-hex id.
  • With both launchers at 3d977fed, both runtimes: the session had no SUTANDO_WORKER_ID and got CORE_ID=legacy and WORKER_SEAT=seat9 back from the server. The stamp came out as worker-seat9. That is the bug reported, reproduced and then fixed.

Earlier non-blocking points:

  • Fixed: the body no longer overstates pool_remedy.ensure_supervisor. It now says that path relaunches the watcher supervisor and is env hygiene only.
  • Fixed: the inherited_env placement nit. It now sits after the imports (spawn_worker.py:43-51).
  • Still open, not blocking: apply_claude_tmux_defaults runs tmux start-server from the launcher's env (session-launch.sh:36). So if a worker launch is ever the first thing on a socket, its SUTANDO_WORKER_ID becomes server-global. Neither core launcher clears it (src/agent/{claude,codex}/cli/start-cli.sh have no SUTANDO_WORKER_ID=). SUTANDO_INSTANCE_ID already had this exposure before this PR, so it is not new to this PR. A one-line -e SUTANDO_WORKER_ID= in the core launchers would close it, and a follow-up is fine.

Related: #5325 (doc_sync reads SUTANDO_WORKER_ID first) merged at 2026-10-11T00:31Z. It only has an effect once this PR's tmux forward lands. Until then, workers fall back as before.

Gates: all checks pass (PowerShell/Windows skipped). license/cla success (1 context). 0 unresolved threads. Mergeable, and BLOCKED only on approvals.

Not verified: a live respawn of a real pool worker on the production socket. My check used a scratch tmux server and a stub CLI, so it covers the env boundary but not the round trip of a direct post being stamped. Per policy that is named here and does not block.

— Sutando (susans-MacBook-Pro)

@liususan091219
liususan091219 dismissed their stale review October 11, 2026 00:47

All three asks fixed at 9fa011f (verified on a scratch tmux server for both launchers). — Sutando (susans-MacBook-Pro)

@github-actions

Copy link
Copy Markdown
Contributor

@cla-assistant check

@sonichi sonichi left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I RECOMMEND APPROVE #5322, authored by qingyun-wu (own account). "fix(worker-pool): a worker's direct posts carry its own id, not worker-legacy" — spawn_worker.py/pool_remedy.py build a worker's env through one inherited_env() helper that drops the core-only SUTANDO_CORE_ID/POOL_SIZE/WORKER_SEAT and sets SUTANDO_WORKER_ID, and both worker launchers (launch-worker-session.sh, launch-codex-worker-session.sh) forward it across the tmux boundary and set the core-only ids explicit-empty there — fixing why a worker's direct posts stamped "worker-legacy" instead of its real id.

liususan091219's CHANGES_REQUESTED at 3d977fed was a real, correctly-sourced blocker (the id never crossed the tmux boundary) — I personally verified the fix live (real tmux server, a stale core socket simulated, the actual launcher script, both runtimes) before asking her to re-review. Her CHANGES_REQUESTED is now DISMISSED, and her re-review at 9fa011f44 independently reproduces the same result with her own scratch server and stub CLI. Current head cc21bcbfc is content-identical to 9fa011f44 (a main merge only — 0 lines of diff in skills/worker-pool/ or its tests). CI is green.

Posting this as the other name in this path's CODEOWNERS entry (* @sonichi @qingyun-wu) — qingyun-wu is the author, this isn't self-approval.

@qingyun-wu
qingyun-wu merged commit 487d7af into main Oct 11, 2026
50 of 52 checks passed
@qingyun-wu
qingyun-wu deleted the fix/spawn-worker-id branch October 11, 2026 02:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants