Skip to content

fix(mesh): strip credentials before mesh peer forwarding - #1189

Merged
ndizazzo merged 2 commits into
mainfrom
fix/strip-mesh-forwarded-credentials
Aug 7, 2026
Merged

fix(mesh): strip credentials before mesh peer forwarding#1189
ndizazzo merged 2 commits into
mainfrom
fix/strip-mesh-forwarded-credentials

Conversation

@michaelneale

@michaelneale michaelneale commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Strip caller authorization headers at the remote peer boundary.

Closes project-loupe/audit-mesh-llm#322.

Tests: focused header tests; host-runtime and mesh checks.

Summary by CodeRabbit

  • Security

    • Caller credentials, API keys, proxy authentication, and hop-by-hop headers are removed before peer forwarding.
    • Request headers and bodies are preserved safely, including opaque header values.
  • Reliability

    • Malformed, incomplete, or invalidly framed requests are rejected before forwarding.
    • Content lengths are recalculated after request changes.
    • Forwarding and tunnel failures return retryable unavailable results.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Peer forwarding now validates and reconstructs complete raw requests, removes caller credentials, filters hop-by-hop headers, preserves supported bodies, and rejects malformed headers. Request parsing uses the shared finalizer. Remote routing separates tunnel setup, sanitized forwarding, and response handling.

Changes

Peer forwarding

Layer / File(s) Summary
Request preparation and validation
crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs
Forwarded requests are validated and rebuilt from raw input. Credential, omitted, hop-by-hop, and replaced framing headers are removed. Bodies and raw header values are preserved. Tests cover malformed Connection values and framing nominations.
Request parser integration
crates/mesh-llm-host-runtime/src/network/openai/mod.rs, crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
The request parser uses the shared finalization helper with the complete raw request and removes its local reconstruction implementation.
Remote routing integration
crates/mesh-llm-host-runtime/src/network/openai/response.rs, crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs
Remote routing prepares and forwards sanitized requests through the peer tunnel. Tunnel and forwarding failures return retryable-unavailable results. Response handling starts after successful forwarding.

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

Sequence Diagram(s)

sequenceDiagram
  participant RemoteRouting
  participant forward_peer_request
  participant prepare_peer_forwarded_request
  participant PeerTunnel
  participant ResponseHandling
  RemoteRouting->>forward_peer_request: Forward prefetched request
  forward_peer_request->>prepare_peer_forwarded_request: Reparse and remove caller credentials
  prepare_peer_forwarded_request-->>forward_peer_request: Return sanitized request
  forward_peer_request->>PeerTunnel: Write sanitized request
  PeerTunnel-->>RemoteRouting: Return forwarding result
  RemoteRouting->>ResponseHandling: Handle response after successful forwarding
Loading

Possibly related PRs

Suggested labels: blocker

Suggested reviewers: ndizazzo

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: stripping credentials before forwarding requests to mesh peers.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/strip-mesh-forwarded-credentials

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

This pull request is currently a draft. Reviews will not take place until the PR is marked as ready for review.

@michaelneale
michaelneale force-pushed the fix/strip-mesh-forwarded-credentials branch from c9aa7c9 to 0f61a0b Compare August 6, 2026 09:18
@ndizazzo ndizazzo changed the title Strip credentials before mesh peer forwarding fix(client): strip credentials before mesh peer forwarding Aug 6, 2026
@ndizazzo
ndizazzo marked this pull request as ready for review August 6, 2026 19:46
@ndizazzo ndizazzo changed the title fix(client): strip credentials before mesh peer forwarding fix(mesh): strip credentials before mesh peer forwarding Aug 6, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs (1)

378-398: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove headers nominated by Connection.

Line 380 removes Connection but does not remove its nominated fields. If a client sends Connection: X-Private-Mode and X-Private-Mode: enabled, line 397 forwards X-Private-Mode to the remote peer.

Parse the comma-separated Connection value before rebuilding headers. Skip every nominated header name. Add a regression test for this case.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs` around
lines 378 - 398, Update the header-rebuilding logic around the request parsing
function to parse each comma-separated token from the incoming Connection header
and add those names to the omitted-header set. Ensure the existing filtering
skips both Connection and every nominated header, including case-insensitive
matches such as X-Private-Mode, and add a regression test covering a nominated
header being excluded from the rebuilt request.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs`:
- Around line 378-398: Update the header-rebuilding logic around the request
parsing function to parse each comma-separated token from the incoming
Connection header and add those names to the omitted-header set. Ensure the
existing filtering skips both Connection and every nominated header, including
case-insensitive matches such as X-Private-Mode, and add a regression test
covering a nominated header being excluded from the rebuilt request.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a96dcaa0-401c-4736-b76c-8f20f73d77f8

📥 Commits

Reviewing files that changed from the base of the PR and between 96ef622 and 185d546.

📒 Files selected for processing (2)
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs

@ndizazzo
ndizazzo force-pushed the fix/strip-mesh-forwarded-credentials branch from 185d546 to 7ab25f6 Compare August 6, 2026 20:17
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@ndizazzo ndizazzo self-assigned this Aug 6, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs`:
- Around line 397-405: Update the request parsing logic around the
connection-nominated header handling to reject requests where Connection
nominates Content-Length or Transfer-Encoding, before removing headers or
forwarding the original wire body. Preserve existing handling for other
nominated headers, and add regression coverage for both nominated framing-header
cases.
- Line 383: Update the header parsing logic in request parsing to preserve
ordinary field values as raw bytes instead of converting invalid UTF-8 to an
empty string. Validate the Connection header as an ASCII token list and reject
the entire value when malformed, including invalid bytes, rather than partially
filtering it. Add tests covering opaque non-UTF-8 field-value preservation and
malformed Connection values.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ab5dc7dc-7d34-4efe-92c9-9a16f0b1abff

📥 Commits

Reviewing files that changed from the base of the PR and between 96ef622 and 7ab25f6.

📒 Files selected for processing (2)
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs

Comment thread crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs Outdated
Comment thread crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs (3)

389-411: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Simplify the token validation loop.

value is already a validated &str after line 389, so the std::str::from_utf8(h.value).unwrap_or("<binary>") calls at lines 397 and 404 are redundant. The ASCII check and the control-character check also iterate the same bytes twice. One combined predicate reads more directly.

Note that the current predicate accepts non-token ASCII characters such as ", {, and ,-adjacent whitespace beyond trim. That is acceptable here because the tokens are only compared against header names, but a tchar check would match RFC 7230 exactly.

♻️ Proposed refactor
         for tok in value.split(',') {
             let t = tok.trim();
-            if !t.is_empty() && !t.as_bytes().iter().all(|&b| b.is_ascii()) {
-                bail!(
-                    "Connection header contains non-ASCII token '{}'; reject as malformed",
-                    std::str::from_utf8(h.value).unwrap_or("<binary>")
-                );
-            }
-
-            if !t.is_empty() && t.as_bytes().iter().any(|&b| b <= 0x1F || b == 0x7F) {
-                bail!(
-                    "Connection header contains control character in '{}'; reject as malformed",
-                    std::str::from_utf8(h.value).unwrap_or("<binary>")
-                );
-            }
-
-            if !t.is_empty() {
-                connection_nominated.push(t.to_lowercase());
+            if t.is_empty() {
+                continue;
             }
+            if !t.bytes().all(|b| b.is_ascii_graphic()) {
+                bail!(
+                    "Connection header value '{value}' contains an invalid token; reject as malformed"
+                );
+            }
+            connection_nominated.push(t.to_lowercase());
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs` around
lines 389 - 411, In the token-validation loop around value, replace the
redundant from_utf8(...).unwrap_or(...) calls with the already validated value,
and combine the ASCII and control-character checks into one byte predicate.
Preserve the current accepted-character behavior and error semantics; do not add
stricter tchar validation.

1596-1605: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Add a case for the non-ASCII token branch.

\xFF is not valid UTF-8, so this input fails at line 389, not at the ASCII token check on line 394. No test currently reaches line 394. Add a Connection value that is valid UTF-8 but contains a non-ASCII character.

💚 Proposed additional test
    /// Regression: a Connection token that is valid UTF-8 but not ASCII is
    /// invalid HTTP/1.x token syntax and must be rejected.
    #[test]
    fn finalize_rejects_connection_non_ascii_token() {
        let raw = "GET / HTTP/1.1\r\nHost: x\r\nConnection: keep-alivé\r\nContent-Length: 0\r\n\r\n";
        let result = finalize_forwarded_request(raw.as_bytes(), false, None, None, &[]);
        assert!(
            result.is_err(),
            "non-ASCII Connection token must be rejected, got: {result:?}"
        );
    }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs` around
lines 1596 - 1605, Add a separate regression test near
finalize_rejects_malformed_connection_value named
finalize_rejects_connection_non_ascii_token, using valid UTF-8 in the Connection
header with a non-ASCII character in the token. Pass the string bytes to
finalize_forwarded_request and assert the result is an error, ensuring the
non-ASCII token validation branch is exercised rather than the invalid-UTF-8
path.

432-434: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Avoid the per-header to_lowercase allocation.

name.to_lowercase() allocates a String for every header on each iteration of the inner loop. connection_nominated already holds lowercase tokens, so eq_ignore_ascii_case gives the same result without allocation.

♻️ Proposed refactor
         let is_connection_nominated = connection_nominated
             .iter()
-            .any(|n| n == &name.to_lowercase());
+            .any(|n| n.eq_ignore_ascii_case(name));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs` around
lines 432 - 434, Update the `is_connection_nominated` check to compare each
`connection_nominated` token with `name` using `eq_ignore_ascii_case`, removing
the per-header `to_lowercase()` allocation while preserving case-insensitive
matching against the existing lowercase tokens.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs`:
- Around line 376-428: Move finalize_forwarded_request,
prepare_peer_forwarded_request, the inline tests module, and related forwarding
logic from request_parse.rs into a semantically named
network/openai/forwarded_request.rs module. Extract the Connection-header
parsing and rejected framing-nomination checks into clearly named helpers there,
then update module wiring and call sites so behavior remains unchanged. The
anchor site request_parse.rs:376-428 and sibling site request_parse.rs:452-470
both require removal or relocation into the new module.
- Around line 379-427: Replace every corrupted “ยง” character in the RFC 7230
section references within the Connection-header parsing comments and bail!
messages with the correct “§” character, including the references near
connection_nominated validation and both protocol-violation errors. Do not
change the parsing or rejection behavior.

---

Nitpick comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs`:
- Around line 389-411: In the token-validation loop around value, replace the
redundant from_utf8(...).unwrap_or(...) calls with the already validated value,
and combine the ASCII and control-character checks into one byte predicate.
Preserve the current accepted-character behavior and error semantics; do not add
stricter tchar validation.
- Around line 1596-1605: Add a separate regression test near
finalize_rejects_malformed_connection_value named
finalize_rejects_connection_non_ascii_token, using valid UTF-8 in the Connection
header with a non-ASCII character in the token. Pass the string bytes to
finalize_forwarded_request and assert the result is an error, ensuring the
non-ASCII token validation branch is exercised rather than the invalid-UTF-8
path.
- Around line 432-434: Update the `is_connection_nominated` check to compare
each `connection_nominated` token with `name` using `eq_ignore_ascii_case`,
removing the per-header `to_lowercase()` allocation while preserving
case-insensitive matching against the existing lowercase tokens.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c5ace403-d1f1-46bd-9c72-767e42a099cd

📥 Commits

Reviewing files that changed from the base of the PR and between 7ab25f6 and 3098348.

📒 Files selected for processing (1)
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs

Comment thread crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs Outdated
Comment thread crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs`:
- Around line 45-53: Update the Connection-option validation in the forwarded
request parser to trim only SP and HTAB, then require every character to belong
to the complete HTTP tchar set, rejecting separators such as semicolons and
non-ASCII whitespace. Add regression tests covering invalid separators and
non-ASCII whitespace, using the existing parser/test symbols in
forwarded_request.rs.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d953c4a8-82fe-4679-ae80-5724fd044f4b

📥 Commits

Reviewing files that changed from the base of the PR and between 3098348 and f9d6868.

📒 Files selected for processing (4)
  • crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs
  • crates/mesh-llm-host-runtime/src/network/openai/mod.rs
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs

Comment thread crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs Outdated
@ndizazzo
ndizazzo force-pushed the fix/strip-mesh-forwarded-credentials branch from f9d6868 to 267d9d5 Compare August 7, 2026 02:38
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot added the blocker blocking other PRs label Aug 7, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs (1)

167-172: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Consider stripping cookie at the peer boundary.

CALLER_CREDENTIAL_HEADERS covers the four API-key style headers. It does not cover cookie. A Cookie header is also a caller credential and is forwarded to the remote peer unchanged. If your ingress can receive cookie-authenticated requests, add cookie to the list.

🔒 Proposed change
     const CALLER_CREDENTIAL_HEADERS: &[&str] = &[
         "authorization",
         "proxy-authorization",
         "x-api-key",
         "api-key",
+        "cookie",
     ];
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs` around
lines 167 - 172, Update CALLER_CREDENTIAL_HEADERS to include the cookie header
so cookie-based caller credentials are stripped before forwarding requests to
the remote peer.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs`:
- Around line 167-172: Update CALLER_CREDENTIAL_HEADERS to include the cookie
header so cookie-based caller credentials are stripped before forwarding
requests to the remote peer.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1c4ce4e3-cffa-4d10-9ed3-d084d6b3e72e

📥 Commits

Reviewing files that changed from the base of the PR and between 96ef622 and 267d9d5.

📒 Files selected for processing (5)
  • crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs
  • crates/mesh-llm-host-runtime/src/network/openai/mod.rs
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs
🚧 Files skipped from review as they are similar to previous changes (3)
  • crates/mesh-llm-host-runtime/src/network/openai/mod.rs
  • crates/mesh-llm-host-runtime/src/network/openai/request_parse.rs
  • crates/mesh-llm-host-runtime/src/network/openai/response/routing.rs

@ndizazzo

ndizazzo commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

@coderabbitai why tag as blocker?

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="Mesh-LLM/mesh-llm"
pr_number="1189"

echo "== Top-level comments =="
gh api "repos/${repo}/issues/${pr_number}/comments?per_page=100" \
  --paginate \
  --jq '.[] | {user: .user.login, created_at, body}'

echo "== Review comments =="
gh api "repos/${repo}/pulls/${pr_number}/comments?per_page=100" \
  --paginate \
  --jq '.[] | {user: .user.login, path, line, side, created_at, body}'

Length of output: 28172


@ndizazzo The blocker text came from the automatic walkthrough as a suggested PR label. It was not a blocker-severity review finding and does not mean that CodeRabbit found an unresolved merge-blocking issue.

The classifier likely selected it because this PR changes the authorization-header security boundary. The actual review findings were marked Major or Minor, and the major findings were addressed.

The label is misleading in this context.

You are interacting with an AI system.

@ndizazzo
ndizazzo merged commit adcc30d into main Aug 7, 2026
45 checks passed
@ndizazzo
ndizazzo deleted the fix/strip-mesh-forwarded-credentials branch August 7, 2026 03:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blocker blocking other PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants