Skip to content

dsv41: a rank whose peer dies ends with exit 75 (peer link watch) - #40

Merged
Elevatormusic merged 18 commits into
dsv41-zigfrom
dsv41-zig-peerwatch
Oct 24, 2026
Merged

Elevatormusic merged 18 commits into
dsv41-zigfrom
dsv41-zig-peerwatch

Conversation

@Elevatormusic

@Elevatormusic Elevatormusic commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

What this changes

The release fault campaign found that a rank whose peer dies does not end (F3, severity 1). Two GB10 nodes at TP=2, the 2.8 bpw pack, TF_DS_EXIT_ON_FAULT=1:

  • Rank 1 killed (SIGKILL) while rank 0 is idle: rank 0 stays up, /health says 200, and the next request gets no reply in 120 s, no error and no exit 75. Rank 0 was still up 5 minutes later. Seen in 3 of 3 runs.
  • Rank 1 killed during a 4-stream decode: rank 0 does not exit in 180 s and the 4 live streams do not end.
  • Rank 0's threads during the idle hang: 3 running, 68 in futex_do_wait, 2 in ib_uverbs_event_read, 7 in poll_schedule_timeout; none in a TCP read. The round waits on the RDMA ring's arrival flags; no error completion came, so the abort word that every wait reads was never set.

This change:

  • peer_watch.zig (new): a thread that polls the ranks' TCP links for the peer's end (POLLRDHUP, POLLHUP, POLLERR). It reads nothing. When a peer is gone and this rank does not end (an idle rank, or a round whose waits got no error completion), it waits 1 s (for an orderly stop), aborts every RDMA ring (every GPU wait gives up, so a live round fails through the lane host's fault path and its requests get the error), and with TF_DS_EXIT_ON_FAULT=1 ends the process with exit 75 after TF_DS_EXIT_GRACE plus 2 s.

  • Watch.end(how): the one teardown. Every way a rank ends calls it before Model.close frees the links and rings: rank 0's Lanes.deinit, a follower's done frame or error, and a start that fails after Lanes.init. In order: (1) on an error, abort every RDMA ring (TP=2's ring, TP=4's three, or the neighbor gather's two); (2) stop the watch thread and join it, so no thread reads the rings after it returns; (3) free the watch (the caller frees the rings next); (4) on an error with a peer's link gone (the thread saw it, or a poll that does not wait finds it now) and TF_DS_EXIT_ON_FAULT=1, exit 75 with _exit, before Model.close can wait on the gone rank. It returns orderly, failed (an error with every peer up) or peer_fault.

  • lanes.zig: rank 0 watches its followers' links from Lanes.init. At teardown it sends the done frame, then calls end(.done) when the frame went out and no link end was seen before it, else end(.failed). A follower watches its link to rank 0 while it follows: end(.done) on the done frame, end(.failed) on any error. If the watch cannot start, the ranks run as before.

  • model.zig: Model.rdmaRings is the one list of every RDMA ring (TP=2's ring, TP=4's three, the neighbor gather's two). The watch aborts that list, and Model.synchronize checks it after each sync: work that waited on an aborted ring fails with RdmaTransportFailed instead of returning results from stale peer slots (before, only the neighbor gather was checked).

  • native.zig: a start that fails after Lanes.init calls endWatch(.failed) before the model closes.

  • link.zig: a keepalive on the link (10 s idle, then 3 probes 3 s apart) and TCP_USER_TIMEOUT 20 s (sent data that is not acknowledged), so a peer whose node vanished (no FIN) is found, idle or during a round (not tested on hardware; see the known gaps). Sends use MSG_NOSIGNAL: a send to a gone follower fails with PeerDown, not a SIGPIPE that ends rank 0 of tf-dsv41-lanes with no exit 75.

  • Review fixes (a code review while the Codex review stalled): a requested stop (the server's SIGTERM, stop_requested) ends rank 0's watch orderly even when a follower went away during the stop, so a clean stop exits 0, not 75; Watch.start takes the exit grace (faultGrace() in the engine, null in the tests), so an exported TF_DS_EXIT_ON_FAULT cannot end the test runner; the ring abort comes before any log, and every watch log is written only when stderr takes it at once, so a blocked stderr cannot hold the abort or the exit; faulted() also polls the links, so a FIN that the watch thread has not seen yet still makes rank 0's teardown a peer fault; POLLNVAL counts as a link end and a failed poll sleeps 200 ms (no spin); with TF_DS_EXIT_ON_FAULT=1, a watch that cannot start fails the start; the follower starts its watch after its kept prompt states, so on an error the rings are aborted before their device memory is freed.

The bounded exit needs TF_DS_EXIT_ON_FAULT=1 on both ranks (the release launch sets it). Without it, the watch still aborts the rings, so rank 0 stays up and every request fails with an error instead of hanging; there is no exit 75, and a follower's Model.close after an error has no timer.

Known gaps:

  • The startup phase is not watched: weight load, the NCCL bootstrap and the ring exchange run before the watch starts.
  • On the TP=4 split, ranks 1-3 watch only their link to rank 0, not their links to each other.
  • A node loss (no FIN) is not tested on hardware. With TCP_USER_TIMEOUT 20 s and the keepalive probes, the exit is expected about 22-30 s after a power loss, plus the grace.

Not changed: NCCL is not aborted from the watch thread (ncclCommAbort there could race the main thread's use of the comm); a prefill that waits in NCCL on a gone rank ends with the process exit.

Receipt

  • Environment: TensorFold dsv41-zig plus this branch, in dsv41-zig-dev @ cc9be34e (with dsv41 Zig: load the EXL3 2.8 bpw pack (bf16 router weights and confidence head, one source a tensor) #38 and dsv41: special-token text in request strings is plain text #39). Zig 0.17.0. Two NVIDIA GB10 nodes at TP=2. DeepSeek-V4.1-Flash-1017 EXL3 2.8 bpw.
  • New tests (peer_watch.zig, loopback links, one for each teardown path): a failed start with the peer up ends failed; an idle follower whose rank 0 dies: the watch acts, then end finds peer_fault; a sending leader whose follower dies gets PeerDown (no SIGPIPE) and end finds peer_fault; a follower that gets PeerDown calls end before the watch acts and still gets peer_fault; a done frame, then the peer's close, ends orderly.
  • zig build test-cuda-host at dsv41-zig-dev @ 87cf5678 (this branch @ 0e92350a): rc 0.
  • Robustness window on that image (2026-10-22 14:08-14:20Z, TF_DS_EXIT_ON_FAULT=1): 4.5 (SIGKILL to rank 1 during a 4-stream decode): 1 round fault on rank 0, the 4 streams end with the error PeerDown, rank 0 exits 75 in 7 s. 4.7 (SIGKILL to rank 1 when idle): rank 0 exits 75 in 8 s. 4.5b (SIGKILL to rank 0 during decode): rank 1 exits 75 in 1 s. Before this change, 4.5 and 4.7 hung in 4 of 4 runs. The clean stops still pass: 4.4a (SIGTERM during a 256K prefill: exit 0 in 6 s, the request ends cancelled), 4.4b (SIGTERM during decode: exit 0 in 5 s), 4.6 (restart: 30 s to a reply).
  • zig build test-cuda-host at dsv41-zig-dev @ d58d25cc (this branch @ b862c70d): rc 0.
  • Robustness window on that image (tensorfold-dsv41-zig:d58d25cc, 2026-10-22 20:18-20:29Z, TF_DS_EXIT_ON_FAULT=1): 4.5 (SIGKILL to rank 1 during a 4-stream decode): 1 round fault, the 4 streams end with PeerDown, rank 0 exits 75 in 7 s; 4.7 (rank 1 killed when idle): rank 0 exits 75 in 8 s; 4.5b (rank 0 killed during decode): rank 1 exits 75 in 2 s; 4.4a (SIGTERM in a 256K prefill: exit 0 in 6 s, request cancelled), 4.4b (SIGTERM during decode: exit 0 in 5 s, streams cancelled) and 4.6 (restart: 33 s to a reply) pass. The same 6 cases also passed on 952398c5 (before TCP_USER_TIMEOUT and the ring check).
  • Decode on that image (kit_bench, median of 3): 85.5 tok/s at 1 stream, 123.1 tok/s at 4 streams; the release campaign's numbers before this PR were 85.3 and 123.0.
  • zig build test-cuda-host at dsv41-zig-dev @ cc9be34e (this branch @ 8e7d31f5, with the review fixes and the draft-pass ring check): rc 0.
  • Robustness window on that image (tensorfold-dsv41-zig:cc9be34e, 2026-10-23 03:28-03:37Z, TF_DS_EXIT_ON_FAULT=1): 4.5: 1 round fault, the 4 streams end with RdmaTransportFailed (the ring check now fires before the link error), rank 0 exits 75 in 7 s; 4.7: rank 0 exits 75 in 9 s; 4.5b: rank 1 exits 75 in 1 s; 4.4a (exit 0 in 6 s, request cancelled), 4.4b (exit 0 in 4 s, streams cancelled) and 4.6 (33 s to a reply) pass. No decode check on this image (the change after d58d25cc adds one ring-state read per pass).

Checklist

  • Every token still goes through the lane rounds.
  • No precision traded for speed.
  • No GPU kernel change.
  • Prompt processing is no slower than the last release: the watch thread polls with a 200 ms timeout and takes no lock on the round's path.
  • Platforms: CUDA on GB10 at TP=2. Metal not affected (dsv41 is CUDA only).
  • New tests: the robustness cases 4.5 and 4.7 hung before the change and exit 75 after it.
  • Comments and docstrings are one line (the CI lean check passes).

When rank 1 died while rank 0 was idle, rank 0 stayed up: /health said
200 and the next request hung without an error or exit. When rank 1 died
during a decode, the live streams hung too: the round's GPU waits on the
RDMA ring got no error completion, so the abort word was never set
(release fault F3).

- peer_watch.zig: a thread that polls the ranks' TCP links for the
  peer's end (POLLRDHUP, HUP, ERR; it reads nothing). On a peer that is
  gone without a done frame, it aborts the RDMA ring (Ring.abort: every
  wait gives up, so a live round fails and its requests get the error)
  and, with TF_DS_EXIT_ON_FAULT=1, ends the process with exit 75 after
  TF_DS_EXIT_GRACE plus 2 s (the lane host's own fault exit comes first
  when a round ran). It waits 1 s first, for rank 0's done frame and
  the close that follows it.
- link.zig: a keepalive (10 s idle, 3 probes 3 s apart), so a peer
  whose node vanished shows within about 20 s.
- lanes.zig: rank 0 watches its followers' links from Lanes.init and
  stops the watch before its done frame; a follower watches its link to
  rank 0 while it follows.
@Elevatormusic Elevatormusic added the type: fix a correction after review findings or a bug fix label Oct 22, 2026
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-24T19:18:11.820914Z 839109f Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a6dd239777

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
An error unwind (rank 0's link gone while the follower reads it) left through a deferred stop, which marked the watch orderly and cancelled its exit 75. The watch now stays running on an error unwind, so its exit 75 still ends the process if the normal exit hangs on kernels that wait on the gone rank.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a6dd239777

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 31466020f1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
…ails

World 4 keeps its rings in rdma_rings (all4, col, pair) or neighbor_gather (first, second), not in ring, so a dead peer aborted no GPU wait there. The watch now takes every ring the rank's waits read. A start that fails after Lanes.init (a bad TF_DS_FIX_K, a vision load error) closed the model with the watch still polling its links and holding its rings; native.open now stops the watch on that path.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 84a0e16a22

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
…eer watch

Model.close frees the RDMA rings after follow() returns an error, while the
watch can still abort them. The follower now calls Watch.release on the
error path: it aborts the rings (so close does not wait on a gone peer) and
forgets them under a lock, and keeps the exit 75 armed.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 56b1a68d68

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
Lanes.deinit stopped the watch before the done frame on every teardown, so
an error teardown after a follower died marked the loss orderly and cancelled
the exit 75. Now the watch stops only after a done frame that goes out with no
link end seen. Otherwise rank 0 releases the rings from the watch and holds
(at most the grace plus 4 s) for the watch's exit 75.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bbb861b7af

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/lanes.zig Outdated
Every way a rank ends now calls Watch.end before the model frees its links
and rings: rank 0's Lanes.deinit, a follower's done frame or error, and a
start that fails after Lanes.init. On an error it aborts every RDMA ring
(TP=2 and TP=4), stops and joins the watch thread, frees the watch, and,
when a peer's link is gone and TF_DS_EXIT_ON_FAULT=1, exits 75 before
Model.close. Watch.stop, release and hold are gone.

Link sends use MSG_NOSIGNAL: a send to a gone follower fails with PeerDown
instead of a SIGPIPE that ends rank 0 with no exit 75.

Tests: a failed start with the peer up, an idle follower whose rank 0 dies,
a sending leader whose follower dies, a follower that gets PeerDown before
the watch acts, and a done frame then the peer's close.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5a339278f9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/link.zig Outdated
A keepalive only covers an idle link. When a peer's node loses power while
this rank has sent data that is not acknowledged, the kernel retransmits for
many minutes and the peer watch gets no POLLERR. TCP_USER_TIMEOUT at 20 s
(the keepalive's bound) ends such a link with ETIMEDOUT. Test: both ends of
a loopback link have the timeout and the keepalive.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6749974bb1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/peer_watch.zig
…er's

When the peer watch aborts a ring while a round waits in synchronize, the
collect kernels leave their waits and can copy stale peer slots. synchronize
checked only the neighbor gather, so a TP=2 or TP=4 round could return its
results. It now checks every ring (Model.rdmaRings, the same list the watch
aborts) and fails with RdmaTransportFailed. Test: rdma.anyFailed finds an
aborted ring.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

1 similar comment
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

…, POLLNVAL)

- A requested stop (the server's SIGTERM) ends rank 0's watch orderly even
  when a follower went away during it, so a clean stop exits 0, not 75.
- Watch.start takes the exit grace (faultGrace() in the engine, null in
  tests), so an exported TF_DS_EXIT_ON_FAULT cannot end the test runner.
- The abort comes before any log, and every watch log is written only when
  stderr takes it at once, so a blocked stderr cannot hold the abort or the
  exit 75.
- faulted() also polls the links now: a FIN that the watch thread has not
  seen yet still makes rank 0's teardown a peer fault.
- POLLNVAL counts as a link end, and a failed poll sleeps 200 ms (no spin).
  With TF_DS_EXIT_ON_FAULT=1 a watch that cannot start fails the start.
- The follower starts its watch after its kept states, so on an error the
  rings are aborted (and exit 75 comes) before their device memory is freed.

Tests: POLLNVAL on a closed pipe end; the exit comes from Watch.start's grace
alone, with TF_DS_EXIT_ON_FAULT=1 exported.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f4012d8c65

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/model.zig
Model.pass returns the drafter's drafts after the drafter syncs its own
stream (draft.zig), so the ring check in synchronize never ran for it. A
ring aborted during a draft pass now fails the pass (RdmaTransportFailed)
before its drafts are used. The check is one function, ringsOk, for both.
@Elevatormusic

Copy link
Copy Markdown
Owner Author

Review fixes (a code review while the Codex review stalled), in f4012d8, cd5970c and 8e7d31f:

  • A requested stop (the server's SIGTERM) ends rank 0's watch orderly even when a follower went away during it, so a clean stop exits 0, not 75.
  • Watch.start takes the exit grace (faultGrace() in the engine, null in tests), so an exported TF_DS_EXIT_ON_FAULT cannot end the test runner. A test checks this with the variable set.
  • The ring abort comes before any log; every watch log is written only when stderr takes it at once, so a blocked stderr cannot hold the abort or the exit 75.
  • faulted() also polls the links, so a FIN that the watch thread has not seen yet still makes rank 0's teardown a peer fault.
  • POLLNVAL counts as a link end and a failed poll sleeps 200 ms (no spin); a test closes a pipe end. With TF_DS_EXIT_ON_FAULT=1, a watch that cannot start fails the start.
  • The follower starts its watch after its kept prompt states, so on an error its rings are aborted before their device memory is freed.
  • The draft pass gets the ring check too (ringsOk, shared with synchronize).

The description now states that the bounded exit needs TF_DS_EXIT_ON_FAULT=1, and lists the known gaps (startup not watched, TP=4 follower-to-follower links not watched, node loss not tested). Host tests at dsv41-zig-dev @ cc9be34: rc 0. The robustness window on that image is queued.

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8e7d31f516

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread zig/src/families/dsv41/peer_watch.zig Outdated
…oll snapshot)

note() wrote to fd 2 after a poll(POLLOUT) snapshot. Another thread can fill
the pipe between the poll and the write, so the write could block after the
ring abort and before the exit 75. Watch.start now opens /proc/self/fd/2
again with O_NONBLOCK (a new open file description, so fd 2 stays blocking
for the other threads); note writes only through it, and a socket stderr
gets send with MSG_DONTWAIT. A new test fills a pipe through the copy and
checks that the pipe's own descriptor stays blocking.
…g-peerwatch

# Conflicts:
#	zig/src/families/dsv41/lanes.zig
@Elevatormusic
Elevatormusic changed the base branch from dsv41-zig to dsv41-zig-snapfix October 24, 2026 18:39
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 69fa59fa7a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Base automatically changed from dsv41-zig-snapfix to dsv41-zig October 24, 2026 19:15
@Elevatormusic

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: 839109fbd4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@Elevatormusic
Elevatormusic merged commit 49cdef4 into dsv41-zig Oct 24, 2026
6 checks passed
@Elevatormusic
Elevatormusic deleted the dsv41-zig-peerwatch branch October 24, 2026 19:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: fix a correction after review findings or a bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant