Skip to content

feat(j5): the peering dialog sets up poll mode for you - #406

Merged
Jacksondr5 merged 1 commit into
j5/peer-poll-pollerfrom
j5/peer-poll-clients
Oct 8, 2026
Merged

Jacksondr5 merged 1 commit into
j5/peer-poll-pollerfrom
j5/peer-poll-clients

Conversation

@Jacksondr5

@Jacksondr5 Jacksondr5 commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Stack 6/8. Depends on #405.

Problem

Peering asked the person to type both addresses and a name for each side, and assumed each server could reach the other. With poll mode in place (#404, #405), the dialog can check how the two servers actually reach each other and recommend a setup. Part of #399.

What changed

  • Reachability routes. Two admin routes support the check. Both need access:write.

    • GET /api/j5/a2a/peers/addresses lists the origins a server might be reached at. A server that listens on loopback only lists none.
    • POST /api/j5/a2a/peers/probe fetches another server's public identity at one origin, within 4 s. It follows no redirect, and returns who answered or the error verbatim.
  • Descriptor. It now publishes j5PeerPoll.

  • Recommendation. client-runtime's peering module turns each server's descriptor (its version, j5PeerPoll and run mode) and the two probes into a setup:

    • poll without asking when one direction can't connect;
    • send directly when both connect and both run as services;
    • ask one question, defaulting to storing, when a side runs in the desktop app, was started by hand, or couldn't be tested.
    • A server too old for poll mode gets only "update J5 there".
  • Dialog. It shows:

    • the check;
    • the question, when there is one;
    • in plain lines, how messages will travel;
    • only the address that will be used;
    • "Set up differently" for the manual form.

    A server that couldn't list its addresses says why, instead of a guess about its network. When the check couldn't test a direction, it says so; only directions that were tried and failed are called unreachable. "How does this work?" links to j5.codes/peering (feat(marketing): explain peering at j5.codes/peering #422).

  • Peer rows in Settings → Connections.

    • Each row says how messages travel.
    • For a pair that polls, it shows online or offline and the backlog. For a direct pair, it shows the session.
    • Every row shows its last error. The list refreshes while Connections stays open.
    • A poller whose credential was rejected gets Peer again, which opens the dialog with that server chosen. A pair already peered is peered again the way it is set up: its direction and recorded addresses stand, shown read-only, and only the credentials are new. Changing how messages travel is removing the peer first. A protocol mismatch only names the server to update.
    • A poller that stopped reads "Polling stopped" and makes no claim about its last poll. Online and offline are measured against the current time.
  • Poller. Each time it stops (rejected credential, or a 403/409 refusal), and each time a protocol mismatch is retried, it records Polling stopped: <reason> as the peer's last error. That mark is how the CLI and the rows know polling stopped. Failures it retries carry no mark. The mark stays until the poller's next successful poll or the peer is recorded again; other errors and successes don't erase it, and only a newer stop replaces it.

  • CLI. j5 a2a peer list prints the same health, using one online rule that now lives in contracts. A stopped poller prints polling stopped: <reason>, and a peer this server polls has no inbound: field, since it never holds a session here.

  • Runbook. It covers the poll pairing and the peer list's health, and says to restart J5 after renaming a machine.

UI changes

The introduction dialog is rebuilt to the approved mockup (plans/peering-onboarding-mockup.html), and the peer rows gain their status and Peer again.

Captured from real pairs: the stack's build served twice on one host, Local on :7708 and Remote on :7808, peered through this dialog in poll mode. Both servers run on one machine, so both are named digeng-j5code-01; on two machines each line names a different server.

  • They were taken on earlier builds of this PR, before it was rebased onto j5/main b3a45dc047: the rows and the remove confirmation at 8841511873, the dialog shots at 743054e36f.
  • Nothing since changes a state shown: later commits only change how a stopped poller is recognised. The rebase changed none of the peering dialog's or rows' files; main's branding updates only reword "T3 Code" to "J5 Code" elsewhere in Settings.

Before (j5/main): the manual form and a push peer row.

Add peer Peer servers

After: the check found both directions reachable and Remote started by hand, so it asks one question, with storing as the default.

Recommended setup Set up differently

A pair that knows only loopback addresses for itself: the check says it couldn't test either direction.

The peer rows on both servers. Then Remote is stopped with a message waiting, and finally Local removes the peer and Remote finds its credential rejected.

Local (stores), online Remote (polls), online
Local, Remote stopped Remote, credential rejected

Removing a peer:

j5 a2a peer list on Remote at that point:

daf8a5cf-…	digeng-j5code-01	this server polls it at http://172.17.0.1:7708	2026-10-03T01:41:58.036Z	our credential expires 2036-09-30T01:48:06.817Z	polling stopped: digeng-j5code-01 rejected this server's credential (HTTP 401). Peer again to issue a new one.

Upstream impact

  • apps/server/src/environment/ServerEnvironment.ts and its test change one line each, reporting j5PeerPoll: true. They are recorded in FORK.md case 48, and their file-table rows now read "34, 48".
  • Case 48 also gains the reachability routes and peerReachability.ts. That file imports upstream's host helpers from startupAccess.ts without changing them.

Checklist

  • One concern: the description has no "also"
  • Tests cover the changed behavior:
    • client-runtime peering: the recommendation for each run mode and probe outcome, address errors, the poll introduction;
    • web peeringCheck: a failed address list is reported as its error; an untested direction is never called unreachable;
    • PeerHttp: route scopes, no loopback addresses, malformed probes refused before any fetch;
    • PeerRegistryService: a real-fetch redirect is never followed; a poller's stop survives other errors and successes until it polls again;
    • CLI: the health text, a stopped poller's reason shown once, and no inbound: for a poll record;
    • PeerPoller: every stop (401, 403, 409) and a mismatch are recorded as stopped, and a retried 502 is not;
    • contracts peerPoll: the online rule, the stop mark, and credential rejection only from a marked stop.
  • UI changes: before and after screenshots above, from a real poll-mode pair
  • Upstream-owned files: recorded in FORK.md (case text and file-table rows)
  • Upstream product: no change to what upstream's product does; the descriptor gains an optional J5 capability flag
  • Surfaces: the web dialog and Settings rows, the CLI, the server routes. No mobile surface for peering, as the plan scopes it.
  • Docs: definitions in docs(j5): define peering poll mode #400; adds the runbook's poll sections

Built by Claude Opus 5.5 (1M context) in Claude Code, as the builder seat of a J5 crew. Reviewer-passed.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added guided peering setup that checks server reachability, recommends connection options, and supports polling-based connections.
    • Peer lists now show connection mode, polling health, queued messages, and relevant errors. Credential-rejected peers can be set up again.
    • Added peer address discovery and connection checks to support peering setup.
  • Documentation
    • Expanded peering guidance with polling setup, connection modes, status details, and retry steps.

@vercel

vercel Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
j5-code Ready Ready Preview Oct 8, 2026 2:51am UTC

Request Review

@github-actions github-actions Bot added size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Oct 2, 2026
@Jacksondr5
Jacksondr5 added this pull request to stack #413 October 3, 2026 00:35
@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: Jacksondr5/j5code/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 6fa539f7-face-4f41-a511-6d97ff5899c3
📥 Commits

Reviewing files that changed from the base of the PR and between ef31e49 and de10d34.

📒 Files selected for processing (26)
  • FORK.md
  • apps/server/src/environment/ServerEnvironment.test.ts
  • apps/server/src/environment/ServerEnvironment.ts
  • apps/server/src/j5/a2a/PeerHttp.test.ts
  • apps/server/src/j5/a2a/PeerHttp.ts
  • apps/server/src/j5/a2a/PeerPoller.test.ts
  • apps/server/src/j5/a2a/PeerPoller.ts
  • apps/server/src/j5/a2a/PeerRegistryService.test.ts
  • apps/server/src/j5/a2a/PeerRegistryService.ts
  • apps/server/src/j5/a2a/peerReachability.test.ts
  • apps/server/src/j5/a2a/peerReachability.ts
  • apps/server/src/j5/cli/a2a.test.ts
  • apps/server/src/j5/cli/a2a.ts
  • apps/web/src/j5/peering/PeerIntroductionDialog.tsx
  • apps/web/src/j5/peering/PeerServersSettings.tsx
  • apps/web/src/j5/peering/peeringCheck.test.ts
  • apps/web/src/j5/peering/peeringCheck.ts
  • apps/web/src/j5/peering/peeringClient.ts
  • docs/j5/runbooks/peering.md
  • packages/client-runtime/src/j5/http.ts
  • packages/client-runtime/src/j5/peering.test.ts
  • packages/client-runtime/src/j5/peering.ts
  • packages/client-runtime/src/j5/state.ts
  • packages/contracts/src/j5.ts
  • packages/contracts/src/j5/peerPoll.test.ts
  • packages/contracts/src/j5/peerPoll.ts

Included review availability: This review used your included allowance. 1 included review remains after this review. Your included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.


📝 Walkthrough

Walkthrough

The changes add peer address discovery and identity probing, polling-state tracking, and polling-based peering setup. The web dialog and CLI now present connection choices and peer status, and the runbook documents direct and polling setup.

Changes

Peer reachability and polling

Layer / File(s) Summary
Peer capability and polling contracts
packages/contracts/src/j5*, apps/server/src/environment/ServerEnvironment*, FORK.md
Contracts define peer address and probe responses and polling-state helpers. Server descriptors advertise j5PeerPoll.
Server discovery, probing, and poll errors
apps/server/src/j5/a2a/PeerHttp*, apps/server/src/j5/a2a/PeerRegistryService*, apps/server/src/j5/a2a/peerReachability*, apps/server/src/j5/a2a/PeerPoller*
The server adds write-authorized address and probe routes. It derives origins from configuration and network interfaces, and probes peer identity with redirects disabled and a four-second timeout. Poll-stop errors persist against ordinary error updates, and poll timestamps use the time poll headers arrive.
Reachability checks and polling setup
packages/client-runtime/src/j5/{http.ts,state.ts,peering.ts,peering.test.ts}, apps/web/src/j5/peering/{peeringClient.ts,peeringCheck.ts,peeringCheck.test.ts}
Client code retrieves addresses, probes candidate origins, classifies reachability, recommends connection choices, and sequences polling setup. Tests cover reachability, recommendations, recorded choices, and setup results.
Peering dialog and status displays
apps/web/src/j5/peering/{PeerIntroductionDialog.tsx,PeerServersSettings.tsx}, apps/server/src/j5/cli/a2a*, docs/j5/runbooks/peering.md
The dialog presents reachability checks, connection choices, and setup steps. Peer settings and CLI output show link mode, polling health, queued messages, and applicable errors. The runbook describes direct and polling setup.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant PeerIntroductionDialog
  participant runPeeringCheck
  participant peeringClient
  participant PeerHttp
  participant PeerRegistryService
  PeerIntroductionDialog->>runPeeringCheck: check both peer directions
  runPeeringCheck->>peeringClient: list addresses and probe candidate origins
  peeringClient->>PeerHttp: call addresses and probe routes
  PeerHttp->>PeerRegistryService: compute origins and probe identity
  PeerRegistryService-->>PeerHttp: return origins or probe result
  PeerHttp-->>peeringClient: return route responses
  peeringClient-->>runPeeringCheck: return addresses and probe results
  runPeeringCheck-->>PeerIntroductionDialog: return directional reachability
Loading

Suggested reviewers: bryantderosier

Merge Risk: ⚪ Minimal · up to de10d

This change adds reachability checks and poll-mode setup to the peering dialog, and shows peer health in Settings and the CLI. No concrete merge-blocking defect remains.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.89% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 19 functions across 24 files. (2 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: the J5 peering dialog now sets up poll mode automatically.
Description check ✅ Passed The description is complete and matches the template. It explains the problem, implementation, UI changes, upstream impact, tests, documentation, and execution context. It includes the required screen…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 57.89% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 19 functions across 24 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@bryantderosier bryantderosier 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.

Had GPT 6.1 Sol and Claude Opus 5.5 review the whole peer-poll stack (#400 → #408) together, so anything flagged here was checked against the top of the stack (ede1490c47a6) first. If a later PR fixes it, I say so instead of asking for a change.

The new probe and addresses endpoints need access:write, send no credential, don't follow redirects, and time out at 4s. So the probe doesn't open up anything meaningful beyond what add already does. Relay and tunnel are fine, because the client URL is only a hint and gets verified against the answering environment id. Mobile not having a peering UI matches cross-device.md:93. The ServerEnvironment.ts edit is recorded in FORK.md.

The things I'd fix are in the dialog:

  1. Peer again doesn't keep the existing direction or origin (medium). It reruns a fresh recommendation, so repairing from the other side of a two-desktop pair fails with peer_link_mode_conflict. A changed origin fails with PeerOriginConflictError, which tells the user to pass --replace-origin, and they can't do that from the dialog. Both reviewers found this one.
  2. "Too old" shows up before the other server is even connected (low).
  3. The check effect reruns on every environment refresh (low, perf).

The rest are suggestions and nits: probe error hygiene, IPv6 addresses offered on an IPv4-only bind, a test loop that checks nothing, and a misplaced doc comment.

key={peer.environmentId}
peer={peer}
primaryEnvironmentId={primaryEnvironmentId}
onPeerAgain={() => openDialog(EnvironmentId.make(peer.environmentId))}

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.

Needs a fix (medium): Peer again only passes the other environment's id, so the dialog reruns recommendPeering from scratch (PeerIntroductionDialog.tsx:115-116, :149-174, :203) and ignores what's recorded. Example: pair two desktop servers from A and take the default, so B polls A. Revoke the credential, then click Peer again on B's stopped row. Now B is local and A is remote, and the desktop-first tie-break (client-runtime/src/j5/peering.ts:317-336) picks A as the poller. It then tries to issue a store credential on B, which already records A as poll, and PeerHttp.ts:295-300 refuses with peer_link_mode_conflict. If the fresh check picks a different origin, you get PeerOriginConflictError asking for --replace-origin, which a dialog user can't pass. This is the UI's only repair path for a rejected credential.

Fix: when re-peering a recorded peer, start from its recorded link mode, direction and origin, and only rotate the credential. Leave mode changes to remove-and-repeer. Worth a test that starts the repair from each side of a two-desktop pair. Both reviewers found this.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: Peer again, or Add peer on a pair that's already peered, now starts from each server's record of the other (recordedPeeringChoice). It keeps the link mode, direction and origin, shown read-only, and only issues new credentials. Edits can only fill an address neither record holds (repeeringChoice). Changing the mode is remove-and-repeer, and the dialog says so. Tests in client-runtime peering.test.ts: a two-desktop pair repaired from each side, plus edits that try to move a recorded origin. (40408cd)

origin: otherOrigin.trim(),
};
const remoteLabel = remote?.label ?? "the other server";
: !bothSupportPoll

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.

Needs a fix (low): too-old gets decided even when the remote has no descriptor yet (peeringCheck.ts:20-21), so supportsPoll is false. You get "X is running J5 , which is too old" right next to "Connect to X first", with only a Close button. I'd only decide too-old once a descriptor exists, for example otherReady or other.serverConfig !== null.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: too-old is decided only once both descriptors exist. (40408cd)

return () => {
cancelled = true;
};
}, [checkKey, local, remote, primaryBaseUrl, otherBaseUrl]);

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.

Needs a fix (low, perf): this effect depends on the local/remote objects, which get rebuilt on every presentationById change (state/environments.ts:46-52). So any environment's connection or config refresh reruns two address lists plus N probes on both servers. Stale results are dropped, but the work still happens. I'd depend on checkKey and the base URLs, or memoize on primitive fields.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: the check effect is keyed on checkKey and the two base URLs only. (40408cd)

reason: `answered HTTP ${String(response.status)}`,
});
}
const identity = yield* response.json.pipe(Effect.flatMap(decodePublicIdentity));

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.

Suggestion (security): a failed probe returns reasonOf(cause) word for word, and decode errors can echo fragments of the probed body. response.json also reads a body of any size, and identity.label (:703) skips the reportedLabel bound. I'd map decode failures to a fixed phrase, apply reportedLabel, and cap the body.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: the probe body is read with a 64 KiB cap. A body that isn't an identity, or is too large, gets a fixed phrase ("answered, but not as a J5 server") instead of the decode error, and the label goes through reportedLabel. Tested in PeerRegistryService.test.ts with hostile, echoing and huge answers. (40408cd)

if (input.host !== undefined && !isWildcardHost(input.host)) return [origin(input.host)];
return Object.values(input.interfaces)
.flatMap((entries) => entries ?? [])
.filter((entry) => !entry.internal && !entry.address.startsWith("fe80:"))

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.

Nit: with a 0.0.0.0 (IPv4-only) bind this still offers IPv6 addresses, which can only fail and clutter the error list.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: a 0.0.0.0 bind offers IPv4 addresses only. Tested in peerReachability.test.ts. (40408cd)

Comment thread apps/server/src/j5/a2a/PeerHttp.test.ts Outdated
const addresses = await admin.handler(get(J5_PEER_API_PATHS.addresses));
assert.equal(addresses.status, 200);
const { origins } = (await addresses.json()) as { origins: ReadonlyArray<string> };
for (const origin of origins) {

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.

Nit: this "not a loopback" loop doesn't check anything. The test layer's host is undefined, so origins is []. The real coverage is in peerReachability.test.ts, so I'd either assert [] here or drop the loop.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: it now asserts { origins: [] }. (40408cd)

Comment thread apps/web/src/j5/peering/peeringCheck.ts Outdated

const errorText = (cause: unknown) => (cause instanceof Error ? cause.message : String(cause));

/** One direction: `from` fetches `to`'s public identity at each address `to` might be reached at. */

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.

Nit: this doc comment is sitting above OfferedAddresses, but it's describing reach.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed: the comment now sits above reach. (40408cd)

@bryantderosier bryantderosier 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.

Approving. Two dialog dead-ends worth a follow-up ticket:

  • A record that only exists on the other server locks the mode, and there's no way to clear it from here. If only the remote still has a record of this server, PeerIntroductionDialog takes the mode from that record (recordedPeeringChoice), hides "Set up differently", and says "remove the peer, then peer again". But this server has no row to remove. Example: A polls B, the person removes B on A while this client isn't connected to B, so B keeps its store record of A. Later they want B to send to A directly, and Add peer on A forces "A polls B" with no manual form. The fix is on B (its own UI or the CLI), and the dialog never says so. I'd either name the server whose record is pinning the mode or offer to remove that remote record from the dialog.
  • Peer again opens an empty dialog when the peer isn't saved in this client. PeerServersSettings.tsx passes peer.environmentId whatever its connection state. If that server isn't one of this client's environments, other resolves to null and you get "Choose a remote server" with Peer disabled and no "Connect to X first" or "Add another environment" hint, since that hint only shows when there are no candidates at all. I'd say "add or connect to this server first" in that case, or hide the button and say why on the row.

Peering two servers assumed each could reach the other, and asked the
person to type each address and a name for each side. Now the dialog
checks first and recommends.

- Two admin routes support the check: GET /api/j5/a2a/peers/addresses
  lists the origins a server might be reached at (none for a loopback-only
  server), and POST /api/j5/a2a/peers/probe fetches another server's
  public identity at an origin within four seconds, returning who
  answered or the error verbatim. The descriptor now publishes
  j5PeerPoll.
- client-runtime's peering module turns each server's descriptor (its
  version, j5PeerPoll and run mode) and the two probes into a
  recommendation: poll without asking when one direction cannot connect,
  send directly when both connect and run as services, and ask one
  question, storing by default, when a side runs in the desktop app, was
  started by hand, or could not be tested. A too-old server gets only
  "update J5 there". It also introduces a poll pairing in two steps.
- The dialog shows the check, the question, how messages will travel in
  plain lines and only the address that will be used, with "Set up
  differently" for the manual form. A server that could not list its
  addresses says why, rather than a guess about its network.
- Peer rows say how messages travel and show online or offline, the
  backlog and the last error, refreshed while Connections stays open. A
  poller whose credential was rejected gets "Peer again", which opens
  the dialog with that server chosen. A pair already peered is peered
  again the way it is set up, with new credentials only; changing how
  messages travel is removing the peer first. A protocol mismatch only
  names the server to update.
- The probe fetches that one path and follows no redirect.
- `j5 a2a peer list` prints the same health, from one online rule in
  contracts. The runbook covers the poll pairing and the peer list's
  health.

Stack 6/8 for #399.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Jacksondr5
Jacksondr5 force-pushed the j5/peer-poll-clients branch from f019528 to de10d34 Compare October 8, 2026 02:50
@Jacksondr5
Jacksondr5 merged commit d08d245 into j5/main Oct 8, 2026
32 checks passed
@Jacksondr5
Jacksondr5 deleted the j5/peer-poll-clients branch October 8, 2026 03:07

This branch was successfully deployed

1 active deployment
Preview — de10d34d Deployed Oct 8, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants