Skip to content

feat(sqs): /sqs_health capability JSON (Phase 3.D PR 4-B-1)#708

Merged
bootjp merged 1 commit intomainfrom
feat/sqs-htfifo-health-capability
Apr 29, 2026
Merged

feat(sqs): /sqs_health capability JSON (Phase 3.D PR 4-B-1)#708
bootjp merged 1 commit intomainfrom
feat/sqs-htfifo-health-capability

Conversation

@bootjp
Copy link
Copy Markdown
Owner

@bootjp bootjp commented Apr 29, 2026

Summary

First slice of Phase 3.D PR 4-B — adds the JSON capability-advertisement shape to /sqs_health that the §8.5 mixed-version gate requires. htfifoCapabilityAdvertised stays false in this PR; subsequent PRs (4-B-2 routing, 4-B-3 leadership-refusal + catalog polling) flip it to true once the rest of §11 PR 4 is in place.

What changes

  • /sqs_health returns JSON when Accept: application/json is set:
    {"status":"ok","capabilities":[...]}
    
    The capabilities slice is built deterministically off htfifoCapabilityAdvertised. Stays empty in this PR — advertising htfifo before the routing + leadership-refusal pair lands would let peers build partitioned queues this binary cannot safely serve.
  • Legacy ok\n text body preserved byte-identical for any caller that does not signal application/json (no Accept header, bare */* wildcard, text/plain).

What does NOT change yet

  • Routing dispatch through --sqsFifoPartitionMap → PR 4-B-2 (resolver hook in kv/shard_router.go).
  • §8 leadership-refusal hook + htfifoCapabilityAdvertised = true flip → PR 4-B-3 (with the catalog-polling helper for the CreateQueue capability gate that PR 5 will start using).

PR 5 still rejects PartitionCount > 1 per the §11 PR 2 dormancy gate, so no data-plane risk from this PR.

Test plan

  • TestServeSQSHealthz_LegacyTextPath — 3 sub-tests pinning byte-identical legacy body.
  • TestServeSQSHealthz_JSONShape — 3 sub-tests covering plain JSON, q-factor, comma-list.
  • TestServeSQSHealthz_HEAD_JSONOmitsBody — HEAD on JSON path emits content-type but no body.
  • TestServeSQSHealthz_RejectsNonGETHEAD — POST returns 405 in both legacy and JSON modes.
  • TestSQSAdvertisedCapabilities_TracksFlag — both branches of the gate constant.
  • TestClientAcceptsSQSHealthJSON_Boundaries — 9 Accept-header edge cases.
  • go test -race ./adapter/... pass.
  • golangci-lint ./adapter/... clean.

Self-review (per CLAUDE.md)

  1. Data loss — health endpoint only; no FSM/Pebble/retention path. No issue.
  2. Concurrency / distributed failures — single-shot read off a const; no shared state. No issue.
  3. Performance — JSON marshal of a 2-field struct on a low-QPS endpoint. No issue.
  4. Data consistencyhtfifoCapabilityAdvertised is the single source of truth for the capability list; sqsAdvertisedCapabilities() is the only producer. Both true/false branches are pinned by tests. No issue.
  5. Test coverage — 19 sub-tests across 6 top-level functions. Both Accept paths and both gate-constant branches are pinned.

Adds the JSON capability-advertisement shape to /sqs_health that the
Phase 3.D §8.5 mixed-version gate requires before the data plane
can safely accept partitioned FIFO queues.

What changes

- /sqs_health now returns JSON when Accept: application/json is set:
    {"status":"ok","capabilities":[...]}
  The capabilities slice is built deterministically off
  htfifoCapabilityAdvertised, a package-level constant that stays
  false in this PR — the data plane and the §8 leadership-refusal
  hook are not yet wired, so advertising "htfifo" would let peers
  build partitioned queues this binary cannot safely serve.

- The legacy "ok\n" text body is preserved byte-identical for any
  caller that does not signal application/json (no Accept header,
  bare "*/*" wildcard, text/plain). Existing k8s liveness probes
  and curl integrations stay unchanged.

What does NOT change yet

This is the first slice of the PR 4-B work. Two follow-ups complete
the design's "advertise htfifo only when routing AND leadership-
refusal are both in place" rule:

- PR 4-B-2: routing resolver in kv/shard_router.go that consumes
  --sqsFifoPartitionMap to dispatch (queue, partition) keys to the
  operator-chosen Raft group.
- PR 4-B-3: §8 leadership-refusal hook that calls TransferLeadership
  when a non-htfifo binary holds an SQS Raft group hosting a
  partitioned queue + the catalog-polling helper for the CreateQueue
  capability gate (PR 5 lifts the dormancy and starts using it).

PR 4-B-3 also flips htfifoCapabilityAdvertised to true.

Self-review (per CLAUDE.md)

1. Data loss — health endpoint only; no FSM/Pebble/retention path.
   No issue.
2. Concurrency — single-shot read off a const; no shared state.
   No issue.
3. Performance — JSON marshal of a 2-field struct on a low-QPS
   endpoint. No issue.
4. Data consistency — the gate constant is the single source of
   truth for the capability list; sqsAdvertisedCapabilities() is the
   only producer. Tests pin both true/false branches. No issue.
5. Test coverage — TestServeSQSHealthz_LegacyTextPath (3 sub-tests),
   TestServeSQSHealthz_JSONShape (3 sub-tests),
   TestServeSQSHealthz_HEAD_JSONOmitsBody,
   TestServeSQSHealthz_RejectsNonGETHEAD (2 sub-tests),
   TestSQSAdvertisedCapabilities_TracksFlag (true/false guard),
   TestClientAcceptsSQSHealthJSON_Boundaries (9 sub-tests).
@bootjp
Copy link
Copy Markdown
Owner Author

bootjp commented Apr 29, 2026

@claude review

Phase 3.D PR 4-B-1: capability JSON shape on /sqs_health. Routing + leadership-refusal land in 4-B-2 / 4-B-3, so htfifoCapabilityAdvertised stays false in this PR. The PR description has the full self-review and test plan.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 29, 2026

Warning

Rate limit exceeded

@bootjp has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 59 minutes and 52 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: aaaeffc4-b814-4792-92e6-c793d87a961c

📥 Commits

Reviewing files that changed from the base of the PR and between e6004f3 and c293074.

📒 Files selected for processing (2)
  • adapter/sqs.go
  • adapter/sqs_health_test.go
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/sqs-htfifo-health-capability

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
Review rate limit: 0/1 reviews remaining, refill in 59 minutes and 52 seconds.

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

@claude
Copy link
Copy Markdown

claude Bot commented Apr 29, 2026

Claude finished @bootjp's task in 2m 19s —— View job


Code Review: Phase 3.D PR 4-B-1 — /sqs_health capability JSON shape

  • Read changed files (adapter/sqs.go, adapter/sqs_health_test.go)
  • Review HTTP content-negotiation logic
  • Review JSON shape and capability gate
  • Review test coverage and correctness
  • Tests (sandbox approval pending — review proceeds without runtime output)

Overall

Clean, well-scoped PR. The content-negotiation approach is appropriate for a health endpoint and the capability gate is correctly held at false until routing + leadership-refusal land together. No blocking issues.


adapter/sqs.go

clientAcceptsSQSHealthJSON (sqs.go:325–338)

The r.Header.Values("Accept") call is the right way to handle multi-value Accept — Header.Get would only see the first line. The raw == "*/*" skip is tight and intentional (bare wildcard → legacy), but there is one edge case not explicitly called out in the comment or tests:

  • Accept: */*;q=0.1 — does not equal "*/*", so the continue doesn't fire; but strings.Contains("*/*;q=0.1", "application/json") is false, so it correctly falls through to return false. Correct behaviour, but the invariant is "no false positive from a q-factored wildcard" rather than "only bare wildcard is skipped" — a future reader tightening the continue guard might introduce a regression.

The comment acknowledges the application/jsonseq false-positive deliberately, which is the right call for an internal health endpoint called only by catalog peers.

writeSQSHealthJSONBody (sqs.go:340–356)

The error fallback at line 342–347 correctly fires before w.Header().Set(...) (line 349), so the legacy text/plain Content-Type is set cleanly on the fallback path — no double-header issue. ✓

Two writes for the body (w.Write(encoded) + io.WriteString(w, "\n")) is harmless, but they could be combined into a single w.Write(append(encoded, '\n')) to save one syscall on the hot path. Not worth changing given the endpoint's QPS.

sqsAdvertisedCapabilities (sqs.go:54–58)

Fresh slice per call is correct — the comment explains why (caller-mutability). The make([]string, 0, 1) capacity hint is accurate. Good.

serveSQSLeaderHealthz (sqs.go:358–367)

Intentionally not given the JSON path — leadership state is not a capability-advertisement concern. Correct as-is.


adapter/sqs_health_test.go

Tests are solid. A few observations:

TestServeSQSHealthz_JSONShape (line 72)

require.Equal(t, sqsAdvertisedCapabilities(), got.Capabilities)

This compares the round-tripped JSON against the current flag state rather than a hardcoded []string{}. When PR 4-B-3 flips htfifoCapabilityAdvertised = true, this line automatically starts asserting ["htfifo"] without any test change needed. That's the intended design — confirm intentional.

One subtle note: json.Unmarshal into []string will produce nil (not []string{}) if the JSON field is []. The struct tag and json.Marshal of make([]string, 0, 1) actually emits [] (empty array, not null), which json.Unmarshal decodes to an empty non-nil []string{}. require.Equal(t, []string{}, nil) would fail, so the round-trip matters here. Since sqsAdvertisedCapabilities() returns make([]string, 0, 1) (non-nil empty), json.Marshal emits [], and json.Unmarshal of [] gives []string{} — both sides non-nil empty, test passes. ✓

TestClientAcceptsSQSHealthJSON_Boundaries (line 120)

Missing one useful edge case: the browser default "text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8". It contains neither application/json nor bare */*, so it correctly returns false. Not a blocker since health endpoints aren't browser-facing, but adding it would document the invariant explicitly.

TestServeSQSHealthz_RejectsNonGETHEAD (line 91)

Tests only http.MethodPost. Could add http.MethodPut / http.MethodDelete for completeness, but given writeSQSHealthMethod has a default case covering all non-GET/HEAD methods, the single POST test is sufficient to pin the behaviour.

Direct map assignment (req.Header["Accept"] = tc.accept) is correct for multi-value tests since Header.Set / Header.Add normalise to a single comma-joined value, which r.Header.Values returns as one entry. The direct assignment lets the test pass []string{"text/plain", "application/json"} as two separate entries. ✓


Minor nit

adapter/sqs.go:44–83 — The comment block on sqsCapabilityHTFIFO / htfifoCapabilityAdvertised is thorough and clearly intentional for future readers landing this breadcrumb trail. Arguably the two constants could each have a shorter inline comment pointing to the design doc section, with the longer prose deferred to the design doc. Not a change request — just flagging that the length is unusually high for a non-public constant.


Self-review assessment (per CLAUDE.md)

Lens Result
Data loss Health endpoint only; no FSM/Pebble path. ✓
Concurrency Single read off a compile-time const; no shared mutable state. ✓
Performance json.Marshal of a 2-field struct; negligible. ✓
Data consistency htfifoCapabilityAdvertised is the single source of truth; both branches pinned by TestSQSAdvertisedCapabilities_TracksFlag. ✓
Test coverage 19 sub-tests across 6 functions; both Accept paths and both flag branches covered. ✓

Verdict: LGTM. No blocking issues. Ready to queue behind PR 4-B-2 and 4-B-3 as planned.


| Branch: feat/sqs-htfifo-health-capability

Copy link
Copy Markdown

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

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: c2930740da

ℹ️ 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 adapter/sqs.go
if raw == "" || raw == "*/*" {
continue
}
if strings.Contains(raw, "application/json") {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Match JSON media type case-insensitively in Accept

clientAcceptsSQSHealthJSON uses a case-sensitive substring check, so valid headers like Accept: Application/JSON are treated as non-JSON and the handler falls back to legacy text/plain. HTTP media type type/subtype tokens are case-insensitive, so this causes incorrect content negotiation for standards-compliant clients that vary casing.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces JSON capability advertising to the SQS health endpoint, allowing the service to report supported features like partitioned FIFO queues (htfifo) via the Accept header. The implementation ensures backward compatibility with legacy text-based health checks and includes comprehensive tests for various request methods and header configurations. Review feedback suggests removing the trailing newline from the JSON response to better align with standard API practices and optimizing the test suite by using rec.Body.Bytes() for more efficient response validation.

Comment thread adapter/sqs.go
return
}
_, _ = w.Write(encoded)
_, _ = io.WriteString(w, "\n")
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.

medium

The JSON response includes a trailing newline. While many JSON parsers will ignore this, it is not standard practice for JSON APIs and could cause issues with stricter clients. It is best to return only the JSON document.

require.Equal(t, "application/json; charset=utf-8", rec.Header().Get("Content-Type"))

var got sqsHealthBody
require.NoError(t, json.Unmarshal([]byte(strings.TrimSpace(rec.Body.String())), &got))
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.

medium

To align with the removal of the trailing newline in the response, this test should be updated to not trim whitespace. This makes the test stricter and ensures the response is a clean JSON document. Additionally, using rec.Body.Bytes() is more efficient as it avoids a string conversion.

Suggested change
require.NoError(t, json.Unmarshal([]byte(strings.TrimSpace(rec.Body.String())), &got))
require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &got))

@bootjp
Copy link
Copy Markdown
Owner Author

bootjp commented Apr 29, 2026

@claude review

@claude
Copy link
Copy Markdown

claude Bot commented Apr 29, 2026

Claude finished @bootjp's task in 2m 7s —— View job


Code Review: Phase 3.D PR 4-B-1 — /sqs_health capability JSON shape

  • Read changed files (adapter/sqs.go, adapter/sqs_health_test.go)
  • Analyze adapter/sqs.go changes
  • Analyze adapter/sqs_health_test.go
  • Post review feedback

Overall

Clean, well-scoped PR. The capability gate is correctly held at false until routing + leadership-refusal land together, and the legacy ok\n path is preserved byte-identical. No blocking issues.


adapter/sqs.go

Accept header matching is case-sensitive (sqs.go:333)

strings.Contains(raw, "application/json") is a case-sensitive substring check. RFC 7231 §3.1.1 specifies that media type type/subtype tokens are case-insensitive, so Accept: Application/JSON or Accept: APPLICATION/JSON would fall through to the legacy text/plain path. For an internal health endpoint called only by catalog peers under your control this is practically fine, but a defensive strings.Contains(strings.ToLower(raw), "application/json") would be more correct. This matches the P2 flag from the Codex review above.

Fix this →

Trailing newline in JSON body (sqs.go:354–355)

_, _ = w.Write(encoded)
_, _ = io.WriteString(w, "\n")

Appending \n after the JSON is common practice for CLI-friendly APIs and matches how writeSQSHealthBody terminates the legacy text body. However, Gemini's suggestion to remove it is valid if strict JSON conformance matters for the Phase 3.D PR 5 catalog-polling decoder — json.Unmarshal handles both forms, but json.NewDecoder would also tolerate a trailing newline, so there's no functional risk either way. The test compensates with strings.TrimSpace. Leave as-is or remove — both are fine; just document the choice if you keep it.

Subtle */*;q=0.1 case (sqs.go:330)

The continue guard only skips the exact string "*/*". A q-factored wildcard like "*/*;q=0.1" doesn't trigger continue but still correctly returns false (since it doesn't contain "application/json"). The behaviour is correct, but a comment noting "q-factored wildcards fall through harmlessly" would prevent a future reader from tightening the guard incorrectly (e.g., changing it to strings.HasPrefix(raw, "*/*")).

Two writes for the body (sqs.go:354–355)

Minor: two syscalls instead of one. w.Write(append(encoded, '\n')) would combine them. Not worth changing given this endpoint's QPS.

Error fallback placement (sqs.go:340–348) ✓

Correct: the fallback fires before w.Header().Set(...) (line 349), so the text/plain Content-Type in writeSQSHealthBody is set cleanly on the error path with no double-header issue.

sqsAdvertisedCapabilities fresh-slice-per-call (sqs.go:78–84) ✓

Good design. make([]string, 0, 1) capacity hint is accurate and the returned slice is safe to mutate by callers.


adapter/sqs_health_test.go

TestServeSQSHealthz_JSONShape — round-trip correctness (line 71) ✓

require.Equal(t, sqsAdvertisedCapabilities(), got.Capabilities)

Comparing against the live return value (not hardcoded []string{}) is intentional: when PR 4-B-3 flips htfifoCapabilityAdvertised = true, this assertion automatically starts expecting ["htfifo"] without a test change. The nil/non-nil round-trip is sound: make([]string, 0, 1) marshals to [] (not null), and json.Unmarshal of [] gives []string{} — both sides non-nil empty. ✓

Direct map assignment for multi-value Accept (sqs_health_test.go:158) ✓

req.Header["Accept"] = tc.accept is the correct way to set multi-value header entries for test purposes. Header.Set / Header.Add normalise to a comma-joined single entry; the direct assignment lets the test pass []string{"text/plain", "application/json"} as two separate header lines, which r.Header.Values("Accept") returns correctly. ✓

TestServeSQSHealthz_RejectsNonGETHEAD — only tests POST (line 91)

PUT/DELETE aren't covered, but since writeSQSHealthMethod has a default case that catches all non-GET/HEAD methods, the single POST test is sufficient to pin the behaviour.

Missing browser Accept header test case

"text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8" (standard browser default) is absent. It contains no "application/json" token, so it correctly returns false. Not a blocker for an internal health endpoint, but it would document the invariant explicitly for anyone who later wonders why a browser hit doesn't get JSON.


Self-review assessment (per CLAUDE.md)

Lens Result
Data loss Health endpoint only; no FSM/Pebble/retention path. ✓
Concurrency Single read off a compile-time const; no shared mutable state. ✓
Performance json.Marshal of a 2-field struct on a low-QPS health endpoint. ✓
Data consistency htfifoCapabilityAdvertised is the single source of truth; both branches pinned by TestSQSAdvertisedCapabilities_TracksFlag. ✓
Test coverage 19 sub-tests across 6 functions; both Accept paths and both gate-constant branches covered. ✓

Verdict: LGTM with the case-sensitivity note as a suggestion (not a blocker). The capability gate is held correctly at false, backward compatibility is preserved, and the test suite is thorough. Ready to queue behind PR 4-B-2 and 4-B-3 as planned.


| Branch: feat/sqs-htfifo-health-capability

@bootjp bootjp merged commit 7ac9c04 into main Apr 29, 2026
14 checks passed
@bootjp bootjp deleted the feat/sqs-htfifo-health-capability branch April 29, 2026 09:12
bootjp added a commit that referenced this pull request Apr 30, 2026
#715)

## Summary

Routing-layer half of PR 4-B. Adds a `PartitionResolver` that
`ShardRouter` consults BEFORE falling through to the byte-range engine.
SQS HT-FIFO needs partition-aware dispatch, but the engine's
non-overlapping-cover model can't express overlay routes — the
resolver-first dispatch sidesteps this cleanly.

Stacks on top of #708 (PR 4-B-1, capability JSON). Next is PR 4-B-3
(leadership-refusal + catalog polling + flip
`htfifoCapabilityAdvertised` to `true`).

## What's added

- `kv.PartitionResolver` interface — `ResolveGroup([]byte) (uint64,
bool)`.
- `kv.ShardRouter.WithPartitionResolver(...)` — fluent option, nil-safe.
- `kv.ShardRouter.resolveGroup(...)` — unified dispatch path: resolver
first, engine fallback. Both `groupRequests` (Commit/Abort) and `Get`
route through it.
- `kv.ShardedCoordinator.WithPartitionResolver(...)` — delegates to the
router so `main.go` can install via the existing fluent-construction
style.
- `adapter.SQSPartitionResolver` — parses `(queue, partition)` from the
partitioned key shape, looks up the operator-chosen group. Defensive
copy at construction, nil-safe `ResolveGroup`, returns `(0, false)` for
legacy / non-matching keys.
- `main.go` — builds the resolver from
`runtimeConfig.sqsFifoPartitionMap` and installs it. Resolver is `nil`
on a non-partitioned cluster — hot path stays engine-only.

## What's NOT added (deferred to PR 4-B-3)

- §8 leadership-refusal hook in `kv` (refuses leadership for an SQS Raft
group hosting a partitioned queue when the binary lacks `htfifo`).
- Catalog-polling helper for the CreateQueue capability gate (PR 5
starts using it).
- Flipping `htfifoCapabilityAdvertised` from `false` to `true`.

The design's "advertise htfifo only when both routing AND
leadership-refusal are in place" rule keeps the constant `false` in this
PR — PR 4-B-3 flips it.

## Test plan

- [x] `adapter/sqs_partition_resolver_test.go` — 9 top-level tests:
nil-on-empty, defensive-copy, partition dispatch across all 5 families,
queue-name prefix isolation (`"queue"` vs `"queue1"`), legacy
fall-through (8 sub-cases), unknown queue, out-of-range partition, nil
receiver, prefix alignment with `sqs_keys.go` constants.
- [x] `kv/shard_router_partition_test.go` — 4 tests: resolver wins over
engine, engine fallthrough on resolver-miss, nil resolver no-op, `Get`
path also routes through the resolver.
- [x] `go test -race ./kv/...` pass.
- [x] `go test -race ./adapter/...` pass.
- [x] `golangci-lint ./kv/... ./adapter/... .` clean.

## Self-review (per CLAUDE.md)

1. **Data loss** — routing layer only; no FSM/Pebble/retention path. No
issue.
2. **Concurrency** — `partitionResolver` is set once at startup before
any request. `ResolveGroup` reads a constructor-time defensive copy, so
a future hot-reload of `--sqsFifoPartitionMap` cannot perturb in-flight
requests. No issue.
3. **Performance** — one map lookup + 4-byte BigEndian decode per
resolver hit (only on partitioned-prefix matches). Engine-only path adds
a single `if s.partitionResolver != nil` branch. No issue.
4. **Data consistency** — resolver output strictly OVERRIDES the engine
for partitioned keys; legacy keys flow through unchanged. "queue not
found" / "partition out of range" branches return `(0, false)` so the
router surfaces an explicit error rather than silently mis-routing. No
issue.
5. **Test coverage** — 13 tests across two new files; existing
`TestShardRouter*` tests unchanged. Both override and fall-through paths
pinned, plus the queue-name prefix-isolation invariant from PR #703.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added partition-based routing for distributed coordination. Requests
are now directed to specific nodes based on configured partition
mappings.
* Enhanced SQS queue handling with optional partition-aware routing.
When partition information is unavailable or unconfigured, the system
automatically falls back to the existing routing mechanism.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
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.

1 participant